add stack page

main
Norman Köhring 4 months ago
parent bc650f5bf1
commit ba7e35a641

@ -3,7 +3,7 @@
<head>
<meta charset="utf-8">
<base href="http://localhost:8080/">
<base href="https://koehr.in/">
<title>Weblog aka Blog // the codeartist — programmer and engineer based in Berlin</title>
<meta name="description" content="Homepage, Portfolio and CV of Norman Köhring" />
<meta content="The personal page and weblog of Norman Köhring" name=description>

@ -3,7 +3,7 @@
<head>
<meta charset="utf-8">
<base href="http://localhost:8080/">
<base href="https://koehr.in/">
<title>Weblog aka Blog // the codeartist — programmer and engineer based in Berlin</title>
<meta name="description" content="Homepage, Portfolio and CV of Norman Köhring" />
<meta content="The personal page and weblog of Norman Köhring" name=description>

@ -3,7 +3,7 @@
<head>
<meta charset="utf-8">
<base href="http://localhost:8080/">
<base href="https://koehr.in/">
<title>Weblog aka Blog // the codeartist — programmer and engineer based in Berlin</title>
<meta name="description" content="Homepage, Portfolio and CV of Norman Köhring" />
<meta content="The personal page and weblog of Norman Köhring" name=description>

@ -3,7 +3,7 @@
<head>
<meta charset="utf-8">
<base href="http://localhost:8080/">
<base href="https://koehr.in/">
<title>Weblog aka Blog // the codeartist — programmer and engineer based in Berlin</title>
<meta name="description" content="Homepage, Portfolio and CV of Norman Köhring" />
<meta content="The personal page and weblog of Norman Köhring" name=description>

@ -3,7 +3,7 @@
<head>
<meta charset="utf-8">
<base href="http://localhost:8080/">
<base href="https://koehr.in/">
<title>Weblog aka Blog // the codeartist — programmer and engineer based in Berlin</title>
<meta name="description" content="Homepage, Portfolio and CV of Norman Köhring" />
<meta content="The personal page and weblog of Norman Köhring" name=description>

@ -3,7 +3,7 @@
<head>
<meta charset="utf-8">
<base href="http://localhost:8080/">
<base href="https://koehr.in/">
<title>Weblog aka Blog // the codeartist — programmer and engineer based in Berlin</title>
<meta name="description" content="Homepage, Portfolio and CV of Norman Köhring" />
<meta content="The personal page and weblog of Norman Köhring" name=description>

@ -3,7 +3,7 @@
<head>
<meta charset="utf-8">
<base href="http://localhost:8080/">
<base href="https://koehr.in/">
<title>Weblog aka Blog // the codeartist — programmer and engineer based in Berlin</title>
<meta name="description" content="Homepage, Portfolio and CV of Norman Köhring" />
<meta content="The personal page and weblog of Norman Köhring" name=description>

@ -3,7 +3,7 @@
<head>
<meta charset="utf-8">
<base href="http://localhost:8080/">
<base href="https://koehr.in/">
<title>Weblog aka Blog // the codeartist — programmer and engineer based in Berlin</title>
<meta name="description" content="Homepage, Portfolio and CV of Norman Köhring" />
<meta content="The personal page and weblog of Norman Köhring" name=description>

@ -3,7 +3,7 @@
<head>
<meta charset="utf-8">
<base href="http://localhost:8080/">
<base href="https://koehr.in/">
<title>CV/Resume // the codeartist — programmer and engineer based in Berlin</title>
<meta name="description" content="Homepage, Portfolio and CV of Norman Köhring" />
<meta content="The personal page and weblog of Norman Köhring" name=description>

2
dist/index.html vendored

@ -3,7 +3,7 @@
<head>
<meta charset=utf-8>
<base href="http://localhost:8080/">
<base href="https://koehr.in/">
<title>Norman Köhring // the codeartist — programmer and engineer based in Berlin</title>
<meta content="The personal page and weblog of Norman Köhring" name=description>
<meta content="Norman Köhring" name=author>

@ -3,7 +3,7 @@
<head>
<meta charset="utf-8">
<base href="http://localhost:8080/">
<base href="https://koehr.in/">
<title>/now // the codeartist — programmer and engineer based in Berlin</title>
<meta name="description" content="Homepage, Portfolio and CV of Norman Köhring" />
<meta content="The personal page and weblog of Norman Köhring" name=description>

7
dist/posts.css vendored

@ -1,10 +1,11 @@
main.posts {
margin: calc(var(--header-height-small) + 2rem) auto 4rem;
}
main.posts > #content > h1 {
padding: 0;
main.posts h2 {
margin: 1.5em 0 0 0;
font-size: 1.5rem;
color: var(--highlight-fg-color);
}
main.posts article {
margin: 2rem 0;
}

@ -3,7 +3,7 @@
<head>
<meta charset="utf-8">
<base href="http://localhost:8080/">
<base href="https://koehr.in/">
<title>Active Projects // the codeartist — programmer and engineer based in Berlin</title>
<meta name="description" content="Homepage, Portfolio and CV of Norman Köhring" />
<meta content="The personal page and weblog of Norman Köhring" name=description>

@ -3,7 +3,7 @@
<head>
<meta charset="utf-8">
<base href="http://localhost:8080/">
<base href="https://koehr.in/">
<title>My Setup // the codeartist — programmer and engineer based in Berlin</title>
<meta name="description" content="Homepage, Portfolio and CV of Norman Köhring" />
<meta content="The personal page and weblog of Norman Köhring" name=description>

@ -3,7 +3,7 @@
<head>
<meta charset="utf-8">
<base href="http://localhost:8080/">
<base href="https://koehr.in/">
<title>My Stack // the codeartist — programmer and engineer based in Berlin</title>
<meta name="description" content="Homepage, Portfolio and CV of Norman Köhring" />
<meta content="The personal page and weblog of Norman Köhring" name=description>
@ -38,25 +38,29 @@
<p><em>As a software engineer, the tools I use define how I work and I find it always inspiring to see the tools, other people use. This page focusses on Software. For Hardware, check <a href="/setup">/setup</a>.</em></p>
<p>Last updated: 2024-05-13</p>
<p>Introduction Lorem Ipsum Sit Dolor Amet...</p>
<h2>Headline 1</h2>
<blockquote>
<p>Some extra info</p>
</blockquote>
<ul>
<li>A nice list of things, maybe?</li>
<li>Could also be a paragraph or two.</li>
<li>That is totally up to me, I guess.</li>
</ul>
<h2>Headline 2</h2>
<blockquote>
<p>Some more extra info</p>
</blockquote>
<ul>
<li>A nice list of things, maybe?</li>
<li>Could also be a paragraph or two.</li>
<li>That is totally up to me, I guess.</li>
</ul>
<p>My software stack is pretty old-school. I prefer CLI applications for almost everything. The only GUI programs I usually run are browsers, image manipulators and LogSeq.</p>
<h2><span title="Operating System">OS</span>: Fedora Linux</h2>
<p>It all started with Real Red Linux 2000, a special millenium version of <a href="https://en.wikipedia.org/wiki/Red_Hat_Linux">RedHat Linux</a>. I don't know for sure, but I think it was based on RedHat 6.1 or 6.2.</p>
<p>Over the years, I first used different RPM based distributions, then switched to <a href="https://www.gentoo.org/">Gentoo</a> for a while, before getting annoyed by the compiling frenzy and discovering <a href="https://archlinux.org/">Arch</a>. When Arch made the switch to systemd, I found Void Linux and stayed with it for years. At some point, not many years ago, I went with <a href="https://fedoraproject.org/">Fedora</a> and it struck a nice middle ground between customizability and &quot;it just works&quot;. Thanks to Fedora Spins, it is now easy to have a more standard system on my work laptop and a rather customized one on my private laptop, without too many differences in the foundation. I use official the <a href="https://fedoraproject.org/spins/sway/">Sway Spin</a> on my private laptop.</p>
<h2><span title="Desktop Environment">DE</span>: GNOME vs Sway</h2>
<p>Over the years I got used to tiling window managers. Honestly, I tried almost all of them and went from <a href="https://xmonad.org/">hyper-configurable</a> to <a href="https://dwm.suckless.org/">super minimalist</a>. I ended up - as usual - somewhere in the middle, with <a href="https://i3wm.org/">i3</a> and <a href="https://swaywm.org/">Sway</a>.</p>
<p>My work laptop has a GNOME desktop with some extensions, that make it work well for me. My typical work flow involves full screen applications and many desktops. I rarely have more than one window on one screen. That is why I didn't have too much of a hard time to switch from <a href="https://dwm.suckless.org/">dwm</a> and similar tiling window managers to GNOME, because it uses MacOS-like gestures to work with desktops. Extensions like <a href="https://extensions.gnome.org/extension/6127/only-window-maximize/">Maximize Lonely Window</a> help as well. There used to be another extension, <a href="https://extensions.gnome.org/extension/3100/maximize-to-empty-workspace/">Maximize To Empty Workspace</a>, which was even closer to my usual way of working. But it is not supported in newer GNOME versions.</p>
<h2>Editor: Helix</h2>
<p>Most of my life, I used <a href="https://www.vim.org/">ViM</a>. It made me more productive and helped me to focus on the things that matter most for my productivity. One day, I found <a href="https://kakoune.org">Kakoune</a>, which blew me away by being so similar and yet different to ViM, in a (in my opinion) good way. What Kakoune does is to to switch around the command order. While ViM's command language is VERB-MODIFIER-OBJECT. For example: <code>d2w</code> means delete two words. Kakoune switches that to MODIFIER-VERB-OBJECT and introduces selecting and non-selecting movement, which allows you to see your selection before applying an action. <code>d2w</code> changes to <code>2Wd</code>, which translates to select next two words, then delete them. I finally settled with <a href="https://helix-editor.com/">Helix</a>, an editor that uses Kakounes command language, but implements many useful things by default, while still being very configurable.</p>
<h2>Terminal: foot + zellij + zsh</h2>
<p>Almost all of my day-to-day applications are in the terminal. I am so used to it, that I started trusting GUI applications less. This is obviously my issue, but luckily I'm not alone, so many great CLI applications exist.</p>
<p>I use <a href="https://codeberg.org/dnkl/foot">foot</a> as terminal emulator. It is lightweight, supports 24bit colours and works with Wayland.</p>
<p>Inside foot runs <a href="https://zellij.dev/">zellij</a>, which is a terminal multiplexer similar to <a href="https://www.gnu.org/software/screen/">screen</a> and <a href="https://github.com/tmux/tmux/wiki">tmux</a>. It allows me to run multiple applications in one terminal, keeps sessions alive after closing the terminal emulator and so on. I actually configured zellij to feel a lot more like tmux, because I'm so used to the latter and honestly I might just switch back to tmux, who knows.</p>
<p>My shell of choice is <a href="https://www.zsh.org/">zsh</a> with <a href="https://ohmyz.sh/">oh-my-zsh</a>. It is by far the most versatile shell and the only one (to my knowledge) that supports RPROMPT, a prompts at the end of the line.</p>
<h2>Browser: Firefox</h2>
<p>My browser of choice is <a href="https://www.mozilla.org/de/firefox/">Firefox</a>, because I want an open and diverse internet. Firefox is a great choice and offers lots of features, like direct PDF support, privacy features out of the box and great synchronisation. Chrome and Chromium-based browsers are great as well, but if everyone uses the same browser, we'll end up with whatever the company behind this browser wants the internet to be.</p>
<h2>Other Tools: LogSeq, Poe, Bitwarden, Git...</h2>
<p>Of course, I use a lot more tools in my day-to-day work.</p>
<p>I use <a href="https://logseq.com/">LogSeq</a> for knowledge management. It is similar to Evernote, Obsidian or Notion. For me it hits the mark between flexibility and structure. I use it for everthing from todo lists to planning long D&amp;D campaigns.</p>
<p><a href="https://poe.com/">Poe</a> allows access to all kinds of generative intelligence tools, like LLMs (&quot;ChatGPT&quot;) and image generators. I mostly use Mistral, but also switch between models from time to time. They help me with brainstorming and sometimes I misuse them to write JSDoc comments for me.</p>
<p><a href="https://bitwarden.com/">Bitwarden</a> is a fantastic password manager with lots of utilities. It works so that you don't need to trust the server provider, because everything runs on the client (for example in a browser plugin) and is encrypted locally before being sent to the server. The best thing is, that I can host a bitwarden server myself, using <a href="https://github.com/dani-garcia/vaultwarden">Vaultwarden</a>.</p>
<p><a href="https://git-scm.org">GIT</a> is the most widely used source code management as of today. Although I see some strengths in other systems, Git is by far good enough for all my needs. I host my own <a href="https://forgejo.org/">Forgejo</a> git server at <a href="https://git.k0r.in">git.k0r.in</a>.</p>
<p>There is a lot more and I might extend this list from time to time.</p>
</main>
<div id="spacer"></div>
<header id="header" class="small">

@ -3,7 +3,7 @@
<head>
<meta charset="utf-8">
<base href="http://localhost:8080/">
<base href="https://koehr.in/">
<title>Today I learned // the codeartist — programmer and engineer based in Berlin</title>
<meta name="description" content="Homepage, Portfolio and CV of Norman Köhring" />
<meta content="The personal page and weblog of Norman Köhring" name=description>

@ -3,7 +3,7 @@
<head>
<meta charset="utf-8">
<base href="http://localhost:8080/">
<base href="https://koehr.in/">
<title>Today I learned // the codeartist — programmer and engineer based in Berlin</title>
<meta name="description" content="Homepage, Portfolio and CV of Norman Köhring" />
<meta content="The personal page and weblog of Norman Köhring" name=description>

@ -3,7 +3,7 @@
<head>
<meta charset="utf-8">
<base href="http://localhost:8080/">
<base href="https://koehr.in/">
<title>Today I learned // the codeartist — programmer and engineer based in Berlin</title>
<meta name="description" content="Homepage, Portfolio and CV of Norman Köhring" />
<meta content="The personal page and weblog of Norman Köhring" name=description>

@ -3,7 +3,7 @@
<head>
<meta charset="utf-8">
<base href="http://localhost:8080/">
<base href="https://koehr.in/">
<title>Today I learned // the codeartist — programmer and engineer based in Berlin</title>
<meta name="description" content="Homepage, Portfolio and CV of Norman Köhring" />
<meta content="The personal page and weblog of Norman Köhring" name=description>

@ -3,7 +3,7 @@
<head>
<meta charset="utf-8">
<base href="http://localhost:8080/">
<base href="https://koehr.in/">
<title>Today I learned // the codeartist — programmer and engineer based in Berlin</title>
<meta name="description" content="Homepage, Portfolio and CV of Norman Köhring" />
<meta content="The personal page and weblog of Norman Köhring" name=description>

@ -3,7 +3,7 @@
<head>
<meta charset="utf-8">
<base href="http://localhost:8080/">
<base href="https://koehr.in/">
<title>Today I learned // the codeartist — programmer and engineer based in Berlin</title>
<meta name="description" content="Homepage, Portfolio and CV of Norman Köhring" />
<meta content="The personal page and weblog of Norman Köhring" name=description>

@ -3,7 +3,7 @@
<head>
<meta charset="utf-8">
<base href="http://localhost:8080/">
<base href="https://koehr.in/">
<title>Today I learned // the codeartist — programmer and engineer based in Berlin</title>
<meta name="description" content="Homepage, Portfolio and CV of Norman Köhring" />
<meta content="The personal page and weblog of Norman Köhring" name=description>

@ -3,7 +3,7 @@
<head>
<meta charset="utf-8">
<base href="http://localhost:8080/">
<base href="https://koehr.in/">
<title>Today I learned // the codeartist — programmer and engineer based in Berlin</title>
<meta name="description" content="Homepage, Portfolio and CV of Norman Köhring" />
<meta content="The personal page and weblog of Norman Köhring" name=description>

@ -3,7 +3,7 @@
<head>
<meta charset="utf-8">
<base href="http://localhost:8080/">
<base href="https://koehr.in/">
<title>Today I learned // the codeartist — programmer and engineer based in Berlin</title>
<meta name="description" content="Homepage, Portfolio and CV of Norman Köhring" />
<meta content="The personal page and weblog of Norman Köhring" name=description>

@ -0,0 +1,90 @@
<!DOCTYPE html>
<html lang=en>
<head>
<meta charset="utf-8">
<base href="https://koehr.in/">
<title>Today I learned // the codeartist — programmer and engineer based in Berlin</title>
<meta name="description" content="Homepage, Portfolio and CV of Norman Köhring" />
<meta content="The personal page and weblog of Norman Köhring" name=description>
<meta content="Norman Köhring" name=author>
<meta content="the codeartist — programmer and engineer based in Berlin" name=DC.title>
<meta content="52.4595, 13.5335" name=ICBM>
<meta content="52.4595; 13.5335" name=geo.position>
<meta content=DE-BE name=geo.region>
<meta content=Berlin name=geo.placename>
<meta content="width=device-width,initial-scale=1.0" name=viewport>
<link href=https://koehr.in rel=author>
<link href=https://koehr.in rel=canonical>
<link href=https://k0r.in rel=alternate>
<link href=https://koehr.ing rel=me>
<link href=@Koehr@mstdn.io rel=me>
<link href=https://sr.ht/~koehr/ rel=me>
<link href=https://git.k0r.in rel=me>
<link href=https://threads.net/@coffee_n_code rel=me>
<link href=https://instagram.com/@coffee_n_code rel=me>
<link href=https://ko-fi.com/koehr rel=me>
<link href=https://reddit.com/user/koehr rel=me>
<link href=https://koehr.in/rss.xml rel=alternate title=RSS type=application/rss+xml>
<link href=/favicon.png rel=icon type=image/x-icon>
<link href=/style.css rel=stylesheet>
</head>
<body>
<main id="til" class="posts">
<header>
<h1>TIL -- Today I learned</h1>
</header>
<h1>Rob Pike's 5 Rules of Programming</h1>
<p><a href="https://users.ece.utexas.edu/~adnan/pike.html">source</a></p>
<ol>
<li>You can't tell where a program is going to spend its time. Bottlenecks occur in surprising places, so don't try to second guess and put in a speed hack until you've proven that's where the bottleneck is.</li>
<li>Measure. Don't tune for speed until you've measured, and even then don't unless one part of the code overwhelms the rest.</li>
<li>Fancy algorithms are slow when n is small, and n is usually small. Fancy algorithms have big constants. Until you know that n is frequently going to be big, don't get fancy. (Even if n does get big, use Rule 2 first.)</li>
<li>Fancy algorithms are buggier than simple ones, and they're much harder to implement. Use simple algorithms as well as simple data structures.</li>
<li>Data dominates. If you've chosen the right data structures and organized things well, the algorithms will almost always be self-evident. Data structures, not algorithms, are central to programming.</li>
</ol>
<p>Pike's rules 1 and 2 restate Tony Hoare's famous maxim &quot;Premature optimization is the root of all evil.&quot; Ken Thompson rephrased Pike's rules 3 and 4 as &quot;When in doubt, use brute force.&quot;. Rules 3 and 4 are instances of the design philosophy KISS. Rule 5 was previously stated by Fred Brooks in The Mythical Man-Month. Rule 5 is often shortened to &quot;write stupid code that uses smart objects&quot;.</p>
</main>
<div id="spacer"></div>
<header id="header" class="small">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 832.4 143.1">
<path id="header-underscore"
d="M832.4 131.1q0 5.5-3.1 8.6-3 3.4-8.2 3.3h-75.5q-5.2 0-8.2-3.3-1.7-1.6-2.4-3.8-.7-2.3-.7-4.8 0-5.5 3.1-8.7 1.6-1.7 3.7-2.4 2.2-.8 4.5-.8h75.5q5.2 0 8.2 3.2 3 3.1 3 8.7z" />
<path id="header-bracket"
d="M731.9 81.4q0 6.7-6.5 10.7l-1 .6-74.3 39.2q-2.5 1.3-5.2 1.2-4.8 0-8.1-3.8-3.2-3.6-3.2-8.4 0-3.3 1.7-6 1.8-2.9 4.6-4.4l55.3-29.1-55.3-29q-2.8-1.6-4.6-4.3-1.7-2.7-1.7-6.2 0-4.7 3.2-8.4 3.3-4 8-3.7 2.7 0 5.3 1.2l74.4 39.2q3.3 1.7 5.3 4.7 2 2.8 2 6.5z" />
<path id="header-r"
d="M588.7 66.5q0 5-3.5 8.5-3.5 3.4-8.1 3.5-4.4 0-8.3-4.3-10-10.7-20.9-10.6-2.2 0-4.3.3-2.1.3-4 1-1.8.6-3.7 1.6-1.7 1-3.4 2.3-1.7 1.3-3.3 2.9-7.8 8.2-7.6 19.7V131q0 5.5-3.1 8.6-3 3.4-8.3 3.3l-2.2-.2q-1-.1-2.2-.5-1-.3-2-1-1-.6-1.8-1.6-1.7-1.6-2.4-3.8-.7-2.3-.7-4.8V51.6q0-5.4 3-8.6 3-3.4 8.3-3.3 2 0 3.7.6 1.8.6 3.3 1.8 1.4 1 2.2 2.7 1 1.5 1.6 3.3 11.8-8.4 27-8.4 10.6 0 21 5 11.3 5.4 17.2 14.5 2.5 3.7 2.5 7.3z" />
<path id="header-h"
d="M483.9 131.1q0 5.5-3.1 8.6-3 3.4-8.3 3.3-5.2 0-8.2-3.3-3.2-3.1-3.1-8.6V84.8q0-4.6-1.5-8.2-1.4-3.5-4.4-6.9-2.1-2-4.3-3.4-2.2-1.4-4.7-2-2.4-.7-5.3-.7-4.3 0-7.8 1.5-3.3 1.5-6.4 4.6-5.9 6.3-5.8 15v46.4q0 5.5-3 8.6-3.1 3.4-8.4 3.3l-2.2-.2q-1-.1-2.2-.5-1-.3-2-1-1-.6-1.8-1.6-1.7-1.6-2.4-3.8-.7-2.3-.7-4.8V11.9q0-5.5 3-8.6 3-3.4 8.3-3.3 5.2 0 8.2 3.3 3.2 3.1 3.2 8.6v33q1.5-1 3-1.6l3.2-1.2 3.4-1q1.6-.5 3.3-.8l3.5-.4 3.6-.2q4.4 0 8.5 1 4.1.7 7.9 2.4 3.8 1.6 7.3 4.1 3.5 2.5 6.6 5.8Q484 66 484 84.8z" />
<path id="header-e"
d="M387.5 111.1q0 1.2-.3 2.3-.1 1-.5 2l-.9 2q-6.6 12-19.4 19-12 6.6-25.4 6.6-20.8 0-35.8-14.6-15.9-15-15.9-37 0-22.1 15.9-37.1 15-14.6 35.8-14.6 3.9 0 7.8.7 4 .7 8 2.2 9.2 3.1 18.2 10 6 4.6 9.1 9.3 3.3 4.7 3.3 10 0 1.3-.3 2.5-.2 1.3-.7 2.4-1.5 3.4-5 5.3l-56.9 32.2q7.2 4.9 16.5 4.9 7.2 0 12.6-2.5 5.5-2.5 9.7-7.4l.7-1 .8-1 .9-1.3 1-1.5q3.3-4.2 7.4-5.1l1.8-.2q4.4 0 8 3.4 3.6 3.5 3.6 8.5zm-29.9-42.7q-7.2-4.8-16.6-4.8-6 0-11 2-4.9 1.8-9.3 6-4.5 4-6.7 9-2 4.8-2 10.8l.1 2.9z" />
<path id="header-o"
d="M286.8 91.4q0 4.2-.6 8.3-.6 4-1.8 7.7-1.1 3.8-2.9 7.4-1.7 3.5-4 6.9-2.4 3.3-5.2 6.1Q258 143 237.7 143T203 128q-14.3-15.2-14.3-36.6 0-21.5 14.3-36.6 14.4-15 34.7-15 4 0 7.8.5 3.9.7 7.5 1.9t7 3q3.3 1.9 6.4 4.3 3.2 2.4 5.9 5.4 14.4 15 14.5 36.5zm-22.6 0q0-2.4-.4-4.5-.2-2.2-.9-4.2-.6-2-1.5-3.9-1-2-2.2-3.7-1.2-1.7-2.8-3.4-4-4.2-8.6-6.1-4.5-2-10-2-11 0-18.7 8.2-7.8 8-7.8 19.6 0 11.4 7.8 19.7 7.8 8 18.6 8 5.6 0 10.1-1.9 4.6-2 8.6-6.1 4-4.3 5.8-9 2-4.9 2-10.7z" />
<path id="header-k"
d="M186.3 131q0 4.7-3.3 8.3-1.5 1.8-3.7 2.7-2 1.1-4.3 1.1-3.5 0-6.6-2L119.2 105v26q0 5.5-3 8.6-3.1 3.4-8.4 3.3l-2.2-.2q-1-.1-2.2-.5-1-.3-2-1-1-.6-1.8-1.6-1.7-1.6-2.4-3.8-.7-2.3-.7-4.8V11.9q0-5.5 3-8.6 3-3.4 8.3-3.3 5.2 0 8.2 3.3 3.2 3.1 3.2 8.6v65.9l49.2-36.1q3.2-2 6.6-2 4.7 0 8 3.7t3.3 8.4q-.2 6-5 9.6l-41 30 41 29.9q2.3 1.7 3.6 4.2 1.4 2.5 1.4 5.4z" />
<path id="header-tilde"
d="M73.1 91q0 2-.6 3.9T71 98.6q-3.2 5.7-8.9 8.5-5.6 2.8-12.9 2.8-8.8 0-18-7.8-2.4-2.3-4.5-3.7-2.1-1.5-3-1.7-1.5 0-2.1.3l-.8 1.3q-.3.7-.8 1.2l-1 1-.9.8q-2.7 2-6.4 2-1.7 0-3.2-.3-1.4-.3-3-1.1-1.5-.8-2.6-2.1-2.8-3.1-2.8-8v-1.3q0-.7.2-1.2l.2-1 .4-1 .4-1q.1-.6.5-1.1l.5-1q3.2-5.7 8.8-8.5 5.7-2.9 13-2.9 3.2 0 6.2 1 3 .9 6 2.7 2.9 1.6 5.7 4.2 5.2 4.6 7.6 5.4 1 0 1.6-.2l.7-.4q.3-.1.5-.4 3.6-5.6 9.2-5.6 5.7 0 8.8 3.5 2.8 3 2.8 8z" />
</svg>
Homepage of
<div class=p-name>
<span class=first-name>Norman</span>
<span class=last-name>Köhring</span>
</div>
Code Artist
</header>
<menu id="main-menu">
<li><a href="/">home</a></li>
<li><a title="What I do these days" href="/now">/now</a></li>
<li class="active"><a title="Today I Learned" href="/til">/til</a></li>
<li><a title="My projects" href="/projects">/projects</a></li>
<li><a title="Weblog" href="/blog">/blog</a></li>
<li><a title="CV / Resume" href="/cv">/cv</a></li>
<li><a title="Tools I use" href="/stack">/stack</a></li>
<li><a title="Hardware I use" href="/setup">/setup</a></li>
</menu>
<link href=/extended.css rel=stylesheet>
<link href=/posts.css rel=stylesheet>
<script async data-goatcounter=https://koehr.goatcounter.com/count src=//gc.zgo.at/count.js></script>
</body>

@ -3,7 +3,7 @@
<head>
<meta charset="utf-8">
<base href="http://localhost:8080/">
<base href="https://koehr.in/">
<title>Today I learned // the codeartist — programmer and engineer based in Berlin</title>
<meta name="description" content="Homepage, Portfolio and CV of Norman Köhring" />
<meta content="The personal page and weblog of Norman Köhring" name=description>

@ -3,7 +3,7 @@
<head>
<meta charset="utf-8">
<base href="http://localhost:8080/">
<base href="https://koehr.in/">
<title>Today I learned // the codeartist — programmer and engineer based in Berlin</title>
<meta name="description" content="Homepage, Portfolio and CV of Norman Köhring" />
<meta content="The personal page and weblog of Norman Köhring" name=description>

@ -3,7 +3,7 @@
<head>
<meta charset="utf-8">
<base href="http://localhost:8080/">
<base href="https://koehr.in/">
<title>Today I learned // the codeartist — programmer and engineer based in Berlin</title>
<meta name="description" content="Homepage, Portfolio and CV of Norman Köhring" />
<meta content="The personal page and weblog of Norman Köhring" name=description>
@ -52,6 +52,13 @@
(<a rel="nofollow noopener" class="external" href="https://stackoverflow.com/questions/6712034/sort-array-by-firstname-alphabetically-in-javascript" target="_blank">source</a>)
</div>
</article>
<article class="til">
<time datetime="2024-05-11">2024-05-11</time>
<div>
<a href="/til/2024-05-11.html">Rob Pike's 5 Rules of Programming</a>
(<a rel="nofollow noopener" class="external" href="https://users.ece.utexas.edu/~adnan/pike.html" target="_blank">source</a>)
</div>
</article>
<article class="til">
<time datetime="2022-06-15">2022-06-15</time>
<div>

@ -2,21 +2,49 @@
Last updated: 2024-05-13
Introduction Lorem Ipsum Sit Dolor Amet...
My software stack is pretty old-school. I prefer CLI applications for almost everything. The only GUI programs I usually run are browsers, image manipulators and LogSeq.
## Headline 1
## <span title="Operating System">OS</span>: Fedora Linux
> Some extra info
It all started with Real Red Linux 2000, a special millenium version of [RedHat Linux](https://en.wikipedia.org/wiki/Red_Hat_Linux). I don't know for sure, but I think it was based on RedHat 6.1 or 6.2.
* A nice list of things, maybe?
* Could also be a paragraph or two.
* That is totally up to me, I guess.
Over the years, I first used different RPM based distributions, then switched to [Gentoo](https://www.gentoo.org/) for a while, before getting annoyed by the compiling frenzy and discovering [Arch](https://archlinux.org/). When Arch made the switch to systemd, I found Void Linux and stayed with it for years. At some point, not many years ago, I went with [Fedora](https://fedoraproject.org/) and it struck a nice middle ground between customizability and "it just works". Thanks to Fedora Spins, it is now easy to have a more standard system on my work laptop and a rather customized one on my private laptop, without too many differences in the foundation. I use official the [Sway Spin](https://fedoraproject.org/spins/sway/) on my private laptop.
## Headline 2
## <span title="Desktop Environment">DE</span>: GNOME vs Sway
> Some more extra info
Over the years I got used to tiling window managers. Honestly, I tried almost all of them and went from [hyper-configurable](https://xmonad.org/) to [super minimalist](https://dwm.suckless.org/). I ended up - as usual - somewhere in the middle, with [i3](https://i3wm.org/) and [Sway](https://swaywm.org/).
* A nice list of things, maybe?
* Could also be a paragraph or two.
* That is totally up to me, I guess.
My work laptop has a GNOME desktop with some extensions, that make it work well for me. My typical work flow involves full screen applications and many desktops. I rarely have more than one window on one screen. That is why I didn't have too much of a hard time to switch from [dwm](https://dwm.suckless.org/) and similar tiling window managers to GNOME, because it uses MacOS-like gestures to work with desktops. Extensions like [Maximize Lonely Window](https://extensions.gnome.org/extension/6127/only-window-maximize/) help as well. There used to be another extension, [Maximize To Empty Workspace](https://extensions.gnome.org/extension/3100/maximize-to-empty-workspace/), which was even closer to my usual way of working. But it is not supported in newer GNOME versions.
## Editor: Helix
Most of my life, I used [ViM](https://www.vim.org/). It made me more productive and helped me to focus on the things that matter most for my productivity. One day, I found [Kakoune](https://kakoune.org), which blew me away by being so similar and yet different to ViM, in a (in my opinion) good way. What Kakoune does is to to switch around the command order. While ViM's command language is VERB-MODIFIER-OBJECT. For example: `d2w` means delete two words. Kakoune switches that to MODIFIER-VERB-OBJECT and introduces selecting and non-selecting movement, which allows you to see your selection before applying an action. `d2w` changes to `2Wd`, which translates to select next two words, then delete them. I finally settled with [Helix](https://helix-editor.com/), an editor that uses Kakounes command language, but implements many useful things by default, while still being very configurable.
## Terminal: foot + zellij + zsh
Almost all of my day-to-day applications are in the terminal. I am so used to it, that I started trusting GUI applications less. This is obviously my issue, but luckily I'm not alone, so many great CLI applications exist.
I use [foot](https://codeberg.org/dnkl/foot) as terminal emulator. It is lightweight, supports 24bit colours and works with Wayland.
Inside foot runs [zellij](https://zellij.dev/), which is a terminal multiplexer similar to [screen](https://www.gnu.org/software/screen/) and [tmux](https://github.com/tmux/tmux/wiki). It allows me to run multiple applications in one terminal, keeps sessions alive after closing the terminal emulator and so on. I actually configured zellij to feel a lot more like tmux, because I'm so used to the latter and honestly I might just switch back to tmux, who knows.
My shell of choice is [zsh](https://www.zsh.org/) with [oh-my-zsh](https://ohmyz.sh/). It is by far the most versatile shell and the only one (to my knowledge) that supports RPROMPT, a prompts at the end of the line.
## Browser: Firefox
My browser of choice is [Firefox](https://www.mozilla.org/de/firefox/), because I want an open and diverse internet. Firefox is a great choice and offers lots of features, like direct PDF support, privacy features out of the box and great synchronisation. Chrome and Chromium-based browsers are great as well, but if everyone uses the same browser, we'll end up with whatever the company behind this browser wants the internet to be.
## Other Tools: LogSeq, Poe, Bitwarden, Git...
Of course, I use a lot more tools in my day-to-day work.
I use [LogSeq](https://logseq.com/) for knowledge management. It is similar to Evernote, Obsidian or Notion. For me it hits the mark between flexibility and structure. I use it for everthing from todo lists to planning long D&D campaigns.
[Poe](https://poe.com/) allows access to all kinds of generative intelligence tools, like LLMs ("ChatGPT") and image generators. I mostly use Mistral, but also switch between models from time to time. They help me with brainstorming and sometimes I misuse them to write JSDoc comments for me.
[Bitwarden](https://bitwarden.com/) is a fantastic password manager with lots of utilities. It works so that you don't need to trust the server provider, because everything runs on the client (for example in a browser plugin) and is encrypted locally before being sent to the server. The best thing is, that I can host a bitwarden server myself, using [Vaultwarden](https://github.com/dani-garcia/vaultwarden).
[GIT](https://git-scm.org) is the most widely used source code management as of today. Although I see some strengths in other systems, Git is by far good enough for all my needs. I host my own [Forgejo](https://forgejo.org/) git server at [git.k0r.in](https://git.k0r.in).
There is a lot more and I might extend this list from time to time.

@ -1,10 +1,11 @@
main.posts {
margin: calc(var(--header-height-small) + 2rem) auto 4rem;
}
main.posts > #content > h1 {
padding: 0;
main.posts h2 {
margin: 1.5em 0 0 0;
font-size: 1.5rem;
color: var(--highlight-fg-color);
}
main.posts article {
margin: 2rem 0;
}

@ -0,0 +1,11 @@
# Rob Pike's 5 Rules of Programming
[source](https://users.ece.utexas.edu/~adnan/pike.html)
1. You can't tell where a program is going to spend its time. Bottlenecks occur in surprising places, so don't try to second guess and put in a speed hack until you've proven that's where the bottleneck is.
2. Measure. Don't tune for speed until you've measured, and even then don't unless one part of the code overwhelms the rest.
3. Fancy algorithms are slow when n is small, and n is usually small. Fancy algorithms have big constants. Until you know that n is frequently going to be big, don't get fancy. (Even if n does get big, use Rule 2 first.)
4. Fancy algorithms are buggier than simple ones, and they're much harder to implement. Use simple algorithms as well as simple data structures.
5. Data dominates. If you've chosen the right data structures and organized things well, the algorithms will almost always be self-evident. Data structures, not algorithms, are central to programming.
Pike's rules 1 and 2 restate Tony Hoare's famous maxim "Premature optimization is the root of all evil." Ken Thompson rephrased Pike's rules 3 and 4 as "When in doubt, use brute force.". Rules 3 and 4 are instances of the design philosophy KISS. Rule 5 was previously stated by Fred Brooks in The Mythical Man-Month. Rule 5 is often shortened to "write stupid code that uses smart objects".

@ -18,6 +18,14 @@ Last updated: 2024-05-13
</div>
</article>
<article class="til">
<time datetime="2024-05-11">2024-05-11</time>
<div>
<a href="/til/2024-05-11.html">Rob Pike's 5 Rules of Programming</a>
(<a rel="nofollow noopener" class="external" href="https://users.ece.utexas.edu/~adnan/pike.html" target="_blank">source</a>)
</div>
</article>
<article class="til">
<time datetime="2022-06-15">2022-06-15</time>
<div>

Loading…
Cancel
Save