<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>[BLOG].rdiez.es</title><link>https://blog.rdiez.es/</link><description>Recent content on [BLOG].rdiez.es</description><generator>Hugo -- gohugo.io</generator><language>es-es</language><lastBuildDate>Tue, 02 Jun 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://blog.rdiez.es/index.xml" rel="self" type="application/rss+xml"/><item><title>Las miniaturas (thumbnails) no se generan en Ubuntu 24.04 LTS</title><link>https://blog.rdiez.es/p/las-miniaturas-thumbnails-no-se-generan-en-ubuntu-24.04-lts/</link><pubDate>Tue, 02 Jun 2026 00:00:00 +0000</pubDate><guid>https://blog.rdiez.es/p/las-miniaturas-thumbnails-no-se-generan-en-ubuntu-24.04-lts/</guid><description>&lt;img src="https://blog.rdiez.es/p/las-miniaturas-thumbnails-no-se-generan-en-ubuntu-24.04-lts/ubuntu-thumbnails-fix.png" alt="Featured image of post Las miniaturas (thumbnails) no se generan en Ubuntu 24.04 LTS" /&gt;&lt;p&gt;Uno de los fallos más molestos que te puedes encontrar al realizar un update del sistema es que &lt;strong&gt;las miniaturas (thumbnails) de las imágenes dejen de generarse&lt;/strong&gt;, mostrando en su lugar un icono genérico. Si echas un vistazo a tus carpetas ocultas, verás que todas estas miniaturas fallidas acaban almacenadas en la ruta &lt;code&gt;~/.cache/thumbnails/fail&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;En esta ocasión vamos a solucionar este problema de raíz mediante la creación de un perfil seguro de &lt;strong&gt;AppArmor&lt;/strong&gt; para Nautilus, permitiendo que el sistema vuelva a renderizar tus previsualizaciones sin comprometer tu seguridad.&lt;/p&gt;
&lt;h2 id="por-qué-ocurre-esto"&gt;¿Por qué ocurre esto?
&lt;/h2&gt;&lt;p&gt;El culpable detrás de este comportamiento es una nueva política de seguridad restrictiva en Ubuntu 24.04 relacionada con los espacios de nombres de usuario no privilegiados (unprivileged user namespaces).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Nautilus&lt;/strong&gt; (el gestor de archivos de GNOME) utiliza por debajo una herramienta de aislamiento llamada &lt;code&gt;bubblewrap&lt;/code&gt;. Su función es crear un entorno seguro (sandbox) para abrir y procesar las imágenes. De este modo, si un archivo estuviera corrupto o tuviera código malicioso, no podría infectar tu sistema.&lt;/p&gt;
&lt;p&gt;El problema surge porque las directivas estrictas de &lt;strong&gt;AppArmor&lt;/strong&gt; bloquean el funcionamiento de &lt;code&gt;bubblewrap&lt;/code&gt;. Al no poder ejecutarse el sandbox, Nautilus falla de manera silenciosa y envía todas las miniaturas directamente a la carpeta de errores (&lt;code&gt;fail&lt;/code&gt;).&lt;/p&gt;
&lt;h2 id="solución-crear-el-perfil-de-apparmor-para-nautilus"&gt;Solución: Crear el perfil de AppArmor para Nautilus
&lt;/h2&gt;&lt;p&gt;Aunque existen métodos drásticos como desactivar esta restricción a nivel global en todo el kernel, &lt;strong&gt;no es lo recomendable&lt;/strong&gt;. Lo ideal es aplicar una solución quirúrgica: indicarle a AppArmor que confíe específicamente en Nautilus.&lt;/p&gt;
&lt;h3 id="crear-el-archivo-de-configuración"&gt;Crear el archivo de configuración
&lt;/h3&gt;&lt;p&gt;Abrimos una terminal y ejecutamos el siguiente comando para crear un nuevo perfil de AppArmor utilizando el editor de texto nativo &lt;code&gt;nano&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo nano /etc/apparmor.d/nautilus
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Dentro del archivo vacío, vamos a pegar las reglas necesarias para otorgar el permiso requerido:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;span class="lnt"&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;abi &amp;lt;abi/4.0&amp;gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;include &amp;lt;tunables/global&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;profile nautilus /usr/bin/nautilus &lt;span class="nv"&gt;flags&lt;/span&gt;&lt;span class="o"&gt;=(&lt;/span&gt;unconfined&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; userns,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# Site-specific additions and overrides. See local/README for details.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; include &lt;span class="k"&gt;if&lt;/span&gt; exists &amp;lt;local/nautilus&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Para guardar los cambios en nano, presionamos la combinación de teclas &lt;code&gt;Ctrl + O&lt;/code&gt;, pulsamos &lt;code&gt;Enter para confirmar el nombre, y finalmente salimos con Ctrl + X&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id="cargar-el-nuevo-perfil-en-el-sistema"&gt;Cargar el nuevo perfil en el sistema
&lt;/h3&gt;&lt;p&gt;Para que Ubuntu aplique las nuevas reglas inmediatamente sin necesidad de reiniciar el ordenador, lanzamos el siguiente comando en la terminal:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apparmor_parser -r /etc/apparmor.d/nautilus
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="limpieza-del-historial-y-reinicio"&gt;Limpieza del historial y reinicio
&lt;/h2&gt;&lt;p&gt;Una vez solucionado el bloqueo de seguridad, debemos obligar a Nautilus a reintentar la creación de las miniaturas que ya habían quedado marcadas como &amp;ldquo;fallidas&amp;rdquo;.&lt;/p&gt;
&lt;h3 id="vaciar-la-caché-de-errores"&gt;Vaciar la caché de errores
&lt;/h3&gt;&lt;p&gt;Ejecutamos este comando para limpiar el historial de imágenes corruptas en el sistema:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rm -rf ~/.cache/thumbnails/fail/*
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="reiniciar-el-gestor-de-archivos"&gt;Reiniciar el gestor de archivos
&lt;/h3&gt;&lt;p&gt;Por último, cerramos por completo la instancia de Nautilus que está corriendo en segundo plano:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;nautilus -q
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;¡Listo! Con todo esto, la próxima vez que abras tu gestor de archivos y entres en tus carpetas de imágenes o vídeos, verás cómo se empieza a poblar de nuevo con todas las miniaturas generadas de forma instantánea y totalmente segura, como siempre debería haber sido.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;PD&lt;/strong&gt;: Imagen de banner generada con I.A.&lt;/p&gt;</description></item><item><title>Solucionar el menú contextual en blanco de Opera bajo Wayland en Linux</title><link>https://blog.rdiez.es/p/solucionar-el-men%C3%BA-contextual-en-blanco-de-opera-bajo-wayland-en-linux/</link><pubDate>Tue, 12 May 2026 00:00:00 +0000</pubDate><guid>https://blog.rdiez.es/p/solucionar-el-men%C3%BA-contextual-en-blanco-de-opera-bajo-wayland-en-linux/</guid><description>&lt;img src="https://blog.rdiez.es/p/solucionar-el-men%C3%BA-contextual-en-blanco-de-opera-bajo-wayland-en-linux/opera-wayland.png" alt="Featured image of post Solucionar el menú contextual en blanco de Opera bajo Wayland en Linux" /&gt;&lt;p&gt;Utilizando &lt;a class="link" href="https://www.opera.com/es" target="_blank" rel="noopener"
 &gt;Opera&lt;/a&gt; bajo Linux y Wayland (en mi caso Fedora y Ubuntu), me encontré con un problema bastante molesto (otro más de la lista): al pulsar con el botón derecho sobre algunas zonas del navegador, especialmente la barra de pestañas, el menú contextual aparecía completamente en blanco.&lt;/p&gt;
&lt;p&gt;Después de varias pruebas, descubrí que el problema estaba relacionado con la implementación Wayland/Ozone que hace Opera.&lt;/p&gt;
&lt;p&gt;La solución pasa por forzar a Opera a ejecutarse utilizando XWayland, mientras se solucione definitivamente.&lt;/p&gt;
&lt;p&gt;Vamos a ver cómo hacerlo de forma permanente sin afectar a posibles upgrades que nos machaquen los ficheros de configuración:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Creamos el directorio local de aplicaciones de usuario si no existe ya:&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mkdir -p ~/.local/share/applications
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Copiamos el fichero &lt;code&gt;.desktop&lt;/code&gt; de Opera original:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cp /usr/share/applications/opera.desktop ~/.local/share/applications/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Editamos el fichero:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;nano ~/.local/share/applications/opera.desktop
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Tenemos que modificar todas las líneas que comiencen por &lt;strong&gt;Exec&lt;/strong&gt;, añadiendo el parámetro: `&amp;ndash;ozone-platform=x11&lt;/p&gt;
&lt;p&gt;Nos debería quedar algo parecido a esto:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;❯ cat ~/.local/share/applications/opera.desktop
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;Desktop Entry&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;Version&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1.0
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;Name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;Opera
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;GenericName&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;Web browser
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;Comment&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;Fast and secure web browser
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;TryExec&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;opera
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;Exec&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;opera --ozone-platform&lt;span class="o"&gt;=&lt;/span&gt;x11 %U
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;Terminal&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;Icon&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;opera
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;Type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;Application
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;Categories&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;Network&lt;span class="p"&gt;;&lt;/span&gt;WebBrowser&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;MimeType&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;text/html&lt;span class="p"&gt;;&lt;/span&gt;text/xml&lt;span class="p"&gt;;&lt;/span&gt;application/xhtml_xml&lt;span class="p"&gt;;&lt;/span&gt;x-scheme-handler/http&lt;span class="p"&gt;;&lt;/span&gt;x-scheme-handler/https&lt;span class="p"&gt;;&lt;/span&gt;x-scheme-handler/ftp&lt;span class="p"&gt;;&lt;/span&gt;application/x-opera-download&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;Actions&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;new-window&lt;span class="p"&gt;;&lt;/span&gt;new-private-window&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;Desktop Action new-window&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;Name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;New Window
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;Exec&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;opera --new-window --ozone-platform&lt;span class="o"&gt;=&lt;/span&gt;x11
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;TargetEnvironment&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;Unity
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;Desktop Action new-private-window&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;Name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;New Private Window
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;Exec&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;opera --incognito --ozone-platform&lt;span class="o"&gt;=&lt;/span&gt;x11
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;TargetEnvironment&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;Unity
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Por último, cerramos completamente Opera:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pkill opera
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Con esto, al volver a iniciar el navegador, el problema debería haber desaparecido por completo:)&lt;/p&gt;
&lt;p&gt;En mi caso, esta solución funcionó tanto en Ubuntu como en Fedora 44.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;PD&lt;/strong&gt;: Imagen de banner generada con I.A.&lt;/p&gt;</description></item><item><title>Instalar K8sQuest en Linux con Podman Rootless: Solución a Cgroups</title><link>https://blog.rdiez.es/p/instalar-k8squest-en-linux-con-podman-rootless-soluci%C3%B3n-a-cgroups/</link><pubDate>Tue, 14 Apr 2026 00:00:00 +0000</pubDate><guid>https://blog.rdiez.es/p/instalar-k8squest-en-linux-con-podman-rootless-soluci%C3%B3n-a-cgroups/</guid><description>&lt;img src="https://blog.rdiez.es/p/instalar-k8squest-en-linux-con-podman-rootless-soluci%C3%B3n-a-cgroups/k8squest-podman.png" alt="Featured image of post Instalar K8sQuest en Linux con Podman Rootless: Solución a Cgroups" /&gt;&lt;p&gt;Recientemente me topé con &lt;strong&gt;&lt;a class="link" href="https://github.com/Manoj-engineer/k8squest" target="_blank" rel="noopener"
 &gt;K8sQuest&lt;/a&gt;&lt;/strong&gt;. Se trata de una plataforma de aprendizaje gamificada, donde vamos a familiarizarnos con &lt;strong&gt;Kubernetes&lt;/strong&gt; a través de diferentes misiones, donde algo se se romperá&amp;hellip; y nos tocará diagnosticarlo y solucionarlo. Se ejecuta completamente en local, utilizando &lt;strong&gt;&lt;a class="link" href="https://kind.sigs.k8s.io/" target="_blank" rel="noopener"
 &gt;Kind&lt;/a&gt;&lt;/strong&gt; (Kubernetes in Docker/Podman) para levantar bajo el capó el cluster con el que vamos a interactuar.&lt;/p&gt;
&lt;p&gt;Al correr el instalador, él mismo trata de instalar el cluster con Kind, pero al utilizar en mi equipo &lt;strong&gt;&lt;a class="link" href="https://podman.io/" target="_blank" rel="noopener"
 &gt;Podman&lt;/a&gt; en modo rootless&lt;/strong&gt; (sin privilegios de root), me topé de frente con un muro en forma de error:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;🔧 Creating Kubernetes cluster...
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;enabling experimental podman provider
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ERROR: failed to create cluster: running kind with rootless provider requires setting systemd property &lt;span class="s2"&gt;&amp;#34;Delegate=yes&amp;#34;&lt;/span&gt;, see &lt;span class="o"&gt;[&lt;/span&gt;https://kind.sigs.k8s.io/docs/user/rootless/&lt;span class="o"&gt;](&lt;/span&gt;https://kind.sigs.k8s.io/docs/user/rootless/&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;En este post vamos a ver por qué ocurre esto, cómo solucionarlo, y unas pequeñas indicaciones sobre cómo empezar a jugar con K8sQuest en nuestro entorno Linux.&lt;/p&gt;
&lt;h2 id="el-problema-systemd-y-la-delegación-de-cgroups"&gt;El problema: Systemd y la delegación de Cgroups
&lt;/h2&gt;&lt;p&gt;Cuando usamos &lt;strong&gt;Kind&lt;/strong&gt; con &lt;strong&gt;Podman&lt;/strong&gt; rootless, el sistema intenta crear contenedores que actúan como &amp;ldquo;nodos&amp;rdquo; de nuestro clúster de Kubernetes. Estos nodos necesitan gestionar sus propios límites de CPU y memoria utilizando &lt;strong&gt;cgroups v2&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Por defecto, y por motivos de seguridad, systemd bloquea que un usuario normal delegue estos controles. Aunque la documentación oficial recomienda modificar los ficheros de configuración de systemd o usar &lt;code&gt;systemctl --user&lt;/code&gt;, muchas veces estas soluciones fallan silenciosamente o simplemente no son las más sencillas.&lt;/p&gt;
&lt;h2 id="la-solución"&gt;La solución
&lt;/h2&gt;&lt;p&gt;En lugar de pelearnos con la configuración global de nuestra sesión o reiniciar servicios a lo loco, la forma más efectiva que me ha funcionado es inyectar el permiso directamente en el momento de la ejecución del propio instalador.&lt;/p&gt;
&lt;p&gt;Para ello, vamos a envolver nuestro script de instalación con &lt;strong&gt;systemd-run&lt;/strong&gt;. Esta herramienta nos permite lanzar un proceso creándole un &amp;ldquo;scope&amp;rdquo; (un entorno efímero) donde le pasamos exactamente la propiedad que necesita: &lt;code&gt;Delegate=yes&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Nos situamos en el directorio del repositorio clonado de K8sQuest y lanzamos la instalación así:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;systemd-run --scope --user -p &lt;span class="s2"&gt;&amp;#34;Delegate=yes&amp;#34;&lt;/span&gt; ./install.sh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Al ejecutarlo, verás un mensaje fugaz indicando que se está ejecutando como una unidad de systemd (ej. &lt;code&gt;Running as unit: run-XXXX.scope&lt;/code&gt;), y a continuación la instalación continuará sin problemas hasta el final, creando el clúster correctamente, y todas las dependencias necesarias de K8sQuest.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;span class="lnt"&gt;40
&lt;/span&gt;&lt;span class="lnt"&gt;41
&lt;/span&gt;&lt;span class="lnt"&gt;42
&lt;/span&gt;&lt;span class="lnt"&gt;43
&lt;/span&gt;&lt;span class="lnt"&gt;44
&lt;/span&gt;&lt;span class="lnt"&gt;45
&lt;/span&gt;&lt;span class="lnt"&gt;46
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;❯ systemd-run --scope --user -p &lt;span class="s2"&gt;&amp;#34;Delegate=yes&amp;#34;&lt;/span&gt; ./install.sh
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Running as unit: run-r2e1b14ae02bf40a7bc0041218fe81c35.scope&lt;span class="p"&gt;;&lt;/span&gt; invocation ID: 40e8bc6093734d0da4ec058c445ef224
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;🎮 K8sQuest &lt;span class="nv"&gt;Installation&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;========================&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;✅ Python 3.14 detected
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;✅ Prerequisites OK
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;📦 Installing Python dependencies...
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;notice&lt;span class="o"&gt;]&lt;/span&gt; A new release of pip is available: 26.0 -&amp;gt; 26.0.1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;notice&lt;span class="o"&gt;]&lt;/span&gt; To update, run: pip install --upgrade pip
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;✅ Python packages installed
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;enabling experimental podman provider
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;No kind clusters found.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;🔧 Creating Kubernetes cluster...
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;enabling experimental podman provider
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Creating cluster &lt;span class="s2"&gt;&amp;#34;k8squest&amp;#34;&lt;/span&gt; ...
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ✓ Ensuring node image &lt;span class="o"&gt;(&lt;/span&gt;kindest/node:v1.35.0&lt;span class="o"&gt;)&lt;/span&gt; 🖼 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ✓ Preparing nodes 📦 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ✓ Writing configuration 📜 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ✓ Starting control-plane 🕹️ 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ✓ Installing CNI 🔌 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ✓ Installing StorageClass 💾 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Set kubectl context to &lt;span class="s2"&gt;&amp;#34;kind-k8squest&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;You can now use your cluster with:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl cluster-info --context kind-k8squest
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Have a nice day! 👋
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Switched to context &lt;span class="s2"&gt;&amp;#34;kind-k8squest&amp;#34;&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;🏗️ Setting up k8squest namespace...
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;namespace/k8squest created
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;🛡️ Configuring safety guards &lt;span class="o"&gt;(&lt;/span&gt;RBAC&lt;span class="o"&gt;)&lt;/span&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;serviceaccount/k8squest-player created
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;role.rbac.authorization.k8s.io/k8squest-player-role created
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rolebinding.rbac.authorization.k8s.io/k8squest-player-binding created
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;clusterrole.rbac.authorization.k8s.io/k8squest-viewer created
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;clusterrolebinding.rbac.authorization.k8s.io/k8squest-viewer-binding created
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;✅ Safety guards configured
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;🚀 Setup Complete!
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;To start playing, use the shortcut:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ./play.sh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="empezando-a-jugar-con-k8squest"&gt;Empezando a jugar con K8sQuest
&lt;/h2&gt;&lt;p&gt;Una vez que el instalador ha terminado, ya tenemos nuestro clúster operativo y corriendo en Podman de forma totalmente transparente y sin comprometer la seguridad de nuestro sistema usando la cuenta root.&lt;/p&gt;
&lt;p&gt;Para empezar a trabajar con él, los pasos habituales son:&lt;/p&gt;
&lt;h3 id="verificar-el-clúster"&gt;&lt;strong&gt;Verificar el clúster&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;Podemos asegurarnos de que el clúster de Kind se ha levantado correctamente comprobando los nodos (recuerda que si usas Podman, quizás tengas que exportar la variable KUBECONFIG si el instalador te lo ha indicado):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl get nodes
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Se debería ver el nodo o nodos de K8sQuest en estado Ready.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;❯ kubectl get nodes
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Alias tip: k get nodes
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;NAME STATUS ROLES AGE VERSION
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;k8squest-control-plane Ready control-plane 5m40s v1.35.0
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="arrancar-el-juego"&gt;&lt;strong&gt;Arrancar el juego&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;Para iniciar el juego, tan solo tenemos que abrir una terminal en el directorio donde clonamos los archivos de K8sQuest y ejecutar:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;./play.sh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;img alt="play_sh" class="gallery-image" data-flex-basis="471px" data-flex-grow="196" height="608" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.rdiez.es/p/instalar-k8squest-en-linux-con-podman-rootless-soluci%C3%B3n-a-cgroups/play_sh.png" srcset="https://blog.rdiez.es/p/instalar-k8squest-en-linux-con-podman-rootless-soluci%C3%B3n-a-cgroups/play_sh_hu_acbc0d213b0fe5c8.png 800w, https://blog.rdiez.es/p/instalar-k8squest-en-linux-con-podman-rootless-soluci%C3%B3n-a-cgroups/play_sh.png 1194w" width="1194"&gt;&lt;/p&gt;
&lt;p&gt;Al aceptar, comenzará nuestra primera misión: &amp;ldquo;Fix the Crashing Pod&amp;rdquo;&lt;/p&gt;
&lt;p&gt;&lt;img alt="Primera mision" class="gallery-image" data-flex-basis="623px" data-flex-grow="259" height="459" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.rdiez.es/p/instalar-k8squest-en-linux-con-podman-rootless-soluci%C3%B3n-a-cgroups/1_mission.png" srcset="https://blog.rdiez.es/p/instalar-k8squest-en-linux-con-podman-rootless-soluci%C3%B3n-a-cgroups/1_mission_hu_11b18f0d52f64dca.png 800w, https://blog.rdiez.es/p/instalar-k8squest-en-linux-con-podman-rootless-soluci%C3%B3n-a-cgroups/1_mission.png 1193w" width="1193"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="Primera mision descripcion" class="gallery-image" data-flex-basis="447px" data-flex-grow="186" height="865" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.rdiez.es/p/instalar-k8squest-en-linux-con-podman-rootless-soluci%C3%B3n-a-cgroups/2_mission.png" srcset="https://blog.rdiez.es/p/instalar-k8squest-en-linux-con-podman-rootless-soluci%C3%B3n-a-cgroups/2_mission_hu_9a2c4cb4ddea79c0.png 800w, https://blog.rdiez.es/p/instalar-k8squest-en-linux-con-podman-rootless-soluci%C3%B3n-a-cgroups/2_mission_hu_7e5de869e75a08dd.png 1600w, https://blog.rdiez.es/p/instalar-k8squest-en-linux-con-podman-rootless-soluci%C3%B3n-a-cgroups/2_mission.png 1613w" width="1613"&gt;&lt;/p&gt;
&lt;p&gt;Nos hace una serie de indicaciones muy importantes para poder jugar:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Debemos abrir una nueva ventana/pestaña de terminal, desde donde &amp;ldquo;jugaremos&amp;rdquo; realmente.&lt;/li&gt;
&lt;li&gt;Utilizaremos el comando &lt;code&gt;kubectl&lt;/code&gt; para aplicar las soluciones.&lt;/li&gt;
&lt;li&gt;Volveremos a esta pestaña para verificar la solución.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="limpiar-el-cluster-de-k8squest"&gt;&lt;strong&gt;Limpiar el cluster de K8sQuest&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;Como todo el clúster está contenido dentro de nuestro entorno de usuario de Podman, se puede gestionar cómodamente. Si en algún momento necesitamos parar el clúster para liberar recursos de la máquina, se puede hacer usando el CLI de Kind indicando el proveedor experimental:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;KIND_EXPERIMENTAL_PROVIDER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;podman kind delete cluster --name k8squest
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Con todo esto, ya tenemos un entorno de Kubernetes funcional, ligero y seguro en nuestro Linux para seguir trasteando y aprendiendo con K8sQuest. ¡Nos vemos en el próximo post!&lt;/p&gt;
&lt;p&gt;&lt;img alt="Victory" class="gallery-image" data-flex-basis="1135px" data-flex-grow="472" height="296" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.rdiez.es/p/instalar-k8squest-en-linux-con-podman-rootless-soluci%C3%B3n-a-cgroups/victory.png" srcset="https://blog.rdiez.es/p/instalar-k8squest-en-linux-con-podman-rootless-soluci%C3%B3n-a-cgroups/victory_hu_13da2492e423edb.png 800w, https://blog.rdiez.es/p/instalar-k8squest-en-linux-con-podman-rootless-soluci%C3%B3n-a-cgroups/victory.png 1400w" width="1400"&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;PD&lt;/strong&gt;: La imagen del banner de este post ha sido generada con IA.&lt;/p&gt;</description></item><item><title>Adiós Evernote, bromas las justas</title><link>https://blog.rdiez.es/p/adi%C3%B3s-evernote-bromas-las-justas/</link><pubDate>Tue, 11 Nov 2025 00:00:00 +0000</pubDate><guid>https://blog.rdiez.es/p/adi%C3%B3s-evernote-bromas-las-justas/</guid><description>&lt;img src="https://blog.rdiez.es/p/adi%C3%B3s-evernote-bromas-las-justas/banner.png" alt="Featured image of post Adiós Evernote, bromas las justas" /&gt;&lt;h2 id="adiós-evernote-y-gracias-por-estos-10-años-o-no"&gt;Adiós Evernote, y gracias por estos 10 años&amp;hellip; o no.
&lt;/h2&gt;&lt;p&gt;He sido usuario de &lt;a class="link" href="https://www.evernote.com/" target="_blank" rel="noopener"
 &gt;Evernote&lt;/a&gt; durante más de una década. Más de 1.300 notas, clasificadas, etiquetadas, mantenidas y sincronizadas a través de todos mis dispositivos. Durante mucho tiempo fue una herramienta útil, estable y, sobre todo, con un precio razonable. No tenía intención de cambiar. Para mi era, simplemente, la mejor.&lt;/p&gt;
&lt;p&gt;Cuando Evernote fue comprada por &lt;a class="link" href="https://bendingspoons.com/" target="_blank" rel="noopener"
 &gt;Bending Spoons&lt;/a&gt;, lo primero que llegó fueron las subidas de precio. Considerables subidas de precio. En aquel momento, conseguí un descuento para renovar, quedando el precio sobre unos 40€-50€, y decidí darles una oportunidad: venían actualizaciones frecuentes, algunas mejoras interesantes, y la sensación de que el producto seguía vivo. Hasta aquí, bien. El nuevo Evernote cumplió con lo prometido y siguieron contando con mi confianza.&lt;/p&gt;
&lt;p&gt;El problema ha llegado ahora, con otro cambio de tarifas más. Para conservar más o menos la misma funcionalidad que tenía hasta hoy día, tengo que pasarme del plan Personal actual (99€ al año sin descuentos) al nuevo plan Advanced, que sale por la friolera de 199€ al año. El doble. Y ni siquiera hablamos de nuevas funciones o ventajas reales para justificarlo. Simplemente, pagar más por lo mismo. Porque sí.&lt;/p&gt;
&lt;p&gt;Lo peor es que incluso pagando más, siguen imponiendo nuevos límites completamente absurdos, como la sincronización en tan sólo 5 dispositivos. Y esto en el plan Advanced. En el plan de pago un escalón por debajo, meten límites como sincronización en 3 dispositivos, 1.000 notas, o 20 cuadernos. Esto parece una auténtica broma. Llevo años pagando Evernote precisamente porque podía olvidarme de ese tipo de restricciones. Ahora quieren convertir ese aspecto básico (sobre todo en un plan de pago) en un “privilegio” caro.&lt;/p&gt;
&lt;p&gt;Esto, para mí, es la gota que colma el vaso.&lt;/p&gt;
&lt;p&gt;Es algo similar a lo que me ocurre con Netflix u otros servicios de streaming. Constantes subidas de precio y más limitaciones impuestas, publicidad, etc.&lt;/p&gt;
&lt;p&gt;No voy a pagar bajo ningún concepto el doble para mantener exactamente lo mismo que hasta ahora. No voy a aceptar restricciones descabelladas pensadas para forzar al usuario al plan más caro. Y sobre todo, no voy a seguir confiando mis notas a una empresa que cambia las reglas de juego año sí, año también.&lt;/p&gt;
&lt;p&gt;La confianza, una vez rota, no se recupera.&lt;/p&gt;
&lt;h2 id="y-ahora-a-migrar"&gt;Y ahora, a migrar
&lt;/h2&gt;&lt;p&gt;Sé que no va a ser divertido mover más de 1.300 notas. Sé que me llevará tiempo reestructurar todo, elegir otra aplicación, y adaptarme. Pero prefiero invertir ese esfuerzo ahora que seguir atrapado en una plataforma que ha dejado claro cómo entiende a sus usuarios: como una fuente de ingresos que se puede exprimir cada año un poco más.&lt;/p&gt;
&lt;p&gt;Hace años sospechaba que no era buena idea el atarme a un formato propietario y confiar todas mis notas a una empresa que podría &amp;ldquo;cortar el grifo&amp;rdquo; en cualquier momento. Debí haber escuchado más atentamente a mi voz interior. Incluso el propio Evernote a día de hoy impone restricciones a la hora de exportar tus propias notas, límites completamente artificiales que sólo buscan el atarte en su plataforma.&lt;/p&gt;
&lt;p&gt;Por fortuna, la migración a día de hoy no es complicada utilizando herramientas de terceros, ya que puedo exportar mis notas fácilmente con herramientas como &lt;a class="link" href="https://github.com/peterquiel/evernote-exporter" target="_blank" rel="noopener"
 &gt;Evernote ENEX Exporter&lt;/a&gt;, e importarlas manteniendo su formato prácticamente intacto en &lt;a class="link" href="https://joplinapp.org/" target="_blank" rel="noopener"
 &gt;Joplin&lt;/a&gt; u &lt;a class="link" href="https://obsidian.md/" target="_blank" rel="noopener"
 &gt;Obsidian&lt;/a&gt;. Estas herramientas te hacen completamente dueño de tus datos, sin atarte a nada. Ambas tienen sus pros y contras, por lo que tengo tiempo por delante para poder elegir el reemplazo más adecuado.&lt;/p&gt;
&lt;p&gt;Así que este es mi punto final con Evernote.&lt;/p&gt;
&lt;p&gt;Adiós Evernote.&lt;/p&gt;
&lt;p&gt;No volveré.&lt;/p&gt;
&lt;p&gt;Jamás.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;PD&lt;/strong&gt;: Imagen de banner generada con IA&lt;/p&gt;</description></item><item><title>Solucionar el cierre de Microsoft Edge en Linux (Wayland) al descargar Archivos</title><link>https://blog.rdiez.es/p/solucionar-el-cierre-de-microsoft-edge-en-linux-wayland-al-descargar-archivos/</link><pubDate>Tue, 04 Nov 2025 00:00:00 +0000</pubDate><guid>https://blog.rdiez.es/p/solucionar-el-cierre-de-microsoft-edge-en-linux-wayland-al-descargar-archivos/</guid><description>&lt;img src="https://blog.rdiez.es/p/solucionar-el-cierre-de-microsoft-edge-en-linux-wayland-al-descargar-archivos/banner.png" alt="Featured image of post Solucionar el cierre de Microsoft Edge en Linux (Wayland) al descargar Archivos" /&gt;&lt;p&gt;Si eres usuario de escritorio de Linux, probablemente estés usando &lt;strong&gt;Wayland&lt;/strong&gt;, como servidor gráfico. Y si también eres de esas personas que utilizas &lt;strong&gt;Microsoft Edge&lt;/strong&gt;, es posible que te hayas topado con un problema frustrante en las últimas versiones del navegador: &lt;strong&gt;se cierra por completo (crashea) en el instante en que intentas descargar un archivo&lt;/strong&gt; cualquiera.&lt;/p&gt;
&lt;p&gt;No parece que sea algo puntual. Afortunadamente, el problema tiene un diagnóstico claro y una solución bastante sencilla. Vamos a solucionar este problema paso a paso:&lt;/p&gt;
&lt;h2 id="qué-está-pasando"&gt;¿Qué está pasando?
&lt;/h2&gt;&lt;p&gt;Cuando el navegador crashea, lo primero que debemos hacer es ejecutarlo desde una terminal para ver qué nos dice. Si ejecutas &lt;code&gt;microsoft-edge&lt;/code&gt; y provocas el fallo, probablemente verás un registro de error similar a este de libwayland: &lt;code&gt;exported surface had an invalid role&lt;/code&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;❯ microsoft-edge
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;...errores omitidos...&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;505387:505387:1104/130749.871196:ERROR:ui/events/platform/wayland/wayland_event_watcher.cc:47&lt;span class="o"&gt;]&lt;/span&gt; libwayland: zxdg_exporter_v2#25: error 0: exported surface had an invalid role
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;...errores omitidos...&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;1&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="m"&gt;505387&lt;/span&gt; trace &lt;span class="nb"&gt;trap&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;core dumped&lt;span class="o"&gt;)&lt;/span&gt; microsoft-edge
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Para los de la Logse:&lt;/strong&gt; Cuando intentas descargar algo, Edge (basado en Chromium) intenta abrir el diálogo de &amp;ldquo;Guardar como&amp;rdquo; usando el protocolo nativo de Wayland. Sin embargo, le asigna un &amp;ldquo;rol&amp;rdquo; (un tipo de ventana) que tu compositor de Wayland (como Mutter en GNOME o KWin en KDE) no entiende o considera inválido. Este desacuerdo causa un error fatal y el navegador se cierra sin más explicaciones.&lt;/p&gt;
&lt;h2 id="la-solución-paso-a-paso"&gt;La Solución, Paso a Paso
&lt;/h2&gt;&lt;p&gt;La solución es forzar a Microsoft Edge a &lt;strong&gt;no usar Wayland&lt;/strong&gt; de forma nativa, sino que se ejecute a través de &lt;strong&gt;XWayland&lt;/strong&gt;, una capa de compatibilidad para aplicaciones X11, que existe especialmente para este tipo de situaciones.&lt;/p&gt;
&lt;h3 id="paso-1-verificar-la-solución"&gt;Paso 1: Verificar la Solución
&lt;/h3&gt;&lt;p&gt;Primero, vamos a confirmar que esta es la solución. Cierra por completo todas las ventanas de Microsoft Edge que pudieras tener abiertas.&lt;/p&gt;
&lt;p&gt;Luego, abre una terminal y ejecuta el siguiente comando:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;microsoft-edge --ozone-platform&lt;span class="o"&gt;=&lt;/span&gt;x11
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Este comando le dice a Edge: &amp;ldquo;Ignora Wayland y ejecútate usando la capa de compatibilidad X11 (XWayland)&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Ahora, con el navegador abierto desde esa terminal, &lt;strong&gt;intenta descargar un archivo&lt;/strong&gt;. El diálogo de &amp;ldquo;Guardar como&amp;rdquo; debería aparecer sin problemas y el navegador ya no se cierra.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Nota:&lt;/strong&gt; Es posible que en la terminal veas algunos errores nuevos, como &lt;code&gt;GetVSyncParametersIfAvailable() failed&lt;/code&gt;. ¡No te preocupes! Estos son avisos menores no fatales, relacionados con la capa de compatibilidad, y puedes ignorarlos con seguridad. Lo importante es que el &lt;em&gt;crash&lt;/em&gt; ha desaparecido.&lt;/p&gt;
&lt;h3 id="paso-2-aplicar-la-solución-permanente"&gt;Paso 2: Aplicar la Solución Permanente
&lt;/h3&gt;&lt;p&gt;Ahora que ya sabemos cual es el problema, y cómo corregirlo, vamos a hacer que este cambio sea permanente para que Edge &lt;em&gt;siempre&lt;/em&gt; se inicie con esta configuración, sin importar si lo abres desde el icono de tu dock o desde el menú de aplicaciones.&lt;/p&gt;
&lt;p&gt;Para ello, modificaremos el archivo &lt;code&gt;.desktop&lt;/code&gt; (el lanzador) de la aplicación.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Copiar el lanzador a tu directorio local:&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;No vamos a editar el archivo del sistema directamente, ya que un &lt;code&gt;sudo&lt;/code&gt; es innecesario y una actualización del navegador podría borrar nuestros cambios. En su lugar, lo copiaremos a nuestro perfil de usuario. Ten en cuenta que el nombre del archivo podría variar dependiendo de si utilizar la version estable, dev, etc.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cp /usr/share/applications/microsoft-edge.desktop ~/.local/share/applications/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Abrir el archivo para editarlo:&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ahora, abre este nuevo archivo con un editor de texto. Tomemos &lt;code&gt;nano&lt;/code&gt; como ejemplo:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;nano ~/.local/share/applications/microsoft-edge.desktop
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Modificar las líneas &lt;code&gt;Exec&lt;/code&gt;:&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Dentro de este archivo, verás varias líneas que comienzan con &lt;code&gt;Exec=&lt;/code&gt;. Estas líneas le dicen al sistema cómo ejecutar el programa. Tienes que encontrar todas las líneas &lt;code&gt;Exec=&lt;/code&gt; que ejecuten el binario principal (como &lt;code&gt;Exec=/usr/bin/microsoft-edge-stable %U&lt;/code&gt; o &lt;code&gt;Exec=/usr/bin/microsoft-edge-stable --in-private-browsing&lt;/code&gt;) y añadirles el &lt;em&gt;flag&lt;/em&gt; &lt;code&gt;--ozone-platform=x11&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Hay que asegurarse de añadirlo &lt;strong&gt;después del comando pero antes de cualquier variable&lt;/strong&gt; como &lt;code&gt;%U&lt;/code&gt; o &lt;code&gt;--new-window&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Ejemplo (Antes):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-ini" data-lang="ini"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;[Desktop Entry]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;Exec&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;/usr/bin/microsoft-edge-stable %U&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;[Desktop Action new-window]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;Exec&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;/usr/bin/microsoft-edge-stable --new-window&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;[Desktop Action new-private-window]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;Exec&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;/usr/bin/microsoft-edge-stable --in-private-browsing&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Ejemplo (Después):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-ini" data-lang="ini"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;[Desktop Entry]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;Exec&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;/usr/bin/microsoft-edge-stable --ozone-platform=x11 %U&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;[Desktop Action new-window]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;Exec&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;/usr/bin/microsoft-edge-stable --ozone-platform=x11 --new-window&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;[Desktop Action new-private-window]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;Exec&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;/usr/bin/microsoft-edge-stable --ozone-platform=x11 --in-private-browsing&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Guardar y Salir:&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Por seguir con el ejemplo anterior, en &lt;code&gt;nano&lt;/code&gt;, guardamos pulsando &lt;code&gt;Ctrl + O&lt;/code&gt; (Enter) y luego salir con &lt;code&gt;Ctrl + X&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;¡Y eso es todo! Ahora usaremos automáticamente el lanzador modificado y completamente operativo :)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;PD&lt;/strong&gt;: Imagen de banner generada con I.A.&lt;/p&gt;</description></item><item><title>Añadir webs en la barra lateral de Opera One</title><link>https://blog.rdiez.es/p/a%C3%B1adir-webs-en-la-barra-lateral-de-opera-one/</link><pubDate>Mon, 20 Oct 2025 00:00:00 +0000</pubDate><guid>https://blog.rdiez.es/p/a%C3%B1adir-webs-en-la-barra-lateral-de-opera-one/</guid><description>&lt;img src="https://blog.rdiez.es/p/a%C3%B1adir-webs-en-la-barra-lateral-de-opera-one/banner.png" alt="Featured image of post Añadir webs en la barra lateral de Opera One" /&gt;&lt;p&gt;Una de las ventajas que siempre he visto del navegador &lt;a class="link" href="https://www.opera.com/es" target="_blank" rel="noopener"
 &gt;Opera&lt;/a&gt; ha sido su barra lateral, concretamente la capacidad de anclar sitios web personalizados en ella. Poder añadir una web como Evernote, por ejemplo, permite consultar notas rápidamente en un panel flotante sin interrumpir el flujo de trabajo principal, ni tener que cambiar de pestañas.&lt;/p&gt;
&lt;p&gt;Es una funcionalidad que poco a poco van replicando otros navegadores, como Edge, Vivaldi, Brave&amp;hellip;. pero encuentro que lleguen a funcionar tan bien como en Opera.&lt;/p&gt;
&lt;p&gt;Con el cambio de navegador a la versión &amp;ldquo;Opera One&amp;rdquo;, esta funcionalidad ha desaparecido. La sección &amp;ldquo;Sitios Personalizados&amp;rdquo; ya no se encuentra en la configuración de la barra lateral, y debemos limitarnos a los sitios o servicios que ellos consideran.&lt;/p&gt;
&lt;p&gt;Afortunadamente, la opción no ha sido eliminada por completo, sino que se encuentra oculta como una función experimental (una &amp;ldquo;flag&amp;rdquo;). Para poder recuperarla, el proceso es muy sencillo:&lt;/p&gt;
&lt;h2 id="activar-la-flag-experimental"&gt;Activar la &amp;ldquo;Flag&amp;rdquo; experimental
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Abre una nueva pestaña en Opera One.&lt;/li&gt;
&lt;li&gt;Escribe lo siguiente en la barra de direcciones: &lt;code&gt;opera://flags&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Se abrirá el menú de funciones experimentales. En la barra de búsqueda superior (&amp;ldquo;Search flags&amp;rdquo;), vamos a buscar la flag que necesitamos: &lt;code&gt;sidebar-site-panel&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Aparecerá la opción &amp;ldquo;Custom user sites for browser sidebar&amp;rdquo;. Cambia la setting de &amp;ldquo;Default&amp;rdquo; a &amp;ldquo;Enabled&amp;rdquo;.&lt;/li&gt;
&lt;li&gt;Para que se apliquen los cambios, si no lo pide al activar el cambio, es necesario reiniciar el navegador.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt="flag" class="gallery-image" data-flex-basis="575px" data-flex-grow="239" height="356" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.rdiez.es/p/a%C3%B1adir-webs-en-la-barra-lateral-de-opera-one/flag.png" srcset="https://blog.rdiez.es/p/a%C3%B1adir-webs-en-la-barra-lateral-de-opera-one/flag_hu_cb65afee9aaabd8d.png 800w, https://blog.rdiez.es/p/a%C3%B1adir-webs-en-la-barra-lateral-de-opera-one/flag.png 854w" width="854"&gt;&lt;/p&gt;
&lt;h2 id="añadir-tus-sitios-web"&gt;Añadir tus sitios web
&lt;/h2&gt;&lt;p&gt;Una vez reiniciado Opera, la opción volverá a estar disponible en el menú de configuración:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Clic en el icono de tres puntos (&amp;hellip;) situado en la parte inferior de la barra lateral.&lt;/li&gt;
&lt;li&gt;En el panel de &amp;ldquo;Configuración de la barra lateral&amp;rdquo;, desliza hacia abajo, casi hasta el final de las opciones.&lt;/li&gt;
&lt;li&gt;La sección &amp;ldquo;Sitios personalizados&amp;rdquo; ha vuelto a aparecer.&lt;/li&gt;
&lt;li&gt;Ya puedes clicar en &amp;ldquo;Añadir sitio personalizado&amp;rdquo; e introducir la URL que necesites (por ejemplo &lt;a class="link" href="https://evernote.com" target="_blank" rel="noopener"
 &gt;https://evernote.com&lt;/a&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt="Add custom site panel" class="gallery-image" data-flex-basis="375px" data-flex-grow="156" height="385" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.rdiez.es/p/a%C3%B1adir-webs-en-la-barra-lateral-de-opera-one/custom_web.png" width="603"&gt;&lt;/p&gt;
&lt;p&gt;Si bien esto soluciona el problema, es importante recordar que, al ser una &amp;ldquo;flag&amp;rdquo; experimental, Opera podría decidir eliminarla permanentemente en cualquier actualización futura. Pero, por el momento, esta es la solución :) Esperemos que dure mucho tiempo.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;PD&lt;/strong&gt;: Imagen de banner generada con I.A.&lt;/p&gt;</description></item><item><title>Caráturas en las Colecciones de Jellyfin</title><link>https://blog.rdiez.es/p/car%C3%A1turas-en-las-colecciones-de-jellyfin/</link><pubDate>Tue, 30 Sep 2025 00:00:00 +0000</pubDate><guid>https://blog.rdiez.es/p/car%C3%A1turas-en-las-colecciones-de-jellyfin/</guid><description>&lt;img src="https://blog.rdiez.es/p/car%C3%A1turas-en-las-colecciones-de-jellyfin/banner.png" alt="Featured image of post Caráturas en las Colecciones de Jellyfin" /&gt;&lt;p&gt;Desde la subida de precios de &lt;a class="link" href="https://www.europapress.es/portaltic/internet/noticia-plex-aumenta-precios-nivel-suscripcion-plex-pass-anuncia-nuevo-plan-remote-watch-pass-20250320103248.html" target="_blank" rel="noopener"
 &gt;Plex&lt;/a&gt;, y su limitación de ciertas características gratuitas que yo utilizaba, he migrado todo mi contenido a &lt;a class="link" href="https://jellyfin.org/" target="_blank" rel="noopener"
 &gt;Jellyfin&lt;/a&gt;. Hasta el momento ha ido todo sin problemas, excepto por un pequeño detalle del que me ha costado encontrar la solución. Se trata de las carátulas en las colecciones.&lt;/p&gt;
&lt;p&gt;Cuando hay 2 o mas películas de la misma colección, se crea una en la sección correspondiente de Jellyfin agrupando a estas películas. El problema es que a veces, por algún motivo, estas colecciones quedan bloqueadas y no se le asignan las caráturas y metadatos correspondientes.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Colección sin metadatos" class="gallery-image" data-flex-basis="505px" data-flex-grow="210" height="697" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.rdiez.es/p/car%C3%A1turas-en-las-colecciones-de-jellyfin/collection_failed.png" srcset="https://blog.rdiez.es/p/car%C3%A1turas-en-las-colecciones-de-jellyfin/collection_failed_hu_eebc0704822b65f5.png 800w, https://blog.rdiez.es/p/car%C3%A1turas-en-las-colecciones-de-jellyfin/collection_failed.png 1468w" width="1468"&gt;&lt;/p&gt;
&lt;h2 id="reparar-la-colección"&gt;Reparar la colección
&lt;/h2&gt;&lt;p&gt;Para solucionar este problema, es necesario realizar dos pasos en orden:&lt;/p&gt;
&lt;h3 id="desbloquear-la-colección"&gt;Desbloquear la colección
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Desde la interfaz web de nuestro Jellyfin, accedemos a las colecciones.&lt;/li&gt;
&lt;li&gt;Hacemos click en el menú de la colección afectada (los 3 puntitos)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt="Menu de la coleccion" class="gallery-image" data-flex-basis="469px" data-flex-grow="195" height="282" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.rdiez.es/p/car%C3%A1turas-en-las-colecciones-de-jellyfin/collection_menu.png" width="552"&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Vamos a &amp;ldquo;Edit Metadata&amp;rdquo; y bajamos hasta abajo del todo&lt;/li&gt;
&lt;li&gt;Desmarcamos la opción &amp;ldquo;Bloquear este elemento para evitar futuros cambios&amp;rdquo;&lt;/li&gt;
&lt;li&gt;Guardamos los cambios&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="forzar-la-actualización-de-metadatos"&gt;Forzar la actualización de metadatos
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Volvemos al menú de la colección afectada (los 3 puntitos)&lt;/li&gt;
&lt;li&gt;Vamos a &amp;ldquo;Actualizar Metadatos&amp;rdquo;&lt;/li&gt;
&lt;li&gt;Modo de refresco: &amp;ldquo;Refrescar todos los metadatos&amp;rdquo;&lt;/li&gt;
&lt;li&gt;Marcamos las 2 opciones:
&lt;ul&gt;
&lt;li&gt;&amp;ldquo;Reemplazar imágenes existentes&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&amp;ldquo;Reemplazar imágenes trickplay existentes&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Pulsamos en Refrescar&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Después de esto, la operación se meterá en la cola, y los metadatos de nuestra colección ya deberían aparecer según lo esperado&lt;/p&gt;
&lt;p&gt;&lt;img alt="Colección con metadatos correctos" class="gallery-image" data-flex-basis="430px" data-flex-grow="179" height="821" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.rdiez.es/p/car%C3%A1turas-en-las-colecciones-de-jellyfin/collection_ok.png" srcset="https://blog.rdiez.es/p/car%C3%A1turas-en-las-colecciones-de-jellyfin/collection_ok_hu_bac5105dea6932e9.png 800w, https://blog.rdiez.es/p/car%C3%A1turas-en-las-colecciones-de-jellyfin/collection_ok.png 1474w" width="1474"&gt;&lt;/p&gt;</description></item><item><title>BuJo: de vuelta a lo analógico. Revolución inesperada</title><link>https://blog.rdiez.es/p/bujo-de-vuelta-a-lo-anal%C3%B3gico.-revoluci%C3%B3n-inesperada/</link><pubDate>Mon, 07 Apr 2025 00:00:00 +0000</pubDate><guid>https://blog.rdiez.es/p/bujo-de-vuelta-a-lo-anal%C3%B3gico.-revoluci%C3%B3n-inesperada/</guid><description>&lt;img src="https://blog.rdiez.es/p/bujo-de-vuelta-a-lo-anal%C3%B3gico.-revoluci%C3%B3n-inesperada/banner_bujo.png" alt="Featured image of post BuJo: de vuelta a lo analógico. Revolución inesperada" /&gt;&lt;p&gt;Hace un año, si alguien me hubiera dicho que abandonaría mis incontables apps de gestión del tiempo por un simple cuaderno de papel, le habría mirado como si hubiera perdido la cabeza. Soy informático, vivo entre pantallas, y mi necesidad (y obsesión) por optimizar cada minuto me llevó a probar decenas de apps con esta finalidad: Trello, Notion, Todoist, TickTick, Recordatorios de Apple, Asana&amp;hellip;. hasta Obsidian con plugins personalizados. Pero hoy, mi herramienta de organización cabe en un simple A5 y no necesita batería.&lt;/p&gt;
&lt;p&gt;Este ha sido mi viaje hacia el &lt;strong&gt;Bullet Journal minimalista&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="el-fracaso-digital-cuando-más-apps--más-caos"&gt;&lt;strong&gt;El fracaso digital: cuando más apps = más caos&lt;/strong&gt;
&lt;/h2&gt;&lt;p&gt;Durante años, creí que la respuesta a mi desorganización estaba en la próxima app &lt;em&gt;todo-en-uno&lt;/em&gt;. Sin embargo, terminé con notificaciones constante, recordatorios olvidados o continuamente pospuestos, y una ansiedad constante por tener todo registrado en la correspondiente App.&lt;/p&gt;
&lt;p&gt;Lo digital, paradójicamente, me distraía más de lo que me ayudaba. La saturación de opciones y la falsa sensación de control (¡tantos gráficos! ¡tantas etiquetas! ¡tantas opciones de visualización!) me hacían perder el foco constantemente.&lt;/p&gt;
&lt;h2 id="el-descubrimiento-ryder-carroll-y-la-simplicidad-radical"&gt;&lt;strong&gt;El descubrimiento: Ryder Carroll y la simplicidad radical&lt;/strong&gt;
&lt;/h2&gt;&lt;p&gt;Fue de pura casualidad que leí por primera vez sobre un curioso método, el &lt;strong&gt;Bullet Journal&lt;/strong&gt;. Me llamó la atención, e investigué el método original de &lt;a class="link" href="https://www.rydercarroll.com/" target="_blank" rel="noopener"
 &gt;Ryder Carroll&lt;/a&gt;, incluso compré &lt;strong&gt;su libro&lt;/strong&gt; &lt;a class="link" href="https://amzn.to/3EjMvs3" target="_blank" rel="noopener"
 &gt;El método Bullet Journal&lt;/a&gt; para profundizar más en tema&amp;hellip; y algo hizo &lt;em&gt;click&lt;/em&gt;: se trataba de un sistema &lt;strong&gt;analógico, flexible y centrado en acciones&lt;/strong&gt;, no en decoraciones ni florituras.&lt;/p&gt;
&lt;p&gt;Compré un cuaderno sencillo de puntos, un bolígrafo de tinta negra, que me pareció lo suficientemente cómodo, y empecé con las bases: &lt;em&gt;Índice&lt;/em&gt;, &lt;em&gt;Registro futuro&lt;/em&gt;, &lt;em&gt;Registro mensual&lt;/em&gt; y &lt;em&gt;Registro diario&lt;/em&gt;. Mi idea inicial era comprobar si este método era la revolución que prometía, y ver si podría adaptarme a este nuevo flujo tan disruptor con mi experiencia pasada.&lt;/p&gt;
&lt;h2 id="por-qué-lo-analógico-funciona-cuando-lo-digital-falla"&gt;&lt;strong&gt;Por qué lo analógico funciona (cuando lo digital falla)&lt;/strong&gt;
&lt;/h2&gt;&lt;p&gt;Tras semanas de uso con el &lt;strong&gt;BuJo&lt;/strong&gt;, me fui dando cuenta de sus grandes ventajas:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Menos distracciones, más atención&lt;/strong&gt;: Sin notificaciones, sin tentaciones de abrir una red social al marcar una tarea. Escribir a mano me obliga a &lt;em&gt;pensar&lt;/em&gt; antes de anotar, filtrando lo trivial.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Flexibilidad sin límites&lt;/strong&gt;: ¿Una lista de la compra junto a un diagrama de flujo para un proyecto? En digital, eso implicaría tres apps distintas. En mi BuJo, son dos páginas contiguas.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Memoria física&lt;/strong&gt;: Subrayar una tarea completada con un rápido gesto de la mano (¡el famoso &lt;em&gt;X&lt;/em&gt; en lugar del check de toda la vida!) genera una satisfacción tangible que ningún &lt;em&gt;checkmark&lt;/em&gt; digital iguala.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Privacidad y propiedad&lt;/strong&gt;: Mis datos no están en la nube de nadie. Es mi sistema, sin algoritmos, sin suscripciones, sin actualizaciones que rompan mi flujo. Además fácilmente almacenable durante años y años, para futuras referencias.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Además, una ventaja muy grande para mi, es que en un mismo cuaderno, puedo tener TODAS mis tareas: personales, familiares, de trabajo, compromisos, etc. Esto hace que todo el foco de mi productividad se encuentre centralizado en un único sitio, con la seguridad que me da esto de saber que no tengo que rebuscar mis tareas por diferentes sitios, y posiblemente pasar algo por alto.&lt;/p&gt;
&lt;h2 id="mi-estilo-minimalismo-puro-nada-de-washi-tapes-stickers-o-acuarelas"&gt;&lt;strong&gt;Mi estilo: minimalismo puro (nada de washi tapes, stickers o acuarelas)&lt;/strong&gt;
&lt;/h2&gt;&lt;p&gt;En Instagram, Pinterest, etc, el Bullet Journal suele asociarse a diseños coloridos, caligrafía ornamental y páginas temáticas. Parece que se le pretende dar más importancia la forma que al contenido o la finalidad. Para mí, eso es completamente contraproducente. Mi regla es clara: &lt;strong&gt;si no suma funcionalidad, no entra&lt;/strong&gt;. Uso únicamente:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Títulos en negrita&lt;/strong&gt; con un rotulador más gordo del habitual (1mm).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Viñetas estándar&lt;/strong&gt; (● para tareas, ○ para eventos, — para notas, * para prioridades).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dos colores máximo&lt;/strong&gt;: negro para lo habitual, rojo para prioridades o destacar los inicios de samana en el registro mensual.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Colecciones prácticas&lt;/strong&gt;, no artísticas: Por ejemplo, tracker de migrañas, menús semanales, reformas del hogar, ideas de regalo para eventos, etc.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="secciones-que-me-salvan-el-día-a-día"&gt;&lt;strong&gt;Secciones que me salvan el día a día&lt;/strong&gt;
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Tracker de migrañas&lt;/strong&gt;: Anoto hora, intensidad, medicación, y posibles causas (café, estrés, sueño). Patrones que ninguna app de salud detectó.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Menú semanal + lista de la compra&lt;/strong&gt;: Planificar comidas semanales evita el &amp;ldquo;¿qué cenamos hoy?&amp;rdquo; y los viajes improvisados y casi diarios al supermercado.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reformas del hogar&lt;/strong&gt;: Desde muestras de pintura pegadas con celo hasta cálculos de metros cuadrados para cambiar el suelo. Todo en un mismo sitio. Presupuestos, decisiones, materiales&amp;hellip; Cualquier tipo de información que pueda ser útil a corto o largo plazo.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="conclusión-volver-a-lo-esencial-para-avanzar"&gt;&lt;strong&gt;Conclusión: volver a lo esencial para avanzar&lt;/strong&gt;
&lt;/h2&gt;&lt;p&gt;El Bullet Journal no es magia: es &lt;strong&gt;orden consciente&lt;/strong&gt;. Como informático, me sorprende lo bien que convive mi amor por la tecnología con este regreso a lo analógico. Ahora, cuando abro mi cuaderno, no hay &lt;em&gt;scroll&lt;/em&gt; infinito, no hay multitarea: solo yo, mis prioridades y el trazo limpio de una pluma sobre papel. En cierta manera, los momentos en los que me siento frente a mi BuJo llegan a ser relajantes.&lt;/p&gt;
&lt;p&gt;De todas formas, no me he podido, ni querido desprenderme al 100% de lo digital. Sigo delegando en Google Calendar para beneficiarme de eventos y recordatorios futuros, como una especia de &amp;ldquo;anexo&amp;rdquo; a mi BuJo&lt;/p&gt;
&lt;p&gt;¿Y si la verdadera productividad no está en hacer más cosas, sino en elegir mejor en qué enfocarse? Mi BuJo minimalista me lo recuerda cada día.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;¿Has probado el Bullet Journal? ¿O sigues enganchado a lo digital? ¡Cuéntame en comentarios!&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;PD&lt;/strong&gt;: Para los curiosos, mi setup actual es un cuaderno &lt;a class="link" href="https://amzn.to/44dHSu8" target="_blank" rel="noopener"
 &gt;A5 de puntos, con 160 paginas de 120gr&lt;/a&gt;, y un &lt;a class="link" href="https://amzn.to/4iTr7sM" target="_blank" rel="noopener"
 &gt;Pilot VBall 0.5mm&lt;/a&gt;. Nada más. Nada menos.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;PD2&lt;/strong&gt;: Imagen de banner generada con IA&lt;/p&gt;</description></item><item><title>Mostrar la UI de Opera en español, en Linux</title><link>https://blog.rdiez.es/p/mostrar-la-ui-de-opera-en-espa%C3%B1ol-en-linux/</link><pubDate>Fri, 31 May 2024 00:00:00 +0000</pubDate><guid>https://blog.rdiez.es/p/mostrar-la-ui-de-opera-en-espa%C3%B1ol-en-linux/</guid><description>&lt;img src="https://blog.rdiez.es/p/mostrar-la-ui-de-opera-en-espa%C3%B1ol-en-linux/opera.jpeg" alt="Featured image of post Mostrar la UI de Opera en español, en Linux" /&gt;&lt;p&gt;Al instalar el navegador &lt;a class="link" href="https://www.opera.com/es" target="_blank" rel="noopener"
 &gt;Opera&lt;/a&gt; desde el paquete &lt;code&gt;.deb&lt;/code&gt;, nos encontramos con que el interfaz de usuario (UI) se encuentra en un perfecto inglés, y no es posible cambiarlo a otro idioma siguiendo los cauces normales.&lt;/p&gt;
&lt;p&gt;Vamos a ver cómo configurar el navegador para que se muestre en español:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Nos vamos a la siguiente ruta, donde están los iconos de inicio de nuestras apps: &lt;code&gt;/usr/share/applications&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Editamos el correspondiente a Opera utilizando sudo: &lt;code&gt;sudo nano opera.desktop&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Tenemos que editar todas las llamadas &amp;ldquo;Exec&amp;rdquo; añadiendo el parámetro: &lt;code&gt;--lang=es&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Nos debería quedar algo así:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;❯ cat opera.desktop 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;Desktop Entry&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;Version&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1.0
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;Name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;Opera
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;GenericName&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;Web browser
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;Comment&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;Fast and secure web browser
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;TryExec&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;opera
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;Exec&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;opera --lang&lt;span class="o"&gt;=&lt;/span&gt;es %U
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;Terminal&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;Icon&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;opera
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;Type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;Application
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;Categories&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;Network&lt;span class="p"&gt;;&lt;/span&gt;WebBrowser&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;MimeType&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;text/html&lt;span class="p"&gt;;&lt;/span&gt;text/xml&lt;span class="p"&gt;;&lt;/span&gt;application/xhtml_xml&lt;span class="p"&gt;;&lt;/span&gt;x-scheme-handler/http&lt;span class="p"&gt;;&lt;/span&gt;x-scheme-handler/https&lt;span class="p"&gt;;&lt;/span&gt;x-scheme-handler/ftp&lt;span class="p"&gt;;&lt;/span&gt;application/x-opera-download&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;Actions&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;new-window&lt;span class="p"&gt;;&lt;/span&gt;new-private-window&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;Desktop Action new-window&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;Name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;New Window
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;Exec&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;opera --new-window --lang&lt;span class="o"&gt;=&lt;/span&gt;es
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;TargetEnvironment&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;Unity
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;Desktop Action new-private-window&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;Name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;New Private Window
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;Exec&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;opera --incognito --lang&lt;span class="o"&gt;=&lt;/span&gt;es
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;TargetEnvironment&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;Unity
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Al iniciar el programa de nuevo, ya debería de mostrarse como se espera :)&lt;/p&gt;</description></item><item><title>Forzar el borrado de recursos en Kubernetes</title><link>https://blog.rdiez.es/p/forzar-el-borrado-de-recursos-en-kubernetes/</link><pubDate>Wed, 22 May 2024 00:00:00 +0000</pubDate><guid>https://blog.rdiez.es/p/forzar-el-borrado-de-recursos-en-kubernetes/</guid><description>&lt;img src="https://blog.rdiez.es/p/forzar-el-borrado-de-recursos-en-kubernetes/kubernetes.png" alt="Featured image of post Forzar el borrado de recursos en Kubernetes" /&gt;&lt;p&gt;A veces, al borrar recursos (pods, jobs, pvc, etc) en &lt;a class="link" href="https://kubernetes.io/" target="_blank" rel="noopener"
 &gt;Kubernetes&lt;/a&gt;, mediante &lt;code&gt;kubectl delete&lt;/code&gt;, estos se quedan en estado &amp;ldquo;stucked&amp;rdquo; y nunca llega a finalizar su borrado.&lt;/p&gt;
&lt;p&gt;Podemos forzar el borrado de estos elementos editándolos manualmente, y borrando la parte de finalizers.&lt;/p&gt;
&lt;p&gt;Los Finalizers son claves que le indican a la API de Kubernetes que quedan recursos por eliminar o por limpiar (dependencias) antes de que se elimine este recurso en particular.&lt;/p&gt;
&lt;p&gt;Por ejemplo, de esta situación inicial, con &lt;code&gt;kubectl edit&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;annotations&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;finalizers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;zookeeper.finalizers.platform.confluent.io&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Pasaríamos a esta:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;annotations&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;finalizers&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&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Otra manera &lt;strong&gt;más radical&lt;/strong&gt;, para borrar todos los elementos de un mismo tipo mediante CLI, sería:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt; job in &lt;span class="k"&gt;$(&lt;/span&gt;kubectl --namespace sandbox get &lt;span class="nb"&gt;jobs&lt;/span&gt; --no-headers &lt;span class="p"&gt;|&lt;/span&gt; awk &lt;span class="s1"&gt;&amp;#39;{print $1}&amp;#39;&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;do&lt;/span&gt; kubectl --namespace sandbox patch job &lt;span class="nv"&gt;$job&lt;/span&gt; --patch &lt;span class="s1"&gt;&amp;#39;{&amp;#34;metadata&amp;#34;:{&amp;#34;finalizers&amp;#34;:[]}}&amp;#39;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --type&lt;span class="o"&gt;=&lt;/span&gt;merge&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;done&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;</description></item><item><title>Fix de problema de imágenes Docker con procesador M1</title><link>https://blog.rdiez.es/p/fix-de-problema-de-im%C3%A1genes-docker-con-procesador-m1/</link><pubDate>Mon, 15 Jan 2024 00:00:00 +0000</pubDate><guid>https://blog.rdiez.es/p/fix-de-problema-de-im%C3%A1genes-docker-con-procesador-m1/</guid><description>&lt;img src="https://blog.rdiez.es/p/fix-de-problema-de-im%C3%A1genes-docker-con-procesador-m1/docker_m1.jpeg" alt="Featured image of post Fix de problema de imágenes Docker con procesador M1" /&gt;&lt;p&gt;Al utilizar imágenes con arquitecturas genéricas en &lt;a class="link" href="https://www.docker.com/" target="_blank" rel="noopener"
 &gt;Docker&lt;/a&gt; se pueden generar incompatibilidades con los procesadores &lt;strong&gt;M1 Silicon&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Podemos utilizar la capa de virtualización de Rosetta para solventar este tipo de problemas.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Metodo 1: exportar variable&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Si estamos utilizando directamente la CLI, podemos exportar la siguiente variable previamente en la shell:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;DOCKER_DEFAULT_PLATFORM&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;linux/amd64
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Metodo 2: corregir docker-compose&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Si por el contrario estamos utilizando &lt;strong&gt;docker-compose&lt;/strong&gt;, lo modificamos según el formato de fichero:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;platform: linux/amd64
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Por ejemplo:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;kafka&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;	&lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;confluentinc/cp-kafka:latest&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;	&lt;/span&gt;&lt;span class="nt"&gt;platform&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;linux/amd64&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Metodo3: corregir dockerfile:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Otra opción si lo que utilizamos es un &lt;strong&gt;dockerfile&lt;/strong&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ARG &lt;span class="nv"&gt;build_for&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;linux/amd64
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- FROM --platform&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$build_for&lt;/span&gt; python:3.9.13-slim AS base
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;</description></item><item><title>Conexión por ssh sin passwords</title><link>https://blog.rdiez.es/p/conexi%C3%B3n-por-ssh-sin-passwords/</link><pubDate>Sun, 23 Jul 2023 00:00:00 +0000</pubDate><guid>https://blog.rdiez.es/p/conexi%C3%B3n-por-ssh-sin-passwords/</guid><description>&lt;img src="https://blog.rdiez.es/p/conexi%C3%B3n-por-ssh-sin-passwords/ssh.jpg" alt="Featured image of post Conexión por ssh sin passwords" /&gt;&lt;p&gt;Cuando utilizamos ssh a menudo, el poder conectar a equipos remotos sin memorizar contraseñas nos puede facilitar mucho la vida.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;El equipo &amp;ldquo;servidor&amp;rdquo; será el equipo a donde vamos a conectar mediante ssh&lt;/li&gt;
&lt;li&gt;El equipo &amp;ldquo;cliente&amp;rdquo; será el origen de la conexión.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Este tipo de autenticación funciona mediante el &lt;strong&gt;intercambio de claves&lt;/strong&gt;. Nuestro servidor necesita tener la clave pública del cliente dentro de sus claves autorizadas para poder validar la conexión.
&lt;img alt="diagrama_ssh" class="gallery-image" data-flex-basis="519px" data-flex-grow="216" height="354" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.rdiez.es/p/conexi%C3%B3n-por-ssh-sin-passwords/diagrama_ssh.png" width="766"&gt;&lt;/p&gt;
&lt;h2 id="generar-claves"&gt;Generar claves
&lt;/h2&gt;&lt;p&gt;Para poder conectar a un &amp;ldquo;servidor&amp;rdquo; mediante ssh sin utilizar contraseñas, lo primero es verificar en el equipo &amp;ldquo;cliente&amp;rdquo; que ya cuenta con claves tanto pública como privadas:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ls -al ~/.ssh/id_*.pub
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Si no las tiene, las generamos:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssh-keygen -t rsa -b &lt;span class="m"&gt;4096&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;la opción &lt;code&gt;-t&lt;/code&gt; significa el tipo&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rsa&lt;/code&gt; es el protocolo. en este caso es el de por defecto&lt;/li&gt;
&lt;li&gt;la longitud de la clave se define con &lt;code&gt;-b 4096&lt;/code&gt;. Por defecto es 2048&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Tras responder las preguntas, nos generará las claves en la ubicación predeterminada:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;La clave privada se guardará en: &lt;code&gt;.ssh/id_rsa&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;La clave pública se guardará en: &lt;code&gt;.ssh/id_rsa.pub&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="copiar-clave-pública"&gt;Copiar clave pública
&lt;/h2&gt;&lt;p&gt;Necesitamos copiar nuestra clave pública al servidor al que vamos a acceder. Para ello hay 3 métodos:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;comando &lt;code&gt;ssh-copy-id&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;mediante &lt;code&gt;ssh&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;manualmente&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="copiar-clave-con-ssh-copy-id"&gt;Copiar clave con ssh-copy-id
&lt;/h3&gt;&lt;p&gt;Simplemente lanzamos lo siguiente, indicando el user y hostname de nuestro servidor:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssh-copy-id remote_username@remote_IP_Address
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="copiar-clave-por-ssh"&gt;Copiar clave por ssh
&lt;/h3&gt;&lt;p&gt;Si ya tenemos acceso pos ssh al servidor, podemos enviar manualmente la clave publica:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cat ~/.ssh/id_rsa.pub &lt;span class="p"&gt;|&lt;/span&gt; ssh remote_username@remote_ip_address &lt;span class="s2"&gt;&amp;#34;mkdir -p ~/.ssh &amp;amp;&amp;amp; cat &amp;gt;&amp;gt; ~/.ssh/authorized_keys&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="copiar-manualmente-la-clave"&gt;Copiar manualmente la clave
&lt;/h3&gt;&lt;p&gt;Cómo último método podemos agregar manualmente el contenido del archivo &lt;code&gt;id_rsa.pub&lt;/code&gt; al archivo &lt;code&gt;~/.ssh/authorized_keys&lt;/code&gt; del servidor remoto. En &lt;strong&gt;Windows&lt;/strong&gt;, este es el método más fácil.&lt;/p&gt;
&lt;p&gt;Vemos el contenido de nuestra clave pública en el equipo cliente&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cat ~/.ssh/id_rsa.pub
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Dentro del equipo servidor, creamos un fichero, por ejemplo &lt;code&gt;SSH_public_key&lt;/code&gt; con el contenido obtenido en el paso previo, y lo añadimos a nuestro authorized_keys&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; SSH_public_key &amp;gt;&amp;gt; ~/.ssh/authorized_keys
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Si fuese necesario, corregimos permisos:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chmod -766 ~/.ssh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Listo!&lt;/p&gt;</description></item><item><title>Definir fichero .gitignore global</title><link>https://blog.rdiez.es/p/definir-fichero-.gitignore-global/</link><pubDate>Sat, 22 Jul 2023 00:00:00 +0000</pubDate><guid>https://blog.rdiez.es/p/definir-fichero-.gitignore-global/</guid><description>&lt;img src="https://blog.rdiez.es/p/definir-fichero-.gitignore-global/git-banner.jpg" alt="Featured image of post Definir fichero .gitignore global" /&gt;&lt;p&gt;En &lt;a class="link" href="https://git-scm.com/" target="_blank" rel="noopener"
 &gt;Git&lt;/a&gt; podemos definir un fichero &lt;code&gt;.gitignore&lt;/code&gt; de manera global en lugar que tener que definirlo en cada uno de los repositorios.&lt;/p&gt;
&lt;p&gt;Para ello lo primero es crear el fichero &lt;code&gt;.gitignore_global&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git config --global core.excludesfile ~/.gitignore_global
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Ahora se puede editar el fichero de la misma manera que haríamos con un fichero común.&lt;/p&gt;</description></item><item><title>Hosting multisite con proxy y SSL</title><link>https://blog.rdiez.es/p/hosting-multisite-con-proxy-y-ssl/</link><pubDate>Thu, 15 Sep 2022 00:00:00 +0000</pubDate><guid>https://blog.rdiez.es/p/hosting-multisite-con-proxy-y-ssl/</guid><description>&lt;img src="https://blog.rdiez.es/p/hosting-multisite-con-proxy-y-ssl/docker-composer-logo.png" alt="Featured image of post Hosting multisite con proxy y SSL" /&gt;&lt;p&gt;Hace unos días liberé una solución basada en &lt;a class="link" href="https://docs.docker.com/compose/" target="_blank" rel="noopener"
 &gt;docker-compose&lt;/a&gt; para poder alojar múltiples sitios web en un sólo servidor (mayormente RaspberryPi), utilizando un proxy inverso con &lt;a class="link" href="https://www.nginx.com/" target="_blank" rel="noopener"
 &gt;nginx&lt;/a&gt; y generando automáticamente los certificados SSL con &lt;a class="link" href="https://letsencrypt.org/" target="_blank" rel="noopener"
 &gt;Let´s Encrypt&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Se puede acceder públicamente a este repositorio en: &lt;strong&gt;&lt;a class="link" href="https://github.com/rdiezsj/multisite-with-proxy-and-SSL-docker" target="_blank" rel="noopener"
 &gt;https://github.com/rdiezsj/multisite-with-proxy-and-SSL-docker&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;La idea general es simple:&lt;/p&gt;
&lt;p&gt;Tenemos X sites desplegados con docker, por ejemplo un &lt;a class="link" href="https://es.wordpress.org/" target="_blank" rel="noopener"
 &gt;Wordpress&lt;/a&gt; con su &lt;a class="link" href="https://go.mariadb.com/" target="_blank" rel="noopener"
 &gt;MariaDB&lt;/a&gt;, un &lt;a class="link" href="https://www.dokuwiki.org/" target="_blank" rel="noopener"
 &gt;DokuWiki&lt;/a&gt;, y un sitio web con HTML estático.&lt;/p&gt;
&lt;p&gt;La solución genera certificados SSL automáticamente para que todos los sites sean accesibles mediante https.&lt;/p&gt;
&lt;p&gt;A su vez, con el proxy inverso exponemos todos los servicios mediante una url única o subdominio, en lugar de tener que definir un puerto por cada uno de los servicios, por ejemplo: &lt;a class="link" href="https://wordpress.midominio.com" target="_blank" rel="noopener"
 &gt;https://wordpress.midominio.com&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Los volúmenes de datos se montan con persistencia, facilitando el poder utilizar soluciones de backup.&lt;/p&gt;
&lt;p&gt;Es fácilmente configurable como un daemon.&lt;/p&gt;
&lt;h2 id="requisitos"&gt;Requisitos
&lt;/h2&gt;&lt;p&gt;Como requisitos, necesitamos:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Tener instalados &lt;a class="link" href="https://docs.docker.com/get-docker/" target="_blank" rel="noopener"
 &gt;Docker&lt;/a&gt; y &lt;a class="link" href="https://docs.docker.com/compose/install/" target="_blank" rel="noopener"
 &gt;Docker Compose&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Tener un nombre de dominio. Ya sea contratado o gratuito&lt;/li&gt;
&lt;li&gt;Tener un servidor con una dirección públicamente enrutable&lt;/li&gt;
&lt;li&gt;Clonar el repositorio con la solución:&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git clone https://github.com/rdiezsj/multisite-with-proxy-and-SSL-docker.git
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="configuración"&gt;Configuración
&lt;/h2&gt;&lt;p&gt;Es necesario modificar el archivo &lt;code&gt;docker-compose.yml&lt;/code&gt; en base a nuestras necesidades, así como las variables definidas. Para una información mas detallada y actualizada es mejor leer directamente el &lt;a class="link" href="https://github.com/rdiezsj/multisite-with-proxy-and-SSL-docker/blob/master/README.md" target="_blank" rel="noopener"
 &gt;README&lt;/a&gt; del propio repositorio.&lt;/p&gt;</description></item><item><title>Kubernetes en RaspberryPi con microk8s</title><link>https://blog.rdiez.es/p/kubernetes-en-raspberrypi-con-microk8s/</link><pubDate>Sun, 22 May 2022 00:00:00 +0000</pubDate><guid>https://blog.rdiez.es/p/kubernetes-en-raspberrypi-con-microk8s/</guid><description>&lt;img src="https://blog.rdiez.es/p/kubernetes-en-raspberrypi-con-microk8s/microk8s.jpg" alt="Featured image of post Kubernetes en RaspberryPi con microk8s" /&gt;&lt;p&gt;Hoy en día cada vez está más extendido el uso de contenedores, y orquestación de los mismos con soluciones como Openshift o Kubernetes. Si en nuestro día a día es algo que con lo que tenemos que lidiar continuamente, o simplemente queremos trastear con algun proyecto personal, puede ser interesante tener un pequeño laboratorio en casa para testing.&lt;/p&gt;
&lt;p&gt;Con nuestra querida RaspberryPi podemos montarnos un pequeño cluster (de momento lo vamos a dejar como standalone) que aunque no nos vaya a servir como entorno de producción, y no sea algo rápido, ni fácil, puede resultar tremendamente entretenido.&lt;/p&gt;
&lt;p&gt;Para comenzar lo que vamos a necesitar va a ser muy sencillo:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;RaspberryPi 4 con al menos 4GB de RAM&lt;/li&gt;
&lt;li&gt;Tarjeta microSD de 64GB&lt;/li&gt;
&lt;li&gt;Adaptador de corriente de mínimo 3A para alimentar la Raspberry&lt;/li&gt;
&lt;li&gt;Otro equipo con el que conectaremos por ssh.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="preparación"&gt;Preparación
&lt;/h2&gt;&lt;p&gt;Lo primero será preparar el S.O. de nuestra RaspberryPi. En esta ocasión vamos a utilizar Ubuntu Server.&lt;/p&gt;
&lt;p&gt;Para ello vamos a descargar la ISO correspondiente de su &lt;a class="link" href="https://ubuntu.com/download/raspberry-pi" target="_blank" rel="noopener"
 &gt;web oficial&lt;/a&gt; y la cargamos en nuestra SD mediante &lt;a class="link" href="https://www.balena.io/etcher/" target="_blank" rel="noopener"
 &gt;Balena Etcher&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Enchufamos el adaptador de corriente y arrancamos nuestra placa. El proceso de arranque inicial suele llevar unos 5 minutos antes de que nos permita hacer login.&lt;/p&gt;
&lt;p&gt;Accedemos a nuestra Raspberry mediante ssh, si no tenemos monitor y teclado. El login por defecto es:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;user: &lt;code&gt;ubuntu&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;pass: &lt;code&gt;ubuntu&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssh ubuntu@192.168.200.204
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Una vez dentro, lo primero que nos va a pedir es establecer una contraseña.&lt;/p&gt;
&lt;p&gt;Actualizamos paqueteria&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt update
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt upgrade -y
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt autoremove -y
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Preparamos el S.O. para utilizar los cgroups. Para ello añadimos al final de la linea de arranque del fichero &lt;code&gt;/boot/firmware/cmdline.txt&lt;/code&gt;, lo siguiente:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;cgroup_enable&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;cpuset &lt;span class="nv"&gt;cgroup_enable&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;memory &lt;span class="nv"&gt;cgroup_memory&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Inicialmente conectamos la Raspberry por cable de red, pero podemos opcionalmente dejar configurado el Wifi como &amp;ldquo;failover&amp;rdquo;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo nano /etc/netplan/50-cloud-init.yaml
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; wifis:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; wlan0:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; dhcp4: &lt;span class="nb"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; optional: &lt;span class="nb"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; access-points:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;SSID_name&amp;#34;&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; password: &lt;span class="s2"&gt;&amp;#34;WiFi_password&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Corregimos nuestra zona horaria&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo timedatectl set-timezone Europe/Madrid
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Añadimos un nombre de host&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo nano /etc/hostname
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;y finalmente reiniciamos&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;reboot
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="microk8s"&gt;MicroK8s
&lt;/h2&gt;&lt;p&gt;A la hora de montar nuestro pequeño cluster de kubernetes, tenemos varias opciones:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;La vía oficial de &lt;a class="link" href="https://kubernetes.io/es/" target="_blank" rel="noopener"
 &gt;kubernetes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://minikube.sigs.k8s.io/docs/" target="_blank" rel="noopener"
 &gt;minikube&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Kubernetes embebido de &lt;a class="link" href="https://docs.docker.com/desktop/kubernetes/" target="_blank" rel="noopener"
 &gt;Docker desktop&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://microk8s.io/" target="_blank" rel="noopener"
 &gt;microk8s&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;En nuestro caso, ya que estamos utilizando como base un sistema operativo, vamos a ir con la solucion de microk8s, ya que es desarrollada por la propia &lt;a class="link" href="https://canonical.com/" target="_blank" rel="noopener"
 &gt;Canonical&lt;/a&gt; como paquete snap. Esto nos puede proporcionar más compatibilidad y simplicidad a la hora de mantenerlo al día.&lt;/p&gt;
&lt;p&gt;Para ello, es tan simple como instalar el paquete.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo snap install microk8s --classic
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;La sintaxis para gestionar nuestro cluster con microk8s es: &lt;code&gt;microk8s kubectl ******&lt;/code&gt;. Nuestra intencion es abstraernos lo máximo posible de esta sintaxis, y simplificarlo utilizando &lt;code&gt;kubectl&lt;/code&gt; como un alias:&lt;/p&gt;
&lt;p&gt;En este caso es bash pero si utilizaramos zsh habria que cambiar la ruta del fichero de aliases&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;export PATH=/snap/bin:$PATH&amp;#39;&lt;/span&gt; &amp;gt;&amp;gt; ~/.bashrc
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;alias kubectl=&amp;#39;microk8s kubectl&amp;#39;&amp;#34;&lt;/span&gt; &amp;gt;&amp;gt; ~/.bash_aliases
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;source&lt;/span&gt; ~/.bashrc
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;añadimos permisos a nuestro usuario&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; sudo usermod -a -G microk8s ubuntu
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; sudo chown -f -R ubuntu ~/.kube
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	newgrp microk8s
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Chekeamos que está running:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;microk8s status --wait-ready
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Añadimos algunos plugins esenciales, como el de Dashboard, Ingress Registry y DNS&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;microk8s status --wait-ready
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;microk8s &lt;span class="nb"&gt;enable&lt;/span&gt; dns ingress dashboard registry
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Una pequeña descripción de cada uno de ellos&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;microk8s enable ingress # expone rutas HTTP and HTTPS desde fuera del cluster, hacia dentro del mismo.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;microk8s enable dashboard # GUI grafica para la gestión del cluster mediante interfaz web
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;microk8s enable dns # crea registros DNS para los servicios y pods
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;microk8s enable storage # permite gestionar el storage que proporcionamos a los pods del cluster
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;microk8s enable registry # nos permite tener un registry local para almacenar las imágenes docker 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Verificamos que nuestros alias funcionan correctamente, y tenemos un nodo corriendo&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl get nodes
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="metallb"&gt;MetalLB
&lt;/h2&gt;&lt;p&gt;Vamos a instalar el Load Balancer, utilizando la solucion de &lt;a class="link" href="https://metallb.universe.tf/" target="_blank" rel="noopener"
 &gt;MetalLB&lt;/a&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;microk8s enable metallb
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Nos pedira un rango de IPS reservadas para gestionar. En mi Red casera voy a reservar estas: &lt;code&gt;192.168.200.220-192.168.200.249&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Vamos a lanzar un pequeño deployment para verificar que nuestro balanceador está funcionando correctamente:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl create deployment whoami --image=containous/whoami
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl expose deployment whoami --type=LoadBalancer --port=80
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Podemos verificar que se ha asignado una de las IP reservadas:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ubuntu@RPI4:~$ kubectl get service whoami
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;whoami LoadBalancer 10.152.183.181 192.168.200.220 80:30341/TCP 4m55s
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Ahora solo nos hace falta atacar la IP desde el navegador o con un simple curl&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ubuntu@RPI4:~$ curl 192.168.200.220
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Hostname: whoami-5d56c87b99-fxjvn
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;IP: 127.0.0.1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;IP: ::1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;IP: 10.1.117.20
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;IP: fe80::30ba:88ff:febb:a570
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;RemoteAddr: 10.0.1.1:51427
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GET / HTTP/1.1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Host: 192.168.200.220
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;User-Agent: curl/7.81.0
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Accept: */*
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ubuntu@RPI4:~$
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="dashboard"&gt;Dashboard
&lt;/h2&gt;&lt;p&gt;Para acceder a nuestro dashboard, necesitamos conocer la IP y puerto asignados al mismo:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ubuntu@RPI4:~$ kubectl -n kube-system get services | grep kubernetes-dashboard
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubernetes-dashboard NodePort 10.152.183.148 &amp;lt;none&amp;gt; 443:30353/TCP 15m
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ubuntu@RPI4:~$
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Con esto ya podemos acceder al dashboard desde fuera de nuestra raspbery PI&lt;/p&gt;
&lt;p&gt;&lt;code&gt;https://{server ip}:{port number}&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;En mi caso:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;https://192.168.200.204:30353
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Al acceder desde el navegador, nos pedirá autenticación. Necesitamos averiguar el token. Esta información la podemos obtener en la propia configuracion de microk8s&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;microk8s config &lt;span class="p"&gt;|&lt;/span&gt; grep token
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; token: NW4vWGJZUEkyMDdPWVZGRnVEVXlBVjhmWHNkaUpoQ1RBN29jVGMyek44Zz0K
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Copiamos el token y lo pegamos en la UI.&lt;/p&gt;
&lt;p&gt;Con esto ya tendríamos nuestro cluster con un único nodo corriendo y listo para trabajar con él. Más adelante veremos como añadir más nodos a este cluster, eliminarlos, etc.&lt;/p&gt;</description></item><item><title>Rollback de Mesa en Fedora 34</title><link>https://blog.rdiez.es/p/rollback-de-mesa-en-fedora-34/</link><pubDate>Fri, 30 Apr 2021 00:00:00 +0000</pubDate><guid>https://blog.rdiez.es/p/rollback-de-mesa-en-fedora-34/</guid><description>&lt;img src="https://blog.rdiez.es/p/rollback-de-mesa-en-fedora-34/fedorawall.jpg" alt="Featured image of post Rollback de Mesa en Fedora 34" /&gt;&lt;p&gt;Hace apenas un par de días, y con una semana de retraso frente a la fecha inicial, se liberó la versión final de &lt;a class="link" href="https://fedoramagazine.org/announcing-fedora-34/" target="_blank" rel="noopener"
 &gt;Fedora 34&lt;/a&gt;. Esta versión trae cambios muy esperados y más que comentados en otros medios como la inclusión de &lt;a class="link" href="https://www.gnome.org/" target="_blank" rel="noopener"
 &gt;Gnome&lt;/a&gt; 40 👣, el uso de Btrfs 💾 como sistema de ficheros por defecto, o &lt;a class="link" href="https://pipewire.org/" target="_blank" rel="noopener"
 &gt;Pipewire&lt;/a&gt; 🔊 como servidor de sonido.&lt;/p&gt;
&lt;p&gt;No es el objetivo de este post, pero en el uso del día a día se muestra como una release tremendamente pulida, y con la estabilidad habitual propia de Fedora.&lt;/p&gt;
&lt;p&gt;Sin embargo, si usamos algunos modelos de GPU AMD como es mi caso (&lt;a class="link" href="https://www.amd.com/es/products/graphics/amd-radeon-rx-5600-xt" target="_blank" rel="noopener"
 &gt;RX 5600 XT&lt;/a&gt;), es muy posible que al actualizar la paquetería del sistema empecemos a ver diversos glithces y artefactos gráficos. Estos problemas son ocasionados por la actualización de dos paquetes pertenecientes a la versión 21.0.3-1 de &lt;a class="link" href="https://www.mesa3d.org/" target="_blank" rel="noopener"
 &gt;Mesa&lt;/a&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;mesa-dri-drivers-21.0.3-1&lt;/li&gt;
&lt;li&gt;mesa-filesystem-21.0.3-1&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Parece que este bug ya ha sido detectado y corregido en su version &lt;a class="link" href="https://bodhi.fedoraproject.org/updates/?packages=mesa" target="_blank" rel="noopener"
 &gt;21.0.3-2&lt;/a&gt;. Sin embargo, si no queremos convivir con estos glitches tan molestos, lo ideal es revertir los cambios hasta que los paquetes con el bugfix finalmente entren en la rama estable de los repositorios.&lt;/p&gt;
&lt;p&gt;Esto es algo muy sencillo, pero lo dejo por aquí por si alguien no sabe cómo hacerlo:&lt;/p&gt;
&lt;p&gt;Lo primero sería ver la lista de versiones de paquetes que tenemos accesible en nuestro repo.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo dnf --showduplicates list mesa-dri-drivers
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Una vez verficado que podemos ir la versión anterior, es tan facil como lanzar el downgrade de versión de la librería gráfica.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo dnf downgrade mesa-dri-drivers 21.0.2-1.fc34
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Con esto, y tras el correspondiente reboot de la máquina, deberíamos habernos deshecho por completo de los problemas. Únicamente tenemos que tener cuidado de no actualizar estos paquetes a la hora de hacer cualquier tarea de upgrade.Podemos hacerlo de dos maneras distintas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Omitirlo de manera permanente modificando el fichero &lt;code&gt;/etc/dnf/dnf.conf&lt;/code&gt; y añadiendo la línea &lt;code&gt;exclude=mesa-dri-drivers&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;o simplemente omitiéndolo al realizar un upgrade: &lt;code&gt;dnf update --exclude=mesa-dri-drivers&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Para verificar a qué versión se nos actualizaría:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;dnf --showduplicates list mesa-dri-drivers&lt;/code&gt;&lt;/p&gt;</description></item><item><title>Uso de https en hosting compartido (Ionos)</title><link>https://blog.rdiez.es/p/uso-de-https-en-hosting-compartido-ionos/</link><pubDate>Mon, 26 Apr 2021 00:00:00 +0000</pubDate><guid>https://blog.rdiez.es/p/uso-de-https-en-hosting-compartido-ionos/</guid><description>&lt;img src="https://blog.rdiez.es/p/uso-de-https-en-hosting-compartido-ionos/ssl.png" alt="Featured image of post Uso de https en hosting compartido (Ionos)" /&gt;&lt;p&gt;Hace algunos años era habitual que casi la totatidad de páginas web se presentaran en un simple HTTP. Sin embargo, estando en 2021, este planteamiento es casi inviable. A día de hoy es poco menos que obligatorio el uso de SSL/TLS y https si queremos tener presencia en Internet de manera mínimamente viable.&lt;/p&gt;
&lt;p&gt;En la mayoría de hostings hoy en día se nos suele ofrecer un certificado SSL de manera gratuita. Pero si tenemos más de un dominio puede que tengamos problemas para activar su correspondiente certificado.&lt;/p&gt;
&lt;p&gt;El caso es especialmente sangrante en &lt;a class="link" href="http://ionos.es/" target="_blank" rel="noopener"
 &gt;Ionos&lt;/a&gt;. El hosting ofrece una gran relación calidad/precio, sin embargo, si queremos un segundo certificado para otro dominio, nos obligan si o si a pasar por caja 💰. En una web o servicio profesional esto no es un problema tan grande ya que lo recomendable sería irnos a uno de estos certificados, pero si se trata de una página web pequeña o un servicio sin más pretensiones, lo ideal es aprovechar servicios de emision de certificados gratuitos del tipo de &lt;a class="link" href="https://letsencrypt.org/es/" target="_blank" rel="noopener"
 &gt;Let´s Encrypt&lt;/a&gt;. Y es aquí donde tenemos el gran problema, y es que Ionos no te permite gestionar este tipo de certificados que no tengas comprados a través de su plataforma.&lt;/p&gt;
&lt;p&gt;Afortunadamente, hay soluciones para todo 😀&lt;/p&gt;
&lt;p&gt;En este caso vamos a aprovechar el servicio gratuito que nos ofrece &lt;a class="link" href="https://www.cloudflare.com/" target="_blank" rel="noopener"
 &gt;Cloudflare&lt;/a&gt;, el cual, además de una &lt;a class="link" href="https://es.wikipedia.org/wiki/Red_de_distribuci%C3%B3n_de_contenidos" target="_blank" rel="noopener"
 &gt;CDN&lt;/a&gt;, nos va a permitir encryptar las conexiones desde el navegados hasta Cloudflare. Además, nos va a servir para cualquier tipo de web. Tanto para una web en html estático generada con &lt;a class="link" href="https://gohugo.io/" target="_blank" rel="noopener"
 &gt;Hugo&lt;/a&gt;, como un servicio tipo &lt;a class="link" href="https://nextcloud.com/" target="_blank" rel="noopener"
 &gt;NextCloud&lt;/a&gt;, o blogs como &lt;a class="link" href="https://es.wordpress.org/" target="_blank" rel="noopener"
 &gt;Wordpress&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;El único &lt;strong&gt;pero&lt;/strong&gt; que tenemos, es que para poder hacer uso de este &amp;ldquo;workaround&amp;rdquo;, nuestro servicio web no debe estar asociado a nuestro dominio raiz (ejemplo.com), sino a un &lt;strong&gt;subdominio&lt;/strong&gt; (blog.ejemplo.com). Sí que se puede tener redireccionado el raiz a nuestro subdominio si lo queremos, en este caso, la redirección debería estar creada previamente para evitar sorpresas con la propagación de DNS.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;El primer paso va a ser irnos a &lt;a class="link" href="https://www.cloudflare.com/" target="_blank" rel="noopener"
 &gt;Cloudflare&lt;/a&gt; y crearnos una cuenta gratuita.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Una vez creada y activada la cuenta, nos vamos a la opcion de &amp;ldquo;Agregar sitio&amp;rdquo; y añadimos nuestro dominio principal (ejemplo.com). Seleccionamos cuenta gratuita y continuamos.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;El siguiente paso escaneará la configuración DNS de nuestro dominio y sugerirá la configuración más transparente para nosotros. Debemos dejar la configuración por defecto según nos la sugiere.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A continuación nos indica que cambiemos los DNS de nuestro registrador. Esto varía según el registrador donde tengamos contratado nuestro hosting, pero en la propia pantalla nos indica los pasos más o menos ajustados.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;El resumen a grandes rasgos sería eliminar las entradas DNS actuales de nuestro dominio raiz, y agregar los dos servidores de cloudflare que nos sugieren.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Con esto, tan sólo debemos esperar un mínimo de 24 horas para que se propague por los diferentes DNS mundiales y evitar sorpresas.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Por defecto, ya se genera y aplica el certificado gratuito, además de activar los servicios de CDN, con una configuración básica, por lo que despues del tiempo de espera podemos acceder sin problemas a nuestra web mediante https.&lt;/p&gt;
&lt;p&gt;El último paso varía según lo que estemos exponiendo, pero en el caso de Wordpress por ejemplo, será necesario modificar la url del servicio a &lt;code&gt;https&lt;/code&gt;, ademas de activar la redirección automática de http a https para que todo nuestro contenido sea servido de esta manera.&lt;/p&gt;
&lt;p&gt;Como último apunte, a partir de ahora la gestion de nuestra zona DNS la debemos realizar desde Cloudflare. De esta manera cualquier otro dominio que creemos también se encontrará encriptado mediante el wildcard.&lt;/p&gt;</description></item><item><title>Gestión de dotfiles con stow</title><link>https://blog.rdiez.es/p/gesti%C3%B3n-de-dotfiles-con-stow/</link><pubDate>Sun, 21 Mar 2021 00:00:00 +0000</pubDate><guid>https://blog.rdiez.es/p/gesti%C3%B3n-de-dotfiles-con-stow/</guid><description>&lt;img src="https://blog.rdiez.es/p/gesti%C3%B3n-de-dotfiles-con-stow/dotfiles.svg" alt="Featured image of post Gestión de dotfiles con stow" /&gt;&lt;p&gt;Antes de nada, conviene aclarar lo que entendemos por &lt;strong&gt;dotfiles&lt;/strong&gt;. Se trata de los ficheros y directorios que encontramos en los sistemas Linux, los cuales mantienen la configuración a nivel de usuario de las aplicaciones. Estos ficheros suelen estar ocultos (con un &lt;code&gt;.&lt;/code&gt; al inicio de su nombre), de ahí el hombre de &amp;ldquo;dot&amp;quot;files.&lt;/p&gt;
&lt;p&gt;Es habitual subir estos ficheros a un repositorio de manera que si cambiamos de sistema, sea muy sencillo poder recuperar estos ficheros, y por consiguiente nuestra configuración de las aplicaciones.&lt;/p&gt;
&lt;p&gt;Una manera muy cómoda de gestionar estos &amp;ldquo;backups&amp;rdquo;, es clonar nuestro repo en la máquina, y crear enlaces simbólicos directamente a los ficheros de los que queramos realizar la copia.&lt;/p&gt;
&lt;p&gt;Vamos a ver como realizar este proceso desde cero, aprovechando la herramienta &lt;code&gt;stow&lt;/code&gt;, la cual nos facilitará la gestion de nuestros enlaces simbólicos.&lt;/p&gt;
&lt;h2 id="crear-repositorio-para-nuestros-dotfiles"&gt;Crear repositorio para nuestros dotfiles
&lt;/h2&gt;&lt;p&gt;Lo primero es crear un repositorio (público o privado) donde alojaremos nuestros dotfiles. Personalmente, recomiendo &lt;a class="link" href="https://gitlab.com/" target="_blank" rel="noopener"
 &gt;Gitlab&lt;/a&gt; por encima de &lt;a class="link" href="https://github.com/" target="_blank" rel="noopener"
 &gt;Github&lt;/a&gt; u otros servicios similares, por características y funcionalidades ofrecidas de manera gratuita.&lt;/p&gt;
&lt;p&gt;Creamos el repo y lo inicializamos con un Readme.md para hacer todo más sencillo.&lt;/p&gt;
&lt;p&gt;Una vez creado nuestro repo, vamos a nuestra máquina y nos lo clonamos, Pero antes vamos a establecer algunas configuracones de git que nos ahorrarán tiempo. Tan solo tenemos que sustituir los campos por nuestros datos reales:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git config --global credential.helper store
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git config --global user.name &lt;span class="s2"&gt;&amp;#34;&amp;lt;NUESTRO_USERNAME&amp;gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git config --global user.name &lt;span class="s2"&gt;&amp;#34;&amp;lt;NUESTRO NOMBRE COMPLETO&amp;gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git config --global user.email &lt;span class="s2"&gt;&amp;#34;&amp;lt;NUESTRO EMAIL&amp;gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Ahroa sí, ya podemos clonar el repo indicando nuestro usuario y/o ruta del repositorio creado&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ~
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git clone https://gitlab.com/&amp;lt;USERNAME&amp;gt;/dotfiles.git
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="instalar-gnu-stow"&gt;Instalar GNU Stow
&lt;/h2&gt;&lt;p&gt;&lt;a class="link" href="https://github.com/aspiers/stow" target="_blank" rel="noopener"
 &gt;GNU Stow&lt;/a&gt; es una herramienta muy sencilla, basada en Perl, que nos va a facilitar la vida muchísimo a la hora de gestionar los enlaces simbólicos. Se encuentra directamente en los repositorios de la práctica totalidad de distribuciones, así que su instalación es tan sencilla como:&lt;/p&gt;
&lt;p&gt;Ubuntu y basadas en Debian:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install stow
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Fedora y basadas en RedHat&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo dnf install stow
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Basadas en Arch&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo pacman -Suy stow
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="ejemplo-práctico"&gt;Ejemplo práctico
&lt;/h2&gt;&lt;p&gt;Pongamos por ejemplo que queremos resguardar nuestras personalizaciones de &lt;a class="link" href="https://github.com/gnome-terminator/terminator" target="_blank" rel="noopener"
 &gt;Terminator&lt;/a&gt;, y la configuración que hemos aplicado para esta app a nivel de GTK.&lt;/p&gt;
&lt;p&gt;Para ello entramos dentro de nuestra carpeta de dotfiles, y creamos aquí la estructura de ficheros que deseamos salvaguardar. Lo más habitual es crear una carpeta por aplicación, y dentro de ella replicamos la estructura a guardar tomando nuestro home como referencia. En este caso, vamos a guardar tambien todos los plugins y configuraciones que hemos añadido a nuestro terminator&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;span class="lnt"&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ~/dotfiles/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mkdir terminator
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mkdir -p .config/terminator
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mkdir -p .config/plugins
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mkdir -p .config/gtk-3-0
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;touch .config/gtk-3-0/gtk.css
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;touch .config/terminator/config
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Con esto, hemos generado una estructura dentro de nuestra carpeta de dotfiles, tal que así:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;terminator/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;└── .config
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├── gtk-3.0
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │   └── gtk.css
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └── terminator
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├── config
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └── plugins
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Ahora vamos a indicar a stow cuales son los ficheros y directorios que vamos a utilizar&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ~/dotfiles
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;stow --adopt -nv terminator
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;el parámetro &lt;code&gt;-nv&lt;/code&gt; le indica que muestre los cambios en modo verbose, pero sin aplicar ningún tipo de cambio. Si vemos que es correcto, podemos omitir el &lt;code&gt;-n&lt;/code&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;stow --adopt -v terminator
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;con esto, podemos verificar que ha copiado los ficheros originales dentro de nuestra carpeta de dotfiles, y los ha sustituido por enlaces simbólicos a nuestro repositorio.&lt;/p&gt;
&lt;p&gt;Con esto, cualquier cambio de configuración que realicemos, realmente se está haciendo sobre los ficheros de nuestro repositorio. Tan solo debemos realizar un &lt;code&gt;commit&lt;/code&gt; y un &lt;code&gt;push&lt;/code&gt; desde nuestro repositorio para que los ficheros estén a salvo en &lt;code&gt;Git&lt;/code&gt;&lt;/p&gt;
&lt;h2 id="recuperar-dotfiles"&gt;Recuperar dotfiles
&lt;/h2&gt;&lt;p&gt;En caso de que hayamos instalado un nuevo sistema, y lo que queramos sea recuperar nuestro ficheros de configuración, el proceso sería muy similar.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Instalamos &lt;code&gt;stow&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Clonamos nuestro repositorio dentro de nuestro &lt;code&gt;home&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Indicamos a &lt;code&gt;stow&lt;/code&gt; que cree los enlaces simbólicos necesarios. Lo lanzamos dentro del root de nuestra carpeta dotfiles&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ~/dotfiles
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;stow -v terminator
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Espero que esto os sea de ayuda. Personalmente, es algo que tengo siempre presente en cualquier sistema Linux que utilizo.&lt;/p&gt;
&lt;p&gt;Algunas ideas para aplicar en nuestros &amp;ldquo;dotfiles&amp;rdquo;, son por ejemplo:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Terminator -&amp;gt; Emulador de terminal con soporte de tiling y plugins&lt;/li&gt;
&lt;li&gt;.bashrc - Configuración de shell Bash&lt;/li&gt;
&lt;li&gt;.zshrc - Configuración de shell Zsh&lt;/li&gt;
&lt;li&gt;Oh-my-zsh&lt;/li&gt;
&lt;li&gt;Configuraciones de Powerlevel10k&lt;/li&gt;
&lt;li&gt;Ficheros de alias utilizados en bash o zsh&lt;/li&gt;
&lt;li&gt;Configuraciones personalizadas de gtk&lt;/li&gt;
&lt;li&gt;Fuentes o temas de gnome instalados para nuestro usuario.&lt;/li&gt;
&lt;li&gt;Y un largo etc.&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Comprimir y descomprimir en Linux</title><link>https://blog.rdiez.es/p/comprimir-y-descomprimir-en-linux/</link><pubDate>Fri, 12 Mar 2021 00:00:00 +0000</pubDate><guid>https://blog.rdiez.es/p/comprimir-y-descomprimir-en-linux/</guid><description>&lt;img src="https://blog.rdiez.es/p/comprimir-y-descomprimir-en-linux/banner.jpg" alt="Featured image of post Comprimir y descomprimir en Linux" /&gt;&lt;h1 id="comprimir-y-descomprimir"&gt;Comprimir y descomprimir
&lt;/h1&gt;&lt;p&gt;Una de las tareas más habituales en cualquier sistema operativo, es la compresión y descompresión de ficheros. Según el tipo de fichero, podemos realizar estas tareas de la siguiente manera en Linux, para los formatos de archivos más comunes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Archivos &lt;strong&gt;.tar.gz&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Comprimir: &lt;code&gt;tar -czvf empaquetado.tar.gz /carpeta/a/empaquetar/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Descomprimir: &lt;code&gt;tar -xzvf archivo.tar.gz&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Ver contenido sin descomprimir: &lt;code&gt;tar -tf archivo.tar.gz&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Archivos &lt;strong&gt;.tar&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Empaquetar: &lt;code&gt;tar -cvf paquete.tar /dir/a/comprimir/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Desempaquetar: &lt;code&gt;tar -xvf paquete.tar&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Archivos &lt;strong&gt;.gz&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Comprimir: &lt;code&gt;gzip -9 index.php&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Descomprimir: &lt;code&gt;gzip -d index.php.gz&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Archivos &lt;strong&gt;.zip&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Comprimir: &lt;code&gt;zip archivo.zip carpeta&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Descomprimir: &lt;code&gt;unzip archivo.zip&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="automatización-con-script"&gt;Automatización con script
&lt;/h2&gt;&lt;p&gt;Para facilitarnos la compresión y descompresión de fichero, podemos añadir el siguiente script a nuestro &lt;code&gt;.bashrc&lt;/code&gt; o &lt;code&gt;.zshrc&lt;/code&gt;. De esta forma, solo tenemos que indicar &lt;code&gt;extract&lt;/code&gt; o &lt;code&gt;compress&lt;/code&gt; seguido del nombre del fichero, y podemos olvidarnos del resto de sintaxis particular del formato.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;## COMPRESSION FUNCTION ##&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;compress&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;FILE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;shift&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="nv"&gt;$FILE&lt;/span&gt; in
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="se"&gt;\*&lt;/span&gt;.tar.bz2&lt;span class="o"&gt;)&lt;/span&gt; tar cjf &lt;span class="nv"&gt;$FILE&lt;/span&gt; $&lt;span class="se"&gt;\*&lt;/span&gt; &lt;span class="p"&gt;;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="se"&gt;\*&lt;/span&gt;.tar.gz&lt;span class="o"&gt;)&lt;/span&gt; tar czf &lt;span class="nv"&gt;$FILE&lt;/span&gt; $&lt;span class="se"&gt;\*&lt;/span&gt; &lt;span class="p"&gt;;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="se"&gt;\*&lt;/span&gt;.tgz&lt;span class="o"&gt;)&lt;/span&gt; tar czf &lt;span class="nv"&gt;$FILE&lt;/span&gt; $&lt;span class="se"&gt;\*&lt;/span&gt; &lt;span class="p"&gt;;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="se"&gt;\*&lt;/span&gt;.zip&lt;span class="o"&gt;)&lt;/span&gt; zip &lt;span class="nv"&gt;$FILE&lt;/span&gt; $&lt;span class="se"&gt;\*&lt;/span&gt; &lt;span class="p"&gt;;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="se"&gt;\*&lt;/span&gt;.rar&lt;span class="o"&gt;)&lt;/span&gt; rar &lt;span class="nv"&gt;$FILE&lt;/span&gt; $&lt;span class="se"&gt;\*&lt;/span&gt; &lt;span class="p"&gt;;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="se"&gt;\*&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Filetype not recognized&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;esac&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;## EXTRACT FUNCTION ##&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;extract&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="se"&gt;\[&lt;/span&gt; -f &lt;span class="nv"&gt;$1&lt;/span&gt; &lt;span class="se"&gt;\]&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="nv"&gt;$1&lt;/span&gt; in
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="se"&gt;\*&lt;/span&gt;.tar.bz2&lt;span class="o"&gt;)&lt;/span&gt; tar xjf &lt;span class="nv"&gt;$1&lt;/span&gt; &lt;span class="p"&gt;;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="se"&gt;\*&lt;/span&gt;.tar.gz&lt;span class="o"&gt;)&lt;/span&gt; tar xzf &lt;span class="nv"&gt;$1&lt;/span&gt; &lt;span class="p"&gt;;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="se"&gt;\*&lt;/span&gt;.bz2&lt;span class="o"&gt;)&lt;/span&gt; bunzip2 &lt;span class="nv"&gt;$1&lt;/span&gt; &lt;span class="p"&gt;;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="se"&gt;\*&lt;/span&gt;.rar&lt;span class="o"&gt;)&lt;/span&gt; unrar e &lt;span class="nv"&gt;$1&lt;/span&gt; &lt;span class="p"&gt;;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="se"&gt;\*&lt;/span&gt;.gz&lt;span class="o"&gt;)&lt;/span&gt; gunzip &lt;span class="nv"&gt;$1&lt;/span&gt; &lt;span class="p"&gt;;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="se"&gt;\*&lt;/span&gt;.tar&lt;span class="o"&gt;)&lt;/span&gt; tar xf &lt;span class="nv"&gt;$1&lt;/span&gt; &lt;span class="p"&gt;;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="se"&gt;\*&lt;/span&gt;.tbz2&lt;span class="o"&gt;)&lt;/span&gt; tar xjf &lt;span class="nv"&gt;$1&lt;/span&gt; &lt;span class="p"&gt;;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="se"&gt;\*&lt;/span&gt;.tgz&lt;span class="o"&gt;)&lt;/span&gt; tar xzf &lt;span class="nv"&gt;$1&lt;/span&gt; &lt;span class="p"&gt;;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="se"&gt;\*&lt;/span&gt;.zip&lt;span class="o"&gt;)&lt;/span&gt; unzip &lt;span class="nv"&gt;$1&lt;/span&gt; &lt;span class="p"&gt;;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="se"&gt;\*&lt;/span&gt;.Z&lt;span class="o"&gt;)&lt;/span&gt; uncompress &lt;span class="nv"&gt;$1&lt;/span&gt; &lt;span class="p"&gt;;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="se"&gt;\*&lt;/span&gt;.7z&lt;span class="o"&gt;)&lt;/span&gt; 7z x &lt;span class="nv"&gt;$1&lt;/span&gt; &lt;span class="p"&gt;;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="se"&gt;\*&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#39;&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;&amp;#39; cannot be extracted via extract()&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;esac&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#39;&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;&amp;#39; is not a valid file&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h1 id="dividir-y-unir-ficheros"&gt;Dividir y unir ficheros
&lt;/h1&gt;&lt;p&gt;Contamos con un fichero muy grande que necesitamos dividir en partes más pequeñas o manejables, o el caso contrario&amp;hellip; tenemos varios ficheros que necesitamos unir para obtener el fichero original.&lt;/p&gt;
&lt;p&gt;Usamos &lt;code&gt;split&lt;/code&gt; indicando el tamaño de las partes deseado&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;split -b 300m -d fichero_grande.tar.gz ficheros_troceados.tar.gz.par
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Después se pueden unir con un simple &lt;code&gt;cat&lt;/code&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cat ficheros_troceados* &amp;gt; fichero_grande
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;</description></item><item><title>Servidor Web sencillo con Python</title><link>https://blog.rdiez.es/p/servidor-web-sencillo-con-python/</link><pubDate>Wed, 10 Mar 2021 00:00:00 +0000</pubDate><guid>https://blog.rdiez.es/p/servidor-web-sencillo-con-python/</guid><description>&lt;img src="https://blog.rdiez.es/p/servidor-web-sencillo-con-python/python-banner.jpg" alt="Featured image of post Servidor Web sencillo con Python" /&gt;&lt;p&gt;A veces requerimos de un servidor web para poder compartir ficheros entre máquinas por http, pero no se requiere de las características de un servidor más avanzado tipo apache.&lt;/p&gt;
&lt;p&gt;En estos casos, podemos aprovechar Python para levantar un servidor muy sencillo que nos saque del apuro.&lt;/p&gt;
&lt;p&gt;Como es lógico, el único requisito que tenemos es tener instalado y disponible python. Esto podemos verificarlo con un simple: &lt;code&gt;python --version&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Para levantar el servidor, nos vamos a la carpeta que queramos compartir. Está se tomará como el root de nuestro pequeño servidor web&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /tmp/carpeta_que_comparto
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Una vez aquí, dependiendo de si es Windows o Linux, ejecutamos:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Linux y Mac &lt;code&gt;python -m SimpleHTTPServer 8000&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Windows o python3 &lt;code&gt;python -m http.server 8000&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;El 8000 nos indica el puerto a levantar.&lt;/p&gt;
&lt;p&gt;Una vez levantado, podemos solicitar ficheros que se encuentro dentro de la carpeta raiz como en cualquier otro servidor web&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;wget http://&amp;lt;IP_SERVIDOR&amp;gt;:8000/mi_fichero.txt
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Como extra, podemos automatizar esto mediante el uso de un alias, añadiendolo a nuestro &lt;code&gt;.bashrc&lt;/code&gt;, por ejemplo:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;alias&lt;/span&gt; &lt;span class="nv"&gt;mini_server&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;python -m &lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;python -c &lt;span class="s1"&gt;&amp;#39;import sys; print(&amp;#34;http.server&amp;#34; if sys.version_info[:2] &amp;gt; (2,7) else &amp;#34;SimpleHTTPServer&amp;#34;)&amp;#39;&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;de esta forma, tan solo tendremos que ejecutar &lt;code&gt;mini_server&lt;/code&gt; para que el servidor web se levante en la carpeta en que nos encontremos.&lt;/p&gt;</description></item><item><title>Escritorio Mate en Windows, con WSL2</title><link>https://blog.rdiez.es/p/escritorio-mate-en-windows-con-wsl2/</link><pubDate>Thu, 16 Jul 2020 00:00:00 +0000</pubDate><guid>https://blog.rdiez.es/p/escritorio-mate-en-windows-con-wsl2/</guid><description>&lt;img src="https://blog.rdiez.es/p/escritorio-mate-en-windows-con-wsl2/windows-terminal.png" alt="Featured image of post Escritorio Mate en Windows, con WSL2" /&gt;&lt;p&gt;Una de las mejores características de Windows en muchos años, es la implementación de WSL (Windows Susbystem Linux), la cual nos permite tener un linux viviendo debajo de nuestro sistema operativo, sin depender de virtualizaciones y con una integración máxima.&lt;/p&gt;
&lt;p&gt;Con el lanzamiento de WSL2, esta implementación se amplía mucho más, sobre todo en cuestión de rendimiento, haciendo de ella una característica prácticamente obligatoria en cualquier instalación de Windows 10.&lt;/p&gt;
&lt;p&gt;En esta ocasión vamos a instalar un Ubuntu con WSL2, con escritorio &lt;a class="link" href="https://mate-desktop.org/es/" target="_blank" rel="noopener"
 &gt;Mate&lt;/a&gt;, que trabajará con una integración perfecta con nuestro S.O.&lt;/p&gt;
&lt;p&gt;&lt;img alt="How to Install MATE Desktop 1.18 in Ubuntu 16.04 - Tips on Ubuntu" class="gallery-image" data-flex-basis="425px" data-flex-grow="177" height="899" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.rdiez.es/p/escritorio-mate-en-windows-con-wsl2/mate-118.jpg" srcset="https://blog.rdiez.es/p/escritorio-mate-en-windows-con-wsl2/mate-118_hu_83a9e43481464925.jpg 800w, https://blog.rdiez.es/p/escritorio-mate-en-windows-con-wsl2/mate-118.jpg 1592w" width="1592"&gt;&lt;/p&gt;
&lt;h2 id="preparación"&gt;Preparación
&lt;/h2&gt;&lt;h3 id="actualización-19041"&gt;Actualización 19041
&lt;/h3&gt;&lt;p&gt;Para poder hacer uso de WSL2, es necesario que tengamos Windows 10 actualizado a la compilación 19041 o superior.&lt;/p&gt;
&lt;p&gt;Podemos verificar esto abriendo una consola de poweshell y ejecutando uno de estos comandos:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ver
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;winver
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;En caso de la versión sea previa a 19041, necesitaremos actualizar el sistema desde Windows Update.&lt;/p&gt;
&lt;h3 id="activar-wsl"&gt;Activar WSL
&lt;/h3&gt;&lt;p&gt;ejecutamos una consola de Poweshell con privilegios de administrador, y lanzamos el siguiente comando para activar la característica&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="kernel-wsl"&gt;Kernel WSL
&lt;/h3&gt;&lt;p&gt;Una vez activado, deberemos actualizar el kernel de WSL, preparándolo para la versión 2. Es tan simple como descargar e instalar el siguiente paquete:&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi" target="_blank" rel="noopener"
 &gt;https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="plataforma-de-máquina-virtual"&gt;Plataforma de máquina virtual
&lt;/h3&gt;&lt;p&gt;El siguiente paso será activar la virtualización, requisito para WSL2, tanto en la BIOS como en Windows.&lt;/p&gt;
&lt;p&gt;Para activarlo en la BIOS, deberás seguir el manual de tu placa base, suele ser una simple opción dentro de las características de CPU que se debe activar&lt;/p&gt;
&lt;p&gt;En windows, con una consola Powershell como administrador, lanzamos:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="wsl2-por-defecto"&gt;WSL2 por defecto
&lt;/h3&gt;&lt;p&gt;Con esto, y tras reiniciar, ya tendremos todo listo. Lo siguiente será establecer WSL2 como la versión por defecto para cualquier distribución que instalemos&lt;/p&gt;
&lt;h2 id="instalar-distribución"&gt;Instalar Distribución
&lt;/h2&gt;&lt;p&gt;En nuestro ejemplo vamos a instalar &lt;a class="link" href="https://ubuntu.com/" target="_blank" rel="noopener"
 &gt;Ubuntu&lt;/a&gt;, aunque serviría a grandes rasgos cualquier otra.&lt;/p&gt;
&lt;p&gt;Para ello podemos instalarlo desde la Windows Store.&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://www.microsoft.com/en-us/p/ubuntu/9nblggh4msv6?activetab=pivot:overviewtab" target="_blank" rel="noopener"
 &gt;https://www.microsoft.com/en-us/p/ubuntu/9nblggh4msv6&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Durante el proceso de instalación nos pedirá &lt;strong&gt;user&lt;/strong&gt; y &lt;strong&gt;pass&lt;/strong&gt; para el usuario linux&lt;/p&gt;
&lt;h3 id="migrar-distribución-previa"&gt;Migrar distribución previa
&lt;/h3&gt;&lt;p&gt;En caso de que ya tuvieramos una distribución instalada previamente, y corriendo bajo WSL1, se puede migrar a la nueva versión.&lt;/p&gt;
&lt;p&gt;Para verificar la version que tenemos podemos lanzar:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;wsl -v -l
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Para migrarla a versión 2:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;wsl --set-version &lt;span class="o"&gt;{&lt;/span&gt;DISTRIBUCION&lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="instalar-entorno-de-escritorio"&gt;Instalar entorno de escritorio
&lt;/h2&gt;&lt;p&gt;El siguiente paso será instalar nuestro entorno de escritorio. Los más recomendables para usar bajo WSL son Mate, o xfce. Por preferencias personales, vamos a utilizar Mate.&lt;/p&gt;
&lt;p&gt;Abrimos nuestro terminal conectando a la distribución (el propio icono que nos crea, la nueva terminal de windows, Mobaxterm, etc ) y nos aseguramos de que nuestra distro esté actualizada:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; sudo apt upgrade
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;ahora ya podemos instalar el propio escritorio mate&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install ubuntu-mate-desktop
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;antes de proseguir, vamos a aprovechar para corregir futuros problemas con el &lt;strong&gt;display&lt;/strong&gt; y &lt;strong&gt;dbus&lt;/strong&gt;:&lt;/p&gt;
&lt;p&gt;añadimos las siguientes lineas al fichero ~/.bashrc&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;DISPLAY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;cat /etc/resolv.conf &lt;span class="p"&gt;|&lt;/span&gt; grep nameserver &lt;span class="p"&gt;|&lt;/span&gt; awk &lt;span class="s1"&gt;&amp;#39;{print $2}&amp;#39;&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;:0
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo /etc/init.d/dbus start &lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&amp;gt; /dev/null
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Y creamos el fichero /etc/sudoers.d/dbus con el siguiente contenido, indicando nuestro usuario&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;{&lt;/span&gt;USUARIO&lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="nv"&gt;ALL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;root&lt;span class="o"&gt;)&lt;/span&gt; NOPASSWD: /etc/init.d/dbus
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="acceso-al-escritorio"&gt;Acceso al escritorio
&lt;/h2&gt;&lt;p&gt;Para abrir nuestro flamante escritorio mate, podemos hacerlo con un servidor x11, o mediante &lt;a class="link" href="http://xrdp.org/" target="_blank" rel="noopener"
 &gt;xRDP&lt;/a&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Con &lt;strong&gt;xRDP&lt;/strong&gt; será como una conexión a un equipo cualquier, teniendo una única ventana.&lt;/li&gt;
&lt;li&gt;La opción del &lt;strong&gt;servidor X11&lt;/strong&gt; nos da mas flexibilidad ya que podemos tratar las aplicaciones y ventanas de manera independiente, por lo que ese integrarán mejor con nuestro flujo de trabajo, por ello es la opción que vamos a utilizar&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="instalar-vcxsrv"&gt;Instalar VcXsrv
&lt;/h3&gt;&lt;p&gt;Es tan simple como &lt;a class="link" href="https://sourceforge.net/projects/vcxsrv/" target="_blank" rel="noopener"
 &gt;descargar &lt;/a&gt;la aplicación, instalarla, y lanzar &lt;strong&gt;Xlaunch&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://sourceforge.net/projects/vcxsrv/" target="_blank" rel="noopener"
 &gt;https://sourceforge.net/projects/vcxsrv/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Esto nos abrirá un asistente donde dejaremos las opciones por defecto, a excepción del último paso:&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20210310235306228" class="gallery-image" data-flex-basis="309px" data-flex-grow="128" height="387" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.rdiez.es/p/escritorio-mate-en-windows-con-wsl2/image-20210310235306228.png" width="499"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="img" class="gallery-image" data-flex-basis="306px" data-flex-grow="127" height="389" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.rdiez.es/p/escritorio-mate-en-windows-con-wsl2/image-1.png" width="497"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20210310235323934" class="gallery-image" data-flex-basis="308px" data-flex-grow="128" height="388" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.rdiez.es/p/escritorio-mate-en-windows-con-wsl2/image-20210310235323934.png" width="498"&gt;&lt;/p&gt;
&lt;h3 id="mobaxterm"&gt;Mobaxterm
&lt;/h3&gt;&lt;p&gt;En caso de que utilicemos &lt;a class="link" href="https://mobaxterm.mobatek.net/" target="_blank" rel="noopener"
 &gt;Mobaxterm&lt;/a&gt;, al tener un servidor X11 ya integrado, puede dar conflicto con VcXsrv. Para solucionar esto, debemos editar nuestro fichero ~/.bashrc, y sustituir la linea:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;DISPLAY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;cat /etc/resolv.conf &lt;span class="p"&gt;|&lt;/span&gt; grep nameserver &lt;span class="p"&gt;|&lt;/span&gt; awk &lt;span class="s1"&gt;&amp;#39;{print $2}&amp;#39;&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;:0
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;por esta otra&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;DISPLAY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;:0.0
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="iniciar-escritorio"&gt;Iniciar Escritorio
&lt;/h2&gt;&lt;p&gt;Para iniciar nuestro escritorio, despues de asegurarnos de que tenemos VcXsrv, tan solo debemos lanzar en nuestro wsl:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mate-session &lt;span class="p"&gt;&amp;amp;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Esto nos levantará una ventana completa donde podremos interactuar, o abrir nuevas aplicacaciones&lt;/p&gt;
&lt;p&gt;Una opción que me gusta más, por integración, es lanzar en su lugar:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mate-panel &lt;span class="p"&gt;&amp;amp;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Esto iniciará dos paneles básicos de Mate. El inferior podemos &lt;strong&gt;borrarlo&lt;/strong&gt; pulsando sobre él con el botón derecho.&lt;/p&gt;
&lt;p&gt;El superior, podemos personalizarlo haciendo click derecho y pulsando en preferencias. Personalmente me gusta configurarlo así:&lt;/p&gt;
&lt;p&gt;&lt;img alt="img" class="gallery-image" data-flex-basis="195px" data-flex-grow="81" height="374" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.rdiez.es/p/escritorio-mate-en-windows-con-wsl2/image-3.png" width="304"&gt;&lt;/p&gt;
&lt;p&gt;De esta forma el panel siempre está accesible en la parte superior, y sin interferir con ninguna otra ventana.&lt;/p&gt;
&lt;p&gt;Cualquier aplicación que abramos desde este panel, se abrirá como una ventana cualquier de Windows10, por lo que la integración con el S.O. anfitrión es total.&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20210310235355875" class="gallery-image" data-flex-basis="336px" data-flex-grow="140" height="436" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.rdiez.es/p/escritorio-mate-en-windows-con-wsl2/image-20210310235355875.png" width="612"&gt;&lt;/p&gt;</description></item><item><title>Visualizando métricas Con Grafana</title><link>https://blog.rdiez.es/p/visualizando-m%C3%A9tricas-con-grafana/</link><pubDate>Sat, 16 May 2020 00:00:00 +0000</pubDate><guid>https://blog.rdiez.es/p/visualizando-m%C3%A9tricas-con-grafana/</guid><description>&lt;img src="https://blog.rdiez.es/p/visualizando-m%C3%A9tricas-con-grafana/grafana.svg" alt="Featured image of post Visualizando métricas Con Grafana" /&gt;&lt;p&gt;Previamente hemos comenzado a crear nuestro «stack» de monitorización de forma básica.&lt;/p&gt;
&lt;p&gt;Si bien con &lt;strong&gt;Chronograf&lt;/strong&gt; podemos visualizar los datos de una forma fácil y rápida, utilizando &lt;a class="link" href="https://grafana.com/" target="_blank" rel="noopener"
 &gt;Grafana&lt;/a&gt; podemos acceder a estos mismos datos almacenados en &lt;strong&gt;InfluxDB&lt;/strong&gt; y mostrarlos de una forma mucho más avanzada y customizable.&lt;/p&gt;
&lt;h2 id="instalación-de-grafana"&gt;Instalación de Grafana
&lt;/h2&gt;&lt;p&gt;Descargamos el paquete desde la página oficial de Grafana, según nuestra arquitectura. En mi caso, Debian para ARM7&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://grafana.com/grafana/download?platform=arm" target="_blank" rel="noopener"
 &gt;https://grafana.com/grafana/download?platform=arm&lt;/a&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;wget https://dl.grafana.com/oss/release/grafana_6.4.4_armhf.deb
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo dpkg -i grafana_6.4.4_armhf.deb
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Tal como nos indica al finalizar la instalación, arrancamos y activamos como servicio&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo /bin/systemctl restart grafana-server
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo /bin/systemctl &lt;span class="nb"&gt;enable&lt;/span&gt; grafana-server
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="configuración-de-grafana"&gt;Configuración de Grafana
&lt;/h2&gt;&lt;p&gt;Accedemos a nuestro grafana y nos logueamos con la cuenta por defecto: &lt;code&gt;admin&lt;/code&gt; / &lt;code&gt;admin&lt;/code&gt;. Tras esto nos pedirá cambiar la password por una más segura.&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="http://192.168.0.x:3000/" target="_blank" rel="noopener"
 &gt;http://192.168.0.X:3000/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="img" class="gallery-image" data-flex-basis="599px" data-flex-grow="249" height="410" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.rdiez.es/p/visualizando-m%C3%A9tricas-con-grafana/tel_inf_graf_snapshot_4071427972-8-1024x410.png" srcset="https://blog.rdiez.es/p/visualizando-m%C3%A9tricas-con-grafana/tel_inf_graf_snapshot_4071427972-8-1024x410_hu_bbdf90234a9e735b.png 800w, https://blog.rdiez.es/p/visualizando-m%C3%A9tricas-con-grafana/tel_inf_graf_snapshot_4071427972-8-1024x410.png 1024w" width="1024"&gt;&lt;/p&gt;
&lt;p&gt;Lo primero será añadir un nuevo &lt;strong&gt;Data Source&lt;/strong&gt; tal como nos indica el asistente. Seleccionamos «InfluxDB» como origen, ya que es la BBDD que estamos utilizando:&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20210310233720079" class="gallery-image" data-flex-basis="531px" data-flex-grow="221" height="321" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.rdiez.es/p/visualizando-m%C3%A9tricas-con-grafana/image-20210310233720079.png" width="711"&gt;&lt;/p&gt;
&lt;p&gt;Aquí debemos rellenar nuestros datos de InfluxDB (nombre de BBDD, user, Password, etc). Todos estos datos son los que hemos configurado durante la instalación previa que explicamos en el post anterior.&lt;/p&gt;
&lt;p&gt;&lt;img alt="img" class="gallery-image" data-flex-basis="188px" data-flex-grow="78" height="764" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.rdiez.es/p/visualizando-m%C3%A9tricas-con-grafana/tel_inf_graf_snapshot_4071490197-10.png" width="599"&gt;&lt;/p&gt;
&lt;p&gt;Tras pulsar en «Save and test» debería guardarnos el Data Source sin problemas. Si hubiera algún error, es necesario verificar de nuevo los datos introducidos.&lt;/p&gt;
&lt;h2 id="dashboard-desde-cero"&gt;Dashboard desde cero
&lt;/h2&gt;&lt;p&gt;Ha llegado el momento de crear nuestro primer dashboard. Aquí es donde encuentra todo el potencial de Grafana, y puede ser realmente complejo de llegar a entender, por eso es recomendable echarle un ojo a la documentación oficial.&lt;/p&gt;
&lt;p&gt;Esto lo veremos más delante en profundidad, por el momento vamos a crear un dashboard con una única gráfica, como ejemplo.&lt;/p&gt;
&lt;p&gt;Nos vamos a «New», y seleccionamos Query como primer paso.&lt;/p&gt;
&lt;p&gt;Lo primero será seleccionar nuestro Data Source: &lt;code&gt;InfluxDB&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20210310233756466" class="gallery-image" data-flex-basis="996px" data-flex-grow="415" height="171" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.rdiez.es/p/visualizando-m%C3%A9tricas-con-grafana/image-20210310233756466.png" width="710"&gt;&lt;/p&gt;
&lt;p&gt;Ahora se nos mostrará un constructor de querys en blanco. En este ejemplo vamos a seleccionar los datos de memoria donde el host sea rpi2, y que nos haga una media de los valores:&lt;/p&gt;
&lt;p&gt;&lt;img alt="img" class="gallery-image" data-flex-basis="606px" data-flex-grow="252" height="405" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.rdiez.es/p/visualizando-m%C3%A9tricas-con-grafana/tel_inf_graf_snapshot_4071536388-12-1024x405.png" srcset="https://blog.rdiez.es/p/visualizando-m%C3%A9tricas-con-grafana/tel_inf_graf_snapshot_4071536388-12-1024x405_hu_967be0f2fee5d6e2.png 800w, https://blog.rdiez.es/p/visualizando-m%C3%A9tricas-con-grafana/tel_inf_graf_snapshot_4071536388-12-1024x405.png 1024w" width="1024"&gt;&lt;/p&gt;
&lt;p&gt;Con esto ya tenemos nuestra gráfica de memoria.&lt;/p&gt;
&lt;p&gt;En la siguiente opción «Visualization» podemos definir más como queremos que nos muestren los datos, por ejemplo:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;unidades en bytes&lt;/li&gt;
&lt;li&gt;líneas&lt;/li&gt;
&lt;li&gt;valores mínimo, máximo y actual, etc&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt="image-20210310233833041" class="gallery-image" data-flex-basis="537px" data-flex-grow="223" height="318" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.rdiez.es/p/visualizando-m%C3%A9tricas-con-grafana/image-20210310233833041.png" width="712"&gt;&lt;/p&gt;
&lt;p&gt;En general definimos el nombre de nuestra grafica, una descripción, etc.&lt;/p&gt;
&lt;p&gt;&lt;img alt="img" class="gallery-image" data-flex-basis="880px" data-flex-grow="367" height="279" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.rdiez.es/p/visualizando-m%C3%A9tricas-con-grafana/tel_inf_graf_snapshot_4071591718-14-1024x279.png" srcset="https://blog.rdiez.es/p/visualizando-m%C3%A9tricas-con-grafana/tel_inf_graf_snapshot_4071591718-14-1024x279_hu_4168476bf7266d95.png 800w, https://blog.rdiez.es/p/visualizando-m%C3%A9tricas-con-grafana/tel_inf_graf_snapshot_4071591718-14-1024x279.png 1024w" width="1024"&gt;&lt;/p&gt;
&lt;p&gt;Con esto ya podemos guardar nuestro dashboard con nuestra primera gráfica lista para ser visualizada.&lt;/p&gt;
&lt;p&gt;Hay que tener paciencia y jugar mucho con las opciones, ayudándonos de la documentación oficial, pero se puede moldear los dashboards tal y como lo necesitemos, a nuestro gusto.&lt;/p&gt;
&lt;h2 id="dashboard-desde-plantilla"&gt;Dashboard desde plantilla
&lt;/h2&gt;&lt;p&gt;Otra manera para empezar a trabajar de forma rápida, es coger alguno de los dashboard ya creados que tiene grafana en su web:&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://grafana.com/grafana/dashboards" target="_blank" rel="noopener"
 &gt;https://grafana.com/grafana/dashboards&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Podemos utilizar este como base, por ejemplo: &lt;a class="link" href="https://grafana.com/grafana/dashboards/10578" target="_blank" rel="noopener"
 &gt;https://grafana.com/grafana/dashboards/10578&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Tan sólo necesitamos copiar su ID, e irnos a la opción de importar. Aquí pegaremos este ID, y lo importamos directamente:&lt;/p&gt;
&lt;p&gt;&lt;img alt="img" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="lazy_placeholder.gif"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="img" class="gallery-image" data-flex-basis="402px" data-flex-grow="167" height="610" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.rdiez.es/p/visualizando-m%C3%A9tricas-con-grafana/tel_inf_graf_snapshot_4071630950-16-1024x610.png" srcset="https://blog.rdiez.es/p/visualizando-m%C3%A9tricas-con-grafana/tel_inf_graf_snapshot_4071630950-16-1024x610_hu_968245fc80beedd2.png 800w, https://blog.rdiez.es/p/visualizando-m%C3%A9tricas-con-grafana/tel_inf_graf_snapshot_4071630950-16-1024x610.png 1024w" width="1024"&gt;&lt;/p&gt;
&lt;p&gt;Con esto ya tendremos nuestro primer dashboard operativo, de una forma muy fácil y rápida. Lógicamente habrá gráficas que no muestren datos, ya que estamos realizando una monitorizoción muy básica y la plantilla puede que tenga más orígenes de datos.&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20210310233858697" class="gallery-image" data-flex-basis="508px" data-flex-grow="211" height="335" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.rdiez.es/p/visualizando-m%C3%A9tricas-con-grafana/image-20210310233858697.png" width="710"&gt;&lt;/p&gt;
&lt;p&gt;Como hemos dicho previamente, ahora lo importante es jugar con las diferentes opciones, ir adecuando los dashboards a nuestras necesidades.&lt;/p&gt;
&lt;p&gt;En siguientes post iremos evolucionando nuestro sistema de monitorización hacia algo más completo ????&lt;/p&gt;</description></item><item><title>Temperatura y Ventiladores Con lm-sensors en AMD Ryzen</title><link>https://blog.rdiez.es/p/temperatura-y-ventiladores-con-lm-sensors-en-amd-ryzen/</link><pubDate>Thu, 16 Apr 2020 00:00:00 +0000</pubDate><guid>https://blog.rdiez.es/p/temperatura-y-ventiladores-con-lm-sensors-en-amd-ryzen/</guid><description>&lt;img src="https://blog.rdiez.es/p/temperatura-y-ventiladores-con-lm-sensors-en-amd-ryzen/ryzen.jpg" alt="Featured image of post Temperatura y Ventiladores Con lm-sensors en AMD Ryzen" /&gt;&lt;p&gt;Uno de los mayores problemas de Linux frente a Windows, en arquitecturas &lt;strong&gt;AMD Ryzen&lt;/strong&gt;, es el control de temperaturas y velocidad de ventiladores. Por poner un par de ejemplos claros:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;En Windows puedo ver la temperatura de todos los sensores de mi motherboard, así como la gestión de ventiladores de la misma, sin ningún problema. En Linux solo me muestra la temperatura de CPU y GPU.&lt;/li&gt;
&lt;li&gt;En Windows, mi GPU (una &lt;a class="link" href="https://amzn.to/2TAMciE" target="_blank" rel="noopener"
 &gt;Radeon RX590&lt;/a&gt;) detiene automáticamente los ventiladores de la misma cuando trabaja a temperaturas inferiores a 50º. En linux los ventiladores se encuentran permanentemente al 50%. Aunque es una gráfica muy silenciosa, el sonido se llega a notar.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;No obstante, en Linux hay poco que no se pueda hacer, así que en este post vamos a ver como tratar estos dos puntos&lt;/p&gt;
&lt;h2 id="ver-todos-los-sensores-en-lm-sensors"&gt;Ver todos los sensores en lm-sensors
&lt;/h2&gt;&lt;h3 id="instalación-de-paquetes"&gt;Instalación de paquetes
&lt;/h3&gt;&lt;p&gt;Una herramienta básica en Linux para poder ver temperaturas, voltajes, rpm, etc, es &lt;code&gt;lm-sensors&lt;/code&gt;, y su interfaz gráfica &lt;code&gt;psensor&lt;/code&gt;. Vamos a instalarlo poniendo un &lt;a class="link" href="https://ubuntu.com/" target="_blank" rel="noopener"
 &gt;ubuntu&lt;/a&gt; como ejemplo, aunque el paquete puede ser instalado en cualquier distribución&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install lm-sensors psensor
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;En &lt;a class="link" href="https://www.archlinux.org/" target="_blank" rel="noopener"
 &gt;Arch&lt;/a&gt;, sería&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo pacman -Sy lm-sensors psensor
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Una vez instalado, podemos lanzar la autodetección de los sensores, aunque el número de ellos que detecte será muy bajo:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo sensors-detect
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Podemos ver la información de nuestros sensores con&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sensors
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="detección-del-hardware"&gt;Detección del hardware.
&lt;/h3&gt;&lt;p&gt;Ahora nos toca buscar un poco de información. Es necesario conocer el &lt;strong&gt;chipset&lt;/strong&gt; que utiliza nuestra placa base. En mi caso, (una &lt;a class="link" href="https://amzn.to/2v4ClIf" target="_blank" rel="noopener"
 &gt;MSI X470 Pro Carbon&lt;/a&gt;), monta un chip &lt;a class="link" href="https://www.pctekreviews.com/Reviews/MSI_X470_GAMING_PRO_CARBON.aspx" target="_blank" rel="noopener"
 &gt;nuvoTon NCT 6795D&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Ejemplo chip Nuvoton" class="gallery-image" data-flex-basis="340px" data-flex-grow="141" height="463" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.rdiez.es/p/temperatura-y-ventiladores-con-lm-sensors-en-amd-ryzen/nuvoton_chip.png" width="657"&gt;&lt;/p&gt;
&lt;p&gt;Con esta información en la mano, es necesario buscar de nuevo el &lt;strong&gt;kernel driver&lt;/strong&gt; que da soporte a este chip. En este caso concreto, sería el &lt;strong&gt;&lt;a class="link" href="https://www.kernel.org/doc/html/latest/hwmon/nct6775.html" target="_blank" rel="noopener"
 &gt;NCT6775&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;una vez que tenemos el kernel driver que nos aplica, vamos a probarlo:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;modprobe nct6775
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Si ahora lanzamos sensors, nos debería mostrar mucha más información que antes:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;span class="lnt"&gt;40
&lt;/span&gt;&lt;span class="lnt"&gt;41
&lt;/span&gt;&lt;span class="lnt"&gt;42
&lt;/span&gt;&lt;span class="lnt"&gt;43
&lt;/span&gt;&lt;span class="lnt"&gt;44
&lt;/span&gt;&lt;span class="lnt"&gt;45
&lt;/span&gt;&lt;span class="lnt"&gt;46
&lt;/span&gt;&lt;span class="lnt"&gt;47
&lt;/span&gt;&lt;span class="lnt"&gt;48
&lt;/span&gt;&lt;span class="lnt"&gt;49
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ryzen-zos@ryzen-zos:~$ sensors
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;nct6795-isa-0a20
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Adapter: ISA adapter
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;in0: +0.66 V &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;min&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; +0.00 V, &lt;span class="nv"&gt;max&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; +1.74 V&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;in1: +1.02 V &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;min&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; +0.00 V, &lt;span class="nv"&gt;max&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; +0.00 V&lt;span class="o"&gt;)&lt;/span&gt; ALARM
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;in2: +3.34 V &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;min&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; +0.00 V, &lt;span class="nv"&gt;max&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; +0.00 V&lt;span class="o"&gt;)&lt;/span&gt; ALARM
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;in3: +3.41 V &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;min&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; +0.00 V, &lt;span class="nv"&gt;max&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; +0.00 V&lt;span class="o"&gt;)&lt;/span&gt; ALARM
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;in4: +1.01 V &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;min&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; +0.00 V, &lt;span class="nv"&gt;max&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; +0.00 V&lt;span class="o"&gt;)&lt;/span&gt; ALARM
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;in5: +0.15 V &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;min&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; +0.00 V, &lt;span class="nv"&gt;max&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; +0.00 V&lt;span class="o"&gt;)&lt;/span&gt; ALARM
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;in6: +0.72 V &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;min&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; +0.00 V, &lt;span class="nv"&gt;max&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; +0.00 V&lt;span class="o"&gt;)&lt;/span&gt; ALARM
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;in7: +3.33 V &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;min&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; +0.00 V, &lt;span class="nv"&gt;max&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; +0.00 V&lt;span class="o"&gt;)&lt;/span&gt; ALARM
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;in8: +3.25 V &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;min&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; +0.00 V, &lt;span class="nv"&gt;max&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; +0.00 V&lt;span class="o"&gt;)&lt;/span&gt; ALARM
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;in9: +1.82 V &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;min&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; +0.00 V, &lt;span class="nv"&gt;max&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; +0.00 V&lt;span class="o"&gt;)&lt;/span&gt; ALARM
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;in10: +0.00 V &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;min&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; +0.00 V, &lt;span class="nv"&gt;max&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; +0.00 V&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;in11: +0.67 V &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;min&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; +0.00 V, &lt;span class="nv"&gt;max&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; +0.00 V&lt;span class="o"&gt;)&lt;/span&gt; ALARM
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;in12: +1.15 V &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;min&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; +0.00 V, &lt;span class="nv"&gt;max&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; +0.00 V&lt;span class="o"&gt;)&lt;/span&gt; ALARM
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;in13: +0.68 V &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;min&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; +0.00 V, &lt;span class="nv"&gt;max&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; +0.00 V&lt;span class="o"&gt;)&lt;/span&gt; ALARM
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;in14: +1.54 V &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;min&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; +0.00 V, &lt;span class="nv"&gt;max&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; +0.00 V&lt;span class="o"&gt;)&lt;/span&gt; ALARM
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;fan1: &lt;span class="m"&gt;0&lt;/span&gt; RPM &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;min&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; RPM&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;fan2: &lt;span class="m"&gt;590&lt;/span&gt; RPM &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;min&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; RPM&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;fan3: &lt;span class="m"&gt;1048&lt;/span&gt; RPM &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;min&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; RPM&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;fan4: &lt;span class="m"&gt;0&lt;/span&gt; RPM &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;min&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; RPM&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;fan5: &lt;span class="m"&gt;675&lt;/span&gt; RPM &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;min&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; RPM&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;fan6: &lt;span class="m"&gt;552&lt;/span&gt; RPM &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;min&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; RPM&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;SYSTIN: +37.0°C &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;high&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; +0.0°C, &lt;span class="nv"&gt;hyst&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; +0.0°C&lt;span class="o"&gt;)&lt;/span&gt; ALARM &lt;span class="nv"&gt;sensor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; CPU diode
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;CPUTIN: +35.0°C &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;high&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; +115.0°C, &lt;span class="nv"&gt;hyst&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; +90.0°C&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nv"&gt;sensor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; thermistor
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;AUXTIN0: +42.0°C &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;high&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; +115.0°C, &lt;span class="nv"&gt;hyst&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; +90.0°C&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nv"&gt;sensor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; thermistor
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;AUXTIN1: -128.0°C &lt;span class="nv"&gt;sensor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; thermistor
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;AUXTIN2: +45.0°C &lt;span class="nv"&gt;sensor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; thermistor
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;AUXTIN3: -2.0°C &lt;span class="nv"&gt;sensor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; thermistor
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;SMBUSMASTER 0: +35.5°C 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;PCH_CHIP_CPU_MAX_TEMP: +0.0°C 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;PCH_CHIP_TEMP: +0.0°C 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;PCH_CPU_TEMP: +0.0°C 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;intrusion0: ALARM
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;intrusion1: ALARM
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;beep_enable: disabled
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;amdgpu-pci-2600
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Adapter: PCI adapter
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;vddgfx: +0.90 V 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;fan1: &lt;span class="m"&gt;156&lt;/span&gt; RPM &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;min&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; RPM, &lt;span class="nv"&gt;max&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;3200&lt;/span&gt; RPM&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;edge: +46.0°C &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;crit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; +91.0°C, &lt;span class="nv"&gt;hyst&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; -273.1°C&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;power1: 42.23 W &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;cap&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; 185.00 W&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;k10temp-pci-00c3
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Adapter: PCI adapter
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Tdie: +35.1°C &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;high&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; +70.0°C&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Tctl: +35.1°C
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="configuración"&gt;Configuración
&lt;/h3&gt;&lt;p&gt;Como funciona correctamente, vamos a aplicar los cambios para que se lance automáticamente en cada inicio. Para ello modificamos el fichero &lt;code&gt;/etc/rc.local&lt;/code&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo nano /etc/rc.local
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Y lo modificamos para que quede algo parecido a esto:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/bin/sh -e
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# rc.local&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# This script is executed at the end of each multiuser runlevel.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Make sure that the script will &amp;#34;exit 0&amp;#34; on success or any other&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# value on error.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# In order to enable or disable this script just change the execution&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# bits.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# By default this script does nothing.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;modprobe nct6775
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;exit&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Modificamos los permisos:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo chmod +x /etc/rc.local
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Y con esto ya tenemos todo listo para obtener informacion de todos los sensores de nuestra placa base.&lt;/p&gt;
&lt;h2 id="controlar-ventiladores"&gt;Controlar ventiladores
&lt;/h2&gt;&lt;p&gt;Utilizando el propio &lt;code&gt;lm-sensors&lt;/code&gt;, y &lt;code&gt;fancontrol&lt;/code&gt;, podemos controlar la velocidad y umbrales de todos los ventiladores de nuestro PC. En mi caso los tengo controlados desde la propia BIOS, pero me interesa que el comportamiento de los ventiladores de la GPU sea similar al de Windows: Que por debajo de 45-50 grados los ventiladores se detengan por completo.&lt;/p&gt;
&lt;p&gt;En distribuciones basadas en arch, lo más rápido y cómodo es instalar la utilidad &lt;strong&gt;&lt;a class="link" href="https://gitlab.com/corectrl/corectrl" target="_blank" rel="noopener"
 &gt;Corectrl&lt;/a&gt;&lt;/strong&gt; desde los repositorios &lt;strong&gt;AUR&lt;/strong&gt;, pero para otro tipo de distros es necesario compilar el código manualmente. Para ahorrarnos tiempo, vamos a utilizar &lt;code&gt;fancontrol&lt;/code&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install fancontrol
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="configuración-1"&gt;Configuración
&lt;/h3&gt;&lt;p&gt;Ahora vamos a lanzar el &lt;strong&gt;asistente&lt;/strong&gt; de configuración:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo pwmconfig
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Esto nos lanzará un asistente muy claro en el que nos irá preguntado qué ventiladores queremos modular, los umbrales en que se activarán, la velocidad de cada uno de ellos, etc etc. Al finalizar nos generará el fichero de configuración en &lt;code&gt;/etc/fancontrol&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Un ejemplo de mi configuración:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ryzen-zos@ryzen-zos:~$ cat /etc/fancontrol 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Configuration file generated by pwmconfig, changes will be lost&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;INTERVAL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;DEVPATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;hwmon0&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;devices/pci0000:00/0000:00:03.1/0000:26:00.0
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;DEVNAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;hwmon0&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;amdgpu
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;FCTEMPS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; hwmon0/pwm1&lt;span class="o"&gt;=&lt;/span&gt;hwmon0/temp1_input
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;FCFANS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; hwmon0/pwm1&lt;span class="o"&gt;=&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;MINTEMP&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; hwmon0/pwm1&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;45&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;MAXTEMP&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; hwmon0/pwm1&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;75&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;MINSTART&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; hwmon0/pwm1&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;100&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;MINSTOP&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; hwmon0/pwm1&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;MAXPWM&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; hwmon0/pwm1&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;255&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Para iniciar el programa, lo lanzamos con&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo fancontrol
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Con todo esto, ya tenemos un comportamiento más o menos similar al encontrado en Windows. Además, modificando los ficheros de configuración, podemos cambiar las alertas, etiquetas de los sensores, etc. También podemos utilizar esta información para utilizar en extensiones de gnome o KDE…. Pero todo esto lo veremos en otros post.&lt;/p&gt;</description></item><item><title>Añadir Nuevos Nodos En InfluxDB (Linux Y Windows)</title><link>https://blog.rdiez.es/p/a%C3%B1adir-nuevos-nodos-en-influxdb-linux-y-windows/</link><pubDate>Mon, 16 Mar 2020 00:00:00 +0000</pubDate><guid>https://blog.rdiez.es/p/a%C3%B1adir-nuevos-nodos-en-influxdb-linux-y-windows/</guid><description>&lt;img src="https://blog.rdiez.es/p/a%C3%B1adir-nuevos-nodos-en-influxdb-linux-y-windows/telegraflogo.png" alt="Featured image of post Añadir Nuevos Nodos En InfluxDB (Linux Y Windows)" /&gt;&lt;p&gt;Vamos a seguir ampliando nuestro sistema de monitorización basado en &lt;a class="link" href="" &gt;Telegraf, InfluxDB y Grafana&lt;/a&gt;. En este post, vamos a ver cómo integrar otro nodo más a nuestro sistema, ya sea un equipo que tenga S.O. Linux, o Windows&lt;/p&gt;
&lt;h2 id="linux"&gt;Linux
&lt;/h2&gt;&lt;h3 id="instalación"&gt;Instalación
&lt;/h3&gt;&lt;p&gt;Para ilustrarlo con un ejemplo, voy a añadir mi NAS, que como podemos ver cuenta con sistema operativo Linux Debian 8:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;span class="lnt"&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;root@ReadyNAS:~# cat /etc/*release*
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;PRETTY_NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;ReadyNASOS 6.10.2&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Debian GNU/Linux&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;VERSION_ID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;8&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;VERSION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;8 (jessie)&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;ID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;debian
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;HOME_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;http://www.debian.org/&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;SUPPORT_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;http://www.debian.org/support&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;BUG_REPORT_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;https://bugs.debian.org/&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;También es importante asgurarse de la arquitectura de procesador que tenemos. En mi ejemplo, vemos que es ARMv7:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;root@ReadyNAS:~# cat /proc/cpuinfo
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;processor : &lt;span class="m"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;model name : ARMv7 Processor rev &lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;v7l&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Teniendo toda esta información clara, procedemos a añadir el repositorio de Influx tal como hemos visto en post &lt;a class="link" href="https://blog.rdiez.es/monitorizacion-con-telegraf-influxdb-y-grafana/" target="_blank" rel="noopener"
 &gt;previos&lt;/a&gt;. Primero la key…&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -sL https://repos.influxdata.com/influxdb.key &lt;span class="p"&gt;|&lt;/span&gt; apt-key add -
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;y despues el repo. Es importante modificar el nombre de la distribución (jessie)&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;deb https://repos.influxdata.com/debian jessie stable&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; tee /etc/apt/sources.list.d/influxdb.list
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Hacemos un &lt;code&gt;apt update&lt;/code&gt; e instalamos Telegraf&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; apt update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; apt install telegraf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="configuración"&gt;Configuración
&lt;/h3&gt;&lt;p&gt;Antes de nada, debemos de configurar Telegraf para indicarle qué información debe recoger, y dónde debe enviarla. Para ello modificamos el fichero de configuración&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo nano /etc/telegraf/telegraf.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;En la sección &lt;code&gt;[[outputs.influxdb]]&lt;/code&gt; descomentamos la url correspondiente a &lt;code&gt;http&lt;/code&gt;., y apuntamos a la IP de nuestro influxDB (la IP de nuestra raspberry en este caso)&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;urls&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;http://192.168.0.11:8086&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;el nombre del database a utilizar&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;database&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;telegraf&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;y le indicamos que no cree la BBDD, ya que ya está generada. Únicamente tiene que conectarse a ella&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;skip_database_creation&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;También dentro de este apartado, configuramos la autentificación tal como ya hicimos anteriormente en los &lt;a class="link" href="https://blog.rdsj.es/monitorizacion-con-telegraf-influxdb-y-grafana/" target="_blank" rel="noopener"
 &gt;post previos&lt;/a&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;## HTTP Basic Auth&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;username&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;telegraf&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;password&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;MIPASSWORD&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Con esto tendríamos una configuración básica. Podemos &lt;a class="link" href="" &gt;añadir más métricas&lt;/a&gt; que nos resulten interesante, como ya vimos anteriormente.&lt;/p&gt;
&lt;p&gt;Reinicamos el servicio para que coja los cambios realizados:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl restart telegraf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;y lo activamos como servicio para que levante automáticamente&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl &lt;span class="nb"&gt;enable&lt;/span&gt; telegraf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Con esto, ya podemos ver los datos que se están recogiendo en Chronograf&lt;/p&gt;
&lt;p&gt;&lt;img alt="influx" class="gallery-image" data-flex-basis="744px" data-flex-grow="310" height="330" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.rdiez.es/p/a%C3%B1adir-nuevos-nodos-en-influxdb-linux-y-windows/tel_inf_graf_snapshot_4767390509-22-1024x330.png" srcset="https://blog.rdiez.es/p/a%C3%B1adir-nuevos-nodos-en-influxdb-linux-y-windows/tel_inf_graf_snapshot_4767390509-22-1024x330_hu_63da06b71c714a4.png 800w, https://blog.rdiez.es/p/a%C3%B1adir-nuevos-nodos-en-influxdb-linux-y-windows/tel_inf_graf_snapshot_4767390509-22-1024x330.png 1024w" width="1024"&gt;&lt;/p&gt;
&lt;p&gt;Y tambien en nuestros dashboards de Grafana&lt;/p&gt;
&lt;p&gt;&lt;img alt="grafana" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="lazy_placeholder.gif"&gt;&lt;/p&gt;
&lt;h2 id="windows"&gt;Windows
&lt;/h2&gt;&lt;h3 id="instalar-cliente"&gt;Instalar cliente
&lt;/h3&gt;&lt;p&gt;Para instalar nuestro cliente Telegraf en Windows, lo primero es descargarnos el instalable correspondiente desde la propia [web de influx[(https://portal.influxdata.com/downloads/)&lt;/p&gt;
&lt;p&gt;para x64 sería: &lt;a class="link" href="https://dl.influxdata.com/telegraf/releases/telegraf-1.12.6_windows_amd64.zip" target="_blank" rel="noopener"
 &gt;https://dl.influxdata.com/telegraf/releases/telegraf-1.12.6_windows_amd64.zip&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Extraemos el .zip descargado, y vemos que únicamente contiene dos ficheros:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;telegraf.conf&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;telegraf.exe&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Nos movemos estos dos ficheros a una carpeta que crearemos en la ruta: &lt;code&gt;C:\Program Files\Telegraf&lt;/code&gt;&lt;/p&gt;
&lt;h3 id="configuración-1"&gt;Configuración
&lt;/h3&gt;&lt;p&gt;Ahora vamos a configurar Telegraf. Para ello modificamos &lt;code&gt;telegraf.conf&lt;/code&gt;. El fichero es prácticamente idéntico al que ya vimos en Linux justo arriba, por lo que el bloque &lt;code&gt;[[outputs.influxdb]]&lt;/code&gt; nos quedaría algo como esto:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="err"&gt;outputs.influxdb&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;##&lt;/span&gt; &lt;span class="err"&gt;The&lt;/span&gt; &lt;span class="err"&gt;full&lt;/span&gt; &lt;span class="err"&gt;HTTP&lt;/span&gt; &lt;span class="err"&gt;or&lt;/span&gt; &lt;span class="err"&gt;UDP&lt;/span&gt; &lt;span class="err"&gt;URL&lt;/span&gt; &lt;span class="err"&gt;for&lt;/span&gt; &lt;span class="err"&gt;your&lt;/span&gt; &lt;span class="err"&gt;InfluxDB&lt;/span&gt; &lt;span class="err"&gt;instance.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;##&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;##&lt;/span&gt; &lt;span class="err"&gt;Multiple&lt;/span&gt; &lt;span class="err"&gt;URLs&lt;/span&gt; &lt;span class="err"&gt;can&lt;/span&gt; &lt;span class="err"&gt;be&lt;/span&gt; &lt;span class="err"&gt;specified&lt;/span&gt; &lt;span class="err"&gt;for&lt;/span&gt; &lt;span class="err"&gt;a&lt;/span&gt; &lt;span class="err"&gt;single&lt;/span&gt; &lt;span class="err"&gt;cluster,&lt;/span&gt; &lt;span class="err"&gt;only&lt;/span&gt; &lt;span class="err"&gt;ONE&lt;/span&gt; &lt;span class="err"&gt;of&lt;/span&gt; &lt;span class="err"&gt;the&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;##&lt;/span&gt; &lt;span class="err"&gt;urls&lt;/span&gt; &lt;span class="err"&gt;will&lt;/span&gt; &lt;span class="err"&gt;be&lt;/span&gt; &lt;span class="err"&gt;written&lt;/span&gt; &lt;span class="err"&gt;to&lt;/span&gt; &lt;span class="err"&gt;each&lt;/span&gt; &lt;span class="err"&gt;interval.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;#&lt;/span&gt; &lt;span class="err"&gt;urls&lt;/span&gt; &lt;span class="err"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;unix:///var/run/influxdb.sock&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;#&lt;/span&gt; &lt;span class="err"&gt;urls&lt;/span&gt; &lt;span class="err"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;udp://127.0.0.1:8089&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;urls&lt;/span&gt; &lt;span class="err"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;http://192.168.0.11:8086&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;##&lt;/span&gt; &lt;span class="err"&gt;The&lt;/span&gt; &lt;span class="err"&gt;target&lt;/span&gt; &lt;span class="err"&gt;database&lt;/span&gt; &lt;span class="err"&gt;for&lt;/span&gt; &lt;span class="err"&gt;metrics;&lt;/span&gt; &lt;span class="err"&gt;will&lt;/span&gt; &lt;span class="err"&gt;be&lt;/span&gt; &lt;span class="err"&gt;created&lt;/span&gt; &lt;span class="err"&gt;as&lt;/span&gt; &lt;span class="err"&gt;needed.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;database&lt;/span&gt; &lt;span class="err"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;telegraf&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;##&lt;/span&gt; &lt;span class="err"&gt;If&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="err"&gt;no&lt;/span&gt; &lt;span class="err"&gt;CREATE&lt;/span&gt; &lt;span class="err"&gt;DATABASE&lt;/span&gt; &lt;span class="err"&gt;queries&lt;/span&gt; &lt;span class="err"&gt;will&lt;/span&gt; &lt;span class="err"&gt;be&lt;/span&gt; &lt;span class="err"&gt;sent.&lt;/span&gt; &lt;span class="err"&gt;Set&lt;/span&gt; &lt;span class="err"&gt;to&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="err"&gt;when&lt;/span&gt; &lt;span class="err"&gt;using&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;##&lt;/span&gt; &lt;span class="err"&gt;Telegraf&lt;/span&gt; &lt;span class="err"&gt;with&lt;/span&gt; &lt;span class="err"&gt;a&lt;/span&gt; &lt;span class="err"&gt;user&lt;/span&gt; &lt;span class="err"&gt;without&lt;/span&gt; &lt;span class="err"&gt;permissions&lt;/span&gt; &lt;span class="err"&gt;to&lt;/span&gt; &lt;span class="err"&gt;create&lt;/span&gt; &lt;span class="err"&gt;databases&lt;/span&gt; &lt;span class="err"&gt;or&lt;/span&gt; &lt;span class="err"&gt;when&lt;/span&gt; &lt;span class="err"&gt;the&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;##&lt;/span&gt; &lt;span class="err"&gt;database&lt;/span&gt; &lt;span class="err"&gt;already&lt;/span&gt; &lt;span class="err"&gt;exists.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;skip_database_creation&lt;/span&gt; &lt;span class="err"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;##&lt;/span&gt; &lt;span class="err"&gt;Name&lt;/span&gt; &lt;span class="err"&gt;of&lt;/span&gt; &lt;span class="err"&gt;existing&lt;/span&gt; &lt;span class="err"&gt;retention&lt;/span&gt; &lt;span class="err"&gt;policy&lt;/span&gt; &lt;span class="err"&gt;to&lt;/span&gt; &lt;span class="err"&gt;write&lt;/span&gt; &lt;span class="err"&gt;to.&lt;/span&gt; &lt;span class="err"&gt;Empty&lt;/span&gt; &lt;span class="err"&gt;string&lt;/span&gt; &lt;span class="err"&gt;writes&lt;/span&gt; &lt;span class="err"&gt;to&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;##&lt;/span&gt; &lt;span class="err"&gt;the&lt;/span&gt; &lt;span class="err"&gt;default&lt;/span&gt; &lt;span class="err"&gt;retention&lt;/span&gt; &lt;span class="err"&gt;policy.&lt;/span&gt; &lt;span class="err"&gt;Only&lt;/span&gt; &lt;span class="err"&gt;takes&lt;/span&gt; &lt;span class="err"&gt;effect&lt;/span&gt; &lt;span class="err"&gt;when&lt;/span&gt; &lt;span class="err"&gt;using&lt;/span&gt; &lt;span class="err"&gt;HTTP.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;#&lt;/span&gt; &lt;span class="err"&gt;retention_policy&lt;/span&gt; &lt;span class="err"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;##&lt;/span&gt; &lt;span class="err"&gt;Write&lt;/span&gt; &lt;span class="err"&gt;consistency&lt;/span&gt; &lt;span class="err"&gt;(clusters&lt;/span&gt; &lt;span class="err"&gt;only),&lt;/span&gt; &lt;span class="err"&gt;can&lt;/span&gt; &lt;span class="err"&gt;be:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;any&amp;#34;&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;one&amp;#34;&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;quorum&amp;#34;&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;all&amp;#34;&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;##&lt;/span&gt; &lt;span class="err"&gt;Only&lt;/span&gt; &lt;span class="err"&gt;takes&lt;/span&gt; &lt;span class="err"&gt;effect&lt;/span&gt; &lt;span class="err"&gt;when&lt;/span&gt; &lt;span class="err"&gt;using&lt;/span&gt; &lt;span class="err"&gt;HTTP.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;#&lt;/span&gt; &lt;span class="err"&gt;write_consistency&lt;/span&gt; &lt;span class="err"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;any&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;##&lt;/span&gt; &lt;span class="err"&gt;Timeout&lt;/span&gt; &lt;span class="err"&gt;for&lt;/span&gt; &lt;span class="err"&gt;HTTP&lt;/span&gt; &lt;span class="err"&gt;messages.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;#&lt;/span&gt; &lt;span class="err"&gt;timeout&lt;/span&gt; &lt;span class="err"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;5s&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;##&lt;/span&gt; &lt;span class="err"&gt;HTTP&lt;/span&gt; &lt;span class="err"&gt;Basic&lt;/span&gt; &lt;span class="err"&gt;Auth&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;username&lt;/span&gt; &lt;span class="err"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;telegraf&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;password&lt;/span&gt; &lt;span class="err"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;MYPASSWORD&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Además, vamos a añadir métricas de CPU y Disco. Para ello, como siempre, descomentamos los bloques correspondientes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;[[inputs.cpu]]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;[[inputs.disk]]&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Guardamos el fichero y al ejecutar &lt;code&gt;telegraf.exe&lt;/code&gt; podremos ver como se ejecuta, y en Chronograf tendremos los datos reportados.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2019-11-26T10:15:53Z I! Starting Telegraf 1.12.6
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2019-11-26T10:15:53Z I! Using config file: C:&lt;span class="se"&gt;\P&lt;/span&gt;rogram Files&lt;span class="se"&gt;\T&lt;/span&gt;elegraf&lt;span class="se"&gt;\t&lt;/span&gt;elegraf.conf
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2019-11-26T10:15:53Z I! Loaded inputs: win_perf_counters
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2019-11-26T10:15:53Z I! Loaded aggregators:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2019-11-26T10:15:53Z I! Loaded processors:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2019-11-26T10:15:53Z I! Loaded outputs: influxdb
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2019-11-26T10:15:53Z I! Tags enabled: &lt;span class="nv"&gt;host&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;HCESO5CG54924LC
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2019-11-26T10:15:53Z I! &lt;span class="o"&gt;[&lt;/span&gt;agent&lt;span class="o"&gt;]&lt;/span&gt; Config: Interval:10s, Quiet:false, Hostname:&lt;span class="s2"&gt;&amp;#34;PCWINDOWS&amp;#34;&lt;/span&gt;, Flush Interval:10s
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;En caso de que hayamos metido Telegraf en otra ruta, o queramos simplemente testear su ejecucion, podemos lanzar el siguiente comando adecuando las rutas a las correctas:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;C:&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Program Files&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="n"&gt;Telegraf&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="n"&gt;telegraf&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;exe&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;-config&lt;/span&gt; &lt;span class="n"&gt;C:&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Program Files&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="n"&gt;Telegraf&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="n"&gt;telegraf&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;conf&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;-test&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="registar-como-servicio"&gt;Registar como servicio
&lt;/h3&gt;&lt;p&gt;En Windows la ejecución de Telegraf es de forma manual. Pero podemos registrarlo como servicio para que levante automáticamente, que es el comportamiento lógico.&lt;/p&gt;
&lt;p&gt;Abrimos una consola de comandos, o Powershell, con &lt;strong&gt;privilegios de Administrador&lt;/strong&gt;, y ejecutamos lo siguiente:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;C:&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Program Files&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="n"&gt;Telegraf&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="n"&gt;telegraf&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;exe&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;-service&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Para levantar el servicio, ejecutamos:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;net&lt;/span&gt; &lt;span class="nb"&gt;start &lt;/span&gt;&lt;span class="n"&gt;telegraf&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Con esto ya tendríamos la monitorización de nuestro equipo Windows lista para ser consumida.&lt;/p&gt;
&lt;h3 id="dashboard-grafana"&gt;Dashboard Grafana
&lt;/h3&gt;&lt;p&gt;Lógicamente, las métricas que recoge desde Windows no son las mismas que hemos visto de nuestra Raspberry, por lo que necesitamos visualizarlas desde otro dashboard diferente.&lt;/p&gt;
&lt;p&gt;Para hacerlo de forma más fácil, podemos utilizar el dashboard compartido por el usuario &lt;strong&gt;David Stephens&lt;/strong&gt;. Ya hemos visto anteriormente tambien la forma de &lt;a class="link" href="https://blog.rdsj.es/visualizando-metricas-con-grafana/#toc-3" target="_blank" rel="noopener"
 &gt;importar estos dashboards&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://grafana.com/grafana/dashboards/1902" target="_blank" rel="noopener"
 &gt;https://grafana.com/grafana/dashboards/1902&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="grafana" class="gallery-image" data-flex-basis="172px" data-flex-grow="71" height="1597" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.rdiez.es/p/a%C3%B1adir-nuevos-nodos-en-influxdb-linux-y-windows/image-1574767428630.png" srcset="https://blog.rdiez.es/p/a%C3%B1adir-nuevos-nodos-en-influxdb-linux-y-windows/image-1574767428630_hu_2a8581a361ce9871.png 800w, https://blog.rdiez.es/p/a%C3%B1adir-nuevos-nodos-en-influxdb-linux-y-windows/image-1574767428630.png 1146w" width="1146"&gt;&lt;/p&gt;</description></item><item><title>Monitorización con Telegraf, InfluxDB y Grafana</title><link>https://blog.rdiez.es/p/monitorizaci%C3%B3n-con-telegraf-influxdb-y-grafana/</link><pubDate>Sat, 16 Nov 2019 00:00:00 +0000</pubDate><guid>https://blog.rdiez.es/p/monitorizaci%C3%B3n-con-telegraf-influxdb-y-grafana/</guid><description>&lt;img src="https://blog.rdiez.es/p/monitorizaci%C3%B3n-con-telegraf-influxdb-y-grafana/banner.png" alt="Featured image of post Monitorización con Telegraf, InfluxDB y Grafana" /&gt;&lt;p&gt;Uno de los usos más prácticos que se le pueden dar a nuestra Raspberry, es utlizarlo como un servidor central para monitorizar los diferentes equipos de nuestra casa.&lt;/p&gt;
&lt;p&gt;Una forma sencilla, muy potente y con uso de consumos mínimo, muy utilizado en entornos productivos, es:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a class="link" href="https://www.influxdata.com/time-series-platform/telegraf/" target="_blank" rel="noopener"
 &gt;Telegraf&lt;/a&gt;&lt;/strong&gt; – es el «cliente» que recolecta los datos en su host, y los envía una una Base de Datos centralizada. Es ampliamente customizable mediante &lt;a class="link" href="https://docs.influxdata.com/telegraf/v1.12/plugins/plugin-list/" target="_blank" rel="noopener"
 &gt;plugins&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a class="link" href="https://www.influxdata.com/products/influxdb-overview/" target="_blank" rel="noopener"
 &gt;InfluxDB&lt;/a&gt;&lt;/strong&gt; – Es la BBDD que recibe los datos de Telegraf. Está diseñado para trabajar de forma muy eficiente con series de datos temporales.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a class="link" href="https://grafana.com/" target="_blank" rel="noopener"
 &gt;Grafana&lt;/a&gt;&lt;/strong&gt; – Es el frontend donde visualizaremos los diferentes gráficos y medidores. Recolecta datos de muchísimas otras fuentes por lo que es muy elastico de cara a futuro.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Todos estos productos son Open Source y gratuitos, y activamente desarrollados.&lt;/p&gt;
&lt;p&gt;Un diagrama básico podría ser el siguiente:&lt;/p&gt;
&lt;p&gt;&lt;img alt="img" class="gallery-image" data-flex-basis="348px" data-flex-grow="145" height="575" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.rdiez.es/p/monitorizaci%C3%B3n-con-telegraf-influxdb-y-grafana/diagrama_arq_telegraf_grafana.png" srcset="https://blog.rdiez.es/p/monitorizaci%C3%B3n-con-telegraf-influxdb-y-grafana/diagrama_arq_telegraf_grafana_hu_40d82b33ba31cf3c.png 800w, https://blog.rdiez.es/p/monitorizaci%C3%B3n-con-telegraf-influxdb-y-grafana/diagrama_arq_telegraf_grafana.png 834w" width="834"&gt;&lt;/p&gt;
&lt;p&gt;En mi caso lo voy a instalar todo en una raspberryPi 2B corriendo Raspbian Buster. Más adelante veremos como añadimos más nodos.&lt;/p&gt;
&lt;p&gt;Antes de nada necesitamos tener clara la versión y codigo de nuestro S.O., en nuestro caso buster&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pi@rpi2:~ $ lsb_release -a
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;No LSB modules are available.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Distributor ID: Raspbian
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Description: Raspbian GNU/Linux &lt;span class="m"&gt;10&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;buster&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Release: &lt;span class="m"&gt;10&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Codename: buster
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="instalación-de-influxdb-y-telegraf"&gt;Instalación de InfluxDB y Telegraf
&lt;/h2&gt;&lt;p&gt;Añadimos los repositorios de influx, son el mismo para ambos productos.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -sL https://repos.influxdata.com/influxdb.key &lt;span class="p"&gt;|&lt;/span&gt; sudo apt-key add -
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;deb https://repos.influxdata.com/debian buster stable&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; sudo tee /etc/apt/sources.list.d/influxdb.list
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Instalamos Telegraf y InfluxDB&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt update
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install telegraf
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install influxdb
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="configurar-telegraf"&gt;Configurar Telegraf
&lt;/h2&gt;&lt;p&gt;Antes de nada, debemos de configurar Telegraf para indicarle qué información debe recoger, y dónde debe enviarla. Para ello modificamos el fichero de configuración&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo nano /etc/telegraf/telegraf.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;En la sección [[outputs.influxdb]] descomentamos la url correspondiente a http.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;urls&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;http://127.0.0.1:8086&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;el nombre del database a utilizar&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;database&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;telegraf&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;y le indicamos que no cree la BBDD, ya que la vamos a crear manualmente nosotros más delante&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;skip_database_creation&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;También dentro de este apartado, vamos a añadir autentificación para tener más controlado el entorno, y no dejar los datos expuestos a cualquier ataque. Se pueden añadir medidas adicionales, pero como primer paso nos puede servir con esto.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;## HTTP Basic Auth&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;username&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;telegraf&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;password&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;MIPASSWORD&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Reinicamos el servicio para que coja los cambios realizados:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl restart telegraf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;y lo activamos como servicio para que levante automáticamente&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl &lt;span class="nb"&gt;enable&lt;/span&gt; telegraf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="influxdb"&gt;InfluxDB
&lt;/h2&gt;&lt;p&gt;Los puertos que utiiliza InfluxDB por defecto son:&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th style="text-align: left"&gt;Puerto&lt;/th&gt;
					&lt;th style="text-align: left"&gt;Descripcion&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;8086&lt;/td&gt;
					&lt;td style="text-align: left"&gt;API http a la que se conectará Telegraf&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;8088&lt;/td&gt;
					&lt;td style="text-align: left"&gt;Servicio de backup y restore&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Vamos a configurar la autentificación, al igual que hicimos con Telegraf. Para ello modificamos el fichero de configuracion de InfluxDB:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo nano /etc/influxdb/influxdb.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Y modificamos lo siguiente dentro del apartado [http]&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;enabled&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; bind-address &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;:8086&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; auth-enabled &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Tras esto, guardamos y reiniciamos el servicio&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl restart influxdb
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Y lo activamos como servicio para que levante automáticamente:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl &lt;span class="nb"&gt;enable&lt;/span&gt; influxdb
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="chronograf"&gt;Chronograf
&lt;/h3&gt;&lt;p&gt;Los puertos que utiiliza Cronograf por defecto son:&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th style="text-align: left"&gt;Puerto&lt;/th&gt;
					&lt;th style="text-align: left"&gt;Descripcion&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;8088&lt;/td&gt;
					&lt;td style="text-align: left"&gt;API http a la consola de administración&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Para poder ver, o gestionar influxdb de forma gráfica, podemos instalar Chronograf&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install chronograf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Creamos también el usuario &lt;code&gt;admin&lt;/code&gt; de nuestro InfluxDB&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -XPOST &lt;span class="s2"&gt;&amp;#34;http://localhost:8086/query&amp;#34;&lt;/span&gt; --data-urlencode &lt;span class="s2"&gt;&amp;#34;q=CREATE USER admin WITH PASSWORD &amp;#39;MIPASSWORD&amp;#39; WITH ALL PRIVILEGES&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Ahora ya podemos acceder a la GUI o consola de administración. Lo podemos hacer en local (&lt;a class="link" href="http://localhost:8888/" target="_blank" rel="noopener"
 &gt;http://localhost:8888&lt;/a&gt;) o remotamente accediendo a la IP de nuestra raspberryPI (&lt;a class="link" href="http://192.168.0.x:8888/" target="_blank" rel="noopener"
 &gt;http://192.168.0.X:8888&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Una vez abierto, iniciamos una conexión añadiendo los datos de nuestro InfluxDB, y el usuario admin que acabamos de crear&lt;/p&gt;
&lt;p&gt;&lt;img alt="img" class="gallery-image" data-flex-basis="404px" data-flex-grow="168" height="607" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.rdiez.es/p/monitorizaci%C3%B3n-con-telegraf-influxdb-y-grafana/tel_inf_graf_snapshot_3859819182-2-1024x607.png" srcset="https://blog.rdiez.es/p/monitorizaci%C3%B3n-con-telegraf-influxdb-y-grafana/tel_inf_graf_snapshot_3859819182-2-1024x607_hu_d2b84118a318c94e.png 800w, https://blog.rdiez.es/p/monitorizaci%C3%B3n-con-telegraf-influxdb-y-grafana/tel_inf_graf_snapshot_3859819182-2-1024x607.png 1024w" width="1024"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="img" class="gallery-image" data-flex-basis="596px" data-flex-grow="248" height="412" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.rdiez.es/p/monitorizaci%C3%B3n-con-telegraf-influxdb-y-grafana/tel_inf_graf_snapshot_3859882009-3-1024x412.png" srcset="https://blog.rdiez.es/p/monitorizaci%C3%B3n-con-telegraf-influxdb-y-grafana/tel_inf_graf_snapshot_3859882009-3-1024x412_hu_4510f0bd07eac69.png 800w, https://blog.rdiez.es/p/monitorizaci%C3%B3n-con-telegraf-influxdb-y-grafana/tel_inf_graf_snapshot_3859882009-3-1024x412.png 1024w" width="1024"&gt;&lt;/p&gt;
&lt;p&gt;Una vez creado, nos vamos a «InfluxDB Admin»&lt;/p&gt;
&lt;p&gt;&lt;img alt="img" class="gallery-image" data-flex-basis="675px" data-flex-grow="281" height="364" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.rdiez.es/p/monitorizaci%C3%B3n-con-telegraf-influxdb-y-grafana/tel_inf_graf_snapshot_3859904558-4-1024x364.png" srcset="https://blog.rdiez.es/p/monitorizaci%C3%B3n-con-telegraf-influxdb-y-grafana/tel_inf_graf_snapshot_3859904558-4-1024x364_hu_34d7883a9bcbd79b.png 800w, https://blog.rdiez.es/p/monitorizaci%C3%B3n-con-telegraf-influxdb-y-grafana/tel_inf_graf_snapshot_3859904558-4-1024x364.png 1024w" width="1024"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="img" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="lazy_placeholder.gif"&gt;&lt;/p&gt;
&lt;p&gt;Creamos una nueva BBDD:&lt;/p&gt;
&lt;p&gt;&lt;img alt="img" class="gallery-image" data-flex-basis="615px" data-flex-grow="256" height="399" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.rdiez.es/p/monitorizaci%C3%B3n-con-telegraf-influxdb-y-grafana/tel_inf_graf_snapshot_3859929596-5-1024x399.png" srcset="https://blog.rdiez.es/p/monitorizaci%C3%B3n-con-telegraf-influxdb-y-grafana/tel_inf_graf_snapshot_3859929596-5-1024x399_hu_8ea0a4006a9d0b1f.png 800w, https://blog.rdiez.es/p/monitorizaci%C3%B3n-con-telegraf-influxdb-y-grafana/tel_inf_graf_snapshot_3859929596-5-1024x399.png 1024w" width="1024"&gt;&lt;/p&gt;
&lt;p&gt;y un usuario &lt;code&gt;telegraf&lt;/code&gt; con todos los permisos&lt;/p&gt;
&lt;p&gt;&lt;img alt="img" class="gallery-image" data-flex-basis="1092px" data-flex-grow="455" height="225" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.rdiez.es/p/monitorizaci%C3%B3n-con-telegraf-influxdb-y-grafana/tel_inf_graf_snapshot_3859944182-6-1024x225.png" srcset="https://blog.rdiez.es/p/monitorizaci%C3%B3n-con-telegraf-influxdb-y-grafana/tel_inf_graf_snapshot_3859944182-6-1024x225_hu_5f3e50df1b6435f9.png 800w, https://blog.rdiez.es/p/monitorizaci%C3%B3n-con-telegraf-influxdb-y-grafana/tel_inf_graf_snapshot_3859944182-6-1024x225.png 1024w" width="1024"&gt;&lt;/p&gt;
&lt;p&gt;Con esto debería estar todo listo. Hacemos un reboot para comprobar que todo arranca bien, y Telegraf empieza a meter datos en la BBDD&lt;/p&gt;
&lt;p&gt;Lo podemos ver en Chronograf, en la opcion «Explore»&lt;/p&gt;
&lt;p&gt;&lt;img alt="img" class="gallery-image" data-flex-basis="485px" data-flex-grow="202" height="506" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.rdiez.es/p/monitorizaci%C3%B3n-con-telegraf-influxdb-y-grafana/tel_inf_graf_snapshot_3859961127-7-1024x506.png" srcset="https://blog.rdiez.es/p/monitorizaci%C3%B3n-con-telegraf-influxdb-y-grafana/tel_inf_graf_snapshot_3859961127-7-1024x506_hu_330db491d413a3e7.png 800w, https://blog.rdiez.es/p/monitorizaci%C3%B3n-con-telegraf-influxdb-y-grafana/tel_inf_graf_snapshot_3859961127-7-1024x506.png 1024w" width="1024"&gt;&lt;/p&gt;
&lt;p&gt;Con esto ya podemos ver de forma sencilla los datos reportados por Telegraf. En el siguiente capítulo veremos como ver esto de una manera más avanzada utilizando Grafana.&lt;/p&gt;</description></item><item><title>Python 11 – Funciones</title><link>https://blog.rdiez.es/p/python-11-funciones/</link><pubDate>Tue, 21 May 2019 00:00:00 +0000</pubDate><guid>https://blog.rdiez.es/p/python-11-funciones/</guid><description>&lt;img src="https://blog.rdiez.es/p/python-11-funciones/python-banner.jpg" alt="Featured image of post Python 11 – Funciones" /&gt;&lt;p&gt;A grandes rasgos, una función es una «porción» del código, a la que pasamos algo, lo procesa, y nos puede o no devolver el resultado.&lt;/p&gt;
&lt;p&gt;Hay que tener en cuenta que las funciones &lt;strong&gt;nunca&lt;/strong&gt; se van a ejecutar por sí solas. Es decir, debemos &lt;strong&gt;llamar&lt;/strong&gt; a la propia función desde otra parte del código para que se ejecute y se procese.&lt;/p&gt;
&lt;p&gt;Aunque esto puede parece algo nuevo, ya hemos estado utiilzando funciones preconstruidas, como por ejemplo&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;print()&lt;/li&gt;
&lt;li&gt;dir()&lt;/li&gt;
&lt;li&gt;type()&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Vamos a definir una funcion muy simple. Se utiliza «&lt;code&gt;def&lt;/code&gt;» para definir una función:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;def hola():
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; print (&amp;#34;Hola, soy una función&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Con la función definida sin más, no se va a ejecutar nada, por lo que debemos llamarla para que se procese.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# Defino la función
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;def hola():
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; print (&amp;#34;Hola, soy una función&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# llamo a la funcion 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hola()
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;PS C:&amp;gt; python.exe .\funcion.py
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Hola, soy una función
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;A las funciones se les puede pasar &lt;strong&gt;parámetros&lt;/strong&gt;. Reutilizando el ejemplo anterior, vamos a pasarle un string para que lo procese e imprima.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# Defino la función
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;def hola(parametro):
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; print (&amp;#34;Hola, soy una función. Me has pasado:&amp;#34; + parametro)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# llamo a la funcion 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hola(&amp;#34;UNO&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hola(&amp;#34;Otro test&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;PS C:&amp;gt; python.exe .\funcion.py
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Hola, soy una función. Me has pasado:UNO
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Hola, soy una función. Me has pasado:Otro test
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Lógicamente, en las funciones se pueden utilizar otras funciones, cualquier tipo de lógica, etc.&lt;/p&gt;
&lt;p&gt;Cuando en una función definimos un parámetro, este se hace «&lt;strong&gt;mandatory&lt;/strong&gt;«, es decir, que si llamamos a la función sin pasar un parámetro, nos va a mostrar un error.&lt;/p&gt;
&lt;p&gt;Para solucionar esto, podemos definir un valor &lt;strong&gt;por defecto&lt;/strong&gt; a la hora de definir la función, de forma que si se llama sin un valor, este coja el definido por defecto:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# Defino la función
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;def hola(parametro=&amp;#34;vacio&amp;#34;):
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; print (&amp;#34;Hola, soy una función. Me has pasado:&amp;#34; + parametro)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# llamo a la funcion 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hola()
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hola(&amp;#34;Otro test&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;PS C:&amp;gt; python.exe .\funcion.py
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Hola, soy una función. Me has pasado:vacio
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Hola, soy una función. Me has pasado:Otro test
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="return"&gt;return
&lt;/h2&gt;&lt;p&gt;Para que la función nos devuelve un parámetro, utilizarmos &lt;code&gt;return&lt;/code&gt;. En ese ejemplo vamos a crear una función para sumar dos números que pasemos como parámetros. Utilizamos también &lt;code&gt;print()&lt;/code&gt; para imprimir el resultado, ya que sino el valor devuelto únicamente quedaría alojado en memoria y no se mostraría en pantalla.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# Defino la función
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;def sumar(num1, num2):
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; return num1 + num2
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# llamo a la funcion, y imprimo el resultado
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;print(sumar(20,5))
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;PS C:&amp;gt; python.exe .\funcion.py
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;25
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;</description></item><item><title>Python 12 – Módulos</title><link>https://blog.rdiez.es/p/python-12-m%C3%B3dulos/</link><pubDate>Tue, 21 May 2019 00:00:00 +0000</pubDate><guid>https://blog.rdiez.es/p/python-12-m%C3%B3dulos/</guid><description>&lt;img src="https://blog.rdiez.es/p/python-12-m%C3%B3dulos/python-banner.jpg" alt="Featured image of post Python 12 – Módulos" /&gt;&lt;p&gt;A grandes rasgos, se puede entender como que son programas que forman parte de otro programa mayor. Se utilizan para poder &lt;strong&gt;reutilizar&lt;/strong&gt; partes de código que ya están desarrolladas y funcionando.&lt;/p&gt;
&lt;p&gt;Podemos diferenciar 3 grandes tipos:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;módulos de python preconstruidos&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;proporcionados por el propio lenguaje Python y accesibles directamente&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;módulos de terceros&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;desarrollados por la comunidad. pueden ser descargados desde internet o fuentes de terceros directamente&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;módulos propios&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;estos son los que desarrollamos por nosotros mismos&lt;/p&gt;
&lt;h2 id="módulos-python"&gt;módulos python
&lt;/h2&gt;&lt;p&gt;Se puede ver una lista de los módulos disponibles en:&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://docs.python.org/3/py-modindex.html" target="_blank" rel="noopener"
 &gt;https://docs.python.org/3/py-modindex.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;para importar un módulos utilizamos la palabra clave &lt;code&gt;import&lt;/code&gt;, y después el nombre del modulo.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-py" data-lang="py"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;tokenize&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Es importante conocer la documentación del módulo antes de poder utilizarlo, para saber su funcionamiento y forma de usarlo.&lt;/p&gt;
&lt;p&gt;Vamos a utilizar el módulo datetime como ejemplo: &lt;a class="link" href="https://docs.python.org/3.7/library/datetime.html" target="_blank" rel="noopener"
 &gt;https://docs.python.org/3.7/library/datetime.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;lo importamos, y utilizamos la función &lt;code&gt;date.today&lt;/code&gt; del propio módulo, lo cual nos devuelve la fecha actual:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;import datetime
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;print(datetime.date.today())
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;PS C:&amp;gt; python.exe .\modulos.py
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2019-05-23
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Otro ejemplo utilizando &lt;code&gt;timedelta()&lt;/code&gt;, al cual le pasamos 3700 segundos, y nos lo transforma en tiempo «humano» 1h 1min 40 seg.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;import datetime
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;print(datetime.timedelta(seconds=3700))
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;PS C:&amp;gt; python.exe .\modulos.py
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1:01:40
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Podemos especificar qué modulo concreto queremos importar con &lt;code&gt;from &lt;/code&gt;x &lt;code&gt;import &lt;/code&gt;x, en lugar de importar todo el módulo. Hay que prestar atención a la forma de llamarlo si utilizamos este método.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;from datetime import timedelta
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;print(timedelta(seconds=3700))
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="modulos-propios"&gt;modulos propios
&lt;/h2&gt;&lt;p&gt;vamos a crear un módulo propio que se va a llamar &lt;code&gt;mod_operaciones.py&lt;/code&gt;, en el que vamos a definir una serie de funciones que nos permita efectuar operaciones con números:&lt;/p&gt;
&lt;p&gt;Para ello, creamos un nuevo fichero llamado &lt;code&gt;mod_operaciones.py&lt;/code&gt; dentro de la ruta de nuestro programa, y con el siguiente contenido&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;def suma (n1, n2):
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; print (n1 + n2)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;def resta (n1, n2):
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; print (n1 - n2)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;en el fichero anterior, &lt;code&gt;modulos.py&lt;/code&gt;, vamos a importar este módulo y llamar a la función de &lt;code&gt;suma&lt;/code&gt;. Le pasamos como valores 3 y 5:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;import mod_operaciones
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mod_operaciones.suma(3,5)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;PS C:&amp;gt; python.exe .\modulos.py
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;8
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="modulos-de-terceros"&gt;modulos de terceros
&lt;/h2&gt;&lt;p&gt;Se pueden ver módulos de terceros que podemos reutilizar, en el siguiente enlace:&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://pypi.org/" target="_blank" rel="noopener"
 &gt;https://pypi.org/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Estos módulos pueden descargarse e instalarse directamente con la utilidad &lt;strong&gt;&lt;code&gt;PIP&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Por ejemplo, vamos a instalar el módulo bloodyterminal: &lt;a class="link" href="https://pypi.org/project/bloodyterminal/" target="_blank" rel="noopener"
 &gt;https://pypi.org/project/bloodyterminal/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;es tan simple como lanzar el siguiente comando en la terminal: &lt;code&gt;pip install bloodyterminal&lt;/code&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;PS&lt;/span&gt; &lt;span class="n"&gt;C&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;pip&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="n"&gt;bloodyterminal&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Collecting&lt;/span&gt; &lt;span class="n"&gt;bloodyterminal&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Downloading&lt;/span&gt; &lt;span class="n"&gt;https&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;files&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pythonhosted&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;packages&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;d1&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="n"&gt;cbc37ba8e6edbe1e9004f94a7301b4a70694d2b90e045be2cd836fd4362&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;bloodyterminal&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;4.0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tar&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;gz&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Requirement&lt;/span&gt; &lt;span class="n"&gt;already&lt;/span&gt; &lt;span class="n"&gt;satisfied&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;colorama&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;\&lt;span class="n"&gt;users&lt;/span&gt;\&lt;span class="mi"&gt;50034411&lt;/span&gt;\&lt;span class="n"&gt;appdata&lt;/span&gt;\&lt;span class="n"&gt;roaming&lt;/span&gt;\&lt;span class="n"&gt;python&lt;/span&gt;\&lt;span class="n"&gt;python37&lt;/span&gt;\&lt;span class="n"&gt;site&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;packages&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;from&lt;/span&gt; &lt;span class="n"&gt;bloodyterminal&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.4&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Installing&lt;/span&gt; &lt;span class="n"&gt;collected&lt;/span&gt; &lt;span class="n"&gt;packages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;bloodyterminal&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Running&lt;/span&gt; &lt;span class="n"&gt;setup&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;bloodyterminal&lt;/span&gt; &lt;span class="err"&gt;…&lt;/span&gt; &lt;span class="n"&gt;done&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Successfully&lt;/span&gt; &lt;span class="n"&gt;installed&lt;/span&gt; &lt;span class="n"&gt;bloodyterminal&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;4.0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Con esto, el módulo ya queda disponible para que podamos utilizarlo&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;from bloodyterminal import btext
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;btext.success(&amp;#34;Esto es un texto formateado como success&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;PS C:&amp;gt; python.exe .\modulos.py
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[SUCCESS] Esto es un texto formateado como success
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;</description></item><item><title>Python 10 – Bucles (For / While)</title><link>https://blog.rdiez.es/p/python-10-bucles-for-/-while/</link><pubDate>Mon, 20 May 2019 00:00:00 +0000</pubDate><guid>https://blog.rdiez.es/p/python-10-bucles-for-/-while/</guid><description>&lt;img src="https://blog.rdiez.es/p/python-10-bucles-for-/-while/python-banner.jpg" alt="Featured image of post Python 10 – Bucles (For / While)" /&gt;&lt;p&gt;Son tipos de estructuras de &lt;strong&gt;control de flujo&lt;/strong&gt;, que funcionan de forma diferente a los &lt;code&gt;if / else&lt;/code&gt;. En este caso, se indica un loop, bucle, o &lt;strong&gt;repetición&lt;/strong&gt; que durará mientras se cumpla determinada condición.&lt;/p&gt;
&lt;h2 id="for"&gt;for
&lt;/h2&gt;&lt;p&gt;For se utiliza para recorrer todos los &lt;strong&gt;elementos&lt;/strong&gt; de una lista, de uno en uno, y ejecutar acciones sobre cada uno de sus elementos.&lt;/p&gt;
&lt;p&gt;Vamos a verlo con un ejemplo. Supongamos que tenemos una lista de colores:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;colores = [&amp;#39;azul&amp;#39;,&amp;#39;rojo&amp;#39;,&amp;#39;amarillo&amp;#39;,&amp;#39;verde&amp;#39;]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Si quisieramos imprimir los valores que se encuentran en cada uno de sus incides, podríamos scribirlo así:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;print(colores[0])
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;print(colores[1])
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;print(colores[2])
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;print(colores[3])
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Si añadieramos otro elemento más a la lista, tendríamos que definir una nueva sentencia &lt;code&gt;print()&lt;/code&gt; con su nuevo índice para que se imprima.&lt;/p&gt;
&lt;p&gt;Esto podríamos hacerlo de manera mucho más simple y controlada utilizando for:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;colores = [&amp;#39;azul&amp;#39;,&amp;#39;rojo&amp;#39;,&amp;#39;amarillo&amp;#39;,&amp;#39;verde&amp;#39;]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;for color in colores:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; print(color)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;PS C:&amp;gt; python .\bucles.py
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;azul
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rojo
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;amarillo
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;verde
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Esto significaría: para cada elemento (que vamos a llamar &lt;em&gt;color&lt;/em&gt;), de la lista &lt;em&gt;colores&lt;/em&gt;, haz un &lt;code&gt;print()&lt;/code&gt; del elemento.&lt;/p&gt;
&lt;p&gt;Lógicamente, dentro de for se puede utilizar otro tipo de estructuras según nuestras necesidades. Por ejemplo, podemos &lt;strong&gt;parar&lt;/strong&gt; el programa cuando el color sea amarillo.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;colores = [&amp;#39;azul&amp;#39;,&amp;#39;rojo&amp;#39;,&amp;#39;amarillo&amp;#39;,&amp;#39;verde&amp;#39;]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;for color in colores:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; if color == &amp;#39;amarillo&amp;#39;:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; break
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; print(color)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;PS C:&amp;gt; python .\bucles.py
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;azul
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rojo 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Otro ejemplo de &lt;code&gt;for&lt;/code&gt;. Vamos a imprimir un &lt;em&gt;rango&lt;/em&gt; de números, del 1 al 5, ayudándonos del constructor &lt;code&gt;range()&lt;/code&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;for num in range(1, 5):
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; print(num)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;PS C:&amp;gt; python .\bucles.py
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;3
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;4 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;code&gt;for&lt;/code&gt; también funciona con los difererentes caracteres de un &lt;strong&gt;string&lt;/strong&gt;, por ejemplo:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;span class="lnt"&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;for letra in &amp;#34;Python&amp;#34;:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; print(letra)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;PS C:&amp;gt; python .\bucles.py
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;P
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;y
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;t
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;h
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;o
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;n
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="while"&gt;while
&lt;/h2&gt;&lt;p&gt;Es un loop algo parecido a &lt;code&gt;for&lt;/code&gt;, aunque en este caso se recorren los elementos &lt;strong&gt;MIENTRAS&lt;/strong&gt; la condición dada sea cierta. Se podría ver como un &lt;code&gt;for&lt;/code&gt; condicional. Hay que tener cuidado con los &lt;code&gt;while&lt;/code&gt;, ya que una vez que se ejecuta, vuelve al inicio, por lo que hay que asegurarse que tenemos algún mecanismo de &lt;strong&gt;control&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Así en un par de lineas parece complejo, pero como siempre, vamos a verlo con un ejemplo: Vamos a definir un &lt;em&gt;número&lt;/em&gt;. Mientras este numero sea &lt;em&gt;inferior&lt;/em&gt; a 10, lo &lt;em&gt;imprimimos&lt;/em&gt;. Ya que numero es un valor fijo, el bucle se repitiría &lt;strong&gt;infinitamente&lt;/strong&gt; con el mismo valor, por lo que nos aseguramos de que tras cada ejecución, el valor de numero de &lt;em&gt;incremente&lt;/em&gt;. En el momento que el número sea 10, la condición del while ya no se cumple, por lo que se salta el bucle.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;count = 20
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;while count &amp;lt; 10:numero = 2
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;while numero &amp;lt; 10:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; print(numero)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; numero = numero +1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;PS C:&amp;gt; python .\bucles.py
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;3
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;4
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;5
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;6
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;7
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;8
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;9 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;</description></item><item><title>Python 8 – Diccionarios</title><link>https://blog.rdiez.es/p/python-8-diccionarios/</link><pubDate>Sat, 18 May 2019 00:00:00 +0000</pubDate><guid>https://blog.rdiez.es/p/python-8-diccionarios/</guid><description>&lt;img src="https://blog.rdiez.es/p/python-8-diccionarios/python-banner.jpg" alt="Featured image of post Python 8 – Diccionarios" /&gt;&lt;p&gt;Los diccionarios son un tipo de dato que nos permite definir su contenido en base a &lt;strong&gt;claves&lt;/strong&gt; y &lt;strong&gt;valores&lt;/strong&gt;. Se suelen utilizar para definir objetos de la vida real (productos, objetos, personas, etc)&lt;/p&gt;
&lt;p&gt;Se puede definir en una sóla línea, aunque es mucho más legible si lo hacemos en varias.&lt;/p&gt;
&lt;p&gt;Los dictionarios tambien se pueden incluir dentro de listas. Como vimos , previamente, una lista puede contener elementos de cualquier tipo.&lt;/p&gt;
&lt;p&gt;Por ejemplo, para definir artículos en una tienda:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dictio = {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;articulo&amp;#34;: &amp;#34;procesador&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;cantidad&amp;#34;: 1,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;precio&amp;#34;: 165
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;descripcion&amp;#34;: &amp;#34;Procesador Ryzen 2600 a 3.4MHz&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="métodos"&gt;Métodos
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;gt;&amp;gt;&amp;gt; dir(dict)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[&amp;#39;__class__&amp;#39;, &amp;#39;__contains__&amp;#39;, &amp;#39;__delattr__&amp;#39;, &amp;#39;__delitem__&amp;#39;, &amp;#39;__dir__&amp;#39;, &amp;#39;__doc__&amp;#39;, &amp;#39;__eq__&amp;#39;, &amp;#39;__format__&amp;#39;, &amp;#39;__ge__&amp;#39;, &amp;#39;__getattribute__&amp;#39;, &amp;#39;__getitem__&amp;#39;, &amp;#39;__gt__&amp;#39;, &amp;#39;__hash__&amp;#39;, &amp;#39;__init__&amp;#39;, &amp;#39;__init_subclass__&amp;#39;, &amp;#39;__iter__&amp;#39;, &amp;#39;__le__&amp;#39;, &amp;#39;__len__&amp;#39;, &amp;#39;__lt__&amp;#39;, &amp;#39;__ne__&amp;#39;, &amp;#39;__new__&amp;#39;, &amp;#39;__reduce__&amp;#39;, &amp;#39;__reduce_ex__&amp;#39;, &amp;#39;__repr__&amp;#39;, &amp;#39;__setattr__&amp;#39;, &amp;#39;__setitem__&amp;#39;, &amp;#39;__sizeof__&amp;#39;, &amp;#39;__str__&amp;#39;, &amp;#39;__subclasshook__&amp;#39;, &amp;#39;clear&amp;#39;, &amp;#39;copy&amp;#39;, &amp;#39;fromkeys&amp;#39;, &amp;#39;get&amp;#39;, &amp;#39;items&amp;#39;, &amp;#39;keys&amp;#39;, &amp;#39;pop&amp;#39;, &amp;#39;popitem&amp;#39;, &amp;#39;setdefault&amp;#39;, &amp;#39;update&amp;#39;, &amp;#39;values&amp;#39;]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="keys"&gt;.keys
&lt;/h3&gt;&lt;p&gt;sirve para mostrar los indices del diccionario:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;span class="lnt"&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dictio = {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;articulo&amp;#34;: &amp;#34;procesador&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;cantidad&amp;#34;: 1,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;precio&amp;#34;: 165,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;descripcion&amp;#34;: &amp;#34;Procesador Ryzen 2600 a 3.4MHz&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;print(dictio.keys())
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;PS C:\&amp;gt; python dictio.py
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; dict_keys([&amp;#39;articulo&amp;#39;, &amp;#39;cantidad&amp;#39;, &amp;#39;precio&amp;#39;, &amp;#39;descripcion&amp;#39;])
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="items"&gt;.items
&lt;/h3&gt;&lt;p&gt;Nos muestra las keys y valores de todos los elementos:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;span class="lnt"&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dictio = {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;articulo&amp;#34;: &amp;#34;procesador&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;cantidad&amp;#34;: 1,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;precio&amp;#34;: 165,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;descripcion&amp;#34;: &amp;#34;Procesador Ryzen 2600 a 3.4MHz&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;print(dictio.items())
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;PS C:\&amp;gt; python dictio.py
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; dict_items([(&amp;#39;articulo&amp;#39;, &amp;#39;procesador&amp;#39;), (&amp;#39;cantidad&amp;#39;, 1), (&amp;#39;precio&amp;#39;, 165), (&amp;#39;descripcion&amp;#39;, &amp;#39;Procesador Ryzen 2600 a 3.4MHz&amp;#39;)])
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="del"&gt;del
&lt;/h3&gt;&lt;p&gt;Sirve para borrar al igual que lo vimos con las listas o las tuplas&lt;/p&gt;
&lt;h3 id="clean"&gt;.clean
&lt;/h3&gt;&lt;p&gt;Sirve para borrar al igual que lo vimos con las listas o las tuplas&lt;/p&gt;</description></item><item><title>Python 9 – Condicionales (If / Else / Elsif)</title><link>https://blog.rdiez.es/p/python-9-condicionales-if-/-else-/-elsif/</link><pubDate>Sat, 18 May 2019 00:00:00 +0000</pubDate><guid>https://blog.rdiez.es/p/python-9-condicionales-if-/-else-/-elsif/</guid><description>&lt;img src="https://blog.rdiez.es/p/python-9-condicionales-if-/-else-/-elsif/python-banner.jpg" alt="Featured image of post Python 9 – Condicionales (If / Else / Elsif)" /&gt;&lt;p&gt;Los condicionales son mecanismos que nos van a permitir controlar el &lt;strong&gt;flujo&lt;/strong&gt; del programa, ejecutando ciertas partes del código únicamente bajo ciertas condiciones que nos interesen&lt;/p&gt;
&lt;h2 id="operadores-de-comparación"&gt;Operadores de comparación
&lt;/h2&gt;&lt;p&gt;Son operadores especiales que nos devuelven un booleano (&lt;code&gt;True &lt;/code&gt;/ &lt;code&gt;False&lt;/code&gt;)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;mayor&lt;/strong&gt; &lt;code&gt;&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;gt;&amp;gt;&amp;gt; 2 &amp;gt; 4
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;False
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;menor&lt;/strong&gt; &lt;code&gt;&amp;lt;&lt;/code&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;gt;&amp;gt;&amp;gt; 2 &amp;lt; 4
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;True
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;igual&lt;/strong&gt; &lt;code&gt;==&lt;/code&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;gt;&amp;gt;&amp;gt; 2 == 4
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;False
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Tambien se puede utilizar con otros tipos de datos, como por ejemplo strings:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;gt;&amp;gt;&amp;gt; &amp;#34;hola&amp;#34; == &amp;#34;hola&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;True
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="if"&gt;if
&lt;/h2&gt;&lt;p&gt;Si la condición se cumple (&lt;code&gt;True&lt;/code&gt;), se ejecuta la sentencia, si no se cumple (&lt;code&gt;False&lt;/code&gt;), se salta el bloque &lt;code&gt;if &lt;/code&gt;y continúa la ejecución.&lt;/p&gt;
&lt;p&gt;Vamos a verlo en un ejemplo. Creamos una variable edad. Si la edad es menor de 65, aún no se puede jubilar:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;edad = 20
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; if edad &amp;lt; 65:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; print(&amp;#34;Aun no te puedes jubilar&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;PS C:&amp;gt; python .\condition.py
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Aun no te puedes jubilar
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;En este punto es &lt;strong&gt;importante&lt;/strong&gt; indicar que &lt;strong&gt;en Python se debe indentar correctamente&lt;/strong&gt; con cierto número de espacios, o tabuladores. Así, en este caso, la &lt;strong&gt;expresión&lt;/strong&gt; debe ir dentro de la declaración del &lt;strong&gt;if&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;En este caso, vamos a poner 70 como edad. En este caso, como no se cumple la condición, se salta el bloque if:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;edad = 70
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; if edad &amp;lt; 65:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; print(&amp;#34;Aun no te puedes jubilar&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; print(&amp;#34;He terminado&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;PS C:&amp;gt; python .\condition.py
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;He terminado
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="if--else"&gt;if / Else
&lt;/h2&gt;&lt;p&gt;En este caso, si no se cumple la condición del &lt;code&gt;if&lt;/code&gt;, se ejecuta la indicada en el bloque &lt;code&gt;else&lt;/code&gt;. Importante tener en cuenta la &lt;strong&gt;indentación&lt;/strong&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;span class="lnt"&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;edad = 70
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; if edad &amp;lt; 65:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; print(&amp;#34;Aun no te puedes jubilar&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; else:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; print(&amp;#34;Ya te puedes jubilar&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; print(&amp;#34;He terminado&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;PS C:&amp;gt; python .\condition.py
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Ya te puedes jubilar
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;He terminado
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Modificamos únicamente el valor de edad:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;span class="lnt"&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;edad = 30
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; if edad &amp;lt; 65:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; print(&amp;#34;Aun no te puedes jubilar&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; else:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; print(&amp;#34;Ya te puedes jubilar&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; print(&amp;#34;He terminado&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;PS C:&amp;gt; python .\condition.py
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Aun no te puedes jubilar
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;He terminado
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="elif"&gt;elif
&lt;/h2&gt;&lt;p&gt;Permite hacer otra comparación adicional de tipo «&lt;code&gt;if&lt;/code&gt;«, antes de saltar al &lt;code&gt;else&lt;/code&gt;. Se pueden utilizar tantos &lt;code&gt;elif &lt;/code&gt;como sea necesario antes de &lt;code&gt;else&lt;/code&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;edad = 18
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; if edad &amp;lt; 65:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; print(&amp;#34;Aun no te puedes jubilar&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; if edad == 18:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; print(&amp;#34;Te queda mucho por cotizar&amp;#34;) 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; else:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; print(&amp;#34;Ya te puedes jubilar&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; print(&amp;#34;He terminado&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;PS C:&amp;gt; python .\condition.py
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Aun no te puedes jubilar
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Te queda mucho por cotizar
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;He terminado
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="operadores-lógicos"&gt;Operadores lógicos
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;and&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;or&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;not&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Los operadores lógicos son otro tipo que nos ayudan a hacer mucho más claro y rápido el código.&lt;/p&gt;
&lt;p&gt;Podemos escribir el tipo de código que hemos estado viendo hasta ahora, utilizando operadores lógicos de forma que nos quede en una sóla línea. Mejor verlo directamente en un ejemplo….&lt;/p&gt;
&lt;p&gt;Vamos a verificar si un número está entre 10 y 20. Podemos escribirlo como hemos visto hasta ahora:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;numero = 15
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; if numero &amp;gt; 10:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; if numero &amp;lt; 20:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; print (&amp;#34;el numero está entre 10 y 20&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;o utilizando los operadores lógicos:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;if numero &amp;gt; 10 and numero &amp;lt; 20:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; print (&amp;#34;el numero está entre 10 y 20&amp;#34;) 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Otro ejemplo, en este caso si el número es mayor que 10, pero el número no es 20, nos muestra el mensaje&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;if numero &amp;gt; 10 and not numero == 20:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; print (&amp;#34;el numero es mayor que 10 pero no es 20&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;PS C:&amp;gt; python .\condition.py
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;el numero es mayor que 10 pero no es 20
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;</description></item><item><title>Python 7 – Sets</title><link>https://blog.rdiez.es/p/python-7-sets/</link><pubDate>Fri, 17 May 2019 00:00:00 +0000</pubDate><guid>https://blog.rdiez.es/p/python-7-sets/</guid><description>&lt;img src="https://blog.rdiez.es/p/python-7-sets/python-banner.jpg" alt="Featured image of post Python 7 – Sets" /&gt;&lt;p&gt;Es un tipo de datos similar a las listas o tuplas, pero con algunas particularidades. Son conjuntos de datos desordenados, &lt;strong&gt;no tienen un índice&lt;/strong&gt;. Se identifican con &lt;code&gt;{}&lt;/code&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;set = {&amp;#39;uno&amp;#39;,&amp;#39;dos&amp;#39;,&amp;#39;tres&amp;#39;,&amp;#39;cuatro&amp;#39;}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;print(set)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;print(type(set))
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;C:\&amp;gt;python set.py
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;{&amp;#39;tres&amp;#39;, &amp;#39;cuatro&amp;#39;, &amp;#39;uno&amp;#39;, &amp;#39;dos&amp;#39;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="métodos"&gt;Métodos
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;gt;&amp;gt;&amp;gt; dir(set)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[&amp;#39;__and__&amp;#39;, &amp;#39;__class__&amp;#39;, &amp;#39;__contains__&amp;#39;, &amp;#39;__delattr__&amp;#39;, &amp;#39;__dir__&amp;#39;, &amp;#39;__doc__&amp;#39;, &amp;#39;__eq__&amp;#39;, &amp;#39;__format__&amp;#39;, &amp;#39;__ge__&amp;#39;, &amp;#39;__getattribute__&amp;#39;, &amp;#39;__gt__&amp;#39;, &amp;#39;__hash__&amp;#39;, &amp;#39;__iand__&amp;#39;, &amp;#39;__init__&amp;#39;, &amp;#39;__init_subclass__&amp;#39;, &amp;#39;__ior__&amp;#39;, &amp;#39;__isub__&amp;#39;, &amp;#39;__iter__&amp;#39;, &amp;#39;__ixor__&amp;#39;, &amp;#39;__le__&amp;#39;, &amp;#39;__len__&amp;#39;, &amp;#39;__lt__&amp;#39;, &amp;#39;__ne__&amp;#39;, &amp;#39;__new__&amp;#39;, &amp;#39;__or__&amp;#39;, &amp;#39;__rand__&amp;#39;, &amp;#39;__reduce__&amp;#39;, &amp;#39;__reduce_ex__&amp;#39;, &amp;#39;__repr__&amp;#39;, &amp;#39;__ror__&amp;#39;, &amp;#39;__rsub__&amp;#39;, &amp;#39;__rxor__&amp;#39;, &amp;#39;__setattr__&amp;#39;, &amp;#39;__sizeof__&amp;#39;, &amp;#39;__str__&amp;#39;, &amp;#39;__sub__&amp;#39;, &amp;#39;__subclasshook__&amp;#39;, &amp;#39;__xor__&amp;#39;, &amp;#39;add&amp;#39;, &amp;#39;clear&amp;#39;, &amp;#39;copy&amp;#39;, &amp;#39;difference&amp;#39;, &amp;#39;difference_update&amp;#39;, &amp;#39;discard&amp;#39;, &amp;#39;intersection&amp;#39;, &amp;#39;intersection_update&amp;#39;, &amp;#39;isdisjoint&amp;#39;, &amp;#39;issubset&amp;#39;, &amp;#39;issuperset&amp;#39;, &amp;#39;pop&amp;#39;, &amp;#39;remove&amp;#39;, &amp;#39;symmetric_difference&amp;#39;, &amp;#39;symmetric_difference_update&amp;#39;, &amp;#39;union&amp;#39;, &amp;#39;update&amp;#39;]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;gt;&amp;gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h4 id="in"&gt;in
&lt;/h4&gt;&lt;p&gt;Verifica si existe el valor dentro del set. Su resultado es un Booleano:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;set = {&amp;#39;uno&amp;#39;,&amp;#39;dos&amp;#39;,&amp;#39;tres&amp;#39;,&amp;#39;cuatro&amp;#39;}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;print(&amp;#39;dos&amp;#39; in set)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;C:\&amp;gt;python set.py
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;True
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h4 id="add"&gt;.add
&lt;/h4&gt;&lt;p&gt;Al no tener índice, los datos son añadidos, pero no se mantiene ningún orden como sí ocurre con las listas.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;set = {&amp;#39;uno&amp;#39;,&amp;#39;dos&amp;#39;,&amp;#39;tres&amp;#39;,&amp;#39;cuatro&amp;#39;}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;set.add(&amp;#39;Nuevo&amp;#39;)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;print(set)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;C:\&amp;gt;python set.py
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;{&amp;#39;Nuevo&amp;#39;, &amp;#39;uno&amp;#39;, &amp;#39;tres&amp;#39;, &amp;#39;dos&amp;#39;, &amp;#39;cuatro&amp;#39;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h4 id="remove"&gt;.remove
&lt;/h4&gt;&lt;p&gt;Para borrar elementos:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;set = {&amp;#39;uno&amp;#39;,&amp;#39;dos&amp;#39;,&amp;#39;tres&amp;#39;,&amp;#39;cuatro&amp;#39;}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;set.remove(&amp;#39;tres&amp;#39;)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;print(set)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;C:\&amp;gt;python set.py
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;{&amp;#39;dos&amp;#39;, &amp;#39;uno&amp;#39;, &amp;#39;cuatro&amp;#39;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h4 id="clear"&gt;.clear
&lt;/h4&gt;&lt;p&gt;Vacía el set, eliminando todos sus elementos&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;set = {&amp;#39;uno&amp;#39;,&amp;#39;dos&amp;#39;,&amp;#39;tres&amp;#39;,&amp;#39;cuatro&amp;#39;}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;set.clear()
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;print(set)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;C:\&amp;gt;python set.py
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;set()
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h4 id="del"&gt;.del
&lt;/h4&gt;&lt;p&gt;Elimina el set por completo.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;set = {&amp;#39;uno&amp;#39;,&amp;#39;dos&amp;#39;,&amp;#39;tres&amp;#39;,&amp;#39;cuatro&amp;#39;}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;del set
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;print(set)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;C:\&amp;gt;python set.py
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;</description></item><item><title>Python 6 – Tuplas</title><link>https://blog.rdiez.es/p/python-6-tuplas/</link><pubDate>Thu, 16 May 2019 00:00:00 +0000</pubDate><guid>https://blog.rdiez.es/p/python-6-tuplas/</guid><description>&lt;img src="https://blog.rdiez.es/p/python-6-tuplas/python-banner.jpg" alt="Featured image of post Python 6 – Tuplas" /&gt;&lt;p&gt;Son un tipo de datos muy parecido a las listas, pero con la excepción de que las tuplas no pueden ser modificadas. Son inmutables. Se identifican por los paréntesis &lt;code&gt;()&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Su ventaja es que son más rápidas, y más seguras.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tupla = (1, 2, 3)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;print(tupla)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;print(type(tupla))
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;C:\&amp;gt;python tuplas.py
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;(1, 2, 3)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Para definir una tupla, se puede hacer de forma literal: &lt;code&gt;tupla = (1, 2, 3)&lt;/code&gt;, o mediante el constructor &lt;code&gt;tuple()&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Al igual que en las listas, podemos acceder a cualquier elemento de una tupla&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tupla = (10, 20, 30, 40)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;print(tupla[2])
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;C:\&amp;gt;python tuplas.py
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;30
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="métodos"&gt;Métodos
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;gt;&amp;gt;&amp;gt; dir(tuple)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[&amp;#39;__add__&amp;#39;, &amp;#39;__class__&amp;#39;, &amp;#39;__contains__&amp;#39;, &amp;#39;__delattr__&amp;#39;, &amp;#39;__dir__&amp;#39;, &amp;#39;__doc__&amp;#39;, &amp;#39;__eq__&amp;#39;, &amp;#39;__format__&amp;#39;, &amp;#39;__ge__&amp;#39;, &amp;#39;__getattribute__&amp;#39;, &amp;#39;__getitem__&amp;#39;, &amp;#39;__getnewargs__&amp;#39;, &amp;#39;__gt__&amp;#39;, &amp;#39;__hash__&amp;#39;, &amp;#39;__init__&amp;#39;, &amp;#39;__init_subclass__&amp;#39;, &amp;#39;__iter__&amp;#39;, &amp;#39;__le__&amp;#39;, &amp;#39;__len__&amp;#39;, &amp;#39;__lt__&amp;#39;, &amp;#39;__mul__&amp;#39;, &amp;#39;__ne__&amp;#39;, &amp;#39;__new__&amp;#39;, &amp;#39;__reduce__&amp;#39;, &amp;#39;__reduce_ex__&amp;#39;, &amp;#39;__repr__&amp;#39;, &amp;#39;__rmul__&amp;#39;, &amp;#39;__setattr__&amp;#39;, &amp;#39;__sizeof__&amp;#39;, &amp;#39;__str__&amp;#39;, &amp;#39;__subclasshook__&amp;#39;, &amp;#39;count&amp;#39;, &amp;#39;index&amp;#39;]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;gt;&amp;gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h4 id="del"&gt;del
&lt;/h4&gt;&lt;p&gt;Podemos borrar la tupla por completo:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tupla = (10, 20, 30, 40)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;del tupla
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;print(tupla)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;C:\&amp;gt;python tuplas.py
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Traceback (most recent call last):
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; File &amp;#34;tuplas.py&amp;#34;, line 4, in 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; print(tupla)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;NameError: name &amp;#39;tupla&amp;#39; is not defined
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;No tiene mucho sentido extenderse con este tema, porque como ya hemos dicho previamente, es un tipo de datos muy, muy similar a las listas, con la excepción de que son inmutables.&lt;/p&gt;</description></item><item><title>Python 5 – Listas</title><link>https://blog.rdiez.es/p/python-5-listas/</link><pubDate>Wed, 15 May 2019 00:00:00 +0000</pubDate><guid>https://blog.rdiez.es/p/python-5-listas/</guid><description>&lt;img src="https://blog.rdiez.es/p/python-5-listas/python-banner.jpg" alt="Featured image of post Python 5 – Listas" /&gt;&lt;p&gt;Una lista puede contener cualquier tipo de elementos, incluso listas dentro de otras listas.&lt;/p&gt;
&lt;p&gt;Vamos a poner un ejemplo de una lista que contenga varios tipos distintos de elementos:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;un entero&lt;/li&gt;
&lt;li&gt;un string&lt;/li&gt;
&lt;li&gt;un float&lt;/li&gt;
&lt;li&gt;un boleano&lt;/li&gt;
&lt;li&gt;una lista&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;lista1 = [2, &amp;#34;texto&amp;#34;, 55.7, False, [2, 4, 6]]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;El &lt;strong&gt;constructor&lt;/strong&gt; es una función que nos va a permitir construir una lista. En este caso, pasamos una &lt;strong&gt;&lt;code&gt;tupla ()&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;lista2 = list((2, 4, 6, 8))
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; print(lista2)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;C:&amp;gt;python lists.py
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[2, 4, 6, 8]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h4 id="range"&gt;&lt;strong&gt;range()&lt;/strong&gt;
&lt;/h4&gt;&lt;p&gt;Esta función nos permite generar una lista mediante un rango de datos. En este ejemplo, una lista con elementos de 1 a 10&lt;/p&gt;
&lt;p&gt;Hay que tener en cuenta que el rango final no es incluido en la lista&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;lista = list(range(1,10))
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; print(lista)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;C:&amp;gt;python lists.py
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[1, 2, 3, 4, 5, 6, 7, 8, 9]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;igual que con los &lt;a class="link" href="https://blog.rdiez.es/python-3-strings" target="_blank" rel="noopener"
 &gt;strings&lt;/a&gt;, podemos ver el elemento en la posición que nos interesa. Teniendo que en cuenta que se &lt;strong&gt;inicia el index en 0&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;lista = [&amp;#34;uno&amp;#34;, &amp;#34;dos&amp;#34;, &amp;#34;tres&amp;#34;, &amp;#34;cuatro&amp;#34;]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;print(lista)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;print(lista[2])
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;C:&amp;gt;python lists.py
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[&amp;#39;uno&amp;#39;, &amp;#39;dos&amp;#39;, &amp;#39;tres&amp;#39;, &amp;#39;cuatro&amp;#39;]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tres
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h4 id="in"&gt;in
&lt;/h4&gt;&lt;p&gt;Para saber si un elemento existe dentro de una lista:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;lista = [&amp;#34;uno&amp;#34;, &amp;#34;dos&amp;#34;, &amp;#34;tres&amp;#34;, &amp;#34;cuatro&amp;#34;]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;print(lista)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;print(&amp;#39;dos&amp;#39; in lista)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;C:&amp;gt;python lists.py
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[&amp;#39;uno&amp;#39;, &amp;#39;dos&amp;#39;, &amp;#39;tres&amp;#39;, &amp;#39;cuatro&amp;#39;]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;True
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;En las listas, los elementos se puede cambiar y &lt;strong&gt;modificar&lt;/strong&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;lista = [&amp;#34;uno&amp;#34;, &amp;#34;dos&amp;#34;, &amp;#34;tres&amp;#34;, &amp;#34;cuatro&amp;#34;]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; print(lista)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;lista[2] = &amp;#39;cambiado&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; print(lista)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;C:&amp;gt;python lists.py
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[&amp;#39;uno&amp;#39;, &amp;#39;dos&amp;#39;, &amp;#39;tres&amp;#39;, &amp;#39;cuatro&amp;#39;]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[&amp;#39;uno&amp;#39;, &amp;#39;dos&amp;#39;, &amp;#39;cambiado&amp;#39;, &amp;#39;cuatro&amp;#39;]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="métodos"&gt;métodos
&lt;/h2&gt;&lt;p&gt;Al igual que vimos previamente con los string, podemos ver los métodos que podemos aplicar a las listas:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dir(list)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; [&amp;#39;add&amp;#39;, &amp;#39;class&amp;#39;, &amp;#39;contains&amp;#39;, &amp;#39;delattr&amp;#39;, &amp;#39;delitem&amp;#39;, &amp;#39;dir&amp;#39;, &amp;#39;doc&amp;#39;, &amp;#39;eq&amp;#39;, &amp;#39;format&amp;#39;, &amp;#39;ge&amp;#39;, &amp;#39;getattribute&amp;#39;, &amp;#39;getitem&amp;#39;, &amp;#39;gt&amp;#39;, &amp;#39;hash&amp;#39;, &amp;#39;iadd&amp;#39;, &amp;#39;imul&amp;#39;, &amp;#39;init&amp;#39;, &amp;#39;init_subclass&amp;#39;, &amp;#39;iter&amp;#39;, &amp;#39;le&amp;#39;, &amp;#39;len&amp;#39;, &amp;#39;lt&amp;#39;, &amp;#39;mul&amp;#39;, &amp;#39;ne&amp;#39;, &amp;#39;new&amp;#39;, &amp;#39;reduce&amp;#39;, &amp;#39;reduce_ex&amp;#39;, &amp;#39;repr&amp;#39;, &amp;#39;reversed&amp;#39;, &amp;#39;rmul&amp;#39;, &amp;#39;setattr&amp;#39;, &amp;#39;setitem&amp;#39;, &amp;#39;sizeof&amp;#39;, &amp;#39;str&amp;#39;, &amp;#39;subclasshook&amp;#39;, &amp;#39;append&amp;#39;, &amp;#39;clear&amp;#39;, &amp;#39;copy&amp;#39;, &amp;#39;count&amp;#39;, &amp;#39;extend&amp;#39;, &amp;#39;index&amp;#39;, &amp;#39;insert&amp;#39;, &amp;#39;pop&amp;#39;, &amp;#39;remove&amp;#39;, &amp;#39;reverse&amp;#39;, &amp;#39;sort&amp;#39;]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h4 id="len"&gt;&lt;strong&gt;.len&lt;/strong&gt;
&lt;/h4&gt;&lt;p&gt;vemos el numero de elementos de la lista:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;lista = list(range(1,10))
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; print(lista)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;print(len(lista))
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;C:&amp;gt;python lists.py
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[1, 2, 3, 4, 5, 6, 7, 8, 9]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;9
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h4 id="append"&gt;&lt;strong&gt;.append&lt;/strong&gt;
&lt;/h4&gt;&lt;p&gt;añade un elemento al final de la lista&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;lista = [&amp;#34;uno&amp;#34;, &amp;#34;dos&amp;#34;, &amp;#34;tres&amp;#34;, &amp;#34;cuatro&amp;#34;]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; print(lista)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;lista.append(&amp;#39;nuevo&amp;#39;)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; print(lista)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;C:&amp;gt;python lists.py
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[&amp;#39;uno&amp;#39;, &amp;#39;dos&amp;#39;, &amp;#39;tres&amp;#39;, &amp;#39;cuatro&amp;#39;]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[&amp;#39;uno&amp;#39;, &amp;#39;dos&amp;#39;, &amp;#39;tres&amp;#39;, &amp;#39;cuatro&amp;#39;, &amp;#39;nuevo&amp;#39;]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h4 id="extend"&gt;&lt;strong&gt;.extend&lt;/strong&gt;
&lt;/h4&gt;&lt;p&gt;Añade varios elementos al final de la lista. Se le pasan dichos elementos dentro de una lista [] o de una tupla ().&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;lista = [&amp;#34;uno&amp;#34;, &amp;#34;dos&amp;#34;, &amp;#34;tres&amp;#34;, &amp;#34;cuatro&amp;#34;]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; print(lista)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;lista.extend([&amp;#39;nuevo&amp;#39;,&amp;#39;otro&amp;#39;])
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; print(lista)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;C:&amp;gt;python lists.py
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[&amp;#39;uno&amp;#39;, &amp;#39;dos&amp;#39;, &amp;#39;tres&amp;#39;, &amp;#39;cuatro&amp;#39;]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[&amp;#39;uno&amp;#39;, &amp;#39;dos&amp;#39;, &amp;#39;tres&amp;#39;, &amp;#39;cuatro&amp;#39;, &amp;#39;nuevo&amp;#39;, &amp;#39;otro&amp;#39;]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h4 id="insert"&gt;&lt;strong&gt;.insert&lt;/strong&gt;
&lt;/h4&gt;&lt;p&gt;Inserta un nuevo elemento en la posición de indice que le indiquemos.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;lista = [&amp;#34;uno&amp;#34;, &amp;#34;dos&amp;#34;, &amp;#34;tres&amp;#34;, &amp;#34;cuatro&amp;#34;]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; print(lista)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;lista.insert(1,&amp;#39;DOS&amp;#39;)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; print(lista)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;C:&amp;gt;python lists.py
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[&amp;#39;uno&amp;#39;, &amp;#39;dos&amp;#39;, &amp;#39;tres&amp;#39;, &amp;#39;cuatro&amp;#39;]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[&amp;#39;uno&amp;#39;, &amp;#39;DOS&amp;#39;, &amp;#39;dos&amp;#39;, &amp;#39;tres&amp;#39;, &amp;#39;cuatro&amp;#39;]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h4 id="pop"&gt;&lt;strong&gt;.pop&lt;/strong&gt;
&lt;/h4&gt;&lt;p&gt;Elimina un elemento del final de la lista. Si se le pasa un número de indice, elmina el elemento en esa posición.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;lista = [&amp;#34;uno&amp;#34;, &amp;#34;dos&amp;#34;, &amp;#34;tres&amp;#34;, &amp;#34;cuatro&amp;#34;]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; print(lista)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;lista.pop()
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; print(lista)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;C:&amp;gt;python lists.py
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[&amp;#39;uno&amp;#39;, &amp;#39;dos&amp;#39;, &amp;#39;tres&amp;#39;, &amp;#39;cuatro&amp;#39;]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[&amp;#39;uno&amp;#39;, &amp;#39;dos&amp;#39;, &amp;#39;tres&amp;#39;]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h4 id="remove"&gt;&lt;strong&gt;.remove&lt;/strong&gt;
&lt;/h4&gt;&lt;p&gt;Elimina un elemento indicado de la lista&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;lista = [&amp;#34;uno&amp;#34;, &amp;#34;dos&amp;#34;, &amp;#34;tres&amp;#34;, &amp;#34;cuatro&amp;#34;]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; print(lista)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;lista.remove(&amp;#39;dos&amp;#39;)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; print(lista)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;C:&amp;gt;python lists.py
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[&amp;#39;uno&amp;#39;, &amp;#39;dos&amp;#39;, &amp;#39;tres&amp;#39;, &amp;#39;cuatro&amp;#39;]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[&amp;#39;uno&amp;#39;, &amp;#39;tres&amp;#39;, &amp;#39;cuatro&amp;#39;]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h4 id="clear"&gt;&lt;strong&gt;.clear&lt;/strong&gt;
&lt;/h4&gt;&lt;p&gt;Borra todos los elementos de la lista, dejándola limpia&lt;/p&gt;
&lt;h4 id="sort"&gt;&lt;strong&gt;.sort&lt;/strong&gt;
&lt;/h4&gt;&lt;p&gt;Ordena los elementos de la lista&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;lista = [&amp;#34;uno&amp;#34;, &amp;#34;dos&amp;#34;, &amp;#34;tres&amp;#34;, &amp;#34;cuatro&amp;#34;]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; print(lista)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;lista.sort()
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; print(lista)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;C:&amp;gt;python lists.py
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[&amp;#39;uno&amp;#39;, &amp;#39;dos&amp;#39;, &amp;#39;tres&amp;#39;, &amp;#39;cuatro&amp;#39;]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[&amp;#39;cuatro&amp;#39;, &amp;#39;dos&amp;#39;, &amp;#39;tres&amp;#39;, &amp;#39;uno&amp;#39;]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Se puede utilizar la propiedad &lt;strong&gt;reserse&lt;/strong&gt; para ordenar los elementos al revés:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;lista.sort(reverse=True)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h4 id="count"&gt;&lt;strong&gt;.count&lt;/strong&gt;
&lt;/h4&gt;&lt;p&gt;Cuenta los elementos que hay en la lista.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;lista = [&amp;#34;uno&amp;#34;, &amp;#34;dos&amp;#34;, &amp;#34;tres&amp;#34;, &amp;#34;cuatro&amp;#34;]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; print(lista)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;print(lista.count(&amp;#39;tres&amp;#39;))
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;C:&amp;gt;python lists.py
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[&amp;#39;uno&amp;#39;, &amp;#39;dos&amp;#39;, &amp;#39;tres&amp;#39;, &amp;#39;cuatro&amp;#39;]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;</description></item><item><title>Python 4 – Numeros</title><link>https://blog.rdiez.es/p/python-4-numeros/</link><pubDate>Tue, 14 May 2019 00:00:00 +0000</pubDate><guid>https://blog.rdiez.es/p/python-4-numeros/</guid><description>&lt;img src="https://blog.rdiez.es/p/python-4-numeros/python-banner.jpg" alt="Featured image of post Python 4 – Numeros" /&gt;&lt;p&gt;En esta entrada vamos a ir profundizando más en Python despacito pero de forma firme, y vamos a conocer un poco más a fondo el tipo de datos numérico.&lt;/p&gt;
&lt;p&gt;Como siempre para ver qué tipo de dato es, podemos utilizar &lt;code&gt;type()&lt;/code&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;print(type(134))
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;C:\&amp;gt;python numbers.py
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;lt;class &amp;#39;int&amp;#39;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;print(type(134.67))
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;C:\&amp;gt;python numbers.py
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;lt;class &amp;#39;float&amp;#39;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Si se realizan operaciones entre enteros, el resultado es un &lt;strong&gt;entero&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Si se realizan operaciones entre enteros y un float, el resultado es un &lt;strong&gt;float&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="operadores"&gt;operadores
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;sumar&lt;/strong&gt; &lt;code&gt;+&lt;/code&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;gt;&amp;gt;&amp;gt; 2 + 2
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;4
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;restar&lt;/strong&gt; &lt;code&gt;-&lt;/code&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;gt;&amp;gt;&amp;gt; 6 - 1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;5
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;multiplicar&lt;/strong&gt; &lt;code&gt;*&lt;/code&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;gt;&amp;gt;&amp;gt; 3 * 2
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;6
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;dividir&lt;/strong&gt; &lt;code&gt;/&lt;/code&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;gt;&amp;gt;&amp;gt; 10/3
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;3.3333333333333335
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Elevar&lt;/strong&gt; (exponente) &lt;code&gt;**&lt;/code&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;gt;&amp;gt;&amp;gt; 2**4
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;16
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Esto es lo mismo que escribir:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;gt;&amp;gt;&amp;gt; 2 * 2 * 2 * 2
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;16
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;División entera&lt;/strong&gt;. &lt;code&gt;//&lt;/code&gt; Devuelve el valor entero de la división&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;gt;&amp;gt;&amp;gt; 10//3
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;3
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Módulo&lt;/strong&gt; &lt;code&gt;%&lt;/code&gt;. Devuelve el resto que sobra de la division entera&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;gt;&amp;gt;&amp;gt; 10 % 3
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="precedencia"&gt;Precedencia
&lt;/h2&gt;&lt;p&gt;Los operadores se resuelven con este orden de prioridad:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Paréntesis&lt;/li&gt;
&lt;li&gt;exponentes&lt;/li&gt;
&lt;li&gt;multiplicaciones&lt;/li&gt;
&lt;li&gt;divisiones&lt;/li&gt;
&lt;li&gt;porcentajes&lt;/li&gt;
&lt;li&gt;sumas&lt;/li&gt;
&lt;li&gt;restas&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Python 3 – Strings</title><link>https://blog.rdiez.es/p/python-3-strings/</link><pubDate>Mon, 13 May 2019 00:00:00 +0000</pubDate><guid>https://blog.rdiez.es/p/python-3-strings/</guid><description>&lt;img src="https://blog.rdiez.es/p/python-3-strings/python-banner.jpg" alt="Featured image of post Python 3 – Strings" /&gt;&lt;p&gt;La función &lt;strong&gt;&lt;code&gt;dir()&lt;/code&gt;&lt;/strong&gt; nos muestra lo que podemos hacer con el dato pasado como parámetro. Esto se conoce como métodos. Por ejemplo:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;dir(mi_string&lt;/code&gt;)&lt;/strong&gt; en consola de Python, o &lt;strong&gt;&lt;code&gt;print(dir(mi_string&lt;/code&gt;))&lt;/strong&gt; en un script&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;C:\&amp;gt;python strings.py
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[&amp;#39;__add__&amp;#39;, &amp;#39;__class__&amp;#39;, &amp;#39;__contains__&amp;#39;, &amp;#39;__delattr__&amp;#39;, &amp;#39;__dir__&amp;#39;, &amp;#39;__doc__&amp;#39;, &amp;#39;__eq__&amp;#39;, &amp;#39;__format__&amp;#39;, &amp;#39;__ge__&amp;#39;, &amp;#39;__getattribute__&amp;#39;, &amp;#39;__getitem__&amp;#39;, &amp;#39;__getnewargs__&amp;#39;, &amp;#39;__gt__&amp;#39;, &amp;#39;__hash__&amp;#39;, &amp;#39;__init__&amp;#39;, &amp;#39;__init_subclass__&amp;#39;, &amp;#39;__iter__&amp;#39;, &amp;#39;__le__&amp;#39;, &amp;#39;__len__&amp;#39;, &amp;#39;__lt__&amp;#39;, &amp;#39;__mod__&amp;#39;, &amp;#39;__mul__&amp;#39;, &amp;#39;__ne__&amp;#39;, &amp;#39;__new__&amp;#39;, &amp;#39;__reduce__&amp;#39;, &amp;#39;__reduce_ex__&amp;#39;, &amp;#39;__repr__&amp;#39;, &amp;#39;__rmod__&amp;#39;, &amp;#39;__rmul__&amp;#39;, &amp;#39;__setattr__&amp;#39;, &amp;#39;__sizeof__&amp;#39;, &amp;#39;__str__&amp;#39;, &amp;#39;__subclasshook__&amp;#39;, &amp;#39;capitalize&amp;#39;, &amp;#39;casefold&amp;#39;, &amp;#39;center&amp;#39;, &amp;#39;count&amp;#39;, &amp;#39;encode&amp;#39;, &amp;#39;endswith&amp;#39;, &amp;#39;expandtabs&amp;#39;, &amp;#39;find&amp;#39;, &amp;#39;format&amp;#39;, &amp;#39;format_map&amp;#39;, &amp;#39;index&amp;#39;, &amp;#39;isalnum&amp;#39;, &amp;#39;isalpha&amp;#39;, &amp;#39;isascii&amp;#39;, &amp;#39;isdecimal&amp;#39;, &amp;#39;isdigit&amp;#39;, &amp;#39;isidentifier&amp;#39;, &amp;#39;islower&amp;#39;, &amp;#39;isnumeric&amp;#39;, &amp;#39;isprintable&amp;#39;, &amp;#39;isspace&amp;#39;, &amp;#39;istitle&amp;#39;, &amp;#39;isupper&amp;#39;, &amp;#39;join&amp;#39;, &amp;#39;ljust&amp;#39;, &amp;#39;lower&amp;#39;, &amp;#39;lstrip&amp;#39;, &amp;#39;maketrans&amp;#39;, &amp;#39;partition&amp;#39;, &amp;#39;replace&amp;#39;, &amp;#39;rfind&amp;#39;, &amp;#39;rindex&amp;#39;, &amp;#39;rjust&amp;#39;, &amp;#39;rpartition&amp;#39;, &amp;#39;rsplit&amp;#39;, &amp;#39;rstrip&amp;#39;, &amp;#39;split&amp;#39;, &amp;#39;splitlines&amp;#39;, &amp;#39;startswith&amp;#39;, &amp;#39;strip&amp;#39;, &amp;#39;swapcase&amp;#39;, &amp;#39;title&amp;#39;, &amp;#39;translate&amp;#39;, &amp;#39;upper&amp;#39;, &amp;#39;zfill&amp;#39;]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="métodos"&gt;Métodos
&lt;/h3&gt;&lt;h4 id="upper"&gt;.upper
&lt;/h4&gt;&lt;p&gt;Para utilizar el mótodo «.&lt;strong&gt;upper&lt;/strong&gt;«, el cual nos pasaría el texto a mayúsculas, lo invocaríamos de la siguiente forma:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;print(mi_string.upper())
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;C:&amp;gt;python strings.py
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;SOY UN STRING
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h4 id="swapcase"&gt;.swapcase
&lt;/h4&gt;&lt;p&gt;otro ejemplo de método es «.&lt;strong&gt;swapcase&lt;/strong&gt;«, el cual nos intercambia mayúsculas y minúsculas&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;print(mi_string)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;print(mi_string.swapcase())
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;C:&amp;gt;python strings.py
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Soy Un String
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sOY uN sTRING
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h4 id="replace"&gt;.replace
&lt;/h4&gt;&lt;p&gt;Otro método útil es «.&lt;strong&gt;replace&lt;/strong&gt;«, para remplazar un patrón por otro. Por ejemplo:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;print(mi_string.replace(&amp;#39;Un&amp;#39;,&amp;#39;Otro&amp;#39;))
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;C:\Users\50034411\Documents\python-course&amp;gt;python strings.py
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Soy Un String
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Soy Otro String
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Podemos utilizar también métodos &lt;strong&gt;encadenados&lt;/strong&gt;, En el siguiente ejemplo utilizamos el método «.&lt;strong&gt;replace&lt;/strong&gt;«, y el resultado lo pasamos a «.&lt;strong&gt;swapcase&lt;/strong&gt;» ejemplo:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;print(mi_string.replace(&amp;#39;Un&amp;#39;,&amp;#39;Otro&amp;#39;).swapcase())
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;C:&amp;gt;python strings.py
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Soy Un String
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sOY oTRO sTRING
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h4 id="count"&gt;.count
&lt;/h4&gt;&lt;p&gt;Para contar podemos utilizar el método «.&lt;strong&gt;count&lt;/strong&gt;«. Esto se puede utilizar para caracteres, conjuntos de ellos, vacíos, etc. Por ejemplo vamos a contar las veces que se repite el carácter «&lt;strong&gt;n&lt;/strong&gt;» en &lt;em&gt;mi_string&lt;/em&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;print(mi_string.count(&amp;#39;n&amp;#39;))
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;C:&amp;gt;python strings.py
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Soy Un String
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h4 id="startswith-endswith"&gt;.startswith .endswith
&lt;/h4&gt;&lt;p&gt;Para saber si un string comienza por cierto carácter o string, se utilizar el método «.&lt;strong&gt;startswith&lt;/strong&gt;«. Esto nos devuelve un &lt;strong&gt;booleano&lt;/strong&gt; (true / false). Si inversa sería «.&lt;strong&gt;endswith&lt;/strong&gt;«&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;print(mi_string.startswith(&amp;#39;Soy&amp;#39;))
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;C:&amp;gt;python strings.py
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Soy Un String
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;True
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h4 id="split"&gt;.split
&lt;/h4&gt;&lt;p&gt;Para dividir un string en otros, se utiliza «.&lt;strong&gt;split&lt;/strong&gt;«. Por defecto utiliza el espacio en blanco para delimitar los substrings. Se genera una lista &lt;strong&gt;&lt;code&gt;[]&lt;/code&gt;&lt;/strong&gt; con los strings separados.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;print(mi_string.split())
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;C:&amp;gt;python strings.py
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Soy Un String
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[&amp;#39;Soy&amp;#39;, &amp;#39;Un&amp;#39;, &amp;#39;String&amp;#39;]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Podemos indicar el carácter de separación que nos interese, por ejemplo en las «n»&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;print(mi_string.split(&amp;#39;n&amp;#39;))
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;C:&amp;gt;python strings.py
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Soy Un String
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[&amp;#39;Soy U&amp;#39;, &amp;#39; Stri&amp;#39;, &amp;#39;g&amp;#39;]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h4 id="find"&gt;.find
&lt;/h4&gt;&lt;p&gt;Para encontrar la posición (&lt;strong&gt;índice&lt;/strong&gt;) de un carácter se utiliza el método «.&lt;strong&gt;find&lt;/strong&gt;«. En el siguiente ejemplo vemos cómo el carácter «U» se encuentra en la posición 4, empezando a contar desde 0&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;print(mi_string.find(&amp;#39;U&amp;#39;))
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;C:\Users\50034411\Documents\python-course&amp;gt;python strings.py
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Soy Un String
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;4
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;De forma inversa, se puede extraer el caracter de cierto índice concreto. Por ejemplo, utilizando el ejemplo anterior, vamos a mostrar el carácter que está en el index 4:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;print(mi_string[4])
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;C:\Users\50034411\Documents\python-course&amp;gt;python strings.py
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Soy Un String
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;U
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Si utilizamos un valor &lt;strong&gt;negativo&lt;/strong&gt;, python interpreta que deseamos comenzar a contar desde el final del string.&lt;/p&gt;
&lt;h4 id="len"&gt;len()
&lt;/h4&gt;&lt;p&gt;Para saber la longitud de un string se puede utilizar la función «&lt;strong&gt;len&lt;/strong&gt;«&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; print(len(mi_string)) 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;C:&amp;gt;python strings.py
Soy Un String
13&lt;/p&gt;
&lt;h4 id="isnumeric-isalpha-isalnum"&gt;.isnumeric .isalpha .isalnum
&lt;/h4&gt;&lt;p&gt;Podemos verificar si un string es númerico, alfabético o alfanumérico con los métodos «.&lt;strong&gt;isnumeric&lt;/strong&gt;«, «.&lt;strong&gt;isalpha&lt;/strong&gt;«, «.&lt;strong&gt;isalnum&lt;/strong&gt;«, etc. Es resultado es un booleano.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;print(mi_string.isnumeric())
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;C:\Users\50034411\Documents\python-course&amp;gt;python strings.py
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Soy Un String
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;False
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="formato-de-salida"&gt;Formato de salida
&lt;/h3&gt;&lt;p&gt;A la hora de utilizar &lt;strong&gt;&lt;code&gt;print()&lt;/code&gt;&lt;/strong&gt;, podemos pasar variables, o string predefinidos. Para concatenar se utiliza el simbolo &lt;strong&gt;&lt;code&gt;+&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;print(&amp;#34;El string es: &amp;#34; + mi_string)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;C:&amp;gt;python strings.py
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Soy Un String
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;El string es: Soy Un String
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Otra opción es incluir directamente la variable utilizando &lt;strong&gt;&lt;code&gt;{}&lt;/code&gt;&lt;/strong&gt;. Para ello es necesario indicar que se va a pasar la variable con el símbolo «&lt;strong&gt;&lt;code&gt;f&lt;/code&gt;&lt;/strong&gt;» justo al comienzo del &lt;strong&gt;&lt;code&gt;print&lt;/code&gt;&lt;/strong&gt;. Esta opción solo es válida en la versión 3.7&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;print(f&amp;#34;El string es: {mi_string}&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;C:&amp;gt;python strings.py
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Soy Un String
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;El string es: Soy Un String
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Una tercera opción con &lt;code&gt;format&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;print(&amp;#34;El string es: {0}&amp;#34;.format(mi_string))
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;C:&amp;gt;python strings.py
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Soy Un String
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;El string es: Soy Un String
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;</description></item><item><title>Python 2 – Variables</title><link>https://blog.rdiez.es/p/python-2-variables/</link><pubDate>Sun, 12 May 2019 00:00:00 +0000</pubDate><guid>https://blog.rdiez.es/p/python-2-variables/</guid><description>&lt;img src="https://blog.rdiez.es/p/python-2-variables/python-banner.jpg" alt="Featured image of post Python 2 – Variables" /&gt;&lt;p&gt;Las variables son espacios de memoria que utilizamos para almacenar diferentes tipo de datos, y trabajar con ellos.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;name = &amp;#34;esto es un nombre&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;print(name)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;nombres válidos de variables&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Python es «Case Sensitive», es decir, se diferencia entre mayúsculas y minúsculas, por lo que «&lt;em&gt;&lt;strong&gt;Nombre&lt;/strong&gt;&lt;/em&gt;» es diferente de «&lt;em&gt;&lt;strong&gt;nombre&lt;/strong&gt;&lt;/em&gt;«, y diferente también de «&lt;em&gt;&lt;strong&gt;noMBre&lt;/strong&gt;&lt;/em&gt;«&lt;/li&gt;
&lt;li&gt;El nombre de variables no puede empezar por un número&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Las formas más extendidas y utilizadas de dar formato al nombre de variables extensas son:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Snake Case&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Separa las palabras con guiones bajos&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;soy_una_variable&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Camel Case&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;La segunda y siguientes palabras comienzan con mayuscula&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; soyUnaVariable
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Pascal Case&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;La primera letra de cada palabra es mayúscula.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;SoyUnaVariable
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Si una variable se va a utilizar como un valor &lt;strong&gt;constante&lt;/strong&gt;, se suele poner todo el nombre en mayúsculas&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;PI = 3.141618
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Para definir una variable, se puede hacer de una en una&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; numero = 20
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; texto = &amp;#34;soy un texto&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;o varias de forma simultánea&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;numero, texto = 25, &amp;#34;otro texto&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;</description></item><item><title>Cambiar Rom MIUI Por LineageOS</title><link>https://blog.rdiez.es/p/cambiar-rom-miui-por-lineageos/</link><pubDate>Sat, 11 May 2019 00:00:00 +0000</pubDate><guid>https://blog.rdiez.es/p/cambiar-rom-miui-por-lineageos/</guid><description>&lt;img src="https://blog.rdiez.es/p/cambiar-rom-miui-por-lineageos/miui_a_lineage-1024x360.jpeg" alt="Featured image of post Cambiar Rom MIUI Por LineageOS" /&gt;&lt;p&gt;Vamos a explicar de forma clara y concisa como cambiar la rom stock de cualquier Xiaomi por la rom de &lt;a class="link" href="https://lineageos.org/" target="_blank" rel="noopener"
 &gt;LineageOS&lt;/a&gt;. En este caso vamos a utilizar un Mi8 como ejemplo.&lt;/p&gt;
&lt;p&gt;Antes de nada, vamos a necesitar descargar varias cosas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Mi Unlock App: &lt;a class="link" href="https://en.miui.com/unlock/" target="_blank" rel="noopener"
 &gt;https://en.miui.com/unlock/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Minimal ADB and Fastboot: &lt;a class="link" href="https://forum.xda-developers.com/showthread.php?t=2317790" target="_blank" rel="noopener"
 &gt;https://forum.xda-developers.com/showthread.php?t=2317790&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;TWRP (para nuestro movil): &lt;a class="link" href="https://dl.twrp.me/dipper/" target="_blank" rel="noopener"
 &gt;https://dl.twrp.me/dipper/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Rom Lineage (en este caso para Mi8 dipper): &lt;a class="link" href="https://download.lineageos.org/dipper" target="_blank" rel="noopener"
 &gt;https://download.lineageos.org/dipper&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Gapps: &lt;a class="link" href="https://opengapps.org/" target="_blank" rel="noopener"
 &gt;https://opengapps.org/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Con todo esto ya descargado, vamos a ponernos manos a la obra.&lt;/p&gt;
&lt;h2 id="drivers-adb"&gt;Drivers ADB
&lt;/h2&gt;&lt;p&gt;Esto es lo más sencillo, se trata de instalar el paquete &lt;code&gt;Minimal ADB and Fastboot&lt;/code&gt; que descargamos previamente. Tan solo hay que ejecutarlo y ir aceptando todo. En unos pocos segundos tendremos los drivers necesarios instalados en nuestro PC.&lt;/p&gt;
&lt;p&gt;Importante, es necesario Windows 10 64 bit para el siguiente paso. El proceso puede realizarse también bajo Linux, pero en este post nos vamos a centrar en Windows.&lt;/p&gt;
&lt;h2 id="desbloquear-el-teléfono"&gt;Desbloquear el teléfono
&lt;/h2&gt;&lt;p&gt;En los teléfonos Xiaomi, por defecto viene el bootloader bloqueado, por lo que es necesario realizar el proceso oficial para liberarlo. Esto puede tardar desde unos días, a incluso un mes.&lt;/p&gt;
&lt;p&gt;El primer paso es ir a «Ajustes» &amp;gt; «Sobre el teléfono» &amp;gt; y pulsar 7 veces sobre «Versión MIUI», hasta que se activen las opciones de desarrollador.&lt;/p&gt;
&lt;p&gt;Ahora vamos a «Ajustes» &amp;gt; «Ajustes adicionales» &amp;gt; «Opciones de desarrollador».&lt;/p&gt;
&lt;p&gt;Aquí debemos activar «USB Debuging», y pulsar sobre «OEM Unlock».&lt;/p&gt;
&lt;p&gt;Con esto vamos a
«Ajustes» &amp;gt; «Ajustes adicionales» &amp;gt; «Opciones de desarrollador» &amp;gt; «Mi Unlock Status» y nos pedirá que añadamos nuestra cuenta Xiaomi para linkar el teléfono a nuestra cuenta.&lt;/p&gt;
&lt;p&gt;Con esto ya tenemos todo listo. Podemos apagar el teléfono e iniciarlo en modo &lt;strong&gt;bootloader&lt;/strong&gt; (Volume Down + Power) y conectarlo por USB al pc.&lt;/p&gt;
&lt;p&gt;Ahora abrimos «Mi unlock app» y vamos siguiendo los pasos. Si es nuestra primera vez, el unlock quedará solicitado y nos mostrará una &lt;strong&gt;cuenta atrás&lt;/strong&gt; en horas hasta que sea efectivo. Cuando esta cuenta atrás llegue a cero, podremos repetir el proceso y esta vez sí el teléfono quedará desbloqueado.&lt;/p&gt;
&lt;p&gt;&lt;img alt="miui unlock" class="gallery-image" data-flex-basis="368px" data-flex-grow="153" height="543" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.rdiez.es/p/cambiar-rom-miui-por-lineageos/image.png" srcset="https://blog.rdiez.es/p/cambiar-rom-miui-por-lineageos/image_hu_b42fbddf62632f89.png 800w, https://blog.rdiez.es/p/cambiar-rom-miui-por-lineageos/image.png 833w" width="833"&gt;&lt;/p&gt;
&lt;h2 id="recovery"&gt;Recovery
&lt;/h2&gt;&lt;p&gt;Llega la hora de decir adión al recovery de Xiaomi, y meter TWRP, un recovery personalizado con el que podremos tocar el móvil a nuestro antojo.&lt;/p&gt;
&lt;p&gt;Para ello conectamos el teléfono al pc en modo bootloader (Volume Down + Power), y nos abrimos una consola de comandos en la ruta donde tenemos el fichero de TWRP descargado.&lt;/p&gt;
&lt;p&gt;Lanzamos los siguientes comandos para flashearlo:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;fastboot flash recovery twrp.img
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;fastboot reboot
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Este último comando reinicia el móvil. Para que el recovery se mantenga, es necesario que mientras se reinicia dejemos pulsado Volume Up. De esta forma forzamos a que se cargue el nuevo recovery, y se haga permanente.&lt;/p&gt;
&lt;p&gt;Ahora podemos ir a&lt;/p&gt;
&lt;p&gt;&lt;img alt="Wipe data from twrp" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="lazy_placeholder.gif"&gt;&lt;/p&gt;
&lt;h2 id="preparar-el-storage"&gt;Preparar el storage
&lt;/h2&gt;&lt;p&gt;Para eliminar el cifrado de nuestra partición de datos, y dejar todo listo para la llegada de la nueva rom, es necesario formatear el storage. Para ello seguimos los siguientes pasos:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Arrancamos en modo Recovery (Volume Up + Power)&lt;/li&gt;
&lt;li&gt;Accedemos a «Wipe»&lt;/li&gt;
&lt;li&gt;Pulsamos en «Format Data», y tecleamos «yes» cuando lo pida&lt;/li&gt;
&lt;li&gt;Volvemos atrás&lt;/li&gt;
&lt;li&gt;Pulsamos en «Reboot», y despues en «Recovery»&lt;/li&gt;
&lt;li&gt;Hacemos swype y el movil volverá a entrar en modo recovery, listo para nuestra nueva rom&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt="twrp" class="gallery-image" data-flex-basis="703px" data-flex-grow="293" height="162" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.rdiez.es/p/cambiar-rom-miui-por-lineageos/image-20210310212302730.png" width="475"&gt;&lt;/p&gt;
&lt;h2 id="flashear-rom--gapps"&gt;Flashear rom + gapps
&lt;/h2&gt;&lt;p&gt;Podemos flashear la rom de dos formas distintas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Pasando la rom y gapps a la &lt;strong&gt;memoria interna&lt;/strong&gt; del telefono y flashear desde recovery&lt;/li&gt;
&lt;li&gt;Flasheando directamente desde el PC con &lt;strong&gt;fastboot&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;La primera opción no tiene mucho misterio. Simplemente copiamos a la memoria interna del teléfono ambos archivos (rom lineageos, y gapps). Una vez copiadas, en el recovery nos vamos al botón de instalar e instalamos la rom &lt;strong&gt;primero&lt;/strong&gt;, y luego las gapss. Si nos pide hacer un wipe de caché, aceptamos, y reiniciamos.&lt;/p&gt;
&lt;p&gt;Para instalar por &lt;strong&gt;fastboot&lt;/strong&gt;, en el recovery vamos a «Advanced» y activamos «Sideload».&lt;/p&gt;
&lt;p&gt;En nuestro PC debemos abrir una consola de comandos en la carpeta donde tengamos ambos ficheros y lanzar los siguientes comandos (cambiando el nombre de los .zip por los reales de la rom y gapps)&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;adb sideload fichero_de_la_rom.zip
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;adb sideload fichero_de_gapps.zip
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;fastboot reboot
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Tras esto, el móvil se reiniciará, y tras varios minutos (puede llegar a tardar incluso 20 minutos la primera vez), arrancará con LineageOS en todo su esplendor.&lt;/p&gt;</description></item><item><title>Python 1 – Tipos De Datos</title><link>https://blog.rdiez.es/p/python-1-tipos-de-datos/</link><pubDate>Sat, 11 May 2019 00:00:00 +0000</pubDate><guid>https://blog.rdiez.es/p/python-1-tipos-de-datos/</guid><description>&lt;img src="https://blog.rdiez.es/p/python-1-tipos-de-datos/python-banner.jpg" alt="Featured image of post Python 1 – Tipos De Datos" /&gt;&lt;p&gt;En este post vamos a echar un vistazo general a los diferentes tipos de datos que podemos utilizar en el lenguaje de programación Python, y la forma de diferenciarlos.&lt;/p&gt;
&lt;h2 id="strings"&gt;Strings
&lt;/h2&gt;&lt;p&gt;Los datos de tipo &lt;em&gt;&lt;a class="link" href="https://blog.rdsj.es/?p=856" target="_blank" rel="noopener"
 &gt;string&lt;/a&gt;&lt;/em&gt;, se componen de Cadenas de caracteres alfanuméricos, o texto sin más. Sus elementos son tratados puramente como texto, aunque sean caracteres numéricos.&lt;/p&gt;
&lt;p&gt;Se pueden definir entre:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Comillas simples (&lt;strong&gt;‘&lt;/strong&gt;)&lt;/li&gt;
&lt;li&gt;Comillas dobles (&lt;strong&gt;«&lt;/strong&gt;)&lt;/li&gt;
&lt;li&gt;Triple comilla simple (&lt;strong&gt;‘ ‘ ‘&lt;/strong&gt;)&lt;/li&gt;
&lt;li&gt;Triple comilla doble (&lt;strong&gt;» » «&lt;/strong&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Esto es un texto&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Esto es un texto&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&amp;#39;&amp;#39;Esto es un texto&amp;#39;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&amp;#34;&amp;#34;Esto es un texto&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="integer"&gt;Integer
&lt;/h2&gt;&lt;p&gt;Los datos de tipo &lt;em&gt;Integer&lt;/em&gt; son &lt;a class="link" href="https://blog.rdiez.es/python-4-numeros/" target="_blank" rel="noopener"
 &gt;Números &lt;/a&gt;enteros, o int&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;559545230&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="float"&gt;Float
&lt;/h2&gt;&lt;p&gt;Los datos de tipo &lt;em&gt;Float&lt;/em&gt; son &lt;a class="link" href="https://blog.rdsj.es/?p=881" target="_blank" rel="noopener"
 &gt;Números &lt;/a&gt;decimales o de punto flotante&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;25.77&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;15456454564.21222&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="boolean"&gt;Boolean
&lt;/h2&gt;&lt;p&gt;Son Operadores lógicos de verdadero o falso&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kc"&gt;True&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kc"&gt;False&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="lists"&gt;Lists
&lt;/h2&gt;&lt;p&gt;Listas de elementos que pueden ser modificadas más adelante. También se puede definir una lista vacía. Pueden tener enteros, float, string… o diferentes tipos de datos dentro de una misma lista.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Hola&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Que tal&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Adios&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="tuples"&gt;Tuples
&lt;/h2&gt;&lt;p&gt;Similar a las listas, aunque las tuplas no pueden ser modificadas. Son inmutables&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="dictionaries"&gt;Dictionaries
&lt;/h2&gt;&lt;p&gt;Es una serie de valores que pertenecen a una misma entidad, referenciados mediante una clave principal, o key&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Raul&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;apellido&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Diez&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;nick&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;kether&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="null"&gt;Null
&lt;/h2&gt;&lt;p&gt;Un valor de tipo nulo o sin definir aún.&lt;/p&gt;</description></item><item><title>Python - Iniciación al lenguaje</title><link>https://blog.rdiez.es/p/python-iniciaci%C3%B3n-al-lenguaje/</link><pubDate>Fri, 10 May 2019 00:00:00 +0000</pubDate><guid>https://blog.rdiez.es/p/python-iniciaci%C3%B3n-al-lenguaje/</guid><description>&lt;img src="https://blog.rdiez.es/p/python-iniciaci%C3%B3n-al-lenguaje/python-banner.jpg" alt="Featured image of post Python - Iniciación al lenguaje" /&gt;&lt;h1 id="python-iniciación-al-lenguaje"&gt;Python: Iniciación al lenguaje
&lt;/h1&gt;&lt;p&gt;&lt;a class="link" href="https://es.wikipedia.org/wiki/Python" target="_blank" rel="noopener"
 &gt;Python&lt;/a&gt; es un lenguaje de programación de propósito general muy poderoso. Al no tener un propósito definido, se trata de un lenguaje muy flexible, y a su vez es muy sencillo y fácil de aprender e interpretar.&lt;/p&gt;
&lt;p&gt;Todo esto hace que Python cada vez sea más popular, y más usado en todo tipo de entornos y situaciones.&lt;/p&gt;
&lt;p&gt;Se trata de un lenguaje de alto nivel, interpretado, y multiplataforma.&lt;/p&gt;
&lt;p&gt;&lt;img alt="python logo" class="gallery-image" data-flex-basis="710px" data-flex-grow="296" height="203" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.rdiez.es/p/python-iniciaci%C3%B3n-al-lenguaje/python-logo-master-v3-TM.png" width="601"&gt;&lt;/p&gt;
&lt;p&gt;Su origen data de finales de los 80, cuando fué creado por &lt;a class="link" href="https://es.wikipedia.org/wiki/Guido_van_Rossum" target="_blank" rel="noopener"
 &gt;Guido van Rossum&lt;/a&gt; en los Paises Bajos.
El nombre del lenguaje proviene de la afición de su creador por los humoristas británicos &lt;a class="link" href="https://es.wikipedia.org/wiki/Monty_Python" target="_blank" rel="noopener"
 &gt;Monty Python&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Toma características de lenguajes predecesores, incluso, compatibilizando la solución de varios de ellos. Por ejemplo, habilita tres formas de imprimir el valor de una variable: desde el entorno interactivo escribiendo su nombre (como en Basic), usando la función &lt;code&gt;print&lt;/code&gt;, con concatenación de elementos (al estilo del &lt;code&gt;write&lt;/code&gt; de Pascal) o bien con patrones de formato (al estilo del &lt;code&gt;printf&lt;/code&gt; de C)&lt;/p&gt;
&lt;p&gt;Las propias funcionalidades de Python se ven exponencialmente multiplicadas en &lt;a class="link" href="https://pypi.org/" target="_blank" rel="noopener"
 &gt;PyPI &lt;/a&gt;(Python Package Index) donde se albergan miles de módulos de terceros para Python&lt;/p&gt;
&lt;h2 id="filosofía-python"&gt;Filosofía Python
&lt;/h2&gt;&lt;p&gt;También se le conoce como &lt;a class="link" href="https://www.python.org/dev/peps/pep-0020/" target="_blank" rel="noopener"
 &gt;Zen Python&lt;/a&gt;. Se trata de 20 principios que influyen en el diseño del Lenguaje de Programación Python, de los cuales 19 fueron escritos por &lt;em&gt;Tim Peters&lt;/em&gt; en junio de 1999. El texto es distribuido como dominio público:&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;Bello es mejor que feo.
Explícito es mejor que implícito.
Simple es mejor que complejo.
Complejo es mejor que complicado.
Plano es mejor que anidado.
Disperso es mejor que denso.
La legibilidad cuenta.
Los casos especiales no son tan especiales como para quebrantar las reglas.
Lo práctico gana a lo puro.
Los errores nunca deberían dejarse pasar silenciosamente.
A menos que hayan sido silenciados explícitamente.
Frente a la ambigüedad, rechaza la tentación de adivinar.
Debería haber una -y preferiblemente sólo una- manera obvia de hacerlo.
Aunque esa manera puede no ser obvia al principio a menos que usted sea holandés.
Ahora es mejor que nunca.
Aunque nunca es a menudo mejor que ya mismo.
Si la implementación es difícil de explicar, es una mala idea.
Si la implementación es fácil de explicar, puede que sea una buena idea.
Los espacios de nombres (&lt;code&gt;namespaces&lt;/code&gt;) son una gran idea ¡Hagamos más de esas cosas!&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h2 id="secciones-del-curso"&gt;Secciones del curso
&lt;/h2&gt;&lt;p&gt;Iremos publicando un pequeño curso de iniciación a lo largo de varios Post. Espero que los disfrutéis y os sirvan de ayuda para iniciaros en este lenguaje.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Parte 1 – Tipos de datos&lt;/li&gt;
&lt;li&gt;Parte 2 – Variables&lt;/li&gt;
&lt;li&gt;Parte 3 – Strings&lt;/li&gt;
&lt;li&gt;Parte 4 – Números&lt;/li&gt;
&lt;li&gt;Parte 5 – Listas&lt;/li&gt;
&lt;li&gt;Parte 6 – Tuplas&lt;/li&gt;
&lt;li&gt;Parte 7 – Sets&lt;/li&gt;
&lt;li&gt;Parte 8 – Diccionarios&lt;/li&gt;
&lt;li&gt;Parte 9 – Condicionales (if / else / elsif)&lt;/li&gt;
&lt;li&gt;Parte 10 – Bucles (for / while)&lt;/li&gt;
&lt;li&gt;Parte 11 – Funciones&lt;/li&gt;
&lt;li&gt;Parte 12 – Módulos&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Introducción a Perl - 4</title><link>https://blog.rdiez.es/p/introducci%C3%B3n-a-perl-4/</link><pubDate>Sun, 05 May 2019 00:00:00 +0000</pubDate><guid>https://blog.rdiez.es/p/introducci%C3%B3n-a-perl-4/</guid><description>&lt;img src="https://blog.rdiez.es/p/introducci%C3%B3n-a-perl-4/perl4-1024x360.jpeg" alt="Featured image of post Introducción a Perl - 4" /&gt;&lt;h1 id="introducción-a-perl---4"&gt;Introducción a Perl - 4
&lt;/h1&gt;&lt;h2 id="if"&gt;if
&lt;/h2&gt;&lt;p&gt;Se usa para declarar condicionales, las cuales se utilizan para comprobar si una condición dada se cumple o no. En caso de que se cumpla, se continúa leyendo y ejecutando el script. Si no se cumple la condición, se salta el bloque.&lt;/p&gt;
&lt;p&gt;Se puede interpretar como: «&lt;strong&gt;Si esto se cumple, haz esto&lt;/strong&gt;«&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-perl" data-lang="perl"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Dime un numero mayor que 0: &amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$respuesta&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$respuesta&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;el numero es igual o menor que 0.&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Has indicado el numero $respuesta&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;c:&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="n"&gt;Temp&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;perl&lt;/span&gt; &lt;span class="n"&gt;perl&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pl&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Dime&lt;/span&gt; &lt;span class="n"&gt;un&lt;/span&gt; &lt;span class="n"&gt;numero&lt;/span&gt; &lt;span class="n"&gt;mayor&lt;/span&gt; &lt;span class="n"&gt;que&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Has&lt;/span&gt; &lt;span class="n"&gt;indicado&lt;/span&gt; &lt;span class="n"&gt;el&lt;/span&gt; &lt;span class="n"&gt;numero&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;c:&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="n"&gt;Temp&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;perl&lt;/span&gt; &lt;span class="n"&gt;perl&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pl&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Dime&lt;/span&gt; &lt;span class="n"&gt;un&lt;/span&gt; &lt;span class="n"&gt;numero&lt;/span&gt; &lt;span class="n"&gt;mayor&lt;/span&gt; &lt;span class="n"&gt;que&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;el&lt;/span&gt; &lt;span class="n"&gt;numero&lt;/span&gt; &lt;span class="n"&gt;es&lt;/span&gt; &lt;span class="n"&gt;igual&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt; &lt;span class="n"&gt;menor&lt;/span&gt; &lt;span class="n"&gt;que&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;c:&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="n"&gt;Temp&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="if-y-else"&gt;if y else
&lt;/h2&gt;&lt;p&gt;Se puede interpretar como: «&lt;strong&gt;Si esto se cumple, haz esto. Si no se cumple, haz esto otro&lt;/strong&gt;»&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-perl" data-lang="perl"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Dime un numero mayor que 0: &amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$respuesta&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$respuesta&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;ERROR: el numero es igual o menor que 0.\n&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;OK: el numero es mayor que 0.\n&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Has indicado el numero $respuesta&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;c:&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="n"&gt;Temp&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;perl&lt;/span&gt; &lt;span class="n"&gt;perl&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pl&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Dime&lt;/span&gt; &lt;span class="n"&gt;un&lt;/span&gt; &lt;span class="n"&gt;numero&lt;/span&gt; &lt;span class="n"&gt;mayor&lt;/span&gt; &lt;span class="n"&gt;que&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ERROR:&lt;/span&gt; &lt;span class="n"&gt;el&lt;/span&gt; &lt;span class="n"&gt;numero&lt;/span&gt; &lt;span class="n"&gt;es&lt;/span&gt; &lt;span class="n"&gt;igual&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt; &lt;span class="n"&gt;menor&lt;/span&gt; &lt;span class="n"&gt;que&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;c:&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="n"&gt;Temp&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;perl&lt;/span&gt; &lt;span class="n"&gt;perl&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pl&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Dime&lt;/span&gt; &lt;span class="n"&gt;un&lt;/span&gt; &lt;span class="n"&gt;numero&lt;/span&gt; &lt;span class="n"&gt;mayor&lt;/span&gt; &lt;span class="n"&gt;que&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;OK:&lt;/span&gt; &lt;span class="n"&gt;el&lt;/span&gt; &lt;span class="n"&gt;numero&lt;/span&gt; &lt;span class="n"&gt;es&lt;/span&gt; &lt;span class="n"&gt;mayor&lt;/span&gt; &lt;span class="n"&gt;que&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Has&lt;/span&gt; &lt;span class="n"&gt;indicado&lt;/span&gt; &lt;span class="n"&gt;el&lt;/span&gt; &lt;span class="n"&gt;numero&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="if-else-y-elsif"&gt;if, else y elsif
&lt;/h2&gt;&lt;p&gt;Se puede interpretar como: «&lt;strong&gt;Si esto se cumple, haz esto. Si no se cumple pero se cumple esto, haz esto. Si tampoco se cumple, haz esto.&lt;/strong&gt;»&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-perl" data-lang="perl"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Dime un numero entre 0 y 50: &amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$respuesta&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$respuesta&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;ERROR: el numero es igual o menor que 0.\n&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;elsif&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$respuesta&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;ERROR: el numero es mayor de 50.\n&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;OK: el numero es mayor que 0 y menor que 50.\n&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Has indicado el numero $respuesta&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;c:&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="n"&gt;Temp&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;perl&lt;/span&gt; &lt;span class="n"&gt;perl&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pl&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Dime&lt;/span&gt; &lt;span class="n"&gt;un&lt;/span&gt; &lt;span class="n"&gt;numero&lt;/span&gt; &lt;span class="n"&gt;entre&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ERROR:&lt;/span&gt; &lt;span class="n"&gt;el&lt;/span&gt; &lt;span class="n"&gt;numero&lt;/span&gt; &lt;span class="n"&gt;es&lt;/span&gt; &lt;span class="n"&gt;igual&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt; &lt;span class="n"&gt;menor&lt;/span&gt; &lt;span class="n"&gt;que&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;c:&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="n"&gt;Temp&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;c:&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="n"&gt;Temp&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;c:&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="n"&gt;Temp&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;c:&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="n"&gt;Temp&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;perl&lt;/span&gt; &lt;span class="n"&gt;perl&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pl&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Dime&lt;/span&gt; &lt;span class="n"&gt;un&lt;/span&gt; &lt;span class="n"&gt;numero&lt;/span&gt; &lt;span class="n"&gt;entre&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;55&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ERROR:&lt;/span&gt; &lt;span class="n"&gt;el&lt;/span&gt; &lt;span class="n"&gt;numero&lt;/span&gt; &lt;span class="n"&gt;es&lt;/span&gt; &lt;span class="n"&gt;mayor&lt;/span&gt; &lt;span class="n"&gt;de&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Has&lt;/span&gt; &lt;span class="n"&gt;indicado&lt;/span&gt; &lt;span class="n"&gt;el&lt;/span&gt; &lt;span class="n"&gt;numero&lt;/span&gt; &lt;span class="mi"&gt;55&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;c:&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="n"&gt;Temp&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;c:&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="n"&gt;Temp&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;c:&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="n"&gt;Temp&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;perl&lt;/span&gt; &lt;span class="n"&gt;perl&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pl&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Dime&lt;/span&gt; &lt;span class="n"&gt;un&lt;/span&gt; &lt;span class="n"&gt;numero&lt;/span&gt; &lt;span class="n"&gt;entre&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;OK:&lt;/span&gt; &lt;span class="n"&gt;el&lt;/span&gt; &lt;span class="n"&gt;numero&lt;/span&gt; &lt;span class="n"&gt;es&lt;/span&gt; &lt;span class="n"&gt;mayor&lt;/span&gt; &lt;span class="n"&gt;que&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="n"&gt;menor&lt;/span&gt; &lt;span class="n"&gt;que&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Has&lt;/span&gt; &lt;span class="n"&gt;indicado&lt;/span&gt; &lt;span class="n"&gt;el&lt;/span&gt; &lt;span class="n"&gt;numero&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="for"&gt;for
&lt;/h2&gt;&lt;p&gt;Se puede utilizar tanto for (estilo C), como foreach, ya que son sinónimos.&lt;/p&gt;
&lt;p&gt;El bucle for tiene 3 partes en la sección de control:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Initialize&lt;/li&gt;
&lt;li&gt;Test&lt;/li&gt;
&lt;li&gt;Step&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-perl" data-lang="perl"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;INITIALIZE&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;TEST&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;STEP&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;BODY&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Por ejemplo:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-perl" data-lang="perl"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;$i&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nv"&gt;$i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nv"&gt;$i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;$i\n&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;c:&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="n"&gt;Temp&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;perl&lt;/span&gt; &lt;span class="n"&gt;perl&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pl&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mi"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mi"&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mi"&gt;3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mi"&gt;4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mi"&gt;5&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mi"&gt;6&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mi"&gt;7&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mi"&gt;8&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mi"&gt;9&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;c:&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="n"&gt;Temp&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Respecto al bucle foreach, se definiría de la siguiente forma:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-perl" data-lang="perl"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;$i&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;$i\n&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Se puede hacer un bucle &lt;strong&gt;infinito&lt;/strong&gt; así:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-perl" data-lang="perl"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(;;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# hacer algo&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Aunque es más normal utilizar &lt;strong&gt;while&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-perl" data-lang="perl"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="c1"&gt;# hacer algo}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="while"&gt;while
&lt;/h2&gt;&lt;p&gt;El bucle while es algo similar a for, pero en este caso se ejecuta mientras la condición sea verdadera.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-perl" data-lang="perl"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;$counter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$counter&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;$counter\n&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;$counter&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;done&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;</description></item><item><title>Introducción a Perl - 3</title><link>https://blog.rdiez.es/p/introducci%C3%B3n-a-perl-3/</link><pubDate>Thu, 21 Mar 2019 00:00:00 +0000</pubDate><guid>https://blog.rdiez.es/p/introducci%C3%B3n-a-perl-3/</guid><description>&lt;img src="https://blog.rdiez.es/p/introducci%C3%B3n-a-perl-3/perl3-1024x360.jpeg" alt="Featured image of post Introducción a Perl - 3" /&gt;&lt;h1 id="introducción-a-perl---3"&gt;Introducción a Perl - 3
&lt;/h1&gt;&lt;h2 id="matrices-o-arrays"&gt;Matrices o Arrays
&lt;/h2&gt;&lt;p&gt;Los Arrays son básicamente un conjunto de datos almacenados en una sola variable. A diferencia de las escalares, donde se almacena un único valor, los Arrays o Matrices contienen muchos valores diferentes. Tanto es así, que dentro de un Array se pueden almacenar tanto Escalares como otros Arrays (pero esto lo dejaremos para más adelante)&lt;/p&gt;
&lt;p&gt;Las variables de tipo Array se identifican con el símbolo: «&lt;strong&gt;@&lt;/strong&gt;«&lt;/p&gt;
&lt;p&gt;Un ejemplo:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-perl" data-lang="perl"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;@semana_laboral&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Lunes&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Martes&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Miercoles&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Jueves&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Viernes&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Los elementos en una matriz se comienzan a numerar desde 0. Para referenciarnos a un único valor de la matriz, lo llamamos utlizando el simbolo de Escalar ($) y el número de su &lt;strong&gt;índice&lt;/strong&gt;. Por lo tanto los elementos de nuestra matriz de ejemplo serían:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-perl" data-lang="perl"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$semana_laboral&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Lunes&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$semana_laboral&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Martes&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$semana_laboral&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Miercoles&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$semana_laboral&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Jueves&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$semana_laboral&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Viernes&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Para saber el número de elementos que tiene una matriz, lo podemos hacer de la siguiente forma:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-perl" data-lang="perl"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;@semana_laboral&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Lunes&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Martes&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Miercoles&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Jueves&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Viernes&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$elementos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;@semana_laboral&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Numero de elemento: $elementos\n&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;-----------------------&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;c:&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="n"&gt;Temp&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;perl&lt;/span&gt; &lt;span class="n"&gt;hello&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pl&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Numero&lt;/span&gt; &lt;span class="n"&gt;de&lt;/span&gt; &lt;span class="n"&gt;elemento:&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="operaciones-con-matrices"&gt;Operaciones con Matrices
&lt;/h3&gt;&lt;p&gt;Para ver esto de forma rápida, vamos a poner unos ejemplos rápidos sobre el uso de casa operación, utilizando nuestro Array de ejemplo:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Reverse&lt;/strong&gt; (invertir la matriz)&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-perl" data-lang="perl"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;@semana_laboral&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Lunes&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Martes&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Miercoles&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Jueves&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Viernes&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;@semana_modificada&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;reverse&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;@semana_laboral&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Nueva Array: @semana_modificada\n&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;-----------------------------&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;c:&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="n"&gt;Temp&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;perl&lt;/span&gt; &lt;span class="n"&gt;hello&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pl&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Nueva&lt;/span&gt; &lt;span class="n"&gt;Array:&lt;/span&gt; &lt;span class="n"&gt;Viernes&lt;/span&gt; &lt;span class="n"&gt;Jueves&lt;/span&gt; &lt;span class="n"&gt;Miercoles&lt;/span&gt; &lt;span class="n"&gt;Martes&lt;/span&gt; &lt;span class="n"&gt;Lunes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Sort&lt;/strong&gt; (ordena alfabéticamente la matriz)&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-perl" data-lang="perl"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;@semana_laboral&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Lunes&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Martes&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Miercoles&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Jueves&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Viernes&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;@semana_modificada&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;sort&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;@semana_laboral&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Nueva Array: @semana_modificada\n&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;-----------------------------&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;c:&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="n"&gt;Temp&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;perl&lt;/span&gt; &lt;span class="n"&gt;hello&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pl&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Nueva&lt;/span&gt; &lt;span class="n"&gt;Array:&lt;/span&gt; &lt;span class="n"&gt;Jueves&lt;/span&gt; &lt;span class="n"&gt;Lunes&lt;/span&gt; &lt;span class="n"&gt;Martes&lt;/span&gt; &lt;span class="n"&gt;Miercoles&lt;/span&gt; &lt;span class="n"&gt;Viernes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Pop&lt;/strong&gt; (elimina el último elemento de la matriz)&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;span class="lnt"&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-perl" data-lang="perl"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;@semana_laboral&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Lunes&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Martes&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Miercoles&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Jueves&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Viernes&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$semana_modificada&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;pop&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;@semana_laboral&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Nueva Array: $semana_modificada\n&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Array original: @semana_laboral\n&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;-------------------&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;c:&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="n"&gt;Temp&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;perl&lt;/span&gt; &lt;span class="n"&gt;hello&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pl&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Nueva&lt;/span&gt; &lt;span class="n"&gt;Array:&lt;/span&gt; &lt;span class="n"&gt;Viernes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Array&lt;/span&gt; &lt;span class="n"&gt;original:&lt;/span&gt; &lt;span class="n"&gt;Lunes&lt;/span&gt; &lt;span class="n"&gt;Martes&lt;/span&gt; &lt;span class="n"&gt;Miercoles&lt;/span&gt; &lt;span class="n"&gt;Jueves&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Push&lt;/strong&gt; (añade elementos al final de la matriz)&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-perl" data-lang="perl"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;@semana_laboral&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Lunes&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Martes&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Miercoles&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Jueves&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Viernes&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;push&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;@semana_laboral&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;NUEVO&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Array original: @semana_laboral\n&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;----------------&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;c:&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="n"&gt;Temp&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;perl&lt;/span&gt; &lt;span class="n"&gt;hello&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pl&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Array&lt;/span&gt; &lt;span class="n"&gt;original:&lt;/span&gt; &lt;span class="n"&gt;Lunes&lt;/span&gt; &lt;span class="n"&gt;Martes&lt;/span&gt; &lt;span class="n"&gt;Miercoles&lt;/span&gt; &lt;span class="n"&gt;Jueves&lt;/span&gt; &lt;span class="n"&gt;Viernes&lt;/span&gt; &lt;span class="n"&gt;NUEVO&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Shift&lt;/strong&gt; (elimina el primer elemento de la matriz)&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-perl" data-lang="perl"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;@semana_laboral&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Lunes&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Martes&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Miercoles&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Jueves&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Viernes&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$semana_modificada&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;shift&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;@semana_laboral&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Nueva Array: $semana_modificada\n&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Array original: @semana_laboral\n&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;----------------------------&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;c:&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="n"&gt;Temp&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;perl&lt;/span&gt; &lt;span class="n"&gt;hello&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pl&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Nueva&lt;/span&gt; &lt;span class="n"&gt;Array:&lt;/span&gt; &lt;span class="n"&gt;Lunes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Array&lt;/span&gt; &lt;span class="n"&gt;original:&lt;/span&gt; &lt;span class="n"&gt;Martes&lt;/span&gt; &lt;span class="n"&gt;Miercoles&lt;/span&gt; &lt;span class="n"&gt;Jueves&lt;/span&gt; &lt;span class="n"&gt;Viernes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Unshift&lt;/strong&gt; (añade elementos al principio de la matriz)&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-perl" data-lang="perl"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;@semana_laboral&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Lunes&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Martes&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Miercoles&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Jueves&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Viernes&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;unshift&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;@semana_laboral&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;NUEVO&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Array original: @semana_laboral\n&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;---------------------&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;c:&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="n"&gt;Temp&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;perl&lt;/span&gt; &lt;span class="n"&gt;hello&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pl&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Array&lt;/span&gt; &lt;span class="n"&gt;original:&lt;/span&gt; &lt;span class="n"&gt;NUEVO&lt;/span&gt; &lt;span class="n"&gt;Lunes&lt;/span&gt; &lt;span class="n"&gt;Martes&lt;/span&gt; &lt;span class="n"&gt;Miercoles&lt;/span&gt; &lt;span class="n"&gt;Jueves&lt;/span&gt; &lt;span class="n"&gt;Viernes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h4 id="split"&gt;Split
&lt;/h4&gt;&lt;p&gt;Se utiliza split para &lt;strong&gt;dividir&lt;/strong&gt; una cadena larga (escalar), en secciones más pequeñas, conformando una matriz.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-perl" data-lang="perl"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;@matriz&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;patrón&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;$cadena&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Vamos a verlo con un ejemplo práctico:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-perl" data-lang="perl"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$semana_laboral&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Lunes\nMartes\nMiercoles\nJueves\nViernes&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="nv"&gt;$semana_laboral&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;@semana&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;\n&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;$semana_laboral&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;#Creamos una matriz con los valores del escalar&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="nv"&gt;@semana&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;----------------------&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;c:&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="n"&gt;Temp&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;perl&lt;/span&gt; &lt;span class="n"&gt;hello&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pl&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Lunes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Martes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Miercoles&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Jueves&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ViernesLunesMartesMiercolesJuevesViernes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;c:&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="n"&gt;Temp&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h4 id="join"&gt;Join
&lt;/h4&gt;&lt;p&gt;Join es la inversa a Split, en este caso se utlizar para &lt;strong&gt;concatenar&lt;/strong&gt; los diferentes elementos de una matriz, dentro de una única cadena, utilizando un patrón para diferenciarlos:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-perl" data-lang="perl"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$escalar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;patrón&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;@matriz&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;@semana_laboral&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Lunes&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Martes&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Miercoles&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Jueves&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Viernes&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;@semana_laboral\n&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$semana&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;--&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;@semana_laboral&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;#Creamos un escalar con los valores de la matriz&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="nv"&gt;$semana&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;-------------------------------&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;c:&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="n"&gt;Temp&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;perl&lt;/span&gt; &lt;span class="n"&gt;hello&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pl&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Lunes&lt;/span&gt; &lt;span class="n"&gt;Martes&lt;/span&gt; &lt;span class="n"&gt;Miercoles&lt;/span&gt; &lt;span class="n"&gt;Jueves&lt;/span&gt; &lt;span class="n"&gt;Viernes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Lunes&lt;/span&gt;&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;Martes&lt;/span&gt;&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;Miercoles&lt;/span&gt;&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;Jueves&lt;/span&gt;&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;Viernes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="matrices-asociativas"&gt;Matrices Asociativas
&lt;/h2&gt;&lt;p&gt;&lt;img alt="Diferencia entre arrays, scalar y hashes" class="gallery-image" data-flex-basis="513px" data-flex-grow="213" height="209" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.rdiez.es/p/introducci%C3%B3n-a-perl-3/image-3.png" width="447"&gt;&lt;/p&gt;
&lt;p&gt;Se trata de un tipo especial de Matriz. También se le conoce como Array &lt;strong&gt;Asociativo&lt;/strong&gt;, o &lt;strong&gt;Hash&lt;/strong&gt;. En ellos, los elementos dentro de la propia matriz son referenciados mediante otros valores, en lugar de por su posición, como se hace en las matrices normales.&lt;/p&gt;
&lt;p&gt;Se identifican por el símbolo &lt;code&gt;%&lt;/code&gt;, poniendolo delante del nombre como es habitual.&lt;/p&gt;
&lt;p&gt;Pero vamos a verlo con ejemplos:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-perl" data-lang="perl"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;#asignamos valores a una tabla hash&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;%colorfruta&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;$colorfruta&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;verde&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;kiwi&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;$colorfruta&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;amarillo&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;platano&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;$colorfruta&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;rojo&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;sandía&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;$colorfruta&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;naranja&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;naranja&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Una fruta verde es: &amp;#34;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;$colorfruta&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;verde&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;\n&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;---------------------------&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;c:&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="n"&gt;Temp&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;perl&lt;/span&gt; &lt;span class="n"&gt;hello&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pl&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Una&lt;/span&gt; &lt;span class="n"&gt;fruta&lt;/span&gt; &lt;span class="n"&gt;verde&lt;/span&gt; &lt;span class="n"&gt;es:&lt;/span&gt; &lt;span class="n"&gt;kiwi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;También se pueden definir así:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-perl" data-lang="perl"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;%dias&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;lunes&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;martes&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;M&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;miercoles&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;jueves&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;J&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;viernes&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;V&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;sabado&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;S&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;domingo&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;D&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;La representacion del Martes es :&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;$dias&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;martes&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="s"&gt;&amp;#34; \n&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;------------------------&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;c:&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="n"&gt;Temp&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;perl&lt;/span&gt; &lt;span class="n"&gt;hello&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pl&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;La&lt;/span&gt; &lt;span class="n"&gt;representacion&lt;/span&gt; &lt;span class="n"&gt;del&lt;/span&gt; &lt;span class="n"&gt;Martes&lt;/span&gt; &lt;span class="n"&gt;es&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;M&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Podemos extraer fácilmente tanto las claves como los valores, con «&lt;strong&gt;keys&lt;/strong&gt;» y «&lt;strong&gt;values&lt;/strong&gt;«:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-perl" data-lang="perl"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;%colorfruta&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;$colorfruta&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;verde&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;kiwi&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;$colorfruta&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;amarillo&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;platano&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;$colorfruta&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;rojo&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;sandía&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;$colorfruta&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;naranja&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;naranja&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#vemos las CLAVES Keys &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;@keys&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;keys&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;%colorfruta&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Claves: @keys\n&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#Vemos los VALORES Values&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;@values&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;values&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;%colorfruta&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Valores: @values\n&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;----------------------&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;c:&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="n"&gt;Temp&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;perl&lt;/span&gt; &lt;span class="n"&gt;hello&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pl&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Claves:&lt;/span&gt; &lt;span class="n"&gt;verde&lt;/span&gt; &lt;span class="n"&gt;amarillo&lt;/span&gt; &lt;span class="n"&gt;naranja&lt;/span&gt; &lt;span class="n"&gt;rojo&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Valores:&lt;/span&gt; &lt;span class="n"&gt;kiwi&lt;/span&gt; &lt;span class="n"&gt;platano&lt;/span&gt; &lt;span class="n"&gt;naranja&lt;/span&gt; &lt;span class="n"&gt;sandia&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="manejo-de-ficheros"&gt;Manejo de Ficheros
&lt;/h2&gt;&lt;h3 id="input"&gt;Input
&lt;/h3&gt;&lt;p&gt;La entrada estándar (por teclado) corresponde a «&lt;strong&gt;&lt;!-- raw HTML omitted --&gt;»&lt;/strong&gt;. Esto se suele abreviar utilizando simplemente «&lt;strong&gt;&amp;lt;&amp;gt;&lt;/strong&gt;«&lt;/p&gt;
&lt;p&gt;Se suele utilizar &lt;strong&gt;chomp&lt;/strong&gt; para eliminar cualquier intro o carácter extraño al final de la cadena introducida.&lt;/p&gt;
&lt;p&gt;Como siempre, vamos a verlo más claro con un ejemplo:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;span class="lnt"&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-perl" data-lang="perl"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Hola. Dime cuantos años tienes&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$edad&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sr"&gt;&amp;lt;STDIN&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;chomp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$edad&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Has dicho que tienes $edad años!&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;-----------------------&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;c:&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="n"&gt;Temp&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;perl&lt;/span&gt; &lt;span class="n"&gt;hello&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pl&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Hola&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;Dime&lt;/span&gt; &lt;span class="n"&gt;cuantos&lt;/span&gt; &lt;span class="n"&gt;años&lt;/span&gt; &lt;span class="n"&gt;tienes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mi"&gt;20&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Has&lt;/span&gt; &lt;span class="n"&gt;dicho&lt;/span&gt; &lt;span class="n"&gt;que&lt;/span&gt; &lt;span class="n"&gt;tienes&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt; &lt;span class="n"&gt;años&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="abrir-leer-modificar-y-cerrar-ficheros"&gt;Abrir, leer, modificar y cerrar ficheros
&lt;/h3&gt;&lt;p&gt;Para operar con un fichero, primero es necesario abrirlo asociándolo con un &lt;strong&gt;FILEHANDLE&lt;/strong&gt;. Vamos a explicarlo gráficamente:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-perl" data-lang="perl"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;open&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;FILE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;fichero.txt&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;@array&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sr"&gt;&amp;lt;FILE&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;close&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;FILE&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="nv"&gt;@array&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;open&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;FILE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;fichero.txt&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Esto abre el fichero. en este caso el fichero está en el mismo path que nuestro script, pero se podría indicar la ruta absoluta: «&lt;strong&gt;c:\tmp\fichero.txt&lt;/strong&gt;«&lt;/p&gt;
&lt;p&gt;Es una buena práctica utilizar la función «&lt;strong&gt;or die&lt;/strong&gt;«. De esta forma si el fichero no existe, se genera un error. Por ejemplo:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-perl" data-lang="perl"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;open&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;FILE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;fichero.txt&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="nb"&gt;die&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;ERROR: No se encuentra el fichero.&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;@array&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Con esto volcamos el contenido del fichero en un array que se llama «array».&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-perl" data-lang="perl"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;close&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;FILE&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Como ya hemos terminado con el fichero, lo cerramos. Perl lo haría automáticamente, pero es una buena práctica para evitar sorpresas inesperadas.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-perl" data-lang="perl"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="nv"&gt;@array&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;imprimos el array&lt;/p&gt;
&lt;p&gt;Al igual que con la &lt;strong&gt;redirección&lt;/strong&gt; estándar, podemos utilizar «&lt;strong&gt;&amp;gt;&lt;/strong&gt;» o «&lt;strong&gt;&amp;raquo;&lt;/strong&gt;» para añadir contenido a un fichero.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;«&lt;strong&gt;&amp;gt;&lt;/strong&gt;» Se crear un nuevo fichero en el que escribir (si existe se vacía).&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-perl" data-lang="perl"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;open&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;FILE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;&amp;gt;fichero.txt&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$string&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sr"&gt;&amp;lt;FILE&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="n"&gt;FILE&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Hello, world!&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;close&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;FILE&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;-----------------------&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;c:&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="n"&gt;Temp&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;type&lt;/span&gt; &lt;span class="n"&gt;fichero&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;txt&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Hello&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;world&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;«&lt;strong&gt;&amp;raquo;&lt;/strong&gt;» Se añade el contenido al final del fichero.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-perl" data-lang="perl"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;open&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;FILE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;&amp;gt;&amp;gt;fichero.txt&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$string&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sr"&gt;&amp;lt;FILE&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="n"&gt;FILE&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;ADIOS!!!!&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;close&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;FILE&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;--------------------------&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;c:&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="n"&gt;Temp&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;type&lt;/span&gt; &lt;span class="n"&gt;fichero&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;txt&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Hello&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;world&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ADIOS&lt;/span&gt;&lt;span class="o"&gt;!!!!&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;</description></item><item><title>Introducción a Perl - 1</title><link>https://blog.rdiez.es/p/introducci%C3%B3n-a-perl-1/</link><pubDate>Mon, 11 Mar 2019 00:00:00 +0000</pubDate><guid>https://blog.rdiez.es/p/introducci%C3%B3n-a-perl-1/</guid><description>&lt;img src="https://blog.rdiez.es/p/introducci%C3%B3n-a-perl-1/perl1-1024x360.jpeg" alt="Featured image of post Introducción a Perl - 1" /&gt;&lt;h1 id="introducción-a-perl"&gt;Introducción a Perl
&lt;/h1&gt;&lt;h2 id="qué-es-un-lenguaje-de-programación"&gt;¿Qué es un lenguaje de programación?
&lt;/h2&gt;&lt;p&gt;Un lenguaje de programación es básicamente un lenguaje estructurado que tiene como fin el desarrollo de programas informáticos para controlar procesos físicos o lógicos de una computadora.&lt;/p&gt;
&lt;p&gt;Esto de manera sencilla, es decirle a un ordenador lo que quieres que haga, pero en un lenguaje que él pueda comprender (el Lenguaje de Programación).&lt;/p&gt;
&lt;p&gt;Ha muchos lenguajes de programación:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;C&lt;/li&gt;
&lt;li&gt;C++&lt;/li&gt;
&lt;li&gt;Basic&lt;/li&gt;
&lt;li&gt;Java&lt;/li&gt;
&lt;li&gt;Python&lt;/li&gt;
&lt;li&gt;Pascal&lt;/li&gt;
&lt;li&gt;…&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="interpretado-o-compilado-alto-o-bajo-nivel"&gt;Interpretado o Compilado, Alto o Bajo Nivel
&lt;/h2&gt;&lt;p&gt;Cuando escribimos un programa, en el lenguaje de programación que sea, según lo que se haga con el mismo puede ser de dos tipos:&lt;/p&gt;
&lt;h4 id="lenguaje-interpretado"&gt;Lenguaje Interpretado
&lt;/h4&gt;&lt;p&gt;Un lenguaje interpretado necesita de otro programa, llamado &lt;strong&gt;intérprete&lt;/strong&gt;, para poder procesar el código cada vez que el programa es ejecutado.&lt;/p&gt;
&lt;h4 id="lenguaje-compilado"&gt;Lenguaje Compilado
&lt;/h4&gt;&lt;p&gt;Un lenguaje compilado utiliza un &lt;strong&gt;compilador&lt;/strong&gt; para hacer todos los procesos requeridos una única vez antes de que el código se pueda ejecutar. Después de ser compilado, el programa se puede lanzar directamente. En general, los programas funcionan más rápido una vez compilados.&lt;/p&gt;
&lt;p&gt;Respecto a la «facilidad» a la hora de elaborar el programa, podemos encontrar dos tipos de lenguajes:&lt;/p&gt;
&lt;h4 id="bajo-nivel"&gt;Bajo Nivel
&lt;/h4&gt;&lt;p&gt;Los lenguajes de Bajo Nivel dependen directamente del conjunto de funciones implementadas en el hardware, y utilizando una semántica muy poco legible&lt;/p&gt;
&lt;h4 id="alto-nivel"&gt;Alto Nivel
&lt;/h4&gt;&lt;p&gt;Los lenguajes de Alto Nivel tienen su semántica y sintaxis más orientado a facilitar el entendimiento por parte del programador. Se procura que su estructura sea lo más parecida a un lenguaje natural.&lt;/p&gt;
&lt;h2 id="perl"&gt;Perl?
&lt;/h2&gt;&lt;p&gt;&lt;img alt="Perl" class="gallery-image" data-flex-basis="240px" data-flex-grow="100" height="200" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.rdiez.es/p/introducci%C3%B3n-a-perl-1/200px-Cebolla_Chulita.png" width="200"&gt;&lt;/p&gt;
&lt;p&gt;En el caso que nos ocupa (Perl), se trata de un lenguaje de programación de alto nivel, interpretado, y dinámico.&lt;/p&gt;
&lt;p&gt;Fue desarrollado por Larry Wall en 1987, y desde aquella fecha continúa bajo un activo desarrollo.&lt;/p&gt;
&lt;p&gt;Las ventajas de Perl son que es muy fácil de aprender, y se pueden hacer muchas cosas sabiendo cuatro cosillas. Además es rápido de escribir, es multiplataforma, y es código libre.&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://es.wikipedia.org/wiki/Perl" target="_blank" rel="noopener"
 &gt;Mas información en Wikipedia&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="instalación-de-perl"&gt;Instalación de Perl
&lt;/h2&gt;&lt;p&gt;En Linux se encuentra preinstalado en la mayoría de distribuciones, por lo que nos vamos a centrar en su instalación bajo Windows.&lt;/p&gt;
&lt;p&gt;Debemos bajarnos el paquete correspondiente a nuestra arquitectura desde &lt;a class="link" href="http://strawberryperl.com/" target="_blank" rel="noopener"
 &gt;Strawberryperl.com&lt;/a&gt; o &lt;a class="link" href="https://www.activestate.com/products/activeperl/downloads/" target="_blank" rel="noopener"
 &gt;ActiveState&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Una vez descargado (unos 100MB), procedemos a la instalación, como cualquier otro programa de Windows.&lt;/p&gt;
&lt;p&gt;Tardará unos minutos en completar la instalación, y después de eso podemos abrir la consola de comandos (&lt;strong&gt;cmd&lt;/strong&gt;) y ejecutar lo siguiente para ver la versión actual.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;C:&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="n"&gt;Users&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;perl&lt;/span&gt; &lt;span class="n"&gt;-v&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;This&lt;/span&gt; &lt;span class="n"&gt;is&lt;/span&gt; &lt;span class="n"&gt;perl&lt;/span&gt; &lt;span class="mf"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;version&lt;/span&gt; &lt;span class="mf"&gt;28&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;subversion&lt;/span&gt; &lt;span class="mf"&gt;1&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v5&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;28&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mf"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;built&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="nb"&gt;MSWin32-x64&lt;/span&gt;&lt;span class="n"&gt;-multi-thread&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Copyright&lt;/span&gt; &lt;span class="mf"&gt;1987&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;2018&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Larry&lt;/span&gt; &lt;span class="n"&gt;Wall&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Perl&lt;/span&gt; &lt;span class="n"&gt;may&lt;/span&gt; &lt;span class="n"&gt;be&lt;/span&gt; &lt;span class="n"&gt;copied&lt;/span&gt; &lt;span class="n"&gt;only&lt;/span&gt; &lt;span class="n"&gt;under&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;terms&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="n"&gt;either&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;Artistic&lt;/span&gt; &lt;span class="n"&gt;License&lt;/span&gt; &lt;span class="n"&gt;or&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;GNU&lt;/span&gt; &lt;span class="n"&gt;General&lt;/span&gt; &lt;span class="n"&gt;Public&lt;/span&gt; &lt;span class="n"&gt;License&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;which&lt;/span&gt; &lt;span class="n"&gt;may&lt;/span&gt; &lt;span class="n"&gt;be&lt;/span&gt; &lt;span class="n"&gt;found&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;Perl&lt;/span&gt; &lt;span class="mf"&gt;5&lt;/span&gt; &lt;span class="n"&gt;source&lt;/span&gt; &lt;span class="n"&gt;kit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Complete&lt;/span&gt; &lt;span class="n"&gt;documentation&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;Perl&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;including&lt;/span&gt; &lt;span class="n"&gt;FAQ&lt;/span&gt; &lt;span class="n"&gt;lists&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;should&lt;/span&gt; &lt;span class="n"&gt;be&lt;/span&gt; &lt;span class="n"&gt;found&lt;/span&gt; &lt;span class="n"&gt;on&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;this&lt;/span&gt; &lt;span class="n"&gt;system&lt;/span&gt; &lt;span class="n"&gt;using&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;man perl&amp;#34;&lt;/span&gt; &lt;span class="n"&gt;or&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;perldoc perl&amp;#34;&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;you&lt;/span&gt; &lt;span class="n"&gt;have&lt;/span&gt; &lt;span class="n"&gt;access&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Internet&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;point&lt;/span&gt; &lt;span class="n"&gt;your&lt;/span&gt; &lt;span class="n"&gt;browser&lt;/span&gt; &lt;span class="n"&gt;at&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="p"&gt;//&lt;/span&gt;&lt;span class="n"&gt;www&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;perl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="p"&gt;/,&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;Perl&lt;/span&gt; &lt;span class="n"&gt;Home&lt;/span&gt; &lt;span class="n"&gt;Page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;C:&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="n"&gt;Users&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;En este caso nos está diciendo que tenemos la versión &lt;strong&gt;v5.28.1&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="hello-world"&gt;Hello World
&lt;/h2&gt;&lt;p&gt;Ya tenemos todo preparado para ponernos manos a la obra con nuestro primer programa. No podría ser otro que el típico «Hello World».&lt;/p&gt;
&lt;p&gt;Para editar el código Perl, se emplea un simple editor de texto. Personalmente te recomiendo &lt;a class="link" href="https://notepad-plus-plus.org/" target="_blank" rel="noopener"
 &gt;Notepad++&lt;/a&gt; o &lt;a class="link" href="https://www.sublimetext.com/" target="_blank" rel="noopener"
 &gt;Sublime Text&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Creamos un fichero llamado &lt;strong&gt;hello.pl&lt;/strong&gt;, con el siguiente contenido:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/usr/bin/perl
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;print &lt;span class="s2"&gt;&amp;#34;Hello World!&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;#esto es un comentario&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;La primera línea indica el &lt;strong&gt;programa&lt;/strong&gt; utilizado para lanzar el script&lt;/li&gt;
&lt;li&gt;la instrucción &lt;strong&gt;print&lt;/strong&gt; imprime lo que le indiquemos a continuación&lt;/li&gt;
&lt;li&gt;Cada instrucción va terminada por un «&lt;strong&gt;;&lt;/strong&gt;» (importante)&lt;/li&gt;
&lt;li&gt;Cualquier texto detrás de «&lt;strong&gt;#&lt;/strong&gt;» se considera como un comentario y es omitido.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ahora podemos lanzar el script desde la consola de comandos (cmd), indicando «perl» seguido del nombre del script:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;c:&lt;span class="se"&gt;\T&lt;/span&gt;emp&amp;gt;perl hello.pl
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Hello World!
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;c:&lt;span class="se"&gt;\T&lt;/span&gt;emp&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Listo!! con esto hemos lanzado nuestro primer programa en Perl.&lt;/p&gt;
&lt;p&gt;Nos vemos en la segunda parte&lt;/p&gt;</description></item><item><title>Introducción a Perl - 2</title><link>https://blog.rdiez.es/p/introducci%C3%B3n-a-perl-2/</link><pubDate>Mon, 11 Mar 2019 00:00:00 +0000</pubDate><guid>https://blog.rdiez.es/p/introducci%C3%B3n-a-perl-2/</guid><description>&lt;img src="https://blog.rdiez.es/p/introducci%C3%B3n-a-perl-2/perl2-1024x360.jpeg" alt="Featured image of post Introducción a Perl - 2" /&gt;&lt;h1 id="introducción-a-perl---2"&gt;Introducción a Perl - 2
&lt;/h1&gt;&lt;p&gt;Continuamos con la segunda entrega de la Introducción a Perl. En esta ocasión vamos a adentrarnos en poco en el mundo de las &lt;strong&gt;variables&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="nomenclatura"&gt;Nomenclatura
&lt;/h2&gt;&lt;p&gt;Cualquier programa de Perl, cuenta con Variables, funciones, clases, packages, etc. Cualquier nombre debe cumplir las siguientes características:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Empezar por una letra o un guión bajo «_»&lt;/li&gt;
&lt;li&gt;Puede incluir cualquier combinación de letras, números o guiones bajos.&lt;/li&gt;
&lt;li&gt;Los nombres son «Case Sensitive». Se diferencia entre mayúsculas y minúsculas&lt;/li&gt;
&lt;li&gt;Pueden tener cualquier longitud.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A la hora de escojer un nombre, debemos utilizar una nomenclatura que nos resulte informativa, y se pueda entender de manera últil y clara.&lt;/p&gt;
&lt;p&gt;Ejemplos válidos:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-perl" data-lang="perl"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$correcto&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;%_otro_correcto&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;@correcto1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Ejemplos inválidos:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-perl" data-lang="perl"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$una&lt;/span&gt; &lt;span class="n"&gt;incorrecta&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;@45&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;%&lt;/span&gt;&lt;span class="err"&gt;+&lt;/span&gt;&lt;span class="nv"&gt;incorrecto&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="nomenclatura-de-las-variables"&gt;Nomenclatura de las variables
&lt;/h2&gt;&lt;p&gt;Una variable es un espacio de memoria (o un lugar) donde almacenamos un valor. Este «lugar» o variable, podemos manipularlo, o referirnos a él directamente.&lt;/p&gt;
&lt;p&gt;Los nombres de las variables siempre tienen al principio un símbolo, indicante el tipo al que pertenece esa variable.&lt;/p&gt;
&lt;p&gt;Hay tres tipos de variables:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Escalares: &lt;strong&gt;$&lt;/strong&gt;
El escalar representa el tipo básico en Perl. Permite representar enteros, reales y cadenas de caracteres&lt;/li&gt;
&lt;li&gt;Matrices o arrays: &lt;strong&gt;@&lt;/strong&gt;
Es una lista de datos de tipo escalar. Cada elemento de la lista es una variable escalar a la que se le asocia un valor&lt;/li&gt;
&lt;li&gt;Matrices o listas asociativas: &lt;strong&gt;%&lt;/strong&gt;
Una matrix asociativa está indexada por cadenas en lugar de por números. Un elemento está indexado por el anterior formando ambos parejas del tipo &lt;em&gt;(clave, valor)&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Sin embargo, vamos a ir viendo poco a poco estos tipos de variables.&lt;/p&gt;
&lt;h2 id="variables-escalares"&gt;Variables Escalares
&lt;/h2&gt;&lt;p&gt;Este tipo de variables almacenan un único valor.&lt;/p&gt;
&lt;p&gt;Su nombre comienza por &lt;strong&gt;$&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;El valor almacenado en las variables escalares puede ser modificado durante la ejecución del programa&lt;/p&gt;
&lt;p&gt;Se pueden almacenar datos de cualquier tipo: cadena de texto, números enteros, reales…&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-perl" data-lang="perl"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$nombre&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Martin&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$edad&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$precio&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;22.15&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Ahora que ya tenemos una pequeña idea, vamos a empezar a utilizar este tipo de variables.&lt;/p&gt;
&lt;p&gt;Para &lt;strong&gt;asignar&lt;/strong&gt; un valor a una variable, se utiliza =&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-perl" data-lang="perl"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$nombre&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Martin&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$nombre&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Martin\n&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;A la hora de manejar &lt;strong&gt;strings&lt;/strong&gt;, como en el caso de arriba, se pueden utilizar varios comodines. Mas &lt;a class="link" href="https://perldoc.perl.org/perlrebackslash.html" target="_blank" rel="noopener"
 &gt;información &lt;/a&gt;al respecto. Sin embargo estos son los más útiles:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;\n&lt;/strong&gt; – Nueva linea&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;\t&lt;/strong&gt; – tabulador&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;El punto (.) sirve para &lt;strong&gt;concatenar&lt;/strong&gt; dos strings:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-perl" data-lang="perl"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$nombre&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;raul&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$apellido&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;diez&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="nv"&gt;$nombre&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;$apellido&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;--------------------&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;PS&lt;/span&gt; &lt;span class="n"&gt;C:&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="n"&gt;Temp&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;perl&lt;/span&gt; &lt;span class="o"&gt;.\&lt;/span&gt;&lt;span class="n"&gt;hello&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pl&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;rauldiez&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;También podemos utilizar &lt;strong&gt;operadores aritméticos&lt;/strong&gt; para operar con este tipo de variables:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Sumar &lt;strong&gt;+&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Restar &lt;strong&gt;–&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Multiplicar *****&lt;/li&gt;
&lt;li&gt;Dividir &lt;strong&gt;/&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Exponente *&lt;strong&gt;*&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-perl" data-lang="perl"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;$x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;$y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;$suma&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$x&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nv"&gt;$y&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;$resta&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$y&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nv"&gt;$x&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;$dividir&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$x&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nv"&gt;$y&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Podemos &lt;strong&gt;redondear&lt;/strong&gt; también a los decimales que queramos, con «&lt;strong&gt;printf&lt;/strong&gt;«:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-perl" data-lang="perl"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Rendondeando: 0.2f&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$dividir&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;length&lt;/strong&gt; nos devuelve la longitud en caracteres:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;span class="lnt"&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-perl" data-lang="perl"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;534&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$longitudy&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;length&lt;/span&gt; &lt;span class="nv"&gt;$y&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;la longitud de $y es $longitudy&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;----------------&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;PS&lt;/span&gt; &lt;span class="n"&gt;C:&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="n"&gt;Temp&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;perl&lt;/span&gt; &lt;span class="o"&gt;.\&lt;/span&gt;&lt;span class="n"&gt;hello&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pl&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;la&lt;/span&gt; &lt;span class="n"&gt;longitud&lt;/span&gt; &lt;span class="n"&gt;de&lt;/span&gt; &lt;span class="mi"&gt;534&lt;/span&gt; &lt;span class="n"&gt;es&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Si utilizamos comillas simples, en vez de las dobles, se imprime de forma literal:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;span class="lnt"&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-perl" data-lang="perl"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;534&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$longitudy&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;length&lt;/span&gt; &lt;span class="nv"&gt;$y&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;la longitud de $y es $longitudy&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;--------------------&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;PS&lt;/span&gt; &lt;span class="n"&gt;C:&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="n"&gt;Temp&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;perl&lt;/span&gt; &lt;span class="o"&gt;.\&lt;/span&gt;&lt;span class="n"&gt;hello&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pl&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;la&lt;/span&gt; &lt;span class="n"&gt;longitud&lt;/span&gt; &lt;span class="n"&gt;de&lt;/span&gt; &lt;span class="nv"&gt;$y&lt;/span&gt; &lt;span class="n"&gt;es&lt;/span&gt; &lt;span class="nv"&gt;$longitudy&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;uc (uppercase)&lt;/strong&gt; – devuelve el valor en mayúsculas&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;lc (lowercase)&lt;/strong&gt; devuelve el valor en minúsculas&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-perl" data-lang="perl"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Martin&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Es RuBiO&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;$x $y\n&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$mayusc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;uc&lt;/span&gt; &lt;span class="nv"&gt;$x&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;#pasamos a mayusculas&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$minusc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;lc&lt;/span&gt; &lt;span class="nv"&gt;$y&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;# pasamos a minusculas&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;$mayusc $minusc\n&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;-------------------&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;PS&lt;/span&gt; &lt;span class="n"&gt;C:&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="n"&gt;Temp&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;perl&lt;/span&gt; &lt;span class="o"&gt;.\&lt;/span&gt;&lt;span class="n"&gt;hello&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pl&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Martin&lt;/span&gt; &lt;span class="n"&gt;Es&lt;/span&gt; &lt;span class="n"&gt;RuBiO&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;MARTIN&lt;/span&gt; &lt;span class="n"&gt;es&lt;/span&gt; &lt;span class="n"&gt;rubio&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;</description></item></channel></rss>