<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Kowa's Blog]]></title><description><![CDATA[Cheerful, tech-savvy dragon who loves programming and often shares his passion through teaching. Also cherishes cozy naps!]]></description><link>https://kowalski7cc.xyz</link><generator>GatsbyJS</generator><lastBuildDate>Mon, 20 Apr 2026 13:39:30 GMT</lastBuildDate><item><title><![CDATA[Automatic LUKS 2 disk decryption with TPM 2 on Fedora]]></title><description><![CDATA[You just switched to Linux after years of Windows, and after setting up full disk encryption with LUKS2, you already miss one handy Windows…]]></description><link>https://kowalski7cc.xyz/blog/luks2-tpm2-clevis-fedora31</link><guid isPermaLink="false">https://kowalski7cc.xyz/blog/luks2-tpm2-clevis-fedora31</guid><pubDate>Wed, 03 Jan 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 1400px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/ad60af09dfbdce3c889f1ec4cacc2840/8aa6d/close-up-of-keys-333837.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 66.5%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsKCwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wgARCAANABQDASIAAhEBAxEB/8QAGAAAAgMAAAAAAAAAAAAAAAAAAAQFBgf/xAAVAQEBAAAAAAAAAAAAAAAAAAAAAf/aAAwDAQACEAMQAAABwF95ZawSIf/EABoQAAIDAQEAAAAAAAAAAAAAAAMEAQIFABP/2gAIAQEAAQUCVSYaIfINUUinqNXiR6ZFWCM+xP/EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EACUQAAIBAgMJAQAAAAAAAAAAAAECAwAhERJhBCIjMUFCQ8Hw8f/aAAgBAQAGPwJY4oyzGpGTimC04HjPsa1yrdOXE5LfXptpUWOK5NP29M6oIwe0dK//xAAeEAEAAQQDAQEAAAAAAAAAAAABABEhMVFBYXGx8P/aAAgBAQABPyHEVcwHa8BuEtUb+WnpTC0qY4sYGAOV/DqAgUeuygPjhvcFB6zKeJ//2gAMAwEAAgADAAAAEMM//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFREBAQAAAAAAAAAAAAAAAAAAABH/2gAIAQIBAT8QR//EABsQAQEAAwEBAQAAAAAAAAAAAAERACFBMVFx/9oACAEBAAE/EEuXAgOs0DakAFcXEACUUvdag2mL4tmsfzGa9aYQQ9UUF4qkdBI1pAWIwJ0qICxRZ36xidy1Dgzmf//Z&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/ad60af09dfbdce3c889f1ec4cacc2840/b01ca/close-up-of-keys-333837.avif 200w,
/static/ad60af09dfbdce3c889f1ec4cacc2840/f6dc2/close-up-of-keys-333837.avif 296w,
/static/ad60af09dfbdce3c889f1ec4cacc2840/320c3/close-up-of-keys-333837.avif 351w,
/static/ad60af09dfbdce3c889f1ec4cacc2840/b1e59/close-up-of-keys-333837.avif 401w,
/static/ad60af09dfbdce3c889f1ec4cacc2840/41fb2/close-up-of-keys-333837.avif 520w,
/static/ad60af09dfbdce3c889f1ec4cacc2840/6ad16/close-up-of-keys-333837.avif 696w,
/static/ad60af09dfbdce3c889f1ec4cacc2840/184cd/close-up-of-keys-333837.avif 890w,
/static/ad60af09dfbdce3c889f1ec4cacc2840/a1472/close-up-of-keys-333837.avif 936w,
/static/ad60af09dfbdce3c889f1ec4cacc2840/0f381/close-up-of-keys-333837.avif 1116w,
/static/ad60af09dfbdce3c889f1ec4cacc2840/feb99/close-up-of-keys-333837.avif 1296w,
/static/ad60af09dfbdce3c889f1ec4cacc2840/cbb88/close-up-of-keys-333837.avif 1400w,
/static/ad60af09dfbdce3c889f1ec4cacc2840/f2ba6/close-up-of-keys-333837.avif 6000w&quot;
              sizes=&quot;(max-width: 1400px) 100vw, 1400px&quot;
              type=&quot;image/avif&quot;
            /&gt;&lt;source
              srcset=&quot;/static/ad60af09dfbdce3c889f1ec4cacc2840/f1512/close-up-of-keys-333837.webp 200w,
/static/ad60af09dfbdce3c889f1ec4cacc2840/a3b27/close-up-of-keys-333837.webp 296w,
/static/ad60af09dfbdce3c889f1ec4cacc2840/935a0/close-up-of-keys-333837.webp 351w,
/static/ad60af09dfbdce3c889f1ec4cacc2840/3caab/close-up-of-keys-333837.webp 401w,
/static/ad60af09dfbdce3c889f1ec4cacc2840/44983/close-up-of-keys-333837.webp 520w,
/static/ad60af09dfbdce3c889f1ec4cacc2840/657d2/close-up-of-keys-333837.webp 696w,
/static/ad60af09dfbdce3c889f1ec4cacc2840/a870e/close-up-of-keys-333837.webp 890w,
/static/ad60af09dfbdce3c889f1ec4cacc2840/d4696/close-up-of-keys-333837.webp 936w,
/static/ad60af09dfbdce3c889f1ec4cacc2840/50b09/close-up-of-keys-333837.webp 1116w,
/static/ad60af09dfbdce3c889f1ec4cacc2840/0f215/close-up-of-keys-333837.webp 1296w,
/static/ad60af09dfbdce3c889f1ec4cacc2840/aa619/close-up-of-keys-333837.webp 1400w,
/static/ad60af09dfbdce3c889f1ec4cacc2840/ff8e1/close-up-of-keys-333837.webp 6000w&quot;
              sizes=&quot;(max-width: 1400px) 100vw, 1400px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/ad60af09dfbdce3c889f1ec4cacc2840/16d62/close-up-of-keys-333837.jpg 200w,
/static/ad60af09dfbdce3c889f1ec4cacc2840/e58b0/close-up-of-keys-333837.jpg 296w,
/static/ad60af09dfbdce3c889f1ec4cacc2840/32fcf/close-up-of-keys-333837.jpg 351w,
/static/ad60af09dfbdce3c889f1ec4cacc2840/f4e9b/close-up-of-keys-333837.jpg 401w,
/static/ad60af09dfbdce3c889f1ec4cacc2840/48cd8/close-up-of-keys-333837.jpg 520w,
/static/ad60af09dfbdce3c889f1ec4cacc2840/a4476/close-up-of-keys-333837.jpg 696w,
/static/ad60af09dfbdce3c889f1ec4cacc2840/25b46/close-up-of-keys-333837.jpg 890w,
/static/ad60af09dfbdce3c889f1ec4cacc2840/cfcb0/close-up-of-keys-333837.jpg 936w,
/static/ad60af09dfbdce3c889f1ec4cacc2840/5ac7a/close-up-of-keys-333837.jpg 1116w,
/static/ad60af09dfbdce3c889f1ec4cacc2840/4b3c3/close-up-of-keys-333837.jpg 1296w,
/static/ad60af09dfbdce3c889f1ec4cacc2840/da6ee/close-up-of-keys-333837.jpg 1400w,
/static/ad60af09dfbdce3c889f1ec4cacc2840/8aa6d/close-up-of-keys-333837.jpg 6000w&quot;
            sizes=&quot;(max-width: 1400px) 100vw, 1400px&quot;
            type=&quot;image/jpeg&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/ad60af09dfbdce3c889f1ec4cacc2840/da6ee/close-up-of-keys-333837.jpg&quot;
            alt=&quot;Photo courtesy of George Becker&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
  &lt;/a&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;Photo courtesy of George Becker&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;You just switched to Linux after years of Windows, and after setting up full disk encryption with LUKS2, you already miss one handy Windows feature: &lt;strong&gt;BitLocker and its automatic disk unlock&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Today we will learn how to approximate its behavior under the popular Linux distribution Fedora&lt;/p&gt;
&lt;p&gt;If you are using an old version of Fedora, you must use clevis to bind the TPM2 (TPM 1.0 is not supported and never will be) key to the LUKS volume, but if you are using Fedora 35 or later, you can use the new &lt;code&gt;systemd-cryptenroll&lt;/code&gt; command.&lt;/p&gt;
&lt;p&gt;First chech for available TPM2 devices:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;systemd-cryptenroll --tpm2-device=list
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And check for Secure Boot status, you need to enable it in order to prevent tampering with the boot process:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;mokutil --sb-state
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If you have a TPM2 device, you can use the following command to bind the TPM2 key to the LUKS volume:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo systemd-cryptenroll --wipe-slot tpm2 --tpm2-device auto --tpm2-pcrs &quot;0+1+2+3+4+5+7+9&quot; /dev/nvme0n1p3
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;where &lt;code&gt;--tpm2-pcrs&lt;/code&gt; is the list of PCRs to use for the binding, you can find more information about PCRs &lt;a href=&quot;#pcr-ids&quot;&gt;later in this article&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;You need to update the &lt;code&gt;/etc/crypttab&lt;/code&gt; file to unlock the volume at boot:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;luks-7a02e564-b7fa-4837-a3ec-3b83752c3a20 UUID=1f7f5ba4-01f8-419e-ae48-5daaa69bd1e6 none discard,tpm2-device=auto
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;On earlier versions of &lt;a href=&quot;https://koji.fedoraproject.org/koji/buildinfo?buildID=1929112&quot;&gt;Fedora (before 36)&lt;/a&gt;, you may update dracut to include libtss2 in the initramfs:&lt;/p&gt;
&lt;p&gt;Create a file &lt;code&gt;/etc/dracut.conf.d/tss2.conf&lt;/code&gt; with the following content:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;install_optional_items+=&quot; /usr/lib64/libtss2* &quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;and then regenerate the initramfs:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;dracut -f
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You can also add a recovery key to the LUKS volume. It&apos;s the same as the normal key, but it&apos;s generated with higher entropy.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;systemd-cryptenroll --recovery-key /dev/nvme0n1p3
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Clevis installation and configuration&lt;/h2&gt;
&lt;p&gt;The things we need (besides the LUKS2 installation we already did) to accomplish this task are the &lt;a href=&quot;https://en.wikipedia.org/wiki/Trusted_Platform_Module&quot;&gt;Trusted Platform Module&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;First things first, we need to install the Clevis framework and the needed plugins with Fedora&apos;s DNF package manager with this simple command:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;sudo dnf install clevis clevis-luks clevis-dracut clevis-udisks2 clevis-systemd&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Then we need to find the LUKS volume to bind, we can use the tool &lt;code&gt;lsblk&lt;/code&gt; to find the volume (In my case it was &lt;code&gt;nvme0n1p3&lt;/code&gt;).&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;[kowalski7cc@Kaos ~]$ lsblk
NAME                                          MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT
nvme0n1                                       259:0    0   477G  0 disk
├─nvme0n1p1                                   259:1    0   600M  0 part  /boot/efi
├─nvme0n1p2                                   259:2    0     1G  0 part  /boot
└─nvme0n1p3                                   259:3    0 475,4G  0 part
  └─luks-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx 253:0    0 475,3G  0 crypt
    ├─fedora_localhost--live-root             253:1    0    70G  0 lvm   /
    ├─fedora_localhost--live-swap             253:2    0   7,8G  0 lvm   [SWAP]
    └─fedora_localhost--live-home             253:3    0 397,6G  0 lvm   /home
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If we are right we should have an output like this using the tool &lt;code&gt;cryptsetup&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;[kowalski7cc@Kaos ~]$ sudo cryptsetup luksDump /dev/nvme0n1p3
[sudo] password di kowalski7cc:
LUKS header information
Version:        2
Epoch:          3
Metadata area:  16384 [bytes]
Keyslots area:  16744448 [bytes]
UUID:           xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
Label:          (no label)
Subsystem:      (no subsystem)
Flags:          (no flags)
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;PCR IDS&lt;/h2&gt;
&lt;p&gt;To make sure our boot has not tampered, we must choose some PCRs to validate against the boot.&lt;/p&gt;
&lt;p&gt;Here is a table with the IDs and a small description of its usage:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;PCR ID&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;Firmware&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Firmware configuration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Option ROMs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Option ROMs configuration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;MBR&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;MBR Configuration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;State transition&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;Platform-specific&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8 - 15&lt;/td&gt;
&lt;td&gt;Operating System reserved&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;Debug&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;23&lt;/td&gt;
&lt;td&gt;Applications&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;p&gt;Finally we can use the following command to set up the decryption key usin the TPM PCRs:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;sudo clevis luks bind -d /dev/nvme0n1p3 tpm2 &apos;{&quot;pcr_ids&quot;:&quot;0,1,2,3,4,5,6,7&quot;}&apos;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;If it&apos;s correct, it will ask for your LUKS encryption password and add the Clevis key to the LUKS header.&lt;/p&gt;
&lt;h2&gt;Key upgrade procedure&lt;/h2&gt;
&lt;p&gt;When we do a kernel upgrade, probably our saved key will be invalidated. At this point, we need first to locate the Clevis key slot in the LUKS header.&lt;/p&gt;
&lt;p&gt;We can use the command &lt;code&gt;cryptsetup luksDump&lt;/code&gt; like before to locate it.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;[kowalski7cc@Kaos ~]$  sudo cryptsetup luksDump /dev/nvme0n1p3
[sudo] password di kowalski7cc:
LUKS header information
Version:        2
Epoch:          7
...
Tokens:
  0: clevis
  Keyslot:  1
...
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;We can see that clevis is using Keyslot 1, so we can proceed with&lt;/p&gt;
&lt;p&gt;&lt;code&gt;sudo clevis luks unbind -d /dev/nvme0n1p3 -s 1&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Then we can use &lt;code&gt;sudo clevis luks bind...&lt;/code&gt; again to set up the new key.&lt;/p&gt;
&lt;h2&gt;Some notes and small thoughts about security&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;At the moment I&apos;ve tested successfully Clevis only with GRUB&lt;/li&gt;
&lt;li&gt;GRUB doesn&apos;t support measured boot, so it could be possible to tamper&lt;/li&gt;
&lt;li&gt;You need a full trusted chain of boot, e.g. using secureboot
&lt;ul&gt;
&lt;li&gt;You need to allow only your keys&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://thehackernews.com/2016/08/uefi-secure-boot-hack.html&quot;&gt;Oops! Microsoft Accidentally Leaks Backdoor Keys to Bypass UEFI Secure Boot&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://habr.com/en/post/446238/&quot;&gt;Exploiting signed bootloaders to circumvent UEFI Secure Boot
&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;TPM 2 has been proved to be unsafe when used alone
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.f-secure.com/cold-boot-attacks/&quot;&gt;The Chilling Reality of Cold Boot Attacks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.zdnet.com/article/new-bitlocker-attack-puts-laptops-storing-sensitive-data-at-risk/&quot;&gt;New BitLocker attack puts laptops storing sensitive data at risk&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.microsoft.com/en-us/windows/security/information-protection/bitlocker/bitlocker-countermeasures&quot;&gt;BitLocker Countermeasures&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;More things about secureboot, trustedboot, measuredboot
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://forums.juniper.net/t5/Security/What-s-the-Difference-between-Secure-Boot-and-Measured-Boot/ba-p/281251&quot;&gt;What’s the Difference between Secure Boot and Measured Boot?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://i.blackhat.com/asia-19/Fri-March-29/bh-asia-Matrosov-Modern-Secure-Boot-Attacks.pdf&quot;&gt;Modern Secure Boot attacks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.c7zero.info/stuff/BIOSandSecureBootAttacksUncovered_eko10.pdf&quot;&gt;BIOS and Secure Boot Attacks Uncovered&lt;/a&gt;
Additional resources&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://gist.github.com/jdoss/777e8b52c8d88eb87467935769c98a95&quot;&gt;Decrypt LUKS volumes with a TPM on Fedora 35+&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Systemd-boot install on Fedora 32 (Updated for Fedora 40)]]></title><description><![CDATA[Since many years, GRUB has been the default manager of every Linux distribution.
This until systemd-boot has born, allowing easier…]]></description><link>https://kowalski7cc.xyz/blog/systemd-boot-fedora-32</link><guid isPermaLink="false">https://kowalski7cc.xyz/blog/systemd-boot-fedora-32</guid><pubDate>Wed, 03 Jan 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 577px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/f7d90adeb38f45c3f4b7664c3e927e7e/1d708/systemd-logo.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 57.50000000000001%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAYAAABiDJ37AAAACXBIWXMAAAsTAAALEwEAmpwYAAABhklEQVR42q2Ty0tCQRTGx4g21aUgNA2iEMNI0+yBPZXcZC2KCCIhKIkWgq8etCjo/dikia37I6pNVPQgivYFFfb4C2rpvUr3a2aSkpZ2B37zzZlhPs45wxBJkmTKp1KQdDoNukAymcwZdj+VSnG4IeM/g93/MWQbj89vCK/FEFqNUt35IUjjENXQWhTTG7HvmOJf3ubnM5txTK3HcP/0wo1FUfo2PL64AVGbINR3o8jYgeKadgi1nSisc6DE5ISm2Q1VZSOK6LnA4pZeFOjtqOoagGBoxf7RGTdk5XPDk6tbFFtcmJzfgqnHA9eoH7b+MXjCi2ik6hjxoWlgHN65dbi9YQwHFuD0+NA3MY1q5yAOTi8zhmLG8PwapNSIvAobVDorKu19yFebQXQNIGV1VK0g5RYQrQUqrZVXU2hog941BKIx4/Bvhg+JV/iXthFYiWT1L8Jj1jOmwSwCtIezW3Gs7u7RdQR3j4nfHir+ymwSRVGm6eZM5nNweMmyLCsGy/CD8q4UX1JkFgmuCCZvAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/f7d90adeb38f45c3f4b7664c3e927e7e/b01ca/systemd-logo.avif 200w,
/static/f7d90adeb38f45c3f4b7664c3e927e7e/f6dc2/systemd-logo.avif 296w,
/static/f7d90adeb38f45c3f4b7664c3e927e7e/320c3/systemd-logo.avif 351w,
/static/f7d90adeb38f45c3f4b7664c3e927e7e/b1e59/systemd-logo.avif 401w,
/static/f7d90adeb38f45c3f4b7664c3e927e7e/41fb2/systemd-logo.avif 520w,
/static/f7d90adeb38f45c3f4b7664c3e927e7e/57726/systemd-logo.avif 577w&quot;
              sizes=&quot;(max-width: 577px) 100vw, 577px&quot;
              type=&quot;image/avif&quot;
            /&gt;&lt;source
              srcset=&quot;/static/f7d90adeb38f45c3f4b7664c3e927e7e/f1512/systemd-logo.webp 200w,
/static/f7d90adeb38f45c3f4b7664c3e927e7e/a3b27/systemd-logo.webp 296w,
/static/f7d90adeb38f45c3f4b7664c3e927e7e/935a0/systemd-logo.webp 351w,
/static/f7d90adeb38f45c3f4b7664c3e927e7e/3caab/systemd-logo.webp 401w,
/static/f7d90adeb38f45c3f4b7664c3e927e7e/44983/systemd-logo.webp 520w,
/static/f7d90adeb38f45c3f4b7664c3e927e7e/e47c1/systemd-logo.webp 577w&quot;
              sizes=&quot;(max-width: 577px) 100vw, 577px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/f7d90adeb38f45c3f4b7664c3e927e7e/f8f3a/systemd-logo.png 200w,
/static/f7d90adeb38f45c3f4b7664c3e927e7e/4a902/systemd-logo.png 296w,
/static/f7d90adeb38f45c3f4b7664c3e927e7e/8daf7/systemd-logo.png 351w,
/static/f7d90adeb38f45c3f4b7664c3e927e7e/766a7/systemd-logo.png 401w,
/static/f7d90adeb38f45c3f4b7664c3e927e7e/8b301/systemd-logo.png 520w,
/static/f7d90adeb38f45c3f4b7664c3e927e7e/1d708/systemd-logo.png 577w&quot;
            sizes=&quot;(max-width: 577px) 100vw, 577px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/f7d90adeb38f45c3f4b7664c3e927e7e/1d708/systemd-logo.png&quot;
            alt=&quot;Systemd logo&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
  &lt;/a&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;Systemd logo&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;Since many years, GRUB has been the default manager of every Linux distribution.
This until systemd-boot has born, allowing easier configuration and promising enhanced security for our devices.&lt;/p&gt;
&lt;p&gt;Let&apos;s see how to install it on Fedora 32 or Fedora 40&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If you&apos;re planning to install Fedora 39 or more recent, you can directly configure anaconda to use systemd-boot as bootloader, adding the following argument in the boot command line:&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;inst.sdboot
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;you can check the details on the &lt;a href=&quot;https://anaconda-installer.readthedocs.io/en/latest/boot-options.html#inst-sdboot&quot;&gt;Fedora 39 documentation&lt;/a&gt; and the &lt;a href=&quot;https://fedoraproject.org/wiki/Changes/cleanup_systemd_install&quot;&gt;Change on the Fedora Wiki&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This still not covers booting with secure boot enabled, you will need to enroll your own keys. You can use a tool like &lt;a href=&quot;https://github.com/Foxboron/sbctl&quot;&gt;sbctl&lt;/a&gt; to do that.&lt;/p&gt;
&lt;h2&gt;Take you responsabilities first&lt;/h2&gt;
&lt;p&gt;I am not responsible for bricked computers, system instabilities, dead cats, thermonuclear war or you getting fired because you lost important work.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Please make a backup of your device or of the data, and make a boot drive in case of necessity.&lt;/strong&gt;
Do some research if you have any concerns about steps documented in this guide.&lt;/p&gt;
&lt;p&gt;YOU are choosing to make these modifications, and if you point the finger at me for messing up your device, I will laugh at you.&lt;/p&gt;
&lt;h2&gt;Check if you are running EFI&lt;/h2&gt;
&lt;p&gt;Before doing anything, you should check that you are running using EFI, and if you have Secure Boot enabled, &lt;strong&gt;you may want to turn it off now&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;To do that, you can use the following one-liner:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;test -d /sys/firmware/efi &amp;#x26;&amp;#x26; echo EFI || echo Legacy
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If the result of the command will be &quot;EFI&quot;, you&apos;re good to go with this guide.&lt;/p&gt;
&lt;h2&gt;Move ESP mount to /efi&lt;/h2&gt;
&lt;p&gt;First of all, we need to move the ESP partition from &lt;code&gt;/boot/efi&lt;/code&gt; to &lt;code&gt;/efi&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Let&apos;s start by creating the folder for EFI mount point&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo mkdir /efi
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You can use Vim (or any other text editor you like) to edit the &lt;code&gt;fstab&lt;/code&gt; file using this command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo cp /etc/fstab /etc/fstab.bak # (Make a backup first if you are unsure)
sudo vi /etc/fstab
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Edit the line by entering in &quot;insert mode&quot; by pressing the &quot;&lt;code&gt;i&lt;/code&gt;&quot; button&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;UUID=xxxx-xxxx    /boot/efi    vfat    umask=0077,shortname=winnt 0 2
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;to:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;UUID=xxxx-xxxx    /efi    vfat    umask=0077,shortname=winnt 0 2
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Press the &lt;code&gt;esc&lt;/code&gt; button to return to normal mode, followed by &quot;&lt;code&gt;:wq&lt;/code&gt;&quot; to save the modified file and quit.&lt;/p&gt;
&lt;p&gt;If you edited correctly you should be able to run successfully the following commands to unmount the efi partition and mount it to the new path:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo systemctl daemon-reload
sudo umount /boot/efi
sudo umount /boot
sudo mount /efi
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;After this you will be able to cleanup the boot partition as well.&lt;/p&gt;
&lt;h2&gt;Install systemd-boot&lt;/h2&gt;
&lt;p&gt;The firts step is to create a folder in the ESP directory with the machine-id in the name&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo mkdir /efi/$(cat /etc/machine-id)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If you have Fedora 34+, you need to remove GRUB from DNF&apos;s protected packages&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo rm /etc/dnf/protected.d/{grub,shim}*
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;install systemd-boot and then uninstall GRUB related packages.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo dnf remove -y grubby grub2\* memtest86\* &amp;#x26;&amp;#x26; sudo rm -rf /boot/*
sudo dnf install -y systemd-boot-unsigned sdubby
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Do not reboot after this, or you will not be able to boot!&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Edit the file &lt;code&gt;/etc/kernel/install.conf&lt;/code&gt; to have tge following content:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;BOOT_ROOT=/efi
layout=bls
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;We can delete the boot partition using &lt;code&gt;parted&lt;/code&gt; and resize the esp partition. Pay attention to this step, as deleted partitions are (usually) unrecoverable. By default Fedora should create the first partition arount 500-600MB in VFAT for EFI/ESP and the second partition around 1-1.5GB for boot. With this layout you can safely delete the second one and grow the first. &lt;strong&gt;Your partition table may differ&lt;/strong&gt;, you can check this with &lt;code&gt;parted /dev/YOUR_DISK print&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;In my case the system disk is &lt;code&gt;/dev/vda&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;sudo parted /dev/vda rm 2
sudo umount /dev/vda1
sudo growpart /dev/vda 1
sudo mount /efi
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If you have used a custom partition layout, you will know how to proceed, good luck!&lt;/p&gt;
&lt;p&gt;Now we can install the bootloader and the kernel entries:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;cat /proc/cmdline | cut -d &apos; &apos; -f 2- | sudo tee /etc/kernel/cmdline
sudo bootctl install
sudo kernel-install add $(uname -r) /lib/modules/$(uname -r)/vmlinuz
sudo dnf reinstall kernel-core
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If everyting installs correcry, &lt;strong&gt;now&lt;/strong&gt; you can reboot, and you should boot normally using systemd-boot&lt;/p&gt;
&lt;p&gt;You can verify everything working correctly with&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo bootctl
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You can use &lt;a href=&quot;https://github.com/Foxboron/sbctl&quot;&gt;sbctl&lt;/a&gt; to setup Secure Boot signature with sistemd boot and enroll your keys.&lt;/p&gt;
&lt;p&gt;Enjoy systemd-boot!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 1175px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/f1af29bd0e7e476ccf10b600b093300b/384bf/systemd-boot.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 64.99999999999999%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAACXBIWXMAAAsTAAALEwEAmpwYAAABDElEQVR42q2S2WqDUBCGXUBwQ8ElPoErqKC4vEjv80Cll0nNXYu3pW/XlAjTmcMRWmsIkQgfvzPH+ZnDr1AUxT5N088oit7iOB6XhGE4VlXFoPflWZZlY9/373mef6DPXtB1/YSApmkXBNYwDIOxdkazpmlOpKqqDgI+RwSQMzJt5Jt7kJcw8OLCdQsT19d/hqIo/vmY6t+9uV70rxuuDc1IknTfhrIsQ5Ik0DQNo+s6aNsW6rqGsiwBkwZMEjBR1sOUQVGU64a0geu6EAQB7HY7poTv+2DbNliWxdRxHPA8jyktcfPKDw/lHtYM5//wi5tu4cw9DmR4euCVBwGDeMLVj8gz8rIRmj2Q1w999v/NHEW8XgAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/f1af29bd0e7e476ccf10b600b093300b/b01ca/systemd-boot.avif 200w,
/static/f1af29bd0e7e476ccf10b600b093300b/f6dc2/systemd-boot.avif 296w,
/static/f1af29bd0e7e476ccf10b600b093300b/320c3/systemd-boot.avif 351w,
/static/f1af29bd0e7e476ccf10b600b093300b/b1e59/systemd-boot.avif 401w,
/static/f1af29bd0e7e476ccf10b600b093300b/41fb2/systemd-boot.avif 520w,
/static/f1af29bd0e7e476ccf10b600b093300b/6ad16/systemd-boot.avif 696w,
/static/f1af29bd0e7e476ccf10b600b093300b/184cd/systemd-boot.avif 890w,
/static/f1af29bd0e7e476ccf10b600b093300b/a1472/systemd-boot.avif 936w,
/static/f1af29bd0e7e476ccf10b600b093300b/0f381/systemd-boot.avif 1116w,
/static/f1af29bd0e7e476ccf10b600b093300b/8f9c1/systemd-boot.avif 1175w&quot;
              sizes=&quot;(max-width: 1175px) 100vw, 1175px&quot;
              type=&quot;image/avif&quot;
            /&gt;&lt;source
              srcset=&quot;/static/f1af29bd0e7e476ccf10b600b093300b/f1512/systemd-boot.webp 200w,
/static/f1af29bd0e7e476ccf10b600b093300b/a3b27/systemd-boot.webp 296w,
/static/f1af29bd0e7e476ccf10b600b093300b/935a0/systemd-boot.webp 351w,
/static/f1af29bd0e7e476ccf10b600b093300b/3caab/systemd-boot.webp 401w,
/static/f1af29bd0e7e476ccf10b600b093300b/44983/systemd-boot.webp 520w,
/static/f1af29bd0e7e476ccf10b600b093300b/657d2/systemd-boot.webp 696w,
/static/f1af29bd0e7e476ccf10b600b093300b/a870e/systemd-boot.webp 890w,
/static/f1af29bd0e7e476ccf10b600b093300b/d4696/systemd-boot.webp 936w,
/static/f1af29bd0e7e476ccf10b600b093300b/50b09/systemd-boot.webp 1116w,
/static/f1af29bd0e7e476ccf10b600b093300b/e957e/systemd-boot.webp 1175w&quot;
              sizes=&quot;(max-width: 1175px) 100vw, 1175px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/f1af29bd0e7e476ccf10b600b093300b/f8f3a/systemd-boot.png 200w,
/static/f1af29bd0e7e476ccf10b600b093300b/4a902/systemd-boot.png 296w,
/static/f1af29bd0e7e476ccf10b600b093300b/8daf7/systemd-boot.png 351w,
/static/f1af29bd0e7e476ccf10b600b093300b/766a7/systemd-boot.png 401w,
/static/f1af29bd0e7e476ccf10b600b093300b/8b301/systemd-boot.png 520w,
/static/f1af29bd0e7e476ccf10b600b093300b/871fd/systemd-boot.png 696w,
/static/f1af29bd0e7e476ccf10b600b093300b/dcb99/systemd-boot.png 890w,
/static/f1af29bd0e7e476ccf10b600b093300b/14e2f/systemd-boot.png 936w,
/static/f1af29bd0e7e476ccf10b600b093300b/94f3c/systemd-boot.png 1116w,
/static/f1af29bd0e7e476ccf10b600b093300b/384bf/systemd-boot.png 1175w&quot;
            sizes=&quot;(max-width: 1175px) 100vw, 1175px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/f1af29bd0e7e476ccf10b600b093300b/384bf/systemd-boot.png&quot;
            alt=&quot;systemd-boot running inside GNOME Boxes&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
  &lt;/a&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;systemd-boot running inside GNOME Boxes&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;h2&gt;Sources&lt;/h2&gt;
&lt;p&gt;Thanks to all these people for their guides and tips:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/hboetes/wiki/wiki/systemd%E2%80%90boot-on-fedora-40&quot;&gt;hboetes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.reddit.com/r/Fedora/comments/ecjarj/is_there_any_way_to_update_nvidia_drivers_without/fbd86rv/&quot;&gt;ComplexConcentrate&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.reddit.com/r/Fedora/comments/ecjarj/is_there_any_way_to_update_nvidia_drivers_without/fbh30yv/&quot;&gt;XunSuslo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.reddit.com/r/Fedora/comments/c0f3z5/systemdboot/er4n5b6/&quot;&gt;gasinvein&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Top userful JavaScript shorthands]]></title><description><![CDATA[The if-else shorthand shorthand: react: Spread Operator Shorthand react: becomes Destructuring Or Short-circuit Evaluation shorthand: Object…]]></description><link>https://kowalski7cc.xyz/blog/javascript-shorthands</link><guid isPermaLink="false">https://kowalski7cc.xyz/blog/javascript-shorthands</guid><pubDate>Mon, 23 Aug 2021 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;The if-else shorthand&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;if (age &amp;#x3C; 18) {
  console.log(&quot;You cannot drive in some states&quot;);
} else {
  console.log(&quot;You can drive in some states&quot;);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;shorthand:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;console.log(
  age &amp;#x3C; 18
    ? &quot;Non You cannot drive in some states&quot;
    : &quot;You can drive in some states&quot;
);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;react:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-jsx&quot;&gt;&amp;#x3C;div&gt;
  {age &amp;#x3C; 18 ? (
    &amp;#x3C;Button disabled&gt;You cannot drive&amp;#x3C;/Button&gt;
  ) : (
    &amp;#x3C;Button&gt;Book your exam&amp;#x3C;/Button&gt;
  )}
&amp;#x3C;/div&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Spread Operator Shorthand&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;let numbers = [2, 3];
let fullNumbers = [1, ...numbers, 4, 5];
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;react:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;function GreetingFunction() {
  return &amp;#x3C;Greeting firstName=&apos;Kowalski&apos; lastName=&apos;Dragon&apos; /&gt;;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;becomes&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;function GreetingFunction() {
  const props = { firstName: &quot;Kowalski&quot;, lastName: &quot;Dragon&quot; };
  return &amp;#x3C;Greeting {...props} /&gt;;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Destructuring&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;let people = [&quot;Max&quot;, &quot;Anna&quot;, &quot;Tom&quot;];
let [firstBoy, , secondBoy] = people;
firstBoy; // Max
secondBoy; // Tom
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Or Short-circuit Evaluation&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;if (variable1 !== null || variable1 !== undefined || variable1 !== &quot;&quot;) {
  let variable2 = variable1;
} else {
  let variable2 = &quot;new&quot;;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;shorthand:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;const variable2 = variable1 || &quot;new&quot;;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Object Property Shorthand&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;const x = 1920,
  y = 1080;
const obj = { x: x, y: y };
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;shorthand:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;const obj = { x, y };
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Arrow Functions Shorthand&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;function sayHello(name) {
  console.log(&quot;Hello&quot;, name);
}

setTimeout(function () {
  console.log(&quot;Loaded&quot;);
}, 2000);

list.forEach(function (item) {
  console.log(item);
});
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;shorthand:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;sayHello = (name) =&gt; console.log(&quot;Hello&quot;, name);

setTimeout(() =&gt; console.log(&quot;Loaded&quot;), 2000);

list.forEach((item) =&gt; console.log(item));
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Implicit Return Shorthand&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;function calcCircumference(diameter) {
  return Math.PI * diameter;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;shorthand:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;calcCircumference = diameter =&gt; (
  Math.PI * diameter;
)
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Default Parameter Values&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;function volume(l, w, h) {
  if (w === undefined) w = 3;
  if (h === undefined) h = 4;
  return l * w * h;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;shorthand:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;volume = (l, w = 3, h = 4) =&gt; l * w * h;
volume(2); //output: 24
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;And shorthand with implicit return and arrow function&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;function isNotEmpty(arr) {
  if (Array.isArray(arr) &amp;#x26;&amp;#x26; arr.length &gt; 0) {
    return true;
  } else {
    return false;
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;shorthand:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;const isNotEmpty = (arr) =&gt; Array.isArray(arr) &amp;#x26;&amp;#x26; arr.length &gt; 0;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;react:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-jsx&quot;&gt;&amp;#x3C;div&gt;{articles &gt; 0 &amp;#x26;&amp;#x26; &amp;#x3C;ul&gt;...&amp;#x3C;/ul&gt;}&amp;#x3C;/div&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Template Literals&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;const welcome = &quot;You have logged in as &quot; + first + &quot; &quot; + last + &quot;.&quot;;
const db = &quot;http://&quot; + host + &quot;:&quot; + port + &quot;/&quot; + database;
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;const welcome = `You have logged in as ${first} ${last}`;
const db = `http://${host}:${port}/${database}`;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Sources&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://codingcheats.io/javascript#shorthands&quot;&gt;https://codingcheats.io/javascript#shorthands&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://javascript.plainenglish.io/4-useful-javascript-shorthands-you-can-use-in-react-js-ca9d2600bf3f&quot;&gt;https://javascript.plainenglish.io/4-useful-javascript-shorthands-you-can-use-in-react-js-ca9d2600bf3f&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.sitepoint.com/shorthand-javascript-techniques&quot;&gt;https://www.sitepoint.com/shorthand-javascript-techniques&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Gain back the control of your browser]]></title><description><![CDATA[Some sites decided that, for security or whatever any other reasons, you should not use certain browser functionalities. We can change that…]]></description><link>https://kowalski7cc.xyz/blog/gain-back-your-browser</link><guid isPermaLink="false">https://kowalski7cc.xyz/blog/gain-back-your-browser</guid><pubDate>Thu, 17 Jun 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 1400px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/3a9635bdb6113604376c270ebb3f99d9/7b24f/browser-1666982.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 57.00000000000001%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAA3XAAAN1wFCKJt4AAABVklEQVR42p1SS0vDQBDu//co6MGLHixqfYBgC7YXLcUHelDwpKWPiDXVvGyTNNnH50yyaQuWVl34lm93Zr6dmZ0SaIVSYf/1A9tdG9Whj4Y7Rt0Z4eTNwU7PRoVsu/1hhl6UwBcSTirhGjBPlWYpXeK9HwtsWQ72Bi5OhwGqnyOcEY7fPVQIR4RDg6YXouGM0fJD3AQR7r4i1MiXNaaCsQTyB/63JMVOFGaCfOBL1lyGPwnOZ1jwsqVw8OQD1j2s0MFDuw3df86NWv9eMM37i80esFan7WId5e4jNmq3wNU5uFtKqWnWSwUTIqHMIYlzWEi2mHhMfhFzsnlCYSRzFbFMUFApwpST9Y65VvlJz0qdUEBiglaWHNDrHZq3lwVoEzpxirHJbqEgj03xy7wiUh8kAi2auUtC04D5tR/BTmTWgqKKHyVL/og5iBVjoo1P4Z/wJxnbN7TQU9lEjgC/AAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/3a9635bdb6113604376c270ebb3f99d9/b01ca/browser-1666982.avif 200w,
/static/3a9635bdb6113604376c270ebb3f99d9/f6dc2/browser-1666982.avif 296w,
/static/3a9635bdb6113604376c270ebb3f99d9/320c3/browser-1666982.avif 351w,
/static/3a9635bdb6113604376c270ebb3f99d9/b1e59/browser-1666982.avif 401w,
/static/3a9635bdb6113604376c270ebb3f99d9/41fb2/browser-1666982.avif 520w,
/static/3a9635bdb6113604376c270ebb3f99d9/6ad16/browser-1666982.avif 696w,
/static/3a9635bdb6113604376c270ebb3f99d9/184cd/browser-1666982.avif 890w,
/static/3a9635bdb6113604376c270ebb3f99d9/a1472/browser-1666982.avif 936w,
/static/3a9635bdb6113604376c270ebb3f99d9/0f381/browser-1666982.avif 1116w,
/static/3a9635bdb6113604376c270ebb3f99d9/feb99/browser-1666982.avif 1296w,
/static/3a9635bdb6113604376c270ebb3f99d9/cbb88/browser-1666982.avif 1400w,
/static/3a9635bdb6113604376c270ebb3f99d9/113ff/browser-1666982.avif 2048w&quot;
              sizes=&quot;(max-width: 1400px) 100vw, 1400px&quot;
              type=&quot;image/avif&quot;
            /&gt;&lt;source
              srcset=&quot;/static/3a9635bdb6113604376c270ebb3f99d9/f1512/browser-1666982.webp 200w,
/static/3a9635bdb6113604376c270ebb3f99d9/a3b27/browser-1666982.webp 296w,
/static/3a9635bdb6113604376c270ebb3f99d9/935a0/browser-1666982.webp 351w,
/static/3a9635bdb6113604376c270ebb3f99d9/3caab/browser-1666982.webp 401w,
/static/3a9635bdb6113604376c270ebb3f99d9/44983/browser-1666982.webp 520w,
/static/3a9635bdb6113604376c270ebb3f99d9/657d2/browser-1666982.webp 696w,
/static/3a9635bdb6113604376c270ebb3f99d9/a870e/browser-1666982.webp 890w,
/static/3a9635bdb6113604376c270ebb3f99d9/d4696/browser-1666982.webp 936w,
/static/3a9635bdb6113604376c270ebb3f99d9/50b09/browser-1666982.webp 1116w,
/static/3a9635bdb6113604376c270ebb3f99d9/0f215/browser-1666982.webp 1296w,
/static/3a9635bdb6113604376c270ebb3f99d9/aa619/browser-1666982.webp 1400w,
/static/3a9635bdb6113604376c270ebb3f99d9/705b1/browser-1666982.webp 2048w&quot;
              sizes=&quot;(max-width: 1400px) 100vw, 1400px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/3a9635bdb6113604376c270ebb3f99d9/f8f3a/browser-1666982.png 200w,
/static/3a9635bdb6113604376c270ebb3f99d9/4a902/browser-1666982.png 296w,
/static/3a9635bdb6113604376c270ebb3f99d9/8daf7/browser-1666982.png 351w,
/static/3a9635bdb6113604376c270ebb3f99d9/766a7/browser-1666982.png 401w,
/static/3a9635bdb6113604376c270ebb3f99d9/8b301/browser-1666982.png 520w,
/static/3a9635bdb6113604376c270ebb3f99d9/871fd/browser-1666982.png 696w,
/static/3a9635bdb6113604376c270ebb3f99d9/dcb99/browser-1666982.png 890w,
/static/3a9635bdb6113604376c270ebb3f99d9/14e2f/browser-1666982.png 936w,
/static/3a9635bdb6113604376c270ebb3f99d9/94f3c/browser-1666982.png 1116w,
/static/3a9635bdb6113604376c270ebb3f99d9/8d830/browser-1666982.png 1296w,
/static/3a9635bdb6113604376c270ebb3f99d9/4af54/browser-1666982.png 1400w,
/static/3a9635bdb6113604376c270ebb3f99d9/7b24f/browser-1666982.png 2048w&quot;
            sizes=&quot;(max-width: 1400px) 100vw, 1400px&quot;
            type=&quot;image/png&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/3a9635bdb6113604376c270ebb3f99d9/4af54/browser-1666982.png&quot;
            alt=&quot;Image by 200 Degrees from Pixabay&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
  &lt;/a&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;Image by 200 Degrees from Pixabay&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;Some sites decided that, for security or whatever any other reasons, you should not use certain browser functionalities. We can change that behaveaur using bookmarklets, bookmarks you can store in your web browser that contains some JavaScript that add new features to it.&lt;/p&gt;
&lt;p&gt;Just add them to your favorites, and &quot;press&quot; on them when you need them!&lt;/p&gt;
&lt;h2&gt;Some userful bookmarklets&lt;/h2&gt;
&lt;p&gt;To add a bookmarklets to your browser, drag and drop the link in your favourites bar or add a new bookmark using the &quot;minified bookmarklet version&quot; as the url of the bookmark.&lt;/p&gt;
&lt;h3&gt;&lt;a href=&quot;javascript:void(document.addEventListener(%22paste%22,function(t)%7Breturn%20t.stopImmediatePropagation(),!0%7D,!0))&quot;&gt;Allow Paste&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Source:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;var allowPaste = function (e) {
  e.stopImmediatePropagation();
  return true;
};
document.addEventListener(&quot;paste&quot;, allowPaste, true);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Minified bookmarklet version:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;javascript: void document.addEventListener(
  &quot;paste&quot;,
  function (t) {
    return t.stopImmediatePropagation(), !0;
  },
  !0
);
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;a href=&quot;javascript:void(document.oncontextmenu=null)&quot;&gt;Right Click&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Code:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;javascript:void(document.oncontextmenu = null))
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;a href=&quot;javascript:(function()%7Bfunction%20R(n)%7Bona=%22on%22+n,window.addEventListener&amp;#x26;&amp;#x26;window.addEventListener(n,function(n)%7Bfor(var%20o=n.originalTarget;o;o=o.parentNode)o%5Bona%5D=null%7D,!0),window%5Bona%5D=null,document%5Bona%5D=null,document.body&amp;#x26;&amp;#x26;(document.body%5Bona%5D=null)%7DR(%22click%22),R(%22mousedown%22),R(%22mouseup%22),R(%22selectstart%22);%7D)()&quot;&gt;Text Selection&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Source:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;function R(a) {
  ona = &quot;on&quot; + a;
  if (window.addEventListener)
    window.addEventListener(
      a,
      function (e) {
        for (var n = e.originalTarget; n; n = n.parentNode) n[ona] = null;
      },
      true
    );
  window[ona] = null;
  document[ona] = null;
  if (document.body) document.body[ona] = null;
}
R(&quot;click&quot;);
R(&quot;mousedown&quot;);
R(&quot;mouseup&quot;);
R(&quot;selectstart&quot;);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Minified bookmarklet version:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;javascript: (function () {
  function R(n) {
    (ona = &quot;on&quot; + n),
      window.addEventListener &amp;#x26;&amp;#x26;
        window.addEventListener(
          n,
          function (n) {
            for (var o = n.originalTarget; o; o = o.parentNode) o[ona] = null;
          },
          !0
        ),
      (window[ona] = null),
      (document[ona] = null),
      document.body &amp;#x26;&amp;#x26; (document.body[ona] = null);
  }
  R(&quot;click&quot;), R(&quot;mousedown&quot;), R(&quot;mouseup&quot;), R(&quot;selectstart&quot;);
})();
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Sources:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Bookmarklet&quot;&gt;https://en.wikipedia.org/wiki/Bookmarklet&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.howtogeek.com/251807/how-to-enable-pasting-text-on-sites-that-block-it/&quot;&gt;https://www.howtogeek.com/251807/how-to-enable-pasting-text-on-sites-that-block-it/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://javascript-minifier.com/&quot;&gt;https://javascript-minifier.com/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[My homelab]]></title><description><![CDATA[What is packed inside my rack Ubiquiti USG 4 Pro Patch Panel Cable organizer Ubiquiti UniFi Switch 16 PoE Tim Hub Tado° Smart Thermostat…]]></description><link>https://kowalski7cc.xyz/blog/homelab</link><guid isPermaLink="false">https://kowalski7cc.xyz/blog/homelab</guid><pubDate>Thu, 19 Sep 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 1400px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/924ed691b82ac9d3cd2e6ffa23809afd/018d2/rack.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 133%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsKCwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wgARCAAbABQDASIAAhEBAxEB/8QAGgAAAQUBAAAAAAAAAAAAAAAAAAQFBgcIA//EABcBAAMBAAAAAAAAAAAAAAAAAAECAwT/2gAMAwEAAhADEAAAAasfGCYCsJFQVZuul1GHZm0sAov/xAAdEAACAgIDAQAAAAAAAAAAAAACBAEDAAUTFBUi/9oACAEBAAEFAkqxOLKKSzuMCSOxNXG9gErc/wBxTNkEsZVrLzZFWuWkPMVnNujRS3//xAAZEQACAwEAAAAAAAAAAAAAAAAAAgEDEwT/2gAIAQMBAT8BssZWNmJ5mMYP/8QAGREAAwEBAQAAAAAAAAAAAAAAAAECAwQT/9oACAECAQE/AYzmkeMC6pFqz//EACYQAAICAQEGBwAAAAAAAAAAAAECABEDBBIhMTNSsRMiMkJDgcH/2gAIAQEABj8CttVqkN/FjLDvNp9bnBHC9PR7xgNVmoHqMVUzZseM7/K5EVhqn8bqGQ3Hq/VvlhiuyPszmnh7o7KLF/kBOFbM5KykTYBF7jP/xAAeEAEBAQEAAgIDAAAAAAAAAAABESEAMVFxkUGhwf/aAAgBAQABPyFTQ8IP5joEbWjT8k/bitigwp789hrBxfkE3lBcz7db2kVKUPldvZxAGPDe0pkm+s5+CfXHMgaLPPaBnxDWIYrU/h3/2gAMAwEAAgADAAAAEJQKs//EABwRAAICAgMAAAAAAAAAAAAAAAABESExkUFh0f/aAAgBAwEBPxCFLnsaXF7GMRt+E1tn/8QAHREAAgICAwEAAAAAAAAAAAAAAREAITGRQcHR8P/aAAgBAgEBPxByIFLj7qMutCB5eh7CAFif/8QAHxABAQADAAICAwAAAAAAAAAAAREAITFBUWFxgdHw/9oACAEBAAE/ECJ4DhrEElbr6wjqDomvNHdrergrtBLVEcPxhw67UKijKAr3WNITVhBi9UVYfV24krI7O5x5pgdCBRS7jJo9vcLFIhRDoI2p7mBk3ytAo6/rhPMqVStXeLkSNkf3hogR3syD2B+DP//Z&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/924ed691b82ac9d3cd2e6ffa23809afd/b01ca/rack.avif 200w,
/static/924ed691b82ac9d3cd2e6ffa23809afd/f6dc2/rack.avif 296w,
/static/924ed691b82ac9d3cd2e6ffa23809afd/320c3/rack.avif 351w,
/static/924ed691b82ac9d3cd2e6ffa23809afd/b1e59/rack.avif 401w,
/static/924ed691b82ac9d3cd2e6ffa23809afd/41fb2/rack.avif 520w,
/static/924ed691b82ac9d3cd2e6ffa23809afd/6ad16/rack.avif 696w,
/static/924ed691b82ac9d3cd2e6ffa23809afd/184cd/rack.avif 890w,
/static/924ed691b82ac9d3cd2e6ffa23809afd/a1472/rack.avif 936w,
/static/924ed691b82ac9d3cd2e6ffa23809afd/0f381/rack.avif 1116w,
/static/924ed691b82ac9d3cd2e6ffa23809afd/feb99/rack.avif 1296w,
/static/924ed691b82ac9d3cd2e6ffa23809afd/cbb88/rack.avif 1400w,
/static/924ed691b82ac9d3cd2e6ffa23809afd/2f6bd/rack.avif 3771w&quot;
              sizes=&quot;(max-width: 1400px) 100vw, 1400px&quot;
              type=&quot;image/avif&quot;
            /&gt;&lt;source
              srcset=&quot;/static/924ed691b82ac9d3cd2e6ffa23809afd/f1512/rack.webp 200w,
/static/924ed691b82ac9d3cd2e6ffa23809afd/a3b27/rack.webp 296w,
/static/924ed691b82ac9d3cd2e6ffa23809afd/935a0/rack.webp 351w,
/static/924ed691b82ac9d3cd2e6ffa23809afd/3caab/rack.webp 401w,
/static/924ed691b82ac9d3cd2e6ffa23809afd/44983/rack.webp 520w,
/static/924ed691b82ac9d3cd2e6ffa23809afd/657d2/rack.webp 696w,
/static/924ed691b82ac9d3cd2e6ffa23809afd/a870e/rack.webp 890w,
/static/924ed691b82ac9d3cd2e6ffa23809afd/d4696/rack.webp 936w,
/static/924ed691b82ac9d3cd2e6ffa23809afd/50b09/rack.webp 1116w,
/static/924ed691b82ac9d3cd2e6ffa23809afd/0f215/rack.webp 1296w,
/static/924ed691b82ac9d3cd2e6ffa23809afd/aa619/rack.webp 1400w,
/static/924ed691b82ac9d3cd2e6ffa23809afd/7f4a7/rack.webp 3771w&quot;
              sizes=&quot;(max-width: 1400px) 100vw, 1400px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/924ed691b82ac9d3cd2e6ffa23809afd/16d62/rack.jpg 200w,
/static/924ed691b82ac9d3cd2e6ffa23809afd/e58b0/rack.jpg 296w,
/static/924ed691b82ac9d3cd2e6ffa23809afd/32fcf/rack.jpg 351w,
/static/924ed691b82ac9d3cd2e6ffa23809afd/f4e9b/rack.jpg 401w,
/static/924ed691b82ac9d3cd2e6ffa23809afd/48cd8/rack.jpg 520w,
/static/924ed691b82ac9d3cd2e6ffa23809afd/a4476/rack.jpg 696w,
/static/924ed691b82ac9d3cd2e6ffa23809afd/25b46/rack.jpg 890w,
/static/924ed691b82ac9d3cd2e6ffa23809afd/cfcb0/rack.jpg 936w,
/static/924ed691b82ac9d3cd2e6ffa23809afd/5ac7a/rack.jpg 1116w,
/static/924ed691b82ac9d3cd2e6ffa23809afd/4b3c3/rack.jpg 1296w,
/static/924ed691b82ac9d3cd2e6ffa23809afd/da6ee/rack.jpg 1400w,
/static/924ed691b82ac9d3cd2e6ffa23809afd/018d2/rack.jpg 3771w&quot;
            sizes=&quot;(max-width: 1400px) 100vw, 1400px&quot;
            type=&quot;image/jpeg&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/924ed691b82ac9d3cd2e6ffa23809afd/da6ee/rack.jpg&quot;
            alt=&quot;&amp;quot;The Rack&amp;quot;&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
  &lt;/a&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;&amp;quot;The Rack&amp;quot;&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;h2&gt;What is packed inside my rack&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Ubiquiti USG 4 Pro&lt;/li&gt;
&lt;li&gt;Patch Panel&lt;/li&gt;
&lt;li&gt;Cable organizer&lt;/li&gt;
&lt;li&gt;Ubiquiti UniFi Switch 16 PoE&lt;/li&gt;
&lt;li&gt;Tim Hub&lt;/li&gt;
&lt;li&gt;Tado° Smart Thermostat&lt;/li&gt;
&lt;li&gt;Dell R210 II
&lt;ul&gt;
&lt;li&gt;Intel Xeon E3 1265l V2&lt;/li&gt;
&lt;li&gt;16GB ECC Buffered&lt;/li&gt;
&lt;li&gt;2x 3TB WD Red&lt;/li&gt;
&lt;li&gt;Samsung 860 Evo 250GB SSD&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;UPS CyberPower 900VA&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Total power usage: Less than 120 Watts!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 1400px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/2e0f611304d47b4312a8ef90d6c2dc76/8018f/server.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 75%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsKCwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wgARCAAPABQDASIAAhEBAxEB/8QAGAAAAgMAAAAAAAAAAAAAAAAAAAYEBQf/xAAVAQEBAAAAAAAAAAAAAAAAAAACBv/aAAwDAQACEAMQAAABpV5olztBnYxBf//EABkQAAMBAQEAAAAAAAAAAAAAAAEDBAUCEv/aAAgBAQABBQLKzvfaUtNLoej3HgynhmNKTRgxhv8A/8QAGREAAgMBAAAAAAAAAAAAAAAAAQQAAhEh/9oACAEDAQE/AbqM3Oi2QLMjmif/xAAbEQABBAMAAAAAAAAAAAAAAAABAAIEERIUIf/aAAgBAgEBPwFs+MwY0tuMe0V//8QAIxAAAgECBAcAAAAAAAAAAAAAAQIAAxESISOTEzEzUWFjkf/aAAgBAQAGPwJtKm91I1TyPfzESoyimxILYLS+D5nB1dwyxFTCPYZlxdwz/8QAGxABAAMBAQEBAAAAAAAAAAAAAQARITFBUfD/2gAIAQEAAT8hWhslAqwB1AHSinGuzHDfiKbH5VR3efGQBjGmB+/Z/9oADAMBAAIAAwAAABB//wD/xAAbEQEAAQUBAAAAAAAAAAAAAAABABEhQZGh0f/aAAgBAwEBPxBQQOBbcgBUb8n/xAAcEQEAAQQDAAAAAAAAAAAAAAABABEhQWFxodH/2gAIAQIBAT8QMJqaL9zENePZ/8QAHRABAQACAwADAAAAAAAAAAAAAREAITFBYVFxgf/aAAgBAQABPxCQ3Uh4DaFNcacpfZ6y2ZOYwbOZcUAFoCFQt+I/SZJrCOz133t/ctEcCEDNR0+94MiHRXH/2Q==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/2e0f611304d47b4312a8ef90d6c2dc76/b01ca/server.avif 200w,
/static/2e0f611304d47b4312a8ef90d6c2dc76/f6dc2/server.avif 296w,
/static/2e0f611304d47b4312a8ef90d6c2dc76/320c3/server.avif 351w,
/static/2e0f611304d47b4312a8ef90d6c2dc76/b1e59/server.avif 401w,
/static/2e0f611304d47b4312a8ef90d6c2dc76/41fb2/server.avif 520w,
/static/2e0f611304d47b4312a8ef90d6c2dc76/6ad16/server.avif 696w,
/static/2e0f611304d47b4312a8ef90d6c2dc76/184cd/server.avif 890w,
/static/2e0f611304d47b4312a8ef90d6c2dc76/a1472/server.avif 936w,
/static/2e0f611304d47b4312a8ef90d6c2dc76/0f381/server.avif 1116w,
/static/2e0f611304d47b4312a8ef90d6c2dc76/feb99/server.avif 1296w,
/static/2e0f611304d47b4312a8ef90d6c2dc76/cbb88/server.avif 1400w,
/static/2e0f611304d47b4312a8ef90d6c2dc76/511ee/server.avif 3593w&quot;
              sizes=&quot;(max-width: 1400px) 100vw, 1400px&quot;
              type=&quot;image/avif&quot;
            /&gt;&lt;source
              srcset=&quot;/static/2e0f611304d47b4312a8ef90d6c2dc76/f1512/server.webp 200w,
/static/2e0f611304d47b4312a8ef90d6c2dc76/a3b27/server.webp 296w,
/static/2e0f611304d47b4312a8ef90d6c2dc76/935a0/server.webp 351w,
/static/2e0f611304d47b4312a8ef90d6c2dc76/3caab/server.webp 401w,
/static/2e0f611304d47b4312a8ef90d6c2dc76/44983/server.webp 520w,
/static/2e0f611304d47b4312a8ef90d6c2dc76/657d2/server.webp 696w,
/static/2e0f611304d47b4312a8ef90d6c2dc76/a870e/server.webp 890w,
/static/2e0f611304d47b4312a8ef90d6c2dc76/d4696/server.webp 936w,
/static/2e0f611304d47b4312a8ef90d6c2dc76/50b09/server.webp 1116w,
/static/2e0f611304d47b4312a8ef90d6c2dc76/0f215/server.webp 1296w,
/static/2e0f611304d47b4312a8ef90d6c2dc76/aa619/server.webp 1400w,
/static/2e0f611304d47b4312a8ef90d6c2dc76/d2d9f/server.webp 3593w&quot;
              sizes=&quot;(max-width: 1400px) 100vw, 1400px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/2e0f611304d47b4312a8ef90d6c2dc76/16d62/server.jpg 200w,
/static/2e0f611304d47b4312a8ef90d6c2dc76/e58b0/server.jpg 296w,
/static/2e0f611304d47b4312a8ef90d6c2dc76/32fcf/server.jpg 351w,
/static/2e0f611304d47b4312a8ef90d6c2dc76/f4e9b/server.jpg 401w,
/static/2e0f611304d47b4312a8ef90d6c2dc76/48cd8/server.jpg 520w,
/static/2e0f611304d47b4312a8ef90d6c2dc76/a4476/server.jpg 696w,
/static/2e0f611304d47b4312a8ef90d6c2dc76/25b46/server.jpg 890w,
/static/2e0f611304d47b4312a8ef90d6c2dc76/cfcb0/server.jpg 936w,
/static/2e0f611304d47b4312a8ef90d6c2dc76/5ac7a/server.jpg 1116w,
/static/2e0f611304d47b4312a8ef90d6c2dc76/4b3c3/server.jpg 1296w,
/static/2e0f611304d47b4312a8ef90d6c2dc76/da6ee/server.jpg 1400w,
/static/2e0f611304d47b4312a8ef90d6c2dc76/8018f/server.jpg 3593w&quot;
            sizes=&quot;(max-width: 1400px) 100vw, 1400px&quot;
            type=&quot;image/jpeg&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/2e0f611304d47b4312a8ef90d6c2dc76/da6ee/server.jpg&quot;
            alt=&quot;Server Dell R210 II&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
  &lt;/a&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;Server Dell R210 II&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;Happy homelabbing everyone!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[My battlestation]]></title><description><![CDATA[What is on my desk Dell XPS 13 9350 Intel Core i7 6560U Samsung 500GB SSD NVMe 16GB DDR3l 4K touch display Edifier Luna Eclipse Dell WD1…]]></description><link>https://kowalski7cc.xyz/blog/battlestation</link><guid isPermaLink="false">https://kowalski7cc.xyz/blog/battlestation</guid><pubDate>Tue, 17 Sep 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 1400px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/10f6ee57496c4e24a8d20255e82dad06/e1ade/battlestation.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 67%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsKCwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wgARCAANABQDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAQFBv/EABYBAQEBAAAAAAAAAAAAAAAAAAQAAf/aAAwDAQACEAMQAAABjW8YsVzhDLf/xAAaEAACAwEBAAAAAAAAAAAAAAADBAECBREA/9oACAEBAAEFAllVmxMchXVy6vOVoGBBIEvnuGP/AP/EABkRAAIDAQAAAAAAAAAAAAAAAAABExRBYf/aAAgBAwEBPwGv0ia0/8QAGhEAAgIDAAAAAAAAAAAAAAAAAAECIQQRE//aAAgBAgEBPwF5G7OsXbR//8QAIBAAAgIBBAMBAAAAAAAAAAAAAQIAEQMEEiExEyJRcv/aAAgBAQAGPwLCh1KqX91JHQhC6lsAWy+StwqNkGqUCgKac4t3H2FfEQP3ctwWNV3P/8QAHhABAAEEAgMAAAAAAAAAAAAAAQARITFBUXGBscH/2gAIAQEAAT8hCC7SFwEXWZSSAK0cPNobNhupbxETqNPkQ7cfsRU2BK4hgn//2gAMAwEAAgADAAAAEAMf/8QAGhEAAgIDAAAAAAAAAAAAAAAAAAERkTFB8P/aAAgBAwEBPxBT0owl2j//xAAbEQACAQUAAAAAAAAAAAAAAAAAAREhMVFhcf/aAAgBAgEBPxCQoOm79M8n/8QAGxABAAMBAQEBAAAAAAAAAAAAAREhMQBBUWH/2gAIAQEAAT8QfUvr0yICKEUuOiudClReJRjc48R+AYAGmaMznrb0BYOhcNoMkw4TrqoA+Q6H596XX1cijDAo7//Z&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/10f6ee57496c4e24a8d20255e82dad06/b01ca/battlestation.avif 200w,
/static/10f6ee57496c4e24a8d20255e82dad06/f6dc2/battlestation.avif 296w,
/static/10f6ee57496c4e24a8d20255e82dad06/320c3/battlestation.avif 351w,
/static/10f6ee57496c4e24a8d20255e82dad06/b1e59/battlestation.avif 401w,
/static/10f6ee57496c4e24a8d20255e82dad06/41fb2/battlestation.avif 520w,
/static/10f6ee57496c4e24a8d20255e82dad06/6ad16/battlestation.avif 696w,
/static/10f6ee57496c4e24a8d20255e82dad06/184cd/battlestation.avif 890w,
/static/10f6ee57496c4e24a8d20255e82dad06/a1472/battlestation.avif 936w,
/static/10f6ee57496c4e24a8d20255e82dad06/0f381/battlestation.avif 1116w,
/static/10f6ee57496c4e24a8d20255e82dad06/feb99/battlestation.avif 1296w,
/static/10f6ee57496c4e24a8d20255e82dad06/cbb88/battlestation.avif 1400w,
/static/10f6ee57496c4e24a8d20255e82dad06/d5b12/battlestation.avif 6016w&quot;
              sizes=&quot;(max-width: 1400px) 100vw, 1400px&quot;
              type=&quot;image/avif&quot;
            /&gt;&lt;source
              srcset=&quot;/static/10f6ee57496c4e24a8d20255e82dad06/f1512/battlestation.webp 200w,
/static/10f6ee57496c4e24a8d20255e82dad06/a3b27/battlestation.webp 296w,
/static/10f6ee57496c4e24a8d20255e82dad06/935a0/battlestation.webp 351w,
/static/10f6ee57496c4e24a8d20255e82dad06/3caab/battlestation.webp 401w,
/static/10f6ee57496c4e24a8d20255e82dad06/44983/battlestation.webp 520w,
/static/10f6ee57496c4e24a8d20255e82dad06/657d2/battlestation.webp 696w,
/static/10f6ee57496c4e24a8d20255e82dad06/a870e/battlestation.webp 890w,
/static/10f6ee57496c4e24a8d20255e82dad06/d4696/battlestation.webp 936w,
/static/10f6ee57496c4e24a8d20255e82dad06/50b09/battlestation.webp 1116w,
/static/10f6ee57496c4e24a8d20255e82dad06/0f215/battlestation.webp 1296w,
/static/10f6ee57496c4e24a8d20255e82dad06/aa619/battlestation.webp 1400w,
/static/10f6ee57496c4e24a8d20255e82dad06/d05a5/battlestation.webp 6016w&quot;
              sizes=&quot;(max-width: 1400px) 100vw, 1400px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/10f6ee57496c4e24a8d20255e82dad06/16d62/battlestation.jpg 200w,
/static/10f6ee57496c4e24a8d20255e82dad06/e58b0/battlestation.jpg 296w,
/static/10f6ee57496c4e24a8d20255e82dad06/32fcf/battlestation.jpg 351w,
/static/10f6ee57496c4e24a8d20255e82dad06/f4e9b/battlestation.jpg 401w,
/static/10f6ee57496c4e24a8d20255e82dad06/48cd8/battlestation.jpg 520w,
/static/10f6ee57496c4e24a8d20255e82dad06/a4476/battlestation.jpg 696w,
/static/10f6ee57496c4e24a8d20255e82dad06/25b46/battlestation.jpg 890w,
/static/10f6ee57496c4e24a8d20255e82dad06/cfcb0/battlestation.jpg 936w,
/static/10f6ee57496c4e24a8d20255e82dad06/5ac7a/battlestation.jpg 1116w,
/static/10f6ee57496c4e24a8d20255e82dad06/4b3c3/battlestation.jpg 1296w,
/static/10f6ee57496c4e24a8d20255e82dad06/da6ee/battlestation.jpg 1400w,
/static/10f6ee57496c4e24a8d20255e82dad06/e1ade/battlestation.jpg 6016w&quot;
            sizes=&quot;(max-width: 1400px) 100vw, 1400px&quot;
            type=&quot;image/jpeg&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/10f6ee57496c4e24a8d20255e82dad06/da6ee/battlestation.jpg&quot;
            alt=&quot;My battlestation&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
  &lt;/a&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;My battlestation&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;h2&gt;What is on my desk&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Dell XPS 13 9350
&lt;ul&gt;
&lt;li&gt;Intel Core i7 6560U&lt;/li&gt;
&lt;li&gt;Samsung 500GB SSD NVMe&lt;/li&gt;
&lt;li&gt;16GB DDR3l&lt;/li&gt;
&lt;li&gt;4K touch display&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Edifier Luna Eclipse&lt;/li&gt;
&lt;li&gt;Dell WD15 Dock&lt;/li&gt;
&lt;li&gt;AOC 23&quot; FHD 3D monitor&lt;/li&gt;
&lt;li&gt;&lt;del&gt;Google&lt;/del&gt; Nest Home Mini&lt;/li&gt;
&lt;li&gt;Logitech Keyboard K810&lt;/li&gt;
&lt;li&gt;Logitech MX Master mouse&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/tux-droid&quot; title=&quot;My TuxDroid GitHub repository&quot;&gt;Kysoh TuxDroid&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;gatsby-resp-image-figure&quot; style=&quot;&quot;&gt;
    &lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 1400px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/8a2bad80132392064a5b65571d9e58f0/e1ade/tuxdroid.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 67%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsKCwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wgARCAANABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAQGBQf/xAAVAQEBAAAAAAAAAAAAAAAAAAADBf/aAAwDAQACEAMQAAABmNxV2PW5CUop/wD/xAAaEAADAQEBAQAAAAAAAAAAAAACBAUBAwYU/9oACAEBAAEFArLePyayffygtGxR7KF82uVu9URVJPf/xAAbEQACAQUAAAAAAAAAAAAAAAAAAgEEERQxQf/aAAgBAwEBPwFaSzQy6MZen//EABoRAAICAwAAAAAAAAAAAAAAAAABAgQRFEH/2gAIAQIBAT8Bldbymjalw//EAB8QAAIBBAIDAAAAAAAAAAAAAAECAwAREjEEIRMyQf/aAAgBAQAGPwJYIYipyW1238ArjccSMY5luTuzAdijM15L6IpZFALLrKvHycXsbg46pkSXonL1r//EABwQAQACAgMBAAAAAAAAAAAAAAEAESExQVFh0f/aAAgBAQABPyE/wq7v0EEyfx4r40wntDAKITat0CX3DFGFANOpk0eiMXxP/9oADAMBAAIAAwAAABDoP//EABwRAAICAgMAAAAAAAAAAAAAAAERADEhQWHR8P/aAAgBAwEBPxDFCzBDrvzg0S+Ep//EABsRAQEAAgMBAAAAAAAAAAAAABEBIUEAMVFh/9oACAECAQE/EJFS3BZTtcGiHrrdTOH15//EABwQAQADAQADAQAAAAAAAAAAAAERITEAQVFhcf/aAAgBAQABPxC8pOiEwAJVg/OVwEKng8WiNBjL8a02VQR78v1eLjiNQIom+nRzviSkxpBTOpbwYkvbViHK7//Z&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;picture&gt;
          &lt;source
              srcset=&quot;/static/8a2bad80132392064a5b65571d9e58f0/b01ca/tuxdroid.avif 200w,
/static/8a2bad80132392064a5b65571d9e58f0/f6dc2/tuxdroid.avif 296w,
/static/8a2bad80132392064a5b65571d9e58f0/320c3/tuxdroid.avif 351w,
/static/8a2bad80132392064a5b65571d9e58f0/b1e59/tuxdroid.avif 401w,
/static/8a2bad80132392064a5b65571d9e58f0/41fb2/tuxdroid.avif 520w,
/static/8a2bad80132392064a5b65571d9e58f0/6ad16/tuxdroid.avif 696w,
/static/8a2bad80132392064a5b65571d9e58f0/184cd/tuxdroid.avif 890w,
/static/8a2bad80132392064a5b65571d9e58f0/a1472/tuxdroid.avif 936w,
/static/8a2bad80132392064a5b65571d9e58f0/0f381/tuxdroid.avif 1116w,
/static/8a2bad80132392064a5b65571d9e58f0/feb99/tuxdroid.avif 1296w,
/static/8a2bad80132392064a5b65571d9e58f0/cbb88/tuxdroid.avif 1400w,
/static/8a2bad80132392064a5b65571d9e58f0/d5b12/tuxdroid.avif 6016w&quot;
              sizes=&quot;(max-width: 1400px) 100vw, 1400px&quot;
              type=&quot;image/avif&quot;
            /&gt;&lt;source
              srcset=&quot;/static/8a2bad80132392064a5b65571d9e58f0/f1512/tuxdroid.webp 200w,
/static/8a2bad80132392064a5b65571d9e58f0/a3b27/tuxdroid.webp 296w,
/static/8a2bad80132392064a5b65571d9e58f0/935a0/tuxdroid.webp 351w,
/static/8a2bad80132392064a5b65571d9e58f0/3caab/tuxdroid.webp 401w,
/static/8a2bad80132392064a5b65571d9e58f0/44983/tuxdroid.webp 520w,
/static/8a2bad80132392064a5b65571d9e58f0/657d2/tuxdroid.webp 696w,
/static/8a2bad80132392064a5b65571d9e58f0/a870e/tuxdroid.webp 890w,
/static/8a2bad80132392064a5b65571d9e58f0/d4696/tuxdroid.webp 936w,
/static/8a2bad80132392064a5b65571d9e58f0/50b09/tuxdroid.webp 1116w,
/static/8a2bad80132392064a5b65571d9e58f0/0f215/tuxdroid.webp 1296w,
/static/8a2bad80132392064a5b65571d9e58f0/aa619/tuxdroid.webp 1400w,
/static/8a2bad80132392064a5b65571d9e58f0/d05a5/tuxdroid.webp 6016w&quot;
              sizes=&quot;(max-width: 1400px) 100vw, 1400px&quot;
              type=&quot;image/webp&quot;
            /&gt;
          &lt;source
            srcset=&quot;/static/8a2bad80132392064a5b65571d9e58f0/16d62/tuxdroid.jpg 200w,
/static/8a2bad80132392064a5b65571d9e58f0/e58b0/tuxdroid.jpg 296w,
/static/8a2bad80132392064a5b65571d9e58f0/32fcf/tuxdroid.jpg 351w,
/static/8a2bad80132392064a5b65571d9e58f0/f4e9b/tuxdroid.jpg 401w,
/static/8a2bad80132392064a5b65571d9e58f0/48cd8/tuxdroid.jpg 520w,
/static/8a2bad80132392064a5b65571d9e58f0/a4476/tuxdroid.jpg 696w,
/static/8a2bad80132392064a5b65571d9e58f0/25b46/tuxdroid.jpg 890w,
/static/8a2bad80132392064a5b65571d9e58f0/cfcb0/tuxdroid.jpg 936w,
/static/8a2bad80132392064a5b65571d9e58f0/5ac7a/tuxdroid.jpg 1116w,
/static/8a2bad80132392064a5b65571d9e58f0/4b3c3/tuxdroid.jpg 1296w,
/static/8a2bad80132392064a5b65571d9e58f0/da6ee/tuxdroid.jpg 1400w,
/static/8a2bad80132392064a5b65571d9e58f0/e1ade/tuxdroid.jpg 6016w&quot;
            sizes=&quot;(max-width: 1400px) 100vw, 1400px&quot;
            type=&quot;image/jpeg&quot;
          /&gt;
          &lt;img
            class=&quot;gatsby-resp-image-image&quot;
            src=&quot;/static/8a2bad80132392064a5b65571d9e58f0/da6ee/tuxdroid.jpg&quot;
            alt=&quot;My penguin robot, TuxDroid&quot;
            title=&quot;&quot;
            loading=&quot;lazy&quot;
            decoding=&quot;async&quot;
            style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
          /&gt;
        &lt;/picture&gt;
  &lt;/a&gt;
    &lt;/span&gt;
    &lt;figcaption class=&quot;gatsby-resp-image-figcaption&quot;&gt;My penguin robot, TuxDroid&lt;/figcaption&gt;
  &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;That&apos;s it :)&lt;/p&gt;</content:encoded></item></channel></rss>