<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Matt Gauger</title>
    <description>Personal blog of Matt Gauger.
</description>
    <link>https://blog.mattgauger.com/</link>
    <atom:link href="https://blog.mattgauger.com/atom.xml" rel="self" type="application/rss+xml"/>
    <pubDate>Tue, 09 Dec 2025 18:48:49 -0600</pubDate>
    <lastBuildDate>Tue, 09 Dec 2025 18:48:49 -0600</lastBuildDate>
    <generator>Jekyll v4.3.4</generator>
    
      <item>
        <title>My most useful tools of 2025</title>
        <description>&lt;p&gt;Besides updating the &lt;a href=&quot;https://blog.mattgauger.com/about/&quot;&gt;About page&lt;/a&gt;, I wanted to start writing again about the various tools and solutions I’m using more frequently. Lately, the tools are more in the physical realm than in software. (But I will note here, that 2025 is finally the year that I switched to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;neovim&lt;/code&gt; for myself instead of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;vim&lt;/code&gt;. More on this at the end of the list.)&lt;/p&gt;

&lt;h2 id=&quot;slice-10512-pen-cutter&quot;&gt;Slice 10512 Pen Cutter&lt;/h2&gt;

&lt;p&gt;I’ve tried carrying EDC pocket knives for opening boxes, and I’ve tried stocking cheap scissors in drawers all over the house. In the end, the best way to open boxes turns out to be these ceramic-bladed box openers from Slice. The blades aren’t sharp enough to cut a finger, but they will open tape, including that tricky tape that has threads in it. When you let go, the blade retracts, and can’t poke you when you reach into a pocket or a drawer. It sounds basic, but given how much I get shipped to me for convenience, this has been one of my top tools for the last few years.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/2025-12-09/slice-10512-512.png&quot; alt=&quot;A Slice 10512 Pen Cutter with the blade extended&quot; class=&quot;center-thumb&quot; loading=&quot;lazy&quot; /&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;magnetic-parts-bowls&quot;&gt;Magnetic parts bowls&lt;/h2&gt;

&lt;p&gt;I try to fix things myself when I can. If you DIY stuff, you’ve probably run into this problem: screws like to roll off surfaces and disappear. I got tired of this, and since most screws are made from ferrous metal, these little magnetic parts bowls solve the problem for me. I’ve got a few upstairs near where I practice guitar and where my home office desk is, and a few more downstairs on my work bench. Conveniently, the magnet in the base will also make the bowl stick to anything iron or steel, too, so I tend to be able to “plunk” down a bowl on something like a desk frame or my work bench vise, and know that all the screws for a project will stay in there. (Provided they’re ferrous.) Compared to random jars or recycled plastic dishes full of screws, this feels like a big upgrade for me, and so that is why this item is second on my list for 2025. There’s lots of variations of these available online or at your local stores – I recommend trying to find them in the local hardware store.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/2025-12-09/mag-parts-bowl-512.jpg&quot; alt=&quot;A stack of parts bowls with some bolts in the top bowl&quot; class=&quot;center-thumb&quot; loading=&quot;lazy&quot; /&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;wowstick-electric-screwdriver&quot;&gt;Wowstick electric screwdriver&lt;/h2&gt;

&lt;p&gt;Even with several complete small screwdriver sets and an electric drill that can fit screwdriver bits, I wanted something small that I could keep in my office and use for screwdriver tasks. I imagined it could help with taking apart keyboards or computers, and maybe occasionally for DIY projects around the house. About a year ago, I’d read several reviews of these Wowstick electric screwdrivers online and decided to buy one. I’m not sure exactly what model mine is, but it is larger than a pen and much smaller than most full-sized (analog) screwdriver handles that I have. It came with a large number of screw bit tips, which are unfortunately a smaller hex head size than the typical screwdriver tips. But along with my ifixit magnetic screwdriver set, I’ve got just about any type of screw covered. The Wowstick screw driver charges with Type-C USB, and due to the planetary gear box, it seems fine to just use it like an analog screwdriver by turning the whole screwdriver body, to get stubborn screws unstuck. It also helps me to not over-torque screws on things like small custom keyboards and prevents stripping out heads on tiny laptop screws.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/2025-12-09/wowstick-512.jpg&quot; alt=&quot;A pen-sized electric screwdriver with several tubes of screwdriver tips, a work mat, and a carrying case&quot; class=&quot;center-thumb&quot; loading=&quot;lazy&quot; /&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;field-notes-notebooks&quot;&gt;Field Notes notebooks&lt;/h2&gt;

&lt;p&gt;I’ve collected notebooks for a long time, but most of the journal-sized notebooks are too large to carry around all the time. The typical Field Notes softcover notebook fits in a jeans pocket with a pen. Because I can always have one with me, these have become handy for me to use for all sorts of quick notes, daily TODO lists, for drawing out diagrams and jotting down measurements as I’m working on something. There’s all kinds of special editions of these, but I generally tend to use either basic dot grid notebooks or their TODO list variant. I can recommend these highly for the cost over other little pocket notebooks – they’re just durable enough that after using them daily for a full notebook’s worth, the covers and spines are just broken in, but they don’t start falling apart like cheaper notebooks or spiral-bound pocket notebooks.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/2025-12-09/field-notes-512.jpg&quot; alt=&quot;A Field Notes notebook with a sleeve indicating it is the Dot-graph paper version&quot; class=&quot;center-thumb&quot; loading=&quot;lazy&quot; /&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;neovim&quot;&gt;Neovim&lt;/h2&gt;

&lt;p&gt;The only software on this list, and the only free thing. Neovim is a modern &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;vim&lt;/code&gt;. I’ve been primarily a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;vim&lt;/code&gt; user for the last 10 years (with side quests into &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;emacs&lt;/code&gt; for Clojure, Lisp/Scheme and then to use &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;org-mode&lt;/code&gt;). I made the switch to &lt;a href=&quot;https://neovim.io/&quot;&gt;Neovim&lt;/a&gt; recently because I’d seen how powerful &lt;a href=&quot;https://microsoft.github.io/language-server-protocol/&quot;&gt;Language Server Protocol&lt;/a&gt; (LSP) was for Rust development in VS Code, but I wanted it in my usual &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;vim&lt;/code&gt; editor. LSP will show you problems beyond simple syntax errors, right in your editor buffer, including compile and type errors, incorrect function names, and names of functions that are correct but aren’t imported to the current scope. I’m running a very minimal setup that still gets me LSP support for most things out of the box, and it has been great. I can highly recommend the switch if you’re already familiar with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;vim&lt;/code&gt;.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;That’s a wrap on 2025. Happy new year, everyone.&lt;/p&gt;
</description>
        <pubDate>Tue, 09 Dec 2025 18:44:00 -0600</pubDate>
        <link>https://blog.mattgauger.com/2025/12/09/my-most-useful-tools-of-2025/</link>
        <guid isPermaLink="true">https://blog.mattgauger.com/2025/12/09/my-most-useful-tools-of-2025/</guid>
        
        
      </item>
    
      <item>
        <title>My Ship of Theseus laptop: the 51nb X210</title>
        <description>&lt;p&gt;I’ve had several Linux laptops over the years, but I haven’t blogged about most of them because I don’t consider myself a hardware reviewer and others typically review laptops much better than I could. I’ve always had an interest in small laptops that I can bring everywhere. My first laptop was a Powerbook G4 12” in college, and I’ve been chasing the ergonomics of having a small 12” laptop with me at all times ever since. Rather than talk about the Linux laptops I’ve tried and gotten rid of, I wanted to write this to cover a rather unique Linux laptop that I now have.&lt;/p&gt;

&lt;h2 id=&quot;background-on-the-x201&quot;&gt;Background on the X201&lt;/h2&gt;

&lt;p&gt;In 2010, Lenovo revamped the Thinkpad X200, which had a Core 2 Duo processor, into the Thinkpad X201. Compared to today, compact laptop designs like the X201 still carried a chunky shape with an array of ports. These laptops had keyboards with actual key travel and a trackpoint for pointing. They still had full size ports for VGA, ethernet, and an externally accessible drive bay. But the X201 laptops also ran some of the first Intel Core processors, replacing the hot and slow Core 2 Duos of the past. The X201 laptops were very portable, very light, and they had all the durability of IBM/Lenovo Thinkpads. This was also an era when laptops were still expected to have an internal optical disk, and many reviews of the X201 from this era mention this tradeoff that the X201 didn’t have one. Today, there are few laptops with an internal optical disk and so the choice makes more sense.&lt;/p&gt;

&lt;p&gt;To go one step further from what we expect, this laptop has a removable battery. That’s almost unheard of in 2022!&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/images/2022-08-01-X210/lenovo_x201-resized.jpg&quot;&gt;&lt;img src=&quot;/images/2022-08-01-X210/lenovo_x201-thumb.jpg&quot; alt=&quot;Lenovo X201 laptop product image&quot; class=&quot;center-thumb&quot; loading=&quot;lazy&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For this particular platform, an enthuasist group in China called 51nb decided to make a modern motherboard with 8th-gen Intel processors. The group has been working on retrofitting older Thinkpads with newer internals for some time before this project. They dubbed this upgraded laptop the 51nb X210. In addition to the 8th-gen Intel CPUs, the new motherboard replaces the Expresscard slot with a Mini Display Port and upgrades two USB ports to USB 3.0, but keeps most of the original ports intact and working. Newer, higher resolution displays became available by the addition of another display connector on the motherboard – the X201 only shipped with a 1366x768 display and only a few rarer X200s models shipped with 1440x900 displays.&lt;/p&gt;

&lt;p&gt;The design got some attention outside of the group, ending up on places like Hacker News and Lobsters, where I became aware of it back in 2018 or so. In total, 51nb produced 3 batches of motherboards that were then either sold bare or put into laptops. The company &lt;a href=&quot;https://www.xyte.ch&quot;&gt;XY Tech&lt;/a&gt; would eventually revise the design with 10th-gen Intel CPUs, some new ports, and even more display options, dubbing their batch the X2100.&lt;/p&gt;

&lt;h2 id=&quot;how-i-found-one&quot;&gt;How I found one&lt;/h2&gt;

&lt;p&gt;While I never felt compelled to order a custom built X210 from 51nb, I kept an eye out online for them. My interest dropped for awhile (pandemic, and so on) until I was looking to replace my personal laptop earlier this year. I ended up finding an X210 on the thinkpadsforsale subreddit, and purchased it off of the specs (i5, an nvme SSD, the x200s 1440x900 screen swapped in) and some photos that didn’t really show the condition. The 8th-gen Intel i5’s are, in my opinion, still decent CPUs. They are relatively power efficient and run cool enough on battery for a laptop, but are powerful enough to use for programming tasks. This turns out to be my second Thinkpad ever.&lt;/p&gt;

&lt;h2 id=&quot;sidebar-my-x1-extreme&quot;&gt;Sidebar: my X1 Extreme&lt;/h2&gt;

&lt;p&gt;I had a refurbished Thinkpad X1 Extreme (gen 1) for several years after its introduction in 2018, and I had purchased it thinking (at the time) that I’d use the Nvidia graphics card for ML and data science work. Early on with the X1 Extreme, I realized a laptop with a hexacore Intel CPU and a discrete graphics card was both power-hungry and had quirks on Linux, like requiring a full reboot to switch graphics mode. It took several years for the Linux kernel improve support for this laptop, at which point I’d mostly abandoned trying to use a laptop for browsing, gaming, or consuming videos – I default to my phone these days. Only in the last 2 years have things like the fingerprint reader on the X1 Extreme started working. It was oddly a computer that got better with age – at least on Linux – as compared to most computers which get slower and worse the older they are. In the end, I decided it was just too overkill with its hungry CPU, graphics card, and 15” 4K touchscreen – just too much to carry around.&lt;/p&gt;

&lt;h2 id=&quot;my-x210&quot;&gt;My X210&lt;/h2&gt;

&lt;p&gt;The X210, by contrast, worked almost perfectly in Linux out of the box with a fresh install of PopOS 22.04 LTS. It slept and woke up fine, TLP configured power savings (and I pulled a few more tweaks from powertop), wifi was stable, and the special keys for screen brightness and volume all worked in Linux. All things you would expect out of a Thinkpad. I upgraded the BIOS and firmwares according to the instructions on the GitHub repo &lt;a href=&quot;https://github.com/harrykipper/x210&quot;&gt;harrykipper/x210&lt;/a&gt;, but I did not choose to install Coreboot at this time. Coreboot does work on this laptop thanks to work done by Matthew Garrett.&lt;/p&gt;

&lt;p&gt;Early on, after the TLP+powertop tweaks, I set it up for the day running on only the battery-of-unknown-health and queued up a session with emacs, Firefox running a Youtube lofi stream (which also kept it from sleeping), and a few processes in a terminal emulator. I ended up letting it run (without sleeping) for over 9 hours before I declared the battery life test a success. Granted, I wasn’t using it all day in that state, but I did use it after work in the evening to browse the web and read some PDF papers while the test was still ongoing. I’m fairly certain that a brand new replacement battery would have even more runtime, but I haven’t felt compelled to try it. I did run into issues trying to find a new-old-stock Lenovo battery that charged in this device, because I wanted to have a spare, but I am not sure why.&lt;/p&gt;

&lt;p&gt;The size is comparable to a 13” Macbook Air (I had a mid-2013 MBA to compare it to), but much thicker at the hinge end. It feels sturdy, but it is not quite as rigid as the unibody laptops made now, and the keyboard being essentially a sheet metal tray does allow for some keyboard flex if you type hard or push on it.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/images/2022-08-01-X210/IMG_6462-resized.jpg&quot;&gt;&lt;img src=&quot;/images/2022-08-01-X210/IMG_6462-thumb.jpg&quot; alt=&quot;My X210 with PopOS running on the display&quot; class=&quot;thumb&quot; loading=&quot;lazy&quot; /&gt;&lt;/a&gt;
&lt;a href=&quot;/images/2022-08-01-X210/IMG_6460-resized.jpg&quot;&gt;&lt;img src=&quot;/images/2022-08-01-X210/IMG_6460-thumb.jpg&quot; alt=&quot;My X210 with PopOS running on the display&quot; class=&quot;thumb&quot; loading=&quot;lazy&quot; /&gt;&lt;/a&gt;
&lt;a href=&quot;/images/2022-08-01-X210/IMG_6457-resized.jpg&quot;&gt;&lt;img src=&quot;/images/2022-08-01-X210/IMG_6457-thumb.jpg&quot; alt=&quot;My X210 with s-tui running on the display&quot; class=&quot;thumb&quot; loading=&quot;lazy&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class=&quot;clearfix&quot;&gt;&lt;/div&gt;

&lt;p&gt;This laptop has been really fun to work on. You only need a #0 Philips screwdriver – no special lobed bits. Few laptops these days can really be opened up: Most laptops now feature RAM soldered to the motherboard. This laptop, by contrast, has now been opened up several times in which I’ve removed everything down to the chassis and motherboard for inspection or upgrade. Just having a battery and externally-accessible hard drive slot is very satisfying. The keyboard is held in by several screws on the bottom, along with the palm rest, and once those are removed, more screws allow the motherboard to be removed if you so wish, leaving the display cables and a small x201-original daughterboard with audio jacks, a USB 1.0 port, and a slow SD card reader.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/images/2022-08-01-X210/IMG_6450-resized.jpg&quot;&gt;&lt;img src=&quot;/images/2022-08-01-X210/IMG_6450-thumb.jpg&quot; alt=&quot;Beginning disassembly: removing the battery&quot; class=&quot;thumb&quot; loading=&quot;lazy&quot; /&gt;&lt;/a&gt;
&lt;a href=&quot;/images/2022-08-01-X210/IMG_6455-resized.jpg&quot;&gt;&lt;img src=&quot;/images/2022-08-01-X210/IMG_6455-thumb.jpg&quot; alt=&quot;Disassembly: accessing the RAM&quot; class=&quot;thumb&quot; loading=&quot;lazy&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class=&quot;clearfix&quot;&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href=&quot;/images/2022-08-01-X210/IMG_6452-resized.jpg&quot;&gt;&lt;img src=&quot;/images/2022-08-01-X210/IMG_6452-thumb.jpg&quot; alt=&quot;Disassembly: removing the keyboard&quot; class=&quot;thumb&quot; loading=&quot;lazy&quot; /&gt;&lt;/a&gt;
&lt;a href=&quot;/images/2022-08-01-X210/IMG_6504-resized.jpg&quot;&gt;&lt;img src=&quot;/images/2022-08-01-X210/IMG_6504-thumb.jpg&quot; alt=&quot;Disassembly: palm rest removed&quot; class=&quot;thumb&quot; loading=&quot;lazy&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class=&quot;clearfix&quot;&gt;&lt;/div&gt;

&lt;p&gt;I cannot say that the condition of the laptop I received matched my hopes, however. I know this is a 2010-era device/chassis, and there are almost no new-old-stock parts available for them anymore. It is important to remember that most of the parts comprising this laptop have likely been used for a decade or more.&lt;/p&gt;

&lt;p&gt;My particular laptop had a worn keyboard that seemed to have been bent down around the Q key. The keyboard also had accrued years of gunk and someone’s pet’s hair. The laptop smelled suspiciously strong, as if some previous owner had both chain-smoked cigarettes and sprayed burnt incense. Some cleaning with alcohol on the surfaces of the chassis helped a bit with the smell, but replacing the keyboard became my top priority. While I was at it, I also found a new-old stock palm rest on eBay for an x200/x201 that did not have a fingerprint reader. The old fingerprint readers don’t work with this particular 51nb motherboard, as far as I can tell, so it was no loss for a cleaner palm rest.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/images/2022-08-01-X210/IMG_6503-resized.jpg&quot;&gt;&lt;img src=&quot;/images/2022-08-01-X210/IMG_6503-thumb.jpg&quot; alt=&quot;Original condition of laptop: worn keyboard and cracked palm rest&quot; class=&quot;thumb&quot; loading=&quot;lazy&quot; /&gt;&lt;/a&gt;
&lt;a href=&quot;/images/2022-08-01-X210/IMG_6506-resized.jpg&quot;&gt;&lt;img src=&quot;/images/2022-08-01-X210/IMG_6506-thumb.jpg&quot; alt=&quot;Booting with the new keyboard&quot; class=&quot;thumb&quot; loading=&quot;lazy&quot; /&gt;&lt;/a&gt;
&lt;a href=&quot;/images/2022-08-01-X210/IMG_6507-resized.jpg&quot;&gt;&lt;img src=&quot;/images/2022-08-01-X210/IMG_6507-thumb.jpg&quot; alt=&quot;New keyboard and palm rest completed&quot; class=&quot;thumb&quot; loading=&quot;lazy&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class=&quot;clearfix&quot;&gt;&lt;/div&gt;

&lt;p&gt;The new keyboard that I got does have some wear (it seems that there are no new “classic” keyboards from this era out there, so everything was removed from another laptop), but it feels great. It is more solid and the key travel feels nicer than the one it replaced.&lt;/p&gt;

&lt;p&gt;I could have replaced the SSD at the same time as the keyboard and the palm rest, but it actually waited until I found the right SSD, and I opened it up again for that change. The Samsung 970 Evo Plus is as fast as the PCI lanes in the nvme interface can handle here, so no need to buyer a faster SSD. Once again, it was fun to be able to open up a computer and “do a little work on it.”&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/images/2022-08-01-X210/IMG_6657-resized.jpg&quot;&gt;&lt;img src=&quot;/images/2022-08-01-X210/IMG_6657-thumb.jpg&quot; alt=&quot;The laptop opened up to the motherboard, with the SSD replaced&quot; class=&quot;center-thumb&quot; loading=&quot;lazy&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There is still a missing cover where the Expresscard used to be (and the Mini Display Port now resides), and I have a plan to eventually model and 3D print a plate to cover that area, but haven’t done it yet.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/images/2022-08-01-X210/IMG_6655-resized.jpg&quot;&gt;&lt;img src=&quot;/images/2022-08-01-X210/IMG_6655-thumb.jpg&quot; alt=&quot;A close up of the side of the laptop where the missing port cover over the old Expresscard slot is&quot; class=&quot;center-thumb&quot; loading=&quot;lazy&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I’ve also since bought another X200s 1440x900 display – the one that came in mine does have a dead pixel and some sort of pattern from the backlight. Besides the particular flaws of the existing display, I believe these are old TN TFT displays – very directional, and with a bit of what I’d call “backlight bleed” compared to the display we are used to now.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/images/2022-08-01-X210/IMG_6646-resized.jpg&quot;&gt;&lt;img src=&quot;/images/2022-08-01-X210/IMG_6646-thumb.jpg&quot; alt=&quot;The old display showing a blank white background, dead pixels and backlight blemish present&quot; class=&quot;thumb&quot; loading=&quot;lazy&quot; /&gt;&lt;/a&gt;
&lt;a href=&quot;/images/2022-08-01-X210/IMG_6654-resized.jpg&quot;&gt;&lt;img src=&quot;/images/2022-08-01-X210/IMG_6654-thumb.jpg&quot; alt=&quot;Testing the new display by plugging it into the motherboard, with keyboard removed&quot; class=&quot;thumb&quot; loading=&quot;lazy&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class=&quot;clearfix&quot;&gt;&lt;/div&gt;

&lt;p&gt;I had hoped to put in a &lt;a href=&quot;https://www.xyte.ch/mods/x210-x2100/#display&quot;&gt;3000x2000 display panel sold by XY Tech&lt;/a&gt;, and I discussed this with them. But it turns out the particular revision of my laptop does not have the right connectors on the motherboard. There are a few panels in 1080p resolution that I could upgrade to, but as mentioned in &lt;a href=&quot;https://geoff.greer.fm/2019/03/04/thinkpad-x210/&quot;&gt;Geoff Greer’s review&lt;/a&gt;, the panel is just slightly larger than the stock bezel. I have not decided on whether to try the 1080p upgrade, but the upgrade in resolution, the backlight brightness, and IPS panel technology would probably make a big difference.&lt;/p&gt;

&lt;p&gt;The second 1440x900 display (from another X200s) from eBay worked fine and had no dead pixels or backlight blemishes, so I’ve since swapped it in, too. Anyone want a spare, beat up X200s display?&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/images/2022-08-01-X210/IMG_6660-resized.jpg&quot;&gt;&lt;img src=&quot;/images/2022-08-01-X210/IMG_6660-thumb.jpg&quot; alt=&quot;The laptop with the display fully removed and motherboard exposed&quot; class=&quot;thumb&quot; loading=&quot;lazy&quot; /&gt;&lt;/a&gt;
&lt;a href=&quot;/images/2022-08-01-X210/IMG_6669-resized.jpg&quot;&gt;&lt;img src=&quot;/images/2022-08-01-X210/IMG_6669-thumb.jpg&quot; alt=&quot;The laptop with the new display installed&quot; class=&quot;thumb&quot; loading=&quot;lazy&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class=&quot;clearfix&quot;&gt;&lt;/div&gt;

&lt;h2 id=&quot;usage&quot;&gt;Usage&lt;/h2&gt;

&lt;p&gt;I’ve talked about how neat it is to be able to service the laptop rather than have a laptop that is sealed shut and all soldered together. But what do I think about it as a daily driver? It’s perfectly capable, as I said, of all the kinds of tinkering with programming that I do on a personal machine. For me, that means running a few emacs windows, Firefox with a bunch of tabs, and a few terminal programs in Alacritty. Lately, I’ve also been getting back into 3D printing and running PrusaSlicer. The X210 is a good little laptop for carrying around the house by the extended cell battery, which forms a sort of handle. The keyboard is extremely satisfying – I still prefer a mechanical keyboard for my daily work at a desk, but this is much, much better than the keyboards you get in Apple laptops or modern Thinkpads.&lt;/p&gt;

&lt;p&gt;That all said, I didn’t end up moving my personal programming environment fully to this laptop and getting it set up as my “main” computer.  that kept me from treating this install as something I wanted to “set up” fully and get keys onto GitHub for.&lt;/p&gt;

&lt;p&gt;The X210 will drive a larger display through its Mini DisplayPort, but I am not in the habit of keeping the extra cable around on my desk and swapping keyboard/mouse to it. (And my 4K display doesn’t particularly like HDMI signals or something about the mDP-&amp;gt;HDMI cable, but that’s a different issue.) I’d much prefer to be able to swap a personal laptop in to my “work” desk setup – plugging in the single Type-C connector that goes to my Thunderbolt dock, and then out to my monitor, keyboard, a mouse, and a nice webcam for video meetings. When mobile, I prefer a higher DPI screen, and the particular X210 I have can only really support a 1080p display upgrade.&lt;/p&gt;

&lt;p&gt;The wifi is somewhat slow compared to a new laptop, measuring at only around 25 mbps down. I happened to test the wifi speed after I replaced the display, to make sure the antenna cables had been seated. But I didn’t get a speed test before that. It is possible that the wifi card can be upgraded, like most things on this laptop, but the speed is “good enough” right now – I am not using this laptop for video calls, and the Linux driver support for the Intel card is good.&lt;/p&gt;

&lt;p&gt;There a few fun features that you won’t find on modern laptops, like the Thinklight instead of a backlit keyboard, and the ability to open the screen hinge all the way flat.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/images/2022-08-01-X210/IMG_6474-resized.jpg&quot;&gt;&lt;img src=&quot;/images/2022-08-01-X210/IMG_6474-thumb.jpg&quot; alt=&quot;X210 with the Thinklight illuminating the keyboard&quot; class=&quot;thumb&quot; loading=&quot;lazy&quot; /&gt;&lt;/a&gt;
&lt;a href=&quot;/images/2022-08-01-X210/IMG_6665-resized.jpg&quot;&gt;&lt;img src=&quot;/images/2022-08-01-X210/IMG_6665-thumb.jpg&quot; alt=&quot;X210 doing the classic Thinkpad thing where the screen is opened 180 to be flat with the keyboard&quot; class=&quot;thumb&quot; loading=&quot;lazy&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class=&quot;clearfix&quot;&gt;&lt;/div&gt;

&lt;p&gt;Will I keep the X210? For the time being, yes, it’s a neat little laptop to tinker with. I do have some concerns – mostly around the fact that the motherboards are not available anymore, and some people have had issues with shorting or mechanical stress from carrying the laptop in a backpack or similar. Everything else on it can basically be replaced with relatively-cheap used parts from eBay and I have already replaced a long list of things, which is why I’ve decided to give it the hostname ‘theseus’ after the &lt;a href=&quot;https://en.wikipedia.org/wiki/Ship_of_Theseus&quot;&gt;Ship of Theseus&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you’re interested in something similar, your best bet is to reach out to XY Tech, as I understand they’re continuing to find ways to make various old Thinkpad models new again.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/images/2022-08-01-X210/IMG_6674-resized.jpg&quot;&gt;&lt;img src=&quot;/images/2022-08-01-X210/IMG_6674-thumb.jpg&quot; alt=&quot;A final beauty shot of the X210 outside on a step in the sunlight&quot; class=&quot;center-thumb&quot; loading=&quot;lazy&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;References / more info:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://pcper.com/2018/07/51nb-thinkpad-x210-mod-review-from-an-alternate-reality/&quot;&gt;51nb ThinkPad X210 Mod Review: From an Alternate Reality&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://geoff.greer.fm/2019/03/04/thinkpad-x210/&quot;&gt;Geoff Greer - Thinkpad X210 review&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://bmdiethelmv.wordpress.com/2021/07/02/thinkpad-x2100-review/&quot;&gt;Benjamín Diethelm-Varela’s website: ThinkPad X2100 Review&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/harrykipper/x210&quot;&gt;harrykipper/x210: Collection of patches and mods for the 51nb x210&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.xyte.ch/mods/x210-x2100/&quot;&gt;XY Tech mods for X210/X2100&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Mon, 01 Aug 2022 00:00:00 -0500</pubDate>
        <link>https://blog.mattgauger.com/2022/08/01/the-51nb-x210/</link>
        <guid isPermaLink="true">https://blog.mattgauger.com/2022/08/01/the-51nb-x210/</guid>
        
        
      </item>
    
      <item>
        <title>A bit of cleanup for smaller, faster pages</title>
        <description>&lt;p&gt;I’ve now completed a pass at removing the Flickr images from this blog (many of which no longer rendered) and made a few other changes. There were several posts that used embedded Gists as a way to get syntax highlighting and a download link for each file. In the spirit of using less bandwidth, consuming less energy, and working better on mobile devices and everywhere else, I removed the inline script tags in favor of preprocessing syntax highlighting with &lt;a href=&quot;https://github.com/rouge-ruby/rouge&quot;&gt;Rouge&lt;/a&gt;. It turns out that the syntax hightlighting was already built into the version of Jekyll that I was using for this blog, I just hadn’t used it everywhere.&lt;/p&gt;

&lt;p&gt;In addition to moving the images off Flickr, I pre-processed them with a small script and imagemagick so that the blog posts display smaller thumbnails, intended to be faster to load on mobile. The images lazy load, if the browser supports it, without any external JS, by using the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;loading=&quot;lazy&quot;&lt;/code&gt; attr in the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;img&lt;/code&gt; tag. Each image links to a larger version, but the larger images have also been resized to a vertical height of 1080 pixels and compressed slightly to make them faster to load. Each replaced Flickr image also does not have to load a JS script tag from Flickr to render, which adds to the page size savings.&lt;/p&gt;

&lt;p&gt;The images were preprocessed with &lt;a href=&quot;https://github.com/mathias/mathias.github.com/blob/b6320db86eabb5dc0ac1a0dad220a065616eecc9/bin/prepare-image-directory.sh&quot;&gt;this script&lt;/a&gt;. Note: it is destructive to the originals in the directory where it is run.&lt;/p&gt;

&lt;p&gt;In the case of the removed Gists, that added up to over 100 script tags removed from at least 7 blog posts. Since each script tag must be separately requested and run by the browser on every page load of one of those pages, this realizes a savings in bandwidth and clientside processing time.&lt;/p&gt;

&lt;p&gt;As of September 2021, this page also does not have any Google Analytics embedded in it. This means I get a bit less info from Google Analytics. (But in all honesty, I was not tracking it very closely there.) But more importantly, it is one less script to run and network request for the tracking JS to make, and it is better for readers’ privacy.&lt;/p&gt;

&lt;p&gt;I didn’t measure the page sizes or load times before making these changes, but afterwards, I have measured these pages locally in Firefox with all assets (including scrolling to load all lazy-loaded images):&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;| Page                                                         | Size   | Requests    | Notes                       |
|--------------------------------------------------------------+--------+-------------+-----------------------------|
| / (homepage)                                                 | 21 KB  | 4 requests  |                             |
| /2022/07/03/a-bit-of-cleanup-for-smaller-faster-pages/       | 16 KB  | 4 requests  |                             |
| /2022/06/17/another-year-another-keyboard-built/             | 258 KB | 17 requests | has many images             |
| /2014/10/23/clojure-data-science-sent-counts-and-aggregates/ | 65 KB  | 4 requests  | had many gists              |
| /2014/03/30/clojure-data-science-ingesting-your-gmail-inbox/ | 108 KB | 4 requests  | largest page of text/markup |
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
</description>
        <pubDate>Sun, 03 Jul 2022 16:41:00 -0500</pubDate>
        <link>https://blog.mattgauger.com/2022/07/03/a-bit-of-cleanup-for-smaller-faster-pages/</link>
        <guid isPermaLink="true">https://blog.mattgauger.com/2022/07/03/a-bit-of-cleanup-for-smaller-faster-pages/</guid>
        
        
      </item>
    
      <item>
        <title>Another year, another keyboard built</title>
        <description>&lt;p&gt;In 2021, I decided it was time to build another keyboard. While I am happy with my daily driver keyboard, I’m always interested in trying out new options. Occasionally, I will find myself interested in learning and practicing a new keyboard layout and spend some hours towards getting to a low WPM speed.&lt;/p&gt;

&lt;p&gt;I’ve been a happy user of the Atreus keyboard for years. The &lt;a href=&quot;/2014/08/19/atreus-my-custom-keyboard/&quot;&gt;original keyboard that I built in 2014&lt;/a&gt; came from a time period where the Atreus didn’t have a PCB yet, so it was hand wired, and I ordered the case from a company that could laser cut it from wood. The heart of that keyboard is a Teensy microcontroller, which was a good option at that time. The firmware is a custom one that &lt;a href=&quot;https://technomancy.us/&quot;&gt;technomancy&lt;/a&gt; wrote. (@technomancy also designed the original Atreus and all credit for it goes to him, I merely built it.)&lt;/p&gt;

&lt;p&gt;Between 2014 and last year, I’d also acquired the &lt;a href=&quot;https://shop.keyboard.io/products/keyboardio-atreus&quot;&gt;Keyboardio version of the Atreus&lt;/a&gt;, and it is a great keyboard! It became a sturdy, unique little keyboard with Keyboardio’s design tweaks, and the Keyboardio configuration tool made remapping much easier.&lt;/p&gt;

&lt;p&gt;Since then, the DIY keyboard community has made a lot of progress. One can design a keyboard entirely with software and have the circuit boards printed by online companies. For open source boards, you can often print your own circuit boards for a reasonable price. The microcontrollers are much better than what we had in the Arduino and Teensy days, although most modern MCUs used are similar. Most importantly, I think, the &lt;a href=&quot;https://qmk.fm/&quot;&gt;qmk firmware&lt;/a&gt; has made programming and remapping keyboards from source code much easier and faster.&lt;/p&gt;

&lt;p&gt;I’d always had an interest in the ergonomic benefits of a split keyboard, and the Atreus had convinced me that I was more interested in columnar layouts (where each column of keys is staggered to fit finger length, instead of staggered left-to-right in neat rows) than ortholinear keyboards (where the keys are in a strict grid, such as on the &lt;a href=&quot;https://olkb.com/collections/planck&quot;&gt;Planck keyboard&lt;/a&gt; that I own.)&lt;/p&gt;

&lt;p&gt;After doing some research, particularly on the &lt;a href=&quot;https://compare.splitkb.com/&quot;&gt;SplitKB comparison tool&lt;/a&gt;, I decided to build a SplitKB Kyria. The Kyria can be built with 34 to 50 keys, depending on whether you want two columns for the pinky finger, whether you want rotary encoders, and whether you want 2U thumb keys or 2 individual keys for the innermost thumb keys.&lt;/p&gt;

&lt;p&gt;I ordered a kit from SplitKB and despite shipping from Europe during the pandemic, it arrived quickly. If you’re reading this after around June 2022, then you may not have been aware, but global shortages of chips made for low stock of products like keyboard kits, and depending on country, imported packages sometimes sat in customs quarantine for a month or more.&lt;/p&gt;

&lt;p&gt;The kit was easy to assemble, and I’d recommend it if you have some soldering skills. The surface mount LEDs are perhaps the hardest part to solder, but you could build it without. In retrospect, I could do without the RGB under-lighting, but that’s just me.&lt;/p&gt;

&lt;p&gt;At this point, I’ll turn it over to showing the few photos I have from building the keyboard.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/images/2022-06-17-kyria/02-construction-resized.jpg&quot;&gt;&lt;img src=&quot;/images/2022-06-17-kyria/thumbs/02-construction.jpg&quot; alt=&quot;The Kyria kit in a cardboard box&quot; class=&quot;thumb&quot; loading=&quot;lazy&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/images/2022-06-17-kyria/03-construction-resized.jpg&quot;&gt;&lt;img src=&quot;/images/2022-06-17-kyria/thumbs/03-construction.jpg&quot; alt=&quot;A close up of assembling the Kyria circuit board&quot; class=&quot;thumb&quot; loading=&quot;lazy&quot; /&gt;&lt;/a&gt;
&lt;a href=&quot;/images/2022-06-17-kyria/04-construction-resized.jpg&quot;&gt;&lt;img src=&quot;/images/2022-06-17-kyria/thumbs/04-construction.jpg&quot; alt=&quot;A close up of assembling the Kyria circuit board&quot; class=&quot;thumb&quot; loading=&quot;lazy&quot; /&gt;&lt;/a&gt;
&lt;a href=&quot;/images/2022-06-17-kyria/05-elitec-micro-resized.jpg&quot;&gt;&lt;img src=&quot;/images/2022-06-17-kyria/thumbs/05-elitec-micro.jpg&quot; alt=&quot;Flashing the Elite C microcontroller&quot; class=&quot;thumb&quot; loading=&quot;lazy&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/images/2022-06-17-kyria/06-mcus-soldered-resized.jpg&quot;&gt;&lt;img src=&quot;/images/2022-06-17-kyria/thumbs/06-mcus-soldered.jpg&quot; alt=&quot;Microcontrollers soldered to Kyria circuit board halves&quot; class=&quot;thumb&quot; loading=&quot;lazy&quot; /&gt;&lt;/a&gt;
&lt;a href=&quot;/images/2022-06-17-kyria/07-mcus-soldered-resized.jpg&quot;&gt;&lt;img src=&quot;/images/2022-06-17-kyria/thumbs/07-mcus-soldered.jpg&quot; alt=&quot;Microcontrollers soldered to Kyria circuit board halves&quot; class=&quot;thumb&quot; loading=&quot;lazy&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/images/2022-06-17-kyria/08-assembly-resized.jpg&quot;&gt;&lt;img src=&quot;/images/2022-06-17-kyria/thumbs/08-assembly.jpg&quot; alt=&quot;Assembling Kyria case and circuit board half&quot; class=&quot;thumb&quot; loading=&quot;lazy&quot; /&gt;&lt;/a&gt;
&lt;a href=&quot;/images/2022-06-17-kyria/09-assembly-resized.jpg&quot;&gt;&lt;img src=&quot;/images/2022-06-17-kyria/thumbs/09-assembly.jpg&quot; alt=&quot;Key switches being fitted to the Kyria keyboard with a screw driver behind it&quot; class=&quot;thumb&quot; loading=&quot;lazy&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class=&quot;clearfix&quot;&gt;&lt;/div&gt;

&lt;p&gt;I chose the &lt;a href=&quot;https://colemakmods.github.io/mod-dh/&quot;&gt;Colemak-DH key layout&lt;/a&gt; over my previous &lt;a href=&quot;https://github.com/mathias/atreus-firmware/blob/capewell-modified/capewell-modified.json&quot;&gt;“Capewell modified” layout&lt;/a&gt; that I use on the Atreus, because Colemak-DH is far more common on other ergonomic layouts I could find, and there’s some small edge in statistical optimization to it. You can find my &lt;a href=&quot;https://github.com/mathias/kyria-layout/blob/main/mathias/keymap.c&quot;&gt;whole keymap with some ASCII art&lt;/a&gt; on my GitHub repo for my Kyria layout.&lt;/p&gt;

&lt;p&gt;I have two rotary encoders on my build, with one side functioning as a volume knob and the other side functioning as a scroll wheel. Pressing down (clicking) the left rotary knobs activates the mode that allows me to change between QWERTY and Colemak-DH, and to adjust the RGB under-lighting. All these features are well-supported by qmk and work great.&lt;/p&gt;

&lt;p&gt;I’m using a few qmk features like &lt;a href=&quot;https://github.com/qmk/qmk_firmware/blob/master/docs/mod_tap.md&quot;&gt;mod tap&lt;/a&gt; on the modifier keys so that &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Ctrl&lt;/code&gt; can function as &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Esc&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Alt&lt;/code&gt; can function as &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Enter&lt;/code&gt;. Due to this, I think I could be productive with even fewer keys, likely by removing the outer column and saving my pinky fingers the stretch. Those columns are only &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Tab&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Left Shift&lt;/code&gt;, and another &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Ctrl/Esc&lt;/code&gt; key on the left hand side, while the right does have a useful &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&apos;&quot;&lt;/code&gt; quote key that would need to move elsewhere. (The other two keys on the right, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Backspace&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Alt/Enter&lt;/code&gt;, are better handled by my thumb keys that do the same thing.) Additionally, I would remove the upper 1U thumb keys that expose &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;[&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;]&lt;/code&gt;, and the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Nav&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Fkeys&lt;/code&gt; layers. I don’t use those keys, so I could have built the thumb keys as 2U keys.&lt;/p&gt;

&lt;p&gt;My Kyria has gone through many different sets of key caps, and I find I still prefer the DSA profile over any others. (I do have a set of KAT Space Cadet key caps that I’ll have to build into something, eventually, because I think owning a Space Cadet style keyboard would be really fun and a nice nod towards my Lisp interests.)&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/images/2022-06-17-kyria/12-keycaps-resized.jpg&quot;&gt;&lt;img src=&quot;/images/2022-06-17-kyria/thumbs/12-keycaps-1.jpg&quot; alt=&quot;The original keycaps: a set of DSA Granite keys in grey colors&quot; class=&quot;thumb&quot; loading=&quot;lazy&quot; /&gt;&lt;/a&gt;
&lt;a href=&quot;/images/2022-06-17-kyria/11-keycaps-resized.jpg&quot;&gt;&lt;img src=&quot;/images/2022-06-17-kyria/thumbs/11-keycaps-2.jpg&quot; alt=&quot;Kyria on a table while fitting the &amp;quot;Buzz Lightyear&amp;quot; themed key cap set&quot; class=&quot;thumb&quot; loading=&quot;lazy&quot; /&gt;&lt;/a&gt;
&lt;a href=&quot;/images/2022-06-17-kyria/14-keycaps-resized.jpg&quot;&gt;&lt;img src=&quot;/images/2022-06-17-kyria/thumbs/14-keycaps.jpg&quot; alt=&quot;A set of dished key caps from Massdrop that I tried and removed&quot; class=&quot;thumb&quot; loading=&quot;lazy&quot; /&gt;&lt;/a&gt;
&lt;a href=&quot;/images/2022-06-17-kyria/15-keycaps-resized.jpg&quot;&gt;&lt;img src=&quot;/images/2022-06-17-kyria/thumbs/15-keycaps.jpg&quot; alt=&quot;The &amp;quot;Space Cadet&amp;quot; key caps on the Kyria in grey and blue. Some of the key caps have the Greek/math and logic symbols like the original Lisp Machine keyboards.&quot; class=&quot;thumb&quot; loading=&quot;lazy&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class=&quot;clearfix&quot;&gt;&lt;/div&gt;

&lt;p&gt;While I’m not using the Kyria as a daily driver for work, it feels great to type on and I have been enjoying working through &lt;a href=&quot;https://www.keybr.com&quot;&gt;keybr.com&lt;/a&gt; exercises to learn Colemak-DH. If I were to make any changes, I think I could get away without the extra pinky row. And occasionally I will curse the wires connected everything when they get in the way. This makes me look towards something like a wireless Corne or Ferris/Sweep keyboard, but that will have to be a project for another blog post.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/images/2022-06-17-kyria/16-keycaps-resized.jpg&quot;&gt;&lt;img src=&quot;/images/2022-06-17-kyria/thumbs/16-keycaps.jpg&quot; alt=&quot;Half of my split keyboard, today, with the white, green, purple, and red key cap set&quot; class=&quot;center-thumb&quot; loading=&quot;lazy&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class=&quot;clearfix&quot;&gt;&lt;/div&gt;
</description>
        <pubDate>Fri, 17 Jun 2022 07:54:00 -0500</pubDate>
        <link>https://blog.mattgauger.com/2022/06/17/another-year-another-keyboard-built/</link>
        <guid isPermaLink="true">https://blog.mattgauger.com/2022/06/17/another-year-another-keyboard-built/</guid>
        
        
      </item>
    
      <item>
        <title>More Elixir Code Quality Tools</title>
        <description>&lt;p&gt;The Elixir community is fast-moving, and there’s always new things to learn.  &lt;a href=&quot;https://github.com/asummers&quot;&gt;Andrew Summers&lt;/a&gt; wrote in to mention a few more tools that I didn’t cover in my &lt;a href=&quot;/2017/11/21/elixir-code-quality-tools/&quot;&gt;Elixir Code Quality Tools&lt;/a&gt; blog post:&lt;/p&gt;

&lt;h1 id=&quot;wobserver&quot;&gt;&lt;a href=&quot;https://github.com/shinyscorpion/wobserver&quot;&gt;wobserver&lt;/a&gt;&lt;/h1&gt;

&lt;p&gt;In my last post, I mentioned Erlang’s observer GUI. The Erlang observer runs as a small native app and charts things like memory used, BEAM process counts, supervisor trees, and more.&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;wobserver&lt;/code&gt; runs as a web app and shows the same kind of information in your browser. Best of all, you can add it as a Plug into your Phoenix or Plug-based web apps. There’s a lot of information available to explore. There’s also an API that you can integrate or build your own reporting and graphing around.&lt;/p&gt;

&lt;h1 id=&quot;list-dependencies-with-mix&quot;&gt;List dependencies with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;mix&lt;/code&gt;&lt;/h1&gt;

&lt;p&gt;In Clojure, we used &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;lein deps :tree&lt;/code&gt; to see a tree of all dependencies in Clojure. In Elixir, we can use the&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt; mix app.tree&lt;/code&gt; task to see a tree of all the dependencies in our current application. For example:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ mix app.tree
annotatex
├── elixir
├── logger
│   └── elixir
├── runtime_tools
├── guardian
... output truncated ...
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h1 id=&quot;see-outdated-dependencies-with-mix&quot;&gt;See outdated dependencies with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;mix&lt;/code&gt;&lt;/h1&gt;

&lt;p&gt;Outdated dependencies don’t always make themselves known. While following mailing lists for CVEs is important, I’d rather have a tool notify me  of new versions of a dependency. In Ruby, we can use &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gem outdated&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bundler outdated&lt;/code&gt; and even install tools like &lt;a href=&quot;https://github.com/rubysec/bundler-audit&quot;&gt;bundler-audit&lt;/a&gt;. With Elixir, we can use this task in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;mix&lt;/code&gt;. It outputs a table with color-coding, which I cannot fully reproduce here, so you’ll have to try it for yourself.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ mix hex.outdated
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h1 id=&quot;alias-mix-tasks&quot;&gt;Alias mix tasks&lt;/h1&gt;

&lt;p&gt;There’s several reasons to use task aliases. One is to rename a longer task name to something shorter, because that task is often run. The other is to combine two or more tasks into one alias so that you can run them in that order. This helps you to build workflows and repeat steps necessary for setup each time. This is documented in the excellent &lt;a href=&quot;https://hexdocs.pm/mix/Mix.html#module-aliases&quot;&gt;mix docs&lt;/a&gt;.&lt;/p&gt;

&lt;h1 id=&quot;wrapping-up&quot;&gt;Wrapping up&lt;/h1&gt;

&lt;p&gt;Thanks again to Andrew Summers for these suggestions. I hope that you find them useful. Have more that I’ve missed? &lt;a href=&quot;mailto:contact@mattgauger.com&quot;&gt;Get in touch&lt;/a&gt;, I’d love to hear from you.&lt;/p&gt;
</description>
        <pubDate>Fri, 29 Dec 2017 00:00:00 -0600</pubDate>
        <link>https://blog.mattgauger.com/2017/12/29/more-elixir-code-quality-tools/</link>
        <guid isPermaLink="true">https://blog.mattgauger.com/2017/12/29/more-elixir-code-quality-tools/</guid>
        
        
      </item>
    
      <item>
        <title>NaNoGenMo 2017</title>
        <description>&lt;p&gt;I participated in this year’s &lt;a href=&quot;https://nanogenmo.github.io/&quot;&gt;NaNoGenMo&lt;/a&gt;, writing a procedural generation script to output a “novel.” This event is inspired by the &lt;a href=&quot;http://nanowrimo.org/&quot;&gt;National Novel Writing Month&lt;/a&gt;, in which writers pen a novel in November. I am an avid follower of the &lt;a href=&quot;http://procedural-generation.tumblr.com/&quot;&gt;Procedural Generation tumblr&lt;/a&gt; and I jumped on the chance to join in when NaNoGenMo was covered.&lt;/p&gt;

&lt;p&gt;My idea was to write a script that generated stories about all the people passing through the LAX airport – who they were, where they were going, if they were from another country, how they were feeling, and so on. I called my project “Departures and Arrivals.” You can view it &lt;a href=&quot;https://github.com/mathias/destinations&quot;&gt;on GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I didn’t get started until around Thanksgiving, but that still left me plenty of time for this simple idea. The &lt;a href=&quot;https://github.com/mathias/destinations#journal&quot;&gt;dev journal&lt;/a&gt; in the README covers the development of my entry in more detail. In the end, I had gathered about 180 lines of data and wrote about 300 lines of code. There’s a lot of things I would’ve liked to improve.&lt;/p&gt;

&lt;p&gt;In particular, there’s not enough variety in the types of stories that the script can generate. and I would’ve liked to have it decide for some travelers to write small “sub-stories.” These would follow templates like “something goes wrong,” or “eating at a restaurant,” and have it go into detail there, procedurally-generating more details as it went. I also wanted to write some code that generated stories for the flight crews, the ground crew at the airport, and the employees of businesses.&lt;/p&gt;

&lt;p&gt;The code itself is not particularly spectacular. I chose Ruby due to my experience with it. I was able to identify a nice abstraction for inheritance – &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;DomesticPassenger&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;InternationalPassenger&lt;/code&gt; are subclasses of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Passenger&lt;/code&gt;, because they all share some common attributes like &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;name&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;There’s no testing to speak of, and I’d like to dig in a bit more about how procedural generation is unit tested. My guess is largely around ensuring it works without raising an exception, regardless of output, and also checking with the random seed set for particular behavior.&lt;/p&gt;

&lt;p&gt;Participating this year has given me a lot of ideas about how I might do procedural generation for content better in the future, as well as made me appreciate even more the procedurally-generated fiction/games that I’ve played. I’ll likely repeat this again next year.&lt;/p&gt;

&lt;p&gt;You can read my finished novel, &lt;a href=&quot;https://github.com/mathias/destinations/blob/master/departures.md&quot;&gt;Departures and Arrivals&lt;/a&gt; on GitHub.&lt;/p&gt;
</description>
        <pubDate>Fri, 01 Dec 2017 00:00:00 -0600</pubDate>
        <link>https://blog.mattgauger.com/2017/12/01/nanogenmo-2017/</link>
        <guid isPermaLink="true">https://blog.mattgauger.com/2017/12/01/nanogenmo-2017/</guid>
        
        
      </item>
    
      <item>
        <title>Elixir Code Quality Tools</title>
        <description>&lt;p&gt;My &lt;a href=&quot;/blog/2014/09/15/clojure-code-quality-tools/&quot;&gt;Clojure Code Quality Tools&lt;/a&gt; post remains one of the more popular articles on this blog. Since then, I’ve been writing a lot more Elixir code. I thought it’d be fun to write a similar post on what to use with the Elixir programming language.&lt;/p&gt;

&lt;p&gt;By default, Elixir will do a good job with pattern matching and unused functions warnings, as well as giving you deprecation warnings. But as you learn and progress in mastery of Elixir, you’ll want more feedback. That’s where code quality tools come in.&lt;/p&gt;

&lt;p&gt;As indicated in the original post, tools should help us follow best practices. The top issues I run into with Elixir code are checking my function signatures and pattern matching to ensure I’ve caught all cases, enforcing good style, and checking my code coverage. This post introduces 5 tools that are now a part of my Elixir workflow, depending on the project.&lt;/p&gt;

&lt;p&gt;This post will have less examples than the last, but you can refer to each project’s README to help you get started. Instead, I’ll cover why you might want to use each of these tools and what problems they solve.&lt;/p&gt;

&lt;h1 id=&quot;doctests&quot;&gt;&lt;a href=&quot;http://elixir-lang.org/getting-started/mix-otp/docs-tests-and-with.html#doctests&quot;&gt;doctests&lt;/a&gt;&lt;/h1&gt;

&lt;p&gt;Built in to Elixir itself, doctests are a simple way to couple examples of useage where your function definition lives, in the source. They define an example call from an &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;iex&lt;/code&gt; prompt, and show what the return should be. When you set up a simple test file in the suite to run doctests, it will automatically check that the examples match the actual function call response. All it takes is a test file such as:&lt;/p&gt;

&lt;div class=&quot;language-elixir highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;defmodule&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;Alohomora&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;ResourceTest&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt;
  &lt;span class=&quot;kn&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;ExUnit&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;Case&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;async:&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;true&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;doctest&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;Alohomora&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;Resource&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;And to test functions with doctests in your &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Alohomora.Resource&lt;/code&gt; namespace. Best of all, there’s nothing extra to add – these tests will run when you run &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;mix test&lt;/code&gt;.&lt;/p&gt;

&lt;h1 id=&quot;dialyxir&quot;&gt;&lt;a href=&quot;https://github.com/jeremyjh/dialyxir&quot;&gt;dialyxir&lt;/a&gt;&lt;/h1&gt;

&lt;p&gt;This library is actually a set of mix tasks on top of the popular Dialyzer tool for Erlang. Dialyzer, if you haven’t encountered it yet, is a DIscrepancy AnaLYZer for ERlang programs. That is to say, it finds dead code, type issues, and unnecessary tests. In my experience, it finds unreachable branches, and it finds tuple returns that aren’t matching a pattern where they’re used. These two seem to be the bulk of the things it finds for me, at least. It will also find functions that aren’t defined for the number of parameters you’re passing, but it seems to have issues with certain libraries I use – those libraries do in fact define functions with that signature.&lt;/p&gt;

&lt;p&gt;To really get the power of Dialyzer, you’ll to start &lt;a href=&quot;https://hexdocs.pm/elixir/typespecs.html&quot;&gt;including type specs&lt;/a&gt; in your source.&lt;/p&gt;

&lt;h1 id=&quot;dogma-and-credo&quot;&gt;&lt;a href=&quot;https://github.com/lpil/dogma&quot;&gt;dogma&lt;/a&gt; and &lt;a href=&quot;https://github.com/rrrene/credo&quot;&gt;credo&lt;/a&gt;&lt;/h1&gt;

&lt;p&gt;Style guides help a team to write consistent code, more than they specify architecture patterns or idiomatic solutions. If you want to start applying a style guide to your Elixir code, look no further than dogma. As indicated on its README, “It’s highly configurable so you can adjust it to fit your style guide, but comes with a sane set of defaults so for most people it should just work out-of-the-box.” I’d recommend starting with its default style guide and seeing what it yells about.&lt;/p&gt;

&lt;p&gt;The kinds of things that dogma will tell you about are lines too long, trailing whitespace, and so on. You’ve probably seen similar output if you use a tool like &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;rubocop&lt;/code&gt; in Ruby.&lt;/p&gt;

&lt;p&gt;Credo has some overlap with dogma, but it does far more. This tool is more concerned with code smells. Some examples are checking function complexity, negated conditionals, and idiomatic ways to format your pipe operators and one-line functions. You can read up on the &lt;a href=&quot;https://github.com/rrrene/elixir-style-guide&quot;&gt;credo docs&lt;/a&gt; to understand everything it checks for.&lt;/p&gt;

&lt;p&gt;Ultimately, you may feel like you only need one or the other. For myself, I use credo with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;mix credo --strict&lt;/code&gt;.&lt;/p&gt;

&lt;h1 id=&quot;excoveralls&quot;&gt;&lt;a href=&quot;https://github.com/parroty/excoveralls&quot;&gt;ExCoveralls&lt;/a&gt;&lt;/h1&gt;

&lt;p&gt;Code coverage in your tests is an important metric to keep track of. While striving for 100% code coverage isn’t always worth it, it is good to know whether you’re exercising the code you think you are, and ensuring that all edge cases and error cases that you coded for have been checked with a test.&lt;/p&gt;

&lt;p&gt;Installing ExCoveralls in your project will allow you to print out your code coverage for each module to the shell, as HTML, or to post the code coverage to Coveralls.io. ExCoveralls also supports being run from a few different CI tools including CircleCI, Semaphore, and Travis. If you don’t need all this, you could look into &lt;a href=&quot;https://github.com/mrinalwadhwa/excov&quot;&gt;ExCov&lt;/a&gt; or simply run &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;mix test --cover&lt;/code&gt; – although I find this built-in mix task’s output to be the least useful.&lt;/p&gt;

&lt;h1 id=&quot;the-erlang-observer-gui&quot;&gt;The Erlang observer GUI&lt;/h1&gt;

&lt;p&gt;This one is built in, simply launch it from your `iex terminal:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;iex&amp;gt; :observer.start
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;And it will launch a GUI tool. The GUI has charts of memory and processing done, as well as a graph of application supervisor trees. Honestly, there’s a lot more in this tool than I’ve had time to explore and learn about.&lt;/p&gt;

&lt;h1 id=&quot;mix-profilefprof&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;mix profile.fprof&lt;/code&gt;&lt;/h1&gt;

&lt;p&gt;This is another built-in tool that you can use. Profiling might not be the first tool you need when developing, but when you want to understand and trace what your code is doing, the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;fprof&lt;/code&gt; tool’s output can be incredibly handy. Make sure you run this with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;MIX_ENV=prod&lt;/code&gt; when you use this. It is also possible to &lt;a href=&quot;https://selfamusementpark.com/profiling-a-slow-elixir-test&quot;&gt;wrap fprof to profile slow test cases&lt;/a&gt;, which I have found useful in the past. There’s other libraries that you can install for profiling and tracing Elixir, but so far, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;mix profile.fprof&lt;/code&gt; has worked well enough for me.&lt;/p&gt;

&lt;h1 id=&quot;final-thoughts&quot;&gt;Final Thoughts&lt;/h1&gt;

&lt;p&gt;This post was 5 tools for your Elixir workflow. If you’ve been working in Elixir for awhile, you may be already using them. And there’s probably more tools that I don’t know about, out there.&lt;/p&gt;

&lt;p&gt;Let me know if you found this blog post useful, or if you have any other tools to recommend!&lt;/p&gt;

&lt;h1 id=&quot;update-december-29-2017&quot;&gt;Update December 29, 2017:&lt;/h1&gt;

&lt;p&gt;I’ve written up a &lt;a href=&quot;/2017/12/29/more-elixir-code-quality-tools/&quot;&gt;new blog post&lt;/a&gt; that covers tools submitted by reader Andrew Summers.&lt;/p&gt;
</description>
        <pubDate>Tue, 21 Nov 2017 00:00:00 -0600</pubDate>
        <link>https://blog.mattgauger.com/2017/11/21/elixir-code-quality-tools/</link>
        <guid isPermaLink="true">https://blog.mattgauger.com/2017/11/21/elixir-code-quality-tools/</guid>
        
        
      </item>
    
      <item>
        <title>A new look</title>
        <description>&lt;p&gt;You might notice that this looks a little different. I’ve switched to a much more modern, cleaner theme for my blog. I’ve also redirected all of the old &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/blog/&lt;/code&gt; subpaths to their new locations (Sadly, it seems GitHub pages does not support permanent redirects with any sort of config file, so the redirects are all in JavaScript.)&lt;/p&gt;

&lt;p&gt;Let me know if you notice anything that seems wrong. &lt;a href=&quot;mailto:contact@mattgauger.com&quot;&gt;contact@mattgauger.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And if you’re curious what this site looked like before the redesign, here’s some screen shots:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/images/old-theme-homepage.png&quot;&gt;&lt;img src=&quot;/images/old-theme-homepage.png&quot; alt=&quot;Old theme home page&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/images/old-theme-archives.png&quot;&gt;&lt;img src=&quot;/images/old-theme-archives.png&quot; alt=&quot;Old theme archives&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
</description>
        <pubDate>Tue, 24 Oct 2017 10:48:00 -0500</pubDate>
        <link>https://blog.mattgauger.com/2017/10/24/a-new-look/</link>
        <guid isPermaLink="true">https://blog.mattgauger.com/2017/10/24/a-new-look/</guid>
        
        
      </item>
    
      <item>
        <title>Why build intelligence augmentation tools?</title>
        <description>&lt;p&gt;In a &lt;a href=&quot;http://blog.mattgauger.com/blog/2014/01/12/a-theory-of-compound-intelligence-gain/&quot;&gt;past blog post&lt;/a&gt; I talked about the concept of &lt;em&gt;intelligence augmentation&lt;/em&gt;. The idea of building software to augment intelligence has been around for some time. That post covers its history more than this one will.&lt;/p&gt;

&lt;p&gt;I’ve noticed that software developers I know (myself included) will have a thought: Imagine a tool that would allow flexible note-taking, archive and index their documents and email, and enable hyperlinking to any content in that index. This tool would have some sort of AI agent architecture on top of it that would offer improved searching, find related content automatically, and otherwise assist you in thinking and researching. Variations on this tool might include improved filtering of incoming information, or improving their own ability to learn new things.&lt;/p&gt;

&lt;p&gt;Such thoughts tend to lead people to start designing architectures and picking programming languages to implement it in. Or they might start designing a UI. Or they fall down the rabbit hole of knowledge systems, machine learning, and natural language processing.&lt;/p&gt;

&lt;p&gt;Indeed, such a note-capturing system is the &lt;a href=&quot;http://www.loper-os.org/?p=8&quot;&gt;source of inspiration for loper-os&lt;/a&gt;, a more-perfect Lisp machine project envisioned and taken up by Stanislav Datskovskiy. (Although he is still working on the hardware on which to write loper-os and thus run his thought-capturing system. Again, rabbit holes.)&lt;/p&gt;

&lt;p&gt;I’ve had discussions with at least a dozen other people about how they would build such a virtual assistant. Clearly, there’s some tooling lacking here that a lot of people have thought about and feel a need for.&lt;/p&gt;

&lt;p&gt;Why is building a virtual assistant such a tempting thought for software developers? It’s likely because they experience technology as constant change. Their work and communication revolves around technology.&lt;/p&gt;

&lt;p&gt;The tools and services we use now (read: Twitter, Facebook, email, and so on) only compound the &lt;a href=&quot;https://en.wikipedia.org/wiki/Information_overload&quot;&gt;information overload&lt;/a&gt; that occurs when you try to stay up to date with your email and your calendar. Or when you try to stay up to date with everyone on social media. Suffice to say, the people who use technology the most may feel this pain the greatest.&lt;/p&gt;

&lt;p&gt;Let’s take a step back and think about why we would want to augment our own intelligence. And in particular, I’m going to focus on building software here. We could also have discussions around using smart drugs (nootropics), or of using genetics and medicine. Or we might discuss building hardware such as &lt;a href=&quot;https://en.wikipedia.org/wiki/Brainport&quot;&gt;brainports&lt;/a&gt; or &lt;a href=&quot;https://www.youtube.com/watch?v=ZrGPuUQsDjo&quot;&gt;Elon Musk’s neural lace&lt;/a&gt;, but those are out of scope for this article and for my expertise. Software I know.&lt;/p&gt;

&lt;p&gt;In 1997, Garry Kasparov lost to Deep Blue at chess. This was the first case of a computer defeating a world champion. After this point, advances in computing power meant that off-the-shelf chess software running on a modern laptop can play as well as Deep Blue. Since the search space of chess is now in the CPU’s reach, no human can hope to beat the best computer at chess again.&lt;/p&gt;

&lt;p&gt;Yet, Kasparov noticed something. If you combine software with a human player, and let the human use the computer software to explore the results of a particular move before making it, that team plays better than man or computer alone. They call these man-machine hybrids “centaurs.” Kasparov called this game &lt;a href=&quot;https://en.wikipedia.org/wiki/Advanced_Chess&quot;&gt;Advanced Chess&lt;/a&gt;, and an offshoot called freestyle chess has emerged with teams of humans and computers on each side.&lt;/p&gt;

&lt;p&gt;To bring it back to our terminology, a centaur composed of a human operating a computer is an &lt;em&gt;augmented human&lt;/em&gt;. The chess software is an intelligence augmentation tool. Now, chess and its rules are not something as complex as writing a more compelling document or pulling together disparate academic papers and original research into one new thesis. We do not yet have the tools to enable a regular researcher to become a super-researcher simply by giving them software to consult.&lt;/p&gt;

&lt;p&gt;The complexity of problems that we need to solve is ever-increasing. This was the main reason that &lt;a href=&quot;http://www.dougengelbart.org/pubs/augment-3906.html&quot;&gt;Engelbart cited&lt;/a&gt; in 1962 for exploring augmenting human intellect:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Man’s population and gross product are increasing at a considerable rate, but the complexity of his problems grows still faster, and the urgency with which solutions must be found becomes steadily greater in response to the increased rate of activity and the increasingly global nature of that activity. Augmenting man’s intellect, in the sense defined above, would warrant full pursuit by an enlightened society if there could be shown a reasonable approach and some plausible benefits.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The benefits to be able to create a super-researcher or super-productive professional should be obvious. There are likely aspects of your job or your hobbies that you can imagine aided by better software.&lt;/p&gt;

&lt;p&gt;In particular, when we augment the brain, we will look at it like another piece of technology:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;improving short and long term memory recall (storage)&lt;/li&gt;
  &lt;li&gt;improving the number of different ideas we can hold in our heads at once (RAM)&lt;/li&gt;
  &lt;li&gt;improving the speed, focus, and association-making aspects of our thinking (CPU)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What kinds of features might we want to see in these tools? A possible, but not exhaustive, list might include:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;filtering the noise of your email inbox, news sources (and fake news), social media, and more&lt;/li&gt;
  &lt;li&gt;proactively providing related content and automatically categorizing content&lt;/li&gt;
  &lt;li&gt;visualizing and summarizing information so that you can work with it more effectively&lt;/li&gt;
  &lt;li&gt;helping us to remember everything we’ve ever seen, heard, or said in the real world&lt;/li&gt;
  &lt;li&gt;helping us remember names and otherwise augment our social ability&lt;/li&gt;
  &lt;li&gt;optimizing our time, schedule, and work load (as SRI’s CALO focused on)&lt;/li&gt;
  &lt;li&gt;optimizing our health (as an outgrowth of the &lt;a href=&quot;http://quantifiedself.com/&quot;&gt;quantified self&lt;/a&gt; movement)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So we, as software developers and &lt;a href=&quot;http://blog.mattgauger.com/blog/2017/03/12/mining-for-computation-on-the-beach/&quot;&gt;tool-makers&lt;/a&gt;, see a need and want to build tools. We know what kinds of tools we might create. But why else might we, as humans, want to build these tools?&lt;/p&gt;

&lt;h2 id=&quot;productivity&quot;&gt;Productivity&lt;/h2&gt;

&lt;p&gt;If we extrapolate from the Advanced Chess centaurs, then augmented humans will be better than unaugmented workers. In some cases, augmented humans will be able to get more work done than AI/ML tools. In a time when automation continues to threaten our jobs, we might yet find meaningful work for a longer period of time if we can join with machine learning technologies to become augmented humans. In the short term, being more productive is more likely to earn you raises and advancement. You may have better choices about what to work on, or how you work with it.&lt;/p&gt;

&lt;p&gt;A worker becomes more valuable as their ability to solve more problems and get more done increases. A more productive work force can help us to have a healthier economy and to smooth the transition to a fully-automated world. Once we reach that level of automation, we can hope to find post-scarcity, an end of wage labor, and the ability to fill our time with leisure.&lt;/p&gt;

&lt;p&gt;The downsides to augmenting for productivity are that if there are some barriers to entry here, such as cost, then only the rich can afford such tools. The average worker still won’t benefit from expensive productivity improvements. Worse, we may not even see any benefit for those that weren’t working in professional roles now. Those with jobs threatened by automation – truck drivers, factory workers, and so on – may be hardest hit by expensive or unavailable augmentation tools. We should focus on helping those workers train for their next career, and help those entering the workforce keep up.&lt;/p&gt;

&lt;h2 id=&quot;education-and-better-learning&quot;&gt;Education and better learning&lt;/h2&gt;

&lt;p&gt;The education system cannot move fast enough for the rapid pace of change. Those applying to college now should be looking at what jobs will be available in 5 years when they choose a major. Jobs that may become automated in that time makes those jobs a bad decision. But the existing college system does not tell students to avoid jobs that may soon be irrelevant.&lt;/p&gt;

&lt;p&gt;If you are likely to change careers in your lifetime, does it make sense to pursue a particular degree? (At least, in cases where it is not required for certification/practice, such as law or medicine.) Or should you optimize for a lifetime of learning?&lt;/p&gt;

&lt;p&gt;The cost of higher education is high, and most students take on loans to complete their degrees. Is this cost worth it? Do they learn enough in a degree to pay back the loans later? Do they retain enough information from that learning period to later use it in their job?&lt;/p&gt;

&lt;p&gt;And if technology is moving so fast that colleges can’t keep up, will workers be able to juggle learning new advances while working full time?&lt;/p&gt;

&lt;p&gt;We need software that accelerates learning and increases retention. More learning in shorter periods of time can help students – and workers in the workforce – to keep up. Better retention means better job performance and success.&lt;/p&gt;

&lt;p&gt;There’s been a lot of research into learning on multiple fronts. I recommend the book &lt;a href=&quot;https://www.goodreads.com/book/show/18693655-a-mind-for-numbers&quot;&gt;A Mind for Numbers&lt;/a&gt; and its related MOOC &lt;a href=&quot;https://www.coursera.org/learn/learning-how-to-learn&quot;&gt;Learning How to Learn&lt;/a&gt; to find out more about this topic and how to put that research into practice.&lt;/p&gt;

&lt;p&gt;There are a long list of startups now offering online courses, nano-degrees, and certificates of study. Khan Academy presents videos for elementary school studies through graduate admissions tests. But putting a class online as a screencast does not turn these courses into an intelligence augmentation tool.&lt;/p&gt;

&lt;p&gt;There’s the entire internet and all of Wikipedia available whenever we use a search engine. Ebooks give us access to a shelf of books without needing an expensive and wasteful physical copy. (Especially when it comes to textbooks.) There’s note-taking applications and word processors with spell-checkers. There’s flashcard apps, such as SuperMemo, that use a &lt;a href=&quot;https://en.wikipedia.org/wiki/Spaced_repetition&quot;&gt;spaced repetition&lt;/a&gt; to help with memorization and language learning. So why aren’t these enough to enable people to learn better?&lt;/p&gt;

&lt;p&gt;The difference between existing tools and what we need from educational augmentation tools is personalization to the learner and optimizing the learning. These existing tools are inert and require the learner to expend all of the energy and thinking to use the tool. Intelligence augmentation tools could be proactive learning tools that can do more than  provide the content to learn. They could actually bring the right content to the user at the right time (as in spaced repetition). They could structure the learning to the individual, rather than the current method of teaching to the widest range of students. They could let the learner explore at their own pace and go off on tangents of learning to related topics. Last, these tools would keep track of the current level of learning and track mastery of each topic.&lt;/p&gt;

&lt;p&gt;All of these features are lacking in current tools. The area seems ripe for change and improvement.&lt;/p&gt;

&lt;h2 id=&quot;more-free-time&quot;&gt;More free time&lt;/h2&gt;

&lt;p&gt;Increased productivity gives us more benefits than getting more done at work. We should have the ability to work less if we are more productive. This could free up more time for leisure, hobbies, entertainment, and further higher education goals.&lt;/p&gt;

&lt;p&gt;Since there’s an association (at least in the USA) between labor and success in life, it might be hard to convince ourselves that working less per week is a positive. Yet, I see the rise of full-time travelers, many of whom work as contractors for less than 40 hours per week, as an sign that this will become socially acceptable. These digital nomads might have the most success with intelligence augmentation tools and the work of the future (as &lt;a href=&quot;http://www.antipope.org/charlie/blog-static/fiction/accelerando/accelerando.html&quot;&gt;Charles Stross’s Manfred Macx&lt;/a&gt; did.)&lt;/p&gt;

&lt;p&gt;As we approach a post-scarce society (and hopefully we do), work for pay will have less importance. Being able to spend time with friends and family, be entertained, and pursue intellectual interests will all become more acceptable ways to spend our time.&lt;/p&gt;

&lt;h2 id=&quot;solving-complex-problems&quot;&gt;Solving complex problems&lt;/h2&gt;

&lt;p&gt;As noted by Engelbart, our world is increasingly complex. One way that academia has dealt with this is increasing specialization. A PhD may only have a deep expertise on a narrow subject. Outside of academia, we have the forces of globalization and technological progress to contend with. Narrow specialization may not always work. Our world changes rapidly and has difficult multi-disciplinary problems to solve. Global warming, food, clean water, and eradicating disease are all tough problems. How can we go about solving them?&lt;/p&gt;

&lt;p&gt;In the space of all the possible intelligences, imagine intelligence drawn on a curve. On the top of that scale is the most intelligent human (Einstein, Newton, or any other that you wish.) The rest of us are somewhere in the middle of the scale, and on the lower end of the scale, animals. Of course, the graph goes much farther up and to the right than the smartest human so far. We just haven’t seen those intelligences yet.&lt;/p&gt;

&lt;p&gt;In that space of possible minds, there exists a new category. The augmented humans, or centaurs, have their own range of intelligences. Augmentation could allow regular humans reach a range that includes Einstein-level intelligence. For specific topics or skills, centaurs could rank much farther up the curve than the smartest humans. We’ve already seen this with Freestyle Chess: the best human chess players, unaugmented, are no match for a team of computers and humans working together. Augmented humans with good software will be able to surpass the smartest natural humans in multiple aspects, and we can give that augmentation software to far more people.&lt;/p&gt;

&lt;p&gt;Intelligence augmentation tools won’t just let us do more work faster, then, but unlock the ability to understand and solve problems that we previously could not. This will power new forms of technology and science well beyond what we’ve accomplished today.&lt;/p&gt;

&lt;h2 id=&quot;in-conclusion&quot;&gt;In conclusion&lt;/h2&gt;

&lt;p&gt;I’m excited to be thinking about and writing about these topics again. There’s potential to start building some of these tools today. In particular, to build personalized tools as experiments. These early tools will be like the tracking done by the quantified self movement: separate data points from individuals with little overlap. But cross-pollination of ideas and techniques will be possible. Conversations around these experiments will be important to develop the technology further.&lt;/p&gt;

&lt;p&gt;From these personal experiments, we can learn to build generic tools for everybody. Those generic solutions will allow the creation of freely-available software. Open source should help with concerns around access only being available to the wealthy and the privileged.&lt;/p&gt;

&lt;p&gt;We’ll still be on our own to deal with the ethics involved in augmentation, which I did not touch on in this article.&lt;/p&gt;

&lt;p&gt;If you find these topics interesting and would like to discuss them, I invite you to join me over on the new &lt;a href=&quot;https://intaug.org&quot;&gt;Intelligence Augmentation BBS&lt;/a&gt;.&lt;/p&gt;
</description>
        <pubDate>Mon, 10 Apr 2017 10:48:00 -0500</pubDate>
        <link>https://blog.mattgauger.com/2017/04/10/why-build-intelligence-augmentation-tools/</link>
        <guid isPermaLink="true">https://blog.mattgauger.com/2017/04/10/why-build-intelligence-augmentation-tools/</guid>
        
        
      </item>
    
      <item>
        <title>My current setup: Habits tracking</title>
        <description>&lt;p&gt;In the past, &lt;a href=&quot;/blog/2013/12/28/an-unscientific-study-in-behavior-change-with-software/&quot;&gt;I blogged about&lt;/a&gt; how I used Lift.do (now &lt;a href=&quot;https://www.coach.me&quot;&gt;coach.me&lt;/a&gt;) to prompt for habit-forming. Learning how to form new habits is one of the key tools to focusing on your growth and the ability learn more. You might recall from that previous post that I refer to the &lt;a href=&quot;http://www.foggmethod.com/&quot;&gt;Fogg method&lt;/a&gt; for behavior change. The three steps are:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Select the right target behavior.&lt;/li&gt;
  &lt;li&gt;Make the target behavior easy to do.&lt;/li&gt;
  &lt;li&gt;Ensure a trigger will prompt the behavior.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;So why did I stop using Lift.do? In short, because Reminders.app for iOS and MacOS got better.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/reminders_app_example.png&quot; alt=&quot;Reminders.app example&quot; style=&quot;display: block; margin: 0 auto;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;You may recall that Lift.do emailed me every morning a reminder for one habit I was trying to form: take a Vitamin D.&lt;/p&gt;

&lt;p&gt;It’s possible that I could have had Lift.do email about other habits at different times. It could have sent me a digest email of all my habits for the day, each morning. But, sending more emails would quickly overwhelm my inbox and help turn it into the dreaded TODO list.&lt;/p&gt;

&lt;p&gt;The prompt or trigger to perform a habit should happen as close to the right moment as possible. With recurring reminders in Reminders.app, I now get notifications for each habit. I can easily tweak the schedule to fit where I think the habit will best fit in.&lt;/p&gt;

&lt;p&gt;The notifications show on both my laptop and phone, and I usually have my phone on me at all times. My phone can bug me wherever I am, because I have my phone with me. Completing a task on my phone or my laptop syncs to the other device thanks to iCloud.&lt;/p&gt;

&lt;p&gt;As a result, I’m no longer just tracking the one Vitamin D habit. (In fact, I don’t track Vitamin D at all anymore. It has become a real habit and doesn’t need a prompt every morning.) I track 14 habits that happen daily, and an additional 3 that happen every other day or on a custom schedule.&lt;/p&gt;

&lt;p&gt;The ease of these tasks varies. Some of them I would do anyways or have already formed habits around. Having the record makes it easier to remember whether I really did them 8 hours later.&lt;/p&gt;

&lt;p&gt;Some of these tasks are harder or take more motivation to do each day. I have habits that I’m forming as part long-term learning goals. The easiness of these goals comes having broken it down to tasks that I absolutely can do every day. There’s power in having small amounts of consistent progress every day.&lt;/p&gt;

&lt;p&gt;I’d recommend that you think about setting the goal for a new habit to the smallest thing you could do every day. For example: practice for just 5 minutes. Allow yourself to take more time if you have it. If you get to the end of the day, and you’re being honest with yourself, can you fit in 5 minutes of practice before turning in? You will make a lot of progress this way.&lt;/p&gt;

&lt;h2 id=&quot;what-am-i-lacking-with-this-setup&quot;&gt;What am I lacking with this setup?&lt;/h2&gt;

&lt;p&gt;Reminders.app doesn’t really track of the history of checked-off items. It only knows whether I missed a deadline (and how long ago that was) and what’s due today. Items checked off yesterday wait until they’re due today, and then notify me. I don’t have Lift.do’s graphs or &lt;a href=&quot;http://lifehacker.com/281626/jerry-seinfelds-productivity-secret&quot;&gt;Seinfield’s “streaks calendar”&lt;/a&gt;. But this seems ok. I have a general idea of how well I’ve been doing lately. For longer-term goals, like fitness, I use other apps that have their own “streaks calendar.”&lt;/p&gt;

&lt;p&gt;Despite saying in &lt;a href=&quot;/blog/2013/12/28/an-unscientific-study-in-behavior-change-with-software/&quot;&gt;my previous post on habits&lt;/a&gt; that I’ve found progress bars and charts to be motivating, I don’t find that I need those now. Having a list in Reminders.app and knowing whether I’ve done today’s items is enough.&lt;/p&gt;

&lt;p&gt;A protip is that you can view all of your scheduled reminders in Reminders.app in a separate list called Scheduled. I keep this list up in Reminders.app most of the time, and use a separate list as a more general/on-the-fly TODO list. I tend to use Emacs’ excellent &lt;a href=&quot;http://orgmode.org/&quot;&gt;Org mode&lt;/a&gt; for my real TODO lists, among many other things. (Org mode does a lot. You should check it out!)&lt;/p&gt;

&lt;h2 id=&quot;final-thoughts&quot;&gt;Final thoughts&lt;/h2&gt;

&lt;p&gt;This approach triggers habits much more consistently and improves the likelihood that I can get through so many small tasks in a given day. It doesn’t require additional software or notebooks in my process. For something as simple as habit-tracking, I’m not too worried that I’m locked to an Apple app on Apple hardware. This list could be move to something else with little efort, but convenience wins right now.&lt;/p&gt;

&lt;p&gt;Overall, this process works for me. And that might be the most important point.&lt;/p&gt;
</description>
        <pubDate>Mon, 27 Mar 2017 17:53:00 -0500</pubDate>
        <link>https://blog.mattgauger.com/2017/03/27/my-current-setup-habits-tracking/</link>
        <guid isPermaLink="true">https://blog.mattgauger.com/2017/03/27/my-current-setup-habits-tracking/</guid>
        
        
      </item>
    
  </channel>
</rss>

