<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet href="/feeds/stylesheet.xslt" type="text/xsl"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Oli Warner&apos;s Blog</title><description>Latest posts from Oli Warner</description><link>https://thepcspy.com/</link><css>/static/combined.Bmas0fjW.css</css><item><title>Microbit: easier with extensions</title><link>https://thepcspy.com/read/microbit-easier-with-extensions/</link><guid isPermaLink="true">https://thepcspy.com/read/microbit-easier-with-extensions/</guid><description>&lt;p&gt;The &lt;a href=&quot;https://microbit.org/get-started/what-is-the-microbit/&quot;&gt;BBC Microbit&lt;/a&gt; is a wonderful introduction to both programming and electronics, but &lt;a href=&quot;https://makecode.microbit.org/blocks&quot;&gt;MakeCode’s Blocks&lt;/a&gt; make some ideas quite hard to express.&lt;/p&gt;
</description><pubDate>Thu, 23 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;The &lt;a href=&quot;https://microbit.org/get-started/what-is-the-microbit/&quot;&gt;BBC Microbit&lt;/a&gt; is a wonderful introduction to both programming and electronics, but &lt;a href=&quot;https://makecode.microbit.org/blocks&quot;&gt;MakeCode’s Blocks&lt;/a&gt; make some ideas quite hard to express.&lt;/p&gt;
 &lt;figure class=&quot;rimxs&quot;&gt;&lt;img __astro_image_=&quot;{&amp;quot;alt&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;src&amp;quot;:&amp;quot;microbit-drawing-2-yellow.avif&amp;quot;,&amp;quot;index&amp;quot;:0}&quot;&gt;&lt;/figure&gt;
&lt;p&gt;Introducing my 6yo to robotics, I’m conscious how important it is to keep things interesting, to keep difficulties abstracted, hidden. Buzzers, LEDs, motor controllers and servos are pretty much plug-and-play these days but &lt;em&gt;control&lt;/em&gt; is harder. You want speed, direction, some buttons for features and ideally some method of feedback.&lt;/p&gt;
&lt;p&gt;The builtin BLE allows &lt;a href=&quot;https://www.youtube.com/watch?v=QxVwzhAZq3Y&quot;&gt;phone apps&lt;/a&gt;, but I try to keep my kids off phones. There isn’t a proper BT stack available to the Microbit, so real controllers are out. IR is super cheap but the experience is short range and very directional. Similarly a corded remote  works &lt;em&gt;with caveats&lt;/em&gt;. But none are ideal.&lt;/p&gt;
&lt;h2 id=&quot;use-another-microbit&quot;&gt;Use another Microbit.&lt;/h2&gt;
&lt;p&gt;The radio module in the Microbit is awesome. Its Nordic nRF5xxxx SoC has a proprietary low-latency communication protocol called &lt;a href=&quot;https://nrfconnectdocs.nordicsemi.com/ncs/3.2.2/nrf/protocols/esb/index.html&quot;&gt;Enhanced ShockBurst&lt;/a&gt;. Microbit software builds on top of this for a super-simple message exchange format. Pick a channel and just send and receive 32byte messages.&lt;/p&gt;
&lt;p&gt;A Microbit on its own does have enough sensors to act as a HCI device: accelerometer for directions, two or three buttons depending on your version, but you still have to add batteries, and tilting isn’t the best interface. In a pinch, sure, but better options exist. I have –and would recommmend– a &lt;a href=&quot;https://wiki.elecfreaks.com/en/microbit/expansion-board/joystick-bit-v2/&quot;&gt;Joystick v2 Plus&lt;/a&gt;. ~£15 buys you a x-y axes, four buttons, buzzer, vibration feedback, battery case and the plus version has handles (which you could 3d print).&lt;/p&gt;
&lt;h2 id=&quot;if-its-so-good-why-use-extensions&quot;&gt;If it’s so good, why use extensions?&lt;/h2&gt;
&lt;p&gt;We have our hardware but how do we take that input and send it to our robot? &lt;a href=&quot;https://www.elecfreaks.com/learn-en/microbitKit/smart_cutebot/cutebot_case13.html&quot;&gt;Elecfreaks’ example&lt;/a&gt; would have your controller send named events for both axes, every button. 🤮&lt;/p&gt;
&lt;figure&gt;&lt;img __astro_image_=&quot;{&amp;quot;alt&amp;quot;:&amp;quot;Yuck&amp;quot;,&amp;quot;src&amp;quot;:&amp;quot;elecfreaks.avif&amp;quot;,&amp;quot;index&amp;quot;:0}&quot;&gt;&lt;/figure&gt;
&lt;p&gt;You have to unpick each message separately. These messages are processed in a queue with the main forever loop, it’s possible –likely, even– you’re going to have forever loops where you’re dealing with old data. What about key combinations?&lt;/p&gt;
&lt;p&gt;In a &lt;em&gt;real&lt;/em&gt; programming language, you’d pack all your data into one packet and send it off and decode it all at once. 8 bits each for &lt;code&gt;x&lt;/code&gt; and &lt;code&gt;y&lt;/code&gt;. 1 bit per button. In a real language you can use bitwise operators to pack the bits together into a single number, and break them apart just as easily.&lt;/p&gt;
&lt;pre class=&quot;language-plaintext&quot; data-language=&quot;plaintext&quot;&gt;&lt;code class=&quot;language-plaintext&quot;&gt;    x    |     y    |  c  |  d  |  e  |  f  
00000000 | 00000000 |  0  |  0  |  0  |  0 &lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;But Blocks lacks the tools for encoding this stuff into a single message … without extensions. So I wrote a &lt;a href=&quot;https://github.com/oliwarner/joystickbitRadio/&quot;&gt;&lt;strong&gt;joystickbit-radio&lt;/strong&gt; extension&lt;/a&gt; extension to do exactly that. I turns the joypad state into a single number you just transmit over the normal radio block. For the user it’s as simple as dragging a few blocks:&lt;/p&gt;
&lt;figure&gt;&lt;img __astro_image_=&quot;{&amp;quot;alt&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;src&amp;quot;:&amp;quot;joystickbit-radio-sender.avif&amp;quot;,&amp;quot;index&amp;quot;:0}&quot;&gt;&lt;/figure&gt;
&lt;aside&gt;&lt;details&gt;&lt;summary&gt;See what it&apos;s doing behind the scenes...&lt;/summary&gt;&lt;p&gt;It’s pretty simple to pack a binary format up with bitwise operators.&lt;/p&gt;&lt;pre class=&quot;language-ts&quot; data-language=&quot;ts&quot;&gt;&lt;code class=&quot;language-ts&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; value&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;number&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;

value &lt;span class=&quot;token operator&quot;&gt;|=&lt;/span&gt; Math&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;idiv&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;joystickbit&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getRockerValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;joystickbit&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;rockerType&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;X&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; &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
value &lt;span class=&quot;token operator&quot;&gt;|=&lt;/span&gt; Math&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;idiv&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;joystickbit&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getRockerValue&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;joystickbit&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;rockerType&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;Y&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; &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;8&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;joystickbit&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getButton&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;joystickbit&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;JoystickBitPin&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;P12&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;
    value &lt;span class=&quot;token operator&quot;&gt;|=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;16&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;joystickbit&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getButton&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;joystickbit&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;JoystickBitPin&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;P13&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;
    value &lt;span class=&quot;token operator&quot;&gt;|=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;17&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;joystickbit&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getButton&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;joystickbit&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;JoystickBitPin&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;P14&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;
    value &lt;span class=&quot;token operator&quot;&gt;|=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;18&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;joystickbit&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getButton&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;joystickbit&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;JoystickBitPin&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token constant&quot;&gt;P15&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;
    value &lt;span class=&quot;token operator&quot;&gt;|=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;19&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;You can’t do &lt;em&gt;that&lt;/em&gt; with Blocks.&lt;/p&gt;&lt;/details&gt;&lt;/aside&gt;
&lt;p&gt;And at the other end, I’ve added some sugar. Not only does it decode, it adds events for button handling, utilities for mapping to different scales, or even tank tracking. &lt;a href=&quot;https://makecode.microbit.org/_LKz9J6U42DCR&quot;&gt;It makes the whole endeavour for users much, much easier&lt;/a&gt;.&lt;/p&gt;
&lt;figure&gt;&lt;img __astro_image_=&quot;{&amp;quot;alt&amp;quot;:&amp;quot;Much better&amp;quot;,&amp;quot;src&amp;quot;:&amp;quot;joystickbit-radio.avif&amp;quot;,&amp;quot;index&amp;quot;:0}&quot;&gt;&lt;/figure&gt;
&lt;p&gt;Extensions allow you to create Blocks that &lt;strong&gt;do stuff&lt;/strong&gt; like this. I’m not saying you should use my extension –you can– rather &lt;em&gt;&lt;strong&gt;you can write your own!&lt;/strong&gt;&lt;/em&gt; It’s pretty simple and helping your learners before they get stuck will allow them to stay immersed, far longer. Nothing breaks a learning experience like debugging a system you don’t understand, or a impromptu maths lesson on how to unpick a right-to-left axis, or have to learn javascript before they could start.&lt;/p&gt;
&lt;p&gt;Blocks is great for discovering the Microbit API, it pays dividends to make it Good Enough™ rather than push people to harder environments.&lt;/p&gt;
&lt;p&gt;Things I used:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://makecode.com/extensions/getting-started&quot;&gt;https://makecode.com/extensions/getting-started&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://makecode.com/defining-blocks&quot;&gt;https://makecode.com/defining-blocks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://makecode.com/playground&quot;&gt;https://makecode.com/playground&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Lead image from &lt;a href=&quot;https://thepcspy.com/read/microbit-easier-with-extensions/microbit.org&quot;&gt;micro Educational Foundation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>What’s happened?</title><link>https://thepcspy.com/read/whats-happened/</link><guid isPermaLink="true">https://thepcspy.com/read/whats-happened/</guid><description>&lt;p&gt;Foreign money is interfering in UK elections again, but I can’t remember it ever being &lt;em&gt;this&lt;/em&gt; obvious.&lt;/p&gt;
</description><pubDate>Fri, 12 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Foreign money is interfering in UK elections again, but I can’t remember it ever being &lt;em&gt;this&lt;/em&gt; obvious.&lt;/p&gt;
 &lt;figure&gt;&lt;img __astro_image_=&quot;{&amp;quot;alt&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;class&amp;quot;:&amp;quot;rimxs&amp;quot;,&amp;quot;src&amp;quot;:&amp;quot;tall/Screenshot_20260612-072919.avif&amp;quot;,&amp;quot;index&amp;quot;:0}&quot;&gt;&lt;/figure&gt;
&lt;p&gt;If you’re in the UK and you’ve been on &lt;em&gt;The Site Previously Known as Twitter&lt;/em&gt; in the last few days, you’ve probably seen an advertisement featuring an AI depiction of Nigel Farage beating, strangling, mugging, shooting, and having his shoes licked by the Bank of England’s governor, Andrew Bailey. These all link through to a fake BBC News page that reports Farage is a big mean tough guy demanding the Bank does what he says.&lt;/p&gt;
&lt;p&gt;I wouldn’t for a second suggest that Nigel or Reform are paying to make their weasel look tough, &lt;em&gt;&lt;strong&gt;but someone is&lt;/strong&gt;&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;This morning, scrolling through my “Following” tab, I saw around 20 ads on this theme. These were all from foreign-held (India, Saudi, South African, Russian, Uganda, Viet Nam, etc) premium accounts that proclaim themselves “social media influencers”. They all post a couple of nature pictures, and then post these political adverts.&lt;/p&gt;
&lt;p class=&quot;picblock&quot;&gt;&lt;img __astro_image_=&quot;{&amp;quot;alt&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;src&amp;quot;:&amp;quot;tall/Screenshot_20260612-072530.avif&amp;quot;,&amp;quot;index&amp;quot;:0}&quot;&gt;
&lt;img __astro_image_=&quot;{&amp;quot;alt&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;src&amp;quot;:&amp;quot;tall/Screenshot_20260612-072910.avif&amp;quot;,&amp;quot;index&amp;quot;:0}&quot;&gt;
&lt;img __astro_image_=&quot;{&amp;quot;alt&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;src&amp;quot;:&amp;quot;tall/Screenshot_20260612-072744.avif&amp;quot;,&amp;quot;index&amp;quot;:0}&quot;&gt;
&lt;img __astro_image_=&quot;{&amp;quot;alt&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;src&amp;quot;:&amp;quot;tall/Screenshot_20260612-072602.avif&amp;quot;,&amp;quot;index&amp;quot;:0}&quot;&gt;&lt;/p&gt;
&lt;p class=&quot;picblock&quot;&gt;&lt;img __astro_image_=&quot;{&amp;quot;alt&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;src&amp;quot;:&amp;quot;tall/Screenshot_20260612-072513.avif&amp;quot;,&amp;quot;index&amp;quot;:0}&quot;&gt;
&lt;img __astro_image_=&quot;{&amp;quot;alt&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;src&amp;quot;:&amp;quot;tall/Screenshot_20260612-072623.avif&amp;quot;,&amp;quot;index&amp;quot;:0}&quot;&gt;
&lt;img __astro_image_=&quot;{&amp;quot;alt&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;src&amp;quot;:&amp;quot;tall/Screenshot_20260612-072542.avif&amp;quot;,&amp;quot;index&amp;quot;:0}&quot;&gt;
&lt;img __astro_image_=&quot;{&amp;quot;alt&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;src&amp;quot;:&amp;quot;tall/Screenshot_20260612-072505.avif&amp;quot;,&amp;quot;index&amp;quot;:0}&quot;&gt;&lt;/p&gt;
&lt;p class=&quot;picblock&quot;&gt;&lt;img __astro_image_=&quot;{&amp;quot;alt&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;src&amp;quot;:&amp;quot;short/Screenshot_20260612-072615.avif&amp;quot;,&amp;quot;index&amp;quot;:0}&quot;&gt;
&lt;img __astro_image_=&quot;{&amp;quot;alt&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;src&amp;quot;:&amp;quot;short/Screenshot_20260612-072729.avif&amp;quot;,&amp;quot;index&amp;quot;:0}&quot;&gt;
&lt;img __astro_image_=&quot;{&amp;quot;alt&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;src&amp;quot;:&amp;quot;short/Screenshot_20260612-072802.avif&amp;quot;,&amp;quot;index&amp;quot;:0}&quot;&gt;
&lt;img __astro_image_=&quot;{&amp;quot;alt&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;src&amp;quot;:&amp;quot;short/Screenshot_20260612-072738.avif&amp;quot;,&amp;quot;index&amp;quot;:0}&quot;&gt;&lt;/p&gt;
&lt;p&gt;And this has been going on for nearly week.&lt;/p&gt;
&lt;p&gt;If you’ve ever wondered what the dangers of a [practically] unmoderated platform in the hands of a billionaire “free-speech absolutist” could possibly be for your day-to-day life, here it is. Elon doesn’t appear to care who says what. Ads don’t appear to be vetted. As long as your bots pay their dues, and pay the ad fare, you can shove your dirty little opinions into the eyeballs of whomever you like.&lt;/p&gt;
&lt;p&gt;Just as an echo chamber, X was dangerous, but it’s becoming clearer and clearer that it’s now just toxic to any democratic process. With so many bots on the platform, and so many real political campaigners pretending to be somewhere they’re not, the time when you can have an honest discussion has gone.&lt;/p&gt;
</content:encoded></item><item><title>FreeCAD got good</title><link>https://thepcspy.com/read/freecad-got-good/</link><guid isPermaLink="true">https://thepcspy.com/read/freecad-got-good/</guid><description>&lt;p&gt;A testament to Open Source tenacity, is this &lt;em&gt;Free&lt;/em&gt; &lt;abbr title=&quot;Computer Aided Design&quot;&gt;CAD&lt;/abbr&gt; software Good Enough™ to compete with the big boys?&lt;/p&gt;
</description><pubDate>Fri, 05 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;A testament to Open Source tenacity, is this &lt;em&gt;Free&lt;/em&gt; &lt;abbr title=&quot;Computer Aided Design&quot;&gt;CAD&lt;/abbr&gt; software Good Enough™ to compete with the big boys?&lt;/p&gt;
 &lt;style&gt;
    h1:before {
        content:&quot;&quot;;
        display:block;
        float:right;
        width:150px;
        aspect-ratio:5/6;
        margin:-1rem 0 0 1rem;
        background: url(freecad-logo.svg) no-repeat;
        background-size: contain;
    }
&lt;/style&gt;
&lt;figure&gt;&lt;img __astro_image_=&quot;{&amp;quot;alt&amp;quot;:&amp;quot;An overview of FreeCAD&amp;quot;,&amp;quot;class&amp;quot;:&amp;quot;rimxs&amp;quot;,&amp;quot;src&amp;quot;:&amp;quot;overview.avif&amp;quot;,&amp;quot;index&amp;quot;:0}&quot;&gt;&lt;/figure&gt;
&lt;p&gt;If you have a 3D printer, you know you can only go so far printing others’ designs. Eventually you need something that isn’t out there for you. Custom-fit containers. Replacement parts. Shims accurate to 0.2mm. Problems you solve with a little bit of plastic in the right shape. And for that you need &lt;abbr title=&quot;Computer Aided Design&quot;&gt;CAD&lt;/abbr&gt;, able to design anything from a building to a circuit board.&lt;/p&gt;
&lt;p&gt;You might be familiar with YouTubers peddling Fusion and OnShape, and there are lots more options but precious few for Linux.&lt;/p&gt;
&lt;p&gt;I first tried &lt;a href=&quot;https://www.freecad.org/&quot;&gt;FreeCAD&lt;/a&gt; about a decade ago. It wasn’t a smooth experience. A stubbornly blue interface, a quagmire of obtuse icons and panels. It was overbearing, unpretty, and crashed so frequently I just gave up. I haven’t been following its development until very recently, since I started needing design software, but the last few years of FreeCAD’s 23 year history has seen some incredible leaps in usability and stability.&lt;/p&gt;
&lt;p class=&quot;picblock&quot;&gt;&lt;img __astro_image_=&quot;{&amp;quot;alt&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;src&amp;quot;:&amp;quot;oled-mount.avif&amp;quot;,&amp;quot;index&amp;quot;:0}&quot;&gt;
&lt;img __astro_image_=&quot;{&amp;quot;alt&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;src&amp;quot;:&amp;quot;torch-button.avif&amp;quot;,&amp;quot;index&amp;quot;:0}&quot;&gt;
&lt;img __astro_image_=&quot;{&amp;quot;alt&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;src&amp;quot;:&amp;quot;tumbler-gear.avif&amp;quot;,&amp;quot;index&amp;quot;:0}&quot;&gt;&lt;/p&gt;
&lt;p&gt;Since picking it up, I’ve made a flurry of things. From low-tolerance electronics mounts to quick-and-dirty parts for a torch. I’ve even replicated household items like drawer knobs and curtain rail holders that have broken and aren’t easily replaceable. The freedom to identify a problem, measure everything out with your Verniers and have a solution printing out within the hour is the most futuristic thing available.&lt;/p&gt;
&lt;p class=&quot;picblock&quot;&gt;&lt;img __astro_image_=&quot;{&amp;quot;alt&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;src&amp;quot;:&amp;quot;lamp-stand.avif&amp;quot;,&amp;quot;index&amp;quot;:0}&quot;&gt;
&lt;img __astro_image_=&quot;{&amp;quot;alt&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;src&amp;quot;:&amp;quot;drawer-knob.avif&amp;quot;,&amp;quot;index&amp;quot;:0}&quot;&gt;
&lt;img __astro_image_=&quot;{&amp;quot;alt&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;src&amp;quot;:&amp;quot;curtain-rail.avif&amp;quot;,&amp;quot;index&amp;quot;:0}&quot;&gt;&lt;/p&gt;
&lt;p&gt;I won’t pretend it’s all easy, &lt;strong&gt;you &lt;em&gt;still&lt;/em&gt; have to learn how to use it&lt;/strong&gt;, but that’s true of all &lt;abbr title=&quot;Computer Aided Design&quot;&gt;CAD&lt;/abbr&gt; packages. Thankfully there is a large and helpful community around FreeCAD that can get you up to speed pretty quickly:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/@deltahedra3D?cbrd=1&amp;amp;ucbcb=1&quot;&gt;Deltahedra&lt;/a&gt; got me &lt;em&gt;interested&lt;/em&gt; in FreeCAD through lots and lots of shorter-format feature videos. There are lots of feature-updates as FreeCAD gets improvements, and there’s nothing like a “quick hacks” video for improving your own workflow.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/@MangoJellySolutions?cbrd=1&amp;amp;ucbcb=1&quot;&gt;MangoJelly Solutions&lt;/a&gt; does everything Deltahedra does, but also does &lt;em&gt;excellent&lt;/em&gt; long-format project videos.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.tootalltoby.com/&quot;&gt;Too Tall Toby&lt;/a&gt; has a superb collection of spec drawings for you to recreate in a timed environment. FreeCAD isn’t the only tool you can use for these, but I’ve found that it hasn’t stopped me beating the average times. Many TTT challenges also have tutorial videos for FreeCAD.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.craftsmanspace.com/freecad-tutorials&quot;&gt;Craftmanspace&lt;/a&gt; maintains a collection of tutorial videos from various sources. It’s a good resource for targeting specific workbenches.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Once you have some familiarity with the Part Design and Sketcher workbenches, you can start making stuff and sending it to your printer (or a third party print service).&lt;/p&gt;
&lt;p&gt;I’m not nearly expert enough to actually talk you through even a tenth of what FreeCAD has to offer, but I can tell you it’s plenty Good Enough™ to make stuff now. I strongly suggest you give it a shot and &lt;a href=&quot;https://www.freecad.org/downloads.php&quot;&gt;download FreeCAD&lt;/a&gt;. If you need a hard pitch, here are 30 reasons from Deltahedra:&lt;/p&gt;
&lt;iframe style=&quot;width:100%;aspect-ratio:16/9&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen=&quot;&quot; src=&quot;https://www.youtube-nocookie.com/embed/3JweHyvE_m8&quot; id=&quot;3JweHyvE_m8&quot;&gt;&lt;/iframe&gt;
</content:encoded></item><item><title>I think I lost my voice</title><link>https://thepcspy.com/read/losing-your-voice/</link><guid isPermaLink="true">https://thepcspy.com/read/losing-your-voice/</guid><description>&lt;p&gt;Why’s it &lt;em&gt;so&lt;/em&gt; much harder to publicly opine in your forties?&lt;/p&gt;
</description><pubDate>Thu, 04 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Why’s it &lt;em&gt;so&lt;/em&gt; much harder to publicly opine in your forties?&lt;/p&gt;
 &lt;figure class=&quot;rimxs&quot;&gt;&lt;img __astro_image_=&quot;{&amp;quot;alt&amp;quot;:&amp;quot;“Le Silence”&amp;quot;,&amp;quot;title&amp;quot;:&amp;quot;Le Silence, Ducreux&amp;quot;,&amp;quot;src&amp;quot;:&amp;quot;lesilence-ducreaux.avif&amp;quot;,&amp;quot;index&amp;quot;:0}&quot;&gt;&lt;/figure&gt;
&lt;p&gt;I used to write fairly prolifically, blogging here, arguing on forums, chatting on IRC, fighting to be the rightest on Ask Ubuntu, even sharing life events on Facebook. I &lt;em&gt;revelled&lt;/em&gt; in posting online, and the intercourse that followed.&lt;/p&gt;
&lt;p&gt;I realise I’ve gone mute over 15 years. Despite having more knowledge than ever, having even more opinions on this chaotic world, I just can’t seem to express them as freely as I used to.&lt;/p&gt;
&lt;p&gt;Addressing the causes succinctly now would likely mean this never gets posted. It’s far from unimportant, but writing something &lt;strong&gt;now&lt;/strong&gt; is more important. This post is an attempt to restart the fires, that these words siphon out more.&lt;/p&gt;
</content:encoded></item><item><title>Save £23,265 with one weird trick!</title><link>https://thepcspy.com/read/ten-years-23k-saved/</link><guid isPermaLink="true">https://thepcspy.com/read/ten-years-23k-saved/</guid><description>&lt;p&gt;Tobacconists hate him.&lt;/p&gt;
</description><pubDate>Wed, 20 Jul 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Tobacconists hate him.&lt;/p&gt;
 &lt;p&gt;It’s that time of the year. I never really know who this sort of post is &lt;em&gt;for&lt;/em&gt;. Maybe it’s for you, maybe for it’s for me one dark day in the future, but…&lt;/p&gt;
&lt;h2 id=&quot;i-stopped-smoking-ten-years-ago&quot;&gt;🎉&amp;nbsp;&amp;nbsp;&lt;a href=&quot;https://thepcspy.com/read/breaking-the-habit/&quot;&gt;I stopped smoking&lt;/a&gt; &lt;em&gt;&lt;strong&gt;ten years&lt;/strong&gt;&lt;/em&gt; ago!&lt;/h2&gt;
&lt;p&gt;If somebody as flimsy-willed as me can stop smoking, &lt;em&gt;&lt;strong&gt;you can stop smoking too&lt;/strong&gt;&lt;/em&gt;. I’m not going to labour the “it kills you” thing, but it is so here’s the financial breakdown for any fellow cheapskates.&lt;/p&gt;
&lt;div class=&quot;rim&quot;&gt;&lt;pre class=&quot;language-text&quot; data-language=&quot;text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;  10 years =  3,652 days
   @13/day = 47,476 cigs
           =  2,374 packs

2012 price =  £7.10 /pack
2022 price = £12.50 /pack
Mean price =  £9.80 /pack&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;I’ve not smoked &lt;strong&gt;£23,265.20&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;If I’d regularly deposited that into an investment account, a 2% return that would be £25k and 5% would be almost £30k.&lt;/p&gt;
&lt;p&gt;I’d say I feel fantastic but I &lt;em&gt;am&lt;/em&gt; also ten years older. I gained two children a dog, and everything hurts. &lt;strong&gt;But I don’t smoke&lt;/strong&gt;. I don’t feel the urge to smoke, and haven’t for years. I never have to stand outdoors on cold, wet nights to smoke. I don’t panic when I’m running out of cigarettes. And that means a lot.&lt;/p&gt;
&lt;h2 id=&quot;its-easier-to-just-not-smoke&quot;&gt;It’s easier to &lt;em&gt;just not smoke&lt;/em&gt;&lt;/h2&gt;
&lt;p&gt;You might not be convinced and that’s because we’re all told &lt;em&gt;it’s really hard to stop smoking&lt;/em&gt;. All the time. Even by people who want smokers to quit, as if it’s something that takes a run-up, an intake of bravery and team-cajoling. It’s not hard; just stop smoking the bloody things.&lt;/p&gt;
&lt;p&gt;The rest is understanding your body and addiction, that smoking never made you feel better, it only made &lt;em&gt;not smoking&lt;/em&gt; feel worse. As soon as you cut that cycle, your body recalibrates. As soon as you realise that, the infinitesimal cost of quitting seems worth it.&lt;/p&gt;
&lt;p&gt;If you’re trying to quit and you’re not finding it easy, stick with it. If you need help understanding addiction, &lt;a href=&quot;https://www.amazon.co.uk/dp/0615482155&quot;&gt;Allen Carr’s Easy Way to Stop Smoking&lt;/a&gt; has an eerily convincing narrative that plods through the feelings every smoker goes through. I never finished it —I convinced myself I didn’t want to quit— but it was absolutely the basis for the voice in my head that let me quit later on.&lt;/p&gt;
</content:encoded></item></channel></rss>