RSS.Style logo RSS/Atom Feed Analysis


Analysis of https://www.tbray.org/ongoing/ongoing.atom

Feed fetched in 391 ms.
Warning Content type is application/atom+xml, not text/xml.
Feed is 167,397 characters long.
Feed has an ETag of "295f1-631b8f25b441a".
Feed has a last modified date of Tue, 01 Apr 2025 15:11:10 GMT.
Warning This feed does not have a stylesheet.
This appears to be an Atom feed.
Feed title: ongoing by Tim Bray
Feed self link matches feed URL.
Feed has 19 items.
First item published on 2025-03-27T19:00:00.000Z
Last item published on 2024-12-02T20:00:00.000Z
Home page URL: https://www.tbray.org/ongoing/
Home page has feed discovery link in <head>.
Home page has a link to the feed in the <body>

Formatted XML
<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:thr="http://purl.org/syndication/thread/1.0" xml:lang="en-us">
    <title>ongoing by Tim Bray</title>
    <link rel="hub" href="http://pubsubhubbub.appspot.com/"/>
    <id>https://www.tbray.org/ongoing/</id>
    <link href="https://www.tbray.org/ongoing/"/>
    <link rel="self" href="https://www.tbray.org/ongoing/ongoing.atom"/>
    <link rel="replies" thr:count="101" href="https://www.tbray.org/ongoing/comments.atom"/>
    <logo>rsslogo.jpg</logo>
    <icon>/favicon.ico</icon>
    <updated>2025-04-01T08:11:09-07:00</updated>
    <author>
        <name>Tim Bray</name>
    </author>
    <subtitle>ongoing fragmented essay by Tim Bray</subtitle>
    <rights>All content written by Tim Bray and photos by Tim Bray Copyright Tim Bray, some rights reserved, see /ongoing/misc/Copyright</rights>
    <generator uri="/misc/Colophon">Generated from XML source code using Perl, Expat, Emacs, Mysql, Ruby, Java, and ImageMagick.  Industrial-strength technology, baby.</generator>
    <entry>
        <title>Latest Music (feat. Qobuz)</title>
        <link href="https://www.tbray.org/ongoing/When/202x/2025/03/27/Music-Plus-Qobuz"/>
        <link rel="replies" thr:count="6" type="application/xhtml+xml" href="/ongoing/When/202x/2025/03/27/Music-Plus-Qobuz#comments"/>
        <id>https://www.tbray.org/ongoing/When/202x/2025/03/27/Music-Plus-Qobuz</id>
        <published>2025-03-27T12:00:00-07:00</published>
        <updated>2025-03-27T16:50:41-07:00</updated>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Arts/Music"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Arts"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Music"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="The World/Life Online"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="The World"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Life Online"/>
        <summary type="xhtml">
            <div xmlns="http://www.w3.org/1999/xhtml">I’ve written a lot about ways of listening to music; in the current decade about     <a href="/ongoing/When/202x/2021/07/17/Music-Notes">liking YouTube Music</a> but then about     <a href="/ongoing/When/202x/2024/03/10/Play-My-Music">de-Googling</a>. What’s new is that I’m spending most of my time with     <a href="https://www.plex.tv/en-ca/plexamp/">Plexamp</a> and     <a href="https://www.qobuz.com/">Qobuz</a>. The trade-offs are complicated</div>
        </summary>
        <content type="xhtml">
            <div xmlns="http://www.w3.org/1999/xhtml">
                <p>
                    I’ve written a lot about ways of listening to music; in the current decade about
                    <a href="/ongoing/When/202x/2021/07/17/Music-Notes">liking YouTube Music</a>
                    but then about
                    <a href="/ongoing/When/202x/2024/03/10/Play-My-Music">de-Googling</a>
                    . What’s new is that I’m spending most of my time with
                    <a href="https://www.plex.tv/en-ca/plexamp/">Plexamp</a>
                    and
                    <a href="https://www.qobuz.com/">Qobuz</a>
                    . The trade-offs are complicated.
                </p>
                <h2 id="p-1">YouTube Music</h2>
                <p>I liked YTM because:</p>
                <ol>
                    <li>
                        <p>It let me upload my existing ten thousand tracks or so, which include many oddities that aren’t on streamers.</p>
                    </li>
                    <li>
                        <p>It did a good job of discovering new artists for me.</p>
                    </li>
                    <li>
                        <p>The Android Auto integration lets me say “Play Patti Smith” and it just does the right thing.</p>
                    </li>
                </ol>
                <p>But the artist discovery has more or less ran out of gas. I can’t remember the last time I heard something new that made me
    want more, and when I play “My Supermix”, it seems to always be the same couple of dozen songs, never anything good
    and new.</p>
                <p>Also: Bad at classical.</p>
                <p>I think I might keep on paying for YTM for the moment, because I really like to watch live concerts before I go to bed, and
    it seems like YTM subscribers never see any ads, which is worth something.</p>
                <img src="https://www.tbray.org/ongoing/When/202x/2025/03/27/Plexamp.png" alt="Plexamp"/>
                <h2 id="p-2">Plexamp</h2>
                <p>
                    I wrote up what it does in that
                    <a href="/ongoing/When/202x/2024/03/10/Play-My-Music">de-Googling</a>
                    link. Tl;dr: Runs a
    server on a Mac Mini at home and lets me punch through to it from anywhere in the world.
    I’ve been
    listening to it a lot, especially in the car, since YTM got boring.
                </p>
                <p>My back inventory of songs contains many jewels from CDs that I bought and loved
    in like 1989 or 2001 and subsequently forgot all about, and what a thrill when one of them lights up my day.</p>
                <p>I still feel vaguely guilty that I’m not paying Plex anything, but on the other hand what I’m doing costs them peanuts.</p>
                <p>But, I still want to hear new stuff.</p>
                <img src="https://www.tbray.org/ongoing/When/202x/2025/03/27/Qobuz.png" alt="Qobuz"/>
                <h2 id="p-4">Qobuz</h2>
                <p>
                    I vaguely knew it was out there among the streamers, but I got an intense hands-on demonstration recently while
                    <a href="/ongoing/When/202x/2025/03/07/Totem-Tribe-Tower">shopping for new speakers</a>
                    ; Phil at audiofi pulled up all my
    good-sound demo tracks with a couple of taps each, in what was apparently CD quality. Which opened my eyes.
                </p>
                <p>What I like about Qobuz:</p>
                <ol>
                    <li>
                        <p>It pays artists more per stream than any other service, by a wide margin.</p>
                    </li>
                    <li>
                        <p>It seems to have as much music as anyone else.</p>
                    </li>
                    <li>
                        <p>It’s album-oriented, and I appreciate artists curating their own music.</p>
                    </li>
                    <li>
                        <p>Classical music is a first-class citizen.</p>
                    </li>
                    <li>
                        <p>
                            While it doesn’t have an algorithm that finds music it thinks I’ll like, it is actively curated and they highlight new
      music regularly, and pick a “record of the week”. This week’s, for example, is
                            <cite>For Melancholy Brunettes (&amp; Sad
      Women)</cite>
                            by
                            <a href="https://japanesebreakfast.rocks">Japanese Breakfast</a>
                            . It’s extremely sweet stuff, maybe a little
      too low-key for me, but I still enjoyed it. They’re coming to town, I might go.
                        </p>
                    </li>
                    <li>
                        <p>This isn’t the only weekly selection that I’ve enjoyed.  Qobuz gives evidence of being built by people who love
      music.</p>
                    </li>
                </ol>
                <p>What don’t I like about Qobuz? The Mac app is kinda dumb, I sometimes can’t figure out how to do what I want, and for the
    life of me I can’t get it to show a simple full-screen display about the current song. But the Android app works OK.</p>
                <p>As for Qobuz’s claim to offer “Hi-Res” (i.e. better than CD) sound, meh.  I’m not convinced that this is actually
    audible and if it in principle were, I suspect that either my ears or my stereo would be a more important limiting factor.</p>
                <h2 id="p-3">Records!</h2>
                <p>Yep, I still occasionally drop the needle on the vinyl on the turntable, and don’t think I’ll ever stop.</p>
                <h2 id="p-5">And a reminder</h2>
                <p>If you really want to support artists, buy concert tickets. That thrill isn’t gone at all.</p>
            </div>
        </content>
    </entry>
    <entry>
        <title>Long Links</title>
        <link href="https://www.tbray.org/ongoing/When/202x/2025/03/17/Long-Links"/>
        <link rel="replies" thr:count="1" type="application/xhtml+xml" href="/ongoing/When/202x/2025/03/17/Long-Links#comments"/>
        <id>https://www.tbray.org/ongoing/When/202x/2025/03/17/Long-Links</id>
        <published>2025-03-17T12:00:00-07:00</published>
        <updated>2025-03-18T13:37:59-07:00</updated>
        <category scheme="https://www.tbray.org/ongoing/What/" term="The World"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="The World"/>
        <summary type="xhtml">
            <div xmlns="http://www.w3.org/1999/xhtml">This will be the 30th “Long Links” post. The frequency has fallen off over the years; perhaps my time for long-form pieces     has decreased or, just as likely, I protect my sanity in these dark days by consuming less. No, I don’t filter out Fascist     Craziness, because it’s a thing that needs to be understood to be resisted. Thus, today’s Long Links does contain     “the world is broken” pieces.” But not only; there’s good news here too, including fine typography and music</div>
        </summary>
        <content type="xhtml">
            <div xmlns="http://www.w3.org/1999/xhtml">
                <p>This will be the 30th “Long Links” post. The frequency has fallen off over the years; perhaps my time for long-form pieces
    has decreased or, just as likely, I protect my sanity in these dark days by consuming less. No, I don’t filter out Fascist
    Craziness, because it’s a thing that needs to be understood to be resisted. Thus, today’s Long Links does contain
    “the world is broken” pieces.” But not only; there’s good news here too, including fine typography and music.</p>
                <p>Let’s start with music.</p>
                <h2 id="p-1">Music</h2>
                <p>
                    “
                    <a href="https://www.bachvereniging.nl/en/allofbach">All of Bach</a>
                    is a project of the Netherlands Bach Society with the
    aim to perform and record all of Bach's works and share them online with the world for free.” The project
                    <a href="https://www.youtube.com/bach?app=desktop">manifests on YouTube</a>
                    and I have spent a
                    <em>lot</em>
                    of hours enjoying it.  The performances are all competent and while I disagree with an
    artistic choice here or there, I also think that many of these are triumphs.
                </p>
                <p>
                    One such triumph, and definitely a
                    <em>Long</em>
                    link, is Bach’s last work,
                    <a href="https://www.youtube.com/watch?v=N6sUlZa-IrU">The Art of Fugue, BWV 1080</a>
                    .
    Bach didn’t say which order the many parts of the piece should be performed in, or what instruments should be used, so
    there’s a lot of scope for choice and creativity in putting together a performance. This one is by
                    <a href="https://en.wikipedia.org/wiki/Shunsuke_Sato">Shinsuke Sato</a>
                    ,  the maestro of
    the Netherlands Bach Society. It is clever, unfancy, and its ninety or so minutes are mostly
    exquisite.
                </p>
                <p>
                    Vi Hart, mathemusician is now a Microsoftie, but has been one of my intellectual heroes. Get a comfy chair and pull up
                    <a href="https://vimeo.com/147902572">Twelve Tones</a>
                    , which addresses profound themes with a combination
    of cynicism, fun, music, and laserbats. You will need a bit of basic music literacy and intellectual flexibility, but
    you’ll probably end up smarter.
                </p>
                <h2 id="p-2">IsraPal</h2>
                <p>
                    On the “everything is broken” front, Israel/Palestine looms large. Here are two
                    <cite>New York Times</cite>
                    gift links that
    face the ugliness with clear eyes. First,
                    <a href="https://www.nytimes.com/2025/03/16/opinion/no-other-land-documentary-israel-gaza.html?unlocked_article_code=1.4k4.o0wv.bClPYg9XEiXZ&amp;smid=url-share">‘No Other Land’ Won an Oscar. Many People Hope You Don’t See It</a>
                    is what the title says.
    Second, it’s bad that criticism of Israel has become Thoughtcrime, and worse when
                    <a href="https://www.nytimes.com/2025/03/12/us/yale-suspends-scholar-terrorism.html?unlocked_article_code=1.4k4.OkaX.8zwOCZfLcDt5&amp;smid=url-share">AI
    is weaponized to look for it</a>
                    .
                </p>
                <h2 id="p-3">Tchaikovsky Opera</h2>
                <p>
                    <a href="https://en.wikipedia.org/wiki/Adrian_Tchaikovsky">Adrian</a>
                    not Pyotr, I mean, and space opera not musical costume drama.  
    In particular,
                    <a href="https://www.adriantchaikovsky.com/the-final-architects-shards-of-earth-eyes-of-the-voice-by-adrian-tchaikovsky.html#shards">The
    Final Architecture</a>
                    series. It’s ultra-large-scale space opera in three big fat volumes. I would say it’s mining the same
    vein as
                    <cite>The Expanse</cite>
                    and while it didn’t hit me nearly as hard as that did, it’s fun, will keep you turning
    pages.
                </p>
                <h2 id="p-4">Photography</h2>
                <p>
                    I’m a photography enthusiast and as a side-effect am gloomy about pro photogs’ increasing difficulty in making
    a living. I also buy a lot of stuff online. For both these reasons,
                    <a href="https://petapixel.com/2025/03/06/what-whitewalls-new-shopify-integration-means-to-photographers/">What WhiteWall’s New
    Shopify Integration Means to Photographers</a>
                    caught my eye. First of all, it’s generally cool that someone’s offering a
    platform to help photogs get online and sell their wares.
                </p>
                <p>Second, I can’t help but react to Shopify’s involvement. This gets complicated. First of all, Shopify is Canadian, yay. But,
    CEO Tobi Lütke is a MAGA panderer and invites wastrels like Breitbart onto the platform. And having said all that, speaking as a
    regular shopper, the Shopify platform is freaking excellent.</p>
                <p>Whenever I’m on a new online merchant and I see their
    distinctive styling around the “Proceed to payment” button, I know this thing is gonna Just Work.  A lot of times, once I’ve
    typed in my email address, it says “OK, done”, because it shares my payment data from merchant to merchant. Occasionally
    it’ll want me to re-authenticate or send a security code to my phone or or whatever.</p>
                <p>If I were setting up an online store to
    sell anything, that’s what I’d use. I mean, I’d hold my nose and let the company know that they need to fire their CEO for
    treason, but it’s still what I’d probably use.</p>
                <p>
                    Speaking of photography, I’ve repeatedly written about “C2PA”, see
                    <a href="/ongoing/When/202x/2023/10/28/C2PA-Workflows">On C2PA</a>
                    and
                    <a href="/ongoing/When/202x/2024/10/29/Lane-Provenance">C2PA Progress</a>
                    . I’m not going to explain once again what it is, but
    for those who know and care, it looks like
                    <a href="https://www.dpreview.com/news/6352280282/sony-content-authenticity-system-not-just-for-pro-cameras-anymore">Sony is
    doubling down on it</a>
                    , yay Sony!
                </p>
                <h2 id="p-5">Vancouver</h2>
                <p>
                    Vancouver residents who know the names “Concord Pacific” or “Terry Hui”, or who have
                    <a href="https://www.falsecreekfriends.org">feelings about False Creek</a>
                    , will
    probably enjoy
                    <a href="https://thetyee.ca/News/2025/03/03/Terry-Hui-Hole-Vancouver-Heart/">Terry Hui’s Hole in Vancouver’s Heart</a>
                    . You will
    have noticed some of the fragments of this bit of history going by, but Geoff Meggs puts it all together on a large vivid canvas
    that will you better informed and probably somewhat mind-boggled.
                </p>
                <h2 id="p-6">Let’s talk about TV!</h2>
                <p>
                    By which I mean a video screen used recreationally.
    Check out Archimago’s
                    <a href="https://archimago.blogspot.com/2025/03/hdmi-musings-high-speed-cables-data.html">HDMI Musings: high speed cables, data
    rates, YCbCr color subsampling, Dolby Vision MEL/FEL, optical cables and +5V injection</a>
                    . Yes, that’s a long title, and it’s a
    substantial piece, because HDMI is increasingly how you connect any two video-centric pieces of technology.
                </p>
                <p>From which I quote:
    “This recent update makes HDMI the fastest of all currently-announced consumer Audio-Video connection standards, the one wire
    that basically does it all”. I’m not going to try to summarize, but if you plow through this one you’ll know a lot more about
    those black wires all over your A/V setup. There’s lots of practical advice; it turns out that if you’re going to run an HDMI
    cable further than about two meters, certification matters.</p>
                <h2 id="p-7">Life online</h2>
                <p>
                    Where do people learn about the world from? The Pew Research Center investigated and published
                    <a href="https://www.pewresearch.org/journalism/fact-sheet/social-media-and-news-fact-sheet/">Social Media and News Fact
    Sheet</a>
                    . I suspect the results will surprise few of you, but it’s nice to have quantitative data. I would hope that a
    similar study, done next year not last year, would include decentralized social media, which this doesn’t.
                </p>
                <p>
                    I know that Ed Zitron’s
                    <a href="https://www.wheresyoured.at/never-forgive-them/">Never Forgive Them</a>
                    went viral, and I bet a lot of you saw it go
    by, or even started reading then left it parked in a tab you meant to get back to, because it’s so long.  Yeah; it’s arguably too
    long and too shrill, but on the other hand it is full of truth and says important things I’ve not seen elsewhere.
                </p>
                <p>
                    For example, I
    suspect most people reading this are angry about the ubiquitous enshittification of the online, but Zitron points out that
    people like us suffer much less because we have the money and the expertise to dodge and filter and route around a lot of the
    crap. Zitron actually purchased one of the most popular cheap Windows PCs
                    <span class="dashes"> —</span>
                    the kind of device
    ordinary people can afford
                    <span class="dashes"> —</span>
                    and reports from the front lines of what is in part a class war.
    The picture is much worse than you thought it was.
                </p>
                <p>
                    Here are a few bangers:
                    <br/>
                    “It isn’t that you don’t ’get‘ tech, it’s that the tech you use every day is no longer built for
    you, and as a result feels a very specific kind of insane.”
                    <br/>
                    “almost every single interaction with technology, which is
                    <em>required</em>
                    to live in modern society, has become actively
    adversarial to the user”.
                    <br/>
                    “The average person’s experience with technology is one so aggressive and violative that I believe it
    leaves billions of people with a consistent low-grade trauma.”
                </p>
                <h2 id="p-8">Publishing tech</h2>
                <p>It’s where I got my start. Two of the most important things are typography and color. And there’s good news!</p>
                <p>
                    The Braille Institute offers
                    <a href="https://www.brailleinstitute.org/freefont/">Read Easier With Our Family of Hyperlegible™ Fonts</a>
                    , which begins “Is
    this font easy for you to read? Good—that’s the idea.” Like! Would use. And in an era where the Web is too much infested
    by teeny-tiny low-contrast typography, it’s good to have alternatives.
                </p>
                <p>
                    Now, as for color: It is a sickeningly complex subject, both at the theory level and in the many-layered stack of models and
    equations and hardware and software that cause something to happen on a screen that your brain perceives as color.
    Bram Cohen, best-known for inventing BitTorrent, has been digging in, and gives us
                    <a href="https://bramcohen.com/p/color-theory">Color Theory</a>
                    and
                    <a href="https://bramcohen.com/p/a-simple-color-palette">A Simple Color Palette</a>
                    . I enjoyed them.
                </p>
                <h2 id="p-9">Geekery</h2>
                <p>If you know what “IPv6” is, then Geoff Huston’s <a href="https://www.potaroo.net/ispcol/2024-10/ipv6-transition.html">The IPv6
    Transition</a> will probably interest you. Tl;dr: Don’t hold your breath waiting for an all-IPv6 Internet.</p>
                <p>
                    And, much as I’d like to, it’s difficult to avoid AI news. So here is plenty, from Simon Willison, who has no AI axe to grind nor
    product to sell:
                    <a href="https://simonwillison.net/2024/Dec/31/llms-in-2024/">Things we learned about LLMs in 2024</a>
                    .
                </p>
                <h2 id="p-10">Business</h2>
                <p>
                    I can testify from personal experience that Andy Jassy is an extremely skilled manager, but I found
                    <a href="https://www.cnbc.com/amp/2024/12/15/amazon-and-the-endangered-future-of-the-middle-manager.html">Amazon and the
    endangered future of the middle manager</a>
                    , from CNBC, unconvincing. The intro: “Jassy's messaging on an increased ratio of
    individual contributors to managers raises a much bigger question about organizational structure: What is the right balance
    between individual workers and managers in overall headcount?” There’s talk of laying off many thousands of
    managers.
                </p>
                <p>Before I worked at Amazon I was at Google, which has a much higher IC/manager ratio. Teams of 20 were not uncommon, and as a
    result, there was both a manager and a Tech Lead, which meant the manager was basically an HR droid.  Amazon always insisted
    that the manager sweat the details of what their team was working on, deeply understand the issues they were facing and what
    they were building. I don’t see how that’s compatible with increasing the ratio.</p>
                <p>
                    And, Google management was
                    <em>way</em>
                    weaker than Amazon’s, not even close. So I’d have to say that the evidence is against
    Andy on this one.
                </p>
                <h2 id="p-11">Art island</h2>
                <p>
                    Japan has one. It’s called
                    <a href="https://www.japan.travel/en/spot/220/">Naoshima</a>
                    . Great idea. I’d go.
                </p>
            </div>
        </content>
    </entry>
    <entry>
        <title>Totem Tribe Towers</title>
        <link href="https://www.tbray.org/ongoing/When/202x/2025/03/07/Totem-Tribe-Tower"/>
        <link rel="replies" thr:count="6" type="application/xhtml+xml" href="/ongoing/When/202x/2025/03/07/Totem-Tribe-Tower#comments"/>
        <id>https://www.tbray.org/ongoing/When/202x/2025/03/07/Totem-Tribe-Tower</id>
        <published>2025-03-07T12:00:00-08:00</published>
        <updated>2025-03-12T10:55:12-07:00</updated>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Technology/Audio"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Technology"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Audio"/>
        <summary type="xhtml">
            <div xmlns="http://www.w3.org/1999/xhtml">I bought new speakers. This story combines beautiful music with advanced analogue technology and nerdy obsession. Despite     which, many of you are not fascinated by high-end audio; you can leave now.     Hey, this is a blog, I get to write about what excites me.     The seventeen of you who remain will probably enjoy the deep dive</div>
        </summary>
        <content type="xhtml">
            <div xmlns="http://www.w3.org/1999/xhtml">
                <p>I bought new speakers. This story combines beautiful music with advanced analogue technology and nerdy obsession. Despite
    which, many of you are not fascinated by high-end audio; you can leave now.
    Hey, this is a blog, I get to write about what excites me.
    The seventeen of you who remain will probably enjoy the deep dive.</p>
                <img src="https://www.tbray.org/ongoing/When/202x/2025/03/07/PXL_20250308_205849091.png" alt="Totem Tribe Towers"/>
                <div class="caption">
                    <p>
                        Totem Tribe Tower loudspeakers, standing on a subwoofer.
                        <br/>
                        This picture makes them look
    bigger than they really are. They come in black or white, satin or gloss finish.
                        <br/>
                        Prettier with the grille on, I think.
                    </p>
                </div>
                <h2 id="p-2">Why?</h2>
                <p>
                    My
                    <a href="/ongoing/When/200x/2006/03/02/Totem#p-3">main speakers</a>
                    were 22 years old, bore scars from toddlers (now grown) and
    cats (now deceased).
    While they still sounded beautiful, there was loss of precision.  They’d had a good run.
                </p>
                <h2 id="p-8">Speakers matter</h2>
                <p>
                    Just in the last year, I’ve become convinced, and argued here, that both
                    <a href="/ongoing/When/202x/2023/06/03/Parasound-Halo-P-6#p-5">DACs</a>
                    and
                    <a href="/ongoing/When/202x/2024/09/09/Next-Step-Audiophile">amplifiers</a>
                    are pretty well solved problems, that there’s no
    good reason to spend big money on them, and that you should focus your audio investments on speakers and maybe room
    treatment. So this purchase is a big deal for me.
                </p>
                <h2 id="p-1">How to buy?</h2>
                <p>
                    The number of boutique speaker makers, from all over the world, is mind-boggling; check out
                    <a href="https://www.stereophile.com/content/recommended-components-fall-2024-edition-loudspeakers">
                        the
                        <cite>Stereophile</cite>
                        list
                    </a>
                    of recommendations. Here’s the thing: Pretty well all of them sound wonderful. (The speakers I bought haven’t
    been reviewed by
                    <cite>Stereophile</cite>
                    .)
                </p>
                <p>
                    So there are too many options. Nobody could listen to even a small proportion of them, at any price
    point.  Fortunately, I had three powerful filters to narrow down the options. The
    speakers had to (1) look nice, and (2) be Canadian products, probably (3) from
                    <a href="https://totemacoustic.com">Totem Acoustic</a>
                    .
                </p>
                <h2 id="p-3">Decor?</h2>
                <p>I do not have, nor do I want, a man-cave. I’ve never understood the concept.</p>
                <p>
                    And you have to be careful. There are high-end speakers, some very well-reviewed, with design sensibilities right out of
                    <cite>Mad Max</cite>
                    or
                    <cite>Brazil</cite>
                    . And then a whole bunch that are featureless rectangles with drivers on the
    front.
                </p>
                <p>
                    Ours have to live in a big media alcove just off the kitchen; they are shared by
    the pure-audio system and
                    <a href="/ongoing/When/202x/2024/11/11/TV-land">the huge TV</a>
                    .  The setup has to please the eyes of the whole family.
                </p>
                <h2 id="p-4">Canadian?</h2>
                <p>At this point in time, a position of “from anywhere but the US, the malignant force threatening our sovereignty” would be
    unsurprising in a Canadian.  But there are unsentimental reasons, too.  It turns out Canadian speaker makers have had an
    advantage stretching back many decades.</p>
                <p>
                    This is mostly due to the work of
                    <a href="https://www.torontoaes.org/floyd-toole/">Floyd
    Toole</a>
                    , electrical engineer and acoustician, once an employee of Canada’s National Research Council, who built an anechoic chamber
    at the NRC facility,
                    <a href="https://en.wikipedia.org/wiki/Audio_system_measurements#Unquantifiable?">demonstrated that humans can reliably
    detect differences in speaker accuracy</a>
                    , and made his facility available to commercial speaker builders. So there have been
    quite a few good speakers built up here over the years.
                </p>
                <h2 id="p-5">Totem?</h2>
                <p>
                    What happened was, in 1990 or so I went to an audio show down East somewhere and met Vince Bruzzese, founder of Totem
    Acoustic, who was showing off his then-brand-new “Model One” speakers. They were small, basic-black, and entirely melted my
    heart playing a Purcell string suite. They
                    <a href="https://totemacoustic.com/product/signature-one/">still sell them</a>
                    , I see.
    Also, the Totem exhibit was having a quiet spell so there was time to talk, and it turned out that Bruzzese and I liked a lot of the
    same music.
                </p>
                <p>So I snapped up the Model Ones and that same set is still sounding beautiful over at our cabin. And every speaker I’ve bought in the
    intervening decades has come from Totem or from PSB, another excellent Toole-influenced Canadian shop. I’ve also met and conversed
    with Paul Barton, PSB’s founder and main brain. Basically, there’s a good chance that I’ll like anything Vince or
    Paul ship.</p>
                <p>
                    My plan was to give a listen to those two companies’ products. A cousin I’d visited last year had big recent PSB speakers and
    I liked them a whole lot, so they were on my menu. But PSB seems to have given up on audio dealers, want to
                    <a href="https://www.psbspeakers.com/ca/speakers/tower">sell online</a>
                    .
    Huh?! Maybe it’ll work for them, but it doesn’t work for me.
                </p>
                <p>
                    So I found a local Totem dealer;
                    <a href="https://audiofi.ca">audiofi</a>
                    in Mount Pleasant.
                </p>
                <h2 id="p-6">Auditioning</h2>
                <p>
                    For this, you should use some of your most-listened-to tracks from your own collection. I took my computer along for
    that purpose, but it turned out that
                    <a href="https://www.qobuz.com/ca-en/discover">Qobuz</a>
                    had ’em all. (Hmm, maybe I should look closer at Qobuz.)
                </p>
                <p>Here’s what was on my list. I should emphasize that, while I like all these tracks, they’re not terribly representative of
    what I listen to. They’re selected to stress out a specific aspect of audio reproduction. The Americana and Baroque and Roots
    Rock that I’m currently fixated on are pretty easy to reproduce.</p>
                <ul>
                    <li>
                        <p>
                            <cite>200 More Miles</cite>
                            from the Cowboy Junkies’
                            <cite>Trinity Session</cite>
                            . Almost any track from this record
      would do; they recorded with a single ambiphonic microphone and any competent setup should make it feel like you’re in the
      room with them. And Margo’s singing should make you want to cry.
                        </p>
                    </li>
                    <li>
                        <p>
                            <cite>The Longships</cite>
                            , from Enya’s
                            <cite>Watermark</cite>
                            album.  This is a single-purpose test for low bass. It
      has these huge carefully-tuned bass-drum whacks that just vanish on most speakers without extreme bass extension, and the music makes
      much less sense without them. You don’t have to listen to the whole track; but it’s fine music, Enya was really on her game
      back then.
                        </p>
                    </li>
                    <li>
                        <p>The opening of Dvořák’s Symphony #9, “From the New World”. There are plenty of good recordings, but I like Solti
      and the Chicago Symphony. Dvořák gleefully deploys jump-scare explosions of massed strings and other cheap orchestration tricks
      in the first couple of minutes
      to pull you into the symphony. What I’m looking for is the raw
      physical shock of the first big full-orchestra entrance.</p>
                    </li>
                    <li>
                        <p>
                            <cite>Death Don’t Have No Mercy</cite>
                            from Hot Tuna’s
                            <cite>Live At Sweetwater Two</cite>
                            . Some of the prettiest slide
      guitar you’ll hear anywhere from Kaukonen, and magic muscle from Casady. And then Jorma’s voice, as comfortable as old shoes
      and full of grace. About three minutes in there’s an instrumental break and you want to hear the musical lines dancing around
      each other with no mixups at all.
                        </p>
                    </li>
                    <li>
                        <p>First movement of Beethoven’s Sonata #23, “Appassionata”, Ashkenazy on London. Pianos are very difficult; two little
      speakers have a tiny fraction of the mass and vibrating surface of a big concert grand. It’s really easy for the sound to
      be on the one hand too small, or on the other all jumbled up. Ashkenazy and the London engineers do a fine job here; it really
      should sound like he’s sitting across the room from you.</p>
                    </li>
                    <li>
                        <p>
                            <cite>Cannonball</cite>
                            , the Breeders’ big hit.  It’s a pure rocker and a real triumph of arrangement and production,
      with lots of different guitar/keys/drum tones. You need to feel it in your gut, and the rock &amp; roll edge should be
      frightening.
                        </p>
                    </li>
                    <li>
                        <p>
                            <cite>Identikit</cite>
                            from Radiohead’s
                            <cite>A Moon Shaped Pool</cite>
                            . This is mostly drums and voice, although
      there are eventually guitar interjections. It’s a totally artificial construct, no attempt to sound like live musicians
      in a real space. But the singing and drumming are fabulous and they need to be 100% separated in space, dancing without
      touching. And Thom Yorke in good voice had better make you shiver a bit.
                        </p>
                    </li>
                    <li>
                        <p>
                            <cite>Miles Runs The Voodoo Down</cite>
                            from
                            <cite>Bitches Brew</cite>
                            . This is complex stuff, and Teo Macero’s
      production wizardry embraces the complexity without losing any of that fabulous band’s playing. Also Miles plays two of the
      greatest instrumental solos ever recorded, any instrument, any genre, and one or two of the ascending lines should feel like
      he’s pulling your whole body up out of your chair.
                        </p>
                    </li>
                    <li>
                        <p>
                            Emmylou Harris. This would better be phrased as “Some singer you have strong emotional reactions to.” I listened to
      the title track and
                            <cite>Deeper Well</cite>
                            from the
                            <cite>Wrecking Ball</cite>
                            album. If a song that can make you feel that way doesn’t
      make you feel that way, try different speakers.
                        </p>
                    </li>
                </ul>
                <h2 id="p-7">The listening session</h2>
                <p>I made an appointment with Phil at Audiofi, and we spent much of an afternoon listening. I thought Audiofi was fine, would go
    back.  Phil was erudite and patient and not pushy and clearly loves the technology and music and culture.</p>
                <p>
                    I was particularly interested in the
                    <a href="https://totemacoustic.com/product/element-fire-v2/">Element Fire V2</a>
                    , which has been creating buzz in online
    audiophile conversation. They’re “bookshelf” (i.e. stand-mounted) rather than floorstanders, but people keep saying they sound
    like huge tower speakers that are taller than you are. So I was predisposed to find them interesting, and I listened to maybe
    half of the list above.
                </p>
                <p>
                    But I was unhappy, it just wasn’t making me smile. Sure, there was a stereo image, but at no point did I get a convincing
    musicians-are-right-over-there illusion. It was particularly painful on the Cowboy Junkies. It leapt satisfactorily out of the speakers
    on the Dvořák and was brilliant on
                    <cite>Cannonball</cite>
                    , but there were too many misses.
                </p>
                <p>Also, the longer I looked at it the less it pleased my eyes.</p>
                <p>
                    “Not working, sorry. Let’s listen to something else” I said. I’d already noticed the Tribe Towers, which even though they were
    floorstanders, looked skinny and pointy compared to the Elements. I’d never read anything about them but they share the Element’s
                    <a href="https://totemacoustic.com/totem-torrent-technology/">interesting
    driver technology</a>
                    , and are cheaper.
                </p>
                <p>So we set them up and they absolutely aced everything the Elements had missed. Just vanished, I mean, and there was a
    three-dimensional posse of musicians across the room, filling the space with three-dimensional music.
    They flunked the Enya drum-thwack test but that’s OK because I have a
    subwoofer (from PSB) at home. In particular, they handled Ashkenazy pounding out the Beethoven just absolutely without effort.
    I’m not sure I’ve ever heard better piano reproduction.</p>
                <p>And the longer I looked at them the more my thinking switched from “skinny and pointy” to “slender and elegant”.</p>
                <p>
                    A few minutes in and, I told Phil, I was two-thirds sold. He suggested I look at some
                    <a href="https://www.magicoaudio.com">Magico</a>
                    speakers but they were huge and like $30K; as an audiophile I’m only mildly
    deranged. And American, so no thanks.
                </p>
                <p>
                    I went home to think about it.
    I was worried that I’d somehow been unfair to the Elements. Then I read the
                    <a href="https://www.stereophile.com/content/totem-acoustic-element-fire-v2-loudspeaker"><cite>Stereophile</cite> review</a>
                    ,
    and while the guy who did the subjective listening test loved ’em, the
                    <a href="https://www.stereophile.com/content/totem-acoustic-element-fire-v2-loudspeaker-measurements">lab measurements</a>
                    seemed to show real problems.
                </p>
                <p>I dunno. Maybe that was the wrong room for them. Or the wrong amplifier. Or the wrong positioning. Or maybe they’re just a rare
    miss from Totem.</p>
                <p>My research didn’t turn up a quantitative take on the Tribes, just a lot of people writing that they sound much bigger than
    they really are, and that they were happy they’d bought them.</p>
                <p>And I’d been happy listening to them. So I pulled the trigger. My listening space is acoustically friendlier than the one at
    Audiofi and if they made me happy there, they’d make me happy at home.</p>
                <p>And they do. Didn’t worry too much about positioning, just made sure it was symmetric. The first notes they played were
    brilliant.</p>
                <h2 id="p-9">But how does it sound?</h2>
                <p>See all those auditioning tracks up above, where it says what speakers “should” do?
    They do, that’s what they sound like.</p>
                <p>I’ve been a little short on sleep, staying up late to listen to music.</p>
                <h2 id="p-10">Follow-up: Customer service</h2>
                <p>
                    As noted above I have a subwoofer, and
                    <a href="/ongoing/When/202x/2023/06/03/Parasound-Halo-P-6">my preamp</a>
                    lets you configure where to roll off the bass going to
    the main speakers and hand off to the subwoofer. I wrote off to Totem’s customer-support email address wondering if they had any
    guidance on frequency.  They got back to me with specific advice, and another couple of things to double-check.
                </p>
                <p>High-end audio. Simpatico salespeople. The products last decades. The vendors answer emails from random customers. Businesses
    it’s still possible to like.</p>
            </div>
        </content>
    </entry>
    <entry>
        <title>Bye, Prime</title>
        <link href="https://www.tbray.org/ongoing/When/202x/2025/03/06/Canceled-Prime"/>
        <link rel="replies" thr:count="7" type="application/xhtml+xml" href="/ongoing/When/202x/2025/03/06/Canceled-Prime#comments"/>
        <id>https://www.tbray.org/ongoing/When/202x/2025/03/06/Canceled-Prime</id>
        <published>2025-03-06T12:00:00-08:00</published>
        <updated>2025-03-07T09:24:15-08:00</updated>
        <category scheme="https://www.tbray.org/ongoing/What/" term="The World/Life Online"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="The World"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Life Online"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Business/Internet"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Business"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Internet"/>
        <summary type="xhtml">
            <div xmlns="http://www.w3.org/1999/xhtml">Today I canceled my Amazon Prime subscription</div>
        </summary>
        <content type="xhtml">
            <div xmlns="http://www.w3.org/1999/xhtml">
                <p>Today I canceled my Amazon Prime subscription.</p>
                <img src="https://www.tbray.org/ongoing/When/202x/2025/03/06/end.png" alt="Amazon Prime canceled"/>
                <h2 id="p-1">Why?</h2>
                <p>
                    As I wrote in
                    <a href="/ongoing/When/202x/2020/07/23/Not-an-Amazon-Problem">Not an Amazon Problem</a>
                    (and please go read that if you haven’t)
    I don’t see myself as an enemy of Amazon, particularly. I think the pressures of 21st-century capitalism have put every large
    company into a place where they really can’t afford to be ethical or the financial sector will rip them to shreds then
    replace the CEO with someone who will maximize shareholder return at all costs, without any of that amateurish “ethics” stuff.
                </p>
                <p>To the extent that Amazon is objectionable, it’s a symptom of those circumstances.</p>
                <p>I’m bailing out of Prime not to hurt Amazon, but because it doesn’t make commercial or emotional sense for me just now.</p>
                <h2 id="p-2">Commercial?</h2>
                <p>
                    Yes, free next-day delivery is pretty great. In fact, in connection with
                    <a href="/ongoing/When/202x/2025/02/28/Moved">our recent move</a>
                    , I’ve been ordering small cheap stuff
    furiously: 
    (USB cables, light switches, closet organizers, a mailbox, a TV mount, WiFi hubs, banana plugs, you name it).
                </p>
                <p>But the moving operations are mostly done, and there are few (any?) things we really need the next day, and we’re fortunate,
    living in the center of a 15-minute city. So getting my elderly ass out of my chair and going to a store is a good option, for
    more than one reason.</p>
                <p>Second, for a lot of things you want to order, the manufacturer has its own online store these days and a lot of them are
    actually well-built, perfectly pleasant to use.</p>
                <p>Third, Amazon’s prices aren’t notably cheaper than the alternatives.</p>
                <h2 id="p-3">Emotional?</h2>
                <p>Amazon is an US corporation and the US is now hostile to Canada, repeatedly threatening to annex us. So I’m
    routing my shopping dollars 
    away from there generally and to Canadian suppliers specifically. Dumping Prime is an easy way to help that along.</p>
                <p>Second, shopping on Amazon for the kinds of small cheap things listed above is more than a little unpleasant. The
    search-results page is a battle of tooth and claw among low-rent importers. Also it’s just really
    freaking ugly, hurts my eyes to look at it.</p>
                <img src="https://www.tbray.org/ongoing/When/202x/2025/03/06/you-have-watched.png" alt="You have watched 29 shows/movies with Prime Video"/>
                <div class="caption">
                    <p>Really? I have no idea what they were.</p>
                </div>
                <p>
                    Finally, one of Prime’s big benefits used to be Prime Video, but no longer. There was
    just no excuse for greenlighting that execrable
                    <cite>Rings of Power</cite>
                    show, and I’m not aware of anything else I want to
    watch.
                </p>
                <p>Amazon is good at lots of things, but has never been known for good taste. I mean, look at that
    search-results page.</p>
                <img src="https://www.tbray.org/ongoing/When/202x/2025/03/06/are-you-sure.png" alt="Are you sure you want to end your membership?"/>
                <div class="caption">
                    <p>Yep.</p>
                </div>
                <h2 id="p-4">Is it easy?</h2>
                <p>Yep, no complaints. There were only two please-don’t-go begs and neither was offensive.</p>
                <p>No hard feelings.</p>
            </div>
        </content>
    </entry>
    <entry>
        <title>Moved</title>
        <link href="https://www.tbray.org/ongoing/When/202x/2025/02/28/Moved"/>
        <link rel="replies" thr:count="3" type="application/xhtml+xml" href="/ongoing/When/202x/2025/02/28/Moved#comments"/>
        <id>https://www.tbray.org/ongoing/When/202x/2025/02/28/Moved</id>
        <published>2025-02-28T12:00:00-08:00</published>
        <updated>2025-03-01T11:42:05-08:00</updated>
        <category scheme="https://www.tbray.org/ongoing/What/" term="The World"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="The World"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Arts/Photos"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Arts"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Photos"/>
        <summary type="xhtml">
            <div xmlns="http://www.w3.org/1999/xhtml">It is traditional in this season in this space to tickle your eyes with pictures of our early spring crocuses, while gently     dunking a bit on our fellow Canadians who, away from the bottom left corner of the country, are still snowbound.  So,     here you go. Only not really</div>
        </summary>
        <content type="xhtml">
            <div xmlns="http://www.w3.org/1999/xhtml">
                <p>It is traditional in this season in this space to tickle your eyes with pictures of our early spring crocuses, while gently
    dunking a bit on our fellow Canadians who, away from the bottom left corner of the country, are still snowbound.  So,
    here you go. Only not really.</p>
                <img src="https://www.tbray.org/ongoing/When/202x/2025/02/28/PXL_20250227_204913037.png" alt="Crocuses on moss"/>
                <p>
                    Yes, those are this spring’s crocuses. But they’re not
                    <em>our</em>
                    crocuses, they’re someone else’s. We don’t have any. Because we moved.
                </p>
                <p>It’s a blog isn’t it? I’ve written up childbirths and pet news and vacations and all that stuff. So why not
    this?</p>
                <p>What happened was, we bought a house in 1996 and then, after 27 years and raising two kids and more cats, it
    was, well, not actually dingy, but definitely tired.  The floors. The paint. The carpet. The cupboards. So we started down two paths at
    once, planning for a major renovation on one side, and shopping for a new place on the other. Eighteen months later we hadn’t
    found anything to buy, and the reno was all planned and permitted and we were looking for rentals to camp out in.</p>
                <p>Then, 72 hours from when we were scheduled to sign the reno contract,  this place came on the market across our back alley and
    three houses over.
    The price was OK and it didn’t need much work and, well, now we live there.</p>
                <p>I’m sweeping a lot of drama under the rug. Banking drama and real-estate drama and insurance drama and
    floor-finishing drama and Internet-setup drama and A/V drama and storage drama. And of course moving drama. Month after month
    now, Lauren and I have ended more days than not exhausted.</p>
                <p>But here we are. And we’re not entirely without our plants.</p>
                <img src="https://www.tbray.org/ongoing/When/202x/2025/02/28/PXL_20241004_204715352.png" alt="Moving the rosebush"/>
                <p>
                    This is Jason of
                    <a href="https://www.cycledrivengardening.biz">Cycle Driven Gardening</a>
                    ,who lent his expertise to moving our favorite
    rosebushes, whose history
                    <a href="/ongoing/When/200x/2003/07/06/RoseTrip2">goes back decades</a>
                    .
    Of course, there could be no guarantee that those old friends would survive the process.
                </p>
                <p>Today was unseasonably warm and our new back patio is south-facing, so we soaked up the sun and cleared it of leftover moving
    rubble. Then ventured into the back yard, much-ignored over winter.</p>
                <p>Each and every rosebush has buds peeking out. So it looks, Dear Reader, like I’ll be able to inflict still more blossom pictures
    on you, come spring.</p>
                <p>And we’ll be putting in crocuses, but those photos will have to wait twelve months or so.</p>
                <p>See, even in 2025, there are stories with happy endings.</p>
            </div>
        </content>
    </entry>
    <entry>
        <title>Safari Cleanup</title>
        <link href="https://www.tbray.org/ongoing/When/202x/2025/02/26/Safari-Cleanup"/>
        <link rel="replies" thr:count="11" type="application/xhtml+xml" href="/ongoing/When/202x/2025/02/26/Safari-Cleanup#comments"/>
        <id>https://www.tbray.org/ongoing/When/202x/2025/02/26/Safari-Cleanup</id>
        <published>2025-02-26T12:00:00-08:00</published>
        <updated>2025-02-27T21:43:27-08:00</updated>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Technology/Web"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Technology"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Web"/>
        <summary type="xhtml">
            <div xmlns="http://www.w3.org/1999/xhtml">Like most Web-heads I spent years living in Chrome, but now feel less comfy there, because Google.     I use many browsers but now my     daily driver is Safari. I’m pretty happy with it but there’s ugly stuff hiding in its corners that needs     to be cleaned up. This fragment’s mostly about those corners, but I include notes on the bigger browser     picture and a couple of ProTips</div>
        </summary>
        <content type="xhtml">
            <div xmlns="http://www.w3.org/1999/xhtml">
                <p>Like most Web-heads I spent years living in Chrome, but now feel less comfy there, because Google.
    I use many browsers but now my
    daily driver is Safari. I’m pretty happy with it but there’s ugly stuff hiding in its corners that needs
    to be cleaned up. This fragment’s mostly about those corners, but I include notes on the bigger browser
    picture and a couple of ProTips.</p>
                <h2 id="p-1">Many browsers?</h2>
                <p>If your life is complicated at all you need to use more than one. By way of
    illustration not recommendation, here’s what I do:</p>
                <ul>
                    <li>
                        <p>
                            <b>Safari</b>
                            is where I spend most of my time. As I write this I have 36 tabs, eight of them pinned. That
      the pinned number is eight is no accident, it’s because of the
                            <a href="/ongoing/When/201x/2012/04/22/Tab-Lore">Tab Trick</a>
                            , which if you don’t know about, you really need to
      learn.
                        </p>
                        <p>More on Safari later.</p>
                    </li>
                    <li>
                        <p>
                            I use
                            <b>Chrome</b>
                            for business. It’s where I do banking and time-tracking and invoicing. (Much of this relies on
                            <a href="https://www.paymoapp.com">Paymo</a>
                            , which is great.  It takes seconds to track my time, and like ten minutes to do
      a super-professional monthly invoice.)
                        </p>
                    </li>
                    <li>
                        <p>
                            I use
                            <b>Firefox</b>
                            when I need to be
                            <a href="https://cosocial.ca/@coop">@[email protected]</a>
                            or go anywhere while certain that no Google accounts
      are logged in.
                        </p>
                    </li>
                    <li>
                        <p>
                            I use
                            <b>Chrome Canary</b>
                            for an organization I work with that has Chrome-dependent stuff that I don’t want to mix up with any
      of my personal business.
                        </p>
                    </li>
                </ul>
                <h2 id="p-2">Safari, you say?</h2>
                <p>We inhabit the epoch of Late Capitalism. Which means there’s no reason for me to expect any  company
    to exhibit ethical behavior. Because ethics is  for amateurs.</p>
                <p>So when I go looking for infrastructure that offers privacy protection, I look for a provider whose
    business model depends at least in part on it. That leaves Safari.</p>
                <p>Yeah, I know about Cook kissing Trump’s ring, and detest
    companies who route billions of nominal profits internationally to dodge taxes, and am revolted at the
    App Store’s merciless rent-extraction from app developers who make Apple products better.</p>
                <p>But still, I think their privacy story is pretty good, and it makes me happy when their marketing emphasizes it. Because 
    if privacy is on their path to profit, I don’t have to mis-place my faith in any large 21st-century corporation’s “ethical
    values”.</p>
                <p>Also, Safari is technically competent. It’s fast enough, and (unlike even a very few years ago) compatible with wherever I go.
    The number of Chome-only sites, thank goodness, seems to be declining rapidly.</p>
                <p>So, a tip o’ the hat to the Safari team, they’re mostly giving me what I need. But there are irritants.</p>
                <h2 id="p-3">Tab fragility</h2>
                <p>This is my biggest gripe. Every so often, Safari just loses all my tabs when… well, I can’t spot a pattern. Sometimes it’s
    when I accidentally ⌘-Q it, sometimes it’s when I have two windows open for some reason and ⌘-W something. I
    think. Maybe. Sometimes they’re just gone.</p>
                <p>Yes, I know about the “Reopen all windows from last session” operation. If it solved the problem I wouldn’t be writing this.</p>
                <p>This is insanely annoying, and a few years back, more than once it seriously damaged my progress in multiple
    projects. Fortunately, I discovered that the Bookmarks menu has a one-click thing to create bookmarks for all my open tabs.
    So I hit that now and again and it’s saved me from tab-loss damage a couple of times now.</p>
                <p>Someone out there might be thinking of suggesting that I not use browser tabs to store my current professional
    status. Please don’t, that would be rude.</p>
                <h2 id="p-4">Pin fragility</h2>
                <p>Even weirder, sometimes when I notice I’ve lost my main window and use the History menu to try to bring it back, I get a new
    window with all my tabs except for the pinned ones. Please, Safari.</p>
                <h2 id="p-5">Kill-pinned-tab theater</h2>
                <p>Safari won’t let me ⌘-W a pinned tab. This is <em>good</em>, correct where Chrome is wrong.</p>
                <p>But when I try, does it quietly
    ignore me, or emit a gentle beep? No, it abruptly shifts to the first un-pinned tab. Which makes me think that I indeed
    killed the tab I was on, then I realize that no I didn’t, then I panic because obviously I killed something, and go
    looking for it. I try Shift-⌘-T to bring back most recently closed tab, realize I killed that an hour ago, and
    sit there blank-faced and worried.</p>
                <h2 id="p-7">New window huh?</h2>
                <p>When I’m in Discord or my Mail client or somewhere and I click on a link, sometimes it puts up a new Safari window. Huh? But
    usually not, I can’t spot the pattern.  When I kill the new window, sometimes I lose all my tabs. Sigh.</p>
                <h2 id="p-8">Passive-aggressive refresh</h2>
                <p>When I have some tab that’s been around and unvisited for a while, sometimes there’s this tasteful decoration across the top.</p>
                <img src="https://www.tbray.org/ongoing/When/202x/2025/02/26/warning.png" alt="Passive-aggressive Safari warning"/>
                <p>I think that this used to say “significant memory” rather than “significant energy”? But really, Safari, try to imagine how
    little I care about your memory/energy problems, just do what you need to and keep it to yourself. And if you can’t, at least
    spruce up the typography and copy-editing.</p>
                <h2 id="p-9">Better back button</h2>
                <p>[This is partly a MacOS rather than Safari issue.] On my Android, I can click on something in Discord that takes me to
    the GitHub app, another click and I’m in
    the browser, then click on something there and be in the YouTube app, and so on and so on. And then I can use “Back” to retrace
    my steps from app to app. This is just incredibly convenient.</p>
                <p>Safari’s memory of “how did I get here” apparently lives in the same evanescent place my tab configuration does, and
    usually vanishes the instant I step outside the browser. Why
    shouldn’t the Back operation always at least try to do something useful?</p>
                <p>Hey Apple, it’s your operating system and your browser, why not
    catch up with Android in an area where you’re clearly behind?</p>
                <h2 id="p-11">I humbly suggest</h2>
                <p>… that Safari do these things:</p>
                <ol>
                    <li>
                        <p>Save my current-tabs setup every few seconds on something more robust than the current fabric 
      of spider webs and thistledown. Offer a “Restore Tabs” entry in the History menu that always works.</p>
                    </li>
                    <li>
                        <p>Don’t just exit on ⌘-Q. Chrome gets this right, offering an option where I have to hold that key combo down for a
      second or two.</p>
                    </li>
                    <li>
                        <p>When I try to kill a pinned tab, just ignore me or beep or put up a little message or something.</p>
                    </li>
                    <li>
                        <p>Never create a new Safari window unless I ask for it.</p>
                    </li>
                    <li>
                        <p>Kill the dumb “this webpage was refreshed…”</p>
                    </li>
                    <li>
                        <p>Offer a “back” affordance that always works, even across applications.</p>
                    </li>
                </ol>
                <h2 id="p-10">Other browsers?</h2>
                <p>I already use Firefox every day and I know about Opera, Vivaldi, Brave, Arc, etc., and I’ve tried them, and none ever stuck. Or the
    experience was feeling good
    when something emerged about the provider that was scammy or scary or just dumb. (And the recent rumblings out of
    Mozilla are not reassuring.)</p>
                <p>While it’d sure be nice for there to be
    a world-class unencumbered open-source browser from an organization I respect, I’m not holding my breath.
    So it’s Safari for me for now.</p>
                <p>And it seems to me that the things that bother me should be easy to fix. Please do.</p>
            </div>
        </content>
    </entry>
    <entry>
        <title>Posting and Fascism</title>
        <link href="https://www.tbray.org/ongoing/When/202x/2025/02/08/Posting-and-Fascism"/>
        <link rel="replies" thr:count="0" type="application/xhtml+xml" href="/ongoing/When/202x/2025/02/08/Posting-and-Fascism#comments"/>
        <id>https://www.tbray.org/ongoing/When/202x/2025/02/08/Posting-and-Fascism</id>
        <published>2025-02-08T12:00:00-08:00</published>
        <updated>2025-02-18T17:42:10-08:00</updated>
        <category scheme="https://www.tbray.org/ongoing/What/" term="The World/Politics"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="The World"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Politics"/>
        <summary type="xhtml">
            <div xmlns="http://www.w3.org/1999/xhtml">Recently, Janus Rose’s     <a href="https://www.404media.co/you-cant-post-your-way-out-of-fascism/?ref=weekly-roundup-newsletter">You Can’t Post Your Way     Out of Fascism</a> crossed my radar on a hundred channels. It’s a smart piece that says smart things. But     I ended up mostly disagreeing. I’m not saying you can post your way out of Fascism, but I do think it’s gonna be hard     to build the opposition without a lot of posting. The <em>what</em> and especially the <em>where</em>     matter. But the “posting is useless” stance is dangerously reductive</div>
        </summary>
        <content type="xhtml">
            <div xmlns="http://www.w3.org/1999/xhtml">
                <p>
                    Recently, Janus Rose’s
                    <a href="https://www.404media.co/you-cant-post-your-way-out-of-fascism/?ref=weekly-roundup-newsletter">You Can’t Post Your Way
    Out of Fascism</a>
                    crossed my radar on a hundred channels. It’s a smart piece that says smart things. But
    I ended up mostly disagreeing. I’m not saying you can post your way out of Fascism, but I do think it’s gonna be hard
    to build the opposition without a lot of posting. The
                    <em>what</em>
                    and especially the
                    <em>where</em>
                    matter. But the “posting is useless” stance is dangerously reductive.
                </p>
                <p>Before I get into my gripes with Ms Rose’s piece, let me highlight the good part: Use your browser’s search-in-page to scroll
    forward to “defend migrants”. Here begins a really smart and inspirational narrative of things people are doing to deflect and
    defeat the enemy.</p>
                <p>
                    But it ends with the observation that all the useful progressive action “arose from existing networks of neighbors
    and community organizers”.
    Here’s where I part ways. Sure, local action is the most accessible and in most cases the only action, but right now
    Fascism is a
                    <em>global</em>
                    problem and these fighters here need to network with those there, for values of “here” and
    “there” that are not local.
                </p>
                <p>Which is gonna involve a certain amount of posting: Analyses, critiques, calls to action, date-setting, message-sharpening;
    it’s just not sensible to rely on networks of neighbors to accomplish this.</p>
                <h2 id="p-1">What to post about?</h2>
                <p>
                    Message sharpening feels like the top of the list. Last month I posted
                    <a href="/ongoing/When/202x/2025/01/22/In-The-Minority">In The Minority</a>
                    , making the (obvious I think) point that
    current progressive messaging isn’t working very well; we keep losing elections!  What needs to be changed? I don’t know and I don’t
    believe anybody who says they do.
                </p>
                <p>It’s not as simple as “be more progressive” or conversely “be more centrist”. I personally think the way to arrive at
    the right messaging strategies and wording is going to involve a lot of trial balloons and yes, local efforts. Since I
    unironically think that progressive policies will produce results that a majority of people will like, I also believe that there
    absolutely must be a way of explaining why and how that will move the needle and lead to victories.</p>
                <h2 id="p-2">Where to post it?</h2>
                <p>Short answer: Everywhere, almost.</p>
                <p>Granted that TV, whatever that means these days, is useless.  Anyone doing mass broadcasting is terrified of controversy and
    can’t afford to be seen as a progressive nexus.</p>
                <p>And Ms Rose is 100% right that Tiktok, Xitter, Facebook, Insta, or really any other centralized profit-driven corporate
    “social network” products are just not useful for progressives. 
    These are all ad-supported, and (at this historical moment) under heavy pressure from governments controlled by our
    enemies, and in some cases, themselves owned and operated by Fascists.</p>
                <p>
                    That leaves decentralized social media (the Fediverse and (
                    <a href="/ongoing/When/202x/2024/11/15/Not-Bluesky">for the moment</a>
                    ) Bluesky), Net-native operations like
                    <cite>404</cite>
                    /
                    <cite>Vice</cite>
                    /
                    <cite>Axios</cite>
                    /
                    <cite>Verge</cite>
                    (even though most of them are struggling),
    and mainstream “quality publications”: The
                    <cite>Atlantic</cite>
                    , the
                    <cite>Guardian</cite>
                    , and your local progressive press
    (nearest to me here in Canada,
                    <a href="https://thetyee.ca">The Tyee</a>
                    ).
                </p>
                <p>Don’t forget blogs. They can still move the needle.</p>
                <p>And, I guess, as Ms Rose says, highly focused local conversations on Discord, WhatsApp, and Signal. (Are
    there other tech options for this kind of thing?)</p>
                <h2 id="p-3">Are you angry?</h2>
                <p>
                    I am. And here I part paths with Ms Rose, who is vehement that we should see online anger as an anti-pattern. Me, I’m kinda
    with Joe Strummer,
                    <a href="https://genius.com/The-clash-clampdown-lyrics">anger can be power</a>
                    . Rose writes “researchers have found that the
    viral outrage disseminated on social media in response to these ridiculous claims actually
                    <a href="https://par.nsf.gov/servlets/purl/10095997?ref=404media.co">reduces the effectiveness of
    collective action”</a>
                    . I followed that link and found the evidence unconvincing.
                </p>
                <p>Also, if there’s one thing I believe it’s that in the social-media context, being yourself, exposing the person behind the
    words, is central to getting anywhere. And if the enemy’s actions are filling me with anger, it would be 
    disingenuous and ineffective to edit that out of my public conversation.</p>
                <h2 id="p-4">Posting is a progressive tool</h2>
                <p>Not gonna say more about principles or theory, just offer samples.</p>
                <p><a href="https://www.fiftyfifty.one">50501</a> has done it all with hashtags and micro-posts. Let’s see how it works.</p>
                <p>
                    Here’s
                    <a href="https://www.semafor.com/article/02/12/2025/actually-the-resistance-is-working?utm_source=flipboard&amp;utm_content=user%2FSemafor">Semafor</a>
                    arguing that the Democrats’ litigation-centric resistance is working pretty well.
                </p>
                <p>
                    Heidi Li Feldman, in
                    <a href="https://heidi-says.ghost.io/fear-and-loathing-plus-what-blue-states-should-be-doing-now/">Fear and loathing plus what
    blue states should be doing now</a>
                    argues on her blog for resistance at the state-government
    level, disengaging from and pushing back against toxic Musk/Trump projects.
                </p>
                <p>
                    Here’s Josh Marshall at
                    <cite>Talking Points Memo</cite>
                    <a href="https://talkingpointsmemo.com/edblog/democrats-are-surrounded-by-low-hanging-fruit-get-to-it">calling for pure
    oppositionism</a>
                    and then
    arguing that Democrats
                    <a href="https://talkingpointsmemo.com/edblog/wheres-the-real-power-nexus-how-does-the-opposition-get-to-it#more-1511743">should
    go to the mattresses</a>
                    on keeping the government open and raising the debt limit.
                </p>
                <p>
                    Here’s the let’s-both-sides-Fascism
                    <cite>New York Times</cite>
                    <a href="https://www.nytimes.com/interactive/2025/02/13/us/doc-annotation-memo-from-bove.html?unlocked_article_code=1.w04.KqQF._HNGZICTO3SH&amp;smid=url-share">absolutely savaging</a>
                    the GOP campaign to keep Mayor Adams in place as a MAGA puppet.
                </p>
                <p>
                    Here’s yours truly posting about
                    <a href="/ongoing/When/202x/2025/01/22/In-The-Minority#p-4">who progressives should talk to</a>
                    .
                </p>
                <p>
                    Here’s Mark Cuban on Bluesky saying
                    <a href="https://bsky.app/profile/mcuban.bsky.social/post/3lgek5exkes2p">hardass political podcasts</a>
                    are the only way to
    reach young men.
                </p>
                <p>
                    Here’s Elizabeth Kolbert in
                    <cite>The New Yorker</cite>
                    <a href="https://www.newyorker.com/magazine/2025/01/20/outraged-kurt-gray-book-review">making very specific suggestions</a>
                    as
    to the tone and content of progressive messaging.
                </p>
                <p>
                    Here’s Cory Doctorow on many channels as usual, on
                    <a href="https://pluralistic.net/2025/01/15/beauty-eh/#its-the-only-war-the-yankees-lost-except-for-vietnam-and-also-the-alamo-and-the-bay-of-ham">how
    Canada should push back against the Trump tariffs</a>
                    .
                </p>
                <p>There’s lots more strong stuff out there. Who’s right?</p>
                <p>I don’t know. Not convinced anyone does.</p>
                <p>Let’s keep posting about it till we get it right.</p>
            </div>
        </content>
    </entry>
    <entry>
        <title>December 24th Lasagna</title>
        <link href="https://www.tbray.org/ongoing/When/202x/2025/01/02/Lasagna"/>
        <link rel="replies" thr:count="1" type="application/xhtml+xml" href="/ongoing/When/202x/2025/01/02/Lasagna#comments"/>
        <id>https://www.tbray.org/ongoing/When/202x/2025/01/02/Lasagna</id>
        <published>2025-01-02T12:00:00-08:00</published>
        <updated>2025-02-06T14:31:26-08:00</updated>
        <category scheme="https://www.tbray.org/ongoing/What/" term="The World/Food and Drink"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="The World"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Food and Drink"/>
        <summary type="xhtml">
            <div xmlns="http://www.w3.org/1999/xhtml">We had thirteen people at my Mom’s house this last Christmas. One of our traditions is a heroic Lasagna for Christmas Eve,     a specialty of a family member. This year we asked them for the recipe and they agreed, but would rather remain uncredited.     It’s called “Very Rich Red Sauce and four-Cheese Lasagna”</div>
        </summary>
        <content type="xhtml">
            <div xmlns="http://www.w3.org/1999/xhtml">
                <p>We had thirteen people at my Mom’s house this last Christmas. One of our traditions is a heroic Lasagna for Christmas Eve,
    a specialty of a family member. This year we asked them for the recipe and they agreed, but would rather remain uncredited.
    It’s called “Very Rich Red Sauce and four-Cheese Lasagna”.</p>
                <p>I sort of enjoy cooking but would never have the courage to take on a project like this. I can testify that the results are
    wonderful.</p>
                <h2 id="p-1">Sauce</h2>
                <p>Key sauce ingredients are red wine &amp; sun-dried tomatoes; lasagna is all about mozza, the provolone adds a certain extra
    something. Over to the chef:</p>
                <h2 id="p-2">Ingredients</h2>
                <p>Sauce:</p>
                <ul>
                    <li>
                        <p>butter - half a lb block or less</p>
                    </li>
                    <li>
                        <p>olive oil to sauté</p>
                    </li>
                    <li>
                        <p>carrots - 2 to 4 depending on size, make sure they are fresh!</p>
                    </li>
                    <li>
                        <p>celery - 5-6 spears, say ⅔ of a bunch</p>
                    </li>
                    <li>
                        <p>onions (ideally yellow, but whatevs) - 3-6 depending on size.</p>
                        <p>(by volume, you are looking to get roughly 3:2:1 proportions when chopped of onions:celery:carrots)</p>
                    </li>
                    <li>
                        <p>a red sweet pepper</p>
                    </li>
                    <li>
                        <p>extra lean hamburger - 1 kg</p>
                    </li>
                    <li>
                        <p>3 cloves</p>
                    </li>
                    <li>
                        <p>salt - half a tablespoon? more? (tomato sauces tend to need a little more salt than other applications)</p>
                    </li>
                    <li>
                        <p>black pepper - if not using cayenne, a LOT, perhaps a tablespoon of freshly ground</p>
                    </li>
                    <li>
                        <p>cayenne - if using, to taste, I find strength is highly variable so hard to say how much, perhaps a couple of
      teaspoons?</p>
                    </li>
                    <li>
                        <p>Two big cans of diced tomatoes (NOT AYLMER! yuck, Unico is acceptable, Italian imported best)</p>
                    </li>
                    <li>
                        <p>3 small cans or one big can of tomato paste (or tubes, if you get them from an Italian grocery store, which are a
      rather superior product) It is hard to use too much tomato paste</p>
                        <p>(pro tip for cans of tomato paste: use the can opener to open BOTH the top and bottom of the can, then the paste slides out
      neatly and you don’t have to fool around trying to spatula the paste out of the can!)</p>
                    </li>
                    <li>
                        <p>about a half bottle of cheap red wine (the grocery store sells cheap cooking wine in demi bottles, though red can be hard
      to find, one demi bottle is more than enough)</p>
                    </li>
                    <li>
                        <p>most of a garlic bulb, say three quarters, once again FINELY chopped (no not pressed or processed!)</p>
                    </li>
                    <li>
                        <p>a LOT of dried oregano, say 3-4 tablespoons plus</p>
                    </li>
                    <li>
                        <p>a fair amount of dried basil, say 2 tablespoons plus</p>
                    </li>
                    <li>
                        <p>some died thyme, say a half tablespoon plus</p>
                        <p>(herbs are tough to give measurements for, as they vary enormously in potency with brand, age &amp; storage)</p>
                    </li>
                    <li>
                        <p>about a tablespoon of powdered beef stock</p>
                    </li>
                    <li>
                        <p>about 1½ to 2 cups of finely chopped sun-dried tomatoes NO SUBSTITUTIONS!!!!!</p>
                    </li>
                </ul>
                <p>Lasagna</p>
                <ul>
                    <li>
                        <p>1 disposable foil pan</p>
                    </li>
                    <li>
                        <p>foil to cover</p>
                    </li>
                    <li>
                        <p>butter to grease pan</p>
                    </li>
                    <li>
                        <p>melted butter to cover top lightly</p>
                    </li>
                    <li>
                        <p>1¼ margarine tins of sauce above</p>
                    </li>
                    <li>
                        <p>1½ boxes of lasagna noodles (NOT the “instant” or pre-cooked kind)</p>
                    </li>
                    <li>
                        <p>salted water to boil noodles</p>
                    </li>
                    <li>
                        <p>1 big block of mozzarella cheese, coarsely grated</p>
                    </li>
                    <li>
                        <p>2 packages (12-16 slices) of provolone cheese</p>
                    </li>
                    <li>
                        <p>1 tin of ricotta cheese</p>
                    </li>
                    <li>
                        <p>grated parmesan cheese</p>
                    </li>
                    <li>
                        <p>little bit of freshly ground black pepper</p>
                    </li>
                </ul>
                <h2 id="p-4">Procedure: Sauce</h2>
                <p>
                    For the
                    <a href="https://en.wikipedia.org/wiki/Mirepoix">mirepoix</a>
                    , the vegetables all need to be FINELY chopped up for sauce
    consistency. And I mean FINELY chopped-- I have 
    tried both powered and manual food processors, and they do 
    not do a good job, either reducing things to mush, or leaving big chunks-- the idea here is to get everything about the same
    size (and the garlic later), it gives the sauce some consistency.
                </p>
                <p>This is tedious and takes a long time.</p>
                <p>To give you an idea, a celery spear can be cut into 5-7 strips longwise with the grain, and then the strips chopped as finely
    as possible across the grain. A big carrot can yield say 6 long flat pieces that can be cut longways into strips, and then the
    strips cuts finely against the grain to produce little cubes.</p>
                <p>The mirepoix is important, we need to get the natural sugars to balance out the acidity of the tomatoes and wine. I cook the
    onions separately from the rest…</p>
                <p>Caramelize the onions. Frankly, this is a pain in the ass. There are no shortcuts; the internet has all these handy tips like
    using a pressure cooker at first or a slow cooker or adding baking soda or water or whatnot, I’ve tried them, and just no. So a
    big non-stick frying pan, and sloooow saute with a little butter and salt, frequent stirring, a lot of patience, at LEAST 40
    minutes. Maybe an hour. And constant attention, the bastards will burn on you at the drop of a hat. There is no hiding it, this
    is tricky and somewhat difficult. But worth it, caramelized onions are magic.</p>
                <p>Meanwhile, in as big a heavy bottom pot as you can find, saute the celery and carrots (and peppers if you are using them)
    with say 3 dried cloves, in a little butter, you want to shrink them down and bring out the carrots’ natural sugars, and soften
    the cloves &amp; bring out their flavour, this takes a while, say 20 minutes or more?</p>
                <p>Remove the onions and carrots and celery to a BIG bowl, clean out the big heavy bottom pot and brown the hamburger, about
    1kg. DO NOT USE “regular” as it is mostly fat; lately I have been using the “extra lean” because even the lean is quite fatty
    these days. A little olive oil in the pot, a fair amount of salt (half
    tablespoon?) &amp; a lot of freshly ground black pepper (approaching a tablespoon?) on the meat and lots of stirring.</p>
                <p>
                    This where
    a lot of people screw up, essentially they “grey” the meat, they don’t BROWN it, ie achieve the
                    <a href="https://en.wikipedia.org/wiki/Maillard_reaction">Maillard reaction</a>
                    -- as with the
    mirepoix, we are trying to bring out natural sugars. A lot of stirring/scraping, to break the hamburger up into as small pieces
    as possible, ie the same size as the veggies in the mirepoix.
                </p>
                <p>While this is happening, add the rest of the ingredients to the mirepoix in the big bowl: tomatoes, tomato paste (more is
    better), wine.</p>
                <p>Also the chopped garlic, oregano, basil, thyme, about a tablespoon of powdered beef stock (yes this is cheating, shhh).</p>
                <p>A word about sun-dried tomatoes: they are absolutely wonderful things, but hard to find. Ideally, you want the dried kind,
    not the “in oil” kind, but you may have to settle for that. There are two different kinds of “in oil”, the ones in jars floating
    in oil like pickles in brine (they are prepped for salads, not sauces, so they are floating oil, and disintegrate once they are
    in a sauce), which you really do not want, and the ones in packages that have been oiled for preservation. This is usually what
    you have to settle for. The best ones are dry and quite hard.They are hard to find.</p>
                <p>Of these, the worst sun-dried tomatoes are the North American product, the big food companies noted there was a demand for
    them, and started tossing field tomatoes into drying kilns. These are quite inferior, but useable if it’s all you can find. The
    best ones are Turkish, followed by Italian, you can usually find in Italian delicatessens or grocery stores (even the Italians
    agree the Turkish ones are best).</p>
                <p>
                    <i>[Tim says: I found them in Vancouver and the chef is right, the flavor is to die for.]</i>
                </p>
                <p>If you get the fully dried/no oil kind, you can simmer them a little in a little water to soften them before you try chopping
    them up; the water (or some of it anyway) should be added to the sauce…</p>
                <p>Drain any fat from the browned meat, add the mix to the meat in the big pot. Stir it all up some more, get it well mixed. You
    can add a little wine and/or tomato juice if it seems too thick, but be aware that it will liquify a little during cooking. If
    you are going to use it as a pasta sauce, you want it more liquid, if for lasagna, you want it as thick as practical. In any
    case, it is very difficult to judge the final thickness at this point.</p>
                <p>You can add a little (sun-dried tomato?) water, or tomato juice, or wine, if it needs it, but be cautious.</p>
                <p>Put on medium to low heat and stir frequently until it comes to a high simmer/low boil (don’t let it burn!) then turn the
    heat down to minimum, and slow-cook for at least 4 hours, stirring every 20 minutes or so. Cooking it longer is a Good Thing, I
    often cook it for 7 or more hours.</p>
                <p>LEAVE it out overnight! (this is important!)</p>
                <p>Warm it up the next day, bringing it back to a high simmer/low boil and stirring a lot, serve it on pasta. Or make
    lasagna. Or freeze it. One margarine tin makes a meal with leftovers (each serving would be small, because the stuff is quite
    strong). One margarine tin (plus a little, ideally) makes for one lasagna. You should get about 3 or so margarine tins from the
    above. It freezes just fine.</p>
                <p>Whew.</p>
                <h2 id="p-5">Lasagna</h2>
                <p>In theory, one box of lasagna noodles is just enough to make one pan of lasagna. However, there are almost always a lot of
    broken pieces of lasagna in a box, and pieces that break or get stuck or something during cooking. I allow for 1 and half a box
    per lasagna pan.</p>
                <p>Ingredients:</p>
                <ul>
                    <li>
                        <p>enough lasagna noodles, cooked al dente in salted boiling water</p>
                    </li>
                    <li>
                        <p>1¼ margarine tins of sauce, gently heated up</p>
                    </li>
                    <li>
                        <p>Butter (better than margarine but you can use that if necessary)</p>
                    </li>
                    <li>
                        <p>1 big block of mozzarella (the regular supermarket kind is fine, I tried the expensive high quality italian
      stuff, and it was a LITTLE bit better, but not enough to justify the cost)</p>
                    </li>
                    <li>
                        <p>1 tin of ricotta cheese, or failing that, dry curd cottage cheese</p>
                    </li>
                    <li>
                        <p>12-16 slices of provolone cheese (usually 2 packages)</p>
                    </li>
                    <li>
                        <p>parmesan cheese (like with the mozza, I find the cheap Kraft product fully acceptable for this purpose)</p>
                    </li>
                    <li>
                        <p>freshly ground black pepper</p>
                    </li>
                    <li>
                        <p>foil lasagna pan</p>
                    </li>
                    <li>
                        <p>heavy duty foil</p>
                    </li>
                </ul>
                <p>Grease the pan with butter. do a thorough job, you don’t want huge amounts of butter, but you do not want any bit of foil
      that might come in contact with lasagna ungreased.</p>
                <p>Coarsely grate the mozzarella.</p>
                <p>Lay an overlapping layer of lasagna noodles crossways in the pan, with the sides going up the sides of the pan. The pieces
      at either end need to overlap the piece on the bottom, but bend up to cover the short end of the pan as well. This is a pain
      in the ass to get right.</p>
                <p>The sauce goes a long way, you do NOT want a thick layer. Spread a thin layer over the bottom of the pan, about a third of
      the sauce. Put a layer of mozza on top, about a third of it. Put half the provolone on top. Put a layer of lasagna noodles down
      long-ways , overlapping a bit.</p>
                <p>Spread a thin layer of sauce, another third, covered with mozza, another third, and cover that with the ricotta (or dry-curd
      cottage). Put down another layer of lasagna long-ways.</p>
                <p>The rest of the sauce, the rest of the mozza, and the rest of the provolone.</p>
                <p>Cover the cross-wise lasagna noodles, overlapping, and trying to tuck the ends in to seal the package. This is
      tricky at the ends, I find putting a small cut in the lasagna noodle at the corner makes it easier to fold over
      neatly. (Usually I am tired by this point and less inclined to be finicky and careful, which is a pity.)</p>
                <p>Pour a little melted butter over the top, enough to grease the surface. Sprinkle some freshly ground pepper and a fair
      amount of parmesan over the top. Cover with foil. Put in fridge (you can pre-make hours before use if you are having a party
      or something) or immediately put in pre-heated oven.</p>
                <p>Preheat oven to pretty hot, 375-400. Cook lasagna for 45 minutes to an hour. Remove foil from pan 10-15 minutes before you
      remove it from the oven. Put the foil back on and let it stand for AT LEAST 15 minutes, better if you can hold off for half an
      hour (the hotter it is, the more likely it is do disintegrate when being served, you want the melted cheese to start to re-set
      a little)</p>
                <p>Serve with garlic bread and salad and an impertinent red wine. One pan goes a fairly long way, serves 6-8ish? Depends how
      many hungry teens you have around…</p>
            </div>
        </content>
    </entry>
    <entry>
        <title>Photo Philosophizing</title>
        <link href="https://www.tbray.org/ongoing/When/202x/2025/02/04/Two-Photos-of-Snow"/>
        <link rel="replies" thr:count="3" type="application/xhtml+xml" href="/ongoing/When/202x/2025/02/04/Two-Photos-of-Snow#comments"/>
        <id>https://www.tbray.org/ongoing/When/202x/2025/02/04/Two-Photos-of-Snow</id>
        <published>2025-02-04T12:00:00-08:00</published>
        <updated>2025-02-04T22:30:50-08:00</updated>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Arts/Photos"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Arts"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Photos"/>
        <summary type="xhtml">
            <div xmlns="http://www.w3.org/1999/xhtml">What happened was, I went to Saskatchewan to keep my mother company, and got a little obsessed about photo composition and     complexity. Which in these troubled times is a relief</div>
        </summary>
        <content type="xhtml">
            <div xmlns="http://www.w3.org/1999/xhtml">
                <p>What happened was, I went to Saskatchewan to keep my mother company, and got a little obsessed about photo composition and
    complexity. Which in these troubled times is a relief.</p>
                <p>This got started just after take-off from Vancouver. As the plane climbed over the city I thought “That’s a nice
    angle” and pointed the Pixel through the plexiglass.</p>
                <img src="https://www.tbray.org/ongoing/When/202x/2025/02/04/PXL_20250114_163303579.png" alt="Vancouver from the air, looking north"/>
                <div class="caption">
                    <p>You might want to enlarge this one.</p>
                </div>
                <p>A couple of days into my Prairie visit I got around to processing the photos and thought that Vancouver aerial had come out
    well. No credit to the photographer here, got lucky on the opportunity,  but holy crap modern mobile-device camera tech is
    getting good these days. I’ll take a little credit for the Lightrooming; this has had heavy dehazing and other
    prettifications applied.</p>
                <p>A couple of days later I woke up and the thermometer said -36°C (in Fahrenheit that’s “too freaking cold”).  The air was
    still and the hazy sunlight was weird. “There has to be a good photo in this somewhere, maybe to contrast that Vancouver shot” I
    thought. So I tucked the Fujifilm inside 
    my parka (it claims to be only rated to -10°) and went for a walk.
    Mom politely declined my invitation to come along without, to her credit, getting that “Is he crazy?” expression on her face.</p>
                <p>Her neighborhood isn’t that photogenic but there’s a Pitch-n-putt golf course a block away so I trudged through that. The
    snow made freaky squeaking sounds underfoot. At that temperature, it feels like you have to push the air aside with each
    step. Also, you realize that your lungs did not evolve to process that particular atmospheric condition.</p>
                <p>Twenty minutes in I had seen nothing that made me want to pull out the camera, and was thinking it was about time to head home.
    So I stopped in a place where there was a bit of shape and shadow, and decided that if I had to force a
    photo opportunity to occur by pure force of will, so be it.</p>
                <img src="https://www.tbray.org/ongoing/When/202x/2025/02/04/TXT55358.png" alt="Snow shapes and shadows"/>
                <p>It ain’t a great city framed by coastal mountains. But it ain’t nothing either. I had to take my gloves off to shoot, and
    after just a couple of minutes of twisting around looking for angles, my fingers were screaming at me.</p>
                <p>The two pictures are at the opposite end of the density-vs-minimalism spectrum but they share, um, snow, so that’s
    something.</p>
                <p>Anyhow, here’s the real reason I was there.</p>
                <img src="https://www.tbray.org/ongoing/When/202x/2025/02/04/PXL_20250121_180700202.png" alt="Jean Bray"/>
                <div class="caption">
                    <p>Jean Bray, who’ll be turning 95 this year.</p>
                </div>
                <p>I find photography to be a very useful distraction from what’s happening to the world.</p>
            </div>
        </content>
    </entry>
    <entry>
        <title>In The Minority</title>
        <link href="https://www.tbray.org/ongoing/When/202x/2025/01/22/In-The-Minority"/>
        <link rel="replies" thr:count="8" type="application/xhtml+xml" href="/ongoing/When/202x/2025/01/22/In-The-Minority#comments"/>
        <id>https://www.tbray.org/ongoing/When/202x/2025/01/22/In-The-Minority</id>
        <published>2025-01-22T12:00:00-08:00</published>
        <updated>2025-01-26T13:06:26-08:00</updated>
        <category scheme="https://www.tbray.org/ongoing/What/" term="The World/Politics"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="The World"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Politics"/>
        <summary type="xhtml">
            <div xmlns="http://www.w3.org/1999/xhtml">That’s us. I assume you’re among those horrified at the direction of politics and culture in recent years and     especially recent weeks, in the world at large and especially in America. We are a minority. We shouldn’t try to deny     it, we should be adults and figure out how to deal with it</div>
        </summary>
        <content type="xhtml">
            <div xmlns="http://www.w3.org/1999/xhtml">
                <p>That’s us. I assume you’re among those horrified at the direction of politics and culture in recent years and
    especially recent weeks, in the world at large and especially in America. We are a minority. We shouldn’t try to deny
    it, we should be adults and figure out how to deal with it.</p>
                <h2 id="p-1">Denialists</h2>
                <p>
                    I’m out of patience with people who put the blame on the pollsters or the media or Big Tech, or really any third party.
    People generally heard what Mr Trump was offering
                    <span class="dashes"> —</span>
                    portrayed pretty accurately
    I thought
                    <span class="dashes"> —</span>
                    and enough of them liked it to elect him.
    Those who didn’t are in a minority. Quit dodging and deal.
                </p>
                <p>
                    Clearly, we the minority have failed in explaining our views. Many years ago I wrote an essay called
                    <a href="/ongoing/When/200x/2004/01/13/LawOfConversation">Two Laws of
    Explanation</a>
                    . One law says that if you’re explaining something and the person you’re explaining to doesn’t get it, that’s
    not their problem, it’s your problem. I still believe this, absolutely.
                </p>
                <p>So let’s try to figure out better explanations.</p>
                <p>But first, a side trip into economic perception and reality.</p>
                <h2 id="p-2">Economists</h2>
                <p>
                    A strong faction of progressives and macroeconomists are baffled by people being disaffected when the economy, they say, is
    great. Paul Krugman
                    <a href="https://paulkrugman.substack.com/p/this-economy-is-too-good-for-donald">beats this drum all the time</a>
                    . Unemployment
    and inflation are low! Everything’s peachy! Subtext: If the population disagrees, they are fools.
                </p>
                <p>
                    I call bullshit. The evidence of homelessness is in my face wherever I go, even if there are Lamborghinis cruising past the
    sidewalk tents.
                    <a href="https://foodbankscanada.ca/hungercount/">Food banks are growing</a>
                    . I give a chunk of money every year to
                    <a href="https://vansunkidsfund.ca/schools/2023-adopt-a-school/">Adopt a School</a>
                    , which puts free cafeterias in Vancouver
    schools where kids are coming to school hungry. Kingston, a mid-sized mid-Canadian city, just
                    <a href="https://www.cbc.ca/news/canada/ottawa/kingston-ontario-declares-food-insecurity-emergency-1.7436000">declared an
    emergency</a>
                    because one household in three is suffering from food insecurity.
                </p>
                <p>Even among those who are making it, for many it’s just barely:</p>
                <blockquote>
                    <p>… half of Canadians (50%, +8) are now $200 or less away each month from not being able to pay their bills and debt
    payments. This is a result of significantly more Canadians saying they are already insolvent (35%, +9) compared to last
    quarter. Canadians who disproportionately report being $200 or less away from insolvency continue to be women (55%, +4) but the
    proportion of men at risk has increased to 44%, up 13 points from last quarter.</p>
                    <p>
                        Source:
                        <a href="https://www.ipsos.com/en-ca/mnp-consumer-debt-index-plunges-79-points-down-10-trump-election-causes-financial-anxiety">MNP
    Consumer Debt Index</a>
                        . The numbers like “+8” give the change since last quarter.
                    </p>
                </blockquote>
                <p>(Yes, this data is Canadian, because I am. But I can’t imagine that America is statistically any
    better.)</p>
                <h2 id="p-3">Majorities</h2>
                <p>Minorities need to study majorities closely. So let me sort them, the ones who gave Trump the election I mean, into
    baskets:</p>
                <ol>
                    <li>
                        <p>Stone racists who hate immigrants, especially brown ones.</p>
                    </li>
                    <li>
                        <p>Culture warriors who hate gays and trans people and so on.</p>
                    </li>
                    <li>
                        <p>Class warriors; the conventional billionaire-led Republican faction who are rich, voting for anyone they think offers
      lower taxes and less regulation.</p>
                    </li>
                    <li>
                        <p>People who don’t pay much attention to the news but remember that gas was cheaper when Trump was in office.</p>
                    </li>
                    <li>
                        <p>Oh wait, I forgot one: People who heard Trump say what boiled down to “The people who are running things
      don’t care about you and are corrupt!” This worked pretty well because far too many don’t and are.
      A whole lot of the people who heard this are financially stressed (see above).</p>
                    </li>
                </ol>
                <h2 id="p-4">Who to talk to?</h2>
                <p>
                    Frankly, I wouldn’t bother trying to reach out to either of the first two groups. Empirically, some people are 
    garbage. You can argue that it’s not their fault; maybe they had a shitty upbringing or just fell into the wrong
    fellowships. Maybe. But you can be sure that that’s not
                    <em>your</em>
                    fault. The best practice is some combination of ignoring
    them and defending against their attacks, politics vs politics and force versus force.
                </p>
                <p>I think talking to the 1% is worthwhile. The fascist leaders are rich, but not all of the rich are
    fascist. Some retain much of their humanity. And presumably some are smart enough to hear an argument that
    on this economic path lie tumbrils and guillotines.</p>
                <p>That leaves the people who mostly ignore the news and the ones who have just had it with the deal they’re getting from
    late-Capitalist society. I’m pretty sure that’s who we should be talking to, mostly.</p>
                <h2 id="p-7">What to say?</h2>
                <p>I’m not going to claim I know.  I hear lots of suggestions…</p>
                <p>
                    In the
                    <cite>New Yorker</cite>
                    , Elizabeth Kolbert’s
                    <a href="https://www.newyorker.com/magazine/2025/01/20/outraged-kurt-gray-book-review">Does One Emotion Rule All Our Ethical
    Judgments?</a>
                    makes two points. First, fear generally trumps all other emotions. So, try phrasing your arguments in terms of the
    threats that fascism poses directly to the listener, rather than abstract benefits to be enjoyed by everyone in a progressive world.
                </p>
                <p>Second, she points out the awesome power of anecdote: MAGA made this terrible thing happen to this actual person,
    identified by name and neighborhood.</p>
                <p>
                    On Bluesky,
                    <a href="https://bsky.app/profile/mcuban.bsky.social/post/3lgek5exkes2p">Mark Cuban says</a>
                    we need offensive hardass
    progressive political podcasts, and offers a sort of horrifying example that might work.
                </p>
                <p>
                    On Bloomberg (paywalled) they say that the ruling class should be terrified of a
                    <a href="https://www.bls.gov/osmr/research-papers/2021/pdf/ec210020.pdf">K-shaped recovery</a>
                    ; by inference, progressives
    should be using that as an attack vector.
                </p>
                <p>
                    Josh Marshall has been arguing for weeks that since the enemies won the election, they have the power and have to own the
    results. Progressives don’t need to sweat alternative policies, they just have to highlight the downsides of encroaching fascism
    (there are plenty) and say “What we are for is NOT THAT!” and just keep saying it.
                    <a href="https://talkingpointsmemo.com/edblog/democrats-are-surrounded-by-low-hanging-fruit-get-to-it">Here’s an
    example.</a>
                </p>
                <p>Maybe one of these lines of attack is right. I think they’re all worth trying. And I’m pretty sure I know one ingredient
    that’s going to have to be part of any successful line of attack…</p>
                <h2 id="p-6">Be blunt</h2>
                <p>
                    Looking back at last year’s Presidential campaign, there’s a thing that strikes me as a huge example of What Not To Do. I’m
    talking about Harris campaign slogan: “Opportunity Economy”. This is marketing-speak. If there’s one thing we should have
    learned it’s that the population as a whole
                    <span class="dashes"> —</span>
                    rich, poor, Black, white, queer, straight, any old
    gender
                    <span class="dashes"> —</span>
                    <em>has</em>
                    learned to see through this kind of happy talk.
                </p>
                <p>
                    Basically, in Modern Capitalism, whenever, and I mean whenever
                    <em>without exception</em>
                    , whenever someone offers you an
    “opportunity”, they’re trying to take advantage of you. This is appallingly tone-deaf, and apparently nobody inside that campaign
    asked themselves the simple question “Would I actually use this language in talking to someone I care about?” Because they
    wouldn’t.
                </p>
                <p>Be blunt. Call theft theft. Call lies lies. Call violence violence. Call ignorance ignorance. Call stupidity stupidity.</p>
                <p>Also, talk about money a lot. Because billionaires are unpopular.</p>
                <img src="https://www.tbray.org/ongoing/When/202x/2025/01/22/billionaires.png" alt="Graph data from an AP poll"/>
                <div class="caption">
                    <p>
                        From a
                        <a href="https://apnews.com/article/doge-musk-trump-corruption-government-efficiency-16243280f446ea85ef50ff106c7e2841">good AP
    poll</a>
                        .
                    </p>
                </div>
                <p>Don’t say anything you wouldn’t say straight-up in straight-up conversation with a real person.
    Don’t let any marketing or PR professionals edit the messaging. This is the kind of
    messaging that social media is made for.</p>
                <p>Maybe I’m oversimplifying, but I don’t think so.</p>
            </div>
        </content>
    </entry>
    <entry>
        <title>Protocol Churn</title>
        <link href="https://www.tbray.org/ongoing/When/202x/2025/01/14/Protocol-Churn"/>
        <link rel="replies" thr:count="3" type="application/xhtml+xml" href="/ongoing/When/202x/2025/01/14/Protocol-Churn#comments"/>
        <id>https://www.tbray.org/ongoing/When/202x/2025/01/14/Protocol-Churn</id>
        <published>2025-01-14T12:00:00-08:00</published>
        <updated>2025-01-15T20:52:57-08:00</updated>
        <category scheme="https://www.tbray.org/ongoing/What/" term="The World/Social Media"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="The World"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Social Media"/>
        <summary type="xhtml">
            <div xmlns="http://www.w3.org/1999/xhtml">Bluesky and the Fediverse are our best online hopes for humane human conversation.     Things happened on 2025/01/13; I’ll hand the microphone to Anil Dash,     <a href="https://me.dm/@anildash/113822018649097081">whose post</a> starts “This is a monumental day for the future of the     social web.”</div>
        </summary>
        <content type="xhtml">
            <div xmlns="http://www.w3.org/1999/xhtml">
                <p>
                    Bluesky and the Fediverse are our best online hopes for humane human conversation.
    Things happened on 2025/01/13; I’ll hand the microphone to Anil Dash,
                    <a href="https://me.dm/@anildash/113822018649097081">whose post</a>
                    starts “This is a monumental day for the future of the
    social web.”
                </p>
                <img src="https://www.tbray.org/ongoing/When/202x/2025/01/14/Anil.png" alt="Anil Dash on 2025/01/13"/>
                <p>
                    What happened? Follow Anil’s links:
                    <a href="https://blog.joinmastodon.org/2025/01/the-people-should-own-the-town-square/">Mastodon</a>
                    and
                    <a href="https://freeourfeeds.com">Bluesky (under the “Free Our Feeds” banner</a>
                    ). Not in his sound-bite: Both groups are
    seeking donations, raising funds to meet those goals.
                </p>
                <img src="https://www.tbray.org/ongoing/When/202x/2025/01/14/Fediverse.png" alt="Fediverse fundraising program"/>
                <img src="https://www.tbray.org/ongoing/When/202x/2025/01/14/ATProto.png" alt="Bluesky/AT-Protocol fundraising program"/>
                <p>I’m sympathetic to both these efforts, but not equally.  I’m also cynical, mostly about the numbers: They’ve each
    announced a fundraising target, and both the targets are substantial, and I’m not going to share either, because they’re just
    numbers pulled out of the air, written on whiteboards, designed to sound impressive.</p>
                <h2 id="p-1">What is true</h2>
                <p>These initiatives, just by existing, are evidence in
    letters of fire 500 miles high, evidence of people noticing something important: 
    Corporately-owned town squares are irreversibly discredited. They haven’t worked in the past, they don’t work now, and they’ll
    never work.</p>
                <p>Something decentralized is the only way forward. Something not owned by anyone, defined by freely-available protocols.
    Something like 
    email. Or like the Fediverse, which runs on the ActivityPub protocol. Or, maybe Bluesky, where by “Bluesky” I mean independent
    service providers 
    federated via the AT Protocol, “ATProto” for short.</p>
                <h2 id="p-2">What is hard?</h2>
                <p>I’ll tell you what’s hard: Raising money for a good cause, when that good cause is full of abstractions about openness and
    the town square and so on. Which implies you’re not intending that the people providing the money will make money.
    So let’s wish both these efforts good luck. They’ll need it.</p>
                <h2 id="p-4">What matters</h2>
                <p>
                    Previously in
                    <a href="/ongoing/When/202x/2024/11/15/Not-Bluesky">Why Not Bluesky</a>
                    I argued that, when thinking about the future of conversational
    media, what matters isn’t the technology, or even so much the culture, but the money: Who pays for the service?
    On that basis, I’m happy about both these initiatives.
                </p>
                <p>But now I’m going to change course and talk about technology a bit.
    At the moment, the ATProto implementation that drives Bluesky is the only one in the world. If the company operating it failed
    in execution or ran out of money, the service would shut down.</p>
                <p>So, in practice, Bluesky’s not really decentralized at all.
    Thus, I’m glad that the “Free Our Feeds” effort is going to focus on
    funding an alternative ATProto implementation. In particular, they’re talking about offering an
    alternative ATProto “Relay”.</p>
                <p>
                    Before I go on, you’re going to need a basic understanding of what ATProto is and how its parts work.  Fortunately, as usual,
    Wikipedia has a
                    <a href="https://en.wikipedia.org/wiki/AT_Protocol">terse, accurate introduction</a>
                    . If you haven’t looked into ATProto yet,
    please hop over there and remedy that. I’ll wait.
                </p>
                <p>Now that you know the basics, you can understand why Free Our Feeds is focusing on the Relay. Because, assuming that Bluesky
    keeps growing, this is going to be a big, challenging piece of software to build, maintain, and operate, and the performance of
    the whole service depends on it.</p>
                <p>The Fediverse in general and Mastodon in particular generally don’t rely on a global firehose feed that knows everything
    that happens, like an eye in the sky. In fact, the ActivityPub protocol assumes a large number of full-stack peer implementations 
    that chatter with each other, in stark contrast to ATProto’s menagerie of Repos and PDSes and Relays and
    App Views and Lexicons.</p>
                <p>
                    The ATProto approach has advantages; since the Relay knows everything, you can be confident of seeing everything relevant.
    The Fediverse makes no such promise, and it’s well-known that in certain circumstances you can miss replies to your posts. And
    perhaps more important, miss replies to others’ posts, which opens the door to
                    <a href="/ongoing/When/202x/2024/07/30/Invisible-Attackers">invisible attackers</a>
                    .
                </p>
                <p>And this makes me nervous. Because why would anyone make the large engineering and financial investments that’d be required
    to build and operate an ATProto Relay?</p>
                <p>
                    ActivityPub servers may have their flaws, but in practice they are
                    <a href="https://hachyderm.io/@esk/113793277371908181">pretty cheap to operate</a>
                    . And it’s easy to think of lots of reasons
    why lots of organizations might want to run them:
                </p>
                <ol>
                    <li>
                        <p>A university, to provide a conversational platform for its students…</p>
                    </li>
                    <li>
                        <p>… or its faculty.</p>
                    </li>
                    <li>
                        <p>A Developer Relations team, to talk to geeks.</p>
                    </li>
                    <li>
                        <p>Organized religion, for evangelism, scholarship, and ministry.</p>
                    </li>
                    <li>
                        <p>Marketing and PR teams, to get the message out.</p>
                    </li>
                    <li>
                        <p>Government departments that provide services to the public.</p>
                    </li>
                </ol>
                <p>
                    Or consider my own instance,
                    <a href="https://cosocial.ca">CoSocial</a>
                    , the creation of Canadians who (a) are fans of the co-operative movement,
    (b) concerned about Canadians’ data staying in Canada, and (c) want to explore modes of funding conversational media that aren’t
    advertising or Patreon.
                </p>
                <p>Maybe, having built and run a Relay, the Free Our Feeds people will discover a rationale for why anyone else should do this.</p>
                <h2 id="p-5">So, anyhow…</h2>
                <p>I hope both efforts hit their fundraising targets. I hope both succeed at what they say they’re going to try.</p>
                <p>But for my own conversation with the world, I’m sticking with the Fediverse.</p>
                <p>Most of all, I’m happy that so many people, whatever they think of capitalism, have realized that it’s an
    unsuitable foundation for online human conversation. And most of all I hope that that number keeps growing.</p>
            </div>
        </content>
    </entry>
    <entry>
        <title>AI Noise Reduction</title>
        <link href="https://www.tbray.org/ongoing/When/202x/2025/01/10/Photo-Noise-Reduction"/>
        <link rel="replies" thr:count="7" type="application/xhtml+xml" href="/ongoing/When/202x/2025/01/10/Photo-Noise-Reduction#comments"/>
        <id>https://www.tbray.org/ongoing/When/202x/2025/01/10/Photo-Noise-Reduction</id>
        <published>2025-01-10T12:00:00-08:00</published>
        <updated>2025-01-10T21:01:24-08:00</updated>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Arts/Photos"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Arts"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Photos"/>
        <summary type="xhtml">
            <div xmlns="http://www.w3.org/1999/xhtml">What happened was, there was a pretty moon in the sky, so I got out a tripod and the     <a href="/ongoing/When/202x/2024/03/30/A057">big honkin’ Tamron 150-500</a> and fired away.     Here’s the shot I wanted to keep</div>
        </summary>
        <content type="xhtml">
            <div xmlns="http://www.w3.org/1999/xhtml">
                <p>
                    What happened was, there was a pretty moon in the sky, so I got out a tripod and the
                    <a href="/ongoing/When/202x/2024/03/30/A057">big honkin’ Tamron 150-500</a>
                    and fired away.
    Here’s the shot I wanted to keep.
                </p>
                <img src="https://www.tbray.org/ongoing/When/202x/2025/01/10/TXT55339.png" alt="Photograph of the moon, half-shadowed"/>
                <div class="caption">
                    <p> Sadly, the clouds had shifted<br/>and Luna had lost her pretty bronze shading.</p>
                </div>
                <p>I thought the camera and lens did OK given that I was shooting from sea level through soggy Pacific-Northwest winter air.
    But when I zoomed in there was what looked like pretty heavy static. So I applied Lightroom to the problem, twice.</p>
                <img src="https://www.tbray.org/ongoing/When/202x/2025/01/10/TXT55339-Enhanced-NR.png" alt="Photograph of the moon, half-shadowed, de-noised"/>
                <img src="https://www.tbray.org/ongoing/When/202x/2025/01/10/TXT55339-2.png" alt="Photograph of the moon, half-shadowed, de-noised"/>
                <p>I’ll be surprised if many of you can see a significant difference. (Go ahead and enlarge.)
    But you would if it were printed on a big piece of paper
    and hung on a wall. So we’ll look at the zoomed-in version. But first…</p>
                <h2 id="p-1">Noise reduction, old-school</h2>
                <p>Lightroom has had a Luminance-noise reduction tool for years. Once you wake it up, you can further refine with “Detail” and
    “Contrast” sliders, whose effects are subtle at best.  For the moon shot, I cranked the Luminance slider pretty all the way over
    and turned up Detail quite a bit too.</p>
                <h2 id="p-2">Noise reduction, with AI</h2>
                <p>In recent Lightroom versions there’s a “Denoise…” button. Yes, with an ellipsis and a note that says “Reduce noise with AI.”
    It’s slow; took 30 seconds or more to get where it was going.</p>
                <p>Anyhow, here are the close-up shots.</p>
                <img src="close-orig.png" alt="moon close-up, no noise reduction"/>
                <img src="close-by-hand.png" alt="moon close-up, noise reduction by Lightroom"/>
                <img src="close-ai.png" alt="moon close-up noise reduction with AI"/>
                <div class="caption">
                    <p>Original first, then noise-reduced<br/>in Lightroom by hand, then with AI.</p>
                </div>
                <h2 id="p-3">What do you think?</h2>
                <p>I have a not-terribly-strong preference for the by-hand version. I think both noise reductions add value to the photo.
    I wonder why the AI decided to enhance the very-slight
    violet cast? You can look at the rim of one crater or another and obsess about things that nobody just admiring the moon will
    ever see.</p>
                <p>It’s probably worth noting that the static in the original version isn’t “Luminance noise”, which is what you get when you’re
    pushing your sensor too hard to capture an image in low light. When you take pictures of the moon you quickly learn that it’s
    not a low-light scenario at all, the moon is a light-colored object in direct sunlight. These pix are taken at F7.1 at 1/4000
    second shutter. I think the static is just the Earth’s atmosphere getting in the way.  So I’m probably abusing Lightroom’s
    Luminance slider. Oh well.</p>
                <p>You could take this as an opportunity to sneer at AI, but that would be dumb. First, Lightroom’s AI-driven “select sky” and
    “select subject” tools work astonishingly well, most times. Second, Adobe’s been refining that noise-reduction code for decades
    and the AI isn’t even a year old yet.</p>
                <p>We’ll see how it goes.</p>
            </div>
        </content>
    </entry>
    <entry>
        <title>Bitcoin Lessons</title>
        <link href="https://www.tbray.org/ongoing/When/202x/2025/01/04/Bitcoin-capitalism"/>
        <link rel="replies" thr:count="5" type="application/xhtml+xml" href="/ongoing/When/202x/2025/01/04/Bitcoin-capitalism#comments"/>
        <id>https://www.tbray.org/ongoing/When/202x/2025/01/04/Bitcoin-capitalism</id>
        <published>2025-01-04T12:00:00-08:00</published>
        <updated>2025-01-09T16:55:53-08:00</updated>
        <category scheme="https://www.tbray.org/ongoing/What/" term="The World/Politics"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="The World"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Politics"/>
        <summary type="xhtml">
            <div xmlns="http://www.w3.org/1999/xhtml">Here we are, it’s 2025 and Bitcoin is surging. Around $100K last time I looked. While its creation spews megatons of     carbon into our atmosphere, investors line up to buy it in respectable ETFs, and long-term players like retirement pools and     university endowments are looking to get in.     Many of us are finding this extremely annoying.     But I look at Bitcoin and I think what I’m seeing is Modern Capitalism itself, writ large and in brutally sharp focus</div>
        </summary>
        <content type="xhtml">
            <div xmlns="http://www.w3.org/1999/xhtml">
                <p>Here we are, it’s 2025 and Bitcoin is surging. Around $100K last time I looked. While its creation spews megatons of
    carbon into our atmosphere, investors line up to buy it in respectable ETFs, and long-term players like retirement pools and
    university endowments are looking to get in.
    Many of us are finding this extremely annoying.
    But I look at Bitcoin and I think what I’m seeing is Modern Capitalism itself, writ large and in brutally sharp focus.</p>
                <p>
                    [Disclosure: In 2017 I made a lot of money
                    <a href="/ongoing/When/201x/2017/12/19/How-To-Sell-Bitcoin-in-Canada">selling Bitcoins</a>
                    at around $20K, ones
                    <a href="/ongoing/When/201x/2013/04/09/I-bought-some-BitCoins">I’d bought in 2013</a>
                    .  Then in 2021 I
                    <a href="/ongoing/When/202x/2021/06/26/Shorting-Bitcoin">lost money shorting Bitcoin</a>
                    (but I’m still ahead on this
    regrettable game).]
                </p>
                <h2 id="p-1">What is a Bitcoin?</h2>
                <p>
                    It is verifiable proof that a large amount of computing has been done. Let’s measure it in carbon, and while
    it’s complicated and I’ve seen a range of answers, they’re all over 100 tonnes of CO
                    <sub>2</sub>
                    /Btc. That proof is all that a
    Bitcoin is.
                </p>
                <img src="https://www.tbray.org/ongoing/When/202x/2025/01/04/mine.png" alt="Bitcoin mine"/>
                <p>
                    Bitcoin is also a store of value.  It doesn’t matter whether you think it
                    <em>should</em>
                    be, empirically it
                    <em>is</em>
                    , because lots
    of people are exchanging lots of money for Bitcoins on the assumption that they will store the value of that money.  Is it a
                    <em>good</em>
                    store of value?  Many of us think not, but who cares what we think?
                </p>
                <h2 id="p-2">Is Bitcoin useful?</h2>
                <p>I mean, sure, there are currency applications in gun-running, ransoms, narcotics, and sanctions-dodging. But nope, the blockchain
    is so expensive and slow that all most people can really do with Bitcoin is refresh their wallets hoping to see number go up.</p>
                <h2 id="p-3">Bitcoin and late capitalism</h2>
                <p>The success of Bitcoin teaches the following about capitalism in the 2020s:</p>
                <ol>
                    <li>
                        <p>Capitalism doesn’t care about aesthetics. Bitcoins in and of themselves in no way offer any pleasure to any human.</p>
                    </li>
                    <li>
                        <p>
                            Capitalism doesn’t care about negative externalities generally, nor about the future of the planet in particular. As
      long as the number goes up, the CO
                            <sub>2</sub>
                            tonnage is simply invisible. Even as LA burns.
                        </p>
                    </li>
                    <li>
                        <p>Capitalism can be oblivious to the sunk-cost fallacy as long as people are making money right now.</p>
                    </li>
                    <li>
                        <p>
                            Capitalism doesn’t care about utility; the fact that you can’t actually
                            <em>use</em>
                            Bitcoins for anything is apparently
      irrelevant.
                        </p>
                    </li>
                    <li>
                        <p>And oblivious about crime too. The fact that most actual use of Bitcoins as a currency carries the
      stench of international crime doesn’t seem to bother anyone.</p>
                    </li>
                    <li>
                        <p>Capitalism doesn’t care about resiliency or sustainability. Bitcoins are fragile; very easy to lose forever by
      forgetting a password or failing to back up data just right. Also, on the evidence, easy to steal.</p>
                    </li>
                    <li>
                        <p>
                            Capitalism can get along with obviously crazy behavior, for example what MicroStrategy is doing: Turning a third-rate
      software company into a bag of 
      Bitcoins and having an equity valuation that is higher than the value of the bag; see
                            <a href="https://www.bloomberg.com/opinion/articles/2025-01-06/mba-class-project-got-a-bit-too-real">Matt Levine</a>
                            (you have
      to scroll down a bit, look for “MicroStrategy”).
                        </p>
                    </li>
                    <li>
                        <p>Capitalism says: “Only money is real. Those other considerations are for amateurs. Also, fuck the future.”</p>
                    </li>
                </ol>
                <h2 id="p-4">Do I hate capitalism?</h2>
                <p>
                    Not entirely. As Paul Krugman
                    <a href="https://paulkrugman.substack.com/p/trade-in-the-ruins-wonkish">points out</a>
                    , a market-based economy can in practice
    deliver reasonably good results for a reasonably high proportion of the population, as America’s did in the decades following
    1945. Was that a one-time historical aberration? Maybe.
                </p>
                <p>But as for what capitalism has become in the 21st century? Everything got financialized and
    Bitcoin isn’t the disease, it’s just a highly visible symptom.
    Other symptoms: The explosion of homelessness, the destruction of my children’s ecosystem, the gig economy, and the pervasiveness of
    wage theft. It’s really hard to find a single kind word to say.</p>
                <h2 id="p-5">Are Bitcoins dangerous?</h2>
                <p>
                    Not existentially. I mean, smart people are worried, for example
                    <a href="https://www.ft.com/content/25d078a1-0a64-4370-bca8-f19a6b5e8255">Rostin Behnam,
    chair of the Commodity Futures Trading Commission</a>
                    : “You
    still have a large swath of the digital asset space unregulated in the US regulatory system and it’s important — given the
    adoption we’ve seen by some traditional financial institutions, the huge demand for these products by both the retail and
    institutional investors — that we fill this gap.”
                </p>
                <p>All that granted, the market cap of Bitcoin is around two trillion US dollars as I write this. Yes, that’s a lot of money. But
    most of them are held by market insiders, so even in the (plausible) case that it plunges close to zero, the damage to the
    mainstream economy shouldn’t be excessive.</p>
                <p>It’s just immensely annoying.</p>
                <h2 id="p-6">Bitcoin and gold</h2>
                <p>One of the things Bitcoin teaches us is that there is too much money in the world, more than can be put to work in sensible
    investments. So the people who have it do things like buy Bitcoins.</p>
                <p>Gold is also a store of value, also mostly just because people believe it is. But it has the virtues of beauty and of applications in
    jewellery and electronics. I dunno, I’m seriously thinking about buying some on the grounds that the people who have too much
    money are going to keep investing in it. In particular if Bitcoin implodes.</p>
                <h2 id="p-7">Having fun staying poor</h2>
                <p>
                    I’ve been snarling at cryptocurrencies since 2018 or so. But, number go up. So I’ll close by linking to
                    <a href="https://www.ft.com/content/8533f856-57f1-4765-a3dc-d866543092be">HODLers apology</a>
                    .
                </p>
                <h2 id="p-8">Question</h2>
                <p>Is this the best socio-economic system we as a species can build?</p>
            </div>
        </content>
    </entry>
    <entry>
        <title>QRS: Dot-matching Redux</title>
        <link href="https://www.tbray.org/ongoing/When/202x/2024/12/29/Matching-Dot-Redux"/>
        <link rel="replies" thr:count="1" type="application/xhtml+xml" href="/ongoing/When/202x/2024/12/29/Matching-Dot-Redux#comments"/>
        <id>https://www.tbray.org/ongoing/When/202x/2024/12/29/Matching-Dot-Redux</id>
        <published>2024-12-29T12:00:00-08:00</published>
        <updated>2024-12-30T16:02:50-08:00</updated>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Technology/Software"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Technology"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Software"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Technology/Quamina Diary"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Quamina Diary"/>
        <summary type="xhtml">
            <div xmlns="http://www.w3.org/1999/xhtml">Recently I posted     <a href="/ongoing/When/202x/2024/12/18/Matching-Dot-in-UTF8">Matching “.” in UTF-8</a>, in which I claimed that you could match     the regular-expression “<code>.</code>” in a UTF-8 stream with either four or five states in a byte-driven finite automaton,     depending how      you define the problem.  That statement was arguably wrong, and you might need three more states, for a total of eight. But you      can make a case that really, only four should be needed, and another case calling for quite a few more.     Because that phrase “depending how you define the problem” is doing a lot of work</div>
        </summary>
        <content type="xhtml">
            <div xmlns="http://www.w3.org/1999/xhtml">
                <p>
                    Recently I posted
                    <a href="/ongoing/When/202x/2024/12/18/Matching-Dot-in-UTF8">Matching “.” in UTF-8</a>
                    , in which I claimed that you could match
    the regular-expression “
                    <code>.</code>
                    ” in a UTF-8 stream with either four or five states in a byte-driven finite automaton,
    depending how 
    you define the problem.  That statement was arguably wrong, and you might need three more states, for a total of eight. But you 
    can make a case that really, only four should be needed, and another case calling for quite a few more.
    Because that phrase “depending how you define the problem” is doing a lot of work.
                </p>
                <p>
                    But first, thanks:
                    <a href="https://functional.cafe/@edavies">Ed Davies</a>
                    , whose blog contributions
    (
                    <a href="/ongoing/When/202x/2024/12/18/Matching-Dot-in-UTF8#c1734780103.136152">1</a>
                    ,
                    <a href="/ongoing/When/202x/2024/12/18/Matching-Dot-in-UTF8#c1734970677.112348">2</a>
                    ,
                    <a href="/ongoing/When/202x/2024/12/18/Matching-Dot-in-UTF8#c1735151411.984021">3</a>
                    ) were getting insufficient attention from
    me until
                    <a href="https://chaos.social/@dpk">Daphne Preston-Kendal</a>
                    insisted I look more closely.
                </p>
                <p>
                    To summarize Ed’s argument: There are a bunch of byte combinations that look (and work) like regular UTF-8 but are explicitly
    ruled out by the Unicode spec, in particular
                    <a href="https://www.unicode.org/versions/latest/core-spec/chapter-3/#G31703">Section 3.9.3</a>
                    and
    its Table 3.7.
                </p>
                <h2 id="p-1">Moar States!</h2>
                <p>Ed posted a nice picture of a corrected 8-state automaton that will fail to match any of these forbidden
    sequences.</p>
                <img src="https://www.tbray.org/ongoing/When/202x/2024/12/29/edavies-machine.png" alt="Ed Davies’ corrected UTF-8 state machine"/>
                <div class="caption">
                    <p>
                        (Original SVG
                        <a href="https://edavies.me.uk/paste/R2XVFXpjcIiVq9FkaZ2u7ZUC/utf8.svg">here</a>
                        .)
                    </p>
                </div>
                <p>I looked closely at Ed’s proposal and it made sense, so I implemented it and (more important) wrote a bunch of unit tests
    exploring the code space, and it indeed seems to accept/reject everything correctly per Unicode 3.9.3.</p>
                <p>So, argument over, and I should go forward with the 8-state Davies automaton, right?
    Why am I feeling nervous and grumpy, then?</p>
                <h2 id="p-2">Not all Unicode</h2>
                <p>
                    I’ve already mentioned in this series that your protocols and data structures just gotta support Unicode in the 21st century,
    but you almost certainly don’t want to support all the Unicode characters, where by “character” I mean, well… if you care at all
    about this stuff, please go read
                    <a href="https://www.ietf.org/archive/id/draft-bray-unichars-10.html">Unicode Character Repertoire Subsets</a>
                    (“Unichars for
    short), a draft inching 
    its way through the IETF, with luck an RFC some day. And if you
                    <em>really</em>
                    care, dig into
                    <a href="https://datatracker.ietf.org/doc/html/rfc7564">RFC 3454: PRECIS Framework: Preparation, Enforcement, and Comparison of
    Internationalized Strings in Application Protocols</a>
                    . Get a coffee first, PRECIS has multiple walls of text and isn’t
    simple at all. But it goes to tremendous lengths to address security issues and other best practices.
                </p>
                <p>If you don’t have the strength, take my word for it that the following things are true:</p>
                <ol>
                    <li>
                        <p>We don’t talk much about abstract characters; instead focus on the numeric “code points” that represent them.</p>
                    </li>
                    <li>
                        <p>JSON, for historical reasons, accepts all the code points.</p>
                    </li>
                    <li>
                        <p>There are several types of code points that don’t represent characters: “Surrogates”, “controls”, and
      “noncharacters”.</p>
                    </li>
                    <li>
                        <p>There are plenty of code points that are problematic because they can be used by phishers and other attackers
      to fool their victims because they look like other characters.</p>
                    </li>
                    <li>
                        <p>There are characters that you shouldn’t use because they represent one or another of the temporary historical hacks
      used in the process of migrating from previous encoding schemes to Unicode.</p>
                    </li>
                </ol>
                <p>The consequence of all this is that there are many subsets of Unicode that you might want to restrict users of your protocols
    or data structures to:</p>
                <ol>
                    <li>
                        <p>JSON characters: That is to say, all of them, including all the bad stuff.</p>
                    </li>
                    <li>
                        <p>Unichars “Scalars”: Everything except the surrogates.</p>
                    </li>
                    <li>
                        <p>Unichars “XML characters”: Lots but not all of the problematic code points excluded.</p>
                    </li>
                    <li>
                        <p>Unichars “Unicode Assignables”: “All code points that are currently assigned, excluding legacy control codes, or that might in
      future be assigned.”</p>
                    </li>
                    <li>
                        <p>PRECIS “IdentifierClass”: “Strings that can be used to refer to, include, or communicate protocol strings like
      usernames, filenames, data feed identifiers, and chatroom name.”</p>
                    </li>
                    <li>
                        <p>PRECIS “FreeformClass”: “Strings that can be used in a free-form way, e.g., as a password in an authentication exchange
      or a nickname in a chatroom.”</p>
                    </li>
                    <li>
                        <p>Some variation where you don’t accept any unassigned code points; risky, because that changes with every Unicode
      release.</p>
                    </li>
                </ol>
                <p>(I acknowledge that I am unreasonably fond of numbered lists, which is probably an admission that I should try harder to
    compose smoothly-flowing linear arguments that don’t need numbers.)</p>
                <p>You’ll notice that I didn’t provide links for any of those entries. That’s because you really shouldn’t pick one without
    reading the underlying document describing why it exists.</p>
                <h2 id="p-3">What should you accept?</h2>
                <p>
                    I dunno. None of the above are crazy.  I’m kind of fond of Unicode Assignables, which I co-invented. The only thing I’m sure
    of is that you should
                    <em>not</em>
                    go with JSON Characters, because of the fact that its rules make the following chthonic
    horror perfectly legal:
                </p>
                <blockquote>
                    <pre>
                        <code>{"example": "\u0000\u0089\uDEAD\uD9BF\uDFFF"}</code>
                    </pre>
                </blockquote>
                <p>Unichars describes it:</p>
                <blockquote>
                    <p>The value of the “example” field contains the C0 control NUL, the C1 control "CHARACTER TABULATION
    WITH JUSTIFICATION", an unpaired surrogate, and the noncharacter U+7FFFF encoded per JSON rules as two escaped UTF-16 surrogate
    code points. It is unlikely to be useful as the value of a text field. That value cannot be serialized into well-formed UTF-8,
    but the behavior of libraries asked to parse the sample is unpredictable; some will silently parse this and generate an
    ill-formed UTF-8 string.</p>
                </blockquote>
                <p>No, really.</p>
                <h2 id="p-4">What is Quamina for?</h2>
                <p>
                    If you’re wondering what a “Quamina” is, you probably stumbled into this post through some link and, well, there’s a lot of
    history. Tl;dr:
                    <a href="https://github.com/timbray/quamina">Quamina</a>
                    is a pattern-matching library in Go with an unusual (and fast)
    performance envelope; it can match thousands of Patterns to millions of JSON blobs per second.  For much, much more, peruse the
                    <a href="/ongoing/What/Technology/Quamina%20Diary/">Quamina Diary</a>
                    series on this blog.
                </p>
                <p>
                    Anyhow, all this work in being correctly restrictive as to the shape of the incoming UTF-8 was making me uncomfortable.
    Quamina is about telling you what byte patterns are in your incoming data, not enforcing rules about what
                    <em>should</em>
                    be there.
                </p>
                <p>And it dawned on me that it might be useful to ask Quamina to look at a few hundred thousand inputs per second and tell you
    which had ill-formed-data problems.  Quamina’s dumb-but-fast byte-driven finite automaton would be happy to do that, and very
    efficiently too.</p>
                <h2 id="p-5">Conclusion</h2>
                <p>So, having literally lain awake at night fretting over this, here’s what I think I’m going to do:</p>
                <ol>
                    <li>
                        <p>
                            I’ll implement a new Quamina pattern called
                            <code>ill-formed</code>
                            or some such that will match any field that has
      busted UTF-8 of the kind we’ve been talking about here. It’d rely on an automaton that is basically the inverse of
      Davies’ state machine.
                        </p>
                    </li>
                    <li>
                        <p>
                            By default, the meaning of “
                            <code>.</code>
                            ” will be “matches the Davies automaton”; it’ll match
      well-formed UTF-8 matching all code points except surrogates.
                        </p>
                    </li>
                    <li>
                        <p>
                            I’ll figure out how to parameterize regular-expression matches so you can change the definition of “
                            <code>.</code>
                            ” to
      match one or more of the smaller subsets like those in the list above from Unichars and PRECIS.
                        </p>
                    </li>
                </ol>
                <p>
                    But who knows, maybe I’ll end up changing my mind again. I already have, multiple times. Granted that implementing regular
    expressions is hard, you’d think that matching “
                    <code>.</code>
                    ” would be the easy part. Ha ha ha.
                </p>
            </div>
        </content>
    </entry>
    <entry>
        <title>QRS: Matching “.” in UTF-8</title>
        <link href="https://www.tbray.org/ongoing/When/202x/2024/12/18/Matching-Dot-in-UTF8"/>
        <link rel="replies" thr:count="10" type="application/xhtml+xml" href="/ongoing/When/202x/2024/12/18/Matching-Dot-in-UTF8#comments"/>
        <id>https://www.tbray.org/ongoing/When/202x/2024/12/18/Matching-Dot-in-UTF8</id>
        <published>2024-12-18T12:00:00-08:00</published>
        <updated>2024-12-18T12:00:00-08:00</updated>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Technology/Software"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Technology"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Software"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Technology/Quamina Diary"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Quamina Diary"/>
        <summary type="xhtml">
            <div xmlns="http://www.w3.org/1999/xhtml">Back on December 13th, I     <a href="https://cosocial.ca/@timbray/113646778780834552">posted a challenge</a> on Mastodon: In a simple UTF-8 byte-driven     finite automaton, how many states does it take to match the regular-expression construct “<code>.</code>”, i.e. “any character”?     Commenter     <a href="https://www.justsoftwaresolutions.co.uk/blog">Anthony Williams</a> responded,      <a href="/ongoing/When/202x/2024/12/12/Quamina-Regular-Expression-Series#c1734082594.119452">getting it almost right</a> I think,     but I found his description a little hard to understand. In this piece I’m going to dig into what     <code>.</code> actually means, and then how many states you need to match it.<br/> <i>[Update: Lots more on this subject and some of the material below is arguably wrong, but just “arguably”; see     <a href="/ongoing/When/202x/2024/12/29/Matching-Dot-Redux">Dot-matching Redux</a>.]</i></div>
        </summary>
        <content type="xhtml">
            <div xmlns="http://www.w3.org/1999/xhtml">
                <p>
                    Back on December 13th, I
                    <a href="https://cosocial.ca/@timbray/113646778780834552">posted a challenge</a>
                    on Mastodon: In a simple UTF-8 byte-driven
    finite automaton, how many states does it take to match the regular-expression construct “
                    <code>.</code>
                    ”, i.e. “any character”?
    Commenter
                    <a href="https://www.justsoftwaresolutions.co.uk/blog">Anthony Williams</a>
                    responded,
                    <a href="/ongoing/When/202x/2024/12/12/Quamina-Regular-Expression-Series#c1734082594.119452">getting it almost right</a>
                    I think,
    but I found his description a little hard to understand. In this piece I’m going to dig into what
                    <code>.</code>
                    actually means, and then how many states you need to match it.
                    <br/>
                    <i>
                        [Update: Lots more on this subject and some of the material below is arguably wrong, but just “arguably”; see
                        <a href="/ongoing/When/202x/2024/12/29/Matching-Dot-Redux">Dot-matching Redux</a>
                        .]
                    </i>
                </p>
                <p>The answer surprised me. Obviously this is of
    interest only to the faction of people who are interested in automaton wrangling, problematic characters, and the finer
    points of UTF-8. I expect close attention from all 17 of you!</p>
                <h2 id="p-1">The answer is…</h2>
                <p>Four. Or five, depending.</p>
                <h2 id="p-2">What’s a “Unicode character”?</h2>
                <p>
                    They’re represented by “code points”, which are numbers in the range 0 … 17×2
                    <sup>16</sup>
                    , which is to say 1,114,112
    possible values. It turns out you
                    <a href="https://www.ietf.org/archive/id/draft-bray-unichars-10.html">don’t actually want to match all of them</a>
                    ; more on that
    later.
                </p>
                <h2 id="p-3">How many states?</h2>
                <p>
                    Quamina is a “byte-level automaton” which means it’s in a state, it reads a byte, looks up the value of that byte in a map
    yielding either the next state, or
                    <code>nil</code>
                    , which means no match. Repeat until you match or fail.
                </p>
                <p>
                    What bytes are we talking about here? We’re talking about UTF-8 bytes.
    If you don’t understand UTF-8 the rest of this is going to be difficult. I wrote a short explainer called
                    <a href="/ongoing/When/200x/2003/04/26/UTF">Characters vs. Bytes</a>
                    twenty-one years ago. I now
    assume you understand UTF-8 and knew that code points are encoded as sequences of from 1 to 4 bytes.
                </p>
                <p>Let’s count!</p>
                <ol>
                    <li>
                        <p>
                            When you match a code point successfully you move to the part of the automaton that’s trying to match the next one;
      let’s call this condition
                            <i>MATCHED</i>
                            .
                        </p>
                        <p>(From here on, all the numbers are hex, I’ll skip the leading 0x. And all the ranges are inclusive.)</p>
                    </li>
                    <li>
                        <p>
                            In multi-byte characters, all the UTF-8 bytes but the first have bitmasks like
                            <code>10XX XXXX</code>
                            , so there are six
      significant bits, thus 2
                            <sup>6</sup>
                            or 64 distinct possible values ranging from 80-BF.
                        </p>
                    </li>
                    <li>
                        <p>
                            There’s a
                            <i>Start</i>
                            state. It maps
      byte values 00-7F (as in ASCII) to
                            <i>MATCHED</i>
                            . That’s our first state, and we’ve handled all the one-byte
      code points.
                        </p>
                    </li>
                    <li>
                        <p>
                            In the
                            <i>Start</i>
                            state, the 32 byte values C0-DF, all of which begin
                            <code>110</code>
                            signaling a two-byte
      code point, are mapped to the
                            <i>Last</i>
                            state. In the
                            <i>Last</i>
                            state,
      the 64 values 80-BF are mapped to
                            <i>MATCHED</i>
                            . This takes care of all the two-byte code points and we’re up to two
      states.
                        </p>
                    </li>
                    <li>
                        <p>
                            In the
                            <i>Start</i>
                            state, the 16 byte values E0-EF, all of which begin
                            <code>1110</code>
                            signaling a three-byte code
      point, are mapped to the
                            <i>LastInter</i>
                            state. In that
      state, the 64 values 80-BF are mapped to the
                            <cite>Last</cite>
                            state. Now we’re up to three states and we’ve handled the
      three-byte code points.
                        </p>
                    </li>
                    <li>
                        <p>
                            In the
                            <i>Start</i>
                            state, the 8 byte values F0-F7, all of which begin 11110 signaling a four-byte code point, are
      mapped to the
                            <i>FirstInter</i>
                            state. In that state, 
      the 64 values 80-BF are mapped to the
                            <i>LastInter</i>
                            state. Now we’ve handled all the code points with four states.
                        </p>
                    </li>
                </ol>
                <h2 id="p-6">But wait!</h2>
                <p>
                    I mentioned above about not wanting to match all the code points. “Wait,” you say, “why wouldn’t you want to be maximally
    inclusive?!” Once again, I’ll link to
                    <a href="https://www.ietf.org/archive/id/draft-bray-unichars-10.html">Unicode Character Repertoire Subsets</a>
                    , a document I
    co-wrote that is making its way through the IETF and may become an RFC some year. I’m not going to try to summarize a draft that
    bends over backwards to be short and clear; suffice it to say that there are good reasons for leaving out several different
    flavors of code point.
                </p>
                <p>
                    Probably the most pernicious code points are the “Surrogates”, U+D800-U+DFFF. If you want an explanation of what they are and
    why they’re bad, go read that
                    <cite>Repertoire Subsets</cite>
                    draft or just take my word for it. If you were to encode them per
    UTF-8 rules (which the UTF-8 spec says you’re not allowed to), the low and high bounds would be ED,A0,80 and ED,BF,BF.
                </p>
                <p>Go’s UTF-8 implementation agrees that Surrogates Are Bad and The UTF-8 Spec Is Good and flatly refuses to convert those UTF-8
    sequences into code points or vice versa. The resulting subset of code points even has a catchy name: Unicode Scalars. Case
    closed, right?</p>
                <p>Wrong. Because JSON was designed before we’d thought through these problems, explicitly saying it’s OK to include
    any code point whatsoever, including surrogates. And Quamina is used for matching JSON data. So, standards fight!</p>
                <p>
                    I’m being a little unfair here. I’m sure that if Doug Crockford were inventing JSON now instead of in 2001, he’d exclude
    surrogates and probably some of the other problematic code points discussed in that
                    <cite>Subsets</cite>
                    doc.
                </p>
                <p>
                    Anyhow, Quamina will go with Go and exclude surrogates.
    Any RFC8259 purists out there, feel free accuse me of 
    standards apostasy and I will grant your point but won’t change Quamina. Actually, not true; at some point I’ll probably add an
    option to be
                    <em>more</em>
                    restrictive and exclude more than just surrogates.
                </p>
                <p>
                    Which means that now we have to go back to the start of this essay and figure out how many states it takes to match
    “
                    <code>.</code>
                    ” Let’s see…
                </p>
                <ol>
                    <li>
                        <p>
                            The
                            <i>Start</i>
                            state changes a bit. See #5 in the list above. Instead of mapping all of E0-EF to the
                            <i>LastInter</i>
                            state, it maps one byte in that range, ED, to a new state we’ll call, let’s see, how about
                            <i>ED</i>
                            .
                        </p>
                    </li>
                    <li>
                        <p>
                            In
                            <i>ED</i>
                            , just as in
                            <i>LastInter</i>
                            , 80-9F are mapped to
                            <i>Last</i>
                            . But A0-BF aren’t mapped to anything,
      because on that path lie the surrogates.
                        </p>
                    </li>
                </ol>
                <p>So, going with the Unicode Scalar path of virtue means I need five states, not four.</p>
            </div>
        </content>
    </entry>
    <entry>
        <title>1994 Hong Kong Adventure</title>
        <link href="https://www.tbray.org/ongoing/When/202x/2024/12/14/Hong-Kong-Ferries-1994"/>
        <link rel="replies" thr:count="2" type="application/xhtml+xml" href="/ongoing/When/202x/2024/12/14/Hong-Kong-Ferries-1994#comments"/>
        <id>https://www.tbray.org/ongoing/When/202x/2024/12/14/Hong-Kong-Ferries-1994</id>
        <published>2024-12-14T12:00:00-08:00</published>
        <updated>2024-12-15T10:07:02-08:00</updated>
        <category scheme="https://www.tbray.org/ongoing/What/" term="The World/Places/Hong Kong"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="The World"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Places"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Hong Kong"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="The World/Food and Drink"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Food and Drink"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Arts/Photos"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Arts"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Photos"/>
        <summary type="xhtml">
            <div xmlns="http://www.w3.org/1999/xhtml">This story is about Hong Kong and mountains and ferries and food and beer.      What happened was, there’s a thirty-year-old picture I wanted to share and it brought the story to mind. I was sure I’d written it     up but can’t find it here on the blog, hard as I try, so here we go. Happy ending promised!</div>
        </summary>
        <content type="xhtml">
            <div xmlns="http://www.w3.org/1999/xhtml">
                <p>This story is about Hong Kong and mountains and ferries and food and beer. 
    What happened was, there’s a thirty-year-old picture I wanted to share and it brought the story to mind. I was sure I’d written it
    up but can’t find it here on the blog, hard as I try, so here we go. Happy ending promised!</p>
                <p>The picture I wanted to share is from a business trip to Hong Kong in 1994 and hey, it turns out I have lots more pictures
    from that trip.</p>
                <img src="https://www.tbray.org/ongoing/When/202x/2024/12/14/2110.png" alt="Kai Tak airport in 1994"/>
                <div class="caption">
                    <p>Kai Tak airport in 1994.</p>
                </div>
                <img src="https://www.tbray.org/ongoing/When/202x/2024/12/14/2112.png" alt="A sketchy corner of Kowloon in 1994"/>
                <div class="caption">
                    <p>Rats for sale in a sketchy corner of Kowloon.</p>
                </div>
                <img src="https://www.tbray.org/ongoing/When/202x/2024/12/14/2115.png" alt="Hong Kong, mainland side, 1994"/>
                <p>Kai Tak, what an airport that was. If you could open the plane’s windows, you’d have been able to grab laundry hung to dry on
    people’s balconies. My fast-talking HK friend said “Safest airport in the world! You know pilot paying 100% attention!”</p>
                <p>
                    My trip extended over a weekend and I wanted to get out of town so I read up on interesting walks; on paper of
    course, the Web only just barely existed.
                    <a href="https://en.wikipedia.org/wiki/Lantau_Island">Lantau Island</a>
                    was recommended; there was a good hike up over the local
    mountains that reached a Trappist monastery with a well-reviewed milk bar. So I took the ferry from Central to Mui Wo.
                </p>
                <p>The view from the ferry was great!</p>
                <img src="https://www.tbray.org/ongoing/When/202x/2024/12/14/2128.png" alt="View from the Mui Wo ferry"/>
                <img src="https://www.tbray.org/ongoing/When/202x/2024/12/14/2144.png" alt="The Mui Wo docks"/>
                <p>
                    I revisited Mui Wo in 2019,
                    <a href="/ongoing/When/201x/2019/04/07/Visiting-Buddha">visiting the Big Buddha</a>
                    .
                </p>
                <p>It was easy to find the hiking trail up the mountains, well-maintained but steep. I stopped to take pictures maybe more often
    than strictly necessary because it was in the high Celsius thirties with 99% humidity and my North-Euro metabolism wasn’t
    dealing well. Visions of Trappist ice-cream danced in my head as the sweat dripped off my chin.</p>
                <img src="https://www.tbray.org/ongoing/When/202x/2024/12/14/2145.png" alt="Lantau Island countryside"/>
                <img src="https://www.tbray.org/ongoing/When/202x/2024/12/14/2151.png" alt="Lantau Island countryside"/>
                <p>Having said that, I’m glad I
    stopped because the pictures please my eye.  These are all Ektachrome; can’t remember whether I took them with
    the Pentax SLR or the little Nikon pocket camera.</p>
                <p>Lantau has the new international airport on it now; I wonder if those green hills are still unspoiled.</p>
                <p>Eventually, sweat-soaked and my body screaming for mercy, I reached a small mountaintop. I could see the monastery, but it was
    a couple of little mountains over, so I arrived in poor condition. Sadly for me, it was a Sunday so, commerce deferring to
    the sacred, the joint was closed. Poor Tim. Especially since I hadn’t brought anything to eat.</p>
                <p>
                    Fortunately I didn’t have to hike all the way back to Mui Wo; Almost straight downhill there there was a “Monastery Pier” with
    an occasional ferry to the nearby islet of
                    <a href="https://en.wikipedia.org/wiki/Peng_Chau">Peng Chau</a>
                    and a connection back to Central. Looks like
                    <a href="https://www.blueseaferry.com.hk/en/pc6/">there still is</a>
                    .
                </p>
                <p>It was midafternoon, the heat approaching its peak, and walking downhill has its own stresses and strains. By the time I got
    to the pier I was a sad excuse for a human.  Here’s a picture of the ferry.</p>
                <img src="https://www.tbray.org/ongoing/When/202x/2024/12/14/2158.png" alt="Inside a small wooden ferryboat, full of Chinese people"/>
                <p>As you can see, it was pretty crowded, but
    unsurprisingly, nobody wanted to share the bench the big sweaty panting hungry-looking pink person was on.</p>
                <p>Peng Chau itself was visually charming but the ferry connection was tight so I couldn’t explore.</p>
                <img src="https://www.tbray.org/ongoing/When/202x/2024/12/14/2160.png" alt="Peng Chau"/>
                <div class="caption">
                    <p>
                        Peng Chau waterfront in 1994. This is the picture I wanted to share that led me to (re?)tell this story.
    My conversational-media home on the Net is
                        <a href="https://cosocial.ca/@timbray">on Mastodon</a>
                        , but I like to keep an eye on Bluesky, so I post random pictures there
    under the tag
                        <a href="https://bsky.app/search?q=%23blueskyabove">#blueskyabove</a>
                        ; this will be one.
                    </p>
                </div>
                <p>Trudging onto the
    medium-sized ferry back home, I encountered a food-service option: A counter with one guy and a big
    steaming pot of soup behind it. My spirit lifted. The guy’s outfit might have once been white; he was unshaven and sweaty but
    then so was I, and my clothes were nothing to write home about either.</p>
                <p>I stopped and pointed at the bowls. He filled one, then wanted to upsell me on a leathery, greasy-looking fried egg to go
    on top but there are limits. Disappointed, he stepped aside to put it back, revealing a small glass-fronted fridge,
    icicles hanging off it, full of big cans of San Miguel beer. My spirit lifted again.</p>
                <p>The soup was salty and delicious. I’m not sure I’ve enjoyed a beer more in the thirty years since that day. The ferry was fast
    enough to generate a refreshing breeze all the way, and there were charming boats to photograph.</p>
                <img src="https://www.tbray.org/ongoing/When/202x/2024/12/14/2170.png" alt="Red and yellow motor boat with its sides lined with old tires"/>
                <p>The tourist who walked off the boat at Central was a dry, well-hydrated, and cheerful
    specimen of humanity. The next day, my fast-talking HK friend said “You climb over Lantau in that weather yesterday? White guys
    so weird!” “It was great!” I told him, smirking obnoxiously.</p>
                <p>I’ve been back to HK a few times over the years, but it’s not really a happy place any more.</p>
            </div>
        </content>
    </entry>
    <entry>
        <title>QRS: Parsing Regexps</title>
        <link href="https://www.tbray.org/ongoing/When/202x/2024/12/12/QRS-Parsing-Regular-Expressions"/>
        <link rel="replies" thr:count="2" type="application/xhtml+xml" href="/ongoing/When/202x/2024/12/12/QRS-Parsing-Regular-Expressions#comments"/>
        <id>https://www.tbray.org/ongoing/When/202x/2024/12/12/QRS-Parsing-Regular-Expressions</id>
        <published>2024-12-12T12:00:00-08:00</published>
        <updated>2024-12-13T14:34:29-08:00</updated>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Technology/Software"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Technology"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Software"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Technology/Quamina Diary"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Quamina Diary"/>
        <summary type="xhtml">
            <div xmlns="http://www.w3.org/1999/xhtml">Parsing regular expression syntax is hard. I’ve written a lot of parsers and,for this one, adopted a couple of new techniques     that I haven’t used before. I learned things that might be of general interest</div>
        </summary>
        <content type="xhtml">
            <div xmlns="http://www.w3.org/1999/xhtml">
                <p>Parsing regular expression syntax is hard. I’ve written a lot of parsers and,for this one, adopted a couple of new techniques
    that I haven’t used before. I learned things that might be of general interest.</p>
                <p>I was initially surprised that the problem was harder than it looked, but quickly realized that I shouldn’t have been, because
    my brain has also always had a hard time parsing them.</p>
                <p>They’re definitely a write-only syntax and just because I’m gleefully
    writing this series doesn’t mean I’m recommending you reach for REs as a tool very often.</p>
                <p>But I bet most people in my profession
    find themselves using them pretty regularly, in the common case where they’re the quickest path from A to B. And I know for
    sure that, on a certain number of occasions, they’ve ended up regretting that choice.</p>
                <p>Anyhow, I console myself with the thought that the I-Regexp RE dialect has less syntax and fewer footguns than PCREs
    generally. Plus, I’ve been having fun implementing them. So knock yourselves out. (Not legal nor investing advice.)</p>
                <h2 id="p-1">Sample-driven development</h2>
                <p>
                    When I started thinking seriously about the parser, the very first thought in my mind was “How in the freaking hell am I
    going to test this?” I couldn’t stand the thought of writing a single line of code without having a plausible answer.  Then it
    occurred to me that since I-Regexp subsets
                    <a href="https://www.w3.org/TR/2004/REC-xmlschema-2-20041028/#regexs">XSD Regular Expressions</a>
                    , and since XSD (which I
    mostly dislike) is widely deployed and used, maybe someone already wrote a test suite? So I stuck my head into an XML
    community space (still pretty vigorous after all these years) and asked “Anyone have an XSD regexp test suite?”
                </p>
                <p>
                    And it worked! (I love this profession sometimes.)
                    <a href="https://en.wikipedia.org/wiki/Michael_Howard_Kay">Michael Kay</a>
                    pointed at me a few things notably including
                    <a href="https://github.com/qt4cg/xslt40-test/tree/master/tests/misc/regex-syntax">this GitHub repo</a>
                    . The
                    <code>_regex-syntax-test-set.xml</code>
                    there, too big to display, contains just under a thousand regular expressions, some
    valid, some not, many equipped with strings that should and should not match.
                </p>
                <p>
                    The process by which I turned it into a
                    <code>*_test.go</code>
                    file, Dear Reader, was not pretty. I will not share the
    ugliness, which involved awk and emacs, plus hideous and largely untested one-off Go code.
                </p>
                <p>But I gotta say, if you have to write a parser for any anything, having 992 sample cases makes the job a whole lot less
    scary.</p>
                <p>Lesson: When you’re writing code to process a data format that’s new to you, invest time, before you start, in looking for samples.</p>
                <h2 id="p-2">Recursive descent</h2>
                <p>
                    The I-Regexp specification contains a
                    <a href="https://www.rfc-editor.org/rfc/rfc9485.html#name-i-regexp-syntax">complete ABNF grammar</a>
                    for the syntax. For writing
    parsers I tend to like finite-automaton based approaches, but for a freakishly complicated mini-language like this, I
    bowed in the direction of Olympus for that grammar and started recursively descending.
                </p>
                <p>I think at some point I understood the theory of Regular Languages and LL(1) and so on, but not any more. Having said that,
    the recursive-descent technique is conceptually simple, so I plowed ahead. And it worked eventually. But there seemed a lot of
    sloppy corners where I had to peek one byte ahead or backtrack one. Maybe if I understood LL(1) better it’d have
    been smoother.</p>
                <p>
                    The “character-class” syntax
                    <code>[abc0-9]</code>
                    is particularly awful. The possible leading
                    <code>-</code>
                    or
                    <code>^</code>
                    makes it worse, and it has the usual
                    <code>\</code>
                    -prefixed stanzas. Once again, I salute the original
    specifiers who managed to express this in a usable grammar.
                </p>
                <p>I was tempted, but ended up making no use of Go’s <code>regexp</code> library to help me parse REs.</p>
                <p>
                    I have to say that I don’t
                    <em>like</em>
                    the code I ended up with as much as any of my previous (automaton-based) parsers,
    nor as much as the rest of the Quamina code. But it seems to work OK. Speaking of that…
                </p>
                <h2 id="p-3">Test coverage</h2>
                <p>When I eventually got the code to do the right thing for each of Michael Kay’s 992 test cases, I was feeling a warm glow. So
    then I ran the test-coverage tool, and got a disappointingly-low number. I’m not a 100%-coverage militant generally, but I am for
    ultra-low-level stuff like this with a big blast radius.</p>
                <p>And here’s the lesson: Code coverage tools are your friend. I went in and looked at the green and red bars; they revealed that while
    my tests had passed, I was really wrong in my assumptions about the paths they would make the code take.  Substantial
    refactoring ensued.</p>
                <p>
                    Second, and somewhat disappointingly, there were a lot of coverage misses on Go’s notorious little
                    <code>if err != nil</code>
                    stanza. Which revealed that my sample set didn’t cover the RE-syntax space quite as thoroughly as I’d hoped. In particular,
    there was really no coverage of the code’s reaction to malformed UTF-8.
                </p>
                <p>The reason I’m writing this is to emphasize that, even if you’re in a shop where the use of code-coverage tools is
    (regrettably) not required, you should use one anyhow, on basically every important piece of code. I have absolutely never
    failed to get surprises, and consequently improved code, by doing this.</p>
                <h2 id="p-4">Sharing the work</h2>
                <p>I don’t know if I-Regexp is going to be getting any uptake, but it wouldn’t surprise me if it did; it’s a nice tractable
    subset that hits a lot of use cases. Anyhow, now I have reasonably robust and well-tested I-Regexp parsing code. I’d like to
    share it, but there’s a problem.</p>
                <p>
                    To do that, I’d have to put it in a separate repo; nobody would want to import all of Quamina, which is a fair-sized library,
    just to parse REs. But then that other repo would become a Quamina dependency. And one of my favorite things about Quamina is
    that it has
                    <a href="/ongoing/When/202x/2024/09/04/0dependencies">0 dependencies!</a>
                </p>
                <p>It’s not obvious what the right thing to do is; any ideas?</p>
            </div>
        </content>
    </entry>
    <entry>
        <title>QRS: Quamina Regexp Series</title>
        <link href="https://www.tbray.org/ongoing/When/202x/2024/12/12/Quamina-Regular-Expression-Series"/>
        <link rel="replies" thr:count="4" type="application/xhtml+xml" href="/ongoing/When/202x/2024/12/12/Quamina-Regular-Expression-Series#comments"/>
        <id>https://www.tbray.org/ongoing/When/202x/2024/12/12/Quamina-Regular-Expression-Series</id>
        <published>2024-12-12T12:00:00-08:00</published>
        <updated>2024-12-12T12:00:00-08:00</updated>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Technology/Software"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Technology"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Software"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Technology/Quamina Diary"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Quamina Diary"/>
        <summary type="xhtml">
            <div xmlns="http://www.w3.org/1999/xhtml">Implementing regular expressions is hard. Hard in interesting ways that make me want to share the lessons. Thus this series,     QRS for short</div>
        </summary>
        <content type="xhtml">
            <div xmlns="http://www.w3.org/1999/xhtml">
                <p>Implementing regular expressions is hard. Hard in interesting ways that make me want to share the lessons. Thus this series,
    QRS for short.</p>
                <p>
                    People who keep an eye on my
                    <a href="/ongoing/What/Technology/Quamina%20Diary/">Quamina</a>
                    open-source pattern-matching project will have noticed a recent
    absence of updates and conversation. That’s because, persuant to
                    <a href="https://github.com/timbray/quamina/issues/66">Issue #66</a>
                    , I’m working on adding fairly-full regular-expression
    matching.
                </p>
                <h2 id="p-4">Personal note</h2>
                <p>This is turning out to be hard. Either it’s the hardest nut I’ve had to crack in many years, or maybe my
    advanced age is dulling my skills. It’s going to be some time before I can do the first incremental release.  Whatever; the
    learning experiences coming out of this work still feel fresh and fascinating and give me the urge to share.</p>
                <p>
                    I hope I can retain that urge as long as I’m still mentally present. In fact, I hope I can retain the ability to work on
    software. For various reasons, I’ve been under a lot of
                    <a href="/ongoing/When/202x/2023/10/25/Wild-World">personal stress</a>
                    in recent years. Stealing time from my adult
    responsibilities to wrestle with executable abstractions has been a pillar of my sanity.
                </p>
                <p>Anyhow, normally when I code I blog about it, but so far I haven’t because the work is unfinished. Then I realized
    that it’s too big, and addresses too many distinct problems, to be just one piece, thus this mini-series.</p>
                <p>[Readers who don’t know what regular expressions are should probably close this tab now. Don’t feel guilty, nobody
    who’s not a full-time computing professional should have to know much less care.]</p>
                <p>[Notation: I’m gonna say “Regexp” or maybe just “RE” in this series.]</p>
                <p>I’ll use this post as a table of contents:</p>
                <ol>
                    <li>
                        <p>
                            <a href="/ongoing/When/202x/2024/12/12/QRS-Parsing-Regular-Expressions">Parsing RE syntax.</a>
                            .
                        </p>
                    </li>
                    <li>
                        <p><a href="/ongoing/When/202x/2024/12/18/Matching-Dot-in-UTF8">Matching “.” in UTF-8</a>.</p>
                    </li>
                    <li>
                        <p><a href="/ongoing/When/202x/2024/12/29/Matching-Dot-Redux">Dot-matching Redux</a>.</p>
                    </li>
                    <li>
                        <p>(Future) Representing parsed REs.</p>
                    </li>
                    <li>
                        <p>(Future) Implementing UTF-8 based automata for REs.</p>
                    </li>
                </ol>
                <p>At the moment, I think the hardest part of the work is #1, Parsing. (Maybe that’s because I haven’t really dug very deep into
    other parts yet.) I’d be amazed if the final series had only three parts.</p>
                <p>Now, introductory material.</p>
                <h2 id="p-3">Which regular expressions?</h2>
                <p>
                    They come in lots of flavors. The one I’m implementing is
                    <a href="https://www.rfc-editor.org/rfc/rfc9485.html">I-Regexp, RFC 9485</a>
                    . The observant reader will notice that I co-edited
    that RFC, and I cheerfully confess to bias.
                </p>
                <p>
                    I-Regexp is basically a subset of
                    <a href="https://www.w3.org/TR/2004/REC-xmlschema-2-20041028/#regexs">XSD Regular Expressions</a>
                    (chosen to subset because they
    have a nice clean immutable spec), which are a lot like good ol’ PCRE (Perl-compatible regular expressions). Except for:
                </p>
                <ol>
                    <li>
                        <p>They are designed assuming they will only ever be used to match against a string and return a “yes” or “no”
      answer.</p>
                    </li>
                    <li>
                        <p>
                            They are anchored, which is to say that (unlike PCREs) they’re all assumed to start with
                            <code>^</code>
                            and end with
                            <code>$</code>
                            .
                        </p>
                    </li>
                    <li>
                        <p>
                            They omit popular single-character escapes like
                            <code>\w</code>
                            and
                            <code>\S</code>
                            because those are sketchy in the
      Unicode context.
                        </p>
                    </li>
                    <li>
                        <p>They don’t have capture groups or back-references.</p>
                    </li>
                    <li>
                        <p>They don’t support character class subtraction, e.g. <nobr><code>[a-z-m-p]</code></nobr>.</p>
                    </li>
                </ol>
                <p>I’m going to claim that they hit a very useful 80/20 point if what you’re interested is asking “Did the field value match?”
    which of course is all Quamina is interested in doing.</p>
                <h2 id="p-5">Project strategy</h2>
                <p>
                    I’m totally not going to try to do all this as a big bang. I’ve got a reliable RE parser now (it was hard!) that recognizes
    ten different RE features, ranging from
                    <code>.</code>
                    to everything in
                    <nobr>
                        <code>(a+b*c?).|d[ef]{3,9}\?\P{Lu}</code>
                    </nobr>
                    . I’m planning to roll them out a feature
    at a time, but to refuse to accept REs that use features I haven’t implemented yet.
                </p>
                <h2 id="p-7">Unbackslashing again</h2>
                <p>
                    Go check out
                    <a href="ongoing/When/202x/2024/09/22/Unbackslashing">Unbackslash</a>
                    .
    Tl;dr: It’s terribly painful to deal with the standard RE escaping character
                    <code>\</code>
                    in Go software that is processing
    JSON. Because both Go and JSON use
                    <code>\</code>
                    for escaping and your unit tests eventually fill up with
                    <code>\\</code>
                    and
                    <code>\\\\\\\\</code>
                    and become brutally hard to read. So after publishing that blog piece and running polls on Mastodon,
                    <code>~</code>
                    is the new
                    <code>\</code>
                    . So that RE above becomes
                    <code>(a+b*c?).|d[ef]{3,9}~?~P{Lu}</code>
                    .
                </p>
                <p>You’re allowed to not like it. But I request that you hold off pushing the big button that sends me to Hell until you’ve
    tried writing a few unit tests for REs that you want Quamina to process.</p>
                <p>Back to strategy: The first feature is going to be that lovely little dot operator. And thus…</p>
                <h2 id="p-6">Quiz</h2>
                <p>
                    Just for fun, here’s an intellectual challenge. Suppose you’re building a byte-at-a-time state machine to process UTF-8 text. How
    many states, roughly, would it take to match
                    <code>.</code>
                    , i.e. any single Unicode code point? By “match” I mean reject
    any byte sequence that 
    doesn’t, and when it does match, consume just enough bytes to leave you positioned after the
                    <code>.</code>
                    and ready to start
    matching whatever’s next.
                </p>
                <p>
                    I
                    <em>think</em>
                    I’ve found the correct answer. It surprised me, so I’m still sanity-checking, but I think I’m right. I am
    convinced the problem isn’t as simple as it looks.
                </p>
            </div>
        </content>
    </entry>
    <entry>
        <title>Remembering Bonnie</title>
        <link href="https://www.tbray.org/ongoing/When/202x/2024/12/02/Remembering-Bonnie"/>
        <link rel="replies" thr:count="8" type="application/xhtml+xml" href="/ongoing/When/202x/2024/12/02/Remembering-Bonnie#comments"/>
        <id>https://www.tbray.org/ongoing/When/202x/2024/12/02/Remembering-Bonnie</id>
        <published>2024-12-02T12:00:00-08:00</published>
        <updated>2024-12-04T12:24:40-08:00</updated>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Technology/Storage"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Technology"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Storage"/>
        <summary type="xhtml">
            <div xmlns="http://www.w3.org/1999/xhtml">The murderer I emailed with is still in prison. And the software that got him pissed off at me still runs, so I ran it.     Now here I am to pass on the history and then go all geeky. Here’s the tell: If you don’t know what a “filesystem” is (that’s     perfectly OK, few reasonable adults need to) you might want to stay for the murderer story then step off the     train</div>
        </summary>
        <content type="xhtml">
            <div xmlns="http://www.w3.org/1999/xhtml">
                <p>The murderer I emailed with is still in prison. And the software that got him pissed off at me still runs, so I ran it.
    Now here I am to pass on the history and then go all geeky. Here’s the tell: If you don’t know what a “filesystem” is (that’s
    perfectly OK, few reasonable adults need to) you might want to stay for the murderer story then step off the
    train.</p>
                <p>Filesystems are one of the pieces of software that computers need to run, where “computers” includes your phone and laptop and
    each of the millions of servers that drive the Internet and populate the cloud. There are many flavors of filesystem and
    people who care about them care a lot.</p>
                <p>One of the differences between filesystems is how fast they are. This matters because how fast the apps you use run depends
    (partly) on how fast the underlying filesystems are.</p>
                <p>Writing filesystem software is very, very difficult and people who have done this earn immense respect from their peers. So,
    a lot of people try.  One of the people who succeeded was named Hans Reiser and for a while his “ReiserFS” filesystem was heavily
    used on many of those “Linux” servers out there on the Internet that do things for you.</p>
                <p>Reiser at one point worked in Russia and used a “mail-order bride” operation to look for a spouse. He ended up
    marrying Nina Sharanova, one of the bride-brokerage translators, and bringing her back to the US with him. They had two kids,
    got divorced, and then, on 
    September 3, 2006, he strangled her and buried her in a hidden location.</p>
                <p>To make a long story short, he eventually pleaded guilty to
    a reduced charge in exchange for revealing the grave location, and remains in prison.  I haven’t provided any links because it’s
    a sad, tawdry story, but if you want to know the details the Internet has them.</p>
                <p>I had interacted with Reiser a few times as a consequence of having written a piece of filesystem-related software called
    “Bonnie” (more on Bonnie below). I can’t say he was obviously murderous but I found him unpleasant to deal with.</p>
                <p>As you might imagine, people generally did not want to keep using the murderer’s filesystem software, but it takes a long
    time to make this kind of infrastructure change and just last month, ReiserFS was removed as a Linux option. Which led to
    this Mastodon exchange:</p>
                <img src="https://www.tbray.org/ongoing/When/202x/2024/12/02/linux-reiserfs.png" alt="Mastodon post about removal of ReiserFS from Linux"/>
                <div class="caption">
                    <p>
                        Here’s a
                        <a href="https://cosocial.ca/@timbray/113522946844951454">link to that post</a>
                        and the conversation that followed.
                    </p>
                </div>
                <p>(People who don’t care about filesystems can stop reading now.)</p>
                <h2 id="p-3">Now, numbers</h2>
                <p>After that conversation, on a whim I tracked down the Bonnie source and ran it on my current laptop, a 2023 M2 MacBook Pro with
    32G of RAM and 3T of disk. I think the numbers are interesting in and of themselves even before I start discoursing about
    benchmarking and filesystems and disks and so on.</p>
                <code style="font-size: 125%;">
                    <nobr>               -------Sequential Output--------- ---Sequential Input--- --Random--</nobr>
                    <nobr>               -Per Char- --Block---  -Rewrite-- -Per Char-  --Block--- --Seeks---</nobr>
                    <nobr>Machine     GB M/sec %CPU M/sec %CPU  M/sec %CPU M/sec %CPU  M/sec %CPU  /sec %CPU</nobr>
                    <nobr>MBP-M2-32G  64  56.9 99.3  3719 89.0   2772 83.4  59.7 99.7   6132 88.0 33613 33.6</nobr>
                </code>
                <p>Bonnie says:</p>
                <ol>
                    <li>
                        <p>This puppy can write 3.7 GB/second to a file, and read it back at 6.1GB/sec.</p>
                    </li>
                    <li>
                        <p>It can update a file in place at 2.8 GB/sec.</p>
                    </li>
                    <li>
                        <p>It can seek around randomly in a 64GB file at 33K seeks/second.</p>
                    </li>
                    <li>
                        <p>Single-threaded sequential file I/O is almost but not quite CPU-limited.</p>
                    </li>
                </ol>
                <p>I wonder: Are those good numbers for a personal computer in 2024? I genuinely have no idea.</p>
                <h2 id="p-4">Bonnie</h2>
                <p>
                    I will shorten the story, because it’s long. In 1988 I was an employee of the University of Waterloo, working on the
                    <a href="https://cs.uwaterloo.ca/~fwtompa/newoed-project.html">New Oxford English Dictionary Project</a>
                    . The computers we were
    using typically had 16MB or so of memory (so the 
    computer I’m typing this on has two thousand times as much) and the full text of the
                    <cite>OED</cite>
                    occupied 572MB. Thus, we
    cared really a lot about I/O performance. Since the project was shopping for disks and computers I bashed out Bonnie in a couple
    of afternoons.
                </p>
                <p>
                    I revised it lots over the years, and
                    <a href="https://en.wikipedia.org/wiki/Russell_Coker">Russell Coker</a>
                    made an excellent fork called Bonnie++ that (for a while
    at least) was more popular than Bonnie. Then I made my own major revision at some point called Bonnie-64.
                </p>
                <p>
                    In 1996,
                    <a href="https://www.linux.co.cr/free-unix-os/review/1996/0413.html">Linux Torvalds recommended Bonnie</a>
                    , calling it a “reasonable
    disk performance benchmark”.
                </p>
                <p>
                    That’s all I’m going to say here. If for some weird reason you want to know more, Bonnie’s quaint Nineties-flavor
                    <a href="https://textuality.com/bonnie/">home</a>
                    and
                    <a href="https://textuality.com/bonnie/intro.html">description</a>
                    pages are still there, plus this blog has
                    <a href="https://www.google.com/search?as_q=bonnie&amp;hl=en&amp;ie=UTF-8&amp;btnG=Google%2BSearch&amp;as_qdr=all&amp;as_occt=any&amp;as_dt=i&amp;as_sitesearch=tbray.org">documented
    Bonnie’s twisty history</a>
                    quite thoroughly. And explored, I claim, filesystem-performance issues in a useful way.
                </p>
                <p>I will address a couple of questions here, though.</p>
                <h2 id="p-1">Do filesystems matter?</h2>
                <p>
                    Many performance-sensitive applications go to a lot of work to avoid reading and/or writing filesystem data on their critical
    path. There are lots of ways to accomplish this, the most common being to stuff everything into memory using Redis or Memcached
    or, well, those two dominate the market, near as I can tell. Another approach is to have the data in a file but access it with
                    <a href="https://en.wikipedia.org/wiki/Mmap">mmap</a>
                    rather than filesystem logic. Finally, since real disk hardware reads and
    writes data in fixed-size blocks, you could arrange for your code to talk straight to the disk, entirely bypassing
    filesystems. I’ve never seen this done myself, but have heard tales of major commercial databases doing so.
                </p>
                <p>I wonder if anyone has ever done a serious survey study of how the most popular high-performance data repositories,
    including Relational, NoSQL, object stores, and messaging systems, actually persist the bytes on disk when they have to?</p>
                <p>I have an opinion, based on intuition and having seen the non-public inside of several huge high-performance systems at previous
    employers that, yes, filesystem performance still matters. I’ve no way to prove or even publicly support that intuition.
    But my bet is that benchmarks like Bonnie are still relevant.</p>
                <p>I bet a few of the kind of people who read this blog similarly have intuitions which, however, might be entirely different
    than mine. I’d like to hear them.</p>
                <h2 id="p-5">What’s a “disk”?</h2>
                <p>There is a wide range of hardware and software constructs which are accessed through filesystem semantics. They have wildly
    different performance envelopes. If I didn’t have so many other hobbies and projects, it’d be fun to run Bonnie on a sample of
    EC2 instance types with files on various EBS and EFS and so on configurations.</p>
                <p>For the vast majority of CPU/storage operations in the cloud, there’s at least one network hop involved.
    Out there in the real world, there is still really a lot of NFS in production.
    None of these things are much like that little SSD slab in my laptop. Hmmm.</p>
                <h2 id="p-7">Today’s benchmarks</h2>
                <p>I researched whether some great-great-grandchild of Bonnie was the new hotness in filesystem benchmarking, adopting the methodology
    of typing “filesystem benchmark” into Web search.  The results were disappointing; it doesn’t seem like this is a thing people
    do a lot. Which would suggest that people don’t care about filesystem performance that much? Which I don’t believe. Puzzling.</p>
                <p>
                    Whenever there was a list of benchmarks you might look at, Bonnie and Bonnie++ were on that list. Looks to me like
                    <a href="https://www.iozone.org">IOZone</a>
                    gets the most ink and is thus probably the “industry-leading” benchmark. But I
    didn’t really turn up any examples of quality research comparing benchmarks in terms of how useful the results
    are.
                </p>
                <h2 id="p-8">Those Bonnie numbers</h2>
                <p>The biggest problem in benchmarking filesystem I/O is that Linux tries really hard to avoid doing it, aggressively
    using any spare memory as a filesystem cache. This is why serving static Web traffic out of the filesystem often remains a good
    idea in 2024; your server will take care of caching the most heavily fetched data in RAM without you having to do cache
    management, which everyone knows is hard.</p>
                <p>I have read of various cache-busting strategies and have never really been convinced that they’ll outsmart this aspect of
    Linux, which was written by people who are way smarter and know way more than I think I do. So Bonnie has always used
    a brute-force approach: Work on a test file which is much bigger than main memory, so Linux has to do at least some real
    I/O. Ideally you’d like it to be several times the memory size.</p>
                <p>But this has a nasty downside. The computer I’m typing on has 32GB of memory, so I ran Bonnie with a 64G filesize
    (128G would have been better) and it took 35 minutes to finish.
    I really don’t see any way around this annoyance but I guess it’s not a fatal problem.</p>
                <p>Oh, and those numbers: Some of them look remarkably big to me. But I’m an old guy with memories of how we had to move the
    bits back and forth individually back in the day, with electrically-grounded tweezers.</p>
                <h2 id="p-10">Reiser again</h2>
                <p>I can’t remember when this was, but some important organization was doing an evaluation of filesystems for inclusion in a
    big contract or standard or something, and so they benchmarked a bunch, including ReiserFS. Bonnie was one of the benchmarks.</p>
                <p>Bonnie investigates the rate at which programs can seek around in a file by forking off three child processes that do a bunch
    of random seeks, read blocks, and occasionally dirty them and write them back. You can see how this could be stressful for
    filesystem code, and indeed, it occasionally made ReiserFS misbehave, which was noted by the organization doing the
    benchmarking.</p>
                <p>Pretty soon I had email from Reiser claiming that what Bonnie was doing was actually violating the contract specified for the
    filesystem API in terms of concurrent write access. Maybe he was right? I can’t remember how the conversation went, but he
    annoyed me and in the end I don’t think I changed any code.</p>
                <h2 id="p-9">Here’s Bonnie</h2>
                <p>
                    At one time Bonnie was on SourceForge, then Google Code, but I decided that if I were going to invest effort in writing this
    blog, it should be on GitHub too, so
                    <a href="https://github.com/timbray/Bonnie-64">here it is</a>
                    . I even filed a couple of bugs against it.
                </p>
                <p>I make no apologies for the rustic style of the code; it was another millennium and I was just a kid.</p>
                <p>I cheerfully admit that I felt a warm glow checking in code originally authored 36 years ago.</p>
            </div>
        </content>
    </entry>
</feed>
Raw text
<?xml version='1.0' encoding='UTF-8'?>
<feed xmlns='http://www.w3.org/2005/Atom'
      xmlns:thr='http://purl.org/syndication/thread/1.0'
      xml:lang='en-us'>
 <title>ongoing by Tim Bray</title>
 <link rel='hub' href='http://pubsubhubbub.appspot.com/' />
 <id>https://www.tbray.org/ongoing/</id>
 <link href='https://www.tbray.org/ongoing/' />
 <link rel='self' href='https://www.tbray.org/ongoing/ongoing.atom' />
 <link rel='replies'       thr:count='101'       href='https://www.tbray.org/ongoing/comments.atom' />
 <logo>rsslogo.jpg</logo>
 <icon>/favicon.ico</icon>
 <updated>2025-04-01T08:11:09-07:00</updated>
 <author><name>Tim Bray</name></author>
 <subtitle>ongoing fragmented essay by Tim Bray</subtitle>
 <rights>All content written by Tim Bray and photos by Tim Bray Copyright Tim Bray, some rights reserved, see /ongoing/misc/Copyright</rights>
 <generator uri='/misc/Colophon'>Generated from XML source code using Perl, Expat, Emacs, Mysql, Ruby, Java, and ImageMagick.  Industrial-strength technology, baby.</generator>

<entry>
 <title>Latest Music (feat. Qobuz)</title>
 <link href='https://www.tbray.org/ongoing/When/202x/2025/03/27/Music-Plus-Qobuz' />
 <link rel='replies'        thr:count='6'        type='application/xhtml+xml'        href='/ongoing/When/202x/2025/03/27/Music-Plus-Qobuz#comments' />
 <id>https://www.tbray.org/ongoing/When/202x/2025/03/27/Music-Plus-Qobuz</id>
 <published>2025-03-27T12:00:00-07:00</published>
 <updated>2025-03-27T16:50:41-07:00</updated>
 <category scheme='https://www.tbray.org/ongoing/What/' term='Arts/Music' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='Arts' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='Music' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='The World/Life Online' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='The World' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='Life Online' />
 <summary type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>I’ve written a lot about ways of listening to music; in the current decade about     <a href='/ongoing/When/202x/2021/07/17/Music-Notes'>liking YouTube Music</a> but then about     <a href='/ongoing/When/202x/2024/03/10/Play-My-Music'>de-Googling</a>. What’s new is that I’m spending most of my time with     <a href='https://www.plex.tv/en-ca/plexamp/'>Plexamp</a> and     <a href='https://www.qobuz.com/'>Qobuz</a>. The trade-offs are complicated</div></summary>
<content type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>
    <p>I’ve written a lot about ways of listening to music; in the current decade about
    <a href="/ongoing/When/202x/2021/07/17/Music-Notes">liking YouTube Music</a> but then about
    <a href="/ongoing/When/202x/2024/03/10/Play-My-Music">de-Googling</a>. What’s new is that I’m spending most of my time with
    <a href="https://www.plex.tv/en-ca/plexamp/">Plexamp</a> and
    <a href="https://www.qobuz.com/">Qobuz</a>. The trade-offs are complicated.</p>
    <h2 id='p-1'>YouTube Music</h2>
    <p>I liked YTM because:</p>
    <ol>
      <li><p>It let me upload my existing ten thousand tracks or so, which include many oddities that aren’t on streamers.</p></li>
      <li><p>It did a good job of discovering new artists for me.</p></li>
      <li><p>The Android Auto integration lets me say “Play Patti Smith” and it just does the right thing.</p></li>
    </ol>
    <p>But the artist discovery has more or less ran out of gas. I can’t remember the last time I heard something new that made me
    want more, and when I play “My Supermix”, it seems to always be the same couple of dozen songs, never anything good
    and new.</p>
    <p>Also: Bad at classical.</p>
    <p>I think I might keep on paying for YTM for the moment, because I really like to watch live concerts before I go to bed, and
    it seems like YTM subscribers never see any ads, which is worth something.</p>
    <img src="https://www.tbray.org/ongoing/When/202x/2025/03/27/Plexamp.png" alt="Plexamp" />
    <h2 id='p-2'>Plexamp</h2>
    <p>I wrote up what it does in that <a href="/ongoing/When/202x/2024/03/10/Play-My-Music">de-Googling</a> link. Tl;dr: Runs a
    server on a Mac Mini at home and lets me punch through to it from anywhere in the world.
    I’ve been
    listening to it a lot, especially in the car, since YTM got boring.</p>
    <p>My back inventory of songs contains many jewels from CDs that I bought and loved
    in like 1989 or 2001 and subsequently forgot all about, and what a thrill when one of them lights up my day.</p>
    <p>I still feel vaguely guilty that I’m not paying Plex anything, but on the other hand what I’m doing costs them peanuts.</p>
    <p>But, I still want to hear new stuff.</p>
    <img src="https://www.tbray.org/ongoing/When/202x/2025/03/27/Qobuz.png" alt="Qobuz" />
    <h2 id='p-4'>Qobuz</h2>
    <p>I vaguely knew it was out there among the streamers, but I got an intense hands-on demonstration recently while
    <a href="/ongoing/When/202x/2025/03/07/Totem-Tribe-Tower">shopping for new speakers</a>; Phil at audiofi pulled up all my
    good-sound demo tracks with a couple of taps each, in what was apparently CD quality. Which opened my eyes.</p>
    <p>What I like about Qobuz:</p>
    <ol>
      <li><p>It pays artists more per stream than any other service, by a wide margin.</p></li>
      <li><p>It seems to have as much music as anyone else.</p></li>
      <li><p>It’s album-oriented, and I appreciate artists curating their own music.</p></li>
      <li><p>Classical music is a first-class citizen.</p></li>
      <li><p>While it doesn’t have an algorithm that finds music it thinks I’ll like, it is actively curated and they highlight new
      music regularly, and pick a “record of the week”. This week’s, for example, is <cite>For Melancholy Brunettes (&amp; Sad
      Women)</cite> by <a href="https://japanesebreakfast.rocks">Japanese Breakfast</a>. It’s extremely sweet stuff, maybe a little
      too low-key for me, but I still enjoyed it. They’re coming to town, I might go.</p></li>
      <li><p>This isn’t the only weekly selection that I’ve enjoyed.  Qobuz gives evidence of being built by people who love
      music.</p></li>
    </ol>
    <p>What don’t I like about Qobuz? The Mac app is kinda dumb, I sometimes can’t figure out how to do what I want, and for the
    life of me I can’t get it to show a simple full-screen display about the current song. But the Android app works OK.</p>
    <p>As for Qobuz’s claim to offer “Hi-Res” (i.e. better than CD) sound, meh.  I’m not convinced that this is actually
    audible and if it in principle were, I suspect that either my ears or my stereo would be a more important limiting factor.</p>
    <h2 id='p-3'>Records!</h2>
    <p>Yep, I still occasionally drop the needle on the vinyl on the turntable, and don’t think I’ll ever stop.</p>
    <h2 id='p-5'>And a reminder</h2>
    <p>If you really want to support artists, buy concert tickets. That thrill isn’t gone at all.</p>
</div></content></entry>

<entry>
 <title>Long Links</title>
 <link href='https://www.tbray.org/ongoing/When/202x/2025/03/17/Long-Links' />
 <link rel='replies'        thr:count='1'        type='application/xhtml+xml'        href='/ongoing/When/202x/2025/03/17/Long-Links#comments' />
 <id>https://www.tbray.org/ongoing/When/202x/2025/03/17/Long-Links</id>
 <published>2025-03-17T12:00:00-07:00</published>
 <updated>2025-03-18T13:37:59-07:00</updated>
 <category scheme='https://www.tbray.org/ongoing/What/' term='The World' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='The World' />
 <summary type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>This will be the 30th “Long Links” post. The frequency has fallen off over the years; perhaps my time for long-form pieces     has decreased or, just as likely, I protect my sanity in these dark days by consuming less. No, I don’t filter out Fascist     Craziness, because it’s a thing that needs to be understood to be resisted. Thus, today’s Long Links does contain     “the world is broken” pieces.” But not only; there’s good news here too, including fine typography and music</div></summary>
<content type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>
    <p>This will be the 30th “Long Links” post. The frequency has fallen off over the years; perhaps my time for long-form pieces
    has decreased or, just as likely, I protect my sanity in these dark days by consuming less. No, I don’t filter out Fascist
    Craziness, because it’s a thing that needs to be understood to be resisted. Thus, today’s Long Links does contain
    “the world is broken” pieces.” But not only; there’s good news here too, including fine typography and music.</p>
    <p>Let’s start with music.</p>
    <h2 id='p-1'>Music</h2>
    <p>“<a href="https://www.bachvereniging.nl/en/allofbach">All of Bach</a> is a project of the Netherlands Bach Society with the
    aim to perform and record all of Bach's works and share them online with the world for free.” The project
    <a href="https://www.youtube.com/bach?app=desktop">manifests on YouTube</a>
    and I have spent a <em>lot</em> of hours enjoying it.  The performances are all competent and while I disagree with an
    artistic choice here or there, I also think that many of these are triumphs.</p>
    <p>One such triumph, and definitely a <em>Long</em> link, is Bach’s last work,
    <a href="https://www.youtube.com/watch?v=N6sUlZa-IrU">The Art of Fugue, BWV 1080</a>.
    Bach didn’t say which order the many parts of the piece should be performed in, or what instruments should be used, so
    there’s a lot of scope for choice and creativity in putting together a performance. This one is by
    <a href="https://en.wikipedia.org/wiki/Shunsuke_Sato">Shinsuke Sato</a>,  the maestro of
    the Netherlands Bach Society. It is clever, unfancy, and its ninety or so minutes are mostly
    exquisite.</p>
    <p>Vi Hart, mathemusician is now a Microsoftie, but has been one of my intellectual heroes. Get a comfy chair and pull up
    <a href="https://vimeo.com/147902572">Twelve Tones</a>, which addresses profound themes with a combination
    of cynicism, fun, music, and laserbats. You will need a bit of basic music literacy and intellectual flexibility, but
    you’ll probably end up smarter.</p>
    <h2 id='p-2'>IsraPal</h2>
    <p>On the “everything is broken” front, Israel/Palestine looms large. Here are two <cite>New York Times</cite> gift links that
    face the ugliness with clear eyes. First,
    <a href="https://www.nytimes.com/2025/03/16/opinion/no-other-land-documentary-israel-gaza.html?unlocked_article_code=1.4k4.o0wv.bClPYg9XEiXZ&amp;smid=url-share">‘No Other Land’ Won an Oscar. Many People Hope You Don’t See It</a>
    is what the title says.
    Second, it’s bad that criticism of Israel has become Thoughtcrime, and worse when 
    <a href="https://www.nytimes.com/2025/03/12/us/yale-suspends-scholar-terrorism.html?unlocked_article_code=1.4k4.OkaX.8zwOCZfLcDt5&amp;smid=url-share">AI
    is weaponized to look for it</a>.</p>
    <h2 id='p-3'>Tchaikovsky Opera</h2>
    <p><a href="https://en.wikipedia.org/wiki/Adrian_Tchaikovsky">Adrian</a> not Pyotr, I mean, and space opera not musical costume drama.  
    In particular, 
    <a href="https://www.adriantchaikovsky.com/the-final-architects-shards-of-earth-eyes-of-the-voice-by-adrian-tchaikovsky.html#shards">The
    Final Architecture</a> series. It’s ultra-large-scale space opera in three big fat volumes. I would say it’s mining the same
    vein as <cite>The Expanse</cite> and while it didn’t hit me nearly as hard as that did, it’s fun, will keep you turning
    pages.</p>
    <h2 id='p-4'>Photography</h2>
    <p>I’m a photography enthusiast and as a side-effect am gloomy about pro photogs’ increasing difficulty in making
    a living. I also buy a lot of stuff online. For both these reasons,
    <a href="https://petapixel.com/2025/03/06/what-whitewalls-new-shopify-integration-means-to-photographers/">What WhiteWall’s New
    Shopify Integration Means to Photographers</a> caught my eye. First of all, it’s generally cool that someone’s offering a
    platform to help photogs get online and sell their wares.</p>
    <p>Second, I can’t help but react to Shopify’s involvement. This gets complicated. First of all, Shopify is Canadian, yay. But,
    CEO Tobi Lütke is a MAGA panderer and invites wastrels like Breitbart onto the platform. And having said all that, speaking as a
    regular shopper, the Shopify platform is freaking excellent.</p>
    <p>Whenever I’m on a new online merchant and I see their
    distinctive styling around the “Proceed to payment” button, I know this thing is gonna Just Work.  A lot of times, once I’ve
    typed in my email address, it says “OK, done”, because it shares my payment data from merchant to merchant. Occasionally
    it’ll want me to re-authenticate or send a security code to my phone or or whatever.</p>
    <p>If I were setting up an online store to
    sell anything, that’s what I’d use. I mean, I’d hold my nose and let the company know that they need to fire their CEO for
    treason, but it’s still what I’d probably use.</p>
    <p>Speaking of photography, I’ve repeatedly written about “C2PA”, see
    <a href="/ongoing/When/202x/2023/10/28/C2PA-Workflows">On C2PA</a> and
    <a href="/ongoing/When/202x/2024/10/29/Lane-Provenance">C2PA Progress</a>. I’m not going to explain once again what it is, but
    for those who know and care, it looks like
    <a href="https://www.dpreview.com/news/6352280282/sony-content-authenticity-system-not-just-for-pro-cameras-anymore">Sony is
    doubling down on it</a>, yay Sony!</p>
    <h2 id='p-5'>Vancouver</h2>
    <p>Vancouver residents who know the names “Concord Pacific” or “Terry Hui”, or who have
    <a href="https://www.falsecreekfriends.org">feelings about False Creek</a>, will
    probably enjoy
    <a href="https://thetyee.ca/News/2025/03/03/Terry-Hui-Hole-Vancouver-Heart/">Terry Hui’s Hole in Vancouver’s Heart</a>. You will
    have noticed some of the fragments of this bit of history going by, but Geoff Meggs puts it all together on a large vivid canvas
    that will you better informed and probably somewhat mind-boggled.</p> 
    <h2 id='p-6'>Let’s talk about TV!</h2>
    <p>By which I mean a video screen used recreationally.
    Check out Archimago’s
    <a href="https://archimago.blogspot.com/2025/03/hdmi-musings-high-speed-cables-data.html">HDMI Musings: high speed cables, data
    rates, YCbCr color subsampling, Dolby Vision MEL/FEL, optical cables and +5V injection</a>. Yes, that’s a long title, and it’s a
    substantial piece, because HDMI is increasingly how you connect any two video-centric pieces of technology.</p>
    <p>From which I quote:
    “This recent update makes HDMI the fastest of all currently-announced consumer Audio-Video connection standards, the one wire
    that basically does it all”. I’m not going to try to summarize, but if you plow through this one you’ll know a lot more about
    those black wires all over your A/V setup. There’s lots of practical advice; it turns out that if you’re going to run an HDMI
    cable further than about two meters, certification matters.</p>
    <h2 id='p-7'>Life online</h2>
    <p>Where do people learn about the world from? The Pew Research Center investigated and published
    <a href="https://www.pewresearch.org/journalism/fact-sheet/social-media-and-news-fact-sheet/">Social Media and News Fact
    Sheet</a>. I suspect the results will surprise few of you, but it’s nice to have quantitative data. I would hope that a
    similar study, done next year not last year, would include decentralized social media, which this doesn’t.</p> 
    <p>I know that Ed Zitron’s
    <a href="https://www.wheresyoured.at/never-forgive-them/">Never Forgive Them</a> went viral, and I bet a lot of you saw it go
    by, or even started reading then left it parked in a tab you meant to get back to, because it’s so long.  Yeah; it’s arguably too
    long and too shrill, but on the other hand it is full of truth and says important things I’ve not seen elsewhere.</p>
    <p>For example, I
    suspect most people reading this are angry about the ubiquitous enshittification of the online, but Zitron points out that
    people like us suffer much less because we have the money and the expertise to dodge and filter and route around a lot of the
    crap. Zitron actually purchased one of the most popular cheap Windows PCs<span class='dashes'> —</span> the kind of device
    ordinary people can afford<span class='dashes'> —</span> and reports from the front lines of what is in part a class war.
    The picture is much worse than you thought it was.</p>
    <p>Here are a few bangers:<br/>“It isn’t that you don’t ’get‘ tech, it’s that the tech you use every day is no longer built for
    you, and as a result feels a very specific kind of insane.”
    <br/>“almost every single interaction with technology, which is <em>required</em> to live in modern society, has become actively
    adversarial to the user”.
    <br/>“The average person’s experience with technology is one so aggressive and violative that I believe it
    leaves billions of people with a consistent low-grade trauma.”</p>
    <h2 id='p-8'>Publishing tech</h2>
    <p>It’s where I got my start. Two of the most important things are typography and color. And there’s good news!</p>
    <p>The Braille Institute offers
    <a href="https://www.brailleinstitute.org/freefont/">Read Easier With Our Family of Hyperlegible™ Fonts</a>, which begins “Is
    this font easy for you to read? Good—that’s the idea.” Like! Would use. And in an era where the Web is too much infested
    by teeny-tiny low-contrast typography, it’s good to have alternatives.</p>
    <p>Now, as for color: It is a sickeningly complex subject, both at the theory level and in the many-layered stack of models and
    equations and hardware and software that cause something to happen on a screen that your brain perceives as color.
    Bram Cohen, best-known for inventing BitTorrent, has been digging in, and gives us
    <a href="https://bramcohen.com/p/color-theory">Color Theory</a> and 
    <a href="https://bramcohen.com/p/a-simple-color-palette">A Simple Color Palette</a>. I enjoyed them.</p>
    <h2 id='p-9'>Geekery</h2>
    <p>If you know what “IPv6” is, then Geoff Huston’s <a href="https://www.potaroo.net/ispcol/2024-10/ipv6-transition.html">The IPv6
    Transition</a> will probably interest you. Tl;dr: Don’t hold your breath waiting for an all-IPv6 Internet.</p>
    <p>And, much as I’d like to, it’s difficult to avoid AI news. So here is plenty, from Simon Willison, who has no AI axe to grind nor
    product to sell:     <a href="https://simonwillison.net/2024/Dec/31/llms-in-2024/">Things we learned about LLMs in 2024</a>.</p>
    <h2 id='p-10'>Business</h2>
    <p>I can testify from personal experience that Andy Jassy is an extremely skilled manager, but I found
    <a href="https://www.cnbc.com/amp/2024/12/15/amazon-and-the-endangered-future-of-the-middle-manager.html">Amazon and the
    endangered future of the middle manager</a>, from CNBC, unconvincing. The intro: “Jassy's messaging on an increased ratio of
    individual contributors to managers raises a much bigger question about organizational structure: What is the right balance
    between individual workers and managers in overall headcount?” There’s talk of laying off many thousands of
    managers.</p>
    <p>Before I worked at Amazon I was at Google, which has a much higher IC/manager ratio. Teams of 20 were not uncommon, and as a
    result, there was both a manager and a Tech Lead, which meant the manager was basically an HR droid.  Amazon always insisted
    that the manager sweat the details of what their team was working on, deeply understand the issues they were facing and what
    they were building. I don’t see how that’s compatible with increasing the ratio.</p>
    <p>And, Google management was <em>way</em> weaker than Amazon’s, not even close. So I’d have to say that the evidence is against
    Andy on this one.</p>
    <h2 id='p-11'>Art island</h2>
    <p>Japan has one. It’s called 
    <a href="https://www.japan.travel/en/spot/220/">Naoshima</a>. Great idea. I’d go.</p>
</div></content></entry>

<entry>
 <title>Totem Tribe Towers</title>
 <link href='https://www.tbray.org/ongoing/When/202x/2025/03/07/Totem-Tribe-Tower' />
 <link rel='replies'        thr:count='6'        type='application/xhtml+xml'        href='/ongoing/When/202x/2025/03/07/Totem-Tribe-Tower#comments' />
 <id>https://www.tbray.org/ongoing/When/202x/2025/03/07/Totem-Tribe-Tower</id>
 <published>2025-03-07T12:00:00-08:00</published>
 <updated>2025-03-12T10:55:12-07:00</updated>
 <category scheme='https://www.tbray.org/ongoing/What/' term='Technology/Audio' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='Technology' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='Audio' />
 <summary type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>I bought new speakers. This story combines beautiful music with advanced analogue technology and nerdy obsession. Despite     which, many of you are not fascinated by high-end audio; you can leave now.     Hey, this is a blog, I get to write about what excites me.     The seventeen of you who remain will probably enjoy the deep dive</div></summary>
<content type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>
    <p>I bought new speakers. This story combines beautiful music with advanced analogue technology and nerdy obsession. Despite
    which, many of you are not fascinated by high-end audio; you can leave now.
    Hey, this is a blog, I get to write about what excites me.
    The seventeen of you who remain will probably enjoy the deep dive. </p>
    <img src="https://www.tbray.org/ongoing/When/202x/2025/03/07/PXL_20250308_205849091.png" alt="Totem Tribe Towers" />
    <div class='caption'><p>Totem Tribe Tower loudspeakers, standing on a subwoofer.<br/>This picture makes them look
    bigger than they really are. They come in black or white, satin or gloss finish. 
    <br/>Prettier with the grille on, I think.</p></div>
    <h2 id='p-2'>Why?</h2>
    <p>My
    <a href="/ongoing/When/200x/2006/03/02/Totem#p-3">main speakers</a> were 22 years old, bore scars from toddlers (now grown) and
    cats (now deceased).
    While they still sounded beautiful, there was loss of precision.  They’d had a good run.</p>
    <h2 id='p-8'>Speakers matter</h2>
    <p>Just in the last year, I’ve become convinced, and argued here, that both
    <a href="/ongoing/When/202x/2023/06/03/Parasound-Halo-P-6#p-5">DACs</a> and
    <a href="/ongoing/When/202x/2024/09/09/Next-Step-Audiophile">amplifiers</a> are pretty well solved problems, that there’s no
    good reason to spend big money on them, and that you should focus your audio investments on speakers and maybe room
    treatment. So this purchase is a big deal for me.</p>
    <h2 id='p-1'>How to buy?</h2>
    <p>The number of boutique speaker makers, from all over the world, is mind-boggling; check out
    <a href="https://www.stereophile.com/content/recommended-components-fall-2024-edition-loudspeakers">the <cite>Stereophile</cite>
    list</a> of recommendations. Here’s the thing: Pretty well all of them sound wonderful. (The speakers I bought haven’t
    been reviewed by <cite>Stereophile</cite>.)</p>
    <p>So there are too many options. Nobody could listen to even a small proportion of them, at any price
    point.  Fortunately, I had three powerful filters to narrow down the options. The
    speakers had to (1) look nice, and (2) be Canadian products, probably (3) from
    <a href="https://totemacoustic.com">Totem Acoustic</a>.</p>
    <h2 id='p-3'>Decor?</h2>
    <p>I do not have, nor do I want, a man-cave. I’ve never understood the concept.</p>
    <p>And you have to be careful. There are high-end speakers, some very well-reviewed, with design sensibilities right out of
    <cite>Mad Max</cite> or <cite>Brazil</cite>. And then a whole bunch that are featureless rectangles with drivers on the
    front.</p>
    <p>Ours have to live in a big media alcove just off the kitchen; they are shared by
    the pure-audio system and
    <a href="/ongoing/When/202x/2024/11/11/TV-land">the huge TV</a>.  The setup has to please the eyes of the whole family.</p>
    <h2 id='p-4'>Canadian?</h2>
    <p>At this point in time, a position of “from anywhere but the US, the malignant force threatening our sovereignty” would be
    unsurprising in a Canadian.  But there are unsentimental reasons, too.  It turns out Canadian speaker makers have had an
    advantage stretching back many decades.</p>
    <p>This is mostly due to the work of
    <a href="https://www.torontoaes.org/floyd-toole/">Floyd
    Toole</a>, electrical engineer and acoustician, once an employee of Canada’s National Research Council, who built an anechoic chamber
    at the NRC facility, 
    <a href="https://en.wikipedia.org/wiki/Audio_system_measurements#Unquantifiable?">demonstrated that humans can reliably
    detect differences in speaker accuracy</a>, and made his facility available to commercial speaker builders. So there have been
    quite a few good speakers built up here over the years.</p>
    <h2 id='p-5'>Totem?</h2>
    <p>What happened was, in 1990 or so I went to an audio show down East somewhere and met Vince Bruzzese, founder of Totem
    Acoustic, who was showing off his then-brand-new “Model One” speakers. They were small, basic-black, and entirely melted my
    heart playing a Purcell string suite. They
    <a href="https://totemacoustic.com/product/signature-one/">still sell them</a>, I see.
    Also, the Totem exhibit was having a quiet spell so there was time to talk, and it turned out that Bruzzese and I liked a lot of the
    same music.</p> 
    <p>So I snapped up the Model Ones and that same set is still sounding beautiful over at our cabin. And every speaker I’ve bought in the
    intervening decades has come from Totem or from PSB, another excellent Toole-influenced Canadian shop. I’ve also met and conversed
    with Paul Barton, PSB’s founder and main brain. Basically, there’s a good chance that I’ll like anything Vince or
    Paul ship.</p>
    <p>My plan was to give a listen to those two companies’ products. A cousin I’d visited last year had big recent PSB speakers and
    I liked them a whole lot, so they were on my menu. But PSB seems to have given up on audio dealers, want to
    <a href="https://www.psbspeakers.com/ca/speakers/tower">sell online</a>.
    Huh?! Maybe it’ll work for them, but it doesn’t work for me.</p>
    <p>So I found a local Totem dealer;
    <a href="https://audiofi.ca">audiofi</a> in Mount Pleasant.</p>
    <h2 id='p-6'>Auditioning</h2>
    <p>For this, you should use some of your most-listened-to tracks from your own collection. I took my computer along for
    that purpose, but it turned out that
    <a href="https://www.qobuz.com/ca-en/discover">Qobuz</a> had ’em all. (Hmm, maybe I should look closer at Qobuz.)</p>
    <p>Here’s what was on my list. I should emphasize that, while I like all these tracks, they’re not terribly representative of
    what I listen to. They’re selected to stress out a specific aspect of audio reproduction. The Americana and Baroque and Roots
    Rock that I’m currently fixated on are pretty easy to reproduce.</p> 
    <ul>
      <li><p><cite>200 More Miles</cite> from the Cowboy Junkies’ <cite>Trinity Session</cite>. Almost any track from this record
      would do; they recorded with a single ambiphonic microphone and any competent setup should make it feel like you’re in the
      room with them. And Margo’s singing should make you want to cry.</p></li>
      <li><p><cite>The Longships</cite>, from Enya’s <cite>Watermark</cite> album.  This is a single-purpose test for low bass. It
      has these huge carefully-tuned bass-drum whacks that just vanish on most speakers without extreme bass extension, and the music makes
      much less sense without them. You don’t have to listen to the whole track; but it’s fine music, Enya was really on her game
      back then.</p></li>
      <li><p>The opening of Dvořák’s Symphony #9, “From the New World”. There are plenty of good recordings, but I like Solti
      and the Chicago Symphony. Dvořák gleefully deploys jump-scare explosions of massed strings and other cheap orchestration tricks
      in the first couple of minutes
      to pull you into the symphony. What I’m looking for is the raw
      physical shock of the first big full-orchestra entrance.</p></li>
      <li><p><cite>Death Don’t Have No Mercy</cite> from Hot Tuna’s <cite>Live At Sweetwater Two</cite>. Some of the prettiest slide
      guitar you’ll hear anywhere from Kaukonen, and magic muscle from Casady. And then Jorma’s voice, as comfortable as old shoes
      and full of grace. About three minutes in there’s an instrumental break and you want to hear the musical lines dancing around
      each other with no mixups at all.</p></li>
      <li><p>First movement of Beethoven’s Sonata #23, “Appassionata”, Ashkenazy on London. Pianos are very difficult; two little
      speakers have a tiny fraction of the mass and vibrating surface of a big concert grand. It’s really easy for the sound to
      be on the one hand too small, or on the other all jumbled up. Ashkenazy and the London engineers do a fine job here; it really
      should sound like he’s sitting across the room from you.</p></li>
      <li><p><cite>Cannonball</cite>, the Breeders’ big hit.  It’s a pure rocker and a real triumph of arrangement and production,
      with lots of different guitar/keys/drum tones. You need to feel it in your gut, and the rock &amp; roll edge should be
      frightening.</p></li>
      <li><p><cite>Identikit</cite> from Radiohead’s <cite>A Moon Shaped Pool</cite>. This is mostly drums and voice, although
      there are eventually guitar interjections. It’s a totally artificial construct, no attempt to sound like live musicians
      in a real space. But the singing and drumming are fabulous and they need to be 100% separated in space, dancing without
      touching. And Thom Yorke in good voice had better make you shiver a bit.</p></li>
      <li><p><cite>Miles Runs The Voodoo Down</cite> from <cite>Bitches Brew</cite>. This is complex stuff, and Teo Macero’s
      production wizardry embraces the complexity without losing any of that fabulous band’s playing. Also Miles plays two of the
      greatest instrumental solos ever recorded, any instrument, any genre, and one or two of the ascending lines should feel like
      he’s pulling your whole body up out of your chair.</p></li>
      <li><p>Emmylou Harris. This would better be phrased as “Some singer you have strong emotional reactions to.” I listened to
      the title track and <cite>Deeper Well</cite> from the <cite>Wrecking Ball</cite> album. If a song that can make you feel that way doesn’t
      make you feel that way, try different speakers.</p></li>
    </ul>
    <h2 id='p-7'>The listening session</h2>
    <p>I made an appointment with Phil at Audiofi, and we spent much of an afternoon listening. I thought Audiofi was fine, would go
    back.  Phil was erudite and patient and not pushy and clearly loves the technology and music and culture.</p>
    <p>I was particularly interested in the
    <a href="https://totemacoustic.com/product/element-fire-v2/">Element Fire V2</a>, which has been creating buzz in online
    audiophile conversation. They’re “bookshelf” (i.e. stand-mounted) rather than floorstanders, but people keep saying they sound
    like huge tower speakers that are taller than you are. So I was predisposed to find them interesting, and I listened to maybe
    half of the list above.</p>
    <p>But I was unhappy, it just wasn’t making me smile. Sure, there was a stereo image, but at no point did I get a convincing
    musicians-are-right-over-there illusion. It was particularly painful on the Cowboy Junkies. It leapt satisfactorily out of the speakers
    on the Dvořák and was brilliant on <cite>Cannonball</cite>, but there were too many misses.</p>
    <p>Also, the longer I looked at it the less it pleased my eyes.</p>
    <p>“Not working, sorry. Let’s listen to something else” I said. I’d already noticed the Tribe Towers, which even though they were
    floorstanders, looked skinny and pointy compared to the Elements. I’d never read anything about them but they share the Element’s
    <a href="https://totemacoustic.com/totem-torrent-technology/">interesting
    driver technology</a>, and are cheaper.</p>
    <p>So we set them up and they absolutely aced everything the Elements had missed. Just vanished, I mean, and there was a
    three-dimensional posse of musicians across the room, filling the space with three-dimensional music.
    They flunked the Enya drum-thwack test but that’s OK because I have a
    subwoofer (from PSB) at home. In particular, they handled Ashkenazy pounding out the Beethoven just absolutely without effort.
    I’m not sure I’ve ever heard better piano reproduction.</p>
    <p>And the longer I looked at them the more my thinking switched from “skinny and pointy” to “slender and elegant”.</p>
    <p>A few minutes in and, I told Phil, I was two-thirds sold. He suggested I look at some
    <a href="https://www.magicoaudio.com">Magico</a> speakers but they were huge and like $30K; as an audiophile I’m only mildly
    deranged. And American, so no thanks.</p>
    <p>I went home to think about it.
    I was worried that I’d somehow been unfair to the Elements. Then I read the
    <a href="https://www.stereophile.com/content/totem-acoustic-element-fire-v2-loudspeaker"><cite>Stereophile</cite> review</a>,
    and while the guy who did the subjective listening test loved ’em, the
    <a href="https://www.stereophile.com/content/totem-acoustic-element-fire-v2-loudspeaker-measurements">lab measurements</a>
    seemed to show real problems.</p>
    <p>I dunno. Maybe that was the wrong room for them. Or the wrong amplifier. Or the wrong positioning. Or maybe they’re just a rare
    miss from Totem.</p>
    <p>My research didn’t turn up a quantitative take on the Tribes, just a lot of people writing that they sound much bigger than
    they really are, and that they were happy they’d bought them.</p>
    <p>And I’d been happy listening to them. So I pulled the trigger. My listening space is acoustically friendlier than the one at
    Audiofi and if they made me happy there, they’d make me happy at home.</p>
    <p>And they do. Didn’t worry too much about positioning, just made sure it was symmetric. The first notes they played were
    brilliant.</p>
    <h2 id='p-9'>But how does it sound?</h2>
    <p>See all those auditioning tracks up above, where it says what speakers “should” do?
    They do, that’s what they sound like.</p>
    <p>I’ve been a little short on sleep, staying up late to listen to music.</p>
    <h2 id='p-10'>Follow-up: Customer service</h2>
    <p>As noted above I have a subwoofer, and
    <a href="/ongoing/When/202x/2023/06/03/Parasound-Halo-P-6">my preamp</a> lets you configure where to roll off the bass going to
    the main speakers and hand off to the subwoofer. I wrote off to Totem’s customer-support email address wondering if they had any
    guidance on frequency.  They got back to me with specific advice, and another couple of things to double-check.</p>
    <p>High-end audio. Simpatico salespeople. The products last decades. The vendors answer emails from random customers. Businesses
    it’s still possible to like.</p>
</div></content></entry>

<entry>
 <title>Bye, Prime</title>
 <link href='https://www.tbray.org/ongoing/When/202x/2025/03/06/Canceled-Prime' />
 <link rel='replies'        thr:count='7'        type='application/xhtml+xml'        href='/ongoing/When/202x/2025/03/06/Canceled-Prime#comments' />
 <id>https://www.tbray.org/ongoing/When/202x/2025/03/06/Canceled-Prime</id>
 <published>2025-03-06T12:00:00-08:00</published>
 <updated>2025-03-07T09:24:15-08:00</updated>
 <category scheme='https://www.tbray.org/ongoing/What/' term='The World/Life Online' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='The World' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='Life Online' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='Business/Internet' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='Business' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='Internet' />
 <summary type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>Today I canceled my Amazon Prime subscription</div></summary>
<content type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>
    <p>Today I canceled my Amazon Prime subscription.</p>
    <img src="https://www.tbray.org/ongoing/When/202x/2025/03/06/end.png" alt="Amazon Prime canceled" />
    <h2 id='p-1'>Why?</h2>
    <p>As I wrote in
    <a href="/ongoing/When/202x/2020/07/23/Not-an-Amazon-Problem">Not an Amazon Problem</a> (and please go read that if you haven’t)
    I don’t see myself as an enemy of Amazon, particularly. I think the pressures of 21st-century capitalism have put every large
    company into a place where they really can’t afford to be ethical or the financial sector will rip them to shreds then
    replace the CEO with someone who will maximize shareholder return at all costs, without any of that amateurish “ethics” stuff.</p>
    <p>To the extent that Amazon is objectionable, it’s a symptom of those circumstances.</p>
    <p>I’m bailing out of Prime not to hurt Amazon, but because it doesn’t make commercial or emotional sense for me just now.</p>
    <h2 id='p-2'>Commercial?</h2>
    <p>Yes, free next-day delivery is pretty great. In fact, in connection with
    <a href="/ongoing/When/202x/2025/02/28/Moved">our recent move</a>, I’ve been ordering small cheap stuff
    furiously: 
    (USB cables, light switches, closet organizers, a mailbox, a TV mount, WiFi hubs, banana plugs, you name it).</p>
    <p>But the moving operations are mostly done, and there are few (any?) things we really need the next day, and we’re fortunate,
    living in the center of a 15-minute city. So getting my elderly ass out of my chair and going to a store is a good option, for
    more than one reason.</p>
    <p>Second, for a lot of things you want to order, the manufacturer has its own online store these days and a lot of them are
    actually well-built, perfectly pleasant to use.</p>
    <p>Third, Amazon’s prices aren’t notably cheaper than the alternatives.</p>
    <h2 id='p-3'>Emotional?</h2>
    <p>Amazon is an US corporation and the US is now hostile to Canada, repeatedly threatening to annex us. So I’m
    routing my shopping dollars 
    away from there generally and to Canadian suppliers specifically. Dumping Prime is an easy way to help that along.</p>
    <p>Second, shopping on Amazon for the kinds of small cheap things listed above is more than a little unpleasant. The
    search-results page is a battle of tooth and claw among low-rent importers. Also it’s just really
    freaking ugly, hurts my eyes to look at it.</p>
    <img src="https://www.tbray.org/ongoing/When/202x/2025/03/06/you-have-watched.png" alt="You have watched 29 shows/movies with Prime Video" />
    <div class='caption'><p>Really? I have no idea what they were.</p></div>
    <p>Finally, one of Prime’s big benefits used to be Prime Video, but no longer. There was
    just no excuse for greenlighting that execrable <cite>Rings of Power</cite> show, and I’m not aware of anything else I want to
    watch.</p>
    <p>Amazon is good at lots of things, but has never been known for good taste. I mean, look at that
    search-results page.</p>
    <img src="https://www.tbray.org/ongoing/When/202x/2025/03/06/are-you-sure.png" alt="Are you sure you want to end your membership?" />
    <div class='caption'><p>Yep.</p></div>
    <h2 id='p-4'>Is it easy?</h2>
    <p>Yep, no complaints. There were only two please-don’t-go begs and neither was offensive.</p>
    <p>No hard feelings.</p>
</div></content></entry>

<entry>
 <title>Moved</title>
 <link href='https://www.tbray.org/ongoing/When/202x/2025/02/28/Moved' />
 <link rel='replies'        thr:count='3'        type='application/xhtml+xml'        href='/ongoing/When/202x/2025/02/28/Moved#comments' />
 <id>https://www.tbray.org/ongoing/When/202x/2025/02/28/Moved</id>
 <published>2025-02-28T12:00:00-08:00</published>
 <updated>2025-03-01T11:42:05-08:00</updated>
 <category scheme='https://www.tbray.org/ongoing/What/' term='The World' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='The World' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='Arts/Photos' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='Arts' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='Photos' />
 <summary type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>It is traditional in this season in this space to tickle your eyes with pictures of our early spring crocuses, while gently     dunking a bit on our fellow Canadians who, away from the bottom left corner of the country, are still snowbound.  So,     here you go. Only not really</div></summary>
<content type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>
    <p>It is traditional in this season in this space to tickle your eyes with pictures of our early spring crocuses, while gently
    dunking a bit on our fellow Canadians who, away from the bottom left corner of the country, are still snowbound.  So,
    here you go. Only not really.</p>
    <img src="https://www.tbray.org/ongoing/When/202x/2025/02/28/PXL_20250227_204913037.png" alt="Crocuses on moss" />
    <p>Yes, those are this spring’s crocuses. But they’re not
    <em>our</em> crocuses, they’re someone else’s. We don’t have any. Because we moved.</p>
    <p>It’s a blog isn’t it? I’ve written up childbirths and pet news and vacations and all that stuff. So why not
    this?</p>
    <p>What happened was, we bought a house in 1996 and then, after 27 years and raising two kids and more cats, it
    was, well, not actually dingy, but definitely tired.  The floors. The paint. The carpet. The cupboards. So we started down two paths at
    once, planning for a major renovation on one side, and shopping for a new place on the other. Eighteen months later we hadn’t
    found anything to buy, and the reno was all planned and permitted and we were looking for rentals to camp out in.</p>
    <p>Then, 72 hours from when we were scheduled to sign the reno contract,  this place came on the market across our back alley and
    three houses over.
    The price was OK and it didn’t need much work and, well, now we live there.</p>
    <p>I’m sweeping a lot of drama under the rug. Banking drama and real-estate drama and insurance drama and
    floor-finishing drama and Internet-setup drama and A/V drama and storage drama. And of course moving drama. Month after month
    now, Lauren and I have ended more days than not exhausted.</p>
    <p>But here we are. And we’re not entirely without our plants.</p>
    <img src="https://www.tbray.org/ongoing/When/202x/2025/02/28/PXL_20241004_204715352.png" alt="Moving the rosebush" />
    <p>This is Jason of
    <a href="https://www.cycledrivengardening.biz">Cycle Driven Gardening</a>,who lent his expertise to moving our favorite
    rosebushes, whose history
    <a href="/ongoing/When/200x/2003/07/06/RoseTrip2">goes back decades</a>.
    Of course, there could be no guarantee that those old friends would survive the process.</p>
    <p>Today was unseasonably warm and our new back patio is south-facing, so we soaked up the sun and cleared it of leftover moving
    rubble. Then ventured into the back yard, much-ignored over winter.</p>
    <p>Each and every rosebush has buds peeking out. So it looks, Dear Reader, like I’ll be able to inflict still more blossom pictures
    on you, come spring.</p>
    <p>And we’ll be putting in crocuses, but those photos will have to wait twelve months or so.</p>
    <p>See, even in 2025, there are stories with happy endings.</p>
</div></content></entry>

<entry>
 <title>Safari Cleanup</title>
 <link href='https://www.tbray.org/ongoing/When/202x/2025/02/26/Safari-Cleanup' />
 <link rel='replies'        thr:count='11'        type='application/xhtml+xml'        href='/ongoing/When/202x/2025/02/26/Safari-Cleanup#comments' />
 <id>https://www.tbray.org/ongoing/When/202x/2025/02/26/Safari-Cleanup</id>
 <published>2025-02-26T12:00:00-08:00</published>
 <updated>2025-02-27T21:43:27-08:00</updated>
 <category scheme='https://www.tbray.org/ongoing/What/' term='Technology/Web' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='Technology' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='Web' />
 <summary type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>Like most Web-heads I spent years living in Chrome, but now feel less comfy there, because Google.     I use many browsers but now my     daily driver is Safari. I’m pretty happy with it but there’s ugly stuff hiding in its corners that needs     to be cleaned up. This fragment’s mostly about those corners, but I include notes on the bigger browser     picture and a couple of ProTips</div></summary>
<content type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>
    <p>Like most Web-heads I spent years living in Chrome, but now feel less comfy there, because Google.
    I use many browsers but now my
    daily driver is Safari. I’m pretty happy with it but there’s ugly stuff hiding in its corners that needs
    to be cleaned up. This fragment’s mostly about those corners, but I include notes on the bigger browser
    picture and a couple of ProTips.</p> 
    <h2 id='p-1'>Many browsers?</h2>
    <p>If your life is complicated at all you need to use more than one. By way of
    illustration not recommendation, here’s what I do:</p>
    <ul>
      <li><p><b>Safari</b> is where I spend most of my time. As I write this I have 36 tabs, eight of them pinned. That
      the pinned number is eight is no accident, it’s because of the
      <a href="/ongoing/When/201x/2012/04/22/Tab-Lore">Tab Trick</a>, which if you don’t know about, you really need to
      learn.</p>
      <p>More on Safari later.</p></li>
      <li><p>I use <b>Chrome</b> for business. It’s where I do banking and time-tracking and invoicing. (Much of this relies on
      <a href="https://www.paymoapp.com">Paymo</a>, which is great.  It takes seconds to track my time, and like ten minutes to do
      a super-professional monthly invoice.)</p></li>
      <li><p>I use <b>Firefox</b> when I need to be
      <a href="https://cosocial.ca/@coop">@[email protected]</a> or go anywhere while certain that no Google accounts
      are logged in.</p></li>
      <li><p>I use <b>Chrome Canary</b> for an organization I work with that has Chrome-dependent stuff that I don’t want to mix up with any
      of my personal business.</p></li>
    </ul>
    <h2 id='p-2'>Safari, you say?</h2>
    <p>We inhabit the epoch of Late Capitalism. Which means there’s no reason for me to expect any  company
    to exhibit ethical behavior. Because ethics is  for amateurs.</p>
    <p>So when I go looking for infrastructure that offers privacy protection, I look for a provider whose
    business model depends at least in part on it. That leaves Safari.</p>
    <p>Yeah, I know about Cook kissing Trump’s ring, and detest
    companies who route billions of nominal profits internationally to dodge taxes, and am revolted at the
    App Store’s merciless rent-extraction from app developers who make Apple products better.</p>
    <p>But still, I think their privacy story is pretty good, and it makes me happy when their marketing emphasizes it. Because 
    if privacy is on their path to profit, I don’t have to mis-place my faith in any large 21st-century corporation’s “ethical
    values”.</p>
    <p>Also, Safari is technically competent. It’s fast enough, and (unlike even a very few years ago) compatible with wherever I go.
    The number of Chome-only sites, thank goodness, seems to be declining rapidly.</p>
    <p>So, a tip o’ the hat to the Safari team, they’re mostly giving me what I need. But there are irritants.</p>
    <h2 id='p-3'>Tab fragility</h2>
    <p>This is my biggest gripe. Every so often, Safari just loses all my tabs when… well, I can’t spot a pattern. Sometimes it’s
    when I accidentally ⌘-Q it, sometimes it’s when I have two windows open for some reason and ⌘-W something. I
    think. Maybe. Sometimes they’re just gone.</p>
    <p>Yes, I know about the “Reopen all windows from last session” operation. If it solved the problem I wouldn’t be writing this.</p>
    <p>This is insanely annoying, and a few years back, more than once it seriously damaged my progress in multiple
    projects. Fortunately, I discovered that the Bookmarks menu has a one-click thing to create bookmarks for all my open tabs.
    So I hit that now and again and it’s saved me from tab-loss damage a couple of times now.</p>
    <p>Someone out there might be thinking of suggesting that I not use browser tabs to store my current professional
    status. Please don’t, that would be rude.</p>
    <h2 id='p-4'>Pin fragility</h2>
    <p>Even weirder, sometimes when I notice I’ve lost my main window and use the History menu to try to bring it back, I get a new
    window with all my tabs except for the pinned ones. Please, Safari.</p>
    <h2 id='p-5'>Kill-pinned-tab theater</h2>
    <p>Safari won’t let me ⌘-W a pinned tab. This is <em>good</em>, correct where Chrome is wrong.</p>
    <p>But when I try, does it quietly
    ignore me, or emit a gentle beep? No, it abruptly shifts to the first un-pinned tab. Which makes me think that I indeed
    killed the tab I was on, then I realize that no I didn’t, then I panic because obviously I killed something, and go
    looking for it. I try Shift-⌘-T to bring back most recently closed tab, realize I killed that an hour ago, and
    sit there blank-faced and worried.</p>
    <h2 id='p-7'>New window huh?</h2>
    <p>When I’m in Discord or my Mail client or somewhere and I click on a link, sometimes it puts up a new Safari window. Huh? But
    usually not, I can’t spot the pattern.  When I kill the new window, sometimes I lose all my tabs. Sigh.</p>
    <h2 id='p-8'>Passive-aggressive refresh</h2>
    <p>When I have some tab that’s been around and unvisited for a while, sometimes there’s this tasteful decoration across the top.</p>
    <img src="https://www.tbray.org/ongoing/When/202x/2025/02/26/warning.png" alt="Passive-aggressive Safari warning" />
    <p>I think that this used to say “significant memory” rather than “significant energy”? But really, Safari, try to imagine how
    little I care about your memory/energy problems, just do what you need to and keep it to yourself. And if you can’t, at least
    spruce up the typography and copy-editing.</p>
    <h2 id='p-9'>Better back button</h2>
    <p>[This is partly a MacOS rather than Safari issue.] On my Android, I can click on something in Discord that takes me to
    the GitHub app, another click and I’m in
    the browser, then click on something there and be in the YouTube app, and so on and so on. And then I can use “Back” to retrace
    my steps from app to app. This is just incredibly convenient.</p>
    <p>Safari’s memory of “how did I get here” apparently lives in the same evanescent place my tab configuration does, and
    usually vanishes the instant I step outside the browser. Why
    shouldn’t the Back operation always at least try to do something useful?</p>
    <p>Hey Apple, it’s your operating system and your browser, why not
    catch up with Android in an area where you’re clearly behind?</p>
    <h2 id='p-11'>I humbly suggest</h2>
    <p>… that Safari do these things:</p>
    <ol>
      <li><p>Save my current-tabs setup every few seconds on something more robust than the current fabric 
      of spider webs and thistledown. Offer a “Restore Tabs” entry in the History menu that always works.</p></li>
      <li><p>Don’t just exit on ⌘-Q. Chrome gets this right, offering an option where I have to hold that key combo down for a
      second or two.</p></li>
      <li><p>When I try to kill a pinned tab, just ignore me or beep or put up a little message or something.</p></li>
      <li><p>Never create a new Safari window unless I ask for it.</p></li>
      <li><p>Kill the dumb “this webpage was refreshed…”</p></li>
      <li><p>Offer a “back” affordance that always works, even across applications.</p></li>
    </ol>
    <h2 id='p-10'>Other browsers?</h2>
    <p>I already use Firefox every day and I know about Opera, Vivaldi, Brave, Arc, etc., and I’ve tried them, and none ever stuck. Or the
    experience was feeling good
    when something emerged about the provider that was scammy or scary or just dumb. (And the recent rumblings out of
    Mozilla are not reassuring.)</p>
    <p>While it’d sure be nice for there to be
    a world-class unencumbered open-source browser from an organization I respect, I’m not holding my breath.
    So it’s Safari for me for now.</p>
    <p>And it seems to me that the things that bother me should be easy to fix. Please do.</p>

</div></content></entry>

<entry>
 <title>Posting and Fascism</title>
 <link href='https://www.tbray.org/ongoing/When/202x/2025/02/08/Posting-and-Fascism' />
 <link rel='replies'        thr:count='0'        type='application/xhtml+xml'        href='/ongoing/When/202x/2025/02/08/Posting-and-Fascism#comments' />
 <id>https://www.tbray.org/ongoing/When/202x/2025/02/08/Posting-and-Fascism</id>
 <published>2025-02-08T12:00:00-08:00</published>
 <updated>2025-02-18T17:42:10-08:00</updated>
 <category scheme='https://www.tbray.org/ongoing/What/' term='The World/Politics' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='The World' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='Politics' />
 <summary type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>Recently, Janus Rose’s     <a href='https://www.404media.co/you-cant-post-your-way-out-of-fascism/?ref=weekly-roundup-newsletter'>You Can’t Post Your Way     Out of Fascism</a> crossed my radar on a hundred channels. It’s a smart piece that says smart things. But     I ended up mostly disagreeing. I’m not saying you can post your way out of Fascism, but I do think it’s gonna be hard     to build the opposition without a lot of posting. The <em>what</em> and especially the <em>where</em>     matter. But the “posting is useless” stance is dangerously reductive</div></summary>
<content type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>
    <p>Recently, Janus Rose’s
    <a href="https://www.404media.co/you-cant-post-your-way-out-of-fascism/?ref=weekly-roundup-newsletter">You Can’t Post Your Way
    Out of Fascism</a> crossed my radar on a hundred channels. It’s a smart piece that says smart things. But
    I ended up mostly disagreeing. I’m not saying you can post your way out of Fascism, but I do think it’s gonna be hard
    to build the opposition without a lot of posting. The <em>what</em> and especially the <em>where</em>
    matter. But the “posting is useless” stance is dangerously reductive.</p>
    <p>Before I get into my gripes with Ms Rose’s piece, let me highlight the good part: Use your browser’s search-in-page to scroll
    forward to “defend migrants”. Here begins a really smart and inspirational narrative of things people are doing to deflect and
    defeat the enemy.</p>
    <p>But it ends with the observation that all the useful progressive action “arose from existing networks of neighbors
    and community organizers”.
    Here’s where I part ways. Sure, local action is the most accessible and in most cases the only action, but right now
    Fascism is a <em>global</em> problem and these fighters here need to network with those there, for values of “here” and
    “there” that are not local.</p>
    <p>Which is gonna involve a certain amount of posting: Analyses, critiques, calls to action, date-setting, message-sharpening;
    it’s just not sensible to rely on networks of neighbors to accomplish this.</p>
    <h2 id='p-1'>What to post about?</h2>
    <p>Message sharpening feels like the top of the list. Last month I posted
    <a href="/ongoing/When/202x/2025/01/22/In-The-Minority">In The Minority</a>, making the (obvious I think) point that
    current progressive messaging isn’t working very well; we keep losing elections!  What needs to be changed? I don’t know and I don’t
    believe anybody who says they do.</p>
    <p>It’s not as simple as “be more progressive” or conversely “be more centrist”. I personally think the way to arrive at
    the right messaging strategies and wording is going to involve a lot of trial balloons and yes, local efforts. Since I
    unironically think that progressive policies will produce results that a majority of people will like, I also believe that there
    absolutely must be a way of explaining why and how that will move the needle and lead to victories.</p>
    <h2 id='p-2'>Where to post it?</h2>
    <p>Short answer: Everywhere, almost.</p>
    <p>Granted that TV, whatever that means these days, is useless.  Anyone doing mass broadcasting is terrified of controversy and
    can’t afford to be seen as a progressive nexus.</p>
    <p>And Ms Rose is 100% right that Tiktok, Xitter, Facebook, Insta, or really any other centralized profit-driven corporate
    “social network” products are just not useful for progressives. 
    These are all ad-supported, and (at this historical moment) under heavy pressure from governments controlled by our
    enemies, and in some cases, themselves owned and operated by Fascists.</p>
    <p>That leaves decentralized social media (the Fediverse and (<a href="/ongoing/When/202x/2024/11/15/Not-Bluesky">for the moment</a>) Bluesky), Net-native operations like
    <cite>404</cite>/<cite>Vice</cite>/<cite>Axios</cite>/<cite>Verge</cite> (even though most of them are struggling),
    and mainstream “quality publications”: The <cite>Atlantic</cite>, the <cite>Guardian</cite>, and your local progressive press
    (nearest to me here in Canada,
    <a href="https://thetyee.ca">The Tyee</a>).</p>
    <p>Don’t forget blogs. They can still move the needle.</p>
    <p>And, I guess, as Ms Rose says, highly focused local conversations on Discord, WhatsApp, and Signal. (Are
    there other tech options for this kind of thing?)</p>
    <h2 id='p-3'>Are you angry?</h2>
    <p>I am. And here I part paths with Ms Rose, who is vehement that we should see online anger as an anti-pattern. Me, I’m kinda
    with Joe Strummer,
    <a href="https://genius.com/The-clash-clampdown-lyrics">anger can be power</a>. Rose writes “researchers have found that the
    viral outrage disseminated on social media in response to these ridiculous claims actually
    <a href="https://par.nsf.gov/servlets/purl/10095997?ref=404media.co">reduces the effectiveness of
    collective action”</a>. I followed that link and found the evidence unconvincing.</p>
    <p>Also, if there’s one thing I believe it’s that in the social-media context, being yourself, exposing the person behind the
    words, is central to getting anywhere. And if the enemy’s actions are filling me with anger, it would be 
    disingenuous and ineffective to edit that out of my public conversation.</p>
    <h2 id='p-4'>Posting is a progressive tool</h2>
    <p>Not gonna say more about principles or theory, just offer samples.</p>
    <p><a href="https://www.fiftyfifty.one">50501</a> has done it all with hashtags and micro-posts. Let’s see how it works.</p>
    <p>Here’s
    <a href="https://www.semafor.com/article/02/12/2025/actually-the-resistance-is-working?utm_source=flipboard&amp;utm_content=user%2FSemafor">Semafor</a>
    arguing that the Democrats’ litigation-centric resistance is working pretty well.</p>
    <p>Heidi Li Feldman, in
    <a href="https://heidi-says.ghost.io/fear-and-loathing-plus-what-blue-states-should-be-doing-now/">Fear and loathing plus what
    blue states should be doing now</a> argues on her blog for resistance at the state-government
    level, disengaging from and pushing back against toxic Musk/Trump projects.</p>
    <p>Here’s Josh Marshall at <cite>Talking Points Memo</cite>
    <a href="https://talkingpointsmemo.com/edblog/democrats-are-surrounded-by-low-hanging-fruit-get-to-it">calling for pure
    oppositionism</a> and then
    arguing that Democrats
    <a href="https://talkingpointsmemo.com/edblog/wheres-the-real-power-nexus-how-does-the-opposition-get-to-it#more-1511743">should
    go to the mattresses</a> on keeping the government open and raising the debt limit.</p>
    <p>Here’s the let’s-both-sides-Fascism <cite>New York Times</cite> <a href="https://www.nytimes.com/interactive/2025/02/13/us/doc-annotation-memo-from-bove.html?unlocked_article_code=1.w04.KqQF._HNGZICTO3SH&amp;smid=url-share">absolutely savaging</a> 
    the GOP campaign to keep Mayor Adams in place as a MAGA puppet.</p>
    <p>Here’s yours truly posting about
    <a href="/ongoing/When/202x/2025/01/22/In-The-Minority#p-4">who progressives should talk to</a>.</p>
    <p>Here’s Mark Cuban on Bluesky saying
    <a href="https://bsky.app/profile/mcuban.bsky.social/post/3lgek5exkes2p">hardass political podcasts</a> are the only way to
    reach young men.</p>
    <p>Here’s Elizabeth Kolbert in <cite>The New Yorker</cite>
    <a href="https://www.newyorker.com/magazine/2025/01/20/outraged-kurt-gray-book-review">making very specific suggestions</a> as
    to the tone and content of progressive messaging.</p>
    <p>Here’s Cory Doctorow on many channels as usual, on
    <a href="https://pluralistic.net/2025/01/15/beauty-eh/#its-the-only-war-the-yankees-lost-except-for-vietnam-and-also-the-alamo-and-the-bay-of-ham">how
    Canada should push back against the Trump tariffs</a>.</p>
    <p>There’s lots more strong stuff out there. Who’s right?</p>
    <p>I don’t know. Not convinced anyone does.</p>
    <p>Let’s keep posting about it till we get it right.</p>
</div></content></entry>

<entry>
 <title>December 24th Lasagna</title>
 <link href='https://www.tbray.org/ongoing/When/202x/2025/01/02/Lasagna' />
 <link rel='replies'        thr:count='1'        type='application/xhtml+xml'        href='/ongoing/When/202x/2025/01/02/Lasagna#comments' />
 <id>https://www.tbray.org/ongoing/When/202x/2025/01/02/Lasagna</id>
 <published>2025-01-02T12:00:00-08:00</published>
 <updated>2025-02-06T14:31:26-08:00</updated>
 <category scheme='https://www.tbray.org/ongoing/What/' term='The World/Food and Drink' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='The World' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='Food and Drink' />
 <summary type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>We had thirteen people at my Mom’s house this last Christmas. One of our traditions is a heroic Lasagna for Christmas Eve,     a specialty of a family member. This year we asked them for the recipe and they agreed, but would rather remain uncredited.     It’s called “Very Rich Red Sauce and four-Cheese Lasagna”</div></summary>
<content type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>
    <p>We had thirteen people at my Mom’s house this last Christmas. One of our traditions is a heroic Lasagna for Christmas Eve,
    a specialty of a family member. This year we asked them for the recipe and they agreed, but would rather remain uncredited.
    It’s called “Very Rich Red Sauce and four-Cheese Lasagna”.</p>
    <p>I sort of enjoy cooking but would never have the courage to take on a project like this. I can testify that the results are
    wonderful.</p>
    <h2 id='p-1'>Sauce</h2>
    <p>Key sauce ingredients are red wine &amp; sun-dried tomatoes; lasagna is all about mozza, the provolone adds a certain extra
    something. Over to the chef:</p>
    <h2 id='p-2'>Ingredients</h2>
    <p>Sauce:</p>
    <ul>      
      <li><p>butter - half a lb block or less</p></li>
      <li><p>olive oil to sauté</p></li>
      <li><p>carrots - 2 to 4 depending on size, make sure they are fresh!</p></li>
      <li><p>celery - 5-6 spears, say ⅔ of a bunch</p></li>
      <li><p>onions (ideally yellow, but whatevs) - 3-6 depending on size.</p>
      <p>(by volume, you are looking to get roughly 3:2:1 proportions when chopped of onions:celery:carrots)</p></li>
      <li><p>a red sweet pepper</p></li>
      <li><p>extra lean hamburger - 1 kg</p></li>
      <li><p>3 cloves</p></li>
      <li><p>salt - half a tablespoon? more? (tomato sauces tend to need a little more salt than other applications)</p></li>
      <li><p>black pepper - if not using cayenne, a LOT, perhaps a tablespoon of freshly ground</p></li>
      <li><p>cayenne - if using, to taste, I find strength is highly variable so hard to say how much, perhaps a couple of
      teaspoons?</p></li>
      <li><p>Two big cans of diced tomatoes (NOT AYLMER! yuck, Unico is acceptable, Italian imported best)</p></li>
      <li><p>3 small cans or one big can of tomato paste (or tubes, if you get them from an Italian grocery store, which are a
      rather superior product) It is hard to use too much tomato paste</p>
      <p>(pro tip for cans of tomato paste: use the can opener to open BOTH the top and bottom of the can, then the paste slides out
      neatly and you don’t have to fool around trying to spatula the paste out of the can!)</p></li>
      <li><p>about a half bottle of cheap red wine (the grocery store sells cheap cooking wine in demi bottles, though red can be hard
      to find, one demi bottle is more than enough)</p></li>
      <li><p>most of a garlic bulb, say three quarters, once again FINELY chopped (no not pressed or processed!)</p></li>
      <li><p>a LOT of dried oregano, say 3-4 tablespoons plus</p></li>
      <li><p>a fair amount of dried basil, say 2 tablespoons plus</p></li>
      <li><p>some died thyme, say a half tablespoon plus</p>
      <p>(herbs are tough to give measurements for, as they vary enormously in potency with brand, age &amp; storage)</p></li>
      <li><p>about a tablespoon of powdered beef stock</p></li>
      <li><p>about 1½ to 2 cups of finely chopped sun-dried tomatoes NO SUBSTITUTIONS!!!!!</p></li>
    </ul>
    <p>Lasagna</p>
    <ul>
      <li><p>1 disposable foil pan</p></li>
      <li><p>foil to cover</p></li>
      <li><p>butter to grease pan</p></li>
      <li><p>melted butter to cover top lightly</p></li>
      <li><p>1¼ margarine tins of sauce above</p></li>
      <li><p>1½ boxes of lasagna noodles (NOT the “instant” or pre-cooked kind)</p></li>
      <li><p>salted water to boil noodles</p></li>
      <li><p>1 big block of mozzarella cheese, coarsely grated</p></li>
      <li><p>2 packages (12-16 slices) of provolone cheese</p></li>
      <li><p>1 tin of ricotta cheese</p></li>
      <li><p>grated parmesan cheese</p></li>
      <li><p>little bit of freshly ground black pepper</p></li>
    </ul>
    <h2 id='p-4'>Procedure: Sauce</h2>
    <p>For the
    <a href="https://en.wikipedia.org/wiki/Mirepoix">mirepoix</a>, the vegetables all need to be FINELY chopped up for sauce
    consistency. And I mean FINELY chopped-- I have 
    tried both powered and manual food processors, and they do 
    not do a good job, either reducing things to mush, or leaving big chunks-- the idea here is to get everything about the same
    size (and the garlic later), it gives the sauce some consistency. </p>
    <p>This is tedious and takes a long time.</p>
    <p>To give you an idea, a celery spear can be cut into 5-7 strips longwise with the grain, and then the strips chopped as finely
    as possible across the grain. A big carrot can yield say 6 long flat pieces that can be cut longways into strips, and then the
    strips cuts finely against the grain to produce little cubes.</p>
    <p>The mirepoix is important, we need to get the natural sugars to balance out the acidity of the tomatoes and wine. I cook the
    onions separately from the rest…</p>
    <p>Caramelize the onions. Frankly, this is a pain in the ass. There are no shortcuts; the internet has all these handy tips like
    using a pressure cooker at first or a slow cooker or adding baking soda or water or whatnot, I’ve tried them, and just no. So a
    big non-stick frying pan, and sloooow saute with a little butter and salt, frequent stirring, a lot of patience, at LEAST 40
    minutes. Maybe an hour. And constant attention, the bastards will burn on you at the drop of a hat. There is no hiding it, this
    is tricky and somewhat difficult. But worth it, caramelized onions are magic.</p>
    <p>Meanwhile, in as big a heavy bottom pot as you can find, saute the celery and carrots (and peppers if you are using them)
    with say 3 dried cloves, in a little butter, you want to shrink them down and bring out the carrots’ natural sugars, and soften
    the cloves &amp; bring out their flavour, this takes a while, say 20 minutes or more?</p> 
    <p>Remove the onions and carrots and celery to a BIG bowl, clean out the big heavy bottom pot and brown the hamburger, about
    1kg. DO NOT USE “regular” as it is mostly fat; lately I have been using the “extra lean” because even the lean is quite fatty
    these days. A little olive oil in the pot, a fair amount of salt (half
    tablespoon?) &amp; a lot of freshly ground black pepper (approaching a tablespoon?) on the meat and lots of stirring.</p>
    <p>This where
    a lot of people screw up, essentially they “grey” the meat, they don’t BROWN it, ie achieve the
    <a href="https://en.wikipedia.org/wiki/Maillard_reaction">Maillard reaction</a>-- as with the
    mirepoix, we are trying to bring out natural sugars. A lot of stirring/scraping, to break the hamburger up into as small pieces
    as possible, ie the same size as the veggies in the mirepoix.</p>
    <p>While this is happening, add the rest of the ingredients to the mirepoix in the big bowl: tomatoes, tomato paste (more is
    better), wine.</p>
    <p>Also the chopped garlic, oregano, basil, thyme, about a tablespoon of powdered beef stock (yes this is cheating, shhh).</p>
    <p>A word about sun-dried tomatoes: they are absolutely wonderful things, but hard to find. Ideally, you want the dried kind,
    not the “in oil” kind, but you may have to settle for that. There are two different kinds of “in oil”, the ones in jars floating
    in oil like pickles in brine (they are prepped for salads, not sauces, so they are floating oil, and disintegrate once they are
    in a sauce), which you really do not want, and the ones in packages that have been oiled for preservation. This is usually what
    you have to settle for. The best ones are dry and quite hard.They are hard to find.</p>
    <p>Of these, the worst sun-dried tomatoes are the North American product, the big food companies noted there was a demand for
    them, and started tossing field tomatoes into drying kilns. These are quite inferior, but useable if it’s all you can find. The
    best ones are Turkish, followed by Italian, you can usually find in Italian delicatessens or grocery stores (even the Italians
    agree the Turkish ones are best).</p>
    <p><i>[Tim says: I found them in Vancouver and the chef is right, the flavor is to die for.]</i></p>
    <p>If you get the fully dried/no oil kind, you can simmer them a little in a little water to soften them before you try chopping
    them up; the water (or some of it anyway) should be added to the sauce…</p>
    <p>Drain any fat from the browned meat, add the mix to the meat in the big pot. Stir it all up some more, get it well mixed. You
    can add a little wine and/or tomato juice if it seems too thick, but be aware that it will liquify a little during cooking. If
    you are going to use it as a pasta sauce, you want it more liquid, if for lasagna, you want it as thick as practical. In any
    case, it is very difficult to judge the final thickness at this point.</p>
    <p>You can add a little (sun-dried tomato?) water, or tomato juice, or wine, if it needs it, but be cautious.</p>
    <p>Put on medium to low heat and stir frequently until it comes to a high simmer/low boil (don’t let it burn!) then turn the
    heat down to minimum, and slow-cook for at least 4 hours, stirring every 20 minutes or so. Cooking it longer is a Good Thing, I
    often cook it for 7 or more hours.</p>
    <p>LEAVE it out overnight! (this is important!)</p>
    <p>Warm it up the next day, bringing it back to a high simmer/low boil and stirring a lot, serve it on pasta. Or make
    lasagna. Or freeze it. One margarine tin makes a meal with leftovers (each serving would be small, because the stuff is quite
    strong). One margarine tin (plus a little, ideally) makes for one lasagna. You should get about 3 or so margarine tins from the
    above. It freezes just fine.</p>
    <p>Whew.</p>
    <h2 id='p-5'>Lasagna</h2>
    <p>In theory, one box of lasagna noodles is just enough to make one pan of lasagna. However, there are almost always a lot of
    broken pieces of lasagna in a box, and pieces that break or get stuck or something during cooking. I allow for 1 and half a box
    per lasagna pan.</p>
    <p>Ingredients:</p>
    <ul>
      <li><p>enough lasagna noodles, cooked al dente in salted boiling water</p></li>
      <li><p>1¼ margarine tins of sauce, gently heated up</p></li>
      <li><p>Butter (better than margarine but you can use that if necessary)</p></li>
      <li><p>1 big block of mozzarella (the regular supermarket kind is fine, I tried the expensive high quality italian
      stuff, and it was a LITTLE bit better, but not enough to justify the cost)</p></li>
      <li><p>1 tin of ricotta cheese, or failing that, dry curd cottage cheese</p></li>
      <li><p>12-16 slices of provolone cheese (usually 2 packages)</p></li>
      <li><p>parmesan cheese (like with the mozza, I find the cheap Kraft product fully acceptable for this purpose)</p></li>
      <li><p>freshly ground black pepper</p></li>
      <li><p>foil lasagna pan</p></li>
      <li><p>heavy duty foil</p></li>
      </ul>
      <p>Grease the pan with butter. do a thorough job, you don’t want huge amounts of butter, but you do not want any bit of foil
      that might come in contact with lasagna ungreased.</p>
      <p>Coarsely grate the mozzarella.</p>
      <p>Lay an overlapping layer of lasagna noodles crossways in the pan, with the sides going up the sides of the pan. The pieces
      at either end need to overlap the piece on the bottom, but bend up to cover the short end of the pan as well. This is a pain
      in the ass to get right.</p>
      <p>The sauce goes a long way, you do NOT want a thick layer. Spread a thin layer over the bottom of the pan, about a third of
      the sauce. Put a layer of mozza on top, about a third of it. Put half the provolone on top. Put a layer of lasagna noodles down
      long-ways , overlapping a bit.</p>
      <p>Spread a thin layer of sauce, another third, covered with mozza, another third, and cover that with the ricotta (or dry-curd
      cottage). Put down another layer of lasagna long-ways.</p>
      <p>The rest of the sauce, the rest of the mozza, and the rest of the provolone.</p>
      <p>Cover the cross-wise lasagna noodles, overlapping, and trying to tuck the ends in to seal the package. This is
      tricky at the ends, I find putting a small cut in the lasagna noodle at the corner makes it easier to fold over
      neatly. (Usually I am tired by this point and less inclined to be finicky and careful, which is a pity.)</p>
      <p>Pour a little melted butter over the top, enough to grease the surface. Sprinkle some freshly ground pepper and a fair
      amount of parmesan over the top. Cover with foil. Put in fridge (you can pre-make hours before use if you are having a party
      or something) or immediately put in pre-heated oven.</p> 
      <p>Preheat oven to pretty hot, 375-400. Cook lasagna for 45 minutes to an hour. Remove foil from pan 10-15 minutes before you
      remove it from the oven. Put the foil back on and let it stand for AT LEAST 15 minutes, better if you can hold off for half an
      hour (the hotter it is, the more likely it is do disintegrate when being served, you want the melted cheese to start to re-set
      a little)</p> 
      <p>Serve with garlic bread and salad and an impertinent red wine. One pan goes a fairly long way, serves 6-8ish? Depends how
      many hungry teens you have around…</p> 
</div></content></entry>

<entry>
 <title>Photo Philosophizing</title>
 <link href='https://www.tbray.org/ongoing/When/202x/2025/02/04/Two-Photos-of-Snow' />
 <link rel='replies'        thr:count='3'        type='application/xhtml+xml'        href='/ongoing/When/202x/2025/02/04/Two-Photos-of-Snow#comments' />
 <id>https://www.tbray.org/ongoing/When/202x/2025/02/04/Two-Photos-of-Snow</id>
 <published>2025-02-04T12:00:00-08:00</published>
 <updated>2025-02-04T22:30:50-08:00</updated>
 <category scheme='https://www.tbray.org/ongoing/What/' term='Arts/Photos' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='Arts' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='Photos' />
 <summary type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>What happened was, I went to Saskatchewan to keep my mother company, and got a little obsessed about photo composition and     complexity. Which in these troubled times is a relief</div></summary>
<content type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>
    <p>What happened was, I went to Saskatchewan to keep my mother company, and got a little obsessed about photo composition and
    complexity. Which in these troubled times is a relief.</p>
    <p>This got started just after take-off from Vancouver. As the plane climbed over the city I thought “That’s a nice
    angle” and pointed the Pixel through the plexiglass.</p>
    <img src="https://www.tbray.org/ongoing/When/202x/2025/02/04/PXL_20250114_163303579.png" alt="Vancouver from the air, looking north" />
    <div class='caption'><p>You might want to enlarge this one.</p></div>
    <p>A couple of days into my Prairie visit I got around to processing the photos and thought that Vancouver aerial had come out
    well. No credit to the photographer here, got lucky on the opportunity,  but holy crap modern mobile-device camera tech is
    getting good these days. I’ll take a little credit for the Lightrooming; this has had heavy dehazing and other
    prettifications applied.</p>
    <p>A couple of days later I woke up and the thermometer said -36°C (in Fahrenheit that’s “too freaking cold”).  The air was
    still and the hazy sunlight was weird. “There has to be a good photo in this somewhere, maybe to contrast that Vancouver shot” I
    thought. So I tucked the Fujifilm inside 
    my parka (it claims to be only rated to -10°) and went for a walk.
    Mom politely declined my invitation to come along without, to her credit, getting that “Is he crazy?” expression on her face.</p>
    <p>Her neighborhood isn’t that photogenic but there’s a Pitch-n-putt golf course a block away so I trudged through that. The
    snow made freaky squeaking sounds underfoot. At that temperature, it feels like you have to push the air aside with each
    step. Also, you realize that your lungs did not evolve to process that particular atmospheric condition.</p>
    <p>Twenty minutes in I had seen nothing that made me want to pull out the camera, and was thinking it was about time to head home.
    So I stopped in a place where there was a bit of shape and shadow, and decided that if I had to force a
    photo opportunity to occur by pure force of will, so be it.</p>
    <img src="https://www.tbray.org/ongoing/When/202x/2025/02/04/TXT55358.png" alt="Snow shapes and shadows" />
    <p>It ain’t a great city framed by coastal mountains. But it ain’t nothing either. I had to take my gloves off to shoot, and
    after just a couple of minutes of twisting around looking for angles, my fingers were screaming at me.</p>
    <p>The two pictures are at the opposite end of the density-vs-minimalism spectrum but they share, um, snow, so that’s
    something.</p>
    <p>Anyhow, here’s the real reason I was there.</p>
    <img src="https://www.tbray.org/ongoing/When/202x/2025/02/04/PXL_20250121_180700202.png" alt="Jean Bray" />
    <div class='caption'><p>Jean Bray, who’ll be turning 95 this year.</p></div>
    <p>I find photography to be a very useful distraction from what’s happening to the world.</p>
</div></content></entry>

<entry>
 <title>In The Minority</title>
 <link href='https://www.tbray.org/ongoing/When/202x/2025/01/22/In-The-Minority' />
 <link rel='replies'        thr:count='8'        type='application/xhtml+xml'        href='/ongoing/When/202x/2025/01/22/In-The-Minority#comments' />
 <id>https://www.tbray.org/ongoing/When/202x/2025/01/22/In-The-Minority</id>
 <published>2025-01-22T12:00:00-08:00</published>
 <updated>2025-01-26T13:06:26-08:00</updated>
 <category scheme='https://www.tbray.org/ongoing/What/' term='The World/Politics' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='The World' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='Politics' />
 <summary type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>That’s us. I assume you’re among those horrified at the direction of politics and culture in recent years and     especially recent weeks, in the world at large and especially in America. We are a minority. We shouldn’t try to deny     it, we should be adults and figure out how to deal with it</div></summary>
<content type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>
    <p>That’s us. I assume you’re among those horrified at the direction of politics and culture in recent years and
    especially recent weeks, in the world at large and especially in America. We are a minority. We shouldn’t try to deny
    it, we should be adults and figure out how to deal with it.</p>
    <h2 id='p-1'>Denialists</h2>
    <p>I’m out of patience with people who put the blame on the pollsters or the media or Big Tech, or really any third party.
    People generally heard what Mr Trump was offering<span class='dashes'> —</span> portrayed pretty accurately
    I thought<span class='dashes'> —</span> and enough of them liked it to elect him.
    Those who didn’t are in a minority. Quit dodging and deal.</p>
    <p>Clearly, we the minority have failed in explaining our views. Many years ago I wrote an essay called
    <a href="/ongoing/When/200x/2004/01/13/LawOfConversation">Two Laws of
    Explanation</a>. One law says that if you’re explaining something and the person you’re explaining to doesn’t get it, that’s
    not their problem, it’s your problem. I still believe this, absolutely.</p>
    <p>So let’s try to figure out better explanations.</p>
    <p>But first, a side trip into economic perception and reality.</p>
    <h2 id='p-2'>Economists</h2>    
    <p>A strong faction of progressives and macroeconomists are baffled by people being disaffected when the economy, they say, is
    great. Paul Krugman
    <a href="https://paulkrugman.substack.com/p/this-economy-is-too-good-for-donald">beats this drum all the time</a>. Unemployment
    and inflation are low! Everything’s peachy! Subtext: If the population disagrees, they are fools.</p>
    <p>I call bullshit. The evidence of homelessness is in my face wherever I go, even if there are Lamborghinis cruising past the
    sidewalk tents.
    <a href="https://foodbankscanada.ca/hungercount/">Food banks are growing</a>. I give a chunk of money every year to
    <a href="https://vansunkidsfund.ca/schools/2023-adopt-a-school/">Adopt a School</a>, which puts free cafeterias in Vancouver
    schools where kids are coming to school hungry. Kingston, a mid-sized mid-Canadian city, just
    <a href="https://www.cbc.ca/news/canada/ottawa/kingston-ontario-declares-food-insecurity-emergency-1.7436000">declared an
    emergency</a> because one household in three is suffering from food insecurity.</p>
    <p>Even among those who are making it, for many it’s just barely:</p>
    <blockquote><p>… half of Canadians (50%, +8) are now $200 or less away each month from not being able to pay their bills and debt
    payments. This is a result of significantly more Canadians saying they are already insolvent (35%, +9) compared to last
    quarter. Canadians who disproportionately report being $200 or less away from insolvency continue to be women (55%, +4) but the
    proportion of men at risk has increased to 44%, up 13 points from last quarter.</p>
    <p>Source:
    <a href="https://www.ipsos.com/en-ca/mnp-consumer-debt-index-plunges-79-points-down-10-trump-election-causes-financial-anxiety">MNP
    Consumer Debt Index</a>. The numbers like “+8” give the change since last quarter.</p></blockquote>
    <p>(Yes, this data is Canadian, because I am. But I can’t imagine that America is statistically any
    better.)</p>
    <h2 id='p-3'>Majorities</h2>
    <p>Minorities need to study majorities closely. So let me sort them, the ones who gave Trump the election I mean, into
    baskets:</p>
    <ol>
      <li><p>Stone racists who hate immigrants, especially brown ones.</p></li>
      <li><p>Culture warriors who hate gays and trans people and so on.</p></li>
      <li><p>Class warriors; the conventional billionaire-led Republican faction who are rich, voting for anyone they think offers
      lower taxes and less regulation.</p></li>
      <li><p>People who don’t pay much attention to the news but remember that gas was cheaper when Trump was in office.</p></li>
      <li><p>Oh wait, I forgot one: People who heard Trump say what boiled down to “The people who are running things
      don’t care about you and are corrupt!” This worked pretty well because far too many don’t and are.
      A whole lot of the people who heard this are financially stressed (see above).</p></li>
    </ol>
    <h2 id='p-4'>Who to talk to?</h2>
    <p>Frankly, I wouldn’t bother trying to reach out to either of the first two groups. Empirically, some people are 
    garbage. You can argue that it’s not their fault; maybe they had a shitty upbringing or just fell into the wrong
    fellowships. Maybe. But you can be sure that that’s not <em>your</em> fault. The best practice is some combination of ignoring
    them and defending against their attacks, politics vs politics and force versus force.</p>
    <p>I think talking to the 1% is worthwhile. The fascist leaders are rich, but not all of the rich are
    fascist. Some retain much of their humanity. And presumably some are smart enough to hear an argument that
    on this economic path lie tumbrils and guillotines.</p>
    <p>That leaves the people who mostly ignore the news and the ones who have just had it with the deal they’re getting from
    late-Capitalist society. I’m pretty sure that’s who we should be talking to, mostly.</p>
    <h2 id='p-7'>What to say?</h2>
    <p>I’m not going to claim I know.  I hear lots of suggestions…</p>
    <p>In the <cite>New Yorker</cite>, Elizabeth Kolbert’s
    <a href="https://www.newyorker.com/magazine/2025/01/20/outraged-kurt-gray-book-review">Does One Emotion Rule All Our Ethical
    Judgments?</a> makes two points. First, fear generally trumps all other emotions. So, try phrasing your arguments in terms of the
    threats that fascism poses directly to the listener, rather than abstract benefits to be enjoyed by everyone in a progressive world.</p>
    <p>Second, she points out the awesome power of anecdote: MAGA made this terrible thing happen to this actual person,
    identified by name and neighborhood.</p>
    <p>On Bluesky,
    <a href="https://bsky.app/profile/mcuban.bsky.social/post/3lgek5exkes2p">Mark Cuban says</a> we need offensive hardass
    progressive political podcasts, and offers a sort of horrifying example that might work.</p>
    <p>On Bloomberg (paywalled) they say that the ruling class should be terrified of a
    <a href="https://www.bls.gov/osmr/research-papers/2021/pdf/ec210020.pdf">K-shaped recovery</a>; by inference, progressives
    should be using that as an attack vector.</p>
    <p>Josh Marshall has been arguing for weeks that since the enemies won the election, they have the power and have to own the
    results. Progressives don’t need to sweat alternative policies, they just have to highlight the downsides of encroaching fascism
    (there are plenty) and say “What we are for is NOT THAT!” and just keep saying it.
    <a href="https://talkingpointsmemo.com/edblog/democrats-are-surrounded-by-low-hanging-fruit-get-to-it">Here’s an
    example.</a></p>
    <p>Maybe one of these lines of attack is right. I think they’re all worth trying. And I’m pretty sure I know one ingredient
    that’s going to have to be part of any successful line of attack…</p>
    <h2 id='p-6'>Be blunt</h2>
    <p>Looking back at last year’s Presidential campaign, there’s a thing that strikes me as a huge example of What Not To Do. I’m
    talking about Harris campaign slogan: “Opportunity Economy”. This is marketing-speak. If there’s one thing we should have
    learned it’s that the population as a whole<span class='dashes'> —</span> rich, poor, Black, white, queer, straight, any old
    gender<span class='dashes'> —</span> <em>has</em> learned to see through this kind of happy talk.</p>
    <p>Basically, in Modern Capitalism, whenever, and I mean whenever <em>without exception</em>, whenever someone offers you an
    “opportunity”, they’re trying to take advantage of you. This is appallingly tone-deaf, and apparently nobody inside that campaign
    asked themselves the simple question “Would I actually use this language in talking to someone I care about?” Because they
    wouldn’t.</p>
    <p>Be blunt. Call theft theft. Call lies lies. Call violence violence. Call ignorance ignorance. Call stupidity stupidity.</p>
    <p>Also, talk about money a lot. Because billionaires are unpopular.</p>
    <img src="https://www.tbray.org/ongoing/When/202x/2025/01/22/billionaires.png" alt="Graph data from an AP poll" />
    <div class='caption'><p>From a
    <a href="https://apnews.com/article/doge-musk-trump-corruption-government-efficiency-16243280f446ea85ef50ff106c7e2841">good AP
    poll</a>.</p></div>
    <p>Don’t say anything you wouldn’t say straight-up in straight-up conversation with a real person.
    Don’t let any marketing or PR professionals edit the messaging. This is the kind of
    messaging that social media is made for.</p>
    <p>Maybe I’m oversimplifying, but I don’t think so.</p>
</div></content></entry>

<entry>
 <title>Protocol Churn</title>
 <link href='https://www.tbray.org/ongoing/When/202x/2025/01/14/Protocol-Churn' />
 <link rel='replies'        thr:count='3'        type='application/xhtml+xml'        href='/ongoing/When/202x/2025/01/14/Protocol-Churn#comments' />
 <id>https://www.tbray.org/ongoing/When/202x/2025/01/14/Protocol-Churn</id>
 <published>2025-01-14T12:00:00-08:00</published>
 <updated>2025-01-15T20:52:57-08:00</updated>
 <category scheme='https://www.tbray.org/ongoing/What/' term='The World/Social Media' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='The World' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='Social Media' />
 <summary type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>Bluesky and the Fediverse are our best online hopes for humane human conversation.     Things happened on 2025/01/13; I’ll hand the microphone to Anil Dash,     <a href='https://me.dm/@anildash/113822018649097081'>whose post</a> starts “This is a monumental day for the future of the     social web.”</div></summary>
<content type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>
    <p>Bluesky and the Fediverse are our best online hopes for humane human conversation.
    Things happened on 2025/01/13; I’ll hand the microphone to Anil Dash,
    <a href="https://me.dm/@anildash/113822018649097081">whose post</a> starts “This is a monumental day for the future of the
    social web.”</p>
    <img src="https://www.tbray.org/ongoing/When/202x/2025/01/14/Anil.png" alt="Anil Dash on 2025/01/13" />
    <p>What happened? Follow Anil’s links:
    <a href="https://blog.joinmastodon.org/2025/01/the-people-should-own-the-town-square/">Mastodon</a> and 
    <a href="https://freeourfeeds.com">Bluesky (under the “Free Our Feeds” banner</a>). Not in his sound-bite: Both groups are
    seeking donations, raising funds to meet those goals.</p>
    <img src="https://www.tbray.org/ongoing/When/202x/2025/01/14/Fediverse.png" alt="Fediverse fundraising program" />
    <img src="https://www.tbray.org/ongoing/When/202x/2025/01/14/ATProto.png" alt="Bluesky/AT-Protocol fundraising program" />
    <p>I’m sympathetic to both these efforts, but not equally.  I’m also cynical, mostly about the numbers: They’ve each
    announced a fundraising target, and both the targets are substantial, and I’m not going to share either, because they’re just
    numbers pulled out of the air, written on whiteboards, designed to sound impressive.</p>
    <h2 id='p-1'>What is true</h2>
    <p>These initiatives, just by existing, are evidence in
    letters of fire 500 miles high, evidence of people noticing something important: 
    Corporately-owned town squares are irreversibly discredited. They haven’t worked in the past, they don’t work now, and they’ll
    never work.</p>
    <p>Something decentralized is the only way forward. Something not owned by anyone, defined by freely-available protocols.
    Something like 
    email. Or like the Fediverse, which runs on the ActivityPub protocol. Or, maybe Bluesky, where by “Bluesky” I mean independent
    service providers 
    federated via the AT Protocol, “ATProto” for short.</p>
    <h2 id='p-2'>What is hard?</h2>
    <p>I’ll tell you what’s hard: Raising money for a good cause, when that good cause is full of abstractions about openness and
    the town square and so on. Which implies you’re not intending that the people providing the money will make money.
    So let’s wish both these efforts good luck. They’ll need it.</p>
    <h2 id='p-4'>What matters</h2>
    <p>Previously in
    <a href="/ongoing/When/202x/2024/11/15/Not-Bluesky">Why Not Bluesky</a> I argued that, when thinking about the future of conversational
    media, what matters isn’t the technology, or even so much the culture, but the money: Who pays for the service?
    On that basis, I’m happy about both these initiatives.</p>
    <p>But now I’m going to change course and talk about technology a bit.
    At the moment, the ATProto implementation that drives Bluesky is the only one in the world. If the company operating it failed
    in execution or ran out of money, the service would shut down.</p>
    <p>So, in practice, Bluesky’s not really decentralized at all.
    Thus, I’m glad that the “Free Our Feeds” effort is going to focus on
    funding an alternative ATProto implementation. In particular, they’re talking about offering an
    alternative ATProto “Relay”.</p>
    <p>Before I go on, you’re going to need a basic understanding of what ATProto is and how its parts work.  Fortunately, as usual,
    Wikipedia has a
    <a href="https://en.wikipedia.org/wiki/AT_Protocol">terse, accurate introduction</a>. If you haven’t looked into ATProto yet,
    please hop over there and remedy that. I’ll wait.</p>
    <p>Now that you know the basics, you can understand why Free Our Feeds is focusing on the Relay. Because, assuming that Bluesky
    keeps growing, this is going to be a big, challenging piece of software to build, maintain, and operate, and the performance of
    the whole service depends on it.</p>
    <p>The Fediverse in general and Mastodon in particular generally don’t rely on a global firehose feed that knows everything
    that happens, like an eye in the sky. In fact, the ActivityPub protocol assumes a large number of full-stack peer implementations 
    that chatter with each other, in stark contrast to ATProto’s menagerie of Repos and PDSes and Relays and
    App Views and Lexicons.</p>
    <p>The ATProto approach has advantages; since the Relay knows everything, you can be confident of seeing everything relevant.
    The Fediverse makes no such promise, and it’s well-known that in certain circumstances you can miss replies to your posts. And
    perhaps more important, miss replies to others’ posts, which opens the door to
    <a href="/ongoing/When/202x/2024/07/30/Invisible-Attackers">invisible attackers</a>.</p>
    <p>And this makes me nervous. Because why would anyone make the large engineering and financial investments that’d be required
    to build and operate an ATProto Relay?</p>
    <p>ActivityPub servers may have their flaws, but in practice they are
    <a href="https://hachyderm.io/@esk/113793277371908181">pretty cheap to operate</a>. And it’s easy to think of lots of reasons
    why lots of organizations might want to run them:</p>
    <ol>
      <li><p>A university, to provide a conversational platform for its students…</p></li>
      <li><p>… or its faculty.</p></li>
      <li><p>A Developer Relations team, to talk to geeks.</p></li>
      <li><p>Organized religion, for evangelism, scholarship, and ministry.</p></li>
      <li><p>Marketing and PR teams, to get the message out.</p></li>
      <li><p>Government departments that provide services to the public.</p></li>
    </ol>
    <p>Or consider my own instance,
    <a href="https://cosocial.ca">CoSocial</a>, the creation of Canadians who (a) are fans of the co-operative movement,
    (b) concerned about Canadians’ data staying in Canada, and (c) want to explore modes of funding conversational media that aren’t
    advertising or Patreon.</p>
    <p>Maybe, having built and run a Relay, the Free Our Feeds people will discover a rationale for why anyone else should do this.</p>
    <h2 id='p-5'>So, anyhow…</h2>
    <p>I hope both efforts hit their fundraising targets. I hope both succeed at what they say they’re going to try.</p>
    <p>But for my own conversation with the world, I’m sticking with the Fediverse.</p>
    <p>Most of all, I’m happy that so many people, whatever they think of capitalism, have realized that it’s an
    unsuitable foundation for online human conversation. And most of all I hope that that number keeps growing.</p>
</div></content></entry>

<entry>
 <title>AI Noise Reduction</title>
 <link href='https://www.tbray.org/ongoing/When/202x/2025/01/10/Photo-Noise-Reduction' />
 <link rel='replies'        thr:count='7'        type='application/xhtml+xml'        href='/ongoing/When/202x/2025/01/10/Photo-Noise-Reduction#comments' />
 <id>https://www.tbray.org/ongoing/When/202x/2025/01/10/Photo-Noise-Reduction</id>
 <published>2025-01-10T12:00:00-08:00</published>
 <updated>2025-01-10T21:01:24-08:00</updated>
 <category scheme='https://www.tbray.org/ongoing/What/' term='Arts/Photos' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='Arts' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='Photos' />
 <summary type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>What happened was, there was a pretty moon in the sky, so I got out a tripod and the     <a href='/ongoing/When/202x/2024/03/30/A057'>big honkin’ Tamron 150-500</a> and fired away.     Here’s the shot I wanted to keep</div></summary>
<content type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>
    <p>What happened was, there was a pretty moon in the sky, so I got out a tripod and the
    <a href="/ongoing/When/202x/2024/03/30/A057">big honkin’ Tamron 150-500</a> and fired away.
    Here’s the shot I wanted to keep.</p>
    <img src="https://www.tbray.org/ongoing/When/202x/2025/01/10/TXT55339.png" alt="Photograph of the moon, half-shadowed" />
    <div class='caption'><p> Sadly, the clouds had shifted<br/>and Luna had lost her pretty bronze shading.</p></div>
    <p>I thought the camera and lens did OK given that I was shooting from sea level through soggy Pacific-Northwest winter air.
    But when I zoomed in there was what looked like pretty heavy static. So I applied Lightroom to the problem, twice.</p>
    <img src="https://www.tbray.org/ongoing/When/202x/2025/01/10/TXT55339-Enhanced-NR.png" alt="Photograph of the moon, half-shadowed, de-noised" />
    <img src="https://www.tbray.org/ongoing/When/202x/2025/01/10/TXT55339-2.png" alt="Photograph of the moon, half-shadowed, de-noised" />
    <p>I’ll be surprised if many of you can see a significant difference. (Go ahead and enlarge.)
    But you would if it were printed on a big piece of paper
    and hung on a wall. So we’ll look at the zoomed-in version. But first…</p>
    <h2 id='p-1'>Noise reduction, old-school</h2>
    <p>Lightroom has had a Luminance-noise reduction tool for years. Once you wake it up, you can further refine with “Detail” and
    “Contrast” sliders, whose effects are subtle at best.  For the moon shot, I cranked the Luminance slider pretty all the way over
    and turned up Detail quite a bit too.</p>
    <h2 id='p-2'>Noise reduction, with AI</h2>
    <p>In recent Lightroom versions there’s a “Denoise…” button. Yes, with an ellipsis and a note that says “Reduce noise with AI.”
    It’s slow; took 30 seconds or more to get where it was going.</p>
    <p>Anyhow, here are the close-up shots.</p>
    <img src="close-orig.png" alt="moon close-up, no noise reduction" />
    <img src="close-by-hand.png" alt="moon close-up, noise reduction by Lightroom" />
    <img src="close-ai.png" alt="moon close-up noise reduction with AI" />
    <div class='caption'><p>Original first, then noise-reduced<br/>in Lightroom by hand, then with AI.</p></div>
    <h2 id='p-3'>What do you think?</h2>
    <p>I have a not-terribly-strong preference for the by-hand version. I think both noise reductions add value to the photo.
    I wonder why the AI decided to enhance the very-slight
    violet cast? You can look at the rim of one crater or another and obsess about things that nobody just admiring the moon will
    ever see.</p>
    <p>It’s probably worth noting that the static in the original version isn’t “Luminance noise”, which is what you get when you’re
    pushing your sensor too hard to capture an image in low light. When you take pictures of the moon you quickly learn that it’s
    not a low-light scenario at all, the moon is a light-colored object in direct sunlight. These pix are taken at F7.1 at 1/4000
    second shutter. I think the static is just the Earth’s atmosphere getting in the way.  So I’m probably abusing Lightroom’s
    Luminance slider. Oh well.</p>
    <p>You could take this as an opportunity to sneer at AI, but that would be dumb. First, Lightroom’s AI-driven “select sky” and
    “select subject” tools work astonishingly well, most times. Second, Adobe’s been refining that noise-reduction code for decades
    and the AI isn’t even a year old yet.</p>
    <p>We’ll see how it goes.</p>
</div></content></entry>

<entry>
 <title>Bitcoin Lessons</title>
 <link href='https://www.tbray.org/ongoing/When/202x/2025/01/04/Bitcoin-capitalism' />
 <link rel='replies'        thr:count='5'        type='application/xhtml+xml'        href='/ongoing/When/202x/2025/01/04/Bitcoin-capitalism#comments' />
 <id>https://www.tbray.org/ongoing/When/202x/2025/01/04/Bitcoin-capitalism</id>
 <published>2025-01-04T12:00:00-08:00</published>
 <updated>2025-01-09T16:55:53-08:00</updated>
 <category scheme='https://www.tbray.org/ongoing/What/' term='The World/Politics' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='The World' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='Politics' />
 <summary type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>Here we are, it’s 2025 and Bitcoin is surging. Around $100K last time I looked. While its creation spews megatons of     carbon into our atmosphere, investors line up to buy it in respectable ETFs, and long-term players like retirement pools and     university endowments are looking to get in.     Many of us are finding this extremely annoying.     But I look at Bitcoin and I think what I’m seeing is Modern Capitalism itself, writ large and in brutally sharp focus</div></summary>
<content type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>
    <p>Here we are, it’s 2025 and Bitcoin is surging. Around $100K last time I looked. While its creation spews megatons of
    carbon into our atmosphere, investors line up to buy it in respectable ETFs, and long-term players like retirement pools and
    university endowments are looking to get in.
    Many of us are finding this extremely annoying.
    But I look at Bitcoin and I think what I’m seeing is Modern Capitalism itself, writ large and in brutally sharp focus.</p>
    <p>[Disclosure: In 2017 I made a lot of money
    <a href="/ongoing/When/201x/2017/12/19/How-To-Sell-Bitcoin-in-Canada">selling Bitcoins</a> at around $20K, ones
    <a href="/ongoing/When/201x/2013/04/09/I-bought-some-BitCoins">I’d bought in 2013</a>.  Then in 2021 I
    <a href="/ongoing/When/202x/2021/06/26/Shorting-Bitcoin">lost money shorting Bitcoin</a> (but I’m still ahead on this
    regrettable game).]</p>
    <h2 id='p-1'>What is a Bitcoin?</h2>
    <p>It is verifiable proof that a large amount of computing has been done. Let’s measure it in carbon, and while
    it’s complicated and I’ve seen a range of answers, they’re all over 100 tonnes of CO<sub>2</sub>/Btc. That proof is all that a
    Bitcoin is.</p>
    <img src="https://www.tbray.org/ongoing/When/202x/2025/01/04/mine.png" alt="Bitcoin mine" />
    <p>Bitcoin is also a store of value.  It doesn’t matter whether you think it <em>should</em> be, empirically it <em>is</em>, because lots
    of people are exchanging lots of money for Bitcoins on the assumption that they will store the value of that money.  Is it a
    <em>good</em> store of value?  Many of us think not, but who cares what we think?</p>
    <h2 id='p-2'>Is Bitcoin useful?</h2>
    <p>I mean, sure, there are currency applications in gun-running, ransoms, narcotics, and sanctions-dodging. But nope, the blockchain
    is so expensive and slow that all most people can really do with Bitcoin is refresh their wallets hoping to see number go up.</p>
    <h2 id='p-3'>Bitcoin and late capitalism</h2>
    <p>The success of Bitcoin teaches the following about capitalism in the 2020s:</p>
    <ol>
      <li><p>Capitalism doesn’t care about aesthetics. Bitcoins in and of themselves in no way offer any pleasure to any human.</p></li>
      <li><p>Capitalism doesn’t care about negative externalities generally, nor about the future of the planet in particular. As
      long as the number goes up, the CO<sub>2</sub> tonnage is simply invisible. Even as LA burns.</p></li>
      <li><p>Capitalism can be oblivious to the sunk-cost fallacy as long as people are making money right now.</p></li>
      <li><p>Capitalism doesn’t care about utility; the fact that you can’t actually <em>use</em> Bitcoins for anything is apparently
      irrelevant.</p></li>
      <li><p>And oblivious about crime too. The fact that most actual use of Bitcoins as a currency carries the
      stench of international crime doesn’t seem to bother anyone.</p></li>
      <li><p>Capitalism doesn’t care about resiliency or sustainability. Bitcoins are fragile; very easy to lose forever by
      forgetting a password or failing to back up data just right. Also, on the evidence, easy to steal.</p></li>
      <li><p>Capitalism can get along with obviously crazy behavior, for example what MicroStrategy is doing: Turning a third-rate
      software company into a bag of 
      Bitcoins and having an equity valuation that is higher than the value of the bag; see
      <a href="https://www.bloomberg.com/opinion/articles/2025-01-06/mba-class-project-got-a-bit-too-real">Matt Levine</a> (you have
      to scroll down a bit, look for “MicroStrategy”).</p></li>
      <li><p>Capitalism says: “Only money is real. Those other considerations are for amateurs. Also, fuck the future.”</p></li>
    </ol>
    <h2 id='p-4'>Do I hate capitalism?</h2>
    <p>Not entirely. As Paul Krugman
    <a href="https://paulkrugman.substack.com/p/trade-in-the-ruins-wonkish">points out</a>, a market-based economy can in practice
    deliver reasonably good results for a reasonably high proportion of the population, as America’s did in the decades following
    1945. Was that a one-time historical aberration? Maybe.</p>
    <p>But as for what capitalism has become in the 21st century? Everything got financialized and
    Bitcoin isn’t the disease, it’s just a highly visible symptom.
    Other symptoms: The explosion of homelessness, the destruction of my children’s ecosystem, the gig economy, and the pervasiveness of
    wage theft. It’s really hard to find a single kind word to say.</p> 
    <h2 id='p-5'>Are Bitcoins dangerous?</h2>
    <p>Not existentially. I mean, smart people are worried, for example 
    <a href="https://www.ft.com/content/25d078a1-0a64-4370-bca8-f19a6b5e8255">Rostin Behnam,
    chair of the Commodity Futures Trading Commission</a>: “You
    still have a large swath of the digital asset space unregulated in the US regulatory system and it’s important — given the
    adoption we’ve seen by some traditional financial institutions, the huge demand for these products by both the retail and
    institutional investors — that we fill this gap.”</p>
    <p>All that granted, the market cap of Bitcoin is around two trillion US dollars as I write this. Yes, that’s a lot of money. But
    most of them are held by market insiders, so even in the (plausible) case that it plunges close to zero, the damage to the
    mainstream economy shouldn’t be excessive.</p>
    <p>It’s just immensely annoying.</p>
    <h2 id='p-6'>Bitcoin and gold</h2>
    <p>One of the things Bitcoin teaches us is that there is too much money in the world, more than can be put to work in sensible
    investments. So the people who have it do things like buy Bitcoins.</p>
    <p>Gold is also a store of value, also mostly just because people believe it is. But it has the virtues of beauty and of applications in
    jewellery and electronics. I dunno, I’m seriously thinking about buying some on the grounds that the people who have too much
    money are going to keep investing in it. In particular if Bitcoin implodes.</p>
    <h2 id='p-7'>Having fun staying poor</h2>
    <p>I’ve been snarling at cryptocurrencies since 2018 or so. But, number go up. So I’ll close by linking to 
    <a href="https://www.ft.com/content/8533f856-57f1-4765-a3dc-d866543092be">HODLers apology</a>.</p>
    <h2 id='p-8'>Question</h2>
    <p>Is this the best socio-economic system we as a species can build?</p>
</div></content></entry>

<entry>
 <title>QRS: Dot-matching Redux</title>
 <link href='https://www.tbray.org/ongoing/When/202x/2024/12/29/Matching-Dot-Redux' />
 <link rel='replies'        thr:count='1'        type='application/xhtml+xml'        href='/ongoing/When/202x/2024/12/29/Matching-Dot-Redux#comments' />
 <id>https://www.tbray.org/ongoing/When/202x/2024/12/29/Matching-Dot-Redux</id>
 <published>2024-12-29T12:00:00-08:00</published>
 <updated>2024-12-30T16:02:50-08:00</updated>
 <category scheme='https://www.tbray.org/ongoing/What/' term='Technology/Software' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='Technology' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='Software' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='Technology/Quamina Diary' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='Quamina Diary' />
 <summary type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>Recently I posted     <a href='/ongoing/When/202x/2024/12/18/Matching-Dot-in-UTF8'>Matching “.” in UTF-8</a>, in which I claimed that you could match     the regular-expression “<code>.</code>” in a UTF-8 stream with either four or five states in a byte-driven finite automaton,     depending how      you define the problem.  That statement was arguably wrong, and you might need three more states, for a total of eight. But you      can make a case that really, only four should be needed, and another case calling for quite a few more.     Because that phrase “depending how you define the problem” is doing a lot of work</div></summary>
<content type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>
    <p>Recently I posted
    <a href="/ongoing/When/202x/2024/12/18/Matching-Dot-in-UTF8">Matching “.” in UTF-8</a>, in which I claimed that you could match
    the regular-expression “<code>.</code>” in a UTF-8 stream with either four or five states in a byte-driven finite automaton,
    depending how 
    you define the problem.  That statement was arguably wrong, and you might need three more states, for a total of eight. But you 
    can make a case that really, only four should be needed, and another case calling for quite a few more.
    Because that phrase “depending how you define the problem” is doing a lot of work.</p>
    <p>But first, thanks:
    <a href="https://functional.cafe/@edavies">Ed Davies</a>, whose blog contributions
    (<a href="/ongoing/When/202x/2024/12/18/Matching-Dot-in-UTF8#c1734780103.136152">1</a>,
    <a href="/ongoing/When/202x/2024/12/18/Matching-Dot-in-UTF8#c1734970677.112348">2</a>,
    <a href="/ongoing/When/202x/2024/12/18/Matching-Dot-in-UTF8#c1735151411.984021">3</a>) were getting insufficient attention from
    me until
    <a href="https://chaos.social/@dpk">Daphne Preston-Kendal</a> insisted I look more closely.</p>
    <p>To summarize Ed’s argument: There are a bunch of byte combinations that look (and work) like regular UTF-8 but are explicitly
    ruled out by the Unicode spec, in particular
    <a href="https://www.unicode.org/versions/latest/core-spec/chapter-3/#G31703">Section 3.9.3</a> and
    its Table 3.7.</p>
    <h2 id='p-1'>Moar States!</h2>
    <p>Ed posted a nice picture of a corrected 8-state automaton that will fail to match any of these forbidden
    sequences.</p>
    <img src="https://www.tbray.org/ongoing/When/202x/2024/12/29/edavies-machine.png" alt="Ed Davies’ corrected UTF-8 state machine" />
    <div class='caption'><p>(Original SVG
    <a href="https://edavies.me.uk/paste/R2XVFXpjcIiVq9FkaZ2u7ZUC/utf8.svg">here</a>.)</p></div>
    <p>I looked closely at Ed’s proposal and it made sense, so I implemented it and (more important) wrote a bunch of unit tests
    exploring the code space, and it indeed seems to accept/reject everything correctly per Unicode 3.9.3.</p>
    <p>So, argument over, and I should go forward with the 8-state Davies automaton, right?
    Why am I feeling nervous and grumpy, then?</p>
    <h2 id='p-2'>Not all Unicode</h2>
    <p>I’ve already mentioned in this series that your protocols and data structures just gotta support Unicode in the 21st century,
    but you almost certainly don’t want to support all the Unicode characters, where by “character” I mean, well… if you care at all
    about this stuff, please go read
    <a href="https://www.ietf.org/archive/id/draft-bray-unichars-10.html">Unicode Character Repertoire Subsets</a> (“Unichars for
    short), a draft inching 
    its way through the IETF, with luck an RFC some day. And if you <em>really</em> care, dig into
    <a href="https://datatracker.ietf.org/doc/html/rfc7564">RFC 3454: PRECIS Framework: Preparation, Enforcement, and Comparison of
    Internationalized Strings in Application Protocols</a>. Get a coffee first, PRECIS has multiple walls of text and isn’t
    simple at all. But it goes to tremendous lengths to address security issues and other best practices.</p>
    <p>If you don’t have the strength, take my word for it that the following things are true:</p>
    <ol>
      <li><p>We don’t talk much about abstract characters; instead focus on the numeric “code points” that represent them.</p></li>
      <li><p>JSON, for historical reasons, accepts all the code points.</p></li>
      <li><p>There are several types of code points that don’t represent characters: “Surrogates”, “controls”, and
      “noncharacters”.</p></li>
      <li><p>There are plenty of code points that are problematic because they can be used by phishers and other attackers
      to fool their victims because they look like other characters.</p></li>
      <li><p>There are characters that you shouldn’t use because they represent one or another of the temporary historical hacks
      used in the process of migrating from previous encoding schemes to Unicode.</p></li>
    </ol>
    <p>The consequence of all this is that there are many subsets of Unicode that you might want to restrict users of your protocols
    or data structures to:</p>
    <ol>
      <li><p>JSON characters: That is to say, all of them, including all the bad stuff.</p></li>
      <li><p>Unichars “Scalars”: Everything except the surrogates.</p></li>
      <li><p>Unichars “XML characters”: Lots but not all of the problematic code points excluded.</p></li>
      <li><p>Unichars “Unicode Assignables”: “All code points that are currently assigned, excluding legacy control codes, or that might in
      future be assigned.”</p></li>
      <li><p>PRECIS “IdentifierClass”: “Strings that can be used to refer to, include, or communicate protocol strings like
      usernames, filenames, data feed identifiers, and chatroom name.”</p></li>
      <li><p>PRECIS “FreeformClass”: “Strings that can be used in a free-form way, e.g., as a password in an authentication exchange
      or a nickname in a chatroom.”</p></li>
      <li><p>Some variation where you don’t accept any unassigned code points; risky, because that changes with every Unicode
      release.</p></li>
    </ol>
    <p>(I acknowledge that I am unreasonably fond of numbered lists, which is probably an admission that I should try harder to
    compose smoothly-flowing linear arguments that don’t need numbers.)</p>
    <p>You’ll notice that I didn’t provide links for any of those entries. That’s because you really shouldn’t pick one without
    reading the underlying document describing why it exists.</p>
    <h2 id='p-3'>What should you accept?</h2>
    <p>I dunno. None of the above are crazy.  I’m kind of fond of Unicode Assignables, which I co-invented. The only thing I’m sure
    of is that you should <em>not</em> go with JSON Characters, because of the fact that its rules make the following chthonic
    horror perfectly legal:</p>
    <blockquote><pre><code>{"example": "\u0000\u0089\uDEAD\uD9BF\uDFFF"}</code></pre></blockquote>
    <p>Unichars describes it:</p>
    <blockquote><p>The value of the “example” field contains the C0 control NUL, the C1 control "CHARACTER TABULATION
    WITH JUSTIFICATION", an unpaired surrogate, and the noncharacter U+7FFFF encoded per JSON rules as two escaped UTF-16 surrogate
    code points. It is unlikely to be useful as the value of a text field. That value cannot be serialized into well-formed UTF-8,
    but the behavior of libraries asked to parse the sample is unpredictable; some will silently parse this and generate an
    ill-formed UTF-8 string.</p></blockquote>
    <p>No, really.</p>
    <h2 id='p-4'>What is Quamina for?</h2>
    <p>If you’re wondering what a “Quamina” is, you probably stumbled into this post through some link and, well, there’s a lot of
    history. Tl;dr: 
    <a href="https://github.com/timbray/quamina">Quamina</a> is a pattern-matching library in Go with an unusual (and fast)
    performance envelope; it can match thousands of Patterns to millions of JSON blobs per second.  For much, much more, peruse the
    <a href="/ongoing/What/Technology/Quamina%20Diary/">Quamina Diary</a> series on this blog.</p>
    <p>Anyhow, all this work in being correctly restrictive as to the shape of the incoming UTF-8 was making me uncomfortable.
    Quamina is about telling you what byte patterns are in your incoming data, not enforcing rules about what
    <em>should</em> be there.</p>
    <p>And it dawned on me that it might be useful to ask Quamina to look at a few hundred thousand inputs per second and tell you
    which had ill-formed-data problems.  Quamina’s dumb-but-fast byte-driven finite automaton would be happy to do that, and very
    efficiently too.</p>
    <h2 id='p-5'>Conclusion</h2>
    <p>So, having literally lain awake at night fretting over this, here’s what I think I’m going to do:</p>
    <ol>
      <li><p>I’ll implement a new Quamina pattern called <code>ill-formed</code> or some such that will match any field that has
      busted UTF-8 of the kind we’ve been talking about here. It’d rely on an automaton that is basically the inverse of
      Davies’ state machine.</p></li>
      <li><p>By default, the meaning of “<code>.</code>” will be “matches the Davies automaton”; it’ll match
      well-formed UTF-8 matching all code points except surrogates.</p></li>
      <li><p>I’ll figure out how to parameterize regular-expression matches so you can change the definition of “<code>.</code>” to
      match one or more of the smaller subsets like those in the list above from Unichars and PRECIS.</p></li>
    </ol>
    <p>But who knows, maybe I’ll end up changing my mind again. I already have, multiple times. Granted that implementing regular
    expressions is hard, you’d think that matching “<code>.</code>” would be the easy part. Ha ha ha.</p>
</div></content></entry>

<entry>
 <title>QRS: Matching “.” in UTF-8</title>
 <link href='https://www.tbray.org/ongoing/When/202x/2024/12/18/Matching-Dot-in-UTF8' />
 <link rel='replies'        thr:count='10'        type='application/xhtml+xml'        href='/ongoing/When/202x/2024/12/18/Matching-Dot-in-UTF8#comments' />
 <id>https://www.tbray.org/ongoing/When/202x/2024/12/18/Matching-Dot-in-UTF8</id>
 <published>2024-12-18T12:00:00-08:00</published>
 <updated>2024-12-18T12:00:00-08:00</updated>
 <category scheme='https://www.tbray.org/ongoing/What/' term='Technology/Software' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='Technology' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='Software' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='Technology/Quamina Diary' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='Quamina Diary' />
 <summary type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>Back on December 13th, I     <a href='https://cosocial.ca/@timbray/113646778780834552'>posted a challenge</a> on Mastodon: In a simple UTF-8 byte-driven     finite automaton, how many states does it take to match the regular-expression construct “<code>.</code>”, i.e. “any character”?     Commenter     <a href='https://www.justsoftwaresolutions.co.uk/blog'>Anthony Williams</a> responded,      <a href='/ongoing/When/202x/2024/12/12/Quamina-Regular-Expression-Series#c1734082594.119452'>getting it almost right</a> I think,     but I found his description a little hard to understand. In this piece I’m going to dig into what     <code>.</code> actually means, and then how many states you need to match it.<br/> <i>[Update: Lots more on this subject and some of the material below is arguably wrong, but just “arguably”; see     <a href='/ongoing/When/202x/2024/12/29/Matching-Dot-Redux'>Dot-matching Redux</a>.]</i></div></summary>
<content type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>
    <p>Back on December 13th, I
    <a href="https://cosocial.ca/@timbray/113646778780834552">posted a challenge</a> on Mastodon: In a simple UTF-8 byte-driven
    finite automaton, how many states does it take to match the regular-expression construct “<code>.</code>”, i.e. “any character”?
    Commenter
    <a href="https://www.justsoftwaresolutions.co.uk/blog">Anthony Williams</a> responded, 
    <a href="/ongoing/When/202x/2024/12/12/Quamina-Regular-Expression-Series#c1734082594.119452">getting it almost right</a> I think,
    but I found his description a little hard to understand. In this piece I’m going to dig into what
    <code>.</code> actually means, and then how many states you need to match it.<br/>
    <i>[Update: Lots more on this subject and some of the material below is arguably wrong, but just “arguably”; see
    <a href="/ongoing/When/202x/2024/12/29/Matching-Dot-Redux">Dot-matching Redux</a>.]</i></p>
    <p>The answer surprised me. Obviously this is of
    interest only to the faction of people who are interested in automaton wrangling, problematic characters, and the finer
    points of UTF-8. I expect close attention from all 17 of you!</p> 
    <h2 id='p-1'>The answer is…</h2>
    <p>Four. Or five, depending.</p>
    <h2 id='p-2'>What’s a “Unicode character”?</h2>
    <p>They’re represented by “code points”, which are numbers in the range 0 … 17×2<sup>16</sup>, which is to say 1,114,112
    possible values. It turns out you 
    <a href="https://www.ietf.org/archive/id/draft-bray-unichars-10.html">don’t actually want to match all of them</a>; more on that
    later.</p>
    <h2 id='p-3'>How many states?</h2>
    <p>Quamina is a “byte-level automaton” which means it’s in a state, it reads a byte, looks up the value of that byte in a map
    yielding either the next state, or <code>nil</code>, which means no match. Repeat until you match or fail.</p>
    <p>What bytes are we talking about here? We’re talking about UTF-8 bytes.
    If you don’t understand UTF-8 the rest of this is going to be difficult. I wrote a short explainer called
    <a href="/ongoing/When/200x/2003/04/26/UTF">Characters vs. Bytes</a> twenty-one years ago. I now
    assume you understand UTF-8 and knew that code points are encoded as sequences of from 1 to 4 bytes.</p>
    <p>Let’s count!</p>
    <ol>
      <li><p>When you match a code point successfully you move to the part of the automaton that’s trying to match the next one;
      let’s call this condition <i>MATCHED</i>.</p>
      <p>(From here on, all the numbers are hex, I’ll skip the leading 0x. And all the ranges are inclusive.)</p></li> 
      <li><p>In multi-byte characters, all the UTF-8 bytes but the first have bitmasks like <code>10XX XXXX</code>, so there are six
      significant bits, thus 2<sup>6</sup> or 64 distinct possible values ranging from 80-BF.</p></li>
      <li><p>There’s a <i>Start</i> state. It maps
      byte values 00-7F (as in ASCII) to <i>MATCHED</i>. That’s our first state, and we’ve handled all the one-byte
      code points.</p></li>
      <li><p>In the <i>Start</i> state, the 32 byte values C0-DF, all of which begin <code>110</code> signaling a two-byte
      code point, are mapped to the <i>Last</i> state. In the <i>Last</i> state,
      the 64 values 80-BF are mapped to <i>MATCHED</i>. This takes care of all the two-byte code points and we’re up to two
      states.</p></li> 
      <li><p>In the <i>Start</i> state, the 16 byte values E0-EF, all of which begin <code>1110</code> signaling a three-byte code
      point, are mapped to the <i>LastInter</i> state. In that
      state, the 64 values 80-BF are mapped to the <cite>Last</cite> state. Now we’re up to three states and we’ve handled the
      three-byte code points.</p></li>
      <li><p>In the <i>Start</i> state, the 8 byte values F0-F7, all of which begin 11110 signaling a four-byte code point, are
      mapped to the <i>FirstInter</i> state. In that state, 
      the 64 values 80-BF are mapped to the <i>LastInter</i> state. Now we’ve handled all the code points with four states.</p></li>
    </ol>
    <h2 id='p-6'>But wait!</h2>
    <p>I mentioned above about not wanting to match all the code points. “Wait,” you say, “why wouldn’t you want to be maximally
    inclusive?!” Once again, I’ll link to
    <a href="https://www.ietf.org/archive/id/draft-bray-unichars-10.html">Unicode Character Repertoire Subsets</a>, a document I
    co-wrote that is making its way through the IETF and may become an RFC some year. I’m not going to try to summarize a draft that
    bends over backwards to be short and clear; suffice it to say that there are good reasons for leaving out several different
    flavors of code point.</p>
    <p>Probably the most pernicious code points are the “Surrogates”, U+D800-U+DFFF. If you want an explanation of what they are and
    why they’re bad, go read that <cite>Repertoire Subsets</cite> draft or just take my word for it. If you were to encode them per
    UTF-8 rules (which the UTF-8 spec says you’re not allowed to), the low and high bounds would be ED,A0,80 and ED,BF,BF.</p>
    <p>Go’s UTF-8 implementation agrees that Surrogates Are Bad and The UTF-8 Spec Is Good and flatly refuses to convert those UTF-8
    sequences into code points or vice versa. The resulting subset of code points even has a catchy name: Unicode Scalars. Case
    closed, right?</p> 
    <p>Wrong. Because JSON was designed before we’d thought through these problems, explicitly saying it’s OK to include
    any code point whatsoever, including surrogates. And Quamina is used for matching JSON data. So, standards fight!</p>
    <p>I’m being a little unfair here. I’m sure that if Doug Crockford were inventing JSON now instead of in 2001, he’d exclude
    surrogates and probably some of the other problematic code points discussed in that <cite>Subsets</cite> doc.</p>
    <p>Anyhow, Quamina will go with Go and exclude surrogates.
    Any RFC8259 purists out there, feel free accuse me of 
    standards apostasy and I will grant your point but won’t change Quamina. Actually, not true; at some point I’ll probably add an
    option to be <em>more</em> restrictive and exclude more than just surrogates.</p>
    <p>Which means that now we have to go back to the start of this essay and figure out how many states it takes to match
    “<code>.</code>” Let’s see…</p>
    <ol>
      <li><p>The <i>Start</i> state changes a bit. See #5 in the list above. Instead of mapping all of E0-EF to the <i>LastInter</i>
      state, it maps one byte in that range, ED, to a new state we’ll call, let’s see, how about <i>ED</i>.</p></li>
      <li><p>In <i>ED</i>, just as in <i>LastInter</i>, 80-9F are mapped to <i>Last</i>. But A0-BF aren’t mapped to anything,
      because on that path lie the surrogates.</p></li>
    </ol>
    <p>So, going with the Unicode Scalar path of virtue means I need five states, not four.</p>
</div></content></entry>

<entry>
 <title>1994 Hong Kong Adventure</title>
 <link href='https://www.tbray.org/ongoing/When/202x/2024/12/14/Hong-Kong-Ferries-1994' />
 <link rel='replies'        thr:count='2'        type='application/xhtml+xml'        href='/ongoing/When/202x/2024/12/14/Hong-Kong-Ferries-1994#comments' />
 <id>https://www.tbray.org/ongoing/When/202x/2024/12/14/Hong-Kong-Ferries-1994</id>
 <published>2024-12-14T12:00:00-08:00</published>
 <updated>2024-12-15T10:07:02-08:00</updated>
 <category scheme='https://www.tbray.org/ongoing/What/' term='The World/Places/Hong Kong' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='The World' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='Places' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='Hong Kong' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='The World/Food and Drink' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='Food and Drink' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='Arts/Photos' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='Arts' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='Photos' />
 <summary type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>This story is about Hong Kong and mountains and ferries and food and beer.      What happened was, there’s a thirty-year-old picture I wanted to share and it brought the story to mind. I was sure I’d written it     up but can’t find it here on the blog, hard as I try, so here we go. Happy ending promised!</div></summary>
<content type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>
    <p>This story is about Hong Kong and mountains and ferries and food and beer. 
    What happened was, there’s a thirty-year-old picture I wanted to share and it brought the story to mind. I was sure I’d written it
    up but can’t find it here on the blog, hard as I try, so here we go. Happy ending promised!</p>
    <p>The picture I wanted to share is from a business trip to Hong Kong in 1994 and hey, it turns out I have lots more pictures
    from that trip.</p>
    <img src="https://www.tbray.org/ongoing/When/202x/2024/12/14/2110.png" alt="Kai Tak airport in 1994" />
    <div class='caption'><p>Kai Tak airport in 1994.</p></div>
    <img src="https://www.tbray.org/ongoing/When/202x/2024/12/14/2112.png" alt="A sketchy corner of Kowloon in 1994" />
    <div class='caption'><p>Rats for sale in a sketchy corner of Kowloon.</p></div>
    <img src="https://www.tbray.org/ongoing/When/202x/2024/12/14/2115.png" alt="Hong Kong, mainland side, 1994" />
    <p>Kai Tak, what an airport that was. If you could open the plane’s windows, you’d have been able to grab laundry hung to dry on
    people’s balconies. My fast-talking HK friend said “Safest airport in the world! You know pilot paying 100% attention!”</p>
    <p>My trip extended over a weekend and I wanted to get out of town so I read up on interesting walks; on paper of
    course, the Web only just barely existed.
    <a href="https://en.wikipedia.org/wiki/Lantau_Island">Lantau Island</a> was recommended; there was a good hike up over the local
    mountains that reached a Trappist monastery with a well-reviewed milk bar. So I took the ferry from Central to Mui Wo.</p>
    <p>The view from the ferry was great!</p>
    <img src="https://www.tbray.org/ongoing/When/202x/2024/12/14/2128.png" alt="View from the Mui Wo ferry" />
    <img src="https://www.tbray.org/ongoing/When/202x/2024/12/14/2144.png" alt="The Mui Wo docks" />
    <p>I revisited Mui Wo in 2019,
    <a href="/ongoing/When/201x/2019/04/07/Visiting-Buddha">visiting the Big Buddha</a>.</p>
    <p>It was easy to find the hiking trail up the mountains, well-maintained but steep. I stopped to take pictures maybe more often
    than strictly necessary because it was in the high Celsius thirties with 99% humidity and my North-Euro metabolism wasn’t
    dealing well. Visions of Trappist ice-cream danced in my head as the sweat dripped off my chin.</p>
    <img src="https://www.tbray.org/ongoing/When/202x/2024/12/14/2145.png" alt="Lantau Island countryside" />
    <img src="https://www.tbray.org/ongoing/When/202x/2024/12/14/2151.png" alt="Lantau Island countryside" />
    <p>Having said that, I’m glad I
    stopped because the pictures please my eye.  These are all Ektachrome; can’t remember whether I took them with
    the Pentax SLR or the little Nikon pocket camera.</p>
    <p>Lantau has the new international airport on it now; I wonder if those green hills are still unspoiled.</p>
    <p>Eventually, sweat-soaked and my body screaming for mercy, I reached a small mountaintop. I could see the monastery, but it was
    a couple of little mountains over, so I arrived in poor condition. Sadly for me, it was a Sunday so, commerce deferring to
    the sacred, the joint was closed. Poor Tim. Especially since I hadn’t brought anything to eat.</p>
    <p>Fortunately I didn’t have to hike all the way back to Mui Wo; Almost straight downhill there there was a “Monastery Pier” with
    an occasional ferry to the nearby islet of
    <a href="https://en.wikipedia.org/wiki/Peng_Chau">Peng Chau</a> and a connection back to Central. Looks like
    <a href="https://www.blueseaferry.com.hk/en/pc6/">there still is</a>.</p>
    <p>It was midafternoon, the heat approaching its peak, and walking downhill has its own stresses and strains. By the time I got
    to the pier I was a sad excuse for a human.  Here’s a picture of the ferry.</p>
    <img src="https://www.tbray.org/ongoing/When/202x/2024/12/14/2158.png" alt="Inside a small wooden ferryboat, full of Chinese people" />
    <p>As you can see, it was pretty crowded, but
    unsurprisingly, nobody wanted to share the bench the big sweaty panting hungry-looking pink person was on.</p>
    <p>Peng Chau itself was visually charming but the ferry connection was tight so I couldn’t explore.</p>
    <img src="https://www.tbray.org/ongoing/When/202x/2024/12/14/2160.png" alt="Peng Chau" />
    <div class='caption'><p>Peng Chau waterfront in 1994. This is the picture I wanted to share that led me to (re?)tell this story.
    My conversational-media home on the Net is
    <a href="https://cosocial.ca/@timbray">on Mastodon</a>, but I like to keep an eye on Bluesky, so I post random pictures there
    under the tag
    <a href="https://bsky.app/search?q=%23blueskyabove">#blueskyabove</a>; this will be one.</p></div>
    <p>Trudging onto the
    medium-sized ferry back home, I encountered a food-service option: A counter with one guy and a big
    steaming pot of soup behind it. My spirit lifted. The guy’s outfit might have once been white; he was unshaven and sweaty but
    then so was I, and my clothes were nothing to write home about either.</p> 
    <p>I stopped and pointed at the bowls. He filled one, then wanted to upsell me on a leathery, greasy-looking fried egg to go
    on top but there are limits. Disappointed, he stepped aside to put it back, revealing a small glass-fronted fridge,
    icicles hanging off it, full of big cans of San Miguel beer. My spirit lifted again.</p>
    <p>The soup was salty and delicious. I’m not sure I’ve enjoyed a beer more in the thirty years since that day. The ferry was fast
    enough to generate a refreshing breeze all the way, and there were charming boats to photograph.</p>
    <img src="https://www.tbray.org/ongoing/When/202x/2024/12/14/2170.png" alt="Red and yellow motor boat with its sides lined with old tires" />
    <p>The tourist who walked off the boat at Central was a dry, well-hydrated, and cheerful
    specimen of humanity. The next day, my fast-talking HK friend said “You climb over Lantau in that weather yesterday? White guys
    so weird!” “It was great!” I told him, smirking obnoxiously.</p>
    <p>I’ve been back to HK a few times over the years, but it’s not really a happy place any more.</p>
</div></content></entry>

<entry>
 <title>QRS: Parsing Regexps</title>
 <link href='https://www.tbray.org/ongoing/When/202x/2024/12/12/QRS-Parsing-Regular-Expressions' />
 <link rel='replies'        thr:count='2'        type='application/xhtml+xml'        href='/ongoing/When/202x/2024/12/12/QRS-Parsing-Regular-Expressions#comments' />
 <id>https://www.tbray.org/ongoing/When/202x/2024/12/12/QRS-Parsing-Regular-Expressions</id>
 <published>2024-12-12T12:00:00-08:00</published>
 <updated>2024-12-13T14:34:29-08:00</updated>
 <category scheme='https://www.tbray.org/ongoing/What/' term='Technology/Software' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='Technology' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='Software' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='Technology/Quamina Diary' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='Quamina Diary' />
 <summary type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>Parsing regular expression syntax is hard. I’ve written a lot of parsers and,for this one, adopted a couple of new techniques     that I haven’t used before. I learned things that might be of general interest</div></summary>
<content type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>
    <p>Parsing regular expression syntax is hard. I’ve written a lot of parsers and,for this one, adopted a couple of new techniques
    that I haven’t used before. I learned things that might be of general interest.</p>
    <p>I was initially surprised that the problem was harder than it looked, but quickly realized that I shouldn’t have been, because
    my brain has also always had a hard time parsing them.</p>
    <p>They’re definitely a write-only syntax and just because I’m gleefully
    writing this series doesn’t mean I’m recommending you reach for REs as a tool very often.</p>
    <p>But I bet most people in my profession
    find themselves using them pretty regularly, in the common case where they’re the quickest path from A to B. And I know for
    sure that, on a certain number of occasions, they’ve ended up regretting that choice.</p>
    <p>Anyhow, I console myself with the thought that the I-Regexp RE dialect has less syntax and fewer footguns than PCREs
    generally. Plus, I’ve been having fun implementing them. So knock yourselves out. (Not legal nor investing advice.)</p>
    <h2 id='p-1'>Sample-driven development</h2>
    <p>When I started thinking seriously about the parser, the very first thought in my mind was “How in the freaking hell am I
    going to test this?” I couldn’t stand the thought of writing a single line of code without having a plausible answer.  Then it
    occurred to me that since I-Regexp subsets
    <a href="https://www.w3.org/TR/2004/REC-xmlschema-2-20041028/#regexs">XSD Regular Expressions</a>, and since XSD (which I
    mostly dislike) is widely deployed and used, maybe someone already wrote a test suite? So I stuck my head into an XML
    community space (still pretty vigorous after all these years) and asked “Anyone have an XSD regexp test suite?”</p>
    <p>And it worked! (I love this profession sometimes.)
    <a href="https://en.wikipedia.org/wiki/Michael_Howard_Kay">Michael Kay</a> pointed at me a few things notably including
    <a href="https://github.com/qt4cg/xslt40-test/tree/master/tests/misc/regex-syntax">this GitHub repo</a>. The
    <code>_regex-syntax-test-set.xml</code> there, too big to display, contains just under a thousand regular expressions, some
    valid, some not, many equipped with strings that should and should not match.</p>
    <p>The process by which I turned it into a <code>*_test.go</code> file, Dear Reader, was not pretty. I will not share the
    ugliness, which involved awk and emacs, plus hideous and largely untested one-off Go code.</p>
    <p>But I gotta say, if you have to write a parser for any anything, having 992 sample cases makes the job a whole lot less
    scary.</p>
    <p>Lesson: When you’re writing code to process a data format that’s new to you, invest time, before you start, in looking for samples.</p>
    <h2 id='p-2'>Recursive descent</h2>
    <p>The I-Regexp specification contains a
    <a href="https://www.rfc-editor.org/rfc/rfc9485.html#name-i-regexp-syntax">complete ABNF grammar</a> for the syntax. For writing
    parsers I tend to like finite-automaton based approaches, but for a freakishly complicated mini-language like this, I
    bowed in the direction of Olympus for that grammar and started recursively descending.</p>
    <p>I think at some point I understood the theory of Regular Languages and LL(1) and so on, but not any more. Having said that,
    the recursive-descent technique is conceptually simple, so I plowed ahead. And it worked eventually. But there seemed a lot of
    sloppy corners where I had to peek one byte ahead or backtrack one. Maybe if I understood LL(1) better it’d have
    been smoother.</p>
    <p>The “character-class” syntax <code>[abc0-9]</code> is particularly awful. The possible leading <code>-</code> or
    <code>^</code> makes it worse, and it has the usual <code>\</code>-prefixed stanzas. Once again, I salute the original
    specifiers who managed to express this in a usable grammar.</p>
    <p>I was tempted, but ended up making no use of Go’s <code>regexp</code> library to help me parse REs.</p>
    <p>I have to say that I don’t <em>like</em> the code I ended up with as much as any of my previous (automaton-based) parsers,
    nor as much as the rest of the Quamina code. But it seems to work OK. Speaking of that…</p>
    <h2 id='p-3'>Test coverage</h2>
    <p>When I eventually got the code to do the right thing for each of Michael Kay’s 992 test cases, I was feeling a warm glow. So
    then I ran the test-coverage tool, and got a disappointingly-low number. I’m not a 100%-coverage militant generally, but I am for
    ultra-low-level stuff like this with a big blast radius.</p>
    <p>And here’s the lesson: Code coverage tools are your friend. I went in and looked at the green and red bars; they revealed that while
    my tests had passed, I was really wrong in my assumptions about the paths they would make the code take.  Substantial
    refactoring ensued.</p>
    <p>Second, and somewhat disappointingly, there were a lot of coverage misses on Go’s notorious little <code>if err != nil</code>
    stanza. Which revealed that my sample set didn’t cover the RE-syntax space quite as thoroughly as I’d hoped. In particular,
    there was really no coverage of the code’s reaction to malformed UTF-8.</p>
    <p>The reason I’m writing this is to emphasize that, even if you’re in a shop where the use of code-coverage tools is
    (regrettably) not required, you should use one anyhow, on basically every important piece of code. I have absolutely never
    failed to get surprises, and consequently improved code, by doing this.</p>
    <h2 id='p-4'>Sharing the work</h2>
    <p>I don’t know if I-Regexp is going to be getting any uptake, but it wouldn’t surprise me if it did; it’s a nice tractable
    subset that hits a lot of use cases. Anyhow, now I have reasonably robust and well-tested I-Regexp parsing code. I’d like to
    share it, but there’s a problem.</p>
    <p>To do that, I’d have to put it in a separate repo; nobody would want to import all of Quamina, which is a fair-sized library,
    just to parse REs. But then that other repo would become a Quamina dependency. And one of my favorite things about Quamina is
    that it has
    <a href="/ongoing/When/202x/2024/09/04/0dependencies">0 dependencies!</a></p>
    <p>It’s not obvious what the right thing to do is; any ideas?</p>
</div></content></entry>

<entry>
 <title>QRS: Quamina Regexp Series</title>
 <link href='https://www.tbray.org/ongoing/When/202x/2024/12/12/Quamina-Regular-Expression-Series' />
 <link rel='replies'        thr:count='4'        type='application/xhtml+xml'        href='/ongoing/When/202x/2024/12/12/Quamina-Regular-Expression-Series#comments' />
 <id>https://www.tbray.org/ongoing/When/202x/2024/12/12/Quamina-Regular-Expression-Series</id>
 <published>2024-12-12T12:00:00-08:00</published>
 <updated>2024-12-12T12:00:00-08:00</updated>
 <category scheme='https://www.tbray.org/ongoing/What/' term='Technology/Software' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='Technology' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='Software' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='Technology/Quamina Diary' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='Quamina Diary' />
 <summary type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>Implementing regular expressions is hard. Hard in interesting ways that make me want to share the lessons. Thus this series,     QRS for short</div></summary>
<content type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>
    <p>Implementing regular expressions is hard. Hard in interesting ways that make me want to share the lessons. Thus this series,
    QRS for short.</p>
    <p>People who keep an eye on my
    <a href="/ongoing/What/Technology/Quamina%20Diary/">Quamina</a> open-source pattern-matching project will have noticed a recent
    absence of updates and conversation. That’s because, persuant to
    <a href="https://github.com/timbray/quamina/issues/66">Issue #66</a>, I’m working on adding fairly-full regular-expression
    matching.</p>
    <h2 id='p-4'>Personal note</h2>
    <p>This is turning out to be hard. Either it’s the hardest nut I’ve had to crack in many years, or maybe my
    advanced age is dulling my skills. It’s going to be some time before I can do the first incremental release.  Whatever; the
    learning experiences coming out of this work still feel fresh and fascinating and give me the urge to share.</p>
    <p>I hope I can retain that urge as long as I’m still mentally present. In fact, I hope I can retain the ability to work on
    software. For various reasons, I’ve been under a lot of
    <a href="/ongoing/When/202x/2023/10/25/Wild-World">personal stress</a> in recent years. Stealing time from my adult
    responsibilities to wrestle with executable abstractions has been a pillar of my sanity.</p>
    <p>Anyhow, normally when I code I blog about it, but so far I haven’t because the work is unfinished. Then I realized
    that it’s too big, and addresses too many distinct problems, to be just one piece, thus this mini-series.</p>
    <p>[Readers who don’t know what regular expressions are should probably close this tab now. Don’t feel guilty, nobody
    who’s not a full-time computing professional should have to know much less care.]</p>
    <p>[Notation: I’m gonna say “Regexp” or maybe just “RE” in this series.]</p>
    <p>I’ll use this post as a table of contents:</p>
    <ol>
      <li><p>
      <a href="/ongoing/When/202x/2024/12/12/QRS-Parsing-Regular-Expressions">Parsing RE syntax.</a>.</p></li>
      <li><p><a href="/ongoing/When/202x/2024/12/18/Matching-Dot-in-UTF8">Matching “.” in UTF-8</a>.</p></li>
      <li><p><a href="/ongoing/When/202x/2024/12/29/Matching-Dot-Redux">Dot-matching Redux</a>.</p></li>
      <li><p>(Future) Representing parsed REs.</p></li>
      <li><p>(Future) Implementing UTF-8 based automata for REs.</p></li>
    </ol>
    <p>At the moment, I think the hardest part of the work is #1, Parsing. (Maybe that’s because I haven’t really dug very deep into
    other parts yet.) I’d be amazed if the final series had only three parts.</p>
    <p>Now, introductory material.</p>
    <h2 id='p-3'>Which regular expressions?</h2>
    <p>They come in lots of flavors. The one I’m implementing is
    <a href="https://www.rfc-editor.org/rfc/rfc9485.html">I-Regexp, RFC 9485</a>. The observant reader will notice that I co-edited
    that RFC, and I cheerfully confess to bias.</p>
    <p>I-Regexp is basically a subset of
    <a href="https://www.w3.org/TR/2004/REC-xmlschema-2-20041028/#regexs">XSD Regular Expressions</a> (chosen to subset because they
    have a nice clean immutable spec), which are a lot like good ol’ PCRE (Perl-compatible regular expressions). Except for:</p>
    <ol>
      <li><p>They are designed assuming they will only ever be used to match against a string and return a “yes” or “no”
      answer.</p></li>
      <li><p>They are anchored, which is to say that (unlike PCREs) they’re all assumed to start with <code>^</code> and end with
      <code>$</code>.</p></li>
      <li><p>They omit popular single-character escapes like <code>\w</code> and <code>\S</code> because those are sketchy in the
      Unicode context.</p></li>
      <li><p>They don’t have capture groups or back-references.</p></li>
      <li><p>They don’t support character class subtraction, e.g. <nobr><code>[a-z-m-p]</code></nobr>.</p></li>
    </ol>
    <p>I’m going to claim that they hit a very useful 80/20 point if what you’re interested is asking “Did the field value match?”
    which of course is all Quamina is interested in doing.</p>
    <h2 id='p-5'>Project strategy</h2>
    <p>I’m totally not going to try to do all this as a big bang. I’ve got a reliable RE parser now (it was hard!) that recognizes
    ten different RE features, ranging from <code>.</code> to everything in
    <nobr><code>(a+b*c?).|d[ef]{3,9}\?\P{Lu}</code></nobr>. I’m planning to roll them out a feature
    at a time, but to refuse to accept REs that use features I haven’t implemented yet.</p>
    <h2 id='p-7'>Unbackslashing again</h2>
    <p>Go check out
    <a href="ongoing/When/202x/2024/09/22/Unbackslashing">Unbackslash</a>.
    Tl;dr: It’s terribly painful to deal with the standard RE escaping character <code>\</code> in Go software that is processing
    JSON. Because both Go and JSON use <code>\</code> for escaping and your unit tests eventually fill up with <code>\\</code> and
    <code>\\\\\\\\</code> and become brutally hard to read. So after publishing that blog piece and running polls on Mastodon,
    <code>~</code> is the new <code>\</code>. So that RE above becomes <code>(a+b*c?).|d[ef]{3,9}~?~P{Lu}</code>.</p>
    <p>You’re allowed to not like it. But I request that you hold off pushing the big button that sends me to Hell until you’ve
    tried writing a few unit tests for REs that you want Quamina to process.</p>
    <p>Back to strategy: The first feature is going to be that lovely little dot operator. And thus…</p>
    <h2 id='p-6'>Quiz</h2>
    <p>Just for fun, here’s an intellectual challenge. Suppose you’re building a byte-at-a-time state machine to process UTF-8 text. How
    many states, roughly, would it take to match <code>.</code>, i.e. any single Unicode code point? By “match” I mean reject
    any byte sequence that 
    doesn’t, and when it does match, consume just enough bytes to leave you positioned after the <code>.</code> and ready to start
    matching whatever’s next.</p>
    <p>I <em>think</em> I’ve found the correct answer. It surprised me, so I’m still sanity-checking, but I think I’m right. I am
    convinced the problem isn’t as simple as it looks.</p>
</div></content></entry>

<entry>
 <title>Remembering Bonnie</title>
 <link href='https://www.tbray.org/ongoing/When/202x/2024/12/02/Remembering-Bonnie' />
 <link rel='replies'        thr:count='8'        type='application/xhtml+xml'        href='/ongoing/When/202x/2024/12/02/Remembering-Bonnie#comments' />
 <id>https://www.tbray.org/ongoing/When/202x/2024/12/02/Remembering-Bonnie</id>
 <published>2024-12-02T12:00:00-08:00</published>
 <updated>2024-12-04T12:24:40-08:00</updated>
 <category scheme='https://www.tbray.org/ongoing/What/' term='Technology/Storage' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='Technology' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='Storage' />
 <summary type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>The murderer I emailed with is still in prison. And the software that got him pissed off at me still runs, so I ran it.     Now here I am to pass on the history and then go all geeky. Here’s the tell: If you don’t know what a “filesystem” is (that’s     perfectly OK, few reasonable adults need to) you might want to stay for the murderer story then step off the     train</div></summary>
<content type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>
    <p>The murderer I emailed with is still in prison. And the software that got him pissed off at me still runs, so I ran it.
    Now here I am to pass on the history and then go all geeky. Here’s the tell: If you don’t know what a “filesystem” is (that’s
    perfectly OK, few reasonable adults need to) you might want to stay for the murderer story then step off the
    train.</p>
    <p>Filesystems are one of the pieces of software that computers need to run, where “computers” includes your phone and laptop and
    each of the millions of servers that drive the Internet and populate the cloud. There are many flavors of filesystem and
    people who care about them care a lot.</p>
    <p>One of the differences between filesystems is how fast they are. This matters because how fast the apps you use run depends
    (partly) on how fast the underlying filesystems are.</p>
    <p>Writing filesystem software is very, very difficult and people who have done this earn immense respect from their peers. So,
    a lot of people try.  One of the people who succeeded was named Hans Reiser and for a while his “ReiserFS” filesystem was heavily
    used on many of those “Linux” servers out there on the Internet that do things for you.</p>
    <p>Reiser at one point worked in Russia and used a “mail-order bride” operation to look for a spouse. He ended up
    marrying Nina Sharanova, one of the bride-brokerage translators, and bringing her back to the US with him. They had two kids,
    got divorced, and then, on 
    September 3, 2006, he strangled her and buried her in a hidden location.</p>
    <p>To make a long story short, he eventually pleaded guilty to
    a reduced charge in exchange for revealing the grave location, and remains in prison.  I haven’t provided any links because it’s
    a sad, tawdry story, but if you want to know the details the Internet has them.</p>
    <p>I had interacted with Reiser a few times as a consequence of having written a piece of filesystem-related software called
    “Bonnie” (more on Bonnie below). I can’t say he was obviously murderous but I found him unpleasant to deal with.</p>
    <p>As you might imagine, people generally did not want to keep using the murderer’s filesystem software, but it takes a long
    time to make this kind of infrastructure change and just last month, ReiserFS was removed as a Linux option. Which led to
    this Mastodon exchange:</p>
    <img src="https://www.tbray.org/ongoing/When/202x/2024/12/02/linux-reiserfs.png" alt="Mastodon post about removal of ReiserFS from Linux" />
    <div class='caption'><p>Here’s a
    <a href="https://cosocial.ca/@timbray/113522946844951454">link to that post</a> and the conversation that followed.</p></div>
    <p>(People who don’t care about filesystems can stop reading now.)</p>
    <h2 id='p-3'>Now, numbers</h2>
    <p>After that conversation, on a whim I tracked down the Bonnie source and ran it on my current laptop, a 2023 M2 MacBook Pro with
    32G of RAM and 3T of disk. I think the numbers are interesting in and of themselves even before I start discoursing about
    benchmarking and filesystems and disks and so on.</p>
    <code style="font-size: 125%;"><nobr>               -------Sequential Output--------- ---Sequential Input--- --Random--</nobr>
<nobr>               -Per Char- --Block---  -Rewrite-- -Per Char-  --Block--- --Seeks---</nobr>
<nobr>Machine     GB M/sec %CPU M/sec %CPU  M/sec %CPU M/sec %CPU  M/sec %CPU  /sec %CPU</nobr>
<nobr>MBP-M2-32G  64  56.9 99.3  3719 89.0   2772 83.4  59.7 99.7   6132 88.0 33613 33.6</nobr></code>
    <p>Bonnie says:</p>
    <ol>
      <li><p>This puppy can write 3.7 GB/second to a file, and read it back at 6.1GB/sec.</p></li>
      <li><p>It can update a file in place at 2.8 GB/sec.</p></li>
      <li><p>It can seek around randomly in a 64GB file at 33K seeks/second.</p></li>
      <li><p>Single-threaded sequential file I/O is almost but not quite CPU-limited.</p></li>
    </ol>
    <p>I wonder: Are those good numbers for a personal computer in 2024? I genuinely have no idea.</p>
    <h2 id='p-4'>Bonnie</h2>
    <p>I will shorten the story, because it’s long. In 1988 I was an employee of the University of Waterloo, working on the
    <a href="https://cs.uwaterloo.ca/~fwtompa/newoed-project.html">New Oxford English Dictionary Project</a>. The computers we were
    using typically had 16MB or so of memory (so the 
    computer I’m typing this on has two thousand times as much) and the full text of the <cite>OED</cite> occupied 572MB. Thus, we
    cared really a lot about I/O performance. Since the project was shopping for disks and computers I bashed out Bonnie in a couple
    of afternoons.</p>
    <p>I revised it lots over the years, and
    <a href="https://en.wikipedia.org/wiki/Russell_Coker">Russell Coker</a> made an excellent fork called Bonnie++ that (for a while
    at least) was more popular than Bonnie. Then I made my own major revision at some point called Bonnie-64.</p>
    <p>In 1996,
    <a href="https://www.linux.co.cr/free-unix-os/review/1996/0413.html">Linux Torvalds recommended Bonnie</a>, calling it a “reasonable
    disk performance benchmark”.</p>
    <p>That’s all I’m going to say here. If for some weird reason you want to know more, Bonnie’s quaint Nineties-flavor
    <a href="https://textuality.com/bonnie/">home</a> and
    <a href="https://textuality.com/bonnie/intro.html">description</a> pages are still there, plus this blog has
    <a href="https://www.google.com/search?as_q=bonnie&amp;hl=en&amp;ie=UTF-8&amp;btnG=Google%2BSearch&amp;as_qdr=all&amp;as_occt=any&amp;as_dt=i&amp;as_sitesearch=tbray.org">documented
    Bonnie’s twisty history</a> quite thoroughly. And explored, I claim, filesystem-performance issues in a useful way.</p>
    <p>I will address a couple of questions here, though.</p>
    <h2 id='p-1'>Do filesystems matter?</h2>
    <p>Many performance-sensitive applications go to a lot of work to avoid reading and/or writing filesystem data on their critical
    path. There are lots of ways to accomplish this, the most common being to stuff everything into memory using Redis or Memcached
    or, well, those two dominate the market, near as I can tell. Another approach is to have the data in a file but access it with
    <a href="https://en.wikipedia.org/wiki/Mmap">mmap</a> rather than filesystem logic. Finally, since real disk hardware reads and
    writes data in fixed-size blocks, you could arrange for your code to talk straight to the disk, entirely bypassing
    filesystems. I’ve never seen this done myself, but have heard tales of major commercial databases doing so.</p>
    <p>I wonder if anyone has ever done a serious survey study of how the most popular high-performance data repositories,
    including Relational, NoSQL, object stores, and messaging systems, actually persist the bytes on disk when they have to?</p>
    <p>I have an opinion, based on intuition and having seen the non-public inside of several huge high-performance systems at previous
    employers that, yes, filesystem performance still matters. I’ve no way to prove or even publicly support that intuition.
    But my bet is that benchmarks like Bonnie are still relevant.</p>
    <p>I bet a few of the kind of people who read this blog similarly have intuitions which, however, might be entirely different
    than mine. I’d like to hear them.</p>
    <h2 id='p-5'>What’s a “disk”?</h2>
    <p>There is a wide range of hardware and software constructs which are accessed through filesystem semantics. They have wildly
    different performance envelopes. If I didn’t have so many other hobbies and projects, it’d be fun to run Bonnie on a sample of
    EC2 instance types with files on various EBS and EFS and so on configurations.</p>
    <p>For the vast majority of CPU/storage operations in the cloud, there’s at least one network hop involved.
    Out there in the real world, there is still really a lot of NFS in production.
    None of these things are much like that little SSD slab in my laptop. Hmmm.</p>
    <h2 id='p-7'>Today’s benchmarks</h2>
    <p>I researched whether some great-great-grandchild of Bonnie was the new hotness in filesystem benchmarking, adopting the methodology
    of typing “filesystem benchmark” into Web search.  The results were disappointing; it doesn’t seem like this is a thing people
    do a lot. Which would suggest that people don’t care about filesystem performance that much? Which I don’t believe. Puzzling.</p>
    <p>Whenever there was a list of benchmarks you might look at, Bonnie and Bonnie++ were on that list. Looks to me like
    <a href="https://www.iozone.org">IOZone</a> gets the most ink and is thus probably the “industry-leading” benchmark. But I
    didn’t really turn up any examples of quality research comparing benchmarks in terms of how useful the results
    are.</p>
    <h2 id='p-8'>Those Bonnie numbers</h2>
    <p>The biggest problem in benchmarking filesystem I/O is that Linux tries really hard to avoid doing it, aggressively
    using any spare memory as a filesystem cache. This is why serving static Web traffic out of the filesystem often remains a good
    idea in 2024; your server will take care of caching the most heavily fetched data in RAM without you having to do cache
    management, which everyone knows is hard.</p>
    <p>I have read of various cache-busting strategies and have never really been convinced that they’ll outsmart this aspect of
    Linux, which was written by people who are way smarter and know way more than I think I do. So Bonnie has always used
    a brute-force approach: Work on a test file which is much bigger than main memory, so Linux has to do at least some real
    I/O. Ideally you’d like it to be several times the memory size.</p>
    <p>But this has a nasty downside. The computer I’m typing on has 32GB of memory, so I ran Bonnie with a 64G filesize
    (128G would have been better) and it took 35 minutes to finish.
    I really don’t see any way around this annoyance but I guess it’s not a fatal problem.</p>
    <p>Oh, and those numbers: Some of them look remarkably big to me. But I’m an old guy with memories of how we had to move the
    bits back and forth individually back in the day, with electrically-grounded tweezers.</p>
    <h2 id='p-10'>Reiser again</h2>
    <p>I can’t remember when this was, but some important organization was doing an evaluation of filesystems for inclusion in a
    big contract or standard or something, and so they benchmarked a bunch, including ReiserFS. Bonnie was one of the benchmarks.</p>
    <p>Bonnie investigates the rate at which programs can seek around in a file by forking off three child processes that do a bunch
    of random seeks, read blocks, and occasionally dirty them and write them back. You can see how this could be stressful for
    filesystem code, and indeed, it occasionally made ReiserFS misbehave, which was noted by the organization doing the
    benchmarking.</p>
    <p>Pretty soon I had email from Reiser claiming that what Bonnie was doing was actually violating the contract specified for the
    filesystem API in terms of concurrent write access. Maybe he was right? I can’t remember how the conversation went, but he
    annoyed me and in the end I don’t think I changed any code.</p>
    <h2 id='p-9'>Here’s Bonnie</h2>
    <p>At one time Bonnie was on SourceForge, then Google Code, but I decided that if I were going to invest effort in writing this
    blog, it should be on GitHub too, so
    <a href="https://github.com/timbray/Bonnie-64">here it is</a>. I even filed a couple of bugs against it.</p>
    <p>I make no apologies for the rustic style of the code; it was another millennium and I was just a kid.</p>
    <p>I cheerfully admit that I felt a warm glow checking in code originally authored 36 years ago.</p>
</div></content></entry>

</feed>
Raw headers
{
  "accept-ranges": "bytes",
  "cf-cache-status": "DYNAMIC",
  "cf-ray": "929b4819a1f7fa13-ORD",
  "connection": "keep-alive",
  "content-length": "169457",
  "content-security-policy": "frame-ancestors 'self';",
  "content-type": "application/atom+xml",
  "date": "Tue, 01 Apr 2025 21:46:52 GMT",
  "etag": "\"295f1-631b8f25b441a\"",
  "last-modified": "Tue, 01 Apr 2025 15:11:10 GMT",
  "server": "cloudflare",
  "strict-transport-security": "max-age=31536000; includeSubdomains; preload",
  "x-content-type-options": "nosniff"
}
Parsed with @rowanmanning/feed-parser
{
  "meta": {
    "type": "atom",
    "version": "1.0"
  },
  "language": "en-us",
  "title": "ongoing by Tim Bray",
  "description": "ongoing fragmented essay by Tim Bray",
  "copyright": "All content written by Tim Bray and photos by Tim Bray Copyright Tim Bray, some rights reserved, see /ongoing/misc/Copyright",
  "url": "https://www.tbray.org/ongoing/",
  "self": "https://www.tbray.org/ongoing/ongoing.atom",
  "published": null,
  "updated": "2025-04-01T15:11:09.000Z",
  "generator": {
    "label": "Generated from XML source code using Perl, Expat, Emacs, Mysql, Ruby, Java, and ImageMagick.  Industrial-strength technology, baby.",
    "version": null,
    "url": "/misc/Colophon"
  },
  "image": {
    "title": null,
    "url": "rsslogo.jpg"
  },
  "authors": [
    {
      "name": "Tim Bray",
      "email": null,
      "url": null
    }
  ],
  "categories": [],
  "items": [
    {
      "id": "https://www.tbray.org/ongoing/When/202x/2025/03/27/Music-Plus-Qobuz",
      "title": "Latest Music (feat. Qobuz)",
      "description": "I’ve written a lot about ways of listening to music; in the current decade about     liking YouTube Music but then about     de-Googling. What’s new is that I’m spending most of my time with     Plexamp and     Qobuz. The trade-offs are complicated",
      "url": "https://www.tbray.org/ongoing/When/202x/2025/03/27/Music-Plus-Qobuz",
      "published": "2025-03-27T19:00:00.000Z",
      "updated": "2025-03-27T23:50:41.000Z",
      "content": "<p>I’ve written a lot about ways of listening to music; in the current decade about\n    <a href=\"/ongoing/When/202x/2021/07/17/Music-Notes\">liking YouTube Music</a> but then about\n    <a href=\"/ongoing/When/202x/2024/03/10/Play-My-Music\">de-Googling</a>. What’s new is that I’m spending most of my time with\n    <a href=\"https://www.plex.tv/en-ca/plexamp/\">Plexamp</a> and\n    <a href=\"https://www.qobuz.com/\">Qobuz</a>. The trade-offs are complicated.</p>\n    <h2 id=\"p-1\">YouTube Music</h2>\n    <p>I liked YTM because:</p>\n    <ol>\n      <li><p>It let me upload my existing ten thousand tracks or so, which include many oddities that aren’t on streamers.</p></li>\n      <li><p>It did a good job of discovering new artists for me.</p></li>\n      <li><p>The Android Auto integration lets me say “Play Patti Smith” and it just does the right thing.</p></li>\n    </ol>\n    <p>But the artist discovery has more or less ran out of gas. I can’t remember the last time I heard something new that made me\n    want more, and when I play “My Supermix”, it seems to always be the same couple of dozen songs, never anything good\n    and new.</p>\n    <p>Also: Bad at classical.</p>\n    <p>I think I might keep on paying for YTM for the moment, because I really like to watch live concerts before I go to bed, and\n    it seems like YTM subscribers never see any ads, which is worth something.</p>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2025/03/27/Plexamp.png\" alt=\"Plexamp\"></img>\n    <h2 id=\"p-2\">Plexamp</h2>\n    <p>I wrote up what it does in that <a href=\"/ongoing/When/202x/2024/03/10/Play-My-Music\">de-Googling</a> link. Tl;dr: Runs a\n    server on a Mac Mini at home and lets me punch through to it from anywhere in the world.\n    I’ve been\n    listening to it a lot, especially in the car, since YTM got boring.</p>\n    <p>My back inventory of songs contains many jewels from CDs that I bought and loved\n    in like 1989 or 2001 and subsequently forgot all about, and what a thrill when one of them lights up my day.</p>\n    <p>I still feel vaguely guilty that I’m not paying Plex anything, but on the other hand what I’m doing costs them peanuts.</p>\n    <p>But, I still want to hear new stuff.</p>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2025/03/27/Qobuz.png\" alt=\"Qobuz\"></img>\n    <h2 id=\"p-4\">Qobuz</h2>\n    <p>I vaguely knew it was out there among the streamers, but I got an intense hands-on demonstration recently while\n    <a href=\"/ongoing/When/202x/2025/03/07/Totem-Tribe-Tower\">shopping for new speakers</a>; Phil at audiofi pulled up all my\n    good-sound demo tracks with a couple of taps each, in what was apparently CD quality. Which opened my eyes.</p>\n    <p>What I like about Qobuz:</p>\n    <ol>\n      <li><p>It pays artists more per stream than any other service, by a wide margin.</p></li>\n      <li><p>It seems to have as much music as anyone else.</p></li>\n      <li><p>It’s album-oriented, and I appreciate artists curating their own music.</p></li>\n      <li><p>Classical music is a first-class citizen.</p></li>\n      <li><p>While it doesn’t have an algorithm that finds music it thinks I’ll like, it is actively curated and they highlight new\n      music regularly, and pick a “record of the week”. This week’s, for example, is <cite>For Melancholy Brunettes (& Sad\n      Women)</cite> by <a href=\"https://japanesebreakfast.rocks\">Japanese Breakfast</a>. It’s extremely sweet stuff, maybe a little\n      too low-key for me, but I still enjoyed it. They’re coming to town, I might go.</p></li>\n      <li><p>This isn’t the only weekly selection that I’ve enjoyed.  Qobuz gives evidence of being built by people who love\n      music.</p></li>\n    </ol>\n    <p>What don’t I like about Qobuz? The Mac app is kinda dumb, I sometimes can’t figure out how to do what I want, and for the\n    life of me I can’t get it to show a simple full-screen display about the current song. But the Android app works OK.</p>\n    <p>As for Qobuz’s claim to offer “Hi-Res” (i.e. better than CD) sound, meh.  I’m not convinced that this is actually\n    audible and if it in principle were, I suspect that either my ears or my stereo would be a more important limiting factor.</p>\n    <h2 id=\"p-3\">Records!</h2>\n    <p>Yep, I still occasionally drop the needle on the vinyl on the turntable, and don’t think I’ll ever stop.</p>\n    <h2 id=\"p-5\">And a reminder</h2>\n    <p>If you really want to support artists, buy concert tickets. That thrill isn’t gone at all.</p>",
      "image": null,
      "media": [],
      "authors": [
        {
          "name": "Tim Bray",
          "email": null,
          "url": null
        }
      ],
      "categories": [
        {
          "label": "Arts/Music",
          "term": "Arts/Music",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "Arts",
          "term": "Arts",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "Music",
          "term": "Music",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "The World/Life Online",
          "term": "The World/Life Online",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "The World",
          "term": "The World",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "Life Online",
          "term": "Life Online",
          "url": "https://www.tbray.org/ongoing/What/"
        }
      ]
    },
    {
      "id": "https://www.tbray.org/ongoing/When/202x/2025/03/17/Long-Links",
      "title": "Long Links",
      "description": "This will be the 30th “Long Links” post. The frequency has fallen off over the years; perhaps my time for long-form pieces     has decreased or, just as likely, I protect my sanity in these dark days by consuming less. No, I don’t filter out Fascist     Craziness, because it’s a thing that needs to be understood to be resisted. Thus, today’s Long Links does contain     “the world is broken” pieces.” But not only; there’s good news here too, including fine typography and music",
      "url": "https://www.tbray.org/ongoing/When/202x/2025/03/17/Long-Links",
      "published": "2025-03-17T19:00:00.000Z",
      "updated": "2025-03-18T20:37:59.000Z",
      "content": "<p>This will be the 30th “Long Links” post. The frequency has fallen off over the years; perhaps my time for long-form pieces\n    has decreased or, just as likely, I protect my sanity in these dark days by consuming less. No, I don’t filter out Fascist\n    Craziness, because it’s a thing that needs to be understood to be resisted. Thus, today’s Long Links does contain\n    “the world is broken” pieces.” But not only; there’s good news here too, including fine typography and music.</p>\n    <p>Let’s start with music.</p>\n    <h2 id=\"p-1\">Music</h2>\n    <p>“<a href=\"https://www.bachvereniging.nl/en/allofbach\">All of Bach</a> is a project of the Netherlands Bach Society with the\n    aim to perform and record all of Bach's works and share them online with the world for free.” The project\n    <a href=\"https://www.youtube.com/bach?app=desktop\">manifests on YouTube</a>\n    and I have spent a <em>lot</em> of hours enjoying it.  The performances are all competent and while I disagree with an\n    artistic choice here or there, I also think that many of these are triumphs.</p>\n    <p>One such triumph, and definitely a <em>Long</em> link, is Bach’s last work,\n    <a href=\"https://www.youtube.com/watch?v=N6sUlZa-IrU\">The Art of Fugue, BWV 1080</a>.\n    Bach didn’t say which order the many parts of the piece should be performed in, or what instruments should be used, so\n    there’s a lot of scope for choice and creativity in putting together a performance. This one is by\n    <a href=\"https://en.wikipedia.org/wiki/Shunsuke_Sato\">Shinsuke Sato</a>,  the maestro of\n    the Netherlands Bach Society. It is clever, unfancy, and its ninety or so minutes are mostly\n    exquisite.</p>\n    <p>Vi Hart, mathemusician is now a Microsoftie, but has been one of my intellectual heroes. Get a comfy chair and pull up\n    <a href=\"https://vimeo.com/147902572\">Twelve Tones</a>, which addresses profound themes with a combination\n    of cynicism, fun, music, and laserbats. You will need a bit of basic music literacy and intellectual flexibility, but\n    you’ll probably end up smarter.</p>\n    <h2 id=\"p-2\">IsraPal</h2>\n    <p>On the “everything is broken” front, Israel/Palestine looms large. Here are two <cite>New York Times</cite> gift links that\n    face the ugliness with clear eyes. First,\n    <a href=\"https://www.nytimes.com/2025/03/16/opinion/no-other-land-documentary-israel-gaza.html?unlocked_article_code=1.4k4.o0wv.bClPYg9XEiXZ&smid=url-share\">‘No Other Land’ Won an Oscar. Many People Hope You Don’t See It</a>\n    is what the title says.\n    Second, it’s bad that criticism of Israel has become Thoughtcrime, and worse when \n    <a href=\"https://www.nytimes.com/2025/03/12/us/yale-suspends-scholar-terrorism.html?unlocked_article_code=1.4k4.OkaX.8zwOCZfLcDt5&smid=url-share\">AI\n    is weaponized to look for it</a>.</p>\n    <h2 id=\"p-3\">Tchaikovsky Opera</h2>\n    <p><a href=\"https://en.wikipedia.org/wiki/Adrian_Tchaikovsky\">Adrian</a> not Pyotr, I mean, and space opera not musical costume drama.  \n    In particular, \n    <a href=\"https://www.adriantchaikovsky.com/the-final-architects-shards-of-earth-eyes-of-the-voice-by-adrian-tchaikovsky.html#shards\">The\n    Final Architecture</a> series. It’s ultra-large-scale space opera in three big fat volumes. I would say it’s mining the same\n    vein as <cite>The Expanse</cite> and while it didn’t hit me nearly as hard as that did, it’s fun, will keep you turning\n    pages.</p>\n    <h2 id=\"p-4\">Photography</h2>\n    <p>I’m a photography enthusiast and as a side-effect am gloomy about pro photogs’ increasing difficulty in making\n    a living. I also buy a lot of stuff online. For both these reasons,\n    <a href=\"https://petapixel.com/2025/03/06/what-whitewalls-new-shopify-integration-means-to-photographers/\">What WhiteWall’s New\n    Shopify Integration Means to Photographers</a> caught my eye. First of all, it’s generally cool that someone’s offering a\n    platform to help photogs get online and sell their wares.</p>\n    <p>Second, I can’t help but react to Shopify’s involvement. This gets complicated. First of all, Shopify is Canadian, yay. But,\n    CEO Tobi Lütke is a MAGA panderer and invites wastrels like Breitbart onto the platform. And having said all that, speaking as a\n    regular shopper, the Shopify platform is freaking excellent.</p>\n    <p>Whenever I’m on a new online merchant and I see their\n    distinctive styling around the “Proceed to payment” button, I know this thing is gonna Just Work.  A lot of times, once I’ve\n    typed in my email address, it says “OK, done”, because it shares my payment data from merchant to merchant. Occasionally\n    it’ll want me to re-authenticate or send a security code to my phone or or whatever.</p>\n    <p>If I were setting up an online store to\n    sell anything, that’s what I’d use. I mean, I’d hold my nose and let the company know that they need to fire their CEO for\n    treason, but it’s still what I’d probably use.</p>\n    <p>Speaking of photography, I’ve repeatedly written about “C2PA”, see\n    <a href=\"/ongoing/When/202x/2023/10/28/C2PA-Workflows\">On C2PA</a> and\n    <a href=\"/ongoing/When/202x/2024/10/29/Lane-Provenance\">C2PA Progress</a>. I’m not going to explain once again what it is, but\n    for those who know and care, it looks like\n    <a href=\"https://www.dpreview.com/news/6352280282/sony-content-authenticity-system-not-just-for-pro-cameras-anymore\">Sony is\n    doubling down on it</a>, yay Sony!</p>\n    <h2 id=\"p-5\">Vancouver</h2>\n    <p>Vancouver residents who know the names “Concord Pacific” or “Terry Hui”, or who have\n    <a href=\"https://www.falsecreekfriends.org\">feelings about False Creek</a>, will\n    probably enjoy\n    <a href=\"https://thetyee.ca/News/2025/03/03/Terry-Hui-Hole-Vancouver-Heart/\">Terry Hui’s Hole in Vancouver’s Heart</a>. You will\n    have noticed some of the fragments of this bit of history going by, but Geoff Meggs puts it all together on a large vivid canvas\n    that will you better informed and probably somewhat mind-boggled.</p> \n    <h2 id=\"p-6\">Let’s talk about TV!</h2>\n    <p>By which I mean a video screen used recreationally.\n    Check out Archimago’s\n    <a href=\"https://archimago.blogspot.com/2025/03/hdmi-musings-high-speed-cables-data.html\">HDMI Musings: high speed cables, data\n    rates, YCbCr color subsampling, Dolby Vision MEL/FEL, optical cables and +5V injection</a>. Yes, that’s a long title, and it’s a\n    substantial piece, because HDMI is increasingly how you connect any two video-centric pieces of technology.</p>\n    <p>From which I quote:\n    “This recent update makes HDMI the fastest of all currently-announced consumer Audio-Video connection standards, the one wire\n    that basically does it all”. I’m not going to try to summarize, but if you plow through this one you’ll know a lot more about\n    those black wires all over your A/V setup. There’s lots of practical advice; it turns out that if you’re going to run an HDMI\n    cable further than about two meters, certification matters.</p>\n    <h2 id=\"p-7\">Life online</h2>\n    <p>Where do people learn about the world from? The Pew Research Center investigated and published\n    <a href=\"https://www.pewresearch.org/journalism/fact-sheet/social-media-and-news-fact-sheet/\">Social Media and News Fact\n    Sheet</a>. I suspect the results will surprise few of you, but it’s nice to have quantitative data. I would hope that a\n    similar study, done next year not last year, would include decentralized social media, which this doesn’t.</p> \n    <p>I know that Ed Zitron’s\n    <a href=\"https://www.wheresyoured.at/never-forgive-them/\">Never Forgive Them</a> went viral, and I bet a lot of you saw it go\n    by, or even started reading then left it parked in a tab you meant to get back to, because it’s so long.  Yeah; it’s arguably too\n    long and too shrill, but on the other hand it is full of truth and says important things I’ve not seen elsewhere.</p>\n    <p>For example, I\n    suspect most people reading this are angry about the ubiquitous enshittification of the online, but Zitron points out that\n    people like us suffer much less because we have the money and the expertise to dodge and filter and route around a lot of the\n    crap. Zitron actually purchased one of the most popular cheap Windows PCs<span class=\"dashes\"> —</span> the kind of device\n    ordinary people can afford<span class=\"dashes\"> —</span> and reports from the front lines of what is in part a class war.\n    The picture is much worse than you thought it was.</p>\n    <p>Here are a few bangers:<br></br>“It isn’t that you don’t ’get‘ tech, it’s that the tech you use every day is no longer built for\n    you, and as a result feels a very specific kind of insane.”\n    <br></br>“almost every single interaction with technology, which is <em>required</em> to live in modern society, has become actively\n    adversarial to the user”.\n    <br></br>“The average person’s experience with technology is one so aggressive and violative that I believe it\n    leaves billions of people with a consistent low-grade trauma.”</p>\n    <h2 id=\"p-8\">Publishing tech</h2>\n    <p>It’s where I got my start. Two of the most important things are typography and color. And there’s good news!</p>\n    <p>The Braille Institute offers\n    <a href=\"https://www.brailleinstitute.org/freefont/\">Read Easier With Our Family of Hyperlegible™ Fonts</a>, which begins “Is\n    this font easy for you to read? Good—that’s the idea.” Like! Would use. And in an era where the Web is too much infested\n    by teeny-tiny low-contrast typography, it’s good to have alternatives.</p>\n    <p>Now, as for color: It is a sickeningly complex subject, both at the theory level and in the many-layered stack of models and\n    equations and hardware and software that cause something to happen on a screen that your brain perceives as color.\n    Bram Cohen, best-known for inventing BitTorrent, has been digging in, and gives us\n    <a href=\"https://bramcohen.com/p/color-theory\">Color Theory</a> and \n    <a href=\"https://bramcohen.com/p/a-simple-color-palette\">A Simple Color Palette</a>. I enjoyed them.</p>\n    <h2 id=\"p-9\">Geekery</h2>\n    <p>If you know what “IPv6” is, then Geoff Huston’s <a href=\"https://www.potaroo.net/ispcol/2024-10/ipv6-transition.html\">The IPv6\n    Transition</a> will probably interest you. Tl;dr: Don’t hold your breath waiting for an all-IPv6 Internet.</p>\n    <p>And, much as I’d like to, it’s difficult to avoid AI news. So here is plenty, from Simon Willison, who has no AI axe to grind nor\n    product to sell:     <a href=\"https://simonwillison.net/2024/Dec/31/llms-in-2024/\">Things we learned about LLMs in 2024</a>.</p>\n    <h2 id=\"p-10\">Business</h2>\n    <p>I can testify from personal experience that Andy Jassy is an extremely skilled manager, but I found\n    <a href=\"https://www.cnbc.com/amp/2024/12/15/amazon-and-the-endangered-future-of-the-middle-manager.html\">Amazon and the\n    endangered future of the middle manager</a>, from CNBC, unconvincing. The intro: “Jassy's messaging on an increased ratio of\n    individual contributors to managers raises a much bigger question about organizational structure: What is the right balance\n    between individual workers and managers in overall headcount?” There’s talk of laying off many thousands of\n    managers.</p>\n    <p>Before I worked at Amazon I was at Google, which has a much higher IC/manager ratio. Teams of 20 were not uncommon, and as a\n    result, there was both a manager and a Tech Lead, which meant the manager was basically an HR droid.  Amazon always insisted\n    that the manager sweat the details of what their team was working on, deeply understand the issues they were facing and what\n    they were building. I don’t see how that’s compatible with increasing the ratio.</p>\n    <p>And, Google management was <em>way</em> weaker than Amazon’s, not even close. So I’d have to say that the evidence is against\n    Andy on this one.</p>\n    <h2 id=\"p-11\">Art island</h2>\n    <p>Japan has one. It’s called \n    <a href=\"https://www.japan.travel/en/spot/220/\">Naoshima</a>. Great idea. I’d go.</p>",
      "image": null,
      "media": [],
      "authors": [
        {
          "name": "Tim Bray",
          "email": null,
          "url": null
        }
      ],
      "categories": [
        {
          "label": "The World",
          "term": "The World",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "The World",
          "term": "The World",
          "url": "https://www.tbray.org/ongoing/What/"
        }
      ]
    },
    {
      "id": "https://www.tbray.org/ongoing/When/202x/2025/03/07/Totem-Tribe-Tower",
      "title": "Totem Tribe Towers",
      "description": "I bought new speakers. This story combines beautiful music with advanced analogue technology and nerdy obsession. Despite     which, many of you are not fascinated by high-end audio; you can leave now.     Hey, this is a blog, I get to write about what excites me.     The seventeen of you who remain will probably enjoy the deep dive",
      "url": "https://www.tbray.org/ongoing/When/202x/2025/03/07/Totem-Tribe-Tower",
      "published": "2025-03-07T20:00:00.000Z",
      "updated": "2025-03-12T17:55:12.000Z",
      "content": "<p>I bought new speakers. This story combines beautiful music with advanced analogue technology and nerdy obsession. Despite\n    which, many of you are not fascinated by high-end audio; you can leave now.\n    Hey, this is a blog, I get to write about what excites me.\n    The seventeen of you who remain will probably enjoy the deep dive. </p>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2025/03/07/PXL_20250308_205849091.png\" alt=\"Totem Tribe Towers\"></img>\n    <div class=\"caption\"><p>Totem Tribe Tower loudspeakers, standing on a subwoofer.<br></br>This picture makes them look\n    bigger than they really are. They come in black or white, satin or gloss finish. \n    <br></br>Prettier with the grille on, I think.</p></div>\n    <h2 id=\"p-2\">Why?</h2>\n    <p>My\n    <a href=\"/ongoing/When/200x/2006/03/02/Totem#p-3\">main speakers</a> were 22 years old, bore scars from toddlers (now grown) and\n    cats (now deceased).\n    While they still sounded beautiful, there was loss of precision.  They’d had a good run.</p>\n    <h2 id=\"p-8\">Speakers matter</h2>\n    <p>Just in the last year, I’ve become convinced, and argued here, that both\n    <a href=\"/ongoing/When/202x/2023/06/03/Parasound-Halo-P-6#p-5\">DACs</a> and\n    <a href=\"/ongoing/When/202x/2024/09/09/Next-Step-Audiophile\">amplifiers</a> are pretty well solved problems, that there’s no\n    good reason to spend big money on them, and that you should focus your audio investments on speakers and maybe room\n    treatment. So this purchase is a big deal for me.</p>\n    <h2 id=\"p-1\">How to buy?</h2>\n    <p>The number of boutique speaker makers, from all over the world, is mind-boggling; check out\n    <a href=\"https://www.stereophile.com/content/recommended-components-fall-2024-edition-loudspeakers\">the <cite>Stereophile</cite>\n    list</a> of recommendations. Here’s the thing: Pretty well all of them sound wonderful. (The speakers I bought haven’t\n    been reviewed by <cite>Stereophile</cite>.)</p>\n    <p>So there are too many options. Nobody could listen to even a small proportion of them, at any price\n    point.  Fortunately, I had three powerful filters to narrow down the options. The\n    speakers had to (1) look nice, and (2) be Canadian products, probably (3) from\n    <a href=\"https://totemacoustic.com\">Totem Acoustic</a>.</p>\n    <h2 id=\"p-3\">Decor?</h2>\n    <p>I do not have, nor do I want, a man-cave. I’ve never understood the concept.</p>\n    <p>And you have to be careful. There are high-end speakers, some very well-reviewed, with design sensibilities right out of\n    <cite>Mad Max</cite> or <cite>Brazil</cite>. And then a whole bunch that are featureless rectangles with drivers on the\n    front.</p>\n    <p>Ours have to live in a big media alcove just off the kitchen; they are shared by\n    the pure-audio system and\n    <a href=\"/ongoing/When/202x/2024/11/11/TV-land\">the huge TV</a>.  The setup has to please the eyes of the whole family.</p>\n    <h2 id=\"p-4\">Canadian?</h2>\n    <p>At this point in time, a position of “from anywhere but the US, the malignant force threatening our sovereignty” would be\n    unsurprising in a Canadian.  But there are unsentimental reasons, too.  It turns out Canadian speaker makers have had an\n    advantage stretching back many decades.</p>\n    <p>This is mostly due to the work of\n    <a href=\"https://www.torontoaes.org/floyd-toole/\">Floyd\n    Toole</a>, electrical engineer and acoustician, once an employee of Canada’s National Research Council, who built an anechoic chamber\n    at the NRC facility, \n    <a href=\"https://en.wikipedia.org/wiki/Audio_system_measurements#Unquantifiable?\">demonstrated that humans can reliably\n    detect differences in speaker accuracy</a>, and made his facility available to commercial speaker builders. So there have been\n    quite a few good speakers built up here over the years.</p>\n    <h2 id=\"p-5\">Totem?</h2>\n    <p>What happened was, in 1990 or so I went to an audio show down East somewhere and met Vince Bruzzese, founder of Totem\n    Acoustic, who was showing off his then-brand-new “Model One” speakers. They were small, basic-black, and entirely melted my\n    heart playing a Purcell string suite. They\n    <a href=\"https://totemacoustic.com/product/signature-one/\">still sell them</a>, I see.\n    Also, the Totem exhibit was having a quiet spell so there was time to talk, and it turned out that Bruzzese and I liked a lot of the\n    same music.</p> \n    <p>So I snapped up the Model Ones and that same set is still sounding beautiful over at our cabin. And every speaker I’ve bought in the\n    intervening decades has come from Totem or from PSB, another excellent Toole-influenced Canadian shop. I’ve also met and conversed\n    with Paul Barton, PSB’s founder and main brain. Basically, there’s a good chance that I’ll like anything Vince or\n    Paul ship.</p>\n    <p>My plan was to give a listen to those two companies’ products. A cousin I’d visited last year had big recent PSB speakers and\n    I liked them a whole lot, so they were on my menu. But PSB seems to have given up on audio dealers, want to\n    <a href=\"https://www.psbspeakers.com/ca/speakers/tower\">sell online</a>.\n    Huh?! Maybe it’ll work for them, but it doesn’t work for me.</p>\n    <p>So I found a local Totem dealer;\n    <a href=\"https://audiofi.ca\">audiofi</a> in Mount Pleasant.</p>\n    <h2 id=\"p-6\">Auditioning</h2>\n    <p>For this, you should use some of your most-listened-to tracks from your own collection. I took my computer along for\n    that purpose, but it turned out that\n    <a href=\"https://www.qobuz.com/ca-en/discover\">Qobuz</a> had ’em all. (Hmm, maybe I should look closer at Qobuz.)</p>\n    <p>Here’s what was on my list. I should emphasize that, while I like all these tracks, they’re not terribly representative of\n    what I listen to. They’re selected to stress out a specific aspect of audio reproduction. The Americana and Baroque and Roots\n    Rock that I’m currently fixated on are pretty easy to reproduce.</p> \n    <ul>\n      <li><p><cite>200 More Miles</cite> from the Cowboy Junkies’ <cite>Trinity Session</cite>. Almost any track from this record\n      would do; they recorded with a single ambiphonic microphone and any competent setup should make it feel like you’re in the\n      room with them. And Margo’s singing should make you want to cry.</p></li>\n      <li><p><cite>The Longships</cite>, from Enya’s <cite>Watermark</cite> album.  This is a single-purpose test for low bass. It\n      has these huge carefully-tuned bass-drum whacks that just vanish on most speakers without extreme bass extension, and the music makes\n      much less sense without them. You don’t have to listen to the whole track; but it’s fine music, Enya was really on her game\n      back then.</p></li>\n      <li><p>The opening of Dvořák’s Symphony #9, “From the New World”. There are plenty of good recordings, but I like Solti\n      and the Chicago Symphony. Dvořák gleefully deploys jump-scare explosions of massed strings and other cheap orchestration tricks\n      in the first couple of minutes\n      to pull you into the symphony. What I’m looking for is the raw\n      physical shock of the first big full-orchestra entrance.</p></li>\n      <li><p><cite>Death Don’t Have No Mercy</cite> from Hot Tuna’s <cite>Live At Sweetwater Two</cite>. Some of the prettiest slide\n      guitar you’ll hear anywhere from Kaukonen, and magic muscle from Casady. And then Jorma’s voice, as comfortable as old shoes\n      and full of grace. About three minutes in there’s an instrumental break and you want to hear the musical lines dancing around\n      each other with no mixups at all.</p></li>\n      <li><p>First movement of Beethoven’s Sonata #23, “Appassionata”, Ashkenazy on London. Pianos are very difficult; two little\n      speakers have a tiny fraction of the mass and vibrating surface of a big concert grand. It’s really easy for the sound to\n      be on the one hand too small, or on the other all jumbled up. Ashkenazy and the London engineers do a fine job here; it really\n      should sound like he’s sitting across the room from you.</p></li>\n      <li><p><cite>Cannonball</cite>, the Breeders’ big hit.  It’s a pure rocker and a real triumph of arrangement and production,\n      with lots of different guitar/keys/drum tones. You need to feel it in your gut, and the rock & roll edge should be\n      frightening.</p></li>\n      <li><p><cite>Identikit</cite> from Radiohead’s <cite>A Moon Shaped Pool</cite>. This is mostly drums and voice, although\n      there are eventually guitar interjections. It’s a totally artificial construct, no attempt to sound like live musicians\n      in a real space. But the singing and drumming are fabulous and they need to be 100% separated in space, dancing without\n      touching. And Thom Yorke in good voice had better make you shiver a bit.</p></li>\n      <li><p><cite>Miles Runs The Voodoo Down</cite> from <cite>Bitches Brew</cite>. This is complex stuff, and Teo Macero’s\n      production wizardry embraces the complexity without losing any of that fabulous band’s playing. Also Miles plays two of the\n      greatest instrumental solos ever recorded, any instrument, any genre, and one or two of the ascending lines should feel like\n      he’s pulling your whole body up out of your chair.</p></li>\n      <li><p>Emmylou Harris. This would better be phrased as “Some singer you have strong emotional reactions to.” I listened to\n      the title track and <cite>Deeper Well</cite> from the <cite>Wrecking Ball</cite> album. If a song that can make you feel that way doesn’t\n      make you feel that way, try different speakers.</p></li>\n    </ul>\n    <h2 id=\"p-7\">The listening session</h2>\n    <p>I made an appointment with Phil at Audiofi, and we spent much of an afternoon listening. I thought Audiofi was fine, would go\n    back.  Phil was erudite and patient and not pushy and clearly loves the technology and music and culture.</p>\n    <p>I was particularly interested in the\n    <a href=\"https://totemacoustic.com/product/element-fire-v2/\">Element Fire V2</a>, which has been creating buzz in online\n    audiophile conversation. They’re “bookshelf” (i.e. stand-mounted) rather than floorstanders, but people keep saying they sound\n    like huge tower speakers that are taller than you are. So I was predisposed to find them interesting, and I listened to maybe\n    half of the list above.</p>\n    <p>But I was unhappy, it just wasn’t making me smile. Sure, there was a stereo image, but at no point did I get a convincing\n    musicians-are-right-over-there illusion. It was particularly painful on the Cowboy Junkies. It leapt satisfactorily out of the speakers\n    on the Dvořák and was brilliant on <cite>Cannonball</cite>, but there were too many misses.</p>\n    <p>Also, the longer I looked at it the less it pleased my eyes.</p>\n    <p>“Not working, sorry. Let’s listen to something else” I said. I’d already noticed the Tribe Towers, which even though they were\n    floorstanders, looked skinny and pointy compared to the Elements. I’d never read anything about them but they share the Element’s\n    <a href=\"https://totemacoustic.com/totem-torrent-technology/\">interesting\n    driver technology</a>, and are cheaper.</p>\n    <p>So we set them up and they absolutely aced everything the Elements had missed. Just vanished, I mean, and there was a\n    three-dimensional posse of musicians across the room, filling the space with three-dimensional music.\n    They flunked the Enya drum-thwack test but that’s OK because I have a\n    subwoofer (from PSB) at home. In particular, they handled Ashkenazy pounding out the Beethoven just absolutely without effort.\n    I’m not sure I’ve ever heard better piano reproduction.</p>\n    <p>And the longer I looked at them the more my thinking switched from “skinny and pointy” to “slender and elegant”.</p>\n    <p>A few minutes in and, I told Phil, I was two-thirds sold. He suggested I look at some\n    <a href=\"https://www.magicoaudio.com\">Magico</a> speakers but they were huge and like $30K; as an audiophile I’m only mildly\n    deranged. And American, so no thanks.</p>\n    <p>I went home to think about it.\n    I was worried that I’d somehow been unfair to the Elements. Then I read the\n    <a href=\"https://www.stereophile.com/content/totem-acoustic-element-fire-v2-loudspeaker\"><cite>Stereophile</cite> review</a>,\n    and while the guy who did the subjective listening test loved ’em, the\n    <a href=\"https://www.stereophile.com/content/totem-acoustic-element-fire-v2-loudspeaker-measurements\">lab measurements</a>\n    seemed to show real problems.</p>\n    <p>I dunno. Maybe that was the wrong room for them. Or the wrong amplifier. Or the wrong positioning. Or maybe they’re just a rare\n    miss from Totem.</p>\n    <p>My research didn’t turn up a quantitative take on the Tribes, just a lot of people writing that they sound much bigger than\n    they really are, and that they were happy they’d bought them.</p>\n    <p>And I’d been happy listening to them. So I pulled the trigger. My listening space is acoustically friendlier than the one at\n    Audiofi and if they made me happy there, they’d make me happy at home.</p>\n    <p>And they do. Didn’t worry too much about positioning, just made sure it was symmetric. The first notes they played were\n    brilliant.</p>\n    <h2 id=\"p-9\">But how does it sound?</h2>\n    <p>See all those auditioning tracks up above, where it says what speakers “should” do?\n    They do, that’s what they sound like.</p>\n    <p>I’ve been a little short on sleep, staying up late to listen to music.</p>\n    <h2 id=\"p-10\">Follow-up: Customer service</h2>\n    <p>As noted above I have a subwoofer, and\n    <a href=\"/ongoing/When/202x/2023/06/03/Parasound-Halo-P-6\">my preamp</a> lets you configure where to roll off the bass going to\n    the main speakers and hand off to the subwoofer. I wrote off to Totem’s customer-support email address wondering if they had any\n    guidance on frequency.  They got back to me with specific advice, and another couple of things to double-check.</p>\n    <p>High-end audio. Simpatico salespeople. The products last decades. The vendors answer emails from random customers. Businesses\n    it’s still possible to like.</p>",
      "image": null,
      "media": [],
      "authors": [
        {
          "name": "Tim Bray",
          "email": null,
          "url": null
        }
      ],
      "categories": [
        {
          "label": "Technology/Audio",
          "term": "Technology/Audio",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "Technology",
          "term": "Technology",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "Audio",
          "term": "Audio",
          "url": "https://www.tbray.org/ongoing/What/"
        }
      ]
    },
    {
      "id": "https://www.tbray.org/ongoing/When/202x/2025/03/06/Canceled-Prime",
      "title": "Bye, Prime",
      "description": "Today I canceled my Amazon Prime subscription",
      "url": "https://www.tbray.org/ongoing/When/202x/2025/03/06/Canceled-Prime",
      "published": "2025-03-06T20:00:00.000Z",
      "updated": "2025-03-07T17:24:15.000Z",
      "content": "<p>Today I canceled my Amazon Prime subscription.</p>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2025/03/06/end.png\" alt=\"Amazon Prime canceled\"></img>\n    <h2 id=\"p-1\">Why?</h2>\n    <p>As I wrote in\n    <a href=\"/ongoing/When/202x/2020/07/23/Not-an-Amazon-Problem\">Not an Amazon Problem</a> (and please go read that if you haven’t)\n    I don’t see myself as an enemy of Amazon, particularly. I think the pressures of 21st-century capitalism have put every large\n    company into a place where they really can’t afford to be ethical or the financial sector will rip them to shreds then\n    replace the CEO with someone who will maximize shareholder return at all costs, without any of that amateurish “ethics” stuff.</p>\n    <p>To the extent that Amazon is objectionable, it’s a symptom of those circumstances.</p>\n    <p>I’m bailing out of Prime not to hurt Amazon, but because it doesn’t make commercial or emotional sense for me just now.</p>\n    <h2 id=\"p-2\">Commercial?</h2>\n    <p>Yes, free next-day delivery is pretty great. In fact, in connection with\n    <a href=\"/ongoing/When/202x/2025/02/28/Moved\">our recent move</a>, I’ve been ordering small cheap stuff\n    furiously: \n    (USB cables, light switches, closet organizers, a mailbox, a TV mount, WiFi hubs, banana plugs, you name it).</p>\n    <p>But the moving operations are mostly done, and there are few (any?) things we really need the next day, and we’re fortunate,\n    living in the center of a 15-minute city. So getting my elderly ass out of my chair and going to a store is a good option, for\n    more than one reason.</p>\n    <p>Second, for a lot of things you want to order, the manufacturer has its own online store these days and a lot of them are\n    actually well-built, perfectly pleasant to use.</p>\n    <p>Third, Amazon’s prices aren’t notably cheaper than the alternatives.</p>\n    <h2 id=\"p-3\">Emotional?</h2>\n    <p>Amazon is an US corporation and the US is now hostile to Canada, repeatedly threatening to annex us. So I’m\n    routing my shopping dollars \n    away from there generally and to Canadian suppliers specifically. Dumping Prime is an easy way to help that along.</p>\n    <p>Second, shopping on Amazon for the kinds of small cheap things listed above is more than a little unpleasant. The\n    search-results page is a battle of tooth and claw among low-rent importers. Also it’s just really\n    freaking ugly, hurts my eyes to look at it.</p>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2025/03/06/you-have-watched.png\" alt=\"You have watched 29 shows/movies with Prime Video\"></img>\n    <div class=\"caption\"><p>Really? I have no idea what they were.</p></div>\n    <p>Finally, one of Prime’s big benefits used to be Prime Video, but no longer. There was\n    just no excuse for greenlighting that execrable <cite>Rings of Power</cite> show, and I’m not aware of anything else I want to\n    watch.</p>\n    <p>Amazon is good at lots of things, but has never been known for good taste. I mean, look at that\n    search-results page.</p>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2025/03/06/are-you-sure.png\" alt=\"Are you sure you want to end your membership?\"></img>\n    <div class=\"caption\"><p>Yep.</p></div>\n    <h2 id=\"p-4\">Is it easy?</h2>\n    <p>Yep, no complaints. There were only two please-don’t-go begs and neither was offensive.</p>\n    <p>No hard feelings.</p>",
      "image": null,
      "media": [],
      "authors": [
        {
          "name": "Tim Bray",
          "email": null,
          "url": null
        }
      ],
      "categories": [
        {
          "label": "The World/Life Online",
          "term": "The World/Life Online",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "The World",
          "term": "The World",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "Life Online",
          "term": "Life Online",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "Business/Internet",
          "term": "Business/Internet",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "Business",
          "term": "Business",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "Internet",
          "term": "Internet",
          "url": "https://www.tbray.org/ongoing/What/"
        }
      ]
    },
    {
      "id": "https://www.tbray.org/ongoing/When/202x/2025/02/28/Moved",
      "title": "Moved",
      "description": "It is traditional in this season in this space to tickle your eyes with pictures of our early spring crocuses, while gently     dunking a bit on our fellow Canadians who, away from the bottom left corner of the country, are still snowbound.  So,     here you go. Only not really",
      "url": "https://www.tbray.org/ongoing/When/202x/2025/02/28/Moved",
      "published": "2025-02-28T20:00:00.000Z",
      "updated": "2025-03-01T19:42:05.000Z",
      "content": "<p>It is traditional in this season in this space to tickle your eyes with pictures of our early spring crocuses, while gently\n    dunking a bit on our fellow Canadians who, away from the bottom left corner of the country, are still snowbound.  So,\n    here you go. Only not really.</p>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2025/02/28/PXL_20250227_204913037.png\" alt=\"Crocuses on moss\"></img>\n    <p>Yes, those are this spring’s crocuses. But they’re not\n    <em>our</em> crocuses, they’re someone else’s. We don’t have any. Because we moved.</p>\n    <p>It’s a blog isn’t it? I’ve written up childbirths and pet news and vacations and all that stuff. So why not\n    this?</p>\n    <p>What happened was, we bought a house in 1996 and then, after 27 years and raising two kids and more cats, it\n    was, well, not actually dingy, but definitely tired.  The floors. The paint. The carpet. The cupboards. So we started down two paths at\n    once, planning for a major renovation on one side, and shopping for a new place on the other. Eighteen months later we hadn’t\n    found anything to buy, and the reno was all planned and permitted and we were looking for rentals to camp out in.</p>\n    <p>Then, 72 hours from when we were scheduled to sign the reno contract,  this place came on the market across our back alley and\n    three houses over.\n    The price was OK and it didn’t need much work and, well, now we live there.</p>\n    <p>I’m sweeping a lot of drama under the rug. Banking drama and real-estate drama and insurance drama and\n    floor-finishing drama and Internet-setup drama and A/V drama and storage drama. And of course moving drama. Month after month\n    now, Lauren and I have ended more days than not exhausted.</p>\n    <p>But here we are. And we’re not entirely without our plants.</p>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2025/02/28/PXL_20241004_204715352.png\" alt=\"Moving the rosebush\"></img>\n    <p>This is Jason of\n    <a href=\"https://www.cycledrivengardening.biz\">Cycle Driven Gardening</a>,who lent his expertise to moving our favorite\n    rosebushes, whose history\n    <a href=\"/ongoing/When/200x/2003/07/06/RoseTrip2\">goes back decades</a>.\n    Of course, there could be no guarantee that those old friends would survive the process.</p>\n    <p>Today was unseasonably warm and our new back patio is south-facing, so we soaked up the sun and cleared it of leftover moving\n    rubble. Then ventured into the back yard, much-ignored over winter.</p>\n    <p>Each and every rosebush has buds peeking out. So it looks, Dear Reader, like I’ll be able to inflict still more blossom pictures\n    on you, come spring.</p>\n    <p>And we’ll be putting in crocuses, but those photos will have to wait twelve months or so.</p>\n    <p>See, even in 2025, there are stories with happy endings.</p>",
      "image": null,
      "media": [],
      "authors": [
        {
          "name": "Tim Bray",
          "email": null,
          "url": null
        }
      ],
      "categories": [
        {
          "label": "The World",
          "term": "The World",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "The World",
          "term": "The World",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "Arts/Photos",
          "term": "Arts/Photos",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "Arts",
          "term": "Arts",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "Photos",
          "term": "Photos",
          "url": "https://www.tbray.org/ongoing/What/"
        }
      ]
    },
    {
      "id": "https://www.tbray.org/ongoing/When/202x/2025/02/26/Safari-Cleanup",
      "title": "Safari Cleanup",
      "description": "Like most Web-heads I spent years living in Chrome, but now feel less comfy there, because Google.     I use many browsers but now my     daily driver is Safari. I’m pretty happy with it but there’s ugly stuff hiding in its corners that needs     to be cleaned up. This fragment’s mostly about those corners, but I include notes on the bigger browser     picture and a couple of ProTips",
      "url": "https://www.tbray.org/ongoing/When/202x/2025/02/26/Safari-Cleanup",
      "published": "2025-02-26T20:00:00.000Z",
      "updated": "2025-02-28T05:43:27.000Z",
      "content": "<p>Like most Web-heads I spent years living in Chrome, but now feel less comfy there, because Google.\n    I use many browsers but now my\n    daily driver is Safari. I’m pretty happy with it but there’s ugly stuff hiding in its corners that needs\n    to be cleaned up. This fragment’s mostly about those corners, but I include notes on the bigger browser\n    picture and a couple of ProTips.</p> \n    <h2 id=\"p-1\">Many browsers?</h2>\n    <p>If your life is complicated at all you need to use more than one. By way of\n    illustration not recommendation, here’s what I do:</p>\n    <ul>\n      <li><p><b>Safari</b> is where I spend most of my time. As I write this I have 36 tabs, eight of them pinned. That\n      the pinned number is eight is no accident, it’s because of the\n      <a href=\"/ongoing/When/201x/2012/04/22/Tab-Lore\">Tab Trick</a>, which if you don’t know about, you really need to\n      learn.</p>\n      <p>More on Safari later.</p></li>\n      <li><p>I use <b>Chrome</b> for business. It’s where I do banking and time-tracking and invoicing. (Much of this relies on\n      <a href=\"https://www.paymoapp.com\">Paymo</a>, which is great.  It takes seconds to track my time, and like ten minutes to do\n      a super-professional monthly invoice.)</p></li>\n      <li><p>I use <b>Firefox</b> when I need to be\n      <a href=\"https://cosocial.ca/@coop\">@[email protected]</a> or go anywhere while certain that no Google accounts\n      are logged in.</p></li>\n      <li><p>I use <b>Chrome Canary</b> for an organization I work with that has Chrome-dependent stuff that I don’t want to mix up with any\n      of my personal business.</p></li>\n    </ul>\n    <h2 id=\"p-2\">Safari, you say?</h2>\n    <p>We inhabit the epoch of Late Capitalism. Which means there’s no reason for me to expect any  company\n    to exhibit ethical behavior. Because ethics is  for amateurs.</p>\n    <p>So when I go looking for infrastructure that offers privacy protection, I look for a provider whose\n    business model depends at least in part on it. That leaves Safari.</p>\n    <p>Yeah, I know about Cook kissing Trump’s ring, and detest\n    companies who route billions of nominal profits internationally to dodge taxes, and am revolted at the\n    App Store’s merciless rent-extraction from app developers who make Apple products better.</p>\n    <p>But still, I think their privacy story is pretty good, and it makes me happy when their marketing emphasizes it. Because \n    if privacy is on their path to profit, I don’t have to mis-place my faith in any large 21st-century corporation’s “ethical\n    values”.</p>\n    <p>Also, Safari is technically competent. It’s fast enough, and (unlike even a very few years ago) compatible with wherever I go.\n    The number of Chome-only sites, thank goodness, seems to be declining rapidly.</p>\n    <p>So, a tip o’ the hat to the Safari team, they’re mostly giving me what I need. But there are irritants.</p>\n    <h2 id=\"p-3\">Tab fragility</h2>\n    <p>This is my biggest gripe. Every so often, Safari just loses all my tabs when… well, I can’t spot a pattern. Sometimes it’s\n    when I accidentally ⌘-Q it, sometimes it’s when I have two windows open for some reason and ⌘-W something. I\n    think. Maybe. Sometimes they’re just gone.</p>\n    <p>Yes, I know about the “Reopen all windows from last session” operation. If it solved the problem I wouldn’t be writing this.</p>\n    <p>This is insanely annoying, and a few years back, more than once it seriously damaged my progress in multiple\n    projects. Fortunately, I discovered that the Bookmarks menu has a one-click thing to create bookmarks for all my open tabs.\n    So I hit that now and again and it’s saved me from tab-loss damage a couple of times now.</p>\n    <p>Someone out there might be thinking of suggesting that I not use browser tabs to store my current professional\n    status. Please don’t, that would be rude.</p>\n    <h2 id=\"p-4\">Pin fragility</h2>\n    <p>Even weirder, sometimes when I notice I’ve lost my main window and use the History menu to try to bring it back, I get a new\n    window with all my tabs except for the pinned ones. Please, Safari.</p>\n    <h2 id=\"p-5\">Kill-pinned-tab theater</h2>\n    <p>Safari won’t let me ⌘-W a pinned tab. This is <em>good</em>, correct where Chrome is wrong.</p>\n    <p>But when I try, does it quietly\n    ignore me, or emit a gentle beep? No, it abruptly shifts to the first un-pinned tab. Which makes me think that I indeed\n    killed the tab I was on, then I realize that no I didn’t, then I panic because obviously I killed something, and go\n    looking for it. I try Shift-⌘-T to bring back most recently closed tab, realize I killed that an hour ago, and\n    sit there blank-faced and worried.</p>\n    <h2 id=\"p-7\">New window huh?</h2>\n    <p>When I’m in Discord or my Mail client or somewhere and I click on a link, sometimes it puts up a new Safari window. Huh? But\n    usually not, I can’t spot the pattern.  When I kill the new window, sometimes I lose all my tabs. Sigh.</p>\n    <h2 id=\"p-8\">Passive-aggressive refresh</h2>\n    <p>When I have some tab that’s been around and unvisited for a while, sometimes there’s this tasteful decoration across the top.</p>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2025/02/26/warning.png\" alt=\"Passive-aggressive Safari warning\"></img>\n    <p>I think that this used to say “significant memory” rather than “significant energy”? But really, Safari, try to imagine how\n    little I care about your memory/energy problems, just do what you need to and keep it to yourself. And if you can’t, at least\n    spruce up the typography and copy-editing.</p>\n    <h2 id=\"p-9\">Better back button</h2>\n    <p>[This is partly a MacOS rather than Safari issue.] On my Android, I can click on something in Discord that takes me to\n    the GitHub app, another click and I’m in\n    the browser, then click on something there and be in the YouTube app, and so on and so on. And then I can use “Back” to retrace\n    my steps from app to app. This is just incredibly convenient.</p>\n    <p>Safari’s memory of “how did I get here” apparently lives in the same evanescent place my tab configuration does, and\n    usually vanishes the instant I step outside the browser. Why\n    shouldn’t the Back operation always at least try to do something useful?</p>\n    <p>Hey Apple, it’s your operating system and your browser, why not\n    catch up with Android in an area where you’re clearly behind?</p>\n    <h2 id=\"p-11\">I humbly suggest</h2>\n    <p>… that Safari do these things:</p>\n    <ol>\n      <li><p>Save my current-tabs setup every few seconds on something more robust than the current fabric \n      of spider webs and thistledown. Offer a “Restore Tabs” entry in the History menu that always works.</p></li>\n      <li><p>Don’t just exit on ⌘-Q. Chrome gets this right, offering an option where I have to hold that key combo down for a\n      second or two.</p></li>\n      <li><p>When I try to kill a pinned tab, just ignore me or beep or put up a little message or something.</p></li>\n      <li><p>Never create a new Safari window unless I ask for it.</p></li>\n      <li><p>Kill the dumb “this webpage was refreshed…”</p></li>\n      <li><p>Offer a “back” affordance that always works, even across applications.</p></li>\n    </ol>\n    <h2 id=\"p-10\">Other browsers?</h2>\n    <p>I already use Firefox every day and I know about Opera, Vivaldi, Brave, Arc, etc., and I’ve tried them, and none ever stuck. Or the\n    experience was feeling good\n    when something emerged about the provider that was scammy or scary or just dumb. (And the recent rumblings out of\n    Mozilla are not reassuring.)</p>\n    <p>While it’d sure be nice for there to be\n    a world-class unencumbered open-source browser from an organization I respect, I’m not holding my breath.\n    So it’s Safari for me for now.</p>\n    <p>And it seems to me that the things that bother me should be easy to fix. Please do.</p>",
      "image": null,
      "media": [],
      "authors": [
        {
          "name": "Tim Bray",
          "email": null,
          "url": null
        }
      ],
      "categories": [
        {
          "label": "Technology/Web",
          "term": "Technology/Web",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "Technology",
          "term": "Technology",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "Web",
          "term": "Web",
          "url": "https://www.tbray.org/ongoing/What/"
        }
      ]
    },
    {
      "id": "https://www.tbray.org/ongoing/When/202x/2025/02/08/Posting-and-Fascism",
      "title": "Posting and Fascism",
      "description": "Recently, Janus Rose’s     You Can’t Post Your Way     Out of Fascism crossed my radar on a hundred channels. It’s a smart piece that says smart things. But     I ended up mostly disagreeing. I’m not saying you can post your way out of Fascism, but I do think it’s gonna be hard     to build the opposition without a lot of posting. The what and especially the where     matter. But the “posting is useless” stance is dangerously reductive",
      "url": "https://www.tbray.org/ongoing/When/202x/2025/02/08/Posting-and-Fascism",
      "published": "2025-02-08T20:00:00.000Z",
      "updated": "2025-02-19T01:42:10.000Z",
      "content": "<p>Recently, Janus Rose’s\n    <a href=\"https://www.404media.co/you-cant-post-your-way-out-of-fascism/?ref=weekly-roundup-newsletter\">You Can’t Post Your Way\n    Out of Fascism</a> crossed my radar on a hundred channels. It’s a smart piece that says smart things. But\n    I ended up mostly disagreeing. I’m not saying you can post your way out of Fascism, but I do think it’s gonna be hard\n    to build the opposition without a lot of posting. The <em>what</em> and especially the <em>where</em>\n    matter. But the “posting is useless” stance is dangerously reductive.</p>\n    <p>Before I get into my gripes with Ms Rose’s piece, let me highlight the good part: Use your browser’s search-in-page to scroll\n    forward to “defend migrants”. Here begins a really smart and inspirational narrative of things people are doing to deflect and\n    defeat the enemy.</p>\n    <p>But it ends with the observation that all the useful progressive action “arose from existing networks of neighbors\n    and community organizers”.\n    Here’s where I part ways. Sure, local action is the most accessible and in most cases the only action, but right now\n    Fascism is a <em>global</em> problem and these fighters here need to network with those there, for values of “here” and\n    “there” that are not local.</p>\n    <p>Which is gonna involve a certain amount of posting: Analyses, critiques, calls to action, date-setting, message-sharpening;\n    it’s just not sensible to rely on networks of neighbors to accomplish this.</p>\n    <h2 id=\"p-1\">What to post about?</h2>\n    <p>Message sharpening feels like the top of the list. Last month I posted\n    <a href=\"/ongoing/When/202x/2025/01/22/In-The-Minority\">In The Minority</a>, making the (obvious I think) point that\n    current progressive messaging isn’t working very well; we keep losing elections!  What needs to be changed? I don’t know and I don’t\n    believe anybody who says they do.</p>\n    <p>It’s not as simple as “be more progressive” or conversely “be more centrist”. I personally think the way to arrive at\n    the right messaging strategies and wording is going to involve a lot of trial balloons and yes, local efforts. Since I\n    unironically think that progressive policies will produce results that a majority of people will like, I also believe that there\n    absolutely must be a way of explaining why and how that will move the needle and lead to victories.</p>\n    <h2 id=\"p-2\">Where to post it?</h2>\n    <p>Short answer: Everywhere, almost.</p>\n    <p>Granted that TV, whatever that means these days, is useless.  Anyone doing mass broadcasting is terrified of controversy and\n    can’t afford to be seen as a progressive nexus.</p>\n    <p>And Ms Rose is 100% right that Tiktok, Xitter, Facebook, Insta, or really any other centralized profit-driven corporate\n    “social network” products are just not useful for progressives. \n    These are all ad-supported, and (at this historical moment) under heavy pressure from governments controlled by our\n    enemies, and in some cases, themselves owned and operated by Fascists.</p>\n    <p>That leaves decentralized social media (the Fediverse and (<a href=\"/ongoing/When/202x/2024/11/15/Not-Bluesky\">for the moment</a>) Bluesky), Net-native operations like\n    <cite>404</cite>/<cite>Vice</cite>/<cite>Axios</cite>/<cite>Verge</cite> (even though most of them are struggling),\n    and mainstream “quality publications”: The <cite>Atlantic</cite>, the <cite>Guardian</cite>, and your local progressive press\n    (nearest to me here in Canada,\n    <a href=\"https://thetyee.ca\">The Tyee</a>).</p>\n    <p>Don’t forget blogs. They can still move the needle.</p>\n    <p>And, I guess, as Ms Rose says, highly focused local conversations on Discord, WhatsApp, and Signal. (Are\n    there other tech options for this kind of thing?)</p>\n    <h2 id=\"p-3\">Are you angry?</h2>\n    <p>I am. And here I part paths with Ms Rose, who is vehement that we should see online anger as an anti-pattern. Me, I’m kinda\n    with Joe Strummer,\n    <a href=\"https://genius.com/The-clash-clampdown-lyrics\">anger can be power</a>. Rose writes “researchers have found that the\n    viral outrage disseminated on social media in response to these ridiculous claims actually\n    <a href=\"https://par.nsf.gov/servlets/purl/10095997?ref=404media.co\">reduces the effectiveness of\n    collective action”</a>. I followed that link and found the evidence unconvincing.</p>\n    <p>Also, if there’s one thing I believe it’s that in the social-media context, being yourself, exposing the person behind the\n    words, is central to getting anywhere. And if the enemy’s actions are filling me with anger, it would be \n    disingenuous and ineffective to edit that out of my public conversation.</p>\n    <h2 id=\"p-4\">Posting is a progressive tool</h2>\n    <p>Not gonna say more about principles or theory, just offer samples.</p>\n    <p><a href=\"https://www.fiftyfifty.one\">50501</a> has done it all with hashtags and micro-posts. Let’s see how it works.</p>\n    <p>Here’s\n    <a href=\"https://www.semafor.com/article/02/12/2025/actually-the-resistance-is-working?utm_source=flipboard&utm_content=user%2FSemafor\">Semafor</a>\n    arguing that the Democrats’ litigation-centric resistance is working pretty well.</p>\n    <p>Heidi Li Feldman, in\n    <a href=\"https://heidi-says.ghost.io/fear-and-loathing-plus-what-blue-states-should-be-doing-now/\">Fear and loathing plus what\n    blue states should be doing now</a> argues on her blog for resistance at the state-government\n    level, disengaging from and pushing back against toxic Musk/Trump projects.</p>\n    <p>Here’s Josh Marshall at <cite>Talking Points Memo</cite>\n    <a href=\"https://talkingpointsmemo.com/edblog/democrats-are-surrounded-by-low-hanging-fruit-get-to-it\">calling for pure\n    oppositionism</a> and then\n    arguing that Democrats\n    <a href=\"https://talkingpointsmemo.com/edblog/wheres-the-real-power-nexus-how-does-the-opposition-get-to-it#more-1511743\">should\n    go to the mattresses</a> on keeping the government open and raising the debt limit.</p>\n    <p>Here’s the let’s-both-sides-Fascism <cite>New York Times</cite> <a href=\"https://www.nytimes.com/interactive/2025/02/13/us/doc-annotation-memo-from-bove.html?unlocked_article_code=1.w04.KqQF._HNGZICTO3SH&smid=url-share\">absolutely savaging</a> \n    the GOP campaign to keep Mayor Adams in place as a MAGA puppet.</p>\n    <p>Here’s yours truly posting about\n    <a href=\"/ongoing/When/202x/2025/01/22/In-The-Minority#p-4\">who progressives should talk to</a>.</p>\n    <p>Here’s Mark Cuban on Bluesky saying\n    <a href=\"https://bsky.app/profile/mcuban.bsky.social/post/3lgek5exkes2p\">hardass political podcasts</a> are the only way to\n    reach young men.</p>\n    <p>Here’s Elizabeth Kolbert in <cite>The New Yorker</cite>\n    <a href=\"https://www.newyorker.com/magazine/2025/01/20/outraged-kurt-gray-book-review\">making very specific suggestions</a> as\n    to the tone and content of progressive messaging.</p>\n    <p>Here’s Cory Doctorow on many channels as usual, on\n    <a href=\"https://pluralistic.net/2025/01/15/beauty-eh/#its-the-only-war-the-yankees-lost-except-for-vietnam-and-also-the-alamo-and-the-bay-of-ham\">how\n    Canada should push back against the Trump tariffs</a>.</p>\n    <p>There’s lots more strong stuff out there. Who’s right?</p>\n    <p>I don’t know. Not convinced anyone does.</p>\n    <p>Let’s keep posting about it till we get it right.</p>",
      "image": null,
      "media": [],
      "authors": [
        {
          "name": "Tim Bray",
          "email": null,
          "url": null
        }
      ],
      "categories": [
        {
          "label": "The World/Politics",
          "term": "The World/Politics",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "The World",
          "term": "The World",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "Politics",
          "term": "Politics",
          "url": "https://www.tbray.org/ongoing/What/"
        }
      ]
    },
    {
      "id": "https://www.tbray.org/ongoing/When/202x/2025/01/02/Lasagna",
      "title": "December 24th Lasagna",
      "description": "We had thirteen people at my Mom’s house this last Christmas. One of our traditions is a heroic Lasagna for Christmas Eve,     a specialty of a family member. This year we asked them for the recipe and they agreed, but would rather remain uncredited.     It’s called “Very Rich Red Sauce and four-Cheese Lasagna”",
      "url": "https://www.tbray.org/ongoing/When/202x/2025/01/02/Lasagna",
      "published": "2025-01-02T20:00:00.000Z",
      "updated": "2025-02-06T22:31:26.000Z",
      "content": "<p>We had thirteen people at my Mom’s house this last Christmas. One of our traditions is a heroic Lasagna for Christmas Eve,\n    a specialty of a family member. This year we asked them for the recipe and they agreed, but would rather remain uncredited.\n    It’s called “Very Rich Red Sauce and four-Cheese Lasagna”.</p>\n    <p>I sort of enjoy cooking but would never have the courage to take on a project like this. I can testify that the results are\n    wonderful.</p>\n    <h2 id=\"p-1\">Sauce</h2>\n    <p>Key sauce ingredients are red wine & sun-dried tomatoes; lasagna is all about mozza, the provolone adds a certain extra\n    something. Over to the chef:</p>\n    <h2 id=\"p-2\">Ingredients</h2>\n    <p>Sauce:</p>\n    <ul>      \n      <li><p>butter - half a lb block or less</p></li>\n      <li><p>olive oil to sauté</p></li>\n      <li><p>carrots - 2 to 4 depending on size, make sure they are fresh!</p></li>\n      <li><p>celery - 5-6 spears, say ⅔ of a bunch</p></li>\n      <li><p>onions (ideally yellow, but whatevs) - 3-6 depending on size.</p>\n      <p>(by volume, you are looking to get roughly 3:2:1 proportions when chopped of onions:celery:carrots)</p></li>\n      <li><p>a red sweet pepper</p></li>\n      <li><p>extra lean hamburger - 1 kg</p></li>\n      <li><p>3 cloves</p></li>\n      <li><p>salt - half a tablespoon? more? (tomato sauces tend to need a little more salt than other applications)</p></li>\n      <li><p>black pepper - if not using cayenne, a LOT, perhaps a tablespoon of freshly ground</p></li>\n      <li><p>cayenne - if using, to taste, I find strength is highly variable so hard to say how much, perhaps a couple of\n      teaspoons?</p></li>\n      <li><p>Two big cans of diced tomatoes (NOT AYLMER! yuck, Unico is acceptable, Italian imported best)</p></li>\n      <li><p>3 small cans or one big can of tomato paste (or tubes, if you get them from an Italian grocery store, which are a\n      rather superior product) It is hard to use too much tomato paste</p>\n      <p>(pro tip for cans of tomato paste: use the can opener to open BOTH the top and bottom of the can, then the paste slides out\n      neatly and you don’t have to fool around trying to spatula the paste out of the can!)</p></li>\n      <li><p>about a half bottle of cheap red wine (the grocery store sells cheap cooking wine in demi bottles, though red can be hard\n      to find, one demi bottle is more than enough)</p></li>\n      <li><p>most of a garlic bulb, say three quarters, once again FINELY chopped (no not pressed or processed!)</p></li>\n      <li><p>a LOT of dried oregano, say 3-4 tablespoons plus</p></li>\n      <li><p>a fair amount of dried basil, say 2 tablespoons plus</p></li>\n      <li><p>some died thyme, say a half tablespoon plus</p>\n      <p>(herbs are tough to give measurements for, as they vary enormously in potency with brand, age & storage)</p></li>\n      <li><p>about a tablespoon of powdered beef stock</p></li>\n      <li><p>about 1½ to 2 cups of finely chopped sun-dried tomatoes NO SUBSTITUTIONS!!!!!</p></li>\n    </ul>\n    <p>Lasagna</p>\n    <ul>\n      <li><p>1 disposable foil pan</p></li>\n      <li><p>foil to cover</p></li>\n      <li><p>butter to grease pan</p></li>\n      <li><p>melted butter to cover top lightly</p></li>\n      <li><p>1¼ margarine tins of sauce above</p></li>\n      <li><p>1½ boxes of lasagna noodles (NOT the “instant” or pre-cooked kind)</p></li>\n      <li><p>salted water to boil noodles</p></li>\n      <li><p>1 big block of mozzarella cheese, coarsely grated</p></li>\n      <li><p>2 packages (12-16 slices) of provolone cheese</p></li>\n      <li><p>1 tin of ricotta cheese</p></li>\n      <li><p>grated parmesan cheese</p></li>\n      <li><p>little bit of freshly ground black pepper</p></li>\n    </ul>\n    <h2 id=\"p-4\">Procedure: Sauce</h2>\n    <p>For the\n    <a href=\"https://en.wikipedia.org/wiki/Mirepoix\">mirepoix</a>, the vegetables all need to be FINELY chopped up for sauce\n    consistency. And I mean FINELY chopped-- I have \n    tried both powered and manual food processors, and they do \n    not do a good job, either reducing things to mush, or leaving big chunks-- the idea here is to get everything about the same\n    size (and the garlic later), it gives the sauce some consistency. </p>\n    <p>This is tedious and takes a long time.</p>\n    <p>To give you an idea, a celery spear can be cut into 5-7 strips longwise with the grain, and then the strips chopped as finely\n    as possible across the grain. A big carrot can yield say 6 long flat pieces that can be cut longways into strips, and then the\n    strips cuts finely against the grain to produce little cubes.</p>\n    <p>The mirepoix is important, we need to get the natural sugars to balance out the acidity of the tomatoes and wine. I cook the\n    onions separately from the rest…</p>\n    <p>Caramelize the onions. Frankly, this is a pain in the ass. There are no shortcuts; the internet has all these handy tips like\n    using a pressure cooker at first or a slow cooker or adding baking soda or water or whatnot, I’ve tried them, and just no. So a\n    big non-stick frying pan, and sloooow saute with a little butter and salt, frequent stirring, a lot of patience, at LEAST 40\n    minutes. Maybe an hour. And constant attention, the bastards will burn on you at the drop of a hat. There is no hiding it, this\n    is tricky and somewhat difficult. But worth it, caramelized onions are magic.</p>\n    <p>Meanwhile, in as big a heavy bottom pot as you can find, saute the celery and carrots (and peppers if you are using them)\n    with say 3 dried cloves, in a little butter, you want to shrink them down and bring out the carrots’ natural sugars, and soften\n    the cloves & bring out their flavour, this takes a while, say 20 minutes or more?</p> \n    <p>Remove the onions and carrots and celery to a BIG bowl, clean out the big heavy bottom pot and brown the hamburger, about\n    1kg. DO NOT USE “regular” as it is mostly fat; lately I have been using the “extra lean” because even the lean is quite fatty\n    these days. A little olive oil in the pot, a fair amount of salt (half\n    tablespoon?) & a lot of freshly ground black pepper (approaching a tablespoon?) on the meat and lots of stirring.</p>\n    <p>This where\n    a lot of people screw up, essentially they “grey” the meat, they don’t BROWN it, ie achieve the\n    <a href=\"https://en.wikipedia.org/wiki/Maillard_reaction\">Maillard reaction</a>-- as with the\n    mirepoix, we are trying to bring out natural sugars. A lot of stirring/scraping, to break the hamburger up into as small pieces\n    as possible, ie the same size as the veggies in the mirepoix.</p>\n    <p>While this is happening, add the rest of the ingredients to the mirepoix in the big bowl: tomatoes, tomato paste (more is\n    better), wine.</p>\n    <p>Also the chopped garlic, oregano, basil, thyme, about a tablespoon of powdered beef stock (yes this is cheating, shhh).</p>\n    <p>A word about sun-dried tomatoes: they are absolutely wonderful things, but hard to find. Ideally, you want the dried kind,\n    not the “in oil” kind, but you may have to settle for that. There are two different kinds of “in oil”, the ones in jars floating\n    in oil like pickles in brine (they are prepped for salads, not sauces, so they are floating oil, and disintegrate once they are\n    in a sauce), which you really do not want, and the ones in packages that have been oiled for preservation. This is usually what\n    you have to settle for. The best ones are dry and quite hard.They are hard to find.</p>\n    <p>Of these, the worst sun-dried tomatoes are the North American product, the big food companies noted there was a demand for\n    them, and started tossing field tomatoes into drying kilns. These are quite inferior, but useable if it’s all you can find. The\n    best ones are Turkish, followed by Italian, you can usually find in Italian delicatessens or grocery stores (even the Italians\n    agree the Turkish ones are best).</p>\n    <p><i>[Tim says: I found them in Vancouver and the chef is right, the flavor is to die for.]</i></p>\n    <p>If you get the fully dried/no oil kind, you can simmer them a little in a little water to soften them before you try chopping\n    them up; the water (or some of it anyway) should be added to the sauce…</p>\n    <p>Drain any fat from the browned meat, add the mix to the meat in the big pot. Stir it all up some more, get it well mixed. You\n    can add a little wine and/or tomato juice if it seems too thick, but be aware that it will liquify a little during cooking. If\n    you are going to use it as a pasta sauce, you want it more liquid, if for lasagna, you want it as thick as practical. In any\n    case, it is very difficult to judge the final thickness at this point.</p>\n    <p>You can add a little (sun-dried tomato?) water, or tomato juice, or wine, if it needs it, but be cautious.</p>\n    <p>Put on medium to low heat and stir frequently until it comes to a high simmer/low boil (don’t let it burn!) then turn the\n    heat down to minimum, and slow-cook for at least 4 hours, stirring every 20 minutes or so. Cooking it longer is a Good Thing, I\n    often cook it for 7 or more hours.</p>\n    <p>LEAVE it out overnight! (this is important!)</p>\n    <p>Warm it up the next day, bringing it back to a high simmer/low boil and stirring a lot, serve it on pasta. Or make\n    lasagna. Or freeze it. One margarine tin makes a meal with leftovers (each serving would be small, because the stuff is quite\n    strong). One margarine tin (plus a little, ideally) makes for one lasagna. You should get about 3 or so margarine tins from the\n    above. It freezes just fine.</p>\n    <p>Whew.</p>\n    <h2 id=\"p-5\">Lasagna</h2>\n    <p>In theory, one box of lasagna noodles is just enough to make one pan of lasagna. However, there are almost always a lot of\n    broken pieces of lasagna in a box, and pieces that break or get stuck or something during cooking. I allow for 1 and half a box\n    per lasagna pan.</p>\n    <p>Ingredients:</p>\n    <ul>\n      <li><p>enough lasagna noodles, cooked al dente in salted boiling water</p></li>\n      <li><p>1¼ margarine tins of sauce, gently heated up</p></li>\n      <li><p>Butter (better than margarine but you can use that if necessary)</p></li>\n      <li><p>1 big block of mozzarella (the regular supermarket kind is fine, I tried the expensive high quality italian\n      stuff, and it was a LITTLE bit better, but not enough to justify the cost)</p></li>\n      <li><p>1 tin of ricotta cheese, or failing that, dry curd cottage cheese</p></li>\n      <li><p>12-16 slices of provolone cheese (usually 2 packages)</p></li>\n      <li><p>parmesan cheese (like with the mozza, I find the cheap Kraft product fully acceptable for this purpose)</p></li>\n      <li><p>freshly ground black pepper</p></li>\n      <li><p>foil lasagna pan</p></li>\n      <li><p>heavy duty foil</p></li>\n      </ul>\n      <p>Grease the pan with butter. do a thorough job, you don’t want huge amounts of butter, but you do not want any bit of foil\n      that might come in contact with lasagna ungreased.</p>\n      <p>Coarsely grate the mozzarella.</p>\n      <p>Lay an overlapping layer of lasagna noodles crossways in the pan, with the sides going up the sides of the pan. The pieces\n      at either end need to overlap the piece on the bottom, but bend up to cover the short end of the pan as well. This is a pain\n      in the ass to get right.</p>\n      <p>The sauce goes a long way, you do NOT want a thick layer. Spread a thin layer over the bottom of the pan, about a third of\n      the sauce. Put a layer of mozza on top, about a third of it. Put half the provolone on top. Put a layer of lasagna noodles down\n      long-ways , overlapping a bit.</p>\n      <p>Spread a thin layer of sauce, another third, covered with mozza, another third, and cover that with the ricotta (or dry-curd\n      cottage). Put down another layer of lasagna long-ways.</p>\n      <p>The rest of the sauce, the rest of the mozza, and the rest of the provolone.</p>\n      <p>Cover the cross-wise lasagna noodles, overlapping, and trying to tuck the ends in to seal the package. This is\n      tricky at the ends, I find putting a small cut in the lasagna noodle at the corner makes it easier to fold over\n      neatly. (Usually I am tired by this point and less inclined to be finicky and careful, which is a pity.)</p>\n      <p>Pour a little melted butter over the top, enough to grease the surface. Sprinkle some freshly ground pepper and a fair\n      amount of parmesan over the top. Cover with foil. Put in fridge (you can pre-make hours before use if you are having a party\n      or something) or immediately put in pre-heated oven.</p> \n      <p>Preheat oven to pretty hot, 375-400. Cook lasagna for 45 minutes to an hour. Remove foil from pan 10-15 minutes before you\n      remove it from the oven. Put the foil back on and let it stand for AT LEAST 15 minutes, better if you can hold off for half an\n      hour (the hotter it is, the more likely it is do disintegrate when being served, you want the melted cheese to start to re-set\n      a little)</p> \n      <p>Serve with garlic bread and salad and an impertinent red wine. One pan goes a fairly long way, serves 6-8ish? Depends how\n      many hungry teens you have around…</p>",
      "image": null,
      "media": [],
      "authors": [
        {
          "name": "Tim Bray",
          "email": null,
          "url": null
        }
      ],
      "categories": [
        {
          "label": "The World/Food and Drink",
          "term": "The World/Food and Drink",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "The World",
          "term": "The World",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "Food and Drink",
          "term": "Food and Drink",
          "url": "https://www.tbray.org/ongoing/What/"
        }
      ]
    },
    {
      "id": "https://www.tbray.org/ongoing/When/202x/2025/02/04/Two-Photos-of-Snow",
      "title": "Photo Philosophizing",
      "description": "What happened was, I went to Saskatchewan to keep my mother company, and got a little obsessed about photo composition and     complexity. Which in these troubled times is a relief",
      "url": "https://www.tbray.org/ongoing/When/202x/2025/02/04/Two-Photos-of-Snow",
      "published": "2025-02-04T20:00:00.000Z",
      "updated": "2025-02-05T06:30:50.000Z",
      "content": "<p>What happened was, I went to Saskatchewan to keep my mother company, and got a little obsessed about photo composition and\n    complexity. Which in these troubled times is a relief.</p>\n    <p>This got started just after take-off from Vancouver. As the plane climbed over the city I thought “That’s a nice\n    angle” and pointed the Pixel through the plexiglass.</p>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2025/02/04/PXL_20250114_163303579.png\" alt=\"Vancouver from the air, looking north\"></img>\n    <div class=\"caption\"><p>You might want to enlarge this one.</p></div>\n    <p>A couple of days into my Prairie visit I got around to processing the photos and thought that Vancouver aerial had come out\n    well. No credit to the photographer here, got lucky on the opportunity,  but holy crap modern mobile-device camera tech is\n    getting good these days. I’ll take a little credit for the Lightrooming; this has had heavy dehazing and other\n    prettifications applied.</p>\n    <p>A couple of days later I woke up and the thermometer said -36°C (in Fahrenheit that’s “too freaking cold”).  The air was\n    still and the hazy sunlight was weird. “There has to be a good photo in this somewhere, maybe to contrast that Vancouver shot” I\n    thought. So I tucked the Fujifilm inside \n    my parka (it claims to be only rated to -10°) and went for a walk.\n    Mom politely declined my invitation to come along without, to her credit, getting that “Is he crazy?” expression on her face.</p>\n    <p>Her neighborhood isn’t that photogenic but there’s a Pitch-n-putt golf course a block away so I trudged through that. The\n    snow made freaky squeaking sounds underfoot. At that temperature, it feels like you have to push the air aside with each\n    step. Also, you realize that your lungs did not evolve to process that particular atmospheric condition.</p>\n    <p>Twenty minutes in I had seen nothing that made me want to pull out the camera, and was thinking it was about time to head home.\n    So I stopped in a place where there was a bit of shape and shadow, and decided that if I had to force a\n    photo opportunity to occur by pure force of will, so be it.</p>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2025/02/04/TXT55358.png\" alt=\"Snow shapes and shadows\"></img>\n    <p>It ain’t a great city framed by coastal mountains. But it ain’t nothing either. I had to take my gloves off to shoot, and\n    after just a couple of minutes of twisting around looking for angles, my fingers were screaming at me.</p>\n    <p>The two pictures are at the opposite end of the density-vs-minimalism spectrum but they share, um, snow, so that’s\n    something.</p>\n    <p>Anyhow, here’s the real reason I was there.</p>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2025/02/04/PXL_20250121_180700202.png\" alt=\"Jean Bray\"></img>\n    <div class=\"caption\"><p>Jean Bray, who’ll be turning 95 this year.</p></div>\n    <p>I find photography to be a very useful distraction from what’s happening to the world.</p>",
      "image": null,
      "media": [],
      "authors": [
        {
          "name": "Tim Bray",
          "email": null,
          "url": null
        }
      ],
      "categories": [
        {
          "label": "Arts/Photos",
          "term": "Arts/Photos",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "Arts",
          "term": "Arts",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "Photos",
          "term": "Photos",
          "url": "https://www.tbray.org/ongoing/What/"
        }
      ]
    },
    {
      "id": "https://www.tbray.org/ongoing/When/202x/2025/01/22/In-The-Minority",
      "title": "In The Minority",
      "description": "That’s us. I assume you’re among those horrified at the direction of politics and culture in recent years and     especially recent weeks, in the world at large and especially in America. We are a minority. We shouldn’t try to deny     it, we should be adults and figure out how to deal with it",
      "url": "https://www.tbray.org/ongoing/When/202x/2025/01/22/In-The-Minority",
      "published": "2025-01-22T20:00:00.000Z",
      "updated": "2025-01-26T21:06:26.000Z",
      "content": "<p>That’s us. I assume you’re among those horrified at the direction of politics and culture in recent years and\n    especially recent weeks, in the world at large and especially in America. We are a minority. We shouldn’t try to deny\n    it, we should be adults and figure out how to deal with it.</p>\n    <h2 id=\"p-1\">Denialists</h2>\n    <p>I’m out of patience with people who put the blame on the pollsters or the media or Big Tech, or really any third party.\n    People generally heard what Mr Trump was offering<span class=\"dashes\"> —</span> portrayed pretty accurately\n    I thought<span class=\"dashes\"> —</span> and enough of them liked it to elect him.\n    Those who didn’t are in a minority. Quit dodging and deal.</p>\n    <p>Clearly, we the minority have failed in explaining our views. Many years ago I wrote an essay called\n    <a href=\"/ongoing/When/200x/2004/01/13/LawOfConversation\">Two Laws of\n    Explanation</a>. One law says that if you’re explaining something and the person you’re explaining to doesn’t get it, that’s\n    not their problem, it’s your problem. I still believe this, absolutely.</p>\n    <p>So let’s try to figure out better explanations.</p>\n    <p>But first, a side trip into economic perception and reality.</p>\n    <h2 id=\"p-2\">Economists</h2>    \n    <p>A strong faction of progressives and macroeconomists are baffled by people being disaffected when the economy, they say, is\n    great. Paul Krugman\n    <a href=\"https://paulkrugman.substack.com/p/this-economy-is-too-good-for-donald\">beats this drum all the time</a>. Unemployment\n    and inflation are low! Everything’s peachy! Subtext: If the population disagrees, they are fools.</p>\n    <p>I call bullshit. The evidence of homelessness is in my face wherever I go, even if there are Lamborghinis cruising past the\n    sidewalk tents.\n    <a href=\"https://foodbankscanada.ca/hungercount/\">Food banks are growing</a>. I give a chunk of money every year to\n    <a href=\"https://vansunkidsfund.ca/schools/2023-adopt-a-school/\">Adopt a School</a>, which puts free cafeterias in Vancouver\n    schools where kids are coming to school hungry. Kingston, a mid-sized mid-Canadian city, just\n    <a href=\"https://www.cbc.ca/news/canada/ottawa/kingston-ontario-declares-food-insecurity-emergency-1.7436000\">declared an\n    emergency</a> because one household in three is suffering from food insecurity.</p>\n    <p>Even among those who are making it, for many it’s just barely:</p>\n    <blockquote><p>… half of Canadians (50%, +8) are now $200 or less away each month from not being able to pay their bills and debt\n    payments. This is a result of significantly more Canadians saying they are already insolvent (35%, +9) compared to last\n    quarter. Canadians who disproportionately report being $200 or less away from insolvency continue to be women (55%, +4) but the\n    proportion of men at risk has increased to 44%, up 13 points from last quarter.</p>\n    <p>Source:\n    <a href=\"https://www.ipsos.com/en-ca/mnp-consumer-debt-index-plunges-79-points-down-10-trump-election-causes-financial-anxiety\">MNP\n    Consumer Debt Index</a>. The numbers like “+8” give the change since last quarter.</p></blockquote>\n    <p>(Yes, this data is Canadian, because I am. But I can’t imagine that America is statistically any\n    better.)</p>\n    <h2 id=\"p-3\">Majorities</h2>\n    <p>Minorities need to study majorities closely. So let me sort them, the ones who gave Trump the election I mean, into\n    baskets:</p>\n    <ol>\n      <li><p>Stone racists who hate immigrants, especially brown ones.</p></li>\n      <li><p>Culture warriors who hate gays and trans people and so on.</p></li>\n      <li><p>Class warriors; the conventional billionaire-led Republican faction who are rich, voting for anyone they think offers\n      lower taxes and less regulation.</p></li>\n      <li><p>People who don’t pay much attention to the news but remember that gas was cheaper when Trump was in office.</p></li>\n      <li><p>Oh wait, I forgot one: People who heard Trump say what boiled down to “The people who are running things\n      don’t care about you and are corrupt!” This worked pretty well because far too many don’t and are.\n      A whole lot of the people who heard this are financially stressed (see above).</p></li>\n    </ol>\n    <h2 id=\"p-4\">Who to talk to?</h2>\n    <p>Frankly, I wouldn’t bother trying to reach out to either of the first two groups. Empirically, some people are \n    garbage. You can argue that it’s not their fault; maybe they had a shitty upbringing or just fell into the wrong\n    fellowships. Maybe. But you can be sure that that’s not <em>your</em> fault. The best practice is some combination of ignoring\n    them and defending against their attacks, politics vs politics and force versus force.</p>\n    <p>I think talking to the 1% is worthwhile. The fascist leaders are rich, but not all of the rich are\n    fascist. Some retain much of their humanity. And presumably some are smart enough to hear an argument that\n    on this economic path lie tumbrils and guillotines.</p>\n    <p>That leaves the people who mostly ignore the news and the ones who have just had it with the deal they’re getting from\n    late-Capitalist society. I’m pretty sure that’s who we should be talking to, mostly.</p>\n    <h2 id=\"p-7\">What to say?</h2>\n    <p>I’m not going to claim I know.  I hear lots of suggestions…</p>\n    <p>In the <cite>New Yorker</cite>, Elizabeth Kolbert’s\n    <a href=\"https://www.newyorker.com/magazine/2025/01/20/outraged-kurt-gray-book-review\">Does One Emotion Rule All Our Ethical\n    Judgments?</a> makes two points. First, fear generally trumps all other emotions. So, try phrasing your arguments in terms of the\n    threats that fascism poses directly to the listener, rather than abstract benefits to be enjoyed by everyone in a progressive world.</p>\n    <p>Second, she points out the awesome power of anecdote: MAGA made this terrible thing happen to this actual person,\n    identified by name and neighborhood.</p>\n    <p>On Bluesky,\n    <a href=\"https://bsky.app/profile/mcuban.bsky.social/post/3lgek5exkes2p\">Mark Cuban says</a> we need offensive hardass\n    progressive political podcasts, and offers a sort of horrifying example that might work.</p>\n    <p>On Bloomberg (paywalled) they say that the ruling class should be terrified of a\n    <a href=\"https://www.bls.gov/osmr/research-papers/2021/pdf/ec210020.pdf\">K-shaped recovery</a>; by inference, progressives\n    should be using that as an attack vector.</p>\n    <p>Josh Marshall has been arguing for weeks that since the enemies won the election, they have the power and have to own the\n    results. Progressives don’t need to sweat alternative policies, they just have to highlight the downsides of encroaching fascism\n    (there are plenty) and say “What we are for is NOT THAT!” and just keep saying it.\n    <a href=\"https://talkingpointsmemo.com/edblog/democrats-are-surrounded-by-low-hanging-fruit-get-to-it\">Here’s an\n    example.</a></p>\n    <p>Maybe one of these lines of attack is right. I think they’re all worth trying. And I’m pretty sure I know one ingredient\n    that’s going to have to be part of any successful line of attack…</p>\n    <h2 id=\"p-6\">Be blunt</h2>\n    <p>Looking back at last year’s Presidential campaign, there’s a thing that strikes me as a huge example of What Not To Do. I’m\n    talking about Harris campaign slogan: “Opportunity Economy”. This is marketing-speak. If there’s one thing we should have\n    learned it’s that the population as a whole<span class=\"dashes\"> —</span> rich, poor, Black, white, queer, straight, any old\n    gender<span class=\"dashes\"> —</span> <em>has</em> learned to see through this kind of happy talk.</p>\n    <p>Basically, in Modern Capitalism, whenever, and I mean whenever <em>without exception</em>, whenever someone offers you an\n    “opportunity”, they’re trying to take advantage of you. This is appallingly tone-deaf, and apparently nobody inside that campaign\n    asked themselves the simple question “Would I actually use this language in talking to someone I care about?” Because they\n    wouldn’t.</p>\n    <p>Be blunt. Call theft theft. Call lies lies. Call violence violence. Call ignorance ignorance. Call stupidity stupidity.</p>\n    <p>Also, talk about money a lot. Because billionaires are unpopular.</p>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2025/01/22/billionaires.png\" alt=\"Graph data from an AP poll\"></img>\n    <div class=\"caption\"><p>From a\n    <a href=\"https://apnews.com/article/doge-musk-trump-corruption-government-efficiency-16243280f446ea85ef50ff106c7e2841\">good AP\n    poll</a>.</p></div>\n    <p>Don’t say anything you wouldn’t say straight-up in straight-up conversation with a real person.\n    Don’t let any marketing or PR professionals edit the messaging. This is the kind of\n    messaging that social media is made for.</p>\n    <p>Maybe I’m oversimplifying, but I don’t think so.</p>",
      "image": null,
      "media": [],
      "authors": [
        {
          "name": "Tim Bray",
          "email": null,
          "url": null
        }
      ],
      "categories": [
        {
          "label": "The World/Politics",
          "term": "The World/Politics",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "The World",
          "term": "The World",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "Politics",
          "term": "Politics",
          "url": "https://www.tbray.org/ongoing/What/"
        }
      ]
    },
    {
      "id": "https://www.tbray.org/ongoing/When/202x/2025/01/14/Protocol-Churn",
      "title": "Protocol Churn",
      "description": "Bluesky and the Fediverse are our best online hopes for humane human conversation.     Things happened on 2025/01/13; I’ll hand the microphone to Anil Dash,     whose post starts “This is a monumental day for the future of the     social web.”",
      "url": "https://www.tbray.org/ongoing/When/202x/2025/01/14/Protocol-Churn",
      "published": "2025-01-14T20:00:00.000Z",
      "updated": "2025-01-16T04:52:57.000Z",
      "content": "<p>Bluesky and the Fediverse are our best online hopes for humane human conversation.\n    Things happened on 2025/01/13; I’ll hand the microphone to Anil Dash,\n    <a href=\"https://me.dm/@anildash/113822018649097081\">whose post</a> starts “This is a monumental day for the future of the\n    social web.”</p>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2025/01/14/Anil.png\" alt=\"Anil Dash on 2025/01/13\"></img>\n    <p>What happened? Follow Anil’s links:\n    <a href=\"https://blog.joinmastodon.org/2025/01/the-people-should-own-the-town-square/\">Mastodon</a> and \n    <a href=\"https://freeourfeeds.com\">Bluesky (under the “Free Our Feeds” banner</a>). Not in his sound-bite: Both groups are\n    seeking donations, raising funds to meet those goals.</p>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2025/01/14/Fediverse.png\" alt=\"Fediverse fundraising program\"></img>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2025/01/14/ATProto.png\" alt=\"Bluesky/AT-Protocol fundraising program\"></img>\n    <p>I’m sympathetic to both these efforts, but not equally.  I’m also cynical, mostly about the numbers: They’ve each\n    announced a fundraising target, and both the targets are substantial, and I’m not going to share either, because they’re just\n    numbers pulled out of the air, written on whiteboards, designed to sound impressive.</p>\n    <h2 id=\"p-1\">What is true</h2>\n    <p>These initiatives, just by existing, are evidence in\n    letters of fire 500 miles high, evidence of people noticing something important: \n    Corporately-owned town squares are irreversibly discredited. They haven’t worked in the past, they don’t work now, and they’ll\n    never work.</p>\n    <p>Something decentralized is the only way forward. Something not owned by anyone, defined by freely-available protocols.\n    Something like \n    email. Or like the Fediverse, which runs on the ActivityPub protocol. Or, maybe Bluesky, where by “Bluesky” I mean independent\n    service providers \n    federated via the AT Protocol, “ATProto” for short.</p>\n    <h2 id=\"p-2\">What is hard?</h2>\n    <p>I’ll tell you what’s hard: Raising money for a good cause, when that good cause is full of abstractions about openness and\n    the town square and so on. Which implies you’re not intending that the people providing the money will make money.\n    So let’s wish both these efforts good luck. They’ll need it.</p>\n    <h2 id=\"p-4\">What matters</h2>\n    <p>Previously in\n    <a href=\"/ongoing/When/202x/2024/11/15/Not-Bluesky\">Why Not Bluesky</a> I argued that, when thinking about the future of conversational\n    media, what matters isn’t the technology, or even so much the culture, but the money: Who pays for the service?\n    On that basis, I’m happy about both these initiatives.</p>\n    <p>But now I’m going to change course and talk about technology a bit.\n    At the moment, the ATProto implementation that drives Bluesky is the only one in the world. If the company operating it failed\n    in execution or ran out of money, the service would shut down.</p>\n    <p>So, in practice, Bluesky’s not really decentralized at all.\n    Thus, I’m glad that the “Free Our Feeds” effort is going to focus on\n    funding an alternative ATProto implementation. In particular, they’re talking about offering an\n    alternative ATProto “Relay”.</p>\n    <p>Before I go on, you’re going to need a basic understanding of what ATProto is and how its parts work.  Fortunately, as usual,\n    Wikipedia has a\n    <a href=\"https://en.wikipedia.org/wiki/AT_Protocol\">terse, accurate introduction</a>. If you haven’t looked into ATProto yet,\n    please hop over there and remedy that. I’ll wait.</p>\n    <p>Now that you know the basics, you can understand why Free Our Feeds is focusing on the Relay. Because, assuming that Bluesky\n    keeps growing, this is going to be a big, challenging piece of software to build, maintain, and operate, and the performance of\n    the whole service depends on it.</p>\n    <p>The Fediverse in general and Mastodon in particular generally don’t rely on a global firehose feed that knows everything\n    that happens, like an eye in the sky. In fact, the ActivityPub protocol assumes a large number of full-stack peer implementations \n    that chatter with each other, in stark contrast to ATProto’s menagerie of Repos and PDSes and Relays and\n    App Views and Lexicons.</p>\n    <p>The ATProto approach has advantages; since the Relay knows everything, you can be confident of seeing everything relevant.\n    The Fediverse makes no such promise, and it’s well-known that in certain circumstances you can miss replies to your posts. And\n    perhaps more important, miss replies to others’ posts, which opens the door to\n    <a href=\"/ongoing/When/202x/2024/07/30/Invisible-Attackers\">invisible attackers</a>.</p>\n    <p>And this makes me nervous. Because why would anyone make the large engineering and financial investments that’d be required\n    to build and operate an ATProto Relay?</p>\n    <p>ActivityPub servers may have their flaws, but in practice they are\n    <a href=\"https://hachyderm.io/@esk/113793277371908181\">pretty cheap to operate</a>. And it’s easy to think of lots of reasons\n    why lots of organizations might want to run them:</p>\n    <ol>\n      <li><p>A university, to provide a conversational platform for its students…</p></li>\n      <li><p>… or its faculty.</p></li>\n      <li><p>A Developer Relations team, to talk to geeks.</p></li>\n      <li><p>Organized religion, for evangelism, scholarship, and ministry.</p></li>\n      <li><p>Marketing and PR teams, to get the message out.</p></li>\n      <li><p>Government departments that provide services to the public.</p></li>\n    </ol>\n    <p>Or consider my own instance,\n    <a href=\"https://cosocial.ca\">CoSocial</a>, the creation of Canadians who (a) are fans of the co-operative movement,\n    (b) concerned about Canadians’ data staying in Canada, and (c) want to explore modes of funding conversational media that aren’t\n    advertising or Patreon.</p>\n    <p>Maybe, having built and run a Relay, the Free Our Feeds people will discover a rationale for why anyone else should do this.</p>\n    <h2 id=\"p-5\">So, anyhow…</h2>\n    <p>I hope both efforts hit their fundraising targets. I hope both succeed at what they say they’re going to try.</p>\n    <p>But for my own conversation with the world, I’m sticking with the Fediverse.</p>\n    <p>Most of all, I’m happy that so many people, whatever they think of capitalism, have realized that it’s an\n    unsuitable foundation for online human conversation. And most of all I hope that that number keeps growing.</p>",
      "image": null,
      "media": [],
      "authors": [
        {
          "name": "Tim Bray",
          "email": null,
          "url": null
        }
      ],
      "categories": [
        {
          "label": "The World/Social Media",
          "term": "The World/Social Media",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "The World",
          "term": "The World",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "Social Media",
          "term": "Social Media",
          "url": "https://www.tbray.org/ongoing/What/"
        }
      ]
    },
    {
      "id": "https://www.tbray.org/ongoing/When/202x/2025/01/10/Photo-Noise-Reduction",
      "title": "AI Noise Reduction",
      "description": "What happened was, there was a pretty moon in the sky, so I got out a tripod and the     big honkin’ Tamron 150-500 and fired away.     Here’s the shot I wanted to keep",
      "url": "https://www.tbray.org/ongoing/When/202x/2025/01/10/Photo-Noise-Reduction",
      "published": "2025-01-10T20:00:00.000Z",
      "updated": "2025-01-11T05:01:24.000Z",
      "content": "<p>What happened was, there was a pretty moon in the sky, so I got out a tripod and the\n    <a href=\"/ongoing/When/202x/2024/03/30/A057\">big honkin’ Tamron 150-500</a> and fired away.\n    Here’s the shot I wanted to keep.</p>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2025/01/10/TXT55339.png\" alt=\"Photograph of the moon, half-shadowed\"></img>\n    <div class=\"caption\"><p> Sadly, the clouds had shifted<br></br>and Luna had lost her pretty bronze shading.</p></div>\n    <p>I thought the camera and lens did OK given that I was shooting from sea level through soggy Pacific-Northwest winter air.\n    But when I zoomed in there was what looked like pretty heavy static. So I applied Lightroom to the problem, twice.</p>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2025/01/10/TXT55339-Enhanced-NR.png\" alt=\"Photograph of the moon, half-shadowed, de-noised\"></img>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2025/01/10/TXT55339-2.png\" alt=\"Photograph of the moon, half-shadowed, de-noised\"></img>\n    <p>I’ll be surprised if many of you can see a significant difference. (Go ahead and enlarge.)\n    But you would if it were printed on a big piece of paper\n    and hung on a wall. So we’ll look at the zoomed-in version. But first…</p>\n    <h2 id=\"p-1\">Noise reduction, old-school</h2>\n    <p>Lightroom has had a Luminance-noise reduction tool for years. Once you wake it up, you can further refine with “Detail” and\n    “Contrast” sliders, whose effects are subtle at best.  For the moon shot, I cranked the Luminance slider pretty all the way over\n    and turned up Detail quite a bit too.</p>\n    <h2 id=\"p-2\">Noise reduction, with AI</h2>\n    <p>In recent Lightroom versions there’s a “Denoise…” button. Yes, with an ellipsis and a note that says “Reduce noise with AI.”\n    It’s slow; took 30 seconds or more to get where it was going.</p>\n    <p>Anyhow, here are the close-up shots.</p>\n    <img src=\"close-orig.png\" alt=\"moon close-up, no noise reduction\"></img>\n    <img src=\"close-by-hand.png\" alt=\"moon close-up, noise reduction by Lightroom\"></img>\n    <img src=\"close-ai.png\" alt=\"moon close-up noise reduction with AI\"></img>\n    <div class=\"caption\"><p>Original first, then noise-reduced<br></br>in Lightroom by hand, then with AI.</p></div>\n    <h2 id=\"p-3\">What do you think?</h2>\n    <p>I have a not-terribly-strong preference for the by-hand version. I think both noise reductions add value to the photo.\n    I wonder why the AI decided to enhance the very-slight\n    violet cast? You can look at the rim of one crater or another and obsess about things that nobody just admiring the moon will\n    ever see.</p>\n    <p>It’s probably worth noting that the static in the original version isn’t “Luminance noise”, which is what you get when you’re\n    pushing your sensor too hard to capture an image in low light. When you take pictures of the moon you quickly learn that it’s\n    not a low-light scenario at all, the moon is a light-colored object in direct sunlight. These pix are taken at F7.1 at 1/4000\n    second shutter. I think the static is just the Earth’s atmosphere getting in the way.  So I’m probably abusing Lightroom’s\n    Luminance slider. Oh well.</p>\n    <p>You could take this as an opportunity to sneer at AI, but that would be dumb. First, Lightroom’s AI-driven “select sky” and\n    “select subject” tools work astonishingly well, most times. Second, Adobe’s been refining that noise-reduction code for decades\n    and the AI isn’t even a year old yet.</p>\n    <p>We’ll see how it goes.</p>",
      "image": null,
      "media": [],
      "authors": [
        {
          "name": "Tim Bray",
          "email": null,
          "url": null
        }
      ],
      "categories": [
        {
          "label": "Arts/Photos",
          "term": "Arts/Photos",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "Arts",
          "term": "Arts",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "Photos",
          "term": "Photos",
          "url": "https://www.tbray.org/ongoing/What/"
        }
      ]
    },
    {
      "id": "https://www.tbray.org/ongoing/When/202x/2025/01/04/Bitcoin-capitalism",
      "title": "Bitcoin Lessons",
      "description": "Here we are, it’s 2025 and Bitcoin is surging. Around $100K last time I looked. While its creation spews megatons of     carbon into our atmosphere, investors line up to buy it in respectable ETFs, and long-term players like retirement pools and     university endowments are looking to get in.     Many of us are finding this extremely annoying.     But I look at Bitcoin and I think what I’m seeing is Modern Capitalism itself, writ large and in brutally sharp focus",
      "url": "https://www.tbray.org/ongoing/When/202x/2025/01/04/Bitcoin-capitalism",
      "published": "2025-01-04T20:00:00.000Z",
      "updated": "2025-01-10T00:55:53.000Z",
      "content": "<p>Here we are, it’s 2025 and Bitcoin is surging. Around $100K last time I looked. While its creation spews megatons of\n    carbon into our atmosphere, investors line up to buy it in respectable ETFs, and long-term players like retirement pools and\n    university endowments are looking to get in.\n    Many of us are finding this extremely annoying.\n    But I look at Bitcoin and I think what I’m seeing is Modern Capitalism itself, writ large and in brutally sharp focus.</p>\n    <p>[Disclosure: In 2017 I made a lot of money\n    <a href=\"/ongoing/When/201x/2017/12/19/How-To-Sell-Bitcoin-in-Canada\">selling Bitcoins</a> at around $20K, ones\n    <a href=\"/ongoing/When/201x/2013/04/09/I-bought-some-BitCoins\">I’d bought in 2013</a>.  Then in 2021 I\n    <a href=\"/ongoing/When/202x/2021/06/26/Shorting-Bitcoin\">lost money shorting Bitcoin</a> (but I’m still ahead on this\n    regrettable game).]</p>\n    <h2 id=\"p-1\">What is a Bitcoin?</h2>\n    <p>It is verifiable proof that a large amount of computing has been done. Let’s measure it in carbon, and while\n    it’s complicated and I’ve seen a range of answers, they’re all over 100 tonnes of CO<sub>2</sub>/Btc. That proof is all that a\n    Bitcoin is.</p>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2025/01/04/mine.png\" alt=\"Bitcoin mine\"></img>\n    <p>Bitcoin is also a store of value.  It doesn’t matter whether you think it <em>should</em> be, empirically it <em>is</em>, because lots\n    of people are exchanging lots of money for Bitcoins on the assumption that they will store the value of that money.  Is it a\n    <em>good</em> store of value?  Many of us think not, but who cares what we think?</p>\n    <h2 id=\"p-2\">Is Bitcoin useful?</h2>\n    <p>I mean, sure, there are currency applications in gun-running, ransoms, narcotics, and sanctions-dodging. But nope, the blockchain\n    is so expensive and slow that all most people can really do with Bitcoin is refresh their wallets hoping to see number go up.</p>\n    <h2 id=\"p-3\">Bitcoin and late capitalism</h2>\n    <p>The success of Bitcoin teaches the following about capitalism in the 2020s:</p>\n    <ol>\n      <li><p>Capitalism doesn’t care about aesthetics. Bitcoins in and of themselves in no way offer any pleasure to any human.</p></li>\n      <li><p>Capitalism doesn’t care about negative externalities generally, nor about the future of the planet in particular. As\n      long as the number goes up, the CO<sub>2</sub> tonnage is simply invisible. Even as LA burns.</p></li>\n      <li><p>Capitalism can be oblivious to the sunk-cost fallacy as long as people are making money right now.</p></li>\n      <li><p>Capitalism doesn’t care about utility; the fact that you can’t actually <em>use</em> Bitcoins for anything is apparently\n      irrelevant.</p></li>\n      <li><p>And oblivious about crime too. The fact that most actual use of Bitcoins as a currency carries the\n      stench of international crime doesn’t seem to bother anyone.</p></li>\n      <li><p>Capitalism doesn’t care about resiliency or sustainability. Bitcoins are fragile; very easy to lose forever by\n      forgetting a password or failing to back up data just right. Also, on the evidence, easy to steal.</p></li>\n      <li><p>Capitalism can get along with obviously crazy behavior, for example what MicroStrategy is doing: Turning a third-rate\n      software company into a bag of \n      Bitcoins and having an equity valuation that is higher than the value of the bag; see\n      <a href=\"https://www.bloomberg.com/opinion/articles/2025-01-06/mba-class-project-got-a-bit-too-real\">Matt Levine</a> (you have\n      to scroll down a bit, look for “MicroStrategy”).</p></li>\n      <li><p>Capitalism says: “Only money is real. Those other considerations are for amateurs. Also, fuck the future.”</p></li>\n    </ol>\n    <h2 id=\"p-4\">Do I hate capitalism?</h2>\n    <p>Not entirely. As Paul Krugman\n    <a href=\"https://paulkrugman.substack.com/p/trade-in-the-ruins-wonkish\">points out</a>, a market-based economy can in practice\n    deliver reasonably good results for a reasonably high proportion of the population, as America’s did in the decades following\n    1945. Was that a one-time historical aberration? Maybe.</p>\n    <p>But as for what capitalism has become in the 21st century? Everything got financialized and\n    Bitcoin isn’t the disease, it’s just a highly visible symptom.\n    Other symptoms: The explosion of homelessness, the destruction of my children’s ecosystem, the gig economy, and the pervasiveness of\n    wage theft. It’s really hard to find a single kind word to say.</p> \n    <h2 id=\"p-5\">Are Bitcoins dangerous?</h2>\n    <p>Not existentially. I mean, smart people are worried, for example \n    <a href=\"https://www.ft.com/content/25d078a1-0a64-4370-bca8-f19a6b5e8255\">Rostin Behnam,\n    chair of the Commodity Futures Trading Commission</a>: “You\n    still have a large swath of the digital asset space unregulated in the US regulatory system and it’s important — given the\n    adoption we’ve seen by some traditional financial institutions, the huge demand for these products by both the retail and\n    institutional investors — that we fill this gap.”</p>\n    <p>All that granted, the market cap of Bitcoin is around two trillion US dollars as I write this. Yes, that’s a lot of money. But\n    most of them are held by market insiders, so even in the (plausible) case that it plunges close to zero, the damage to the\n    mainstream economy shouldn’t be excessive.</p>\n    <p>It’s just immensely annoying.</p>\n    <h2 id=\"p-6\">Bitcoin and gold</h2>\n    <p>One of the things Bitcoin teaches us is that there is too much money in the world, more than can be put to work in sensible\n    investments. So the people who have it do things like buy Bitcoins.</p>\n    <p>Gold is also a store of value, also mostly just because people believe it is. But it has the virtues of beauty and of applications in\n    jewellery and electronics. I dunno, I’m seriously thinking about buying some on the grounds that the people who have too much\n    money are going to keep investing in it. In particular if Bitcoin implodes.</p>\n    <h2 id=\"p-7\">Having fun staying poor</h2>\n    <p>I’ve been snarling at cryptocurrencies since 2018 or so. But, number go up. So I’ll close by linking to \n    <a href=\"https://www.ft.com/content/8533f856-57f1-4765-a3dc-d866543092be\">HODLers apology</a>.</p>\n    <h2 id=\"p-8\">Question</h2>\n    <p>Is this the best socio-economic system we as a species can build?</p>",
      "image": null,
      "media": [],
      "authors": [
        {
          "name": "Tim Bray",
          "email": null,
          "url": null
        }
      ],
      "categories": [
        {
          "label": "The World/Politics",
          "term": "The World/Politics",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "The World",
          "term": "The World",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "Politics",
          "term": "Politics",
          "url": "https://www.tbray.org/ongoing/What/"
        }
      ]
    },
    {
      "id": "https://www.tbray.org/ongoing/When/202x/2024/12/29/Matching-Dot-Redux",
      "title": "QRS: Dot-matching Redux",
      "description": "Recently I posted     Matching “.” in UTF-8, in which I claimed that you could match     the regular-expression “.” in a UTF-8 stream with either four or five states in a byte-driven finite automaton,     depending how      you define the problem.  That statement was arguably wrong, and you might need three more states, for a total of eight. But you      can make a case that really, only four should be needed, and another case calling for quite a few more.     Because that phrase “depending how you define the problem” is doing a lot of work",
      "url": "https://www.tbray.org/ongoing/When/202x/2024/12/29/Matching-Dot-Redux",
      "published": "2024-12-29T20:00:00.000Z",
      "updated": "2024-12-31T00:02:50.000Z",
      "content": "<p>Recently I posted\n    <a href=\"/ongoing/When/202x/2024/12/18/Matching-Dot-in-UTF8\">Matching “.” in UTF-8</a>, in which I claimed that you could match\n    the regular-expression “<code>.</code>” in a UTF-8 stream with either four or five states in a byte-driven finite automaton,\n    depending how \n    you define the problem.  That statement was arguably wrong, and you might need three more states, for a total of eight. But you \n    can make a case that really, only four should be needed, and another case calling for quite a few more.\n    Because that phrase “depending how you define the problem” is doing a lot of work.</p>\n    <p>But first, thanks:\n    <a href=\"https://functional.cafe/@edavies\">Ed Davies</a>, whose blog contributions\n    (<a href=\"/ongoing/When/202x/2024/12/18/Matching-Dot-in-UTF8#c1734780103.136152\">1</a>,\n    <a href=\"/ongoing/When/202x/2024/12/18/Matching-Dot-in-UTF8#c1734970677.112348\">2</a>,\n    <a href=\"/ongoing/When/202x/2024/12/18/Matching-Dot-in-UTF8#c1735151411.984021\">3</a>) were getting insufficient attention from\n    me until\n    <a href=\"https://chaos.social/@dpk\">Daphne Preston-Kendal</a> insisted I look more closely.</p>\n    <p>To summarize Ed’s argument: There are a bunch of byte combinations that look (and work) like regular UTF-8 but are explicitly\n    ruled out by the Unicode spec, in particular\n    <a href=\"https://www.unicode.org/versions/latest/core-spec/chapter-3/#G31703\">Section 3.9.3</a> and\n    its Table 3.7.</p>\n    <h2 id=\"p-1\">Moar States!</h2>\n    <p>Ed posted a nice picture of a corrected 8-state automaton that will fail to match any of these forbidden\n    sequences.</p>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2024/12/29/edavies-machine.png\" alt=\"Ed Davies’ corrected UTF-8 state machine\"></img>\n    <div class=\"caption\"><p>(Original SVG\n    <a href=\"https://edavies.me.uk/paste/R2XVFXpjcIiVq9FkaZ2u7ZUC/utf8.svg\">here</a>.)</p></div>\n    <p>I looked closely at Ed’s proposal and it made sense, so I implemented it and (more important) wrote a bunch of unit tests\n    exploring the code space, and it indeed seems to accept/reject everything correctly per Unicode 3.9.3.</p>\n    <p>So, argument over, and I should go forward with the 8-state Davies automaton, right?\n    Why am I feeling nervous and grumpy, then?</p>\n    <h2 id=\"p-2\">Not all Unicode</h2>\n    <p>I’ve already mentioned in this series that your protocols and data structures just gotta support Unicode in the 21st century,\n    but you almost certainly don’t want to support all the Unicode characters, where by “character” I mean, well… if you care at all\n    about this stuff, please go read\n    <a href=\"https://www.ietf.org/archive/id/draft-bray-unichars-10.html\">Unicode Character Repertoire Subsets</a> (“Unichars for\n    short), a draft inching \n    its way through the IETF, with luck an RFC some day. And if you <em>really</em> care, dig into\n    <a href=\"https://datatracker.ietf.org/doc/html/rfc7564\">RFC 3454: PRECIS Framework: Preparation, Enforcement, and Comparison of\n    Internationalized Strings in Application Protocols</a>. Get a coffee first, PRECIS has multiple walls of text and isn’t\n    simple at all. But it goes to tremendous lengths to address security issues and other best practices.</p>\n    <p>If you don’t have the strength, take my word for it that the following things are true:</p>\n    <ol>\n      <li><p>We don’t talk much about abstract characters; instead focus on the numeric “code points” that represent them.</p></li>\n      <li><p>JSON, for historical reasons, accepts all the code points.</p></li>\n      <li><p>There are several types of code points that don’t represent characters: “Surrogates”, “controls”, and\n      “noncharacters”.</p></li>\n      <li><p>There are plenty of code points that are problematic because they can be used by phishers and other attackers\n      to fool their victims because they look like other characters.</p></li>\n      <li><p>There are characters that you shouldn’t use because they represent one or another of the temporary historical hacks\n      used in the process of migrating from previous encoding schemes to Unicode.</p></li>\n    </ol>\n    <p>The consequence of all this is that there are many subsets of Unicode that you might want to restrict users of your protocols\n    or data structures to:</p>\n    <ol>\n      <li><p>JSON characters: That is to say, all of them, including all the bad stuff.</p></li>\n      <li><p>Unichars “Scalars”: Everything except the surrogates.</p></li>\n      <li><p>Unichars “XML characters”: Lots but not all of the problematic code points excluded.</p></li>\n      <li><p>Unichars “Unicode Assignables”: “All code points that are currently assigned, excluding legacy control codes, or that might in\n      future be assigned.”</p></li>\n      <li><p>PRECIS “IdentifierClass”: “Strings that can be used to refer to, include, or communicate protocol strings like\n      usernames, filenames, data feed identifiers, and chatroom name.”</p></li>\n      <li><p>PRECIS “FreeformClass”: “Strings that can be used in a free-form way, e.g., as a password in an authentication exchange\n      or a nickname in a chatroom.”</p></li>\n      <li><p>Some variation where you don’t accept any unassigned code points; risky, because that changes with every Unicode\n      release.</p></li>\n    </ol>\n    <p>(I acknowledge that I am unreasonably fond of numbered lists, which is probably an admission that I should try harder to\n    compose smoothly-flowing linear arguments that don’t need numbers.)</p>\n    <p>You’ll notice that I didn’t provide links for any of those entries. That’s because you really shouldn’t pick one without\n    reading the underlying document describing why it exists.</p>\n    <h2 id=\"p-3\">What should you accept?</h2>\n    <p>I dunno. None of the above are crazy.  I’m kind of fond of Unicode Assignables, which I co-invented. The only thing I’m sure\n    of is that you should <em>not</em> go with JSON Characters, because of the fact that its rules make the following chthonic\n    horror perfectly legal:</p>\n    <blockquote><pre><code>{\"example\": \"\\u0000\\u0089\\uDEAD\\uD9BF\\uDFFF\"}</code></pre></blockquote>\n    <p>Unichars describes it:</p>\n    <blockquote><p>The value of the “example” field contains the C0 control NUL, the C1 control \"CHARACTER TABULATION\n    WITH JUSTIFICATION\", an unpaired surrogate, and the noncharacter U+7FFFF encoded per JSON rules as two escaped UTF-16 surrogate\n    code points. It is unlikely to be useful as the value of a text field. That value cannot be serialized into well-formed UTF-8,\n    but the behavior of libraries asked to parse the sample is unpredictable; some will silently parse this and generate an\n    ill-formed UTF-8 string.</p></blockquote>\n    <p>No, really.</p>\n    <h2 id=\"p-4\">What is Quamina for?</h2>\n    <p>If you’re wondering what a “Quamina” is, you probably stumbled into this post through some link and, well, there’s a lot of\n    history. Tl;dr: \n    <a href=\"https://github.com/timbray/quamina\">Quamina</a> is a pattern-matching library in Go with an unusual (and fast)\n    performance envelope; it can match thousands of Patterns to millions of JSON blobs per second.  For much, much more, peruse the\n    <a href=\"/ongoing/What/Technology/Quamina%20Diary/\">Quamina Diary</a> series on this blog.</p>\n    <p>Anyhow, all this work in being correctly restrictive as to the shape of the incoming UTF-8 was making me uncomfortable.\n    Quamina is about telling you what byte patterns are in your incoming data, not enforcing rules about what\n    <em>should</em> be there.</p>\n    <p>And it dawned on me that it might be useful to ask Quamina to look at a few hundred thousand inputs per second and tell you\n    which had ill-formed-data problems.  Quamina’s dumb-but-fast byte-driven finite automaton would be happy to do that, and very\n    efficiently too.</p>\n    <h2 id=\"p-5\">Conclusion</h2>\n    <p>So, having literally lain awake at night fretting over this, here’s what I think I’m going to do:</p>\n    <ol>\n      <li><p>I’ll implement a new Quamina pattern called <code>ill-formed</code> or some such that will match any field that has\n      busted UTF-8 of the kind we’ve been talking about here. It’d rely on an automaton that is basically the inverse of\n      Davies’ state machine.</p></li>\n      <li><p>By default, the meaning of “<code>.</code>” will be “matches the Davies automaton”; it’ll match\n      well-formed UTF-8 matching all code points except surrogates.</p></li>\n      <li><p>I’ll figure out how to parameterize regular-expression matches so you can change the definition of “<code>.</code>” to\n      match one or more of the smaller subsets like those in the list above from Unichars and PRECIS.</p></li>\n    </ol>\n    <p>But who knows, maybe I’ll end up changing my mind again. I already have, multiple times. Granted that implementing regular\n    expressions is hard, you’d think that matching “<code>.</code>” would be the easy part. Ha ha ha.</p>",
      "image": null,
      "media": [],
      "authors": [
        {
          "name": "Tim Bray",
          "email": null,
          "url": null
        }
      ],
      "categories": [
        {
          "label": "Technology/Software",
          "term": "Technology/Software",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "Technology",
          "term": "Technology",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "Software",
          "term": "Software",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "Technology/Quamina Diary",
          "term": "Technology/Quamina Diary",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "Quamina Diary",
          "term": "Quamina Diary",
          "url": "https://www.tbray.org/ongoing/What/"
        }
      ]
    },
    {
      "id": "https://www.tbray.org/ongoing/When/202x/2024/12/18/Matching-Dot-in-UTF8",
      "title": "QRS: Matching “.” in UTF-8",
      "description": "Back on December 13th, I     posted a challenge on Mastodon: In a simple UTF-8 byte-driven     finite automaton, how many states does it take to match the regular-expression construct “.”, i.e. “any character”?     Commenter     Anthony Williams responded,      getting it almost right I think,     but I found his description a little hard to understand. In this piece I’m going to dig into what     . actually means, and then how many states you need to match it. [Update: Lots more on this subject and some of the material below is arguably wrong, but just “arguably”; see     Dot-matching Redux.]",
      "url": "https://www.tbray.org/ongoing/When/202x/2024/12/18/Matching-Dot-in-UTF8",
      "published": "2024-12-18T20:00:00.000Z",
      "updated": "2024-12-18T20:00:00.000Z",
      "content": "<p>Back on December 13th, I\n    <a href=\"https://cosocial.ca/@timbray/113646778780834552\">posted a challenge</a> on Mastodon: In a simple UTF-8 byte-driven\n    finite automaton, how many states does it take to match the regular-expression construct “<code>.</code>”, i.e. “any character”?\n    Commenter\n    <a href=\"https://www.justsoftwaresolutions.co.uk/blog\">Anthony Williams</a> responded, \n    <a href=\"/ongoing/When/202x/2024/12/12/Quamina-Regular-Expression-Series#c1734082594.119452\">getting it almost right</a> I think,\n    but I found his description a little hard to understand. In this piece I’m going to dig into what\n    <code>.</code> actually means, and then how many states you need to match it.<br></br>\n    <i>[Update: Lots more on this subject and some of the material below is arguably wrong, but just “arguably”; see\n    <a href=\"/ongoing/When/202x/2024/12/29/Matching-Dot-Redux\">Dot-matching Redux</a>.]</i></p>\n    <p>The answer surprised me. Obviously this is of\n    interest only to the faction of people who are interested in automaton wrangling, problematic characters, and the finer\n    points of UTF-8. I expect close attention from all 17 of you!</p> \n    <h2 id=\"p-1\">The answer is…</h2>\n    <p>Four. Or five, depending.</p>\n    <h2 id=\"p-2\">What’s a “Unicode character”?</h2>\n    <p>They’re represented by “code points”, which are numbers in the range 0 … 17×2<sup>16</sup>, which is to say 1,114,112\n    possible values. It turns out you \n    <a href=\"https://www.ietf.org/archive/id/draft-bray-unichars-10.html\">don’t actually want to match all of them</a>; more on that\n    later.</p>\n    <h2 id=\"p-3\">How many states?</h2>\n    <p>Quamina is a “byte-level automaton” which means it’s in a state, it reads a byte, looks up the value of that byte in a map\n    yielding either the next state, or <code>nil</code>, which means no match. Repeat until you match or fail.</p>\n    <p>What bytes are we talking about here? We’re talking about UTF-8 bytes.\n    If you don’t understand UTF-8 the rest of this is going to be difficult. I wrote a short explainer called\n    <a href=\"/ongoing/When/200x/2003/04/26/UTF\">Characters vs. Bytes</a> twenty-one years ago. I now\n    assume you understand UTF-8 and knew that code points are encoded as sequences of from 1 to 4 bytes.</p>\n    <p>Let’s count!</p>\n    <ol>\n      <li><p>When you match a code point successfully you move to the part of the automaton that’s trying to match the next one;\n      let’s call this condition <i>MATCHED</i>.</p>\n      <p>(From here on, all the numbers are hex, I’ll skip the leading 0x. And all the ranges are inclusive.)</p></li> \n      <li><p>In multi-byte characters, all the UTF-8 bytes but the first have bitmasks like <code>10XX XXXX</code>, so there are six\n      significant bits, thus 2<sup>6</sup> or 64 distinct possible values ranging from 80-BF.</p></li>\n      <li><p>There’s a <i>Start</i> state. It maps\n      byte values 00-7F (as in ASCII) to <i>MATCHED</i>. That’s our first state, and we’ve handled all the one-byte\n      code points.</p></li>\n      <li><p>In the <i>Start</i> state, the 32 byte values C0-DF, all of which begin <code>110</code> signaling a two-byte\n      code point, are mapped to the <i>Last</i> state. In the <i>Last</i> state,\n      the 64 values 80-BF are mapped to <i>MATCHED</i>. This takes care of all the two-byte code points and we’re up to two\n      states.</p></li> \n      <li><p>In the <i>Start</i> state, the 16 byte values E0-EF, all of which begin <code>1110</code> signaling a three-byte code\n      point, are mapped to the <i>LastInter</i> state. In that\n      state, the 64 values 80-BF are mapped to the <cite>Last</cite> state. Now we’re up to three states and we’ve handled the\n      three-byte code points.</p></li>\n      <li><p>In the <i>Start</i> state, the 8 byte values F0-F7, all of which begin 11110 signaling a four-byte code point, are\n      mapped to the <i>FirstInter</i> state. In that state, \n      the 64 values 80-BF are mapped to the <i>LastInter</i> state. Now we’ve handled all the code points with four states.</p></li>\n    </ol>\n    <h2 id=\"p-6\">But wait!</h2>\n    <p>I mentioned above about not wanting to match all the code points. “Wait,” you say, “why wouldn’t you want to be maximally\n    inclusive?!” Once again, I’ll link to\n    <a href=\"https://www.ietf.org/archive/id/draft-bray-unichars-10.html\">Unicode Character Repertoire Subsets</a>, a document I\n    co-wrote that is making its way through the IETF and may become an RFC some year. I’m not going to try to summarize a draft that\n    bends over backwards to be short and clear; suffice it to say that there are good reasons for leaving out several different\n    flavors of code point.</p>\n    <p>Probably the most pernicious code points are the “Surrogates”, U+D800-U+DFFF. If you want an explanation of what they are and\n    why they’re bad, go read that <cite>Repertoire Subsets</cite> draft or just take my word for it. If you were to encode them per\n    UTF-8 rules (which the UTF-8 spec says you’re not allowed to), the low and high bounds would be ED,A0,80 and ED,BF,BF.</p>\n    <p>Go’s UTF-8 implementation agrees that Surrogates Are Bad and The UTF-8 Spec Is Good and flatly refuses to convert those UTF-8\n    sequences into code points or vice versa. The resulting subset of code points even has a catchy name: Unicode Scalars. Case\n    closed, right?</p> \n    <p>Wrong. Because JSON was designed before we’d thought through these problems, explicitly saying it’s OK to include\n    any code point whatsoever, including surrogates. And Quamina is used for matching JSON data. So, standards fight!</p>\n    <p>I’m being a little unfair here. I’m sure that if Doug Crockford were inventing JSON now instead of in 2001, he’d exclude\n    surrogates and probably some of the other problematic code points discussed in that <cite>Subsets</cite> doc.</p>\n    <p>Anyhow, Quamina will go with Go and exclude surrogates.\n    Any RFC8259 purists out there, feel free accuse me of \n    standards apostasy and I will grant your point but won’t change Quamina. Actually, not true; at some point I’ll probably add an\n    option to be <em>more</em> restrictive and exclude more than just surrogates.</p>\n    <p>Which means that now we have to go back to the start of this essay and figure out how many states it takes to match\n    “<code>.</code>” Let’s see…</p>\n    <ol>\n      <li><p>The <i>Start</i> state changes a bit. See #5 in the list above. Instead of mapping all of E0-EF to the <i>LastInter</i>\n      state, it maps one byte in that range, ED, to a new state we’ll call, let’s see, how about <i>ED</i>.</p></li>\n      <li><p>In <i>ED</i>, just as in <i>LastInter</i>, 80-9F are mapped to <i>Last</i>. But A0-BF aren’t mapped to anything,\n      because on that path lie the surrogates.</p></li>\n    </ol>\n    <p>So, going with the Unicode Scalar path of virtue means I need five states, not four.</p>",
      "image": null,
      "media": [],
      "authors": [
        {
          "name": "Tim Bray",
          "email": null,
          "url": null
        }
      ],
      "categories": [
        {
          "label": "Technology/Software",
          "term": "Technology/Software",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "Technology",
          "term": "Technology",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "Software",
          "term": "Software",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "Technology/Quamina Diary",
          "term": "Technology/Quamina Diary",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "Quamina Diary",
          "term": "Quamina Diary",
          "url": "https://www.tbray.org/ongoing/What/"
        }
      ]
    },
    {
      "id": "https://www.tbray.org/ongoing/When/202x/2024/12/14/Hong-Kong-Ferries-1994",
      "title": "1994 Hong Kong Adventure",
      "description": "This story is about Hong Kong and mountains and ferries and food and beer.      What happened was, there’s a thirty-year-old picture I wanted to share and it brought the story to mind. I was sure I’d written it     up but can’t find it here on the blog, hard as I try, so here we go. Happy ending promised!",
      "url": "https://www.tbray.org/ongoing/When/202x/2024/12/14/Hong-Kong-Ferries-1994",
      "published": "2024-12-14T20:00:00.000Z",
      "updated": "2024-12-15T18:07:02.000Z",
      "content": "<p>This story is about Hong Kong and mountains and ferries and food and beer. \n    What happened was, there’s a thirty-year-old picture I wanted to share and it brought the story to mind. I was sure I’d written it\n    up but can’t find it here on the blog, hard as I try, so here we go. Happy ending promised!</p>\n    <p>The picture I wanted to share is from a business trip to Hong Kong in 1994 and hey, it turns out I have lots more pictures\n    from that trip.</p>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2024/12/14/2110.png\" alt=\"Kai Tak airport in 1994\"></img>\n    <div class=\"caption\"><p>Kai Tak airport in 1994.</p></div>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2024/12/14/2112.png\" alt=\"A sketchy corner of Kowloon in 1994\"></img>\n    <div class=\"caption\"><p>Rats for sale in a sketchy corner of Kowloon.</p></div>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2024/12/14/2115.png\" alt=\"Hong Kong, mainland side, 1994\"></img>\n    <p>Kai Tak, what an airport that was. If you could open the plane’s windows, you’d have been able to grab laundry hung to dry on\n    people’s balconies. My fast-talking HK friend said “Safest airport in the world! You know pilot paying 100% attention!”</p>\n    <p>My trip extended over a weekend and I wanted to get out of town so I read up on interesting walks; on paper of\n    course, the Web only just barely existed.\n    <a href=\"https://en.wikipedia.org/wiki/Lantau_Island\">Lantau Island</a> was recommended; there was a good hike up over the local\n    mountains that reached a Trappist monastery with a well-reviewed milk bar. So I took the ferry from Central to Mui Wo.</p>\n    <p>The view from the ferry was great!</p>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2024/12/14/2128.png\" alt=\"View from the Mui Wo ferry\"></img>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2024/12/14/2144.png\" alt=\"The Mui Wo docks\"></img>\n    <p>I revisited Mui Wo in 2019,\n    <a href=\"/ongoing/When/201x/2019/04/07/Visiting-Buddha\">visiting the Big Buddha</a>.</p>\n    <p>It was easy to find the hiking trail up the mountains, well-maintained but steep. I stopped to take pictures maybe more often\n    than strictly necessary because it was in the high Celsius thirties with 99% humidity and my North-Euro metabolism wasn’t\n    dealing well. Visions of Trappist ice-cream danced in my head as the sweat dripped off my chin.</p>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2024/12/14/2145.png\" alt=\"Lantau Island countryside\"></img>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2024/12/14/2151.png\" alt=\"Lantau Island countryside\"></img>\n    <p>Having said that, I’m glad I\n    stopped because the pictures please my eye.  These are all Ektachrome; can’t remember whether I took them with\n    the Pentax SLR or the little Nikon pocket camera.</p>\n    <p>Lantau has the new international airport on it now; I wonder if those green hills are still unspoiled.</p>\n    <p>Eventually, sweat-soaked and my body screaming for mercy, I reached a small mountaintop. I could see the monastery, but it was\n    a couple of little mountains over, so I arrived in poor condition. Sadly for me, it was a Sunday so, commerce deferring to\n    the sacred, the joint was closed. Poor Tim. Especially since I hadn’t brought anything to eat.</p>\n    <p>Fortunately I didn’t have to hike all the way back to Mui Wo; Almost straight downhill there there was a “Monastery Pier” with\n    an occasional ferry to the nearby islet of\n    <a href=\"https://en.wikipedia.org/wiki/Peng_Chau\">Peng Chau</a> and a connection back to Central. Looks like\n    <a href=\"https://www.blueseaferry.com.hk/en/pc6/\">there still is</a>.</p>\n    <p>It was midafternoon, the heat approaching its peak, and walking downhill has its own stresses and strains. By the time I got\n    to the pier I was a sad excuse for a human.  Here’s a picture of the ferry.</p>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2024/12/14/2158.png\" alt=\"Inside a small wooden ferryboat, full of Chinese people\"></img>\n    <p>As you can see, it was pretty crowded, but\n    unsurprisingly, nobody wanted to share the bench the big sweaty panting hungry-looking pink person was on.</p>\n    <p>Peng Chau itself was visually charming but the ferry connection was tight so I couldn’t explore.</p>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2024/12/14/2160.png\" alt=\"Peng Chau\"></img>\n    <div class=\"caption\"><p>Peng Chau waterfront in 1994. This is the picture I wanted to share that led me to (re?)tell this story.\n    My conversational-media home on the Net is\n    <a href=\"https://cosocial.ca/@timbray\">on Mastodon</a>, but I like to keep an eye on Bluesky, so I post random pictures there\n    under the tag\n    <a href=\"https://bsky.app/search?q=%23blueskyabove\">#blueskyabove</a>; this will be one.</p></div>\n    <p>Trudging onto the\n    medium-sized ferry back home, I encountered a food-service option: A counter with one guy and a big\n    steaming pot of soup behind it. My spirit lifted. The guy’s outfit might have once been white; he was unshaven and sweaty but\n    then so was I, and my clothes were nothing to write home about either.</p> \n    <p>I stopped and pointed at the bowls. He filled one, then wanted to upsell me on a leathery, greasy-looking fried egg to go\n    on top but there are limits. Disappointed, he stepped aside to put it back, revealing a small glass-fronted fridge,\n    icicles hanging off it, full of big cans of San Miguel beer. My spirit lifted again.</p>\n    <p>The soup was salty and delicious. I’m not sure I’ve enjoyed a beer more in the thirty years since that day. The ferry was fast\n    enough to generate a refreshing breeze all the way, and there were charming boats to photograph.</p>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2024/12/14/2170.png\" alt=\"Red and yellow motor boat with its sides lined with old tires\"></img>\n    <p>The tourist who walked off the boat at Central was a dry, well-hydrated, and cheerful\n    specimen of humanity. The next day, my fast-talking HK friend said “You climb over Lantau in that weather yesterday? White guys\n    so weird!” “It was great!” I told him, smirking obnoxiously.</p>\n    <p>I’ve been back to HK a few times over the years, but it’s not really a happy place any more.</p>",
      "image": null,
      "media": [],
      "authors": [
        {
          "name": "Tim Bray",
          "email": null,
          "url": null
        }
      ],
      "categories": [
        {
          "label": "The World/Places/Hong Kong",
          "term": "The World/Places/Hong Kong",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "The World",
          "term": "The World",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "Places",
          "term": "Places",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "Hong Kong",
          "term": "Hong Kong",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "The World/Food and Drink",
          "term": "The World/Food and Drink",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "Food and Drink",
          "term": "Food and Drink",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "Arts/Photos",
          "term": "Arts/Photos",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "Arts",
          "term": "Arts",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "Photos",
          "term": "Photos",
          "url": "https://www.tbray.org/ongoing/What/"
        }
      ]
    },
    {
      "id": "https://www.tbray.org/ongoing/When/202x/2024/12/12/QRS-Parsing-Regular-Expressions",
      "title": "QRS: Parsing Regexps",
      "description": "Parsing regular expression syntax is hard. I’ve written a lot of parsers and,for this one, adopted a couple of new techniques     that I haven’t used before. I learned things that might be of general interest",
      "url": "https://www.tbray.org/ongoing/When/202x/2024/12/12/QRS-Parsing-Regular-Expressions",
      "published": "2024-12-12T20:00:00.000Z",
      "updated": "2024-12-13T22:34:29.000Z",
      "content": "<p>Parsing regular expression syntax is hard. I’ve written a lot of parsers and,for this one, adopted a couple of new techniques\n    that I haven’t used before. I learned things that might be of general interest.</p>\n    <p>I was initially surprised that the problem was harder than it looked, but quickly realized that I shouldn’t have been, because\n    my brain has also always had a hard time parsing them.</p>\n    <p>They’re definitely a write-only syntax and just because I’m gleefully\n    writing this series doesn’t mean I’m recommending you reach for REs as a tool very often.</p>\n    <p>But I bet most people in my profession\n    find themselves using them pretty regularly, in the common case where they’re the quickest path from A to B. And I know for\n    sure that, on a certain number of occasions, they’ve ended up regretting that choice.</p>\n    <p>Anyhow, I console myself with the thought that the I-Regexp RE dialect has less syntax and fewer footguns than PCREs\n    generally. Plus, I’ve been having fun implementing them. So knock yourselves out. (Not legal nor investing advice.)</p>\n    <h2 id=\"p-1\">Sample-driven development</h2>\n    <p>When I started thinking seriously about the parser, the very first thought in my mind was “How in the freaking hell am I\n    going to test this?” I couldn’t stand the thought of writing a single line of code without having a plausible answer.  Then it\n    occurred to me that since I-Regexp subsets\n    <a href=\"https://www.w3.org/TR/2004/REC-xmlschema-2-20041028/#regexs\">XSD Regular Expressions</a>, and since XSD (which I\n    mostly dislike) is widely deployed and used, maybe someone already wrote a test suite? So I stuck my head into an XML\n    community space (still pretty vigorous after all these years) and asked “Anyone have an XSD regexp test suite?”</p>\n    <p>And it worked! (I love this profession sometimes.)\n    <a href=\"https://en.wikipedia.org/wiki/Michael_Howard_Kay\">Michael Kay</a> pointed at me a few things notably including\n    <a href=\"https://github.com/qt4cg/xslt40-test/tree/master/tests/misc/regex-syntax\">this GitHub repo</a>. The\n    <code>_regex-syntax-test-set.xml</code> there, too big to display, contains just under a thousand regular expressions, some\n    valid, some not, many equipped with strings that should and should not match.</p>\n    <p>The process by which I turned it into a <code>*_test.go</code> file, Dear Reader, was not pretty. I will not share the\n    ugliness, which involved awk and emacs, plus hideous and largely untested one-off Go code.</p>\n    <p>But I gotta say, if you have to write a parser for any anything, having 992 sample cases makes the job a whole lot less\n    scary.</p>\n    <p>Lesson: When you’re writing code to process a data format that’s new to you, invest time, before you start, in looking for samples.</p>\n    <h2 id=\"p-2\">Recursive descent</h2>\n    <p>The I-Regexp specification contains a\n    <a href=\"https://www.rfc-editor.org/rfc/rfc9485.html#name-i-regexp-syntax\">complete ABNF grammar</a> for the syntax. For writing\n    parsers I tend to like finite-automaton based approaches, but for a freakishly complicated mini-language like this, I\n    bowed in the direction of Olympus for that grammar and started recursively descending.</p>\n    <p>I think at some point I understood the theory of Regular Languages and LL(1) and so on, but not any more. Having said that,\n    the recursive-descent technique is conceptually simple, so I plowed ahead. And it worked eventually. But there seemed a lot of\n    sloppy corners where I had to peek one byte ahead or backtrack one. Maybe if I understood LL(1) better it’d have\n    been smoother.</p>\n    <p>The “character-class” syntax <code>[abc0-9]</code> is particularly awful. The possible leading <code>-</code> or\n    <code>^</code> makes it worse, and it has the usual <code>\\</code>-prefixed stanzas. Once again, I salute the original\n    specifiers who managed to express this in a usable grammar.</p>\n    <p>I was tempted, but ended up making no use of Go’s <code>regexp</code> library to help me parse REs.</p>\n    <p>I have to say that I don’t <em>like</em> the code I ended up with as much as any of my previous (automaton-based) parsers,\n    nor as much as the rest of the Quamina code. But it seems to work OK. Speaking of that…</p>\n    <h2 id=\"p-3\">Test coverage</h2>\n    <p>When I eventually got the code to do the right thing for each of Michael Kay’s 992 test cases, I was feeling a warm glow. So\n    then I ran the test-coverage tool, and got a disappointingly-low number. I’m not a 100%-coverage militant generally, but I am for\n    ultra-low-level stuff like this with a big blast radius.</p>\n    <p>And here’s the lesson: Code coverage tools are your friend. I went in and looked at the green and red bars; they revealed that while\n    my tests had passed, I was really wrong in my assumptions about the paths they would make the code take.  Substantial\n    refactoring ensued.</p>\n    <p>Second, and somewhat disappointingly, there were a lot of coverage misses on Go’s notorious little <code>if err != nil</code>\n    stanza. Which revealed that my sample set didn’t cover the RE-syntax space quite as thoroughly as I’d hoped. In particular,\n    there was really no coverage of the code’s reaction to malformed UTF-8.</p>\n    <p>The reason I’m writing this is to emphasize that, even if you’re in a shop where the use of code-coverage tools is\n    (regrettably) not required, you should use one anyhow, on basically every important piece of code. I have absolutely never\n    failed to get surprises, and consequently improved code, by doing this.</p>\n    <h2 id=\"p-4\">Sharing the work</h2>\n    <p>I don’t know if I-Regexp is going to be getting any uptake, but it wouldn’t surprise me if it did; it’s a nice tractable\n    subset that hits a lot of use cases. Anyhow, now I have reasonably robust and well-tested I-Regexp parsing code. I’d like to\n    share it, but there’s a problem.</p>\n    <p>To do that, I’d have to put it in a separate repo; nobody would want to import all of Quamina, which is a fair-sized library,\n    just to parse REs. But then that other repo would become a Quamina dependency. And one of my favorite things about Quamina is\n    that it has\n    <a href=\"/ongoing/When/202x/2024/09/04/0dependencies\">0 dependencies!</a></p>\n    <p>It’s not obvious what the right thing to do is; any ideas?</p>",
      "image": null,
      "media": [],
      "authors": [
        {
          "name": "Tim Bray",
          "email": null,
          "url": null
        }
      ],
      "categories": [
        {
          "label": "Technology/Software",
          "term": "Technology/Software",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "Technology",
          "term": "Technology",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "Software",
          "term": "Software",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "Technology/Quamina Diary",
          "term": "Technology/Quamina Diary",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "Quamina Diary",
          "term": "Quamina Diary",
          "url": "https://www.tbray.org/ongoing/What/"
        }
      ]
    },
    {
      "id": "https://www.tbray.org/ongoing/When/202x/2024/12/12/Quamina-Regular-Expression-Series",
      "title": "QRS: Quamina Regexp Series",
      "description": "Implementing regular expressions is hard. Hard in interesting ways that make me want to share the lessons. Thus this series,     QRS for short",
      "url": "https://www.tbray.org/ongoing/When/202x/2024/12/12/Quamina-Regular-Expression-Series",
      "published": "2024-12-12T20:00:00.000Z",
      "updated": "2024-12-12T20:00:00.000Z",
      "content": "<p>Implementing regular expressions is hard. Hard in interesting ways that make me want to share the lessons. Thus this series,\n    QRS for short.</p>\n    <p>People who keep an eye on my\n    <a href=\"/ongoing/What/Technology/Quamina%20Diary/\">Quamina</a> open-source pattern-matching project will have noticed a recent\n    absence of updates and conversation. That’s because, persuant to\n    <a href=\"https://github.com/timbray/quamina/issues/66\">Issue #66</a>, I’m working on adding fairly-full regular-expression\n    matching.</p>\n    <h2 id=\"p-4\">Personal note</h2>\n    <p>This is turning out to be hard. Either it’s the hardest nut I’ve had to crack in many years, or maybe my\n    advanced age is dulling my skills. It’s going to be some time before I can do the first incremental release.  Whatever; the\n    learning experiences coming out of this work still feel fresh and fascinating and give me the urge to share.</p>\n    <p>I hope I can retain that urge as long as I’m still mentally present. In fact, I hope I can retain the ability to work on\n    software. For various reasons, I’ve been under a lot of\n    <a href=\"/ongoing/When/202x/2023/10/25/Wild-World\">personal stress</a> in recent years. Stealing time from my adult\n    responsibilities to wrestle with executable abstractions has been a pillar of my sanity.</p>\n    <p>Anyhow, normally when I code I blog about it, but so far I haven’t because the work is unfinished. Then I realized\n    that it’s too big, and addresses too many distinct problems, to be just one piece, thus this mini-series.</p>\n    <p>[Readers who don’t know what regular expressions are should probably close this tab now. Don’t feel guilty, nobody\n    who’s not a full-time computing professional should have to know much less care.]</p>\n    <p>[Notation: I’m gonna say “Regexp” or maybe just “RE” in this series.]</p>\n    <p>I’ll use this post as a table of contents:</p>\n    <ol>\n      <li><p>\n      <a href=\"/ongoing/When/202x/2024/12/12/QRS-Parsing-Regular-Expressions\">Parsing RE syntax.</a>.</p></li>\n      <li><p><a href=\"/ongoing/When/202x/2024/12/18/Matching-Dot-in-UTF8\">Matching “.” in UTF-8</a>.</p></li>\n      <li><p><a href=\"/ongoing/When/202x/2024/12/29/Matching-Dot-Redux\">Dot-matching Redux</a>.</p></li>\n      <li><p>(Future) Representing parsed REs.</p></li>\n      <li><p>(Future) Implementing UTF-8 based automata for REs.</p></li>\n    </ol>\n    <p>At the moment, I think the hardest part of the work is #1, Parsing. (Maybe that’s because I haven’t really dug very deep into\n    other parts yet.) I’d be amazed if the final series had only three parts.</p>\n    <p>Now, introductory material.</p>\n    <h2 id=\"p-3\">Which regular expressions?</h2>\n    <p>They come in lots of flavors. The one I’m implementing is\n    <a href=\"https://www.rfc-editor.org/rfc/rfc9485.html\">I-Regexp, RFC 9485</a>. The observant reader will notice that I co-edited\n    that RFC, and I cheerfully confess to bias.</p>\n    <p>I-Regexp is basically a subset of\n    <a href=\"https://www.w3.org/TR/2004/REC-xmlschema-2-20041028/#regexs\">XSD Regular Expressions</a> (chosen to subset because they\n    have a nice clean immutable spec), which are a lot like good ol’ PCRE (Perl-compatible regular expressions). Except for:</p>\n    <ol>\n      <li><p>They are designed assuming they will only ever be used to match against a string and return a “yes” or “no”\n      answer.</p></li>\n      <li><p>They are anchored, which is to say that (unlike PCREs) they’re all assumed to start with <code>^</code> and end with\n      <code>$</code>.</p></li>\n      <li><p>They omit popular single-character escapes like <code>\\w</code> and <code>\\S</code> because those are sketchy in the\n      Unicode context.</p></li>\n      <li><p>They don’t have capture groups or back-references.</p></li>\n      <li><p>They don’t support character class subtraction, e.g. <nobr><code>[a-z-m-p]</code></nobr>.</p></li>\n    </ol>\n    <p>I’m going to claim that they hit a very useful 80/20 point if what you’re interested is asking “Did the field value match?”\n    which of course is all Quamina is interested in doing.</p>\n    <h2 id=\"p-5\">Project strategy</h2>\n    <p>I’m totally not going to try to do all this as a big bang. I’ve got a reliable RE parser now (it was hard!) that recognizes\n    ten different RE features, ranging from <code>.</code> to everything in\n    <nobr><code>(a+b*c?).|d[ef]{3,9}\\?\\P{Lu}</code></nobr>. I’m planning to roll them out a feature\n    at a time, but to refuse to accept REs that use features I haven’t implemented yet.</p>\n    <h2 id=\"p-7\">Unbackslashing again</h2>\n    <p>Go check out\n    <a href=\"ongoing/When/202x/2024/09/22/Unbackslashing\">Unbackslash</a>.\n    Tl;dr: It’s terribly painful to deal with the standard RE escaping character <code>\\</code> in Go software that is processing\n    JSON. Because both Go and JSON use <code>\\</code> for escaping and your unit tests eventually fill up with <code>\\\\</code> and\n    <code>\\\\\\\\\\\\\\\\</code> and become brutally hard to read. So after publishing that blog piece and running polls on Mastodon,\n    <code>~</code> is the new <code>\\</code>. So that RE above becomes <code>(a+b*c?).|d[ef]{3,9}~?~P{Lu}</code>.</p>\n    <p>You’re allowed to not like it. But I request that you hold off pushing the big button that sends me to Hell until you’ve\n    tried writing a few unit tests for REs that you want Quamina to process.</p>\n    <p>Back to strategy: The first feature is going to be that lovely little dot operator. And thus…</p>\n    <h2 id=\"p-6\">Quiz</h2>\n    <p>Just for fun, here’s an intellectual challenge. Suppose you’re building a byte-at-a-time state machine to process UTF-8 text. How\n    many states, roughly, would it take to match <code>.</code>, i.e. any single Unicode code point? By “match” I mean reject\n    any byte sequence that \n    doesn’t, and when it does match, consume just enough bytes to leave you positioned after the <code>.</code> and ready to start\n    matching whatever’s next.</p>\n    <p>I <em>think</em> I’ve found the correct answer. It surprised me, so I’m still sanity-checking, but I think I’m right. I am\n    convinced the problem isn’t as simple as it looks.</p>",
      "image": null,
      "media": [],
      "authors": [
        {
          "name": "Tim Bray",
          "email": null,
          "url": null
        }
      ],
      "categories": [
        {
          "label": "Technology/Software",
          "term": "Technology/Software",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "Technology",
          "term": "Technology",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "Software",
          "term": "Software",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "Technology/Quamina Diary",
          "term": "Technology/Quamina Diary",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "Quamina Diary",
          "term": "Quamina Diary",
          "url": "https://www.tbray.org/ongoing/What/"
        }
      ]
    },
    {
      "id": "https://www.tbray.org/ongoing/When/202x/2024/12/02/Remembering-Bonnie",
      "title": "Remembering Bonnie",
      "description": "The murderer I emailed with is still in prison. And the software that got him pissed off at me still runs, so I ran it.     Now here I am to pass on the history and then go all geeky. Here’s the tell: If you don’t know what a “filesystem” is (that’s     perfectly OK, few reasonable adults need to) you might want to stay for the murderer story then step off the     train",
      "url": "https://www.tbray.org/ongoing/When/202x/2024/12/02/Remembering-Bonnie",
      "published": "2024-12-02T20:00:00.000Z",
      "updated": "2024-12-04T20:24:40.000Z",
      "content": "<p>The murderer I emailed with is still in prison. And the software that got him pissed off at me still runs, so I ran it.\n    Now here I am to pass on the history and then go all geeky. Here’s the tell: If you don’t know what a “filesystem” is (that’s\n    perfectly OK, few reasonable adults need to) you might want to stay for the murderer story then step off the\n    train.</p>\n    <p>Filesystems are one of the pieces of software that computers need to run, where “computers” includes your phone and laptop and\n    each of the millions of servers that drive the Internet and populate the cloud. There are many flavors of filesystem and\n    people who care about them care a lot.</p>\n    <p>One of the differences between filesystems is how fast they are. This matters because how fast the apps you use run depends\n    (partly) on how fast the underlying filesystems are.</p>\n    <p>Writing filesystem software is very, very difficult and people who have done this earn immense respect from their peers. So,\n    a lot of people try.  One of the people who succeeded was named Hans Reiser and for a while his “ReiserFS” filesystem was heavily\n    used on many of those “Linux” servers out there on the Internet that do things for you.</p>\n    <p>Reiser at one point worked in Russia and used a “mail-order bride” operation to look for a spouse. He ended up\n    marrying Nina Sharanova, one of the bride-brokerage translators, and bringing her back to the US with him. They had two kids,\n    got divorced, and then, on \n    September 3, 2006, he strangled her and buried her in a hidden location.</p>\n    <p>To make a long story short, he eventually pleaded guilty to\n    a reduced charge in exchange for revealing the grave location, and remains in prison.  I haven’t provided any links because it’s\n    a sad, tawdry story, but if you want to know the details the Internet has them.</p>\n    <p>I had interacted with Reiser a few times as a consequence of having written a piece of filesystem-related software called\n    “Bonnie” (more on Bonnie below). I can’t say he was obviously murderous but I found him unpleasant to deal with.</p>\n    <p>As you might imagine, people generally did not want to keep using the murderer’s filesystem software, but it takes a long\n    time to make this kind of infrastructure change and just last month, ReiserFS was removed as a Linux option. Which led to\n    this Mastodon exchange:</p>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2024/12/02/linux-reiserfs.png\" alt=\"Mastodon post about removal of ReiserFS from Linux\"></img>\n    <div class=\"caption\"><p>Here’s a\n    <a href=\"https://cosocial.ca/@timbray/113522946844951454\">link to that post</a> and the conversation that followed.</p></div>\n    <p>(People who don’t care about filesystems can stop reading now.)</p>\n    <h2 id=\"p-3\">Now, numbers</h2>\n    <p>After that conversation, on a whim I tracked down the Bonnie source and ran it on my current laptop, a 2023 M2 MacBook Pro with\n    32G of RAM and 3T of disk. I think the numbers are interesting in and of themselves even before I start discoursing about\n    benchmarking and filesystems and disks and so on.</p>\n    <code style=\"font-size: 125%;\"><nobr>               -------Sequential Output--------- ---Sequential Input--- --Random--</nobr>\n<nobr>               -Per Char- --Block---  -Rewrite-- -Per Char-  --Block--- --Seeks---</nobr>\n<nobr>Machine     GB M/sec %CPU M/sec %CPU  M/sec %CPU M/sec %CPU  M/sec %CPU  /sec %CPU</nobr>\n<nobr>MBP-M2-32G  64  56.9 99.3  3719 89.0   2772 83.4  59.7 99.7   6132 88.0 33613 33.6</nobr></code>\n    <p>Bonnie says:</p>\n    <ol>\n      <li><p>This puppy can write 3.7 GB/second to a file, and read it back at 6.1GB/sec.</p></li>\n      <li><p>It can update a file in place at 2.8 GB/sec.</p></li>\n      <li><p>It can seek around randomly in a 64GB file at 33K seeks/second.</p></li>\n      <li><p>Single-threaded sequential file I/O is almost but not quite CPU-limited.</p></li>\n    </ol>\n    <p>I wonder: Are those good numbers for a personal computer in 2024? I genuinely have no idea.</p>\n    <h2 id=\"p-4\">Bonnie</h2>\n    <p>I will shorten the story, because it’s long. In 1988 I was an employee of the University of Waterloo, working on the\n    <a href=\"https://cs.uwaterloo.ca/~fwtompa/newoed-project.html\">New Oxford English Dictionary Project</a>. The computers we were\n    using typically had 16MB or so of memory (so the \n    computer I’m typing this on has two thousand times as much) and the full text of the <cite>OED</cite> occupied 572MB. Thus, we\n    cared really a lot about I/O performance. Since the project was shopping for disks and computers I bashed out Bonnie in a couple\n    of afternoons.</p>\n    <p>I revised it lots over the years, and\n    <a href=\"https://en.wikipedia.org/wiki/Russell_Coker\">Russell Coker</a> made an excellent fork called Bonnie++ that (for a while\n    at least) was more popular than Bonnie. Then I made my own major revision at some point called Bonnie-64.</p>\n    <p>In 1996,\n    <a href=\"https://www.linux.co.cr/free-unix-os/review/1996/0413.html\">Linux Torvalds recommended Bonnie</a>, calling it a “reasonable\n    disk performance benchmark”.</p>\n    <p>That’s all I’m going to say here. If for some weird reason you want to know more, Bonnie’s quaint Nineties-flavor\n    <a href=\"https://textuality.com/bonnie/\">home</a> and\n    <a href=\"https://textuality.com/bonnie/intro.html\">description</a> pages are still there, plus this blog has\n    <a href=\"https://www.google.com/search?as_q=bonnie&hl=en&ie=UTF-8&btnG=Google%2BSearch&as_qdr=all&as_occt=any&as_dt=i&as_sitesearch=tbray.org\">documented\n    Bonnie’s twisty history</a> quite thoroughly. And explored, I claim, filesystem-performance issues in a useful way.</p>\n    <p>I will address a couple of questions here, though.</p>\n    <h2 id=\"p-1\">Do filesystems matter?</h2>\n    <p>Many performance-sensitive applications go to a lot of work to avoid reading and/or writing filesystem data on their critical\n    path. There are lots of ways to accomplish this, the most common being to stuff everything into memory using Redis or Memcached\n    or, well, those two dominate the market, near as I can tell. Another approach is to have the data in a file but access it with\n    <a href=\"https://en.wikipedia.org/wiki/Mmap\">mmap</a> rather than filesystem logic. Finally, since real disk hardware reads and\n    writes data in fixed-size blocks, you could arrange for your code to talk straight to the disk, entirely bypassing\n    filesystems. I’ve never seen this done myself, but have heard tales of major commercial databases doing so.</p>\n    <p>I wonder if anyone has ever done a serious survey study of how the most popular high-performance data repositories,\n    including Relational, NoSQL, object stores, and messaging systems, actually persist the bytes on disk when they have to?</p>\n    <p>I have an opinion, based on intuition and having seen the non-public inside of several huge high-performance systems at previous\n    employers that, yes, filesystem performance still matters. I’ve no way to prove or even publicly support that intuition.\n    But my bet is that benchmarks like Bonnie are still relevant.</p>\n    <p>I bet a few of the kind of people who read this blog similarly have intuitions which, however, might be entirely different\n    than mine. I’d like to hear them.</p>\n    <h2 id=\"p-5\">What’s a “disk”?</h2>\n    <p>There is a wide range of hardware and software constructs which are accessed through filesystem semantics. They have wildly\n    different performance envelopes. If I didn’t have so many other hobbies and projects, it’d be fun to run Bonnie on a sample of\n    EC2 instance types with files on various EBS and EFS and so on configurations.</p>\n    <p>For the vast majority of CPU/storage operations in the cloud, there’s at least one network hop involved.\n    Out there in the real world, there is still really a lot of NFS in production.\n    None of these things are much like that little SSD slab in my laptop. Hmmm.</p>\n    <h2 id=\"p-7\">Today’s benchmarks</h2>\n    <p>I researched whether some great-great-grandchild of Bonnie was the new hotness in filesystem benchmarking, adopting the methodology\n    of typing “filesystem benchmark” into Web search.  The results were disappointing; it doesn’t seem like this is a thing people\n    do a lot. Which would suggest that people don’t care about filesystem performance that much? Which I don’t believe. Puzzling.</p>\n    <p>Whenever there was a list of benchmarks you might look at, Bonnie and Bonnie++ were on that list. Looks to me like\n    <a href=\"https://www.iozone.org\">IOZone</a> gets the most ink and is thus probably the “industry-leading” benchmark. But I\n    didn’t really turn up any examples of quality research comparing benchmarks in terms of how useful the results\n    are.</p>\n    <h2 id=\"p-8\">Those Bonnie numbers</h2>\n    <p>The biggest problem in benchmarking filesystem I/O is that Linux tries really hard to avoid doing it, aggressively\n    using any spare memory as a filesystem cache. This is why serving static Web traffic out of the filesystem often remains a good\n    idea in 2024; your server will take care of caching the most heavily fetched data in RAM without you having to do cache\n    management, which everyone knows is hard.</p>\n    <p>I have read of various cache-busting strategies and have never really been convinced that they’ll outsmart this aspect of\n    Linux, which was written by people who are way smarter and know way more than I think I do. So Bonnie has always used\n    a brute-force approach: Work on a test file which is much bigger than main memory, so Linux has to do at least some real\n    I/O. Ideally you’d like it to be several times the memory size.</p>\n    <p>But this has a nasty downside. The computer I’m typing on has 32GB of memory, so I ran Bonnie with a 64G filesize\n    (128G would have been better) and it took 35 minutes to finish.\n    I really don’t see any way around this annoyance but I guess it’s not a fatal problem.</p>\n    <p>Oh, and those numbers: Some of them look remarkably big to me. But I’m an old guy with memories of how we had to move the\n    bits back and forth individually back in the day, with electrically-grounded tweezers.</p>\n    <h2 id=\"p-10\">Reiser again</h2>\n    <p>I can’t remember when this was, but some important organization was doing an evaluation of filesystems for inclusion in a\n    big contract or standard or something, and so they benchmarked a bunch, including ReiserFS. Bonnie was one of the benchmarks.</p>\n    <p>Bonnie investigates the rate at which programs can seek around in a file by forking off three child processes that do a bunch\n    of random seeks, read blocks, and occasionally dirty them and write them back. You can see how this could be stressful for\n    filesystem code, and indeed, it occasionally made ReiserFS misbehave, which was noted by the organization doing the\n    benchmarking.</p>\n    <p>Pretty soon I had email from Reiser claiming that what Bonnie was doing was actually violating the contract specified for the\n    filesystem API in terms of concurrent write access. Maybe he was right? I can’t remember how the conversation went, but he\n    annoyed me and in the end I don’t think I changed any code.</p>\n    <h2 id=\"p-9\">Here’s Bonnie</h2>\n    <p>At one time Bonnie was on SourceForge, then Google Code, but I decided that if I were going to invest effort in writing this\n    blog, it should be on GitHub too, so\n    <a href=\"https://github.com/timbray/Bonnie-64\">here it is</a>. I even filed a couple of bugs against it.</p>\n    <p>I make no apologies for the rustic style of the code; it was another millennium and I was just a kid.</p>\n    <p>I cheerfully admit that I felt a warm glow checking in code originally authored 36 years ago.</p>",
      "image": null,
      "media": [],
      "authors": [
        {
          "name": "Tim Bray",
          "email": null,
          "url": null
        }
      ],
      "categories": [
        {
          "label": "Technology/Storage",
          "term": "Technology/Storage",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "Technology",
          "term": "Technology",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "Storage",
          "term": "Storage",
          "url": "https://www.tbray.org/ongoing/What/"
        }
      ]
    }
  ]
}
Analyze Another View with RSS.Style