<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Karel Křemel</title>
    <description>The latest articles on DEV Community by Karel Křemel (@alembiq).</description>
    <link>https://dev.to/alembiq</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F730647%2Fb885e958-9d25-4e49-896c-9e98c76147b0.jpeg</url>
      <title>DEV Community: Karel Křemel</title>
      <link>https://dev.to/alembiq</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/alembiq"/>
    <language>en</language>
    <item>
      <title>Why don't police have a universal key to all the locks?</title>
      <dc:creator>Karel Křemel</dc:creator>
      <pubDate>Wed, 20 Aug 2025 18:12:44 +0000</pubDate>
      <link>https://dev.to/alembiq/why-dont-police-have-a-universal-key-to-all-the-locks-3aef</link>
      <guid>https://dev.to/alembiq/why-dont-police-have-a-universal-key-to-all-the-locks-3aef</guid>
      <description>&lt;p&gt;Nobody believes that this universal key won’t be used against them, that it won’t be misused, or that they can keep it safe from any bad actor making a copy.&lt;/p&gt;

&lt;p&gt;But why am I telling you this? At this very moment, the European Union (of which I am generally fond) is currently proposing a universal key/backdoor/surveillance for everything we will ever send through our digital channels. Every message, every image, every file should be scanned - without our consent.&lt;/p&gt;

&lt;p&gt;Let me reiterate on my example with a universal key. Imagine a government official/politician pushing for a new problematic keyword to be added to their local language pack or something. But he might have an agenda other than child protection (which is the official argument for all of this); it might be to track people with different political/ideological ideas than he prefers. People speaking about abortion, LGBTwhatever, God, dissidents, you name it.&lt;/p&gt;

&lt;p&gt;I don’t trust anybody to have access to any such ultimate surveillance tool. Sure, it’s not full 1984, but it’s undoubtedly a significant step in that direction.&lt;/p&gt;

&lt;p&gt;Fifteen member states already support it, three are opposing, and nine are undecided. As a member of one of those undecided countries, I’m currently reaching out to my representatives, trying to explain why this would be bad for all of us, and I believe you should do the same.&lt;/p&gt;

&lt;p&gt;There is a website &lt;a href="https://fightchatcontrol.eu/" rel="noopener noreferrer"&gt;fightchatcontrol.eu&lt;/a&gt; that can provide you with all the necessary contact information for your representatives. Currently undecided countries are: Belgium, Czech Republic, Estonia, Finland, Germany, Greece, Luxembourg, Romania and Slovenia.&lt;/p&gt;

&lt;p&gt;So please, if you’re from one of these countries, think about it and get in touch with your representatives and stop this before we lose the rest of our privacy. Right now, you can go to the &lt;a href="https://fightchatcontrol.eu/" rel="noopener noreferrer"&gt;fightchatcontrol.eu&lt;/a&gt; pick your country and get phone number, social media contacts, email addresses, office addresses to your representatives and tell/write them that your privacy matters!&lt;/p&gt;

&lt;p&gt;And yes, children’s safety is essential - I can see that more and more as I’m becoming a father at any moment now. But this approach will ultimately make children less safe, not more. Criminals and predators will simply move to more obscure and unmonitored platforms or create their own encrypted tools (it happened in the past). At the same time, law-abiding families would lose their digital privacy and security. We’re essentially proposing to weaken everyone’s front door locks because some criminals might be hiding behind them. Still, the criminals will just find other hiding places while honest families become more vulnerable to break-ins.&lt;/p&gt;

</description>
      <category>privacy</category>
    </item>
    <item>
      <title>Making Git Hooks Persistent - No More Manual Setup</title>
      <dc:creator>Karel Křemel</dc:creator>
      <pubDate>Tue, 24 Jun 2025 11:30:23 +0000</pubDate>
      <link>https://dev.to/alembiq/making-git-hooks-persistent-no-more-manual-setup-47m7</link>
      <guid>https://dev.to/alembiq/making-git-hooks-persistent-no-more-manual-setup-47m7</guid>
      <description>&lt;p&gt;During a recent interview, I had an interesting conversation about coding standards and building pipelines. The company I was speaking with took developer responsibility seriously—they had linters, quality checks, and a dedicated team. But there was something that didn't quite add up.&lt;/p&gt;

&lt;p&gt;They were trying to automate everything, yet developers still had to run linters manually before committing code. When I asked why they weren't using pre-commit &lt;a href="https://git-scm.com/book/ms/v2/Customizing-Git-Git-Hooks" rel="noopener noreferrer"&gt;git hooks&lt;/a&gt;, they explained: "Oh, we have pre-commit hooks that run the linter, but developers need to activate them manually after cloning the repository."&lt;/p&gt;

&lt;p&gt;That's when it clicked. They had git hooks, but they weren't persistent. Every time someone cloned the repo, they got the default sample hooks instead of the team's carefully crafted automation.&lt;/p&gt;

&lt;p&gt;I realized they didn't know about a straightforward configuration that could make their hooks work automatically for everyone immediately after cloning.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Root Issue
&lt;/h2&gt;

&lt;p&gt;The problem is that Git doesn't track the &lt;code&gt;.git/hooks/&lt;/code&gt; directory. When you clone a repository, you get the default sample hooks - not the team's custom automation. This forces teams into workarounds that defeat the purpose of automation.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Solution: Custom Hook Paths
&lt;/h2&gt;

&lt;p&gt;Git lets you set a custom location for hooks using the &lt;code&gt;core.hooksPath&lt;/code&gt; setting. Pointing it to a tracked directory in your repository makes your hooks become part of the codebase.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Create Your Hook Directory
&lt;/h3&gt;

&lt;p&gt;Create a directory in your repository to store hooks:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; scripts/git-hooks
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 2: Configure Git to Use Your Custom Path
&lt;/h3&gt;

&lt;p&gt;Add this to your repository's &lt;code&gt;.gitconfig&lt;/code&gt; file (create it, if needed):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[core]
    hooksPath = ./scripts/git-hooks/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Commit this file to your repository.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Create Your Hooks
&lt;/h3&gt;

&lt;p&gt;Here's a simple example of a pre-commit hook that runs PHP linting:&lt;br&gt;
&lt;strong&gt;scripts/git-hooks/pre-commit&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/usr/bin/env bash&lt;/span&gt;

&lt;span class="nv"&gt;REPO&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;git rev-parse &lt;span class="nt"&gt;--show-toplevel&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;

&lt;span class="c"&gt;# Get list of staged PHP files&lt;/span&gt;
&lt;span class="nv"&gt;FILES&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;git status &lt;span class="nt"&gt;--porcelain&lt;/span&gt; | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="s1"&gt;'^[AM] .*\.php$'&lt;/span&gt; | &lt;span class="nb"&gt;cut&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt; 3- | &lt;span class="nb"&gt;tr&lt;/span&gt; &lt;span class="s1"&gt;'\n'&lt;/span&gt; &lt;span class="s1"&gt;' '&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$FILES&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
    &lt;span class="nv"&gt;$REPO&lt;/span&gt;/source/vendor/bin/php-cs-fixer &lt;span class="nt"&gt;--no-interaction&lt;/span&gt; &lt;span class="nt"&gt;--config&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$REPO&lt;/span&gt;/.quality/php-cs-fixer.php fix &lt;span class="nv"&gt;$FILES&lt;/span&gt;
    git add &lt;span class="nv"&gt;$FILES&lt;/span&gt;
&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Make it executable:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;chmod&lt;/span&gt; +x scripts/git-hooks/pre-commit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 4: Test and Commit
&lt;/h3&gt;

&lt;p&gt;Test your hook:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git add &lt;span class="nb"&gt;.&lt;/span&gt;
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"Add persistent git hooks"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Advanced Example: PHP Project with Multiple Tools
&lt;/h2&gt;

&lt;p&gt;I developed this solution years ago, and it has since grown significantly. It now supports more than just PHP — it also checks for the availability of required tools and offers to install them if missing.&lt;br&gt;
Don't get me wrong, it is far from perfect. There's still room for improvement. It assumes a &lt;a href="https://www.debian.org/" rel="noopener noreferrer"&gt;Debian&lt;/a&gt;-based Linux environment, doesn't run unit tests, and has other limitations. However, it's sufficient for &lt;a href="https://gitlab.com/alembiq/bistro" rel="noopener noreferrer"&gt;BiStro&lt;/a&gt;, the project for which it was initially built.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/usr/bin/env bash&lt;/span&gt;

&lt;span class="nv"&gt;REPO&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;git rev-parse &lt;span class="nt"&gt;--show-toplevel&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;COMPOSER_HOME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$PWD&lt;/span&gt;&lt;span class="s2"&gt;/.composer"&lt;/span&gt;

&lt;span class="nv"&gt;ECS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$REPO&lt;/span&gt;&lt;span class="s2"&gt;/source/vendor/bin/ecs"&lt;/span&gt;
&lt;span class="nv"&gt;ECS_CONFIG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$REPO&lt;/span&gt;&lt;span class="s2"&gt;/.quality/ecs.php"&lt;/span&gt;
&lt;span class="nv"&gt;PHPCS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$REPO&lt;/span&gt;&lt;span class="s2"&gt;/source/vendor/bin/php-cs-fixer"&lt;/span&gt;
&lt;span class="nv"&gt;PHPCS_CONFIG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$REPO&lt;/span&gt;&lt;span class="s2"&gt;/.quality/php-cs-fixer.php"&lt;/span&gt;
&lt;span class="nv"&gt;LATTE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$REPO&lt;/span&gt;&lt;span class="s2"&gt;/source/vendor/bin/latte-lint"&lt;/span&gt;
&lt;span class="nv"&gt;PHPSTAN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$REPO&lt;/span&gt;&lt;span class="s2"&gt;/source/vendor/bin/phpstan"&lt;/span&gt;
&lt;span class="nv"&gt;PHPSTAN_CONFIG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$REPO&lt;/span&gt;&lt;span class="s2"&gt;/.quality/phpstan.neon"&lt;/span&gt;

&lt;span class="nv"&gt;FILES&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt; git status &lt;span class="nt"&gt;--porcelain&lt;/span&gt; | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="s1"&gt;'^[AM] .*\.\(php\|md\)$'&lt;/span&gt; | &lt;span class="nb"&gt;cut&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt; 3- | &lt;span class="nb"&gt;tr&lt;/span&gt; &lt;span class="s1"&gt;'\n'&lt;/span&gt; &lt;span class="s1"&gt;' '&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;

&lt;span class="nb"&gt;exec&lt;/span&gt; &amp;lt; /dev/tty

&lt;span class="k"&gt;function &lt;/span&gt;install_tools&lt;span class="o"&gt;()&lt;/span&gt;
&lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nt"&gt;-qq&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; &lt;span class="nb"&gt;install &lt;/span&gt;composer
    composer &lt;span class="nb"&gt;install
    &lt;/span&gt;composer require &lt;span class="nt"&gt;--dev&lt;/span&gt; symplify/easy-coding-standard
    composer require &lt;span class="nt"&gt;--dev&lt;/span&gt; friendsofphp/php-cs-fixer
    composer require &lt;span class="nt"&gt;--dev&lt;/span&gt; phpstan/phpstan
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt; &lt;span class="nt"&gt;-x&lt;/span&gt; &lt;span class="nv"&gt;$ECS&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt; &lt;span class="nt"&gt;-x&lt;/span&gt; &lt;span class="nv"&gt;$LATTE&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt; &lt;span class="nt"&gt;-x&lt;/span&gt; &lt;span class="nv"&gt;$PHPCS&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt; &lt;span class="nt"&gt;-x&lt;/span&gt; &lt;span class="nv"&gt;$PHPSTAN&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
    while &lt;/span&gt;&lt;span class="nb"&gt;read&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="s2"&gt;"No validation tools found, should I install them? (Y/n) "&lt;/span&gt; yn&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
        case&lt;/span&gt; &lt;span class="nv"&gt;$yn&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt;
            &lt;span class="o"&gt;[&lt;/span&gt;Yy] &lt;span class="p"&gt;)&lt;/span&gt; install_tools&lt;span class="p"&gt;;;&lt;/span&gt;
            &lt;span class="o"&gt;[&lt;/span&gt;Nn] &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nb"&gt;exit &lt;/span&gt;1&lt;span class="p"&gt;;;&lt;/span&gt;
            &lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Please answer y (yes) or n (no):"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="k"&gt;continue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;esac
    done
fi

if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-x&lt;/span&gt; &lt;span class="nv"&gt;$ECS&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-x&lt;/span&gt; &lt;span class="nv"&gt;$LATTE&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-x&lt;/span&gt; &lt;span class="nv"&gt;$PHPCS&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
    if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$FILES&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
        &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"################################## PHP LINTER ##################################"&lt;/span&gt;
        &lt;span class="nv"&gt;$ECS&lt;/span&gt; check  &lt;span class="nt"&gt;--config&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$ECS_CONFIG&lt;/span&gt; &lt;span class="nt"&gt;--fix&lt;/span&gt; &lt;span class="nv"&gt;$FILES&lt;/span&gt;
        &lt;span class="nv"&gt;$PHPCS&lt;/span&gt; &lt;span class="nt"&gt;--no-interaction&lt;/span&gt; &lt;span class="nt"&gt;--config&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$PHPCS_CONFIG&lt;/span&gt; fix &lt;span class="nv"&gt;$FILES&lt;/span&gt;
        git add &lt;span class="nv"&gt;$FILES&lt;/span&gt;
    &lt;span class="k"&gt;fi

    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"################################# LATTE LINTER #################################"&lt;/span&gt;
    &lt;span class="nv"&gt;$LATTE&lt;/span&gt; &lt;span class="nv"&gt;$repo_root&lt;/span&gt;/source/templates
    git add &amp;lt; git status &lt;span class="nt"&gt;--porcelain&lt;/span&gt; | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="s1"&gt;'^[MA] .*\.latte$'&lt;/span&gt;

    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"################################ STATIC ANALYSIS ###############################"&lt;/span&gt;
    &lt;span class="nv"&gt;$PHPSTAN&lt;/span&gt; analyse &lt;span class="nt"&gt;--no-interaction&lt;/span&gt; &lt;span class="nt"&gt;--memory-limit&lt;/span&gt; 512M &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="nv"&gt;$PHPSTAN_CONFIG&lt;/span&gt;
&lt;span class="k"&gt;fi

&lt;/span&gt;&lt;span class="nb"&gt;exec&lt;/span&gt; &amp;lt;&amp;amp;-
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>git</category>
      <category>devops</category>
      <category>cicd</category>
    </item>
    <item>
      <title>Surviving Months Without a Keyboard</title>
      <dc:creator>Karel Křemel</dc:creator>
      <pubDate>Fri, 03 Mar 2023 10:24:41 +0000</pubDate>
      <link>https://dev.to/alembiq/surviving-months-without-a-keyboard-3he5</link>
      <guid>https://dev.to/alembiq/surviving-months-without-a-keyboard-3he5</guid>
      <description>&lt;p&gt;Do you spend a lot of time working on a computer? If so, you’re not alone. Many people in the IT industry rely on computers for work and leisure. But have you ever considered what would happen if you couldn’t use a keyboard for several months?&lt;/p&gt;

&lt;p&gt;I recently experienced this firsthand when my primary hand started to hurt 24/7. Sleepless nights full of pain and inability to do anything with my right hand. Considering it from today’s point of view, my inability to use the keyboard was just a minor nuisance.&lt;/p&gt;

&lt;p&gt;Yes, I could still write with my left hand, but did you ever try that? Writing more than a paragraph was traumatic because of the slow pace and constant need to check for typos. It’s frustrating.&lt;/p&gt;

&lt;p&gt;My doctor initially tried to immobilise my hand and prescribed painkillers, but the problem persisted.&lt;/p&gt;

&lt;p&gt;Unfortunately, seeing an orthopedist took almost three months because of the high demand for them. Ultimately, it took him ten minutes and one injection to restore some of my hand function. That doesn’t mean my hand is OK and I can do anything like before. I still struggle with tasks like turning keys in locks and opening bottles.&lt;/p&gt;

&lt;p&gt;While waiting those three months, I’ve gotten help from an ambulance surgeon specialising in hands. He diagnosed me with arthritis in my thumb joint and inflamed tendons in my palm. He gave me another brace from my general doctor and some anti-inflammatory meds.&lt;/p&gt;

&lt;p&gt;I share my experience not to elicit sympathy but to warn others about the importance of caring for your hands. Investing in ergonomic equipment like a comfortable mouse and keyboard can prevent injury and promote good hand health, whether in an office or home. Also, rest your hands and do not overload them as I did.&lt;/p&gt;

&lt;p&gt;After talking to the doctors, I understood that the excessive use of mice, which Windows forces you a lot, can significantly strain your hands and cause repetitive strain injuries if not arthrosis. As someone who has mainly used Linux and relied on keyboard shortcuts for years, I found the frequent use of a mouse in Windows, which my employer required me to use, frustrating and detrimental to my health.&lt;/p&gt;

&lt;p&gt;Hand injuries can be a massive problem for a computer user. They can be costly regarding lost productivity and medical expenses, so it’s worth preventative measures like investing in a proper ergonomic keyboard and mouse – but even that can’t save you from a chronic overload of your hands – it can just postpone the problems. Regularly performing hand exercises is vital to keep your hands healthy and preventing injuries.&lt;/p&gt;

&lt;p&gt;Your hands are your most valuable tools; neglecting them can have serious consequences.&lt;/p&gt;

</description>
      <category>software</category>
    </item>
    <item>
      <title>My photography backup strategy</title>
      <dc:creator>Karel Křemel</dc:creator>
      <pubDate>Wed, 26 Oct 2022 07:22:28 +0000</pubDate>
      <link>https://dev.to/alembiq/my-photography-backup-strategy-m68</link>
      <guid>https://dev.to/alembiq/my-photography-backup-strategy-m68</guid>
      <description>&lt;p&gt;Over the years, I've promised to describe my digital photography backup strategy to you multiple times. I wrote this article a few times in the past but have yet to publish it, as I've ironically lost it numerous times. But I always kept my photographs. Well, that is, if we don't count the moment &lt;a href="https://en.karelkremel.com/pragoffest/"&gt;the card in the camera died&lt;/a&gt;, which wasn't caused by backup strategy but faulty hardware even before I managed to get the files from the camera. &lt;br&gt;
If you don't care about the specifics of my workflow and you're looking for a generally good strategy - check the 3-2-1 backup rule by Peter Krogh:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;3: Create one primary backup and two copies of your data.
2: Save your backups to two different types of media.
1: Keep at least one backup file offsite.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But if you care about the workflow I developed when Peter published the rule above, please read on. A warning must be placed here, though - I'm an IT nerd, and some of the details might be overly technical ;) &lt;/p&gt;

&lt;p&gt;1) Since the incident mentioned earlier, I'm trying to use cameras that are storing files on two cards simultaneously - I wonder if this can be counted as part of a backup strategy. Still, it's good practice when your camera supports it. Both cards would likely die at different times.&lt;br&gt;&lt;br&gt;
2a) If I'm running out of space on the cards when travelling. I copy the data to my notebook and an external drive before removing the files from the cards. Using &lt;a href="https://damonlynch.net/rapid/"&gt;Rapid Photo downloader&lt;/a&gt; - it downloads all the media files and sorts them into the directories in both locations simultaneously. The notebook and external disk aren't stored in the same bag to be safer. I also try to upload all the files to my home server, but uploading sixty-four gigabytes over the internet is only sometimes possible. Therefore, when high-speed internet isn't available, I delete data from only one card from two sets, allowing me to keep another third copy and have two empty cards in the camera.&lt;br&gt;&lt;br&gt;
2b) Usually, I only fill some of the cards at a time, and before I get home, I would make just one extra copy to my notebook.&lt;br&gt;&lt;br&gt;
3) After getting home, I'm downloading all the pictures to my desktop and the server (again, Rapid Photo downloader). Once again, I'm keeping everything from the cards before all the copies are created.&lt;br&gt;&lt;br&gt;
4) Because all of my devices are connected to one local network + powered by one power source, + they are in one physical location. Therefore they are vulnerable to the same risks at the same time. I've reused an ancient &lt;a href="https://www.raspberrypi.com/products/raspberry-pi-1-model-b-plus/"&gt;Raspberry Pi 1&lt;/a&gt; and put some external disk drives into it. This is a remote location online backup. This microcomputer periodically checks my home server photo backup directory and downloads any new files. Connectivity between the machines is provided and encrypted by &lt;a href="https://tailscale.com/"&gt;tailstcale vpn&lt;/a&gt;. Synchronization is done by simple rsync that's periodically executed by crontab.&lt;br&gt;&lt;br&gt;
5) Offline backups: I'm burning the pictures to BR disks (in the past, DVDs). Always two pieces, each on a medium from a different manufacturer and in another drive. One copy is stored at home, the second at a remote location.&lt;br&gt;&lt;br&gt;
6) After depositing the offline backup to the remote location, I'm finally willing to delete the data from my workstation, keep them live only on my home server, and remote copy in the old Raspberry Pi. &lt;/p&gt;

&lt;p&gt;Yes, it sounds overcomplicated and a bit as if I was more paranoid than Fox Mulder, but once I've set this workflow up, it's doing most of the jobs itself without my direct interaction. My pictures would survive even a nuclear blast and related EMP (at least in one of the locations). Nobody is saying that you should do the same - even if you would skip half of the operations I've listed, you would still fit into the 3-2-1 rule. However, I would also add something to the 3-2-1 rule - test your backups periodically. Manufacturers claim that their CD/DVD/BR disks should hold data for a hundred years, but it's common for disks to be unreadable just two years later. &lt;/p&gt;

&lt;p&gt;Most of the workflow can be used for any other data to be backed up. For example, all the data can be automatically backed up in the &lt;a href="https://nextcloud.com/"&gt;Nextcloud&lt;/a&gt; directory to the server, and Raspberry would create a secondary copy of the Nextcloud offsite. This solution is possible due to Nextcloud having clients for mobile devices, so one can access all their documents from their phone. At the same time, it's important to say that all those data might be accessed by anyone who would grab your phone and try to open it. &lt;/p&gt;

&lt;p&gt;BTW all the software I'm using is free and open source:) &lt;/p&gt;

</description>
      <category>backup</category>
      <category>photograph</category>
    </item>
    <item>
      <title>Do you remember Ultima Online?</title>
      <dc:creator>Karel Křemel</dc:creator>
      <pubDate>Wed, 12 Oct 2022 08:35:04 +0000</pubDate>
      <link>https://dev.to/alembiq/do-you-remember-ultima-online-4da2</link>
      <guid>https://dev.to/alembiq/do-you-remember-ultima-online-4da2</guid>
      <description>&lt;p&gt;It has already been twenty-five years since we could go to Sosaria together. It was quite new to play with other people in a graphical game. Ultima Online wasn't the first online MMORPG (although now it's assumed the term came with this game). But I do believe it was the best one. Why do I think so? I will get to it, but first, a bit of history lesson.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://uo.com/"&gt;Ultima Online&lt;/a&gt; was released on 24 September 1997. After some close alpha and beta, it's even older for some people, but for us mere mortals, it's twenty-five years old! What an achievement.&lt;/p&gt;

&lt;p&gt;The official servers are still on, not like with some other games. While writing this post, I checked on them - they're online but empty. I have visited 10 servers and found barely anyone. And those I saw were just standing in the bank and didn't react to my attempts to communicate. It was sad. I remember the game flourishing with life those almost twenty years ago when I left.&lt;br&gt;
Yes, I left almost twenty years ago, and now I'm complaining the world is empty of players. It might be that the players had reasons, the same as I did. I had problems with the changes the Age of Shadows introduced.&lt;/p&gt;

&lt;p&gt;But I should start at the beginning, not at the end. I was just finishing primary school and totaly oblivious of UO existence when it launched. I found out about it about two years later. But it was unaccessible to me. You needed a credit card that had enable internet payments - not doable at that point in the Czech Republic. My temporary workaround was playing on some Czech unofficial servers and waiting for the any of the Czech banks to acknowledge internet.&lt;br&gt;
Such an even happened when I finished my secondary school. So I finally moved to the official Ultima Online servers. It was 18 August 2001. The game was glorious! &lt;br&gt;
On the free shards (that's what Ultima servers are called), some things didn't work, and some were weird. On the official ones, everything made sense, and everything worked. &lt;br&gt;
However, as I've mentioned - the perfection was broken with the new expansion less than two years later. It was very emotional for me, leaving the best game I knew. It was also the moment when my Sisiphoasian quest begun - I've started to look for an online game that would make long term sense to me. After all that time, many online games even more disapointments I can admin to myself that I was just looking for the good old UO. &lt;br&gt;
I really hope that one day I will be able to get over it. To be happy with some other MMORPG for longer period of time. Now it is time to explain to you why do I think it was the best game. It's my point of view, I'm certainly not trying to convince you that it's the game for you, it quite possibly isn't. But this list might give you some thinks to considerer. It certainly&lt;br&gt;
isn't a definite list. And they might not work so well separately, but together they were magical.&lt;/p&gt;

&lt;h3&gt;
  
  
  No endgame
&lt;/h3&gt;

&lt;p&gt;Can you even imagine it? No endgame content. Everything is available from the beginning. No scaling of difficulty. No content to run towards? Nothing to skip because it's below your current level? As there weren't any areas scaled by character level, people were everywhere, and all the dungeons were full. And this was the time before anything was instantiated, so you could see the world flourishing with life. &lt;br&gt;
It also meant that everything was hard. You were more often dead than you've celebrated success. But when you did, that feeling of success was enormous.&lt;/p&gt;

&lt;h3&gt;
  
  
  Equipment wasn't that important
&lt;/h3&gt;

&lt;p&gt;The variety of equipment wasn't significant. You didn't have fifty variants of a sword (with two hundred different visuals). There was no need to grind for better gear, spending a week in a dungeon to get 'the sword'. And it was good, especially considering that all your equipment stayed in your dead body whenever you were killed. Free to loot by anyone. &lt;br&gt;
Imagine how stressful it would be using your rare, special equipment and losing it every time something/someone kills you? Would you even use it? Having generic equipment didn't make it that painful. You didn't need to finish some dungeon fifty times to re-equip your character. &lt;br&gt;
On the other hand, you needed to take care of your equipment. It (not only weapons, everything) was falling apart when you used it. That meant eighter training some other characters as crafters or finding others who already did.&lt;/p&gt;

&lt;h3&gt;
  
  
  Crafting was valuable
&lt;/h3&gt;

&lt;p&gt;Almost all the items in the game were craftable by players. It made economic sense to craft and sell what you've produced. Technically everything was consumable (even armour if used long enough), so every crafting skill was monetisable.&lt;br&gt;
Sure it was long before any auction houses (and their "digital download" delivery of anything, anywhere, instantly) of today. But you could hire a vendor and put it into your house to sell your stuff.&lt;/p&gt;

&lt;h3&gt;
  
  
  Player Housing &amp;amp; Vendors
&lt;/h3&gt;

&lt;p&gt;You could own a house. Your unique home. Not just another instance of a place a thousand other players have. Could anything else in the game give you more feeling of belonging somewhere? It wasn't cheap, but it was another achievement to collect enough money to get it.&lt;br&gt;
The cause of the price here was limited space in the world where you could build houses. There just wasn't enough space for everybody to own a house. The prices skyrocketed over time, as with the actual housing market.&lt;br&gt;
Houses deteriorate over time if left unattended for more than a week. And when they collapsed, they made space for new buildings.&lt;br&gt;
To make it even more interesting to own a house were above mentioned vendors. And do believe me, when you've found a player shop with cheap, high-quality equipment, you will return. Even if it was on the other side of the map.&lt;/p&gt;

&lt;h3&gt;
  
  
  Shards with a limited population
&lt;/h3&gt;

&lt;p&gt;Shards (separated world) were a way to overcome a hardware limitation of its time. The shard limit was around 2500 simultaneously logged-in characters.&lt;br&gt;
Origin made multiple shards with a vision of merging them on the day when technology allowed. That would be doable years ago, but the merge never happened. If it did, it would harm the community. Shards helped to build community. The number of players on the server was limited to a few thousand. It was much easier to know 'celebrities', best craftsmen or player killers. It helped to build social connections. It gives players the feeling of neighbours and a live world with real characters. It wasn't as anonymous as contemporary MMORPGs.&lt;br&gt;
The merge also didn't happen because no one wanted to lose their house.&lt;/p&gt;

&lt;h3&gt;
  
  
  No perfect build
&lt;/h3&gt;

&lt;p&gt;There were no hard-defined classes for the characters. You could combine any skill with others if you fit under the skill cap of 700 (seven skills to one hundred per cent). With forty-nine skills, the number of combinations was almost limitless. The skullcap was a catch, though. For a perfect build, you needed eight skills or more... you were always missing :D &lt;br&gt;
Whatever skillset you've chosen, you could always change it. Just decide what skill to start forgetting and which to start learning. &lt;br&gt;
You could start as an alchemist who doubles in fishing. Then change it to a thief and pickpocket other player characters. Ending as a full-blast mage. The choices were limitless. &lt;/p&gt;

&lt;h3&gt;
  
  
  No pay to win
&lt;/h3&gt;

&lt;p&gt;There was just a monthly payment. That was it, nothing else. &lt;br&gt;
I understand that some people want their extra special visual and are willing to pay for it - and I have no problems with it. But I don't believe they would appreciate potentially losing them every time their character dies. Unless these "skins" for equipment could be bounded to the character/account.&lt;br&gt;
But I have issues with whales' buying abilities, skills, and in-game money. &lt;br&gt;
Not because I can't afford it but because it's diminishing the gaming experience from the game. At least, I believe so. And yes, there were pay-to-win options even when the game didn't support them. People were buying gold on eBay or paying someone to train their characters, but it wasn't as obvious and easy as buying it from the in-game shop.&lt;/p&gt;

&lt;h3&gt;
  
  
  Cooperation
&lt;/h3&gt;

&lt;p&gt;So many of the game aspects promoted player cooperation.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Surviving was hard alone but more manageable with a friend.&lt;/li&gt;
&lt;li&gt;Training all the crafts was time-consuming, but you can share the load with your friends. &lt;/li&gt;
&lt;li&gt;Only player characters could fix your equipment.&lt;/li&gt;
&lt;li&gt;Were you going away for the holidays? Ask a friend to visit your house in the meantime to keep it standing.&lt;/li&gt;
&lt;li&gt;Shards had a small enough population to know people. To build relations.&lt;/li&gt;
&lt;li&gt;Telling your story just to yourself is boring. You need friends to merge their stories with yours.&lt;/li&gt;
&lt;li&gt;As you were forced to grow your character instead of buying a fully trained one, you were likely to find some friends on your way.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The game gave us so much happiness and so much frustration too. But one could not exist without the other. It also gave me some good friends I'm keeping twenty years later.&lt;/p&gt;

&lt;p&gt;To my surprise, I've managed to recover my old account while fact-checking my memories. There was nobody to play with. So I've also checked the free servers (run by enthusiasts) and found one quite close: &lt;a href="http://uorenaissance.com/"&gt;Renaissance&lt;/a&gt;. Close to what I consider the best version of Ultima Online. Sure they have some customs, but I'm inclined to forgive them, as they're the closest option to my memories of the best MMORPG of my life.&lt;/p&gt;

&lt;p&gt;I wrote this after reading &lt;a href="https://www.raphkoster.com/2022/09/24/ultima-onlines-25th-anniversary/"&gt;Raph Koster&lt;/a&gt; post.&lt;/p&gt;

</description>
      <category>uo</category>
      <category>ultimaonline</category>
    </item>
    <item>
      <title>Learn from my mistakes!</title>
      <dc:creator>Karel Křemel</dc:creator>
      <pubDate>Thu, 29 Sep 2022 19:58:29 +0000</pubDate>
      <link>https://dev.to/alembiq/learn-from-my-mistakes-1d8j</link>
      <guid>https://dev.to/alembiq/learn-from-my-mistakes-1d8j</guid>
      <description>&lt;p&gt;You might have heard that you should not do any IT maintenance while drunk, but what they never tell you is - &lt;strong&gt;do not try to fix your computer while having a fever!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Below is a lot of techno jargon - so be warned!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I did it in the past, outcomes were terrible. Did I learn from it? No! I did it again, and this time it was even worse. This post will show you how deep into &lt;a href="https://en.wikipedia.org/wiki/Hel_(location)"&gt;Hel&lt;/a&gt; you may need to crawl as a punishment if you don't remember these two good pieces of advice. &lt;br&gt;
This is not a guide telling you what to do afterwards. My little story shows how much work the remediation took this time. &lt;/p&gt;

&lt;p&gt;A little context first: The seventh generation of ThinkPad X1 isn't among those with the best hardware support in Linux. This is not a general statement about Linux per se - it's valid on &lt;a href="https://www.parrotsec.org/"&gt;Parrot OS&lt;/a&gt; - or at least it was two years ago when I bought this machine and set it up. Parrot is a Linux distribution based on Debian. Debian is known for updating much more slowly than others, which makes it more stable. Two years later, with two years' worth of updates - my notebook hardware support is much better. Which is probably the cause of the issue. All my workarounds and tuning were perhaps in the way of updated drivers and libraries. &lt;/p&gt;

&lt;p&gt;I spent about two days compelling the hardware to work when I bought this notebook. Power management and sleep mode weren't working out of the box and needed some convincing. Speakers and microphones basically didn't exist. To solve that, I needed a much newer version of the &lt;a href="https://github.com/thesofproject/sof"&gt;Sound Open Firmware&lt;/a&gt; than Parrot provided. This also meant some extra, nonstandard lines in the configuration of Pulse Audio to tell it specifically what to do. The video was tearing (as Intel usually does) and needed another custom adjustment in configuration. And my idea of having mobile internet connectivity thanks to the built-in LTE modem or using a fingerprint or NFC reader was preposterous - no can do! &lt;br&gt;
Sure the community was working on LTE drivers (&lt;a href="https://github.com/xmm7360/xmm7360-pci"&gt;they still are&lt;/a&gt;), the fingerprint reader was just waiting for new firmware, and NFC, what NFC? Although recently, I got some tips from Lenovo's Senior Linux Software Enginee for the NFC reader. So now, not even four years after the hardware was released, all the parts might work in Linux. &lt;/p&gt;

&lt;p&gt;This might sound like a short horror story, but it is not. Sure some parts of the hardware got rarely used in general. Weren't I working for Gemalto, I would never even think about using the NFC reader - I have never seen anyone outside of Gemalto use it on a notebook. But we were making NFC chips and using them for various purposes. I also never used the fingerprint reader. I just wanted to make it work, to learn something new. Admittedly, it's not a path many people want to take, learning about new stuff just because, but I like to gain new, sometimes very atypical, knowledge. &lt;br&gt;
In the end, this notebook is brilliant, and I'm happy I've bought it! &lt;/p&gt;

&lt;p&gt;I'll be referring to the computer's disk and its partitions (segments of the disk that can be managed separately) quite a lot, so some description might be in order.&lt;br&gt;
Partitioning of the SSD before the incident: &lt;br&gt;
partition 1 - EFI - 100MB&lt;br&gt;
partition 2+3+8 - Windows 10 - 64GB&lt;br&gt;
partition 4 - Parrot OS - 64GB&lt;br&gt;
partition 5 - reserved for another Linux - 64GB&lt;br&gt;
partition 6 - home (user data) - 234GB (whatever remains)&lt;br&gt;
parittion 7 - swap - 32GB&lt;/p&gt;

&lt;p&gt;Let's get back to when I failed miserably, and my computer had a problem. The current crisis was the lack of sound after the last restart. Probably some update changes something. Usually, there is no issue with updates. I do them quite often. Much more often than I do, restart the computer. So usually, updates add to each other, and later it is much harder to find the cause of which change. This time the runtime of my notebook was about two months. This restart wasn't even voluntary - sleep mode failed - and after boot,  I had no sound coming out of the computer.&lt;/p&gt;

&lt;p&gt;I'm unsure what I did in my first few attempts to fix the sound. As I've mentioned before, I had raised temperatures. But from the command line history, I can say there was a problem with the PulseAudio server not starting. Ultimately, I broke the whole system, and it was no longer booting. Not that it did not happen to me ever before. But this time, I didn't feel I had the energy and time to fix it. After two years of meddling, I may deserve a clean system.&lt;br&gt;&lt;br&gt;
Installation of the second instance of Parrot sounded like the right idea - there was a reserved partition for it anyway. After downloading the latest release, I've prepared a bootable USB drive (one of the best things you can use Windows for). Little did I know that there was an &lt;a href="https://community.parrotsec.org/t/parrotos-architect-stuck-during-installation/25189"&gt;issue&lt;/a&gt; in that one particular version. This, in the end, meant that I didn't manage to finish the installation and ended up with two broken Parrots. &lt;br&gt;
At that moment, I had no idea why it failed. Assuming it's some new hardware support issue, I decided to give it another go with Fedora. I've heard it is pretty progressive with hardware support, and they have even had help directly from Lenovo on it. Failed again and didn't manage to finish the installation. No particular reason was given, and I never investigated. It was, after all, a beta version and failure are to be expected. I was getting frustrated. I just wanted the sound to be working again. I never planned for something like this. &lt;br&gt;
The next idea was Manjaro. Manjaro is a Linux distribution based on Arch Linux, the most on-the-edge updated distribution I know of. This should for sure support all the hardware without failure. Who cares that I never used anything Arch based, and it will be something new to learn - worthy if it works. (Ok, I tried once but never even managed to get working networking.)  But the installer told me that my EFI partition needs at least 300MB in size, while mine is only 100MB. &lt;br&gt;
Oh crap, I had enough! Let's wipe it all and start from scratch! I will just back up my user home folder/partition and erase the entire disk! &lt;br&gt;
Just let me connect the external disk and copy it there. I might as well do it from the live instance of Manjaro that rejected to go with the installation. So I did just that. &lt;br&gt;
I've started the installation process again after a few minutes of waiting for the backing up to finish. My request was simple - use the whole disk, do whatever you want, just make it work. And it did! &lt;br&gt;
A few hours into fixing sound issues and finally had a working system with sound! Bliss! &lt;br&gt;
It almost felt like going through &lt;a href="https://en.wikipedia.org/wiki/DLL_Hell"&gt;DLL Hell&lt;/a&gt; and finally starting the application you've just bought! &lt;/p&gt;

&lt;p&gt;It might have ended here, but no, I'm one of those who want more from their computers. I want more from my computer than just one working operating system. User data should be on a separate partition for one. And more diversity in the operating systems too. So, this is not the end of the story. Punishments should be longer than five hours! &lt;br&gt;
To resize the one partition going across the whole disk and create some new ones, I need a proper tool - &lt;a href="https://gparted.org/index.php"&gt;Gparted&lt;/a&gt;. Let's prepare another USB drive and reboot into Gparted. Resize that huge partition and make space for some new ones. &lt;br&gt;
In the meantime, I found another USB drive with a Windows installation image I made while creating system backups for my mom and my wife. Windows installed without any issues - which was a surprise for me. Considering how many times I had problems with Windows installations in the past. Looks like they put much more work into Windows 10 than I expected. &lt;br&gt;
This meant I had two working systems (with working sound) - already better than at the beginning of this story, but I wanted more. I always want more. Manjaro was more than a little unknown to me, and I wanted a fallback plan - Parrot would be lovely. &lt;/p&gt;

&lt;p&gt;The installation went smooth when I didn't use the latest version of Parrot. But there was a slight problem with updating. When you try to download updates, the system verifies if the server you're downloading your updates from is trusted. It was not. At least my old Parrot was convinced it's not. The certificate keys of the server were changed, and the new ones were unknown to him. &lt;br&gt;
There might be some proper procedure for dealing with this kind of server key replacement, but I was even more tired than before and wanted to sleep with having already updated systems. It was time for a brute force hack and slash solution:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;touch /etc/apt/apt.conf.d/99verify-peer.conf &amp;amp;&amp;amp; echo &amp;gt;&amp;gt;/etc/apt/apt.conf.d/99verify-peer.conf "Acquire { https::Verify-Peer false }"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Which made updates go through. Updates worked even after removing this brutal workaround - happiness! &lt;/p&gt;

&lt;p&gt;At this point, the computer disk is divided like this: &lt;br&gt;
partition 1 - EFI - 300MB&lt;br&gt;
partition 2 - Manjaro - 64GB&lt;br&gt;
partition 3 - Parrot OS - 64GB&lt;br&gt;
partition 4+5 - Windows 10 - 64GB&lt;br&gt;
partition 6 - HOME - 268GB (whatever remains)&lt;br&gt;
parittion 7 - swap - 16GB&lt;/p&gt;

&lt;p&gt;Finally, time to sleep! &lt;/p&gt;

&lt;p&gt;Most of this martyrium happened because I wasn't thinking clearly enough and decided to fix something with a fever! I should have waited a few days, and I could use those eight hours doing something more pleasant than reinstalling everything. Don't make the same mistake. Learn from my suffering! &lt;/p&gt;

&lt;p&gt;There is, of course, more. As always, after a clean installation, nothing is configured to my liking; there are no applications installed I would like to have. But that's just a minor issue compared to all of the above. &lt;/p&gt;

&lt;p&gt;There is a silver lining too. During this long night, I made a discovery of the month! &lt;a href="https://www.ventoy.net/"&gt;Ventoy&lt;/a&gt; - a beneficial tool for installing computers. Install Ventoy onto a USB drive and afterwards put any number of installation ISO files on the drive. Choose which ISO you want to boot into when booting from this USB. You don't need to prepare an installation USB ever again. Just copy all the installation ISOs you might need and choose on boot. One dongle to rule them all! &lt;/p&gt;

</description>
      <category>linux</category>
    </item>
  </channel>
</rss>
