<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xml:base="https://mattlacey.com/" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>mattlacey.com</title>
    <link>https://mattlacey.com/</link>
    <atom:link href="https://mattlacey.com/feed.xml" rel="self" type="application/rss+xml" />
    <description>This is a longer description about your blog.</description>
    <language>en</language>
    <item>
      <title></title>
      <link>https://mattlacey.com/posts/2026-02-03-no-promises/</link>
      <description>&lt;p&gt;In September I looked back at my &#39;25 resolutions and turns out I&#39;d gotten something done for once. For 2026 I&#39;m not setting resolutions as I don&#39;t feel I can be resolute about them right now. Time is scarce and my mind is fickle. Still, there are some things I&#39;d like to do, including writing more. So I&#39;m writing something down just for my own accountability as much as anything.&lt;/p&gt;
&lt;h2&gt;2025 Final Status&lt;/h2&gt;
&lt;p&gt;These are the goals I set for myself, along with some updates&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Finish the port of the ZX Spectrum Next game - &lt;em&gt;&lt;a href=&quot;https://robc.itch.io/invasion-of-the-emerald-saucers/devlog/944547/emerald-saucers-on-atari-ste&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;did this and released it!&lt;/a&gt;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Get a fully playable &#39;demo&#39; (i.e. at least one level) of my STE platformer - a complete vertical slice - &lt;em&gt;Yeah, not so much. I did get it compiling and running again but that was about it&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Get the engine out of the Honda, then remove from the block the stuck exhaust studs. At some point someone welded nuts to these in an attempt to get them out and still couldn&#39;t budge them. I think a drill is going to be required &lt;em&gt;As per my September status update, the engine is out. I need more space to do more work on it, and an engine hoist&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Stretch Goal&lt;/em&gt; - Get the Honda running - &lt;em&gt;yeah..... I&#39;m gonna go head and as you to forget I wrote that&lt;/em&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;2026 Best Intentions&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Write more. That should be easy enough if I just force myself to choose a topic&lt;/li&gt;
&lt;li&gt;Get &lt;em&gt;something&lt;/em&gt; going on the Net Yaroze. I&#39;ve had one of these since the program was active, but never really achieved anything. I recently took my Atari STE off my desk for a bit to get it set up again, and my intention is to get something 3D on the screen using only what I had available at the time. I&#39;ve got Code Warrior running under Windows 2000 on an old PC, I&#39;ve dug out the reference manuals and I&#39;m getting stuck in&lt;/li&gt;
&lt;li&gt;Make some kind of progress with the Honda - ideally strip the engine down at a minimum&lt;/li&gt;
&lt;/ol&gt;
</description>
      <pubDate>Tue, 03 Feb 2026 00:00:00 GMT</pubDate>
      <dc:creator>Matt Lacey</dc:creator>
      <guid>https://mattlacey.com/posts/2026-02-03-no-promises/</guid>
    </item>
    <item>
      <title></title>
      <link>https://mattlacey.com/posts/2025-09-25-what-now/</link>
      <description>&lt;p&gt;Excuse my language, but I feel it&#39;s necessary to explain the levels of my confusion right now. Like it or loathe it, generative AI has changed the coding game. I&#39;ve not played with a lot of tools, and have really only used Claude Code in anger for a couple of months, here&#39;s a brief overview to set the stage:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Claude Code - I&#39;m using this for work. It&#39;s impressive but it&#39;s performance fluctuates&lt;/li&gt;
&lt;li&gt;Devin - I had a look at this for work, but it&#39;s VM based setup didn&#39;t really work well with my flow. Claude working on my machine was a better setup for how we operate&lt;/li&gt;
&lt;li&gt;ChatGPT - I&#39;ve asked it for code on occasion, and it&#39;s so-so. I wasn&#39;t sold on using AI for code at work until I tried Claude Code&lt;/li&gt;
&lt;li&gt;Lovable.dev - Utilised this for a couple of prototypes, I don&#39;t think it&#39;s good enough to build something proper, but if you want a very fast POC/interactive prototype that looks nice, it&#39;s prettyy damned good&lt;/li&gt;
&lt;li&gt;Cursor - Installed it, played for a bit, but didn&#39;t want to switch IDE. I tend to use a combo of (n)vim/vscode and the CLI (for git etc.)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So when I talk about AI in this post, I&#39;m mostly referring to my experiences with Claude Code, but from what I&#39;ve seen there&#39;s not a lot to choose between the major players in terms of capability, more just how they operate.&lt;/p&gt;
&lt;h1&gt;A World of Contrasts&lt;/h1&gt;
&lt;p&gt;Most of my confusion around AI and where software development is headed stems from the fact that it&#39;s capabilities are so mixed, and the ecosystem around it so messed up. &lt;a href=&quot;https://www.wheresyoured.at/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Ed Zitron is the man to follow&lt;/a&gt; if you want a chance in hell of understanding some of the financials, and they&#39;re frankly bonkers. AI tools are cheap right now, but the companies providing them are burning cash and energy at an unfathomable rate. I think we&#39;re in a window of opportunity where these tools are capable and cheap, I don&#39;t believe that window will be open for long, and for some businesses now is the time to make hay. Something has to give.&lt;/p&gt;
&lt;p&gt;It&#39;s all too easy to be fully doom and gloom about it, so for now I want to ignore the financial side, I&#39;m considering only what the tools do now for the money they cost now as an end user. Are they bad for the planet? Yes. Are prices going to have to rise? Yes. Might it crash the whole tech industry? Good odds. But as I said, let&#39;s ignore that. I just want to get my thoughts out as a long-time coder. So, what are the contrasts of which I&#39;ve hinted? Here&#39;s a short list:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Generative AI can&#39;t &lt;em&gt;think&lt;/em&gt;, but god damn it does a good impression of thinking at times&lt;/li&gt;
&lt;li&gt;Claude knows more than I do about every single dev technology I can think of, and lot more that I&#39;ve not even heard of. From my day-to-day web stuff, to the BeAPI reimplemntation in Haiku, to coding for the Motorola 56k DSP (a few years ago no LLMs had a clue on this)it knows a LOT. And yet knowing is only half the battle.&lt;/li&gt;
&lt;li&gt;AI is super fast at generating code, but said code is often iffy, sometimes outright broken or incorrect&lt;/li&gt;
&lt;li&gt;Sometimes it feels like a super intelligence, at other times it feels dumber than a bag of rocks&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So where does that leave us? In summary, Claude Code is the fastest and most knowledgeable junior developer I&#39;ve ever worked with (and I&#39;ve had the pleasure of working with some great junior developers). No I can&#39;t use a lot of it&#39;s output verbatim, but the correction and feedback loop is so fast a human just can&#39;t compete.&lt;/p&gt;
&lt;h1&gt;So What Does That Mean?&lt;/h1&gt;
&lt;p&gt;I don&#39;t have no idea, which is why I wrote this, not that I expect it to help. What does this all mean? Where the fuck are we going with this? I really don&#39;t know. I believe those poised to get the most out of these tools right now are those with a decent whack of experience under their belt, because the output needs careful review, and the AI needs guiding. Some of the output is terrible, some just needs tweaks, and some needs an experienced eye to spot an issue. I feel deeply for those just graduating or entering our field, they likely don&#39;t have the experience to judge the output themselves and therefore can&#39;t use the tools in the same way, but they can use these tools to help learn. From a learning perspective, it&#39;s a world apart from learning from books, guesswork, and QBASIC online (as in built-in, not on the net) help I started with. I still recall installing the CD based MSDN library and it feeling like a revolution, all that information so easily searchable! That kind of learning defined a lot of my formative programming years, but learning today can be as simple as a series of very specific and pointed questions that get almost immediate answers.&lt;/p&gt;
&lt;p&gt;The tough/brutal/shit part is this: if LLMs are as good as juniors, but faster and far cheaper, then suddenly it makes hiring juniors a very tough proposition for a company. Of course it&#39;s the right thing to do, but sometimes the dollar wins, and that doesn&#39;t mean turning a profit, it might just mean not going out of business. Depending on whether it all goes to shit or not, hiring any developers might be a laughable proposition in a few years time; maybe we&#39;re all done for. In the space of a few months I&#39;ve accepted that my job has changed, but it&#39;s not necessarily a bad thing. I wasn&#39;t enjoying fixing crappy bugs in Jira tickets, and now I don&#39;t have to do that so much. Sure I have to review the output and check each one, but I can outsource the tedious work of it.&lt;/p&gt;
&lt;p&gt;There&#39;s an argument that developers love to code and that&#39;s why we do it for a career: it&#39;s true for many and was for me, but I&#39;m more than happy to keep the act of programming for my hobbies where I can tinker with retro computers and random projects without having to worry about crappy CSS issues on a specific device, or wondering why iOS 26 is now showing a black bar where a keyboard should be. I&#39;m tired of those problems and that kind of work, and now Claude can do it for me. That&#39;s not even hyperbole, on a few occasions I&#39;ve pointed it at a Jira ticket and it&#39;s read it, looked at the code, suggested a fix inside of a minute, and it&#39;s gotten it correct with no changes required.&lt;/p&gt;
&lt;p&gt;Yes, some (many even) tickets I can do faster myself, and some I chose to, but the real speed up is not in having it replace me, it&#39;s having it do one thing while I do another. Or having it do two or three things while I do another. I&#39;ve done this. I&#39;ve had it working on a R&amp;amp;D prototype, fixing a bug, and documenting a process for a team member; all while I&#39;ve been investigating another bug in a specific customer environment. There are genuine use cases where this can boost my output, so that&#39;s great right?&lt;/p&gt;
&lt;h1&gt;That is Great! And Yet...&lt;/h1&gt;
&lt;p&gt;And yet. And fucking yet. Sure, it is great from a let&#39;s-save-money-and-not-hire-juniors point of view, but if we don&#39;t hire juniors, how will they get experienced? Will we even need experienced developers? It might be in a few years nobody builds software; you&#39;ll just ask your phone to do something and it&#39;ll build an app for it on the fly if it doesn&#39;t exist. Or, the costs of LLM based tools will go through the roof, the industry will crash and burn and we&#39;ll be back to square one. Most likely neither of these things because this train is headed for parts unknown: we&#39;re off the map and here be dragons or world-carrying space turtles or paranoid androids.&lt;/p&gt;
&lt;p&gt;So yes, it&#39;s great that it can improve my output, but it&#39;s not the be all and end all. Some simply dismiss any and all AI technologies out of hand, or think it &amp;quot;It&#39;s AI so it must be crap output&amp;quot;; often it is, often it isn&#39;t. From a business perspective right now, in the right context it can make a lot of sense. In other contexts it feels like the Segway, neat, but you could likely run faster, stay fit and stop your muscles wasting away. More than a few studies have shown already that outsourcing all your thinking to these things does not generate good results, either in your work or your capacity to solve problems. I use it to do work, but so that I can use my problem solving elsewhere simultaneously.&lt;/p&gt;
&lt;p&gt;I don&#39;t have a takeaway here, other than to say I don&#39;t think anybody knows what&#39;s actually going on and where the software industry is headed. Though I&#39;d be surprised if there&#39;s a single person out there who&#39;s not sick to the back teeth having AI agents and features being jammed into every single piece of software they use. Thank fuck for open source.&lt;/p&gt;
</description>
      <pubDate>Thu, 25 Sep 2025 00:00:00 GMT</pubDate>
      <dc:creator>Matt Lacey</dc:creator>
      <guid>https://mattlacey.com/posts/2025-09-25-what-now/</guid>
    </item>
    <item>
      <title></title>
      <link>https://mattlacey.com/posts/2025-09-01-resolutions-maybe/</link>
      <description>&lt;p&gt;Turns out I&#39;ve not written a thing this year, though I haven&#39;t been entirely slack. I figured an update would make sense just for my own sanity as much as anything else.&lt;/p&gt;
&lt;h2&gt;A Reminder&lt;/h2&gt;
&lt;p&gt;These are the goals I set for myself:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Finish the port of the ZX Spectrum Next game&lt;/li&gt;
&lt;li&gt;Get a fully playable &#39;demo&#39; (i.e. at least one level) of my STE platformer - a complete vertical slice&lt;/li&gt;
&lt;li&gt;Get the engine out of the Honda, then remove from the block the stuck exhaust studs. At some point someone welded nuts to these in an attempt to get them out and still couldn&#39;t budge them. I think a drill is going to be required&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Stretch Goal&lt;/em&gt; - Get the Honda running&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Progress&lt;/h2&gt;
&lt;p&gt;And here&#39;s how they&#39;re going:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;I finished it! &lt;a href=&quot;https://robc.itch.io/invasion-of-the-emerald-saucers/devlog/944547/emerald-saucers-on-atari-ste&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;You can download it here&lt;/a&gt;. I made a pretty solid push to get this done, and I finally got there. Finishing a hobby project is a rare thing for me so this was an nice achivement.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Uhhh, yeah. I got it building again. No other progress.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The engine is out! The studs are still in it. An engine mount is also still in it. Yes, I did hope to make more progress on this, but in the mean time I acquired another motorcycle that&#39;s also needed some work, and have managed to sort a few things on that, so kind of a win? More to come there I think.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;See #3.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Distractions&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;A 1954 Ariel Red Hunter NH 350... this is what distracted me from doing more work on the Honda. Once that bike was stripped down and scattered around a few shelves I had space for the Ariel, and then that subsequently took up time instead.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Moving OS. I&#39;ve been running a multiboot setup for years, with Windows 10 (then 11), Pop OS! and Haiku. I wanted to try out Arch, and I wanred to try out Hyprland, and that combination is now what I use most of the time on my personal machine. It&#39;s taken a fair bit of tinkering and needs a fair bit more, but it&#39;s enjoyable, and feels not too dissimilar to when I used to run Slackware 20+ years ago, at least in spirit.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I&#39;ll on doubt put a project page up in due course for the Ariel, because something tells me there will always be something in progress with that bike, but that&#39;s part of the fun.&lt;/p&gt;
</description>
      <pubDate>Mon, 01 Sep 2025 00:00:00 GMT</pubDate>
      <dc:creator>Matt Lacey</dc:creator>
      <guid>https://mattlacey.com/posts/2025-09-01-resolutions-maybe/</guid>
    </item>
    <item>
      <title></title>
      <link>https://mattlacey.com/posts/2025-01-23-resolutions_ii/</link>
      <description>&lt;p&gt;&lt;a href=&quot;https://mattlacey.com/posts/2024-01-03-resolutions/&quot;&gt;I wrote a post last year&lt;/a&gt; detailing some goals for the year, in the hope that some structure might help me actually finish something for once. It kinda helped, I did look back it at once or twice, but success was a mixed bag, because as usual one thing led to another and one hobby project got dropped for three more.&lt;/p&gt;
&lt;h2&gt;Status check on 2024&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Sort out the Atari STF that I bought and need to sell&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I actually did this one! &lt;a href=&quot;https://mattlacey.com/projects/atari-1040-stf/&quot;&gt;You can read the write up&lt;/a&gt; but basically I got it cleaned up, fixed a few bits on it and sold it on to a local guy who was keen to relive some of his childhood. Pefect.&lt;/p&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;Finish the TIC-80 platformer I started, at least to the point of making it a worthwhile &#39;demo&#39; of sorts&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Yeah, not so much. I don&#39;t think I&#39;ve written any code for the TIC-80 this year, though I&#39;ll have to check my repos to be sure of that. I did however get my Atari STE platformer back up and running, made a bit of progress, and then got distracted. I started porting a friend&#39;s ZX Spectrum Next BASIC game to the STE instead, and thought that would be done for Christmas. All that&#39;s left to do is the help text for the front end, but it&#39;s been that way for a month. Ho hum.&lt;/p&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;If possible, get my old Honda CBR1000F back on the road&lt;/li&gt;
&lt;li&gt;If not possible, because it&#39;s in more of a state than I already know, get rid of it&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Possibility still unknown. Said Honda is in far more parts than it was at the start of the year, most of it&#39;s on a shelf.&lt;/p&gt;
&lt;h2&gt;This Year?&lt;/h2&gt;
&lt;p&gt;Here&#39;s a few goals for the year that seem doable.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Finish the port of the ZX Spectrum Next game&lt;/li&gt;
&lt;li&gt;Get a fully playable &#39;demo&#39; (i.e. at least one level) of my STE platformer - a complete vertical slice&lt;/li&gt;
&lt;li&gt;Get the engine out of the Honda, then remove from the block the stuck exhaust studs. At some point someone welded nuts to these in an attempt to get them out and still couldn&#39;t budge them. I think a drill is going to be required&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Stretch Goal&lt;/em&gt; - Get the Honda running&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;No doubt when I come to review this list next year I&#39;ll have done some very different things alotgether, but time will tell.&lt;/p&gt;
</description>
      <pubDate>Thu, 23 Jan 2025 00:00:00 GMT</pubDate>
      <dc:creator>Matt Lacey</dc:creator>
      <guid>https://mattlacey.com/posts/2025-01-23-resolutions_ii/</guid>
    </item>
    <item>
      <title></title>
      <link>https://mattlacey.com/posts/2024-12-10-tombstone-win-31/</link>
      <description>&lt;p&gt;Let&#39;s cut to the chase. I remembered this game. I knew it existed. I knew it played something like Indiana Jones&#39; Desktop Adventures. Could I find it? No. Does it exist? Yes. Have I found it? Very yes.&lt;/p&gt;
&lt;h2&gt;Striking Gold&lt;/h2&gt;
&lt;p&gt;Searching online for this think I came up with nothing, though I tried a few times over the years I never found myself getting any further, though one fateful day I did find &lt;a href=&quot;https://www.reddit.com/r/tipofmyjoystick/comments/myubhi/windows_95_1990s_help_me_find_this_old_game/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;a reddit thread about this exact game&lt;/a&gt;, while nobody else could find anything, it did it least prove to be that I hadn&#39;t dreamt the entire thing up. For a few years nothing much changed. Searches didn&#39;t help and I continued to write it off as a lost cause. Earlier today I checked the reddit thread once more and was quite amused to see someone else looking for the game but there still being no other progress.&lt;/p&gt;
&lt;p&gt;Then I decided to search on archive.org, and up came a couple of PC World &lt;a href=&quot;https://archive.org/details/pcw-may-1996-linux-ukuug&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;cover&lt;/a&gt; &lt;a href=&quot;https://archive.org/details/pcwi_april_96&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;disks&lt;/a&gt; (discs I guess, being CDs) - the second is the one I&#39;ve used. I&#39;d already decided this was the most likely avenue of finding the thing, but searching archive.org in the past had proved fruitless, so I was quite heartened when a search for &amp;quot;tombstone&amp;quot; in the software archive brought these disk images up. It seems odd that I&#39;d not found these before since these images were added in 2021, but upon inspecting the contents of the April 1996 image I found the game files and quickly downloaded the .iso.&lt;/p&gt;
&lt;h2&gt;Running IT&lt;/h2&gt;
&lt;p&gt;At first I tried running the CD-ROM menu program using Wine, but had no luck for some reason. I tried the game&#39;s installer too but with similar results. Then I remembered that I only had to hit a button to fire up my old Pentium machine - so I did that, dug the keyboard out from behind my desk and set about getting the game onto it. DOS booted fine, but for some reason network file transfers on it are running super slowly. Small files (up to around 100KB) are super quick, but beyond that it seems to stall for ages at a time. It would likely have been faster to dig out a floppy but I was feeling lazy and left it to run.&lt;/p&gt;
&lt;p&gt;When that was finally done I eagerly fired up the installer, only to get an error message. A quick view of the bundled text file indicated how to solve that: updating VER.DLL for my Win 3.1 installation with one bundled with the game. Times have definitely changed. Once that was done the installer ran without issues, and the game started! I grabbed some screenshots, but hit a snag: the window is rather large, bigger than the view of the canvas size in Paint, and paint seems to only paste into the visible part of the buffer. Undeterred I rebooted into Win95 to see if it would run there, and sure enough that worked fine, and apparently by that time Microsoft had seen fit to fix that particular Paint bug, so here it is... Tombstone!&lt;/p&gt;
&lt;p&gt;&lt;center&gt;&lt;a href=&quot;https://mattlacey.com/img/tombstone/title.png&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://mattlacey.com/img/JqoJDzhhb5-677.webp 677w&quot;&gt;&lt;img loading=&quot;lazy&quot; src=&quot;https://mattlacey.com/img/JqoJDzhhb5-677.jpeg&quot; alt=&quot;The Tombstone Title Screen&quot; width=&quot;677&quot; height=&quot;586&quot;&gt;&lt;/picture&gt;&lt;/a&gt;&lt;/center&gt;
&lt;center&gt;&lt;a href=&quot;https://mattlacey.com/img/tombstone/game.png&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://mattlacey.com/img/b92tTFr6FK-677.webp 677w&quot;&gt;&lt;img loading=&quot;lazy&quot; src=&quot;https://mattlacey.com/img/b92tTFr6FK-677.jpeg&quot; alt=&quot;The First Level&quot; width=&quot;677&quot; height=&quot;586&quot;&gt;&lt;/picture&gt;&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;
&lt;h2&gt;Next Up...&lt;/h2&gt;
&lt;p&gt;Other than playing it, the next task is to see if I can track down the author, one David Graham who sold it through a company (possibly unregistered) called D.G Soft. Mobygames has a Dave Graham, could be the same guy, we&#39;ll see, with some luck. It took me my surprise to discover it was a UK game. Then again, perhaps that&#39;s why it was (seemingly) relatively unknown?&lt;/p&gt;
&lt;h2&gt;Grab It!&lt;/h2&gt;
&lt;p&gt;I&#39;ll be donating to arhive.org off the back of finding this, but to &lt;a href=&quot;https://mattlacey.com/files/tombstone.zip&quot;&gt;save them a little data transfer, and save anyone who cares some time, you can download a zip of the installer directory here&lt;/a&gt;. I assume the Shareware usage is still good. Once I&#39;ve worked out why my old DOS PC is running so slowly, I&#39;ll grab a copy of the installed directory, but all the installer appears to do is run &lt;code&gt;EXPAND&lt;/code&gt; on each of the files, renaming them to proper file extensions on the way.&lt;/p&gt;
</description>
      <pubDate>Tue, 10 Dec 2024 00:00:00 GMT</pubDate>
      <dc:creator>Matt Lacey</dc:creator>
      <guid>https://mattlacey.com/posts/2024-12-10-tombstone-win-31/</guid>
    </item>
    <item>
      <title></title>
      <link>https://mattlacey.com/posts/2024-10-18_minecraft-bedrock-server/</link>
      <description>&lt;p&gt;For some time I&#39;ve run a Minecraft Bedrock server for my kids on an old 2013 Macbook Pro, which was running Ubuntu 18.04. Apart from occasionally updating the Minecraft server software I&#39;ve barely had to touch it, but that process was still a little tedious, and then recently I hit the point where I couldn&#39;t easily update Ubuntu because that release was no longer supported. I attempted to do an upgrade but downloading the packages took so long (no idea why, it wasn&#39;t my connection) that I got bored and decided to start over. In addition I wanted to explore the idea of being able to run multiple servers on the one machine.&lt;/p&gt;
&lt;p&gt;In the end there were a few separate steps involved in achieving my goals, but the process wasn&#39;t immediately obvious - at least getting the servers up was ok, but making them visible to the XBox client less so, as it doesn&#39;t let you add a server by entering the IP address.&lt;/p&gt;
&lt;h2&gt;Running Multiple Servers&lt;/h2&gt;
&lt;p&gt;Because the Linux binary provided by Microsoft is built for Ubunutu, I decided to stick with that distribution and downloaded the brand new 24.10. It took a little while to sort out the WiFi drivers (proprietary Broadcom ones required) but other than that it was smooth sailing. In my head Ubuntu is still a &amp;quot;new&amp;quot; distro, it boggles my mind to think that it&#39;s now 20 years old.&lt;/p&gt;
&lt;p&gt;Once that was done I decided to have a look at using Docker to run the server. Although I&#39;ve always vaguely known about what Docker does and is, I&#39;ve never used it beacuse I&#39;ve not had reason to, but I had a hunch that it would not only make running multiple servers easier, it would also mean I could run multiple without having them run on different ports.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Note (18/10/24) - The steps below are me writing them out retroactively. There could be something missing but hopefully it&#39;s enough to guide you through a process that took me a fair bit of trail, error and research. I will run these from scratch in a VM in the near future and ensure they&#39;re as accurate as possible.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Step 1 : Install Docker&lt;/h2&gt;
&lt;p&gt;Rather than go into detail here, I suggest &lt;a href=&quot;https://docs.docker.com/engine/install/ubuntu/#install-using-the-repository&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;visiting the official Docker website&#39;s install instructions&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Step 2 : Setup Some Servers&lt;/h2&gt;
&lt;p&gt;Karl Rees, along with a couple of others, created docker_bedrockserver, which is a docker container setup to run the &lt;code&gt;bedrock_server&lt;/code&gt; binary that you&#39;d usually download directly from Microsoft. In fact, his repository includes scripts to automatically update the servers on restarting the containers. That said, when I tried to get it going there were a few things that were a little out of date. I&#39;m going to open a pull request shortly to get those changes into Karl&#39;s repo (hopefully), but for now you can clone from the &lt;a href=&quot;https://github.com/mattlacey/docker_bedrockserver&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;fork I created - https://github.com/mattlacey/docker_bedrockserver&lt;/a&gt;. It&#39;s probably worth reading the README in it&#39;s entirety, but following is the part relevant to setting up multiple servers quickly.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;code&gt;README.md&lt;/code&gt; starts here&lt;/p&gt;
&lt;p&gt;To run multiple servers using multiple Bedrock worlds, each running at a separate IP address on your LAN, the setup script can try to setup your environment for you. Be sure to install docker-compose.&lt;/p&gt;
&lt;p&gt;Download the source code from git.&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; clone https://github.com/mattlacey/docker_bedrockserver&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Run the setup_multi.sh script.&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;cd&lt;/span&gt; docker_bedrockserver&lt;br&gt;./setup_multi.sh&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This copies the example &lt;code&gt;.env&lt;/code&gt; file, &lt;code&gt;docker-compose.yml&lt;/code&gt; file, and &lt;code&gt;mcdata&lt;/code&gt; folder to their expected locations, and populates the environment variables with some naive assumptions about your network and mcdata storage location.&lt;/p&gt;
&lt;p&gt;If you want more than just the two example servers, edit the &lt;code&gt;docker-compose.yml&lt;/code&gt; file to include a separate section for each server. Be sure to change the name for each server--change both the container_name property and the WORLD environment variable. Be sure to use a different IP address for each server as well.&lt;/p&gt;
&lt;p&gt;Run docker-compose&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;docker-compose&lt;/span&gt; up &lt;span class=&quot;token parameter variable&quot;&gt;-d&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;README.md ends here&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;At this point it pays to read some of the Docker documentation, but in short you now have two containers running, each hosting a server. You can check they&#39;re running using &lt;code&gt;docker ps&lt;/code&gt;, and stop them both with &lt;code&gt;docker compose down&lt;/code&gt;. Do that now, and then we&#39;ll look at some of the settings in &lt;code&gt;docker_compose.yaml&lt;/code&gt;, which is the file that tells docker how to configure the containers.&lt;/p&gt;
&lt;h2&gt;Step 3 : Edit &lt;code&gt;docker_compose.yaml&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;I can&#39;t really provide settings for your LAN, but chances are they&#39;re similar to what&#39;s in the compose file already. That said, one major change I had to make was changing the network driver to &lt;code&gt;ipvlan&lt;/code&gt; instead of &lt;code&gt;macvlan&lt;/code&gt; - for some reason my network hardware doesn&#39;t like &lt;code&gt;macvlan&lt;/code&gt; and I couldn&#39;t see the containers on the network. The networks section of the file will look something like this:&lt;/p&gt;
&lt;pre class=&quot;language-yaml&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;token key atrule&quot;&gt;networks&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;br&gt; &lt;span class=&quot;token key atrule&quot;&gt;default&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token key atrule&quot;&gt;driver&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; ipvlan&lt;br&gt;  &lt;span class=&quot;token key atrule&quot;&gt;driver_opts&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token key atrule&quot;&gt;parent&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; $&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;NETWORKINTERFACE&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;wlp3s0&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token key atrule&quot;&gt;ipam&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token key atrule&quot;&gt;config&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;subnet&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; $&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;IPPREFIX&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;192.168.0&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;.0/24&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Note: &lt;code&gt;wlp3s0&lt;/code&gt; is the name of the WiFi connection on my Macbook when running Ubuntu, find yours using &lt;code&gt;ifconfig&lt;/code&gt; or similar, and ensure the subnet matches your network configuration too. Most home routers configure the local network to use &lt;code&gt;192.168.0.x&lt;/code&gt; or &lt;code&gt;192.168.1.x&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;After the generic section of the file you&#39;ll see two blocks for servers, with examples of settings for game mode and the like. Each server will need an IP address for your network, so be sure to put in a value that&#39;s legitimate and free for your LAN. Again, I can&#39;t tell you what your network configuration is, but hopefully if you&#39;re doing this you&#39;re already comfortable with tools such as &lt;code&gt;ifconfig&lt;/code&gt;.  Using the subnet above, the first server block would look something like this:&lt;/p&gt;
&lt;pre class=&quot;language-yaml&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt; &lt;span class=&quot;token key atrule&quot;&gt;minecraft1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token key atrule&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token important&quot;&gt;*default-mcserver&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token key atrule&quot;&gt;environment&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token key atrule&quot;&gt;WORLD&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; family&lt;br&gt;   &lt;span class=&quot;token key atrule&quot;&gt;MCPROP_SERVER-NAME&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Creative World&quot;&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token key atrule&quot;&gt;MCPROP_GAMEMODE&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;             &lt;span class=&quot;token comment&quot;&gt;# 0 is survival, 1 is creative, 2 is adventure&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token key atrule&quot;&gt;MCPROP_ENABLE-LAN-VISIBILITY&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean important&quot;&gt;true&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token key atrule&quot;&gt;container_name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; minecraft1&lt;br&gt;  &lt;span class=&quot;token key atrule&quot;&gt;networks&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;br&gt;   &lt;span class=&quot;token key atrule&quot;&gt;default&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token comment&quot;&gt;# Be sure the last three digits of IP address is unique&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token key atrule&quot;&gt;ipv4_address&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; $&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;IPPREFIX&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;192.168.0&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;.20&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;After editing the file, either restart or start the servers as required:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;docker&lt;/span&gt; compose up &lt;span class=&quot;token parameter variable&quot;&gt;-d&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token comment&quot;&gt;# or&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token function&quot;&gt;docker&lt;/span&gt; compose restart&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Step 4 : Play! (On PC at least...)&lt;/h2&gt;
&lt;p&gt;At this point, depending on the hardware you&#39;re playing on, you could well be good to go. On PC (and Android) under the servers tab in the game, there&#39;s an option to add a custom server.  Adding the IP addresses you assigned in the yaml config file here should be all you need to do. If the containers are up they should be available on your network on the standard Minecraft port 19132.&lt;/p&gt;
&lt;h2&gt;Step 5 : Get That XBox/Switch On Using BedrockConnect&lt;/h2&gt;
&lt;p&gt;I spent a day or two trying to work out how I could get these shiny new servers to appear in the Friends List on the XBox my son plays on. There&#39;s no way to add a server in the server list, and unlike the server I ran directly before embarking on this adventure, the new ones didn&#39;t show in the Friends list, meaning he couldn&#39;t join. I still don&#39;t know the exact reason why they don&#39;t share in there, but I suspect it&#39;s to do with UDP packet delivery between the virtual network of the container and my physical LAN. Anyway, I eventually tripped over &lt;a href=&quot;https://github.com/Pugmatt/BedrockConnect&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Putmatt&#39;s BedrockConnect&lt;/a&gt; which is designed to solve this exact problem. It really goes further than I need, so here I&#39;ll boil it down to the few steps needed to get a Switch/Xbox showing your new serves in the Friends list.&lt;/p&gt;
&lt;p&gt;The Minecraft clients for these platforms get a list of servers from a special server, and essentially we can hijack this process by running our own DNS server for the console to use, redirecting it&#39;s requests to yet another Docker container that provides the console with our own list of game servers. &lt;a href=&quot;https://raw.githubusercontent.com/Pugmatt/BedrockConnect/master/scripts/install-bind.sh&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Puggmatt provides a setup script for the DNS server in his setup instructions&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Warning!! It&#39;s never a great idea to just run random shell scripts from the internet without reading them first. I read it, felt ok with it and proceeded. I do suggest reading it first for the sake of sanity, not least because you need to run it with &lt;code&gt;sudo&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Download the script (you might need to run &lt;code&gt;sudo apt install wget&lt;/code&gt; if it&#39;s not already installed) and run it using the IP addess of the machine you&#39;re setting this all up on, i.e. the one running the Docker containers. The process will look something like this:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;wget&lt;/span&gt; https://raw.githubusercontent.com/Pugmatt/BedrockConnect/master/scripts/install-bind.sh&lt;br&gt;&lt;span class=&quot;token function&quot;&gt;chmod&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;755&lt;/span&gt; ./install-bind.sh&lt;br&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; install-bind.sh &lt;span class=&quot;token number&quot;&gt;192.168&lt;/span&gt;.0.10&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now to run BedrockConnect itself I also wanted to use a container for convenience, and quickly found &lt;a href=&quot;https://github.com/strausmann/minecraft-bedrock-connect&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;straussman&#39;s container repo&lt;/a&gt; to do just that. The README on the repo lists a few options for running it, I went for a using &lt;code&gt;docker compose&lt;/code&gt; again for consistency, and the process was quite straight forward, requiring just the config file (as provided) and a short JSON file listing my two custom servers.&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;mkdir&lt;/span&gt; bedrock_connect&lt;br&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;cd&lt;/span&gt; bedrock_connect&lt;br&gt;&lt;span class=&quot;token function&quot;&gt;mkdir&lt;/span&gt; config&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In the &lt;code&gt;bedrock_connect&lt;/code&gt; directory, use the editor of your choice to create a file called &lt;code&gt;docker-compose.yaml&lt;/code&gt; with the following contents:&lt;/p&gt;
&lt;pre class=&quot;language-yaml&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;---&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token key atrule&quot;&gt;services&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token key atrule&quot;&gt;bedrockconnect&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token key atrule&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; strausmann/minecraft&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;bedrock&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;connect&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token key atrule&quot;&gt;restart&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; always&lt;br&gt;    &lt;span class=&quot;token key atrule&quot;&gt;environment&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;br&gt;      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; NODB=true&lt;br&gt;      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; CUSTOM_SERVERS=/config/serverlist.json&lt;br&gt;      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; SERVER_LIMIT=25&lt;br&gt;    &lt;span class=&quot;token key atrule&quot;&gt;ports&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;br&gt;      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; 19132&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;19132/udp&lt;br&gt;    &lt;span class=&quot;token key atrule&quot;&gt;volumes&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;br&gt;      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; bedrockconnect&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;/config&lt;br&gt;&lt;br&gt;&lt;span class=&quot;token key atrule&quot;&gt;volumes&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token key atrule&quot;&gt;bedrockconnect&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token key atrule&quot;&gt;driver&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; local&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The in the config directory create a file called &lt;code&gt;serverlist.json&lt;/code&gt; where you can list the two servers you created using their IP addresses (last time I labour this point, but the IPs below are just an example - adjust as required!):&lt;/p&gt;
&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token property&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Local Server - Creative&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token property&quot;&gt;&quot;iconUrl&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;https://i.imgur.com/nhumQVP.png&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token property&quot;&gt;&quot;address&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;192.168.0.20&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token property&quot;&gt;&quot;port&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;19132&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token property&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Local Server - Survival&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token property&quot;&gt;&quot;iconUrl&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;https://i.imgur.com/nhumQVP.png&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token property&quot;&gt;&quot;address&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;192.168.0.21&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;token property&quot;&gt;&quot;port&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;19132&lt;/span&gt;&lt;br&gt;  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;With this done, bedrock_connect can be started using the same command as before (in the right directory of course!):&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;docker&lt;/span&gt; compose up &lt;span class=&quot;token parameter variable&quot;&gt;-d&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The final step is to point your Switch/XBox at the DNS server created by the shell script. On the XBox the DNS settings are under the Advanced box under network settings. For the primary use the IP of your server that you provided to the script (192.168.0.10 in the example above), then set the secondary to a public one, such as 1.0.0.1. With that done, launch the game and if everything&#39;s gone to plan you should now see your two Bedrock servers showing under the Friend&#39;s tab!&lt;/p&gt;
</description>
      <pubDate>Fri, 18 Oct 2024 00:00:00 GMT</pubDate>
      <dc:creator>Matt Lacey</dc:creator>
      <guid>https://mattlacey.com/posts/2024-10-18_minecraft-bedrock-server/</guid>
    </item>
    <item>
      <title></title>
      <link>https://mattlacey.com/posts/2024-03-29-hddriver-atari-linux/</link>
      <description>&lt;p&gt;If you&#39;re using an SD-Card with an Atari machine, you&#39;ll need a driver to make it work. There&#39;s ICD Pro which is old, but free, &lt;a href=&quot;https://atari.8bitchip.info/pphdr.php&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Pera Putnik&#39;s drivers&lt;/a&gt; which he sells quite cheap for the specific machine configuration that you request, and then there&#39;s &lt;a href=&quot;https://hddriver.net/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Dr. Uwe Seimet&#39;s venerable HDDriver&lt;/a&gt;. This costs a fair bit more but it supports all Atari ST-line machines and just about any disk hardware. I purchased version 10 of HDDriver quite a few years ago and have been happy with it every since, but I laos purchased Pera Putnik&#39;s driver and have used that with great success too.&lt;/p&gt;
&lt;h2&gt;Making It Work&lt;/h2&gt;
&lt;p&gt;One thing that was working for me with Pera Putnik&#39;s driver and not HDDriver was being able to access the partitions on the SD Card from my PC when running GNU/Linux. Windows was fine, but under Pop_OS I could only mount one partition. Weirdly running &lt;code&gt;fdisk -l /dev/sdc&lt;/code&gt; would list other partitions but I simply had no way of mounting them. I played around with different options when partitioning and didn&#39;t get anywhere, until finally I tried paritioning &lt;em&gt;without&lt;/em&gt; Windows compatability enabled.&lt;/p&gt;
&lt;p&gt;&lt;center&gt;&lt;a href=&quot;https://mattlacey.com/img/stf/hddriver_settings.jpg&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://mattlacey.com/img/SxA4OoZq4S-2326.webp 2326w&quot;&gt;&lt;img loading=&quot;lazy&quot; src=&quot;https://mattlacey.com/img/SxA4OoZq4S-2326.jpeg&quot; alt=&quot;HDDriver settings for TOS/Windows Compatability, showing Windows Compatability turned OFF&quot; width=&quot;2326&quot; height=&quot;1581&quot;&gt;&lt;/picture&gt;&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;
&lt;p&gt;Simply turning that off, leaving byte-swapping unchecked, and specifying compatability with TOS 1.04 (I&#39;m still playing around with the &lt;a href=&quot;https://mattlacey.com/projects/atari-1040-stf&quot;&gt;STF that I bought&lt;/a&gt;) did the trick. All the partitions show on the Atari, and all four mount perfectly on my PC too.&lt;/p&gt;
&lt;p&gt;I need to see if there&#39;s some suitable way to label the partitions, but for the sake of my own sanity, on each drive mounted on the Atari (F through I) I created a folder on the root of each with the corresponding drive letter as the name. It&#39;s not perfect but it&#39;ll do me for now.&lt;/p&gt;
</description>
      <pubDate>Fri, 29 Mar 2024 00:00:00 GMT</pubDate>
      <dc:creator>Matt Lacey</dc:creator>
      <guid>https://mattlacey.com/posts/2024-03-29-hddriver-atari-linux/</guid>
    </item>
    <item>
      <title></title>
      <link>https://mattlacey.com/posts/2024-01-03-resolutions/</link>
      <description>&lt;p&gt;Today I discovered a blog post that I wrote years ago and had completely forgotten about, a &lt;a href=&quot;https://laceysnr.com/posts/100-programmer-resolutions-for-new-year/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;list of 4 coding resolutions&lt;/a&gt; for 2013 (I was being a smart arse and wrote 100 in the title for a binary representation of 4). I don&#39;t think I ever went back to the post, but in short they were:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Learn more ARM Assembly&lt;/li&gt;
&lt;li&gt;Contribute to &lt;a href=&quot;https://haiku-os.org&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Haiku&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Finish a Game&lt;/li&gt;
&lt;li&gt;Continue to Participate in the Force.com/Salesforce  Community&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;To the best of my recollection (hey, it was 11 years ago!) I would have scored 25% on this, with #4 being the only thing I managed to do, and it&#39;s something I still do today but in a much smaller capacity. Some years later I wrote quite a lot of 68k assembly, but never really progressed on the ARM front. I didn&#39;t do much for Haiku other than comment on things and maybe get it building, and as for finishing a game that just didn&#39;t happen. Again, it did happen some years later, that game being written in 68k - two birds with one (late) stone!&lt;/p&gt;
&lt;h2&gt;2024&lt;/h2&gt;
&lt;p&gt;Discovering this blog post again, and at such an apt time of year got me thinking, what should my resolutions be for this year? I don&#39;t typically set them, but having some that are hobby specific &lt;em&gt;might&lt;/em&gt; (but probably won&#39;t) kick me into action to some extent, so here&#39;s a short list, that I&#39;ll endeavour to report on again next year, just so I can show myself how distracted I get and how I&#39;m a perrenial starter, not a finisher, when it comes to hobby projects.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Sort out the Atari STF that I bought and need to sell&lt;/li&gt;
&lt;li&gt;Finish the TIC-80 platformer I started, at least to the point of making it a worthwhile &#39;demo&#39; of sorts&lt;/li&gt;
&lt;li&gt;If possible, get my old Honda CBR1000F back on the road&lt;/li&gt;
&lt;li&gt;If not possible, because it&#39;s in more of a state than I already know, get rid of it&lt;/li&gt;
&lt;/ol&gt;
</description>
      <pubDate>Wed, 03 Jan 2024 00:00:00 GMT</pubDate>
      <dc:creator>Matt Lacey</dc:creator>
      <guid>https://mattlacey.com/posts/2024-01-03-resolutions/</guid>
    </item>
    <item>
      <title></title>
      <link>https://mattlacey.com/posts/2023-09-07_building-dave-part-ii/</link>
      <description>&lt;p&gt;So &lt;a href=&quot;https://mattlacey.com/posts/2023-09-06_building-dave/&quot;&gt;yesterday&lt;/a&gt; I finished up hitting an assertion in brownout, one of the tools that comes with the brown versions of the GCC compiler, and I seem to recall it does some format conversion of, well, something.&lt;/p&gt;
&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;brownout: brownout.cpp:418: std::map&lt;unsigned int,=&quot;&quot; std::pair&lt;unsigned=&quot;&quot; int=&quot;&quot;&gt; &gt;::iterator get_section_for_va(elfsectionboundsmap_t&amp;, uint32_t): Assertion `_va &gt;= reference_bound-&gt;second.first&#39; failed.&lt;br&gt;make: *** [Makefile:190: lolworld.elf] Aborted (core dumped)&lt;br&gt;make: *** Deleting file &#39;lolworld.elf&#39;&lt;br&gt;rm lolworld.o&lt;/unsigned&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This post isn&#39;t realtime because I figured (correctly) that things might move faster if I spend less time writing prose while working. Tonight&#39;s path took a different direction. First off I explored the other examples folder, &lt;code&gt;barebones-interop&lt;/code&gt; and that proved interesting. First I got a build running quite quickly, secondly there were no Makefiles in sight. Instead, this uses &lt;code&gt;fbuild&lt;/code&gt; or &lt;a href=&quot;https://fastbuild.org/docs/home.html&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Fastbuild&lt;/a&gt;, which I&#39;d not heard of before, but am already quite impressed with. I fully intend to learn more, and possibly use it to build Dave.&lt;/p&gt;
&lt;p&gt;Once that was installed, compiling the &lt;code&gt;barebones-interop&lt;/code&gt; demo was simple, and so I switched my attention back to my previous issue. Full disclaimer: I&#39;m not any further ahead on that front, but I don&#39;t necessarily need to be either. I realised I wouldn&#39;t solve this puzzle on my own so went straight to ggn to ask what the deal was, and he said it&#39;s a known complicated issue that still needs resolving, but in the meantime he&#39;d been working at converting AGTs demos over to Fastbuild, and to that end has a repo called &lt;a href=&quot;https://bitbucket.org/ggnkua/agtools_fastbuild/src/master/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;&amp;quot;Portable build system for Atari Game Tools by dml&amp;quot;&lt;/a&gt; with some pre-built toolchain binaries. This does exactly what it says on the tin, and within a minute or so of him pointing me at the repo I&#39;d successfully built the abreed (a POC Alien Breed) demo that comes with AGT:&lt;/p&gt;
&lt;p&gt;&lt;center&gt;&lt;a href=&quot;https://mattlacey.com/img/abreed_boot.png&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://mattlacey.com/img/dBRkWCqddR-852.webp 852w&quot;&gt;&lt;img loading=&quot;lazy&quot; src=&quot;https://mattlacey.com/img/dBRkWCqddR-852.jpeg&quot; alt=&quot;Screenshot of the abree demo boot screen&quot; width=&quot;852&quot; height=&quot;643&quot;&gt;&lt;/picture&gt;&lt;/a&gt;&lt;/center&gt;
&lt;center&gt;&lt;a href=&quot;https://mattlacey.com/img/abreed_demo.png&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://mattlacey.com/img/GqVkBCLyQV-852.webp 852w&quot;&gt;&lt;img loading=&quot;lazy&quot; src=&quot;https://mattlacey.com/img/GqVkBCLyQV-852.jpeg&quot; alt=&quot;Screenshot of the abree demo running&quot; width=&quot;852&quot; height=&quot;643&quot;&gt;&lt;/picture&gt;&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;
&lt;p&gt;That just about brings things up to speed for where I am right now. Next step is to get on with actually trying to build my own code once more, and that seems like a good opportunity to learn more about Fastbuild. ggn also told me about it&#39;s neat report generation, whereby it can generate a HTML report of build times, so naturally I had to try that and you can &lt;a href=&quot;https://mattlacey.com/etc/fbreport&quot;&gt;view the output from it&#39;s build of the abreed demo&lt;/a&gt; if you so wish.&lt;/p&gt;
</description>
      <pubDate>Thu, 07 Sep 2023 00:00:00 GMT</pubDate>
      <dc:creator>Matt Lacey</dc:creator>
      <guid>https://mattlacey.com/posts/2023-09-07_building-dave-part-ii/</guid>
    </item>
    <item>
      <title></title>
      <link>https://mattlacey.com/posts/2023-09-06_building-dave/</link>
      <description>&lt;p&gt;AGT (Atari Game Tools) is a set of tools and libraries built by DML, aka Douglas Little, and to be frank the guy&#39;s knowledge of Atari ST/STE/Falcon development is humbling. AGT makes it quite easy to get started moving sprites and backgrounds around the screen in ways that would have dropped jaws back in the day, because Douglas has done the hardwork for you. What it doesn&#39;t do is bring down game development to entry level. It&#39;s a bit of a moving goal post and can be a little confusing, but that doesn&#39;t detract from it&#39;s magnificence. Years ago I started work on a platformer using it, but having not touched it for far longer than I meant to, I really want to get it going again. Of course, AGT has changed in the meantime and now I&#39;ve got some work to do to get it building once more, let alone running.&lt;/p&gt;
&lt;p&gt;This is a sort of real-time rambling journal of my efforts in doing so.&lt;/p&gt;
&lt;h2&gt;Setting Up AGT&lt;/h2&gt;
&lt;p&gt;The first step is to clone &lt;a href=&quot;https://bitbucket.org/d_m_l/agtools/src/master/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;the AGT repo from bitbucket&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Next comes building the various graphics tools AGT provides (these are used for sprite &amp;amp; background cutting and conversion to formats used by AGT). This is a relatively simple job if you&#39;re in a *nix environment (macOS, GNU/Linux, WSL, or MinGW all work). Some Windows binaries are provided but on other platforms you need to go through the various directories in the &lt;code&gt;tools&lt;/code&gt; directory, and run &lt;code&gt;make&lt;/code&gt; in each.&lt;/p&gt;
&lt;p&gt;As a test I tried compiling one of the examples and failed almost immediately: on this OS (unlike most of my other systems) I don&#39;t yet have a 68k GCC cross compiler installed. There&#39;s a few options out there, the most well known arguably being &lt;a href=&quot;http://vincent.riviere.free.fr/soft/m68k-atari-mint/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Vincent Rivière&#39;s m68k-atari-mint cross-tools&lt;/a&gt;, but there&#39;s reasonably old now and I know GGN has a thing for brown &lt;sup class=&quot;footnote-ref&quot;&gt;&lt;a href=&quot;https://mattlacey.com/posts/2023-09-06_building-dave/#fn1&quot; id=&quot;fnref1&quot;&gt;[1]&lt;/a&gt;&lt;/sup&gt; and has &lt;a href=&quot;https://github.com/ggnkua/bigbrownbuild-git&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;a repository with a shell script called bigbrownbuild&lt;/a&gt; that can generate GCC cross compilers for a veritable pile of GCC versions. The last time I tried to get this to work I failed, though I can&#39;t recall what computer or platform I was trying it on.&lt;/p&gt;
&lt;p&gt;Before writing the last paragraph I couldn&#39;t remember the name of the repo, so I simply searched for &amp;quot;atari gcc brown&amp;quot; and inevitably ended up on the correct site, &lt;a href=&quot;http://beyondbrown.d-bug.me/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;GGN&#39;s blog titled &amp;quot;Beyond Brown&amp;quot;&lt;/a&gt;. From there I found the relevant link but first I &lt;a href=&quot;http://beyondbrown.d-bug.me/the-twist&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;totally got distracted reading about The twist&lt;/a&gt; and I can&#39;t say it was time mispent. No least because I tripped over the following quote in there, which seems rather apt for my current scenario:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Putting tasks off for long periods, especially for reusable code, is sure to make them look daunting or impossible as time passes.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Good point. Dave&#39;s not re-usable (yet) but putting it aside for so long has left me completely out of tune with that code, and with AGT.&lt;/p&gt;
&lt;h2&gt;bigbrownbuild.sh&lt;/h2&gt;
&lt;p&gt;Here we go.&lt;/p&gt;
&lt;p&gt;Run the script, fail fast. Check the log file indicated by the command run (&lt;code&gt;build-binutils-13.2.0/binutils_build.log&lt;/code&gt;)&lt;/p&gt;
&lt;p&gt;Install makeinfo with &lt;code&gt;apt-get install texinfo&lt;/code&gt;. Praise ye gods for teh gigabits.&lt;/p&gt;
&lt;p&gt;Run script again&lt;/p&gt;
&lt;p&gt;Wait. Wait more. It might be building ok?&lt;/p&gt;
&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;matt@pop-os:~/Develop/Atari/bigbrownbuild-git(master)$ ./bigbrownbuild.sh&lt;br&gt;Host machine: Linux&lt;br&gt;Cleaning up build dirs from previous build&lt;br&gt;Downloading all relevant archives&lt;br&gt;Unpacking binutils, gcc, Newlib&lt;br&gt;Building gcc 13.2.0...&lt;br&gt;&lt;br&gt;Configuring, building and installing binutils&lt;br&gt;Building the actual cross binutils...&lt;br&gt;Configuring, builing and installing gcc (without libs)&lt;br&gt;Building the actual cross gcc...&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Nope, failed on the next step, building mintlib:&lt;/p&gt;
&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;Source patching and building mintlib&lt;br&gt;&lt;br&gt;&lt;br&gt;****************************************&lt;br&gt;Oops, something exploded while building!&lt;br&gt;The error happened while buildgcc was executing make SHELL=/bin/bash &amp;&gt; mintlib_build.log&lt;br&gt;&lt;br&gt;You may inspect the following logfiles for further info:&lt;br&gt;binutils_config.log, binutils_build.log, binutils_install.log&lt;br&gt;gcc_configure.log, gcc_build.log, gcc_install.log, gcc_libc_build.log, gcc_libc_install.log&lt;br&gt;mintlib_build.log, mintlib_install.log&lt;br&gt;gcc_libstdc++_configure.log&lt;br&gt;gcc_libstdc++_build.log, gcc_libstdc++_install.log&lt;br&gt;gcc_misc_build.log, gcc_install_build.log&lt;br&gt;gcc_type_traits.log, gcc_type_traits.log&lt;br&gt;binary_strip.log, binary_strip.log&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Errors list a lot of log files, but the key is in the command output. We want &lt;code&gt;mintlib_build.log&lt;/code&gt; for this one, which for me is at &lt;code&gt;mintlib-bigbrownbuild-13.2.0/mintlib_build.log&lt;/code&gt;. The error in this case was a missing pre-requisite because I was too lazy to determine if they were installed or not after reading about them in &lt;code&gt;readme.md&lt;/code&gt;. Such is the life of a coder: often it&#39;s all too easy to make assumptions and waste time slowly proving them incorrect. In this case it was bison, easily fixed with a &lt;code&gt;sudo apt-get install bison&lt;/code&gt; since I&#39;m on an Ubuntu based distro&lt;sup class=&quot;footnote-ref&quot;&gt;&lt;a href=&quot;https://mattlacey.com/posts/2023-09-06_building-dave/#fn2&quot; id=&quot;fnref2&quot;&gt;[2]&lt;/a&gt;&lt;/sup&gt;&lt;sup class=&quot;footnote-ref&quot;&gt;&lt;a href=&quot;https://mattlacey.com/posts/2023-09-06_building-dave/#fn3&quot; id=&quot;fnref3&quot;&gt;[3]&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;p&gt;Run the script again, get further. I&#39;m still waiting but the last line logged to stdout is &amp;quot;Building and installing the rest&amp;quot; which is promising, though I am wondering what &amp;quot;the rest&amp;quot; entails.&lt;/p&gt;
&lt;p&gt;A few minutes after that and I see this:&lt;/p&gt;
&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;~/Develop/Atari/bigbrownbuild-git/build-gcc-13.2.0 ~/Develop/Atari/bigbrownbuild-git/build-gcc-13.2.0&lt;br&gt;~/Develop/Atari/bigbrownbuild-git/build-gcc-13.2.0&lt;br&gt;Reorganising MiNTlib folders&lt;br&gt;Building and installing brownout&lt;br&gt;Creating an archive with all the goodies&lt;br&gt;All done!&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Guess we&#39;re all done then. The first thing to do now is check that the binary is there and runs, then see if there&#39;s an example program to compile with it (seem to recall reading there is as of some particular version), and then get back to configuring AGT to use it.&lt;/p&gt;
&lt;p&gt;I&#39;d configured the script (you literally edit some things in the script file itself, read the readme!) to build into &lt;code&gt;~/Develop/Atari/brown&lt;/code&gt; and sure enough there&#39;s now a few directories and files in there. &lt;code&gt;bin&lt;/code&gt;, naturally, is where I want to look and the first smoke test is good:&lt;/p&gt;
&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;matt@pop-os:~/Develop/Atari/brown/bin$ ./m68k-atariturbobrowner-elf-gcc --version&lt;br&gt;m68k-atariturbobrowner-elf-gcc (GCC) 13.2.0&lt;br&gt;Copyright (C) 2023 Free Software Foundation, Inc.&lt;br&gt;This is free software; see the source for copying conditions.  There is NO&lt;br&gt;warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Going back to the repo, there&#39;s a directory called &lt;code&gt;barebones&lt;/code&gt; and that has a few sample source files along with a &lt;code&gt;.bat&lt;/code&gt; file to build them. I&#39;m &lt;em&gt;not&lt;/em&gt; going to nerd snipe myself now and convert that, so let&#39;s just try compiling the &lt;code&gt;cpptest.c.&lt;/code&gt; file, which seems like a pretty good candidate for testing C++ compilation. Assumung (yet another one) GCC norms I try an optimistic &lt;code&gt;m68k-atariturbobrowner-elf-cpp ./cpptest.cpp&lt;/code&gt; expecting maybe an &lt;code&gt;a.out&lt;/code&gt; or &lt;code&gt;a.tos&lt;/code&gt; or similar. Instead I see a few screenfulls of C++ source and nothing to suggest compilation is taking place. Sure enough, running &lt;code&gt;ls&lt;/code&gt; right after shows no new files. Guess it&#39;s time to read &lt;s&gt;&lt;code&gt;build.bat&lt;/code&gt; after all.&lt;/s&gt; the readme. Always read the readme. I figured checking the readme again before diving in would make sense, and whaddayaknow, there&#39;s a &lt;a href=&quot;https://github.com/ggnkua/bigbrownbuild-git#building-the-barebones-examples&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;section titled &#39;Building the &amp;quot;barebones&amp;quot; examples&#39;&lt;/a&gt;. It tells you to run &lt;code&gt;make&lt;/code&gt;. Somehow, until now, I&#39;ve completely failed to notice the Makefile sitting right there in front of me. Let&#39;s try &lt;code&gt;make&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;matt@pop-os:~/Develop/Atari/bigbrownbuild-git/barebones(master)$ make&lt;br&gt;m68k-atarimegabrown-elf-gcc -c -m68000 -Ofast -fomit-frame-pointer -fstrict-aliasing -fcaller-saves -flto -ffunction-sections -fdata-sections -fleading-underscore -D__ATARI__ -D__M68000__ -DELF_CONFIG_STACK=16384   -Wall -o vsnprint.o vsnprint.c&lt;br&gt;make: m68k-atarimegabrown-elf-gcc: No such file or directory&lt;br&gt;make: *** [Makefile:234: vsnprint.o] Error 127&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ah. Of course. Wrong shade of brown. Updating the Makefile to use turbo rather than mega power might do it... nope: turbo isn&#39;t just turbo brown, it&#39;s turbo brownER. Yes, I said this would be a realtime ramble, and if this makes no sense, well the executable was once &lt;code&gt;m68k-atarimegabrown-elf-gcc&lt;/code&gt; and now it&#39;s &lt;code&gt;m68k-atariturbobrowner-gcc&lt;/code&gt;. While fixing this I also noticed a library path that needs to be updated because &lt;code&gt;ggn&lt;/code&gt; isn&#39;t a user on my machine &lt;sup class=&quot;footnote-ref&quot;&gt;&lt;a href=&quot;https://mattlacey.com/posts/2023-09-06_building-dave/#fn4&quot; id=&quot;fnref4&quot;&gt;[4]&lt;/a&gt;&lt;/sup&gt;. Also brownout.exe is clearly for Windows, removing that extension should be fine because &lt;code&gt;brownout&lt;/code&gt; was an executable built alongside the various GCC cross compilers.&lt;/p&gt;
&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;brownout: brownout.cpp:418: std::map&lt;unsigned int,=&quot;&quot; std::pair&lt;unsigned=&quot;&quot; int=&quot;&quot;&gt; &gt;::iterator get_section_for_va(elfsectionboundsmap_t&amp;, uint32_t): Assertion `_va &gt;= reference_bound-&gt;second.first&#39; failed.&lt;br&gt;make: *** [Makefile:190: lolworld.elf] Aborted (core dumped)&lt;br&gt;make: *** Deleting file &#39;lolworld.elf&#39;&lt;br&gt;rm lolworld.o&lt;/unsigned&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ok. There&#39;s something quite funny about this failing on &lt;code&gt;lolworld&lt;/code&gt;, but I&#39;m tired, my bourbon is finished and I&#39;m going to try and get my head around this assertion another time. Hopefully tomorrow because I seem to be on a roll.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;*** TRANSMISSION ENDS ***&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://mattlacey.com/posts/2023-09-07_building-dave-part-ii/&quot;&gt;Part II&lt;/a&gt;&lt;/p&gt;
&lt;hr class=&quot;footnotes-sep&quot;&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn1&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;I&#39;m honestly not sure if it&#39;s the word or the colour that takes his fancy. I must ask about that. &lt;a href=&quot;https://mattlacey.com/posts/2023-09-06_building-dave/#fnref1&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;fn2&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;Pop_OS! for those interested &lt;a href=&quot;https://mattlacey.com/posts/2023-09-06_building-dave/#fnref2&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;fn3&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;Side note: remember when package installs involved lots of slow downloads? These days the install often takes longer than the data transfer: &lt;code&gt;Fetched 962 kB in 0s (2,874 kB/s)&lt;/code&gt; &lt;a href=&quot;https://mattlacey.com/posts/2023-09-06_building-dave/#fnref3&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;fn4&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;As far as I know anyway &lt;a href=&quot;https://mattlacey.com/posts/2023-09-06_building-dave/#fnref4&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;
</description>
      <pubDate>Wed, 06 Sep 2023 00:00:00 GMT</pubDate>
      <dc:creator>Matt Lacey</dc:creator>
      <guid>https://mattlacey.com/posts/2023-09-06_building-dave/</guid>
    </item>
    <item>
      <title></title>
      <link>https://mattlacey.com/posts/2023-08-25_pipewire-monitor-linein/</link>
      <description>&lt;p&gt;As per my last post, I&#39;ve been busy futzing around with an old PC, and in doing so I wanted to hear it&#39;s audio output. Due to a rather restricted setup I reasoned the best way to do this would be to use the line-in on my main PC since it&#39;s pretty much always on when I use that other machine. In Windows this was very easy indeed, visit the old sound settings panel (not the new UI one), go to input devices and check the box to &amp;quot;listen&amp;quot; to that device, in other words, monitor it.&lt;/p&gt;
&lt;p&gt;That&#39;s all well and good, but under Pop!_OS I wasn&#39;t having anywhere near as much luck.&lt;/p&gt;
&lt;h2&gt;Hello, Pipewire&lt;/h2&gt;
&lt;p&gt;I&#39;ve used Linux on and off since the late 90s (with BeOS and BSDs thrown in too), and I remember when alsa was the hot new thing. Then came along pulse audio, which I&#39;ve been vaguely aware of but until this year I&#39;ve not used a Linux distro as a main OS for a long while. I was blisfully unaware of Pipewire, but what I read about it sounded good. Best of all it has a module for Pulse compatibility, meaning I should still be able to use things like &lt;code&gt;alsamixer&lt;/code&gt; to mess with settings. Except, I can&#39;t.&lt;/p&gt;
&lt;p&gt;No, I don&#39;t know why, the services are loaded etc. and running in the userland systemd environment but I have zero joy trying to run various commands like &lt;code&gt;alsamixer&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;matt@pop-os:~$ alsamixer&lt;br&gt;ALSA lib pulse.c:242:(pulse_connect) PulseAudio: Unable to connect: Connection refused&lt;br&gt;&lt;br&gt;cannot open mixer: Connection refused&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;or &lt;code&gt;pactl&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;matt@pop-os:~$ pactl info&lt;br&gt;Connection failure: Connection refused&lt;br&gt;pa_context_connect() failed: Connection refused&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;As of yet I&#39;ve been unable to find a solution to this problem, but while attemping to learn more about Pipewire I did find Arch&#39;s excellent write-up on it, and in there discovered Helvum, which is a patchbay for pipewire and while I thought about building it from source I figured it was worth a quick look in the Pop!_OS store first - sure enough there&#39;s a flatpack build in there.&lt;/p&gt;
&lt;h2&gt;Patching the Plumbing&lt;/h2&gt;
&lt;p&gt;It took all of two seconds to install Helvum, a couple more to launch it and barely any more than that to solve my problem. All I had to do was click and drag from the two (Left and Right Channel) nodes for the line-in source on motherboard and hooked them to them to the playback nodes for my graphics card as I use HDMI audio via my monitor (it&#39;s actually then connected via an analogue connection to an old amp with only one input, but it does avoid any noise on the signal from the PC by doing the first bit digitally). Job done.&lt;/p&gt;
&lt;p&gt;&lt;center&gt;&lt;a href=&quot;https://mattlacey.com/img/helvum.png&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://mattlacey.com/img/xi_gcUK7JI-915.webp 915w&quot;&gt;&lt;img loading=&quot;lazy&quot; src=&quot;https://mattlacey.com/img/xi_gcUK7JI-915.jpeg&quot; alt=&quot;Screen shot of Helvum showing the connection between line-in and my output device&quot; width=&quot;915&quot; height=&quot;559&quot;&gt;&lt;/picture&gt;&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;
&lt;p&gt;There is a bit of noise on the sound from the retro PC, but I believe the source of that noise is my modern motherboard, not least because it&#39;s worse when scrolling windows. It&#39;s not terrible though and not really noticable at comfortable volume levels.&lt;/p&gt;
</description>
      <pubDate>Fri, 25 Aug 2023 00:00:00 GMT</pubDate>
      <dc:creator>Matt Lacey</dc:creator>
      <guid>https://mattlacey.com/posts/2023-08-25_pipewire-monitor-linein/</guid>
    </item>
    <item>
      <title></title>
      <link>https://mattlacey.com/posts/2023-08-24_Windows95Hijinks/</link>
      <description>&lt;h2&gt;The Backstory&lt;/h2&gt;
&lt;p&gt;Some years ago I picked up on old PC from eBay for $20 with a few to check whether it worked (it was listed as not working), see if I could fix it, and hopefully shift it on. What I didn&#39;t count on at the time was an onslaught of nostalgic feelings for old PCs. Beige boxes have never been that exciting, and the evolution of PC so gradual (apart from a few notable moments&lt;sup class=&quot;footnote-ref&quot;&gt;&lt;a href=&quot;https://mattlacey.com/posts/2023-08-24_Windows95Hijinks/#fn1&quot; id=&quot;fnref1&quot;&gt;[1]&lt;/a&gt;&lt;/sup&gt;) that I didn&#39;t think there was anything to miss. At the time the machine was running Windows 95 with a fair bit of cruft, and I wanted to play around with DOS once more, so I imaged the disk and set about installing DOS 6.22 and Windows 3.1.&lt;/p&gt;
&lt;h2&gt;Seven Years Later&lt;/h2&gt;
&lt;div class=&quot;center&quot;&gt;
&lt;img alt=&quot;Screenshot showing the created date of one of the registry files as the 28th of July, 1997&quot; src=&quot;https://mattlacey.com/img/95_registry.bmp&quot;&gt;
&lt;/div&gt;
&lt;p&gt;With the machine setup again after a (long) house move, I wondered once more about the original install and what was on it. I&#39;m not 100% sure of it&#39;s original install date, but as you can see one of the registry files was created onthe 28th of July, 1997 which is a nice round 26 years and 26 days ago. There are older file dates on there but I suspect those  I could have just been carried over from the install media. For this exploring I could have used a virtual machine, which I did back when I took the original image, but that didn&#39;t seem like much fun, so I opened up the box and installed an IDE-&amp;gt;Compact Flash adapter that has a PCI bracket allowing for easy swapping of the CF card.&lt;/p&gt;
&lt;p&gt;I located the original image I made that&#39;s been sitting untouched on my harddrive for seven years and &lt;code&gt;dd&lt;/code&gt;&#39;d it to a 2GB CF card I bought years ago but had never used. I hit the power button and got pretty much what I expected, the bog standard 9x era &amp;quot;Invalid System Disk&amp;quot; message.&lt;/p&gt;
&lt;p&gt;More searching ensued and I located a Windows 95 boot disk image - I had one on a floppy already but it was for a different version of Windows 95 (B) and didn&#39;t seem to work with the unknown install that was on the CF card. Once I&#39;d managed to boot from the disk I used &lt;code&gt;sys a: c:&lt;/code&gt; to make that partition bootable.&lt;/p&gt;
&lt;p&gt;Crossed fingers, a power cycle and Windows 95 started to boot, but unfortunately hit a BSOD (0xOD at 0117:00007DBD, helpful!).&lt;/p&gt;
&lt;h2&gt;Debugging the BSOD&lt;/h2&gt;
&lt;p&gt;I rebooted and Windows automatically booted into Safe Mode, which was a good start. While in there I removed the old graphics card and sound card from the device manager. I honestly can&#39;t recall if the machine had a separate sound card before but I&#39;d put in an AWE32 during my DOS experiments to relive my youth, and I&#39;d also dropped in an S3 Virge graphics card along with an Orchic Righteous 3D (3dfx Voodoo) that I&#39;ve owned since new. Given the hardware was totally different it wasn&#39;t that surprising Windows failed, so I restarted again and thought I might get lucky. Unfortunately, I got another BSOD.&lt;/p&gt;
&lt;p&gt;More online search about debugging boot-up BSODs brought me to a thread from 2004 on Tom&#39;s Hardware&lt;sup class=&quot;footnote-ref&quot;&gt;&lt;a href=&quot;https://mattlacey.com/posts/2023-08-24_Windows95Hijinks/#fn2&quot; id=&quot;fnref2&quot;&gt;[2]&lt;/a&gt;&lt;/sup&gt;(https://forums.tomshardware.com/threads/windows-95-safe-mode.1147081/)] which had a good list of ideas to try.&lt;/p&gt;
&lt;p&gt;The first step was removing some startup programs, but I had no joy.&lt;/p&gt;
&lt;p&gt;The second step was removing more hardware devices, but again, no joy.&lt;/p&gt;
&lt;p&gt;The third step was Commenting out the contents of &lt;code&gt;config.sys&lt;/code&gt; &amp;amp; &lt;code&gt;autoexec.bat&lt;/code&gt; - no joy, but this time none was expected as they were pretty innocuous.&lt;/p&gt;
&lt;p&gt;The fourth step was to remove &lt;code&gt;system.ini&lt;/code&gt; and &lt;code&gt;win.ini&lt;/code&gt;, replacing the former with a copy of &lt;code&gt;System.cb&lt;/code&gt;,  with a few additions detailed in the Tom&#39;s Hardware post: MUCH JOY!&lt;/p&gt;
&lt;h2&gt;Making Windows Happy&lt;/h2&gt;
&lt;p&gt;Booting to a desktop was a great step but it was time for the next quest: find all the relevant drivers for the new&lt;sup class=&quot;footnote-ref&quot;&gt;&lt;a href=&quot;https://mattlacey.com/posts/2023-08-24_Windows95Hijinks/#fn3&quot; id=&quot;fnref3&quot;&gt;[3]&lt;/a&gt;&lt;/sup&gt; hardware in the machine, first stop being to deal with the mouse which was now non-functional.&lt;/p&gt;
&lt;p&gt;I removed the mouse via Device Manager, then launched the Add new Hardware Wizard, which found a few things:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Mouse&lt;/li&gt;
&lt;li&gt;S3 Graphics Card&lt;/li&gt;
&lt;li&gt;Voodoo Card (I think.. it&#39;s still listed as a PCI Multimedia Video Device)&lt;/li&gt;
&lt;li&gt;AWE 32&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Yet another reboot and the mouse started working, though the drivers seemingly installed for the S3 card didn&#39;t do anything and it still showed as not working, with lovely 16 colour desktop. I installed some drivers from the vogongs.org library and that satisfied Device Manager, but opening Display settings still popped up a dialog indicating an issue with the video card, and wouldn&#39;t allow for higher resolutions or colour depths. Looking at the Device Manager again I noticed it waas still showing a Cirrus Logic video device (onboard VGA), so opted to remove that completely. After doing so, higher resolutions worked but choosing 24-bit colour prompted a reboot. The OS started up and annoyingly re-installed the Cirrus Logic drivers and triggered another reboot, but after starting the dithered background colour of the desktop was finally gone. I don&#39;t know why an onboard chipset that&#39;s not being used has an effect like this, but hey, it works now.&lt;/p&gt;
&lt;p&gt;The ISA network card didn&#39;t appear under the Device Manager, and it took some searching online to kick-start some old memories and finally I got it going after visiting the Network control panel and adding a new adapter in there. Amusingly, at least in 2023, after adding the adapter Windows automatically installed a couple of network protocols, but didn&#39;t install TCP/IP by default. I couldn&#39;t remember the IRQ or address range for the card, and my wild guess was incorrect, but after quickly booting back into my DOS install and firing up the packet driver there I was sorted. I put in the correct IRQ and address range, rebooted, and sure enough, running &lt;code&gt;winipcfg&lt;/code&gt; showed it had correctly receieved an IP address from my DHCP server.&lt;/p&gt;
&lt;h2&gt;Next Step: Investigations...&lt;/h2&gt;
&lt;div class=&quot;center&quot;&gt;
&lt;img alt=&quot;Screenshot showing some of the files in the root of the main partition&quot; src=&quot;https://mattlacey.com/img/95_drivecontents.bmp&quot;&gt;
&lt;/div&gt;
&lt;p&gt;That&#39;s everything to date, I&#39;m going to poke around with it a bit now to see what&#39;s installed etc. and check that everything is functioning as expected. More to come on that later. There&#39;s plenty of crud in the root of the drive as can be seen in the screenshot above&lt;sup class=&quot;footnote-ref&quot;&gt;&lt;a href=&quot;https://mattlacey.com/posts/2023-08-24_Windows95Hijinks/#fn4&quot; id=&quot;fnref4&quot;&gt;[4]&lt;/a&gt;&lt;/sup&gt;, probably data files from a game or similar but time will (hopefully) tell. Somewhat disappointingly, the &lt;code&gt;warez&lt;/code&gt; directory is empty.&lt;/p&gt;
&lt;hr class=&quot;footnotes-sep&quot;&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn1&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;Those that leap immediately to mind are the introduction of graphics accelerators and seeing the Voodoo run for the first time, the not-long-after introduction of Hardware T&amp;amp;L with the GeForce 256 card, and then the move to SSDs from HDDs &lt;a href=&quot;https://mattlacey.com/posts/2023-08-24_Windows95Hijinks/#fnref1&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;fn2&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;Read Bill Starbuck&#39;s excellent post here &lt;a href=&quot;https://mattlacey.com/posts/2023-08-24_Windows95Hijinks/#fnref2&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;fn3&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;Yes, it&#39;s all close to 30 years old, but it was new to that particular install of Windows 95  &lt;a href=&quot;https://mattlacey.com/posts/2023-08-24_Windows95Hijinks/#fnref3&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;fn4&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;You may not notice this simply reading the page, but both screenshots are .bmp files because I saved the screenshots in MS Paint on the 95 box and couldn&#39;t be bothered to reformat them. Yes, I know there are plugins that can do that for me automagically. &lt;a href=&quot;https://mattlacey.com/posts/2023-08-24_Windows95Hijinks/#fnref4&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;
</description>
      <pubDate>Thu, 24 Aug 2023 00:00:00 GMT</pubDate>
      <dc:creator>Matt Lacey</dc:creator>
      <guid>https://mattlacey.com/posts/2023-08-24_Windows95Hijinks/</guid>
    </item>
    <item>
      <title></title>
      <link>https://mattlacey.com/posts/2022-12-30-booting-haiku-and-windows/</link>
      <description>&lt;p&gt;Somehow almost all of 2022 passed me by without a post, bit with &lt;a href=&quot;https://www.haiku-os.org/news/2022-12-23_haiku_r1_beta4/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;the recent release of the Haiku R1/beta4&lt;/a&gt; I figured it was about time that I finally worked out how to get it dual booting with Windows 11, rather than just settling for booting via USB whenever I wanted to use it.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Warning!
I&#39;m no expert on EFI booting. This is simply a writeup of how I got Windows 11 and Haiku R1/beta4 booting side by side. Use this information at your own risk! I&#39;m also not using disk encryption in Windows and so don&#39;t have an issue with booting it with Secureboot disabled. I&#39;d suggest reading &lt;a href=&quot;https://schdck.github.io/Installing-refind-from-Windows-10&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;this post on schdck&#39;s blog before continuing here&lt;/a&gt;. This will get you familiar with the process, though it&#39;s all a little easier from Haiku.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I&#39;ve been following Haiku since it was called OpenBeOS, and have been running builds of it ever since the first demo version of the AppServer that rendered coloured rectangles in place of windows and GUI widgets, and in the early pre-EFI days I was  perfectly comfortable setting up multiple operating systems. MBR partitioning and the BeOS R5 boot manager were my friends, and they were easy to use. For some years after that I was content with running Haiku in VMs on whatever laptop I had at the time, but then around 2015 I once again built a PC and had it running Windows 8. From that point on I wasn&#39;t comfortable trying to work out how to make it dual (or more) boot - I didn&#39;t want to screw up my Windows install. 7 years later, and upgrades via 10 and 11, that same Windows install is still going, but I really wanted to get Haiku booting properly too.&lt;/p&gt;
&lt;h2&gt;Side note: Booting from USB&lt;/h2&gt;
&lt;p&gt;I tend to use Balena Etcher to write the Haiku ISO files to USB drives, it&#39;s easy and works well on macOS and Windows. For whatever reason though, I&#39;ve never had much luck with my current motherboard and booting Haiku from a USB drive unless I go into the UEFI setting sand make the USB drive the first boot device in the list. Simply selecting that device from the boot menu on start up isn&#39;t enough, Haiku is only happy when that device is right at the top.&lt;/p&gt;
&lt;h2&gt;Installing rEFInd&lt;/h2&gt;
&lt;h2&gt;Step 1: Install Haiku&lt;/h2&gt;
&lt;p&gt;Once Haiku is booted from a USB drive you&#39;ll want to install it to your hard drive. Hopefully you&#39;ve got some free space on a drive somewhere (you can shrink existing partitions in Windows), and all you need to do is partition it with the BeFS, initialize that, and then use that as the target forthe installer. On my machine it takes less than a minute. I&#39;ve not gone into details here because it&#39;s quite easy to find this information on the Haiku website.&lt;/p&gt;
&lt;h2&gt;Step 2: Download rEFIind&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;http://www.rodsbooks.com/refind/getting.html&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Visit the official rEFInd download page&lt;/a&gt; and download the &amp;quot;binary zip file&amp;quot; option. Extract the ZIP file and you should see something like the following in Tracker when you open the directory you extracted the zip into.&lt;/p&gt;
&lt;p&gt;&lt;center&gt;&lt;a href=&quot;https://mattlacey.com/img/refind_contents.png&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://mattlacey.com/img/ZQ7_IWhb7S-690.webp 690w&quot;&gt;&lt;img loading=&quot;lazy&quot; src=&quot;https://mattlacey.com/img/ZQ7_IWhb7S-690.jpeg&quot; alt=&quot;The contents for the refind zip file&quot; width=&quot;690&quot; height=&quot;650&quot;&gt;&lt;/picture&gt;&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;
&lt;h2&gt;Step 3: Install rEFInd&lt;/h2&gt;
&lt;p&gt;Installing rEFInd really just requires you to copy the correct files for your architecture from the extracted directory to your system&#39;s EFI partition. Chances are if you&#39;re on a modern PC you&#39;ll want o use the x64 files, though rEFInd also provide binaries for 32 bit systems and 64 bit ARM machines. But before we copy those files, we&#39;ll make a few other changes to the EFI partition.&lt;/p&gt;
&lt;p&gt;Mounting the EFI partition is easy under Haiku as it doesn&#39;t do anything to stop you from shooting yourself in the foot. Doing it from Windows and elsewhere is rather more complicated. You might want to use DriveSetup to help you identify the correct partition, it&#39;ll likely be at the start of a disk, around 100MB in size, and formatted as FAT 32. Right clicking on a partition in DriveSetup and choosing &amp;quot;Change Parameters&amp;quot; will pop up a dialog showing the partition type, and you can use this to confirm that the type of the partition is &amp;quot;EFI system data&amp;quot;. Obviously close that without making any changes.&lt;/p&gt;
&lt;p&gt;&lt;center&gt;&lt;a href=&quot;https://mattlacey.com/img/refind_efi_partition.png&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://mattlacey.com/img/0W_x1xK049-325.webp 325w&quot;&gt;&lt;img loading=&quot;lazy&quot; src=&quot;https://mattlacey.com/img/0W_x1xK049-325.jpeg&quot; alt=&quot;The DriveSetup partition parameters dialog showing the partition type&quot; width=&quot;325&quot; height=&quot;178&quot;&gt;&lt;/picture&gt;&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;
&lt;p&gt;Once you&#39;ve identified the partition you&#39;ll want to right-click on the desktop, navigate to Mount in the menu and then click on the partition. Mount it Read/Write or you won&#39;t be able to make changes. Once you open this partition in Tracker you should see a directory called EFI, and under that (assuming you have Windows installed) one called Microsoft.&lt;/p&gt;
&lt;p&gt;Create a directory along side the Microsoft one called &lt;code&gt;HAIKU&lt;/code&gt;, and copy the Haiku EFI bootloader from &lt;code&gt;/boot/system/data/platform_loaders/haiku_loader.efi&lt;/code&gt; into it. I renamed mine to BOOTX64.EFI because at some point I thought that was required. As of now I&#39;m not so sure, but it doesn&#39;t hurt at any rate.&lt;/p&gt;
&lt;p&gt;Go back up a level and rename the Microsoft directory to something else - I simply prefixed it with an underscore. This change is because the path to Microsoft&#39;s loader is a standard one that a lot of machines will look for before anything else.&lt;/p&gt;
&lt;p&gt;Finally, create a third directory called &lt;code&gt;BOOT&lt;/code&gt; - this is where you need to copy the relevant rEFInd files, and the directory will look something like this:&lt;/p&gt;
&lt;p&gt;&lt;center&gt;&lt;a href=&quot;https://mattlacey.com/img/refind_directory_contents.png&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://mattlacey.com/img/rbbpLT9rHn-694.webp 694w&quot;&gt;&lt;img loading=&quot;lazy&quot; src=&quot;https://mattlacey.com/img/rbbpLT9rHn-694.jpeg&quot; alt=&quot;Directory contents of /EFI/BOOT on my EFI partition&quot; width=&quot;694&quot; height=&quot;343&quot;&gt;&lt;/picture&gt;&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;
&lt;p&gt;With the parent EFI directory looking like this:&lt;/p&gt;
&lt;p&gt;&lt;center&gt;&lt;a href=&quot;https://mattlacey.com/img/refind_efi_directory.png&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://mattlacey.com/img/rI3mmWLbiS-709.webp 709w&quot;&gt;&lt;img loading=&quot;lazy&quot; src=&quot;https://mattlacey.com/img/rI3mmWLbiS-709.jpeg&quot; alt=&quot;&quot; width=&quot;709&quot; height=&quot;253&quot;&gt;&lt;/picture&gt;&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I was following &lt;a href=&quot;https://schdck.github.io/Installing-refind-from-Windows-10&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;an older blog post about installing rEFInd from Windows 10&lt;/a&gt;, and that included making a modification to the &lt;code&gt;refind.conf&lt;/code&gt; file - adding an entry for Windows that looked like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;menuentry &amp;quot;Windows&amp;quot; {
    loader &#92;EFI&#92;_Microsoft&#92;boot&#92;bootmgfw.efi
    icon &#92;EFI&#92;BOOT&#92;icons&#92;os_win.png
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I did this, but it appears this step is actually necessary with new versions of rEFInd as it searches for known bootloaders, and I when I rebooted with this in the config file I got two entries for Windows. I since removed it, and the remaining icon for Windows boots just fine.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The last thing you might want to do is edit /EFI/BOOT/refind.conf on the EFI partition and look at some of the options in there. You can change the timeout etc. for different options though I left it as-is.&lt;/p&gt;
&lt;h2&gt;Profit?&lt;/h2&gt;
&lt;p&gt;At this point you should be able to reboot your machine and find yourself looking at the rEFInd menu, with one option for Haiku and another for Windows, hopefully with you being able to boot each of them.&lt;/p&gt;
</description>
      <pubDate>Fri, 30 Dec 2022 00:00:00 GMT</pubDate>
      <dc:creator>Matt Lacey</dc:creator>
      <guid>https://mattlacey.com/posts/2022-12-30-booting-haiku-and-windows/</guid>
    </item>
    <item>
      <title></title>
      <link>https://mattlacey.com/posts/2021-08-24-excel-sounds/</link>
      <description>&lt;p&gt;I rarely use Office, it&#39;s something I have to deal with time-to-time as a part of working with clients, and out of the suite Excel is the tool that gets used the most. If you&#39;ve got a licence for it, it really is a solid piece of software for working with relatively small (say 1/4M) data sets. Sure I do some CSV manipulation using standard *nix tools such as &lt;code&gt;sort&lt;/code&gt;, &lt;code&gt;head&lt;/code&gt;, &lt;code&gt;cat&lt;/code&gt; etc., but in some scenarios when dealing with multiple data sources the viusual nature of it can be very handy indeed.&lt;/p&gt;
&lt;p&gt;Recently, for reasons I&#39;ve entirely forgotten, I was digging around in the program&#39;s settings and tripped over an option for sounds under the Accessilbity settings, and out of curiosity, enabled it. I am &lt;em&gt;so&lt;/em&gt; glad that I did. I didn&#39;t have any love of Macs pre OS X, but I did like the sounds they made. Opening windows, moving windows, closing windows, everything made a sound, and it added a great sense of whimsy to normally dull process of navigating a UI. The sounds in Excel do very much the same thing. Every time I open it I&#39;m surprised by the sounds (because everything else is so deathly silent, aside from never-ending notifications of course), and every time they make me smile.&lt;/p&gt;
&lt;p&gt;&lt;center&gt;&lt;a href=&quot;https://mattlacey.com/img/excel_sounds.png&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://mattlacey.com/img/wFjxLK1lDO-860.webp 860w&quot;&gt;&lt;img loading=&quot;lazy&quot; src=&quot;https://mattlacey.com/img/wFjxLK1lDO-860.jpeg&quot; alt=&quot;The Accessibility settings for Microsoft Excel in the latest release&quot; width=&quot;860&quot; height=&quot;704&quot;&gt;&lt;/picture&gt;&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;
&lt;p&gt;While writing this post I checked out the &#39;Classic&#39; theme, but as it turns out I not only prefer the &#39;Modern&#39; theme, but it more readily reminds me of those old Macs, so I&#39;ll be sticking with that.&lt;/p&gt;
&lt;p&gt;So if you do use Excel, and you like a bit of fun in your computing, I heartily encourage you try the sounds out.&lt;/p&gt;
</description>
      <pubDate>Thu, 17 Jun 2021 00:00:00 GMT</pubDate>
      <dc:creator>Matt Lacey</dc:creator>
      <guid>https://mattlacey.com/posts/2021-08-24-excel-sounds/</guid>
    </item>
    <item>
      <title></title>
      <link>https://mattlacey.com/posts/2021-06-17-zataomm/</link>
      <description>&lt;p&gt;I recently finished reading Robert M. Pirsig&#39;s Zen and the Art of Motorcycle Maintenance, and it was an interesting ride to say the least. First and foremost it&#39;s a book on philosophy, which is something I wasn&#39;t accutely aware of, though I knew it was involved from various scraps of information I&#39;d picked up over the years. Secondly it&#39;s a semi-autobiographical account of a road trip across the US on the motorcycle, and lastly it discusses briefly some aspects of motorcycle maintenance, not the specficics as such, but the process.&lt;/p&gt;
&lt;p&gt;I ride motorcycles and that&#39;s what drove the initial appeal for me. After watching &lt;a href=&quot;https://youtu.be/KLOlPBGlq0U&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;yet another incredible YouTube production from FortNine&lt;/a&gt;, I realised it had to be my next read. What I truly wasn&#39;t expecting was to find so much content that resonated with the developer in me. I highlighted a few passages while reading for subsequeuent review, and here are some of those that to me transced the subject at hand and demonstrate lessons that are well worth learning.&lt;/p&gt;
&lt;h2&gt;When It Just Won&#39;t Run&lt;/h2&gt;
&lt;p&gt;When discussing the process behind solving an issue with a non-running motorcycle, I could have sworn Pirsig was talkin about debugging a piece of code, and it dawned on me that debugging isn&#39;t a software problem, it&#39;s an engineering problem, and working through it looks similar in many engineering contexts:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The real purpose of scientific method is to make sure Nature hasn’t misled you into thinking you know something you don’t actually know. There’s not a mechanic or scientist or technician alive who hasn’t suffered from that one so much that he’s not instinctively on guard.&lt;/p&gt;
&lt;p&gt;Pirsig, Robert M.. Zen and the Art of Motorcycle Maintenance (p. 94). HarperCollins e-books. Kindle Edition.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;One of the key tenents that I aim to bear in mind when debugging an issue is this: don&#39;t assume anything. The moment you assume a line of code doesn&#39;t neven warrant considering because it&#39;s &amp;quot;simple&amp;quot;, is the moment you condemn yourself to hours of cursing only to come back to that line at the top of the function later, and want to slap your previous self silly. Check that first &lt;code&gt;if&lt;/code&gt; statement in the function, don&#39;t dismiss it. Start at the start, even when you think you know the start is correct. If you don&#39;t, you&#39;ll find more than a few times that when you finally work your way back there after exhausting all the &#39;obvious&#39; options that you could have saved youself considerable time and torment.&lt;/p&gt;
&lt;h2&gt;Clever Code is Not Clever&lt;/h2&gt;
&lt;p&gt;Labouring a point here, everybody knows you should write clear code, not clever code. You know this, I know this, but I still can&#39;t help myself sometimes. &lt;a href=&quot;https://mattlacey.com/posts/2020-10-20-why-code-for-fun&quot;&gt;Clever code can be fun&lt;/a&gt;, because it offers similar feelings of achievement as to when you were first learning to code, but keep it to hobby projects where it doesn&#39;t matter (and no, that&#39;s not all hobby projects).&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Any effort that has self-glorification as its final endpoint is bound to end in disaster.&lt;/p&gt;
&lt;p&gt;Pirsig, Robert M.. Zen and the Art of Motorcycle Maintenance (p. 189). HarperCollins e-books. Kindle Edition.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&#39;Nuff said.&lt;/p&gt;
&lt;h2&gt;Plan Head. Think it Through&lt;/h2&gt;
&lt;p&gt;If you read an older book on writing programs (think from the 80s or earlier), they all start with writing out your code on paper, in pseudocode, and then taking it from there. Sure, they&#39;re often talking about ten liners and the like, and editors are better now, but that does&#39;t mean you should write code without thinking through your options first.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Your mind was already thinking ahead to what you would do when the cover plate was off, and so it takes a little time to realize that this irritating minor annoyance of a torn screw slot isn’t just irritating and minor. You’re stuck. Stopped. Terminated. It’s absolutely stopped you from fixing the motorcycle. This isn’t a rare scene in science or technology. This is the commonest scene of all. Just plain stuck. In traditional maintenance this is the worst of all moments, so bad that you have avoided even thinking about it before you come to it.&lt;/p&gt;
&lt;p&gt;Pirsig, Robert M.. Zen and the Art of Motorcycle Maintenance (p. 251). HarperCollins e-books. Kindle Edition.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;There&#39;s no little screw to round out in code, but how often have you found out that the part you assumed would be fast and easy turned out to be anything but? Sometimes the &#39;easy&#39; part turns out to be the all-but-impossible part, and a little planning ahead really can help avoid those scenarios. Personally I find the best way to avoid those kinds of scenarios is to run my ideas by someone else before I start smashing the keys.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;It’s this understanding of Quality as revealed by stuckness which so often makes self-taught mechanics so superior to institute-trained men who have learned how to handle everything except a new situation. Normally screws are so cheap and small and simple you think of them as unimportant. But now, as your Quality awareness becomes stronger, you realize that this one, individual, particular screw is neither cheap nor small nor unimportant. Right now this screw is worth exactly the selling price of the whole motorcycle, because the motorcycle is actually valueless until you get the screw out.&lt;/p&gt;
&lt;p&gt;Pirsig, Robert M.. Zen and the Art of Motorcycle Maintenance (p. 257). HarperCollins e-books. Kindle Edition.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Leave Things Better Than They Were&lt;/h2&gt;
&lt;p&gt;In my last book report-of-sorts, where &lt;a href=&quot;https://mattlacey.com/posts/2020-05-25-aposd&quot;&gt;I wrote about my thoughts on Jon Ousterhout&#39;s &amp;quot;A Philosophy of Software Design&amp;quot;&lt;/a&gt; I included a quote about leaving code better than you found it. It&#39;s one of the core concepts of that book (as well as the idea of shallow interfaces and deep implementations) that&#39;s stuck in my head ever since. Sure, here, Pirsig isn&#39;t really saying the same thing, but it&#39;s a not-dissimilar lesson that we&#39;d all do well to heed.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The place to improve the world is first in one’s own heart and head and hands, and then work outward from there. Other people can talk about how to expand the destiny of mankind. I just want to talk about how to fix a motorcycle. I think that what I have to say has more lasting value.&lt;/p&gt;
&lt;p&gt;Pirsig, Robert M.. Zen and the Art of Motorcycle Maintenance (p. 267). HarperCollins e-books. Kindle Edition.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Personally I&#39;ve got a lot more to learn about motorcycle maintenance, but working on my bikes does make for a nice change from the the keyboard and screen which dominate all too many of my evenings. Doing so creates the same joys and pains too. Zen and the Art of Motorcycle Maintenance isn&#39;t a light read by any standard, but it&#39;s one I&#39;ll be reading again in the future, because I&#39;m prety sure the first pass only just scratched the surface of understanding.&lt;/p&gt;
</description>
      <pubDate>Thu, 17 Jun 2021 00:00:00 GMT</pubDate>
      <dc:creator>Matt Lacey</dc:creator>
      <guid>https://mattlacey.com/posts/2021-06-17-zataomm/</guid>
    </item>
    <item>
      <title></title>
      <link>https://mattlacey.com/posts/2021-04-01-Casting-Android-To-Raspberry-Pi/</link>
      <description>&lt;p&gt;Recently I undertook a bit of a road trip, the kind that involves the better part of thousand kilometers. The kind that also includes three young children (read: five and under) in the back of the car. Clearly, entertainment was going to be needed. Our car actually has an after-party roof-mounted DVD player, which is great, but we only have a couple of DVDs that are in the correct region for it, and as a result I&#39;m far better accquainted with both Aladdin and The Lion King than I&#39;d really like to be. Naturally I set about finding a way to get other content onto that screen; It has composite input, which is a good start, but I didn&#39;t want to buy anything new, and seemed to find a lot of mixed reports around the various cables and adapter combinations on offer (typically Phone -&amp;gt; HDMI -&amp;gt; Composite). No problem, I thought, I&#39;ve got a spare Raspberry Pi knockout about, surely I can do something with that? I could, but in 2021 it took quite a while to work out what the correct setup was, so I&#39;m listing it here in the hope that it&#39;ll save somebody else a lot of time digging through older resources.&lt;/p&gt;
&lt;h2&gt;Step 1: Install scrcpy&lt;/h2&gt;
&lt;p&gt;scrcpy is a program that connects to your Android phone via adb, and streams the display to a window, allowing you to interact and control the phone with your keyboard and mouse. I found various options for dealing with this, but in short it boiled down to these easy steps when running the latest version of the &lt;a href=&quot;https://www.raspberrypi.org/software/operating-systems/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Raspberry Pi OS&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;First, install the Snap Store and ADB:&lt;/p&gt;
&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;sudo apt update&lt;br&gt;sudo apt install snapd&lt;br&gt;sudo apt install adb&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Reboot:&lt;/p&gt;
&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;sudo reboot&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And finally, install scrcpy:&lt;/p&gt;
&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;sudo snap install --beta scrcpy&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Step 1.5: Test scrcpy&lt;/h2&gt;
&lt;p&gt;Plug in your Android phone via a USB cable, start the adb server, and run scrcpy:&lt;/p&gt;
&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;adb start-server&lt;br&gt;scrcpy&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You&#39;ll likely see a confirmation message on your phone asking for permission to enable USB debugging. Accept it, you may find you need to run scrcpy again after doing so. When it works, you should see a bunch of messages fly by too fast to read, before a window pops up showing your screen.&lt;/p&gt;
&lt;h2&gt;Step 2: Enabling Hardware Acceleration&lt;/h2&gt;
&lt;p&gt;At this point my setup worked, but it was smashing the CPU of the little Pi and showing both a poor frame rate and a lot of lag. I&#39;m using a Raspberry Pi 3B, and found a few different posts and the like for turning on hardware acceleration, but after a fair while trying out different options the solution turned out to be very simple (at least running scrcpy version 1.17). Run the Raspberry Pi configuration tool:&lt;/p&gt;
&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;sudo raspi-config&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Navigate to &lt;code&gt;Advanced Options&lt;/code&gt; -&amp;gt; &lt;code&gt;GL Driver&lt;/code&gt; and enable &lt;code&gt;GL (Fake KMS)&lt;/code&gt;. That&#39;s it. Run scrcpy again and you should see it responding much faster, and at a much higher framerate.&lt;/p&gt;
&lt;h2&gt;Step 3: Workout Your Command Line Options&lt;/h2&gt;
&lt;p&gt;scrcpy has a few different command line options you can specify, for my particular setup I wanted the video full-screen, horizontal, and didn&#39;t need a crazy resolution, so I simply used this:&lt;/p&gt;
&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;scrcpy --rotation 0 -m 800 -f&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;where:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-f&lt;/code&gt; enables full screen mode&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--rotation 0&lt;/code&gt; specifies a horizontal rotation mode&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-m 800&lt;/code&gt; indicates the maximum dimension of the video feed should be 800 pixels&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Step 4: Profit?&lt;/h2&gt;
&lt;p&gt;To make life easier in the car I configured the Raspberry PI desktop to start a terminal once X starts, which I did by editing /etc/xdg/lxsession/LXDE-pi/autostart and adding &lt;code&gt;@lxterminal&lt;/code&gt; to it.&lt;/p&gt;
&lt;p&gt;To facilitate start up (and restarting - I found that scrcpy would crash on occasion as well, seemingly related to some kind of rendering context changes on the phone when moving between apps and the launcher), I added a quick and dirty shell script called &lt;code&gt;start&lt;/code&gt; to the system with the following content:&lt;/p&gt;
&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;adb kill-server&lt;br&gt;adb start-server&lt;br&gt;scrcpy &lt;span class=&quot;token parameter variable&quot;&gt;-m&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;720&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--rotation&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-f&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Step 5: Save Your Filesystem From Corruption&lt;/h2&gt;
&lt;p&gt;Outside of a car you probably wouldn&#39;t need this, but I didn&#39;t want my SD card to get corrupted through the Pi being powered down suddenly without a proper shutdown procedure. There&#39;s a tonne of guides around on making the file system readonly, and I followed a few, again to find that most were out of date. The easiest option as of the time of writing is to again launch the Pi configuration tool (&lt;code&gt;sudo raspi-config&lt;/code&gt;), navigate to &#39;Performance Options&#39; -&amp;gt; &#39;Overlay File System&#39; and turn it on. Job done!&lt;/p&gt;
&lt;h2&gt;Results&lt;/h2&gt;
&lt;p&gt;This setup worked wonders for our trip, it did crash once or twice but not nearly as much as when I was testing, I guess because the phone was simply running Netflix most of the time and wasn&#39;t moving between apps. I mention Netflix in particular because that worked well, some other streaming apps wouldn&#39;t work at all, menus etc. would be fine but the moment content started scrcpy would bail. It seemed to be related to the codecs used for the streams but with Netflix working well I didn&#39;t feel the need to spend more than ten fruitless minutes trying to work that out.&lt;/p&gt;
</description>
      <pubDate>Wed, 14 Apr 2021 00:00:00 GMT</pubDate>
      <dc:creator>Matt Lacey</dc:creator>
      <guid>https://mattlacey.com/posts/2021-04-01-Casting-Android-To-Raspberry-Pi/</guid>
    </item>
    <item>
      <title></title>
      <link>https://mattlacey.com/posts/2021-03-11-who-needs-comments-anyway/</link>
      <description>&lt;p&gt;Dark themes are all the rage, and have been for a few years now. On the one hand they can be great, on the other they sometimes still suffer from the same problems I encountered when trying to tweak my *nix desktops to be dark fifteen years ago - elements sometimes get missed, and either stand out horrifically, or simply get lost. Just today I logged into the Office 365 admin tools for our business, to have one of those &amp;quot;what&#39;s new&amp;quot; tours appear where you see a bunch of tool-tip style popups, one after the other, show you around new elements on the screen - what was conspicuous in it&#39;s absence was the &#39;Next&#39; button on the first one. Of course, when I hovered my mouse where I expected a button to be it suddenly appeared in bright, unmissible orange, and when I moved it away I realised it was there all along, it was just very dark grey on a black background. It wasn&#39;t Disaster Area&#39;s sun-diving stuntship bad, but it was pretty bad.&lt;/p&gt;
&lt;h2&gt;Where Are The Comments?&lt;/h2&gt;
&lt;p&gt;As you may have surmised from the title, this post isn&#39;t just about dark themes, it&#39;s about comments. Specifically it&#39;s about how comments appear in dark themes in IDEs. Checkout these screenshots taken from my IDE with some of the most popular (based on blogs, ratings etc.), and look at the comments. The problem in my opinion (yes this is an opinion piece, and yes, you may disagree) is pretty clear: comments in dark themes are often configured to use colours that do not contrast well with the background. To my mind, this makes absolutely no sense, and it&#39;s infuriating.&lt;/p&gt;
&lt;h2&gt;Dracula Official&lt;/h2&gt;
&lt;p&gt;A pretty standard take on comments in dark themes.
&lt;center&gt;&lt;a href=&quot;https://mattlacey.com/img/code_dracula.png&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://mattlacey.com/img/Ffz0kt51n8-924.webp 924w&quot;&gt;&lt;img loading=&quot;lazy&quot; src=&quot;https://mattlacey.com/img/Ffz0kt51n8-924.jpeg&quot; alt=&quot;Dracula Official&quot; width=&quot;924&quot; height=&quot;664&quot;&gt;&lt;/picture&gt;&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;
&lt;h2&gt;Cobalt2&lt;/h2&gt;
&lt;p&gt;This is the best of the bunch here, blue on blue isn&#39;t ideal but at least there&#39;s a reasonable difference in brightness.
&lt;center&gt;&lt;a href=&quot;https://mattlacey.com/img/code_cobalt2.png&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://mattlacey.com/img/EZen3L5yIj-924.webp 924w&quot;&gt;&lt;img loading=&quot;lazy&quot; src=&quot;https://mattlacey.com/img/EZen3L5yIj-924.jpeg&quot; alt=&quot;Cobalt2&quot; width=&quot;924&quot; height=&quot;664&quot;&gt;&lt;/picture&gt;&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;
&lt;h2&gt;Night Owl&lt;/h2&gt;
&lt;p&gt;I like the colours in this theme, but the comments need to be brighter.
&lt;center&gt;&lt;a href=&quot;https://mattlacey.com/img/code_nightowl.png&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://mattlacey.com/img/VuxE__LGvC-924.webp 924w&quot;&gt;&lt;img loading=&quot;lazy&quot; src=&quot;https://mattlacey.com/img/VuxE__LGvC-924.jpeg&quot; alt=&quot;Night Owl&quot; width=&quot;924&quot; height=&quot;664&quot;&gt;&lt;/picture&gt;&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;
&lt;h2&gt;Atom One Dark&lt;/h2&gt;
&lt;p&gt;Given it&#39;s popularity, it surprises me how much these comments just blend into the background. If you squint your eyes they pretty much vanish.
&lt;center&gt;&lt;a href=&quot;https://mattlacey.com/img/code_atom.png&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://mattlacey.com/img/OiZNJNP6yn-924.webp 924w&quot;&gt;&lt;img loading=&quot;lazy&quot; src=&quot;https://mattlacey.com/img/OiZNJNP6yn-924.jpeg&quot; alt=&quot;Atom One Dark&quot; width=&quot;924&quot; height=&quot;664&quot;&gt;&lt;/picture&gt;&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;
&lt;h2&gt;Monokai Dark&lt;/h2&gt;
&lt;p&gt;Not much better than Atom, used to be my default until I switched because of the comments.
&lt;center&gt;&lt;a href=&quot;https://mattlacey.com/img/code_monokai.png&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://mattlacey.com/img/vnUQXeU7Pn-924.webp 924w&quot;&gt;&lt;img loading=&quot;lazy&quot; src=&quot;https://mattlacey.com/img/vnUQXeU7Pn-924.jpeg&quot; alt=&quot;Monokai Dark&quot; width=&quot;924&quot; height=&quot;664&quot;&gt;&lt;/picture&gt;&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;
&lt;p&gt;It&#39;s as if comments are regarded as messy, unsightly, or that they&#39;re somehow less important than the code around them. Sure, comments such as &lt;code&gt;// set name to null&lt;/code&gt; or &lt;code&gt;// loop over the array&lt;/code&gt; are &lt;em&gt;essentially&lt;/em&gt; worthless, but good comments are worth their weight in bitcoin. Good comments are arguably &lt;em&gt;more important&lt;/em&gt; than the code around them, because although reading the code tells you what it does, only comments can tell you why it does it, and there&#39;s many occasions where the why isn&#39;t immediately apparent. Comments alone can tell you why some ass-backward crazy looking code is written as it is - oftentimes there is a good reason for weirdness.&lt;/p&gt;
&lt;h2&gt;Codey&#39;s In Bed By 10pm&lt;/h2&gt;
&lt;p&gt;&lt;center&gt;&lt;a href=&quot;https://mattlacey.com/img/code_codey.png&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://mattlacey.com/img/Oh-jMtu-zT-924.webp 924w&quot;&gt;&lt;img loading=&quot;lazy&quot; src=&quot;https://mattlacey.com/img/Oh-jMtu-zT-924.jpeg&quot; alt=&quot;Codey&#39;s In Bed by 10pm&quot; width=&quot;924&quot; height=&quot;664&quot;&gt;&lt;/picture&gt;&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;
&lt;p&gt;Respect your comments. Put effort into writing them, and let them stand out by using a theme that appreciates the power of comments. A good example of such a theme has been cooked up by a good friend of mine, Kevin Poorman, called &lt;a href=&quot;https://github.com/forcedotcom/Codeys-in-bed-by-10&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;&amp;quot;Codey&#39;s In Bed By 10pm&amp;quot;&lt;/a&gt; and I thoroughly recommend checking it out. On the surface it might appear that the comments and background are on par with Cobalt2, but the difference is the contrast for the code and the comments appears to be very similar, they&#39;re treated as equals, as all code and all people should be.&lt;/p&gt;
</description>
      <pubDate>Thu, 11 Mar 2021 00:00:00 GMT</pubDate>
      <dc:creator>Matt Lacey</dc:creator>
      <guid>https://mattlacey.com/posts/2021-03-11-who-needs-comments-anyway/</guid>
    </item>
    <item>
      <title></title>
      <link>https://mattlacey.com/posts/2020-10-20-why-code-for-fun/</link>
      <description>&lt;p&gt;It&#39;s pretty common during interviews for software development roles for the interviewee to be asked about any side projects or hobby code, and rightfully so this is often seen as unfair. Coding in your spare time should not be a requirement, many people don&#39;t have the time for it, others may just want to spend their spare time doing something else, and they shouldn&#39;t be punished for that. Ever. Some developers have a seemingly endless list of hobby projects, that churns and changes constantly with little ever being completed. I&#39;ve always been one of those developers but it only recenlty dawned on me why.&lt;/p&gt;
&lt;p&gt;I code professionally for about 30 hours of the week on average. Other aspects of my job take up the rest of the time and some weeks are far, far longer than others. So why do I code for fun, on the same machine in my limited downtime? Because suddenly I don&#39;t have to give a shit.&lt;/p&gt;
&lt;p&gt;In my professional code I strive to be better. I read articles, books, and always aim to improve the code base. The code is defensive, it tries hard to be user friendly, and all of that consumes a lot of time and mental effort. When it comes to hobby code I can choose the language, the platform, the code style, the project. It&#39;s all under my control, and the end product is typically for me, which means I can just write the bits I want to write and throw the rest out of the window. Check an array index before using it? Nah. I&#39;ll assume it&#39;s right, and when it&#39;s inevitably not, I&#39;ll debug and work out why. If bad input blows things up, so be it - I&#39;m the one giving it input so I should just get my input right. Clearly this is not an approach for any end user audience beyond myself.&lt;/p&gt;
&lt;p&gt;Arguably you should always strive to write your best, most robust code, and often that takes defensiveness. But for older computers and lower level languages it&#39;s correct and fast code that count. Yes I probably should always try and stick with best practices and focusing on improving my architecture skills, but when I&#39;m coding for fun it&#39;s because I want to have fun: the way to do that is to write the bits I want to write and not let the rest bog me down. If I spent all of my coding time (work and otherwise) trying to do it &#39;right&#39; I probably wouldn&#39;t code as a hobby, because the fun would have been sucked out of it.&lt;/p&gt;
&lt;p&gt;Don&#39;t ever rank a job applicant lower than another because they don&#39;t code in their spare time. Maybe they don&#39;t have spare time, maybe they just don&#39;t want to spend their time that way. I used to (incorrectly) think it was an important thing to watch out for, but many of the best developers I know don&#39;t code in their spare time and some of them then wonder why I do.&lt;/p&gt;
&lt;p&gt;For me it&#39;s pretty much a way to blow off steam. I can have a whisky and crash an Atari over and over while I work on a project that&#39;ll likely be of benefit to nobody but me, and even for me it&#39;s not the end product that&#39;ll provide any benefit: it&#39;s the process.&lt;/p&gt;
</description>
      <pubDate>Tue, 20 Oct 2020 00:00:00 GMT</pubDate>
      <dc:creator>Matt Lacey</dc:creator>
      <guid>https://mattlacey.com/posts/2020-10-20-why-code-for-fun/</guid>
    </item>
    <item>
      <title></title>
      <link>https://mattlacey.com/posts/2020-10-01-chips-challenge-wtf/</link>
      <description>&lt;p&gt;On a niche podcast I host with a friend of mine, I mentioned how Chip&#39;s Challenge was released on Steam for free, and that somehow the size of this game was somewhere around 100MB. This may not sound big for a game, and today it really isn&#39;t with new AAA titles coming in closer to 100GB, but the thing is, Chip&#39;s Challenge is an old game. In fact &lt;a href=&quot;https://ia800609.us.archive.org/view_archive.php?archive=/5/items/chips_challenge_windows_3.x/chips_challenge.zip&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;archive.org has a copy of the Windows 3.1 version&lt;/a&gt;, and it weighs in at 198KB zipped, 488KB extracted. I can&#39;t run it under Windows 10, but I suspect it&#39;ll work fine if I copy it over to the Pentium machine on my other desk.&lt;/p&gt;
&lt;p&gt;&lt;center&gt;&lt;a href=&quot;https://mattlacey.com/img/chip_archive.png&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://mattlacey.com/img/Hbepzv2i2I-420.webp 420w&quot;&gt;&lt;img loading=&quot;lazy&quot; src=&quot;https://mattlacey.com/img/Hbepzv2i2I-420.jpeg&quot; alt=&quot;The contents of the Chip&#39;s Challenge for Windows 3.1 archive&quot; width=&quot;420&quot; height=&quot;457&quot;&gt;&lt;/picture&gt;&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;
&lt;p&gt;On the podcast we don&#39;t focus on games, but I&#39;d brought it up as another lamentable example of how the progression of technology often seems to involve crazy changes, like taking a small game and somehow making it huge. But I didn&#39;t think much more of it, until a friend of mine sent me a Tweet and suggested that it might be using an emulator or VM:&lt;/p&gt;
&lt;p&gt;&lt;center&gt;&lt;a href=&quot;https://mattlacey.com/img/chip_tweet.png&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://mattlacey.com/img/hvwCMZ1RFb-623.webp 623w&quot;&gt;&lt;img loading=&quot;lazy&quot; src=&quot;https://mattlacey.com/img/hvwCMZ1RFb-623.jpeg&quot; alt=&quot;Tweet from @BrettMN: maybe that chip game you mentioned ships with a VM/emulator&quot; width=&quot;623&quot; height=&quot;161&quot;&gt;&lt;/picture&gt;&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;
&lt;p&gt;&amp;quot;Of course&amp;quot; I thought. I&#39;ve got a bunch of Steam games that come packaged up via DOSBox, so it&#39;d make perfect sense. I decided to actually install the game and it&#39;s interesting to note that despite the game being a couple of orders magnitude larger than it was originally, I could pull it from the other side of the world in less time than it&#39;d take to copy the original 500KB game off of a floppy. Then I dug in to see what emulator or similar it was using.&lt;/p&gt;
&lt;p&gt;&lt;center&gt;&lt;a href=&quot;https://mattlacey.com/img/chip_files.png&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://mattlacey.com/img/N3R8JasfcG-653.webp 653w&quot;&gt;&lt;img loading=&quot;lazy&quot; src=&quot;https://mattlacey.com/img/N3R8JasfcG-653.jpeg&quot; alt=&quot;The root directory structure, showing the .exe, a DATA folder and a Steam specific .dll&quot; width=&quot;653&quot; height=&quot;123&quot;&gt;&lt;/picture&gt;&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;
&lt;p&gt;There&#39;s a few things to take note of here:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;There&#39;s a Steam specific .dll, which isn&#39;t surprising - but it does indicate that the game has been recompiled&lt;/li&gt;
&lt;li&gt;The size of the executable is now around 4x the size of the original game&lt;/li&gt;
&lt;li&gt;There&#39;s no sign of an emulator, which would make sense given the recompilation&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;So the extra size must be in the data directory, which again seems odd because the core data files shouldn&#39;t have changed, and the graphics and sound should be as they ever were. So I dug deeper, checking folder sizes to see where the disk space has gone, and it didn&#39;t take long to discover the cause.&lt;/p&gt;
&lt;p&gt;&lt;center&gt;&lt;a href=&quot;https://mattlacey.com/img/chip_music.png&quot;&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://mattlacey.com/img/i6hzvClfCG-269.webp 269w&quot;&gt;&lt;img loading=&quot;lazy&quot; src=&quot;https://mattlacey.com/img/i6hzvClfCG-269.jpeg&quot; alt=&quot;The music directory listing, showing a long list of MP3 files&quot; width=&quot;269&quot; height=&quot;675&quot;&gt;&lt;/picture&gt;&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;
&lt;p&gt;The music is all in MP3 format, weighing in at 83MB. Again, this may not seem extreme if you&#39;re not someone who was playing PC games in the early 90s, but if you were, you&#39;d know it wouldn&#39;t have shipped with MP3 music. The original game used MIDI files, and these MP3 recordings are not new versions of the music, they&#39;re actually recordings of the MIDI files being played back. The Steam version includes many more tracks than the original Windows 3.1 archive I found, but two of the tracks are the same in each. In the old version we have 2 MIDI files taking up 21,595 bytes, and the two corresponding MP3 files consume 1,462,803 bytes. They&#39;re relatively small compared to the others included as they&#39;re quite short tracks, but here&#39;s the real kicker:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;MP3 is lossy, which means the modern version of the game uses over 67x the disk space, more RAM and CPU cycles at run time, for inferior music. Progress!&lt;/em&gt;&lt;/p&gt;
</description>
      <pubDate>Thu, 01 Oct 2020 00:00:00 GMT</pubDate>
      <dc:creator>Matt Lacey</dc:creator>
      <guid>https://mattlacey.com/posts/2020-10-01-chips-challenge-wtf/</guid>
    </item>
    <item>
      <title></title>
      <link>https://mattlacey.com/posts/2020-05-25-aposd/</link>
      <description>&lt;p&gt;I tend to go through phases of reading books related to development, often reading a few back to back and then taking a break for a few years at a time. This isn&#39;t intentional but seems to be a natural cycle for me. Recently I&#39;ve been reading them again, and the most recent book I read was John Ousterhout&#39;s A Philosophy of Software Design, and I wanted to make a few comments about it and to recommend it to others, because I think it&#39;s a worthy read for all developers.&lt;/p&gt;
&lt;p&gt;I must admit, that I didn&#39;t actually look up John Ousterhout prior to reading the book (and now I feel it&#39;s criminal that I didn&#39;t already know his name): I simply picked up due to a recommendation from a friend of mine, and this meant I had a rather pleasant surprise about halfway through when Ousterhout mentions that he created TCL. As somebody who spent close to two years developing in TCL professionally (though I must say I&#39;ve never used it outside of that role) I had to do a bit of a double take, and immediately go look him up. TCL is a dynamically typed language that can be used in a range of domains: the company I worked for used it extensively because of how well it could be interfaced with C. They used C for the core of their web application framework and then TCL was used to drive the interface and higher level business logic. The point though, is that Ousterhout has seen his fair share of development, system design and architecture, and it&#39;s clear he&#39;s picked up some excellent ways of working along the way.&lt;/p&gt;
&lt;p&gt;Upon finishing the book I reached out to my friend to get his final thoughts on it, and while he liked it he felt that &amp;quot;Philosophy&amp;quot; was a bit of a strong word to use in the title. I do a agree to some extent, but I do think the word fits because it&#39;s definitely given me an alternative way at looking at the code I write. The book is not a detailed guide to architecture patterns, or hard and fast rules about how to put software together, but it does present a few generic guide lines and methodologys with which to approach software development.&lt;/p&gt;
&lt;h2&gt;Software Complexity Causes Headaches&lt;/h2&gt;
&lt;p&gt;The book opens with a discussion on what complexity means in software, and highlights that while complexity can not be eliminated from a large scale software solution, it can be handled, and sometimes that handling takes a little up-front investment. I wasn&#39;t entirely engrossed in this discussion, but that&#39;s not to say that I didn&#39;t get anything out of it, I just wanted to get to the meat of the book. That&#39;s where I was perhaps a little let down, because there is no grand overall idea presented, but instead a series of small ideas that work together. Of course, you&#39;ve probably realised from that sentence alone what the deal is: the small ideas come together to make a grand whole, and I worked that out after the fact. There is no big summary or conclusion, it&#39;s simply presented as ideas and guidelines and left to you to deal with.&lt;/p&gt;
&lt;h2&gt;Simple Rules Can Go A Long Way&lt;/h2&gt;
&lt;p&gt;Anyone who&#39;s familiar with the concept of emergent behaviour knows that simple rules can build powerful systems, and that&#39;s how I believe Ousterhout&#39;s guidelines work. The ideas are not complicated or difficult to reason about, and they are easy to leverage both when considering your application architecture as a whole and on the fly as you write your methods and classes. I find it quite fascinating how he&#39;s managed to distill a few simple rules that impact your behaviour to the point of having a considerable impact, and the best part of them being simple is that you won&#39;t find yourself having to go back to the book to remind yourself about how some pattern works, or how something should be structured: this is more fundamental stuff and I believe that&#39;s how it can be considered a philosophy.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Whenever you modify any code, try to find a way to improve the system design at least a little bit in the process. If you&#39;re not making the design better, you are probably making it worse&lt;/p&gt;
&lt;p&gt;John Ousterhout, &lt;a href=&quot;https://www.amazon.com/dp/B07N1XLQ7D/ref=cm_sw_r_tw_dp_U_x_2U5YEbE1BT0FN&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;A Philosophy of Software Design&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Go Deep&lt;/h2&gt;
&lt;p&gt;I don&#39;t want to go ahead and bastardize the content of the book here, because I simply wouldn&#39;t do it justice. But one concept that&#39;s easily explained (and gives a good taster) is Ousterhout&#39;s classification for Shallow vs. Deep, which applies from high level structures such as modules, through classes and down to individual methods. The core idea is that complexity should be hidden away, meaning interfaces for code should be simple, and the code itself complex. If the interface is complex it&#39;ll necessarily become harder to use, and often more difficult to maintain. Sure, moving the complexity out of the public interface doesn&#39;t remove it, but it removes it from consideration by users for the module/class/method. Methods themselves may become more complicated internally, but I think it&#39;s fair to say that in most large systems, features and updates rarely involve rewriting existing code, more often than not they&#39;re about expanding interfaces or bolting in new modules, and utilising what&#39;s already in place. If the interfaces to the exsting code are simple and obvious then they should be easy to work with and re-use. This is what constitutes the definition of &amp;quot;Deep&amp;quot;: Simple Interface - (more) Complex Implementation. In contrast, shallow classes and methods are those with detailed interfaces, resulting in relatively simple code because the complexity is often being deal with by the caller, which as you can imagine puts the burden of complexity on said caller and results in all code using the module assuming the complexity instead, which significant effect on a lot more of the code base.&lt;/p&gt;
&lt;h2&gt;Give It a Read&lt;/h2&gt;
&lt;p&gt;These ideas may not be for you, you may even fundamentally disagree with them if you&#39;re of the persuasion that no method should ever be longer than 10 lines of code, but for me the book really works, and that&#39;s why I think all developers should read it. Even if you do disagree in some of the core concepts there&#39;s bound to be something of benefit in the book for you.&lt;/p&gt;
</description>
      <pubDate>Thu, 30 Apr 2020 00:00:00 GMT</pubDate>
      <dc:creator>Matt Lacey</dc:creator>
      <guid>https://mattlacey.com/posts/2020-05-25-aposd/</guid>
    </item>
    <item>
      <title></title>
      <link>https://mattlacey.com/posts/2020-04-23-music-for-coding/</link>
      <description>&lt;p&gt;This is a blog related to programming, and such articles will be forthcoming, but I feel it&#39;s important to set the tone before going any further, and I genuinely struggle to work without music. When I started on this post it was supposed to include a variety of music, but I quickly realised it was taking on a very D&amp;amp;B slant, because once I&#39;d included one track I wanted to include others that I enjoy from the genre. At that point I decided this will be a D&amp;amp;B installment in a series, because I listen to a pretty wide variety of music day to day. It would appear that the Hospital Records label in particular has had a large impact on my listening of late.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Disclaimer&lt;/strong&gt;: everyone has different tastes and what works for me may well be so far removed from what you like that you&#39;ll wish I&#39;d never made this list, but I&#39;m writing it anway, because I wanted to highlight some music I&#39;ve tripped over a few years after the fact, and have absolutely grown to love. Some people prefer to work in silence, and if that&#39;s the case you can probably stop reading.... now.&lt;/p&gt;
&lt;p&gt;I&#39;m was planning to embed some music from Spotify, again, people have different opinions and different sources for their music, but Spotify has been mine since I got sick of managing an MP3 collection. I don&#39;t know the exact date, but it&#39;s been over 10 years. Unfortunately, there doesn&#39;t appear to be a way to specify a sensible volume level for their embedded player, and if often starts mid-track, with a heavy beat, way too loud, so YouTube it is. For each artist, I&#39;m going to list/embed one of my favourite tracks, but more often than not you can bet I love the whole album/EP they came on.&lt;/p&gt;
&lt;div class=&quot;flex-row alternating v-margin&quot;&gt;
    &lt;div&gt;
        &lt;h1&gt;B-Complex :: Early Bird&lt;/h1&gt;
        &lt;p&gt;I don&#39;t remember how or whan I came across B-Complex, and her body of work isn&#39;t huge, but I&#39;ll take quality over quantity any day. A piano melody over the top of a track that just keeps rolling. I can&#39;t get enough of this track, but don&#39;t just check out the EP, &lt;a href=&quot;https://open.spotify.com/artist/46oL0QioEQMSSvkxxifCok?si=Cx60iGW5Tmi5eFu-fWJAtQ&quot; rel=&quot;noreferrer&quot; target=&quot;_blank&quot;&gt; because all of her work is so damned good&quot;&lt;/a&gt;.&lt;/p&gt;
    &lt;/div&gt;
    &lt;iframe width=&quot;300&quot; height=&quot;300&quot; src=&quot;https://www.youtube-nocookie.com/embed/GcLFnh3MUaM&quot; frameborder=&quot;0&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;div class=&quot;flex-row alternating v-margin&quot;&gt;
    &lt;div&gt;
        &lt;h1&gt;Keeno :: Nocturne&lt;/h1&gt;
        &lt;p&gt;More piano, maybe there&#39;s a theme? I often leave Spotify playing on radio mode because I find it&#39;s a great way to discover music, and this track had me hooked within the first 30 seconds. I listened to it, listened again, and then listened to the album it&#39;s apart of: Life Cycle. It&#39;s perfect for some late night hacking.&lt;/p&gt;
    &lt;/div&gt;
    &lt;iframe width=&quot;300&quot; height=&quot;300&quot; src=&quot;https://www.youtube-nocookie.com/embed/hzXgEcB_MX8&quot; frameborder=&quot;0&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;div class=&quot;flex-row alternating v-margin&quot;&gt;
    &lt;div&gt;
        &lt;h1&gt;Netsky w. Emeli Sandé :: Thunder&lt;/h1&gt;
        &lt;p&gt;I discovered Netsky during a hackathon back in 2013, but haven&#39;t stopped listening to his music since. I&#39;d be lying if I said I loved every track on the album (III) that this track heads up, but I&#39;m never even close to skipping one.&lt;/p&gt;
    &lt;/div&gt;
    &lt;iframe width=&quot;300&quot; height=&quot;300&quot; src=&quot;https://www.youtube-nocookie.com/embed/uEdaIusW21k&quot; frameborder=&quot;0&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;div class=&quot;flex-row alternating v-margin&quot;&gt;
    &lt;div&gt;
        &lt;h1&gt;Sub Focus :: Out The Blue ft. Alice Gold&lt;/h1&gt;
        &lt;p&gt;From the album &lt;a href=&quot;https://open.spotify.com/album/5VDg2zP4jsc8Ufj1dPEA3d?si=DlPSXnB2RgO35KQm8LUV_Q&quot; rel=&quot;noreferrer&quot; target=&quot;_blank&quot;&gt;Torus&lt;/a&gt;, this is perhaps a bit more upbeat than some of the other tracks listed. Again, I love this album, but I&#39;m Including this track in particular because I&#39;ve had the lyrics in my head all morning.&lt;/p&gt;
    &lt;/div&gt;
    &lt;iframe width=&quot;300&quot; height=&quot;300&quot; src=&quot;https://www.youtube-nocookie.com/embed/tQQVgZhGc2M&quot; frameborder=&quot;0&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;div class=&quot;flex-row alternating v-margin&quot;&gt;
    &lt;div&gt;
        &lt;h1&gt;High Contrast :: The Agony And The Ecstasy feat Selah Corbin&lt;/h1&gt;
        &lt;p&gt;More from Hospital Records: lyrical, fast, uplifting and even includes some organ for good measure with a synth riffing that could have been lifted straight from a Sega Megadrive game. High Contrast&#39;s work is quite varied within the genre, and another of HC&#39;s tracks that never fails to get me chair-dancing is &lt;a href=&quot;spotify:album:2THbaSvPvgqadzTeX2GxS8&quot; rel=&quot;noreferrer&quot; target=&quot;_blank&quot;&gt;Kiss Kiss Bang Bang&lt;/a&gt;.&lt;/p&gt;
    &lt;/div&gt;
    &lt;iframe width=&quot;300&quot; height=&quot;300&quot; src=&quot;https://www.youtube-nocookie.com/embed/-E2K3EJ5RTY&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;div class=&quot;flex-row alternating v-margin&quot;&gt;
    &lt;div&gt;
        &lt;h1&gt;Pendulum :: Watercolour&lt;/h1&gt;
        &lt;p&gt;Probably far better known than most of the other artists I&#39;ve listed, but Pendulum have been one of my most listened to artists for the last decade, and I listened to them a lot before that ever since they first hit the world stage with Slam. From the album, &lt;a href=&quot;https://open.spotify.com/album/3XtEGVx9uh7J46nBzEc1VS?si=mT3JL3ySRCOlEcgfflp-kw&quot; rel=&quot;noreferrer&quot; target=&quot;_blank&quot;&gt;Immersion&lt;/a&gt;, I&#39;d probably pick The Island -, Pt. I over this track, but couldn&#39;t find an official video for it on their channel, and this is a close enough second that it&#39;s practically equal. Immersion can&#39;t get enough air time IHMO.&lt;/p&gt;
    &lt;/div&gt;
    &lt;iframe width=&quot;300&quot; height=&quot;300&quot; src=&quot;https://www.youtube-nocookie.com/embed/tEPB7uzKuh4&quot; frameborder=&quot;0&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;I hope this has introduced you to some new music, or at least re-kindled interest in tracks/artists you may have forgotten along the way. The next installment will likely involve a lot more guitars. I&#39;d love to &lt;a href=&quot;https://www.twitter.com/laceysnr&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;hear your thoughts&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Edit :: Spotify Playlist&lt;/h2&gt;
&lt;p&gt;After writing this post and sharing it on Twitter, a friend of mine asked whether it was available as a Spotify playlist, so I quickly threw together a list with these tracks and a couple of others, it&#39;ll keep growing but if you use Spotify and like the music you&#39;ve heard here, &lt;a href=&quot;https://open.spotify.com/playlist/5FzPz9kZcFC7Of4AfjJGZc?si=F15PsjxZS4OT3ImKtowfpA&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;you might want to subscribe to it&lt;/a&gt;.&lt;/p&gt;
</description>
      <pubDate>Thu, 23 Apr 2020 00:00:00 GMT</pubDate>
      <dc:creator>Matt Lacey</dc:creator>
      <guid>https://mattlacey.com/posts/2020-04-23-music-for-coding/</guid>
    </item>
    <item>
      <title></title>
      <link>https://mattlacey.com/posts/first-post/</link>
      <description>&lt;p&gt;For many years now I&#39;ve blogged on and off at &lt;a href=&quot;https://www.laceysnr.com&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;laceysnr.com&lt;/a&gt;, primarily around the Salesforce development ecosystem, but ocassionally on &lt;a href=&quot;https://laceysnr.com/split-profile-pictures-in-css/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;other&lt;/a&gt; more general programming &lt;a href=&quot;https://laceysnr.com/on-fonts-for-programming/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;topics&lt;/a&gt; &lt;a href=&quot;https://laceysnr.com/the-importance-of-fucking-around/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;too&lt;/a&gt;. I may move some of those posts here at some point, but probably not. I want this site to be a place where I can write about more generic programming interests, as well as make a home for my projects. For the latter it&#39;s less about showing them off, and more about making me feel more accountable for them so that I might actually get more done.&lt;/p&gt;
&lt;p&gt;The speed of websites and the internet in general has been something that&#39;s annoyed me for some time now, in fact, the general wastage involved in modern computing in general annoys me. We have crazy powerful machines these days, that are constantly pushing extreme amounts of data (think about updating a 4k monitor, 60 times a second, just to read some text), but we take them for granted. Abstractions built on abstractions built on abstractions mean that so much code is further from the metal than it&#39;s ever been, and that&#39;s a shame. It&#39;s a fact that many text editors on my desktop PC are slower to respond to the keyboard than my 1982 Atari 800XL, or my mid-90&#39;s DOS machine. Yes, those machines aren&#39;t doing anything else and my PC is doing all sorts, but the most important thing a computer does is react to the user, and when it feels like there&#39;s a barrier in the way of that interaction, it&#39;s not a good thing. Lots of people have written on this topic, talking about how their machines that are only a few years old can barely scroll a web page, and quite rightly in response they&#39;ve created very lightweight websites. I think that&#39;s a good thing, and I want to do that, but I also want to leverage modern technologies as well.&lt;/p&gt;
&lt;p&gt;The upshot? Well I&#39;m going for simple content, and generating everything through &lt;a href=&quot;https://www.11ty.dev/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Eleventy&lt;/a&gt; because I want to write quickly in markdown and have the computer do the boring repetitive stuff for me (which is what they&#39;re built for). I scouted around for a few days, and while I believe the Eleventy docs could be improved a little for those getting to grasps with it, it definitely felt like the right fit after trying out most of the big names in static site generation.&lt;/p&gt;
&lt;p&gt;I&#39;m not going completely spartan though - I&#39;ve embraced/absued CSS to generate the background that&#39;s currently on the site. Will this stay? I honestly don&#39;t know right now, I&#39;ll see how it performs. But a hunch tells me this is the kind of thing handled once by the browser on page load and then I&#39;m hoping dealt with in a smart way, but assumptions are not great things to make. Have I got any JavaScript running right now? No, but that&#39;s not to say I never will, but if I do add it I want to make it work nicely on old machines too, so already I need to find a way to deal with the CSS I&#39;ve written. Perhaps a dedicated sub-domain will be the key: retro.mattlacey.com or something along those lines.&lt;/p&gt;
&lt;p&gt;If you&#39;ve read this for some reason, then I thank you, and hopefully there&#39;ll be more interesting content to read soon.&lt;/p&gt;
</description>
      <pubDate>Mon, 20 Apr 2020 00:00:00 GMT</pubDate>
      <dc:creator>Matt Lacey</dc:creator>
      <guid>https://mattlacey.com/posts/first-post/</guid>
    </item>
  </channel>
</rss>