Author: alchemyst

  • When the lion’s hungry, he sleeps

    I heard a song recently with a line paraphrased from the 2019 movie “The Gentlemen“: “the only rule of the jungle is when the lion is hungry, he eats.” That sounds badass, but it bears almost no resemblance to actual lions.

    Real lions spend most of their time conserving energy. They’re opportunistic hunters who fail far more often than they succeed. When they do eat, it’s feast or famine – they might go days between meals. And they certainly don’t live by the “rule” of simply taking what they want when they want it. They’re working within harsh constraints, just like every other animal.

    But that line isn’t about real lions. It’s about mythical lions – a cultural construct we’ve built up from limited exposure, third-hand accounts, and centuries of symbolism. This mythical lion is the king of the jungle – confident, decisive, always in control. The real lion is frequently hungry, occasionally successful, and doing a lot of sleeping to save calories.

    I’ve written before about the boiling frog – a completely made-up phenomenon that people invoke as if it’s scientific fact. The mythical lion is similar, but with an extra layer: we don’t even agree on what the myth means.

    When someone says “I want to live like a lion,” what exactly are they claiming? Dominance? Independence? Laziness punctuated by brief violence? The ability to sleep 20 hours a day? You’d need a lot of context to understand what they mean.

    I think about those medieval European images of lions – clearly made by artists who’d never seen one, working from descriptions passed down through multiple people. They’re recognisable as “lion-shaped” but deeply wrong in the details. (see Why are Medieval Lions so Bad?) for more examples.


    Living in South Africa, I’ve had the fortune of seeing lions in the wild many times. Maybe that’s why the gap between the mythical and real lion bothers me. Or maybe understanding the myth requires your exposure to be limited – the less you actually know, the more the symbol can mean whatever you need it to mean.

    I remember having to learn national stereotypes early in life just to understand jokes. This feels similar, but more ambiguous. To communicate, you need to know not just what things are, but what people think they are, even when those ideas are demonstrably wrong.

    So next time someone invokes an animal metaphor or nature analogy, ask yourself: are they talking about the actual thing, or the cultural myth? And more importantly – do they know the difference?

  • Working through my reading list

    Some people have hundreds of tabs open in their web browsers for things that they still want to read. I have been using the Safari Reading list feature to keep track of things that I don’t have the time or inclination to read right now but that seem interesting enough that I want to hold on to them. But when I started working on the problem for real, I realised that not all queues need to be drained for them to work effectively.

    Start by measuring

    At some point I grew curious about how my list seemed to be growing all the time. So of course I wrote some code that allows me to gather statistics.

    The first entry in my reading_list_history.csv is from 2022-11-10 19:18:59.247630,1297. So at the time I had this idea of tracking things, I was already at 1297 items. The older items on my reading list at the time dated from 2019. My idea was to add this to a shortcut that would open an oldish item in my browser and also snapshot the size.

    The chart below shows the evolution of my reading list since them.

    In retrospect I should perhaps have kept around the read items so that I could clearly separate the rate at which I was reading through the items and the rate at which I was adding them. But the totals already tell you quite a bit. All the way up to 2025 I was not making much progress. I was going to news sites frequently (once or more a day), finding lots of interesting stuff to read and loading them in to my reading list, but I was steadily outpacing my ability to actually read them.

    I logged out of Twitter around the start of 2025 and that helped a bit, but the main thing that allowed me to catch up was scaling down my Hacker News habit to once a week rather than every day. I feel like I am now a bit more intentional about taking the time to read stuff.

    Technical details and issues

    I will now elaborate on some of The key part is knowing that the reading list resides in the safari bookmarks plist file. Code for reading this below:

    def parse_safari_reading_list():
        """Parse Safari reading list and return list of items."""
        items = []
    
        bookmarks = pathlib.Path("~/Library/Safari/Bookmarks.plist").expanduser()
    
        if not bookmarks.exists():
            return items
    
        plist = plistlib.load(bookmarks.open('rb'))
    
        reading_list = None
        for child in plist.get("Children", []):
            if child['Title'] == 'com.apple.ReadingList':
                reading_list = child
                break
    
        if not reading_list:
            return items
    
        for item in reading_list.get("Children", []):
            items.append({
                'url': item['URLString'],
                'title': item['URIDictionary']['title'],
                'date_added': item['ReadingList']['DateAdded'],
                'source': 'safari'
            })
    
        return items

    This works well.

    However, there is a well-known issue with the Safari reading list: when you remove many items at once, like when I was cleaning out, the sync can get confused. My experience was that every time I would add an item to my reading list on a mobile device, all my “progress” would disappear and I would find old items back on the list when I got to my computer.

    During this December break I was so fed up with this behaviour that I exported the reading list to a Markdown file in Obsidian and deleted the reading list on all my mobile devices. My reading list progress script now reads from both the Obsidian file and the Safari plist.

    What are these queues for?

    As I’ve been going through the reading list, I’ve found many gems. So I think my past self was doing something good by adding them to the list, but I’ve started thinking about all the places we maintain lists like these and the different roles they fulfil.

    When I have something like a shopping list, for instance, it is clear that the goal is to mark off every single item whenever I go shopping. But my Goodreads “want to read” list or a product backlog feels a bit different. The goal of these lists is to act as a “sorting buffer”. You want a list of a reasonable size that is prioritised and perhaps filterable so that you have options and can get the best stuff off the list. No-one expects their Goodreads reading list or product backlog to completely empty since that blocks them from their function.

    There is also a relationship between my hoarding behaviour and the changing media landscape. I have always been an avid reader, but during my lifetime we’ve moved from a place where I was finding it hard to find new books I’d like to read at my local library (because I’d read all the ones they had) to a never-ending stream of new words being churned out and funneled to your device for free. Here, again it becomes more important to filter, real time, than to catalog.

    Information explosion

    Some queues exist to be emptied, like a shopping list or an inbox tied to a concrete task. Others exist to maintain optionality. A reading list, a backlog, or a “want to read” shelf is closer to a reservoir than a pipeline: if it runs dry, it stops doing its job.

    This isn’t a new problem. In the 1960s, Herbert Simon observed that an abundance of information creates a scarcity of attention, shifting the real challenge from acquisition to filtering. Around the same time, Eugene Garfield proposed citation indexes as an institutional response to scientific overload: rather than reading everything, follow the trails that other people found worth citing. Those systems worked precisely because they turned personal filtering into shared infrastructure, but they degraded once the filter itself became a target. We’ve since repeated the same pattern with PageRank, SEO, and social feeds.

    So I’m trying to make sure I balance my exploration with my exploitation. Spend a bit more time actually reading content and learning and less time looking for interesting items, because right now that part is more than sorted.

  • Most people aren’t acting

    I don’t know exactly when it hit me that most of my mental imagery of people and relationships came from fictional characters rather than first-hand experience, but it was way too late.

    Just think about a romantic scene. A couple about to have their first kiss. Unless you’re some kind of creep, you probably havent seen this close-up from a third person perspective, ever. Sure, you might have been one of those people, but that’s quite different.

    Your third-person image memories are all captured with cameras, on sets, with lights and make-up artists and some bored staff trying to stay out of shot. If it felt genuine, that’s just a tribute to the skill of the actors.

    Or maybe you’re more of a reader. You know you can’t read people’s minds, but that internal monologue reads so naturally. It’s easy to forget that these people don’t actually exist. Authors aim for plausibility and narrative consistency more than actual realism. It’s not science. These aren’t observations from the real world. They’re made up.

    But let’s get back to those actors. Acting is hard, partly because actors have to make emotions and thoughts legible through their faces. We have to see the exact moment they get an idea, or fall in love, or feel disappointment. But real people simply don’t do that. If you watched me cfor an hour while I read funny or somber articles online, you wouldn’t be ale to tell the difference from my face. Most of us only “transmit” when they think they’re being observed, and even then we do it poorly.

    I believe that our constant exposure to acting has given us a pervasive belief in mind reading. When you think you know what someone else is feeling, you’re attempting mind reading. When someone expects you to know they’re upset (or why) they’re expecting mind reading.

    Movies teach us that emotions are obvious. Real life teaches us the opposite. People are hard to read, even when they’re trying to express themselves.

    This all means that in real relationships, whether that is with a romantic partner, a friend or a colleauge, it is important to talk explicitly about your emotions. I’m not saying you need to get on a therapy couch, just that you can make it clear that you are both interested in their internal life and unable to understand it without their help.

    I know this approach has been invaluable both in my personal relationships and at work.

    Side note: this concept is somewhat adjacent to the “Fundamental Attribution Error” where people attribute other’s actions to their internal make-up rather than some kind of situational duress. Also a fun thing to look up.

  • Being wrong feels just like being right

    This is one of the most powerful mantras in my life. Like many people I started out believing that I have an innate sense that would tell me if there is a chance that one of my beliefs are wrong.

    I’m not just talking about the big-picture beliefs like religion or morals here: My most vivid example is showing up a week early to my best friends wedding. You see I had been so sure of the date that I didn’t think to double-check the invite that was stuck to my fridge with a magnet, even as I dressed and drove 40 minutes to the wedding venue. It’s only when I realised none of the people in the church were familiar that the penny dropped.

    Once I understood that I could be completely sure while also being completely wrong, I started trying to understand how to introduce the correct uncertainty into my systems. I started keeping track of my bets, and I try to avoid expressing absolute certainty. But of course, when you’re sure you don’t try to do those things, and it would be crippling if you questioned every single moment of every day.

    So also have some sympathy for yourself and others when you inevitably make mistakes that you had no warning about.

    I learned a lot about this idea of certainty from Kathryn Schults’ work. This TED video sums it up pretty well, but I encourage you to read more about this.

  • Relative frequency of SI units and prefixes

    I am huge a fan of the SI system, but I’ve often noticed that even my academic colleagues take a mix-and-match aproach to the BIPM standards. It is common for chemists to use Ångstrom over nanometre, and I don’t think I’ve ever seen anyone use megagram over tonne.

    Perhaps people are so used to mg (miligram) that they instinctively feel that Mg (megagram) would be confusing, and I admit Gg looks a bit weird. Is that a trend? Do people avoid repeated letters in their unit names? Mm (megameter) does feel a bit odd, although mm (milimeter) feels much more familiar.

    These questions drove me to quantify the relative frequency of the SI units and prefixes.

    Google search results

    I used Google search results as a proxy for usage. I also tried the Google Ngram project, but that turned out to be harder than I wanted it to be. After downloading all the data and parsing some of it, it didn’t contain all the terms I wanted.

    Here is the complete table showing log10(Google search results + 1) for every combination of the SI prefixes with the units mentioned in the SI brochure as base units or derived units. I’ve skipped degrees Celsius as the Google search API kept erroring on searches like “quettaCelsius”.

    It’s always interesting when you get results like this – you can immediately start seeing some structure.

    These things jump out at me:

    • quecto, ronto, ronna, and quetta were added in 2022 and you can clearly see they haven’t been as widely adopted as the other prefixes
    • No-one uses prefixes with steradian
    • The “-er” spellings of metre and litre are more popular than the “-re” spellings that the BIPM uses, but not by much (I’m not sure if this is an artefact of Google combining results for the two)
    • For tonne, the negative power prefixes (milli) are much less popular than the positive ones (mega).

    Basic stats

    Here are the counts across all prefixes for the units. It’s obvious that the base unit counts are somewhat complicated by common words like “gray” or names like “Henry”. I’d imagine Pascal and Newton have the same problem.

    Then there are the prefixes, which I’ve kept in their power order.

    I was a bit surprised at how unpopular deca/deci are. I think there is just a strong preference for powers of three in the “engineering units”.

    Tonne

    Let’s dig in to more detail for the mass units (gram and tonne). I’ve plotted equal masses on the same vertical height to compare. I was surprised that only tonne meaningfully shadows megagram. On this view it’s also quite clear how infrequently people use tonne with negative power prefixes.

    Spelling

    The “-er” spelling is consistently higher than the “-re” spelling for meter/metre and liter/litre. The following chart shows the ratio of the spellings for different prefixes.

    Coding information

    The basics of the search code are pretty simple:

    def search(term):
        response = requests.get(URL, params=BASE_PARAMS | {"q": term, "exactTerms": term, "num": 0})
        time.sleep(0.5)
    
        try:
            return int(response.json()["queries"]["request"][0]["totalResults"])
        except Exception:
            print(response.json())

    Then a loop like

    for prefix, unit in product(prefixes, units):
        searchterm = f"{prefix}{unit}"
        
        if searchterm not in db:
            db[searchterm] = search(searchterm)

    Some details have been omitted from this code for brevity: db is a shelve database. I’m using requests for the API access and BASE_PARAMS contains the details for my Google Custom Search API engine, which means that I had to pay $2 of my own money to get the answers I was craving.