<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>Bytes &amp; Bobs</title>
		<link>https://bytesandbobs.net/</link>
		<description>Recent content on Bytes &amp; Bobs</description>
		<generator>Hugo</generator>
		<language>en-gb</language>
		
		
		
		
			<lastBuildDate>Sat, 17 Oct 2026 13:03:24 +0100</lastBuildDate>
		
			<atom:link href="https://bytesandbobs.net/index.xml" rel="self" type="application/rss+xml" />
			<item>
				<title>Hugo Tips</title>
				<link>https://bytesandbobs.net/posts/hugo-tips/</link>
				<pubDate>Sat, 17 Oct 2026 13:03:24 +0100</pubDate>
				<guid>https://bytesandbobs.net/posts/hugo-tips/</guid>
				<description>&lt;p&gt;Like my previous post of &lt;a href=&#34;https://bytesandbobs.net/posts/zola-tips/&#34;&gt;Zola tips&lt;/a&gt;, having migrated to Hugo, I&amp;rsquo;ll&#xA;document here anything I find that I&amp;rsquo;ve needed to research or do to make Hugo do&#xA;something I&amp;rsquo;ve wanted.&lt;/p&gt;&#xA;&lt;h2 id=&#34;literal-hugo-shortcodes-in-markdown&#34;&gt;Literal Hugo shortcodes in markdown&lt;/h2&gt;&#xA;&lt;p&gt;Inevitably I will write as much about Hugo as I write about anything else. I will therefore, as in this post, want to show literal shortcodes and other things that Hugo will try to interpret. To write something like &lt;code&gt;{{&amp;lt; some_short_code ... &amp;gt;}}&lt;/code&gt; you need to add additional markup so Hugo&amp;rsquo;s build doesn&amp;rsquo;t try to actually run the shortcode. This post is even more awkward, because I now need to write the escaped version of the shortcode verbatim&amp;hellip;&lt;/p&gt;&#xA;&lt;p&gt;What you need to write in your markdown to show &lt;code&gt;{{&amp;lt; some_short_code ... &amp;gt;}}&lt;/code&gt; is:&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;{{&amp;lt;/* some_short_code ... */&amp;gt;}}&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Incidentally, what I wrote to be able to show the comment syntax just above is:&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;{{&amp;lt;/*/* some_short_code ... */*/&amp;gt;}}&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Effectively, in your markdown you need one more set of &lt;code&gt;/*&lt;/code&gt;, &lt;code&gt;*/&lt;/code&gt; than you want displayed in your post.&lt;/p&gt;&#xA;&lt;h2 id=&#34;linking-to-other-posts&#34;&gt;Linking to other posts&lt;/h2&gt;&#xA;&lt;p&gt;Linking to other posts isn&amp;rsquo;t difficult. E.g. to link to this post I could use the following markdown, &lt;code&gt;[Hugo tips](/posts/hugo-tips)&lt;/code&gt;. However, what if I wrote &lt;code&gt;/posts/huggo-tips&lt;/code&gt; (typo)? That&amp;rsquo;s a broken link and I wouldn&amp;rsquo;t notice. You can use the &lt;code&gt;relref&lt;/code&gt; shortcode instead, and that will verify the link is valid at build time, preventing the build if it is not.&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;[Hugo tips]({{&amp;lt; relref &amp;#34;posts/hugo-tips&amp;#34; &amp;gt;}})&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Now, if you get it wrong, you&amp;rsquo;ll see an error like the following in the console.&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;ERROR [en] REF_NOT_FOUND: Ref &amp;ldquo;posts/huggo-tips&amp;rdquo;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;Be aware that if you link to a draft, using &lt;code&gt;hugo serve&lt;/code&gt; for example will error,&#xA;because the drafts aren&amp;rsquo;t being built.&lt;/p&gt;&#xA;&lt;h2 id=&#34;full-content-in-rss-feed&#34;&gt;Full content in RSS feed&lt;/h2&gt;&#xA;&lt;p&gt;By default Hugo&amp;rsquo;s RSS feed only includes article summaries. That&amp;rsquo;s fine if that&amp;rsquo;s your thing, but I want the full content in there. Fortunately, I&amp;rsquo;m not the only one and the answer I found was at &lt;a href=&#34;https://www.junian.dev/blog/hugo-full-text-rss/&#34;&gt;Junian.Dev&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;The short version is, grab the &lt;a href=&#34;https://github.com/gohugoio/hugo/blob/master/tpl/tplimpl/embedded/templates/rss.xml&#34;&gt;default Hugo RSS template&lt;/a&gt;, save it&#xA;in &lt;code&gt;layouts/_default/rss.xml&lt;/code&gt; and change the single reference of &lt;code&gt;.Summary&lt;/code&gt; to&#xA;&lt;code&gt;.Content&lt;/code&gt;.&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>Migrating to Hugo From Zola</title>
				<link>https://bytesandbobs.net/posts/migrating-to-hugo-from-zola/</link>
				<pubDate>Sat, 17 Oct 2026 13:02:40 +0100</pubDate>
				<guid>https://bytesandbobs.net/posts/migrating-to-hugo-from-zola/</guid>
				<description>&lt;p&gt;I&amp;rsquo;m not sure what percentage of this site is dedicated to itself, but it&amp;rsquo;s probably much higher than it should be.&lt;/p&gt;&#xA;&lt;p&gt;Since 2021, this site has used the static site generator (herein &amp;ldquo;SSG&amp;rdquo;) Zola. I like Zola a lot and spent some time, particularly early on, bending it to my will. As I&amp;rsquo;ve posted a little less frequently however, I&amp;rsquo;ve noticed that every time I want to write something new, I spend at least half the time fixing whatever changed in Zola/Tera rather than writing. I don&amp;rsquo;t have the Rust etc. set up, so typically just grab Zola from Flathub, so I&amp;rsquo;m beholden to the versions there, rather than pinning a specific version.&lt;/p&gt;&#xA;&lt;p&gt;Yes, I&amp;rsquo;m aware it wouldn&amp;rsquo;t be &lt;em&gt;that&lt;/em&gt; difficult to get a pinned version.&lt;/p&gt;&#xA;&lt;p&gt;But 5 years is a long time, so time for a change. This time, it&amp;rsquo;s Hugo&amp;rsquo;s turn. I deliberately didn&amp;rsquo;t choose Hugo last time and the reason is the same reason I &lt;em&gt;am&lt;/em&gt; choosing it this time. It&amp;rsquo;s written in Go and uses Go&amp;rsquo;s templating. I&amp;rsquo;m a Go developer (amoungst other things) - previously I wanted the things I do outside of work to be as unrelated as possible; now however, I just want it to work! What would take me an hour to work out with Zola will probably only take 10 minutes with Hugo, so here we are.&lt;/p&gt;&#xA;&lt;p&gt;The migration itself was actually not too bad. The structure and formatting/frontmatter for content is almost identical between the two SSGs. All I did was:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Modify a few org-mode drafts so they weren&amp;rsquo;t published with &lt;code&gt;#+DRAFT: true&lt;/code&gt; (Hugo supports org-mode for content).&lt;/li&gt;&#xA;&lt;li&gt;Make Go versions of the shortcodes I was using (primarily for images) and change in in-content markup (effectively &lt;code&gt;{{ post_image ... }}&lt;/code&gt; became &lt;code&gt;{{&amp;lt; post_image ... &amp;gt;}}&lt;/code&gt;).&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;Other than that, I broadly followed the &lt;a href=&#34;https://gohugo.io/getting-started/quick-start/&#34;&gt;quickstart&lt;/a&gt; in a new directory:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;code&gt;hugo new project migrate&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;hugo new theme basic&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;hugo --buildDrafts&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;Then it was just a case of getting to grips with the theme layouts and template variables Hugo uses, updating the themes and pages and fiddling with the config a bit. Naturally, this was all made much simpler by the fact that this site is small, and I didn&amp;rsquo;t use that many Zola features.&lt;/p&gt;&#xA;&lt;p&gt;One breaking change I&amp;rsquo;ve made is is moving posts into a /posts prefix. I will sort out redirects at some point.&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>Posteo IMAP in KDE (missing inbox)</title>
				<link>https://bytesandbobs.net/posts/posteo-imap-in-kmail/</link>
				<pubDate>Mon, 25 May 2026 00:00:00 +0000</pubDate>
				<guid>https://bytesandbobs.net/posts/posteo-imap-in-kmail/</guid>
				<description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;tl;dr&lt;/strong&gt; Settings -&amp;gt; Configure KMail -&amp;gt; Accounts -&amp;gt; Receiving -&amp;gt;&#xA;[Your account] -&amp;gt; Modify -&amp;gt; Advanced tab. Click &amp;ldquo;Serverside&#xA;subscriptions&amp;hellip;&amp;rdquo; button, ensure INBOX is checked.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;I set up a shiny new Posteo account in KMail and was a little confused&#xA;when I saw all the expected folders in the list &lt;em&gt;except&lt;/em&gt; for the&#xA;inbox, which I thought was an odd omission by default. Interestingly,&#xA;this seems to be specific to KMail - FairEmail on my phone managed it&#xA;just fine (however, I&amp;rsquo;ve noticed this app is particularly robust and&#xA;almost always works as expected).&lt;/p&gt;&#xA;&lt;p&gt;The fix? Add the server-side subscription.&lt;/p&gt;&#xA;&lt;figure&gt;&#xA;    &lt;a href=&#34;https://bytesandbobs.net/posts/posteo-imap-in-kmail/posteo-imap-advanced-settings_hu_6370020bead796f8.png&#34;&gt;&#xA;        &lt;img src=&#34;https://bytesandbobs.net/posts/posteo-imap-in-kmail/posteo-imap-advanced-settings_hu_ed0de102636526b7.png&#34; alt=&#34;Screenshot of advanced IMAP settings in KMail, showing the server-side subscriptions&#34;/&gt;&#xA;    &lt;/a&gt;&#xA;    &lt;figcaption&gt;Screenshot of advanced IMAP settings in KMail, showing the server-side subscriptions&lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;&#xA;&lt;p&gt;Open up KMail settings, and head to Accounts -&amp;gt; Receiving -&amp;gt; [Your account] -&amp;gt; Modify -&amp;gt; Advanced tab, then click the &amp;ldquo;Serverside subscriptions&amp;hellip;&amp;rdquo; button. In the window that appears, ensure &amp;ldquo;INBOX&amp;rdquo; is checked and hit OK. The next fetch should now show your inbox.&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>Ryzen 5 AI 340 Framework 13 laptop and Fedora</title>
				<link>https://bytesandbobs.net/posts/ryzen-5-framework-laptop-and-fedora/</link>
				<pubDate>Sat, 02 Aug 2025 00:00:00 +0000</pubDate>
				<guid>https://bytesandbobs.net/posts/ryzen-5-framework-laptop-and-fedora/</guid>
				<description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;tl;dr&lt;/strong&gt; Got a Ryzen 5 Framework 13 laptop - it&amp;rsquo;s great!&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;For the first time since ~2010, I decided to buy myself a new (actually new)&#xA;laptop. I&amp;rsquo;ve had my previous laptop, a 2015 MacBook Air, since around 2020, and&#xA;it was definitely beginning to feel like an older machine. It also lacked some&#xA;quality of life features like a fingerprint scanner (which I am treated to&#xA;during the week on my work M3 Pro MacBook Pro - I mention this so it can be used&#xA;as a reference for something I am useful when givincomparisonsg opinions on the Framework).&#xA;But let&amp;rsquo;s start at the beginning - how did I choose it?&lt;/p&gt;&#xA;&lt;h2 id=&#34;requirements-and-shortlist&#34;&gt;Requirements and shortlist&lt;/h2&gt;&#xA;&lt;p&gt;There were a few things I really wanted in a laptop. It needed to:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;be fairly quick. I don&amp;rsquo;t need a powerhouse (I have a decent PC), but wanted it&#xA;to be able to do any programming (or other) task I want to do without it&#xA;feeling like a chore; also some light gaming if I&amp;rsquo;m away - this is far from&#xA;its primary purpose however, so wasn&amp;rsquo;t a major consideration.&lt;/li&gt;&#xA;&lt;li&gt;have some form of biometrics for login, not &lt;em&gt;necessary&lt;/em&gt;, but a real nice to&#xA;have.&lt;/li&gt;&#xA;&lt;li&gt;be small - I didn&amp;rsquo;t want anything over 13&amp;quot; (why do we still do screen sizes in&#xA;imperial units?). I don&amp;rsquo;t travel a lot - this is a somewhat arbitrary&#xA;preference - I like small computers.&lt;/li&gt;&#xA;&lt;li&gt;have a decent screen resolution, without being unnecessarily high (more for&#xA;the graphics card to power, increased battery usage).&lt;/li&gt;&#xA;&lt;li&gt;have a decent touchpad.&lt;/li&gt;&#xA;&lt;li&gt;half decent battery life - a real-world 6+ hours.&lt;/li&gt;&#xA;&lt;li&gt;run Linux, ideally without any faff.&lt;/li&gt;&#xA;&lt;li&gt;ideally repairable and upgradable, at least SSD and RAM, and ideally battery&#xA;too.&lt;/li&gt;&#xA;&lt;li&gt;not be &lt;em&gt;too&lt;/em&gt; expensive.&lt;/li&gt;&#xA;&lt;li&gt;somewhat arbitrarily, I wanted an AMD machine.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;After some initial poking around, it ultimately seemed to boil down to the&#xA;following (which met at least some of the above list):&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Framework 13. Small, light, decent screen, repairable/upgradable.&lt;/li&gt;&#xA;&lt;li&gt;Used ThinkPad T- or X-series. Quite expensive new, but decently available when&#xA;a few years old.&lt;/li&gt;&#xA;&lt;li&gt;Dell Latitude or XPS. Ditto ThinkPad.&lt;/li&gt;&#xA;&lt;li&gt;StarLabs Lite V. Didn&amp;rsquo;t strictly fit the requirements, but I do like the idea&#xA;of an actual Linux tablet. I also really liked the look of the previous Lite&#xA;IV.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;I&amp;rsquo;ve been aware of Framework for a while, but had never really looked into them&#xA;too much since I wasn&amp;rsquo;t looking to replace my laptop until recently. Initially I&#xA;discounted it as too expensive, and many reviews suggested the battery life&#xA;wasn&amp;rsquo;t particularly good. But some of the components come in translucent&#xA;plastic&amp;hellip;&lt;/p&gt;&#xA;&lt;p&gt;ThinkPad-wise I ended up deciding that I wanted something new. Last time I&#xA;bought a new laptop was ~2012 (I think?) and that was a Dell XPS from their&#xA;outlet. I decided I&amp;rsquo;d pay a little more this time to get current-generation&#xA;hardware that can last me a bit longer. I don&amp;rsquo;t mind buying second hand, but I&amp;rsquo;m&#xA;really bad at selling things, so if I have something that lasts (me) not that&#xA;long, it&amp;rsquo;ll inevitably sit in a cupboard for a few years before I get round to&#xA;selling it, cluttering my house (and mind!). I &lt;em&gt;still&lt;/em&gt; have a ThinkPad X220T I&#xA;used while I was at university lying around somewhere.&lt;/p&gt;&#xA;&lt;p&gt;Dell-wise, there are just so many variations available in some fairly uninspired&#xA;chassis, so I didn&amp;rsquo;t really pursue this too much more. They&amp;rsquo;re also expensive,&#xA;like the ThinkPads.&lt;/p&gt;&#xA;&lt;p&gt;The StarLabs tablet could have been a contender if it had some form of&#xA;biometrics for log in. I figured for something that would at least sometimes be&#xA;used as a tablet, having to type in a password whenever it locked would be&#xA;really annoying, so I reluctantly ruled it out. Being a proper Linux tablet&#xA;however makes it a bit of an oddball, so it was &lt;em&gt;really&lt;/em&gt; hard to rule out (I do like an unusual machine).&lt;/p&gt;&#xA;&lt;p&gt;That left the Framework. Once I started doing some proper research into this,&#xA;and digging a bit more into the claims of poor battery life, it became clear&#xA;that it depended considerably on a) the generation and b) the configuration.&#xA;From my requirements above, I eventually decided that the base model would be&#xA;good enough, and the AMD versions from this, and the previous generation, were&#xA;typically reported as having decent battery life. We had a contender.&lt;/p&gt;&#xA;&lt;h2 id=&#34;framework&#34;&gt;Framework&lt;/h2&gt;&#xA;&lt;p&gt;I can&amp;rsquo;t just buy something. I decide I&amp;rsquo;m going to, then research it like a&#xA;lunatic for a month or so, then finally end up buying what I first considered a&#xA;month prior.&lt;/p&gt;&#xA;&lt;p&gt;Initially I considered the previous generation 7040 as it was a bit cheaper and&#xA;generally well-reviewed, but eventually decided that the newer, slightly more&#xA;efficient &amp;ldquo;AI&amp;rdquo; series was worth the extra.&lt;/p&gt;&#xA;&lt;p&gt;The hardest decision was whether to go for the base screen, or the upgraded&#xA;higher-definition, higher refresh-rate screen. Just the battery life&#xA;consideration was enough to keep me on the standard screen, so went for that.&lt;/p&gt;&#xA;&lt;p&gt;So that&amp;rsquo;s what I went for, the current, lowest spec. Framework 13 with a Ryzen 5&#xA;AI 340. Sort-of. Framework&amp;rsquo;s pricing for memory and storage was ludicrous, so&#xA;components I didn&amp;rsquo;t need to buy from them, I didn&amp;rsquo;t. I grabbed a 2TB WD Black&#xA;SSD and 32GB of Corsair RAM (did you know you can get reasonably priced &lt;em&gt;single&lt;/em&gt;&#xA;48GB sticks of laptop RAM now? Madness.).&lt;/p&gt;&#xA;&lt;p&gt;I got the standard black bezel (cheapest and actually best-looking option; all&#xA;the translucent ones were out of stock anyway), and the typical 2x USB-C, 1x USB&#xA;A and 1x HDMI for the port options. I opted for no charger since I already have&#xA;decently-powered USB-C bricks for other tech.&lt;/p&gt;&#xA;&lt;h3 id=&#34;assembly&#34;&gt;Assembly&lt;/h3&gt;&#xA;&lt;p&gt;So I bought it and it arrived. A brief note on assembly - the instructions are&#xA;good, and assembly is easy. Installing the SSD and RAM is the same as any other&#xA;computer. The only finicky bit, that I think could have better instructions and&#xA;imagery was fitting the bezel. I probably took it off and on about 30x before it&#xA;sat flush around the whole screen (especially on the lower-right corner). Some&#xA;of the cables running from the main body to the display needed to be shuffled&#xA;around a bit to get it to sit right, but eventually I got there. If you run into&#xA;the same issue, be patient, it&amp;rsquo;ll eventually go on. If I ever dare take it off&#xA;again, I&amp;rsquo;ll try to remember to take some pictures.&lt;/p&gt;&#xA;&lt;h2 id=&#34;set-up&#34;&gt;Set up&lt;/h2&gt;&#xA;&lt;p&gt;I use Fedora Workstation on my PC, so this was the obvious choice for the laptop&#xA;too. Firstly, I installed Fedora&amp;rsquo;s KDE edition - I try KDE every now and again&#xA;as theoretically it is the DE I would prefer; it has lots of knobs to turn and&#xA;levels to pull; I just never actually like using it. It did let me check all the&#xA;hardware worked though - all fine and working with no bodges as expected. The&#xA;next step was to grab Workstation and install that.&lt;/p&gt;&#xA;&lt;p&gt;So I did. Now, onto the actual set up.&lt;/p&gt;&#xA;&lt;h3 id=&#34;set-up-the-fingerprint-scanner&#34;&gt;Set up the fingerprint scanner&lt;/h3&gt;&#xA;&lt;p&gt;This is easy - go to Settings -&amp;gt; System -&amp;gt; Users (or just search &amp;ldquo;fingerprint&amp;rdquo;)&#xA;and enrol one or more. This worked fine. The only thing I have noticed is that&#xA;sometimes after the machine has been suspended, the fingerprint sensor doesn&amp;rsquo;t&#xA;always work. When this happens it is almost like the hardware has disappeared. I&#xA;initially added a udev rule to prevent it going into power-saving mode which&#xA;seemed to mostly work, but it also made the fingerprint sensor &lt;em&gt;really&lt;/em&gt; hot, so&#xA;I reverted that. Having reverted it however, it seems to much more reliably&#xA;still work after sleep (though not perfectly still), so various updates must&#xA;already be addressing this. I&amp;rsquo;d say 90% of the time it works after sleep now&#xA;when it was closer to maybe 50% a month ago.&lt;/p&gt;&#xA;&lt;h3 id=&#34;my-preferences&#34;&gt;My preferences&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Caps lock as control. I tried to &amp;ldquo;get&amp;rdquo; this for ages but didn&amp;rsquo;t, until I&#xA;started using a HHKB where the caps lock position &lt;em&gt;is&lt;/em&gt; control, and the&#xA;control position is, well, not there. Having used that I now can&amp;rsquo;t use a&#xA;machine where caps lock isn&amp;rsquo;t control. I end up doiNG A LOT OF THIS without&#xA;making this change.&lt;/p&gt;&#xA;&lt;p&gt;For whatever reason, you can&amp;rsquo;t change this with default GNOME settings, so&#xA;install the &amp;ldquo;Tweaks&amp;rdquo; app, then configure &amp;ldquo;Control Position&amp;rdquo; -&amp;gt; &amp;ldquo;Caps lock as&#xA;control&amp;rdquo; in the keyboard settings.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Keyboard repeat rate. I like the delay for repeat to be low, and the repeat&#xA;rate to be high. This is in Settings -&amp;gt; Accessibility -&amp;gt; Typing -&amp;gt; Typing&#xA;Assist -&amp;gt; Repeat Keys -&amp;gt; Speed/Delay.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Auto-dark theme. I prefer a light theme generally, but it is unpleasant when&#xA;the light level drops. GNOME can&amp;rsquo;t automatically switch themes yet, so I&#xA;installed &lt;a href=&#34;https://extensions.gnome.org/extension/2236/night-theme-switcher/&#34;&gt;night theme switcher&lt;/a&gt; to fix that.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Extensions. While we&amp;rsquo;re here, install the &amp;ldquo;Extensions&amp;rdquo; app from the GNOME&#xA;project so you can disable the &amp;ldquo;Background Logo&amp;rdquo; extension (removing the&#xA;Fedora logo from the bottom-right). I also grabbed &lt;a href=&#34;https://extensions.gnome.org/extension/6139/tailscale-qs/&#34;&gt;Tailscale QS&lt;/a&gt; for some&#xA;tray support for Tailscale.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;For some reason Chrome is not set up out of the box for either Wayland or&#xA;gestures for back/forward. (Scrolling is also horribly sensitive, but I&amp;rsquo;ve not&#xA;fixed that yet.) I created a new&#xA;&lt;code&gt;~/.local/share/applications/google-chrome.desktop&lt;/code&gt; by copying the default&#xA;from &lt;code&gt;/usr/share/applications&lt;/code&gt; and changed each &lt;code&gt;Exec&lt;/code&gt; line to include the&#xA;flags &lt;code&gt;--ozone-platform-hint=auto&lt;/code&gt; (Wayland mode - I believe this is the&#xA;default setting from 140 onwards) and&#xA;&lt;code&gt;--enable-features=TouchpadOverscrollHistoryNavigation&lt;/code&gt; (enables two-finger&#xA;left/right gestures for back/forward). If you see suggestions of creating a&#xA;&lt;code&gt;~/.config/chrome-flags.conf&lt;/code&gt; to add flags for launching Chrome, this is Arch&#xA;Linux specific and won&amp;rsquo;t work on other OS.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;I also create a &amp;ldquo;Code&amp;rdquo; folder in my home directory, but never like that it&#xA;isn&amp;rsquo;t styled like the other icons. I cloned &lt;a href=&#34;https://codeberg.org/daudix/Adwaita-Folder-Icons&#34;&gt;Adwaita folder icons&lt;/a&gt; to&#xA;&lt;code&gt;~/Code/._clones/&lt;/code&gt;, then opened Files, went to the folder properties and&#xA;changed the icon to the &amp;ldquo;folder-code&amp;rdquo; icon. Much better.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;figure&gt;&#xA;    &lt;a href=&#34;https://bytesandbobs.net/posts/ryzen-5-framework-laptop-and-fedora/gnome-files-custom-icons_hu_83ddb5c6c5f47710.png&#34;&gt;&#xA;        &lt;img src=&#34;https://bytesandbobs.net/posts/ryzen-5-framework-laptop-and-fedora/gnome-files-custom-icons_hu_705274cfb67183b3.png&#34; alt=&#34;Screenshot of GNOME files with custom icons for non-standard folders&#34;/&gt;&#xA;    &lt;/a&gt;&#xA;    &lt;figcaption&gt;Screenshot of GNOME files with custom icons for non-standard folders&lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;&#xA;&lt;p&gt;Aside from the general set up I do on every machine (which will eventually be&#xA;its own post), that&amp;rsquo;s everything I did. Basically, Fedora 42 works out of the&#xA;box on the new Framework 13.&lt;/p&gt;&#xA;&lt;h2 id=&#34;sort-of-review&#34;&gt;Sort-of review&lt;/h2&gt;&#xA;&lt;p&gt;I&amp;rsquo;ve probably mentioned all of this above, so here is a handful of points I&#xA;think are worth mentioning about the Framework 13:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Battery life is plenty good enough for me. It isn&amp;rsquo;t quite as good as a Mac,&#xA;but it&amp;rsquo;s perfectly good. The replaceable battery will be great. I tend to keep&#xA;my machines for a long time, and it&amp;rsquo;s really annoying to try to find a&#xA;trustworthy source of batteries for computers that don&amp;rsquo;t cost 3x the value of&#xA;the laptop. Also we have USB-C, so any decent powerbank can also give it some&#xA;more juice on the go, if needed.&lt;/li&gt;&#xA;&lt;li&gt;The standard screen is really good. I&amp;rsquo;m completely satisfied with my choice to&#xA;not go for the upgraded version.&lt;/li&gt;&#xA;&lt;li&gt;Performance is really good too. I&amp;rsquo;ve not run into any issues. I did try to run&#xA;Two Point Hospital, just to see what would happen. It &lt;em&gt;did&lt;/em&gt; run, but my word&#xA;that was a lot of fan noise (which incidentally was the first and only time&#xA;I&amp;rsquo;ve heard the fans running).&lt;/li&gt;&#xA;&lt;li&gt;The keyboard is fantastic, possibly the best laptop keyboard I&amp;rsquo;ve used.&lt;/li&gt;&#xA;&lt;li&gt;The touchpad is the best I&amp;rsquo;ve used on Linux. It isn&amp;rsquo;t as good as a MacBook,&#xA;but it&amp;rsquo;s plenty good enough. 2-, 3- and 4-finger gestures all work in GNOME&#xA;(fairly sure they did in KDE as well).&lt;/li&gt;&#xA;&lt;li&gt;It&amp;rsquo;s a really good-looking machine. I had some reservations about how the&#xA;machine would look and feel given its repairability, but it&amp;rsquo;s definitely a&#xA;premium-looking machine (to my eyes). You could perhaps argue that the plastic&#xA;bezel cheapens it a little, but I&amp;rsquo;ve never actually noticed - I was just&#xA;looking for something to mention.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;That&amp;rsquo;s it. If you&amp;rsquo;re in the market for a laptop and are considering a Framework&#xA;13 because it seems to fit your requirements, you could absolutely do worse. I&amp;rsquo;m&#xA;personally very pleased with the purchase, and don&amp;rsquo;t think I could have found&#xA;anything else as good (whether in-budget, or more expensive).&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>Gmailify in Gmail</title>
				<link>https://bytesandbobs.net/posts/gmailify-in-gmail/</link>
				<pubDate>Sat, 22 Mar 2025 00:00:00 +0000</pubDate>
				<guid>https://bytesandbobs.net/posts/gmailify-in-gmail/</guid>
				<description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;tl;dr&lt;/strong&gt; Make sure IMAP functionality is available/enabled in the account you&#xA;want to pull from with Gmailify.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;Since there is zero helpful debugging information and zero support in Gmail, I&#xA;thought this might help someone running into the same issue as me. If you have a&#xA;Gmail account, into which you&amp;rsquo;d like to fetch email from an Outlook/Hotmail&#xA;account, you can use Gmail&amp;rsquo;s &amp;ldquo;Gmailify&amp;rdquo; functionality (note: it&amp;rsquo;s completely&#xA;different to the service on gmailify.com) which will let Gmail pull messages&#xA;from Outlook, rather than having to forward from Outlook to Gmail.&lt;/p&gt;&#xA;&lt;p&gt;Having set this up, the status in Gmail&amp;rsquo;s settings was stuck with a message&#xA;saying &amp;ldquo;Not synced yet&amp;rdquo; (or thereabouts - I can&amp;rsquo;t remember the precise message -&#xA;it definitely didn&amp;rsquo;t say e.g. &amp;ldquo;Last sync: Successful (2 minutes ago)&amp;rdquo; as it does&#xA;now it&amp;rsquo;s working). It was stuck like this for days.&lt;/p&gt;&#xA;&lt;p&gt;What was the fix? It turns out that Gmailify just uses IMAP behind the scenes to&#xA;sync to Outlook, which if I&amp;rsquo;d really thought about it was probably obvious.&#xA;Since I rarely use Outlook, I had turned off POP and IMAP access in my account&#xA;years ago. Turning IMAP back on and requesting another sync from Gmail was&#xA;sufficient to get it working.&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>Installing Fallout London on Linux with Heroic Launcher</title>
				<link>https://bytesandbobs.net/posts/installing_fallout_london_on_linux_with_heroic_launcher/</link>
				<pubDate>Wed, 12 Mar 2025 00:00:00 +0000</pubDate>
				<guid>https://bytesandbobs.net/posts/installing_fallout_london_on_linux_with_heroic_launcher/</guid>
				<description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;tl;dr&lt;/strong&gt; Use the same Wine prefix for Fallout 4 and Fallout London.&#xA;As it&amp;rsquo;s Fallout 4, definitely install a high-fps mod.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Install Fallout 4 GOTY with Heroic&lt;/li&gt;&#xA;&lt;li&gt;Install Fallout London with Heroic - make sure to set the Wine prefix in the&#xA;install dialog to the same prefix that Fallout 4 GOTY used (found&#xA;&lt;a href=&#34;https://www.reddit.com/r/linux_gaming/comments/1ecc3xo/fallout_london/&#34;&gt;this&lt;/a&gt; which pointed me in the right direction)&lt;/li&gt;&#xA;&lt;li&gt;Run Fallout 4 GOTY (to install deps etc). This step may or may not be needed,&#xA;but I did do this.&lt;/li&gt;&#xA;&lt;li&gt;Run Fallout London&lt;/li&gt;&#xA;&lt;li&gt;Play!&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;For reference, I&amp;rsquo;m using Pop OS 22.04 with Heroic installed from a Flatpak&#xA;(version 2.16.0).&lt;/p&gt;&#xA;&lt;p&gt;There are some extra bits worth doing (see &lt;a href=&#34;https://fallout4london.com/release/&#34;&gt;here&lt;/a&gt; for details).&#xA;Note I don&amp;rsquo;t use a mod manager, so anything below is a manual install.&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Install the recommended &lt;a href=&#34;https://www.nexusmods.com/fallout4/mods/44798&#34;&gt;High FPS fix&lt;/a&gt;. High-FPS fixes are&#xA;always worth it for Fallout because loading screens are unbelievably slow. I&#xA;believe this is because the loading time is exactly tied to frame rate, and&#xA;frame rate is locked to a maximum of 60fps. If you unlock the frame rate, at&#xA;least on the loading screens, it loads faster. Fallout London already&#xA;includes F4SE and the address library (file&#xA;F4SE/plugins/version-$numbers.bin`), so don&amp;rsquo;t worry about dependencies of the&#xA;mod.&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Find your current game version, either by launching the game and going to&#xA;settings, or moving to your game&amp;rsquo;s install location (for me,&#xA;~/Games/Heroic/Fallout 4 GOTY) and then running &lt;code&gt;ag kCurVersion&lt;/code&gt; (as long&#xA;as you&amp;rsquo;ve run the game at least once). My GOG install was the second one,&#xA;1.10.163.0.&lt;/li&gt;&#xA;&lt;li&gt;Head to the mod page on Nexus and download (manual) the appropriate&#xA;version for the current version of your game.&lt;/li&gt;&#xA;&lt;li&gt;Unzip the the downloaded mod and &lt;em&gt;logically&lt;/em&gt; copy the F4SE folder into&#xA;the folder containing the F4SE folder of your install. It might work, but&#xA;actually don&amp;rsquo;t do that. Linux filesystems are case-sensitive, and most&#xA;mods (and Fallout itself) is made for Windows which will generally have a&#xA;case-insensitive filesystem. Therefore the best thing to do is look at&#xA;the files the mod contains and copy those into the relevant locations in&#xA;the install folder. Copying wholesale would end up with a &amp;ldquo;F4SE/Plugins&amp;rdquo;&#xA;folder from the mod, and a &amp;ldquo;F4SE/plugins&amp;rdquo; folder from the base game. As&#xA;it stands, you can just copy the content of the plugins folder into the&#xA;plugins folder of the game&amp;rsquo;s install directory.&lt;/li&gt;&#xA;&lt;li&gt;If it all worked, and you have an FPS counter showing in-game (e.g. via&#xA;Heroic settings for Fallout London -&amp;gt; Other -&amp;gt; Show FPS), you&amp;rsquo;ll probably&#xA;now see loading screens at a locked ~350 FPS.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;There&amp;rsquo;s only one mod for the time being (that&amp;rsquo;s definitely worthwhile), but I&amp;rsquo;ll&#xA;update this post as and when I install more.&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>Set up Lazarus IDE in PopOS for Pascal development</title>
				<link>https://bytesandbobs.net/posts/set-up-lazarus-in-popos-for-pascal-development/</link>
				<pubDate>Wed, 28 Aug 2024 00:00:00 +0000</pubDate>
				<guid>https://bytesandbobs.net/posts/set-up-lazarus-in-popos-for-pascal-development/</guid>
				<description>&lt;ol&gt;&#xA;&lt;li&gt;Go to the Lazarus website&lt;/li&gt;&#xA;&lt;li&gt;Download {fpc-laz,fpc-src}-$version_$arch.deb and lazarus-project-$lpversion_$arch.deb&lt;/li&gt;&#xA;&lt;li&gt;For each of the above files, &lt;code&gt;dpkg -i $file&lt;/code&gt; to install them&lt;/li&gt;&#xA;&lt;li&gt;Run Lazarus. Check the initial window that appears to make sure it can find the compiler and associated tools.&lt;/li&gt;&#xA;&lt;li&gt;When compiling your first project, you might get errors - see below to fix them.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h2 id=&#34;errors&#34;&gt;Errors&lt;/h2&gt;&#xA;&lt;h3 id=&#34;warning-linker-usrbinld-cannot-find--lgdk-x11-20-no-such-file-or-directory&#34;&gt;Warning: linker: /usr/bin/ld: cannot find -lgdk-x11-2.0: No such file or directory&lt;/h3&gt;&#xA;&lt;p&gt;This means we need to install a package that provides the libgdk-x11-2.0.so file, so let&amp;rsquo;s use apt-file to find out which package that is. Either install &lt;code&gt;apt-file&lt;/code&gt; or use the &lt;a href=&#34;https://packages.ubuntu.com/&#34;&gt;Ubuntu package search page&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;It turns out the package we need is &lt;code&gt; &#x9;libgtk2.0-dev&lt;/code&gt;, so install that with &lt;code&gt;apt install libgtk2.0-dev&lt;/code&gt; and try again.&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>HEIC thumbnails in GNOME Files on Pop OS</title>
				<link>https://bytesandbobs.net/posts/heic-thumbnails-in-gnome-files-on-popos/</link>
				<pubDate>Mon, 26 Aug 2024 00:00:00 +0000</pubDate>
				<guid>https://bytesandbobs.net/posts/heic-thumbnails-in-gnome-files-on-popos/</guid>
				<description>&lt;p&gt;I wanted to skim through some files from my iPhone, synced with Synology Drive to my PC, but all the HEIC files had no thumbnail - not particularly helpful when looking for specific pictures. I found &lt;a href=&#34;https://old.reddit.com/r/Fedora/comments/14eys74/i_finally_figured_out_how_to_make_heic_thumbnails/&#34;&gt;this&lt;/a&gt; for Fedora. A quick &lt;code&gt;apt search&lt;/code&gt; later - the solution for Pop OS (and I assume Ubuntu etc.) is &lt;code&gt;sudo apt install heif-thumbnailer&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;You don&amp;rsquo;t even need to re-open GNOME Files after installing it - I just got the previews as soon as I alt-tabbed back to the Files window.&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>How I manage dotfiles with Stow</title>
				<link>https://bytesandbobs.net/posts/how-i-manage-dotfiles/</link>
				<pubDate>Sat, 06 Jan 2024 00:00:00 +0000</pubDate>
				<guid>https://bytesandbobs.net/posts/how-i-manage-dotfiles/</guid>
				<description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;tl;dr&lt;/strong&gt; Git and GNU Stow since 2015. Feel free to &lt;a href=&#34;#maincontent&#34;&gt;skip to the&#xA;details&lt;/a&gt; because I also hate recipe sites&amp;hellip;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;The way I manage my dot files is not particularly novel these days, but it has&#xA;worked well for me (since 2015 according to &lt;code&gt;git blame&lt;/code&gt;) so thought it might be&#xA;worth sharing.&lt;/p&gt;&#xA;&lt;p&gt;I use Linux and Macs a lot, with a bit of Windows sprinkled on the side, but&#xA;this process works on all 3 systems.&lt;/p&gt;&#xA;&lt;p&gt;According to the README in my dot files git repository (spoiler alert), I was&#xA;inspired by Xero on the Arch BBS.&lt;/p&gt;&#xA;&lt;h2 id=&#34;where-i-started&#34;&gt;Where I started&lt;/h2&gt;&#xA;&lt;p&gt;I started using Linux in 2007 which is easy to remember thanks to my first&#xA;distribution being Ubuntu Gutsy Gibbon, otherwise known as 7.10 (2007,&#xA;October). Between then and my final setup were various combinations of manually&#xA;backed up folders and increasingly convoluted shell scripts to manage them. Of&#xA;course, I had much less need to manage them in those days when I didn&amp;rsquo;t have&#xA;numerous computers on which I&amp;rsquo;d want them. Unfortunately I hadn&amp;rsquo;t started using&#xA;Git to manage my dot files at this point, so I don&amp;rsquo;t have a copy of any of these&#xA;scripts. The gist was that they would look through all the files in my dot files&#xA;folder, symlinking them in the correct places. Not unlike another tool might&#xA;do&amp;hellip;&lt;/p&gt;&#xA;&lt;p&gt;Back in those days, I probably spent more time on these (and other) scripts to&#xA;manage stuff rather than using the stuff that was being managed. Writing the&#xA;scripts was fun though, and I learned a lot through doing that and other similar&#xA;&amp;ldquo;time wasting&amp;rdquo; exercises (time wasted having fun isn&amp;rsquo;t wasted!). Eventually&#xA;however I decided that I&amp;rsquo;d like some more free time, and I was no longer getting&#xA;much out of writing these scripts, so I looked for alternatives, which brings me&#xA;to Stow.&lt;/p&gt;&#xA;&lt;h2 id=&#34;maincontent&#34;&gt;Dotfiles&lt;/h2&gt;&#xA;&lt;p&gt;My dotfile set up is quite simple (it&amp;rsquo;s not public though unfortunately - I&amp;rsquo;m&#xA;too paranoid about accidentally committing an API key or some private&#xA;configuration - if I&amp;rsquo;ve mentioned something of interest though or if something&#xA;doesn&amp;rsquo;t make sense, please &lt;a href=&#34;https://bytesandbobs.net/contact&#34;&gt;send me an email&lt;/a&gt; and ask - the worst I&#xA;can do is say no!)&lt;/p&gt;&#xA;&lt;p&gt;I have a repository imaginitively called &lt;code&gt;dotfiles&lt;/code&gt; stored on &lt;del&gt;BitBucket&#xA;(because back in the day, that was &lt;em&gt;the&lt;/em&gt; choice for free, private repositories)&#xA;and now, inertia&lt;/del&gt; GitLab. I&amp;rsquo;ll typically clone this to &lt;code&gt;~/.dotfiles&lt;/code&gt; as it&amp;rsquo;s&#xA;still easy to &lt;code&gt;cd&lt;/code&gt; to, but most of the time in a file manager, I don&amp;rsquo;t want to&#xA;see it. The layout of that repository looks like this:&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;% tree ~/.dotfiles&#xA;~/.dotfiles&#xA;├── bash&#xA;├── common-lisp&#xA;├── emacs&#xA;├── emacs-minimal&#xA;├── git&#xA;├── psql&#xA;├── README.md&#xA;├── scripts&#xA;├── shell&#xA;├── ssh&#xA;├── tmux&#xA;├── TODO.md&#xA;├── vim&#xA;└── zsh&#xA;&#xA;XX directories, YY files&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;I&amp;rsquo;ve omitted a bunch of directories, but you get the idea. The names of these&#xA;folders are just for organisation - they don&amp;rsquo;t have any impact on the output.&lt;/p&gt;&#xA;&lt;p&gt;The way that the &lt;code&gt;stow&lt;/code&gt; command works by default is to symlink everything in a&#xA;given directory into the directory above the one that stow is run from. That&amp;rsquo;s&#xA;probably clearer with an example.&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;% tree -a ~/.dotfiles/emacs&#xA;/home/nathan/.dotfiles/emacs&#xA;└── .emacs.d&#xA;    ├── auto-save-list&#xA;    ├── backups&#xA;    │   └── ...&#xA;    ├── customise.el&#xA;    ├── elpa&#xA;    │   └── ...&#xA;    ├── .gitignore&#xA;    ├── init.el&#xA;    └── ...&#xA;&#xA;XX directories, YY files&#xA;&#xA;% cd ~/.dotfiles&#xA;% stow emacs&#xA;% ls -la ~/&#xA;...&#xA;lrwxrwxrwx  1 me me       6 Jan  2  2024 .emacs.d -&amp;gt; .dotfiles/emacs/.emacs.d&#xA;...&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;One interesting point to note is that if the &lt;code&gt;~/.emacs.d&lt;/code&gt; directory already&#xA;existed, &lt;code&gt;stow&lt;/code&gt; would still work, but it would instead symlink all the files and&#xA;directories within &lt;code&gt;~/.dotfiles/emacs/.emacs.d&lt;/code&gt; rather than the &lt;code&gt;~/.emacs.d&lt;/code&gt;&#xA;directory itself. If a file to be stowed already exists where it would be&#xA;symlinked however, the &lt;code&gt;stow&lt;/code&gt; would fail, so you should never end up clobbering&#xA;anything. This is usually not what I want, so it&amp;rsquo;s always worth checking what&#xA;&lt;code&gt;stow&lt;/code&gt; has done after running it. An example probably makes this clearer.&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;% # Create the files that &amp;#34;already exist&amp;#34;&#xA;% mkdir ~/.foo&#xA;% touch ~/.foo/bar&#xA;&#xA;% # Create our new dotfiles&#xA;% mkdir -p ~/.dotfiles/foo-test/.foo&#xA;% touch ~/.dotfiles/foo-test/.foo/baz&#xA;&#xA;% # Stow them&#xA;% cd ~/.dotfiles&#xA;% stow foo-test&#xA;&#xA;% tree ~/.foo&#xA;~/.foo&#xA;├── bar&#xA;└── baz -&amp;gt; ../.dotfiles/foo-test/.foo/baz&#xA;&#xA;0 directories, 2 files&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;As you can see, the already-present &lt;code&gt;.foo&lt;/code&gt; directory has been left intact, as&#xA;has the &lt;code&gt;bar&lt;/code&gt; file, and &lt;code&gt;baz&lt;/code&gt; has been added to &lt;code&gt;~/.foo&lt;/code&gt; as a symlink to the&#xA;file in our dotfiles directory. Though this will work for now, if &lt;code&gt;foo&lt;/code&gt; was an&#xA;application which can create other files that we&amp;rsquo;d ultimately want tracked in&#xA;version control, a &lt;code&gt;git status&lt;/code&gt; inside &lt;code&gt;~/.dotfiles&lt;/code&gt; would not show any new&#xA;files (because the files were symlinked and not the directory), so it would be&#xA;easy to miss them. Symlinking the directory means new files will result in a&#xA;dirty working directory, making it easy to see if you want to ignore or commit&#xA;those new files.&lt;/p&gt;&#xA;&lt;p&gt;If inside our &lt;code&gt;~/.dotfiles/foo-test/.foo&lt;/code&gt; we had created a file called &lt;code&gt;bar&lt;/code&gt;&#xA;instead of &lt;code&gt;baz&lt;/code&gt;, running &lt;code&gt;stow foo-test&lt;/code&gt; would have failed as follows due to&#xA;&lt;code&gt;bar&lt;/code&gt; already existing in the target.&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;% stow foo-test&#xA;WARNING! stowing foo-test would cause conflicts:&#xA;  * existing target is neither a link nor a directory: .foo/bar&#xA;All operations aborted.&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Finally, if you want to &amp;ldquo;unstow&amp;rdquo; something, you can use the &lt;code&gt;-D&lt;/code&gt; flag.&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;% ls -l ~/.emacs.d&#xA;...&#xA;lrwxrwxrwx  1 me me       6 Jan  2  2024 ~/.emacs.d -&amp;gt; .dotfiles/emacs/.emacs.d&#xA;...&#xA;&#xA;% cd ~/.dotfiles&#xA;% stow -D emacs&#xA;&#xA;% ls -l ~/.emacs.d&#xA;ls: cannot access &amp;#39;~/.emacs.d&amp;#39;: No such file or directory&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;And that&amp;rsquo;s pretty much it! It can occasionally be a little annoying for some&#xA;directories (such as &lt;code&gt;.emacs.d&lt;/code&gt;) where a lot of temporary files get stored, as&#xA;you&amp;rsquo;ll be adding a lot to your &lt;code&gt;.gitignore&lt;/code&gt;, but after the initial phase it very&#xA;rarely needs touching.&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>Unihertz Titan Pocket</title>
				<link>https://bytesandbobs.net/posts/unihertz-titan-pocket/</link>
				<pubDate>Sun, 05 Jun 2022 00:00:00 +0000</pubDate>
				<guid>https://bytesandbobs.net/posts/unihertz-titan-pocket/</guid>
				<description>&lt;figure class=&#34;paragraph-image float-right&#34;&gt;&#xA;    &lt;a href=&#34;https://bytesandbobs.net/posts/unihertz-titan-pocket/titan-pocket_hu_d07feeb47f90e155.png&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&#xA;        &lt;img src=&#34;https://bytesandbobs.net/posts/unihertz-titan-pocket/titan-pocket_hu_300a4f8c6de5cb78.png&#34; alt=&#34;Unihertz Titan Pocket&#34;/&gt;&#xA;    &lt;/a&gt;&#xA;    &#xA;&lt;/figure&gt;&#xA;&#xA;&lt;p&gt;The Titan Pocket is one of the latest in a series of successful crowd-funded&#xA;devices from Unihertz. They specialise in low-volume, niche devices, such as the&#xA;tiny Jelly 2, and the behemoth that is the Titan (definitely &lt;em&gt;not&lt;/em&gt; pocket).&lt;/p&gt;&#xA;&lt;p&gt;One of the best phones I&amp;rsquo;ve had was a BlackBerry Q10, and it&amp;rsquo;s a shame their&#xA;devices are no more. When the Titan Pocket was announced, I was really pleased&#xA;to see a phone &amp;ldquo;inspired&amp;rdquo; by the Q10, so had to snap it up. It&amp;rsquo;s great, but&#xA;certainly won&amp;rsquo;t be for everyone. The battery is &lt;em&gt;amazing&lt;/em&gt;. I generally get over&#xA;3 days on a charge which I haven&amp;rsquo;t experienced since before smartphones became a&#xA;thing. There are benefits to pairing a giant battery with non-flagship chips.&lt;/p&gt;&#xA;&lt;p&gt;This isn&amp;rsquo;t a review of the device (short-version: I like it). This post just&#xA;contains a few tidbits I found having used it for the past 6 months or so to&#xA;make the device really nice to use.&lt;/p&gt;&#xA;&lt;h2 id=&#34;but-the-screen-is-tiny&#34;&gt;But the screen is tiny!&lt;/h2&gt;&#xA;&lt;p&gt;And square! Surprisingly, I&amp;rsquo;ve not really had any problems with apps on this&#xA;screen that couldn&amp;rsquo;t be fixed by changing the the &amp;ldquo;mini&amp;rdquo; view mode which&#xA;compresses the viewport to be about two thirds of the screen width, making it a&#xA;more typical rectangle. When I have had to do that, it&amp;rsquo;s usually just for a&#xA;login screen so I can see the submit button etc. The only app which is a bit&#xA;clunky in &lt;em&gt;use&lt;/em&gt; is Google Maps, but I&amp;rsquo;ve since started using Waze, which works&#xA;just fine.&lt;/p&gt;&#xA;&lt;h2 id=&#34;no-notifications&#34;&gt;No notifications?&lt;/h2&gt;&#xA;&lt;p&gt;When I first started using it, I noticed that I got notifications for SMS and&#xA;Whatsapp messages, but other apps like Signal and email were not giving&#xA;notifications. It took a bit of blundering through the settings and a few trips&#xA;to the Titan&amp;rsquo;s subreddit, but eventually found the answer - &amp;ldquo;App Blocker&amp;rdquo; in&#xA;Settings -&amp;gt; &amp;ldquo;Intelligent Assistance&amp;rdquo; -&amp;gt; App Blocker. Just turn it off.&lt;/p&gt;&#xA;&lt;h2 id=&#34;keyboard-scrolling&#34;&gt;Keyboard scrolling&lt;/h2&gt;&#xA;&lt;p&gt;You can swipe over the keyboard to scroll horizontally and vertically in&#xA;apps. For some reason this is turned off by default, but you can turn it on in&#xA;Settings -&amp;gt; Intelligent Assistance -&amp;gt; Scroll Assistant and flick the switch to&#xA;on to enable it in all apps. The only app I noticed it not working in was&#xA;Firefox, but that can be addressed in the same menu as before, just checking the&#xA;box next to the troublesome app.&lt;/p&gt;&#xA;&lt;h2 id=&#34;force-orientation-for-specific-apps&#34;&gt;Force orientation for specific apps&lt;/h2&gt;&#xA;&lt;p&gt;I&amp;rsquo;ve not generally needed this, but the one mobile game I play, Data Wing,&#xA;forces horizontal orientation, which as you might imagine is a bit awkward on&#xA;this device. To fix, head back to the Intelligent Assistant settings page and&#xA;choose Rotation Control. Enable it, find Data Wing in the list, select it and&#xA;set it to &amp;ldquo;Force Portrait&amp;rdquo; to fix the orientation. It&amp;rsquo;s also useful for YouTube&#xA;when using &amp;ldquo;full screen&amp;rdquo;.&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-keyboard-layout-is-weird&#34;&gt;The keyboard layout is weird&lt;/h2&gt;&#xA;&lt;p&gt;I&amp;rsquo;ve seen quite a lot of complaints about alt, shift etc. being on the top row&#xA;of the keyboard, and that they keyboard itself is quite stiff. Whilst these&#xA;certainly gave me a bit of (minor!) trouble for the first few days, after that I&#xA;didn&amp;rsquo;t even notice. A new device always takes a little getting used to, but once&#xA;you are, it&amp;rsquo;s fine.&lt;/p&gt;&#xA;&lt;h2 id=&#34;i-heard-the-camera-is-pretty-bad&#34;&gt;I heard the camera is pretty bad&lt;/h2&gt;&#xA;&lt;p&gt;It is. But if the light is just right and you have a steady hand, you &lt;em&gt;can&lt;/em&gt; get&#xA;a passable image out of it.&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>Window 95 on macOS with Qemu 7.0.0: -localtime invalid option</title>
				<link>https://bytesandbobs.net/posts/windows-95-on-macos-with-qemu-7-localtime-invalid-option/</link>
				<pubDate>Wed, 01 Jun 2022 00:00:00 +0000</pubDate>
				<guid>https://bytesandbobs.net/posts/windows-95-on-macos-with-qemu-7-localtime-invalid-option/</guid>
				<description>&lt;p&gt;I was following the &lt;a href=&#34;https://wiki.qemu.org/Documentation/GuestOperatingSystems/Windows95&#34;&gt;Qemu guide for Windows 95&lt;/a&gt; and was greeted with&#xA;the error &lt;code&gt;qemu-system-i386: -localtime: invalid option&lt;/code&gt;. Conceivably this&#xA;relates to the version of Qemu I am using (7.0.0) rather than whichever version&#xA;that documentation was written for (the fact this is the first version of a&#xA;major release suggests that might be correct).&lt;/p&gt;&#xA;&lt;p&gt;I got the image to boot by changing the &lt;code&gt;-localtime&lt;/code&gt; option to &lt;code&gt;rtc base=localtime&lt;/code&gt; instead. The OS boots and seems to run fine, though it does spit&#xA;out some other warnings. The full command I used to run the VM was:&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;qemu-system-i386 \&#xA;  -netdev user,id=mynet0 \&#xA;  -device ne2k_isa,netdev=mynet0 \&#xA;  -hda win95.qcow2 \&#xA;  -soundhw sb16 \&#xA;  -m 64 \&#xA;  -cpu pentium \&#xA;  -vga cirrus \&#xA;  -rtc base=localtime \&#xA;  -fda disk01.img \&#xA;  -cdrom Win95_OSR25.iso \&#xA;  -boot a \&#xA;  -soundhw pcspk&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Where &lt;code&gt;disk01.img&lt;/code&gt; is a &lt;a href=&#34;https://winworldpc.com/product/microsoft-windows-boot-disk/95-osr2x&#34;&gt;Windows 95 boot floppy&lt;/a&gt; and&#xA;&lt;a href=&#34;https://winworldpc.com/product/windows-95/osr-3&#34;&gt;Win95_OSR25.iso&lt;/a&gt; is the OSR 2.5 release of Windows 95 - both from&#xA;WinWorldPC.&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>Install Morrowind on macOS with OpenMW</title>
				<link>https://bytesandbobs.net/posts/install-morrowind-on-macos-with-openmw/</link>
				<pubDate>Sun, 22 May 2022 00:00:00 +0000</pubDate>
				<guid>https://bytesandbobs.net/posts/install-morrowind-on-macos-with-openmw/</guid>
				<description>&lt;p&gt;I&amp;rsquo;m in the process of doing some work to my house, meaning that a lot of my&#xA;stuff (including my PC) has been boxed up. This means if I fancy playing a game,&#xA;I&amp;rsquo;m limited to things that will run on my laptop (2015 Macbook Air).&lt;/p&gt;&#xA;&lt;p&gt;Recently I&amp;rsquo;ve been playing Theme Hospital a lot. I grabbed it from GOG, which&#xA;has a macOS installer (it&amp;rsquo;s just bundled with DOSBox). I fancied playing some&#xA;Morrowind, so I had a look on how to install it.&lt;/p&gt;&#xA;&lt;p&gt;Unfortunately, and perhaps unsurprisingly, Morrowind is Windows-only, but there&#xA;is an open-source project, OpenMW, that re-implements the engine for the 3 main&#xA;desktop platforms (Linux, Mac, Windows), much like CorsixTH does for Theme&#xA;Hospital, and installing it is simple. The main reasons I&amp;rsquo;m writing this at all&#xA;are because a) the documentation doesn&amp;rsquo;t mention the Homebrew cask, and b) the&#xA;majority of the information is in a &lt;a href=&#34;https://www.youtube.com/watch?v=i9Bu8RZr3Uk&#34;&gt;video&lt;/a&gt;, and I hate using&#xA;videos for reference. If you&amp;rsquo;re doing this for the first time however, it&amp;rsquo;s&#xA;probably worth a watch just for a high-level overview of the process (though&#xA;it&amp;rsquo;s very simple).&lt;/p&gt;&#xA;&lt;h2 id=&#34;install-openmw&#34;&gt;Install OpenMW&lt;/h2&gt;&#xA;&lt;p&gt;This probably doesn&amp;rsquo;t need its own section.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;brew install --cask openmw&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;install-morrowind-from-steam&#34;&gt;Install Morrowind from Steam&lt;/h2&gt;&#xA;&lt;p&gt;You need a real copy of the game so OpenMW can use the assets. Morrowind isn&amp;rsquo;t&#xA;available for Mac, but you &lt;em&gt;can&lt;/em&gt; get Steam to download the Windows version on&#xA;one. From the &lt;a href=&#34;https://openmw.readthedocs.io/en/latest/manuals/installation/install-game-files.html#macos&#34;&gt;official docs&lt;/a&gt;:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Close Steam&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Create a file &lt;code&gt;/Users/YOUR_USERNAME_HERE/Library/Application Support/Steam/steamapps/appmanifest_22320.acf&lt;/code&gt; (where &lt;a href=&#34;https://steamdb.info/app/22320/info/&#34;&gt;22320&lt;/a&gt; is the Morrowind&#xA;Steam app ID) and add the following (make sure it&amp;rsquo;s a) plain-text and b) has&#xA;the right extension (&lt;code&gt;appmanifest_22320.acf.txt&lt;/code&gt; won&amp;rsquo;t work)&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;&amp;quot;AppState&amp;quot;&#xA;{&#xA;        &amp;quot;AppID&amp;quot; &amp;quot;22320&amp;quot;&#xA;        &amp;quot;Universe&amp;quot; &amp;quot;1&amp;quot;&#xA;        &amp;quot;StateFlags&amp;quot; &amp;quot;1026&amp;quot;&#xA;        &amp;quot;installdir&amp;quot; &amp;quot;The Elder Scrolls III - Morrowind&amp;quot;&#xA;}&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Open Steam - Morrowind will be downloaded&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;You can then use &lt;code&gt;/Users/YOUR_USERNAME_HERE/Library/Application Support/Steam/steamapps/common/The Elder Scrolls III - Morrowind/ Data Files&lt;/code&gt;&#xA;as the path when asked by the OpenMW wizard&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;It&amp;rsquo;s probably worth backing up this folder on the off-chance Steam stops&#xA;supporting this&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;Finally, just following the OpenMW wizard, pointing at this directory, and&#xA;you&amp;rsquo;re good to go.&lt;/p&gt;&#xA;&lt;p&gt;It runs just fine at 1440x900 on my laptop (though it does start up the fans).&lt;/p&gt;&#xA;&lt;h2 id=&#34;final-tweaks&#34;&gt;Final tweaks&lt;/h2&gt;&#xA;&lt;p&gt;The only other thing I did (again mentioned in the above video) was to increase&#xA;the view distance. The details are in the video description, but in short, just&#xA;add the following to &lt;code&gt;~/Library/Preferences/openmw/settings.cfg&lt;/code&gt; (backing up the&#xA;original first, of course).&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;[Camera]&#xA;field of view = 65.0275&#xA;small feature culling pixel size = 6.0&#xA;viewing distance = 10000&#xA;&#xA;[Cells]&#xA;exterior cell load distance = 1&#xA;&#xA;[Terrain]&#xA;distant terrain = True&#xA;&lt;/code&gt;&lt;/pre&gt;</description>
			</item>
			<item>
				<title>Upgrade SSD in Early 2015 Macbook Air (7,2)</title>
				<link>https://bytesandbobs.net/posts/upgrade-ssd-in-early-2015-macbook-air/</link>
				<pubDate>Sun, 22 May 2022 00:00:00 +0000</pubDate>
				<guid>https://bytesandbobs.net/posts/upgrade-ssd-in-early-2015-macbook-air/</guid>
				<description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;tl;dr&lt;/strong&gt; I picked up the stubby Sintech Apple to M.2 adapter and a 960GB Corsair MP510&#xA;and it&amp;rsquo;s been great - no issues installing/running, thermally good, no&#xA;noticeable extra power draw.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;Last year I picked up a used 2015 Macbook Air 7,2 to use as my primary laptop. I&#xA;wanted something with decent battery life and good touchpad without being too&#xA;expensive, and it fit the bill nicely. It&amp;rsquo;s no powerhouse, but perfectly adequate&#xA;for some programming projects, light gaming and all the other bits and bobs I&#xA;want to use a laptop for (it would be nice to be able to run newer games but&#xA;that&amp;rsquo;s what my PC is for).&lt;/p&gt;&#xA;&lt;p&gt;So far it has been really good, however its main limiting factor was the 128GB&#xA;SSD it came with. I&amp;rsquo;ve started dabbling with &lt;a href=&#34;https://flutter.dev&#34;&gt;Flutter&lt;/a&gt;, and that needs&#xA;&lt;em&gt;a lot&lt;/em&gt; of space (XCode is huge, Android Studio plus the SDK is huge, Android&#xA;emulators aren&amp;rsquo;t small &lt;em&gt;etc.&lt;/em&gt;). Not to mention that that&amp;rsquo;s not &lt;em&gt;all&lt;/em&gt; I wanted&#xA;installed on this machine. I needed more space.&lt;/p&gt;&#xA;&lt;p&gt;If you&amp;rsquo;ve ever looked at upgrading the hard drive in an Apple laptopc, you&amp;rsquo;ve&#xA;probably stumbled upon &lt;a href=&#34;https://forums.macrumors.com/threads/upgrading-2013-2014-macbook-pro-ssd-to-m-2-nvme.2034976/&#34;&gt;this MacRumors thread&lt;/a&gt;. It&amp;rsquo;s a trove of&#xA;information containing more than you&amp;rsquo;d ever want to know on the topic. However&#xA;that blessing is also a curse, and it makes it a little tricky to work out what&#xA;is best. The key issue with finding the best option is that a lot of&#xA;manufacturers have updated their existing SSDs to use different NAND chips&#xA;(replaced TLC with QLC) which seem to be worse across the board (performance,&#xA;power use, thermals), so previously recommended SSDs are implicitly no longer&#xA;recommended, even though they tend to use the same model numbers.&lt;/p&gt;&#xA;&lt;p&gt;Due to the proprietary connection used by the SSD in the laptop, you need two&#xA;things: a proprietary connection to M.2 adapter, and a normal M.2 SSD. The post&#xA;above recommends only using Sintech Apple to M.2 adapaters, so that&amp;rsquo;s what I did&#xA;(I bought the stubby one, not the full-length one and it&amp;rsquo;s fine). The other&#xA;thing is the SSD. I chose a 960GB Corsair MP510 because a) it still uses TLC&#xA;chips, b) doesn&amp;rsquo;t seem to have any issues as far as that thread goes and c) I&amp;rsquo;ve&#xA;always had good experiences with Corsair products in the past (with the&#xA;exception of their first-generation H100i AIO CPU coolers years ago - noisy and&#xA;not particularly good performance - I&amp;rsquo;ll stick to air, thanks).&lt;/p&gt;&#xA;&lt;p&gt;Installation was easy, following the &lt;a href=&#34;https://www.ifixit.com/Guide/MacBook+Air+13-Inch+Early+2015+SSD+Upgrade+to+NVMe/119755&#34;&gt;iFixit guide&lt;/a&gt;, requiring only a T5&#xA;torx bit, P5 pentalobe bit and about 15 minutes.&lt;/p&gt;&#xA;&lt;p&gt;Once installed it&amp;rsquo;s a case of booting into recovery (hold down CMD+R or Option&#xA;while booting), initialising the disk in Disk Utility and then installing the&#xA;OS. No extra kexts or anything required, and everything works as it did before,&#xA;but with &lt;em&gt;way&lt;/em&gt; more space.&lt;/p&gt;&#xA;&lt;p&gt;In daily use it feels exactly the same as the old SSD, and temperature and power&#xA;draw don&amp;rsquo;t seem to have been impacted at all. Out of interest, I ran the&#xA;&lt;a href=&#34;https://apps.apple.com/app/id425264550&#34;&gt;BlackMagic Speed Test&lt;/a&gt; before and after, and both read and write&#xA;performance approximately doubled, though it isn&amp;rsquo;t really perceptible to me in&#xA;normal use.&lt;/p&gt;&#xA;&lt;p&gt;Overall, I&amp;rsquo;m really happy with the upgrade (it feels the same as before, but has&#xA;more space)!&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>Changed from org-static-blog to Zola</title>
				<link>https://bytesandbobs.net/posts/changed-from-org-static-blog-to-zola/</link>
				<pubDate>Sun, 12 Sep 2021 00:00:00 +0000</pubDate>
				<guid>https://bytesandbobs.net/posts/changed-from-org-static-blog-to-zola/</guid>
				<description>&lt;p&gt;This is a statically-generated site hosted on GitLab pages. Before today it was built using an Emacs package called &lt;a href=&#34;https://github.com/bastibe/org-static-blog&#34;&gt;org-static-blog&lt;/a&gt;; now it is built using another &lt;!-- raw HTML omitted --&gt;SSG&lt;!-- raw HTML omitted --&gt;, &lt;a href=&#34;https://www.getzola.org/&#34;&gt;Zola&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;h2 id=&#34;history-and-motivation&#34;&gt;History and motivation&lt;/h2&gt;&#xA;&lt;p&gt;I made this site last year with the primary intentions being to:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Give me somewhere to write online&lt;/li&gt;&#xA;&lt;li&gt;Learn &lt;a href=&#34;https://orgmode.org/&#34;&gt;Org-mode&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;Have something permanent to mess around with when the fancy takes me&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;As a long-time Emacs user, and desiring simplicity, I decided to use org-static-blog which worked well, and ostensibly addressed the 3 aims above. However, in reality, it turned out that the first 2 aims were incompatible. If I wanted to write something, I needed the experience to be as frictionless as possible, or I&amp;rsquo;d lose interest&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;. If I wanted to learn Org-mode, I needed something to actually do with it, and not just try to learn the syntax by reading the docs.&lt;/p&gt;&#xA;&lt;p&gt;I decided to remove the second point from the list of requirements.&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-change&#34;&gt;The change&lt;/h2&gt;&#xA;&lt;p&gt;Given the above, some of the choice was made for me. I wasn&amp;rsquo;t interested using anything like WordPress as that detracted from the third aim. The most fitting choice was to use a static site generator.&lt;/p&gt;&#xA;&lt;p&gt;For content, the obvious choice was markdown. It&amp;rsquo;s second nature to me, as I&amp;rsquo;ve used it for years and widely supported. Org-mode is arguably more powerful, part of its original draw, but do I need that power for a personal blog? I do not. OK, so we&amp;rsquo;ve decided on the content format.&lt;/p&gt;&#xA;&lt;p&gt;I&amp;rsquo;ve used Jekyll, Hugo, Hexo and various other SSGs in the past, and all would have been fine. The key for me, however, is &lt;em&gt;understanding&lt;/em&gt; the tool I&amp;rsquo;m using, and the first step towards this is generally the documentation. The problem with those SSGs is that they are primarily geared up to be &lt;em&gt;used&lt;/em&gt; by people who just want to get their site built. This is reflected in the documentation, which typically follows the following steps:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Install the tool.&lt;/li&gt;&#xA;&lt;li&gt;Initialise a new site.&lt;/li&gt;&#xA;&lt;li&gt;Download a theme, which includes layouts.&lt;/li&gt;&#xA;&lt;li&gt;Create your pages &lt;em&gt;etc.&lt;/em&gt; in the way your chosen theme wants.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;The problem was, I didn&amp;rsquo;t want to use someone else&amp;rsquo;s theme, and I didn&amp;rsquo;t want site layouts and what have you to be done &lt;a href=&#34;https://duckduckgo.com/?q=define+automagic&amp;amp;ia=definition&#34;&gt;automagically&lt;/a&gt; for me. That makes it easy to start, but harder to make the tool bend to my whims down the road.&lt;/p&gt;&#xA;&lt;p&gt;Enter Zola. Their &lt;a href=&#34;https://www.getzola.org/documentation/getting-started/overview/&#34;&gt;basic tutorial&lt;/a&gt; takes you through initialising a new site, creating some base layouts with the Tera templating engine and creating a couple of types of content. When you finish, everything is unstyled but simple and understandable. From that point, you are pointed to the remaining documentation (including installing a third-party theme, should you desire).&lt;/p&gt;&#xA;&lt;p&gt;From this point I had an ugly site, that I understood and gradually started building up some basic templates and styling, before importing &lt;em&gt;both&lt;/em&gt; of my previous posts. Given the huge number of posts I had before (again, 2), I decided to approach this daunting task manually. Aside from deciding what I wanted to do about images (see &lt;a href=&#34;https://bytesandbobs.net/zola-tips&#34;&gt;zola-tips&lt;/a&gt;), this was straightforward.&lt;/p&gt;&#xA;&lt;h2 id=&#34;summary&#34;&gt;Summary&lt;/h2&gt;&#xA;&lt;p&gt;So here we are. A new site built on Zola with a few nice benefits of having done so.&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Built-in SASS support from the start. I didn&amp;rsquo;t think this would bother me initially, but it&amp;rsquo;s just nicer than writing plain CSS.&lt;/li&gt;&#xA;&lt;li&gt;Good documentation for the basics, and a good reference for more complex tasks, if a little light on examples for the less trivial bits. I&amp;rsquo;ve started compiling solutions to problems I&amp;rsquo;ve had &lt;a href=&#34;https://bytesandbobs.net/zola-tips&#34;&gt;here&lt;/a&gt;.&lt;/li&gt;&#xA;&lt;li&gt;Enough of a &lt;a href=&#34;https://zola.discourse.group/&#34;&gt;community&lt;/a&gt; that someone else has probably had my problems (or at least similar ones) before.&lt;/li&gt;&#xA;&lt;li&gt;A good amount of power through &lt;a href=&#34;https://www.getzola.org/documentation/content/shortcodes/&#34;&gt;shortcodes&lt;/a&gt; or &lt;a href=&#34;https://tera.netlify.app/docs/#functions&#34;&gt;extending Tera&lt;/a&gt; directly.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Conspicuous by its absence is a mention of the fact that Zola is built with Rust and has very fast build times. In the end, I just wanted something that worked (for me), and I&amp;rsquo;ll never have enough posts for build times to be an issue!&lt;/p&gt;&#xA;&lt;h2 id=&#34;footnotes&#34;&gt;Footnotes&lt;/h2&gt;&#xA;&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;&#xA;&lt;hr&gt;&#xA;&lt;ol&gt;&#xA;&lt;li id=&#34;fn:1&#34;&gt;&#xA;&lt;p&gt;Not that I wasn&amp;rsquo;t interested, but if I was in the mood to write something, it probably wasn&amp;rsquo;t the same mood I&amp;rsquo;d need to mess around with Emacs, Emacs Lisp and Org-mode.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/div&gt;&#xA;</description>
			</item>
			<item>
				<title>Zola static-site generator tips</title>
				<link>https://bytesandbobs.net/posts/zola-tips/</link>
				<pubDate>Sat, 11 Sep 2021 00:00:00 +0000</pubDate>
				<guid>https://bytesandbobs.net/posts/zola-tips/</guid>
				<description>&lt;p&gt;I&amp;rsquo;ve finally settled (for now) on the &lt;a href=&#34;https://www.getzola.org/&#34;&gt;Zola&lt;/a&gt; static-site generator. This is largely because it&amp;rsquo;s simple, with no bells and whistles from the start, and very good &lt;a href=&#34;https://www.getzola.org/documentation/getting-started/overview/&#34;&gt;getting started&lt;/a&gt; documentation. This post is to just outline a few of the things I&amp;rsquo;ve found that took me a while to figure out, or that I thought were non-trivial.&lt;/p&gt;&#xA;&lt;h2 id=&#34;documentation&#34;&gt;Documentation&lt;/h2&gt;&#xA;&lt;p&gt;The official docs are useful as a starting point.&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.getzola.org/documentation/&#34;&gt;Zola&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tera.netlify.app/docs/&#34;&gt;Tera&lt;/a&gt; (templating language)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;blog-listing-on-home-page&#34;&gt;Blog listing on home page&lt;/h2&gt;&#xA;&lt;p&gt;I couldn&amp;rsquo;t find a way to reference one section from another. That is, to have posts stored in /content/blog/*.md, but list those posts from /content/_index.md and the base template. I ended up just using /content as the blog section. It&amp;rsquo;s a little messy, but it works at least.&lt;/p&gt;&#xA;&lt;p&gt;Thanks to a message from &lt;a href=&#34;https://halffull.org/&#34;&gt;halffull.org&lt;/a&gt; who is also &lt;a href=&#34;https://halffull.org/2024/10/20/site-update/&#34;&gt;using Zola&lt;/a&gt; I&amp;rsquo;m a step closer, but still not quite there. What is certainly possible, is listing entries from another section as if they were part of the pages of the current section. You simply create a new section and mark it as transparent in the frontmatter. The parent section will then list pages from that section as if they were part of it. The caveat, that I&amp;rsquo;m sure there&amp;rsquo;s a way around I haven&amp;rsquo;t found, is that the posts in the transparent section will still have the section name as part of the slug; anything in the transparent section, let&amp;rsquo;s call it &amp;ldquo;blog&amp;rdquo; will be at /blog/post-slug, whereas anything residing directly in the parent will be /post-slug.&lt;/p&gt;&#xA;&lt;h2 id=&#34;linked-images-with-thumbnails-for-co-located-assets&#34;&gt;Linked images with thumbnails for co-located assets&lt;/h2&gt;&#xA;&lt;p&gt;It&amp;rsquo;s nice to be able to inline a small (resolution and file size) image in a post, but to still have the full-size image available for those who want to view it. I started off in the &lt;a href=&#34;https://www.getzola.org/documentation/content/image-processing/&#34;&gt;docs&lt;/a&gt; for this which are quite good for the basics, but took me a little while to work out the details.&lt;/p&gt;&#xA;&lt;p&gt;To summarise, I was trying to:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Use co-located assets (&lt;em&gt;e.g.&lt;/em&gt; post content in /content/my-post/index.md and image(s) in /content/my-post/image1.jpg)&lt;/li&gt;&#xA;&lt;li&gt;&lt;em&gt;Not&lt;/em&gt; copy the images verbatim from /content/my-post/ into /public&lt;/li&gt;&#xA;&lt;li&gt;Show a small thumbnail in the post&lt;/li&gt;&#xA;&lt;li&gt;Link that thumbnail to larger version of the image&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;By default co-located assets are copied vertabim to the /public folder alongside your post in HTML form. This seemed messy because I didn&amp;rsquo;t want to link directly to these and have images in multiple paths. The solution built on the &lt;a href=&#34;https://www.getzola.org/documentation/content/image-processing/#using-resize-image-in-markdown-via-shortcodes&#34;&gt;shortcodes example&lt;/a&gt; in the documentation. As such, I defined a short-code in /templates/shortcodes/post_image.html as follows.&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;{% if path is containing(page.components | first) %}&#xA;    {% set imgpath = path  %}&#xA;{% else %}&#xA;    {% set imgpath = page.components | concat(with = path) | join(sep = &amp;#34;/&amp;#34;) %}&#xA;{% endif %}&#xA;&#xA;{% set thumb = resize_image(path=imgpath, width=400, height=10, op=&amp;#34;fit_width&amp;#34;) %}&#xA;{% set image = resize_image(path=imgpath, width=5000, height=5000, op=&amp;#34;fit&amp;#34;) %}&#xA;&amp;lt;figure&amp;gt;&#xA;    &amp;lt;a href=&amp;#34;{{ image.url }}&amp;#34;&amp;gt;&amp;lt;img src=&amp;#34;{{ thumb.url }}&amp;#34; /&amp;gt;&amp;lt;/a&amp;gt;&#xA;    {% if caption %}&amp;lt;figcaption&amp;gt;{{ caption }}&amp;lt;/figcaption&amp;gt;{% endif %}&#xA;&amp;lt;/figure&amp;gt;&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The top conditional part will prepend the current post&amp;rsquo;s folder name to the provided image path, if it is missing. It will only work for posts directly under /content and not if they are more deeply nested, which is fine for my purposes. It also possibly won&amp;rsquo;t work with pages with custom slugs, but I&amp;rsquo;ll cross that bridge if and when I get there.&lt;/p&gt;&#xA;&lt;p&gt;The function then creates two images in /static/processed_images which will be named with a hash. &lt;code&gt;thumb&lt;/code&gt; refers to the small one with the defined width and will be inlined in the page with the &lt;code&gt;img&lt;/code&gt; tag. &lt;code&gt;image&lt;/code&gt; is &amp;ldquo;resized&amp;rdquo; in such a way that the largest dimension will be resized to 5000 pixels. If the image is smaller than that however, it will remain in its original form, with its aspect ratio maintained.&lt;/p&gt;&#xA;&lt;p&gt;I use the above in my markdown files like this.&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;{{/* resize_image(path=&amp;#34;my-image.jpg&amp;#34;, caption=&amp;#34;Some caption text&amp;#34;) */}}&#xA;&amp;lt;!-- OR --&amp;gt;&#xA;{{/* resize_image(path=&amp;#34;/my-post/my-image.jpg&amp;#34;, caption=&amp;#34;Some caption text&amp;#34;) */}}&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The final change was to add an expression in the main section of &lt;code&gt;config.toml&lt;/code&gt; to ignore images in the content directory to stop them being copied to public. This is how I enforced that all images must go through &lt;code&gt;resize_image&lt;/code&gt; in order to be used.&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;ignored_content = [&amp;#34;*.{gif,jpg,png}&amp;#34;]&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Points for confusion:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;There is a built-in template function called &lt;code&gt;resize_image&lt;/code&gt; that is defined &lt;em&gt;within&lt;/em&gt; Zola. The fact the short-code in the documentation is also called &lt;code&gt;resize_image&lt;/code&gt; is &lt;em&gt;only&lt;/em&gt; because the file that contains it is called &lt;code&gt;resize_image.html&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;li&gt;The way I am referring to the image via a relative path seems a bit clunky. I&amp;rsquo;m sure there must be a better way, but this works for now. The main motivation was that if I changed the name of the folder a post, the images would continue to work.&lt;/li&gt;&#xA;&lt;li&gt;The template-function &lt;code&gt;resize_image&lt;/code&gt; &lt;em&gt;requires&lt;/em&gt; that both width and height are defined, even if using an operation that only requires one (&lt;em&gt;e.g.&lt;/em&gt; &lt;code&gt;fit_width&lt;/code&gt; requires only width). This is why &lt;code&gt;height&lt;/code&gt; above is defined as an arbitrary 10 above.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;printing-json&#34;&gt;Printing JSON&lt;/h2&gt;&#xA;&lt;p&gt;Sometimes logging internal data is handy when you can&amp;rsquo;t quite find the right docs. If you want to print e.g. the &lt;code&gt;page&lt;/code&gt; or &lt;code&gt;section&lt;/code&gt; variable within a Zola template, you can use something like this&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&amp;lt;pre&amp;gt;{% if section %}{{ section | json_encode(pretty=true) | safe }}{% else %}no section :({% endif %}&amp;lt;/pre&amp;gt;&#xA;&lt;/code&gt;&lt;/pre&gt;</description>
			</item>
			<item>
				<title>Building a custom mechanical keyboard</title>
				<link>https://bytesandbobs.net/posts/building-a-custom-mechanical-keyboard/</link>
				<pubDate>Sat, 05 Dec 2020 00:00:00 +0000</pubDate>
				<guid>https://bytesandbobs.net/posts/building-a-custom-mechanical-keyboard/</guid>
				<description>&lt;p&gt;About 4 years ago I started &lt;del&gt;building&lt;/del&gt; buying parts for an ortholinear&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; split&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt; mechanical&lt;sup id=&#34;fnref:3&#34;&gt;&lt;a href=&#34;#fn:3&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;3&lt;/a&gt;&lt;/sup&gt; keyboard. Inspired by&#xA;the likes of the Planck or Diverge keyboards I set about designing a simple layout with &lt;a href=&#34;http://www.keyboard-layout-editor.com/&#34;&gt;Keyboard Layout Editor&lt;/a&gt; and a top plate using &lt;a href=&#34;http://builder.swillkb.com/&#34;&gt;Swill KB&lt;/a&gt;, with the plates cut by &lt;a href=&#34;https://razorlab.online/&#34;&gt;RazorLAB&lt;/a&gt;. I picked up some Gateron brown switches, a pro-micro controller and a few other bits and bobs. Apparently at that point I lost interest and there it sat.&lt;/p&gt;&#xA;&lt;p&gt;Sometime between then and now, one of the plate halves was lost to an incident involving my foot. The other piece however survives to this day. Of course this piece alone is not big enough to be a real keyboard (no matter what some keyboard enthusiasts might tell you!) so it is destined to become an unnecessarily large macropad.&lt;/p&gt;&#xA;&lt;p&gt;Now, I could just have another plate cut to make it a full keyboard again, however I am going to finish it as-is to:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Practice (electronics, woodwork) for the next, much bigger, more robust board.&lt;/li&gt;&#xA;&lt;li&gt;I have all the parts already.&lt;/li&gt;&#xA;&lt;li&gt;Familiarising myself with QMK.&lt;/li&gt;&#xA;&lt;li&gt;It will be a relatively simple platform with which to play with making my own firmware. I&amp;rsquo;d like to see if I can do something with &lt;a href=&#34;http://www.ulisp.com/&#34;&gt;uLisp&lt;/a&gt;.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;I will update this post with progress as I go, rather than splitting it into multiple posts.&lt;/p&gt;&#xA;&lt;h2 id=&#34;whats-the-plan&#34;&gt;What&amp;rsquo;s the plan?&lt;/h2&gt;&#xA;&lt;p&gt;The basic idea is to:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Hand-wire the keyboard. That is, the keyswitches will be supported by an acrylic plate and there will be no PCB. The wiring will be messy and the microcontroller (pro-micro) will be floating around in the case.&lt;/li&gt;&#xA;&lt;li&gt;The case will be a wooden block; probably softwood for this experiment. The block will be a little larger than the plate with the inside routed out. Where the plate rests will be slightly recessed so that the top of the plate is flush with the top of the wooden part of the case.&lt;/li&gt;&#xA;&lt;li&gt;The firmware will be QMK.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;wiring-the-rows&#34;&gt;Wiring the rows&lt;/h2&gt;&#xA;&lt;p&gt;The first step was putting the switches into the plate and wiring the rows together. I did this solely using diodes as it is the standard way most people do this&lt;sup id=&#34;fnref:4&#34;&gt;&lt;a href=&#34;#fn:4&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;4&lt;/a&gt;&lt;/sup&gt;. After I had done this, I found that people now tend to loop the diode around the switch pins so they don&amp;rsquo;t move when trying to solder them, which would have made this far easier.&lt;/p&gt;&#xA;&lt;figure&gt;&#xA;    &lt;a href=&#34;https://bytesandbobs.net/posts/building-a-custom-mechanical-keyboard/keyboard-rows-wired_hu_5b10c5ef880439e6.jpg&#34;&gt;&#xA;        &lt;img src=&#34;https://bytesandbobs.net/posts/building-a-custom-mechanical-keyboard/keyboard-rows-wired_hu_a1598dc7dd9129e1.jpg&#34; alt=&#34;The underside of an acrylic plate for a custom mechanical keyboard showing the underside of the switches with diodes soldered to them, connecting the rows.&#34;/&gt;&#xA;    &lt;/a&gt;&#xA;    &lt;figcaption&gt;Rows wired to switches&lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;&#xA;&lt;h2 id=&#34;wiring-the-columns&#34;&gt;Wiring the columns&lt;/h2&gt;&#xA;&lt;p&gt;The next step was to wire the columns. For this, I&amp;rsquo;m using multi-core DuPont wires that I got in a bundle from eBay years ago as it&amp;rsquo;s what I had lying around. I picked up a wire stripper that can strip the insulation in the middle of a piece of wire, so can use a single piece of wire for the entire column rather than having to solder multiple small pieces of wire for each column.&lt;/p&gt;&#xA;&lt;figure&gt;&#xA;    &lt;a href=&#34;https://bytesandbobs.net/posts/building-a-custom-mechanical-keyboard/stripped-wire_hu_acfdbfe45814879a.jpg&#34;&gt;&#xA;        &lt;img src=&#34;https://bytesandbobs.net/posts/building-a-custom-mechanical-keyboard/stripped-wire_hu_8ddf32454493f9d4.jpg&#34; alt=&#34;An intact yellow wire on a table with sections of insulation stripped off.&#34;/&gt;&#xA;    &lt;/a&gt;&#xA;    &lt;figcaption&gt;Partially stripped wire&lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;&#xA;&lt;p&gt;I soldered each gap, from one end to the other, moving the insulation to cover as much of the bare wire as possible after each part was soldered.&lt;/p&gt;&#xA;&lt;figure&gt;&#xA;    &lt;a href=&#34;https://bytesandbobs.net/posts/building-a-custom-mechanical-keyboard/two-soldered-columns_hu_ec7f4bb6a8d7554c.jpg&#34;&gt;&#xA;        &lt;img src=&#34;https://bytesandbobs.net/posts/building-a-custom-mechanical-keyboard/two-soldered-columns_hu_1341d57d87012abc.jpg&#34; alt=&#34;A close-up of 2 rows of mechanical keyswitches on the underside of a keyboard with the partially stripped wire connecting them.&#34;/&gt;&#xA;    &lt;/a&gt;&#xA;    &lt;figcaption&gt;2 soldered columns. Can see hot glue holding switches in place.&lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;&#xA;&lt;p&gt;After all the columns and rows were wired, I checked continuity of each with a multimeter. All good!&lt;/p&gt;&#xA;&lt;h2 id=&#34;wiring-the-microcontroller&#34;&gt;Wiring the microcontroller&lt;/h2&gt;&#xA;&lt;p&gt;The final step was to wire the pro-micro to the rows and columns. For this I took some attached wires, and splayed and stripped the ends, keeping the joins in an attempt to make it a little neater.&lt;/p&gt;&#xA;&lt;figure&gt;&#xA;    &lt;a href=&#34;https://bytesandbobs.net/posts/building-a-custom-mechanical-keyboard/split-wires_hu_f083d56e12a22d2b.jpg&#34;&gt;&#xA;        &lt;img src=&#34;https://bytesandbobs.net/posts/building-a-custom-mechanical-keyboard/split-wires_hu_38b0d93559e857f1.jpg&#34; alt=&#34;5 colourful wires of a ribbon cable with the end few centimetres split apart into a fan-like shape.&#34;/&gt;&#xA;    &lt;/a&gt;&#xA;    &lt;figcaption&gt;5 joined wires split out&lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;&#xA;&lt;figure&gt;&#xA;    &lt;a href=&#34;https://bytesandbobs.net/posts/building-a-custom-mechanical-keyboard/arduino-micro_hu_d5115595cc6fda50.jpg&#34;&gt;&#xA;        &lt;img src=&#34;https://bytesandbobs.net/posts/building-a-custom-mechanical-keyboard/arduino-micro_hu_f60d2f5b5663fc26.jpg&#34; alt=&#34;An Arduino Micro microcontroller.&#34;/&gt;&#xA;    &lt;/a&gt;&#xA;    &lt;figcaption&gt;Arduino Micro&lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;&#xA;&lt;figure&gt;&#xA;    &lt;a href=&#34;https://bytesandbobs.net/posts/building-a-custom-mechanical-keyboard/keyboard-wired-no-controller_hu_19023a957592eb.jpg&#34;&gt;&#xA;        &lt;img src=&#34;https://bytesandbobs.net/posts/building-a-custom-mechanical-keyboard/keyboard-wired-no-controller_hu_95f2bd95cd082dfa.jpg&#34; alt=&#34;The underside of the custom mechanical keyboard, showing the rows connected with diodes and columns connected with wire.&#34;/&gt;&#xA;    &lt;/a&gt;&#xA;    &lt;figcaption&gt;Keyboard wired without controller&lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;&#xA;&lt;p&gt;For testing, I left the push-fit connectors on the wires and attached them to the micro controller (which already had headers soldered). I used the following pinout diagram for reference.&lt;/p&gt;&#xA;&lt;figure&gt;&#xA;    &lt;a href=&#34;https://bytesandbobs.net/posts/building-a-custom-mechanical-keyboard/arduino-pin-out_hu_76fd49303a489338.png&#34;&gt;&#xA;        &lt;img src=&#34;https://bytesandbobs.net/posts/building-a-custom-mechanical-keyboard/arduino-pin-out_hu_159dfc7742dd0e83.png&#34; alt=&#34;A pin out diagram for the Arduino Micro microcontroller.&#34;/&gt;&#xA;    &lt;/a&gt;&#xA;    &lt;figcaption&gt;Arduino Micro pin out&lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;&#xA;&lt;p&gt;I used 5 rows and 7 columns with the diode running columns to rows. The chip on the Micro is an ATmega32U4. Setting this up in &lt;a href=&#34;https://kbfirmware.com/&#34;&gt;Keyboard Firmware Builder&lt;/a&gt; yields the following:&lt;/p&gt;&#xA;&lt;figure&gt;&#xA;    &lt;a href=&#34;https://bytesandbobs.net/posts/building-a-custom-mechanical-keyboard/kfb-layout_hu_1d9e56f9dbbdf7be.png&#34;&gt;&#xA;        &lt;img src=&#34;https://bytesandbobs.net/posts/building-a-custom-mechanical-keyboard/kfb-layout_hu_b8f4e1f0face469.png&#34; alt=&#34;A diagram from the Keyboard Firmware Builder tool showing the way the rows and columns are connected for this keyboard.&#34;/&gt;&#xA;    &lt;/a&gt;&#xA;    &lt;figcaption&gt;Wiring layout&lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;&#xA;&lt;p&gt;I wired the columns and rows to the pins on the Arduino like this. Columns were:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;0: B0&lt;/li&gt;&#xA;&lt;li&gt;1: B1&lt;/li&gt;&#xA;&lt;li&gt;2: B2&lt;/li&gt;&#xA;&lt;li&gt;3: B3&lt;/li&gt;&#xA;&lt;li&gt;4: B4&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;And rows:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;0: B5&lt;/li&gt;&#xA;&lt;li&gt;1: B6&lt;/li&gt;&#xA;&lt;li&gt;2: B7&lt;/li&gt;&#xA;&lt;li&gt;3: D0&lt;/li&gt;&#xA;&lt;li&gt;4: D1&lt;/li&gt;&#xA;&lt;li&gt;5: D2&lt;/li&gt;&#xA;&lt;li&gt;6: D3&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;To make it look sort-of like a keyboard I then threw some spare DSA Dolch keycaps at it and this is what stuck.&lt;/p&gt;&#xA;&lt;figure&gt;&#xA;    &lt;a href=&#34;https://bytesandbobs.net/posts/building-a-custom-mechanical-keyboard/wired-with-dolch_hu_b645dc697ae44a4e.jpg&#34;&gt;&#xA;        &lt;img src=&#34;https://bytesandbobs.net/posts/building-a-custom-mechanical-keyboard/wired-with-dolch_hu_7f995b3aff8914a7.jpg&#34; alt=&#34;Finished keyboard using DSA Dolch keycaps from Pimp My Keyboard. The connected microcontroller is at the top edge of the keyboard.&#34;/&gt;&#xA;    &lt;/a&gt;&#xA;    &lt;figcaption&gt;Keyboard with DSA Dolch&lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;&#xA;&lt;h2 id=&#34;programming&#34;&gt;Programming&lt;/h2&gt;&#xA;&lt;p&gt;Programming the keyboard was more of a pain than I expected. I intended to follow the QMK guide to the letter for simplicity. That guide is currently written making the assumption that you will use the QMK Toolbox to flash your micro controller, however for some reason it did not detect my Arduino. I tried various drivers, removing all the drivers and letting the toolbox install its own, but to no avail. The Arduino IDE however did reliably detect the controller, so I knew it worked. Ultimately, I &lt;em&gt;think&lt;/em&gt; the problems are because of the device ID of my controller being &lt;code&gt;2341:8037&lt;/code&gt; and that not being in the &lt;a href=&#34;https://docs.qmk.fm/#/driver_installation_zadig?id=list-of-known-bootloaders&#34;&gt;list of &amp;ldquo;known bootloaders&amp;rdquo;&lt;/a&gt; for QMK Toolbox. In that list, the Arduino Micro is listed with a device ID of &lt;code&gt;2341:0037&lt;/code&gt; - different. I&amp;rsquo;m going to assume this is because my controller is a &lt;em&gt;Genuino&lt;/em&gt; Micro (&lt;em&gt;i.e.&lt;/em&gt; the non-US version). I suspect if my controller&amp;rsquo;s ID was added, the toolbox would detect it and work correctly.&lt;/p&gt;&#xA;&lt;p&gt;Obviously that would take some time and effort, so I pursued another avenue. I grabbed my laptop and travelled to the land of Linux where things make much more sense to me than they do in Windows. I did a bit of fiddling and documentation-reading, however the final recipe for getting QMK on to my controller looked a little something like this:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Install &lt;code&gt;qmk&lt;/code&gt; using &lt;code&gt;pip --user install qmk&lt;/code&gt;. Accept all of its offers to install dependencies (we want it to &lt;em&gt;just work&lt;/em&gt; after all). Make sure you copy the udev rule for ATmega32U4 devices when mentioned.&lt;/li&gt;&#xA;&lt;li&gt;Download the zip file from &lt;a href=&#34;https://kbfirmware.com/&#34;&gt;KB Firmware&lt;/a&gt; (after you&amp;rsquo;ve imported your layout from Keyboard Layout Editor and set up your matrix, keymaps and pins).&lt;/li&gt;&#xA;&lt;li&gt;Extract this zip, copying the &lt;code&gt;./keyboards/kb&lt;/code&gt; folder to &lt;code&gt;~/qmk_firmware/keyboards/handwired/somename&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;li&gt;Edit &lt;code&gt;~/qmk_firmware/keyboards/handwired/somename/default/keymap.c&lt;/code&gt; and remove the &lt;code&gt;action_get_macro&lt;/code&gt; block. I think this is because KB Firmware must build the code (or at least did when I was using it) for an older version of QMK.&lt;/li&gt;&#xA;&lt;li&gt;Change into the &lt;code&gt;~/qmk_firmware&lt;/code&gt; folder and flash with &lt;code&gt;qmk flash -kb handwired/somename -km default -bl avrdude&lt;/code&gt;. The docs don&amp;rsquo;t usually mention needing to specify the bootloader, but I needed to. Perhaps it has been omitted from KB Firmware&amp;rsquo;s output to be compatible with more devices? Once flashed (hopefully!), you will be prompted to restart your device.&lt;/li&gt;&#xA;&lt;li&gt;You have a working keyboard!&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h2 id=&#34;making-it-pretty&#34;&gt;Making it pretty&lt;/h2&gt;&#xA;&lt;p&gt;This will be a separate post because this one is already has a lot of information and images. The current plan is to use wood for the bottom of the case. I plan to take a block of wood (or a few sheets of ply sandwiched together for the prototype) and route out the middle for the switches/controller and have a shallow rim around the edge for the acrylic plate to rest on. Once I get to that, I&amp;rsquo;ll link the new post here.&lt;/p&gt;&#xA;&lt;p&gt;Thanks for reading! I hope it was at least interesting, if not useful.&lt;/p&gt;&#xA;&lt;h2 id=&#34;footnotes&#34;&gt;Footnotes&lt;/h2&gt;&#xA;&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;&#xA;&lt;hr&gt;&#xA;&lt;ol&gt;&#xA;&lt;li id=&#34;fn:1&#34;&gt;&#xA;&lt;p&gt;Refers to keyboards where all keys are in aligned columns and rows. Not all keyboards are a precise grid, some will use aligned columns only with staggered rows (such as the Ergodox).&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:2&#34;&gt;&#xA;&lt;p&gt;Where the left- and right-hand sides are physically separated.&amp;#160;&lt;a href=&#34;#fnref:2&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:3&#34;&gt;&#xA;&lt;p&gt;Uses mechanical keyswitches rather than a rubber membrane.&amp;#160;&lt;a href=&#34;#fnref:3&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:4&#34;&gt;&#xA;&lt;p&gt;See most custom builds, particularly the &lt;a href=&#34;https://deskthority.net/viewtopic.php?f=7&amp;amp;t=6050&#34;&gt;BrownFox&lt;/a&gt;&amp;#160;&lt;a href=&#34;#fnref:4&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/div&gt;&#xA;</description>
			</item>
			<item>
				<title>GitLab Pages and Namecheap</title>
				<link>https://bytesandbobs.net/posts/gitlab-pages-and-namecheap/</link>
				<pubDate>Sun, 18 Oct 2020 00:00:00 +0000</pubDate>
				<guid>https://bytesandbobs.net/posts/gitlab-pages-and-namecheap/</guid>
				<description>&lt;p&gt;This is not a setup guide for GitLab pages, but just a note on the&#xA;combination of it with Namecheap&amp;rsquo;s DNS.&lt;/p&gt;&#xA;&lt;p&gt;The first fishy smell was when testing the verification code with&#xA;&lt;code&gt;dig&lt;/code&gt; after having set up the DNS entries as given on GitLab&amp;rsquo;s&#xA;documentation when setting up Pages.&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;dig _gitlab-pages-verification-code.bytesandbobs.net TXT&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This didn&amp;rsquo;t return my verification code - weird. But what does?&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;dig _gitlab-pages-verification-code.bytesandbobs.net.bytesandbobs.net TXT&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Aha! Namecheap adds your domain as a suffix and doesn&amp;rsquo;t tell you. The&#xA;solition? Set up your TXT record, but just use the key&#xA;&lt;code&gt;_gitlab-pages-verification-code&lt;/code&gt; rather than the one provided by&#xA;GitLab which contains your domain.&lt;/p&gt;&#xA;</description>
			</item>
			<item>
				<title>Not Found</title>
				<link>https://bytesandbobs.net/404.html</link>
				<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
				<guid>https://bytesandbobs.net/404.html</guid>
				<description>&lt;figure&gt;&#xA;    &lt;a href=&#34;https://bytesandbobs.net/404/not_found_cat_hu_b873699979e388a6.jpg&#34;&gt;&#xA;        &lt;img src=&#34;https://bytesandbobs.net/404/not_found_cat_hu_1656ea5c1fc933f.jpg&#34; alt=&#34;A cat hiding under some paper&#34;/&gt;&#xA;    &lt;/a&gt;&#xA;    &lt;figcaption&gt;404 - Not Found by GirlieMac is licensed with CC BY 2.0.&lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;&#xA;</description>
			</item>
	</channel>
</rss>