<?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: Jochen Lillich</title>
    <description>The latest articles on DEV Community by Jochen Lillich (@geewiz).</description>
    <link>https://dev.to/geewiz</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F145217%2F0d9d095c-2dd6-4463-ae13-2bf330b47090.jpeg</url>
      <title>DEV Community: Jochen Lillich</title>
      <link>https://dev.to/geewiz</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/geewiz"/>
    <language>en</language>
    <item>
      <title>How I schedule work and communication with Morgen</title>
      <dc:creator>Jochen Lillich</dc:creator>
      <pubDate>Wed, 29 Jul 2026 19:22:24 +0000</pubDate>
      <link>https://dev.to/geewiz/how-i-schedule-work-and-communication-with-morgen-4lb1</link>
      <guid>https://dev.to/geewiz/how-i-schedule-work-and-communication-with-morgen-4lb1</guid>
      <description>&lt;p&gt;Time is my most valuable resource. Unlike most others, it can’t be replenished, and at my age, I’m acutely aware of this fact. The app I’ve been using daily for years now to manage my time is &lt;a href="https://www.morgen.so" rel="noopener noreferrer"&gt;Morgen&lt;/a&gt;. I can’t believe this service is still such a hidden gem.&lt;/p&gt;

&lt;p&gt;Recently, Zapier published a blog post titled “The 5 best time blocking apps in 2022”, and it didn’t even mention Morgen, let alone discuss it in depth. I only found Morgen by chance myself, but it took me only a few minutes of using it until I signed up for a yearly Pro subscription.&lt;/p&gt;

&lt;p&gt;I’ve learned to accept that “To-Do List Zero” is an unrealistic ideal. There will always be work queuing up, especially since being a good husband, father and friend requires time, too. This makes it imperative for me to make sure I prioritize every task and responsibility properly.&lt;/p&gt;

&lt;p&gt;Many of these tasks are what Cal Newport calls “shallow work”, for example, responding to emails and support requests. The real value comes from “deep work” tasks like creating a strategy or coding a new product feature. As the leader of a fully remote company with international customers, arranging video calls at times that don’t completely disrupt my focus on these “deep work” tasks is another one of my time management challenges. Morgen, a Swiss-made web application, solves all of them wonderfully.&lt;/p&gt;

&lt;p&gt;On the surface, Morgen is a typical web-based calendaring app. If you’ve used one of them, you know they all look just about the same, and that also applies to Morgen. In fairness, I don’t know if there actually is more than one way to display a calendar. The first advantage of Morgen is that it integrates with all major productivity suites, from Google and iCloud to NextCloud and Zoho. Having access to all my personal (FastMail) and work-related (Google) calendars from a single app is essential for me to keep track of my obligations.&lt;/p&gt;

&lt;p&gt;Morgen has a few nifty features that stand out for me. “Quick Join” is one of them. If the current calendar event comes with a link to Zoom, Google Meet or a similar video service, Morgen automatically displays a button on its main screen that launches me right into the call.&lt;/p&gt;

&lt;p&gt;“Calendar sets” is a feature I know from Fantastical, one of the best calendar apps in the Apple ecosystem. Calendar sets allow you to group calendars and switch between them with a single keystroke. For example, when I’m planning my upcoming weeks, I need to see not only my personal calendars but also my team’s holiday plans and my family’s upcoming events. Being able to easily switch between a lean “work” calendar set with only my most important events and the full “planning” set saves me time and embarrassment.&lt;/p&gt;

&lt;p&gt;Of course, I wouldn’t pay for Morgen if all it did for me was display my calendars. It is the app’s time management features that sold it for me.&lt;/p&gt;

&lt;p&gt;Morgen comes with its own to-do list feature, but it also integrates with Todoist, my task manager of choice. Again, if all Morgen did was display my tasks next to the calendar view, I wouldn’t rave about it. What I love about Morgen is that it enables me to use the “time-boxing method” to make sure I’ll actually have the time to focus on what’s important. I can simply drag tasks from the to-do list to the time on the calendar when I’m going to work on them. Morgen displays them as special calendar entries with a checkbox, but it also creates regular calendar entries that signal to other people that I’ll be occupied at that time. These time blocks will also be excluded from the scheduling feature that is one of Morgen’s major strengths.&lt;/p&gt;

&lt;p&gt;Planning my own work is one thing, but I also have to make time for communicating with other people. (Sometimes, I even want to!) Morgen has a powerful scheduling feature with which I can mark specific times as available for other people to arrange calls with me. Each availability rule has its own URL that I can put on a website or paste into an email. For customers, I have a permanent link that allows them to schedule 30-minute calls during office hours. When I want to schedule a call with friends, I create one-off time slots simply by marking the next few free evenings. Since Morgen also integrates with major conferencing services, it sends out call invitations that already contain the link to the video call.&lt;/p&gt;

&lt;p&gt;There are many more features in Morgen that I didn’t mention, so go check them out for yourself! The free tier already has everything you need to get a good grasp on its strengths. And once it’s got you hooked, the Personal or Pro plans won’t break the bank either.&lt;/p&gt;

&lt;p&gt;In summary, I can confidently say that Morgen has become one of the pillars of my personal productivity. Or, paraphrasing the German proverb: “Was du heute willst besorgen, das planst du besser in Morgen!”&lt;/p&gt;

</description>
      <category>productivity</category>
    </item>
    <item>
      <title>Making my own Nerd Font</title>
      <dc:creator>Jochen Lillich</dc:creator>
      <pubDate>Fri, 17 Jul 2026 12:40:45 +0000</pubDate>
      <link>https://dev.to/geewiz/making-my-own-nerd-font-40ee</link>
      <guid>https://dev.to/geewiz/making-my-own-nerd-font-40ee</guid>
      <description>&lt;p&gt;Well-structured status lines in vim and shell prompts with version control symbols are a nice quality-of-life improvement. Unfortunately, not all monospace fonts come with the necessary PowerLine glyphs. For example, my favourite font is &lt;a href="https://www.typography.com/blog/introducing-operator" rel="noopener noreferrer"&gt;Operator Mono&lt;/a&gt;, and it too doesn’t have PowerLine symbols built in.&lt;/p&gt;

&lt;p&gt;Thanks to the &lt;a href="https://github.com/ryanoasis/nerd-fonts#option-8-patch-your-own-font" rel="noopener noreferrer"&gt;NerdFonts font patcher&lt;/a&gt;, I was able to generate a font variant that has the necessary symbols. I simply ran the tool as a Docker container in my fonts directory:&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="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;mkdir &lt;/span&gt;HCo_OperatorMonoSSmNF
&lt;span class="nv"&gt;$ &lt;/span&gt;docker run &lt;span class="nt"&gt;--rm&lt;/span&gt; &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="nv"&gt;$PWD&lt;/span&gt;/HCo_OperatorMonoSSm/OpenType:/in &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="nv"&gt;$PWD&lt;/span&gt;/HCo_OperatorMonoSSmNF:/out &lt;span class="se"&gt;\&lt;/span&gt;
  nerdfonts/patcher &lt;span class="nt"&gt;--windows&lt;/span&gt; &lt;span class="nt"&gt;--powerline&lt;/span&gt; &lt;span class="nt"&gt;--powerlineextra&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now my &lt;a href="https://github.com/spaceship-prompt/spaceship-prompt" rel="noopener noreferrer"&gt;spaceship shell prompt&lt;/a&gt; sparks even more joy.&lt;/p&gt;

</description>
      <category>font</category>
      <category>terminal</category>
    </item>
    <item>
      <title>The secret to Linux workstation peace of mind</title>
      <dc:creator>Jochen Lillich</dc:creator>
      <pubDate>Wed, 15 Jul 2026 12:57:25 +0000</pubDate>
      <link>https://dev.to/geewiz/the-secret-to-linux-workstation-peace-of-mind-cbg</link>
      <guid>https://dev.to/geewiz/the-secret-to-linux-workstation-peace-of-mind-cbg</guid>
      <description>&lt;p&gt;In our inaugural Deep Dive session in &lt;a href="https://monospacementor.com/devops-learning-community/" rel="noopener noreferrer"&gt;The Server Room&lt;/a&gt;, I gave a demo of my Linux workstation setup. (Deep Dive sessions are part of the recurring events program in my DevOps membership community.) In my demonstration, the operating system did, of course, take centre stage. After my community members, it now your turn to learn why I’m installing Bluefin as my Linux OS whenever possible.&lt;/p&gt;

&lt;p&gt;First, what is Bluefin? Bluefin is a variant of Fedora Silverblue, which in turn is the “atomic” variant of Fedora’s Workstation distribution. Before we get into what makes Bluefin special, let me explain briefly what an atomic Linux distribution is.&lt;/p&gt;

&lt;h2&gt;
  
  
  The power of the atom(ic)
&lt;/h2&gt;

&lt;p&gt;Traditional Linux distributions use their specific package manager to set up the initial operating system. Later on, you use the same package manager to add, update or remove packages depending on your needs. This is how most distributions work, but it has significant downsides. Package management can go horribly wrong. One of the best-known examples in recent history was Linus Sebastian destroying his whole Linux installation just by trying to install Steam. Of course, this event made huge waves on his YouTube channel “Linus Tech Tips”.&lt;/p&gt;

&lt;p&gt;Atomic Linux distributions aim at eliminating the risk of bricking your machine. They take a page out of the version management playbook by maintaining multiple variants of the operating system installation. Adding, updating or removing packages all happens on a clone of the current OS setup. In consequence, these changes will only take effect next time you reboot the machine. And should the new version have any kind of glitch, you can switch back to the previous working version simply by choosing it from the boot menu.&lt;/p&gt;

&lt;h2&gt;
  
  
  Separating OS and user apps
&lt;/h2&gt;

&lt;p&gt;The best way to keep this mechanism robust, and at the same time retain flexibility in your software selection, is to install user applications independently of the OS. On Bluefin, the preferred method of installing GUI applications is via Flatpak. Flatpak is a package manager that keeps applications “sandboxed” for improved security. The common way to install command line applications is inside Linux containers managed by Podman. This might sound like a tedious endeavour, but there are two tools that make this process easy and seamless. They do so by integrating the containers tightly with the host system. For example, they automatically mount your home directory into the container, which makes your individual configuration and data files available inside the container. Even if you don’t use an atomic Linux distribution, I recommend you have a look at &lt;a href="https://containertoolbx.org/" rel="noopener noreferrer"&gt;Toolbx&lt;/a&gt; and &lt;a href="https://distrobox.it/" rel="noopener noreferrer"&gt;Distrobox&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;The two main atomic distributions from Fedora are Silverblue and Kinoite. They differ in the desktop environment they run, GNOME and KDE, respectively. They’re already great but Universal Blue makes them even better.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bluefin is the Fedora we deserve
&lt;/h2&gt;

&lt;p&gt;The Universal Blue team builds custom OCI/Docker images to deploy the operating system, a feature that isn’t yet available in official Fedora. In consequence, OS updates are downloaded efficiently from a container registry. The main Universal Blue spins are Bazzite, Aurora, Ucore and Bluefin. They all add specific applications, tools, hardware support, and quality-of-life improvements on top of their upstream distributions. Bazzite, for example, aims at an improved Linux gaming experience, and adds support for a range of gamepads and the proprietary NVidia drivers.&lt;/p&gt;

&lt;p&gt;With Bluefin, Universal Blue targets the majority of Linux users. For this reason, it adds a bunch of useful applications and extensions to Silverblue’s GNOME desktop environment. It also comes with support for popular hardware such as NVidia GPUs, Framework and even Surface laptops. Its extended version “Bluefin DX” (for “developer experience”) adds tooling that software developers will appreciate, such as the VS Code development environment and the Homebrew package manager. Homebrew is popular on macOS and a viable alternative to the container-based environments I mentioned above. Finally, if you prefer KDE over GNOME, Aurora is there waiting for you.&lt;/p&gt;

&lt;p&gt;Additional to what feels like a very solid software collection, Bluefin adds quality-of-life improvements that make its everyday use a pleasure. For example, it installs a daily background job that automatically performs upgrades on all relevant software. It not only upgrades the base OS, but also the installed Flatpaks, and even all the Toolbx and Distrobox containers. Every time you boot your laptop, you can be sure you will work with the latest software versions.&lt;/p&gt;

&lt;p&gt;This is how I think a Linux distribution should function in 2026: robust, practical and convenient. It’s why I’m installing Bluefin on all my machines, and even machines I set up for family members. It’s the most low-maintenance Linux experience I’ve ever had. For more information and a peek into the work of the Universal Blue team, watch &lt;a href="https://www.youtube.com/watch?v=-5O3p8KCMiw" rel="noopener noreferrer"&gt;Noel Miller’s talk&lt;/a&gt; from the F40 Release Party!&lt;/p&gt;

&lt;p&gt;If you have any questions on my setup, post them in the comments below. I'll be happy to answer them.&lt;/p&gt;

&lt;p&gt;The post &lt;a href="https://monospacementor.com/2024/10/secret-linux-workstation-peace-of-mind/" rel="noopener noreferrer"&gt;The secret to Linux workstation peace of mind&lt;/a&gt; appeared first on &lt;a href="https://monospacementor.com" rel="noopener noreferrer"&gt;The Monospace Mentor&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>learning</category>
      <category>linux</category>
    </item>
    <item>
      <title>A homelab is a skill booster</title>
      <dc:creator>Jochen Lillich</dc:creator>
      <pubDate>Sat, 09 Aug 2025 11:50:04 +0000</pubDate>
      <link>https://dev.to/geewiz/a-homelab-is-a-skill-booster-48kg</link>
      <guid>https://dev.to/geewiz/a-homelab-is-a-skill-booster-48kg</guid>
      <description>&lt;p&gt;In her article &lt;a href="https://www.paigerduty.com/sre-biggest-problem/" rel="noopener noreferrer"&gt;“What’s the biggest unsolved problem within Site Reliability Engineering?”&lt;/a&gt;, Paige Cruz identifies a critical challenge facing our industry: how do we pass the hard-won knowledge of veteran system administrators down to a new generation that has never worked outside cloud infrastructure?&lt;/p&gt;

&lt;p&gt;Cruz makes a compelling case that this knowledge transfer gap represents SRE’s biggest unsolved problem. However, I take issue with one of her conclusions. She argues that “It’s also not acceptable or sustainable or accessible in my opinion to continue to expect people set up home-labs and experiment themselves. We don’t ask veterinarians to practice surgery in their free time at home and I don’t think we should expect that from future SRE.”&lt;/p&gt;

&lt;p&gt;I respectfully disagree. A home lab represents the best investment a future SRE can make to secure their career growth.&lt;/p&gt;

&lt;h2&gt;
  
  
  The home lab advantage
&lt;/h2&gt;

&lt;p&gt;The veterinarian comparison doesn’t hold up under scrutiny. Veterinarians need live animals, surgical equipment, and sterile environments – resources that are neither practical nor ethical to maintain at home. Particle physicists need billion-dollar accelerators. But what does a sysadmin or SRE need to experiment with infrastructure? A few decommissioned Lenovo ThinkCentre boxes and a network switch.&lt;/p&gt;

&lt;p&gt;The barrier to entry is remarkably low, and the learning potential is enormous.&lt;/p&gt;

&lt;p&gt;Scientific research consistently shows that skill development requires more than passive consumption of learning materials. Growing expertise demands practical exploration – running into problems, analyzing failures, and working through solutions. A home lab provides exactly this environment, free from the constraints and pressures of production systems.&lt;/p&gt;

&lt;p&gt;You don’t need a data centre in your basement. One or a few small networked PCs will serve you well. These machines consume minimal power and don’t need to run around the clock. Fire them up when you want to experiment with a new service mesh, test disaster recovery procedures, or break something just to see what happens.&lt;/p&gt;

&lt;p&gt;For those who can’t or don’t want to maintain physical hardware, alternatives exist. “Pubmox” – the shared Proxmox Virtual Environment I maintain for members of “&lt;a href="https://monospacementor.com/community/" rel="noopener noreferrer"&gt;The Server Room&lt;/a&gt;” – offers free access to virtual infrastructure for hands-on learning.&lt;/p&gt;

&lt;h2&gt;
  
  
  The learning laboratory
&lt;/h2&gt;

&lt;p&gt;A home lab creates space for the kind of curiosity-driven exploration that builds deep technical intuition. When you’re troubleshooting a networking issue at 2 AM in your home lab, you’re not worried about affecting customers or violating change management policies. You can take risks, make mistakes, and learn from the consequences.&lt;/p&gt;

&lt;p&gt;This environment encourages the experimental mindset that separates great SREs from those who merely follow runbooks. You learn to ask “what if” questions and then actually test your hypotheses.&lt;/p&gt;

&lt;h2&gt;
  
  
  Knowledge transfer requires community
&lt;/h2&gt;

&lt;p&gt;While I advocate strongly for home labs as skill boosters, they’re not the complete answer to Cruz’s original question about knowledge preservation. The solution to transferring veteran sysadmin wisdom doesn’t lie in solitary exploration – it requires collaborative knowledge transfer.&lt;/p&gt;

&lt;p&gt;Home labs excel at building technical skills, but they can’t replace the mentorship and context that comes from working alongside experienced practitioners. The real magic happens when hands-on experimentation combines with guided learning from those who’ve solved these problems before.&lt;/p&gt;

&lt;p&gt;This is why I’m launching “&lt;a href="https://monospacementor.com/courses/linsys-1/" rel="noopener noreferrer"&gt;Basic Linux System Administration&lt;/a&gt;” – an instructor-led course backed by “The Server Room” community. Participants get free access to Pubmox, allowing them to practice what they learn while benefiting from my decades of system administration experience.&lt;/p&gt;

&lt;p&gt;It’s the best of both worlds: the freedom to experiment and break things, combined with the guidance to understand why systems fail and how to make them more reliable.&lt;/p&gt;

&lt;p&gt;A home lab won’t solve SRE’s knowledge transfer problem on its own. But for individual practitioners looking to deepen their skills and advance their careers, it remains an invaluable investment. The combination of practical experimentation and collaborative learning creates the foundation for the next generation of systems experts our industry desperately needs.&lt;/p&gt;

&lt;p&gt;The post &lt;a href="https://monospacementor.com/2025/08/a-homelab-is-a-skill-booster/" rel="noopener noreferrer"&gt;A homelab is a skill booster&lt;/a&gt; appeared first on &lt;a href="https://monospacementor.com" rel="noopener noreferrer"&gt;The Monospace Mentor&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>learning</category>
      <category>linux</category>
      <category>skills</category>
    </item>
    <item>
      <title>80-hour weeks don’t make a great engineer. They’ll break a great engineer.</title>
      <dc:creator>Jochen Lillich</dc:creator>
      <pubDate>Tue, 16 Apr 2024 07:00:00 +0000</pubDate>
      <link>https://dev.to/geewiz/80-hour-weeks-dont-make-a-great-engineer-theyll-break-a-great-engineer-ff</link>
      <guid>https://dev.to/geewiz/80-hour-weeks-dont-make-a-great-engineer-theyll-break-a-great-engineer-ff</guid>
      <description>&lt;p&gt;I’m not exaggerating when I say I was shocked by a question about working hours that I got during a recent office hour live stream. &lt;em&gt;“So I heard from a developer that he would code and learn for like 80 hours a week when he started in order to be come an amazing engineer. I can barely do 8 hours a day and I want to be an amazing engineer. Advice on that?”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Here’s the TL;DR: &lt;strong&gt;Working 80 hours a week is neither healthy nor effective.&lt;/strong&gt; I’d go as far as to saying it’s impossible. Sitting in front of a screen for 80 hours? Yeah, maybe, if that’s your thing. But doing actual work for 80 hours? You might very well be fooling yourself, but you’re not fooling me.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmonospacementor.com%2Fwp-content%2Fuploads%2F2024%2F03%2Fmuhammad-raufan-yusup-rYRE6ju-2K8-unsplash-1024x679.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmonospacementor.com%2Fwp-content%2Fuploads%2F2024%2F03%2Fmuhammad-raufan-yusup-rYRE6ju-2K8-unsplash-1024x679.jpg" alt="Person sitting at a laptop at night, putting in long work hours" width="800" height="400"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Photo by Muhammad Raufan Yusup on Unsplash&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  More negative side effects than benefits
&lt;/h2&gt;

&lt;p&gt;Now, before we get into how many hours of work per week you really should invest into your growth, let’s first consider the side effects of spending 80 hours per week working. That is 16 hours every weekday or more than 11 hours every single day, working on your engineering career. Even if we count necessities like eating and pooping as part of work time, it’ll still leave only between 8 and 12 hours per day for the non-work parts of your life. Parts like, you know, hobbies, social life and sleep.&lt;/p&gt;

&lt;p&gt;And it’s scientifically proven that for most people, any amount of sleep below 7 hours a night is not enough. The body needs time to recover physically and mentally. In other words, if you sacrifice sleep for other things for more than a very short time, you’re going to ruin your health. Let’s see how not only your career but your whole life flourishes while you’re dealing with the consequences of burnout (or falling asleep driving your car).&lt;/p&gt;

&lt;h2&gt;
  
  
  Way to sabotage yourself
&lt;/h2&gt;

&lt;p&gt;Total work time also has severely diminishing returns. In other words, putting in more and more time will yield less and less additional results. Effective work requires effective rest. Why do you think Ford and his fellow industrialists themselves introduced the 40-hour work week? And that was just about physical work. Every athlete knows that muscle growth doesn’t benefit from endless training. There needs to be downtime during which the body can recuperate and grow to meet demand.&lt;/p&gt;

&lt;p&gt;For our brain, it’s similar, but it’s even more limited in how long it can work at high performance. For knowledge workers, an 8-hour day is like a 16-hour day for the industrial laborer. It’s just not possible to keep your focus for that long, not only because people keep interrupting you, but also for physiological reasons. The brain needs time and rest to build new tissue such as the myelin that grows around neurons.&lt;/p&gt;

&lt;h2&gt;
  
  
  It’s not about the working hours at all
&lt;/h2&gt;

&lt;p&gt;There’s also the aspect of how much you can even achieve on your own. There’s that story of someone who shipwrecked on an island with just a chess board, and ten years later returned as a grand master. That’s bullshit, because you need other people to beat the Dunning/Kruger effect, i.e. you don’t know what you don’t know. The only way to find the solutions that your brain couldn’t come up with by itself is collaboration. Grand masters learn from other grand masters, amazing engineers learn from other amazing engineers. That’s why I’m so excited about The Server Room, the &lt;a href="https://dev.to/devops-learning-community"&gt;community of DevOps practitioners&lt;/a&gt; I’m going to launch soon.&lt;/p&gt;

&lt;p&gt;The good news is that success is not about the total time you spend working at all. Rather, it’s about how much focus time you can get in. In his book “Deep Work”, Cal Newport explains how he manages to thrive as a busy author and academic. “Three to four hours a day, five days a week, of uninterrupted and carefully directed concentration, it turns out, can produce a lot of valuable output.” Just 15 to 20 hours of focused work per week will do the trick. And you’ll still have plenty of time left that you can spend schmoozing and snoozing.&lt;/p&gt;

&lt;p&gt;Please don’t blindly believe those hustle culture tech bros who tout how they built their success on relentless work. Even if there’s a kernel of truth to their claims, what they don’t tell you is that they also had the means to mitigate the negative consequences of their self-abuse. Instead, I recommend that you read the book “&lt;a href="https://maxfrenzel.com/time-off" rel="noopener noreferrer"&gt;Time Off: A Practical Guide to Building Your Rest Ethic and Finding Success Without the Stress&lt;/a&gt;“. It’s full of good advice like this one:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;But as entrepreneurs, managers, and individuals, it’s a dangerous and vicious cycle if we keep assuming that we are productive and effective only because we put in a crazy amount of hard work and long hours, grinding it out. All too often, we get stuck in mediocrity because we are afraid, or maybe just too lazy and comfortable, to question the status quo and the rules set by societal norms.&lt;/p&gt;

&lt;p&gt;&lt;cite&gt;John Fitch, Max Frenzel, and Mariya Suzuki, “Time Off”&lt;/cite&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;em&gt;This article was originally published in my newsletter, “News From the Server Room”. To get my column “Mentor Monologue” fresh when I publish it, &lt;a href="https://monospacementor.com/devops-know-how/" rel="noopener noreferrer"&gt;subscribe here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The post &lt;a href="https://monospacementor.com/2024/04/working-hours/" rel="noopener noreferrer"&gt;80-hour weeks don’t make a great engineer. They’ll break a great engineer.&lt;/a&gt; appeared first on &lt;a href="https://monospacementor.com" rel="noopener noreferrer"&gt;The Monospace Mentor&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>learning</category>
      <category>companyculture</category>
      <category>mentalhealth</category>
      <category>teamwork</category>
    </item>
    <item>
      <title>Startup lessons: 5 mistakes I made when I chose my brand name</title>
      <dc:creator>Jochen Lillich</dc:creator>
      <pubDate>Mon, 06 Nov 2023 00:00:00 +0000</pubDate>
      <link>https://dev.to/geewiz/startup-lessons-5-mistakes-i-made-when-i-chose-my-brand-name-92</link>
      <guid>https://dev.to/geewiz/startup-lessons-5-mistakes-i-made-when-i-chose-my-brand-name-92</guid>
      <description>&lt;p&gt;Choosing “Opsitive” as the brand name for my teaching and mentoring business was a mistake. I know that now, and in this article, I’ll explain what made me realize that there’s much more to branding than just being clever. I’ll outline the tests that helped my identify the weaknesses of my current brand and verify that my new choice, “Monospace Mentor”, is going to be much stronger.&lt;/p&gt;

&lt;p&gt;A few weeks ago, I discovered “&lt;a href="https://podcast.creatorscience.com/" rel="noopener noreferrer"&gt;Creator Science&lt;/a&gt;”, a podcast for content creators I can already highly recommend. One of the latest episodes peaked my interest in particular: “&lt;a href="https://podcast.creatorscience.com/alexandra-watkins/" rel="noopener noreferrer"&gt;How to invent a GREAT brand name.&lt;/a&gt;”. For years, I’ve been dissatisfied with my hosting company’s branding, so I was eager to learn more about this topic. And learn I did!&lt;/p&gt;

&lt;p&gt;On the podcast, branding expert Alexandra Watkins outlined two acronyms she invented to gauge the quality of a brand name; one checks the attributes to aim at, the other points out pitfalls to avoid. These acronyms are “SMILE” and “SCRATCH”, and you can find their detailed explanations over on Alexandra’s website, “&lt;a href="https://eatmywords.com/free-name-evaluation-test/" rel="noopener noreferrer"&gt;Eat my words&lt;/a&gt;”.&lt;/p&gt;

&lt;h2&gt;
  
  
  Failing the SCRATCH test
&lt;/h2&gt;

&lt;p&gt;Applying these checks to our hosting product confirmed my gut feeling – its name bombed spectacularly. We’ll address this issue in the marketing strategy development process that we’ve just launched recently. But then I did the same test with “Opsitive”, and it dropped on me that it was weak sauce, too!&lt;/p&gt;

&lt;p&gt;First of all, the term “Opsitive”, while being a play on the words “Ops” and “Positive”, does look like a typo and thus fails the first “S” in the SCRATCH test, “Spelling challenged”. The fact that I kept getting emails meant for an online shop for women’s healthcare should have alerted me early on.&lt;/p&gt;

&lt;p&gt;Its wordplay character also makes the name suffer from the “Curse of knowledge”, symbolized by the second “C” in SCRATCH. If you’re not familiar with the fact that “Ops” is short for “IT Operations”, you’ll not get the joke.&lt;/p&gt;

&lt;p&gt;Taking a less negative perspective, the name is unfortunately also lacking all of the qualities you should search for in a brand name according to the SMILE guidelines:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It’s not &lt;em&gt;suggestive&lt;/em&gt;. It doesn’t say much at all, really.&lt;/li&gt;
&lt;li&gt;As a made-up play on words, it’s hard to &lt;em&gt;memorize&lt;/em&gt;. Was it “Opsitive”, or “Opositive” like the blood type, or maybe just “Opsitiv”?&lt;/li&gt;
&lt;li&gt;It doesn’t conjure any &lt;em&gt;image&lt;/em&gt; because it’s abstract at best and nonsensical at worst.&lt;/li&gt;
&lt;li&gt;It doesn’t have much &lt;em&gt;legs&lt;/em&gt; in that it can be extended to other topics. In fact, its explicit emphasis on “Ops” already puts software development out of scope, an area I definitely want to cover!&lt;/li&gt;
&lt;li&gt;For the same reasons for which it fails to spur imagination, it’s also not &lt;em&gt;emotional&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There’s another important shortcoming of the old name. It doesn’t put me in the centre, even though that’s the core of my business model: It’s not about the topics I teach, it’s about how &lt;em&gt;I&lt;/em&gt; teach them, about &lt;em&gt;my unique way&lt;/em&gt; to guide my mentees to their success.&lt;/p&gt;

&lt;p&gt;So I needed a new name.&lt;/p&gt;

&lt;h2&gt;
  
  
  Finding a new name
&lt;/h2&gt;

&lt;p&gt;Coming up with a new name was hard. At first, it seemed that all the good names were already taken. My main problem was finding a name that could accommodate both sides of DevOps, operations and development, but wasn’t at the same time terribly generic. I used several thesaurus websites to research variations on the themes of teaching and mentorship. After many experiments and letting ideas germinate in my brain for days, inspiration finally hit me. There is one thing that unites all system administrators and software developers: they use terminal emulators, text editors and IDEs. And in those, they use monospace fonts. Nerds love their fonts. There are dozens of websites showcasing the huge spectrum of programming fonts, and some people like me even pay good money for a neat commercial one.&lt;/p&gt;

&lt;p&gt;And since I just can’t shake my silliness completely, I went for an alliteration as my new brand name. &lt;strong&gt;From here on out, I’ll be the “Monospace Mentor”, and my web presence is now at &lt;a href="https://www.monospacementor.com" rel="noopener noreferrer"&gt;www.monospacementor.com&lt;/a&gt;!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Let’s do the SMILE check again.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“Monospace Mentor” is &lt;em&gt;suggestive&lt;/em&gt; of personal teaching, and it conjures the &lt;em&gt;image&lt;/em&gt; of a programmer’s computer screen.&lt;/li&gt;
&lt;li&gt;It is easy to &lt;em&gt;memorize&lt;/em&gt;, helped by the alliteration.&lt;/li&gt;
&lt;li&gt;It does have &lt;em&gt;legs&lt;/em&gt; for expansion in the area of DevOps education.&lt;/li&gt;
&lt;li&gt;Is it emotional? I’m not sure, but it’s definitely whimsical!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Did I eliminate the problems of the old name?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It doesn’t look like a typo.&lt;/li&gt;
&lt;li&gt;It’s not confusingly similar to the brand of anyone in the teaching space I know of.&lt;/li&gt;
&lt;li&gt;It doesn’t restrict later expansion.&lt;/li&gt;
&lt;li&gt;It’s not annoying.&lt;/li&gt;
&lt;li&gt;It’s not too tame or bland.&lt;/li&gt;
&lt;li&gt;No curse of knowledge issue.&lt;/li&gt;
&lt;li&gt;And it’s easy and unambiguous to pronounce.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Much better!&lt;/p&gt;

&lt;h1&gt;
  
  
  Lots of work ahead
&lt;/h1&gt;

&lt;p&gt;I’ll admit that I’m a bit self-conscious about making this kind of a sharp turn. Curiously, we don’t have these inhibitions when we’re coding. Hey, naming and cache invalidation, amirite? 😄 And after all, &lt;em&gt;learning in public is at the core of what I do&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Since I never had any marketing training, I’m grateful that people like Alexandra Watkins share their expertise so others like me can learn from it. The SMILE and SCRATCH tests were tremendously helpful in finding a name that doesn’t make me anxious it’ll lose me potential business simply for the reason that it doesn’t really work as a brand.&lt;/p&gt;

&lt;p&gt;Now I’ve got my work cut out for myself. I have to create new brand assets and update the many places where my teaching business is already present.&lt;/p&gt;

&lt;p&gt;I’m happy with the new name. Are you, too? Please let me know what you think on my new &lt;a href="https://floss.social/@monospace" rel="noopener noreferrer"&gt;Mastodon account&lt;/a&gt; or on the Opsitive – wait, no – &lt;a href="https://www.monospacementor.com/discord" rel="noopener noreferrer"&gt;Monospace Mentor Discord&lt;/a&gt;!&lt;/p&gt;

</description>
      <category>startup</category>
      <category>business</category>
      <category>branding</category>
    </item>
    <item>
      <title>Un-breaking breaking changes using feature flags</title>
      <dc:creator>Jochen Lillich</dc:creator>
      <pubDate>Tue, 24 Oct 2023 23:00:00 +0000</pubDate>
      <link>https://dev.to/geewiz/un-breaking-breaking-changes-using-feature-flags-1d1d</link>
      <guid>https://dev.to/geewiz/un-breaking-breaking-changes-using-feature-flags-1d1d</guid>
      <description>&lt;p&gt;When we got a feature request that we really wanted to implement because it would be a great improvement to our product, we found ourselves in a bind. The problem was that the change would most likely break the workflows of other customers. In this article, I describe how I managed to roll out the change without triggering a flood of angry emails.&lt;/p&gt;

&lt;p&gt;Recently, a customer of our &lt;a href="https://www.freistilbox.com" rel="noopener noreferrer"&gt;managed hosting platform for Drupal and WordPress&lt;/a&gt; platform asked us to tighten the security of their website deployment. We realized that the necessary changes would not only help this customer but also improve website safety for all our customers. We love this kind of universally useful feature request because for operational efficiency reasons, we try to avoid making changes for individual customers only.&lt;/p&gt;

&lt;p&gt;However, it was easy to see that the restrictions we had to implement for this feature request came with a high risk of breaking existing workflows. People were accustomed to the current level of restrictions, and when you’re above a certain number of customers, you can be sure that some of them will have set up processes that rely on this exact status quo.&lt;/p&gt;

&lt;p&gt;A breaking change requires copious advance notice. But the customer who had raised the issue was more or less blocked until we shipped a solution. So how do you make a change in your production environment, but limit its effects to exactly those customers whom it will benefit, not disrupt?&lt;/p&gt;

&lt;p&gt;The solution to this Catch 22 came to me late at night, right before falling asleep. (Let me know if you have the same kind of brain.) It’s called “feature flags”.&lt;/p&gt;

&lt;h3&gt;
  
  
  Feature flags
&lt;/h3&gt;

&lt;p&gt;Feature flags are used to enable new features for a limited number of users only. Common reasons to limit the use of a feature to a smaller circle, at least initially, are that you’d like to prevent bursts in resource usage, or that you want to quickly discover issues that only show up in production without the risk that they’ll impact all your customers at once.&lt;/p&gt;

&lt;p&gt;Technically, a feature flag allows you to add code paths additional or alternative to existing ones, and switch those new code paths on or off based on specific conditions. Because the state of a feature flag is usually based on information outside of your code, you can enable or disable a feature at any time without having to deploy updates.&lt;/p&gt;

&lt;p&gt;Usually, state of a feature flag is derived from other data, for example a database field or an environment variable. If you have an early access program, the feature condition could be &lt;code&gt;customer.eap_member == true&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;In a gradual rollout scenario, you might want to make the new feature available to only a fraction of your customer base for starters. You could pick those customers in a targeted or random way, write their customer ID’s to a database table with a feature identifier, and define the feature state like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;feature_enabled?(customer: current_user.customer_id, feature: 17)`

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It’s easy to build a simple feature flag implementation yourself. In more complex scenarios, I recommend you check out mature solutions like the Ruby gems &lt;a href="https://github.com/FetLife/rollout" rel="noopener noreferrer"&gt;Rollout&lt;/a&gt; and &lt;a href="https://github.com/flippercloud/flipper" rel="noopener noreferrer"&gt;Flipper&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Feature flags for breaking changes
&lt;/h3&gt;

&lt;p&gt;In my security change situation, I realized that I was dealing with just another feature rollout, only with the tiniest of target groups. I basically had to create an “early security improvement program” with the customer who requested the change as its only member. This would enable us to roll out the change immediately for them, and after a generous notice period, for all our customers.&lt;/p&gt;

&lt;p&gt;The resulting logic in our infrastructure code turned out very simple:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;set_up_website_environment

if feature_active?(:full_isolation)
  set_more_restrictive_permissions
else
  set_the_usual_permissions
end

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;By the time of writing, the new code has long been deployed to production. Funnily enough, it’s still completely dormant because our customer just could not find a good time for its activation yet. We might end up doing the full rollout process right away. Thanks to the feature flag being already in place, we’ll apply the change first to customers in our Early Access Program, and a bit later to everyone else — including the customer who initiated the whole project.&lt;/p&gt;

&lt;h3&gt;
  
  
  Summary
&lt;/h3&gt;

&lt;p&gt;Feature flags allow you to have your cake, and eat it, too. You can roll out new code, but limit its activation dynamically in a data-driven manner.&lt;/p&gt;

&lt;p&gt;Next time you have to introduce a code change that might not make everyone equally happy, consider using a feature flag to control its blast radius.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>infrastructureascode</category>
      <category>featureflags</category>
      <category>deployment</category>
    </item>
    <item>
      <title>Use the Rails console to do a manual Mastodon link verification</title>
      <dc:creator>Jochen Lillich</dc:creator>
      <pubDate>Wed, 16 Nov 2022 16:31:00 +0000</pubDate>
      <link>https://dev.to/geewiz/use-the-rails-console-to-do-a-manual-mastodon-link-verification-11m4</link>
      <guid>https://dev.to/geewiz/use-the-rails-console-to-do-a-manual-mastodon-link-verification-11m4</guid>
      <description>&lt;p&gt;When someone on Mastodon asked for help with a Ruby question, my friend and business partner Markus kindly referred them to me, knowing that I’m always happy to help other Ruby developers. Their question was about executing Mastodon code from a custom script. In this post, I describe how I solved this problem using the Rails console and a custom subclass.&lt;/p&gt;

&lt;p&gt;The problem the person wanted to solve was testing the logic Mastodon uses for verifying the ownership of a user’s websites.&lt;/p&gt;

&lt;p&gt;For details on how Mastodon verifies websites, see the section “Link verification” in the &lt;a href="https://docs.joinmastodon.org/user/profile/" rel="noopener noreferrer"&gt;Mastodon user profile documentation&lt;/a&gt;. In short, you have to add a link from your website back to your Mastodon account, using either a &lt;code&gt;&amp;lt;a&lt;br&gt;
rel="me" ...&amp;gt;&lt;/code&gt; link in the page body or a &lt;code&gt;&amp;lt;link rel="me" ...&amp;gt;&lt;/code&gt; reference in its header.&lt;/p&gt;

&lt;p&gt;Ideally, this test would use the original Mastodon codebase to make sure it worked across application updates.&lt;/p&gt;
&lt;h2&gt;
  
  
  Not the solution: standalone script
&lt;/h2&gt;

&lt;p&gt;On my &lt;a href="https://watch.geewiz.dev" rel="noopener noreferrer"&gt;live stream&lt;/a&gt;, I first attempted to write a standalone script. My thought was to instantiate the &lt;code&gt;VerifyLinkService&lt;/code&gt; class from&lt;a href="https://github.com/mastodon/mastodon/blob/main/app/services/verify_link_service.rb" rel="noopener noreferrer"&gt;&lt;code&gt;app/services/verify_link_service.rb&lt;/code&gt;&lt;/a&gt;. I was hoping I’d get away with requiring a few dependencies from the Mastodon application, and maybe replacing a few classes with mocks. But I quickly ended up including &lt;code&gt;ActionSupport&lt;/code&gt; and the kitchen sink, which made this approach unviable.&lt;/p&gt;
&lt;h2&gt;
  
  
  The solution: Rails console
&lt;/h2&gt;

&lt;p&gt;In order to use the original verification code, I had to run it in the context of the Mastodon application. The easiest way to do this is using the Rails console. However, spinning up a Rails console requires a working Rails application–database and all. Before I describe how to solve this, let’s first build the code we’re going to run inside the Rails console to test the verification.&lt;/p&gt;
&lt;h2&gt;
  
  
  Building the test
&lt;/h2&gt;

&lt;p&gt;Maybe I would have been able to use the original &lt;code&gt;VerifyLinkService&lt;/code&gt; class with a few tweaks, but after closer inspection, I was actually only interested in its methods &lt;code&gt;perform_request!&lt;/code&gt; and &lt;code&gt;link_back_present?&lt;/code&gt;. One fetches the website in question, the other checks if it contains a valid link back to Mastodon.&lt;/p&gt;

&lt;p&gt;Unfortunately, both methods use instance variables set in the constructor using Mastodon user data. And, to make matters worse, they’re (rightfully) private methods, which meant that nobody is allowed to call them. And just when I told my viewers, “Well, nobody but the class itself, of course”, inspiration hit me: Not only a class is allowed to call its private methods, but also its &lt;em&gt;child classes&lt;/em&gt;! All I had to do is create a subclass of &lt;code&gt;VerifyLinkService&lt;/code&gt;, provide our test details in its constructor, and call the two methods required to execute the verification. This is what I ended up with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ManualVerifyLinkService&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;VerifyLinkService&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;initialize&lt;/span&gt;
    &lt;span class="vi"&gt;@link_back&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"https://mastodon.social/@geewiz"&lt;/span&gt;
    &lt;span class="vi"&gt;@url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"https://www.geewiz.dev"&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;check&lt;/span&gt;
    &lt;span class="n"&gt;perform_request!&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;link_back_present?&lt;/span&gt;
      &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"Verification successful."&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;
      &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"Verification failed."&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Spinning up Mastodon
&lt;/h2&gt;

&lt;p&gt;This left the problem of getting Mastodon running. The fastest way to run a Rails application with its auxiliary services and not have to do lots of manual installation is generally with Docker containers, and Mastodon is no exception. Conveniently, the Mastodon code repository already comes with a&lt;code&gt;docker-compose.yml&lt;/code&gt; definition that contains everything we need. I found a &lt;a href="https://gist.github.com/TrillCyborg/84939cd4013ace9960031b803a0590c4" rel="noopener noreferrer"&gt;How-To&lt;/a&gt; on the web that describes the launch process well. All I had to do was follow it until, and including, the step where the whole setup is started by the&lt;code&gt;docker-compose up -d&lt;/code&gt; command.&lt;/p&gt;

&lt;p&gt;In this state, I was able to launch a Rails console inside the already running web application container:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker-compose exec -it web bundle exec rails console

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Running the test
&lt;/h2&gt;

&lt;p&gt;Into this console, I pasted the definition of my &lt;code&gt;ManualVerifyLinkService&lt;/code&gt; class from above.&lt;/p&gt;

&lt;p&gt;And finally, I was able to execute the verification by instantiating an object and calling its &lt;code&gt;check&lt;/code&gt; method:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;v=ManualVerifyLinkService.new
v.check

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Since my website is already verified by Mastodon, the result was positive.&lt;/p&gt;

&lt;p&gt;This was a fun experiment, and as is often the case when I help someone, I’ve learned something myself in the process.&lt;/p&gt;

</description>
      <category>ruby</category>
      <category>rails</category>
    </item>
    <item>
      <title>How I do remote administration using ngrok</title>
      <dc:creator>Jochen Lillich</dc:creator>
      <pubDate>Tue, 12 Apr 2022 00:00:00 +0000</pubDate>
      <link>https://dev.to/geewiz/how-i-do-remote-administration-using-ngrok-2hl7</link>
      <guid>https://dev.to/geewiz/how-i-do-remote-administration-using-ngrok-2hl7</guid>
      <description>&lt;p&gt;This month, a new intern from Spain started at my company. While we used to use Macbooks for our interns, he was the first to get a Linux laptop. Nothing fits the DevOps use case better, after all.&lt;/p&gt;

&lt;p&gt;I set up the machine with Manjaro Linux in my office, but I had to solve the problem of later installing and upgrading software after the laptop was handed over. It’ll always access the internet from a private network behind a router, and therefore will not be visible for me from the outside. And I certainly don’t want to commute to Dublin, where we book a coworking space for our interns, every time maintenance is required.&lt;/p&gt;

&lt;p&gt;In the end, I chose a minimalist approach by using &lt;code&gt;ngrok&lt;/code&gt;. This nifty command line tool, paired with the online service at &lt;a href="https://ngrok.com" rel="noopener noreferrer"&gt;ngrok.com&lt;/a&gt;, allows developers to create network tunnels with an endpoint on the public internet. Its main purpose is for web developers to share access to an application running on their personal machine. In other words, it allows people with whom you share the connection details to connect their web browser to your development laptop, even if it’s inside a closed WiFi network. However, &lt;code&gt;ngrok&lt;/code&gt; extends this functionality beyond the HTTP protocol and port 80.&lt;/p&gt;

&lt;p&gt;When our intern asked me to install Discord and VS Code earlier today, I asked him to run a simple command and tell me the tunnel endpoint address. The command was:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ngrok tcp 22

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It sets up the network tunnel as well as a local website on which it lists the details of each connection. Our intern then gave me the listed address &lt;code&gt;tcp://0.tcp.ngrok.io:14463&lt;/code&gt;, from which I constructed an SSH command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ssh -p 14463 geewiz@0.tcp.ngrok.io

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Within a second, I was logged into his laptop. A few minutes of installing new packages and upgrading existing ones later, I was done and asked him to cut the connection. It doesn’t get much simpler than that, does it?&lt;/p&gt;

</description>
      <category>devops</category>
    </item>
    <item>
      <title>YT channel recommendation for neovim and zsh users</title>
      <dc:creator>Jochen Lillich</dc:creator>
      <pubDate>Mon, 10 Jan 2022 13:32:00 +0000</pubDate>
      <link>https://dev.to/geewiz/yt-channel-recommendation-for-neovim-and-zsh-users-14fb</link>
      <guid>https://dev.to/geewiz/yt-channel-recommendation-for-neovim-and-zsh-users-14fb</guid>
      <description>&lt;p&gt;I don’t think I ever copied more vim or zsh configuration from anyone than from ChrisAtMachine. Looks like I found a soulmate. 😊 His &lt;a href="https://www.youtube.com/channel/UCS97tchJDq17Qms3cux8wcA" rel="noopener noreferrer"&gt;YouTube channel&lt;/a&gt; is well worth watching!&lt;/p&gt;

</description>
      <category>vim</category>
      <category>zsh</category>
    </item>
    <item>
      <title>dotenv and direnv for better developer QoL</title>
      <dc:creator>Jochen Lillich</dc:creator>
      <pubDate>Wed, 23 Jun 2021 11:46:12 +0000</pubDate>
      <link>https://dev.to/geewiz/dotenv-and-direnv-for-better-developer-qol-114m</link>
      <guid>https://dev.to/geewiz/dotenv-and-direnv-for-better-developer-qol-114m</guid>
      <description>&lt;p&gt;A &lt;a href="https://www.rubytapas.com/" rel="noopener noreferrer"&gt;RubyTapas&lt;/a&gt; tutorial taught me the difference between the &lt;a href="https://github.com/bkeepers/dotenv" rel="noopener noreferrer"&gt;&lt;code&gt;dotenv&lt;/code&gt;&lt;/a&gt; and &lt;a href="https://direnv.net/" rel="noopener noreferrer"&gt;&lt;code&gt;direnv&lt;/code&gt;&lt;/a&gt; tools. While they have significant overlap, they complement each other quite nicely. &lt;code&gt;dotenv&lt;/code&gt; simplifies both development and production ops by importing environments variables either from a &lt;code&gt;.env&lt;/code&gt; file or the application hosting platform. &lt;code&gt;direnv&lt;/code&gt; on the other hand augments the dev environment even further; not only can it add dev-only variables, but also modify shell settings like extending &lt;code&gt;$PATH&lt;/code&gt; on a per-project basis.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Verify your assumptions</title>
      <dc:creator>Jochen Lillich</dc:creator>
      <pubDate>Fri, 18 Jun 2021 14:42:24 +0000</pubDate>
      <link>https://dev.to/geewiz/verify-your-assumptions-5hfi</link>
      <guid>https://dev.to/geewiz/verify-your-assumptions-5hfi</guid>
      <description>&lt;p&gt;That’s what I keep preaching to my team but still fail at myself every so often.&lt;/p&gt;

&lt;p&gt;This week, I wasted a whole day implementing a fix for a bug that wasn’t there. My task was to add one line to a configuration file in a Chef cookbook. When I ran its test suite, it surprisingly failed and it was clear that my simple change couldn’t be the cause. I assumed it was due to recent changes in software packages installed by the cookbook. So I started adapting our old code to these changes, and one change led to another, and another, until I finally realised that over the course of multiple hours, my one-line bugfix had turned into a full code overhaul. How did I get here?&lt;/p&gt;

&lt;p&gt;I decided to start from scratch. &lt;code&gt;git reset --hard HEAD&lt;/code&gt;. I quickly fixed my config file and ran the tests. When they failed again, closer inspection revealed that it was actually just the same test failing twice. The cause was a bug that had found its way into the main branch without breaking the CI pipeline (finding the reason for this will be &lt;em&gt;interesting&lt;/em&gt;). It had been there all along! After another one-line fix, my change was ready for review. Round 2 had taken me less than half an hour.&lt;/p&gt;

&lt;p&gt;The lesson: Don’t rush into battle blindly. Look closely. Identify assumptions and verify them. It might just be windmills!&lt;/p&gt;

</description>
      <category>devops</category>
      <category>dev</category>
    </item>
  </channel>
</rss>
