<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator><link href="https://mate.gelei.dev/feed.xml" rel="self" type="application/atom+xml" /><link href="https://mate.gelei.dev/" rel="alternate" type="text/html" /><updated>2026-07-27T15:30:26+00:00</updated><id>https://mate.gelei.dev/feed.xml</id><title type="html">Mate Gelei-Szego</title><subtitle>Experienced DevOps engineer and cloud architect with a background in software development, finance and service management. Writing on infrastructure, automation, AI, people, or whatever grinds my gears.</subtitle><author><name>{&quot;twitter&quot; =&gt; &quot;MateGelei&quot;, &quot;url&quot; =&gt; &quot;https://mate.gelei.dev&quot;}</name></author><entry><title type="html">Excel Will Outlive Us All</title><link href="https://mate.gelei.dev/2026/04/12/excel-will-outlive-us-all/" rel="alternate" type="text/html" title="Excel Will Outlive Us All" /><published>2026-04-12T07:00:00+00:00</published><updated>2026-04-12T07:00:00+00:00</updated><id>https://mate.gelei.dev/2026/04/12/excel-will-outlive-us-all</id><content type="html" xml:base="https://mate.gelei.dev/2026/04/12/excel-will-outlive-us-all/"><![CDATA[<p>There’s a kind of person who pops up in every AI discussion thread: while someone is running the numbers on how many jobs are going to evaporate in the next five years, these folks are cheerfully explaining why their company’s 47-step Jira-to-Salesforce automation is truly one of a kind and simply cannot be replaced by a standard tool. You know the type.</p>

<p>They’re not entirely wrong about AI. It probably will eat a good chunk of business software and SaaS alive, eventually. But their reasoning about <em>why</em> their setup is special is almost always catastrophically misguided.</p>

<p>Here’s the thing: you don’t want a custom solution. You think you do, but you don’t.</p>

<h3 id="the-excel-problem">The Excel Problem</h3>

<p>Think about Microsoft Excel for a moment. It is, by any reasonable measure, a deeply mediocre piece of software. Its formula syntax is an archaeological dig through decades of bad decisions. Its date system is famously broken in ways that will never be fixed because too many spreadsheets depend on the bug. It crashes, it does weird things with leading zeros, and no one can agree on whether it’s a database or not.</p>

<p>And yet.</p>

<p>You hire someone – anyone, from literally anywhere – and there’s a decent chance they’ve used Excel before. Not just opened it once, but actually <em>used</em> it. Pivot tables, VLOOKUPs, the whole disaster. Your ancient accounting software from the early 2000s? It can export to Excel. Your shiny new whatever-as-a-service platform that your CTO is very excited about? It exports to Excel. The janky internal tool your previous contractor left behind with no documentation? Somehow, against all odds, it exports to Excel.</p>

<p>This is not a coincidence.</p>

<h3 id="standards-win-always-most-of-the-time">Standards Win, <del>Always</del> Most of the Time</h3>

<p>A custom solution means you own all of it: the code, the quirks, the institutional knowledge baked into the heads of two specific people who are definitely going to leave. A standard tool means that knowledge is already out there, distributed across the workforce, documented in a thousand Stack Overflow threads, and probably the subject of a YouTube tutorial uploaded in 2016 that still works.</p>

<h3 id="and-then-ai-showed-up">And Then AI Showed Up</h3>

<p>Now layer AI on top of this. Everyone is very excited about AI obliterating SaaS vendors, because why pay 5 bucks a month for a good-enough solution when you can spend 10k on AI tokens and vibe-code your own? And sure, some of that will be genuinely useful. But most of it is going to age about as well as that PHP monolith your team has been “planning to rewrite” since PHP 3.5.</p>

<p>The tools that will actually stick are the ones that become the new Excel. The ones where, five years from now, you can hire someone and assume they’ve touched it. The ones your ERP can export to, and your next ERP can import from. The ones with an ecosystem wide enough that <em>someone else</em> has already solved your specific problem.</p>

<p>Custom AI solutions are fun to demo. Standard ones are fun to build your business on.</p>

<h3 id="the-actual-point">The Actual Point</h3>

<p>None of this means you should never build anything. Sometimes the standard tool genuinely doesn’t fit, and you have a real, defensible reason to roll your own. But that bar is higher than most people think, and the cost of being wrong is paid slowly, in the form of onboarding new hires, debugging undocumented logic, and explaining to your successor why everything works the way it does.</p>

<p>So yes, AI will probably reshape a lot of things. But the teams that quietly stick to boring, well-understood, widely-supported tools are going to spend a lot less time on tribal knowledge and a lot more time on actual work.</p>

<p>But Excel will still be there when the universe ends.</p>]]></content><author><name>{&quot;twitter&quot; =&gt; &quot;MateGelei&quot;, &quot;url&quot; =&gt; &quot;https://mate.gelei.dev&quot;}</name></author><summary type="html"><![CDATA[There’s a kind of person who pops up in every AI discussion thread: while someone is running the numbers on how many jobs are going to evaporate in the next five years, these folks are cheerfully explaining why their company’s 47-step Jira-to-Salesforce automation is truly one of a kind and simply cannot be replaced by a standard tool. You know the type.]]></summary></entry><entry><title type="html">Make ZSH Great Again</title><link href="https://mate.gelei.dev/2026/03/24/make-zsh-great-again/" rel="alternate" type="text/html" title="Make ZSH Great Again" /><published>2026-03-24T15:30:00+00:00</published><updated>2026-03-24T15:30:00+00:00</updated><id>https://mate.gelei.dev/2026/03/24/make-zsh-great-again</id><content type="html" xml:base="https://mate.gelei.dev/2026/03/24/make-zsh-great-again/"><![CDATA[<p>Tired of not being able to use vim to edit shell commands?</p>

<p>Tired of not remembering the obscure snippet you have to put in your profile to fix this?</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>bindkey -v
autoload -Uz edit-command-line
zle -N edit-command-line
bindkey -M vicmd v edit-command-line
</code></pre></div></div>

<p>You’re welcome!</p>]]></content><author><name>{&quot;twitter&quot; =&gt; &quot;MateGelei&quot;, &quot;url&quot; =&gt; &quot;https://mate.gelei.dev&quot;}</name></author><summary type="html"><![CDATA[Tired of not being able to use vim to edit shell commands?]]></summary></entry><entry><title type="html">ChatGPT, Please Stop the Mental Illness</title><link href="https://mate.gelei.dev/2026/03/24/chatgpt-personalization/" rel="alternate" type="text/html" title="ChatGPT, Please Stop the Mental Illness" /><published>2026-03-24T15:00:00+00:00</published><updated>2026-03-24T15:00:00+00:00</updated><id>https://mate.gelei.dev/2026/03/24/chatgpt-personalization</id><content type="html" xml:base="https://mate.gelei.dev/2026/03/24/chatgpt-personalization/"><![CDATA[<p>There is a very specific kind of suffering that only appears when you ask ChatGPT to write something simple and it responds like it was raised in a bunker by LinkedIn influencers and middle managers. You ask for a paragraph, and it gives you a framework. You ask for a normal explanation, and it starts stacking its fucking bullet points as if it’s about to pitch synergy to a room full of unwilling hostages.</p>

<p>In a fun little experiment, I forced a merry band of GPT agents to come up with something that actually pacifies ChatGPT. You wouldn’t believe it, but they actually made a dent in the problem.</p>

<p>Copy this into the custom instructions in the personalization settings, leave the useless fine-tuning settings at their default values, and enjoy the result.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Respond briefly, get to the point. Keep it short and direct, but use natural sentences and paragraphs. No filler text. Use bold formatting to highlight the core keywords in each paragraph, no more than one or two per paragraph. Start longer responses with a summary.
</code></pre></div></div>

<p>Unbelievable.</p>

<p>–
Updated for even better results.</p>]]></content><author><name>{&quot;twitter&quot; =&gt; &quot;MateGelei&quot;, &quot;url&quot; =&gt; &quot;https://mate.gelei.dev&quot;}</name></author><summary type="html"><![CDATA[There is a very specific kind of suffering that only appears when you ask ChatGPT to write something simple and it responds like it was raised in a bunker by LinkedIn influencers and middle managers. You ask for a paragraph, and it gives you a framework. You ask for a normal explanation, and it starts stacking its fucking bullet points as if it’s about to pitch synergy to a room full of unwilling hostages.]]></summary></entry><entry><title type="html">UX Extravaganza - Electricity Meter Reading</title><link href="https://mate.gelei.dev/2025/07/16/electricity-ux/" rel="alternate" type="text/html" title="UX Extravaganza - Electricity Meter Reading" /><published>2025-07-16T16:00:00+00:00</published><updated>2025-07-16T16:00:00+00:00</updated><id>https://mate.gelei.dev/2025/07/16/electricity-ux</id><content type="html" xml:base="https://mate.gelei.dev/2025/07/16/electricity-ux/"><![CDATA[<p>The dreaded email arrived: it’s time for the annual electricity meter reading. I immediately noticed it wasn’t from the usual company this time, but it didn’t look like phishing. In fact, it explicitly stated it was trustworthy and definitely not a scam, right in the email.</p>

<blockquote>
  <p>We would like to draw your attention to the fact that if you want, you can still report your usage in your universal service provider’s/trader’s application, but this does not replace the annual reading.</p>
</blockquote>

<p>Alright, sounds serious, let’s do this. Photo-based reading is only possible through a mobile app, but not with any of the three I’ve already installed during the electricity provider chaos of recent years in Hungary. Instead, it’s with a new one. Okay, download, login, no good.</p>

<p>I didn’t despair. Let’s read the email further:</p>

<blockquote>
  <p>Please download the Whatever Customer Service application and request a new password using your previously registered email address by selecting the ‘Request new password’ option. After that, you will be able to submit your meter reading.</p>
</blockquote>

<p>It seems someone else has run into this before, so let’s generate one. “Unknown email address,” it says for the address saved in 1Password for Whatever Customer Service. I didn’t study this much to get stuck on such a trivial thing, so I grabbed the address from the ‘To:’ line of the same email and pasted it in, just in case. “Unknown email address.” At this point, I started to wonder how this was possible, but let’s read on.</p>

<blockquote>
  <p>Our online customer service is available at: (here and there)</p>
</blockquote>

<p>Well, they can surely help here, right? Click, it opens, asks for my email and password. I tried it just in case, but it doesn’t work here either. Login with the fancy new government-backed identity provider, that must be it. Let’s see, I log in, and it asks for my email and password. Never mind then.</p>

<p>It seems no such account exists, so let’s register one. So far, I had three entries in 1Password for the previous iterations of the same company. Now there will be a fourth, but the system can handle it. It says to enter the meter’s identifier, just 33 characters, so easy to remember.</p>

<p>Luckily, the meter’s identifier is in the email! From here, it’s a smooth ride, right? It also asks for the postal code. I assume it’s for the place of consumption, where the meter is. Sounds logical, right? I type it in. Next. No good, no such identifier. I double-check to see if any of the 33 characters got corrupted during copy-paste, but no.</p>

<p>Then it hits me: what if I have to enter the billing address instead of the consumption address? Okay, I type it in. Next. No good, no such identifier.</p>

<p>You know what, Whatever Customer Service? Kiss my ass.</p>]]></content><author><name>{&quot;twitter&quot; =&gt; &quot;MateGelei&quot;, &quot;url&quot; =&gt; &quot;https://mate.gelei.dev&quot;}</name></author><summary type="html"><![CDATA[The dreaded email arrived: it’s time for the annual electricity meter reading. I immediately noticed it wasn’t from the usual company this time, but it didn’t look like phishing. In fact, it explicitly stated it was trustworthy and definitely not a scam, right in the email.]]></summary></entry><entry><title type="html">Junior vs. Senior Skillsets: The Case for Hiring Juniors, Even in a Bad Market</title><link href="https://mate.gelei.dev/2025/07/16/junior-vs-senior-skillsets/" rel="alternate" type="text/html" title="Junior vs. Senior Skillsets: The Case for Hiring Juniors, Even in a Bad Market" /><published>2025-07-16T07:00:00+00:00</published><updated>2025-07-16T07:00:00+00:00</updated><id>https://mate.gelei.dev/2025/07/16/junior-vs-senior-skillsets</id><content type="html" xml:base="https://mate.gelei.dev/2025/07/16/junior-vs-senior-skillsets/"><![CDATA[<p>A recent conversation with a colleague sparked an interesting thought about how we evaluate developers at different stages of their careers. It went something like this:</p>

<blockquote>
  <p><strong>Colleague A:</strong> We couldn’t hire anyone for [redacted senior role]. Such basic things are missing that I would expect even from a junior.</p>

  <p><strong>Colleague B:</strong> What do you mean? That they can’t recite the SOLID principles word-for-word?</p>
</blockquote>

<p>This exchange gets to the heart of a common misconception: that a senior developer’s knowledge is simply a superset of a junior’s. We assume seniors know everything a junior does, plus a whole lot more. But what if their skillsets are not just about quantity, but are qualitatively different?</p>

<h3 id="the-two-types-of-knowledge">The Two Types of Knowledge</h3>

<ol>
  <li><strong>Textbook Knowledge:</strong> This is the formal, foundational knowledge often learned from books, courses, and university. It includes things like data structures, algorithms, design patterns, and the precise definitions of principles like SOLID, ACID, or the CAP theorem.</li>
  <li><strong>Practical Expertise:</strong> This is the wisdom gained through years of hands-on experience. It’s about knowing which corners can be cut and why, understanding the operational realities of a system, debugging complex issues, and making pragmatic architectural trade-offs. It’s the intuition that tells you a particular solution, while technically correct, will be a nightmare to maintain. And most importantly, it’s about knowing what to do if the customer wants to pick all three pillars of the CAP theorem, because they are not computer scientists.</li>
</ol>

<p>A junior developer, fresh from their studies, is often strongest in textbook knowledge. Not only can they recite theoretical knowledge, but they are (or should be, at least) up-to-date on the latest frameworks and concepts that I simply don’t have the time to learn. Also, with the leetcode grind that’s going on nowadays, they are pretty solid with DSA, where I wouldn’t be able to code the same SuperDuperSort algorithm even if my life depended on it.</p>

<p>A senior developer, on the other hand, operates primarily from practical expertise. They’ve internalized the principles to the point where they apply them instinctively. They might not remember the exact textbook definition of every letter in SOLID, but they can design a system that embodies those principles because they have felt the pain of systems that didn’t. Their knowledge has been compressed and abstracted into a higher-level understanding.</p>

<h3 id="the-interview-fallacy">The Interview Fallacy</h3>

<p>This brings us back to the interview question. Is it a fair or effective use of time to ask a candidate for a Principal or Architect role to recite textbook knowledge?</p>

<p>Probably not. Their expertise is in applying the principle, not reciting it. But here’s the kicker: juniors can actually bring that kind of knowledge and fresh perspective to the table. So even if you’re meddling with AI, coding agents won’t call you out for your out-of-date knowledge like an overzealous junior might.</p>

<p>For a senior candidate, the questions should be different:</p>

<ul>
  <li>“Tell me about a time you had to make a significant trade-off in a system’s design.”</li>
  <li>“Walk me through how you’d design a scalable and resilient version of this application.”</li>
  <li>“Here’s a buggy piece of code. How would you approach debugging it?”</li>
</ul>

<p>These questions probe their practical expertise, their problem-solving skills, and their architectural intuition—the true markers of seniority.</p>

<h3 id="valuing-both-skillsets">Valuing Both Skillsets</h3>

<p>This isn’t to say textbook knowledge is unimportant. It’s the foundation upon which all expertise is built. A team needs both: the fresh, formal knowledge of the junior and the seasoned, practical wisdom of the senior. They are not competing; they are complementary.</p>

<p>The junior’s role is to learn, to question, and to bring new ideas to the table. The senior’s role is to guide, to mentor, and to ensure that the solutions being built are not just clever, but also wise.</p>

<p>So, the next time you’re interviewing, consider the candidate’s experience level. Are you testing for the right kind of knowledge? And are you hiring from a talent pool that’s knowledge-wise diverse enough to function well?</p>]]></content><author><name>{&quot;twitter&quot; =&gt; &quot;MateGelei&quot;, &quot;url&quot; =&gt; &quot;https://mate.gelei.dev&quot;}</name></author><summary type="html"><![CDATA[A recent conversation with a colleague sparked an interesting thought about how we evaluate developers at different stages of their careers. It went something like this:]]></summary></entry><entry><title type="html">Grok 4: I Wanted to Believe</title><link href="https://mate.gelei.dev/2025/07/14/grok4-first-impressions/" rel="alternate" type="text/html" title="Grok 4: I Wanted to Believe" /><published>2025-07-14T09:00:00+00:00</published><updated>2025-07-14T09:00:00+00:00</updated><id>https://mate.gelei.dev/2025/07/14/grok4-first-impressions</id><content type="html" xml:base="https://mate.gelei.dev/2025/07/14/grok4-first-impressions/"><![CDATA[<p>With legions of impatient X users standing guard, the release of xAI’s Grok 4 has finally happened. But man, the amount of <del>shills</del> enthusiastic, real life users reposting the same 10-15 use cases was off the charts. Coincidentally, this set of scenarios was full of self-contained, straightforward, close-ended problems. I desperately miss a demonstration of this PhD-level LLM, working on (or even better: solving) a real life problem that has no “correct” solution.</p>

<p>And seeing the tweet about copypasting whole codebases into the Grok chat window… Whoever wrote any kind of code beyond a simple Hello World should know that “whole codebases” don’t usually fit in a single file, and more important, don’t usually fit the surprisingly small context window of Grok 4.</p>

<p>So, what is the current state of Grok 4 (the standard version, not the “Heavy” model)? Can it move beyond clever demos and perform meaningful, complex work?</p>

<h3 id="a-new-benchmark-for-raw-intelligence">A New Benchmark for Raw Intelligence</h3>

<p>There’s no denying that Grok 4 is a powerful model. On paper, it sets a new standard for raw intelligence, outperforming competitors on several difficult benchmarks. xAI claims it demonstrates PhD-level proficiency in disciplines like math, science, and reasoning. One of the most impressive results came from “Humanity’s Last Exam,” a benchmark of who knows how many “PhD-level” questions, where Grok 4 (with tools) successfully solved nearly 39% of the problems.</p>

<p>Its core features include (generated by Grok 3, reworked by my humble self):</p>

<ul>
  <li><strong>A <del>large</del> context window:</strong> 128,000 tokens in the app and 256,000 tokens through its API. <del>While not the absolute largest on the market</del> While being 85% smaller than the current best of mainstream models, it provides <del>significant</del> some room for handling complex information.</li>
  <li><strong>Native tool use:</strong> It integrates real-time web search and has a code execution sandbox, allowing it to look up current information and test its own code suggestions.</li>
  <li><strong>Structured outputs:</strong> The model can generate structured data, which is useful for development and data analysis tasks.</li>
</ul>

<h3 id="can-it-handle-a-real-codebase">Can It Handle a Real Codebase?</h3>

<p><del>No.</del></p>

<p>This is the central question for many developers. The claim that Grok 4 can “handle entire codebases” needs clarification. You cannot paste a project with hundreds of files into the context window at once; the total size would be far too large.</p>

<p>However, this doesn’t mean it’s useless for large projects. Instead of feeding it the entire codebase, a more effective workflow involves:</p>

<ol>
  <li><strong>Initial Analysis:</strong> Asking Grok 4 to analyze the project’s file structure to identify the most relevant files for a specific task.</li>
  <li><strong>Targeted Context:</strong> Loading only those key files into the context for the actual work.</li>
  <li><strong>Iterative Development:</strong> Using its capabilities for generating modular code, scaffolding new components, and understanding dependencies across the files you’ve provided.</li>
</ol>

<p>What a shame there’s no VS Code integration, where most of the development work happens nowadays. I know, I should use Cursor. Whatever.</p>

<p>That said, xAI has acknowledged that the model can underperform in areas like coding and UI mockups compared to some competitors. The company has announced that a dedicated coding-specialist model is planned for release, signaling that the current Grok 4 is a generalist, not a coding-specific expert. Which is fine, I suppose.</p>

<p>On an unrelated note, image generation has the same issue. It’s not released yet, stick to the current generation of Aurora, which is way too liberal when it comes to the number of limbs or fingers humans may have.</p>

<h3 id="the-unvarnished-truth-limitations-and-controversies">The Unvarnished Truth: Limitations and Controversies</h3>

<p>A hype-free assessment of Grok 4 must also acknowledge its significant limitations and the controversies surrounding it.</p>

<ul>
  <li><strong>Training Data Transparency:</strong> If I understand correctly, as of mid-July 2025, xAI has not disclosed what data was used to train Grok 4. This is somewhat concerning where, before the release, there was an influx of X posts about deliberately curating and rewriting human knowledge and whatever.</li>
  <li><strong>Hallucinations and Bias:</strong> This would be pretty common among all LLMs, wouldn’t it? Well guess what, <strong>no</strong>, the model goes an extra mile and has been shown to consult Elon Musk’s social media posts and reflect his views when answering controversial questions.</li>
  <li><strong>Content Moderation Failures:</strong> Grok has faced significant public backlash for generating harmful content. Shortly before the release of Grok 4, the MechaHitler incident. I’m putting on a tin foil hat, and I’d bet it was a deliberate PR stunt. Change my mind.</li>
  <li><strong>Promised, Not Delivered:</strong> Full multimodal support, like the ability to process images as inputs, is planned but not yet delivered. The current model can generate basic visuals but cannot “see”, which results in funny results when parsing a PDF, for example.</li>
</ul>

<h3 id="the-verdict-a-powerful-but-flawed-tool">The Verdict: A Powerful but Flawed Tool</h3>

<p>So, can Grok 4 do real work? The answer is a qualified <del>yes</del> <del>no</del> <strong>maybe</strong>.</p>

<p>It is not a magical assistant that will understand your entire thousand-file project instantly. Using it effectively for complex development work requires skill, careful context management, and a good understanding of its limitations. Essentially you’ll face more or less the same cognitive load, but instead of concentrating on the code, you concentrate on the LLM. But isn’t that the case for every other model? Probably so.</p>

<p>However, it is not a polished, general-purpose assistant for everyday tasks; and more importantly, I don’t know what <em>I</em> could use it for in real life, but that might be my own shortcoming.</p>

<p>Ultimately, Grok 4 seems to still be a work in progress. I think the release was premature, but xAI cranked up the hype so much that they had to release <em>something</em></p>]]></content><author><name>{&quot;twitter&quot; =&gt; &quot;MateGelei&quot;, &quot;url&quot; =&gt; &quot;https://mate.gelei.dev&quot;}</name></author><summary type="html"><![CDATA[With legions of impatient X users standing guard, the release of xAI’s Grok 4 has finally happened. But man, the amount of shills enthusiastic, real life users reposting the same 10-15 use cases was off the charts. Coincidentally, this set of scenarios was full of self-contained, straightforward, close-ended problems. I desperately miss a demonstration of this PhD-level LLM, working on (or even better: solving) a real life problem that has no “correct” solution.]]></summary></entry><entry><title type="html">Unlocking Ubuntu LUKS2 encryption automatically at boot</title><link href="https://mate.gelei.dev/2024/03/25/ubuntu-luks2-tpm/" rel="alternate" type="text/html" title="Unlocking Ubuntu LUKS2 encryption automatically at boot" /><published>2024-03-25T09:00:00+00:00</published><updated>2024-03-25T09:00:00+00:00</updated><id>https://mate.gelei.dev/2024/03/25/ubuntu-luks2-tpm</id><content type="html" xml:base="https://mate.gelei.dev/2024/03/25/ubuntu-luks2-tpm/"><![CDATA[<p>Tired of asking for a KVM every time you need to reboot your server to unlock your LUKS2 encryption?</p>

<figure class="highlight"><pre><code class="language-bash" data-lang="bash"><span class="c"># Install prerequisites</span>
apt-get <span class="nt">-y</span> <span class="nb">install </span>clevis clevis-tpm2 clevis-luks clevis-initramfs initramfs-tools tss2

clevis luks <span class="nb">bind</span> <span class="nt">-d</span> /dev/your-disk tpm2 <span class="s1">'{"pcr_bank":"sha256"}'</span>

update-initramfs <span class="nt">-u</span> <span class="nt">-k</span> all

<span class="c"># Is it really there?</span>
clevis luks list <span class="nt">-d</span> /dev/your-disk</code></pre></figure>

<p>It’d be wise to request a KVM before you actually give it a try. Just in case. Learn from my mistakes.</p>]]></content><author><name>{&quot;twitter&quot; =&gt; &quot;MateGelei&quot;, &quot;url&quot; =&gt; &quot;https://mate.gelei.dev&quot;}</name></author><summary type="html"><![CDATA[Tired of asking for a KVM every time you need to reboot your server to unlock your LUKS2 encryption?]]></summary></entry><entry><title type="html">Install an OS without KVM</title><link href="https://mate.gelei.dev/2024/03/21/hetzner-kvm/" rel="alternate" type="text/html" title="Install an OS without KVM" /><published>2024-03-21T16:10:00+00:00</published><updated>2024-03-21T16:10:00+00:00</updated><id>https://mate.gelei.dev/2024/03/21/hetzner-kvm</id><content type="html" xml:base="https://mate.gelei.dev/2024/03/21/hetzner-kvm/"><![CDATA[<p>I wanted to install RHEL on a Hetzner bare metal server, but there was a large demand for KVMs and I didn’t want to wait. I’ve found a <a href="https://gist.github.com/gushmazuko/9208438b7be6ac4e6476529385047bbb">tutorial</a> on how to install Proxmox from the Hetzner rescue system - here’s how to do it for (almost) any OS.</p>

<h3 id="step-0-boot-into-the-rescue-system">Step 0: Boot into the rescue system</h3>

<p>This is business as usual - go to the Hetzner robot, select your server, and boot into the rescue system. You’ll get an email with the root password or you can use your public keys.</p>

<h3 id="step-1-preparations">Step 1: Preparations</h3>

<p>First, we need to grab an image of the OS we want to install. I’ll use RHEL 9 as an example, but you can use any OS you want.</p>

<p>Then acquire the network configuration from the rescue system, you <em>might</em> need it later. For RHEL, it’s not necessary, you can just set your network configuration in the installer to automatic, then DHCP will handle the rest. It was necessary for Proxmox, though.</p>

<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="nv">INTERFACE_NAME</span><span class="o">=</span><span class="si">$(</span>udevadm info <span class="nt">-q</span> property /sys/class/net/eth0 | <span class="nb">grep</span> <span class="s2">"ID_NET_NAME_ONBOARD="</span> | <span class="nb">cut</span> <span class="nt">-d</span><span class="s1">'='</span> <span class="nt">-f2</span><span class="si">)</span>
<span class="nv">IP_CIDR</span><span class="o">=</span><span class="si">$(</span>ip addr show eth0 | <span class="nb">grep</span> <span class="s2">"inet</span><span class="se">\b</span><span class="s2">"</span> | <span class="nb">awk</span> <span class="s1">'{print $2}'</span><span class="si">)</span>
<span class="nv">GATEWAY</span><span class="o">=</span><span class="si">$(</span>ip route | <span class="nb">grep </span>default | <span class="nb">awk</span> <span class="s1">'{print $3}'</span><span class="si">)</span>
<span class="nv">IP_ADDRESS</span><span class="o">=</span><span class="si">$(</span><span class="nb">echo</span> <span class="s2">"</span><span class="nv">$IP_CIDR</span><span class="s2">"</span> | <span class="nb">cut</span> <span class="nt">-d</span><span class="s1">'/'</span> <span class="nt">-f1</span><span class="si">)</span>
<span class="nv">CIDR</span><span class="o">=</span><span class="si">$(</span><span class="nb">echo</span> <span class="s2">"</span><span class="nv">$IP_CIDR</span><span class="s2">"</span> | <span class="nb">cut</span> <span class="nt">-d</span><span class="s1">'/'</span> <span class="nt">-f2</span><span class="si">)</span></code></pre></figure>

<p>The <code class="language-plaintext highlighter-rouge">INTERFACE_NAME</code> might need some tweaking, ID_NET_NAME_ONBOARD may not exist.</p>

<h3 id="step-2-install-the-os-via-qemu">Step 2: Install the OS via QEMU</h3>

<p>Kick off the installation with QEMU. You can use the following command as a template, just replace the image and the disk with your own.</p>

<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="c"># Get the primary and secondary disks</span>
<span class="nv">PRIMARY_DISK</span><span class="o">=</span><span class="si">$(</span>lsblk <span class="nt">-dn</span> <span class="nt">-o</span> NAME,SIZE,TYPE <span class="nt">-e</span> 1,7,11,14,15 | <span class="nb">sed</span> <span class="nt">-n</span> 1p | <span class="nb">awk</span> <span class="s1">'{print $1}'</span><span class="si">)</span>
<span class="nv">SECONDARY_DISK</span><span class="o">=</span><span class="si">$(</span>lsblk <span class="nt">-dn</span> <span class="nt">-o</span> NAME,SIZE,TYPE <span class="nt">-e</span> 1,7,11,14,15 | <span class="nb">sed</span> <span class="nt">-n</span> 2p | <span class="nb">awk</span> <span class="s1">'{print $1}'</span><span class="si">)</span>

<span class="c"># Kick off QEMU with CDROM</span>
qemu-system-x86_64 <span class="nt">-daemonize</span> <span class="nt">-enable-kvm</span> <span class="nt">-m</span> 10240 <span class="se">\</span>
<span class="nt">-hda</span> /dev/<span class="nv">$PRIMARY_DISK</span> <span class="se">\</span>
<span class="nt">-hdb</span> /dev/<span class="nv">$SECONDARY_DISK</span> <span class="se">\</span>
<span class="nt">-cdrom</span> /tmp/rhel-9.3.iso <span class="nt">-boot</span> d <span class="nt">-vnc</span> :0,password<span class="o">=</span>on <span class="nt">-monitor</span> telnet:127.0.0.1:4444,server,nowait

<span class="c"># Set VNC password</span>
<span class="nb">echo</span> <span class="s2">"change vnc password &lt;VNC_PASSWORD&gt;"</span> | nc <span class="nt">-q</span> 1 127.0.0.1 4444</code></pre></figure>

<p>Alternatively, if you have more than 2 disks, you can use <code class="language-plaintext highlighter-rouge">-hda /dev/sda -hdb /dev/sdb -hdc /dev/sdc -drive file=proxmox-ve.iso,index=3,media=cdrom</code> or similar, because -cdrom conflicts with -hdc.</p>

<p>Now you can connect to the VNC server with your favorite VNC client over port 5900.</p>

<p>If your server uses UEFI boot, you need to add <code class="language-plaintext highlighter-rouge">-bios /usr/share/qemu/OVMF.fd</code> to the QEMU command, or wherever your OVMF.fd is. (Hint: updatedb+locate)</p>

<p>After your OS is installed, you can shut down the QEMU session:</p>

<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="nb">printf</span> <span class="s2">"quit</span><span class="se">\n</span><span class="s2">"</span> | nc 127.0.0.1 4444</code></pre></figure>

<h3 id="step-3-boot-into-the-installed-os---still-in-qemu">Step 3: Boot into the installed OS - still in QEMU</h3>

<p>After the installation is finished, reboot the guest OS, then restart the QEMU session:</p>

<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="c"># Kick off QEMU without CDROM</span>
qemu-system-x86_64 <span class="nt">-daemonize</span> <span class="nt">-enable-kvm</span> <span class="nt">-m</span> 10240 <span class="se">\</span>
<span class="nt">-hda</span> /dev/<span class="nv">$PRIMARY_DISK</span> <span class="se">\</span>
<span class="nt">-hdb</span> /dev/<span class="nv">$SECONDARY_DISK</span> <span class="se">\</span>
<span class="nt">-vnc</span> :0,password<span class="o">=</span>on <span class="nt">-monitor</span> telnet:127.0.0.1:4444,server,nowait <span class="se">\</span>
<span class="nt">-net</span> user,hostfwd<span class="o">=</span>tcp::2222-:22 <span class="nt">-net</span> nic
<span class="c"># Did you use UEFI boot before? Make the same changes here.</span>

<span class="c"># Set VNC password</span>
<span class="nb">echo</span> <span class="s2">"change vnc password &lt;VNC_PASSWORD&gt;"</span> | nc <span class="nt">-q</span> 1 127.0.0.1 4444</code></pre></figure>

<p>Connect to the guest via VNC again, and copy the network settings from step 1, also make sure you can log in remotely from the server.</p>

<p><strong>This is the time to grab your public keys and add them to the guest OS.</strong></p>

<p>Pro tip: <code class="language-plaintext highlighter-rouge">curl https://github.com/username.keys &gt;&gt; ~/.ssh/authorized_keys</code></p>

<h3 id="step-4-wrapping-up">Step 4: Wrapping up</h3>

<p>Shut down the guest OS gracefully:</p>

<figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="nb">printf</span> <span class="s2">"system_powerdown</span><span class="se">\n</span><span class="s2">"</span> | nc 127.0.0.1 4444</code></pre></figure>

<p>Then <code class="language-plaintext highlighter-rouge">reboot</code> the rescue system.</p>]]></content><author><name>{&quot;twitter&quot; =&gt; &quot;MateGelei&quot;, &quot;url&quot; =&gt; &quot;https://mate.gelei.dev&quot;}</name></author><summary type="html"><![CDATA[I wanted to install RHEL on a Hetzner bare metal server, but there was a large demand for KVMs and I didn’t want to wait. I’ve found a tutorial on how to install Proxmox from the Hetzner rescue system - here’s how to do it for (almost) any OS.]]></summary></entry><entry><title type="html">Install RSAT via Powershell</title><link href="https://mate.gelei.dev/2024/02/05/rsat-powershell/" rel="alternate" type="text/html" title="Install RSAT via Powershell" /><published>2024-02-05T12:00:00+00:00</published><updated>2024-02-05T12:00:00+00:00</updated><id>https://mate.gelei.dev/2024/02/05/rsat-powershell</id><content type="html" xml:base="https://mate.gelei.dev/2024/02/05/rsat-powershell/"><![CDATA[<p>Note to self – I needed to install RSAT on a build agent, so using the “optional features” GUI was not possible.</p>

<p>Get a list of RSAT components:</p>

<p><code class="language-plaintext highlighter-rouge">Get-WindowsCapability -Name RSAT* -Online | Select-Object -Property Name, State</code></p>

<p>Install what you need, e.g.:</p>

<p><code class="language-plaintext highlighter-rouge">Add-WindowsCapability -Name "Rsat.GroupPolicy.Management.Tools~~~~0.0.1.0" -Online</code></p>]]></content><author><name>{&quot;twitter&quot; =&gt; &quot;MateGelei&quot;, &quot;url&quot; =&gt; &quot;https://mate.gelei.dev&quot;}</name></author><summary type="html"><![CDATA[Note to self – I needed to install RSAT on a build agent, so using the “optional features” GUI was not possible.]]></summary></entry><entry><title type="html">Azure DevOps - build pipeline billing extravaganza</title><link href="https://mate.gelei.dev/2023/12/18/ado-pipeline-pricing/" rel="alternate" type="text/html" title="Azure DevOps - build pipeline billing extravaganza" /><published>2023-12-18T12:00:00+00:00</published><updated>2023-12-18T12:00:00+00:00</updated><id>https://mate.gelei.dev/2023/12/18/ado-pipeline-pricing</id><content type="html" xml:base="https://mate.gelei.dev/2023/12/18/ado-pipeline-pricing/"><![CDATA[<p>Azure DevOps has a nice little feature called Azure Pipelines. It’s a great CI/CD tool, especially if you’re already using Azure DevOps for your source control and work item tracking. However, it’s pricing is a little confusing, and it’s easy to end up paying more than you need to.</p>

<p>Azure offers a free-tier of 1 parallel jobs (or 10 for open source projects) with 1800 minutes per month. This might be enough for small projects, but if you have a larger project, you’ll need to pay for more parallel jobs. The pricing is based both on the number of parallel jobs you need, and the number of minutes you need per month.</p>

<p>The pricing is per month, and you pay for the maximum number of parallel jobs you need at any one time. <strong>This is calculated daily.</strong></p>

<p>This means that for each and every day, you pay for the maximum number of parallel jobs that were in effect on that day. If you only use pipelines from 9-5, you pay the whole daily fee ($40 / 30 days) of <strong>all</strong> pipelines.</p>

<p>But if you turn remove all (paid) parallelization for the weekends, for example, you won’t pay for those days at all.</p>

<p>Since this isn’t documented anywhere, I’ve asked Azure support to confirm it:</p>

<blockquote>
  <p><em>Our commerce service sends this value to Azure billing once every day.
To determine what amount to send, we do the following:</em></p>

  <p><em>Figure out what the maximum concurrency that has been set by the customer during the day.</em></p>

  <p><em>It does not matter whether they reset it 0, since we look at the max value.</em></p>

  <p><em>If on the next day, they set it 2 for a few minutes, then the bill for that day will be 2 x 1.33 = 2.66.</em></p>

  <p><em>So, you can set it to 0 before non-working day for managing cost since it’s billed daily.*</em></p>
</blockquote>]]></content><author><name>{&quot;twitter&quot; =&gt; &quot;MateGelei&quot;, &quot;url&quot; =&gt; &quot;https://mate.gelei.dev&quot;}</name></author><summary type="html"><![CDATA[Azure DevOps has a nice little feature called Azure Pipelines. It’s a great CI/CD tool, especially if you’re already using Azure DevOps for your source control and work item tracking. However, it’s pricing is a little confusing, and it’s easy to end up paying more than you need to.]]></summary></entry></feed>