<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Blog on Aitor Alonso | Senior Software Engineer</title><link>https://aalonso.dev/blog/</link><description>Recent content in Blog on Aitor Alonso | Senior Software Engineer</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Sat, 28 Feb 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://aalonso.dev/blog/index.xml" rel="self" type="application/rss+xml"/><item><title>How to configure Pi-hole for local DNS resolution in your LAN</title><link>https://aalonso.dev/blog/2026/how-to-configure-pihole-for-local-dns-resolution-in-your-lan/</link><pubDate>Sat, 28 Feb 2026 00:00:00 +0000</pubDate><guid>https://aalonso.dev/blog/2026/how-to-configure-pihole-for-local-dns-resolution-in-your-lan/</guid><description>&lt;p&gt;This article is a companion to my previous one on &lt;a
 href="https://aalonso.dev/blog/2026/how-to-use-caddy-as-a-reverse-proxy-for-your-services/"&gt;how to use Caddy as a reverse proxy for your services&lt;/a&gt;. In that article, I set up Caddy so that services are reachable via custom local domains like &lt;code&gt;myservice.home.arpa&lt;/code&gt;, but for those domains to actually work, every device on your LAN needs to be able to resolve them — and that&amp;rsquo;s exactly what we tackle here. In today&amp;rsquo;s article I&amp;rsquo;ll explain how I use Pi-hole as a local DNS server to achieve network-wide resolution for those custom domains without touching every device&amp;rsquo;s &lt;code&gt;hosts&lt;/code&gt; file. Let&amp;rsquo;s dive in!&lt;/p&gt;</description></item><item><title>How to use Caddy as a reverse proxy for your services</title><link>https://aalonso.dev/blog/2026/how-to-use-caddy-as-a-reverse-proxy-for-your-services/</link><pubDate>Fri, 30 Jan 2026 00:00:00 +0000</pubDate><guid>https://aalonso.dev/blog/2026/how-to-use-caddy-as-a-reverse-proxy-for-your-services/</guid><description>&lt;p&gt;I have a few docker services deployed on a Beelink mini PC at home that I usually access from my LAN. Because all services are deployed in the same machine, they are listening to different ports (say 3000, 5000, 8080, etc), but that&amp;rsquo;s ugly and not friendly for other non-tech people at home that also use them, so I set up caddy as a reverse proxy. This not only allows me to provide an easy to remember URL like &lt;code&gt;myservice.home.arpa&lt;/code&gt;, but also ensures we can use TLS secured connections with HTTPS. In today&amp;rsquo;s article, I would explain how did I achieve this at home. Let&amp;rsquo;s dive in!&lt;/p&gt;</description></item><item><title>How to install Debian on ProxmoxVE with LUKS encrypted root partition that auto-unlocks on boot</title><link>https://aalonso.dev/blog/2025/how-to-install-debian-on-proxmox-with-luks-encrypted-root-partition-that-auto-unlocks-on-boot/</link><pubDate>Sun, 28 Dec 2025 00:00:00 +0000</pubDate><guid>https://aalonso.dev/blog/2025/how-to-install-debian-on-proxmox-with-luks-encrypted-root-partition-that-auto-unlocks-on-boot/</guid><description>&lt;p&gt;At the beginning of the year, I wrote a similar article on &lt;a
 href="https://aalonso.dev/blog/2025/how-to-automatically-mount-luks-encrypted-linux-root-partition-on-boot/"&gt;how to achieve this on a regular PC using TPM 2.0&lt;/a&gt;, while installing Manjaro (ArchLinux based) on my main desktop. However, what about a VM? When hardware is virtualized, things are a bit different. In this article, I&amp;rsquo;ll show you what you need to create a Debian VM in ProxmoxVE, with the root partition encrypted with LUKS that automatically unlocks and mounts at boot. Let&amp;rsquo;s dig in!&lt;/p&gt;</description></item><item><title>How to use GMail as SMTP server for Proxmox VE 9</title><link>https://aalonso.dev/blog/2025/how-to-use-gmail-as-smtp-server-for-proxmox/</link><pubDate>Sun, 30 Nov 2025 00:00:00 +0000</pubDate><guid>https://aalonso.dev/blog/2025/how-to-use-gmail-as-smtp-server-for-proxmox/</guid><description>&lt;p&gt;Hello everyone! This time I just want to share with you how I configured sending email notifications from my &lt;a
 href="https://aalonso.dev/blog/tags/proxmox/"&gt;Proxmox&lt;/a&gt; server. This way, I&amp;rsquo;ll get an email with different notifications, like backups, jobs and tasks.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;I&amp;rsquo;m using a GMail account I created just for this single purpose,&lt;/strong&gt; so the steps I&amp;rsquo;ll share in the following paragraphs are using GMail SMTP servers and settings. However, the steps to use another SMTP server should be the same, just changing some key configuration values, so you can take it as a general guide with some care. Let&amp;rsquo;s jump into it!&lt;/p&gt;</description></item><item><title>How to automatize your backups with Systemd cronjobs, with logs and health-checks</title><link>https://aalonso.dev/blog/2025/how-to-automatize-your-backups-with-systemd-cronjobs-with-logs-and-health-checks/</link><pubDate>Sat, 25 Oct 2025 00:00:00 +0000</pubDate><guid>https://aalonso.dev/blog/2025/how-to-automatize-your-backups-with-systemd-cronjobs-with-logs-and-health-checks/</guid><description>&lt;p&gt;Hello everyone! Today I wan&amp;rsquo;t to share with you all how I set up my backup scripts/tasks in Linux, with the help of &lt;code&gt;Systemd&lt;/code&gt;. As most of you might know if you have more than a few months on using Linux, &lt;a
 href="https://systemd.io/"rel="noopener noreferrer" target="_blank"&gt;Systemd&lt;/a&gt; provides a system and service manager that runs as PID 1 and starts the rest of the system. Is the standard in most Linux distributions out there, including Debian based ones (the most used on servers worldwide).&lt;/p&gt;</description></item><item><title>How to upload and renew certificates on both Synology DSM and Proxmox VE</title><link>https://aalonso.dev/blog/2025/how-to-upload-and-renew-certificates-on-both-synology-dsm-and-proxmox-ve/</link><pubDate>Sat, 27 Sep 2025 00:00:00 +0000</pubDate><guid>https://aalonso.dev/blog/2025/how-to-upload-and-renew-certificates-on-both-synology-dsm-and-proxmox-ve/</guid><description>&lt;p&gt;In the last article, I wrote &lt;a
 href="https://aalonso.dev/blog/2025/how-to-create-your-own-certificate-authority-to-provide-certs-for-your-self-hosted-services/"&gt;how to create your own Certificate Authority to provide certs for your self-hosted services&lt;/a&gt;, which is very useful when you have tons of servers, VMs and services deployed in your homelab, as I do. The backbone of my homelab is a &lt;a
 href="https://aalonso.dev/blog/tags/synology/"&gt;Synology&lt;/a&gt; NAS server and a &lt;a
 href="https://aalonso.dev/blog/tags/proxmox/"&gt;Proxmox&lt;/a&gt; cluster, along with some docker services here and there. I&amp;rsquo;m using reverse proxies to access my docker containers with HTTPS: caddy for the ones hosted on Proxmox, and the built-in reverse-proxy from DSM for those hosted on the Synology.&lt;/p&gt;</description></item><item><title>How to create your own Certificate Authority to provide certs for your self-hosted services</title><link>https://aalonso.dev/blog/2025/how-to-create-your-own-certificate-authority-to-provide-certs-for-your-self-hosted-services/</link><pubDate>Thu, 28 Aug 2025 00:00:00 +0000</pubDate><guid>https://aalonso.dev/blog/2025/how-to-create-your-own-certificate-authority-to-provide-certs-for-your-self-hosted-services/</guid><description>&lt;h2 id="some-context" class="relative"&gt;
&lt;a href="#some-context" class="group heading-anchor-link"&gt;
 &lt;span
 class="anchor-icon absolute -left-6 pr-2 opacity-0 group-hover:opacity-100 transition-opacity"
 aria-hidden="true"
 &gt;
 &lt;svg class="w-5 h-5 inline-block" fill="currentColor" viewBox="0 0 20 20"&gt;
 &lt;path
 fill-rule="evenodd"
 d="M9.243 3.03a1 1 0 01.727 1.213L9.53 6h2.94l.56-2.243a1 1 0 111.94.486L14.53 6H17a1 1 0 110 2h-2.97l-1 4H15a1 1 0 110 2h-2.47l-.56 2.242a1 1 0 11-1.94-.485L10.47 14H7.53l-.56 2.242a1 1 0 11-1.94-.485L5.47 14H3a1 1 0 110-2h2.97l1-4H5a1 1 0 110-2h2.47l.56-2.243a1 1 0 011.213-.727zM9.03 8l-1 4h2.938l1-4H9.031z"
 clip-rule="evenodd"
 /&gt;
 &lt;/svg&gt;
 &lt;/span&gt;
 &lt;span class="heading-text"&gt;Some context&lt;/span&gt;
&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;In the last years, my homelab has grown exponentially. I started with a Raspberry Pi zero back in University, just as a playground with nothing special in there, and nowadays it consists of a &lt;a
 href="https://aalonso.dev/blog/tags/synology/"&gt;Synology&lt;/a&gt; NAS server, a four Raspberry PI 4 cluster, and a &lt;a
 href="https://aalonso.dev/blog/tags/proxmox/"&gt;Proxmox&lt;/a&gt; cluster with two nodes backed by some Beelink Mini PCs. And of course, all of this hardware serves multiple self-hosted services that are currently very integrated in my daily workflow and other aspects of my life.&lt;/p&gt;</description></item><item><title>What is the "Ship, Show, Ask" Git strategy</title><link>https://aalonso.dev/blog/2025/what-is-the-ship-show-ask-git-strategy/</link><pubDate>Sat, 26 Jul 2025 00:00:00 +0000</pubDate><guid>https://aalonso.dev/blog/2025/what-is-the-ship-show-ask-git-strategy/</guid><description>&lt;p&gt;Hello everyone! This month, I want to talk you about the &lt;em&gt;&amp;ldquo;Ship, Show, Ask&amp;rdquo;&lt;/em&gt; git strategy. I use it with my teammates at &lt;a
 href="https://cabify.com/"rel="noopener noreferrer" target="_blank"&gt;Cabify&lt;/a&gt;, and I find it to be a wonderful way to maintain a good pace and individual productivity, while at the same time, ensuring a continuos code delivery and transparency and communication with the rest of the team.&lt;/p&gt;
&lt;p&gt;Has you ever had a pull request or merge request blocked for days waiting for review? Do you find difficult for you or your team to review every piece of code in time? Then, &lt;em&gt;&amp;ldquo;Ship, Show, Ask&amp;rdquo;&lt;/em&gt; could be a good fit for you or your team. Only note that, for this git strategy to work, two things must be truth in your team and your code:&lt;/p&gt;</description></item><item><title>How to make a reading progress top bar with both React and Vue</title><link>https://aalonso.dev/blog/2025/how-to-make-a-reading-progress-top-bar-with-both-react-and-vue/</link><pubDate>Sat, 28 Jun 2025 00:00:00 +0000</pubDate><guid>https://aalonso.dev/blog/2025/how-to-make-a-reading-progress-top-bar-with-both-react-and-vue/</guid><description>&lt;p&gt;Hello everyone, today I just want to share two code snippets for those that might find it useful. I have always like how the reading progress bar look in the blogs, so I build my own one for my own tech blog (this blog!). Each article in my blog has the same behavior, with a reading bar in the top of the page, the header, that fills as you scroll down. You can check how it works by scrolling down in this page.&lt;/p&gt;</description></item><item><title>3-2-1 Backup strategy. What is it and why is it important</title><link>https://aalonso.dev/blog/2025/3-2-1-backup-strategy-what-is-it-and-why-is-it-important/</link><pubDate>Thu, 29 May 2025 00:00:00 +0000</pubDate><guid>https://aalonso.dev/blog/2025/3-2-1-backup-strategy-what-is-it-and-why-is-it-important/</guid><description>&lt;p&gt;If you are like me, and you like to play around with hardware and computers, or just want more privacy for your data (all those important documents like tax reports, health documents, family embarrassing photos, etc.), you probably have your own cloud at home, typically with a &lt;a
 href="https://en.wikipedia.org/wiki/Network-attached_storage"rel="noopener noreferrer" target="_blank"&gt;NAS&lt;/a&gt;. Whether you&amp;rsquo;ve built your own home NAS using TrueNAS, &lt;a
 href="https://aalonso.dev/blog/tags/synology/"&gt;Synology&lt;/a&gt;, or a Raspberry Pi with a bunch of external drives, one thing&amp;rsquo;s certain: you care about your data. You&amp;rsquo;ve probably invested time in organizing your media library, or you have important files you don&amp;rsquo;t want to lose.&lt;/p&gt;</description></item><item><title>How to clone a disk image to a Synology NAS over LAN with Clonezilla</title><link>https://aalonso.dev/blog/2025/how-to-clone-a-disk-image-to-synology-nas-over-lan-with-clonezilla/</link><pubDate>Sat, 26 Apr 2025 00:00:00 +0000</pubDate><guid>https://aalonso.dev/blog/2025/how-to-clone-a-disk-image-to-synology-nas-over-lan-with-clonezilla/</guid><description>&lt;p&gt;After clean installing my PC with both Linux Mint and Windows 11, and after the initial configuration to my taste and installing my essential apps, I decided I wanted to create a disk image, so next time (or I really mess up) won&amp;rsquo;t take so much time. For that task, I decided to use the old and reliable tool that is the defacto standard for disk imaging and barebones restores among IT techs: &lt;a
 href="https://clonezilla.org/"rel="noopener noreferrer" target="_blank"&gt;Clonezilla&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>How to configure an Xbox One controller with dongle to work with Linux</title><link>https://aalonso.dev/blog/2025/how-to-configure-an-xbox-one-controller-with-dongle-to-work-with-linux/</link><pubDate>Sat, 29 Mar 2025 00:00:00 +0000</pubDate><guid>https://aalonso.dev/blog/2025/how-to-configure-an-xbox-one-controller-with-dongle-to-work-with-linux/</guid><description>&lt;p&gt;I&amp;rsquo;m a Linux user at heart, but I also like to play video games. So at the beginning of the year I decided to drop Windows 10 on my desktop, as it was about to reach its end of life for official support, and move to Manjaro Linux. One of the first things I did was to install Steam, and configure my old Xbox One controller to work with it.&lt;/p&gt;</description></item><item><title>How to automatically mount LUKS encrypted Linux root partition on boot with TPM 2.0</title><link>https://aalonso.dev/blog/2025/how-to-automatically-mount-luks-encrypted-linux-root-partition-on-boot/</link><pubDate>Sat, 22 Feb 2025 00:00:00 +0000</pubDate><guid>https://aalonso.dev/blog/2025/how-to-automatically-mount-luks-encrypted-linux-root-partition-on-boot/</guid><description>&lt;p&gt;The two main operating systems for desktop/laptop computers out there, Windows and MacOS, allows you to encrypt your hard drive to protect your data from physical theft. And they do it in a way that is transparent for the end user. That is, you don&amp;rsquo;t need to do anything special to encrypt your hard drive, you just need to enable it in the system settings or during the installation process. And once it&amp;rsquo;s enabled, you won&amp;rsquo;t note it. Everything works as usual. You&amp;rsquo;ll power on your computer, and you will be presented with the login screen as always.&lt;/p&gt;</description></item><item><title>How to enable TPM support for old computers in BIOS</title><link>https://aalonso.dev/blog/2025/how-to-enable-tpm-support-for-old-computers-in-bios/</link><pubDate>Sat, 25 Jan 2025 00:00:00 +0000</pubDate><guid>https://aalonso.dev/blog/2025/how-to-enable-tpm-support-for-old-computers-in-bios/</guid><description>&lt;p&gt;If you are like me and the &lt;a
 href="https://gs.statcounter.com/os-version-market-share/windows/desktop/worldwide"rel="noopener noreferrer" target="_blank"&gt;~63% of Windows users&lt;/a&gt; in the world as of December 2024, you are probably still using Windows 10 on your computer. And the reason why you have not upgraded to Windows 11 yet is probably because your computer apparently doesn&amp;rsquo;t support it. You&amp;rsquo;ll probably have a not too old computer, let&amp;rsquo;s say 5 years old components (like in my case), but still, Windows Update shows your computer is not compatible with Windows 11. How can this be?&lt;/p&gt;</description></item><item><title>How to use UUID v7 on PostgreSQL with Ecto in Elixir</title><link>https://aalonso.dev/blog/2024/how-to-use-uuid-v7-postgresql-ecto-elixir/</link><pubDate>Fri, 27 Dec 2024 00:00:00 +0000</pubDate><guid>https://aalonso.dev/blog/2024/how-to-use-uuid-v7-postgresql-ecto-elixir/</guid><description>&lt;p&gt;Since UUID v7 came officially out, I&amp;rsquo;ve always tried to use it for primary keys on all new projects and databases. However, due to it being so new, it&amp;rsquo;s not supported by default on a lot of databases and libraries.&lt;/p&gt;
&lt;p&gt;As I&amp;rsquo;m working recently, both professionally and personally, with Elixir and PostgreSQL, I&amp;rsquo;ll show you how do I use UUID v7 on PostgreSQL with Ecto in Elixir. Fully integrated with Ecto library and without the need for any external library. You will forget that you are using UUID v7 under the hood, because once configured,everything will be like working with the good old UUID v4.&lt;/p&gt;</description></item><item><title>How to seamlessly manage AWS credentials using 1Password CLI</title><link>https://aalonso.dev/blog/2024/how-to-seamlessly-manage-aws-credentials-using-1password-cli/</link><pubDate>Wed, 27 Nov 2024 00:00:00 +0000</pubDate><guid>https://aalonso.dev/blog/2024/how-to-seamlessly-manage-aws-credentials-using-1password-cli/</guid><description>&lt;p&gt;If you, like me, interact with AWS a lot via the CLI, you are probably getting tired of the CLI continuously asking you for your credentials or the OTPs generated by your MFA device. I use 1password to manage all my credentials, and although they provide a shortcut to retrieve credentials if you have the desktop app installed (Cmd+Shift+Space on my Mac), it is still a bit cumbersome to continuously searching for the OTPs.&lt;/p&gt;</description></item><item><title>How to use erlang applications in elixir and how to translate them to elixir code.</title><link>https://aalonso.dev/blog/2024/how-to-use-erlang-applications-in-elixir-and-how-to-translate-them-to-elixir-code/</link><pubDate>Sun, 27 Oct 2024 00:00:00 +0000</pubDate><guid>https://aalonso.dev/blog/2024/how-to-use-erlang-applications-in-elixir-and-how-to-translate-them-to-elixir-code/</guid><description>&lt;p&gt;As you might already know, Elixir is built on top of the Erlang Virtual Machine (BEAM). This means that Elixir and Erlang share the same underlying runtime system, allowing for seamless interoperability between the two languages. Elixir code compiles to Erlang bytecode, which runs on the BEAM, making it possible to use Erlang libraries and modules directly within Elixir projects.&lt;/p&gt;
&lt;p&gt;This interoperability allows Elixir developers to leverage the vast ecosystem of Erlang libraries and applications without the need for translation or rewriting. You can directly use existing Erlang applications in your Elixir code by calling their functions using the atom syntax. Let&amp;rsquo;s see how it works.&lt;/p&gt;</description></item><item><title>How Phoenix LiveView works. A Beginner's Guide to understanding Phoenix LiveView.</title><link>https://aalonso.dev/blog/2024/how-phoenix-liveview-works-a-beginners-guide/</link><pubDate>Sun, 29 Sep 2024 00:00:00 +0000</pubDate><guid>https://aalonso.dev/blog/2024/how-phoenix-liveview-works-a-beginners-guide/</guid><description>&lt;p&gt;In the &lt;em&gt;old days&lt;/em&gt; of web development, interacting with a web application meant reloading the entire page every time you wanted to update the user interface. This was slow, inefficient, and made for a poor user experience. Any interaction with the website, no matter how small it was, would require a round trip to the server, which would then generate a new HTML page and send it back to the client, usually a web browser. Then, the web browser would load the new page from zero, to show the updated content.&lt;/p&gt;</description></item><item><title>Linking or importing existing photo files to Synology Photos folder without duplicating space on BTRFS</title><link>https://aalonso.dev/blog/2024/linking-existing-photo-files-to-synology-photos-folder-without-duplicating-space-on-btrfs/</link><pubDate>Fri, 30 Aug 2024 00:00:00 +0000</pubDate><guid>https://aalonso.dev/blog/2024/linking-existing-photo-files-to-synology-photos-folder-without-duplicating-space-on-btrfs/</guid><description>&lt;p&gt;If you, like me, have a Synology NAS and use Synology Photos to manage your photos, you might have faced the problem of adding existing photo files to Synology Photos from another folder in your NAS (different and outside of your Synology Photos folder) without actually coping or duplicating them, which will took more disk space. In this article, I&amp;rsquo;ll show you exactly that, but you will need a volume with the BTRFS file system.&lt;/p&gt;</description></item><item><title>Binary Search Trees: What are they and how they work</title><link>https://aalonso.dev/blog/2024/binary-search-trees-what-are-they-and-how-they-work/</link><pubDate>Sun, 28 Jul 2024 00:00:00 +0000</pubDate><guid>https://aalonso.dev/blog/2024/binary-search-trees-what-are-they-and-how-they-work/</guid><description>&lt;p&gt;Binary Search Trees (BSTs) are a fundamental data structure in computer science. They provide efficient methods for storing, searching, and managing data. In this article, we&amp;rsquo;ll explore what BSTs are, how they work, and how to implement them.&lt;/p&gt;
&lt;h2 id="what-is-a-binary-search-tree" class="relative"&gt;
&lt;a href="#what-is-a-binary-search-tree" class="group heading-anchor-link"&gt;
 &lt;span
 class="anchor-icon absolute -left-6 pr-2 opacity-0 group-hover:opacity-100 transition-opacity"
 aria-hidden="true"
 &gt;
 &lt;svg class="w-5 h-5 inline-block" fill="currentColor" viewBox="0 0 20 20"&gt;
 &lt;path
 fill-rule="evenodd"
 d="M9.243 3.03a1 1 0 01.727 1.213L9.53 6h2.94l.56-2.243a1 1 0 111.94.486L14.53 6H17a1 1 0 110 2h-2.97l-1 4H15a1 1 0 110 2h-2.47l-.56 2.242a1 1 0 11-1.94-.485L10.47 14H7.53l-.56 2.242a1 1 0 11-1.94-.485L5.47 14H3a1 1 0 110-2h2.97l1-4H5a1 1 0 110-2h2.47l.56-2.243a1 1 0 011.213-.727zM9.03 8l-1 4h2.938l1-4H9.031z"
 clip-rule="evenodd"
 /&gt;
 &lt;/svg&gt;
 &lt;/span&gt;
 &lt;span class="heading-text"&gt;What is a Binary Search Tree?&lt;/span&gt;
&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;A Binary Search Tree is a binary tree where each node has at most two children, referred to as the left child and the right child. For each node:&lt;/p&gt;</description></item><item><title>A Beginner's Guide to Pointers in Go</title><link>https://aalonso.dev/blog/2024/a-beginners-guide-to-pointers-in-go/</link><pubDate>Sat, 29 Jun 2024 00:00:00 +0000</pubDate><guid>https://aalonso.dev/blog/2024/a-beginners-guide-to-pointers-in-go/</guid><description>&lt;p&gt;In Go, like the majority of programming languages (like C, C++, Rust, etc.), when you assign a value to a variable, that value is stored at a specific memory address in your computer.&lt;/p&gt;
&lt;p&gt;You can use the reference operator &lt;code&gt;&amp;amp;&lt;/code&gt; to find out this address, as shown below:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-go"&gt;package main

import &amp;quot;fmt&amp;quot;

func main() {
 var myVar int = 35

 fmt.Println(&amp;amp;myVar) // Prints a memory address. Ex: 0xc000012028
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Running this code on my computer, I get an output like &lt;code&gt;0xc000012028&lt;/code&gt;, which represents the memory address of the variable &lt;code&gt;myVar&lt;/code&gt; (displayed in hexadecimal). If you run this code on your own machine or in the &lt;a
 href="https://go.dev/play/p/ZCvcJouK2Ob"rel="noopener noreferrer" target="_blank"&gt;Go playground&lt;/a&gt;, you’ll likely see a different value.&lt;/p&gt;</description></item><item><title>Public Money, Public Code: why government software should be open source</title><link>https://aalonso.dev/blog/2024/public-money-public-code-why-government-software-should-be-open-source/</link><pubDate>Sun, 26 May 2024 00:00:00 +0000</pubDate><guid>https://aalonso.dev/blog/2024/public-money-public-code-why-government-software-should-be-open-source/</guid><description>&lt;p&gt;Hello everybody! As someone of you may already know, I&amp;rsquo;m from the European Union, from Spain, and I&amp;rsquo;m a big fan of free open-source software. Today, I want to talk about a very interesting initiative from the &lt;a
 href="https://fsfe.org/index.en.html"rel="noopener noreferrer" target="_blank"&gt;Free Software Foundation Europe&lt;/a&gt; (FSFE) called &lt;a
 href="https://publiccode.eu/en/"rel="noopener noreferrer" target="_blank"&gt;&amp;ldquo;Public Money, Public Code&amp;rdquo;&lt;/a&gt;. This initiative advocates that all software developed using public funds (paid from taxes) should be made available as Free and Open Source Software (FOSS).&lt;/p&gt;</description></item><item><title>Programming "time": why it's so difficult to work with dates and times in software development</title><link>https://aalonso.dev/blog/2024/programming-time-why-it-is-so-difficult-to-work-with-dates-and-times-in-software-development/</link><pubDate>Sat, 27 Apr 2024 00:00:00 +0000</pubDate><guid>https://aalonso.dev/blog/2024/programming-time-why-it-is-so-difficult-to-work-with-dates-and-times-in-software-development/</guid><description>&lt;p&gt;Okay, raise your hand if you ever had a bug related to dates and times in your code. 🙋‍♂️&lt;/p&gt;
&lt;p&gt;You raised your hand, right? Don&amp;rsquo;t worry, me too. And I&amp;rsquo;m pretty sure that almost every developer has already faced this kind of problem at least once in their career. But why is it so difficult to work with dates and times in software development? Why do we have so many problems with them? Today I&amp;rsquo;ll show you some curiosities about time and dates that you probably didn&amp;rsquo;t know. So, let&amp;rsquo;s get started!&lt;/p&gt;</description></item><item><title>How to mount a Synology SHR1 disk on Linux (two disks volume - RAID1 with LVM)</title><link>https://aalonso.dev/blog/2024/how-to-mount-a-synology-shr1-disk-on-linux-2-disks-volume-raid1-with-lvm/</link><pubDate>Sun, 31 Mar 2024 00:00:00 +0000</pubDate><guid>https://aalonso.dev/blog/2024/how-to-mount-a-synology-shr1-disk-on-linux-2-disks-volume-raid1-with-lvm/</guid><description>&lt;div
 class="border-l-4 border-blue-500 dark:border-blue-400 bg-blue-50 dark:bg-blue-800/20 p-4 rounded-r-lg my-6 not-prose"
&gt;
 &lt;div class="font-bold text-sm 2xl:text-base flex items-center gap-2 mb-2 text-blue-800 dark:text-blue-200"&gt;
 &lt;svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" class="size-5"&gt;
 &lt;path
 d="m5.433 13.917 1.262-3.155A4 4 0 0 1 7.58 9.42l6.92-6.918a2.121 2.121 0 0 1 3 3l-6.92 6.918c-.383.383-.84.685-1.343.886l-3.154 1.262a.5.5 0 0 1-.65-.65Z"
 /&gt;
 &lt;path
 d="M3.5 5.75c0-.69.56-1.25 1.25-1.25H10A.75.75 0 0 0 10 3H4.75A2.75 2.75 0 0 0 2 5.75v9.5A2.75 2.75 0 0 0 4.75 18h9.5A2.75 2.75 0 0 0 17 15.25V10a.75.75 0 0 0-1.5 0v5.25c0 .69-.56 1.25-1.25 1.25h-9.5c-.69 0-1.25-.56-1.25-1.25v-9.5Z"
 /&gt;
 &lt;/svg&gt;

 Edited: &lt;time datetime="2024-09-08"&gt;Sep 08, 2024&lt;/time&gt;
 &lt;/div&gt;
 &lt;div class="prose dark:prose-invert prose-sm 2xl:prose-base max-w-full text-blue-900 dark:text-blue-100"&gt;
 This tutorial is about how to access a single disk from a Synology SHR1 volume of 1 or 2 disks
(RAID1 under the hood). If you have more disks or a different SHR configuration, Synology recently
released an &lt;a
 href="https://kb.synology.com/en-us/DSM/tutorial/How_can_I_recover_data_from_my_DiskStation_using_a_PC"rel="noopener noreferrer" target="_blank"&gt;official tutorial on how to mount all disks on a PC to restore
data&lt;/a&gt;.
 &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="background-story" class="relative"&gt;
&lt;a href="#background-story" class="group heading-anchor-link"&gt;
 &lt;span
 class="anchor-icon absolute -left-6 pr-2 opacity-0 group-hover:opacity-100 transition-opacity"
 aria-hidden="true"
 &gt;
 &lt;svg class="w-5 h-5 inline-block" fill="currentColor" viewBox="0 0 20 20"&gt;
 &lt;path
 fill-rule="evenodd"
 d="M9.243 3.03a1 1 0 01.727 1.213L9.53 6h2.94l.56-2.243a1 1 0 111.94.486L14.53 6H17a1 1 0 110 2h-2.97l-1 4H15a1 1 0 110 2h-2.47l-.56 2.242a1 1 0 11-1.94-.485L10.47 14H7.53l-.56 2.242a1 1 0 11-1.94-.485L5.47 14H3a1 1 0 110-2h2.97l1-4H5a1 1 0 110-2h2.47l.56-2.243a1 1 0 011.213-.727zM9.03 8l-1 4h2.938l1-4H9.031z"
 clip-rule="evenodd"
 /&gt;
 &lt;/svg&gt;
 &lt;/span&gt;
 &lt;span class="heading-text"&gt;Background story&lt;/span&gt;
&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;I have a &lt;a
 href="https://global.download.synology.com/download/Document/Hardware/DataSheet/DiskStation/20-year/DS920&amp;#43;/enu/Synology_DS920_Plus_Data_Sheet_enu.pdf"rel="noopener noreferrer" target="_blank"&gt;Synology DS920+&lt;/a&gt; NAS at home that I really love, and that I use for a tons of things. It holds family files (&lt;a
 href="https://www.synology.com/en-us/dsm/feature/drive"rel="noopener noreferrer" target="_blank"&gt;Synology Drive&lt;/a&gt;), family photos (&lt;a
 href="https://www.synology.com/en-us/dsm/feature/photos"rel="noopener noreferrer" target="_blank"&gt;Synology Photos&lt;/a&gt;), a Plex server, some Docker containers, and backups from other servers at home. Everything just works, and it has minimal maintenance. I cannot imagine my daily live without it anymore.&lt;/p&gt;</description></item><item><title>F.I.R.S.T. principles of testing</title><link>https://aalonso.dev/blog/2024/f-i-r-s-t-principles-of-testing/</link><pubDate>Sun, 25 Feb 2024 00:00:00 +0000</pubDate><guid>https://aalonso.dev/blog/2024/f-i-r-s-t-principles-of-testing/</guid><description>&lt;p&gt;Today, I want to do a brief introduction to the F.I.R.S.T principles of testing, similar to what I did in the article about the &lt;a
 href="https://aalonso.dev/blog/2022/a-brief-introduction-to-solid-principles/"&gt;S.O.L.I.D principles of software design&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The F.I.R.S.T principles serve as a foundational framework for effective code testing. These principles, which stand for &lt;em&gt;Fast, Isolated, Repeatable, Self-validating, and Thorough&lt;/em&gt;, guide developers in creating robust and reliable tests to ensure the quality and integrity of their code.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s take a closer look at each of the F.I.R.S.T principles:&lt;/p&gt;</description></item><item><title>How to use docker engine without Docker Desktop on macOS with Colima</title><link>https://aalonso.dev/blog/2024/how-to-use-docker-engine-without-docker-desktop-macos-colima/</link><pubDate>Mon, 22 Jan 2024 00:00:00 +0000</pubDate><guid>https://aalonso.dev/blog/2024/how-to-use-docker-engine-without-docker-desktop-macos-colima/</guid><description>&lt;p&gt;In August 2021, Docker announced that they would change their licensing model and that &lt;a
 href="https://www.docker.com/blog/updating-product-subscriptions/"rel="noopener noreferrer" target="_blank"&gt;Docker Desktop would no longer be free for commercial use&lt;/a&gt;. This made a lot of companies and developers look for alternatives to run docker containers on their Mac machines. That&amp;rsquo;s because, if you are like me and a lot of other professional developers, your are probably coding for a company with a MacBook or another macOS machine, and you only use docker for development purposes, like say, have a local database instance for development. Probably, you don&amp;rsquo;t even use the Docker Desktop GUI nor any of its &amp;ldquo;fancy&amp;rdquo; features, and you only interact with the docker engine from the command line. Ah, those good old fashioned &lt;code&gt;docker&lt;/code&gt; and &lt;code&gt;docker-compose&lt;/code&gt; commands.&lt;/p&gt;</description></item><item><title>Software design patterns: the Builder pattern in Go</title><link>https://aalonso.dev/blog/2023/software-design-patterns-the-builder-pattern-go/</link><pubDate>Sat, 23 Dec 2023 00:00:00 +0000</pubDate><guid>https://aalonso.dev/blog/2023/software-design-patterns-the-builder-pattern-go/</guid><description>&lt;p&gt;The builder pattern is a technique where a developer uses a &amp;ldquo;builder&amp;rdquo; to construct an object. The end result could
be anything - a string, a struct instance, or even a closure - but it is built using a builder. More often than not a
builder is used because the object being created is complex and needs to be constructed in multiple steps, so
the builder helps isolate each step and prevent bugs.&lt;/p&gt;</description></item><item><title>All you need to know to integrate a SQL database in Go</title><link>https://aalonso.dev/blog/2023/all-you-need-to-know-to-integrate-a-sql-database-in-golang/</link><pubDate>Sun, 26 Nov 2023 00:00:00 +0000</pubDate><guid>https://aalonso.dev/blog/2023/all-you-need-to-know-to-integrate-a-sql-database-in-golang/</guid><description>&lt;p&gt;In my previous article about &lt;a
 href="https://aalonso.dev/blog/2023/create-a-fully-functional-api-server-in-go-in-under-5-minutes/"&gt;creating an fully functional API in Go under 5 minutes&lt;/a&gt;, I showed you how to create a web server using only the standard library. There, we learned that Go standard libs are powerful enough to meet our needs.&lt;/p&gt;
&lt;p&gt;In this article, and in a similar way to the aforementioned one, I&amp;rsquo;ll show you everything you need to know about the &lt;code&gt;database/sql&lt;/code&gt; package in Go, to quickly start integrating a SQL database in your application.&lt;/p&gt;</description></item><item><title>Create a fully functional API server in Go using only the standard library in under 5 minutes</title><link>https://aalonso.dev/blog/2023/create-a-fully-functional-api-server-in-go-in-under-5-minutes/</link><pubDate>Sat, 28 Oct 2023 00:00:00 +0000</pubDate><guid>https://aalonso.dev/blog/2023/create-a-fully-functional-api-server-in-go-in-under-5-minutes/</guid><description>&lt;p&gt;If this is not the first article you read about Golang (Go), no matter the author, you probably already know that Go is a programming language that was created to be simple, fast, and efficient. And it was a language born for the web, so it has a very powerful standard library for web development.&lt;/p&gt;
&lt;p&gt;In Go you can, only using the standard libs, to create a web server, a web client, and even a proxy server. In other languages, such as Node.js (where part of my background is), you need third party libs such as express to create a web server, and axios to create a resilient web client. However, you don&amp;rsquo;t need any third party libs to create a web server or a web client in Go.&lt;/p&gt;</description></item><item><title>Hacktoberfest: A Programmer's Guide to Open Source Celebration</title><link>https://aalonso.dev/blog/2023/hacktoberfest-a-programmers-guide-to-open-source-celebration/</link><pubDate>Sat, 23 Sep 2023 00:00:00 +0000</pubDate><guid>https://aalonso.dev/blog/2023/hacktoberfest-a-programmers-guide-to-open-source-celebration/</guid><description>&lt;p&gt;As programmers, we live for the thrill of coding, the joy of problem-solving, and the satisfaction of creating something meaningful. And what better way to channel that passion than by participating in Hacktoberfest? It&amp;rsquo;s that time of year again when open source enthusiasts worldwide unite to celebrate their love for coding, collaboration, and community. In this article, I&amp;rsquo;ll take a programmer&amp;rsquo;s perspective on Hacktoberfest, diving into what it&amp;rsquo;s all about, why it&amp;rsquo;s worth your time, and how to make the most of this exciting event.&lt;/p&gt;</description></item><item><title>Custom errors in Go: providing meaningful errors and decoupling our code</title><link>https://aalonso.dev/blog/2023/custom-errors-in-go-providing-meaningful-errors-and-decoupling-our-code/</link><pubDate>Wed, 30 Aug 2023 00:00:00 +0000</pubDate><guid>https://aalonso.dev/blog/2023/custom-errors-in-go-providing-meaningful-errors-and-decoupling-our-code/</guid><description>&lt;p&gt;In Go, errors are a fundamental part of the language&amp;rsquo;s design, and are represented by the error interface, which is defined as:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-go"&gt;type error interface {
 Error() string
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This simple interface requires any type that implements it to have an &lt;code&gt;Error()&lt;/code&gt; method that returns a string description of the error. Therefore, when we invoke the &lt;code&gt;New()&lt;/code&gt; function from the standard &lt;code&gt;errors&lt;/code&gt; package, we are in fact instantiating a struct that implements that interface, as we can see in the &lt;a
 href="https://go.dev/src/errors/errors.go"rel="noopener noreferrer" target="_blank"&gt;source code of Go itself&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Everything you need to know about concurrence and parallelism in Go</title><link>https://aalonso.dev/blog/2023/everything-you-need-to-know-about-go-concurrency-and-parallelism/</link><pubDate>Fri, 28 Jul 2023 00:00:00 +0000</pubDate><guid>https://aalonso.dev/blog/2023/everything-you-need-to-know-about-go-concurrency-and-parallelism/</guid><description>&lt;p&gt;In programming, when we talk about doing several things at once, we often talk about concurrency and parallelism equally. However, it is important to note that these two concepts are not the same thing, but are often confused.&lt;/p&gt;
&lt;p&gt;In golang there are some proverbs, known as &lt;a
 href="https://go-proverbs.github.io/"rel="noopener noreferrer" target="_blank"&gt;&lt;em&gt;The Proverbs of Go&lt;/em&gt;&lt;/a&gt;, written by &lt;a
 href="https://en.wikipedia.org/wiki/Rob_Pike"rel="noopener noreferrer" target="_blank"&gt;Rob Pike&lt;/a&gt;, once of the creators of Go. Those proverbs summarizes the good community practices and the philosophy you should follow when programming in Go. And precisely, one of those proverbs states that: &lt;em&gt;Concurrency is not parallelism&lt;/em&gt;.&lt;/p&gt;</description></item><item><title>OpenVPN vs. WireGuard. Which one to use?</title><link>https://aalonso.dev/blog/2023/openvpn-vs-wireguard-which-one-to-use/</link><pubDate>Sun, 25 Jun 2023 00:00:00 +0000</pubDate><guid>https://aalonso.dev/blog/2023/openvpn-vs-wireguard-which-one-to-use/</guid><description>&lt;p&gt;Virtual private networks (VPNs) play a crucial role in safeguarding our online activities and protecting sensitive data. With a multitude of VPN protocols available, it becomes handy to understand the differences between them, specially, when you need to chose which one to use. In this article, I delve into a comparison between OpenVPN and WireGuard, two prominent VPN protocols, exploring their security, performance, ease of implementation, and future prospects.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: All the information here exposed has been extracted directly from the official websites of the protocols (&lt;a
 href="https://openvpn.net/"rel="noopener noreferrer" target="_blank"&gt;OpenVPN&lt;/a&gt; and &lt;a
 href="https://www.wireguard.com/"rel="noopener noreferrer" target="_blank"&gt;WireGuard&lt;/a&gt;). I highly encourage you to visit them and explore the information by yourself, by expanding the sections that you are most interested in.&lt;/p&gt;</description></item><item><title>How to set up a DNS server and block ads with Pi-Hole on a Raspberry Pi</title><link>https://aalonso.dev/blog/2023/how-to-set-up-a-dns-server-block-ads-pihole-raspberry-pi/</link><pubDate>Wed, 31 May 2023 00:00:00 +0000</pubDate><guid>https://aalonso.dev/blog/2023/how-to-set-up-a-dns-server-block-ads-pihole-raspberry-pi/</guid><description>&lt;p&gt;Since a few months, I have been using a Raspberry Pi as a DNS server in my home network for some devices. I use it mainly to block ads and trackers in my SmartTV and FireTVs, but also to gain in privacy on those devices. In this article, I&amp;rsquo;ll explain you how to set up a DNS server on a Raspberry Pi with &lt;a
 href="https://pi-hole.net/"rel="noopener noreferrer" target="_blank"&gt;Pi-hole&lt;/a&gt; and remove ads from your network!&lt;/p&gt;</description></item><item><title>How to set up a VPN server with WireGuard or OpenVPN on a Raspberry Pi</title><link>https://aalonso.dev/blog/2023/how-to-set-up-a-vpn-server-wireguard-openvpn-raspberry-pi/</link><pubDate>Sat, 29 Apr 2023 00:00:00 +0000</pubDate><guid>https://aalonso.dev/blog/2023/how-to-set-up-a-vpn-server-wireguard-openvpn-raspberry-pi/</guid><description>&lt;p&gt;Finally, I got the time to configure a VPN server on the Raspberry Pi I have at home, and after a quick research, I found out that there is a community-driven project called &lt;a
 href="https://pivpn.io/"rel="noopener noreferrer" target="_blank"&gt;PiVPN&lt;/a&gt;, which makes it very easy to set up a VPN server on a Raspberry Pi. The source code is available on &lt;a
 href="https://github.com/pivpn/pivpn"rel="noopener noreferrer" target="_blank"&gt;GitHub&lt;/a&gt; under the MIT license, and it supports both WireGuard and OpenVPN protocols. Today, I&amp;rsquo;ll show you how to use it to set up a VPN server on a Raspberry Pi, in a step-by-step tutorial with images.&lt;/p&gt;</description></item><item><title>Hot to fix 'xcrun: error: invalid active developer path, missing xcrun' on macOS</title><link>https://aalonso.dev/blog/2023/how-to-fix-xcrun-error-invalid-ctive-developer-path-missing-xcrun-on-macos/</link><pubDate>Sun, 26 Mar 2023 00:00:00 +0000</pubDate><guid>https://aalonso.dev/blog/2023/how-to-fix-xcrun-error-invalid-ctive-developer-path-missing-xcrun-on-macos/</guid><description>&lt;p&gt;When using a brand-new Mac computer, or sometimes after upgrading macOS to a new version, it is possible that when you try to use &lt;code&gt;git&lt;/code&gt;, the terminal returns an obscure error like this:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-text"&gt;$ git status
xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools),
missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;What it really happens, is that you are missing the Apple Developer Tools, which are required to use &lt;code&gt;git&lt;/code&gt; and other command line tools like some compilers. They can be wiped after some updates, so you&amp;rsquo;ll need to reinstall them.&lt;/p&gt;</description></item><item><title>How to fix monitor that goes black, off or blinks due to static electricity in chair (and others)</title><link>https://aalonso.dev/blog/2023/how-to-fix-monitor-that-goes-black-off-due-to-static-electricity-in-chair/</link><pubDate>Fri, 24 Feb 2023 00:00:00 +0000</pubDate><guid>https://aalonso.dev/blog/2023/how-to-fix-monitor-that-goes-black-off-due-to-static-electricity-in-chair/</guid><description>&lt;p&gt;Hi there! Today, I come with a very unusual post, based on a true history that was happening to me before. If you are reading this, chances are that this is happening to you too, or just you are a curious person whose mind exploded when you read the title of this post.&lt;/p&gt;
&lt;h2 id="what-happened-what-is-this-about" class="relative"&gt;
&lt;a href="#what-happened-what-is-this-about" class="group heading-anchor-link"&gt;
 &lt;span
 class="anchor-icon absolute -left-6 pr-2 opacity-0 group-hover:opacity-100 transition-opacity"
 aria-hidden="true"
 &gt;
 &lt;svg class="w-5 h-5 inline-block" fill="currentColor" viewBox="0 0 20 20"&gt;
 &lt;path
 fill-rule="evenodd"
 d="M9.243 3.03a1 1 0 01.727 1.213L9.53 6h2.94l.56-2.243a1 1 0 111.94.486L14.53 6H17a1 1 0 110 2h-2.97l-1 4H15a1 1 0 110 2h-2.47l-.56 2.242a1 1 0 11-1.94-.485L10.47 14H7.53l-.56 2.242a1 1 0 11-1.94-.485L5.47 14H3a1 1 0 110-2h2.97l1-4H5a1 1 0 110-2h2.47l.56-2.243a1 1 0 011.213-.727zM9.03 8l-1 4h2.938l1-4H9.031z"
 clip-rule="evenodd"
 /&gt;
 &lt;/svg&gt;
 &lt;/span&gt;
 &lt;span class="heading-text"&gt;What happened? What is this about?&lt;/span&gt;
&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;I was suffering from an annoying issue for a few days. I work from home, and I use a MacBook pro attached to an external 4K monitor. along with an &lt;a
 href="https://www.ikea.com/es/en/p/markus-office-chair-vissle-dark-grey-70261150/"rel="noopener noreferrer" target="_blank"&gt;Ikea Markus chair&lt;/a&gt;. For whatever reason I&amp;rsquo;m not figured out yet, it&amp;rsquo;s generating a lot of static electricity every time I move a little, or every time I stand up. (Yes, it probably is related with the clothes or shoes I&amp;rsquo;m using, but tested different ones for a few days and didn’t notice any difference).&lt;/p&gt;</description></item><item><title>How to intercept your Kubernetes cluster traffic to your local environment with Telepresence</title><link>https://aalonso.dev/blog/2023/how-to-intercept-your-kubernetes-cluster-traffic-to-your-local-environment-with-telepresence/</link><pubDate>Sun, 29 Jan 2023 00:00:00 +0000</pubDate><guid>https://aalonso.dev/blog/2023/how-to-intercept-your-kubernetes-cluster-traffic-to-your-local-environment-with-telepresence/</guid><description>&lt;p&gt;Today, I want to tell you about a powerful tool that I use at my job to intercept Kubernetes traffic to my local environment, so I can test or debug my code locally when I need to: &lt;strong&gt;Telepresence&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;I want to honorably mention some of my colleagues like Javi, Christian and Rubén. They have implemented this tool in our company and today this article is possible thanks that they have shared their knowledge with me.&lt;/p&gt;</description></item><item><title>GPG + Git basics: How to generate keys, sign commits, and export keys to another machine</title><link>https://aalonso.dev/blog/2022/how-to-generate-gpg-keys-sign-commits-and-export-keys-to-another-machine/</link><pubDate>Mon, 26 Dec 2022 00:00:00 +0000</pubDate><guid>https://aalonso.dev/blog/2022/how-to-generate-gpg-keys-sign-commits-and-export-keys-to-another-machine/</guid><description>&lt;p&gt;In this article I will treat some interesting topics related to GPG keys and Git. I will explain what are GPG keys and what are they used for, how to generate them, how to use them to sign commits (and also how to add them to GitHub), and how to export them to another machine with ultimate trust.&lt;/p&gt;
&lt;h2 id="what-are-gpg-keys-and-what-are-they-used-for" class="relative"&gt;
&lt;a href="#what-are-gpg-keys-and-what-are-they-used-for" class="group heading-anchor-link"&gt;
 &lt;span
 class="anchor-icon absolute -left-6 pr-2 opacity-0 group-hover:opacity-100 transition-opacity"
 aria-hidden="true"
 &gt;
 &lt;svg class="w-5 h-5 inline-block" fill="currentColor" viewBox="0 0 20 20"&gt;
 &lt;path
 fill-rule="evenodd"
 d="M9.243 3.03a1 1 0 01.727 1.213L9.53 6h2.94l.56-2.243a1 1 0 111.94.486L14.53 6H17a1 1 0 110 2h-2.97l-1 4H15a1 1 0 110 2h-2.47l-.56 2.242a1 1 0 11-1.94-.485L10.47 14H7.53l-.56 2.242a1 1 0 11-1.94-.485L5.47 14H3a1 1 0 110-2h2.97l1-4H5a1 1 0 110-2h2.47l.56-2.243a1 1 0 011.213-.727zM9.03 8l-1 4h2.938l1-4H9.031z"
 clip-rule="evenodd"
 /&gt;
 &lt;/svg&gt;
 &lt;/span&gt;
 &lt;span class="heading-text"&gt;What are GPG keys and what are they used for?&lt;/span&gt;
&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;PGP &lt;em&gt;(&amp;ldquo;Pretty Good Privacy&amp;rdquo;)&lt;/em&gt; is an encryption program that provides cryptographic privacy and authentication for data communication. PGP is used for signing, encrypting, and decrypting texts, e-mails, files, directories, etc. It can be used to sign git commits too, which allows you and anyone else to verify the true authorship of a commit, in a cryptographic safe way.&lt;/p&gt;</description></item><item><title>How to create an exception filter in NestJS</title><link>https://aalonso.dev/blog/2022/how-to-create-an-exception-filter-in-nestjs/</link><pubDate>Fri, 25 Nov 2022 00:00:00 +0000</pubDate><guid>https://aalonso.dev/blog/2022/how-to-create-an-exception-filter-in-nestjs/</guid><description>&lt;p&gt;Using a powerful feature of NestJS, &lt;a
 href="https://docs.nestjs.com/exception-filters"rel="noopener noreferrer" target="_blank"&gt;exception filters&lt;/a&gt;, we can create a layer that will handle all the exceptions thrown by our application and return a custom error response. This is useful to provide a consistent error response format, and to hide sensitive information from the server, such as implementation details.&lt;/p&gt;
&lt;h2 id="what-is-an-exception-filter" class="relative"&gt;
&lt;a href="#what-is-an-exception-filter" class="group heading-anchor-link"&gt;
 &lt;span
 class="anchor-icon absolute -left-6 pr-2 opacity-0 group-hover:opacity-100 transition-opacity"
 aria-hidden="true"
 &gt;
 &lt;svg class="w-5 h-5 inline-block" fill="currentColor" viewBox="0 0 20 20"&gt;
 &lt;path
 fill-rule="evenodd"
 d="M9.243 3.03a1 1 0 01.727 1.213L9.53 6h2.94l.56-2.243a1 1 0 111.94.486L14.53 6H17a1 1 0 110 2h-2.97l-1 4H15a1 1 0 110 2h-2.47l-.56 2.242a1 1 0 11-1.94-.485L10.47 14H7.53l-.56 2.242a1 1 0 11-1.94-.485L5.47 14H3a1 1 0 110-2h2.97l1-4H5a1 1 0 110-2h2.47l.56-2.243a1 1 0 011.213-.727zM9.03 8l-1 4h2.938l1-4H9.031z"
 clip-rule="evenodd"
 /&gt;
 &lt;/svg&gt;
 &lt;/span&gt;
 &lt;span class="heading-text"&gt;What is an exception filter?&lt;/span&gt;
&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;NestJS comes with a built-in exceptions layer which is responsible for processing all unhandled exceptions across an application. However, while the base (built-in) exception filter can automatically handle many cases for us, we may want full control over the exceptions layer. For example, imagine we want to provide a custom 404 error when a resource is not found in our API, with a human readable error explaining what happened, instead of the default &lt;code&gt;500: Internal Server Error&lt;/code&gt;. We may want to add logging or use a different JSON schema based on some dynamic factors. Exception filters are designed for exactly this purpose. They let us control the exact flow of control and the content of the response sent back to the client.&lt;/p&gt;</description></item><item><title>JavaScript expressions and operators handbook</title><link>https://aalonso.dev/blog/2022/javascript-expressions-and-operators-handbook/</link><pubDate>Thu, 27 Oct 2022 00:00:00 +0000</pubDate><guid>https://aalonso.dev/blog/2022/javascript-expressions-and-operators-handbook/</guid><description>&lt;p&gt;JavaScript (and therefore, also Node and TypeScript) has a lot of valid operators and expressions that can be overwhelming to learn, specially for newcomers. I will try to sum them all here in a handy and concise way, so this article can be used as a reference for the future, for both experienced and new developers. Be sure that by understanding them, won&amp;rsquo;t be unrealizable task out there for you.&lt;/p&gt;</description></item><item><title>Free privacy friendly analytics for your website with Umami on Vercel and Supabase</title><link>https://aalonso.dev/blog/2022/free-privacy-friendly-analytics-for-your-website-with-umami-vercel-and-supabase/</link><pubDate>Mon, 26 Sep 2022 00:00:00 +0000</pubDate><guid>https://aalonso.dev/blog/2022/free-privacy-friendly-analytics-for-your-website-with-umami-vercel-and-supabase/</guid><description>&lt;p&gt;Umami, as they explain in &lt;a
 href="https://umami.is/?ref=aalonso.dev"rel="noopener noreferrer" target="_blank"&gt;their web&lt;/a&gt;, is an &lt;strong&gt;open source, privacy-focused alternative to Google Analytics.&lt;/strong&gt; I have been using it for nearly three years now as my only analytics tool for my website, and I am very happy with it. It can be self-hosted wherever you want, but I will explain how to use it with &lt;a
 href="https://vercel.com/"rel="noopener noreferrer" target="_blank"&gt;Vercel&lt;/a&gt; and &lt;a
 href="https://supabase.com/"rel="noopener noreferrer" target="_blank"&gt;Supabase&lt;/a&gt;, as this is how I deployed it and can safely support a few &lt;strong&gt;thousands visits/day site&lt;/strong&gt; like this &lt;strong&gt;for free.&lt;/strong&gt; If you are interested in other hosting alternatives you can &lt;a
 href="https://umami.is/docs/hosting?ref=aalonso.dev"rel="noopener noreferrer" target="_blank"&gt;check their docs&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>How to create a publicly accesible RDS PostgreSQL instance using CloudFormation</title><link>https://aalonso.dev/blog/2022/how-to-create-a-publicly-accesible-rds-postgresql-instance-using-cloudformation/</link><pubDate>Tue, 30 Aug 2022 00:00:00 +0000</pubDate><guid>https://aalonso.dev/blog/2022/how-to-create-a-publicly-accesible-rds-postgresql-instance-using-cloudformation/</guid><description>&lt;p&gt;Lately, I&amp;rsquo;m starting to work more with AWS from a DevOps perspective, both professionally and for side projects. The last challenge I faced was to create, using CloudFormation, an RDS PostgreSQL instance that could be accessible from the internet. I&amp;rsquo;m new to CloudFormation, so before starting work on this, I had to do some research work. I used the knowledge acquired in years of work experience and continuous training in Computer Science and Engineering to achieve the most important and difficult part of our profession: to search on Google (sorry for the bad joke).&lt;/p&gt;</description></item><item><title>How to configure CI/CD in GitHub Actions for Node.js and Docker.</title><link>https://aalonso.dev/blog/2022/how-to-configure-ci-cd-in-github-actions-for-nodejs-and-docker/</link><pubDate>Sun, 31 Jul 2022 00:00:00 +0000</pubDate><guid>https://aalonso.dev/blog/2022/how-to-configure-ci-cd-in-github-actions-for-nodejs-and-docker/</guid><description>&lt;p&gt;I&amp;rsquo;m currently developing my Master&amp;rsquo;s Degree final project, which is a monorepo with a Node.js backend (&lt;a
 href="https://nestjs.com/"rel="noopener noreferrer" target="_blank"&gt;Nest.js&lt;/a&gt; framework) and a React frontend (&lt;a
 href="https://nextjs.org/"rel="noopener noreferrer" target="_blank"&gt;Next.js&lt;/a&gt; framework) Just for you to know, those are the frameworks I use for my full stacks developments, including this site. It&amp;rsquo;s a complex software architecture, as it involves the two frameworks and a database. So to speed up my development, and to allow my professors to easily access my updates (I mean, download the current version of the project and run it), I decided to set up a CI/CD flow in GitHub Actions.&lt;/p&gt;</description></item><item><title>Strategy Pattern: solving problems selectively at scale</title><link>https://aalonso.dev/blog/2022/strategy-pattern-solving-problems-selectively-at-scale/</link><pubDate>Sun, 26 Jun 2022 00:00:00 +0000</pubDate><guid>https://aalonso.dev/blog/2022/strategy-pattern-solving-problems-selectively-at-scale/</guid><description>&lt;p&gt;The &lt;strong&gt;Strategy&lt;/strong&gt; pattern is a behavioral design pattern that lets you define a family of algorithms and use them selectively to solve the same problem. Therefore, strategy pattern is best used with problems that can be resolved in different ways, and we might need to use different algorithms for different situations. Examples of those are navigating from point A to point B, or integrating multiple third-party APIs to execute the same operation (e.g. being able to make a payment using multiple payment providers).&lt;/p&gt;</description></item><item><title>JavaScript Array methods explained with examples</title><link>https://aalonso.dev/blog/2022/javascript-array-methods-explained-with-examples/</link><pubDate>Sun, 29 May 2022 00:00:00 +0000</pubDate><guid>https://aalonso.dev/blog/2022/javascript-array-methods-explained-with-examples/</guid><description>&lt;p&gt;Yes, this is yet another article about JavaScript Array methods. There are plenty of great articles about the subject around the internet, so, why did I write this one?&lt;/p&gt;
&lt;p&gt;After interacting with multiple of my mentees over the years, either interns or junior developers, I realized most of them need a tutorial to understand JavaScript Array methods. I decided to write this article to have an example at hand that I can use to teach and guide them, and to provide a quick introduction to the most important methods. Also, this helps me to refresh my memory about some I use the less.&lt;/p&gt;</description></item><item><title>How to convert callbacks into promises</title><link>https://aalonso.dev/blog/2022/how-to-convert-callbacks-into-promises/</link><pubDate>Sat, 23 Apr 2022 00:00:00 +0000</pubDate><guid>https://aalonso.dev/blog/2022/how-to-convert-callbacks-into-promises/</guid><description>&lt;p&gt;Recently I had to integrate a very old library in a current project. That library was using callbacks instead of promises to handle async operations, and I didn&amp;rsquo;t want to mess with that, as promises outperform callbacks in all aspects, and also our entire code base was designed with promises and &lt;code&gt;async&lt;/code&gt; / &lt;code&gt;await&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Then, I had to convert the callback-based API to the new promise-based API. At first, I didn&amp;rsquo;t remember how to do that. I thought there was a method in the &lt;code&gt;Promise&lt;/code&gt; object to easily allow this, but it was not the case. So after a memory refresh, I ended up with a few ways of converting callbacks to promises. I want to write about it here, so it serves both for me as a future reminder, and for others who might have the same problem currently.&lt;/p&gt;</description></item><item><title>Hexagonal Architecture: or how to be always ready for the change</title><link>https://aalonso.dev/blog/2022/hexagonal-architecture-or-how-to-be-always-ready-for-the-change/</link><pubDate>Sat, 26 Mar 2022 00:00:00 +0000</pubDate><guid>https://aalonso.dev/blog/2022/hexagonal-architecture-or-how-to-be-always-ready-for-the-change/</guid><description>&lt;p&gt;The Hexagonal Architecture, also known as &lt;em&gt;Ports and Adapters&lt;/em&gt;, is an architectural pattern that aims to decouple your business logic from everything else. It has multiple benefits, and it is well known for providing the software with the necessary elasticity to face the continuous changes of specifications and business grow, required in an agile environment. That&amp;rsquo;s one of the reasons why &lt;a
 href="https://netflixtechblog.com/ready-for-changes-with-hexagonal-architecture-b315ec967749"rel="noopener noreferrer" target="_blank"&gt;it&amp;rsquo;s used successfully at Netflix&lt;/a&gt;, along with many other big companies. Here, I will try to explain why is it so loved among software engineers.&lt;/p&gt;</description></item><item><title>A brief introduction to S.O.L.I.D. principles</title><link>https://aalonso.dev/blog/2022/a-brief-introduction-to-solid-principles/</link><pubDate>Fri, 25 Feb 2022 00:00:00 +0000</pubDate><guid>https://aalonso.dev/blog/2022/a-brief-introduction-to-solid-principles/</guid><description>&lt;p&gt;S.O.L.I.D. principles are five well known software design principles for object-oriented programming, introduced by &lt;a
 href="https://en.wikipedia.org/wiki/Robert_C._Martin"rel="noopener noreferrer" target="_blank"&gt;Robert C. Martin&lt;/a&gt; in the early 2000s. Despite their age, which it&amp;rsquo;s like a century in software terms, they are still very used as they provide a framework for &lt;strong&gt;making software designs more understandable, flexible and maintainable.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Their name, SOLID, is a mnemonic that help us to remember each principle:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;S&lt;/strong&gt; - Single Responsibility Principle&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;O&lt;/strong&gt; - Open-closed Principle&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;L&lt;/strong&gt; - Liskov Substitution Principle&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;I&lt;/strong&gt; - Interface Segregation Principle&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;D&lt;/strong&gt; - Dependency Inversion Principle&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I&amp;rsquo;ll briefly talk about all of them, for those who look for a quick introduction or just want to refresh their memory.&lt;/p&gt;</description></item><item><title>DevToys, a Swiss Army knife for developers</title><link>https://aalonso.dev/blog/2022/devtoys-a-swift-army-knife-for-developers/</link><pubDate>Sat, 29 Jan 2022 00:00:00 +0000</pubDate><guid>https://aalonso.dev/blog/2022/devtoys-a-swift-army-knife-for-developers/</guid><description>&lt;p&gt;As you might have read &lt;a
 href="https://aalonso.dev/blog/tags/wsl/"&gt;in previous posts&lt;/a&gt;, I use Windows with WSL for my daily remote job as a professional developer. Because of that, I have invested a lot of time configuring and improving my work and development environment for that purpose, to have in a single and cohesive workstation all tools I could need to do my job in a quick and easy weay.&lt;/p&gt;
&lt;p&gt;A few months ago I wrote about &lt;a
 href="https://aalonso.dev/blog/2021/give-windows-steroids-and-custom-windows-arranges-with-powertoys-2ejh/"&gt;PowerToys, a tool to improve your productivity in Windows&lt;/a&gt; which allows me to get the most of Windows as a power user, with custom windows arranges for my vertical programming monitor, a color picker and other interesting productivity tools. This time, I come here with a similar software (with a similar name) specially designed for developers: DevToys.&lt;/p&gt;</description></item><item><title>How to fix Mikro ORM returning stale data on Nest.js</title><link>https://aalonso.dev/blog/2021/fix-mikro-orm-returning-stale-data-on-a-nestjs-project/</link><pubDate>Sun, 26 Dec 2021 00:00:00 +0000</pubDate><guid>https://aalonso.dev/blog/2021/fix-mikro-orm-returning-stale-data-on-a-nestjs-project/</guid><description>&lt;p&gt;Recently, I faced an issue where our Nest.js API was returning stale data. To illustrate what the problem was, give the next simplified example:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;I have a user in my API database with &lt;code&gt;id: 1&lt;/code&gt; and &lt;code&gt;name: 'John'&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;I request &lt;code&gt;GET /users/1&lt;/code&gt; and get &lt;code&gt;name: 'John'&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Now I do &lt;code&gt;PATCH /users/1&lt;/code&gt; with &lt;code&gt;name: 'Mike'&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Check database again. Now user with &lt;code&gt;id: 1&lt;/code&gt; has &lt;code&gt;name: 'Mike'&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;After that, a new request to &lt;code&gt;GET /users/1&lt;/code&gt; returns &lt;code&gt;name: 'John'&lt;/code&gt; (that shouldn&amp;rsquo;t happen)&lt;/li&gt;
&lt;li&gt;Future requests to &lt;code&gt;GET /users/1&lt;/code&gt; return the correct data: &lt;code&gt;name: 'Mike'&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Initially, I thought it was Mikro ORM cache, so I disabled it everywhere, but that didn&amp;rsquo;t seem to fix the issue. Also, I wasn&amp;rsquo;t able to reproduce it on my local environment, having this issue only in our AWS infrastructure. However, I was sure we had not any short of cache here, as we used a Terraform template we use in other projects without an issue. So what could be happening?&lt;/p&gt;</description></item><item><title>How to generate Generics DTOs with nestjs/swagger</title><link>https://aalonso.dev/blog/2021/how-to-generate-generics-dtos-with-nestjsswagger-422g/</link><pubDate>Sat, 04 Dec 2021 00:00:00 +0000</pubDate><guid>https://aalonso.dev/blog/2021/how-to-generate-generics-dtos-with-nestjsswagger-422g/</guid><description>&lt;p&gt;I recently had to face with such a problem while developing a REST API for a customer&amp;rsquo;s project at work. I was providing endpoints to populate multiple table views, of different kind of data, with pagination. We use &lt;a
 href="https://nestjs.com/"rel="noopener noreferrer" target="_blank"&gt;Nest.js&lt;/a&gt; and Typescript to develop the API, and we rely on the &lt;a
 href="https://docs.nestjs.com/openapi/introduction"rel="noopener noreferrer" target="_blank"&gt;auto-generated Swagger&lt;/a&gt; documentation to keep the API docs up to date.&lt;/p&gt;
&lt;p&gt;So I wanted to use a generic &lt;code&gt;PaginatedResponseDto&lt;/code&gt; like this:&lt;/p&gt;</description></item><item><title>Give Windows steroids (and custom windows arranges) with PowerToys</title><link>https://aalonso.dev/blog/2021/give-windows-steroids-and-custom-windows-arranges-with-powertoys-2ejh/</link><pubDate>Sun, 07 Nov 2021 00:00:00 +0000</pubDate><guid>https://aalonso.dev/blog/2021/give-windows-steroids-and-custom-windows-arranges-with-powertoys-2ejh/</guid><description>&lt;p&gt;I want to write about a Microsoft-official open-source tool that I cannot live without: &lt;a
 href="https://docs.microsoft.com/en-us/windows/powertoys/"rel="noopener noreferrer" target="_blank"&gt;Microsoft PowerToys&lt;/a&gt;. It&amp;rsquo;s available to install from &lt;a
 href="https://github.com/microsoft/PowerToys"rel="noopener noreferrer" target="_blank"&gt;GitHub&lt;/a&gt; via &lt;code&gt;.exe&lt;/code&gt; or directly from the &lt;a
 href="https://aka.ms/getPowerToys"rel="noopener noreferrer" target="_blank"&gt;Microsoft Store&lt;/a&gt;. In this article I&amp;rsquo;ll explain some of its features I use the most to improve my productivity on Windows:&lt;/p&gt;
&lt;h2 id="awake" class="relative"&gt;
&lt;a href="#awake" class="group heading-anchor-link"&gt;
 &lt;span
 class="anchor-icon absolute -left-6 pr-2 opacity-0 group-hover:opacity-100 transition-opacity"
 aria-hidden="true"
 &gt;
 &lt;svg class="w-5 h-5 inline-block" fill="currentColor" viewBox="0 0 20 20"&gt;
 &lt;path
 fill-rule="evenodd"
 d="M9.243 3.03a1 1 0 01.727 1.213L9.53 6h2.94l.56-2.243a1 1 0 111.94.486L14.53 6H17a1 1 0 110 2h-2.97l-1 4H15a1 1 0 110 2h-2.47l-.56 2.242a1 1 0 11-1.94-.485L10.47 14H7.53l-.56 2.242a1 1 0 11-1.94-.485L5.47 14H3a1 1 0 110-2h2.97l1-4H5a1 1 0 110-2h2.47l.56-2.243a1 1 0 011.213-.727zM9.03 8l-1 4h2.938l1-4H9.031z"
 clip-rule="evenodd"
 /&gt;
 &lt;/svg&gt;
 &lt;/span&gt;
 &lt;span class="heading-text"&gt;Awake&lt;/span&gt;
&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Sometimes I&amp;rsquo;m just showing something on my computer that I need to continuously review and don&amp;rsquo;t want my monitor to power off, or I&amp;rsquo;m running some script or time-consuming task and I don&amp;rsquo;t want my computer to go to sleep. Yes, I could go to power settings in Windows and temporary disable these options, but for sure that I will forget to re-enable them one I&amp;rsquo;m done.&lt;/p&gt;</description></item><item><title>How to back up and restore (or migrate to a new computer) a WSL2 distro</title><link>https://aalonso.dev/blog/2021/how-to-back-up-and-restore-o-migrate-to-a-new-computer-a-wsl2-machine-481m/</link><pubDate>Mon, 13 Sep 2021 00:00:00 +0000</pubDate><guid>https://aalonso.dev/blog/2021/how-to-back-up-and-restore-o-migrate-to-a-new-computer-a-wsl2-machine-481m/</guid><description>&lt;p&gt;If you are following my &lt;a
 href="https://aalonso.dev/blog/tags/wsl/"&gt;&lt;em&gt;Programming on Windows without the hassle&lt;/em&gt; articles&amp;rsquo; series&lt;/a&gt;, you are probably also using WSL2 in your day-to-day work. Today, I&amp;rsquo;ll tell you about something very important in every system (and every system configuration): backup and restore.&lt;/p&gt;
&lt;p&gt;When you have tuned your WSL2 distro for the work you made, installing the required packages, configure the shell interpreter, aliases, environment, networking, solved windows related issues, etc. etc. you don&amp;rsquo;t want them to be lost. Even better, if you mess up and break something, you want to revert to a fully working copy of your work environment asap.&lt;/p&gt;</description></item><item><title>Accessing network apps running inside WSL2 from other devices in your LAN</title><link>https://aalonso.dev/blog/2021/accessing-network-apps-running-inside-wsl2-from-other-devices-in-your-lan-1e1p/</link><pubDate>Fri, 30 Jul 2021 00:00:00 +0000</pubDate><guid>https://aalonso.dev/blog/2021/accessing-network-apps-running-inside-wsl2-from-other-devices-in-your-lan-1e1p/</guid><description>&lt;div
 class="border-l-4 border-blue-500 dark:border-blue-400 bg-blue-50 dark:bg-blue-800/20 p-4 rounded-r-lg my-6 not-prose"
&gt;
 &lt;div class="font-bold text-sm 2xl:text-base flex items-center gap-2 mb-2 text-blue-800 dark:text-blue-200"&gt;
 &lt;svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" class="size-5"&gt;
 &lt;path
 d="m5.433 13.917 1.262-3.155A4 4 0 0 1 7.58 9.42l6.92-6.918a2.121 2.121 0 0 1 3 3l-6.92 6.918c-.383.383-.84.685-1.343.886l-3.154 1.262a.5.5 0 0 1-.65-.65Z"
 /&gt;
 &lt;path
 d="M3.5 5.75c0-.69.56-1.25 1.25-1.25H10A.75.75 0 0 0 10 3H4.75A2.75 2.75 0 0 0 2 5.75v9.5A2.75 2.75 0 0 0 4.75 18h9.5A2.75 2.75 0 0 0 17 15.25V10a.75.75 0 0 0-1.5 0v5.25c0 .69-.56 1.25-1.25 1.25h-9.5c-.69 0-1.25-.56-1.25-1.25v-9.5Z"
 /&gt;
 &lt;/svg&gt;

 Edited: &lt;time datetime="2022-12-12"&gt;Dec 12, 2022&lt;/time&gt;
 &lt;/div&gt;
 &lt;div class="prose dark:prose-invert prose-sm 2xl:prose-base max-w-full text-blue-900 dark:text-blue-100"&gt;
 &lt;div class="flex flex-col items-center gap-4"&gt;
 &lt;div&gt;
 &lt;p&gt;
 This article has been chosen as the
 &lt;a href="https://www.noonies.tech/2022/internet-heroes/2022-hackernoon-contributor-of-the-year-networking/winner" target="_blank" rel="noopener noreferrer"&gt;
 winner of Hackernoon's 2022 Contributor of the Year Award
 &lt;/a&gt;
 in the "Networking" category!
 &lt;/p&gt;</description></item><item><title>How to use GUI apps in WSL2 (forwarding X server)</title><link>https://aalonso.dev/blog/2021/how-to-use-gui-apps-in-wsl2-forwarding-x-server-cdj/</link><pubDate>Mon, 12 Jul 2021 00:00:00 +0000</pubDate><guid>https://aalonso.dev/blog/2021/how-to-use-gui-apps-in-wsl2-forwarding-x-server-cdj/</guid><description>&lt;p&gt;If you have already read some of &lt;a
 href="https://aalonso.dev/blog/tags/wsl/"&gt;my WSL related articles&lt;/a&gt;, chances are that you are using and/or have discovered the potential of WSL 2. However, you might have experimented problems if tried to launch any graphical application within it.&lt;/p&gt;
&lt;p&gt;Nowadays, a third-party app is required to run GUI apps, but Microsoft announced on Build 2020 that &lt;a
 href="https://devblogs.microsoft.com/commandline/the-windows-subsystem-for-linux-build-2020-description/#wsl-gui"rel="noopener noreferrer" target="_blank"&gt;adding Linux GUI app native support to WSL is on their roadmap&lt;/a&gt;. I currently use &lt;em&gt;VcXsrv Windows X Server&lt;/em&gt; for that purpose, and that&amp;rsquo;s the tool I will explain on this post. It&amp;rsquo;s an old open-source tool that updates quite frequently. &lt;a
 href="https://sourceforge.net/projects/vcxsrv/"rel="noopener noreferrer" target="_blank"&gt;You can check it on Sourceforge&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>How to be a productive programmer in Windows with WSL2</title><link>https://aalonso.dev/blog/2021/how-to-be-a-productive-programmer-in-windows-with-wsl2-5185/</link><pubDate>Thu, 17 Jun 2021 00:00:00 +0000</pubDate><guid>https://aalonso.dev/blog/2021/how-to-be-a-productive-programmer-in-windows-with-wsl2-5185/</guid><description>&lt;p&gt;I will explain how to configure WSL 2 to fully integrate it with VS Code and Docker Desktop, to achieve on Windows a full programming environment with productivity in mind.&lt;/p&gt;
&lt;p&gt;In case you missed it, in a &lt;a
 href="https://aalonso.dev/blog/2021/how-to-install-wsl2-on-windows-10-5e82/"&gt;previous post&lt;/a&gt; I explained how to install WSL 2 on your Windows 10 machine.&lt;/p&gt;
&lt;h2 id="wait-can-you-really-be-a-productive-programmer-in-windows" class="relative"&gt;
&lt;a href="#wait-can-you-really-be-a-productive-programmer-in-windows" class="group heading-anchor-link"&gt;
 &lt;span
 class="anchor-icon absolute -left-6 pr-2 opacity-0 group-hover:opacity-100 transition-opacity"
 aria-hidden="true"
 &gt;
 &lt;svg class="w-5 h-5 inline-block" fill="currentColor" viewBox="0 0 20 20"&gt;
 &lt;path
 fill-rule="evenodd"
 d="M9.243 3.03a1 1 0 01.727 1.213L9.53 6h2.94l.56-2.243a1 1 0 111.94.486L14.53 6H17a1 1 0 110 2h-2.97l-1 4H15a1 1 0 110 2h-2.47l-.56 2.242a1 1 0 11-1.94-.485L10.47 14H7.53l-.56 2.242a1 1 0 11-1.94-.485L5.47 14H3a1 1 0 110-2h2.97l1-4H5a1 1 0 110-2h2.47l.56-2.243a1 1 0 011.213-.727zM9.03 8l-1 4h2.938l1-4H9.031z"
 clip-rule="evenodd"
 /&gt;
 &lt;/svg&gt;
 &lt;/span&gt;
 &lt;span class="heading-text"&gt;Wait, can you really be a productive programmer in Windows?&lt;/span&gt;
&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Yes, or at least, WSL 2 will provide you with a Linux environment with all the fancy stuff such as a UNIX terminal (bash, zsh, &amp;hellip;), unix tools like curl, wget, ssh, &amp;hellip;, and everything you would need in a normal development environment, while still having a Windows OS where you can install some proprietary Windows-only apps.&lt;/p&gt;</description></item><item><title>How to install WSL2 on Windows 10</title><link>https://aalonso.dev/blog/2021/how-to-install-wsl2-on-windows-10-5e82/</link><pubDate>Mon, 07 Jun 2021 00:00:00 +0000</pubDate><guid>https://aalonso.dev/blog/2021/how-to-install-wsl2-on-windows-10-5e82/</guid><description>&lt;p&gt;This is the first post of a series that aims to explain &lt;a
 href="https://aalonso.dev/blog/tags/wsl/"&gt;how to get a fully productive and integrated Linux development environment within Windows 10&lt;/a&gt;. Today, I will explain what is WSL 2 and how to install it on Windows.&lt;/p&gt;
&lt;h2 id="what-is-wsl-2" class="relative"&gt;
&lt;a href="#what-is-wsl-2" class="group heading-anchor-link"&gt;
 &lt;span
 class="anchor-icon absolute -left-6 pr-2 opacity-0 group-hover:opacity-100 transition-opacity"
 aria-hidden="true"
 &gt;
 &lt;svg class="w-5 h-5 inline-block" fill="currentColor" viewBox="0 0 20 20"&gt;
 &lt;path
 fill-rule="evenodd"
 d="M9.243 3.03a1 1 0 01.727 1.213L9.53 6h2.94l.56-2.243a1 1 0 111.94.486L14.53 6H17a1 1 0 110 2h-2.97l-1 4H15a1 1 0 110 2h-2.47l-.56 2.242a1 1 0 11-1.94-.485L10.47 14H7.53l-.56 2.242a1 1 0 11-1.94-.485L5.47 14H3a1 1 0 110-2h2.97l1-4H5a1 1 0 110-2h2.47l.56-2.243a1 1 0 011.213-.727zM9.03 8l-1 4h2.938l1-4H9.031z"
 clip-rule="evenodd"
 /&gt;
 &lt;/svg&gt;
 &lt;/span&gt;
 &lt;span class="heading-text"&gt;What is WSL 2?&lt;/span&gt;
&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;On Microsoft words:&lt;/p&gt;</description></item></channel></rss>