<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>Index on livingIT</title>
		<link>https://livingit.de/</link>
		<description>Recent content in Index on livingIT</description>
		<generator>Hugo</generator>
		<language>en</language>
		
		
		
		
			<lastBuildDate>Wed, 07 Oct 2026 00:00:00 +0000</lastBuildDate>
		
			<atom:link href="https://livingit.de/index.xml" rel="self" type="application/rss+xml" />
			<item>
				<title>Volunteer City Councillor: What Do I Actually Do?</title>
				<link>https://livingit.de/politics/ehrenamtlicher-stadtrat/</link>
				<pubDate>Wed, 07 Oct 2026 00:00:00 +0000</pubDate>
				<guid>https://livingit.de/politics/ehrenamtlicher-stadtrat/</guid>
				<description>Since the 2026 local elections I am a volunteer city councillor in Rodgau, for Volt. People often ask me: What do you actually do? Do you sit in the city parliament now? The short answer: no. The long answer is here.</description>
			</item>
			<item>
				<title>Speech at the 2026 State Party Congress in Darmstadt</title>
				<link>https://livingit.de/politics/rede-lpt-2026/</link>
				<pubDate>Mon, 05 Oct 2026 00:00:00 +0000</pubDate>
				<guid>https://livingit.de/politics/rede-lpt-2026/</guid>
				<description>A plea for trusting our members: being able to judge one&amp;rsquo;s own limits is a personal learning process we should trust our members with, rather than pre-emptively denying them party offices and mandates. In rural areas especially, taking on several roles at once is a strength. A call to align our rules with the reality of a young, growing party, so Volt stays pragmatic, progressive and pan-European.</description>
			</item>
			<item>
				<title>Bookmarks are not branches, and that&#39;s the point</title>
				<link>https://livingit.de/software/jj-08-bookmarks-vs-branches/</link>
				<pubDate>Thu, 01 Oct 2026 00:00:00 +0000</pubDate>
				<guid>https://livingit.de/software/jj-08-bookmarks-vs-branches/</guid>
				<description>&lt;h1 id=&#34;bookmarks-are-not-branches-and-thats-the-point&#34;&gt;Bookmarks are not branches, and that&amp;rsquo;s the point&lt;/h1&gt;&#xA;&lt;p&gt;Part 8 of 9.&lt;/p&gt;&#xA;&lt;p&gt;Calling jj&amp;rsquo;s named pointers &amp;ldquo;bookmarks&amp;rdquo; instead of &amp;ldquo;branches&amp;rdquo; looked like unnecessary&#xA;vocabulary at first. It isn&amp;rsquo;t. A Git branch moves forward automatically every time you&#xA;commit while it&amp;rsquo;s checked out - the ref and your current line of work are the same thing&#xA;until you explicitly switch. A jj bookmark is decoupled from that: you can be working&#xA;several commits past the last place a bookmark points, and it just stays there until you&#xA;move it with &lt;code&gt;jj bookmark set&lt;/code&gt; or by rebasing the commit it&amp;rsquo;s attached to.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Teammates who never touch jj don&#39;t need to know it exists</title>
				<link>https://livingit.de/software/jj-09-git-only-teammates-dont-need-to-care/</link>
				<pubDate>Thu, 01 Oct 2026 00:00:00 +0000</pubDate>
				<guid>https://livingit.de/software/jj-09-git-only-teammates-dont-need-to-care/</guid>
				<description>&lt;h1 id=&#34;teammates-who-never-touch-jj-dont-need-to-know-it-exists&#34;&gt;Teammates who never touch jj don&amp;rsquo;t need to know it exists&lt;/h1&gt;&#xA;&lt;p&gt;Part 9 of 9.&lt;/p&gt;&#xA;&lt;p&gt;This was the question that mattered most before adopting any of this for real work: what&#xA;happens when a PR review comment comes from someone using plain &lt;code&gt;git&lt;/code&gt;, or when I fall&#xA;back to a plain &lt;code&gt;git&lt;/code&gt; command myself out of habit. The answer turned out to be the&#xA;least dramatic part of the whole series - nothing special happens, because colocated&#xA;mode means jj is reading and writing the same Git object database everyone else is.&#xA;A commit pushed with &lt;code&gt;git push&lt;/code&gt; and a commit pushed with &lt;code&gt;jj git push&lt;/code&gt; are the same kind&#xA;of object on the other end.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Editing history without holding my breath</title>
				<link>https://livingit.de/software/jj-07-editing-history-without-holding-my-breath/</link>
				<pubDate>Mon, 28 Sep 2026 00:00:00 +0000</pubDate>
				<guid>https://livingit.de/software/jj-07-editing-history-without-holding-my-breath/</guid>
				<description>&lt;h1 id=&#34;editing-history-without-holding-my-breath&#34;&gt;Editing history without holding my breath&lt;/h1&gt;&#xA;&lt;p&gt;Part 7 of 9.&lt;/p&gt;&#xA;&lt;p&gt;The three moves this lesson covers - start new work, edit existing work, start new work&#xA;from a point in the past - map onto things I already did constantly in Git. The&#xA;difference is how much I used to brace for them.&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;jj new&lt;/code&gt; closing out the current working copy and opening an empty one is unremarkable,&#xA;basically &lt;code&gt;git commit&lt;/code&gt; with the staging step removed. The one that changed how I work is&#xA;&lt;code&gt;jj edit &amp;lt;change-id&amp;gt;&lt;/code&gt;. Fixing something two commits back used to mean &lt;code&gt;git rebase -i&lt;/code&gt;,&#xA;picking &lt;code&gt;edit&lt;/code&gt; on the right line, making the fix, &lt;code&gt;git rebase --continue&lt;/code&gt;, and hoping&#xA;nothing downstream conflicted along the way. With jj, &lt;code&gt;jj edit&lt;/code&gt; just moves the working&#xA;copy onto that commit. Any file I touch amends it directly. Descendants get rebased&#xA;automatically the next time jj needs to show me the graph. No detached-HEAD state, no&#xA;multi-step rebase to abandon halfway through if I change my mind - &lt;code&gt;jj undo&lt;/code&gt; covers that.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Getting jj log to talk about the remote</title>
				<link>https://livingit.de/software/jj-06-a-log-that-tells-me-about-the-remote/</link>
				<pubDate>Fri, 25 Sep 2026 00:00:00 +0000</pubDate>
				<guid>https://livingit.de/software/jj-06-a-log-that-tells-me-about-the-remote/</guid>
				<description>&lt;h1 id=&#34;getting-jj-log-to-talk-about-the-remote&#34;&gt;Getting jj log to talk about the remote&lt;/h1&gt;&#xA;&lt;p&gt;Part 6 of 9.&lt;/p&gt;&#xA;&lt;p&gt;The thing that made me trust &lt;code&gt;jj log&lt;/code&gt; as a daily driver rather than a novelty was seeing&#xA;remote state show up in it without extra ceremony. &lt;code&gt;jj git fetch&lt;/code&gt; updates jj&amp;rsquo;s view of&#xA;every remote bookmark, and the default log template already annotates commits with&#xA;whichever bookmarks - local, remote, or both - point at them.&lt;/p&gt;&#xA;&lt;p&gt;Reading the markers took a moment to get used to. &lt;code&gt;main main@origin&lt;/code&gt; on the same line&#xA;means the local and remote bookmark currently agree. &lt;code&gt;old-experiment@origin&lt;/code&gt; with no bare&#xA;&lt;code&gt;old-experiment&lt;/code&gt; means it&amp;rsquo;s a bookmark nobody has locally, seen only because it exists on&#xA;the remote. An asterisk on either means they&amp;rsquo;ve diverged.&lt;/p&gt;</description>
			</item>
			<item>
				<title>d-you: Thinking About Digital Identity the European Way – and Finally Doing It</title>
				<link>https://livingit.de/politics/d-you/</link>
				<pubDate>Wed, 23 Sep 2026 00:00:00 +0000</pubDate>
				<guid>https://livingit.de/politics/d-you/</guid>
				<description>The EUDI Wallet and d-you offer a chance to shape digital identity in a way that is European, secure and fit for everyday use. What matters is that data protection and shared standards are upheld while clubs, small organisations and free services still get simple access. Digitalisation needs high standards – but also the courage to start, gather experience and keep improving.</description>
			</item>
			<item>
				<title>Making jj look like Tokyo Night</title>
				<link>https://livingit.de/software/jj-05-tokyo-night-in-the-terminal/</link>
				<pubDate>Tue, 22 Sep 2026 00:00:00 +0000</pubDate>
				<guid>https://livingit.de/software/jj-05-tokyo-night-in-the-terminal/</guid>
				<description>&lt;h1 id=&#34;making-jj-look-like-tokyo-night&#34;&gt;Making jj look like Tokyo Night&lt;/h1&gt;&#xA;&lt;p&gt;Part 5 of 9.&lt;/p&gt;&#xA;&lt;p&gt;This is the least essential lesson in the series and the one I spent the most immediate&#xA;enjoyment on. jj doesn&amp;rsquo;t ship theme presets - it ships a &lt;code&gt;[colors]&lt;/code&gt; config table where&#xA;every key is a style label attached to templated output (&lt;code&gt;change_id&lt;/code&gt;, &lt;code&gt;bookmarks&lt;/code&gt;,&#xA;&lt;code&gt;conflict&lt;/code&gt;, and so on), and the value is a color name, a hex string, or a table for bold,&#xA;italic, underline. That&amp;rsquo;s a more general mechanism than a fixed theme switch, at the cost&#xA;of having to build the theme yourself.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Forking repositories with jj</title>
				<link>https://livingit.de/software/working-with-forked-repositories/</link>
				<pubDate>Mon, 21 Sep 2026 00:00:00 +0000</pubDate>
				<guid>https://livingit.de/software/working-with-forked-repositories/</guid>
				<description>&lt;h1 id=&#34;forking-repositories-with-jj&#34;&gt;Forking repositories with jj&lt;/h1&gt;&#xA;&lt;p&gt;&amp;ldquo;Fork&amp;rdquo; is one of the most-used words in day-to-day work with GitHub, GitLab, Gitea,&#xA;Forgejo or Bitbucket, and it does not exist in git, nor in jj. &lt;code&gt;git help&lt;/code&gt; has no &lt;code&gt;fork&lt;/code&gt;&#xA;command; neither does &lt;code&gt;jj help&lt;/code&gt;. Everything that makes forking feel like a natural&#xA;extension of version control is a feature of the hosting platform, bolted on top of a&#xA;tool that only knows repositories, commits, and refs - and jj doesn&amp;rsquo;t touch that&#xA;boundary at all. The examples below use jj throughout, in colocated mode.&lt;/p&gt;</description>
			</item>
			<item>
				<title>How jj is actually build underneath</title>
				<link>https://livingit.de/software/jj-04-how-jj-is-built/</link>
				<pubDate>Sat, 19 Sep 2026 00:00:00 +0000</pubDate>
				<guid>https://livingit.de/software/jj-04-how-jj-is-built/</guid>
				<description>&lt;h1 id=&#34;how-jj-is-actually-built-underneath&#34;&gt;How jj is actually built underneath&lt;/h1&gt;&#xA;&lt;p&gt;Part 4 of 9.&lt;/p&gt;&#xA;&lt;p&gt;The mental model from the last post (working copy as a commit, change id separate from&#xA;commit id) is the user-facing story. Reading through jj&amp;rsquo;s own design docs and source&#xA;layout for a bit longer than strictly necessary, the underlying architecture explains&#xA;&lt;em&gt;why&lt;/em&gt; that model holds together, and why colocated mode doesn&amp;rsquo;t feel like running two&#xA;version control systems glued together.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Necessity and Spectacle: the Fuel Discount as an Example</title>
				<link>https://livingit.de/politics/tankrabatt-notwendigkeit-und-schau/</link>
				<pubDate>Sat, 19 Sep 2026 00:00:00 +0000</pubDate>
				<guid>https://livingit.de/politics/tankrabatt-notwendigkeit-und-schau/</guid>
				<description>A fuel discount just before an election: what it costs, what the oil companies contribute, and whether there is evidence that this kind of gift actually swings elections.</description>
			</item>
			<item>
				<title>The vocabulary jj borrows from Git, changes, and drops</title>
				<link>https://livingit.de/software/jj-vocabulary-vs-git/</link>
				<pubDate>Fri, 18 Sep 2026 00:00:00 +0000</pubDate>
				<guid>https://livingit.de/software/jj-vocabulary-vs-git/</guid>
				<description>&lt;h1 id=&#34;the-vocabulary-jj-borrows-from-git-changes-and-drops&#34;&gt;The vocabulary jj borrows from Git, changes, and drops&lt;/h1&gt;&#xA;&lt;p&gt;The trap with &lt;code&gt;jj&lt;/code&gt; is that it reuses several Git words for different things, rather than&#xA;inventing new ones across the board. That&amp;rsquo;s worse than a clean break would have been, at&#xA;least early on: a genuinely new word forces you to look it up, a familiar one lets you&#xA;assume you already know it.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Branch became bookmark, and the difference is not cosmetic.&lt;/strong&gt; A Git branch always&#xA;tracks its tip - commit on top of it and it moves with you, automatically. A jj bookmark&#xA;does none of that; it sits where you put it until you move it with &lt;code&gt;jj bookmark set&lt;/code&gt;.&#xA;The first time I committed three times expecting my feature bookmark to follow along and&#xA;found it still pointing at the first commit, this stopped being a naming quirk and became&#xA;a fact I had to actually internalize.&lt;/p&gt;</description>
			</item>
			<item>
				<title>The working copy is a commit</title>
				<link>https://livingit.de/software/jj-03-working-copy-as-a-commit/</link>
				<pubDate>Wed, 16 Sep 2026 00:00:00 +0000</pubDate>
				<guid>https://livingit.de/software/jj-03-working-copy-as-a-commit/</guid>
				<description>&lt;h1 id=&#34;the-working-copy-is-a-commit-and-other-things-that-took-a-moment-to-click&#34;&gt;The working copy is a commit, and other things that took a moment to click&lt;/h1&gt;&#xA;&lt;p&gt;Part 3 of 9.&lt;/p&gt;&#xA;&lt;p&gt;Git&amp;rsquo;s mental model has three layers: working directory, index (staging area), and&#xA;commits. Most of the day-to-day friction I associate with Git - &lt;code&gt;git add -p&lt;/code&gt;, forgetting&#xA;to stage a file, &lt;code&gt;git status&lt;/code&gt; showing overlapping &amp;ldquo;staged&amp;rdquo; and &amp;ldquo;unstaged&amp;rdquo; sections for&#xA;the same file - comes from managing the boundary between the first two.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Colocated mode</title>
				<link>https://livingit.de/software/jj-02-colocated-mode-first-impressions/</link>
				<pubDate>Sun, 13 Sep 2026 00:00:00 +0000</pubDate>
				<guid>https://livingit.de/software/jj-02-colocated-mode-first-impressions/</guid>
				<description>&lt;h1 id=&#34;colocated-mode-two-stores-one-directory&#34;&gt;Colocated mode: two stores, one directory&lt;/h1&gt;&#xA;&lt;p&gt;Part 2 of 9.&lt;/p&gt;&#xA;&lt;p&gt;The install itself is a non-event - a package manager or a cargo install, then a&#xA;&lt;code&gt;user.name&lt;/code&gt;/&lt;code&gt;user.email&lt;/code&gt; config, same shape as Git&amp;rsquo;s own first-run setup. The interesting&#xA;part starts at &lt;code&gt;jj git init --colocate&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Run that inside an existing Git checkout and it drops a &lt;code&gt;.jj&lt;/code&gt; directory next to &lt;code&gt;.git&lt;/code&gt;,&#xA;adds &lt;code&gt;.jj/&lt;/code&gt; to &lt;code&gt;.git/info/exclude&lt;/code&gt; so it never shows up as untracked, and imports the&#xA;current branches and &lt;code&gt;HEAD&lt;/code&gt; as jj commits. Nothing in &lt;code&gt;.git&lt;/code&gt; is rewritten. If I deleted&#xA;&lt;code&gt;.jj&lt;/code&gt; right now, the repository would be exactly the plain Git repo it was before,&#xA;nothing lost.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Why look at Jujutsu at all</title>
				<link>https://livingit.de/software/jj-01-why-jj/</link>
				<pubDate>Thu, 10 Sep 2026 00:00:00 +0000</pubDate>
				<guid>https://livingit.de/software/jj-01-why-jj/</guid>
				<description>&lt;h1 id=&#34;why-look-at-jujutsu-at-all&#34;&gt;Why look at Jujutsu at all&lt;/h1&gt;&#xA;&lt;p&gt;Part 1 of 9 in a series on learning &lt;code&gt;jj&lt;/code&gt; in colocated mode.&lt;/p&gt;&#xA;&lt;p&gt;Git works. Fifteen years in, the ecosystem around it is enormous and every teammate&#xA;already knows it. That&amp;rsquo;s a high bar for anything claiming to replace it, and Jujutsu&#xA;(&lt;code&gt;jj&lt;/code&gt;) isn&amp;rsquo;t trying to clear that bar in one jump - it&amp;rsquo;s trying to sit on top of the same&#xA;Git repositories everyone already has, so adopting it is a personal choice rather than a&#xA;team migration.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Porting a fish config to nushell</title>
				<link>https://livingit.de/software/fish-to-nu-port/</link>
				<pubDate>Tue, 08 Sep 2026 00:00:00 +0000</pubDate>
				<guid>https://livingit.de/software/fish-to-nu-port/</guid>
				<description>&lt;h1 id=&#34;porting-a-fish-config-to-nushell-two-bugs-that-only-show-up-in-a-real-shell&#34;&gt;Porting a fish config to nushell: two bugs that only show up in a real shell&lt;/h1&gt;&#xA;&lt;p&gt;I&amp;rsquo;ve run fish as my daily shell for years, with a chezmoi-managed config covering PATH setup, tool integrations (starship, zoxide, atuin, mise), a couple dozen abbreviations, and a handful of custom functions. Nushell sat next to it as an unconfigured skeleton, installed but never actually used. This week I brought it up to parity.&lt;/p&gt;</description>
			</item>
			<item>
				<title>cargo: command not found, even though rustup is installed</title>
				<link>https://livingit.de/software/rustup-keg-only-path-fix/</link>
				<pubDate>Tue, 01 Sep 2026 00:00:00 +0000</pubDate>
				<guid>https://livingit.de/software/rustup-keg-only-path-fix/</guid>
				<description>&lt;h1 id=&#34;cargo-command-not-found-even-though-rustup-is-installed&#34;&gt;cargo: command not found, even though rustup is installed&lt;/h1&gt;&#xA;&lt;p&gt;Symptom: &lt;code&gt;rustup&lt;/code&gt; works, &lt;code&gt;rustup show&lt;/code&gt; lists an installed and active toolchain, but &lt;code&gt;cargo&lt;/code&gt;, &lt;code&gt;rustc&lt;/code&gt;, &lt;code&gt;rustfmt&lt;/code&gt; all fail with &amp;ldquo;command not found&amp;rdquo;.&lt;/p&gt;&#xA;&lt;h2 id=&#34;cause&#34;&gt;Cause&lt;/h2&gt;&#xA;&lt;p&gt;On macOS with Homebrew, &lt;code&gt;rustup&lt;/code&gt; is a &lt;strong&gt;keg-only&lt;/strong&gt; formula. Homebrew only symlinks the &lt;code&gt;rustup&lt;/code&gt; binary itself into &lt;code&gt;/opt/homebrew/bin&lt;/code&gt;. It does not symlink the proxy shims that rustup normally ships alongside it, &lt;code&gt;cargo&lt;/code&gt;, &lt;code&gt;rustc&lt;/code&gt;, &lt;code&gt;rustfmt&lt;/code&gt;, &lt;code&gt;cargo-clippy&lt;/code&gt;, and so on. Those live in the keg:&lt;/p&gt;</description>
			</item>
			<item>
				<title>A silent checksum that broke every S3-compatible upload</title>
				<link>https://livingit.de/software/a-silent-checksum/</link>
				<pubDate>Mon, 31 Aug 2026 00:00:00 +0000</pubDate>
				<guid>https://livingit.de/software/a-silent-checksum/</guid>
				<description>&lt;h1 id=&#34;a-silent-checksum-that-broke-every-s3-compatible-upload&#34;&gt;A silent checksum that broke every S3-compatible upload&lt;/h1&gt;&#xA;&lt;h2 id=&#34;problem&#34;&gt;Problem&lt;/h2&gt;&#xA;&lt;p&gt;We had a small Go service writing generated files to an S3-compatible object store backed by a self-hosted, Ceph-based gateway. It used a popular cloud-portable blob storage abstraction library - the kind that lets you swap &lt;code&gt;s3://&lt;/code&gt;, &lt;code&gt;gs://&lt;/code&gt;, or &lt;code&gt;file://&lt;/code&gt; behind one interface, so application code never has to know which backend it&amp;rsquo;s talking to.&lt;/p&gt;&#xA;&lt;p&gt;Every write failed. Not intermittently — every single &lt;code&gt;PutObject&lt;/code&gt; call came back with a 400 and an error along the lines of:&lt;/p&gt;</description>
			</item>
			<item>
				<title>Volt: Local Lead Elections 2026</title>
				<link>https://livingit.de/politics/local-lead-wahlen-2026/</link>
				<pubDate>Sat, 29 Aug 2026 00:00:00 +0000</pubDate>
				<guid>https://livingit.de/politics/local-lead-wahlen-2026/</guid>
				<description>I would like to carry on for another 18 months!</description>
			</item>
			<item>
				<title>Broken promises: the fertile ground for populism</title>
				<link>https://livingit.de/politics/broken-promises/</link>
				<pubDate>Wed, 08 Jul 2026 00:00:00 +0000</pubDate>
				<guid>https://livingit.de/politics/broken-promises/</guid>
				<description>Broken promises: the fertile ground for populism</description>
			</item>
			<item>
				<title>Replace content in files with ripgrep</title>
				<link>https://livingit.de/software/replace-content/</link>
				<pubDate>Wed, 10 Jan 2024 00:00:00 +0000</pubDate>
				<guid>https://livingit.de/software/replace-content/</guid>
				<description>&lt;p&gt;Spoiler: &lt;a href=&#34;https://github.com/BurntSushi/ripgrep&#34;&gt;ripgrep&lt;/a&gt; cannot do this standalone. But you can combine it with other tools to achieve this.&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-problem&#34;&gt;The problem&lt;/h2&gt;&#xA;&lt;p&gt;I use &lt;a href=&#34;https://obsidian.md/&#34;&gt;Obsidian&lt;/a&gt; with frontmatter (YAML) to track my journal along with some statistics. Sometimes I miss adding all data and want to fill the gaps with the last measurement. Bear with me: I know not correct in a mathematical sense but it is good enough for me. When my note is automatically generated a default value is used.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Connecting via RDP from Linux to Windows</title>
				<link>https://livingit.de/software/rdp-linux-windows/</link>
				<pubDate>Thu, 07 Dec 2023 00:00:00 +0000</pubDate>
				<guid>https://livingit.de/software/rdp-linux-windows/</guid>
				<description>&lt;h1 id=&#34;the-problem&#34;&gt;The problem&lt;/h1&gt;&#xA;&lt;p&gt;I have a Windows machine in my local network and I want to connect to it via RDP from my Linux machine. For this I use &lt;code&gt;remmina&lt;/code&gt; which is a nice RDP client. When not using a VPN, I can connect to the Windows machine without any problems. But when I use a VPN, I cannot connect to the Windows machine anymore.&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-solution&#34;&gt;The solution&lt;/h2&gt;&#xA;&lt;p&gt;The solution was to allow RDO WS and WSS in the Windows firewall. Those rules are usually disabled by default. After enabling them, I can connect to the Windows machine via RDP even when using a VPN.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Running tclip on a Zimaboard</title>
				<link>https://livingit.de/software/tclip-on-zimaboard/</link>
				<pubDate>Thu, 24 Aug 2023 00:00:00 +0000</pubDate>
				<guid>https://livingit.de/software/tclip-on-zimaboard/</guid>
				<description>&lt;h2 id=&#34;why&#34;&gt;Why?&lt;/h2&gt;&#xA;&lt;p&gt;Because private gists are fantastic and along with tailscale and Zimaboard it is easy to host.&lt;/p&gt;&#xA;&lt;h2 id=&#34;how&#34;&gt;How?&lt;/h2&gt;&#xA;&lt;p&gt;I recently got my hands on a &lt;a href=&#34;https://www.zimaboard.com/&#34;&gt;Zimaboard&lt;/a&gt;. It is powerful and comes with &lt;a href=&#34;https://www.casaos.io/&#34;&gt;CasaOS&lt;/a&gt; preinstalled. I am also a fan of &lt;a href=&#34;https://tailscale.com&#34;&gt;Tailscale&lt;/a&gt; which is probably one of the easiest while still ultra secure VPN solutions out there. Best: they have a very generous free tier.&lt;/p&gt;&#xA;&lt;p&gt;They recently published a blog post about &lt;a href=&#34;https://tailscale.dev/blog/tclip&#34;&gt;tclip&lt;/a&gt;, a simple, not sophisticated way to host your gists privately.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Change your keyboard switches</title>
				<link>https://livingit.de/software/change-keyboard-switches/</link>
				<pubDate>Wed, 26 Jul 2023 00:00:00 +0000</pubDate>
				<guid>https://livingit.de/software/change-keyboard-switches/</guid>
				<description>&lt;h2 id=&#34;why&#34;&gt;Why?&lt;/h2&gt;&#xA;&lt;p&gt;Just because you can. And because it is fun. And because you can learn something new. And because you can. Or you just bought another expensive board and the experiment with linear switches failed. And switching the switches is cheaper than buying a new board.&lt;/p&gt;&#xA;&lt;p&gt;It is not like a 5 minute job. It takes some time and you need to be careful. But it is doable.&lt;/p&gt;&#xA;&lt;h2 id=&#34;tips&#34;&gt;Tips&lt;/h2&gt;&#xA;&lt;p&gt;Take your time. Carefully remove all key caps. Might help to put them somewhere in order. Remove all old switches. Read explanations from the board makers before. But basically ensure pulling straight upward. Then put in the new switches. Before pushing a switch, ensure pins are correct. Even when new, transport may have one or another been bent. After pushing a switch into place: test. Put back all key caps. By the way: this would have been the perfect time to apply your favorite key caps you always wanted to use.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Welcome RedHat to the game of ... well, business going crazy</title>
				<link>https://livingit.de/software/redhat-closing/</link>
				<pubDate>Fri, 23 Jun 2023 00:00:00 +0000</pubDate>
				<guid>https://livingit.de/software/redhat-closing/</guid>
				<description>&lt;p&gt;RedHat is forcing clones to rework their operational model (and maybe breaking their promise) .&lt;/p&gt;&#xA;&lt;p&gt;The community is not liking the decision. Take this for example: &lt;a href=&#34;https://www.jeffgeerling.com/blog/2023/dear-red-hat-are-you-dumb&#34;&gt;Dear Red Hat: Are you dumb?&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;This actively questions &lt;em&gt;any&lt;/em&gt; use of open source where RedHat is involved. Ultimately, they are a business and as such have to follow some rules. Accepted. Putting other businesses (who &lt;em&gt;could&lt;/em&gt; have been customers for RHEL sometime in the future) on pressure is &amp;hellip;&lt;/p&gt;</description>
			</item>
			<item>
				<title>About fonts</title>
				<link>https://livingit.de/software/about-fonts/</link>
				<pubDate>Tue, 30 May 2023 00:00:00 +0000</pubDate>
				<guid>https://livingit.de/software/about-fonts/</guid>
				<description>&lt;h2 id=&#34;about-fonts&#34;&gt;About fonts&lt;/h2&gt;&#xA;&lt;p&gt;I like having a good visuals on my screen. I like enough information (some would say &lt;em&gt;too&lt;/em&gt; much) displayed at once. That means I like not too big of a font size. Unfortunately I have to wear some stronger glasses. That means I&amp;rsquo;d go for clear cut fonts without too much serifs, etc.&lt;/p&gt;&#xA;&lt;p&gt;Right now these fonts are my favorites:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://berkeleygraphics.com/typefaces/berkeley-mono/&#34;&gt;Berkeley Mono&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://indestructibletype.com/Drafting/&#34;&gt;Drafting Mono&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://fonts.google.com/specimen/Comfortaa&#34;&gt;Comfortaa&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Comfortaa is used here on the web site, but I might exchange that one for &lt;a href=&#34;https://indestructibletype.com/Jost.html&#34;&gt;Jost*&lt;/a&gt;. Jost* seems to be nice when you want to do some writing, too.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Software Engineering vs Software Development</title>
				<link>https://livingit.de/software/engineering-vs-development/</link>
				<pubDate>Mon, 13 Feb 2023 00:00:00 +0000</pubDate>
				<guid>https://livingit.de/software/engineering-vs-development/</guid>
				<description>&lt;p&gt;Software development and software engineering are two related yet distinct fields within the realm of computer science. Software development refers to the process of designing, coding, testing, and maintaining software applications, while software engineering is a more structured and systematic approach to software development that emphasizes the design and development of high-quality, reliable, and maintainable software systems.&lt;/p&gt;&#xA;&lt;p&gt;Data plays a crucial role in software engineering and is often used throughout the software development process. In the requirements gathering phase, data is used to understand the needs of users and stakeholders and to identify requirements for software systems. In the design and architecture phase, data is used to inform the design of software systems and to analyze the performance and scalability of systems. In the testing and validation phase, data is used to validate software systems and ensure they meet the needs of users and stakeholders. In the operations and maintenance phase, data is used to monitor and manage the performance and availability of software systems.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Getting the titan security key USB C to work on a Linux system</title>
				<link>https://livingit.de/software/titan/</link>
				<pubDate>Wed, 26 Feb 2020 00:00:00 +0000</pubDate>
				<guid>https://livingit.de/software/titan/</guid>
				<description>&lt;p&gt;I got myself a titan security key from Google as a second key in case my main one gets broken. I do use Linux and Yubico&amp;rsquo;s 5 NFC series worked fine out of the box.&lt;/p&gt;&#xA;&lt;p&gt;Not so with Google&amp;rsquo;s titan key. Nevertheless, Google&amp;rsquo;s documentation on this matter offered a solution:&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://support.google.com/titansecuritykey/answer/9148044?hl=en&amp;amp;ref_topic=9115742&#34;&gt;Add a Titan Security Key on a Linux system&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Unfortunately, the solution did not work out of the box. By reading the output of dmesg (you have to run sudo dmesg) I realized, that idVendor and idProduct differed from the values in the sample.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Curriculum Vitae</title>
				<link>https://livingit.de/cv/</link>
				<pubDate>Sat, 11 Jan 2020 00:00:00 +0000</pubDate>
				<guid>https://livingit.de/cv/</guid>
				<description>Senior Software Engineer with 25 years across desktop, web, cloud and distributed systems.</description>
			</item>
			<item>
				<title>A not so obvious reason for an auth error with SSH</title>
				<link>https://livingit.de/software/ssh-auth-error/</link>
				<pubDate>Tue, 19 Nov 2019 00:00:00 +0000</pubDate>
				<guid>https://livingit.de/software/ssh-auth-error/</guid>
				<description>&lt;h2 id=&#34;problem&#34;&gt;Problem&lt;/h2&gt;&#xA;&lt;p&gt;You try to stay to secure. Say what? Yes, too secure. If you work for different customers and you are like me you might not want to use the same key for every customer. Now, for convenience, you add all your keys to your local agent:&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;ssh-add key1&#xA;    ...&#xA;ssh-add keyN&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Yikes. Secure and still convenient. Unless you get an auth error:&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;Received disconnect from a.b.c.d port 22:2: Too many authentication failures&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;You double check the username. You double check your key is loaded to the agent. You start to doubt yourself. Yet nothing seems to be an explanation.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Contributing to Mattermost</title>
				<link>https://livingit.de/software/contribute-to-mattermost/</link>
				<pubDate>Sun, 06 Oct 2019 00:00:00 +0000</pubDate>
				<guid>https://livingit.de/software/contribute-to-mattermost/</guid>
				<description>&lt;h2 id=&#34;what-is-mattermost&#34;&gt;What is Mattermost?&lt;/h2&gt;&#xA;&lt;p&gt;From their site:&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;Mattermost is a flexible, open source messaging platform&#xA;that enables secure team collaboration&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;So think of Mattermost as an open source Slack alternative. It is also bundled with GitLab on premise Omnibus installations.&lt;/p&gt;&#xA;&lt;h2 id=&#34;what-do-i-want-to-achieve&#34;&gt;What do I want to achieve?&lt;/h2&gt;&#xA;&lt;p&gt;While trying to participate in Hacktoberfest 2019 I chose a migration issue for Mattermost as my first target for a PR:&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/mattermost/mattermost-server/issues/12550&#34;&gt;Migrate tests from &amp;ldquo;model/system_test.go&amp;rdquo; to use testify&lt;/a&gt;&lt;/p&gt;</description>
			</item>
			<item>
				<title>Running brave on Linux</title>
				<link>https://livingit.de/software/brave-linux-sandbox/</link>
				<pubDate>Mon, 22 Jul 2019 00:00:00 +0000</pubDate>
				<guid>https://livingit.de/software/brave-linux-sandbox/</guid>
				<description>&lt;h2 id=&#34;running-the-brave-browser-on-linux&#34;&gt;Running the brave browser on Linux&lt;/h2&gt;&#xA;&lt;p&gt;On some Linux systems the brave browser starts with an error stating &lt;code&gt;Unsupported command-line flag: –no-sandbox&lt;/code&gt;. The browser works but this behavior is at least &amp;hellip; annoying.&lt;/p&gt;&#xA;&lt;p&gt;The reason behind this, that for security reasons the brave browser wants to run a session in a user namespace.&lt;/p&gt;&#xA;&lt;p&gt;When you - like me - start brave with just a call to brave it detects if the system supports it, and if not calls the sub process with the -no-sandbox parameter resulting in the error stated above. Though one can argue that a better design of presenting that error (or warning) this is just to tell you you should reconfigure your running kernel.&lt;/p&gt;</description>
			</item>
			<item>
				<title>PyCharm an i3</title>
				<link>https://livingit.de/software/i3-pycharm/</link>
				<pubDate>Tue, 18 Jun 2019 00:00:00 +0000</pubDate>
				<guid>https://livingit.de/software/i3-pycharm/</guid>
				<description>&lt;h2 id=&#34;i3-and-pycharm-the-uglyness-that-is-the-splash-screen&#34;&gt;i3 and PyCharm: the uglyness that is the splash screen&lt;/h2&gt;&#xA;&lt;p&gt;I am running i3 on my machine. It makes me (maybe subjectively) more productive than something like KDE Plasma and suits my development workflow well. Recently I started working more with Python and started using PyCharm.&lt;/p&gt;&#xA;&lt;p&gt;Though I am not focussed on having a perfect visual appearance rather than the workflow having the splash window forced into a tile made it look that ugly that I decided to find a solution.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Using dash as /usr/bin/sh? - think twice</title>
				<link>https://livingit.de/software/dash-bash/</link>
				<pubDate>Tue, 04 Jun 2019 00:00:00 +0000</pubDate>
				<guid>https://livingit.de/software/dash-bash/</guid>
				<description>&lt;p&gt;You will find some advices to use another shell than bash as /usr/bin/sh (or /bin/sh). One of the major reasons why this is proposes is speed. While bash is a comfortable shell it is rather big. So when using a smaller alternative to bash as sh scripts might be faster.&lt;/p&gt;&#xA;&lt;p&gt;Arguably this makes sense if you script a lot. If not that argument is pretty useless. So unless you do shell scripts I would argue not to change the system default. And even if you do, you should think twice.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Go modules - an introduction</title>
				<link>https://livingit.de/software/go-modules/</link>
				<pubDate>Mon, 27 May 2019 00:00:00 +0000</pubDate>
				<guid>https://livingit.de/software/go-modules/</guid>
				<description>&lt;h2 id=&#34;origin&#34;&gt;Origin&lt;/h2&gt;&#xA;&lt;p&gt;This was initially planned as content for a talk on the local Gophers meetup in Frankfurt.&#xA;Unfortunately I had to cancel my attendance and Arne (another organizer) stepped in as&#xA;the presenter.&lt;/p&gt;&#xA;&lt;p&gt;The content of the slides are provided here&lt;/p&gt;&#xA;&lt;h2 id=&#34;go-modules---an-introduction&#34;&gt;Go modules - an introduction&lt;/h2&gt;&#xA;&lt;h3 id=&#34;before-go-modules&#34;&gt;Before go modules&lt;/h3&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://livingit.de/go-modules/before-go-modules.png&#34; alt=&#34;Before Go Modules&#34;&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;what-is-a-module&#34;&gt;What is a module&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Code organization&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;A module is defined with the package name in the module definition.&lt;/p&gt;</description>
			</item>
			<item>
				<title>User Stories</title>
				<link>https://livingit.de/software/user-stories/</link>
				<pubDate>Fri, 22 Feb 2019 00:00:00 +0000</pubDate>
				<guid>https://livingit.de/software/user-stories/</guid>
				<description>&lt;h1 id=&#34;my-take-on-explaining-user-stories-&#34;&gt;My take on explaining user stories &amp;hellip;&lt;/h1&gt;&#xA;&lt;p&gt;&amp;hellip; shortly&lt;/p&gt;&#xA;&lt;p&gt;A user story has the following structure:&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;As &amp;lt;role&amp;gt; I want to &amp;lt;do&amp;gt; because the benefit is &amp;lt;description&amp;gt;&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;A sample:&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;As a car driver I want to apply for a licence plate online because it saves me a lot of time.&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;This communicates clearly the intent and the value of a requirement from the issuers point of view.&lt;/p&gt;&#xA;&lt;p&gt;In general this helps the team to find a common language which should lead to fewer misunderstandings.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Locking and unlocking your desktop with an USB device</title>
				<link>https://livingit.de/software/lock-unlock-yubikey/</link>
				<pubDate>Mon, 07 Jan 2019 00:00:00 +0000</pubDate>
				<guid>https://livingit.de/software/lock-unlock-yubikey/</guid>
				<description>&lt;h2 id=&#34;goal&#34;&gt;Goal&lt;/h2&gt;&#xA;&lt;p&gt;I recently ordered a Yubikey to secure some of my accounts. When it arrived and the key was linked to the desired accounts I started to look into using the key to sign myself in to Linux.&lt;/p&gt;&#xA;&lt;p&gt;There is a great documentation by yubico how to &lt;a href=&#34;https://support.yubico.com/support/solutions/articles/15000011356-ubuntu-linux-login-guide-u2f&#34;&gt;use PAM&lt;/a&gt; to achieve this. I did not followed this guide because of that reasons:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;the key should be optional, not mandatory&lt;/li&gt;&#xA;&lt;li&gt;it should be revertible without an additional key for recovery purposes&lt;/li&gt;&#xA;&lt;li&gt;The password for the user should be typed at least once a day&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h2 id=&#34;explanation-of-goals&#34;&gt;Explanation of goals&lt;/h2&gt;&#xA;&lt;h3 id=&#34;key-should-be-optional&#34;&gt;key should be optional&lt;/h3&gt;&#xA;&lt;p&gt;I believe this is possible with PAM but may prove to be a bit tricky with (3)&lt;/p&gt;</description>
			</item>
			<item>
				<title>A docker firewalld with CoreDNS story</title>
				<link>https://livingit.de/software/firewalld-docker/</link>
				<pubDate>Fri, 22 Jun 2018 00:00:00 +0000</pubDate>
				<guid>https://livingit.de/software/firewalld-docker/</guid>
				<description>&lt;p&gt;I started to use firewalld to secure my system. When I fired up a container and wanted to access the internet I got name resolution errors. You could go for docker&amp;rsquo;s dns options but when you travel to different networks, some of them disallowing access to public DNS servers, you have to have a list of DNS servers. Which may or may not slow down things a bit. So I was looking for a better solution.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Install Go Versioned</title>
				<link>https://livingit.de/software/install-go-versioned/</link>
				<pubDate>Fri, 08 Jun 2018 00:00:00 +0000</pubDate>
				<guid>https://livingit.de/software/install-go-versioned/</guid>
				<description>&lt;p&gt;This script extends the previous one by installing GO into a version directory and having the environment variables point to a current link&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;#! /usr/bin/env bash&#xA;&#xA;VERSION=${VERSION:-1.10.2}&#xA;&#xA;golangurl=https://dl.google.com/go/go${VERSION}.linux-amd64.tar.gz&#xA;downloaddir=&amp;quot;${HOME}/tmp/go-download&amp;quot;&#xA;basedir=&amp;quot;${HOME}/.local/go&amp;quot;&#xA;installdir=&amp;quot;${HOME}/.local/go/_${VERSION}&amp;quot;&#xA;workspacedir=&amp;quot;${HOME}/go&amp;quot;&#xA;&#xA;echo &amp;quot;This script installs Golang into your home folder&amp;quot;&#xA;read -p &amp;quot;Press enter to continue&amp;quot;&#xA;&#xA;if [ -d &amp;quot;${basedir}/${VERSION}&amp;quot; ]; then&#xA;  echo &amp;quot;seems to be installed&amp;quot;&#xA;  exit 1&#xA;fi&#xA;&#xA;echo &amp;quot;Creating download directory ${downloaddir}&amp;quot;&#xA;mkdir -p ${downloaddir}&#xA;&#xA;echo &amp;quot;Downloading Golang&amp;quot;&#xA;wget &amp;quot;${golangurl}&amp;quot; -O &amp;quot;${downloaddir}/go1.10.linux-amd64.tar.gz&amp;quot;&#xA;&#xA;echo &amp;quot;Extracting Golang distribution&amp;quot;&#xA;mkdir -p &amp;quot;${installdir}&amp;quot;&#xA;tar -C &amp;quot;${installdir}&amp;quot; -xzf &amp;quot;${downloaddir}/go1.10.linux-amd64.tar.gz&amp;quot;&#xA;rm &amp;quot;${downloaddir}/go1.10.linux-amd64.tar.gz&amp;quot;&#xA;mv &amp;quot;${installdir}/go&amp;quot; &amp;quot;${basedir}/${VERSION}&amp;quot;&#xA;rm &amp;quot;${basedir}/current&amp;quot;&#xA;ln -s &amp;quot;${basedir}/${VERSION}&amp;quot; &amp;quot;${basedir}/current&amp;quot;&#xA;rm -rf &amp;quot;${installdir}&amp;quot;&#xA;&#xA;echo &amp;quot;Creating go workspace&amp;quot;&#xA;mkdir -p &amp;quot;${workspacedir}/bin&amp;quot;&#xA;mkdir -p &amp;quot;${workspacedir}/src&amp;quot;&#xA;mkdir -p &amp;quot;${workspacedir}/pkg&amp;quot;&#xA;&#xA;echo &amp;quot;export GOROOT=${basedir}/current&amp;quot; &amp;gt; &amp;quot;${HOME}/.go-profile&amp;quot;&#xA;echo &amp;quot;export GOPATH=${HOME}/go&amp;quot; &amp;gt;&amp;gt; &amp;quot;${HOME}/.go-profile&amp;quot;&#xA;echo &amp;quot;export PATH=${basedir}/${current}/go/bin:${GOROOT}/bin:${PATH}&amp;quot; &amp;gt;&amp;gt; &amp;quot;${HOME}/.go-profile&amp;quot;&#xA;&#xA;echo &amp;quot;sourcing ~/.go-profile&amp;quot;&#xA;source &amp;quot;${HOME}/.go-profile&amp;quot;&#xA;&#xA;echo &amp;quot;Testing&amp;quot;&#xA;go version&#xA;&#xA;read -p &amp;quot;Going to add source to ${HOME}/.profile, if unwanted press Ctrl-C now&amp;quot;&#xA;&#xA;echo &amp;gt;&amp;gt; &amp;quot;${HOME}/.profile&amp;quot;&#xA;echo &amp;gt;&amp;gt; &amp;quot;${HOME}/.profile&amp;quot;&#xA;echo &amp;quot;# Set go specific environment&amp;quot; &amp;gt;&amp;gt; &amp;quot;${HOME}/.profile&amp;quot;&#xA;echo &amp;quot;. ~/.go-profile&amp;quot; &amp;gt;&amp;gt; &amp;quot;${HOME}/.profile&amp;quot;&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Update: Fixing path&#xA;Update 2: removing installdir&lt;/p&gt;</description>
			</item>
			<item>
				<title>Open a port for an IP range</title>
				<link>https://livingit.de/software/firewalld-open-for-net/</link>
				<pubDate>Fri, 08 Jun 2018 00:00:00 +0000</pubDate>
				<guid>https://livingit.de/software/firewalld-open-for-net/</guid>
				<description>&lt;p&gt;Using firewalld this is a so called rich rule. To open the ssh port for 192.168.1.0/24 you have to do like this:&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;firewall-cmd --permanent --zone=home --add-rich-rule=&#39;&#xA;  rule family=&amp;quot;ipv4&amp;quot;&#xA;  source address=&amp;quot;192.168.1.0/24&amp;quot;&#xA;  port protocol=&amp;quot;tcp&amp;quot;&#xA;  port=&amp;quot;22&amp;quot;&#xA;  accept&#39;&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;assuming you have just enabled &lt;code&gt;dhcpv6-client&lt;/code&gt; as a service our XML looks like something like this:&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&#xA;&amp;lt;zone&amp;gt;&#xA;  &amp;lt;short&amp;gt;Work&amp;lt;/short&amp;gt;&#xA;  &amp;lt;description&amp;gt;For use in work areas. You mostly trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.&amp;lt;/description&amp;gt;&#xA;  &amp;lt;service name=&amp;quot;dhcpv6-client&amp;quot;/&amp;gt;&#xA;  &amp;lt;rule family=&amp;quot;ipv4&amp;quot;&amp;gt;&#xA;    &amp;lt;source address=&amp;quot;10.200.13.0/24&amp;quot;/&amp;gt;&#xA;    &amp;lt;port protocol=&amp;quot;tcp&amp;quot; port=&amp;quot;22&amp;quot;/&amp;gt;&#xA;    &amp;lt;accept/&amp;gt;&#xA;  &amp;lt;/rule&amp;gt;&#xA;&amp;lt;/zone&amp;gt;&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Do not forget to reload you firewall configuration using &lt;code&gt;firewall-cmd --reload&lt;/code&gt;&lt;/p&gt;</description>
			</item>
			<item>
				<title>Build Git Overhaul</title>
				<link>https://livingit.de/software/build-git-overhaul/</link>
				<pubDate>Wed, 30 May 2018 00:00:00 +0000</pubDate>
				<guid>https://livingit.de/software/build-git-overhaul/</guid>
				<description>&lt;p&gt;I wrote a post about [building git]({{ ref &amp;ldquo;build-git.md&amp;rdquo; }}) a while back. Since then I have&#xA;added some additional features such as installing &lt;a href=&#34;https://github.com/tj/git-extras&#34;&gt;git-extras&lt;/a&gt; and &lt;a href=&#34;https://github.com/petervanderdoes/gitflow-avh&#34;&gt;git-flow&lt;/a&gt; from AVH edition.&lt;/p&gt;&#xA;&lt;p&gt;Also, I install it to my home directory, so I do not have to pollute the system directories with a compiled version of my own. Older versions are preserved until I delete them and the used version is linked to be current.&lt;/p&gt;</description>
			</item>
			<item>
				<title>tmpfiles.d - or why are my temp files in /tmp gone?</title>
				<link>https://livingit.de/software/tmpfiles-d/</link>
				<pubDate>Tue, 29 May 2018 00:00:00 +0000</pubDate>
				<guid>https://livingit.de/software/tmpfiles-d/</guid>
				<description>&lt;p&gt;In later Ubuntu versions tmpfile.d is used to keep /tmp clean. That is, after a reboot, your files you placed in there are vanished. Kind of a bummer when you do not know.&lt;/p&gt;&#xA;&lt;p&gt;You can change that behavior by placing a file into &lt;code&gt;/etc/tmpfile.d/&lt;/code&gt;. If you want to keep your files two days around create a file (let&amp;rsquo;s say named tmp.conf) with the following content:&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;#/etc/tmpfiles.d/tmp.conf&#xA;d /tmp 1777 root root 2d&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;You probably should not do it unless you run this on all your machines. For me it is simply too easy to assume it works everywhere the same as on my machine. Which might lead you to loose some amount of work/time.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Impressum</title>
				<link>https://livingit.de/imprint/</link>
				<pubDate>Wed, 23 May 2018 00:00:00 +0000</pubDate>
				<guid>https://livingit.de/imprint/</guid>
				<description>&lt;h2 id=&#34;impressum&#34;&gt;Impressum&lt;/h2&gt;&#xA;&lt;p&gt;Angaben gemäß § 5 TMG&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;Sascha Andres &#xA;Paul-Hindemith-Ring 5&#xA;63110 Rodgau &#xA;&#xA;Kontakt: &#xA;E-Mail: webmaster [at] livingit.de&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Verantwortlich für den Inhalt nach § 55 Abs. 2 RStV:&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;Sascha Andres &#xA;Paul-Hindemith-Ring 5&#xA;63110 Rodgau &#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;h2 id=&#34;haftungsausschluss&#34;&gt;Haftungsausschluss:&lt;/h2&gt;&#xA;&lt;h3 id=&#34;haftung-für-inhalte&#34;&gt;Haftung für Inhalte&lt;/h3&gt;&#xA;&lt;p&gt;Die Inhalte unserer Seiten wurden mit größter Sorgfalt erstellt. Für die Richtigkeit, Vollständigkeit und Aktualität der Inhalte können wir jedoch keine Gewähr übernehmen. Als Diensteanbieter sind wir gemäß § 7 Abs.1 TMG für eigene Inhalte auf diesen Seiten nach den allgemeinen Gesetzen verantwortlich. Nach §§ 8 bis 10 TMG sind wir als Diensteanbieter jedoch nicht verpflichtet, übermittelte oder gespeicherte fremde Informationen zu überwachen oder nach Umständen zu forschen, die auf eine rechtswidrige Tätigkeit hinweisen. Verpflichtungen zur Entfernung oder Sperrung der Nutzung von Informationen nach den allgemeinen Gesetzen bleiben hiervon unberührt. Eine diesbezügliche Haftung ist jedoch erst ab dem Zeitpunkt der Kenntnis einer konkreten Rechtsverletzung möglich. Bei Bekanntwerden von entsprechenden Rechtsverletzungen werden wir diese Inhalte umgehend entfernen.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Maximal Rodgau: Göb, Benz, Hoffmann</title>
				<link>https://livingit.de/life/maximal-20180518/</link>
				<pubDate>Fri, 18 May 2018 00:00:00 +0000</pubDate>
				<guid>https://livingit.de/life/maximal-20180518/</guid>
				<description>&lt;script src=&#34;https://code.jquery.com/jquery-1.12.4.min.js&#34; integrity=&#34;sha256-ZosEbRLbNQzLpnKIkEdrPv7lOy9C27hHQ+Xp8a4MxAQ=&#34; crossorigin=&#34;anonymous&#34;&gt;&lt;/script&gt;&#xA;&lt;script src=&#34;https://livingit.de/js/load-photoswipe.js&#34;&gt;&lt;/script&gt;&#xA;&#xA;&#xA;&lt;link rel=&#34;stylesheet&#34; href=&#34;https://cdnjs.cloudflare.com/ajax/libs/photoswipe/4.1.1/photoswipe.min.css&#34; integrity=&#34;sha256-sCl5PUOGMLfFYctzDW3MtRib0ctyUvI9Qsmq2wXOeBY=&#34; crossorigin=&#34;anonymous&#34; /&gt;&#xA;&lt;link rel=&#34;stylesheet&#34; href=&#34;https://cdnjs.cloudflare.com/ajax/libs/photoswipe/4.1.1/default-skin/default-skin.min.css&#34; integrity=&#34;sha256-BFeI1V+Vh1Rk37wswuOYn5lsTcaU96hGaI7OUVCLjPc=&#34; crossorigin=&#34;anonymous&#34; /&gt;&#xA;&lt;script src=&#34;https://cdnjs.cloudflare.com/ajax/libs/photoswipe/4.1.1/photoswipe.min.js&#34; integrity=&#34;sha256-UplRCs9v4KXVJvVY+p+RSo5Q4ilAUXh7kpjyIP5odyc=&#34; crossorigin=&#34;anonymous&#34;&gt;&lt;/script&gt;&#xA;&lt;script src=&#34;https://cdnjs.cloudflare.com/ajax/libs/photoswipe/4.1.1/photoswipe-ui-default.min.js&#34; integrity=&#34;sha256-PWHOlUzc96pMc8ThwRIXPn8yH4NOLu42RQ0b9SpnpFk=&#34; crossorigin=&#34;anonymous&#34;&gt;&lt;/script&gt;&#xA;&#xA;&#xA;&lt;div class=&#34;pswp&#34; tabindex=&#34;-1&#34; role=&#34;dialog&#34; aria-hidden=&#34;true&#34;&gt;&#xA;&#xA;&lt;div class=&#34;pswp__bg&#34;&gt;&lt;/div&gt;&#xA;&#xA;&lt;div class=&#34;pswp__scroll-wrap&#34;&gt;&#xA;    &#xA;    &lt;div class=&#34;pswp__container&#34;&gt;&#xA;      &lt;div class=&#34;pswp__item&#34;&gt;&lt;/div&gt;&#xA;      &lt;div class=&#34;pswp__item&#34;&gt;&lt;/div&gt;&#xA;      &lt;div class=&#34;pswp__item&#34;&gt;&lt;/div&gt;&#xA;    &lt;/div&gt;&#xA;    &#xA;    &lt;div class=&#34;pswp__ui pswp__ui--hidden&#34;&gt;&#xA;    &lt;div class=&#34;pswp__top-bar&#34;&gt;&#xA;      &#xA;      &lt;div class=&#34;pswp__counter&#34;&gt;&lt;/div&gt;&#xA;      &lt;button class=&#34;pswp__button pswp__button--close&#34; title=&#34;Close (Esc)&#34;&gt;&lt;/button&gt;&#xA;      &lt;button class=&#34;pswp__button pswp__button--share&#34; title=&#34;Share&#34;&gt;&lt;/button&gt;&#xA;      &lt;button class=&#34;pswp__button pswp__button--fs&#34; title=&#34;Toggle fullscreen&#34;&gt;&lt;/button&gt;&#xA;      &lt;button class=&#34;pswp__button pswp__button--zoom&#34; title=&#34;Zoom in/out&#34;&gt;&lt;/button&gt;&#xA;      &#xA;      &#xA;      &lt;div class=&#34;pswp__preloader&#34;&gt;&#xA;        &lt;div class=&#34;pswp__preloader__icn&#34;&gt;&#xA;          &lt;div class=&#34;pswp__preloader__cut&#34;&gt;&#xA;            &lt;div class=&#34;pswp__preloader__donut&#34;&gt;&lt;/div&gt;&#xA;          &lt;/div&gt;&#xA;        &lt;/div&gt;&#xA;      &lt;/div&gt;&#xA;    &lt;/div&gt;&#xA;    &lt;div class=&#34;pswp__share-modal pswp__share-modal--hidden pswp__single-tap&#34;&gt;&#xA;      &lt;div class=&#34;pswp__share-tooltip&#34;&gt;&lt;/div&gt;&#xA;    &lt;/div&gt;&#xA;    &lt;button class=&#34;pswp__button pswp__button--arrow--left&#34; title=&#34;Previous (arrow left)&#34;&gt;&#xA;    &lt;/button&gt;&#xA;    &lt;button class=&#34;pswp__button pswp__button--arrow--right&#34; title=&#34;Next (arrow right)&#34;&gt;&#xA;    &lt;/button&gt;&#xA;    &lt;div class=&#34;pswp__caption&#34;&gt;&#xA;      &lt;div class=&#34;pswp__caption__center&#34;&gt;&lt;/div&gt;&#xA;    &lt;/div&gt;&#xA;    &lt;/div&gt;&#xA;    &lt;/div&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;p&gt;We finally went to visit &lt;a href=&#34;http://www.maximal-rodgau.de/&#34;&gt;Maximal&lt;/a&gt; in Rodgau. It is driven by a society and they do Jazz Live music and other live music. It is affordable and a small but unique location.&lt;/p&gt;&#xA;&lt;p&gt;If you like concerts with a private atmosphere and you are in the reach of it you should give it a try.&lt;/p&gt;</description>
			</item>
			<item>
				<title>How to change your SSH key password</title>
				<link>https://livingit.de/software/ssh-key-password-change/</link>
				<pubDate>Tue, 08 May 2018 00:00:00 +0000</pubDate>
				<guid>https://livingit.de/software/ssh-key-password-change/</guid>
				<description>&lt;p&gt;From time to time you should change your password. Everyone knows. For your SSH key this is as simple as changing your Linux login password:&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;ssh-keygen -p -f ~/.ssh/id_rsa&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Maybe you have to change the path/name depending on your setup.&lt;/p&gt;</description>
			</item>
			<item>
				<title>How to repair your multi file VMWare disk</title>
				<link>https://livingit.de/software/vmware-disk-repair/</link>
				<pubDate>Tue, 08 May 2018 00:00:00 +0000</pubDate>
				<guid>https://livingit.de/software/vmware-disk-repair/</guid>
				<description>&lt;p&gt;Recently I deleted a snapshort from my virtual machine and I got a message that the virtual disk needs repair.&#xA;The site &lt;a href=&#34;https://kb.vmware.com/s/article/2019259&#34;&gt;Repairing a virtual disk in Workstation&lt;/a&gt; explains how to do this. in detail.&lt;/p&gt;&#xA;&lt;p&gt;Due to the reason I selected to split the disk into multiple files, there were many files that could be the reason for the message.&#xA;So I helped myself with a short find command.&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;find -type f -name &amp;quot;*vmdk&amp;quot; -exec vmware-vdiskmanager -R {} \;&#xA;&lt;/code&gt;&lt;/pre&gt;</description>
			</item>
			<item>
				<title>Arch Keyring</title>
				<link>https://livingit.de/software/arch-keyring/</link>
				<pubDate>Wed, 11 Apr 2018 00:00:00 +0000</pubDate>
				<guid>https://livingit.de/software/arch-keyring/</guid>
				<description>&lt;h2 id=&#34;problem&#34;&gt;Problem&lt;/h2&gt;&#xA;&lt;p&gt;When I wanted to upgrade my ArchLinux installation I got an error about a failed lookup for a key:&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;error: key &amp;quot;&amp;lt;KEY ID&amp;gt;&amp;quot; could not be looked up remotely&#xA;error: required key missing from keyring&#xA;error: failed to commit transaction (unexpected error)&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;h2 id=&#34;solution&#34;&gt;Solution&lt;/h2&gt;&#xA;&lt;p&gt;Turned out that reinstalling &lt;code&gt;archlinux-keyring&lt;/code&gt; loaded the key:&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;sudo pacman -S archlinux-keyring&#xA;sudo pacman -Syu&#xA;&lt;/code&gt;&lt;/pre&gt;</description>
			</item>
			<item>
				<title>Compile Mutt</title>
				<link>https://livingit.de/software/compile-mutt/</link>
				<pubDate>Thu, 29 Mar 2018 00:00:00 +0000</pubDate>
				<guid>https://livingit.de/software/compile-mutt/</guid>
				<description>&lt;p&gt;I am using mutt as my mail reader and I like to have a rather new version than the one included in LTS linux releases.&lt;/p&gt;&#xA;&lt;p&gt;Therefore I am compiling my mutt version. I fired up an editor and created a script that does this automatically. Here we go:&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;#! /bin/bash&#xA;&#xA;MUTT_VERSION=1.9.4&#xA;PREFIX=&amp;quot;${HOME}/.local/mutt/${MUTT_VERSION}/&amp;quot;&#xA;&#xA;if [ ! -f &amp;quot;${HOME}/tmp/mutt&amp;quot; ]; then&#xA;  mkdir -p &amp;quot;${HOME}/tmp/mutt&amp;quot;&#xA;fi&#xA;&#xA;cd &amp;quot;${HOME}/tmp/mutt&amp;quot; || exit 1&#xA;wget &amp;quot;http://ftp.mutt.org/pub/mutt/mutt-${MUTT_VERSION}.tar.gz&amp;quot;&#xA;&#xA;cd &amp;quot;${HOME}/tmp/mutt&amp;quot; || exit 1&#xA;tar xzf mutt-$MUTT_VERSION.tar.gz&#xA;&#xA;sudo apt-get install -y libncursesw5 libncursesw5-dev libsasl2-2 libsasl2-dev libtokyocabinet9 libtokyocabinet-dev libgnutls-dev     libglobus-gssapi-gsi-dev libkrb5-dev&#xA;&#xA;cd &amp;quot;${HOME}/tmp/mutt/mutt-${MUTT_VERSION}&amp;quot; || exit 1&#xA;&#xA;./configure --prefix=&amp;quot;${PREFIX}&amp;quot; --with-regex --with-ssl=no --with-sasl --with-gnutls --enable-pop --enable-imap --enable-smtp --with-included-gettext     --with-gss --enable-hcache --enable-sidebar&#xA;make&#xA;make install&#xA;&lt;/code&gt;&lt;/pre&gt;</description>
			</item>
			<item>
				<title>Install Personal Golang</title>
				<link>https://livingit.de/software/install-personal-golang/</link>
				<pubDate>Thu, 29 Mar 2018 00:00:00 +0000</pubDate>
				<guid>https://livingit.de/software/install-personal-golang/</guid>
				<description>&lt;h1 id=&#34;problem&#34;&gt;Problem&lt;/h1&gt;&#xA;&lt;p&gt;I wanted to set up a Golang environment on a Linux machine and do it repeatedly&lt;/p&gt;&#xA;&lt;h1 id=&#34;solution&#34;&gt;Solution&lt;/h1&gt;&#xA;&lt;p&gt;I created a bash script that downloads Golang and creates a working environment which you can find below.&lt;/p&gt;&#xA;&lt;p&gt;You could also go with &lt;a href=&#34;https://github.com/moovweb/gvm&#34;&gt;gvm&lt;/a&gt; which I have not used but looks promising.&lt;/p&gt;&#xA;&lt;p&gt;Using an environment variable for VERSION you can set the Golang version to install.&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;#! /usr/bin/env bash&#xA;&#xA;VERSION=${VERSION:-1.10.1}&#xA;&#xA;golangurl=https://dl.google.com/go/go${VERSION}.linux-amd64.tar.gz&#xA;downloaddir=&amp;quot;${HOME}/tmp/go-download&amp;quot;&#xA;installdir=&amp;quot;${HOME}/go-distribution&amp;quot;&#xA;workspacedir=&amp;quot;${HOME}/go&amp;quot;&#xA;&#xA;echo &amp;quot;This script installs Golang into your home folder&amp;quot;&#xA;read -p &amp;quot;Press enter to continue&amp;quot;&#xA;&#xA;echo &amp;quot;Creating download directory ${downloaddir}&amp;quot;&#xA;mkdir -p ${downloaddir}&#xA;&#xA;echo &amp;quot;Downloading Golang&amp;quot;&#xA;wget &amp;quot;${golangurl}&amp;quot; -O &amp;quot;${downloaddir}/go1.10.linux-amd64.tar.gz&amp;quot;&#xA;&#xA;echo &amp;quot;Extracting Golang distribution&amp;quot;&#xA;mkdir -p &amp;quot;${installdir}&amp;quot;&#xA;tar -C &amp;quot;${installdir}&amp;quot; -xzf &amp;quot;${downloaddir}/go1.10.linux-amd64.tar.gz&amp;quot;&#xA;rm &amp;quot;${downloaddir}/go1.10.linux-amd64.tar.gz&amp;quot;&#xA;&#xA;echo &amp;quot;Creating go workspace&amp;quot;&#xA;mkdir -p &amp;quot;${workspacedir}/bin&amp;quot;&#xA;mkdir -p &amp;quot;${workspacedir}/src&amp;quot;&#xA;mkdir -p &amp;quot;${workspacedir}/pkg&amp;quot;&#xA;&#xA;echo &amp;quot;export GOROOT=${HOME}/go-distribution/go&amp;quot; &amp;gt; &amp;quot;${HOME}/.go-profile&amp;quot;&#xA;echo &amp;quot;export GOPATH=${HOME}/go&amp;quot; &amp;gt;&amp;gt; &amp;quot;${HOME}/.go-profile&amp;quot;&#xA;echo &amp;quot;export PATH=${HOME}/go/bin:${GOROOT}/bin:${PATH}&amp;quot; &amp;gt;&amp;gt; &amp;quot;${HOME}/.go-profile&amp;quot;&#xA;&#xA;echo &amp;quot;sourcing ~/.go-profile&amp;quot;&#xA;source &amp;quot;${HOME}/.go-profile&amp;quot;&#xA;&#xA;echo &amp;quot;Testing&amp;quot;&#xA;go version&#xA;&#xA;read -p &amp;quot;Going to add source to ${HOME}/.profile, if unwanted press Ctrl-C now&amp;quot;&#xA;&#xA;echo &amp;gt;&amp;gt; &amp;quot;${HOME}/.profile&amp;quot;&#xA;echo &amp;gt;&amp;gt; &amp;quot;${HOME}/.profile&amp;quot;&#xA;echo &amp;quot;# Set go specific environment&amp;quot; &amp;gt;&amp;gt; &amp;quot;${HOME}/.profile&amp;quot;&#xA;echo &amp;quot;. ~/.go-profile&amp;quot; &amp;gt;&amp;gt; &amp;quot;${HOME}/.profile&amp;quot;&#xA;&lt;/code&gt;&lt;/pre&gt;</description>
			</item>
			<item>
				<title>Hugo Page Bundles</title>
				<link>https://livingit.de/software/hugo-page-bundles/</link>
				<pubDate>Wed, 28 Mar 2018 00:00:00 +0000</pubDate>
				<guid>https://livingit.de/software/hugo-page-bundles/</guid>
				<description>&lt;h1 id=&#34;-or-updating-from-versions-pre-032&#34;&gt;&amp;hellip; or updating from versions pre 0.32&lt;/h1&gt;&#xA;&lt;p&gt;With version 0.32 the page bundle feature was added to hugo. This feature makes page exchange/review cycles much more convenient and is a huge step forward. Anyways, this update may put you in a situation you have to update your content structure slightly.&lt;/p&gt;&#xA;&lt;p&gt;Some useful links:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://scripter.co/hugo-leaf-and-branch-bundles/#branch-bundle-vs-regular-sections&#34;&gt;Hugo: Leaf and Branch Bundles&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://gohugo.io/content-management/page-bundles/&#34;&gt;Page Bundles&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;I struggled a bit and received good help in the &lt;a href=&#34;https://discourse.gohugo.io/&#34;&gt;forum&lt;/a&gt; and if I would have updated hugo for each release effectively reading the release notes this would have been much less weird for me.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Arch Linux: zita-resampler 1.6.0-2 update</title>
				<link>https://livingit.de/software/zita-resampler-update/</link>
				<pubDate>Fri, 23 Feb 2018 00:00:00 +0000</pubDate>
				<guid>https://livingit.de/software/zita-resampler-update/</guid>
				<description>&lt;h1 id=&#34;the-problem&#34;&gt;The problem&lt;/h1&gt;&#xA;&lt;p&gt;On update pacman errors about existing file /usr/lib/libzita-resampler.so.1. ldconfig created a symlink that should have been installed with 1.6.0-1 but was not. Therefore a conflict occurs.&lt;/p&gt;&#xA;&lt;h1 id=&#34;the-solution&#34;&gt;The solution&lt;/h1&gt;&#xA;&lt;p&gt;Delete /usr/lib/libzita-resampler.so.1&lt;/p&gt;&#xA;&lt;h1 id=&#34;note&#34;&gt;Note&lt;/h1&gt;&#xA;&lt;p&gt;For seemingly identical problems with other packages you should do a research before just deleting a file.&lt;/p&gt;</description>
			</item>
			<item>
				<title>First class functions</title>
				<link>https://livingit.de/software/first-class-functions/</link>
				<pubDate>Mon, 27 Nov 2017 00:00:00 +0000</pubDate>
				<guid>https://livingit.de/software/first-class-functions/</guid>
				<description>&lt;h2 id=&#34;what-are-first-class-functions&#34;&gt;What are first class functions?&lt;/h2&gt;&#xA;&lt;p&gt;If you stumble upon first class functions what usually mean is, that functions are part of the type system of your language. So you can assign a method to a function. As an example:&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;package main&#xA;&#xA;import &amp;quot;fmt&amp;quot;&#xA;&#xA;var a func(a int) int&#xA;&#xA;func main() {&#xA;        a = func (a int ) int {&#xA;                return a * a&#xA;        }&#xA;&#xA;        fmt.Println(a(2)) // prints 4&#xA;}&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://play.golang.org/p/0QAUQW6jdL&#34;&gt;RUN&lt;/a&gt;&lt;/p&gt;</description>
			</item>
			<item>
				<title>Build Git</title>
				<link>https://livingit.de/software/build-git/</link>
				<pubDate>Mon, 23 Oct 2017 00:00:00 +0000</pubDate>
				<guid>https://livingit.de/software/build-git/</guid>
				<description>&lt;h1 id=&#34;my-problem&#34;&gt;My problem&lt;/h1&gt;&#xA;&lt;p&gt;I want to have an up to date git on my Linux system ( currently KDE neon )&lt;/p&gt;&#xA;&lt;h1 id=&#34;my-solution&#34;&gt;My solution&lt;/h1&gt;&#xA;&lt;p&gt;I wrote a little script installing the prerequisites, downloading the sources, compiling and installing:&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;#! /bin/bash&#xA;&#xA;GIT_VERSION=2.14.2&#xA;&#xA;cd ~&#xA;rm -rf ~/tmp/git&#xA;mkdir -p ~/tmp/git&#xA;sudo apt install unzip automake gcc libssl-dev build-essential libcurl4-gnutls-dev libexpat1-dev gettext curl -y&#xA;cd ~/tmp/git&#xA;wget https://github.com/git/git/archive/v$GIT_VERSION.zip&#xA;cd ~/tmp/git&#xA;unzip v$GIT_VERSION.zip&#xA;cd git-$GIT_VERSION&#xA;make prefix=/usr/local all&#xA;sudo apt remove git -y&#xA;sudo apt autoremove -y&#xA;sudo make prefix=/usr/local install&#xA;&lt;/code&gt;&lt;/pre&gt;</description>
			</item>
			<item>
				<title>Your friendly support technician</title>
				<link>https://livingit.de/software/your-friendly-support-technician/</link>
				<pubDate>Mon, 18 Sep 2017 00:00:00 +0000</pubDate>
				<guid>https://livingit.de/software/your-friendly-support-technician/</guid>
				<description>&lt;h2 id=&#34;preface&#34;&gt;Preface&lt;/h2&gt;&#xA;&lt;p&gt;Once in a while you might get a call from a support technician telling you&amp;rsquo;re at risk. Or at least your PC is. But fear not, he is there to help &amp;hellip; not.&lt;/p&gt;&#xA;&lt;p&gt;That is because he is the security threat. Usually you are loosing your data and/or some amount of money if you accept the kind offer. Let think through this kind of scam by picking Microsoft as a vendor those guys often pick and the psychology behind those attacks.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Map of Computer Science</title>
				<link>https://livingit.de/software/map-of-computer-science/</link>
				<pubDate>Thu, 07 Sep 2017 00:00:00 +0000</pubDate>
				<guid>https://livingit.de/software/map-of-computer-science/</guid>
				<description>&lt;p&gt;Really nice video on the field of computer science. A nice introduction.&lt;/p&gt;&#xA;&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;&#xA;&#x9;&#x9;&#x9;&lt;iframe allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen&#34; loading=&#34;eager&#34; referrerpolicy=&#34;strict-origin-when-cross-origin&#34; src=&#34;https://www.youtube-nocookie.com/embed/SzJ46YA_RaA?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; title=&#34;YouTube video&#34;&gt;&lt;/iframe&gt;&#xA;&#x9;&#x9;&lt;/div&gt;</description>
			</item>
			<item>
				<title>Installing elixir - a quickie</title>
				<link>https://livingit.de/software/installelixir/</link>
				<pubDate>Wed, 06 Sep 2017 00:00:00 +0000</pubDate>
				<guid>https://livingit.de/software/installelixir/</guid>
				<description>&lt;p&gt;This is a short script to install elixir (done this on a Ubuntu 16.04 based distribution) with a fish shell:&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;wget https://packages.erlang-solutions.com/erlang-solutions_1.0_all.deb -o erlang-solutions_1.0_all.deb; and sudo dpkg -i erlang-solutions_1.0_all.deb&#xA;sudo apt update&#xA;sudo apt install esl-erlang&#xA;sudo apt install elixir&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Basically the same stuff as on the official &lt;a href=&#34;https://elixir-lang.org/install.html#unix-and-unix-like&#34;&gt;elixir page&lt;/a&gt;&lt;/p&gt;</description>
			</item>
			<item>
				<title>No network time protocol</title>
				<link>https://livingit.de/software/nontp/</link>
				<pubDate>Mon, 04 Sep 2017 00:00:00 +0000</pubDate>
				<guid>https://livingit.de/software/nontp/</guid>
				<description>&lt;h2 id=&#34;my-problem&#34;&gt;My problem&lt;/h2&gt;&#xA;&lt;p&gt;My machine was off by two hours after a restart even though &lt;code&gt;/etc/timezone&lt;/code&gt; pointed to the correct timezone.&lt;/p&gt;&#xA;&lt;p&gt;A temporary solution was to execute the following command in bash:&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;sudo date -s &amp;quot;$(wget -qSO- --max-redirect=0 google.com 2&amp;gt;&amp;amp;1 | grep Date: | cut -d&#39; &#39; -f5-8)Z&amp;quot;&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;I solved it by installing &lt;code&gt;htpdate&lt;/code&gt; and setting my time this way. If you are interacting with a Windows Domain are doing other authentication based on time you are way better off using the network time protocol, unfortunately this is not available in my case.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Virtualbox</title>
				<link>https://livingit.de/software/virtualbox/</link>
				<pubDate>Mon, 04 Sep 2017 00:00:00 +0000</pubDate>
				<guid>https://livingit.de/software/virtualbox/</guid>
				<description>&lt;p&gt;I recently installed a new Linux machine for a colleague. He used Virtualbox and I wanted to install it for him on his new machine, too.&lt;/p&gt;&#xA;&lt;p&gt;The obvious way would have been this:&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;apt install virtualbox&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Along with some optional packages for X11, guest tools and so on.&lt;/p&gt;&#xA;&lt;p&gt;The install wanted to remove &lt;code&gt;ubuntu-desktop&lt;/code&gt; which I think is unwanted for this use case. I switched to using the repository provided by Virtualbox itself:&lt;/p&gt;</description>
			</item>
			<item>
				<title>Using nativefier to run web pages as app</title>
				<link>https://livingit.de/software/natifier/</link>
				<pubDate>Fri, 25 Aug 2017 00:00:00 +0000</pubDate>
				<guid>https://livingit.de/software/natifier/</guid>
				<description>&lt;h1 id=&#34;what-is-nativefier&#34;&gt;What is nativefier?&lt;/h1&gt;&#xA;&lt;p&gt;Nativefier is a small tool to wrap web pages into an Electron app to run locally.&lt;/p&gt;&#xA;&lt;h1 id=&#34;how-do-i-get-it&#34;&gt;How do I get it?&lt;/h1&gt;&#xA;&lt;p&gt;Nativefier is a node.js application and has to be installed using npm. You need at least nodejs 4, I tested it using nodejs 8.&lt;/p&gt;&#xA;&lt;p&gt;To install nativefier type the following:&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;npm install -g nativefier&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;h1 id=&#34;how-to-create-an-application&#34;&gt;How to create an application?&lt;/h1&gt;&#xA;&lt;p&gt;To create an application type&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;nativefier http://www.example.org&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;This downloads Electron and creates an application pointing to the URL.&lt;/p&gt;</description>
			</item>
			<item>
				<title>chntpw to the rescue</title>
				<link>https://livingit.de/software/chntpw/</link>
				<pubDate>Wed, 23 Aug 2017 00:00:00 +0000</pubDate>
				<guid>https://livingit.de/software/chntpw/</guid>
				<description>&lt;h1 id=&#34;my-problem&#34;&gt;My problem&lt;/h1&gt;&#xA;&lt;p&gt;I got a Windows 8.1 PC and wanted to reset the password for local administrator account. A reset was not successful so I switched to using a Linux live image.&lt;/p&gt;&#xA;&lt;p&gt;To do this I downloaded an Ubuntu 16.04 Desktop image and wrote it to a flash drive using RosaImageWriter (see link list below) and booted the machine with it.&#xA;I downloaded the deb package and installed it using &lt;code&gt;sudo dpkg -i Downloads/chntpw_1.0-1_amd64.deb&lt;/code&gt;.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Contagion R.A.T.7 mouse on Linux</title>
				<link>https://livingit.de/software/contagionrat7/</link>
				<pubDate>Wed, 23 Aug 2017 00:00:00 +0000</pubDate>
				<guid>https://livingit.de/software/contagionrat7/</guid>
				<description>&lt;p&gt;I like using the Contagion R.A.T.7 mouse and to use it with Linux you must configure the mouse correctly in terms of buttons.&lt;/p&gt;&#xA;&lt;p&gt;Essentially there are buttons (the mode change button are three buttons for Linux) and one of them is always pressed. You need to exclude them to have a working setup. &lt;a href=&#34;http://www.gdargaud.net/Hack/LinuxMouse.html&#34;&gt;http://www.gdargaud.net/Hack/LinuxMouse.html&lt;/a&gt; is a good tutorial on how to disable the buttons.&lt;/p&gt;&#xA;&lt;p&gt;I have two of them and the product name has changed in between. So I had to double the section and my xorg.conf looks like this:&lt;/p&gt;</description>
			</item>
			<item>
				<title>gRPC message size</title>
				<link>https://livingit.de/software/grpcmsgsize/</link>
				<pubDate>Mon, 21 Aug 2017 00:00:00 +0000</pubDate>
				<guid>https://livingit.de/software/grpcmsgsize/</guid>
				<description>&lt;h1 id=&#34;what-is-grpc&#34;&gt;What is gRPC?&lt;/h1&gt;&#xA;&lt;p&gt;&lt;cite&gt;A high performance, open-source universal RPC framework - &lt;a href=&#34;https://grpc.io&#34;&gt;https://grpc.io&lt;/a&gt;&lt;/cite&gt;&lt;/p&gt;&#xA;&lt;p&gt;RPC stands for Remote Procedure Call. gRPC is a framework that allows you to create RPC servers using protocol buffers for a variety of languages.&lt;/p&gt;&#xA;&lt;p&gt;&lt;cite&gt;In distributed computing, a remote procedure call (RPC) is when a computer program causes a procedure (subroutine) to execute in a different address space (commonly on another computer on a shared network), which is coded as if it were a normal (local) procedure call, without the programmer explicitly coding the details for the remote interaction. - &lt;a href=&#34;https://en.wikipedia.org/wiki/Remote_procedure_call&#34;&gt;https://en.wikipedia.org/wiki/Remote_procedure_call&lt;/a&gt;&lt;/cite&gt;&lt;/p&gt;</description>
			</item>
			<item>
				<title>Protocol buffer talk @Frankfurt Rhein-Main Gophers Meetup</title>
				<link>https://livingit.de/software/protobuf/</link>
				<pubDate>Thu, 03 Aug 2017 00:00:00 +0000</pubDate>
				<guid>https://livingit.de/software/protobuf/</guid>
				<description>&lt;h1 id=&#34;a-short-overview-of-protocol-buffers&#34;&gt;A short overview of protocol buffers&lt;/h1&gt;&#xA;&lt;p&gt;This post is a slightly modified version of slides for a gophers meetup in Frankfurt. They served primarily as a way to support the talk but are published here for reference.&lt;/p&gt;&#xA;&lt;h2 id=&#34;history&#34;&gt;History&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Internal release 2001 [wiki]&lt;/li&gt;&#xA;&lt;li&gt;Public release 2008 [wiki]&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;what&#34;&gt;What&lt;/h2&gt;&#xA;&lt;p&gt;Protocol buffers are Google&amp;rsquo;s efficient way to communicate over a network.&lt;/p&gt;&#xA;&lt;p&gt;They are a foundation for gRPC [grpc] an RPC framework that makes&#xA;building services rather easy.&lt;/p&gt;</description>
			</item>
	</channel>
</rss>
