<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Mitchell Riedstra&#39;s personal website</title>
  <id>https://riedstra.dev</id>
  <author>
    <name>Mitchell Riedstra</name>
    <uri>https://riedstra.dev</uri>
    <email>mitch@riedstra.dev</email>
  </author>
  <updated>2021-07-11T11:00:00-04:00</updated>
  <subtitle>Mitchell Riedstra&#39;s personal website. Mostly about software, though sometimes literature, philosophy, cars, and other things of interest to me&#xA;</subtitle>
  <entry>
    <id>Setting up FIDO2 backed SSH keys on MacOS::1702170000</id>
    <title>Setting up FIDO2 backed SSH keys on MacOS</title>
    <updated>2023-12-09T20:00:00-05:00</updated>
    <link href="https://riedstra.dev/2023/12/ssh-sk-keys-on-macos"></link>
    <content type="html">&#xA;&lt;!DOCTYPE html&gt;&#xA;&lt;html lang=&#34;en&#34;&gt;&#xA;&lt;head&gt;&#xA;  &lt;meta charset=&#34;UTF-8&#34;&gt;&#xA;&#xA;  &lt;link id=&#34;maincss&#34; rel=&#34;stylesheet&#34; href=&#34;/static/style.css&#34; defer&gt;&#xA;  &lt;link id=&#34;fontcss&#34; rel=&#34;stylesheet&#34; href=&#34;/static/fonts/fonts.css&#34; defer&gt;&#xA;&#xA;  &#xA;    &lt;meta name=&#34;author&#34; content=&#34;Mitchell Riedstra&#34;&gt;&#xA;  &#xA;&#xA;  &#xA;    &lt;title&gt;Setting up FIDO2 backed SSH keys on MacOS&lt;/title&gt;&#xA;  &#xA;  &#xA;  &#xA;    &lt;meta name=&#34;description&#34; content=&#34;Not too hard, but still not quite obvious.&#34;&gt;&#xA;  &#xA;&#xA;  &lt;meta name=&#34;viewport&#34; content=&#34;width=device-width, initial-scale=1.0&#34;&gt;&#xA;  &lt;meta name=&#34;theme-color&#34; media=&#34;(prefers-color-scheme: light)&#34; content=&#34;white&#34; /&gt;&#xA;  &lt;meta name=&#34;theme-color&#34; media=&#34;(prefers-color-scheme: dark)&#34; content=&#34;black&#34; /&gt;&#xA;&#xA;  &lt;link rel=&#34;apple-touch-icon&#34; sizes=&#34;180x180&#34; href=&#34;/static/apple-touch-icon.png&#34;&gt;&#xA;  &lt;link rel=&#34;icon&#34; type=&#34;image/png&#34; sizes=&#34;32x32&#34; href=&#34;/static/favicon-32x32.png&#34;&gt;&#xA;  &lt;link rel=&#34;icon&#34; type=&#34;image/png&#34; sizes=&#34;16x16&#34; href=&#34;/static/favicon-16x16.png&#34;&gt;&#xA;  &lt;link rel=&#34;manifest&#34; href=&#34;/static/site.webmanifest&#34;&gt;&#xA;&#xA;  &#xA;  &#xA;&lt;/head&gt;&#xA;&lt;body&gt;&#xA;&#xA;&#xA;&#xA;&#xA;&lt;nav&gt;&#xA;&#x9;| &lt;a href=&#34;/&#34;&gt;Home&lt;/a&gt; |&#xA;&#x9;&lt;div style=&#34;display: block; float: right;&#34;&gt;&#xA;&#x9;| &lt;a href=&#34;https://git.riedstra.dev/&#34;&gt;Git&lt;/a&gt; |&#xA;&#x9;&#xA;&#x9;&lt;/div&gt;&#xA;&lt;/nav&gt;&#xA;&#xA;&#xA;&#xA;&lt;p&gt;&lt;code&gt;Saturday December 9 2023&lt;/code&gt;&lt;/p&gt;&#xA;&lt;h1&gt;Setting up FIDO2 backed SSH keys on MacOS&lt;/h1&gt;&#xA;&lt;p&gt;After a recent re-install I had to go through this process again, figuring it&#xA;out is the most tedious part. Once you know what to do it&#39;s not so bad.&lt;/p&gt;&#xA;&lt;p&gt;Install &lt;a href=&#34;https://brew.sh/&#34;&gt;Homebrew&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Then install &lt;code&gt;openssh&lt;/code&gt; ( as even on MacOS Sonoma they&#39;ve disabled the feature in&#xA;the bundled version of SSH )&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ brew install openssh&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;And then setup &lt;a href=&#34;https://github.com/theseal/ssh-askpass&#34;&gt;&lt;code&gt;ssh-askpass&lt;/code&gt;&lt;/a&gt;:&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ brew install theseal/ssh-askpass/ssh-askpass&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Update your zsh, or other shell configuration to make sure the environment&#xA;variables are exported:&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;export SSH_ASKPASS=ssh-askpass&#xA;export SSH_ASKPASS_REQUIRE=force&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Then add the following snippet below the environment variables:&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;#shellcheck disable=SC2120&#xA;checkSSHAgent() {&#xA;&#x9;if [ &amp;quot;$1&amp;quot; = &amp;quot;-k&amp;quot; ] ; then&#xA;&#x9;&#x9;pkill -9 ssh-agent&#xA;&#x9;fi&#xA;&#xA;&#x9;ssh_agent_conf=&amp;quot;$HOME/.ssh/agent&amp;quot;&#xA;&#x9;if [ -e &amp;quot;$ssh_agent_conf&amp;quot; ] ; then&#xA;&#x9;&#x9;#shellcheck disable=SC1090&#xA;&#x9;&#x9;. &amp;quot;$ssh_agent_conf&amp;quot;&#xA;&#x9;fi&#xA;&#x9;#shellcheck disable=SC2009&#xA;&#x9;if ! ps aux | awk &#39;{print $2}&#39; | grep -q &amp;quot;$SSH_AGENT_PID&amp;quot; \&#xA;&#x9;&#x9;|| ! [ -e &amp;quot;$ssh_agent_conf&amp;quot; ] \&#xA;&#x9;&#x9;|| [ -z &amp;quot;$SSH_AGENT_PID&amp;quot; ] ; \&#xA;&#x9;then&#xA;&#x9;&#x9;ssh-agent -s | grep -v echo &amp;gt; &amp;quot;$ssh_agent_conf&amp;quot;&#xA;&#x9;&#x9;#shellcheck disable=SC1090&#xA;&#x9;&#x9;. &amp;quot;$ssh_agent_conf&amp;quot;&#xA;&#x9;fi&#xA;}&#xA;&#xA;checkSSHAgent&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;I prefer to use the above shell function that&#39;s more aggressive about checking&#xA;that the agent is running, rather than relying on it being started at login and&#xA;the environment variables appropriately inherited.&lt;/p&gt;&#xA;&lt;p&gt;With that done, you should be able to fire up a new terminal and have SSH&#xA;working with the Yubikeys, as well as the pop-up window to notify you when to&#xA;tap the key.&lt;/p&gt;&#xA;&#xA;&#xA;&lt;/body&gt;&#xA;&#xA;</content>
  </entry>
  <entry>
    <id>Why Software Engineers don&#39;t avoid Complexity::1673069400</id>
    <title>Why Software Engineers don&#39;t avoid Complexity</title>
    <updated>2023-01-07T00:30:00-05:00</updated>
    <link href="https://riedstra.dev/2023/01/software-features-and-complexity"></link>
    <content type="html">&#xA;&lt;!DOCTYPE html&gt;&#xA;&lt;html lang=&#34;en&#34;&gt;&#xA;&lt;head&gt;&#xA;  &lt;meta charset=&#34;UTF-8&#34;&gt;&#xA;&#xA;  &lt;link id=&#34;maincss&#34; rel=&#34;stylesheet&#34; href=&#34;/static/style.css&#34; defer&gt;&#xA;  &lt;link id=&#34;fontcss&#34; rel=&#34;stylesheet&#34; href=&#34;/static/fonts/fonts.css&#34; defer&gt;&#xA;&#xA;  &#xA;    &lt;meta name=&#34;author&#34; content=&#34;Mitchell Riedstra&#34;&gt;&#xA;  &#xA;&#xA;  &#xA;    &lt;title&gt;Why Software Engineers don&#39;t avoid Complexity&lt;/title&gt;&#xA;  &#xA;  &#xA;  &#xA;    &lt;meta name=&#34;description&#34; content=&#34;How Software Engineers often fall prey to the same thing that customers do, incentives.&#34;&gt;&#xA;  &#xA;&#xA;  &lt;meta name=&#34;viewport&#34; content=&#34;width=device-width, initial-scale=1.0&#34;&gt;&#xA;  &lt;meta name=&#34;theme-color&#34; media=&#34;(prefers-color-scheme: light)&#34; content=&#34;white&#34; /&gt;&#xA;  &lt;meta name=&#34;theme-color&#34; media=&#34;(prefers-color-scheme: dark)&#34; content=&#34;black&#34; /&gt;&#xA;&#xA;  &lt;link rel=&#34;apple-touch-icon&#34; sizes=&#34;180x180&#34; href=&#34;/static/apple-touch-icon.png&#34;&gt;&#xA;  &lt;link rel=&#34;icon&#34; type=&#34;image/png&#34; sizes=&#34;32x32&#34; href=&#34;/static/favicon-32x32.png&#34;&gt;&#xA;  &lt;link rel=&#34;icon&#34; type=&#34;image/png&#34; sizes=&#34;16x16&#34; href=&#34;/static/favicon-16x16.png&#34;&gt;&#xA;  &lt;link rel=&#34;manifest&#34; href=&#34;/static/site.webmanifest&#34;&gt;&#xA;&#xA;  &#xA;  &#xA;&lt;/head&gt;&#xA;&lt;body&gt;&#xA;&#xA;&#xA;&#xA;&#xA;&lt;nav&gt;&#xA;&#x9;| &lt;a href=&#34;/&#34;&gt;Home&lt;/a&gt; |&#xA;&#x9;&lt;div style=&#34;display: block; float: right;&#34;&gt;&#xA;&#x9;| &lt;a href=&#34;https://git.riedstra.dev/&#34;&gt;Git&lt;/a&gt; |&#xA;&#x9;&#xA;&#x9;&lt;/div&gt;&#xA;&lt;/nav&gt;&#xA;&#xA;&#xA;&#xA;&lt;p&gt;&lt;code&gt;Saturday January 7 2023&lt;/code&gt;&lt;/p&gt;&#xA;&lt;h1&gt;Why Software Engineers don&#39;t avoid Complexity&lt;/h1&gt;&#xA;&lt;p&gt;Most engineering disciplines there&#39;s a very solid understanding of complexity,&#xA;how to manage it, when to reduce it. Enumeration of variables and reducing the&#xA;state of things you have to worry about.&lt;/p&gt;&#xA;&lt;p&gt;Automotive technicians do this kind of thing all the time, whether they realize&#xA;it consciously or not. When troubleshooting they&#39;ll go down the list of&#xA;variables to check, from most likely, to least. That way reducing the set of&#xA;potential problems. Often, though not always, this leads to an obvious solution.&lt;/p&gt;&#xA;&lt;p&gt;Software engineering is a bit different, we have complicated, esoteric&#xA;monstrosities all over the place. Perhaps, the most obvious is the whole stack&#xA;of web technologies. Every browser, by design slurps down code from wherever&#xA;you browse the internet and then executes it on &lt;em&gt;your computer&lt;/em&gt; -- that is&#xA;unless you&#39;ve explicitly configured your browser not to do so. Making matters&#xA;worse, it&#39;s layered upon HTML--which, is hostile to eyes and computers, much&#xA;like XML. HTML also sucks at its job too, so now we have CSS and the&#xA;&lt;code&gt;&amp;lt;center&amp;gt;&amp;lt;/center&amp;gt;&lt;/code&gt; HTML tag... does what now? No, no, it&#39;s real easy,&#xA;&lt;code&gt;margin: 0px auto;&lt;/code&gt; or something.&lt;/p&gt;&#xA;&lt;p&gt;I won&#39;t belabor the point about software being unnecessarily complex for no&#xA;reason, others before me have already spent a lot of time on that topic.&lt;/p&gt;&#xA;&lt;p&gt;The question here is why does it exist? Why isn&#39;t simplicity prioritized?&lt;/p&gt;&#xA;&lt;p&gt;It comes down to incentives for all parties at play, let&#39;s enumerate a few:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Customers demand features, management and engineering are downstream of that&lt;/li&gt;&#xA;&lt;li&gt;Management doesn&#39;t see or understand engineering&#39;s code&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Management doesn&#39;t see code as a liability&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Customers likewise, don&#39;t see or understand an engineer&#39;s code&lt;/li&gt;&#xA;&lt;li&gt;Engineers often prefer what&#39;s familiar and feature-filled&lt;/li&gt;&#xA;&lt;li&gt;Very little incentive to remove unused code&lt;/li&gt;&#xA;&lt;li&gt;Very little incentive to complete tasks more efficiently&lt;/li&gt;&#xA;&lt;li&gt;Very little incentive to make software that&#39;s usable in 30+ years&lt;/li&gt;&#xA;&lt;li&gt;Bravado, in understanding the complexity&lt;/li&gt;&#xA;&lt;li&gt;Complexity may be seen (by some) as a kind of job security&lt;/li&gt;&#xA;&lt;li&gt;Consistent emphasis on the short term outlook from all involved&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;All of these incentives are indeed fixable.&lt;/p&gt;&#xA;&lt;p&gt;Many of them you can fix by being the engineer who asks questions, makes&#xA;suggestions and approves only of simplicity.&lt;/p&gt;&#xA;&lt;p&gt;Some of the others are a broader reflection of where we are at in society,&#xA;though that&#39;s not to say you cannot move the needle a bit.&lt;/p&gt;&#xA;&#xA;&#xA;&lt;/body&gt;&#xA;&#xA;</content>
  </entry>
  <entry>
    <id>Rootless Podman on Alpine Linux::1672961400</id>
    <title>Rootless Podman on Alpine Linux</title>
    <updated>2023-01-05T18:30:00-05:00</updated>
    <link href="https://riedstra.dev/2022/12/alpine-podman"></link>
    <content type="html">&#xA;&lt;!DOCTYPE html&gt;&#xA;&lt;html lang=&#34;en&#34;&gt;&#xA;&lt;head&gt;&#xA;  &lt;meta charset=&#34;UTF-8&#34;&gt;&#xA;&#xA;  &lt;link id=&#34;maincss&#34; rel=&#34;stylesheet&#34; href=&#34;/static/style.css&#34; defer&gt;&#xA;  &lt;link id=&#34;fontcss&#34; rel=&#34;stylesheet&#34; href=&#34;/static/fonts/fonts.css&#34; defer&gt;&#xA;&#xA;  &#xA;    &lt;meta name=&#34;author&#34; content=&#34;Mitchell Riedstra&#34;&gt;&#xA;  &#xA;&#xA;  &#xA;    &lt;title&gt;Rootless Podman on Alpine Linux&lt;/title&gt;&#xA;  &#xA;  &#xA;  &#xA;    &lt;meta name=&#34;description&#34; content=&#34;Setting up rootless podman on Alpine Linux.&#34;&gt;&#xA;  &#xA;&#xA;  &lt;meta name=&#34;viewport&#34; content=&#34;width=device-width, initial-scale=1.0&#34;&gt;&#xA;  &lt;meta name=&#34;theme-color&#34; media=&#34;(prefers-color-scheme: light)&#34; content=&#34;white&#34; /&gt;&#xA;  &lt;meta name=&#34;theme-color&#34; media=&#34;(prefers-color-scheme: dark)&#34; content=&#34;black&#34; /&gt;&#xA;&#xA;  &lt;link rel=&#34;apple-touch-icon&#34; sizes=&#34;180x180&#34; href=&#34;/static/apple-touch-icon.png&#34;&gt;&#xA;  &lt;link rel=&#34;icon&#34; type=&#34;image/png&#34; sizes=&#34;32x32&#34; href=&#34;/static/favicon-32x32.png&#34;&gt;&#xA;  &lt;link rel=&#34;icon&#34; type=&#34;image/png&#34; sizes=&#34;16x16&#34; href=&#34;/static/favicon-16x16.png&#34;&gt;&#xA;  &lt;link rel=&#34;manifest&#34; href=&#34;/static/site.webmanifest&#34;&gt;&#xA;&#xA;  &#xA;  &#xA;&lt;/head&gt;&#xA;&lt;body&gt;&#xA;&#xA;&#xA;&#xA;&#xA;&lt;nav&gt;&#xA;&#x9;| &lt;a href=&#34;/&#34;&gt;Home&lt;/a&gt; |&#xA;&#x9;&lt;div style=&#34;display: block; float: right;&#34;&gt;&#xA;&#x9;| &lt;a href=&#34;https://git.riedstra.dev/&#34;&gt;Git&lt;/a&gt; |&#xA;&#x9;&#xA;&#x9;&lt;/div&gt;&#xA;&lt;/nav&gt;&#xA;&#xA;&#xA;&#xA;&lt;p&gt;&lt;code&gt;Thursday January 5 2023&lt;/code&gt;&lt;/p&gt;&#xA;&lt;h1&gt;Rootless Podman on Alpine Linux&lt;/h1&gt;&#xA;&lt;p&gt;While it doesn&#39;t work out of the box, setup is failry straightforward:&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;# apk add podman buildah&#xA;# rc-update add cgroups default&#xA;# /etc/init.d/cgroups start&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Then run this script to setup the sbustitute UID and GIDs:&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;#!/bin/sh&#xA;set -e&#xA;# Order of users is important, changing it later can cause headaches&#xA;_users=&amp;quot;bob&#xA;sally&#xA;mitch&amp;quot;&#xA;&#xA;IFS=&#39;&#xA;&#39;&#xA;&#xA;printf &amp;quot;&amp;quot; &amp;gt; /etc/subuid&#xA;printf &amp;quot;&amp;quot; &amp;gt; /etc/subgid&#xA;&#xA;uids=65537&#xA;&#xA;n=1&#xA;for _user in $_users ; do&#xA;&#xA;echo &amp;quot;$_user:$(( ( n * uids ) + 1 )):$(( ( n * uids ) + uids ))&amp;quot; \&#xA;| tee -a /etc/subgid &amp;gt;&amp;gt; /etc/subuid&#xA;&#xA;n=$((n+1))&#xA;&#xA;done&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Replacing the &lt;code&gt;_users&lt;/code&gt; variable with users of your own users, of course.&lt;/p&gt;&#xA;&lt;p&gt;You could also reduce &lt;code&gt;uids&lt;/code&gt;, if you want less user IDs to be allocated for each&#xA;user.&lt;/p&gt;&#xA;&lt;p&gt;UIDs are 32 bit integers on Linux these days, you have as many UIDs as there&#xA;are IPv4 addresses. ( That is, a bit over four billion )&lt;/p&gt;&#xA;&#xA;&#xA;&lt;/body&gt;&#xA;&#xA;</content>
  </entry>
  <entry>
    <id>Alpine Linux on a Laptop How-To::1672503639</id>
    <title>Alpine Linux on a Laptop How-To</title>
    <updated>2022-12-31T11:20:39-05:00</updated>
    <link href="https://riedstra.dev/2022/12/alpine-laptop-desktop-how-to"></link>
    <content type="html">&#xA;&lt;!DOCTYPE html&gt;&#xA;&lt;html lang=&#34;en&#34;&gt;&#xA;&lt;head&gt;&#xA;  &lt;meta charset=&#34;UTF-8&#34;&gt;&#xA;&#xA;  &lt;link id=&#34;maincss&#34; rel=&#34;stylesheet&#34; href=&#34;/static/style.css&#34; defer&gt;&#xA;  &lt;link id=&#34;fontcss&#34; rel=&#34;stylesheet&#34; href=&#34;/static/fonts/fonts.css&#34; defer&gt;&#xA;&#xA;  &#xA;    &lt;meta name=&#34;author&#34; content=&#34;Mitchell Riedstra&#34;&gt;&#xA;  &#xA;&#xA;  &#xA;    &lt;title&gt;Alpine Linux on a Laptop How-To&lt;/title&gt;&#xA;  &#xA;  &#xA;  &#xA;    &lt;meta name=&#34;description&#34; content=&#34;If you ever wanted a truly minimal Linux laptop/desktop, this is it. A full how-to for using as an everyday desktop.&#34;&gt;&#xA;  &#xA;&#xA;  &lt;meta name=&#34;viewport&#34; content=&#34;width=device-width, initial-scale=1.0&#34;&gt;&#xA;  &lt;meta name=&#34;theme-color&#34; media=&#34;(prefers-color-scheme: light)&#34; content=&#34;white&#34; /&gt;&#xA;  &lt;meta name=&#34;theme-color&#34; media=&#34;(prefers-color-scheme: dark)&#34; content=&#34;black&#34; /&gt;&#xA;&#xA;  &lt;link rel=&#34;apple-touch-icon&#34; sizes=&#34;180x180&#34; href=&#34;/static/apple-touch-icon.png&#34;&gt;&#xA;  &lt;link rel=&#34;icon&#34; type=&#34;image/png&#34; sizes=&#34;32x32&#34; href=&#34;/static/favicon-32x32.png&#34;&gt;&#xA;  &lt;link rel=&#34;icon&#34; type=&#34;image/png&#34; sizes=&#34;16x16&#34; href=&#34;/static/favicon-16x16.png&#34;&gt;&#xA;  &lt;link rel=&#34;manifest&#34; href=&#34;/static/site.webmanifest&#34;&gt;&#xA;&#xA;  &#xA;  &#xA;&lt;/head&gt;&#xA;&lt;body&gt;&#xA;&#xA;&#xA;&#xA;&#xA;&lt;nav&gt;&#xA;&#x9;| &lt;a href=&#34;/&#34;&gt;Home&lt;/a&gt; |&#xA;&#x9;&lt;div style=&#34;display: block; float: right;&#34;&gt;&#xA;&#x9;| &lt;a href=&#34;https://git.riedstra.dev/&#34;&gt;Git&lt;/a&gt; |&#xA;&#x9;&#xA;&#x9;&lt;/div&gt;&#xA;&lt;/nav&gt;&#xA;&#xA;&#xA;&#xA;&lt;h1&gt;Alpine Linux on a Laptop How-To&lt;/h1&gt;&#xA;&lt;p&gt;A few notes before we get started, we&#39;re going to partition and install by-hand&#xA;with minimal help from the installer. This is so you can easily have Alpine&#xA;co-exist with other operating systems on the same disk, so as long as you have&#xA;another &lt;code&gt;ef00&lt;/code&gt; and &lt;code&gt;8e00&lt;/code&gt; partition for it to reside. We won&#39;t be using any&#xA;bootloader tools either, just the kernel&#39;s built in EFI stub and &lt;code&gt;efibootmgr&lt;/code&gt; to&#xA;tell the UEFI where to look.&lt;/p&gt;&#xA;&lt;p&gt;Once your done with the main sections you should have an Xfce desktop, from&#xA;there you can pick and choose the other pieces, if any, that you want.&lt;/p&gt;&#xA;&lt;h3&gt;Boot into the Alpine Linux ISO:&lt;/h3&gt;&#xA;&lt;p&gt;You will probably want to start form the extended image, though this method&#xA;works just fine from the standard image as well.&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;# setup-interfaces&#xA;# /etc/init.d/networking start&#xA;# setup-apkrepos&#xA;# apk add cryptsetup lvm2 gptfdisk xfsprogs btrfs-progs efibootmgr&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;h3&gt;Now let&#39;s partition the disk:&lt;/h3&gt;&#xA;&lt;pre&gt;&lt;code&gt;# gdisk /dev/&amp;lt;device&amp;gt;&#xA;Command (? for help): n&#xA;Partition number (1-128, default 1): &#xA;First sector : 2048&#xA;Last sector : +500M&#xA;Current type is 8300 (Linux filesystem)&#xA;Hex code or GUID (L to show codes, Enter = 8300): ef00&#xA;Changed type of partition to &#39;EFI system partition&#39;&#xA;&#xA;Command (? for help): n&#xA;Partition number (2-128, default 2): &#xA;First sector :  &amp;lt;hit enter&amp;gt;&#xA;Last sector  :  &amp;lt;hit enter&amp;gt;&#xA;Current type is 8300 (Linux filesystem)&#xA;Hex code or GUID (L to show codes, Enter = 8300): 8e00&#xA;Changed type of partition to &#39;Linux LVM&#39;&#xA;Command (? for help): w&#xA;&#xA;Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING&#xA;PARTITIONS!!&#xA;&#xA;Do you want to proceed? (Y/N): y&#xA;OK; writing new GUID partition table (GPT) to /dev/&amp;lt;device&amp;gt;.&#xA;The operation has completed successfully.&#xA;# &#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Where &lt;code&gt;&amp;lt;device&amp;gt;&lt;/code&gt; is probably &lt;code&gt;sda&lt;/code&gt; or &lt;code&gt;nvme0n1&lt;/code&gt;, but double check. Instead&#xA;of &lt;code&gt;+500M&lt;/code&gt; for the uEFI partition, you could also do 1, or 2gb even if you&#39;re&#xA;going to be sharing &lt;code&gt;/boot&lt;/code&gt; with multiple operating systems.&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;# cryptsetup luksFormat /dev/&amp;lt;device&amp;gt; &#xA;&#xA;WARNING!&#xA;========&#xA;This will overwrite data on /dev/&amp;lt;device&amp;gt; irrevocably.&#xA;&#xA;Are you sure? (Type &#39;yes&#39; in capital letters): YES&#xA;Enter passphrase for /dev/&amp;lt;device&amp;gt;: &#xA;Verify passphrase: &#xA;# &#xA;# cryptsetup luksOpen /dev/&amp;lt;device&amp;gt; crypt&#xA;Enter passphrase for /dev/&amp;lt;device&amp;gt;: &#xA;# lvm pvcreate /dev/mapper/crypt&#xA;  Physical volume &amp;quot;/dev/mapper/crypt&amp;quot; successfully created.&#xA;# lvm vgcreate vg /dev/mapper/crypt&#xA;  Volume group &amp;quot;vg&amp;quot; successfully created&#xA;# lvm lvcreate vg --name root --size=&amp;lt;size&amp;gt;&#xA;  Logical volume &amp;quot;root&amp;quot; created.&#xA;# lvm lvcreate vg --name home --size=&amp;lt;size&amp;gt;&#xA;  Logical volume &amp;quot;home&amp;quot; created.&#xA;# mkfs.xfs /dev/vg/root&#xA;# mkfs.xfs /dev/vg/home&#xA;# mkfs.vfat -f32 /dev/&amp;lt;device&amp;gt;1&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;I&#39;ve used &lt;code&gt;xfs&lt;/code&gt; above, you can use &lt;code&gt;ext4&lt;/code&gt; or &lt;code&gt;btrfs&lt;/code&gt; as well.&lt;/p&gt;&#xA;&lt;h3&gt;Mount the filesystems and install&lt;/h3&gt;&#xA;&lt;pre&gt;&lt;code&gt;# modprobe xfs&#xA;# mount /dev/vg/root /mnt&#xA;# mkdir /mnt/boot /mnt/home&#xA;# modprobe vfat&#xA;# mount /dev/&amp;lt;device&amp;gt;1 /mnt/boot&#xA;# mkdir -p /mnt/etc/apk&#xA;# cp -a /etc/apk/keys /mnt/etc/apk/&#xA;# cp /etc/apk/repositories /mnt/etc/apk/&#xA;# apk -p /mnt --initdb -U add $(cat /etc/apk/world)&#xA;# cp /etc/resolv.conf /mnt/etc/&#xA;# cd /mnt&#xA;# mount -o bind --rbind /dev dev&#xA;# mount -o bind --rbind /sys sys&#xA;# mount -t proc none proc&#xA;# chroot . /bin/ash&#xA;# export PS1=&amp;quot;(CHROOT)# &amp;quot;&#xA;(CHROOT)# apk add linux-lts tzdata&#xA;(CHROOT)# apk add wpa_supplicant # If you need wifi&#xA;(CHROOT)# grep -E &#39;xfs|vfat|btrfs|ext4&#39; /proc/mounts &amp;gt;&amp;gt; /etc/fstab&#xA;(CHROOT)# echo none /tmp tmpfs rw,defaults 0 0 &amp;gt;&amp;gt; /etc/fstab&#xA;(CHROOT)# echo &#39;&#xA;auto lo&#xA;iface lo inet loopback&#39; &amp;gt; /etc/network/interfaces&#xA;(CHROOT)# setup-sshd&#xA;(CHROOT)# setup-ntp&#xA;(CHROOT)# for svc in devfs dmesg hwdrivers mdev ; do rc-update add $svc sysinit ; done&#xA;(CHROOT)# for svc in bootmisc hostname hwclock lvm modules networking \&#xA;              seedrng swap sysctl syslog ; do rc-update add $svc boot ; done&#xA;(CHROOT)# for svc in acpid crond klogd local ; do rc-update add $svc default ; done&#xA;(CHROOT)# sed -i.bak -e&#39;s/ext4/ext4 xfs btrfs lvm cryptsetup/&#39; \&#xA;            /etc/mkinitfs/mkinitfs.conf&#xA;(CHROOT) # mkinitfs $(ls -t /lib/modules | sed 1q) # Note if `ls` is aliased, use `command ls` to avoid a trailing slash&#xA;(CHROOT) # efibootmgr -c -p 1 -d /dev/&amp;lt;device&amp;gt;1 -L Alpine -l /vmlinuz-lts \&#xA;-u &#39;initrd=/initramfs-lts cryptroot=/dev/&amp;lt;device&amp;gt;2 cryptdm=crypt root=/dev/vg/root rootfstype=xfs rootflags=rw&#39; \&#xA;(CHROOT) # passwd&#xA;(CHROOT) # echo &amp;quot;myname&amp;quot; &amp;gt; /etc/hostname&#xA;(CHROOT) # exit&#xA;# sync &amp;amp;&amp;amp; reboot&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;You may wish to replace &lt;code&gt;cryptroot=/dev/&amp;lt;device&amp;gt;2&lt;/code&gt; with&#xA;&lt;code&gt;cryptroot=/dev/disk/by-uuid/&amp;lt;uuid&amp;gt;&lt;/code&gt; for that particular partition.&lt;/p&gt;&#xA;&lt;p&gt;Now, if all goes well, you should be able to reboot into your new Alpine Linux&#xA;system.&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;# ln -s /usr/share/zoneinfo/America/New_York /etc/localtime&#xA;# adduser &amp;lt;username&amp;gt;&#xA;# adduser &amp;lt;username&amp;gt; wheel&#xA;# apk add doas&#xA;# echo &amp;quot;permit :wheel as root&amp;quot; &amp;gt;&amp;gt; /etc/doas.d/wheel.conf&#xA;# setup-xorg-base&#xA;# apk add xfce4 lightdm lightdm-gtk-greeter dbus xfce4-terminal \&#xA;&#x9;xfce4-screensaver firefox openssh git gpg gnupg-scdaemon libfido2 \&#xA;&#x9;openssh-sk-helper pcsc-lite fido2 pulseaudio pulseaudio-alsa \&#xA;    alsa-plugins-pulse pavucontrol pinentry-gnome&#xA;# adduser &amp;lt;username&amp;gt; plugdev&#xA;# adduser &amp;lt;username&amp;gt; gnupg&#xA;# adduser &amp;lt;username&amp;gt; audio&#xA;# adduser &amp;lt;username&amp;gt; pulse-access&#xA;# addgroup autologin&#xA;# adduser &amp;lt;username&amp;gt; autologin&#xA;# sed -i.bak &#39;s/^#autologin-user=.*/autologin-user=&amp;lt;username&amp;gt;/&#39; /etc/lightdm/lightdm.conf&#xA;# /etc/init.d/lightdm start&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Now, if all has gone well you should be greeted with a login screen. Once&#xA;you&#39;ve logged in the first time, subsequent starts of &lt;code&gt;lightdm&lt;/code&gt; will have you&#xA;automatically logged in. ( Which is fine, considering we have an encrypted root&#xA;)&lt;/p&gt;&#xA;&lt;p&gt;From the terminal you can now have the login manager start on boot:&lt;/p&gt;&#xA;&lt;p&gt;Congrats, you can stop here if you&#39;d like.&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ doas rc-update add lightdm default&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;h2&gt;(Optional) Switching to the &lt;code&gt;dwm&lt;/code&gt; window manager&lt;/h2&gt;&#xA;&lt;p&gt;There are a &lt;em&gt;lot&lt;/em&gt; of tutorials on &lt;a href=&#34;https://dwm.suckless.org/&#34;&gt;&lt;code&gt;dwm&lt;/code&gt;&lt;/a&gt; out there,&#xA;I&#39;m not to make one here, just to simply outline how I compile and set it up&#xA;on Alpine Linux ( and, the process is very similar on most linux distros )&lt;/p&gt;&#xA;&lt;p&gt;First let&#39;s install the required packages:&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ doas apk add build-base xorg-server-dev libxft-dev libxinerama-dev libxrandr-dev&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;The easiest way to retain automatic login and all of that is to simply&#xA;add a session to lightdm:&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ git clone https://git.riedstra.dev/x/session&#xA;$ cd session&#xA;$ make install&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Now you have a custom session that can execute your &lt;code&gt;~/.xinitrc&lt;/code&gt; on login,&#xA;just as if you used &lt;code&gt;startx&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;A basic &lt;code&gt;~/.xinitrc&lt;/code&gt; example:&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ echo &#39;#!/bin/sh&#xA;# If you&#39;d like, you can source other files here.&#xA;# . ~/.kshrc&#xA;# Useful if you&#39;re running oksh&#xA;# export ENV=$HOME/.kshrc&#xA;$(eval ssh-agent)&#xA;# See https://git.riedstra.dev/x/dmenu for the patch and script&#xA;export SSH_ASKPASS=dmenu_askpass&#xA;# Add SSH keys if you&#39;d like.&#xA;# ssh-add ~/.ssh/keys/&amp;lt;key&amp;gt;&#xA;# Optional, compositor. You&#39;ll have to install it yourself&#xA;picom --config /dev/null &amp;amp;&#xA;# Start a program to update the status bar, I just use a short shell&#xA;# script with `xsetroot`&#xA;status-bar &amp;amp;&#xA;# You can use `feh` directly or similar. This is just a shell script that&#xA;# sets the wallpaper every 15 seconds, so when I change screen resolutions it&#xA;# goes back to normal.&#xA;wallpaper ~/.wallpaper.jpg &amp;amp;&#xA;# If you want to inherit xfce settings&#xA;# xfsettingsd &amp;amp;&#xA;# Alternatively you can set the gtk themes and such directly.&#xA;# Finally, do not forget that all of the commands above either need to finish&#xA;# or fork to the background (`&amp;amp;`) otherwise we don&#39;t get here and it appears&#xA;# that your login &amp;quot;hangs&amp;quot;&#xA;exec dwm&#39; &amp;gt; ~/.xinitrc&#xA;$ chmod +x ~/.xinitrc&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Finally, fetch and make dwm:&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ git clone https://git.suckless.org/dwm&#xA;$ cd dwm&#xA;$ doas make clean install&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;If you&#39;d like my version of &lt;code&gt;dmenu&lt;/code&gt; which includes &lt;code&gt;dmenu_askpass&lt;/code&gt; for SSH keys:&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ git clone https://git.riedstra.dev/x/dmenu&#xA;$ cd dmenu&#xA;$ doas make clean install&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Now you should be able logout, and login under the &lt;code&gt;custom&lt;/code&gt; session and&#xA;be greeted with dwm.&lt;/p&gt;&#xA;&lt;p&gt;Some additional packages you may like to add:&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ doas apk add slock xsetroot lm-sensors feh slock st # dmenu, if you didn&#39;t install mine&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;h2&gt;(Optional) System suspend without pm-utils and root/sudo/doas&lt;/h2&gt;&#xA;&lt;p&gt;If you want to be able to quickly suspend, say from &lt;code&gt;dmenu&lt;/code&gt; I have a useful&#xA;c shim for that:&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ doas apk add build-base&#xA;$ cd $(mktemp -d)&#xA;$ curl https://git.riedstra.dev/mitch/dotfiles/plain/bin/zzz.c &amp;gt; zzz.c&#xA;$ # This may be where you wish to read the file you just downloaded :-)&#xA;$ cc -o zzz zzz.c&#xA;$ export dest=/sbin/zzz&#xA;$ doas sh -c &amp;quot;cp zzz $dest &amp;amp;&amp;amp; chown root:wheel $dest &amp;amp;&amp;amp; chmod 6750 $dest&amp;quot;&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Once you&#39;re done, &lt;code&gt;zzz&lt;/code&gt; should work to suspend the system for any user&#xA;in the &lt;code&gt;wheel&lt;/code&gt; group&lt;/p&gt;&#xA;&lt;p&gt;If you&#39;re interested, you could also clone down the entire &lt;a href=&#34;https://git.riedstra.dev/mitch/dotfiles&#34;&gt;git repo&lt;/a&gt; and use the makefile in &lt;code&gt;bin/&lt;/code&gt;&lt;/p&gt;&#xA;&lt;h2&gt;(Optional) Backlight control without root/sudo/doas&lt;/h2&gt;&#xA;&lt;p&gt;In a similar vein to the &lt;code&gt;zzz&lt;/code&gt; program:&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ doas apk add build-base&#xA;$ cd $(mktemp -d)&#xA;$ curl https://git.riedstra.dev/mitch/dotfiles/plain/bin/backlight.c &amp;gt; backlight.c&#xA;$ # This may be where you wish to read the file you just downloaded :-)&#xA;$ cc -o backlight backlight.c&#xA;$ export dest=/sbin/backlight&#xA;$ doas sh -c &amp;quot;cp backlight $dest &amp;amp;&amp;amp; chown root:wheel $dest &amp;amp;&amp;amp; chmod 6750 $dest&amp;quot;&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Once you&#39;re done, &lt;code&gt;backlight &amp;lt;percentage&amp;gt;&lt;/code&gt; should work to adjsut brightness for&#xA;any user in the &lt;code&gt;wheel&lt;/code&gt; group.&lt;/p&gt;&#xA;&lt;p&gt;It simply tries to deciver backlights in &lt;code&gt;/sys/class/backlight&lt;/code&gt;, out of&#xA;the box this should work on most intel and amd systems.&lt;/p&gt;&#xA;&lt;p&gt;If you&#39;re interested, you could also clone down the entire &lt;a href=&#34;https://git.riedstra.dev/mitch/dotfiles&#34;&gt;git repo&lt;/a&gt; and use the makefile in &lt;code&gt;bin/&lt;/code&gt;&lt;/p&gt;&#xA;&lt;h2&gt;(Optional) Bluetooth&lt;/h2&gt;&#xA;&lt;pre&gt;&lt;code&gt;# apk add bluez bluez-alsa&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;pre&gt;&lt;code&gt;# rc-update add bluetooth default&#xA;# /etc/init.d/bluetooth start&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;From there interacting with bluetooth is pretty straightforward:&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;# bluetoothctl&#xA;[bluetooth]# scan on&#xA;[bluetooth]# pair &amp;lt;MACADDR&amp;gt;&#xA;[bluetooth]# connect &amp;lt;MACADDR&amp;gt;&#xA;[bluetooth]# scan off&#xA;[bluetooth]# &amp;lt;c-d&amp;gt;&#xA;#&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Optionally you can also issue a &lt;code&gt;trust &amp;lt;MACADDR&amp;gt;&lt;/code&gt;, useful for keyboards&#xA;and such.&lt;/p&gt;&#xA;&lt;p&gt;Bluetooth audio should work out of the box.&lt;/p&gt;&#xA;&lt;h2&gt;(Optional) Enable Network Manager&lt;/h2&gt;&#xA;&lt;p&gt;From just about any point in our install process you can install NetworkManager&#xA;if you&#39;re having troubple with manual network configuration&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;# apk add networkmanager networkmanager-tui&#xA;# setup-devd udev&#xA;# /etc/init.d/networking stop&#xA;# /etc/init.d/networkmanager start&#xA;# nmtui&#xA;# rc-update del networking boot&#xA;# rc-update add networkmanager boot&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;h2&gt;(Optional) Disable SSH&lt;/h2&gt;&#xA;&lt;p&gt;If you&#39;re not going to be logging into your system remotely, you might&#xA;as well disable the SSH service.&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;# rc-update del sshd default&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;h2&gt;(Optional) Setup WiFi with &lt;code&gt;wpa_supplicant&lt;/code&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Create a configuration file:&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;network={&#xA;&#x9;ssid=&amp;quot;&amp;lt;your network name&amp;gt;&amp;quot;&#xA;&#x9;scan_ssid=1&#xA;&#x9;key_mgmt=WPA-PSK&#xA;&#x9;psk=&amp;quot;&amp;lt;your network password&amp;gt;&amp;quot;&#xA;}&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Then run:&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;# wpa_supplicant -i wlan0 -c /path/to/conf &amp;amp;&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;That should spit out a few messages, and return you to your terminal.&lt;/p&gt;&#xA;&lt;p&gt;From there, get a DHCP lease:&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;# udhcpc -i wlan0&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Now you should be hooked up to the wifi by-hand for now.&lt;/p&gt;&#xA;&#xA;&#xA;&lt;/body&gt;&#xA;&#xA;</content>
  </entry>
  <entry>
    <id>Selling out your future to ease the moment::1672360200</id>
    <title>Selling out your future to ease the moment</title>
    <updated>2022-12-29T19:30:00-05:00</updated>
    <link href="https://riedstra.dev/2022/12/selling-out-your-future"></link>
    <content type="html">&#xA;&lt;!DOCTYPE html&gt;&#xA;&lt;html lang=&#34;en&#34;&gt;&#xA;&lt;head&gt;&#xA;  &lt;meta charset=&#34;UTF-8&#34;&gt;&#xA;&#xA;  &lt;link id=&#34;maincss&#34; rel=&#34;stylesheet&#34; href=&#34;/static/style.css&#34; defer&gt;&#xA;  &lt;link id=&#34;fontcss&#34; rel=&#34;stylesheet&#34; href=&#34;/static/fonts/fonts.css&#34; defer&gt;&#xA;&#xA;  &#xA;    &lt;meta name=&#34;author&#34; content=&#34;Mitchell Riedstra&#34;&gt;&#xA;  &#xA;&#xA;  &#xA;    &lt;title&gt;Selling out your future to ease the moment&lt;/title&gt;&#xA;  &#xA;  &#xA;  &#xA;    &lt;meta name=&#34;description&#34; content=&#34;How smashing your problem with the proverbial hammer sours you like milk and handicaps your future.&#34;&gt;&#xA;  &#xA;&#xA;  &lt;meta name=&#34;viewport&#34; content=&#34;width=device-width, initial-scale=1.0&#34;&gt;&#xA;  &lt;meta name=&#34;theme-color&#34; media=&#34;(prefers-color-scheme: light)&#34; content=&#34;white&#34; /&gt;&#xA;  &lt;meta name=&#34;theme-color&#34; media=&#34;(prefers-color-scheme: dark)&#34; content=&#34;black&#34; /&gt;&#xA;&#xA;  &lt;link rel=&#34;apple-touch-icon&#34; sizes=&#34;180x180&#34; href=&#34;/static/apple-touch-icon.png&#34;&gt;&#xA;  &lt;link rel=&#34;icon&#34; type=&#34;image/png&#34; sizes=&#34;32x32&#34; href=&#34;/static/favicon-32x32.png&#34;&gt;&#xA;  &lt;link rel=&#34;icon&#34; type=&#34;image/png&#34; sizes=&#34;16x16&#34; href=&#34;/static/favicon-16x16.png&#34;&gt;&#xA;  &lt;link rel=&#34;manifest&#34; href=&#34;/static/site.webmanifest&#34;&gt;&#xA;&#xA;  &#xA;  &#xA;&lt;/head&gt;&#xA;&lt;body&gt;&#xA;&#xA;&#xA;&#xA;&#xA;&lt;nav&gt;&#xA;&#x9;| &lt;a href=&#34;/&#34;&gt;Home&lt;/a&gt; |&#xA;&#x9;&lt;div style=&#34;display: block; float: right;&#34;&gt;&#xA;&#x9;| &lt;a href=&#34;https://git.riedstra.dev/&#34;&gt;Git&lt;/a&gt; |&#xA;&#x9;&#xA;&#x9;&lt;/div&gt;&#xA;&lt;/nav&gt;&#xA;&#xA;&#xA;&#xA;&lt;p&gt;&lt;code&gt;Thursday December 29 2022&lt;/code&gt;&lt;/p&gt;&#xA;&lt;h1&gt;Selling out your future to ease the moment&lt;/h1&gt;&#xA;&lt;p&gt;This concept applies to so many aspects of our lives. Debt is the classic&#xA;example. I won&#39;t be covering that one here.&lt;/p&gt;&#xA;&lt;p&gt;The technical aspect is a lot more subtle -- we all deal with these kinds of&#xA;problems, and we only have so much time in the day -- so we tell ourselves that&#xA;we&#39;re going to simply do what is expedient rather than what is correct. Perhaps&#xA;even, not to figure out what was wrong in the first place.&lt;/p&gt;&#xA;&lt;p&gt;Over the past couple of months helping several people take on learning how&#xA;to write code, running Linux, or networks the same pattern has come up.&lt;/p&gt;&#xA;&lt;p&gt;Let&#39;s take a common example for people starting out with Linux. Dual booting --&#xA;something fraught with issues -- or at least that&#39;s what everyone says.&lt;/p&gt;&#xA;&lt;p&gt;A common problem is, Windows, or Linux, for that matter to stop booting one&#xA;operating system, or the other. Why? Well, the causes can be varied. For the&#xA;purposes of exploring the idea at hand, let&#39;s say we don&#39;t care and just&#xA;re-install the OS.&lt;/p&gt;&#xA;&lt;p&gt;What have we said to &lt;em&gt;ourselves&lt;/em&gt; in that process? I don&#39;t know about you, but&#xA;re-installing an operating system is not the first thought I have, even if it&#xA;comes up it certainly isn&#39;t a fun idea for me. I think the same holds true for&#xA;most. You&#39;d much rather just &lt;em&gt;fix the issue at hand&lt;/em&gt;, if possible.&lt;/p&gt;&#xA;&lt;p&gt;If you knew for sure it&#39;d take twenty minutes to fix the issue, I think most&#xA;people would try to fix it. The problem is, as we all know, it&#39;s not likely to&#xA;take twenty minutes. It may even take you twenty &lt;em&gt;hours&lt;/em&gt; the first time. If you&#xA;know that up front, well, many won&#39;t make that time investment.&lt;/p&gt;&#xA;&lt;p&gt;Say that it does indeed take you twenty hours to troubleshoot that boot issue.&#xA;For many people that may be two, three, or even four times more time than it&#39;d&#xA;take to re-install the OS. The choice seems clear at that point -- just re-install&#xA;the OS.&lt;/p&gt;&#xA;&lt;p&gt;The re-install is also a hammer of sorts, it&#39;s really simple, you know it&#39;s&#xA;going to work -- and, you&#39;ve probably done it before.&lt;/p&gt;&#xA;&lt;p&gt;Now, what&#39;s &lt;em&gt;not&lt;/em&gt; clear, is that the future, specifically &lt;em&gt;your&lt;/em&gt; future is not&#xA;taken into account.&lt;/p&gt;&#xA;&lt;p&gt;The odds are that if you encountered an issue in which your system couldn&#39;t boot&#xA;due to configuration you&#39;re likely to encounter that &lt;em&gt;again&lt;/em&gt; if you just&#xA;re-install.&lt;/p&gt;&#xA;&lt;p&gt;What happens in that future where you have already invested in your re-install&#xA;paradigm and your system won&#39;t boot again?&lt;/p&gt;&#xA;&lt;p&gt;For most, this would take the wind out of their sails so-to-speak.&lt;/p&gt;&#xA;&lt;p&gt;I see this too, with people learning a tool like &lt;code&gt;git&lt;/code&gt;, so many would rather&#xA;just delete the repository and clone it back down and re-do their work rather&#xA;than learn how to solve a merge conflict.&lt;/p&gt;&#xA;&lt;p&gt;Again, it might be faster in the moment -- it might only take you 20 minutes to&#xA;copy over your changes or re-write your code by hand.&lt;/p&gt;&#xA;&lt;p&gt;It might take you an hour or two to figure out what a git &lt;code&gt;mergetool&lt;/code&gt; is,&#xA;install &lt;a href=&#34;http://meldmerge.org/&#34;&gt;&lt;code&gt;meld&lt;/code&gt;&lt;/a&gt; ( that is, if you&#39;re not using &lt;code&gt;vimdiff&lt;/code&gt;&#xA;or something ) and figure out how to use it.&lt;/p&gt;&#xA;&lt;p&gt;Still, one sabotages your future, keeping your handicap, while the other invests&#xA;in your future working to absolve you of that limitation.&lt;/p&gt;&#xA;&lt;p&gt;Why do people take this approach to keep their handicaps?&lt;/p&gt;&#xA;&lt;p&gt;Humans in general seem to invest in what has worked in the past -- regardless of&#xA;efficiency or practicality.&lt;/p&gt;&#xA;&lt;p&gt;It takes some serious, conscious, effort to try something new for most. If&#xA;there&#39;s an unknown on the other side of trying that new thing it becomes even&#xA;more difficult to sell.&lt;/p&gt;&#xA;&lt;p&gt;To get abstract for a bit, we also see this throughout history. What&#39;s the&#xA;percentage of the population that was able to change the way we live for the&#xA;better? What&#39;s the percentage of the population that brought us the various&#xA;inventions many of us rely upon on a daily basis? If you don&#39;t already know,&#xA;it&#39;s vanishingly small.&lt;/p&gt;&#xA;&lt;p&gt;Now, I&#39;ll recognize that invention also necessitates intelligence to the right&#xA;tail of the distribution -- but that&#39;s not sufficient. Personality factors need to&#xA;be at play to prevent social pressure from killing anything new, as most wish to&#xA;preserve the status quo.&lt;/p&gt;&#xA;&lt;p&gt;The same pressures at play in one&#39;s own head regarding their approach are&#xA;extrapolated upon others with social pressures.&lt;/p&gt;&#xA;&lt;p&gt;If you consistently try new things, it will make some people mad. They&#39;re&#xA;&lt;em&gt;invested&lt;/em&gt; in the way they&#39;ve done something.&lt;/p&gt;&#xA;&lt;p&gt;Just think about it for a minute, were the whalers happy when Standard Oil et&#xA;al came in with a cheaper product? No, probably not. Regardless, the world is&#xA;better off, a healthier place, and less whales are dead for it, despite their&#xA;disapproval.&lt;/p&gt;&#xA;&lt;p&gt;Far more people possess the pre-requisite intelligence for truly great things&#xA;than are able to apply it to that effect.&lt;/p&gt;&#xA;&lt;p&gt;Now, don&#39;t be your own enemy. Invest in &lt;em&gt;your&lt;/em&gt; future, to hell with the social&#xA;disapproval and delusions about saving time, you have your future to take care&#xA;of.&lt;/p&gt;&#xA;&#xA;&#xA;&lt;/body&gt;&#xA;&#xA;</content>
  </entry>
</feed>