<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[Arraybolt's Archives]]></title><description><![CDATA[Assorted cool tech stuff. Tutorials, articles, reviews, in-depth explanations, and stuff like that.]]></description><link>https://arraybolt3.substack.com</link><image><url>https://substackcdn.com/image/fetch/$s_!U9th!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81afb1c6-f320-42fc-97ab-f1de570fde3a_288x288.png</url><title>Arraybolt&apos;s Archives</title><link>https://arraybolt3.substack.com</link></image><generator>Substack</generator><lastBuildDate>Sun, 08 Mar 2026 15:32:57 GMT</lastBuildDate><atom:link href="https://arraybolt3.substack.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Aaron Rainbolt]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[arraybolt3@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[arraybolt3@substack.com]]></itunes:email><itunes:name><![CDATA[Aaron Rainbolt]]></itunes:name></itunes:owner><itunes:author><![CDATA[Aaron Rainbolt]]></itunes:author><googleplay:owner><![CDATA[arraybolt3@substack.com]]></googleplay:owner><googleplay:email><![CDATA[arraybolt3@substack.com]]></googleplay:email><googleplay:author><![CDATA[Aaron Rainbolt]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Setting up a weird dual-boot DOS workstation]]></title><description><![CDATA[FreeDOS + OpenBSD = comfortable software development rig]]></description><link>https://arraybolt3.substack.com/p/setting-up-a-weird-dual-boot-dos</link><guid isPermaLink="false">https://arraybolt3.substack.com/p/setting-up-a-weird-dual-boot-dos</guid><dc:creator><![CDATA[Aaron Rainbolt]]></dc:creator><pubDate>Sun, 21 Sep 2025 18:04:21 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!U9th!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81afb1c6-f320-42fc-97ab-f1de570fde3a_288x288.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I&#8217;ve been wanting to create some Bible study software for DOS for a while now. Why target DOS? Because it&#8217;s a cool platform, it&#8217;s still in use in some areas of the world, and I haven&#8217;t been able to find readily available Bible software for DOS, whether open-source or not. Over the weekend, I was thinking about this project again, and decided that, for the sake of development ease and avoiding emulator quirks, I should set up a DOS installation on physical hardware and create the software on that machine.</p><p>I have tons of old computers in varying states of decay or usefulness; three of them still work pretty well. I decided to pick the weakest of the three for this project since it probably had more than enough grunt for the project at hand, but wouldn&#8217;t be useful for much else. The chosen system was a Compaq Presario 6000 desktop, featuring some iteration of an AMD Athlon XP processor, 256 MB RAM, a 20 GB hard drive (which I was about to expand for reasons I&#8217;ll get into later), a floppy drive, and dual optical drives (only one of which works). This particular system is a bit strange since its USB controller and network card are both NVIDIA hardware, even though NVIDIA is typically associated with graphics cards. Beyond that though, the system was pretty typical for the kind of hardware you&#8217;d see in the early 2000s - all of the drives use IDE to communicate with the motherboard, and most of the expansion slots are PCI (except for a couple of mystery slots, one of them <em>might</em> be AGP, and another one seems to be intentionally blocked off and I can&#8217;t tell what it is). The back panel features PS/2 ports for a mouse and keyboard, a parallel port and a serial port, a VGA port for the monitor, and a few USB (probably USB 2) ports. There was also a 3Com network card installed in one of the slots, which I had put there when experimenting with OpenBSD on this system. The front panel had a couple more USB ports.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://arraybolt3.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Arraybolt's Archives! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>One downside of using DOS for development is a lack of good source code versioning systems. Git doesn&#8217;t exist for DOS, and I don&#8217;t have the time or willingness to learn RCS or similar (maybe I should?), so I decided I would implement version control by just copying the project every so often to a backup location, probably zipping it in the process. Anticipating that this would probably require a hefty chunk of disk space, I decided to add a 40 GB Maxtor drive taken from a Pentium 4 desktop I had laying around. Getting the drive installed was a bit of a challenge; many older computers have the drives slide out backwards into the system, but this Compaq has them slide out <em>forward</em> out the front of the machine. This meant I had to get the front panel off of the machine, which was hard because it was held on by four extremely stiff plastic latches that had to all be disengaged at the same time. Thankfully the plastic of the front panel was able to bend enough that I could disengage each latch individually, then keep it that way while I worked on another latch.</p><p>After getting the cover off, I had to fight with Compaq&#8217;s drive mounting hardware. Rather than just screwing the drives directly into the bay like a normal computer would, Compaq elected to use a system of rails and latches to keep the drives fully hooked into the machine. The screws had very thick heads, and were intended to slide along the rails and then latch in place once inserted far enough. As strange as this already was, there was also the problem that the secondary drive bay had a malformed rail, that was just <em>barely</em> too narrow for the mounting screws to actually slide in. There were also separate screw types for the optical drives and the hard drives. What I ended up doing was using optical drive screws on the Maxtor hard drive, which seemed to fit correctly and were able to latch in place. After getting this kludgy setup to work, I then remembered that I needed to set jumpers on the drives to configure them as &#8220;master&#8221; and &#8220;slave&#8221; properly, so I then took both drives out, reconfigured the jumpers, and slid them back in. After a bit of cable routing shenanigans (including removing a rather unfortunately located zip tie), I finally had both drives installed.</p><p>To confirm that I hadn&#8217;t made a total mess of my drive configuration, I decided to take some time to power the system on and check the BIOS. I had an old PS/2 Microsoft keyboard, and a small, 4:3 aspect ratio flatscreen display with a built-in VGA cable, so I decided to use those for the project. Nothing caught fire when I plugged it in and powered it on, and after getting into the BIOS settings I found that both drives appeared to be properly recognized. I also saw &#8220;Removable Media Boot&#8221;, which made me hopeful that this machine might support USB boot. I turned off a bunch of settings related to &#8220;fast startup&#8221; to minimize the chances of having issues, then saved my changes and exited.</p><p>Since I thought USB boot might work, I downloaded the FreeDOS 1.4 FullUSB and flashed it to a USB drive. Unfortunately, my hopes were soon dashed; the USB drive did not appear in the BIOS&#8217;s boot order settings. Crud.</p><p>I don&#8217;t generally like burning CD-Rs if I don&#8217;t have to, since they can&#8217;t be rewritten, they probably won&#8217;t keep being manufactured for much longer, and I only had 48 of my original stack of 50 left (oh horror!), but I didn&#8217;t see another good option at this point, so I dragged out one of the other working old computers, a Panasonic Toughbook that had an old-ish install of Void Linux on it. This particular machine looks like it&#8217;s been through a warzone, but it still works well enough, and most importantly, the CD burner in it seems to work flawlessly. In the hopes of not having to waste any further CDs in the future, I decided to burn Plop Boot Manager to the disc rather than burning FreeDOS itself. The burn went smoothly enough, the Compaq was happy to boot from it, and next thing I knew I was able to boot into FreeDOS from the USB! Woohoo!&#8230;</p><p>&#8230;or&#8230;. not. FreeDOS itself seemed to run without issues, and partitioning and formatting the drives wasn&#8217;t a problem, but for some reason FreeDOS&#8217;s installer didn&#8217;t work when booted in this way. Despite the fact that it was installing to what it considered drive D:, it kept trying to write files to drive C:, which was the read-only volume on the USB drive. This resulted in lots of &#8220;Abort, Retry, Ignore, Fail?&#8221; error messages, and while the installer did seem to work (kinda) if I just "ignored&#8221; all the errors, I didn&#8217;t trust the finished installation was going to work. I also couldn&#8217;t just sit there and press and hold the &#8220;I&#8221; key to keep ignoring errors, since doing so slowed the copy process down (probably because it was spamming the keyboard interrupt, I would guess). So, one CD-R apparently wasted. Next!</p><p>Back on the Toughbook, I used wget to download both the FreeDOS 1.4 LiveCD and BonusCD. I needed both discs, since the OS was on the LiveCD and the development tools (like the C compiler I wanted to use) was on the BonusCD. Burning the discs was pretty easy, and FreeDOS seemed much happier installing from a CD than trying to install from a USB. Soon enough I had a working FreeDOS installation, and a little bit later I had a good text editor and the Open Watcom 1.9 compiler installed.</p><p>At this point I was almost ready to sit down and start coding, but decided I had better figure out how to get data off the system before I dedicated a bunch of time working on my project. I didn&#8217;t want it to just rot on the machine it was coded on. At this point I discovered two frustrating facts:</p><ul><li><p>The USB driver included with FreeDOS only works with UHCI controllers, but the controller in this system is an OHCI controller.</p></li><li><p>The network card wasn&#8217;t supported out of the box - there were packet drivers out there for it most likely, but those weren&#8217;t very useful since I couldn&#8217;t get outside data onto the machine since USB didn&#8217;t work.</p></li></ul><p>(At this point one might reasonably ask why I don&#8217;t just use the floppy disk drive. That&#8217;s because I have exactly one functional computer with a floppy disk drive, that being the Compaq I was setting up. I can use floppies as storage if I&#8217;m willing to risk catastrophic data loss, but they&#8217;re useless as a data transfer mechanism. There are also OHCI drivers for DOS available online, even open-source drivers, but of course those would have to be transferred to the system in order to use them.)</p><p>At this point what a normal person probably would do is accept the fact that they&#8217;re going to have to burn some more CD-Rs, and proceed to get some USB and network drivers onto the machine. But due to being paranoid about running out of CD-Rs, that was an absolutely unacceptable solution to me. I had the OpenBSD disc I used some months ago laying around, so&#8230;</p><p>Dual-booting FreeDOS and OpenBSD didn&#8217;t end up being all that hard. For one, BSD&#8217;s partitioning system actually works really well for multibooting. Even though OpenBSD generally uses a whole bunch of partitions, it doesn&#8217;t try to create them all directly on the drive. Instead, it creates one &#8220;container&#8221; partition, and then creates a bunch of OpenBSD-specific partitions within that container, separate from the drive&#8217;s usual partitioning scheme. On top of that, the installer is pretty straightforward (once you realize that you need to skip all forms of network setup if you don&#8217;t intend to plug the machine into a network), and an OpenBSD installation without an X server or games fits in 3 GB of disk space with a bit of wiggle room to spare. I don&#8217;t expect I&#8217;ll be able to update this installation without pain, but since all I need it to do is let me move files to and from a USB drive, I don&#8217;t need to update it (and won&#8217;t be connecting it to a network).</p><p>The only really painful part of the installation process was partitioning - every operating system seems to have a radically different idea of how fdisk is supposed to work, and OpenBSD&#8217;s idea of fdisk is the most&#8230; um&#8230; interesting one I&#8217;ve seen to date. Rather than working in terms of unallocated space and partition creation, OpenBSD&#8217;s fdisk just acts as if all four partitions MBR allows for always exist at all times. You don&#8217;t create a partition, you just configure each of the partition slots you&#8217;re interested in working with. If you don&#8217;t want a partition to exit, you set its type code to &#8220;00&#8221; (unused). If you do want a partition to exist, you set its type code to whatever&#8217;s appropriate for your use case, define a start and end sector, and you&#8217;re done. I&#8217;m guessing this is <em>probably</em> a more accurate model of how MBR actually works, but it was nonetheless surprising to me. More surprising is that there don&#8217;t seem to be any safeguards to make sure you don&#8217;t do something completely ridiculous like define partitions that overlap each other, or put sector 0 as part of a partition. OpenBSD&#8217;s fdisk also does not try to guess things like how large you want the partition to be, so you have to calculate everything by hand and double-check your work to keep from making a mess. To be honest, I actually kind of like this system, it was just very unexpected.</p><p>After fighting with the partitioner a bit, I made a 3 GB partition at the end of the 40 GB Maxtor drive to install OpenBSD to. The remaining 37 GB would still be dedicated to a FAT32 DOS system. (In retrospect, I wish I had split the drive 50-50 between DOS and OpenBSD so I could play with both, and in all likelihood I&#8217;ll probably go back and do that at some point in the future, but this is the setup I have now.) Once that was done, OpenBSD installed just fine&#8230;</p><p>&#8230;and then I realized that the BIOS in this machine doesn&#8217;t allow me to specify which hard drive I want to boot from. The boot order settings fail to list the secondary drive anywhere, and there&#8217;s no boot menu button.</p><p>Thankfully there was a good workaround. Remember the Plop Boot Manager disc I burned near the beginning of this ordeal? Turns out it had no problem recognizing all of the partitions on all of the drives in this system. All I have to do is just leave the Plop CD in the bootable drive, and then I can choose whether i want to boot into FreeDOS or OpenBSD effortlessly.</p><p>That pretty much describes where my setup is at so far. I have been able to successfully transfer files between my main work laptop and the FreeDOS system using this OpenBSD &#8220;shim&#8221;. I haven&#8217;t gotten USB working in FreeDOS yet, and I haven&#8217;t managed to get either of the network cards to work yet, but the system does work, and I had a lot of fun using &#8220;edit&#8221; and &#8220;fed&#8221; to write up a README.TXT for the Bible software project that inspired this whole endeavor. There&#8217;s still more to do for setting up the workstation though:</p><ul><li><p>I really would like to have working USB in FreeDOS. There&#8217;s a Panasonic driver floating around the Internet that people claim to have success with, I&#8217;ll probably end up using that.</p></li><li><p>I should replace the broken optical drive. Then I can have both Plop Boot Manager and the FreeDos 1.4 BonusCD inserted at the same time, which would make life quite a bit easier.</p></li><li><p>I&#8217;m already regretting only giving OpenBSD 3 GB of space on the secondary drive. I&#8217;d like to be able to use it to chat on IRC, which means connecting it to the Internet, which means keeping it up-to-date, so I&#8217;ll probably repartition the drive, allocate 20 GB to OpenBSD, and leave 20 GB for DOS. Even that&#8217;s probably huge, but we&#8217;ll find out. (I don&#8217;t intend to connect FreeDOS to the Internet since I&#8217;m a bit scared of the security issues of doing that.)</p></li><li><p>Embarrassingly, I&#8217;m using a Chromebook to let me look at Open Watcom&#8217;s documentation in a web browser. I should set things up so that I can read the documentation from within DOS itself.</p></li></ul><p>Other than the above points though, the system is working quite well, and I&#8217;m happy with it. Hopefully I won&#8217;t end up spending so much time setting it up that I never use it for its intended purpose! :P</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://arraybolt3.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Arraybolt's Archives! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[The bug that code couldn't fix...]]></title><description><![CDATA[...turned out to be an arachnid.]]></description><link>https://arraybolt3.substack.com/p/the-bug-that-code-couldnt-fix</link><guid isPermaLink="false">https://arraybolt3.substack.com/p/the-bug-that-code-couldnt-fix</guid><dc:creator><![CDATA[Aaron Rainbolt]]></dc:creator><pubDate>Wed, 18 Jun 2025 05:35:05 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!U9th!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81afb1c6-f320-42fc-97ab-f1de570fde3a_288x288.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>This isn&#8217;t a tech-related post, so if you&#8217;re only here for the tech, feel free to skip over.</p><p>Any of y&#8217;all hate spiders? If you had asked me that last week, I would have said &#8220;no&#8221;. Turns out you just need to get in a fight with the wrong spider to change that. I&#8217;m in the central United States, so thankfully I don&#8217;t have to deal with the horror spiders places like Australia have. But even in my not-intrinsically-hostile-to-human-life area of the world, we have some horror spiders of our own turns out. The two most common ones (the Brown Recluse and Black Widow) are basically memes at this point because they get mentioned so often; I&#8217;ve been bitten by both so far. The Brown Recluse bite wasn&#8217;t really that dramatic before, during, or after treatment, so there&#8217;s not really a story to tell there. The Black Widow bite on the other hand&#8230; oh boy. Holy moly.</p><p>I woke up last Saturday since the alternative was to sleep for 24 hours straight and that sounded awful. There&#8217;s lots of good things to do with a Sabbath, why waste the day on sleep? Usually I spend (or at least am <em>supposed</em> to spend) this day with my family, generally doing Bible study and board games. Over the last few weeks though, I had been using the time to clean up various areas of the house that needed it, and this time I decided to clean up a room that had been flooded some time back. I entered the Room of Despair, with the Sword of Paper Towels in one hand and the Shield of Trash Bags in the other. In front of me stood the vast armies of UghYuck-Hai. (LotR fans will get the joke.<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a>) Convinced that I was effectively invulnerable to anything the hoards could do to me, I entered the fray, and thus was the battle joined in the land of MyHome.</p><p>Fast forward two hours of sorting, scrubbing, and hauling. I had made a pretty decent dent in the mess. I was also pretty tired at that point, and our family&#8217;s dog needed me to take him outside, so I decided it was time to take a break. I put the leash on the dog, and headed into the great outdoors for a much-needed breath of fresh air.</p><p>It was at about that time I realized there was something that felt weird on my left hip. In my neck of the woods, we have to deal with pretty extreme concentrations of mosquitoes, so I figured I probably just had some of my blood repurposed by a flying mini-vampire. Upon closer inspection though, I didn&#8217;t see localized swelling indicating a mosquito bite (or any other bite for that matter). The troubled area was just far enough toward my back that I couldn&#8217;t see if it had a bite hole or not, and I didn&#8217;t notice any kind of discoloration to give me a heads-up either. All I knew is that there was a decent-sized patch of my left hip that HURT if I poked it lightly. I&#8217;d previously had random areas of my body hurt when poked (probably from minor bruises), so I just lumped this event in with the rest of the mystery injuries I&#8217;ve been through and went on with my day.</p><p>Upon coming back from helping the dog out, I still felt pretty winded. I chalked that up to doing strenuous work in an area with bad air for too long, and decided to spend some time in bed to recover. One hour in bed turned into two. Two turned into three. Regardless of how long I laid there, I still just felt <em>exhausted.</em> &#8220;Did I really work that hard?&#8221;, I wondered. It didn&#8217;t seem like I had done enough work to warrant this level of tiredness. Thankfully I did get to chat with my mom about Bible stuff for a good portion of that time, so I thought the day had been pretty successful nonetheless.</p><p>The sun went down. I was still unreasonably tired. Usually this was when me and my mom would play a board game together, but I just wasn&#8217;t up for it. I ended up needing to use the restroom, so I went to do that, and that&#8217;s when I noticed my now-even-sorer hip wasn&#8217;t the only thing that was wrong.</p><p>While in the restroom, I felt like my digestive system was starting to get sick. This too was pretty easily explainable, I had just worked in filth and probably got exposed to too much yuck for my system to handle. My temperature was a bit higher than normal. Whatever, not like I hadn&#8217;t had fevers before. My head felt sore and stuffed up, which again just felt like I was getting sick in general. My vision also wasn&#8217;t great, but for all I know that could have just been because I was focusing more on feeling bad and less on the wall of the bathroom I was looking at. At this point, I didn&#8217;t think that the sore hip and the sudden onset fever might be related.</p><p>After coming out of the bathroom, I huddled in bed to try to help the minor fever burn out whatever crud I had gotten into. My mom came to help take care of me while I was sick. To my surprise, the fever didn&#8217;t stay minor for long - I suddenly started shivering like <em>crazy</em> even though I wasn&#8217;t even remotely cold. My temperature skyrocketed, getting to the point where I was worried it could be dangerously high. I started aching all over and my muscles felt like they got a lot weaker. My heart started pounding furiously, and I felt short of breath. We always keep colloidal silver in the house since it helps with immunity, so my mom gave me some sprays of it and had me hold it under my tongue. I noticed I was salivating a bunch for absolutely no reason while trying to hold the silver spray there as long as I could. Things weren&#8217;t really improving, and I noticed my hip was starting to hurt more. I mentioned the sore hip issue to my mom, and we chose to put some aloe vera lotion and colloidal silver on it, just in case I had been bitten by a spider of some sort.</p><p>That turned out to be a very good, very very VERY painful idea. After rubbing in the lotion, the bitten area started experiencing severe, relentless stabbing pains, gradually growing in intensity as time progressed. For the first few minutes, I was thinking &#8220;wow, this really hurts, what in the world bit me?&#8221;, but that pretty quickly gave way to &#8220;AAAAA! AAAAA! AAAAAAAAAAAAAA!&#8221; I kept most of the screaming in my mind, but after a while it got so bad I just rocked back and forth and groaned for what felt like forever. I&#8217;d never had pain like this just keep going and going, so I thought if I just toughed it out for long enough it would eventually go away. This thing didn&#8217;t seem to work like that though. After who-knows-how-long, I finally realized this wasn&#8217;t going to go away on its own, and so, for reasons only my pain-deranged mind could understand, I tried rolling over on my left side to see if squishing the area would get it to shut up. Beyond all logic, that actually seemed to work, so I just stayed there for quite some time.</p><p>At this point, my mom realized the sore hip and the rest of my sickness might be related (I never managed to put the two together). The symptoms I had originally looked like scarlet fever plus random weirdness, but they turned out to match extremely well with the symptoms of a <a href="https://my.clevelandclinic.org/health/diseases/black-widow-spider-bite">black widow bite</a> (I didn&#8217;t have the sweating <em>yet</em> but that ended up happening too). The bite area also started looking discolored, so something was definitely not right. At about this point my kidneys started hurting pretty badly, not as badly as the bite but not too far from it.</p><p>I&#8217;ll try to go over the rest of the mess relatively quickly. In summary:</p><ul><li><p>I passed out and fell over while trying to walk back from the restroom at one point. From what I remember, I had started blacking out while in the restroom, realized I needed to get back to bed ASAP, managed to clumsily walk out of the bathroom and most of the way into the bed, then felt myself fall, bump into a lamp, and land on the bed back-first (which was weird, my back wasn&#8217;t facing the bed yet). My mom on the other hand, who was not virtually unconscious, reports that I came around the corner, proceeded to fall face first into the lamp with arms outstretched like a zombie, had a minor seizure, and she had to pull me off the lamp and flip me around. All I can think is my brain must have still been active but lost all sensory input and motor control.</p></li><li><p>I couldn&#8217;t get out of bed for over 48 hours straight thereafter. I&#8217;d start blacking out if I tried to stand up for very long.</p></li><li><p>A dime-sized area around the bite turned purple, then black. So, great, I guess I can now say a part of me is dead :P At this point we were also able to clearly see dual fang marks, confirming that this was indeed a spider bite.</p></li><li><p>I ended up drinking way more water than usual. I usually only drink three or four cups a day, but I drank more like nine or ten cups the day after the bite.</p></li><li><p>I had some muscle paralysis that made it difficult to urinate. Thankfully that went away after a day.</p></li><li><p>My vision got very, very blurry, and my eyes had tons of pus coming out of them for no apparent reason. This was more of an annoyance than anything, I was keeping my eyes shut most of the time anyway, but the crud kept drying and gluing my eyes shut! It was easy enough to just pick off when that happened, but it was one of those things that makes you go &#8220;come on, really?&#8221;</p></li><li><p>On the third day of recovery, my whole body broke out in a rash that looked like a bunch of purple freckles. They didn&#8217;t hurt, didn&#8217;t bump up, didn&#8217;t even hardly itch, but they looked really weird. Patches of the rash proceeded to go away and come back every so often, which they&#8217;re still doing now.</p></li><li><p>I ended up missing three days of work while laid up.</p></li></ul><p>We kept applying peppermint oil infused aloe vera lotion and colloidal silver to the bite, which helped reduce pain (well, except for the first time anyway :P) and seems to have helped keep the toxins from spreading too much.</p><p>A couple of questions come to mind at this point. For one, how do I know that it was a black widow that bit me? Unfortunately, I never saw or felt the spider, so I can&#8217;t know for an absolute certainty that I was bitten by a black widow (some people report false widows can cause similar symptoms if they inject you with enough venom). But false widows don&#8217;t live anywhere even remotely close to where I live, and black widows are both known to live here and we&#8217;ve seen them here before. The symptoms certainly aren&#8217;t anything remotely close to a brown recluse bite, and while I am not a medical professional, they seem to match the symptoms of black widow bites very, very well. So even if by some chance this wasn&#8217;t a black widow, whatever bit me had just as bad of an effect on me as a black widow would have.</p><p>For two, why didn&#8217;t I go to a hospital? Number one, everything I looked up said the most they could do is give you antivenom (which can cause <a href="https://pubmed.ncbi.nlm.nih.gov/21641165/">anaphylaxis</a>, no thank you), or painkillers like fentanyl (which I don&#8217;t want anywhere near me, I&#8217;d rather feel like I&#8217;m dying from a spider bite than take a narcotic painkiller, thanks anyway). Number two, last time a family member had to go to the hospital, the ambulance just about killed him trying to get him there in the first place. I lost most of my respect for my city&#8217;s medical facilities that day; if I&#8217;m not literally dying, I don&#8217;t need a hospital, and if I am dying, my hospitals will probably just kill me off quicker.</p><p>I&#8217;m currently on day 4 of recovery (including the day I was bitten). I&#8217;m still lightheaded, but I can stand without passing out finally. The kidney pain went away, as did the stabbing pain in the bite area (though it still aches a bit, and hurts if you poke it). The fever is mostly gone, my eyes are working normally again and aren&#8217;t constantly trying to superglue themselves closed, and my breathing is mostly fine again. I&#8217;m definitely still feeling the effects of the bite, but they aren&#8217;t crippling anymore. I&#8217;ll probably be able to work from home in the morning (I&#8217;d try to do household chores too but my mom would probably have a heart attack since I just about killed myself trying to get out of the bathroom).</p><p>Speaking of working from home, it&#8217;s half past midnight here, I should be going to bed. Thanks for reading!</p><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p>The army of Saruman sent against the fortress of Helm&#8217;s Deep was made up of half-elven, half-orc creatures known as Uruk-Hai. &#8220;Ugh, yuck!&#8221; and &#8220;Uruk&#8221; sounded humorously similar, so I just went with it.</p></div></div>]]></content:encoded></item><item><title><![CDATA[Visually-impaired accessibility is fundamentally broken. Here's what we can do about it.]]></title><description><![CDATA[There are a lot of privileges most of us probably take for granted.]]></description><link>https://arraybolt3.substack.com/p/visually-impaired-accessibility-is</link><guid isPermaLink="false">https://arraybolt3.substack.com/p/visually-impaired-accessibility-is</guid><dc:creator><![CDATA[Aaron Rainbolt]]></dc:creator><pubDate>Sun, 11 Aug 2024 08:41:48 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!U9th!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81afb1c6-f320-42fc-97ab-f1de570fde3a_288x288.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>There are a lot of privileges most of us probably take for granted. Not everyone is gifted with the ability to do basic things like talk, walk, see, and hear. Those of us (like myself) who can do all of these things don&#8217;t really think about them much. Those of us who can&#8217;t, have to think about it <em>a lot</em> because our world is largely not designed for them. Modern-day things are designed for a fully-functional human being, and then have stuff tacked onto them to make them <em>easier</em> to use. Not easy, just &#8220;not quite totally impossible.&#8221;</p><p>Issues of accessibility plague much of modern-day society, but I want to focus on one pain-point in particular. Visually-impaired accessibility.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://arraybolt3.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Arraybolt's Archives! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>Now I&#8217;m not blind, so I am not qualified to say how exactly a blind person would use their computer. But I have briefly tried using a computer with my monitor turned off to test visually-impaired accessibility, so I know a bit about how it works. The basic idea seems to be that you launch a screen reader using a keyboard shortcut. That screen reader proceeds to try to describe various GUI elements to you at a rapid speed, from which you have to divine the right combination of Tab, Space, Enter, and arrow keys to get to the various parts of the application you want to use. Using these arcane sequences of keys, you can make the program do&#8230; something. Hopefully it&#8217;s what you wanted, but based on reports I&#8217;ve seen from blind users, oftentimes the computer reacts to your commands in highly unexpected ways.</p><p>The first thing here that jumps out to most people is probably the fact that using a computer blind is like trying to use magic. That&#8217;s a problem, but that&#8217;s not what I&#8217;m focusing on. I'm focusing on two words in particular.</p><p>Screen. Reader.</p><p>Wha&#8230;?</p><p>I want you to stop and take a moment to imagine the following scenario. You want to go to a concert, but can&#8217;t, so you sent your friend to the concert in your place and ask them to record it for you. They do so, and come back with a video of the whole thing. They&#8217;ve transcribed every word of each song, and made music sheets detailing every note and chord the concert played. There&#8217;s even some cool colors and visualizer stuff that conveys the feeling and tempo of each song. They then proceed to lay all this glorious work out in front of you, claiming it conveys everything about the concert perfectly. Confronted with this onslaught of visual data, what&#8217;s the first thing you&#8217;re going to ask?</p><p>&#8220;Didn&#8217;t you record the audio?&#8221;</p><p>Of course that&#8217;s the first thing you&#8217;re going to ask, because <strong>it&#8217;s a concert for crying out loud, 90% of the point of it is the audio.</strong> I can listen to a simple, relatively low-quality recording of a concert&#8217;s audio and be satisfied. I get to hear the emotion, the artistry, everything. I don&#8217;t need a single pixel of images to let me experience it in a satisfactory way. On the other hand, I don&#8217;t care how detailed your video analysis of the audio is - if it doesn&#8217;t include the audio, I&#8217;m going to be upset. Potentially very upset.</p><p>Now let&#8217;s go back to the topic at hand, visually-impaired accessibility. What does a screen reader do? It takes a user interface, <strong>one designed for seeing users</strong>, and tries to describe it as best it can to the user via audio. You then have to use keyboard shortcuts to navigate the UI, which the screen reader continues to describe bits of as you move around. For someone who&#8217;s looking at the app, this is all fine and dandy. For someone who can kinda see, maybe it&#8217;s sufficient. But for someone who&#8217;s blind or severely visually impaired, this is difficult to use if you&#8217;re lucky. Chances are you&#8217;re not going to be lucky and the app your working with might as well not exist.</p><p>Why is this so hard? Why have decades of computer development not led to breakthroughs in accessibility for blind people? Because we&#8217;re doing the whole thing wrong! We&#8217;re taking a user interface designed specifically and explicitly for seeing users, and trying to convey it over audio! It&#8217;s as ridiculous as trying to convey a concert over video. A user who&#8217;s listening to their computer shouldn&#8217;t need to know how an app is visually laid out in order to figure out whether they need to press up arrow, right arrow, or Tab to get to their desired UI element. They shouldn&#8217;t have to think in terms of buttons and check boxes. These are inherently visual user interface elements. Forcing a blind person to use these is tantamount to torture.</p><p>On top of all of this, half the time screen readers <em>don&#8217;t even work!</em> People who design software are usually able to see. You just don&#8217;t think about how to make software usable for blind people when you can see. It&#8217;s not something that easily crosses your mind. But try turning your screen off and navigating your system with a screen reader, and suddenly you&#8217;ll understand what&#8217;s lacking about the accessibility features. I tried doing this once, and I went and turned the screen back on after about five minutes of futile keyboard bashing. I can&#8217;t imagine the frustration I would have experienced if I had literally no other option than to work with a screen reader. Add on top of that the possibility that the user of your app has never even <em>seen</em> a GUI element in their lives before because they can&#8217;t see at all, and now you have essentially a language barrier in the way too.</p><p>So what&#8217;s the solution to this? Better screen reader compatibility might be helpful, but I don&#8217;t think that&#8217;s ultimately the correct solution here. I think we need to collectively recognize that blind people shouldn&#8217;t have to work with graphical user interfaces, and design something totally new.</p><p>One of the advantages of Linux is that it&#8217;s just a bunch of components that work together to provide a coherent and usable set of features for working on your computer. You aren&#8217;t locked into using a UI that you don&#8217;t like - just use or create some other UI. All current desktop environments are based around a screen that the user can see, but there&#8217;s no rules that say it has to be that way. Imagine if instead, your computer just <em>talked</em> to you, telling you what app you were using, what keys to press to accomplish certain actions, etc. In response, you <em>talked</em> back to it using the keyboard or voice recognition. There would be no buttons, check boxes, menus, or other graphical elements - instead you&#8217;d have actions, options, feature lists, and other conceptual elements that can be conveyed over audio. Switching between UI elements with the keyboard would be intuitive, predictable, and simple, since the app would be designed from step one to work that way. Such an audio-centric user interface would be easy for a blind or vision-impaired person to use. If well-designed, it could even be pleasant. A seeing person might have a learning curve to get past, but it would be usable enough for them too. Taking things a step further, support for Braille displays would be very handy, though as I have never used one I don&#8217;t know how hard that would be to implement.</p><p>A lot of work would be needed in order to get to the point of having a full desktop environment that worked this way. We&#8217;d need toolkits for creating apps with intuitive, uniform user interface controls. Many sounds would be needed to create a rich sound scheme for conveying events and application status to the user. Just like how graphical apps need a display server, we&#8217;d also need an audio user interface server that would tie all the apps together, letting users multitask without their apps talking over each other or otherwise interfering. We&#8217;d need plenty of apps that would actually be designed to work in an audio-only environment. A text editor, terminal, and web browser are the first things that spring to mind, but email, chat, and file management applications would also be very important. There might even be an actually good use for AI here, in the form of an image &#8220;viewer&#8221; that could describe an image to the user. And of course, we&#8217;d need an actually good text-to-speech engine (Piper seems particularly promising here).</p><p>This is a pretty rough overview of how I imagine we could make the world better for visually impaired computer users. Much remains to be designed and thought about, but I think this would work well. Who knows, maybe Linux could end up being easier for blind users to use than Windows is!</p><p>Interested in helping make this happen? Head over to the <a href="https://github.com/aurora-aui/design">Aurora Aural User Interface</a> project on GitHub, and offer ideas!</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://arraybolt3.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Arraybolt's Archives! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[OR...]]></title><description><![CDATA["Fake it 'till you make it", Bash/C style]]></description><link>https://arraybolt3.substack.com/p/or</link><guid isPermaLink="false">https://arraybolt3.substack.com/p/or</guid><dc:creator><![CDATA[Aaron Rainbolt]]></dc:creator><pubDate>Mon, 20 May 2024 08:06:40 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!U9th!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81afb1c6-f320-42fc-97ab-f1de570fde3a_288x288.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Contrary to what you may be thinking, this is not a tale of an inexperienced coder pretending to know what they&#8217;re doing. I have something even better for you.</p><p>It all begins in the dead of night, at my workplace. In front of me is a typical programmer&#8217;s desk - two computers, three monitors (one of which isn&#8217;t even plugged in), a mess of storage drives, SD cards, 2FA keys, and an arbitrary RPi 4, along with a host of items that most certainly don&#8217;t belong on my desk, and a tangle of cables that would give even a rat a migraine. My dev laptop is sitting idle on the desk, while I stare intently at the screen of a system running a battery of software tests. In front of me is the logs of a failed script run.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://arraybolt3.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Arraybolt's Archives! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>Generally when this particular script fails, it gives me some indication as to what went wrong. There are thorough error catching measures (or so I thought) throughout the code, so that if anything goes wrong, I know what went wrong and where. This time though, I&#8217;m greeted by something like this:</p><p><code>$ systemctl status test-sh.service<br>test-sh.service - does testing things<br>...<br>May 20 23:00:00 desktop-pc systemd[1]: Starting test-sh.service - does testing things<br>May 20 23:00:00 desktop-pc systemd[1]: test-sh.service: Failed with result &#8216;exit-code&#8217;.<br>May 20 23:00:00 desktop-pc systemd[1]: Failed to start test-sh.service.</code></p><p>I stare at the screen in bewilderment for a few seconds. No debugging info, no backtraces, no logs, not even an error message. It&#8217;s as if the script simply decided it needed some coffee before it would be willing to keep working this late at night. Having heard the tales of <a href="https://www.theregister.com/2022/09/12/who_me/">what happens when you give a computer coffee</a>, I elected to try a different approach.</p><p><code>$ vim /usr/bin/test-sh<br>  1 #!/bin/bash<br>  2 #<br>  3 # Copyright 2024 ...<br>  4 set -u;<br>  5 set -e;</code></p><p>Before I go into what exactly is wrong with this picture, I need to explain a bit about how Bash handles the ultimate question of life, &#8220;what is truth?&#8221;</p><p>(<em><strong>RED ALERT</strong></em>: I do not know if I&#8217;m correct about the reasoning behind the design decisions I talk about in the rest of this article. Don&#8217;t use me as a reference for why things work like this, and please correct me if I&#8217;ve botched something. Also, a lot of what I describe here is simplified, so don&#8217;t be surprised if you notice or discover that things are a bit more complex in reality than I make them sound like here.)</p><p>Bash, as many of you probably know, is primarily a &#8220;glue&#8221; language - it glues applications to each other, it glues the user to the applications, and it glues one&#8217;s sanity to the ceiling, far out of the user&#8217;s reach. As such, it features a bewildering combination of some of the most intuitive and some of the least intuitive behaviors one can dream up, and the handling of truth and falsehood is one of these bewildering things.</p><p>Every command you run in Bash reports back whether or not what it did &#8220;worked&#8221;. (&#8220;Worked&#8221; is subjective and depends on the command, but for the most part if a command says &#8220;It worked&#8221;, you can trust that it did what you told it to, at least mostly.) This is done by means of an &#8220;exit code&#8221;, which is nothing more than a number between 0 and 255. If a program exits and hands the shell an exit code of 0, it usually means &#8220;it worked&#8221;, whereas a non-zero exit code usually means &#8220;something went wrong&#8221;. (This makes sense if you know a bit about how programs written in C work - if your program is written to just &#8220;do things&#8221; and then exit, it will default to exiting with code zero.)</p><p>Because zero = good and non-zero = not good, it makes sense to treat zero as meaning &#8220;true&#8221; and non-zero as meaning &#8220;false&#8221;. That&#8217;s exactly what Bash does - if you do something like &#8220;<code>if command; then commandIfTrue; else commandIfFalse; fi</code>&#8221;, Bash will run &#8220;<code>commandIfTrue</code>&#8221; if &#8220;<code>command</code>&#8221; exits with 0, and will run &#8220;<code>commandIfFalse</code>&#8221; if &#8220;<code>command</code>&#8221; exits with 1 or higher.</p><p>Now since Bash is a glue language, it has to be able to handle it if a command runs and fails. This can be done with some amount of difficulty by testing (almost) every command the script runs, but that can be quite tedious. There&#8217;s a (generally) easier way however, which is to tell the script to immediately exit if any command exits with a non-zero exit code. This is done by using the command &#8220;<code>set -e</code>&#8221; at or near the top of the script. Once &#8220;<code>set -e</code>&#8221; is active, any command that fails will cause the whole script to stop.</p><p>So back to my script. I&#8217;m using &#8220;<code>set -e</code>&#8221; so that if anything goes wrong, the script stops. What could go wrong other than a failed command? To answer that question, we have to take a look at how some things work in C.</p><p>C is a very different language than Bash. Whereas Bash is designed to take a bunch of pieces and glue them together, C is designed to make the pieces themselves. You can think of Bash as being a glue gun and C as being a 3d printer. As such, C does not concern itself nearly as much with things like return codes and exiting when a command fails. It focuses on taking data and doing stuff with it.</p><p>Since C is more data- and algorithm-oriented, true and false work significantly differently here. C sees 0 as meaning &#8220;none, empty, all bits set to 0, etc.&#8221; and thus treats it as meaning &#8220;false&#8221;. Any number greater than 0 has a value, and can be treated as &#8220;on&#8221; or &#8220;true&#8221;. An astute reader will notice this is exactly the opposite of how Bash works, where 0 is true and non-zero is false. (In my opinion this is a rather lamentable design decision, but sadly these behaviors have been standardized for longer than I&#8217;ve been alive, so there&#8217;s not much point in trying to change them. But I digress.)</p><p>C also of course has features for doing math, called &#8220;operators&#8221;. One of the most common operators is the assignment operator, &#8220;<code>=</code>&#8221;. The assignment operator&#8217;s job is to take whatever you put on the right side of it, and store it in whatever you put on the left side. If you say <code>&#8220;a = 0</code>&#8221;, the value &#8220;0&#8221; will be stored in the variable &#8220;a&#8221; (assuming things work right). But the assignment operator has a trick up its sleeve - not only does it <em>assign</em> the value to the variable, it also <em>returns</em> the value. Basically what that means is that the statement &#8220;<code>a = 0</code>&#8221; spits out an extra value that you can do things with. This allows you to do things like &#8220;<code>a = b = 0</code>&#8221;, which will assign 0 to &#8220;b&#8221;, return zero, and then assign that returned zero to "a&#8221;. (The assignment of the second zero to &#8220;a&#8221; also returns a zero, but that simply gets ignored by the program since there&#8217;s nothing to do with it.)</p><p>You may be able to see where I&#8217;m going with this. Assigning a value to a variable also returns that value&#8230; and 0 means &#8220;false&#8221;&#8230; so &#8220;<code>a = 0</code>&#8221; succeeds, but also returns what is effectively &#8220;false&#8221;. That means if you do something like &#8220;<code>if (a = 0) { ... } else { explodeComputer(); }</code>&#8221;,  the computer will explode. &#8220;<code>a = 0</code>&#8221; returns &#8220;false&#8221;, thus the &#8220;if&#8221; condition does not run and the &#8220;else&#8221; condition does. (Coincidentally, this is also a good example of the &#8220;world&#8217;s last programming bug&#8221; - the comparison operation in C is &#8220;<code>==</code>&#8221;, which is awfully easy to mistype as the assignment operator, &#8220;<code>=</code>&#8221;. Using an assignment operator in an &#8220;if&#8221; statement like this will almost always result in the code within the &#8220;if&#8221; being executed, as the value being stored in the variable will usually be non-zero and thus will be seen as &#8220;true&#8221; by the &#8220;if&#8221; statement. This also corrupts the variable you thought you were comparing something to. Some fear that a programmer with access to nuclear weapons will one day write something like &#8220;<code>if (startWar = 1) { destroyWorld(); }</code>&#8221; and thus the world will be destroyed by a missing equals sign.)</p><p>&#8220;So what,&#8221; you say. &#8220;Bash and C are different languages.&#8221; That&#8217;s true, and in theory this would mean that everything here is fine. Unfortunately theory and practice are the same in theory but much different in practice, and this is one of those instances where things go haywire because of weird differences like this. There&#8217;s one final piece of the puzzle to look at first though - how to do math in Bash.</p><p>Despite being a glue language, Bash has some simple math capabilities, most of which are borrowed from C. Yes, including the behavior of the assignment operator and the values for true and false. When you want to do math in Bash, you write &#8220;<code>(( do math here... ))</code>&#8221;, and everything inside the double parentheses is evaluated. Any assignment done within this mode is executed as expected. If I want to assign the number 5 to a variable, I can do &#8220;<code>(( var = 5 ))</code>&#8221; and it shall be so.</p><p>But wait, what happens with the return value of the assignment operator?</p><p>Well, take a guess. What do you think Bash is going to do with it?</p><p>Let&#8217;s look at it logically. In C (and in Bash&#8217;s math mode), 0 is false and non-zero is true. In Bash, 0 is true and non-zero is false. Clearly if whatever happen within math mode fails and returns false (0), Bash should not misinterpret this as true! Things like &#8220;<code>(( 5 == 6 ))</code>&#8221; shouldn&#8217;t be treated as being true, right? So what do we do with this conundrum? Easy solution - <em>convert the return value to an <strong>exit code</strong> so that its semantics are retained across the C/Bash barrier.</em> If the return value of the math mode statement is false (0), it should be converted to Bash&#8217;s concept of false (non-zero), therefore the return value of 0 is converted to an exit code of 1. On the other hand, if the return value of the math mode statement is true (non-zero), it should be converted to Bash&#8217;s concept of true (0), therefore the return value of anything other than 0 is converted to an exit code of 0. (You probably see the writing on the wall at this point. Spoiler, my code was weighed in the balances and found wanting.)</p><p>So now we can put all this nice, logical, sensible behavior together and make a glorious mess with it. Guess what happens if you run &#8220;<code>(( var = 0 ))</code>&#8221; in a script where &#8220;<code>set -e</code>&#8221; is enabled.</p><ul><li><p>&#8220;0&#8221; is assigned to &#8220;var&#8221;.</p></li><li><p>The statement returns 0.</p></li><li><p>Bash dutifully converts that to a 1 (false/failure).</p></li><li><p>Bash now sees the command as having failed.</p></li><li><p>&#8220;<code>set -e</code>&#8221; says the script should immediately stop if anything fails.</p></li><li><p>The script crashes.</p></li></ul><p>You can try this for yourself - pop open a terminal and run &#8220;<code>set -e; (( var = 0 ));</code>&#8221; and watch in awe as your terminal instantly closes (or otherwise shows an indication that Bash has exited).</p><p>So back to the code. In my script, I have a function that helps with generating random numbers within any specified bounds. Basically it just grabs the value of &#8220;<code>$RANDOM</code>&#8221; (which is a special variable in Bash that always returns an integer between 0 and 32767) and does some manipulations on it so that it becomes a random number between a &#8220;lower bound&#8221; and an &#8220;upper bound&#8221; parameter. In the guts of that function&#8217;s code I have many &#8220;math mode&#8221; statements for getting those numbers into shape. Those statements include variable assignments, and those variable assignments were throwing exit codes into the script. I had written this before enabling &#8220;<code>set -e</code>&#8221;, so everything was fine before, but now &#8220;<code>set -e</code>&#8221; was enabled and Bash was going to enforce it as ruthlessly as possible.</p><p>While I will never know what line of code triggered the failure, it&#8217;s a fairly safe bet that the culprit was:</p><p><code>  88   (( _val = ( _val % ( _adj_upper_bound + 1 ) ) ));</code></p><p>This basically takes whatever is in &#8220;_val&#8221; , divides it by &#8220;_adj_upper_bound + 1&#8221;, and then assigns the <em>remainder</em> of that operation to &#8220;_val&#8221;. This makes sure that &#8220;_val&#8221; is lower than &#8220;_adj_upper_bound + 1&#8221;. (This is typically known as a &#8220;getting the modulus&#8221;, and the &#8220;%&#8221; operator here is the &#8220;modulo operator&#8221;. For the math people reading this, don&#8217;t worry, I did the requisite gymnastics to ensure this code didn&#8217;t have modulo bias.) If &#8220;_val&#8221; happens to be equal to &#8220;_adj_upper_bound + 1&#8221;, the code on the right side of the assignment operator will evaluate to 0, which will become an exit code of 1, thus exploding my script because of what appeared to be a failed command.</p><p>Sigh.</p><p>So there&#8217;s the problem. What&#8217;s the solution? Turns out it&#8217;s pretty simple. Among Bash&#8217;s feature set, there is the profoundly handy &#8220;logical or operator&#8221;, &#8220;<code>||</code>&#8221;. This operator lets us say &#8220;if this OR that is true, return true.&#8221; In other words, &#8220;Run whatever&#8217;s on the left hand of the ||. If it exits 0, move on. If it exits non-zero, run whatever&#8217;s on the right hand of the ||. If it exits 0, move on and ignore the earlier failure. Only return non-zero if both commands fail.&#8221; There&#8217;s also a handy command in Bash called &#8220;<code>true</code>&#8221; that does nothing except for give an exit code of 0. That means that if you ever have a line of code in Bash that is liable to exit non-zero but it&#8217;s no big deal if it does, you can just slap an &#8220;<code>|| true</code>&#8221; on the end and it will magically make everything work by pretending that nothing went wrong. (If only this worked in real life!) I proceeded to go through and apply this bandaid to every standalone math mode call in my script, and it now seems to be behaving itself correctly again. For now anyway.</p><p>tl;dr: Faking success is sometimes a perfectly valid way to solve a computing problem. Just don&#8217;t live the way you code and you&#8217;ll be alright.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://arraybolt3.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Arraybolt's Archives! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Making hyper-minimal Ubuntu virtual machines with debootstrap]]></title><description><![CDATA[Every so often I have to make a new virtual machine for some specific use case.]]></description><link>https://arraybolt3.substack.com/p/making-hyper-minimal-ubuntu-virtual</link><guid isPermaLink="false">https://arraybolt3.substack.com/p/making-hyper-minimal-ubuntu-virtual</guid><dc:creator><![CDATA[Aaron Rainbolt]]></dc:creator><pubDate>Thu, 30 Nov 2023 22:34:54 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!U9th!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81afb1c6-f320-42fc-97ab-f1de570fde3a_288x288.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Every so often I have to make a new virtual machine for some specific use case. Perhaps I need a newer version of Ubuntu than the one I&#8217;m running on my hardware in order to build some software, and containerization just isn&#8217;t working. Or maybe I need to test an app that I made modifications to in a fresh environment. In these instances, it can be quite helpful to be able to spin up these virtual machines quickly, and only install the bare minimum software you need for your use case.</p><p>One common strategy when making a minimal or specially customized install is to use a server distro (like Ubuntu Server for instance) as the base and then install other things on top of it. This <em>sorta</em> works, but it&#8217;s less than ideal for a couple reasons:</p><ul><li><p>Server distros are not the same as minimal distros. They may provide or offer software and configurations that are intended for a server use case. For instance, the ubuntu-server metapackage in Ubuntu depends on software intended for RAID array configuration and logical volume management, and it recommends software that enables LXD virtual machine related features. Chances are you don&#8217;t need or want these sort of things.</p></li><li><p>They can be time-consuming to set up. You have to go through the whole server install procedure, possibly having to configure or reconfigure things that are pointless for your use case, just to get the distro to install. Then you have to log in and customize it, adding an extra step.</p></li></ul><p>If you&#8217;re able to use Debian as your distro, these problems aren&#8217;t so bad since Debian is sort of like Arch Linux - there&#8217;s a minimal base that you build on to turn it into a desktop or server. But for Ubuntu, there&#8217;s desktop images (not usually what you want), server images (not usually what you want), cloud images (might be usable but could be tricky), and Ubuntu Core images (definitely not what you want for most use cases). So how exactly do you make a minimal Ubuntu VM?</p><p>As hinted at above, a cloud image might work, but we&#8217;re going to use a different solution here. As it turns out, you don&#8217;t actually have to use a prebuilt image or installer to install Ubuntu. Similar to the installation procedure Arch Linux provides, you can install Ubuntu manually, giving you very good control over what goes into your VM and how it&#8217;s configured.</p><p>This guide is going to be focused on doing a manual installation of Ubuntu into a VM, using debootstrap to install the initial minimal system. You can use this same technique to install Ubuntu onto physical hardware by just booting from a live USB and then using this technique on your hardware&#8217;s physical disk(s). However we&#8217;re going to be primarily focused on using a VM right now. Also, the virtualization software we&#8217;re going to be working with is QEMU. If you&#8217;re using a different hypervisor like VMware, VirtualBox, or Hyper-V, you can make a new VM and then install Ubuntu manually into it the same way you would install Ubuntu onto physical hardware using this technique. QEMU, however, provides special tools that make this procedure easier, and QEMU is more flexible than other virtualization software in my experience. You can install it by running <code>sudo apt install qemu-system-x86</code> on your host system.</p><p>With that laid out, let us begin.</p><p>Open a terminal on your physical machine, and make a directory for your new VM to reside in. I&#8217;ll use &#8220;~/VMs/Ubuntu&#8221; here.</p><p><code>mkdir ~/VMs/Ubuntu<br>cd ~/VMs/Ubuntu</code></p><p>Next, let&#8217;s make a virtual disk image for the VM using the <code>qemu-img</code> utility.</p><p><code>qemu-img create -f qcow2 ubuntu.img 32G</code></p><p>This will make a 32 GiB disk image - feel free to customize the size or filename as you see fit. The <code>-f</code> parameter at the beginning specifies the VM disk image format. QCOW2 is usually a good option since the image will start out small and then get bigger as necessary. However, if you&#8217;re already using a copy-on-write filesystem like BTRFS or ZFS, you might want to use <code>-f raw</code> rather than <code>-f qcow2</code> - this will make a raw disk image file and avoid the overhead of the QCOW2 file format.</p><p>Now we need to attach the disk image to the host machine as a device. I usually do this with you can use qemu-nbd, which can attach a QEMU-compatible disk image to your physical system as a network block device. These devices look and work just like physical disks, which makes them extremely handy for modifying the contents of a disk image.</p><p>qemu-nbd requires that the nbd kernel module be loaded, and at least on Ubuntu, it&#8217;s not loaded by default, so we need to load it before we can attach the disk image to our host machine.</p><p><code>sudo modprobe nbd<br>sudo qemu-nbd -f qcow2 -c /dev/nbd0 ./ubuntu.img</code></p><p>This will make our ubuntu.img file available through the /dev/nbd0 device. Make sure to specify the format via the <code>-f</code> switch, especially if you&#8217;re using a raw disk image. QEMU will keep you from writing a new partition table to the disk image if you give it a raw disk image without telling it directly that the disk image is raw.</p><p>Once your disk image is attached, we can partition it and format it just like a real disk. For simplicity&#8217;s sake, we&#8217;ll give the drive an MBR partition table, create a single partition enclosing all of the disk&#8217;s space, then format the partition as ext4.</p><p><code>sudo fdisk /dev/nbd0<br>n<br>p<br>1<br><br><br>w<br>sudo mkfs.ext4 /dev/nbd0p1</code></p><p>(The two blank lines are intentional - they just accept the default options for the partition&#8217;s first and last sector, which makes a partition that encloses all available space on the disk.)</p><p>Now we can mount the new partition.</p><p><code>mkdir vdisk<br>sudo mount /dev/nbd0p1 ./vdisk</code></p><p>Now it&#8217;s time to install the minimal Ubuntu system. You&#8217;ll need to know the first part of the codename for the Ubuntu version you intend to install. The codenames for Ubuntu releases are an adjective followed by the name of an animal, like &#8220;Jammy Jellyfish&#8221;. The first word (&#8220;Jammy&#8221; in this instance) is the one you need. These codenames are easy to look up online. Here&#8217;s the codenames for the currently supported LTS versions of Ubuntu, as well as the codename for the current development release:</p><p><code>+-------------------+-------+<br>| 20.04             | Focal |<br>|-------------------+-------+<br>| 22.04             | Jammy |<br>|-------------------+-------+<br>| 24.04 Development | Noble |<br>|-------------------+-------+</code></p><p>To install the initial minimal Ubuntu system, we&#8217;ll use the debootstrap utility. This utility will download and install the bare minimum packages needed to have a functional Ubuntu system. Keep in mind that the Ubuntu installation this tool makes is <em>really</em> minimal - it doesn&#8217;t even come with a bootloader or Linux kernel. We&#8217;ll need to make quite a few changes to this installation before it&#8217;s ready for use in a VM.</p><p>Assuming we&#8217;re installing Ubuntu 22.04 LTS into our VM, the command to use is:</p><p><code>sudo debootstrap jammy ./vdisk</code></p><p>After a few minutes, our new system should be downloaded and installed. (Note that debootstrap does require root privileges.)</p><p>Now we&#8217;re ready to customize the VM! To do this, we&#8217;ll use a utility called chroot - this utility allows us to &#8220;enter&#8221; an installed Linux system, so we can modify with it without having to boot it. (This is done by changing the root directory (from the perspective of the chroot process) to whatever directory you specify, then launching a shell or program inside the specified directory. The shell or program will see its root directory as being the directory you specified, and volia, it&#8217;s as if we&#8217;re &#8220;inside&#8221; the installed system without having to boot it. This is a very weak form of containerization and shouldn&#8217;t be relied on for security, but it&#8217;s perfect for what we&#8217;re doing.)</p><p>There&#8217;s one thing we have to account for before chrooting into our new Ubuntu installation. Some commands we need to run will assume that certain special directories are mounted properly - in particular, /proc should point to a procfs filesystem, /sys should point to a sysfs filesystem, /dev needs to contain all of the device files of our system, and /dev/pts needs to contain the device files for pseudoterminals (you don&#8217;t have to know what any of that means, just know that those four directories are important and have to be set up properly). If these directories are not properly mounted, some tools will behave strangely or not work at all. The easiest way to solve this problem is with bind mounts. These basically tell Linux to make the contents of one directory visible in some other directory too. (These are sort of like symlinks, but they work differently - a symlink says &#8220;I&#8217;m a link to something, go over here to see what I contain&#8221;, whereas a bind mount says &#8220;make this directory&#8217;s contents visible over here too&#8221;. The differences are subtle but important - a symlink can&#8217;t make files outside of a chroot visible inside the chroot. A bind mount, however, can.)</p><p>So let&#8217;s bind mount the needed directories from our system into the chroot:</p><p><code>sudo mount --bind /dev ./vdisk/dev<br>sudo mount --bind /proc ./vdisk/proc<br>sudo mount --bind /sys ./vdisk/sys<br>sudo mount --bind /dev/pts ./vdisk/dev/pts</code></p><p>And now we can chroot in!</p><p><code>sudo chroot ./vdisk</code></p><p>Run <code>ping -c1 8.8.8.8</code> just to make sure that Internet access is working - if it&#8217;s not, you may need to copy the host&#8217;s /etc/resolv.conf file into the VM. However, you probably won&#8217;t have to do this. Assuming Internet is working, we can now start customizing things.</p><p>By default, debootstrap only enables the &#8220;main&#8221; repository of Ubuntu. This repository only contains free-and-open-source software that is supported by Canonical. This does *not* include most of the software available in Ubuntu - most of it is in the &#8220;universe&#8221;, &#8220;restricted&#8221;, and &#8220;multiverse&#8221; repositories. If you really know what you&#8217;re doing, you can leave some of these repositories out, but I would highly recommend you enable them. Also, only the &#8220;release&#8221; pocket is enabled by default - this pocket includes all of the software that came with your chosen version of Ubuntu when it was first released, but it <em>doesn&#8217;t</em> include bug fixes, security updates, or newer versions of software. All those are in the &#8220;updates&#8221;, &#8220;security&#8221;, and &#8220;backports&#8221; pockets.</p><p>To fix this, run the following block of code, adjusted for your release of Ubuntu:</p><p><code>tee /etc/apt/sources.list &lt;&lt; ENDSOURCESLIST <br>deb http://archive.ubuntu.com/ubuntu jammy main universe restricted multiverse <br>deb http://archive.ubuntu.com/ubuntu jammy-updates main universe restricted multiverse <br>deb http://archive.ubuntu.com/ubuntu jammy-security main universe restricted multiverse <br>deb http://archive.ubuntu.com/ubuntu jammy-backports main universe restricted multiverse <br>ENDSOURCESLIST</code></p><p>Replace &#8220;jammy&#8221; with the codename corresponding to your chosen release of Ubuntu. Once you&#8217;ve run this, run <code>cat /etc/apt/sources.list</code> to make sure the file looks right, then run <code>apt update</code> to refresh your software database with the newly enabled repositories. Once that&#8217;s done, run <code>apt full-upgrade</code> to update any software in the base installation that&#8217;s out-of-date.</p><p>What exactly you install at this point is up to you, but here&#8217;s my list of recommendations:</p><ul><li><p>linux-generic. <strong>Highly recommended.</strong> This provides the Linux kernel. Without it, you&#8217;re going to have significant trouble booting. You can replace this with a different kernel metapackage if you want to for some reason (like linux-lowlatency).</p></li><li><p>grub-pc. <strong>Highly recommended.</strong> This is the bootloader. You might be able to replace this with an alternative bootloader like systemd-boot.</p></li><li><p>vim (or some other decent text editor that runs in a terminal). <strong>Highly recommended.</strong> The minimal install of Ubuntu doesn&#8217;t come with a good text editor, and you&#8217;ll really want one of those most likely.</p></li><li><p>network-manager. <strong>Highly recommended.</strong> If you don&#8217;t install this or some other network manager, you won&#8217;t have Internet access. You can replace this with an alternative network manager if you&#8217;d like.</p></li><li><p>tmux. <strong>Recommended.</strong> Unless you&#8217;re going to install a graphical environment, you&#8217;ll probably want a terminal multiplexer so you don&#8217;t have to juggle TTYs (which is especially painful in QEMU).</p></li><li><p>openssh-server. <strong>Optional.</strong> This is handy since it lets you use your terminal emulator of choice on your physical machine to interface with the virtual machine. You won&#8217;t be stuck using a rather clumsy and slow TTY in a QEMU display.</p></li><li><p>pulseaudio. <strong>Very optional.</strong> Provides sound support within the VM.</p></li><li><p>icewm + xserver-xorg + xinit + xterm. <strong>Very optional.</strong> If you need or want a graphical environment, this should provide you with a fairly minimal and fast one. You&#8217;ll still log in at a TTY, but you can use <code>startx</code> to start a desktop.</p></li></ul><p>Add whatever software you want to this list, remove whatever you don&#8217;t want, and then install it all with this command:</p><p><code>apt install listOfPackages</code></p><p>Replace &#8220;listOfPackages&#8221; with the actual list of packages you want to install. For instance, if I were to install everything in the above list except openssh-server, I would use:</p><p><code>apt install linux-generic grub-pc vim network-manager tmux icewm xserver-xorg xinit xterm</code></p><p>At this point our software is installed, but the VM still has a few things needed to get it going.</p><ul><li><p>We need to install and configure the bootloader.</p></li><li><p>We need an /etc/fstab file, or the system will boot with the drive mounted read-only.</p></li><li><p>We should probably make a non-root user with sudo access.</p></li><li><p>There&#8217;s a file in Ubuntu that will prevent Internet access from working. We should delete it now.</p></li></ul><p>The bootloader is pretty easy to install and configure. Just run:</p><p><code>sudo grub-install /dev/nbd0<br>sudo update-grub</code></p><p>For /etc/fstab, there are a few options. One particularly good one is to label the partition we installed Ubuntu into using e2label, then use that label as the ID of the drive we want to mount as root. That can be done like this:</p><p><code>e2label /dev/nbd0p1 ubuntu-inst<br>echo "LABEL=ubuntu-inst / ext4 defaults 0 1" &gt; /etc/fstab</code></p><p>Making a user account is fairly easy:</p><p><code>adduser user   # follow the prompts to create the user<br>adduser user sudo</code></p><p>And lastly, we should remove the Internet blocker file. I don&#8217;t understand why exactly this file exists in Ubuntu, but it does, and it causes problems for me when I make a minimal VM in this way. Removing it fixes the problem.</p><p><code>rm /usr/lib/NetworkManager/conf.d/10-globally-managed-devices.conf</code></p><p><strong>EDIT: January 21, 2024: </strong>This <code>rm</code> command doesn&#8217;t actually work forever - an update to NetworkManager can end up putting this file back, breaking networking again. Rather than using <code>rm</code> on it, you should <code>dpkg-divert</code> it somewhere benign, for instance with <code>dpkg-divert --divert /usr/lib/NetworkManager/conf.d/10-globally-managed-devices.conf --rename /var/nm-globally-managed-devices-junk.old</code>, which should persist even after an update.</p><p>And that&#8217;s it! Now we can exit the chroot, unmount everything, and detach the disk image from our host machine.</p><p><code>exit<br>sudo umount ./vdisk/dev/pts<br>sudo umount ./vdisk/dev<br>sudo umount ./vdisk/proc<br>sudo umount ./vdisk/sys<br>sudo umount ./vdisk<br>sudo qemu-nbd -d /dev/nbd0</code></p><p>Now we can try and boot the VM. But before doing that, it&#8217;s probably a good idea to make a VM launcher script. Run <code>vim ./startVM.sh</code> (replacing &#8220;vim&#8221; with your text editor of choice), then type the following contents into the file:</p><p><code>#!/bin/bash<br>qemu-system-x86_64 -enable-kvm -machine q35 -m 4G -smp 2 -vga qxl -display sdl -monitor stdio -device intel-hda -device hda-duplex -usb -device usb-tablet -drive file=./ubuntu.img,format=qcow2,if=virtio</code></p><p>Refer to the <code>qemu-system-x86_64</code> manpage or QEMU Invocation documentation page at https://www.qemu.org/docs/master/system/invocation.html for more info on what all these options do. Basically this gives you a VM with 4 GB RAM, 2 CPU cores, decent graphics (not 3d accelerated but not as bad as plain VGA), and audio support. You can tweak the amount of RAM and number of CPU cores by changing the <code>-m</code> and <code>-smp</code> parameters respectively. You&#8217;ll have access to the QEMU monitor through whatever terminal you run the launcher script in, allowing you to do things like switch to a different TTY, insert and remove devices and storage media on the fly, and things like that.</p><p>Finally, it&#8217;s time to see if it works.</p><p><code>chmod +x ./startVM.sh<br>./startVM.sh</code></p><p>If all goes well, the VM should boot and you should be able to log in! If you installed IceWM and its accompanying software like mentioned earlier, try running <code>startx</code> once you log in. This should pop open a functional IceWM desktop.</p><p>Some other things you should test once you&#8217;re logged in:</p><ul><li><p>Do you have Internet access? <code>ping -c1 8.8.8.8</code> can be used to test. If you don&#8217;t have Internet, run <code>sudo nmtui</code> in a terminal and add a new Ethernet network within the VM, then try activating it. If you get an error about the Ethernet device being strictly unmanaged, you probably forgot to remove the /usr/lib/NetworkManager/conf.d/10-globally-managed-devices.conf file mentioned earlier.</p></li><li><p>Can you write anything to the drive? Try running <code>touch test</code> to make sure. If you can&#8217;t, you probably forgot to create the /etc/fstab file.</p></li></ul><p>If either of these things don&#8217;t work, you can power off the VM, then re-attach the VM&#8217;s virtual disk to your host machine, mount it, and chroot in like this:</p><p><code>sudo qemu-nbd -f qcow2 -c /dev/nbd0 ./ubuntu.img<br>sudo mount /dev/nbd0p1 ./vdisk<br>sudo chroot vdisk</code></p><p>Since all you&#8217;ll be doing is writing or removing a file, you don&#8217;t need to bind mount all the special directories we had to work with earlier.</p><p>Once you&#8217;re done fixing whatever is wrong, you can exit the VM, unmount and detach its disk, and then try to boot it again like this:</p><p><code>exit<br>sudo umount vdisk<br>sudo qemu-nbd -d /dev/nbd0<br>./startVM.sh</code></p><p>You now have a fully functional, minimal VM! Some extra tips that you may find handy:</p><ul><li><p>If you choose to install an SSH server into your VM, you can use the &#8220;hostfwd&#8221; setting in QEMU to forward a port on your local machine to port 22 within the VM. This will allow you to SSH into the VM. Add a parameter like <code>-nic user,hostfwd=tcp:127.0.0.1:2222-:22</code> to your QEMU command in the &#8220;startVM.sh&#8221; script. This will forward port 2222 of your host machine to port 22 of the VM. Then you can SSH into the VM by running <code>ssh user@127.0.0.1 -p 2222</code>. The &#8220;hostfwd&#8221; QEMU feature is documented at https://www.qemu.org/docs/master/system/invocation.html - just search the page for &#8220;hostfwd&#8221; to find it.</p></li><li><p>If you intend to use the VM through SSH only and don&#8217;t want a QEMU window at all, remove the following three parameters from the QEMU command in &#8220;startVM.sh&#8221;:</p><ul><li><p><code>-vga qxl</code></p></li><li><p><code>-display sdl</code></p></li><li><p><code>-monitor stdio</code></p></li></ul><p>Then add the following switch:</p><ul><li><p><code>-nographic</code></p></li></ul><p>This will disable the graphical QEMU window entirely and provide no video hardware to the VM.</p></li><li><p>You can disable sound support by removing the following switches from the QEMU command in &#8220;startVM.sh&#8221;:</p><ul><li><p><code>-device intel-hda</code></p></li><li><p><code>-device hda-duplex</code></p></li></ul></li></ul><p>There&#8217;s lots more you can do with QEMU and manual Ubuntu installations like this, but I think this should give you a good start. Hope you find this useful! God bless.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://arraybolt3.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Arraybolt's Archives! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[An In-depth Review of the Kubuntu Focus XE Gen 1]]></title><description><![CDATA[A light-yet-powerful Linux-first laptop]]></description><link>https://arraybolt3.substack.com/p/an-in-depth-review-of-the-kubuntu</link><guid isPermaLink="false">https://arraybolt3.substack.com/p/an-in-depth-review-of-the-kubuntu</guid><dc:creator><![CDATA[Aaron Rainbolt]]></dc:creator><pubDate>Fri, 17 Mar 2023 03:06:35 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!SZf8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ca0e27b-df71-49d8-a09e-2287914c812d_1746x1294.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>About four months ago, a friend of mine got me in touch with his employer at the time. I was in a bit of a bind, using rather old and slow hardware (a 3rd gen mobile i5) for my development work, and was hoping to get a newer, faster system to help make things less painful. My friend and his boss managed to get me hooked up with a bug bounty - in exchange for fixing one of several high-priority bugs in the KDE Desktop Environment, I would receive a new Kubuntu Focus system, either a KFocus XE laptop (which is what I ultimately chose), or a KFocus NX desktop. I jumped at the chance, and managed to play a significant role in resolving two of the bugs. I also got a much better computer.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!SZf8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ca0e27b-df71-49d8-a09e-2287914c812d_1746x1294.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!SZf8!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ca0e27b-df71-49d8-a09e-2287914c812d_1746x1294.png 424w, https://substackcdn.com/image/fetch/$s_!SZf8!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ca0e27b-df71-49d8-a09e-2287914c812d_1746x1294.png 848w, https://substackcdn.com/image/fetch/$s_!SZf8!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ca0e27b-df71-49d8-a09e-2287914c812d_1746x1294.png 1272w, https://substackcdn.com/image/fetch/$s_!SZf8!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ca0e27b-df71-49d8-a09e-2287914c812d_1746x1294.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!SZf8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ca0e27b-df71-49d8-a09e-2287914c812d_1746x1294.png" width="1456" height="1079" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8ca0e27b-df71-49d8-a09e-2287914c812d_1746x1294.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1079,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2456029,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!SZf8!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ca0e27b-df71-49d8-a09e-2287914c812d_1746x1294.png 424w, https://substackcdn.com/image/fetch/$s_!SZf8!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ca0e27b-df71-49d8-a09e-2287914c812d_1746x1294.png 848w, https://substackcdn.com/image/fetch/$s_!SZf8!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ca0e27b-df71-49d8-a09e-2287914c812d_1746x1294.png 1272w, https://substackcdn.com/image/fetch/$s_!SZf8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ca0e27b-df71-49d8-a09e-2287914c812d_1746x1294.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" style="height:20px;width:20px" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">A Kubuntu Focus XE laptop displaying my personal system&#8217;s screen.</figcaption></figure></div><p>That was about four months ago. And if you&#8217;ve ever gotten a glimpse of my workflow, you know just how much damage&#8230; er&#8230; testing I can do in four months. I do not treat my systems all that kindly. After having gone through the trials of over seven terabytes of SSD writes, thousands of software compiles, probably over a hundred VM installs, and three distrohops, I finally feel that I can give this system a proper review. For those of you who have been looking into the Kubuntu Focus systems, this should help you get an idea of what you can expect from them, and for those who are on the hunt for a good Linux laptop, this should hopefully help you choose a good one.</p><div><hr></div><h2>First impressions</h2><p>The Kubuntu Focus XE is essentially a nicely modded Clevo laptop with Kubuntu 22.04 LTS and a suite of utilities and extra features. For those of you who don&#8217;t already know this, Kubuntu is an official flavor of the Ubuntu Linux operating system, using the KDE desktop rather than the GNOME desktop. I personally have always been a huge fan of KDE (in fact it was the desktop that came with the first &#8220;real&#8221; distro I ever used), which made the idea of contributing to KDE to get a laptop even more appealing. The Kubuntu installation that comes with the Kubuntu Focus has a ton of value-adding customizations, including hardware optimization, curated apps and libraries, a very efficient setup wizard, built-in file versioning and recovery, a special Quick Help Widget, and several custom-made utilities for changing special hardware and software settings that are difficult to change otherwise.</p><p>The actual laptop is quite thin and light compared to many older systems, and features quite a few I/O ports of various types, including a Gigabit Ethernet port (which is somewhat rare among modern laptops). The keyboard features backlighting, which is always a nice touch if you do a lot of typing, and the cooling system uses dual fans, which looks cool and does a good job of keeping the system cool while under heavy load. Other systems I&#8217;ve used would get quite toasty if you really hammered them, while this one gets warm in just one spot right where the CPU itself is located.</p><p>For specs, the system I received came with an i5-1135G7 processor, 32 GB of 3200 MHz RAM, and a 1 TB Samsung 970 EVO PLUS solid state drive. 32 GB of RAM is a godsend when you&#8217;re doing really intensive work (like running four or more VMs at the same time, something I&#8217;ve been known to do in the past). The SSD&#8217;s size and speed has also been quite welcome, especially since a lot of what I do involves copious amounts of disk writes.</p><p>All in all, things looked pretty impressive initially. The final verdict, however, would depend on how it performed in real-world use.</p><div><hr></div><h2>Kompilation</h2><p>Having done some KDE development work, it seemed only fitting to use the new machine for KDE development. But not normal KDE development. I wasn&#8217;t going to just hack on some source code and do a few builds to test my changes.</p><p>One of the projects I maintain is KForge, which is a KDE development virtual appliance that has all of the needed build and runtime dependencies for almost all KDE software preinstalled. This is quite useful as it has been historically difficult to set up a fully functional KDE development environment due to missing build dependencies. You usually don&#8217;t know you&#8217;re missing a dependency until a build fails, and sometimes the logs left by the build failures are significantly less than helpful.</p><p>However, getting KForge to work just right was tricky for the same reason it&#8217;s tricky to get a decent KDE build environment going. So, if I was going to make sure I was pulling in all of the dependencies for all of the KDE software, I was going to have to compile almost everything in KDE.</p><p>By &#8220;almost everything&#8221;, I mean 300+ packages.</p><p>I ended up deciding to exclude some KDE applications from the build (namely Krita and Kdenlive, both of which I felt would just add too much bulk to the build and wouldn&#8217;t add all that much value), and there was one component I ended up excluding since it was defunct and wasn&#8217;t maintained anymore. But the remaining 300+ pieces of software needed built. The idea was that, if I got all the dependencies right, and if all of the KDE development branches were in buildable states, I would be able to successfully build everything, and that would tell me that I had succeeded at finding all of the dependencies.</p><p>Needless to say, compiling over 300 applications is virtually always going to be a large task even if the apps are somewhat small. Not only were some of these apps <em><strong>not</strong></em> small, many of them were juggernauts (especially KWin, the window manager used by KDE).</p><p>While the system&#8217;s fans do ramp up significantly and can be quite loud during compilation, the system itself actually remains responsive during such a job. Responsive enough for me to just keep using it while the compilation happens in the background. This was somewhat amazing, since my old system was known for randomly freezing when it got hit with a lot of disk writes, and so to be able to hammer the system like this in the background and still have it be usable during that time was massively helpful. Not to mention the dramatically reduced compile times compared to my older system.</p><div><hr></div><h2>Multitasking</h2><p>Part of me isn&#8217;t sure why I do this, but I have a tendency to try and work on two or three projects at once, sometimes more. As a result, I generally have a slew of apps open all over the place that I switch between rapidly. As I write this part of the review, I&#8217;m review-writing, chatting on both IRC and Matrix, and trying to reproduce a bug in Lubuntu, all at the same time. As a result, a well-streamlined DE is very helpful.</p><p>KDE is, for me, very good at making work easy. But the Kubuntu Focus takes things a step further and makes it easy to access virtual desktops, something that Kubuntu usually doesn&#8217;t have enabled by default. Virtual desktops let me break up my work into different &#8220;screens&#8221;. The KFocus has four virtual desktops enabled out of the box, essentially giving me four screens at the same time, all on one screen. Not only that, but I can switch between virtual desktops with Ctrl+F1, Ctrl+F2, etc, allowing me to switch desktops without even having to click on the virtual desktop I want.</p><p>Additionally, the lots of RAM my system came with made multitasking comfortable from a performance perspective - lag was very rare and the times it happened, it was very small, and only happened during things like a massive compile job. (And even that rarely caused any lag.)</p><p>On the hardware side of things, multitasking is also helped by a good keyboard and touchpad - hard-to-press keys and a jumpy or insensitive touchpad can seriously hamper productivity. The keyboard on the KFocus XE is really nice and allows me to type at 100 WPM without problems (and that&#8217;s with a cat on my lap and distractions nearby - I could very likely go faster in an ideal situation). The mousepad was <em>initially</em> tricky since it&#8217;s so big and I would keep accidentally brushing it with my hand - this ended up becoming a non-issue with time as I got used to holding my hands away from it (which is probably better for avoiding carpal tunnel too). Oh, and the mousepad is also quite precise, responsive, and works well even when I&#8217;m doing things at high speeds. The only other problem I&#8217;ve noticed is that the touchpad will occasionally stop responding for no apparent reason. This happens infrequently, but when it happens, I&#8217;m able to simply switch to a TTY by pressing Ctrl+Alt+F3, then return to my desktop with Ctrl+Alt+F1 - this makes the touchpad work again.</p><div><hr></div><h2>Graphics</h2><p>I am not a gamer, and the KFocus XE is not designed for heavy gaming. I have no clue how well this thing performs if you&#8217;re intending to run intensive 3D games on it. That being said, graphics are important even in the general productivity world to some degree.</p><p>The Kubuntu Focus XE boasts a fairly good Intel iRIS XE iGPU, and while Intel&#8217;s integrated graphics are not known for being the pixel-crunching behemoths that NVIDIA and AMD churn out, they&#8217;re generally great for light and moderate uses. That was exactly my use case.</p><p>Everything I threw at the machine graphics-wise worked swimmingly. Full HD video playback is free of stutters and screen tearing. Windows have no stuttering when dragging them (even with the window transparency and wobbly windows that the OS has enabled by default, which look really cool and smooth). Desktop animations are nice and smooth everywhere.</p><p>For 3D performance, I tried using thirdroom.io (which is basically an open-source Metaverse-like thing) in Chrome. My fans got a bit louder, but other than that it seemed to perform OK, though it was somewhat laggy. All of the graphics rendered relatively smoothly. The graphics performance for the Intel iGPU is listed on the KFocus website as being similar to the <a href="https://www.notebookcheck.net/Iris-Xe-G7-80EUs-vs-GeForce-MX250_10395_9561.247598.0.html">NVIDIA GeForce MX250</a> - benchmarks show the Intel iGPU as being as good or better than the MX250 in many tests and only slightly lacking in others.</p><p>The other important part of the graphics experience is the screen. Here I have one gripe&#8230; and before I describe it, I should say, I&#8217;m pretty sure this is my fault - my friend has not had this problem, and I&#8217;ve not seen any other reports of it. The one problem is screen burn-in. If stuff around the edges of the screen stays in the same spot too long, and then I turn the screen off and leave it that way for a while, I can see shadows of the old screen contents later, sometimes quite well. The reason I think this is my fault is because it didn&#8217;t happen at first, and then I left the laptop upside-down trying to improve its cooling airflow during a large compile job. I left it in this state <em>overnight</em>&#8230; and when I opened the laptop in the morning, I could see burn-in. Facepalm. I confirmed with my friend that KFocus XE is <strong>not</strong> intended to be left upside-down like that, and that I may have damaged the screen in so doing. Which would explain why the burn-in happens most near the edges of the screen and much less in the middle. Thankfully, the burn-in mostly goes away on its own if I leave the screen on long enough, and I can use the LCD Scrub screensaver from XScreenSaver to help it out (which may not even be necessary). Other than that, the screen seems to have survived my accidental mistreatment without problems.</p><p>Apart from my most likely self-inflicted burn-in issue, the screen is <em>amazing</em>. Colors are bright and crisp, and details are easily visible even when they&#8217;re small thanks to the Full HD resolution. The closest thing I&#8217;ve had to a monitor this good was a ViewSonic Full HD monitor, and both of the ones I have are dead. Every other Full HD monitor I have either has horrible color or something wrong with the backlight - the KFocus XE screen has neither problem. Coming from a 1366x768 screen, this high-res screen has been a gigantic relief and makes multitasking a lot easier. I can&#8217;t think of any way the screen could be better - if it was any higher resolution, I&#8217;d need display scaling due to its size, and that would essentially negate the best effect of having a higher res monitor (more screen real estate).</p><p>As a whole, the graphics and screen of the KFocus XE have surpassed my expectations and are perfect for everything I do.</p><div><hr></div><h2>Mobility</h2><p>A good laptop generally has to be relatively lightweight, have good battery life, and have good WiFi range in order to be useful as a mobile system. In my experience, the Kubuntu Focus XE has all three.</p><p>For weight, the XE is, as discussed earlier, quite thin and light. Unlike my older system, which was a leg-squisher and could end up causing actual pain if you left it on your lap too long, the XE can remain on my lap for extended periods of time without problems. It&#8217;s not <em>as</em> light as my tablet (an HP Chromebook x2), but it&#8217;s fairly close, which is surprising considering that my tablet is a fanless machine with a rather pathetic processor. Whereas the KFocus XE has dual fans and a powerful processor.</p><p>Battery life is also quite good. I generally prefer battery life<em>time</em> over &#8220;how long can I use the battery before it drains dry&#8221;, so I don&#8217;t have my XE disconnected from its charger for super long, and I use the FlexiCharger feature, which I have set to make the laptop not charge at all until it get to below 40% and stop charging once it hits about 80%. Most of the time, I only use 25% of the battery life at a time, if that. That lasts me for what I would guess is an hour of intensive use, and much longer when in a power-saving mode. According to the Kubuntu Focus team, the battery should last from four hours under heavy use, to as much as ten hours under light use. That fits with my experience, and that also means that the battery in this should last longer than my ChromeOS tablet (which only gives about six to seven hours).</p><p>As for WiFi range, I currently live in a relatively small house where each room is about two rooms away from the room furthest away from it. One would think a house of this size would make it tricky to thoroughly review the WiFi range, but the smallish house is offset by my absolutely pathetic router (alright so it&#8217;s a cellular mobile hotspot about the size of half a deck of cards). I have the hotspot on one side of my house, yet I still get connectivity and decent speeds on the other side of the house most of the time. Considering the very poor quality of the WiFi signal provided by the hotspot, this is really good, and it works perfectly for what I do.</p><div><hr></div><h2>Networking and Connectivity</h2><p>The WiFi chip in the KFocus XE is the Intel AX201, which is a WiFi 6 device that is theoretically capable of 2.4 Gbps speeds. My hotspot doesn&#8217;t provide anything even close to that, but while I may not get the full speed of the chip, I definitely get the full speed of my hotspot, as I see no difference in speeds whether I use a WiFi connection or a direct USB connection to the hotspot.</p><p>The Ethernet included in the KFocus XE is a fairly standard Gigabit Ethernet port with a Realtek controller. It works flawlessly for me, and gives me full gigabit speeds when transferring data from one computer to another via an Ethernet cable. I just set one of the computers to share an IPv4 connection, then put one end of the cable in the laptop, the other end of the cable in the other computer, and then use netcat to beam whatever I need transferred. I can even share an Internet connection to another computer doing this. Ethernet is increasingly rare in modern laptops, yet still very handy in many instances, so this is a very nice feature to have.</p><p>As for the other ports on the system, there&#8217;s a pair of USB3 ports, a pair of USB-C ports (one of which supports Thunderbolt 4), a headphone jack, an SD card slot, and an HDMI port. This is more than sufficient for my uses, and for those who need more ports, the Thunderbolt 4 port should let you attach a docking station to extend the system.</p><p>Another connectivity feature I use is Bluetooth. In my experience, Bluetooth has been quite finicky on other laptops I&#8217;ve used, so I didn&#8217;t have very high expectations here. However, surprisingly, things mostly worked as I would have expected them to. My Bluetooth earbuds connected without problems, and while they are a <em>little</em> fiddly when getting them reconnected, they reconnect pretty easily and work well once connected. (I disconnect and reconnect them manually in the Bluetooth menu, then they work right.)</p><div><hr></div><h2>Aesthetics</h2><p>The KFocus XE not only performs beautifully, it also looks beautiful IMO. There are plenty of well-made design choices both within the OS and in the hardware itself. If you&#8217;ve ever used Kubuntu before, you&#8217;re already familiar with KDE&#8217;s aesthetics. The customized Kubuntu installation that comes with the KFocus XE keeps the same basic look-and-feel, but also throws in a few more nice-looking (and even functional) design elements.</p><p>The most noticeable of these additions is the Quick Help Widget on the desktop (visible in the screenshot near the start of the review). The widget looks sharp and complements the rest of the design rather well. It has several pages inside loaded with numerous keyboard shortcuts, terminal commands, and even a Vim cheat sheet.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Npd-!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81681d85-9851-4f95-b63d-2ee5dc89de4b_434x674.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Npd-!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81681d85-9851-4f95-b63d-2ee5dc89de4b_434x674.png 424w, https://substackcdn.com/image/fetch/$s_!Npd-!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81681d85-9851-4f95-b63d-2ee5dc89de4b_434x674.png 848w, https://substackcdn.com/image/fetch/$s_!Npd-!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81681d85-9851-4f95-b63d-2ee5dc89de4b_434x674.png 1272w, https://substackcdn.com/image/fetch/$s_!Npd-!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81681d85-9851-4f95-b63d-2ee5dc89de4b_434x674.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Npd-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81681d85-9851-4f95-b63d-2ee5dc89de4b_434x674.png" width="434" height="674" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/81681d85-9851-4f95-b63d-2ee5dc89de4b_434x674.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:674,&quot;width&quot;:434,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:376824,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Npd-!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81681d85-9851-4f95-b63d-2ee5dc89de4b_434x674.png 424w, https://substackcdn.com/image/fetch/$s_!Npd-!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81681d85-9851-4f95-b63d-2ee5dc89de4b_434x674.png 848w, https://substackcdn.com/image/fetch/$s_!Npd-!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81681d85-9851-4f95-b63d-2ee5dc89de4b_434x674.png 1272w, https://substackcdn.com/image/fetch/$s_!Npd-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81681d85-9851-4f95-b63d-2ee5dc89de4b_434x674.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" style="height:20px;width:20px" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>There&#8217;s also a couple of window effects enabled by default that I mentioned earlier - transparency and wobbly windows. In essence, when you grab a window in order to move it across the screen, the window becomes transparent, allowing you to see underneath it while moving it. The window will also &#8220;flow&#8221; as you move it, making the movement look smoother. The wobbly windows effect also causes windows to visibly &#8220;snap&#8221; into place if you use window snapping, which is kind of the visual equivalent of tactile feedback - you can &#8220;feel&#8221; the window snap into place properly.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Z1bX!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30f0c59a-9feb-4d79-9004-b1cc4f0d964b_1920x1080.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Z1bX!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30f0c59a-9feb-4d79-9004-b1cc4f0d964b_1920x1080.png 424w, https://substackcdn.com/image/fetch/$s_!Z1bX!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30f0c59a-9feb-4d79-9004-b1cc4f0d964b_1920x1080.png 848w, https://substackcdn.com/image/fetch/$s_!Z1bX!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30f0c59a-9feb-4d79-9004-b1cc4f0d964b_1920x1080.png 1272w, https://substackcdn.com/image/fetch/$s_!Z1bX!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30f0c59a-9feb-4d79-9004-b1cc4f0d964b_1920x1080.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Z1bX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30f0c59a-9feb-4d79-9004-b1cc4f0d964b_1920x1080.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/30f0c59a-9feb-4d79-9004-b1cc4f0d964b_1920x1080.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2178490,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Z1bX!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30f0c59a-9feb-4d79-9004-b1cc4f0d964b_1920x1080.png 424w, https://substackcdn.com/image/fetch/$s_!Z1bX!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30f0c59a-9feb-4d79-9004-b1cc4f0d964b_1920x1080.png 848w, https://substackcdn.com/image/fetch/$s_!Z1bX!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30f0c59a-9feb-4d79-9004-b1cc4f0d964b_1920x1080.png 1272w, https://substackcdn.com/image/fetch/$s_!Z1bX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30f0c59a-9feb-4d79-9004-b1cc4f0d964b_1920x1080.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" style="height:20px;width:20px" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>On the hardware side of things, there are several nice touches that add to the system&#8217;s aesthetic value, most noticeably the hexagonal hinges on the screen, the Kubuntu logo on the Meta key (where you usually see a Windows logo on most laptops), and the mitered angles on the edges of the recessed keyboard. The backlighting on the keyboard is also a nice touch (both functionally and aesthetically).</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!wuYA!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd907a2f-a41c-46c7-8c10-971b27161914_1254x976.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!wuYA!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd907a2f-a41c-46c7-8c10-971b27161914_1254x976.png 424w, https://substackcdn.com/image/fetch/$s_!wuYA!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd907a2f-a41c-46c7-8c10-971b27161914_1254x976.png 848w, https://substackcdn.com/image/fetch/$s_!wuYA!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd907a2f-a41c-46c7-8c10-971b27161914_1254x976.png 1272w, https://substackcdn.com/image/fetch/$s_!wuYA!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd907a2f-a41c-46c7-8c10-971b27161914_1254x976.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!wuYA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd907a2f-a41c-46c7-8c10-971b27161914_1254x976.png" width="1254" height="976" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fd907a2f-a41c-46c7-8c10-971b27161914_1254x976.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:976,&quot;width&quot;:1254,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:646416,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!wuYA!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd907a2f-a41c-46c7-8c10-971b27161914_1254x976.png 424w, https://substackcdn.com/image/fetch/$s_!wuYA!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd907a2f-a41c-46c7-8c10-971b27161914_1254x976.png 848w, https://substackcdn.com/image/fetch/$s_!wuYA!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd907a2f-a41c-46c7-8c10-971b27161914_1254x976.png 1272w, https://substackcdn.com/image/fetch/$s_!wuYA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd907a2f-a41c-46c7-8c10-971b27161914_1254x976.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" style="height:20px;width:20px" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div><hr></div><h2>Setup</h2><p>I saved this part for near the end since, in all likelihood, you&#8217;re only going to go through the setup procedure once per reinstall, and you&#8217;re going to reinstall very rarely, if ever. Most of what you do is going to be done once everything has been set up. But the setup procedure on the Kubuntu Focus is a major feature of the OS it ships with, so I felt it was worth reviewing.</p><p>This part was somewhat shocking for me. Most of the time, once I install a new OS on my system, it takes me a while to get fully set up. A lot of the apps I use aren&#8217;t installed by default, getting logged into everything takes time, etc. The worst part is that I have a very bad tendency to forget things, so I won&#8217;t end up getting some part of my workflow set up <em>at all</em> until I hit something where I need it to be set up. The Kubuntu Focus has an entire initial setup wizard that makes a massive amount of the initial setup work way easier. And there are a ton of preinstalled apps, many of which are ones I actually use. The wizard has several neat features built into it, including helping me remember to log into my email. (That part was particularly helpful since I&#8217;m pretty sure I&#8217;ve had at least one time when I only remembered to log into Thunderbird because I went to check my email.)</p><p>After a few minutes of downloads and logins, most of everything I needed was set up. I did end up having to install a few apps myself, as well as my Ubuntu development utilities. And I think I found one small bug in the wizard when I rejected VirtualBox&#8217;s Personal Use and Evaluation License for their expansion pack because I didn&#8217;t want to use Oracle&#8217;s proprietary VBox addons and comply with the restrictions that came with them. Doing so still let VirtualBox install (which was correct), but also left it marked as autoremovable (not correct). No big deal, I ended up installing a newer version of VirtualBox from the main VBox website anyway. It&#8217;s a setup wizard, it&#8217;s not going to magically read your mind and set up everything perfectly the first time. But it got pretty close, and that was close enough to save me a ton of setup time.</p><p>One unique part of the setup process is the &#8220;Curated Apps&#8221; feature. Somehow (and I don&#8217;t fully understand how), the Kubuntu Focus people have a website where you can click on the icon of an app you want to install (from a list of apps they recommend), <em>and it will automatically do the installation for you.</em> You have to type your password (thankfully!), but aside from that, it&#8217;s a one-touch installation procedure. Through a website. (I&#8217;m guessing there&#8217;s a client-side thingy built into the OS that makes this work.) It can even launch an app if its already installed or if you&#8217;ve just installed it. I installed several apps through the Curated Apps page, including VSCode, which is usually a bit tricky to set up. The installation process for each app was simpler even than using the Google Play store.</p><p>The whole setup procedure was drastically different from the usual &#8220;Bailing out, you&#8217;re on your own, good luck&#8221; post-install experience most other operating systems leave you with. It was an extremely good intro to a fantastic system, and it helped me a lot.</p><div><hr></div><h2>Distrohopping</h2><p>The built-in Kubuntu operating system works quite well and should be all most people need. But some of us either need to use a different distro, or want to explore other distros on our physical hardware. So far I haven&#8217;t tried distros other than official Ubuntu flavors, since I really like the Ubuntu ecosystem. But within the Ubuntu ecosystem at least, the KFocus XE works like a champ.</p><p>I tried two other Ubuntu flavors (Lubuntu 23.04 Alpha and Ubuntu Unity 22.10), and both of them worked very well out of the box. I assume that other distros like Fedora, Arch, or openSUSE would very likely work well, since the hardware in the KFocus is quite Linux-friendly.</p><p>There are a couple of downsides of using a different Ubuntu flavor on the KFocus XE. For one, you lose a bunch of the tools that the Kubuntu Focus Suite has built in, like the fan profile settings. You may also not end up being able to set a power profile like KDE allows you to do. You can install the Kubuntu Focus Tools on other distros, however this will probably pull in a lot of KDE dependencies since the Kubuntu Focus Tools, are, unsurprisingly, Kubuntu-focused. Personally, I just lived without them when I was trying out different distros.</p><p>The other downside is the loss of system component curation. One hidden feature that you usually won&#8217;t see on the KFocus is the fact that the Kubuntu Focus team tests updates to several important components, such as the curated apps and the kernel, before releasing those updates to end-user systems. So if, for instance, a kernel update breaks some hardware, you won&#8217;t get that update, and your hardware will continue to work right. When you&#8217;re using other distros, the Kubuntu Focus team no longer can control those updates, and so if an update breaks something, you&#8217;ll probably end up seeing that breakage. </p><p>Aside from those two problems, the user experience when using different Ubuntu flavors was flawless for me. All hardware worked out of the box without issues (except for Bluetooth was much finickier on Ubuntu Unity than it was on Kubuntu, which may have been a consequence of lacking the curated system components). The system performed perfectly well, and I was able to use it just like I&#8217;d use any other computer I installed Linux on.</p><p>Pretty much anything with a Linux 5.17 or newer kernel should work, if I&#8217;m understanding correctly. (The 5.15 kernel is probably not ideal.) Ubuntu 22.04.2 or higher should work out of the box. There aren&#8217;t any required third-party drivers, so as long as your distro of choice ships with a reasonable set of in-kernel drivers, everything should just work out of the box, even if you&#8217;re using a non-Ubuntu distro.</p><div><hr></div><h2>Final thoughts</h2><p>I mean, this is the best laptop I&#8217;ve ever used in my life. It&#8217;s fast, it&#8217;s powerful, everything works smoothly, it looks nice, and it makes it easy to get work done. That&#8217;s what a good laptop should do. If you&#8217;re into Linux and want a laptop that just works, I&#8217;d highly recommend the Kubuntu Focus XE. It&#8217;s amazing.</p><p>Thanks for taking a look, and I hope this has helped you in some way. Thanks to Michael and the Kubuntu Focus team for making these awesome systems, and for giving me the opportunity to work for one!</p>]]></content:encoded></item><item><title><![CDATA[A brief history of my experience with Linux]]></title><description><![CDATA[From developing newbie to Ubuntu Developer]]></description><link>https://arraybolt3.substack.com/p/a-brief-history-of-my-experience</link><guid isPermaLink="false">https://arraybolt3.substack.com/p/a-brief-history-of-my-experience</guid><dc:creator><![CDATA[Aaron Rainbolt]]></dc:creator><pubDate>Thu, 09 Mar 2023 11:21:32 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!U9th!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81afb1c6-f320-42fc-97ab-f1de570fde3a_288x288.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>From an early age, I&#8217;ve been very interested in computers. They were fascinating and profoundly powerful devices, capable of doing things that were (and in some ways still are) beyond my understanding. Like many of us, I started on Windows, and like many of us who started out computing when we were kids, I did a <em>lot</em> of damage to my first computer. I still haven&#8217;t grown out of breaking computers, I&#8217;ve just gotten a lot better at planning how I&#8217;m going to break them and what to do in order to fix them after the fact.</p><p>Fast forward several years. I&#8217;ve heard of Linux, read books about how to do some things like web development on Linux, and am thinking about trying Linux. I wanted to do music recording at the time too (something I&#8217;m still planning on doing). I didn&#8217;t have a working Internet connection, so I got in the car with my friend and went to a place that had Internet in order to download some Linux distros to try out.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://arraybolt3.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Arraybolt's Archives! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>The first distro I ever used was HP QuickWeb (<a href="https://en.m.wikipedia.org/wiki/Splashtop_OS">Splashtop OS</a>), which came with my Windows 7 laptop. I knew <em>nothing</em> about Linux at the time, I just found this QuickWeb thing included with my computer and decided to try it out in order to keep things isolated from my Windows installation. (In retrospect, this probably didn&#8217;t work at all, but I didn&#8217;t know that&#8230;) Basically it was nothing more than a Linux kernel, a simple and glitchy desktop, and a severely outdated copy of Firefox that I didn&#8217;t know better than to use. From this insecure and buggy mess, my journey into Linux began.</p><p>After fighting with QuickWeb&#8217;s browser for a bit, I learned about a distro called KXStudio, which was supposed to be geared towards music production. (KXStudio has since switched from being a distro to being a third-party repo that you use on top of Kubuntu, which severely confused me, since I didn&#8217;t know the difference between a repo and a distro at the time.) After a lot of searching, I managed to find KXStudio 14.04, from back when KXStudio was still a distro. I downloaded it, along with a few other distros that I ultimately didn&#8217;t end up getting to work, and also grabbed VirtualBox so that I could run the distros in a VM.</p><p>Let&#8217;s just say that combining a buggy distro with a total newbie resulted in chaos.</p><p>I went through quite a few &#8220;stages&#8221; learning how Linux worked, everything from &#8220;Where on earth is my C: drive?&#8221; to &#8220;Great, I just broke my audio, now what?&#8221;. It was pretty interesting. I also had to deal with the glitchiness and complexity of VirtualBox, as well as the fact that the distro I was using was not exactly newbie-friendly. The whole thing was a total mess. A very fun total mess. Before long, I had decided to install Linux on some physical hardware that I had available (which led to even more chaos, especially when UEFI came into the picture), and after days of headaches, many reinstalls, and tons of breakage, I was finally getting good enough at Linux usage to start using it as my daily driver on three different computers (a desktop and two laptops).</p><p>My third distro was ChaletOS 16.04. ChaletOS was essentially a modded Xubuntu variant made to look and feel a lot like Windows. It also has the Wine Windows Compatibility Layer preinstalled, making it compatible with a lot of Windows software out of the box. I didn&#8217;t use Wine very much - I was more interested in the beautiful UI, mostly smooth operation, and powerful features it provided. I was starting to get into more advanced Linux usage, and was for the first time using a sorta-halfway supported OS (all the ones I had used up until then were already EOL or very nearly EOL, if I remember correctly). I also had a working Internet connection, which greatly improved my ability to download software and research things. At this point I was almost entirely &#8220;sold&#8221; on Linux, and was only still using Windows on one laptop. That one laptop was important because it had a development environment on it that ran on Windows 7 inside a Hyper-V virtual machine inside Windows 8.0 Pro. I was reluctant to switch to Linux there because I knew Hyper-V wouldn&#8217;t run on Linux and I didn&#8217;t want to mess up the Windows 7 VM&#8217;s activation status by moving from Hyper-V to QEMU.</p><p>While using ChaletOS on my other laptop (not the one with the important development environment), I tried a bunch of different distros in VMs, including really weird ones like BasicLinux (don&#8217;t ever use it, it&#8217;s a nightmare) and Calculate Linux (Gentoo derivative, that was a total fail because hilariously I couldn&#8217;t figure out what the package manager&#8217;s name was). And then, in the midst of my distro-hopping adventures, I stumbled across two distros that almost immediately became my favorites. It was around the time of April 2020. Ubuntu 20.04 and its flavors has just been released recently. And it was during that time I discovered Kubuntu and Lubuntu.</p><p>I can&#8217;t remember which one I tried first, but I remember quite well some of my initial experiments with them. After playing with both Kubuntu and Lubuntu in VMs, I decided to install Lubuntu onto a flash drive and boot my non-development laptop from it. The extremely smooth experience Lubuntu 20.04 provided, the beautiful and simple UI, everything was almost perfect. Kubuntu was really nice, but it was a bit heavier and the laptop I was using for testing only had 4 GB RAM and no internal hard drive (it always booted from a USB stick, or from an SD card using a hack), so a lightweight OS was important to me. I used that OS a <em>lot</em>, and even booted my important development laptop from my Lubuntu USB stick to see what would happen (it worked quite well).</p><p>While I ended up loving Lubuntu, I was somewhat partial to Kubuntu since it was the basis of KXStudio, and the extreme power of the KDE desktop was a serious plus that Lubuntu&#8217;s LXQt desktop didn&#8217;t have. I had ended up having a slight mess with my Windows 7 VM on the development laptop which resulted in me having to re-activate it (long story short, don&#8217;t expect to restore a Hyper-V VM from a backup of only the .vhd files without the rest of the VM config!), and as a result, I was no longer so scared of having to move my VM to Linux using QEMU. I took the plunge and wiped Windows 8 with Kubuntu 20.04 on my main development laptop, then got my Windows 7 VM set up inside QEMU (where it actually worked better than it did on Hyper-V). Everything was working exactly as I had hoped (except for one small hiccup that resulted in an OS reinstall due to a combination of inexperience and paranoia, but that was overcome without too much trouble in the long run).</p><p>After a long bit of life lived in 20.04-land (and a brief stint with Lubuntu and Ubuntu Studio 21.10), Ubuntu 22.04 was released. I had finally mostly gotten a grip on how Ubuntu and Linux really worked, and was interested in trying to help with Ubuntu&#8217;s development. I had looked into helping in the past, but hadn&#8217;t actually gone ahead and tried to help. I joined the #lubuntu-devel channel with the nick &#8220;Guest3&#8221; and asked about the possibility of writing software documentation for Lubuntu. I surprisingly got replied to almost immediately by two members of the Lubuntu team, switched my IRC nick from Guest3 to arraybolt3, and before long was helping with testing, documentation writing, and debugging. (It all just kinda happened - I was there and stuff was happening and I ended up getting to try to help and it all worked really well.) I ended up helping with the development of Lubuntu and a couple of the other Ubuntu flavors during the Kinetic Kudu development cycle and the 22.04.1 release, and six hectic months of excitement later, Ubuntu 22.10 and its flavors were released.</p><p>That first step into the Ubuntu development world was about 10 months ago. We are now nearing the release of Ubuntu 23.04, and have since released 20.04.5 and 22.04.2. The joy of getting to contribute to an OS I&#8217;ve been using for years has been amazing, and I look forward to continuing to contribute in the future.</p><p>That was about four years of computing packed into a short article. Hope you found this enjoyable and helpful, and see you later!</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://arraybolt3.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Arraybolt's Archives! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Coming soon]]></title><description><![CDATA[This is Arraybolt&#39;s Archives.]]></description><link>https://arraybolt3.substack.com/p/coming-soon</link><guid isPermaLink="false">https://arraybolt3.substack.com/p/coming-soon</guid><dc:creator><![CDATA[Aaron Rainbolt]]></dc:creator><pubDate>Tue, 28 Feb 2023 05:21:34 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!U9th!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81afb1c6-f320-42fc-97ab-f1de570fde3a_288x288.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>This is Arraybolt&#39;s Archives.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://arraybolt3.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://arraybolt3.substack.com/subscribe?"><span>Subscribe now</span></a></p>]]></content:encoded></item></channel></rss>