<rss xmlns:source="http://source.scripting.com/" version="2.0">
  <channel>
    <title>Scroogie Boy</title>
    <link>https://blog.scroogieboy.com/</link>
    <description></description>
    
    <language>en</language>
    
    <lastBuildDate>Wed, 18 Feb 2026 07:55:47 -0500</lastBuildDate>
    <item>
      <title></title>
      <link>https://blog.scroogieboy.com/2026/02/18/if-aiwritten-business-applications-are.html</link>
      <pubDate>Wed, 18 Feb 2026 07:55:47 -0500</pubDate>
      
      <guid>http://cwirving.micro.blog/2026/02/18/if-aiwritten-business-applications-are.html</guid>
      <description>&lt;p&gt;If AI-written business applications are supposedly taking over from SaaS, who is &lt;em&gt;operating&lt;/em&gt; them? Who is making sure they run, are backed up, can be restored in the case of disaster… Or does business continuity not matter anymore?&lt;/p&gt;
</description>
      <source:markdown>If AI-written business applications are supposedly taking over from SaaS, who is _operating_ them? Who is making sure they run, are backed up, can be restored in the case of disaster… Or does business continuity not matter anymore?
</source:markdown>
    </item>
    
    <item>
      <title>Ikea Boaxel impressions as a Elfa shelving user</title>
      <link>https://blog.scroogieboy.com/2025/09/26/ikea-boaxel-impressions-as-a.html</link>
      <pubDate>Fri, 26 Sep 2025 06:55:02 -0500</pubDate>
      
      <guid>http://cwirving.micro.blog/2025/09/26/ikea-boaxel-impressions-as-a.html</guid>
      <description>&lt;p&gt;As a long-time Elfa shelving user, I was looking for a cheaper option in less demanding scenarios. After a bit of searching online, I found the Ikea Boaxel system. Here are some of my notes after building a wall storage solution using the Boaxel system:&lt;/p&gt;
&lt;p&gt;First of all, the two systems differ dramatically in cost &amp;ndash; given that the Ikea Boaxel is about one third the price of equivalent Elfa shelving, we shouldn&amp;rsquo;t go into this with the expectation of getting the same thing. These systems target very different price points.&lt;/p&gt;
&lt;p&gt;One of the ways that the Boaxel system achieves its lower price point is by being flimsier than Elfa. If you intend to put heavy things on the shelves, this is not the system for you. Ikea don&amp;rsquo;t seem to quote the system load-bearing capacity in their specifications, but it is less sturdy in all ways compared to Elfa. Not that this is inherently a flaw &amp;ndash; we don&amp;rsquo;t all need to store big heavy bins on our shelves &amp;ndash; but it is an important deciding factor.&lt;/p&gt;
&lt;p&gt;Beyond being generally flimsier, the way that the Boaxel system transfers loads to the wall is quite different: while Elfa shelving transfers loads primarily to the overhead suspension rail, the Boaxel system puts the load on the (many &amp;ndash; one about every 10 inches) fasteners on the uprights. The uprights will flex if they aren&amp;rsquo;t fully fastened to the wall, so the top rail is mostly an alignment tool than a load-bearing part of the system.&lt;/p&gt;
&lt;p&gt;The sheer number of fasteners needed in the Boaxel system may also be a turn-off: while Elfa shelving allows you to mount the top rail, then slide the uprights around freely (handy if you like to reconfigure your shelving), Boaxel top rails and uprights must all be fastened to the wall. Reconfiguring the location of the uprights in a Boaxel system is a lot more work. In US stick-frame construction, this means making (and patching on removal) a lot of holes in the drywall for the fasteners.&lt;/p&gt;
&lt;p&gt;Other than the MDF &amp;ldquo;wood&amp;rdquo; shelves (which I didn&amp;rsquo;t try), the various shelving options in the two systems don&amp;rsquo;t have direct equivalents. The wire shelving in the Boaxel system is much lighter-duty than the Elfa ones. The stamped steel shelves have no equivalent in the Elfa system and are a handy addition.&lt;/p&gt;
&lt;p&gt;The tabs that mount shelves to their supports seem to be an especially weak part of the Boaxel system. They are small and easy to bend out of shape. This isn&amp;rsquo;t a fatal flaw, but something to be careful about when installing the shelves &amp;ndash; if something doesn&amp;rsquo;t fit perfectly, brute-forcing it will likely end up bending some tabs and making things worse. You need to be more careful when installing Boaxel shelves while the Elfa wire shelves tend to actually require a little force to clip in properly.&lt;/p&gt;
&lt;p&gt;Finally, Boaxel does not have the plastic rail covers to make the system look neat and tidy. I never use them with my Elfa shelves, but if this matters to you, the Elfa shelving system will look a lot more &amp;ldquo;finished&amp;rdquo; than Boaxel will. You can cover the suspension rail and hide the fasteners in an Elfa system. The fasteners are all visible in the Boaxel system. The brackets between shelves arguably require less beautification (because they are so slim), but the ends aren&amp;rsquo;t smooth and are covered with hard-to-remove labels.&lt;/p&gt;
</description>
      <source:markdown>As a long-time Elfa shelving user, I was looking for a cheaper option in less demanding scenarios. After a bit of searching online, I found the Ikea Boaxel system. Here are some of my notes after building a wall storage solution using the Boaxel system:

First of all, the two systems differ dramatically in cost -- given that the Ikea Boaxel is about one third the price of equivalent Elfa shelving, we shouldn&#39;t go into this with the expectation of getting the same thing. These systems target very different price points.

One of the ways that the Boaxel system achieves its lower price point is by being flimsier than Elfa. If you intend to put heavy things on the shelves, this is not the system for you. Ikea don&#39;t seem to quote the system load-bearing capacity in their specifications, but it is less sturdy in all ways compared to Elfa. Not that this is inherently a flaw -- we don&#39;t all need to store big heavy bins on our shelves -- but it is an important deciding factor.

Beyond being generally flimsier, the way that the Boaxel system transfers loads to the wall is quite different: while Elfa shelving transfers loads primarily to the overhead suspension rail, the Boaxel system puts the load on the (many -- one about every 10 inches) fasteners on the uprights. The uprights will flex if they aren&#39;t fully fastened to the wall, so the top rail is mostly an alignment tool than a load-bearing part of the system.

The sheer number of fasteners needed in the Boaxel system may also be a turn-off: while Elfa shelving allows you to mount the top rail, then slide the uprights around freely (handy if you like to reconfigure your shelving), Boaxel top rails and uprights must all be fastened to the wall. Reconfiguring the location of the uprights in a Boaxel system is a lot more work. In US stick-frame construction, this means making (and patching on removal) a lot of holes in the drywall for the fasteners.

Other than the MDF &#34;wood&#34; shelves (which I didn&#39;t try), the various shelving options in the two systems don&#39;t have direct equivalents. The wire shelving in the Boaxel system is much lighter-duty than the Elfa ones. The stamped steel shelves have no equivalent in the Elfa system and are a handy addition.

The tabs that mount shelves to their supports seem to be an especially weak part of the Boaxel system. They are small and easy to bend out of shape. This isn&#39;t a fatal flaw, but something to be careful about when installing the shelves -- if something doesn&#39;t fit perfectly, brute-forcing it will likely end up bending some tabs and making things worse. You need to be more careful when installing Boaxel shelves while the Elfa wire shelves tend to actually require a little force to clip in properly.

Finally, Boaxel does not have the plastic rail covers to make the system look neat and tidy. I never use them with my Elfa shelves, but if this matters to you, the Elfa shelving system will look a lot more &#34;finished&#34; than Boaxel will. You can cover the suspension rail and hide the fasteners in an Elfa system. The fasteners are all visible in the Boaxel system. The brackets between shelves arguably require less beautification (because they are so slim), but the ends aren&#39;t smooth and are covered with hard-to-remove labels.
</source:markdown>
    </item>
    
    <item>
      <title>Why *not* develop for Apple platforms?</title>
      <link>https://blog.scroogieboy.com/2025/06/09/why-not-develop-for-apple.html</link>
      <pubDate>Mon, 09 Jun 2025 11:57:44 -0500</pubDate>
      
      <guid>http://cwirving.micro.blog/2025/06/09/why-not-develop-for-apple.html</guid>
      <description>&lt;p&gt;On the occasion of WWDC starting today, I thought that I&amp;rsquo;d write some thoughts down as to why, even as a fan of Apple platforms, I still would not want to be a developer for those platforms.&lt;/p&gt;
&lt;h2 id=&#34;the-old-days&#34;&gt;The old days&lt;/h2&gt;
&lt;p&gt;I have to admit that I am not a long-time Apple fan in the &amp;ldquo;bleed six colors&amp;rdquo; sense. Back in the 1980s, I was more of a hardware hacker with too limited a budget to ever seriously look at Apple products. In the 1990s, Apple had drifted into comparative technical obsolescence, so it was really hard to get excited about the mac. I occasionally used one at work, but world had more or less caught up with the basics of the user experience and the classic MacOS technical underpinnings were stale. There were a multitude of operating systems that were technically more exciting and good enough from an UX perspective, so why pay attention to the also-ran in the market?&lt;/p&gt;
&lt;h2 id=&#34;getting-on-board&#34;&gt;Getting on board&lt;/h2&gt;
&lt;p&gt;Come the 2000s and OS X, things have changed. The new Intel macs provide an on ramp to the platform with a built-in escape hatch (if all else fails, we could always fall back to Windows), so I&amp;rsquo;m one of the early Intel mac adopters (yay for the white polycarbonate MacBook!) and haven&amp;rsquo;t looked back &amp;ndash; as a user &amp;ndash; since. Professionally, though, it has never made sense: the kind of software I worked on was always technical, but never important enough to the customer to drive a platform switch. It was always &amp;ldquo;put your thing on our corporate standard PC&amp;rdquo;. Later on, web-delivered applications didn&amp;rsquo;t really care about the client computer &amp;ndash; as long as there was a browser, it would run.&lt;/p&gt;
&lt;p&gt;During this whole time, the mac remained a great developer machine &amp;ndash; whether developing for Windows (in a VM) or Linux servers (the UNIX underpinnings of modern macOS help a lot), the mac was a great place to work, but never the development target.&lt;/p&gt;
&lt;p&gt;Looking at the applications I used on the mac, I could see that there was a really awesome combination at play: a solid operating system, frameworks like AppKit that brought fundamental improvements to the developer experience and human interface guidelines that you could create usable, productive software without a massive investment in programming or design effort. I still didn&amp;rsquo;t have a work reason to make anything for the platform, but the productivity advantage for technical applications seemed real. The barrier to entry for mac application development was pretty low &amp;ndash; tempered by the then-small market.&lt;/p&gt;
&lt;h2 id=&#34;enter-the-iphone&#34;&gt;Enter the iPhone&lt;/h2&gt;
&lt;p&gt;The iPhone changed things fundamentally. Yes, in all the ways we know, but also it changed the expectation of what an application should look like. Over the next few years, the expectation of highly-designed, highly-polished (as opposed to &lt;em&gt;usable&lt;/em&gt;) negated the productivity advantage. This permeated other software platforms, of course, but it shifted the baseline of what people expect from software (even line of business enterprise software) in an expensive way. Thankfully, iOS 7 and some of the more recent UI paradigms (although we may see something different at this year&amp;rsquo;s WWDC) put a damper on the design arms race around some of the more expensive trends, but I get the feeling that the baseline application for an Apple platform got more expensive to develop over the years.&lt;/p&gt;
&lt;p&gt;Simultaneously, the iPhone &amp;ndash; by virtue of its scale &amp;ndash; devalued third-party software. With millions of installations, even complicated software can be sold pretty cheap. However, the expectation that all software is cheap has made low-volume applications extremely hard to sell for what they cost to make, even if they are worth it (i.e., bring commensurate user benefit).&lt;/p&gt;
&lt;p&gt;The iPhone also introduced a lot of walled-garden practices. People like to complain about the revenue split requirements, problematic as they are, but they aren&amp;rsquo;t really the fundamental problem. I think that the real problem is that Apple introduced itself as a gatekeeper between the developers and their customers. They gave themselves the right to deem an application unfit for sale, based on ever-changing interpretation of App Store rules that now means that anybody thinking of entering the Apple ecosystem as a developer needs to factor in that their application could be rejected for&amp;hellip; well, no good reason.&lt;/p&gt;
&lt;p&gt;In plain terms, it has dramatically increased the risk of developing for Apple platforms. When the platform owner has the ability to unilaterally block applications from sale for nebulous reasons that can&amp;rsquo;t be determined in advance &amp;ndash; I specifically &lt;strong&gt;do not&lt;/strong&gt; mean gross violations of their basic App Store rules, I mean when reviewers become arbiters of what functionality is &amp;ldquo;good&amp;rdquo;, sufficient and allowed &amp;ndash; with little or no recourse.&lt;/p&gt;
&lt;p&gt;Under these circumstances, who wants to spend a non-trivial (and increasing) amount of development effort making something that the reviewer of the day may decide has no place in the walled garden? Compared with the acceptance roulette (repeated with every new submission), the rent-seeking demand for a revenue percentage pales in comparison. As an outsider looking at the Apple platform market, rent seeking is is a fact of life one can plan for (although it does make the market less attractive on the whole). What is not manageable is the &lt;em&gt;uncertainty&lt;/em&gt;. Not knowing whether an application will be allowed until you spend significant resources and opportunity cost to build it is going to remain the biggest barrier to entry for new developers that aren&amp;rsquo;t already committed to the platform.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m sure that Apple feels that the intrinsic value of access to that walled-in market is motivation enough, but the truth is that small businesses growing organically have only so much tolerance for risk. Add to that the expectation that all software is now &amp;ldquo;cheap&amp;rdquo;&amp;hellip; Why would anybody bother?&lt;/p&gt;
&lt;p&gt;This is something that Apple has the ability to address. Whether they want to or not is another matter.&lt;/p&gt;
&lt;p&gt;P.S.: I realize that mobile device management (MDM) is one way to tackle this problem for custom/proprietary Enterprise applications, but there is a huge chasm between being able to sell to anyone via the Apple (or other, in the EU) App Store and participating in the Enterprise sales market. To some extent, it is just trading one gatekeeper for another. Neither is particularly attractive for small ISVs.&lt;/p&gt;
</description>
      <source:markdown>On the occasion of WWDC starting today, I thought that I&#39;d write some thoughts down as to why, even as a fan of Apple platforms, I still would not want to be a developer for those platforms.

## The old days

I have to admit that I am not a long-time Apple fan in the &#34;bleed six colors&#34; sense. Back in the 1980s, I was more of a hardware hacker with too limited a budget to ever seriously look at Apple products. In the 1990s, Apple had drifted into comparative technical obsolescence, so it was really hard to get excited about the mac. I occasionally used one at work, but world had more or less caught up with the basics of the user experience and the classic MacOS technical underpinnings were stale. There were a multitude of operating systems that were technically more exciting and good enough from an UX perspective, so why pay attention to the also-ran in the market?

## Getting on board

Come the 2000s and OS X, things have changed. The new Intel macs provide an on ramp to the platform with a built-in escape hatch (if all else fails, we could always fall back to Windows), so I&#39;m one of the early Intel mac adopters (yay for the white polycarbonate MacBook!) and haven&#39;t looked back -- as a user -- since. Professionally, though, it has never made sense: the kind of software I worked on was always technical, but never important enough to the customer to drive a platform switch. It was always &#34;put your thing on our corporate standard PC&#34;. Later on, web-delivered applications didn&#39;t really care about the client computer -- as long as there was a browser, it would run.

During this whole time, the mac remained a great developer machine -- whether developing for Windows (in a VM) or Linux servers (the UNIX underpinnings of modern macOS help a lot), the mac was a great place to work, but never the development target.

Looking at the applications I used on the mac, I could see that there was a really awesome combination at play: a solid operating system, frameworks like AppKit that brought fundamental improvements to the developer experience and human interface guidelines that you could create usable, productive software without a massive investment in programming or design effort. I still didn&#39;t have a work reason to make anything for the platform, but the productivity advantage for technical applications seemed real. The barrier to entry for mac application development was pretty low -- tempered by the then-small market.

## Enter the iPhone

The iPhone changed things fundamentally. Yes, in all the ways we know, but also it changed the expectation of what an application should look like. Over the next few years, the expectation of highly-designed, highly-polished (as opposed to _usable_) negated the productivity advantage. This permeated other software platforms, of course, but it shifted the baseline of what people expect from software (even line of business enterprise software) in an expensive way. Thankfully, iOS 7 and some of the more recent UI paradigms (although we may see something different at this year&#39;s WWDC) put a damper on the design arms race around some of the more expensive trends, but I get the feeling that the baseline application for an Apple platform got more expensive to develop over the years.

Simultaneously, the iPhone -- by virtue of its scale -- devalued third-party software. With millions of installations, even complicated software can be sold pretty cheap. However, the expectation that all software is cheap has made low-volume applications extremely hard to sell for what they cost to make, even if they are worth it (i.e., bring commensurate user benefit).

The iPhone also introduced a lot of walled-garden practices. People like to complain about the revenue split requirements, problematic as they are, but they aren&#39;t really the fundamental problem. I think that the real problem is that Apple introduced itself as a gatekeeper between the developers and their customers. They gave themselves the right to deem an application unfit for sale, based on ever-changing interpretation of App Store rules that now means that anybody thinking of entering the Apple ecosystem as a developer needs to factor in that their application could be rejected for... well, no good reason.

In plain terms, it has dramatically increased the risk of developing for Apple platforms. When the platform owner has the ability to unilaterally block applications from sale for nebulous reasons that can&#39;t be determined in advance -- I specifically **do not** mean gross violations of their basic App Store rules, I mean when reviewers become arbiters of what functionality is &#34;good&#34;, sufficient and allowed -- with little or no recourse.

Under these circumstances, who wants to spend a non-trivial (and increasing) amount of development effort making something that the reviewer of the day may decide has no place in the walled garden? Compared with the acceptance roulette (repeated with every new submission), the rent-seeking demand for a revenue percentage pales in comparison. As an outsider looking at the Apple platform market, rent seeking is is a fact of life one can plan for (although it does make the market less attractive on the whole). What is not manageable is the _uncertainty_. Not knowing whether an application will be allowed until you spend significant resources and opportunity cost to build it is going to remain the biggest barrier to entry for new developers that aren&#39;t already committed to the platform.

I&#39;m sure that Apple feels that the intrinsic value of access to that walled-in market is motivation enough, but the truth is that small businesses growing organically have only so much tolerance for risk. Add to that the expectation that all software is now &#34;cheap&#34;... Why would anybody bother?

This is something that Apple has the ability to address. Whether they want to or not is another matter.

P.S.: I realize that mobile device management (MDM) is one way to tackle this problem for custom/proprietary Enterprise applications, but there is a huge chasm between being able to sell to anyone via the Apple (or other, in the EU) App Store and participating in the Enterprise sales market. To some extent, it is just trading one gatekeeper for another. Neither is particularly attractive for small ISVs.
</source:markdown>
    </item>
    
    <item>
      <title>Video creation — the evergreen money pit</title>
      <link>https://blog.scroogieboy.com/2025/06/06/video-creation-the-evergreen-money.html</link>
      <pubDate>Fri, 06 Jun 2025 23:10:55 -0500</pubDate>
      
      <guid>http://cwirving.micro.blog/2025/06/06/video-creation-the-evergreen-money.html</guid>
      <description>&lt;p&gt;Generating decent-quality video content (e.g., for YouTube) is a definite test of one’s priorities… “Decent” these days means 4K footage with some lighting and a good quality mic. The storage and processing requirements aren’t trivial. Now I see why people get excited every year when the new macs come out. For a developer, the speed ramp is a gentle slope. For video professionals, it is a steeper slope (at significant cost!).&lt;/p&gt;
&lt;p&gt;I do wonder how many small creators actually archive their projects? It seems like the archival storage needs could get really expensive really fast. Maybe most people don’t care and just discard the intermediate files? To be fair, there isn’t a ton of incentive for normal people to revisit past projects. So, maybe the answer is to be realistic about priorities and treat this stuff more as throwaway artifacts. Just keep the final video in case something bad happens with the hosting provider…&lt;/p&gt;
</description>
      <source:markdown>Generating decent-quality video content (e.g., for YouTube) is a definite test of one’s priorities… “Decent” these days means 4K footage with some lighting and a good quality mic. The storage and processing requirements aren’t trivial. Now I see why people get excited every year when the new macs come out. For a developer, the speed ramp is a gentle slope. For video professionals, it is a steeper slope (at significant cost!).

I do wonder how many small creators actually archive their projects? It seems like the archival storage needs could get really expensive really fast. Maybe most people don’t care and just discard the intermediate files? To be fair, there isn’t a ton of incentive for normal people to revisit past projects. So, maybe the answer is to be realistic about priorities and treat this stuff more as throwaway artifacts. Just keep the final video in case something bad happens with the hosting provider…
</source:markdown>
    </item>
    
    <item>
      <title>Canon PIXMA Pro-200s black &amp; white printing update</title>
      <link>https://blog.scroogieboy.com/2025/05/29/canon-pixma-pros-black-white.html</link>
      <pubDate>Thu, 29 May 2025 09:52:04 -0500</pubDate>
      
      <guid>http://cwirving.micro.blog/2025/05/29/canon-pixma-pros-black-white.html</guid>
      <description>&lt;p&gt;As a follow-up to my Canon PIXMA Pro-200s first impressions, I have to admit that I was wrong &amp;ndash; well, wrong in one very specific way. But, before I talk about that, I do need to cover what hasn&amp;rsquo;t changed: I still really like this printer and it is fantastic for color prints and color-managed black &amp;amp; white prints.&lt;/p&gt;
&lt;p&gt;So, to get to the part where I was wrong, I did some experiments with the Canon &amp;ldquo;Black &amp;amp; White Photo&amp;rdquo; mode on more papers and this is definitely a mode that is very paper-sensitive. I wouldn&amp;rsquo;t exactly say that I&amp;rsquo;m seeing metameric failure by the dye ink, but I definitely see different tints on different papers &amp;ndash; which then are magnified by different lighting. I am sure that there is some degree of ink metamerism in what I&amp;rsquo;m seeing, but the main effect is more of a paper-specific color tint in black &amp;amp; white mode.&lt;/p&gt;
&lt;p&gt;You could call it a &amp;ldquo;problem&amp;rdquo; in that it does limit paper choices somewhat and requires a bit more experimentation to get things right, but it&amp;rsquo;s a problem I am willing to live with in return for the brilliant color prints. It is also a problem that people work around by printing in color mode with a good paper-specific ICC profile. I remember watching &lt;a href=&#34;https://www.youtube.com/@FotospeedUK/videos&#34;&gt;YouTube videos&lt;/a&gt; by &lt;a href=&#34;https://fotospeed.com&#34;&gt;FotoSpeed&lt;/a&gt; (a paper supplier in the UK) where they strongly recommended using custom profiles to make black &amp;amp; white prints. At the time, I thought it was a little incongruous, given how others like the black &amp;amp; white print mode. Having done some test prints, I think I understand this a little better: the black &amp;amp; white print mode is a fairly paper-independent one-trick pony when the ICC profiles are custom to each paper specifically. It&amp;rsquo;s possible that I could get better results by using the advanced adjustments in Canon Professional Print &amp;amp; Layout, but that seems like a lot more work than just using a custom profile.&lt;/p&gt;
&lt;h2 id=&#34;the-experiment&#34;&gt;The experiment:&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;I printed the same black &amp;amp; white picture on four different papers (three Canon papers and one Red River paper) using &amp;ldquo;Black &amp;amp; White Photo&amp;rdquo; mode in the Canon driver.&lt;/li&gt;
&lt;li&gt;After drying overnight, &lt;a href=&#34;https://flickr.com/photos/cwirving/54521863529/&#34;&gt;I laid them out on the floor alongside an 18% grey card&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;I photographed them under different lighting conditions, processed the pictures in DxO PhotoLab to set the white balance according to the card, de-skew the picture and turn the vibrance dial to the maximum.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Each picture has the same papers in the same order, clockwise from top left:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Canon Pro Luster Photo Paper&lt;/li&gt;
&lt;li&gt;Canon Matte Photo paper&lt;/li&gt;
&lt;li&gt;Red River Aurora Art White 300&lt;/li&gt;
&lt;li&gt;Canon Pro Premium Matte Photo Paper&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Turning the vibrance dial to the maximum accentuates (in a way that isn&amp;rsquo;t apparent to the naked eye) some of the color discrepancies in the prints. Repeating the exercise with different light sources also shows some of the different responses:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://flickr.com/photos/cwirving/54521927833/&#34;&gt;Natural daylight&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[Incandescent light bulb][https://flickr.com/photos/cwirving/54522028850/]&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://flickr.com/photos/cwirving/54521863559/&#34;&gt;Some random old CFL bulb&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[A consumer-grade &amp;ldquo;daylight&amp;rdquo; LED bulb][https://flickr.com/photos/cwirving/54521927743/]&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://flickr.com/photos/cwirving/54520806327/&#34;&gt;A consumer-grade &amp;ldquo;warm white&amp;rdquo; LED bulb&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I don&amp;rsquo;t think I can give any meaningful quantitative results from this tiny experiment using comparatively inaccurate instruments, but my main conclusion (other than &amp;ldquo;make sure you have decent lighting&amp;rdquo;) is that the black &amp;amp; white prints are sensitive to both paper and the light source used to illuminate them.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s also interesting that the Red River Aurora Art paper performs very differently in this print mode &amp;ndash; circling back to the FotoSpeed comments earlier, this could be why they prefer printing with a custom profile: the black &amp;amp; white mode &amp;ldquo;special sauce&amp;rdquo; depends on the Canon paper used. A subsequent experiment on the same paper using the Red River-provided custom profile does seem to confirm this (the print has a much more neutral tone and density).&lt;/p&gt;
</description>
      <source:markdown>As a follow-up to my Canon PIXMA Pro-200s first impressions, I have to admit that I was wrong -- well, wrong in one very specific way. But, before I talk about that, I do need to cover what hasn&#39;t changed: I still really like this printer and it is fantastic for color prints and color-managed black &amp; white prints.

So, to get to the part where I was wrong, I did some experiments with the Canon &#34;Black &amp; White Photo&#34; mode on more papers and this is definitely a mode that is very paper-sensitive. I wouldn&#39;t exactly say that I&#39;m seeing metameric failure by the dye ink, but I definitely see different tints on different papers -- which then are magnified by different lighting. I am sure that there is some degree of ink metamerism in what I&#39;m seeing, but the main effect is more of a paper-specific color tint in black &amp; white mode.

You could call it a &#34;problem&#34; in that it does limit paper choices somewhat and requires a bit more experimentation to get things right, but it&#39;s a problem I am willing to live with in return for the brilliant color prints. It is also a problem that people work around by printing in color mode with a good paper-specific ICC profile. I remember watching [YouTube videos](https://www.youtube.com/@FotospeedUK/videos) by [FotoSpeed](https://fotospeed.com) (a paper supplier in the UK) where they strongly recommended using custom profiles to make black &amp; white prints. At the time, I thought it was a little incongruous, given how others like the black &amp; white print mode. Having done some test prints, I think I understand this a little better: the black &amp; white print mode is a fairly paper-independent one-trick pony when the ICC profiles are custom to each paper specifically. It&#39;s possible that I could get better results by using the advanced adjustments in Canon Professional Print &amp; Layout, but that seems like a lot more work than just using a custom profile.

## The experiment:

- I printed the same black &amp; white picture on four different papers (three Canon papers and one Red River paper) using &#34;Black &amp; White Photo&#34; mode in the Canon driver.
- After drying overnight, [I laid them out on the floor alongside an 18% grey card](https://flickr.com/photos/cwirving/54521863529/).
- I photographed them under different lighting conditions, processed the pictures in DxO PhotoLab to set the white balance according to the card, de-skew the picture and turn the vibrance dial to the maximum.

Each picture has the same papers in the same order, clockwise from top left:
- Canon Pro Luster Photo Paper
- Canon Matte Photo paper
- Red River Aurora Art White 300
- Canon Pro Premium Matte Photo Paper

Turning the vibrance dial to the maximum accentuates (in a way that isn&#39;t apparent to the naked eye) some of the color discrepancies in the prints. Repeating the exercise with different light sources also shows some of the different responses:
- [Natural daylight](https://flickr.com/photos/cwirving/54521927833/)
- [Incandescent light bulb][https://flickr.com/photos/cwirving/54522028850/]
- [Some random old CFL bulb](https://flickr.com/photos/cwirving/54521863559/)
- [A consumer-grade &#34;daylight&#34; LED bulb][https://flickr.com/photos/cwirving/54521927743/]
- [A consumer-grade &#34;warm white&#34; LED bulb](https://flickr.com/photos/cwirving/54520806327/)

I don&#39;t think I can give any meaningful quantitative results from this tiny experiment using comparatively inaccurate instruments, but my main conclusion (other than &#34;make sure you have decent lighting&#34;) is that the black &amp; white prints are sensitive to both paper and the light source used to illuminate them.

It&#39;s also interesting that the Red River Aurora Art paper performs very differently in this print mode -- circling back to the FotoSpeed comments earlier, this could be why they prefer printing with a custom profile: the black &amp; white mode &#34;special sauce&#34; depends on the Canon paper used. A subsequent experiment on the same paper using the Red River-provided custom profile does seem to confirm this (the print has a much more neutral tone and density).
</source:markdown>
    </item>
    
    <item>
      <title>Adobe shenanigans of the week</title>
      <link>https://blog.scroogieboy.com/2025/05/20/adobe-shenanigans-of-the-week.html</link>
      <pubDate>Tue, 20 May 2025 12:41:50 -0500</pubDate>
      
      <guid>http://cwirving.micro.blog/2025/05/20/adobe-shenanigans-of-the-week.html</guid>
      <description>&lt;p&gt;I ditched Adobe Creative Cloud a few years ago (for a combination of DxO PhotoLab and the Affinity suite) and every so often wonder whether I just traded one treadmill for another… Then there are news stories of &lt;a href=&#34;https://arstechnica.com/gadgets/2025/05/adobe-hikes-subscription-prices-to-support-generative-ai-features/&#34;&gt;these shenanigans&lt;/a&gt; by Adobe that remind me how expensive that Adobe treadmill was.&lt;/p&gt;
&lt;p&gt;And, of course, I don’t &lt;em&gt;have&lt;/em&gt; to upgrade PhotoLab every year… But I do enjoy the additions so far, so I have been doing so.&lt;/p&gt;
</description>
      <source:markdown>I ditched Adobe Creative Cloud a few years ago (for a combination of DxO PhotoLab and the Affinity suite) and every so often wonder whether I just traded one treadmill for another… Then there are news stories of [these shenanigans](https://arstechnica.com/gadgets/2025/05/adobe-hikes-subscription-prices-to-support-generative-ai-features/) by Adobe that remind me how expensive that Adobe treadmill was.

And, of course, I don’t _have_ to upgrade PhotoLab every year… But I do enjoy the additions so far, so I have been doing so.
</source:markdown>
    </item>
    
    <item>
      <title>Canon PIXMA Pro-200s first impressions</title>
      <link>https://blog.scroogieboy.com/2025/05/12/canon-pixma-pros-first-impressions.html</link>
      <pubDate>Mon, 12 May 2025 14:36:11 -0500</pubDate>
      
      <guid>http://cwirving.micro.blog/2025/05/12/canon-pixma-pros-first-impressions.html</guid>
      <description>&lt;p&gt;First of all, I’m just a hobbyist — not a professional photographer. I have no intention of selling prints, archiving them for future generations, etc. So, with that said, the entry-level “pro” printer from Canon is surprisingly good.&lt;/p&gt;
&lt;p&gt;I think that it’s pretty easy to come away from YouTube and the Internet in general thinking that photo printing is for pigment inks, period — that dye inks, as used in the Pro-200, are so inferior that they aren’t worthy of consideration, especially if you print black and white pictures or print on matte paper. Well, that’s clearly not true…&lt;/p&gt;
&lt;p&gt;The truth is far more nuanced and the likes of &lt;a href=&#34;https://www.northlight-images.co.uk/keiths-photography-blog/&#34;&gt;Keith Cooper&lt;/a&gt; do a great job of explaining the finer details, but you could easily believe that something like the Pro-200s (or it’s predecessor, the Pro-200) give up a lot once you stray from color prints on glossy paper. Maybe they do give up something… but that doesn’t mean that the results aren’t already pretty spectacular. Looking at test target prints across a few representative Canon papers was eye opening — the predicted drop-off in quality when printing on matte paper or black and white print metamerism failures didn’t materialize. I’m sure that I’ll find issues as I try other papers, but the results on the handful of Canon and Red River papers I have tried so far are very nice.&lt;/p&gt;
&lt;p&gt;Everything is relative — compared with ten- or twelve-ink printers, this is probably a clumsy toy — but I think that an entry-level “pro” printer exceeds hobbyist needs quite handsomely. To be clear, I don’t think that this is specific to the Canon Pro-200s. It likely is true for the whole class of competitors at this level (like the Epson ET-8550).&lt;/p&gt;
&lt;p&gt;So, in short, first impressions are very positive.&lt;/p&gt;
</description>
      <source:markdown>First of all, I’m just a hobbyist — not a professional photographer. I have no intention of selling prints, archiving them for future generations, etc. So, with that said, the entry-level “pro” printer from Canon is surprisingly good.

I think that it’s pretty easy to come away from YouTube and the Internet in general thinking that photo printing is for pigment inks, period — that dye inks, as used in the Pro-200, are so inferior that they aren’t worthy of consideration, especially if you print black and white pictures or print on matte paper. Well, that’s clearly not true…

The truth is far more nuanced and the likes of [Keith Cooper](https://www.northlight-images.co.uk/keiths-photography-blog/) do a great job of explaining the finer details, but you could easily believe that something like the Pro-200s (or it’s predecessor, the Pro-200) give up a lot once you stray from color prints on glossy paper. Maybe they do give up something… but that doesn’t mean that the results aren’t already pretty spectacular. Looking at test target prints across a few representative Canon papers was eye opening — the predicted drop-off in quality when printing on matte paper or black and white print metamerism failures didn’t materialize. I’m sure that I’ll find issues as I try other papers, but the results on the handful of Canon and Red River papers I have tried so far are very nice.

Everything is relative — compared with ten- or twelve-ink printers, this is probably a clumsy toy — but I think that an entry-level “pro” printer exceeds hobbyist needs quite handsomely. To be clear, I don’t think that this is specific to the Canon Pro-200s. It likely is true for the whole class of competitors at this level (like the Epson ET-8550).

So, in short, first impressions are very positive.
</source:markdown>
    </item>
    
    <item>
      <title>Desired state and DevOps</title>
      <link>https://blog.scroogieboy.com/2025/04/23/desired-state-and-devops.html</link>
      <pubDate>Wed, 23 Apr 2025 11:31:57 -0500</pubDate>
      
      <guid>http://cwirving.micro.blog/2025/04/23/desired-state-and-devops.html</guid>
      <description>&lt;h2 id=&#34;tldr&#34;&gt;TL;DR&lt;/h2&gt;
&lt;p&gt;This has turned into a long-winded rant, so what point am I trying to make here? Well, a couple of them:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Whenever one says &amp;ldquo;desired state&amp;rdquo;, there should be some form of reconciliation, not just unidirectional change propagation.&lt;/li&gt;
&lt;li&gt;The deterministic portion of the reconciliation should be fast, relying on reproducibility to deduplicate time-consuming steps. Without the needless slow &amp;ldquo;build&amp;rdquo; steps, the performance of the overall reconciliation process becomes easier to focus on and optimize.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;the-rant&#34;&gt;The rant&lt;/h2&gt;
&lt;p&gt;Related to my example yesterday where the desired state of a complete SaaS control plane can be quite successfully be stored in a Git repo, I think it is worth taking a moment to unpack the intent of such an implementation and see how implementations frequently fail to live up to that intent. In short, when saying that a repo is the &lt;em&gt;desired state&lt;/em&gt; of X, we imply that something will reconcile the actual and desired states. In Kubernetes terms, a &lt;em&gt;reconciliation loop&lt;/em&gt;.&lt;/p&gt;
&lt;h3 id=&#34;build-systems-dont-reconcile-things&#34;&gt;Build systems don&amp;rsquo;t reconcile things&lt;/h3&gt;
&lt;p&gt;My experience has been that reality on the ground is usually not so nice &amp;ndash; the old-fashioned &amp;ldquo;build system&amp;rdquo; roots of DevOps infrastructure leads everyone to treat this as an open-loop state machine rather than a closed-loop control system. This is where naming doesn&amp;rsquo;t help: &amp;ldquo;GitOps&amp;rdquo; as a term falls short of the full intent, quite possibly because it has been captured by vendors (just like &amp;ldquo;observability&amp;rdquo; has). Sure, the common usage of the &amp;ldquo;GitOps&amp;rdquo; term captures the idea that the desired state of the system is present in a Git repo and that &lt;em&gt;something&lt;/em&gt; will make the real world reflect it, what it doesn&amp;rsquo;t capture is how the real world will be changed. Because of the industry legacy of build systems, there is an assumption that the only source of changes is the repo &amp;ndash; everything else flows unidirectionally from there. That&amp;rsquo;s simplistic, but false, assumption.&lt;/p&gt;
&lt;p&gt;The long shared history of &amp;ldquo;I have new source files, therefore I must build and deploy new binaries&amp;rdquo; is comfortable, but it isn&amp;rsquo;t really the job to be done. The job to be done is to ensure that the deployed binaries reflect the source code. It doesn&amp;rsquo;t matter &lt;em&gt;why&lt;/em&gt; they don&amp;rsquo;t currently match, the situation needs to be remedied (by, absent any optimizations, building and deploying the code). So, we have a lot of tooling that was created for a subset of the job to be done (the hammer), leading people to treat everything as a nail.&lt;/p&gt;
&lt;h3 id=&#34;people-set-up-build-systems-to-be-inefficient&#34;&gt;People set up build systems to be inefficient&lt;/h3&gt;
&lt;p&gt;Aside from these build systems&#39; inability to recognize and recover from changes that don&amp;rsquo;t follow the strict state machine they were coded to implement, the heritage of applying them to flakey technologies leads to rigid and inefficient patterns. If merging a PR to the main branch means that it is code that we want to see in production, why do I see so many teams run all the tests, security scans, etc. again &lt;em&gt;after&lt;/em&gt; the merge? They should be prerequisites to the merge (and often are), but teams see the &amp;ldquo;build&amp;rdquo; as the one true pipeline that runs as continuous integration the only source of truth, ignoring all checks that happened prior.&lt;/p&gt;
&lt;p&gt;The sad thing is that the push towards immutable build artifacts and reproducibility has been underway for many years. In a world where &amp;ldquo;building&amp;rdquo; the same code produces the same results forever, there is no need to build it more than once. Those results can be cached for efficiency. The reason I put &amp;ldquo;build&amp;rdquo; in quotes is because so many of the time-consuming transformations that happen along the path from checking in code to having an updated running system are now reproducible, deterministic, transformations. These aren&amp;rsquo;t just code compilation steps &amp;ndash; unit testing, bill of materials determination and so forth are, if done properly, immutable. The work that remains based on external state, such as determining which software vulnerabilities are present in the bill of materials &lt;strong&gt;today&lt;/strong&gt;, is limited.&lt;/p&gt;
&lt;p&gt;We shouldn&amp;rsquo;t live in a world where all the same expensive steps are performed over and over. Not just from resource efficiency perspective, but also from an operational perspective: if the reconciliation from code to deployed system is fast, there only needs to be one way to roll back code, for example &amp;ndash; just update the main branch to reflect the desired version. So many of the special cases teams are forced to include in their operational processes are just there to work around inefficiencies that have been carried forward from decades-old infrastructure concepts. While I&amp;rsquo;m not in love with the implementation, I think that &lt;a href=&#34;https://dagger.io&#34;&gt;Dagger&lt;/a&gt; is a good example of somebody rethinking the problem in a modern setting.&lt;/p&gt;
</description>
      <source:markdown>## TL;DR

This has turned into a long-winded rant, so what point am I trying to make here? Well, a couple of them:
- Whenever one says &#34;desired state&#34;, there should be some form of reconciliation, not just unidirectional change propagation.
- The deterministic portion of the reconciliation should be fast, relying on reproducibility to deduplicate time-consuming steps. Without the needless slow &#34;build&#34; steps, the performance of the overall reconciliation process becomes easier to focus on and optimize.

## The rant

Related to my example yesterday where the desired state of a complete SaaS control plane can be quite successfully be stored in a Git repo, I think it is worth taking a moment to unpack the intent of such an implementation and see how implementations frequently fail to live up to that intent. In short, when saying that a repo is the _desired state_ of X, we imply that something will reconcile the actual and desired states. In Kubernetes terms, a _reconciliation loop_.

### Build systems don&#39;t reconcile things

My experience has been that reality on the ground is usually not so nice -- the old-fashioned &#34;build system&#34; roots of DevOps infrastructure leads everyone to treat this as an open-loop state machine rather than a closed-loop control system. This is where naming doesn&#39;t help: &#34;GitOps&#34; as a term falls short of the full intent, quite possibly because it has been captured by vendors (just like &#34;observability&#34; has). Sure, the common usage of the &#34;GitOps&#34; term captures the idea that the desired state of the system is present in a Git repo and that _something_ will make the real world reflect it, what it doesn&#39;t capture is how the real world will be changed. Because of the industry legacy of build systems, there is an assumption that the only source of changes is the repo -- everything else flows unidirectionally from there. That&#39;s simplistic, but false, assumption.

The long shared history of &#34;I have new source files, therefore I must build and deploy new binaries&#34; is comfortable, but it isn&#39;t really the job to be done. The job to be done is to ensure that the deployed binaries reflect the source code. It doesn&#39;t matter _why_ they don&#39;t currently match, the situation needs to be remedied (by, absent any optimizations, building and deploying the code). So, we have a lot of tooling that was created for a subset of the job to be done (the hammer), leading people to treat everything as a nail.

### People set up build systems to be inefficient

Aside from these build systems&#39; inability to recognize and recover from changes that don&#39;t follow the strict state machine they were coded to implement, the heritage of applying them to flakey technologies leads to rigid and inefficient patterns. If merging a PR to the main branch means that it is code that we want to see in production, why do I see so many teams run all the tests, security scans, etc. again _after_ the merge? They should be prerequisites to the merge (and often are), but teams see the &#34;build&#34; as the one true pipeline that runs as continuous integration the only source of truth, ignoring all checks that happened prior.

The sad thing is that the push towards immutable build artifacts and reproducibility has been underway for many years. In a world where &#34;building&#34; the same code produces the same results forever, there is no need to build it more than once. Those results can be cached for efficiency. The reason I put &#34;build&#34; in quotes is because so many of the time-consuming transformations that happen along the path from checking in code to having an updated running system are now reproducible, deterministic, transformations. These aren&#39;t just code compilation steps -- unit testing, bill of materials determination and so forth are, if done properly, immutable. The work that remains based on external state, such as determining which software vulnerabilities are present in the bill of materials **today**, is limited.

We shouldn&#39;t live in a world where all the same expensive steps are performed over and over. Not just from resource efficiency perspective, but also from an operational perspective: if the reconciliation from code to deployed system is fast, there only needs to be one way to roll back code, for example -- just update the main branch to reflect the desired version. So many of the special cases teams are forced to include in their operational processes are just there to work around inefficiencies that have been carried forward from decades-old infrastructure concepts. While I&#39;m not in love with the implementation, I think that [Dagger](https://dagger.io) is a good example of somebody rethinking the problem in a modern setting.
</source:markdown>
    </item>
    
    <item>
      <title>Goldilocks SaaS control planes</title>
      <link>https://blog.scroogieboy.com/2025/04/22/goldilocks-saas-control-planes.html</link>
      <pubDate>Tue, 22 Apr 2025 16:55:06 -0500</pubDate>
      
      <guid>http://cwirving.micro.blog/2025/04/22/goldilocks-saas-control-planes.html</guid>
      <description>&lt;p&gt;I find that reading the &lt;a href=&#34;https://www.oreilly.com/library/view/building-multi-tenant-saas/9781098140632/&#34;&gt;Building Multi-Tenant Architectures&lt;/a&gt; book leads to a lot of nodding in agreement, with the odd raised eyebrow. One moment that struck me relatively early on is that Tod Golding is not letting the reader get carried away with the features of the SaaS system they want to build &amp;ndash; the control plane of the system is fundamental to actually having a sustainable product. We&amp;rsquo;re in violent agreement there. What led to the raised eyebrow is the way in which the reader easily can go down a rabbit hole of overshooting the non-functionals of the control plane by building it with the same technology and mindset as the application plane itself.&lt;/p&gt;
&lt;p&gt;Of course, there are cases where the control plane and its various components deals with massive volumes or has challenging latency requirements. Those cases will require a carefully-crafted high-performance control plane, sure&amp;hellip; Most likely, there are pockets of demanding functionality in the control plane (e.g., the hot path through identity management, application observability, etc.), but most of the control plane deals with relatively small volumes of data with infrequent changes. Not everyone intents to scale to the heights of large-scale business-to-consumer (B2C) SaaS, so building a control plane implementation that meets those needs out of the box is gross overkill.&lt;/p&gt;
&lt;p&gt;Now, there needs to be &lt;strong&gt;a&lt;/strong&gt; control plane, and the handoff between control and application planes needs to be well-enough defined to allow implementation changes in the future&amp;hellip; And &lt;strong&gt;that&amp;rsquo;s probably it&lt;/strong&gt; (until the system grows). The initial implementation doesn&amp;rsquo;t need to be built in the highest-performance programming language, use the fanciest storage technology when the users and tenant volumes don&amp;rsquo;t justify them in the control plane. In fact, early on, I would argue that simplicity and diagnosability are the values to cultivate above all.&lt;/p&gt;
&lt;p&gt;As an example, for the entirety of my involvement in the SaaS rapid solution delivery platform at my last job, we were able to make do with human-readable files in a Git repo and some scripting as its main control plane. Heretical as that may sound, it was &lt;em&gt;enough&lt;/em&gt; for current and projected scale. Was it fancy? No&amp;hellip; But the desired state of the system was right there for the entire team to see when there were problems, plus the pull requests on the repo gave us relatively sophisticated review and historical auditing functionality without major up-front software development. I wouldn&amp;rsquo;t necessarily recommend the approach for everyone, but it does illustrate that you can often meet control plane your needs without spending a colossal amount of money or completely capitulating to a third party&amp;rsquo;s system (a.k.a., &amp;ldquo;do what the cloud provider tells us to do&amp;rdquo;).&lt;/p&gt;
</description>
      <source:markdown>I find that reading the [Building Multi-Tenant Architectures](https://www.oreilly.com/library/view/building-multi-tenant-saas/9781098140632/) book leads to a lot of nodding in agreement, with the odd raised eyebrow. One moment that struck me relatively early on is that Tod Golding is not letting the reader get carried away with the features of the SaaS system they want to build -- the control plane of the system is fundamental to actually having a sustainable product. We&#39;re in violent agreement there. What led to the raised eyebrow is the way in which the reader easily can go down a rabbit hole of overshooting the non-functionals of the control plane by building it with the same technology and mindset as the application plane itself.

Of course, there are cases where the control plane and its various components deals with massive volumes or has challenging latency requirements. Those cases will require a carefully-crafted high-performance control plane, sure... Most likely, there are pockets of demanding functionality in the control plane (e.g., the hot path through identity management, application observability, etc.), but most of the control plane deals with relatively small volumes of data with infrequent changes. Not everyone intents to scale to the heights of large-scale business-to-consumer (B2C) SaaS, so building a control plane implementation that meets those needs out of the box is gross overkill.

Now, there needs to be **a** control plane, and the handoff between control and application planes needs to be well-enough defined to allow implementation changes in the future... And **that&#39;s probably it** (until the system grows). The initial implementation doesn&#39;t need to be built in the highest-performance programming language, use the fanciest storage technology when the users and tenant volumes don&#39;t justify them in the control plane. In fact, early on, I would argue that simplicity and diagnosability are the values to cultivate above all.

As an example, for the entirety of my involvement in the SaaS rapid solution delivery platform at my last job, we were able to make do with human-readable files in a Git repo and some scripting as its main control plane. Heretical as that may sound, it was _enough_ for current and projected scale. Was it fancy? No... But the desired state of the system was right there for the entire team to see when there were problems, plus the pull requests on the repo gave us relatively sophisticated review and historical auditing functionality without major up-front software development. I wouldn&#39;t necessarily recommend the approach for everyone, but it does illustrate that you can often meet control plane your needs without spending a colossal amount of money or completely capitulating to a third party&#39;s system (a.k.a., &#34;do what the cloud provider tells us to do&#34;).
</source:markdown>
    </item>
    
    <item>
      <title>The most dangerous word in software architecture</title>
      <link>https://blog.scroogieboy.com/2025/04/16/the-most-dangerous-word-in.html</link>
      <pubDate>Wed, 16 Apr 2025 14:43:28 -0500</pubDate>
      
      <guid>http://cwirving.micro.blog/2025/04/16/the-most-dangerous-word-in.html</guid>
      <description>&lt;p&gt;The most dangerous word in software architecture is “yes” — especially in its qualified form (“yes, but…” — where nobody will listen to the “but…” part).&lt;/p&gt;
&lt;p&gt;I was chatting with colleagues about our biggest failures as software architects. We’ve built the wrong thing, failed to build things, built them buggy. We’ve made a lot of mistakes over the years, but the biggest ones — the product-killing ones are usually saying “yes” to something that might as well have opened a portal to Hell in the project. These were never frivolous “yes” answers. They were often tactical wins. But, what they did is establish a new expectation in the minds of stakeholders that made success significantly harder.&lt;/p&gt;
&lt;p&gt;I know that it is popular to say that “just” is the most dangerous word, but those are &lt;em&gt;tactical&lt;/em&gt; errors. The product-killing &lt;em&gt;strategy&lt;/em&gt; errors are the agreements, taking on things that aren’t really feasible without a technological investment that you can’t afford.&lt;/p&gt;
&lt;p&gt;I have done my share of them. They come in all shapes and sizes at the time, but they tend to take the form of doing something that you’d planned to &lt;em&gt;eventually&lt;/em&gt; do, but moved up to right away. The problem with saying “yes” to such requests is that they often appear like small things to the outside world, yet doing them properly would require the product implementation to mature significantly. What happens then is usually one of two things:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The feature apparently working removes the pressure to make the required technological investment. Why move a mountain when “it already works” (the “but…” part in “yes, but…”). By the time the limitations are apparent, the needed investment has grown due to technical debt and the appetite to make it has passed.&lt;/li&gt;
&lt;li&gt;The premature availability of a niche feature completely changes the perceived intent of the project. Gone are the original intentions and vision, all that is front and center is this niche feature. Sure, there are success stories of such distractions becoming successes in their own right (e.g., &lt;a href=&#34;https://en.wikipedia.org/wiki/History_of_Twitter&#34;&gt;Twitter&lt;/a&gt;) but, more often than not, the new thing is not a world-changing product — it is a shiny distraction that ultimately kills itself and its parent in an unintentional murder-suicide.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I suppose that you could also view this post as a warning about the perils of careless product roadmap management — which is true — but the momentous roadmap change doesn’t necessarily look like one. It looks like an innocent, constructive question. A question whose consequences only become apparent much later.&lt;/p&gt;
</description>
      <source:markdown>The most dangerous word in software architecture is “yes” — especially in its qualified form (“yes, but…” — where nobody will listen to the “but…” part).

I was chatting with colleagues about our biggest failures as software architects. We’ve built the wrong thing, failed to build things, built them buggy. We’ve made a lot of mistakes over the years, but the biggest ones — the product-killing ones are usually saying “yes” to something that might as well have opened a portal to Hell in the project. These were never frivolous “yes” answers. They were often tactical wins. But, what they did is establish a new expectation in the minds of stakeholders that made success significantly harder.

I know that it is popular to say that “just” is the most dangerous word, but those are _tactical_ errors. The product-killing _strategy_ errors are the agreements, taking on things that aren’t really feasible without a technological investment that you can’t afford.

I have done my share of them. They come in all shapes and sizes at the time, but they tend to take the form of doing something that you’d planned to _eventually_ do, but moved up to right away. The problem with saying “yes” to such requests is that they often appear like small things to the outside world, yet doing them properly would require the product implementation to mature significantly. What happens then is usually one of two things:

- The feature apparently working removes the pressure to make the required technological investment. Why move a mountain when “it already works” (the “but…” part in “yes, but…”). By the time the limitations are apparent, the needed investment has grown due to technical debt and the appetite to make it has passed.
- The premature availability of a niche feature completely changes the perceived intent of the project. Gone are the original intentions and vision, all that is front and center is this niche feature. Sure, there are success stories of such distractions becoming successes in their own right (e.g., [Twitter](https://en.wikipedia.org/wiki/History_of_Twitter)) but, more often than not, the new thing is not a world-changing product — it is a shiny distraction that ultimately kills itself and its parent in an unintentional murder-suicide.

I suppose that you could also view this post as a warning about the perils of careless product roadmap management — which is true — but the momentous roadmap change doesn’t necessarily look like one. It looks like an innocent, constructive question. A question whose consequences only become apparent much later.
</source:markdown>
    </item>
    
    <item>
      <title>So, you want to do SaaS? Read this book chapter first.</title>
      <link>https://blog.scroogieboy.com/2025/04/14/so-you-want-to-do.html</link>
      <pubDate>Mon, 14 Apr 2025 11:52:12 -0500</pubDate>
      
      <guid>http://cwirving.micro.blog/2025/04/14/so-you-want-to-do.html</guid>
      <description>&lt;p&gt;It feels weird to endorse a book just on its first chapter but, in terms of ROI, this could be the most important chapter in the book. The introductory first chapter in &lt;a href=&#34;https://www.oreilly.com/library/view/building-multi-tenant-saas/9781098140632/&#34;&gt;Building Multi-Tenant SaaS Architectures&lt;/a&gt; by Tod Golding should be a must-read for everybody involved in a software as a service (SaaS) business. It should also be a must-read for those who &lt;strong&gt;don&amp;rsquo;t want&lt;/strong&gt; a SaaS business model. The fundamental thing with software as a service is that it is a business model supported by technology. The two go hand in hand and you can&amp;rsquo;t have one without the other.&lt;/p&gt;
&lt;p&gt;So much pain and failure comes from the inability to recognize or admit that combination. Obviously, in the case of large companies, that does not mean that the entire business and technology foundation of the company needs to be that way &amp;ndash; you can (with difficulty, I will admit) have a clearly carved out SaaS business within a company that is fundamentally not a SaaS company. The key thing is that within the boundaries of the SaaS endeavor, business and technology need to be aligned on the model.&lt;/p&gt;
&lt;p&gt;I think it is also really valuable for readers whose conclusion after reading the chapter is &amp;ldquo;I can&amp;rsquo;t / don&amp;rsquo;t want to do that!&amp;rdquo; The recognition that the union of all the prerequisites is unacceptable to you is valuable. Pursuing the benefits of an unattainable model does nobody any good. The relative cost of $80 (the book&amp;rsquo;s current list price) and the time to read 22 pages vs. embarking on a doomed software project should be a no-brainer.&lt;/p&gt;
&lt;p&gt;I could (and probably will) write at length about how the SaaS model can be applied as part of an overall organization that, as a whole, doesn&amp;rsquo;t meet the prerequisites for a SaaS business but the first and most important step is recognizing the reality of the business model and the commitment it requires.&lt;/p&gt;
</description>
      <source:markdown>It feels weird to endorse a book just on its first chapter but, in terms of ROI, this could be the most important chapter in the book. The introductory first chapter in [Building Multi-Tenant SaaS Architectures](https://www.oreilly.com/library/view/building-multi-tenant-saas/9781098140632/) by Tod Golding should be a must-read for everybody involved in a software as a service (SaaS) business. It should also be a must-read for those who **don&#39;t want** a SaaS business model. The fundamental thing with software as a service is that it is a business model supported by technology. The two go hand in hand and you can&#39;t have one without the other.

So much pain and failure comes from the inability to recognize or admit that combination. Obviously, in the case of large companies, that does not mean that the entire business and technology foundation of the company needs to be that way -- you can (with difficulty, I will admit) have a clearly carved out SaaS business within a company that is fundamentally not a SaaS company. The key thing is that within the boundaries of the SaaS endeavor, business and technology need to be aligned on the model.

I think it is also really valuable for readers whose conclusion after reading the chapter is &#34;I can&#39;t / don&#39;t want to do that!&#34; The recognition that the union of all the prerequisites is unacceptable to you is valuable. Pursuing the benefits of an unattainable model does nobody any good. The relative cost of $80 (the book&#39;s current list price) and the time to read 22 pages vs. embarking on a doomed software project should be a no-brainer.

I could (and probably will) write at length about how the SaaS model can be applied as part of an overall organization that, as a whole, doesn&#39;t meet the prerequisites for a SaaS business but the first and most important step is recognizing the reality of the business model and the commitment it requires.
</source:markdown>
    </item>
    
    <item>
      <title>5 more mistakes people make when building SaaS software</title>
      <link>https://blog.scroogieboy.com/2025/04/09/more-mistakes-people-make-when.html</link>
      <pubDate>Wed, 09 Apr 2025 16:35:03 -0500</pubDate>
      
      <guid>http://cwirving.micro.blog/2025/04/09/more-mistakes-people-make-when.html</guid>
      <description>&lt;p&gt;As a follow-up to &lt;a href=&#34;https://blog.scroogieboy.com/2025/04/09/commentary-mistakes-people-make-building.html&#34;&gt;my comments on the InfoQ &amp;ldquo;QCon London: Mistakes People Make Building SaaS Software&amp;rdquo; post&lt;/a&gt;, I thought I would add my list of five additional common mistakes that I&amp;rsquo;ve seen SaaS product teams make.&lt;/p&gt;
&lt;h2 id=&#34;mismatched-revenue-vs-cost-scaling&#34;&gt;Mismatched revenue vs. cost scaling&lt;/h2&gt;
&lt;p&gt;This is mostly a business failure, but with significant engineering input: when offering SaaS that has a variable usage-based component that implies non-trivial costs, forgetting to include those costs in the product pricing (or forgetting to include limits to prevent abuse &amp;ndash; see the next mistake) can end up being catastrophic. Before you say &amp;ldquo;yeah, that&amp;rsquo;s just a business problem&amp;rdquo;, I will point out that engineering needs to discover and report these costs. The business is not going to magically know what costs money and what doesn&amp;rsquo;t.&lt;/p&gt;
&lt;p&gt;As an example, I once worked with a team whose costs ended up dominated by their logging provider: the provider charged by log volume, logs were proportional to the data ingested / processed by the system, but the price was scaled according to a lightly correlated variable that matched light usage, not real-world usage. By the time they realized their mistake, they had to endure expensive losses while working frantically to reduce their logging provider usage. The expensive things aren&amp;rsquo;t necessarily what you expected up front.&lt;/p&gt;
&lt;h2 id=&#34;not-having-limits&#34;&gt;Not having limits&lt;/h2&gt;
&lt;p&gt;When I say &amp;ldquo;limits&amp;rdquo;, I mean limits on every part of the system &amp;ndash; rates, volumes, backups, anything that can grow and costs money. Virtually everybody remembers to use an API rate limiter, but limiting all other variable aspects is equally important. This seems like technical debt that can be kicked down the road, but my experience is that in any kind of data-intensive system, there will be another component that drives cost in an unexpected way. Setting those limits (even if they are high) and testing them is a really important part of making sure you aren&amp;rsquo;t surprised.&lt;/p&gt;
&lt;p&gt;This isn&amp;rsquo;t in contradiction with the previous mistake (mismatching revenue vs. cost scaling): even if revenue scales perfectly with usage, there is a point where customers will have sticker shock and rebel. Having a conversation about limits and making sure that they are on board with the implications of their usage is preferable to irritated customers refusing to pay.&lt;/p&gt;
&lt;h2 id=&#34;misjudging-your-organizations-willingness-to-iterate&#34;&gt;Misjudging your organization&amp;rsquo;s willingness to iterate&lt;/h2&gt;
&lt;p&gt;This one goes both ways, depending on the kind of organization. One key advantage of the SaaS model is that you can be lean &amp;ndash; deliver incrementally and adapt as you learn. The real danger lies when you rely on this but are in an inflexible organization. If you can&amp;rsquo;t continuously choose between adding features or iterating over past implementation based on feedback (especially operational feedback), you end up becoming trapped in an increasingly unproductive cycle of trying to add features to an inadequate base. The inadequacy can take many forms (quality issues, decisions that turned out to be incorrect, etc.), but they ultimately present as a lack of productivity that only gets worse over time.&lt;/p&gt;
&lt;p&gt;The lesser form of this is to overshoot the completion of features before making them available, slowing down the rate at which you gather feedback and increasing waste when you do incorporate it. Unpalatable as it may seem, applying the perfect definition of &amp;ldquo;done&amp;rdquo; before anybody can see new work is also a mistake that gets projects cancelled for lack of progress. The trick is finding the level of iteration and leanness that the organization can tolerate.&lt;/p&gt;
&lt;h2 id=&#34;undershooting-operational-quality&#34;&gt;Undershooting operational quality&lt;/h2&gt;
&lt;p&gt;The key word here is &amp;ldquo;operational&amp;rdquo; &amp;ndash; most software development organizations have a pretty clear set of quality acceptance criteria for software on its own, the problem is when it actually is deployed. The ability to detect and resolve issues when the software is in operation is somewhat of an afterthought: the traditional definition of &amp;ldquo;done&amp;rdquo; tends to be along the lines of &amp;ldquo;we tested it on the bench with no errors&amp;rdquo;, not &amp;ldquo;we exposed it to the whims of the customer base, figured out what they broke and fixed it&amp;rdquo;. In the more extreme cases, you may be blind to the problems experienced by customers. That is not a good place to be. You want to know that there are problems as soon as possible, preferably fixing them before customers even have time to create a support ticket.&lt;/p&gt;
&lt;p&gt;If you don&amp;rsquo;t have too many operational issues or they take too long to resolve (corollary: if you don&amp;rsquo;t feed back changes into the system itself based on your operational findings), all parties involved will be unhappy. Customers will be mad and look for alternatives, the development team will be demoralized and checked out. The #1 job of a SaaS software development team is keeping the system running smoothly (that is what customers pay for, after all), writing new features is a distant #2. Only when you&amp;rsquo;ve gotten good at operations and operational quality will you have the time to do fun things like develop new features.&lt;/p&gt;
&lt;p&gt;Organizations that split development and operations thinking that this allows them to keep doing the fun stuff while others deal with fires only defer and magnify the consequences of this mistake.&lt;/p&gt;
&lt;h2 id=&#34;not-having-a-proper-tenant-decommissioning-plan&#34;&gt;Not having a proper tenant decommissioning plan&lt;/h2&gt;
&lt;p&gt;It&amp;rsquo;s nice to think of tenant onboarding, keeping them running, etc. but nothing lasts forever. Customers will eventually leave. If you can&amp;rsquo;t properly decommission their resources and destroy their data as agreed, you&amp;rsquo;ll be in a world of hurt: customers (especially in a B2B context) have real expectations of data destruction on termination (potentially delayed by some period of time) and get really mad if they find that their data hasn&amp;rsquo;t been destroyed as expected. Similarly, if you keep paying for resources used by departed customers, those stragglers will eat into your profits until the end of time.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s easy to think of this as a problem for later. The mistake is when &amp;ldquo;later&amp;rdquo; becomes &amp;ldquo;never.&amp;rdquo;&lt;/p&gt;
</description>
      <source:markdown>As a follow-up to [my comments on the InfoQ &#34;QCon London: Mistakes People Make Building SaaS Software&#34; post](https://blog.scroogieboy.com/2025/04/09/commentary-mistakes-people-make-building.html), I thought I would add my list of five additional common mistakes that I&#39;ve seen SaaS product teams make.

## Mismatched revenue vs. cost scaling

This is mostly a business failure, but with significant engineering input: when offering SaaS that has a variable usage-based component that implies non-trivial costs, forgetting to include those costs in the product pricing (or forgetting to include limits to prevent abuse -- see the next mistake) can end up being catastrophic. Before you say &#34;yeah, that&#39;s just a business problem&#34;, I will point out that engineering needs to discover and report these costs. The business is not going to magically know what costs money and what doesn&#39;t.

As an example, I once worked with a team whose costs ended up dominated by their logging provider: the provider charged by log volume, logs were proportional to the data ingested / processed by the system, but the price was scaled according to a lightly correlated variable that matched light usage, not real-world usage. By the time they realized their mistake, they had to endure expensive losses while working frantically to reduce their logging provider usage. The expensive things aren&#39;t necessarily what you expected up front.

## Not having limits

When I say &#34;limits&#34;, I mean limits on every part of the system -- rates, volumes, backups, anything that can grow and costs money. Virtually everybody remembers to use an API rate limiter, but limiting all other variable aspects is equally important. This seems like technical debt that can be kicked down the road, but my experience is that in any kind of data-intensive system, there will be another component that drives cost in an unexpected way. Setting those limits (even if they are high) and testing them is a really important part of making sure you aren&#39;t surprised.

This isn&#39;t in contradiction with the previous mistake (mismatching revenue vs. cost scaling): even if revenue scales perfectly with usage, there is a point where customers will have sticker shock and rebel. Having a conversation about limits and making sure that they are on board with the implications of their usage is preferable to irritated customers refusing to pay.

## Misjudging your organization&#39;s willingness to iterate

This one goes both ways, depending on the kind of organization. One key advantage of the SaaS model is that you can be lean -- deliver incrementally and adapt as you learn. The real danger lies when you rely on this but are in an inflexible organization. If you can&#39;t continuously choose between adding features or iterating over past implementation based on feedback (especially operational feedback), you end up becoming trapped in an increasingly unproductive cycle of trying to add features to an inadequate base. The inadequacy can take many forms (quality issues, decisions that turned out to be incorrect, etc.), but they ultimately present as a lack of productivity that only gets worse over time.

The lesser form of this is to overshoot the completion of features before making them available, slowing down the rate at which you gather feedback and increasing waste when you do incorporate it. Unpalatable as it may seem, applying the perfect definition of &#34;done&#34; before anybody can see new work is also a mistake that gets projects cancelled for lack of progress. The trick is finding the level of iteration and leanness that the organization can tolerate.

## Undershooting operational quality

The key word here is &#34;operational&#34; -- most software development organizations have a pretty clear set of quality acceptance criteria for software on its own, the problem is when it actually is deployed. The ability to detect and resolve issues when the software is in operation is somewhat of an afterthought: the traditional definition of &#34;done&#34; tends to be along the lines of &#34;we tested it on the bench with no errors&#34;, not &#34;we exposed it to the whims of the customer base, figured out what they broke and fixed it&#34;. In the more extreme cases, you may be blind to the problems experienced by customers. That is not a good place to be. You want to know that there are problems as soon as possible, preferably fixing them before customers even have time to create a support ticket.

If you don&#39;t have too many operational issues or they take too long to resolve (corollary: if you don&#39;t feed back changes into the system itself based on your operational findings), all parties involved will be unhappy. Customers will be mad and look for alternatives, the development team will be demoralized and checked out. The #1 job of a SaaS software development team is keeping the system running smoothly (that is what customers pay for, after all), writing new features is a distant #2. Only when you&#39;ve gotten good at operations and operational quality will you have the time to do fun things like develop new features.

Organizations that split development and operations thinking that this allows them to keep doing the fun stuff while others deal with fires only defer and magnify the consequences of this mistake.

## Not having a proper tenant decommissioning plan

It&#39;s nice to think of tenant onboarding, keeping them running, etc. but nothing lasts forever. Customers will eventually leave. If you can&#39;t properly decommission their resources and destroy their data as agreed, you&#39;ll be in a world of hurt: customers (especially in a B2B context) have real expectations of data destruction on termination (potentially delayed by some period of time) and get really mad if they find that their data hasn&#39;t been destroyed as expected. Similarly, if you keep paying for resources used by departed customers, those stragglers will eat into your profits until the end of time.

It&#39;s easy to think of this as a problem for later. The mistake is when &#34;later&#34; becomes &#34;never.&#34;
</source:markdown>
    </item>
    
    <item>
      <title>Commentary: &#34;Mistakes People Make Building SaaS Software&#34;</title>
      <link>https://blog.scroogieboy.com/2025/04/09/commentary-mistakes-people-make-building.html</link>
      <pubDate>Wed, 09 Apr 2025 13:47:19 -0500</pubDate>
      
      <guid>http://cwirving.micro.blog/2025/04/09/commentary-mistakes-people-make-building.html</guid>
      <description>&lt;p&gt;I was amused to see a clickbait-y article pop in my RSS feeds from InfoQ: &lt;a href=&#34;https://www.infoq.com/news/2025/04/qcon-saas-software-mistakes/&#34;&gt;&amp;ldquo;QCon London: Mistakes People Make Building SaaS Software&amp;rdquo;&lt;/a&gt;. While it is hard to really judge the substance of the talk from this article, its &amp;ldquo;top ten mistakes&amp;rdquo; list is a pretty good conversation starter for people who actually are thinking about getting into a SaaS business.&lt;/p&gt;
&lt;p&gt;The list is not perfect and probably isn&amp;rsquo;t exactly how I&amp;rsquo;d break things down, but it is nice to have a starting point.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s go over some of these:&lt;/p&gt;
&lt;h2 id=&#34;building-something-users-dont-want&#34;&gt;Building something users don&amp;rsquo;t want&lt;/h2&gt;
&lt;h2 id=&#34;delivering-unique-features-or-different-versions-to-tenants&#34;&gt;Delivering unique features or different versions to tenants&lt;/h2&gt;
&lt;h2 id=&#34;listening-to-consultants-instead-of-understanding-your-customer-base&#34;&gt;Listening to consultants instead of understanding your customer base&lt;/h2&gt;
&lt;p&gt;I think these are actually facets of the most fundamental problem getting into this business:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;what kind of organization are you?&lt;/li&gt;
&lt;li&gt;who are your customers?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I&amp;rsquo;ve seen this firsthand: years spent in a large organization that was at its core product sales-focused trying to get into a service delivery business was an incredibly frustrating experience. No amount of introspection at all levels of management could ever change the leopard&amp;rsquo;s spots, so to speak. Large organizations have a culture and a way of doing things that won&amp;rsquo;t reinvent itself, regardless of how hard they try. This culture often dictates what kinds of customers they are willing to pursue. So, the first question is incredibly important.&lt;/p&gt;
&lt;p&gt;Of course, the larger the organization, the more likely it is to engage consultants, with predictably mixed results at best. In addition to the poor customer fit the list alludes to, the other pitfall of engaging consultants without tightly working with them is that they can be blind to feasibility challenges. Unless they are deeply knowledgeable about the customer&amp;rsquo;s domain, they probably won&amp;rsquo;t know the functional and, especially, non-functional challenges that can make a seemingly brilliant product idea into a software development black hole. Yes, working closely with consultants and customers is a good way to avoid those surprises&amp;hellip; But, at the risk of being cynical, that&amp;rsquo;s not something that happens very often.&lt;/p&gt;
&lt;p&gt;At the other end of the scale, small organizations have a lot of flexibility, leading to a lot of the temptation to make mistakes John Topper alludes to in his talk. Some customers and domains have requirements that directly lead to these mistakes, so walking away must always be an option. Being lean is being able to recognize early that some ideas aren&amp;rsquo;t worth it.&lt;/p&gt;
&lt;p&gt;To be fair, you have to understand the actual requirements &amp;ndash; not just their superficial expression &amp;ndash; to make some of these decisions. For example, people that have been burned by software that changes dramatically under their feet (the redesign in iOS 7 being a great example) will be tempted to make dramatic, sweeping, stability requirements that are in direct conflict with other fundamental properties of the software (e.g., security, scalability). These can be often negotiated into a more benign form. If not, &lt;strong&gt;walk away&lt;/strong&gt;. That is business that is fundamentally incompatible with SaaS.&lt;/p&gt;
&lt;h2 id=&#34;not-building-tenancy-concepts-into-application-components&#34;&gt;Not building tenancy concepts into application components&lt;/h2&gt;
&lt;p&gt;Agreed. Since the SaaS business model is predicated on scale, minimizing the marginal cost of adding tenants and users while meeting their isolation and performance requirements is fundamental to profitability. Having lived through the debacle of &amp;ldquo;let&amp;rsquo;s start with a single-tenant system, we can fix it later&amp;rdquo;, I can tell you that virtually no amount of money for that first sale will ever make up for the broken business model it entrenched.&lt;/p&gt;
&lt;h2 id=&#34;not-calculating-baseline-per-tenant-costs-and-testing-this-with-the-market&#34;&gt;Not calculating baseline per-tenant costs and testing this with the market&lt;/h2&gt;
&lt;p&gt;Agreed. But, to be fair, calculating costs can be difficult if you have no experience in the domain and don&amp;rsquo;t know what to expect. It&amp;rsquo;s relatively easy to calculate worst-case per-tenant costs (in the degenerate case where you only have a single customer), but the real trick (from a business perspective) is to know a realistic number of tenants to amortize base costs for. An additional (technical) challenge is to find the non-linearities in resource costs and how they map to business concepts &amp;ndash; e.g., when do you need to go from N to N+1 database instances? How many tenants, users, data volume units does that map to?&lt;/p&gt;
&lt;p&gt;The other baseline and marginal costs to keep in mind are the support and operations cost. It&amp;rsquo;s easy to fixate on the infrastructure costs, but the more specialized the domain, the higher the risk that customers will expect humans to support them.&lt;/p&gt;
&lt;h2 id=&#34;not-automating-tenant-provisioning&#34;&gt;Not automating tenant provisioning&lt;/h2&gt;
&lt;p&gt;Agreed. That was one of the things we worked very hard on in my last project for SLB. Even when transaction costs are overwhelmingly non-technical, being able to provision tenants quickly and cheaply is a game changer.&lt;/p&gt;
&lt;h2 id=&#34;deploying-your-software-into-your-customers-aws-accounts&#34;&gt;Deploying your software into your customers&#39; AWS accounts&lt;/h2&gt;
&lt;p&gt;Agreed. I&amp;rsquo;ve seen this more often with Microsoft Azure, where the &amp;ldquo;Azure credits&amp;rdquo; included in other IT purchases from Microsoft incentivize this kind of behavior. It isn&amp;rsquo;t just a trap from the perspective mentioned in the article (it&amp;rsquo;s shrink-wrap software, not SaaS), it is also an IP protection and service level agreement perspective: the customer has full administrative control over your software, can see exactly how it is made and can prevent it from working properly any time they want.&lt;/p&gt;
&lt;p&gt;In common with on-premise distribution, there is also licensing peril with doing this: arguably, this is &amp;ldquo;distribution&amp;rdquo; from the perspective of software licenses (e.g., the GPL), which triggers a number of obligations not present when just delivering a SaaS service using the software package. Also, commercial third-party dependencies may incur unexpected additional costs when the target infrastructure doesn&amp;rsquo;t belong to you.&lt;/p&gt;
&lt;h2 id=&#34;building-your-solution-to-be-multi-cloud-or-cloud-agnostic&#34;&gt;Building your solution to be multi-cloud or cloud-agnostic&lt;/h2&gt;
&lt;p&gt;With the caveat that there are certain domains where being able to use multiple cloud providers is a key requirement (e.g., for data residency in regions with limited cloud provider coverage), agreed. The cost of building a product that is cloud-portable is huge. Most of this cost is opportunity cost: not being able to fully use the capabilities of your chosen provider because there is no equivalent elsewhere. The more direct cost of building compatibility layers, etc. is also significant but it is fairly easy to quantify. We are far less good at quantifying the features we could build if we&amp;rsquo;d just used the perfect platform service from our single cloud provider, instead of doing the extra infrastructure work to support other providers and make up for the lowest common denominator.&lt;/p&gt;
&lt;p&gt;Now, there are businesses where cloud-agnosticism is a key feature. That is just an incredibly expensive feature.&lt;/p&gt;
&lt;h2 id=&#34;deploying-your-solution-on-premise-for-customers&#34;&gt;Deploying your solution on-premise for customers&lt;/h2&gt;
&lt;p&gt;Agreed. Not that there aren&amp;rsquo;t valid business models that involve on-premise software delivery, but they are virtually always incompatible with a SaaS business.&lt;/p&gt;
&lt;h2 id=&#34;not-thinking-sufficiently-about-backups-and-disaster-recovery&#34;&gt;Not thinking sufficiently about backups and disaster recovery&lt;/h2&gt;
&lt;p&gt;Operations, backups and disaster recovery are all fundamental aspects of running a SaaS business. You have to make disaster recovery your religion to be anywhere close to good at it.&lt;/p&gt;
&lt;h2 id=&#34;not-classifying-data-assets&#34;&gt;Not classifying data assets&lt;/h2&gt;
&lt;p&gt;While this is probably only intended from the perspective of compliance (e.g., GDPR) and threat modeling (based on Jon Topper&amp;rsquo;s other presentations &amp;ndash; e.g., &lt;a href=&#34;https://www.infoq.com/presentations/150-infrastructures/&#34;&gt;this&lt;/a&gt;), data classification is an interesting area that I&amp;rsquo;ve found to be pretty fluid over the years. Without a doubt, you have to classify your data to meet compliance and threat modeling requirements. How finely you classify the data beyond indentifying PII and security-critical information is a choice that needs to be taken carefully. It can easily be a deep rabbit hole with very little tangible reward.&lt;/p&gt;
&lt;p&gt;Ten years ago, we were trying to model various facets of data in our systems to cover a wide range of concerns:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;country of origin&lt;/li&gt;
&lt;li&gt;country of modification&lt;/li&gt;
&lt;li&gt;privacy&lt;/li&gt;
&lt;li&gt;security criticality&lt;/li&gt;
&lt;li&gt;allowed uses (model training, etc.)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And so forth&amp;hellip;&lt;/p&gt;
&lt;p&gt;The temptation was to tie data classification and data entitlements because this appeared to be the silver bullet for various legal requirements &amp;ndash; which was hard to do and never worked well. In theory, you can construct your system out of classification-aware building blocks that apply an algebra of classification combinations to automatically classify outputs&amp;hellip; In practice, it invariably falls apart and you realize that a less ambitious solution works just fine.&lt;/p&gt;
&lt;p&gt;So, I think that I would rephrase the mistake thus: &amp;ldquo;not thinking about data classification and not classifying data where necessary&amp;rdquo;. The first step is to decide to what degree classification adds value (e.g., if it is a legal requirement, it is a no-brainer) before baking it into the system and development processes.&lt;/p&gt;
</description>
      <source:markdown>I was amused to see a clickbait-y article pop in my RSS feeds from InfoQ: [&#34;QCon London: Mistakes People Make Building SaaS Software&#34;](https://www.infoq.com/news/2025/04/qcon-saas-software-mistakes/). While it is hard to really judge the substance of the talk from this article, its &#34;top ten mistakes&#34; list is a pretty good conversation starter for people who actually are thinking about getting into a SaaS business.

The list is not perfect and probably isn&#39;t exactly how I&#39;d break things down, but it is nice to have a starting point.

Let&#39;s go over some of these:

## Building something users don&#39;t want
## Delivering unique features or different versions to tenants
## Listening to consultants instead of understanding your customer base

I think these are actually facets of the most fundamental problem getting into this business:
- what kind of organization are you?
- who are your customers?

I&#39;ve seen this firsthand: years spent in a large organization that was at its core product sales-focused trying to get into a service delivery business was an incredibly frustrating experience. No amount of introspection at all levels of management could ever change the leopard&#39;s spots, so to speak. Large organizations have a culture and a way of doing things that won&#39;t reinvent itself, regardless of how hard they try. This culture often dictates what kinds of customers they are willing to pursue. So, the first question is incredibly important.

Of course, the larger the organization, the more likely it is to engage consultants, with predictably mixed results at best. In addition to the poor customer fit the list alludes to, the other pitfall of engaging consultants without tightly working with them is that they can be blind to feasibility challenges. Unless they are deeply knowledgeable about the customer&#39;s domain, they probably won&#39;t know the functional and, especially, non-functional challenges that can make a seemingly brilliant product idea into a software development black hole. Yes, working closely with consultants and customers is a good way to avoid those surprises... But, at the risk of being cynical, that&#39;s not something that happens very often.

At the other end of the scale, small organizations have a lot of flexibility, leading to a lot of the temptation to make mistakes John Topper alludes to in his talk. Some customers and domains have requirements that directly lead to these mistakes, so walking away must always be an option. Being lean is being able to recognize early that some ideas aren&#39;t worth it.

To be fair, you have to understand the actual requirements -- not just their superficial expression -- to make some of these decisions. For example, people that have been burned by software that changes dramatically under their feet (the redesign in iOS 7 being a great example) will be tempted to make dramatic, sweeping, stability requirements that are in direct conflict with other fundamental properties of the software (e.g., security, scalability). These can be often negotiated into a more benign form. If not, **walk away**. That is business that is fundamentally incompatible with SaaS.

## Not building tenancy concepts into application components

Agreed. Since the SaaS business model is predicated on scale, minimizing the marginal cost of adding tenants and users while meeting their isolation and performance requirements is fundamental to profitability. Having lived through the debacle of &#34;let&#39;s start with a single-tenant system, we can fix it later&#34;, I can tell you that virtually no amount of money for that first sale will ever make up for the broken business model it entrenched.

## Not calculating baseline per-tenant costs and testing this with the market

Agreed. But, to be fair, calculating costs can be difficult if you have no experience in the domain and don&#39;t know what to expect. It&#39;s relatively easy to calculate worst-case per-tenant costs (in the degenerate case where you only have a single customer), but the real trick (from a business perspective) is to know a realistic number of tenants to amortize base costs for. An additional (technical) challenge is to find the non-linearities in resource costs and how they map to business concepts -- e.g., when do you need to go from N to N+1 database instances? How many tenants, users, data volume units does that map to?

The other baseline and marginal costs to keep in mind are the support and operations cost. It&#39;s easy to fixate on the infrastructure costs, but the more specialized the domain, the higher the risk that customers will expect humans to support them.

## Not automating tenant provisioning

Agreed. That was one of the things we worked very hard on in my last project for SLB. Even when transaction costs are overwhelmingly non-technical, being able to provision tenants quickly and cheaply is a game changer.

## Deploying your software into your customers&#39; AWS accounts

Agreed. I&#39;ve seen this more often with Microsoft Azure, where the &#34;Azure credits&#34; included in other IT purchases from Microsoft incentivize this kind of behavior. It isn&#39;t just a trap from the perspective mentioned in the article (it&#39;s shrink-wrap software, not SaaS), it is also an IP protection and service level agreement perspective: the customer has full administrative control over your software, can see exactly how it is made and can prevent it from working properly any time they want.

In common with on-premise distribution, there is also licensing peril with doing this: arguably, this is &#34;distribution&#34; from the perspective of software licenses (e.g., the GPL), which triggers a number of obligations not present when just delivering a SaaS service using the software package. Also, commercial third-party dependencies may incur unexpected additional costs when the target infrastructure doesn&#39;t belong to you.

## Building your solution to be multi-cloud or cloud-agnostic

With the caveat that there are certain domains where being able to use multiple cloud providers is a key requirement (e.g., for data residency in regions with limited cloud provider coverage), agreed. The cost of building a product that is cloud-portable is huge. Most of this cost is opportunity cost: not being able to fully use the capabilities of your chosen provider because there is no equivalent elsewhere. The more direct cost of building compatibility layers, etc. is also significant but it is fairly easy to quantify. We are far less good at quantifying the features we could build if we&#39;d just used the perfect platform service from our single cloud provider, instead of doing the extra infrastructure work to support other providers and make up for the lowest common denominator.

Now, there are businesses where cloud-agnosticism is a key feature. That is just an incredibly expensive feature.

## Deploying your solution on-premise for customers

Agreed. Not that there aren&#39;t valid business models that involve on-premise software delivery, but they are virtually always incompatible with a SaaS business.

## Not thinking sufficiently about backups and disaster recovery

Operations, backups and disaster recovery are all fundamental aspects of running a SaaS business. You have to make disaster recovery your religion to be anywhere close to good at it.

## Not classifying data assets

While this is probably only intended from the perspective of compliance (e.g., GDPR) and threat modeling (based on Jon Topper&#39;s other presentations -- e.g., [this](https://www.infoq.com/presentations/150-infrastructures/)), data classification is an interesting area that I&#39;ve found to be pretty fluid over the years. Without a doubt, you have to classify your data to meet compliance and threat modeling requirements. How finely you classify the data beyond indentifying PII and security-critical information is a choice that needs to be taken carefully. It can easily be a deep rabbit hole with very little tangible reward.

Ten years ago, we were trying to model various facets of data in our systems to cover a wide range of concerns:

- country of origin
- country of modification
- privacy
- security criticality
- allowed uses (model training, etc.)

And so forth...

The temptation was to tie data classification and data entitlements because this appeared to be the silver bullet for various legal requirements -- which was hard to do and never worked well. In theory, you can construct your system out of classification-aware building blocks that apply an algebra of classification combinations to automatically classify outputs... In practice, it invariably falls apart and you realize that a less ambitious solution works just fine.

So, I think that I would rephrase the mistake thus: &#34;not thinking about data classification and not classifying data where necessary&#34;. The first step is to decide to what degree classification adds value (e.g., if it is a legal requirement, it is a no-brainer) before baking it into the system and development processes.

</source:markdown>
    </item>
    
    <item>
      <title>&#34;We are not Google&#34;</title>
      <link>https://blog.scroogieboy.com/2025/04/07/we-are-not-google.html</link>
      <pubDate>Mon, 07 Apr 2025 14:09:34 -0500</pubDate>
      
      <guid>http://cwirving.micro.blog/2025/04/07/we-are-not-google.html</guid>
      <description>&lt;p&gt;The most obvious, but also disregarded, piece of advice I used to give my colleagues is: &amp;ldquo;we are not Google&amp;rdquo;. By that I mean two things: that we were not operating at the scale of Google and, organizationally, we had nothing in common with Google engineering.&lt;/p&gt;
&lt;p&gt;As early partners of Google Cloud, we were exposed to, and influenced by, a lot of their practices &amp;ndash; which, to be clear, is often a good thing. I am a proponent of &lt;a href=&#34;https://sre.google&#34;&gt;SRE&lt;/a&gt;, progressive delivery and, more broadly, &lt;a href=&#34;https://dora.dev&#34;&gt;DORA&lt;/a&gt;. What catches outsiders like us out is that these practices &lt;strong&gt;need to be tuned to the reality of our own organization&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;The first problem is scale. The statistical underpinnings of these practices assume a large uniform set of users &amp;ndash; two facts (large, uniform) that often aren&amp;rsquo;t true in the world of Enterprise and B2B software. When you have a billion users using your system globally, you can rely on statistics to give you a clear and timely picture. When there are far fewer users, when they are relying on your system to work during very specific business hours, when each tenant has its own SLA, then you have to adapt!&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://charity.wtf&#34;&gt;Charity Majors&lt;/a&gt; has spoken of her experience at Parse where the overall health of the platform would hide the fact that one specific tenant could be experiencing a major outage. This is a problem that we&amp;rsquo;d see over and over. It is very hard, tending towards impossible, to build a multi-tenant system that is resilient to localized problems without degradation for the tenant: the infrastructure and development time to do so are rarely affordable and there is always going to be something that you didn&amp;rsquo;t think of. So, if you have made non-functional promises to individual tenants, you also have to measure and react at tenant scale, not just globally. This is hard and, to some extent, anathema to Google&amp;rsquo;s concept of SRE.&lt;/p&gt;
&lt;p&gt;The other multifaceted problem is organization: very few companies have the depth of engineering that hyperscale tech companies do. Those are organizations that understand the &lt;a href=&#34;https://danluu.com/in-house/&#34;&gt;value of in-house expertise&lt;/a&gt; and can afford it. Obviously, small companies can&amp;rsquo;t afford it. But, even companies that are big enough to afford experts also  need to recognize the value of expertise and be organized in such a way to make the it available to those who need it. When you&amp;rsquo;re a &amp;ldquo;normie&amp;rdquo; &amp;ndash; potentially very successful &amp;ndash; company, you can&amp;rsquo;t rely on there being someone who can tackle deep, extremely challenging, problems in esoteric areas. You may have deep knowledge in &lt;em&gt;some&lt;/em&gt; domain (hopefully, your business domain!) but there won&amp;rsquo;t be a deep bench of experts to call in when some technology misbehaves in novel ways.&lt;/p&gt;
&lt;p&gt;The two problems compound each other: not only are smaller organizations not set up to tackle deep technical problems when they occur, they are unlikely to have the institutional memory to recognize them when they occur &amp;ndash; nobody will have seen even all the &lt;em&gt;mildly&lt;/em&gt; esoteric problems before, never mind know how to fix them. Another way of putting this is that you should avoid solutions that you aren&amp;rsquo;t able to diagnose and debug within your team &amp;ndash; there won&amp;rsquo;t be an expert that the company can pull out of a hat to fix them for you when things go badly wrong. This is not an endorsement of technological stagnation &amp;ndash; far from it! &amp;ndash; but rather the observation that advances in technology need to come with commensurate advances in one&amp;rsquo;s ability to operate and debug them.&lt;/p&gt;
</description>
      <source:markdown>The most obvious, but also disregarded, piece of advice I used to give my colleagues is: &#34;we are not Google&#34;. By that I mean two things: that we were not operating at the scale of Google and, organizationally, we had nothing in common with Google engineering.

As early partners of Google Cloud, we were exposed to, and influenced by, a lot of their practices -- which, to be clear, is often a good thing. I am a proponent of [SRE](https://sre.google), progressive delivery and, more broadly, [DORA](https://dora.dev). What catches outsiders like us out is that these practices **need to be tuned to the reality of our own organization**.

The first problem is scale. The statistical underpinnings of these practices assume a large uniform set of users -- two facts (large, uniform) that often aren&#39;t true in the world of Enterprise and B2B software. When you have a billion users using your system globally, you can rely on statistics to give you a clear and timely picture. When there are far fewer users, when they are relying on your system to work during very specific business hours, when each tenant has its own SLA, then you have to adapt!

[Charity Majors](https://charity.wtf) has spoken of her experience at Parse where the overall health of the platform would hide the fact that one specific tenant could be experiencing a major outage. This is a problem that we&#39;d see over and over. It is very hard, tending towards impossible, to build a multi-tenant system that is resilient to localized problems without degradation for the tenant: the infrastructure and development time to do so are rarely affordable and there is always going to be something that you didn&#39;t think of. So, if you have made non-functional promises to individual tenants, you also have to measure and react at tenant scale, not just globally. This is hard and, to some extent, anathema to Google&#39;s concept of SRE.

The other multifaceted problem is organization: very few companies have the depth of engineering that hyperscale tech companies do. Those are organizations that understand the [value of in-house expertise](https://danluu.com/in-house/) and can afford it. Obviously, small companies can&#39;t afford it. But, even companies that are big enough to afford experts also  need to recognize the value of expertise and be organized in such a way to make the it available to those who need it. When you&#39;re a &#34;normie&#34; -- potentially very successful -- company, you can&#39;t rely on there being someone who can tackle deep, extremely challenging, problems in esoteric areas. You may have deep knowledge in _some_ domain (hopefully, your business domain!) but there won&#39;t be a deep bench of experts to call in when some technology misbehaves in novel ways.

The two problems compound each other: not only are smaller organizations not set up to tackle deep technical problems when they occur, they are unlikely to have the institutional memory to recognize them when they occur -- nobody will have seen even all the _mildly_ esoteric problems before, never mind know how to fix them. Another way of putting this is that you should avoid solutions that you aren&#39;t able to diagnose and debug within your team -- there won&#39;t be an expert that the company can pull out of a hat to fix them for you when things go badly wrong. This is not an endorsement of technological stagnation -- far from it! -- but rather the observation that advances in technology need to come with commensurate advances in one&#39;s ability to operate and debug them.
</source:markdown>
    </item>
    
    <item>
      <title>I guess I should write about stuff, now...</title>
      <link>https://blog.scroogieboy.com/2025/03/24/i-guess-i-should-write.html</link>
      <pubDate>Mon, 24 Mar 2025 15:31:26 -0500</pubDate>
      
      <guid>http://cwirving.micro.blog/2025/03/24/i-guess-i-should-write.html</guid>
      <description>&lt;p&gt;Now that I have more time on my hands and no longer have to follow my former employer&amp;rsquo;s social media policy (which, admittedly, had improved over the years from the original &lt;a href=&#34;https://en.wikipedia.org/wiki/Omert%C3%A0&#34;&gt;Omertà&lt;/a&gt;-like policy), I can write more freely about the things I have learned over the years. Funnily enough, that&amp;rsquo;s when I saw &lt;a href=&#34;https://jacobian.org/2025/mar/13/beware-advice-from-old-heads/&#34;&gt;this post&lt;/a&gt; implying the pointlessness of the exercise. Sure, he&amp;rsquo;s not saying that I shouldn&amp;rsquo;t speak &amp;ndash; the implication is more that nobody should listen&amp;hellip;&lt;/p&gt;
&lt;p&gt;Well, I suppose that this is mostly aimed at &amp;ldquo;how to advance your career&amp;rdquo; advice, not &amp;ldquo;how to become a better software engineer or architect&amp;rdquo; advice. Yeah, I&amp;rsquo;m not going to write about that. Also, with time, the purely technical details will lose relevance &amp;ndash; for example, there is very little topical relevance to the code of the automated hematology classification code I worked on during my internship at Technicon Instruments in the late 1980s (rewriting PL/M into C just isn&amp;rsquo;t a hot problem these days). However, even going that far back, there are constant threads related to &lt;em&gt;people&lt;/em&gt; that recur today.&lt;/p&gt;
&lt;p&gt;We may think that software engineering is just a technology problem, but it is first and foremost a people problem. Some of the things I saw in Tarrytown nearly 40 years ago still happen across the software industry today. Tools and processes are better, people are better educated, have access to a wealth of information we didn&amp;rsquo;t have at the time, but we&amp;rsquo;re still working with the same hardwired constraints of the human mind.&lt;/p&gt;
&lt;p&gt;Finally, the fact that we &amp;ndash; on the whole &amp;ndash; know more about writing software doesn&amp;rsquo;t mean that we apply that knowledge uniformly. E.g., for all dependency layering within non-trivial programs is a problem we&amp;rsquo;ve tackled for decades, spawning generations of tools to help us (or, to &amp;ldquo;solve&amp;rdquo; the problem, if you listen to their marketing), it still is something that even experienced developers get wrong on a fairly frequent basis.&lt;/p&gt;
</description>
      <source:markdown>Now that I have more time on my hands and no longer have to follow my former employer&#39;s social media policy (which, admittedly, had improved over the years from the original [Omertà](https://en.wikipedia.org/wiki/Omert%C3%A0)-like policy), I can write more freely about the things I have learned over the years. Funnily enough, that&#39;s when I saw [this post](https://jacobian.org/2025/mar/13/beware-advice-from-old-heads/) implying the pointlessness of the exercise. Sure, he&#39;s not saying that I shouldn&#39;t speak -- the implication is more that nobody should listen...

Well, I suppose that this is mostly aimed at &#34;how to advance your career&#34; advice, not &#34;how to become a better software engineer or architect&#34; advice. Yeah, I&#39;m not going to write about that. Also, with time, the purely technical details will lose relevance -- for example, there is very little topical relevance to the code of the automated hematology classification code I worked on during my internship at Technicon Instruments in the late 1980s (rewriting PL/M into C just isn&#39;t a hot problem these days). However, even going that far back, there are constant threads related to _people_ that recur today.

We may think that software engineering is just a technology problem, but it is first and foremost a people problem. Some of the things I saw in Tarrytown nearly 40 years ago still happen across the software industry today. Tools and processes are better, people are better educated, have access to a wealth of information we didn&#39;t have at the time, but we&#39;re still working with the same hardwired constraints of the human mind.

Finally, the fact that we -- on the whole -- know more about writing software doesn&#39;t mean that we apply that knowledge uniformly. E.g., for all dependency layering within non-trivial programs is a problem we&#39;ve tackled for decades, spawning generations of tools to help us (or, to &#34;solve&#34; the problem, if you listen to their marketing), it still is something that even experienced developers get wrong on a fairly frequent basis.
</source:markdown>
    </item>
    
    <item>
      <title></title>
      <link>https://blog.scroogieboy.com/2025/02/21/it-turns-out-that-having.html</link>
      <pubDate>Fri, 21 Feb 2025 09:16:38 -0500</pubDate>
      
      <guid>http://cwirving.micro.blog/2025/02/21/it-turns-out-that-having.html</guid>
      <description>&lt;p&gt;It turns out that having a price watch on the Canon refurbished store is an expensive idea&amp;hellip; Who knew?&lt;/p&gt;
</description>
      <source:markdown>It turns out that having a price watch on the Canon refurbished store is an expensive idea... Who knew?
</source:markdown>
    </item>
    
    <item>
      <title>AI utility</title>
      <link>https://blog.scroogieboy.com/2025/01/13/ai-utility.html</link>
      <pubDate>Mon, 13 Jan 2025 23:08:19 -0500</pubDate>
      
      <guid>http://cwirving.micro.blog/2025/01/13/ai-utility.html</guid>
      <description>&lt;p&gt;I really like this &lt;a href=&#34;https://docs.google.com/document/d/1GrEFrdF_IzRVXbGH1lG0aQMlvsB71XihPPqQN-ONTuo/edit?pli=1&amp;amp;tab=t.0#heading=h.tum50mq4r9xv&#34;&gt;quote by Alex Komoroske&lt;/a&gt; (via &lt;a href=&#34;https://simonwillison.net/2025/Jan/13/alex-komoroske/&#34;&gt;Simon Willison&lt;/a&gt;). It may be confirmation bias, but I find that it is a good way to think about the utility of AI, whether plain-old &amp;ldquo;machine learning&amp;rdquo; or of the current hyped LLM variety:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;LLMs shouldn&amp;rsquo;t help you do less thinking, they should help you do &lt;em&gt;more&lt;/em&gt; thinking.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;They give you higher leverage.&lt;/li&gt;
&lt;li&gt;Will that cause you to be satisfied with doing less, or driven to do more?&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;Of course, humanity is likely to take the wrong path here &amp;ndash; we seem to never miss an opportunity to switch our  brains off &amp;ndash; but we can choose to do &lt;em&gt;more&lt;/em&gt; with these tools. The temptation, whether by average people or businesses, to do &lt;em&gt;less&lt;/em&gt; for (nearly) free is the road to Idiocracy.&lt;/p&gt;
</description>
      <source:markdown>I really like this [quote by Alex Komoroske](https://docs.google.com/document/d/1GrEFrdF_IzRVXbGH1lG0aQMlvsB71XihPPqQN-ONTuo/edit?pli=1&amp;tab=t.0#heading=h.tum50mq4r9xv) (via [Simon Willison](https://simonwillison.net/2025/Jan/13/alex-komoroske/)). It may be confirmation bias, but I find that it is a good way to think about the utility of AI, whether plain-old &#34;machine learning&#34; or of the current hyped LLM variety:

&gt; LLMs shouldn&#39;t help you do less thinking, they should help you do _more_ thinking.
&gt; * They give you higher leverage.
&gt; * Will that cause you to be satisfied with doing less, or driven to do more?

Of course, humanity is likely to take the wrong path here -- we seem to never miss an opportunity to switch our  brains off -- but we can choose to do _more_ with these tools. The temptation, whether by average people or businesses, to do _less_ for (nearly) free is the road to Idiocracy.
</source:markdown>
    </item>
    
    <item>
      <title>Evaluating Peakto for picture library management</title>
      <link>https://blog.scroogieboy.com/2025/01/12/evaluating-peakto-for-picture-library.html</link>
      <pubDate>Sun, 12 Jan 2025 23:48:27 -0500</pubDate>
      
      <guid>http://cwirving.micro.blog/2025/01/12/evaluating-peakto-for-picture-library.html</guid>
      <description>&lt;p&gt;While my overall picture library isn&amp;rsquo;t huge, it is split between raw files edited in DxO PhotoLab, Apple Photos and a directory structure of legacy JPEGs taken with various digital cameras over the last 25 years. So, finding pictures or specific subjects is a bit of a challenge.&lt;/p&gt;
&lt;p&gt;This is not a full review &amp;ndash; I was intrigued enough by &lt;a href=&#34;https://cyme.io/peakto-photo-organizer-software/&#34;&gt;Peakto&lt;/a&gt; to do a free trial (which, for some reason, they make a lot harder than it should be). So, here are my findings after a couple of days&amp;hellip;&lt;/p&gt;
&lt;p&gt;First, the good:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The search capabilities are very nice, especially considering that it is searching multiple distinct catalogs or file systems. I don&amp;rsquo;t quite yet understand how much it derives from image analysis and how much keyword tags contribute to the search, but I do enjoy it.&lt;/li&gt;
&lt;li&gt;Performance (ingestion, analysis, searching, etc.) is generally very good. My M1 Pro MacBook Pro is pretty fast, but it also isn&amp;rsquo;t the hottest machine learning hardware on the market, either.&lt;/li&gt;
&lt;li&gt;The face recognition is impressive &amp;ndash; it will identify faces even in the background of pictures and is generally fast.&lt;/li&gt;
&lt;li&gt;Once you get used to the UI paradigm, it is quite productive.&lt;/li&gt;
&lt;li&gt;It has some interesting support for video, with automated audio transcription, but I haven&amp;rsquo;t really played much with it.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Now, the bad:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The onboarding experience could be improved. A lot. I wish I had known to start by playing with the demo content then removing it (there is a setting for that) before trying to ingest my own pictures. The ingestion paradigm for the various different sources varies per source kind, so my own assumptions led me astray for a while.&lt;/li&gt;
&lt;li&gt;There are some rather annoying UI bugs &amp;ndash; none fatal &amp;ndash; that detract from the experience. The most annoying is the way the keyword tag editor has keyboard focus problems that make typing tags a lot harder than it should be. The grid view refreshes itself needlessly when applying edits in the background. It is by no means bad, but the niggles are annoying.&lt;/li&gt;
&lt;li&gt;The AI &amp;ldquo;analysis&amp;rdquo; feature seems questionable. Maybe I&amp;rsquo;m missing the point, but its aesthetic and technical rankings seem poorly correlated with my taste.&lt;/li&gt;
&lt;li&gt;Sometimes, the DxO PhotoLab support seems to fail to pick up the post-edit thumbnail from PhotoLab. When the editing is significant, that can be quite frustrating.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Some things that could be improved:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The keyword tagging support is relatively limited. I didn&amp;rsquo;t see a way to edit hierarchical keywords, tags are case-sensitive but the application insists on one casing convention even when the existing tags in the library follow another and, finally, there is no global management of tags.&lt;/li&gt;
&lt;li&gt;The face recognition is just that &amp;ndash; it recognizes faces but does not let you tell the application where it missed some. There are some scenarios (rotation) where it is less effective at detecting faces and it would be really nice to tell it what it missed.&lt;/li&gt;
&lt;li&gt;Related to the above, face recognition and keyword tagging are distinct features that don&amp;rsquo;t link to each other. This is annoying when the underlying application (e.g., DxO PhotoLab) understands tags, but not faces &amp;ndash; being able to create tags based on faces would help when searching in PhotoLab.&lt;/li&gt;
&lt;li&gt;Similarly AI-generated tags and tags manually associated with the images live in parallel worlds. You can use both, but combining them is clumsy.&lt;/li&gt;
&lt;li&gt;Scrolling performance in the grid view could be smoother &amp;ndash; especially when scrolling slowly (thus, the next pictures to show are known in advance).&lt;/li&gt;
&lt;li&gt;As far as I can tell, some trivial image file metadata edits like rotation are missing. Working with directories of random legacy digital camera files is needlessly painful when you can&amp;rsquo;t even rotate the image orientation without jumping into another application.&lt;/li&gt;
&lt;li&gt;Using YouTube as the onboarding documentation is weird. The videos are nice enough, but they aren&amp;rsquo;t that numerous or slickly produced to justify the emphasis.&lt;/li&gt;
&lt;li&gt;Burying the free trial options so that people start a subscription to try the software may improve the conversion rate, but it sure isn&amp;rsquo;t a welcoming sign or a sign of confidence. As far as I can tell, you &lt;em&gt;can&lt;/em&gt; try the software without starting a subscription, they just obfuscate it on their website. To be honest, I can&amp;rsquo;t tell whether it is a dark pattern of just bad web design, but it did make me think twice before trying Peakto.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Overall, I like the application and I find it to be a good step towards better management of my picture library. It&amp;rsquo;s pretty obvious that it is a niche product by a small company, so I understand that the polish and pricing can&amp;rsquo;t be as good as for a mass-market product, but this gets a job done that the big players aren&amp;rsquo;t tackling. So, Peakto definitely has a place.&lt;/p&gt;
&lt;p&gt;In the context of DxO PhotoLab, I would rather that DxO put all their effort into the photo editing features if I could use Peakto for library metadata management and searching. There could be a pretty good synergy there.&lt;/p&gt;
</description>
      <source:markdown>While my overall picture library isn&#39;t huge, it is split between raw files edited in DxO PhotoLab, Apple Photos and a directory structure of legacy JPEGs taken with various digital cameras over the last 25 years. So, finding pictures or specific subjects is a bit of a challenge.

This is not a full review -- I was intrigued enough by [Peakto](https://cyme.io/peakto-photo-organizer-software/) to do a free trial (which, for some reason, they make a lot harder than it should be). So, here are my findings after a couple of days...

First, the good:
- The search capabilities are very nice, especially considering that it is searching multiple distinct catalogs or file systems. I don&#39;t quite yet understand how much it derives from image analysis and how much keyword tags contribute to the search, but I do enjoy it.
- Performance (ingestion, analysis, searching, etc.) is generally very good. My M1 Pro MacBook Pro is pretty fast, but it also isn&#39;t the hottest machine learning hardware on the market, either.
- The face recognition is impressive -- it will identify faces even in the background of pictures and is generally fast.
- Once you get used to the UI paradigm, it is quite productive.
- It has some interesting support for video, with automated audio transcription, but I haven&#39;t really played much with it.

Now, the bad:
- The onboarding experience could be improved. A lot. I wish I had known to start by playing with the demo content then removing it (there is a setting for that) before trying to ingest my own pictures. The ingestion paradigm for the various different sources varies per source kind, so my own assumptions led me astray for a while.
- There are some rather annoying UI bugs -- none fatal -- that detract from the experience. The most annoying is the way the keyword tag editor has keyboard focus problems that make typing tags a lot harder than it should be. The grid view refreshes itself needlessly when applying edits in the background. It is by no means bad, but the niggles are annoying.
- The AI &#34;analysis&#34; feature seems questionable. Maybe I&#39;m missing the point, but its aesthetic and technical rankings seem poorly correlated with my taste.
- Sometimes, the DxO PhotoLab support seems to fail to pick up the post-edit thumbnail from PhotoLab. When the editing is significant, that can be quite frustrating.


Some things that could be improved:
- The keyword tagging support is relatively limited. I didn&#39;t see a way to edit hierarchical keywords, tags are case-sensitive but the application insists on one casing convention even when the existing tags in the library follow another and, finally, there is no global management of tags.
- The face recognition is just that -- it recognizes faces but does not let you tell the application where it missed some. There are some scenarios (rotation) where it is less effective at detecting faces and it would be really nice to tell it what it missed.
- Related to the above, face recognition and keyword tagging are distinct features that don&#39;t link to each other. This is annoying when the underlying application (e.g., DxO PhotoLab) understands tags, but not faces -- being able to create tags based on faces would help when searching in PhotoLab.
- Similarly AI-generated tags and tags manually associated with the images live in parallel worlds. You can use both, but combining them is clumsy.
- Scrolling performance in the grid view could be smoother -- especially when scrolling slowly (thus, the next pictures to show are known in advance).
- As far as I can tell, some trivial image file metadata edits like rotation are missing. Working with directories of random legacy digital camera files is needlessly painful when you can&#39;t even rotate the image orientation without jumping into another application.
- Using YouTube as the onboarding documentation is weird. The videos are nice enough, but they aren&#39;t that numerous or slickly produced to justify the emphasis.
- Burying the free trial options so that people start a subscription to try the software may improve the conversion rate, but it sure isn&#39;t a welcoming sign or a sign of confidence. As far as I can tell, you _can_ try the software without starting a subscription, they just obfuscate it on their website. To be honest, I can&#39;t tell whether it is a dark pattern of just bad web design, but it did make me think twice before trying Peakto.

Overall, I like the application and I find it to be a good step towards better management of my picture library. It&#39;s pretty obvious that it is a niche product by a small company, so I understand that the polish and pricing can&#39;t be as good as for a mass-market product, but this gets a job done that the big players aren&#39;t tackling. So, Peakto definitely has a place.

In the context of DxO PhotoLab, I would rather that DxO put all their effort into the photo editing features if I could use Peakto for library metadata management and searching. There could be a pretty good synergy there.
</source:markdown>
    </item>
    
    <item>
      <title>&#34;Write better code&#34;</title>
      <link>https://blog.scroogieboy.com/2025/01/03/write-better-code.html</link>
      <pubDate>Fri, 03 Jan 2025 15:36:34 -0500</pubDate>
      
      <guid>http://cwirving.micro.blog/2025/01/03/write-better-code.html</guid>
      <description>&lt;p&gt;It&amp;rsquo;s pretty funny that all you apparently need to do to get better output from LLMs is to &lt;a href=&#34;https://minimaxir.com/2025/01/write-better-code/&#34;&gt;ask them to do better&lt;/a&gt;. Maybe I need to ask the JetBrains AI plugin to &amp;ldquo;write better code&amp;rdquo;. Of course, there is a gap between writing a simple program from scratch and &lt;a href=&#34;https://blog.scroogieboy.com/2024/12/19/spending-time-with.html&#34;&gt;writing contextually and stylistically consistent new features in an existing code base&lt;/a&gt;&amp;hellip; But maybe it is worth a try?&lt;/p&gt;
</description>
      <source:markdown>It&#39;s pretty funny that all you apparently need to do to get better output from LLMs is to [ask them to do better](https://minimaxir.com/2025/01/write-better-code/). Maybe I need to ask the JetBrains AI plugin to &#34;write better code&#34;. Of course, there is a gap between writing a simple program from scratch and [writing contextually and stylistically consistent new features in an existing code base](https://blog.scroogieboy.com/2024/12/19/spending-time-with.html)... But maybe it is worth a try?
</source:markdown>
    </item>
    
    <item>
      <title>AI-generated documentation</title>
      <link>https://blog.scroogieboy.com/2024/12/19/aigenerated-documentation.html</link>
      <pubDate>Thu, 19 Dec 2024 08:22:18 -0500</pubDate>
      
      <guid>http://cwirving.micro.blog/2024/12/19/aigenerated-documentation.html</guid>
      <description>&lt;p&gt;To clarify my snarky &amp;ldquo;junior developer&amp;rdquo; comment about code documentation in &lt;a href=&#34;https://blog.scroogieboy.com/2024/12/19/spending-time-with.html&#34;&gt;yesterday&amp;rsquo;s post&lt;/a&gt; about the JetBrains AI plugin, good documentation describes the &lt;em&gt;intent&lt;/em&gt; of the code, it isn&amp;rsquo;t a blow-by-blow description of what the code does. While the ideal of &lt;a href=&#34;https://en.wikipedia.org/wiki/Literate_programming&#34;&gt;literate programming&lt;/a&gt; is not practical for most software, it remains somewhat of a north star &amp;ndash; you want to document what is not in the code, the &lt;em&gt;rationale&lt;/em&gt;. So many beginners in this profession miss that point.&lt;/p&gt;
&lt;p&gt;This is where the AI plugin has a hard time. It can only infer intent from the code as it is written. It doesn&amp;rsquo;t know what you had in your head while writing the code. It can&amp;rsquo;t tell whether this was a simple idea with a convoluted expression in code, for example. To be fair, it still is a starting point &amp;ndash; sometimes, the required incremental description is small&amp;hellip; Still, it falls far short of something good out of the box.&lt;/p&gt;
&lt;p&gt;I fear that the automated descriptive documentation like this is only going to reinforce the misconception that &amp;ldquo;the code is the documentation&amp;rdquo; because this kind of documentation doesn&amp;rsquo;t add much beyond reading the code.n&lt;/p&gt;
</description>
      <source:markdown>To clarify my snarky &#34;junior developer&#34; comment about code documentation in [yesterday&#39;s post](https://blog.scroogieboy.com/2024/12/19/spending-time-with.html) about the JetBrains AI plugin, good documentation describes the _intent_ of the code, it isn&#39;t a blow-by-blow description of what the code does. While the ideal of [literate programming](https://en.wikipedia.org/wiki/Literate_programming) is not practical for most software, it remains somewhat of a north star -- you want to document what is not in the code, the _rationale_. So many beginners in this profession miss that point.

This is where the AI plugin has a hard time. It can only infer intent from the code as it is written. It doesn&#39;t know what you had in your head while writing the code. It can&#39;t tell whether this was a simple idea with a convoluted expression in code, for example. To be fair, it still is a starting point -- sometimes, the required incremental description is small... Still, it falls far short of something good out of the box.

I fear that the automated descriptive documentation like this is only going to reinforce the misconception that &#34;the code is the documentation&#34; because this kind of documentation doesn&#39;t add much beyond reading the code.n
</source:markdown>
    </item>
    
    <item>
      <title>Spending time with JetBrains AI</title>
      <link>https://blog.scroogieboy.com/2024/12/19/spending-time-with.html</link>
      <pubDate>Thu, 19 Dec 2024 00:01:35 -0500</pubDate>
      
      <guid>http://cwirving.micro.blog/2024/12/19/spending-time-with.html</guid>
      <description>&lt;p&gt;When it comes to the sci-fi trope of humanity ending at the hand of the machines, I&amp;rsquo;m in the camp of &amp;ldquo;The Creator&amp;rdquo; rather than &amp;ldquo;The Terminator&amp;rdquo; &amp;ndash; it&amp;rsquo;ll be a software bug that does us in rather than machines achieving sentience and judging us unfit. Which brings me to&amp;hellip; the glut of &amp;ldquo;AI&amp;rdquo; coding assistants that are so hyped these days.&lt;/p&gt;
&lt;p&gt;With some time off for the holidays, I had an opportunity to update some of my &lt;a href=&#34;https://jsr.io/@scroogieboy/directory-to-object&#34;&gt;open-source projects&lt;/a&gt; and try out the &lt;a href=&#34;https://www.jetbrains.com/ai/&#34;&gt;JetBrains AI&lt;/a&gt; plugin as I did it. The results are &lt;em&gt;interesting&amp;hellip;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;On one hand, virtually none of the major features work perfectly &amp;ndash; every time the plugin generated refactorings or unit tests, they were somewhat &lt;em&gt;off&lt;/em&gt;, the documentation generation was at the most junior developer level, but I think that it would be wrong to call it useless. In fact, it is well worth the $100 yearly cost they charge for this thing because that &amp;ldquo;wrong&amp;rdquo; code it generates doesn&amp;rsquo;t work as-is, but it also isn&amp;rsquo;t that far off from what was needed. So, at the end of the day, using the plugin to start menial tasks is a huge time saver. It just doesn&amp;rsquo;t reduce the time to zero.&lt;/p&gt;
&lt;p&gt;I did find the fact that the underlying prompts all start with &amp;ldquo;you are a rock-star &amp;hellip; developer&amp;rdquo; to be quite amusing. Obviously, we all have different definitions of &amp;ldquo;rock-star developer&amp;rdquo;, but the output looked more like the &amp;ldquo;booze and groupies&amp;rdquo; kind. At some point, we have to remember that this doesn&amp;rsquo;t (yet) understand anything about what it is doing. It is incredibly good at mimicry and does work a lot faster than any human could. It is only a &amp;ldquo;10x developer&amp;rdquo; in that it is 10x faster, not 10x better. I think that there is still a large gap between where this is going and the humans that are good at this craft. I&amp;rsquo;m sure that the gap will narrow, but the intent to fully automate at any cost seems unjustified.&lt;/p&gt;
&lt;p&gt;Which brings me back to the original comment about AI: we&amp;rsquo;re at a stage where these assistants are productivity multipliers for skilled workers. Just like computers have been in various fields for decades now. But that isn&amp;rsquo;t apparently good enough for the kool-aid drinking hype mongers: nothing less than complete replacement of the human element is acceptable in their book. The economics of the workplace aren&amp;rsquo;t static, though &amp;ndash; it&amp;rsquo;ll certainly devalue large parts of the this profession, but the runtime cost of AI models still isn&amp;rsquo;t &lt;em&gt;zero&lt;/em&gt;. There is an equilibrium to be found. I just have no idea how unpleasant it&amp;rsquo;ll be, especially for new practitioners, and I have no idea how innovation will continue to happen when everything is a &amp;ldquo;remix machine&amp;rdquo;, but it&amp;rsquo;ll be interesting to watch&amp;hellip; I guess.&lt;/p&gt;
</description>
      <source:markdown>When it comes to the sci-fi trope of humanity ending at the hand of the machines, I&#39;m in the camp of &#34;The Creator&#34; rather than &#34;The Terminator&#34; -- it&#39;ll be a software bug that does us in rather than machines achieving sentience and judging us unfit. Which brings me to... the glut of &#34;AI&#34; coding assistants that are so hyped these days.

With some time off for the holidays, I had an opportunity to update some of my [open-source projects](https://jsr.io/@scroogieboy/directory-to-object) and try out the [JetBrains AI](https://www.jetbrains.com/ai/) plugin as I did it. The results are _interesting..._

On one hand, virtually none of the major features work perfectly -- every time the plugin generated refactorings or unit tests, they were somewhat _off_, the documentation generation was at the most junior developer level, but I think that it would be wrong to call it useless. In fact, it is well worth the $100 yearly cost they charge for this thing because that &#34;wrong&#34; code it generates doesn&#39;t work as-is, but it also isn&#39;t that far off from what was needed. So, at the end of the day, using the plugin to start menial tasks is a huge time saver. It just doesn&#39;t reduce the time to zero.

I did find the fact that the underlying prompts all start with &#34;you are a rock-star ... developer&#34; to be quite amusing. Obviously, we all have different definitions of &#34;rock-star developer&#34;, but the output looked more like the &#34;booze and groupies&#34; kind. At some point, we have to remember that this doesn&#39;t (yet) understand anything about what it is doing. It is incredibly good at mimicry and does work a lot faster than any human could. It is only a &#34;10x developer&#34; in that it is 10x faster, not 10x better. I think that there is still a large gap between where this is going and the humans that are good at this craft. I&#39;m sure that the gap will narrow, but the intent to fully automate at any cost seems unjustified.

Which brings me back to the original comment about AI: we&#39;re at a stage where these assistants are productivity multipliers for skilled workers. Just like computers have been in various fields for decades now. But that isn&#39;t apparently good enough for the kool-aid drinking hype mongers: nothing less than complete replacement of the human element is acceptable in their book. The economics of the workplace aren&#39;t static, though -- it&#39;ll certainly devalue large parts of the this profession, but the runtime cost of AI models still isn&#39;t _zero_. There is an equilibrium to be found. I just have no idea how unpleasant it&#39;ll be, especially for new practitioners, and I have no idea how innovation will continue to happen when everything is a &#34;remix machine&#34;, but it&#39;ll be interesting to watch... I guess.
</source:markdown>
    </item>
    
    <item>
      <title>Velcro strips are your friend</title>
      <link>https://blog.scroogieboy.com/2024/09/29/velcro-strips-are.html</link>
      <pubDate>Sun, 29 Sep 2024 11:10:30 -0500</pubDate>
      
      <guid>http://cwirving.micro.blog/2024/09/29/velcro-strips-are.html</guid>
      <description>&lt;p&gt;The Walksnail Goggle X Extension Board arrived just in time for me to try flying an analog tinywhoop quadcopter that (hopefully) will be easier for a beginner to manage in a small back yard. I don&amp;rsquo;t have much to add about it, especially now that &amp;ldquo;real&amp;rdquo; reviewers have had time to &lt;a href=&#34;https://oscarliang.com/walksnail-goggle-x-extension-module/&#34;&gt;give their opinion&lt;/a&gt;, but one point I think that they consistently forget is that the double-sided adhesive pad supplied with the module makes packing the goggles a total pain and (I think) should be avoided.&lt;/p&gt;
&lt;p&gt;Self-adhesive heavy-duty Velcro strips are an obvious win here: you can set up the extension board, VRX and antennas as a unit (I zip-tied my VRX to the module so that it doesn&amp;rsquo;t pull out in transport) and attach/detach the whole unit with the Velcro. It isn&amp;rsquo;t a perfect contact area because the curves on the top of the goggles, but the Velcro strips do their job just fine.
Apart from that, as the reviewers say, the extension board works fine with a Foxeer Wildfire VRX and there was really nothing to complain about given the Goggle X as starting point (so, no analog DVR)). I&amp;rsquo;m not picky enough about latency to notice anything worth mentioning and picture quality is&amp;hellip; Well, analog.&lt;/p&gt;
&lt;p&gt;Obviously, this would not be my first choice if I were looking for an analog goggle &amp;ldquo;daily driver&amp;rdquo;, but as a way of adding on analog video to a primarily digital ecosystem, it really isn&amp;rsquo;t bad at all. We can quibble about whether Walksnail should have designed a more analog module friendly goggle, but this isn&amp;rsquo;t bad as a &amp;ldquo;slap it on for occasional use&amp;rdquo; kind of thing.&lt;/p&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/100767/2024/img-5138.jpeg&#34; width=&#34;450&#34; height=&#34;600&#34; alt=&#34;&#34;&gt;
</description>
      <source:markdown>The Walksnail Goggle X Extension Board arrived just in time for me to try flying an analog tinywhoop quadcopter that (hopefully) will be easier for a beginner to manage in a small back yard. I don&#39;t have much to add about it, especially now that &#34;real&#34; reviewers have had time to [give their opinion](https://oscarliang.com/walksnail-goggle-x-extension-module/), but one point I think that they consistently forget is that the double-sided adhesive pad supplied with the module makes packing the goggles a total pain and (I think) should be avoided.

Self-adhesive heavy-duty Velcro strips are an obvious win here: you can set up the extension board, VRX and antennas as a unit (I zip-tied my VRX to the module so that it doesn&#39;t pull out in transport) and attach/detach the whole unit with the Velcro. It isn&#39;t a perfect contact area because the curves on the top of the goggles, but the Velcro strips do their job just fine.
Apart from that, as the reviewers say, the extension board works fine with a Foxeer Wildfire VRX and there was really nothing to complain about given the Goggle X as starting point (so, no analog DVR)). I&#39;m not picky enough about latency to notice anything worth mentioning and picture quality is... Well, analog.

Obviously, this would not be my first choice if I were looking for an analog goggle &#34;daily driver&#34;, but as a way of adding on analog video to a primarily digital ecosystem, it really isn&#39;t bad at all. We can quibble about whether Walksnail should have designed a more analog module friendly goggle, but this isn&#39;t bad as a &#34;slap it on for occasional use&#34; kind of thing.

&lt;img src=&#34;https://cdn.uploads.micro.blog/100767/2024/img-5138.jpeg&#34; width=&#34;450&#34; height=&#34;600&#34; alt=&#34;&#34;&gt;
</source:markdown>
    </item>
    
    <item>
      <title>BetaFPV Meteor85 first flight hot takes</title>
      <link>https://blog.scroogieboy.com/2024/09/04/betafpv-meteor-first.html</link>
      <pubDate>Wed, 04 Sep 2024 18:00:09 -0500</pubDate>
      
      <guid>http://cwirving.micro.blog/2024/09/04/betafpv-meteor-first.html</guid>
      <description>&lt;p&gt;The unboxing and first flight experience with the BetaFPV Meteor85 (as a first-time quadcopter user) was&amp;hellip; Something.&lt;/p&gt;
&lt;p&gt;Because the Meteor85 flight controller has SPI ELRS on board, flashed with ELRX 2.x firmware, the first thing I had to do was to flash the latest Betaflight firmware on the controller. That&amp;rsquo;s exactly what everybody warns you not to do, but I need the latest Betaflight firmware to get ELRS 3.x support on the SPI receiver. That was a bit of an adventure as the web Betaflight Configurator doesn&amp;rsquo;t seem to be able to make the flight controller enter DFU mode &amp;ndash; but the desktop Mac app. does! After figuring out that little mess, things more or less just worked after updating the firmware and setting the ELRS binding phrase.&lt;/p&gt;
&lt;p&gt;I noticed that air mode is enabled by default from the factory and the switch settings to toggle between flight modes favor angle mode, so I remapped the switches a little, but it was more or less ready to fly once firmware was up to date. I took the time to update the Walksnail VTX firmware (damn, the BetaFPV and Walksnail USB dongles are tiny and fiddly!), bound it to the goggles (oh, yeah, that binding button is well-hidden under the drone&amp;rsquo;s canopy) and did a quick test flight in the back yard.&lt;/p&gt;
&lt;p&gt;Hot take #1: the Liftoff Micro Drones simulator doesn&amp;rsquo;t do the real flight characteristics justice. It isn&amp;rsquo;t miles away, but the real drone is far more unstable and fussy than the simulator. Once in the air, I think that it is closer but the takeoff experience is definitely harder than the simulation. Lots of splats into concrete and plants, there.&lt;/p&gt;
&lt;p&gt;Hot take #2: I need a bigger back yard! Well, I need to practice somewhere bigger and wide open because that &amp;ldquo;drunken sailor&amp;rdquo; first flight experience between oak trees and tall vegetation is not the best&amp;hellip;&lt;/p&gt;
&lt;p&gt;Hot take #3: This 85mm whoop is really easy to lose in vegetation! It doesn&amp;rsquo;t have a buzzer or LEDs, so it is surprissingly hard to find once it goes down.&lt;/p&gt;
&lt;p&gt;Hot take #4: The Walksnail Avatar 1S VTX on the Meteor85 overheats really fast! Not a problem once you&amp;rsquo;re flying, but when you&amp;rsquo;re mostly crashing and searching for the downed drone in he bushes, it is a race against time to find the drone before it overheats and shuts down.&lt;/p&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/100767/2024/img-5109.jpeg&#34; width=&#34;600&#34; height=&#34;600&#34; alt=&#34;&#34;&gt;
</description>
      <source:markdown>The unboxing and first flight experience with the BetaFPV Meteor85 (as a first-time quadcopter user) was... Something.

Because the Meteor85 flight controller has SPI ELRS on board, flashed with ELRX 2.x firmware, the first thing I had to do was to flash the latest Betaflight firmware on the controller. That&#39;s exactly what everybody warns you not to do, but I need the latest Betaflight firmware to get ELRS 3.x support on the SPI receiver. That was a bit of an adventure as the web Betaflight Configurator doesn&#39;t seem to be able to make the flight controller enter DFU mode -- but the desktop Mac app. does! After figuring out that little mess, things more or less just worked after updating the firmware and setting the ELRS binding phrase.

I noticed that air mode is enabled by default from the factory and the switch settings to toggle between flight modes favor angle mode, so I remapped the switches a little, but it was more or less ready to fly once firmware was up to date. I took the time to update the Walksnail VTX firmware (damn, the BetaFPV and Walksnail USB dongles are tiny and fiddly!), bound it to the goggles (oh, yeah, that binding button is well-hidden under the drone&#39;s canopy) and did a quick test flight in the back yard.

Hot take #1: the Liftoff Micro Drones simulator doesn&#39;t do the real flight characteristics justice. It isn&#39;t miles away, but the real drone is far more unstable and fussy than the simulator. Once in the air, I think that it is closer but the takeoff experience is definitely harder than the simulation. Lots of splats into concrete and plants, there.

Hot take #2: I need a bigger back yard! Well, I need to practice somewhere bigger and wide open because that &#34;drunken sailor&#34; first flight experience between oak trees and tall vegetation is not the best...

Hot take #3: This 85mm whoop is really easy to lose in vegetation! It doesn&#39;t have a buzzer or LEDs, so it is surprissingly hard to find once it goes down.

Hot take #4: The Walksnail Avatar 1S VTX on the Meteor85 overheats really fast! Not a problem once you&#39;re flying, but when you&#39;re mostly crashing and searching for the downed drone in he bushes, it is a race against time to find the drone before it overheats and shuts down.

&lt;img src=&#34;https://cdn.uploads.micro.blog/100767/2024/img-5109.jpeg&#34; width=&#34;600&#34; height=&#34;600&#34; alt=&#34;&#34;&gt;
</source:markdown>
    </item>
    
    <item>
      <title>Getting the Walksnail Avatar Goggles X to work with a Mac</title>
      <link>https://blog.scroogieboy.com/2024/08/23/getting-the-walksnail.html</link>
      <pubDate>Fri, 23 Aug 2024 17:52:31 -0500</pubDate>
      
      <guid>http://cwirving.micro.blog/2024/08/23/getting-the-walksnail.html</guid>
      <description>&lt;p&gt;Getting the Walksnail Avatar Goggles X to work with a Mac is rather annoying, but not quite the impossibility Caddx claim it to be:&lt;/p&gt;
&lt;p&gt;The first challenge is dealing with the recessed HDMI-in micro-HDMI connector. In the end, I ordered a cable with a plastic (rather than metal) connector body and shaved it with a knife. It&amp;rsquo;s ugly, but it fits fine.&lt;/p&gt;
&lt;p&gt;Once plugged in, assuming you&amp;rsquo;ve figured out how to switch inputs [a long ↩ (return) button press], then comes the finicky dance of picking a display mode that the goggles are willing to display. 1920x1080 at 100Hz eventually works fine for me, but it took multiple tries to get there. Initially, I got a solid magenta screen, then noise before it deigned to work. Now, it seems to work consistently, but I have no idea what made it work the first time. As far as I can tell, the HDCP handshake issues that Caddx said were a blocker are resolved in the current firmware. I didn&amp;rsquo;t need to run through a HDMI splitter to make it work &amp;ndash; a direct cable from my MacBook Pro&amp;rsquo;s HDMI port to the goggles was fine.&lt;/p&gt;
&lt;p&gt;Now, once you have a picture, it is all weirdly magenta with messed up colors. That is because the goggles advertise both RGB and YCbCr color modes and the Mac chooses YCbCr, but the goggles don&amp;rsquo;t really work properly unless in RGB mode. This is apparently a pretty common external display problem that, thankfully, the &lt;a href=&#34;https://github.com/waydabber/BetterDisplay#readme&#34;&gt;BetterDisplay&lt;/a&gt; utility solves this problem.&lt;/p&gt;
&lt;p&gt;Following the &lt;a href=&#34;https://github.com/waydabber/BetterDisplay/discussions/1473&#34;&gt;instructions&lt;/a&gt;, if you have a version of BetterDisplay greater or equal to 3.0.4, there is direct support to change the color mode in the BetterDisplay menu bar item. It&amp;rsquo;s drama-free and simple (although the goggles sometimes seem to get stuck in a mode and require unplugging and plugging back in for the change to happen).&lt;/p&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/100767/2024/img-5101.jpeg&#34; width=&#34;600&#34; height=&#34;600&#34; alt=&#34;&#34;&gt;
</description>
      <source:markdown>Getting the Walksnail Avatar Goggles X to work with a Mac is rather annoying, but not quite the impossibility Caddx claim it to be:

The first challenge is dealing with the recessed HDMI-in micro-HDMI connector. In the end, I ordered a cable with a plastic (rather than metal) connector body and shaved it with a knife. It&#39;s ugly, but it fits fine.

Once plugged in, assuming you&#39;ve figured out how to switch inputs [a long ↩ (return) button press], then comes the finicky dance of picking a display mode that the goggles are willing to display. 1920x1080 at 100Hz eventually works fine for me, but it took multiple tries to get there. Initially, I got a solid magenta screen, then noise before it deigned to work. Now, it seems to work consistently, but I have no idea what made it work the first time. As far as I can tell, the HDCP handshake issues that Caddx said were a blocker are resolved in the current firmware. I didn&#39;t need to run through a HDMI splitter to make it work -- a direct cable from my MacBook Pro&#39;s HDMI port to the goggles was fine.

Now, once you have a picture, it is all weirdly magenta with messed up colors. That is because the goggles advertise both RGB and YCbCr color modes and the Mac chooses YCbCr, but the goggles don&#39;t really work properly unless in RGB mode. This is apparently a pretty common external display problem that, thankfully, the [BetterDisplay](https://github.com/waydabber/BetterDisplay#readme) utility solves this problem.

Following the [instructions](https://github.com/waydabber/BetterDisplay/discussions/1473), if you have a version of BetterDisplay greater or equal to 3.0.4, there is direct support to change the color mode in the BetterDisplay menu bar item. It&#39;s drama-free and simple (although the goggles sometimes seem to get stuck in a mode and require unplugging and plugging back in for the change to happen).

&lt;img src=&#34;https://cdn.uploads.micro.blog/100767/2024/img-5101.jpeg&#34; width=&#34;600&#34; height=&#34;600&#34; alt=&#34;&#34;&gt;
</source:markdown>
    </item>
    
    <item>
      <title>Goggles X HDMI-in &#34;gate&#34;</title>
      <link>https://blog.scroogieboy.com/2024/08/22/goggles-x-hdmiin.html</link>
      <pubDate>Thu, 22 Aug 2024 17:15:23 -0500</pubDate>
      
      <guid>http://cwirving.micro.blog/2024/08/22/goggles-x-hdmiin.html</guid>
      <description>&lt;p&gt;Walksnail Avatar Goggles X update: as reviewers noted, the HDMI-in connector (a &lt;a href=&#34;https://blog.scroogieboy.com/2024/08/19/wow-the-electronics.html&#34;&gt;mini-HDMI connector&lt;/a&gt;, as noted) is recessed and 🤬 is it difficult to find a mini-HDMI cable to fit! It seems that I&amp;rsquo;m going to be buying a bunch of cables from Amazon until I can find one that has a skinny enough connector body or that I can cut into shape&amp;hellip; Boy, is this annoying.&lt;/p&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/100767/2024/img-5097.jpeg&#34; width=&#34;600&#34; height=&#34;359&#34; alt=&#34;&#34;&gt;
</description>
      <source:markdown>Walksnail Avatar Goggles X update: as reviewers noted, the HDMI-in connector (a [mini-HDMI connector](https://blog.scroogieboy.com/2024/08/19/wow-the-electronics.html), as noted) is recessed and 🤬 is it difficult to find a mini-HDMI cable to fit! It seems that I&#39;m going to be buying a bunch of cables from Amazon until I can find one that has a skinny enough connector body or that I can cut into shape... Boy, is this annoying.



&lt;img src=&#34;https://cdn.uploads.micro.blog/100767/2024/img-5097.jpeg&#34; width=&#34;600&#34; height=&#34;359&#34; alt=&#34;&#34;&gt;
</source:markdown>
    </item>
    
  </channel>
</rss>
