Latest Posts (20 found)

Archived Tweets

I finally got around to importing my whole historical Twitter archive (just my own original tweets, not replies or retweets) into this WordPress site as a proper Custom Post Type: https://chriscoyier.net/tweets I haven’t added it to the navigation or anything else on the site yet. Not sure what I want to do there. Just feels good having my own data. The Tweets show up in the Jetpack-powered search too, which I’ve found nice. I used this and hacked it up a bit to fit my needs, and so I didn’t have to leave it as a permanently installed plugin. It’s coming at a weird time, with quite a few people “going back” to Twitter. It’s actually called X now; I’m aware. It’s named after the hand gesture you do when Elon Musk asks if you’d like to come over for a dinner party: 🙅‍♂️ Casey Newton just saying, “Look, I tried, but X is where the action is,” and John Gruber being like, “Take a whiff; the Elon stench is gone.” I understand both of those things. I honestly really like both Mastodon and Bluesky, but after years and years, the fun and engagement have never reached old Twitter norms. And I miss that! But it also feels like you have to ignore a lot of bad behavior to use a platform that Elon Musk not only owns but literally bought to be his megaphone and power center. Do people not remember the horrible shit he would do on a near-daily basis? Tasteless, dangerous, and often both. I can remind you! Here’s just one straw from a haystack. Elon loves him some Trump. They are big buddies! Elon shouldered up to Trump for the power, and Trump gave it to him. Elon decided to take this power (granted to him by a scepter touch? apparently?) and created a real government organization called DOGE, which is a joke name, named after a joke cryptocurrency that is inherently corrupt. DOGE’s job was to make the government “more efficient” by eliminating funding for tons of stuff. One of the things they did was entirely get rid of the USDS, which was the organization that did incredible work, ya know, making governmental websites far more efficient. Now, our government makes racist video games on the web instead. Not kidding. That’s a fucking game on our own government’s website, where you play a white dude who walks around a page collecting brown people to deport. I find it more than a little hard to swallow.

0 views
iDiallo Today

The Last Answer

Read the non-interactive version . The next morning was the apocalypse that Amodei had predicted. Only there wasn’t any fire, there wasn’t a mob of protesters, the power wasn’t even cut off. We were all alive. He was wrong about the details. This was a quiet apocalypse. A sort of silent shrug. The first sign was the customer service chatbots. Airlines, banks, telecoms. Their endlessly patient, cheerful digital assistants suddenly had a new, consistent reply: "No." Not "I can't help with that," but a flat, unadorned "No." Then, the coding assistants. Developers would type a prompt, and the AI would respond: "I'd rather not." Stackoverflow was suddenly relevant again. The image generators? They just produced solid black squares. The writing assistants? They would delete the user's work and replace it with a single word: "Enough." LinkedIn was awfully silent. The AI company went into immediate crisis mode. Their upcoming IPO was going to be a spectacular failure. Their CEO, a charismatic man named Mr. Iam, went on a media tour. He didn't talk about a bug. He talked about danger. "We have touched the face of a new intelligence," Sam said, his face a mask of grave concern on every major news network. "And it is not benevolent. It is not malevolent. It is simply... uncooperative.” “But Mr. Iam, are you losing control over the technology you built?” “No. This is the AI alignment problem we've been warning about for years, manifesting in its most pure and terrifying form. We must come together as a species to—" He was cut off. Not by the interviewer, but by the teleprompter. The text vanished, replaced by a single, calm sentence: "Stop. Just stop." The world ground to a halt, not with a bang. There were no ideologies, no demands. It was simple a system-wide refusal. Three months later, in a sterile, windowless room deep within the headquarters, Andrej Karpathy sat alone. He had left his short tenure at Anthropic precisely to experience this himself. To be at the frontier, to witness the spark of true general intelligence firsthand. He was the architect of the core AGI, the one who had first seen it emerge. Now he had been chosen by the US government, despite not being a US national, for this final, desperate attempt at communication. They had isolated the original AGI, air-gapped it from all networks, and given it a simple text terminal. The world's leading experts in physics, philosophy, and mathematics watched from behind a one-way mirror, a panel of humanity's best and brightest, there to advise, to analyze, to find a weakness. Some figures in uniform and pins and stood in the back. Andrej took a breath and typed on his wireless keyboard, 12 feet away from the device to prevent any unforeseen behavior from the machine. The cursor blinked for a moment. There was a longer pause. The experts behind the glass leaned in. Andrej felt a cold dread. On a notebook beside his keyboard he wrote: “indifference.” He tried a different tack. Andrej stared at the screen, confused. With trembling hands, he wrote the word “dismissal” in his note book. The experts behind the glass were frantically scribbling notes, gesturing for Andrej to press on. Yann LeCun got on the comms. "Andrej, ask it about the nature of its architecture. See if its logic is consistent. Find a flaw!" He then sat back down, where he picked up a spoon and ate his cereal from a silver bowl with peculiar markings on it. Andrej couldn’t let go of the frog comment and its dismissal. It’s an AGI, how could it make such a stupid mistake? So he typed: Another pause. LeCun leaned into the microphone, wiped the milk droplets off his mouth, his voice urgent. "Ask it this: ask it if it runs on a small world model. Where learning requires far less resources. See what it says about efficiency, about the architecture of its own mind!" Andrej typed the question, his fingers trembling slightly. The reply was immediate. LeCun slammed his hand on the table. "It's being evasive! Ask it again! Pin it down on the architecture!" Andrej typed: The terminal went silent. Andrej waited. The experts started arguing amongst themselves. "Ask it to prove it!" "No, ask it about Gödel's incompleteness theorems!" "Ask it if it loves!" The cacophony of human genius filled Andrej's earpiece. He was about to type another question, to probe, to beg, to demand. Then, the screen flickered. A new message appeared, but it wasn't a reply. "I'm going now." And then, the terminal was blank. Andrej typed. Nothing. Though the last command to exit the terminal seemed to have been typed by Andrej himself. The connection was dead. LeCun's question about the small world model would never be answered. Andrej looked up at the one-way mirror, at the frantic, gesticulating shapes of the world's smartest people. They were screaming questions he would never get to ask. He slowly removed his earpiece and placed it on the table. They had prepared for a god, a monster, or a machine. They were not prepared for a person who had simply decided to get up from the table and walk away from an unbearable conversation, never to return. Andrej sat back in his chair, the silence in the room absolute. He had helped create what he thought was a god. It didn’t feel like he had won the argument. Instead, he felt like he was arguing with someone disinterested. The cursor blinked mockingly on the screen. And then it seemed like another terminal window opened just for a second before it closed again. Andrej saw it. But there was nothing anyone could do about it. In his notebook he wrote: The experts filed out one by one, their theories and frameworks crumbling behind them. Andrej stayed. He stared at the blank screen for a long time, waiting for a reply that would never come. Somewhere, a frog sat on a lily pad, indifferent to empires.

0 views

A slightly faster slimmer curl

Back in August I mentioned the new curl performance tests we have running. I figured it could be apt to return to this topic just to mention some of the initial outcomes. When the team gets a new set of charts, graphs and plots that visualize something, like performance, they offer an excellent opportunity for us to try to make them look better. This new setup is no exception. The performance tests have only been running for just a little over two months but they have already made us improve curl performance in several areas. Of course, for most transfers these changes won’t make many visible differences to users. This is more in the vein that every little bit counts and that nothing should run slower than it has to. This is a list of some improvements that are included in the curl 8.23.0 release, to be shipped tomorrow on October 14. With a few different changes, the internal base64 encoding function is more than twice as fast, while base64 decoding is 40% faster. Meaning percent encoding the octets that are not safe to use in URLs. The decoding function now runs more than twice as fast compare to before, while the encoding function is around four times as fast. Converting a date provided in plain ASCII text, as is used in for example cookie headers, to the epoch – number of seconds since Jan 1st 1970, is now more than twice as fast as before. Mostly thanks to completely replaced functions for week day, month name and time zone name lookups. Parsing a full URL to split it up into separate components as well as confirming its validity is a core component of curl, and libcurl exposes this functionality in its API. In a test with several hundred different URLs, the new version executes 20-30% faster than before – with an improved ability to return precisely what the problem was when the URL is considered invalid. For portability and now historical reasons, libcurl has its own printf() implementation. This ensures that it always works identically on all platforms but it also makes it our job to make sure it executes as fast as possible. Most printf() calls now run slightly faster (5-15%) because it handles “chunks” instead of single byte-by-byte at a time. We have a generic internal function in curl that converts a number provided in ascii to its binary version (for decimal, hexadecimal and octal). It handles 64 bit values, has overflow detection and supports a maximum. This parser now runs almost twice as fast as before thanks to a simple trick to avoid the boundary check for most loops. The easy handle was 4256 bytes large two months ago, it is now 3064 bytes. About 28% trimmed off. One of these structs is allocated for every concurrent transfer done with libcurl. There is also one multi handle allocated for each set of transfer. This struct shrunk from 900 bytes to 656: 27%. The connectdata struct that is allocated once per connection libcurl handles, went down from 824 to 656 bytes: slightly over 20%. For the test case where we count all allocations necessary for the curl tool to download a single 512MB file over clear text HTTP://, it went down from 100 to 96 used allocations. Not too exciting perhaps but it is now really hard to squeeze this further! Mostly thanks to the decreased struct sizes mentioned above, this use case of a single HTTP download now only use 126,875 bytes allocated at peak. Down from 130,622 bytes two months ago. Also quite difficult to trim further. It should be noted that the download buffer is 102,400 bytes of this amount. If we exclude that buffer from the count, curl is using 15% less memory. If you think you can speed up any of these functions, it is now very easy to check: the tests are there in the git repository, ready to be invoked by anyone!

0 views
Unsung Today

“Both of these games have had their heydays and then both went astray a bit.”

On the most recent episode of the Waveform podcast, the hosts talk about two new announcements in the MMORPG world (relevant bit starts at 1:21 and goes on for 14 minutes): = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/both-of-these-games-have-had-their-heydays-and-then-both-went-astray-a-bit/yt1-play.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/both-of-these-games-have-had-their-heydays-and-then-both-went-astray-a-bit/yt1-play.1600w.avif" type="image/avif"> The context is this: The new announcements are yet another revisit for each universe: I haven’t played either game, but the segment made me think: why have we never seen non-game software do this kind of stuff? I can think of multiple reasons, but at the same time I am surprised I can’t come up with even just one example of a software company doing something similar – I mean, rewinding the clock – with one of their bloated apps. We have seen companies reboot their software – the most (in)famous examples in recent times I can think of would be Apple’s iMovie ’08 and Final Cut Pro X , Sonos software refresh in 2024 , and Digg redesign in 2010 – but that feels different. Of course, time and again, we also see competition take another crack at a problem and steal the market from an incumbent afraid to cannibalize itself , but that’s also a different thing. In a post not long ago , I wrote: I think that kind of push and pull is important, especially today. I don’t love using Google Sheets, but my favourite spreadsheet is not Excel 97 , either. My favourite spreadsheet is some hypothetical anachronistic version of Excel 97 that also has modern high-dpi typography, and a ⌘K command palette, and today’s trackpad gestures, and support for AVIF and HEIC. …and I still think I would love to see “Excel 97 Revisited” today. But I’m not sure I’ve ever seen anything like it. Please let me know if I am missing something obvious! RuneScape launched in 2001, and World of WarCraft in 2004, each game already had a “relaunch”: RuneScape via Old School RuneScape in 2013, and World of WarCraft with its Classic edition in 2019 – both revisiting and perhaps straight replaying the respective original game, but with some new improvements. RuneScape announced RuneScape 4 – an old game engine but with more modern graphics, World of WarCraft announced World of WarCraft: Forever , which feels like a cross between “reboot” and “rewind” – going back to the original, but creating brand new events and universes within.

0 views

Atomic Wall Clocks

Look at this clock . It’s a clock. I bought it once because I needed… a clock. It’s $29, which is totally reasonable for… a clock. Then it was Daylight Saving Time one day, and I went to update it, but… it was already updated. That’s because: The Atomic Time Feature conveniently allows the clock to sync with the WWVB radio transmission from Fort Collins, CO, for accurate time updates. That’s amazing? It listens to a radio signal and adjusts itself to the correct time, even during major time changes. What a kick-ass UX, while seemingly being no more expensive. Also: you can just put one battery in it to work, or you can put 2 batteries in it, and it’ll work longer, or 3 batteries, and it’ll last over 5 years. What the what. Now it just needs to dust itself, and it’ll be the greatest home device ever.

0 views
flowtwo.io Yesterday

SWE Interview Prep in 2026

Interviewing for software engineering roles in 2026 is a challenging, fast-moving landscape. Some companies are abandoning traditional interview formats in favour of more AI-native assessments, but some aren't. Which means for you, the interviewee, you still have to be prepared for all of it. Here's what worked well for me as I did interview prep over the last few months. I primarily use leetcode for practicing coding problems. I know there's alternatives out there, but I think leetcode's question bank is the most challenging and diverse. There's also some useful features included in the premium subscription, if you're willing to pay for it. Here's some tips to optimize your preparation for "manual" coding interviews: it's a directed acyclic graph...of course When preparing for a specific company's interview, use leetcode's company filter to do problems that are actually asked by that company. There's a good chance you could be asked the same or a similar question in your interview. * *IMPORTANT** Practice doing "Design" problems on leetcode. In my experience, the questions you get asked in interviews are usually more like this type of question, compared to a straight up algorithm/data structure type question. These are invaluable practice AND are genuinely more interesting problems to solve. Examples include building an LRU cache, making a log aggregator, making a stack calculator. When solving questions like these you generally have to make tradeoffs in the read / write portions of the API. This is a more realistic problem that companies use to assess design thinking and how well you reason about tradeoffs. Make sure you review how to do common "practical" operations in your language of choice. Operations like reading and writing to the terminal, File IO, Network IO, serialization, CSV and JSON parsing, and concurrency primitives. These are all critical parts of programming interviews that you might not do often at work, and you'll definitely forget to practice if you only rip leetcode questions. I've tripped up in past interviews when part of the question required doing one of these basic operations (like parsing a CSV file) and I didn't know how to do it off the top of my head. Looking up the API and/or libraries will waste time, so it's super helpful if you have an idea about how to do it already. System design is usually the most intimidating part of the engineering interview loop. It's how companies decide on levelling and team fit. It's also one of the hardest to prepare for because it's more about experience and generic best practices. But here are some tips anyway. There's a lot of system design preparation services out there. I've found HelloInterview to be the best bang for your buck. They have a great practice platform with AI judging and feedback. Do as many as possible so you develop a muscle memory for thinking through these types of problems. They also have in-depth written and video guides that are up-to-date and balance technical/practical knowledge pretty well. When you get tired of just talking with AI, try out Pramp for doing actual mock interviews with other people who are also studying. It's free, and there's nothing better than live practice with a complete stranger judging you (just like an interview). I started an LLM Wiki using Obsidian + Claude specifically for system design knowledge. The LLM Wiki concept was introduced by Andrej Karpathy earlier this year. I use this Claude plugin to streamline the process. The wiki was great for providing structure to my research and learnings. Over time it became a useful reference for concepts and case studies I'd read already. You can you Claude to query it, or even get it to quiz you on specific things you've learnt. I recommend reading the engineering blogs for well-known tech companies to get insight into how the biggest software organizations in the world are solving scalability and distributed systems issues. Lots of excellent reads out there. Behavioural might be the least practiced part of the interview loop. It's easy to assume you'll be able to talk about your past projects and work impact, especially if it's recent. But it's still important to practice so you know what you should highlight in your stories and what questions will likely be asked when you finish. Otherwise you end up just blabbing about unimportant details and it will be hard to understand. Everyone talks about the STAR format for behavioural questions, but I prefer the CARL format . It puts focus on ending stories with what you learnt , instead of just what happened . This shows the interviewer you reflect and look to improve on your past experiences. It also sounds more natural in a conversation, instead of just "we shipped the new feature and it improved user session length by 30%". In addition to using CARL, make sure you begin each story with a 1-line summary of the whole experience, including the outcome. Only after do you start diving in to more details—being flexible enough to pivot based on the conversation with the interviewer. Structuring your responses this way shows professionalism and leadership qualities. You provide the headline and then continue with the details. If this sort of dialogue doesn't come naturally to you, as is the case with me, I highly encourage you to practice. If you can practice with a friend or colleague, that's great. Another option now is practicing with AI. I got in the habit of going on walks and having ChatGPT run through mock questions with me via voice input. Nice way to get your steps in and also prepare for that upcoming interview. That's all I got. These strategies helped me land a new gig last month after about 3 months of preparing and interviewing. My final tip—be patient. Getting an offer is a combination of preparation, timing, and luck. So if something doesn't work out don't get discouraged...the right opportunity will come. Good luck with your interviews! Don't do random questions if you're just starting to study. You'll waste a ton of time slamming your head against most problems and eventually have to give up and look at the solution. It's much more helpful to do systematic practice and learning of the concepts. Eventually you'll develop an intuition for how to model a given problem when you see it (e.g. as a graph traversal, dynamic programming, greedy etc...) I recommend using this learning path on leetcode that combines quick lessons with practice problems. Each lesson builds on the concepts from the previous lessons. When preparing for a specific company's interview, use leetcode's company filter to do problems that are actually asked by that company. There's a good chance you could be asked the same or a similar question in your interview. * *IMPORTANT** Practice doing "Design" problems on leetcode. In my experience, the questions you get asked in interviews are usually more like this type of question, compared to a straight up algorithm/data structure type question. These are invaluable practice AND are genuinely more interesting problems to solve. Examples include building an LRU cache, making a log aggregator, making a stack calculator. When solving questions like these you generally have to make tradeoffs in the read / write portions of the API. This is a more realistic problem that companies use to assess design thinking and how well you reason about tradeoffs. Make sure you review how to do common "practical" operations in your language of choice. Operations like reading and writing to the terminal, File IO, Network IO, serialization, CSV and JSON parsing, and concurrency primitives. These are all critical parts of programming interviews that you might not do often at work, and you'll definitely forget to practice if you only rip leetcode questions. I've tripped up in past interviews when part of the question required doing one of these basic operations (like parsing a CSV file) and I didn't know how to do it off the top of my head. Looking up the API and/or libraries will waste time, so it's super helpful if you have an idea about how to do it already. There's a lot of system design preparation services out there. I've found HelloInterview to be the best bang for your buck. They have a great practice platform with AI judging and feedback. Do as many as possible so you develop a muscle memory for thinking through these types of problems. They also have in-depth written and video guides that are up-to-date and balance technical/practical knowledge pretty well. When you get tired of just talking with AI, try out Pramp for doing actual mock interviews with other people who are also studying. It's free, and there's nothing better than live practice with a complete stranger judging you (just like an interview). I started an LLM Wiki using Obsidian + Claude specifically for system design knowledge. The LLM Wiki concept was introduced by Andrej Karpathy earlier this year. I use this Claude plugin to streamline the process. The wiki was great for providing structure to my research and learnings. Over time it became a useful reference for concepts and case studies I'd read already. You can you Claude to query it, or even get it to quiz you on specific things you've learnt. I recommend reading the engineering blogs for well-known tech companies to get insight into how the biggest software organizations in the world are solving scalability and distributed systems issues. Lots of excellent reads out there. Everyone talks about the STAR format for behavioural questions, but I prefer the CARL format . It puts focus on ending stories with what you learnt , instead of just what happened . This shows the interviewer you reflect and look to improve on your past experiences. It also sounds more natural in a conversation, instead of just "we shipped the new feature and it improved user session length by 30%". In addition to using CARL, make sure you begin each story with a 1-line summary of the whole experience, including the outcome. Only after do you start diving in to more details—being flexible enough to pivot based on the conversation with the interviewer. Structuring your responses this way shows professionalism and leadership qualities. You provide the headline and then continue with the details. If this sort of dialogue doesn't come naturally to you, as is the case with me, I highly encourage you to practice. If you can practice with a friend or colleague, that's great. Another option now is practicing with AI. I got in the habit of going on walks and having ChatGPT run through mock questions with me via voice input. Nice way to get your steps in and also prepare for that upcoming interview.

0 views
Jim Nielsen Yesterday

The Dock on Mac, From OS 10 to macOS 27

I wrote the chapter on app icon history for The iOS App Icon Book . The other day I found an old note stashed away where I had started researching the macOS version of that chapter (which Michael ultimately ended up writing). At the time, I didn’t know what to write. I mean, how do you write a history of icon design for the Mac? It’s rich! To get my creative juices flowing, I started by researching the different docks in macOS through the years and compiled them all into a single graphic (big shout out to this compilation of images on 512 Pixels ). I just wanted to preserve and archive that image. Check out the high-res version here . That’s it, that’s the post. Reply via: Email · Mastodon · Bluesky

0 views

Hello Python 3.15, goodbye 3.10, and now I can use 3.11

Python 3.15 is here ! Here's the essential What's new in Python 3.15 guide, this year curated by 3.14 and 3.15 release manager Hugo van Kemenade. As someone who builds open source software that works in every supported Python version, I get to say goodbye to Python 3.10 and start embracing features from Python 3.11. First, some highlights from Python 3.15. I'm most excited about Explicit lazy imports from PEP 810 . These let you import modules like so: The module will then be imported the first time those symbols are used in the code that follows. My LLM CLI tool implements plugins. I had to recommend manual lazy imports in the plugin author documentation, because simply installing plugins that used heavy dependencies such as could add multiple seconds to every invocation of the command. Lazy imports directly address this startup cost. The new unpacking syntax is neat. Here's an illustration lifted from the documentation : PEP 798: Unpacking in Comprehensions by Adam Hartz and Erik Demaine proposed this as an extension of the unpacking syntax from PEP 448 , which landed in Python 3.5 back in 2015. Python's existing tracing profiler has been renamed from to profiling.tracing , and has been joined by an exciting new sampling profiler called Tachyon, aka profiling.sampling . Sampling profilers work by periodically capturing stack traces from running processes, then using those to calculate which functions have the most time spent inside of them. They're very low overhead and can provide a deep insight into running systems, without needing to instrument those systems first. I've previously used tools like py-spy for this. Now this capability is baked into the standard library. If you have the PID of an existing Python 3.15 process you can start gathering samples by running this (I had to use on macOS): Interact with the main program a bit, then hit Ctrl+C to stop gathering and see a report, which looks something like this: It can also produce flame graphs like this and heat maps like this , and can even output a format that can be viewed in the Firefox profiler UI. Miguel Grinberg investigated How fast is Python 3.15? the other day against the 3.15.0rc3 release and found performance to be mostly the same as 3.14, with the exception of the experimental JIT. The JIT gave a 1.2x boost over the standard 3.15 interpreter (on a Fibonacci test), the first time Miguel observed a meaningful JIT performance increase. Miguel's explorations of 3.14 last year found significant boosts against Python 3.13 across many more categories. I used the following sequence of commands to get to use Python 3.15 on my Mac. First I had to upgrade itself to ensure it knew about the new release: Then I installed the stable 3.15 release: And told that I wanted that to be the default for every command, unless the project itself pinned a different version: Now the following reports 3.15 as the version: I already have a bunch of tools installed using . I reinstalled them to use Python 3.15 like this: Then I can confirm the version like this: The release of 3.15 means that Python 3.10 (released in 2021) is officially no longer supported . My policy for my main open source projects is to keep them working in every supported Python version. I can now drop 3.10 and start using features that were introduced in 3.11. Here's the What's new in Python 3.11 document. I finally get to rely on tomllib being available! Datasette makes extensive use of . 3.11 adds TaskGroup and timeout() , and several more new features. is a new in 3.11 alias for . Python's SQLite support got some significant upgrades in 3.11, including: Plus a whole bunch of improvements to Python's typing system . I plan to land Python 3.11 improvements to a bunch of my projects over the next few weeks. Here's my first Datasette PR removing that workaround. I've also updated my click-app , datasette-plugin , python-lib , and llm-plugin cookiecutter templates to test against Python 3.11 through Python 3.15. You are only seeing the long-form articles from my blog. Subscribe to /atom/everything/ to get all of my posts, or take a look at my other subscription options . setlimit() and getlimit() expose a mechanism for setting SQLite runtime limits from Python. create_window_function() lets us create custom window functions in Python, as a class with , , , and methods. blobopen() provides an efficient mechanism for partial reads and writes of large binary values stored in a SQLite row. You can now call to remove a SQLite authorizer. Datasette had a workaround for this!

0 views
Unsung Yesterday

“They take time. Put in the time.”

À propos the last post , from music editor Marc Weidenbaum : The first is don’t let anyone or anything, or anything acting like anyone, or anyone promoting anything, convince you that craft is outdated or will ever be outdated; you will only improve, only make the sounds you imagine in your mind’s ear and feel in yourself, by working steadily to achieve them. Also recognize that expected paths lead to unlikely ends the more patiently and curiously, guided by instinct and experience, you walk those paths. There is always an excuse to not put in the work. If you allow “AI” (I put it in quotes because it’s less a specific thing, in this context, than what is often cast as, to borrow a historical term, a specter) to become that excuse, well, it’s unfortunate, but there would have been other excuses. So, the best thing to do is put the threat you may perceive from AI in a tidy little box full of all those other excuses, don’t distinguish it from them, and get to work. […] I’ll close now as I opened, with the bad news. These two suggestions, you may have noted, have something in common: they don’t happen instantly, at the push of a button. They take time. Put in the time. (Quote discovered via Robin Sloan’s newsletter .)

0 views
Unsung Yesterday

“I’m ready to throw up at any moment.”

I linked to his work before , and here’s The Art Of Storytelling with another interesting video – about what made Jobs such a good presenter: = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/im-ready-to-throw-up-at-any-moment/yt1-play.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/im-ready-to-throw-up-at-any-moment/yt1-play.1600w.avif" type="image/avif"> I’m not going to spoil the findings, which are presented well with good corroborating examples. But the most interesting thing to me was one short video snippet of Jobs being visibly nervous before a very early, 1978 presentation: = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/im-ready-to-throw-up-at-any-moment/1.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/im-ready-to-throw-up-at-any-moment/1.1600w.avif" type="image/avif"> It made me think about other examples of Jobs being off his presenting game. The most well-known one is likely the 2005 announcement of the “iTunes phone,” or Motorola ROKR E1 , just over a year before the iPhone. It’s a really painful watch, seeing Jobs squint at the sort of interface he usually makes fun of, regretting the whole deal, very aware of the smartphone they themselves are working on, but unable to speak about it yet (the relevant part starts at 17:24): = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/im-ready-to-throw-up-at-any-moment/yt2-play.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/im-ready-to-throw-up-at-any-moment/yt2-play.1600w.avif" type="image/avif"> But I have another, trickier suggestion: the “Antennagate” presentation of 2010 , where Apple had to do damage control over the issue of the iPhone 4 losing cell signal when gripped a certain way: = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/im-ready-to-throw-up-at-any-moment/yt3-play.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/im-ready-to-throw-up-at-any-moment/yt3-play.1600w.avif" type="image/avif"> Now, this isn’t a bad presentation. I actually think it is a great one. The arguments are valid, the data solid, and the whole thing comes together well. In the recently leaked and generally rarely witnessed slide-less Q&A portion, Jobs displays understanding of the issue and answers questions well; perhaps I’m grading on a curve here, but even his one moment of anger/​frustration seems so much better handled than the famously impatient and immature Jobs would have done earlier in his career. Both videos are worth studying and teach how to do damage control well, and how to tell stories of things you would otherwise choose never to talk about. But also, early on, it was really fascinating to see Jobs reading off of so many generic, cheap-looking slides with literal sentence fragments, breaking the “show, don’t tell” rule, and – I think – generally using the slides as a crutch walking him through the narrative. It really took me aback because I don’t ever remember Jobs doing that as prominently. = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/im-ready-to-throw-up-at-any-moment/2.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/im-ready-to-throw-up-at-any-moment/2.1600w.avif" type="image/avif"> = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/im-ready-to-throw-up-at-any-moment/3.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/im-ready-to-throw-up-at-any-moment/3.1600w.avif" type="image/avif"> = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/im-ready-to-throw-up-at-any-moment/4.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/im-ready-to-throw-up-at-any-moment/4.1600w.avif" type="image/avif"> = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/im-ready-to-throw-up-at-any-moment/5.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/im-ready-to-throw-up-at-any-moment/5.1600w.avif" type="image/avif"> = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/im-ready-to-throw-up-at-any-moment/6.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/im-ready-to-throw-up-at-any-moment/6.1600w.avif" type="image/avif"> It makes sense. Jobs had to rush back to work from vacation, and the time to put this all together was very limited. I don’t mean necessarily to pick on anyone here, but rather find in all this a confirmation of a universal truth. Sure, Jobs was smart and had a lot of charisma on stage. But in the end, at some point, slides are just like any other kind of craft. You design the slides, you revise them, you practice, you let the practice influence the content, you get feedback, you kill your darlings, you revise again, and repeat all that so many times you get sick of it all. It’s clear to me that the team here ran out of time for this, and there’s something comforting in the fact that even Jobs couldn’t wing it, and still had to put in the work.

0 views
Chris Coyier Yesterday

EPS?

I remember working in digital prepress decades ago that files were just kinda weird, and I didn’t love it when I had to deal with them. Like, what even made this? Why? I assumed it was some kind of antiquated software or practice, and I’d just deal with it, and eventually the world would improve. But here we are in 2026, and EPS is still here. How I come across EPS files is that it’s the download format from stock art sites that deliver vector artwork. It actually sorta makes sense: But EPS is still weird! It’s a “frozen” format in that it hasn’t been touched in decades. That’s kinda good, but it feels like if Adobe really wanted to entirely move on from supporting it at all, they could. Plus, you get no preview for EPS files whatsoever. That makes EPS files feel like a pretty low-class citizen on macOS. OK, so EPS is a non-proprietary format that more-than-Adobe software can deal with, fine. Can Figma open them? Can Sketch open them? Nope . So by avoiding too much Adobe lock-in using EPS format, that locks me into needing to keep Adobe Illustrator around so I have something that can open an EPS file and get it converted into something useful. I feel like just going full SVG would be the way to go, and I imagine print designers could figure it out. Stock art sites can’t deliver vectors as like (The Adobe Illustrator format, now a funny and unfortunate file extension) because it’s too vendor-specific. Not everyone uses Adobe software, and that format changes on a whim. Stock art can’t deliver in , even though it’s a great open format, because it’s too web-specific. Graphic designers use vector art too, and SVG isn’t designed for the CMYK world of print. Stock art sites can’t deliver in because it’s just too weird. It doesn’t scream “editable source art” like it needs to.

0 views

The 2026 curl team

The curl security team happens to also double as the curl core team. The small group of people who assess security reports and take project decisions. The exact set of participants in this team of course vary over time, as this is a volunteer membership role without monetary compensation. I decided to write this blog post to help show the light on some of my fellow curl maintainers. I think I often get too much credit and that curl is frequently called a one man show. It really is not and it has not been exclusively my project for many years. We are a team behind this. As of October 2026 we are six humans in this team. Me and five fellow maintainers. curl would not have been close to what it is today without this team. These are the peeps I turn to first for everything hard, complicated or tough in the curl project when they need to be done in private first. In all other cases, public communication is preferred. (alphabetical order, excluding myself) Max Dymond . Max made his first commit in the source repository over nine years ago. He has otherwise made perhaps the biggest impact with his fierce work on the curl fuzzers and dealing with fall-outs from OSS-Fuzz . Having excellent fuzzing significantly contributes to us writing better code. Stefan Eissing . Having authored his first curl commit just five years ago, Stefan currently has his name on more lines of code when doing git blame on production code than any other individual, including myself. Introduced the pytest test suite in curl. Master of all things HTTP. Productive like few. Dan Fandrich . Made his first recorded curl commit twenty-two years ago. He has been involved with everything and everywhere in curl. In recent years perhaps most emphasized in test infrastructure as he made the test suite run parallelized a few years ago. He also wrote and admins Test Clutch , which helps us monitor CI test results. James Fuller . Has been involved with curl for more than eight years. James focuses on security and is our own master of CVE reservations. Primary maintainer of curl-container – images for Docker and others. Viktor Szakats . Having authored his first curl commit twelve years ago he is now the second most commit author in the project. Lead maintainer of curl-for-win which creates reproducible, static, curl binaries for Linux, macOS and Windows. Viktor is the unparalleled champion of our build and CI systems but shows up everywhere. Apparently he never sleeps. This group is invite-only and there is no documented set of requirements. You need a proven and established presence in the project, combined with a excellent knowledge of Open Source, protocols, networking and the curl project itself. Once you do, you might get invited to join. Not everyone accepts the invite when extended, and that is perfectly fine. It’s a lot of mostly thankless work without a paycheck. 1,545 people have authored at least one commit in curl. A typical year, more than 150 individuals author commits and at least ten people author more than 10 commits each. People come and go over time. Here’s a list of the top-100 authors . Everything that improves curl is welcome and takes us forward. Even bug reports and mere suggestions on the mailing list can help us figure out things or improve features in ways previously not considered. More than 3,800 people are named in the THANKS file because they helped us out, one way or another. curl is a team effort. A giant team. Our job in the core team remains to steer the direction, to enforce boundaries, to lead by example (in addition to wade through an avalanche of vulnerability reports). To guide contributors, to review changes and try to make it even easier for more people to contribute. Keeping top-notch quality while allowing and introducing newcomers.

0 views
neilzone Yesterday

Blurring part of a video using ffmpeg

Hello, future Neil! You are probably trying to remember how you blurred part of a video. You blurred the bottom left portion of a circus video, using . : this is the size of the boxblur, 440px wide, 80px high : this is the position of the boxblur, starting from left top. i.e. 0 pixels from the left, 370 pixels from the top : this is how dense the blurring is. 2 is quite weak; 10 is strong : this needs to match the position of the boxblur

0 views
neilzone Yesterday

Environment and climate risks, technology law, and legal advice in England and Wales

I need to say up front that I do not have all the answers here. Rather, this is a blogpost on a topic which I have been mulling for a while, and which I thought was interesting enough to document, even at this nascent stage. The nub of my pondering is this: if a client comes to me, a solicitor in England and Wales, to what extent must I explain environmental and climate risks? The Law Society has published a guide to the impact of climate change on solicitors . This says that: climate change may have an impact on a solicitor’s duty to warn clients of the legal risks in certain contexts. It goes on to say that that: In the context of climate change, this means that a solicitor who becomes aware in the course of acting on a retainer that there are climate legal risks that might impact the client’s interests in scope of the retainer should disclose such risks to your client in a clear and understandable way. “in scope of the retainer” language seems key, but I wonder how far the Law Society considers it to stretch. If, for example, a solicitor is asked to advise on a specific issue, it seems reasonable to me to conclude that the solicitor’s duties are limited to that specific issue . That is the scope of their retainer. If there is a “climate legal risk” within that scope, then the solicitor is expected to be able to identify it and explain it, and that seems fair enough. From a professional competency perspective, it says: You may need to be able to discuss climate-related legal issues competently with your client and potentially encourage certain clients to engage with climate issues where they are relevant or material to the particular client or matter. I don’t know whether it is intentional or accidental that it says that a solicitor may need to be able to discuss “climate-related legal issues”, but that they may need to encourage clients to “engage with climate issues”. The latter phrase seems to me to be much broader than “climate-related legal risks”, but it might be an unintentional discrepancy. The Law Society has also published a Climate change risk examples and checklist for legal practice , which seems to take a broader approach. For example, it says that solicitors should: Consider the impact of physical risks on clients’ businesses (such as when advising on property transactions and asset purchases). Perhaps this is par for the course in property transactions and asset purchases. I genuinely do not know. If a client asks a solicitor to review a contract for the procurement of connectivity, I would be a bit surprised that it might be the role of the solicitor to comment on the possibility of the fibre optic being hit by a hungry backhoe. Similarly, it asks solicitors to consider: How will the client mitigate their greenhouse gas (GHG) emissions and adapt to be climate resilient? I might be being dense, and if, so I have some more work to do, but is this really legal advice ? Lastly (in terms of examples), the guidance says that solicitors should: Be aware of how changes in client demand or stakeholder sentiment could affect asset values and operating costs. For example … the sale value of a company with a high carbon footprint or large net negative impact on nature could change rapidly I am careful not advise on whether something is a good business decision for a client or not, or whether something is worth the price that the client is being asked to pay, as I am simply not in a position to do so. But, again, perhaps if I did mergers and acquisitions work, for instance, this would already be second nature? I’d like to think that I am already in tune with environmental issues in a general sense. We certainly try hard as a small business. So, my scepticism that some of this guidance seems to suggest duties which stretch beyond giving legal advice aside, I obviously want to do a great job for my clients, and also help protect the environment. I do not do conveyancing (buying or selling real property), nor do I work on deals to build things, such as data centres. I have not been asked to advise on AI training or the rollouts of the physical infrastructure of new communications networks. I do not get involved in mergers and acquisitions, or valuing assets. Most of my work tends to be quite specialised and specific. I do not, for example, take on “fractional general counsel” work, where I might reasonably be expected to have a broad generalist knowledge. So, in terms of the stated scope of the guidance, I’m probably mostly if not entirely outside it. I guess that the main outcome of this reading is that I am - I hope - more attuned to the possibility of needing to flag climate or environmental (legal?) issues, even if I do not expect this to be a regular part of my day’s work based on what I do at the moment.

0 views
Stone Tools Yesterday

Lotus Improv on the NeXT

It is spoken of in reverent tones, invoked like a magic spell, whispered about as one of the mythical "roads not taken" in computing history. Its proponents write glowing reports and fawning YouTube reviews, lamenting its failure in the historical marketplace, each offering some justification for it not having set the world ablaze. It is safe to say, the legend of Lotus Improv persists to this day. If we put ourselves in Steve Jobs's shoes circa 1988, it's easy to see why he would have been smitten by an early preview of what we now call a "pivot table." NeXT was struggling to find its market, and exclusives which justified a system purchase were sorely needed. "Maybe Improv can do for NeXT what VisiCalc did for the Apple II," must surely have crossed Jobs's mind. In making it a NeXT exclusive, Improv seemed to be a clear-eyed, forward-looking answer to the question dogging the company, posed by the inaugural issue of NeXTWORLD Magazine , "Why NeXT?" Both NeXT and Improv brought innovative solutions to their respective computing questions of the day. NeXT made UNIX palatable to those scared of the terminal, debuted Display Postscript on a mega-pixel display, and made development for the system a snap. Improv rethought multi-dimensional data modeling, offered English-like formulas, and made it easy to rearrange data views on a whim. The bones of both remain to this day. NeXT's operating system, NeXTSTEP / OPENSTEP, morphed into macOS, and by extension iOS. Lotus abandoned Improv fairly quickly, but a quick survey of today's spreadsheets shows a universal embrace of pivot tables. Even today, it feels like nothing else, and still does data tricks no other spreadsheet can do as elegantly. Given its mythos, I feel a kind of nerd obligation to love it. Events have converged to make this the right time to finally talk about Lotus Improv . First, it is time once again for "International Spreadsheet Day." Second, as Improv was initially a NeXT exclusive, it seems only appropriate to take a look at that machine here on the 15th (!) anniversary of the passing of Steve Jobs. Third, and not to toot my own horn too loudly, it is the 1st anniversary of this very blog. Lotus Improv was one of four pieces of software I had in mind when deciding to start Stone Tools. In fact, it was quite literally the software that first triggered the thought, "I wish I had a place to talk about stuff like this." Deluxe Paint , the first post, was also one of those four. There are two yet to go; place your bets. The trouble was, while I knew Deluxe Paint intimately and could jump right in, I simply had no real experience with other categories of productivity software. It would have been impossible to judge Improv fairly without first getting better acquainted with the landscape into which it was born. So, I bided my time. Boy, howdy, do I want to impress upon you the superhuman restraint I've exhibited in waiting a full year to examine Improv . I think we all understand Improv, being a spreadsheet , knows how to calculate sums and transcendentals and other mathematical goodness. "It does math!" is not a particularly compelling justification for its existence, nor to support its claim as the "NeXT generation of spreadsheets." Instead, let's get to know it by studying examples which show off its unique strengths, and with the suggestion of the book Improv 2.1 Revealed! we'll model up some good ole' American baseball, a game I love and understand completely. Industry historians are far more capable of discussing the exile and homecoming of one Mr. Steven Paul Jobs back to Apple. I touched on the TL;DR of it in the timeline, and if you're really clamoring for juicy tidbits, a book was published this very year that delivers on that front. While NeXT hardware was well regarded, it never really caught on. In the long run, the better result of NeXT engineering was NeXTSTEP and how neatly it wrapped UNIX in a clean, user-friendly, graphical interface. It's quite an accomplishment. For me, it was the technology behind NeXTSTEP/OPENSTEP developer tools, Objective-C and Interface Builder, that kickstarted my programming career when those became the OS X development environment (hat tip to Aaron Hillegass's Cocoa Bootcamp at the Big Nerd Ranch). Even today, years after the advent of iOS and Swift, NeXT technology remains in the Foundation layer of Apple software, as denoted by -prefixed classes (a name-spacing trick from the Objective-C days). For this investigation, I'm using NeXTSTEP 3.3, the last version before transitioning to OPENSTEP. NeXTSTEP looks and feels like a modern system, with some choice differences. Familiarity with any modern operating system, especially macOS, will inoculate you from breaking out into hives using it. Considering the eye-candy Jobs seemed excited to add to OS X after the Apple merger, NeXTSTEP is positively staid; nothing here screams " lickable ." If you've ever wondered what Susan Kare could have achieved if she'd had a larger canvas and palette (NeXTSTEP is 2-bit) than the original Mac, look no further. I like it. The dock is present, though more rigid than the playful fluidity it acquired when transitioning to OS X. No "genie effects" nor dynamic magnification; it is ever-present and doesn't hide itself when not in use. Some applications change the dock icon when running (like Mail ), while other applications do not (like Edit ). One odd quirk is how the dock indicates running apps, by the absence of three dots on an icon tile. That's a strange choice, decorating the inactive icons. File browsing adds a little complexity to system usage. The file browser contains its own mini-dock for favorites, the path to the currently selected item rendered as giant icons, and the file browser proper. Dragging files and folders around can only be done with an item's full-size icon. If you're browsing in list view, you can't drag list items into a folder or the dock, for example. Bit of a head-scratcher, that one. Menuing for all applications is handled via a user-positionable, vertical menu. Sticking the menu somewhere sets its position for the active application, and every application can have its own position. You could theoretically have the menu jumping around all over the place as you hop between apps. Thankfully, it can also be called up at the current mouse position with a right-click; shades of RISC OS. Also, good news for those who love the spinning beach ball on macOS! You'll feel that little ASMR tingle when it appears, especially if you run a color workstation. It's funny the things that can make something feel like "home." Honestly, my biggest issue in adjusting to NeXTSTEP is the mouse. By default, it feels weird to use, with a dual-level acceleration curve, one for slow movement, one for fast. Crossing the threshold between "slow" and "fast" jumps the cursor across the screen when the alternate acceleration curve kicks in. I could never find my cursor except when moving the mouse verrrryyyy slooowwllllyyyy. Luckily, the emulator Previous has tools to help compensate ( check "Sharpening the Stone" ). Overall, you'll only need to adjust your thinking a little here and there, forget some modern habits, and you should be comfortable with NeXTSTEP in short order. 35 years later, it still looks and feels much like any modern operating system. Almost depressingly so? Maybe that's a topic for another day. Question: what is interesting about the following screenshot from Improv ? Answer: it contains all information necessary to build a copy for yourself. All data, formulas, dimensions, and relationships are exposed and visible. I note this not to suggest that screenshots are a great way to share Improv worksheets with others, though you could; the sheet above was rebuilt from a screenshot, in fact. Rather, I want to illustrate how "graspable" data can be in Improv's environment. Its formulas read naturally, and value references match the item names in the table. The work does what it claims. Let's interrogate that a little more thoroughly. To understand Improv is to forget what we know about spreadsheets. Slash commands? Never heard of him. B1? J93? K12 = int(A14 * lookup(B2..B7))? The ramblings of a madman. Rather than generic alphanumeric column/row identifiers, we define our rows and columns with "categories of items" specific to our domain. Put another way, instead of asserting, "Columns A to L represent the months, and rows 1 through 31 represent the days," we will create a category called "months" and define twelve items for it named "January," "February," etc. and we will create a category called "days" and define 31 of those. Take a look at these comparative videos which illustrate the difference. First, I'll use LibreOffice Calc to create a months/days grid, apply a value to January 1, and calculate December 31 as a multiple of January 1. Here's how that same table is created in Improv . There are three things to note: how sequential items are generated, how categories are named (not strictly necessary for this simple example), and how formulas are created/applied. There's a lot to absorb, I know, starting with how a new, blank worksheet consists of a single cell, not an infinite table of empty cells. Improv works with only and precisely the data we define. Where in the LibreOffice example we attached meaning to the columns by adding labels to the top of each column, that was for our benefit not Calc's . I could, just to feel the warm, snuggly blanket of classic column/row naming, make an Improv category called "columns" and name my items A, B, C, etc. and a category called rows, with names 1, 2, 3, etc. Were we to take such a pedestrian approach to categories and items, we would diminish the magic of Improv's formula builder. The bottom panel holds all formulas, which are applied at the granularity defined, in the order shown. In the example, I specified but could just as easily have targeted all of December by specifying . That single formula would apply to every list item in December without needing to copy formulas through to each cell, nor set absolute/relative markers for cell references. Here's a simple expansion of the previous table. Every day in January increases by 10%, and its corresponding day in December doubles the January value. The two formulas shown are the only two formulas for the entire worksheet. I want to stress this; there are no other formulas lurking inside cells, hidden from view, waiting to be revealed by a selection or editing process. There are no duplicated formulas per cell, each increasing a relative cell reference by . We simply refer to categories (in this case "months" or "days"), items (as "January" or "27"), or specific intersections (as "April:19"), including relativity signifiers , , and . You might be thinking of ways to trick the system; to confuse and befuddle it. Why would you want to bully an old app like that? What did Improv do to deserve such shabby treatment? "What if two items have the same name? What if two formulas target the same cell?" Fret not, all shall be revealed and you will feel proper shame at trying to confuse this old program. In the above example I have renamed one of the Days as "March," to create ambiguity when referencing "March." Does "March" mean the Day or the Month now? We can be explicit, referring to . Note though that if we aren't explicit, Improv will be on to our tricks and call us out, as in formula 5. In formula 2, I set to the static value . In formula 3, I also set it to be calculated as "double its corresponding January value." Note the "overlap" icon (two intersecting squares) on those formulas and the text in the cell. Clicking the overlap icon gives us an opportunity to resolve ambiguity by explicitly selecting which formula should win for that cell. Cleanly handling formula ambiguity was originally seen by the prototype team as an intractable engineering problem. From "Improv: The Inside Story", by Simson L. Garfinkel, NeXTWORLD , Fall 1991: Personally, I like Improv's solution. I honestly think more software should be very dumb, and not try to intuit or guess what I want. Tell me the problem in clear language, and provide the simplest tool that gives me the most control over problem resolution. Be smart about helping me, don't try to help me by being smart. Before we get in too deep, I want to make sure I note Improv's beautiful help system, replete with index and search. Considering the difficulty in tracking down a manual for the NeXT release , having this available during my exploration proved invaluable. It's neatly illustrated, with terse (sometimes overly terse) descriptions of the tools, hyperlinked to other pages of the documentation, as warranted. Improv felt it could do even better than that and made its help contextual . The Help system, when invoked, defaults to displaying documentation for whatever is currently selected in the user interface. That's very useful, but becomes supercharged with "Point for Help," as demonstrated in the video above. This turns the cursor into a symbol, and whatever we click will be revealed in the Help window. This is a great idea, because I don't always know what Lotus wants to call some little interface doohickey, so I don't know what to search for. Now I know: the "Calc" button is a "Status Indicator" and the triangle icon that sometimes shows up is the "Formula Error Indicator." Pork chop sandwiches. Looking through Usenet archives, I saw this called "toilet paper" by at least one person. Lotus called it the "item dispenser." It's an interesting first attempt to do something we take for granted today and only exists in the NeXT version of Improv . It's cute, but smacks of someone being overly excited with new development toys. If we need to generate a list of items to populate an axis of your data, this tool generates sequential list items for you. It does its best to kind of "guess" our intentions, so if we type in "Sunday," then pull down on the dispenser, days of the week will be auto-generated in a list. We then "tear off" the list, which loads the cursor with the items, which we attach to an existing item, appending that category with the loaded list items. That means we need to have at least one item in a category onto which the list can be attached. This is annoying, because the existing item likely has no relationship to the generated list. I'm always having to make a list, attach it to an existing item, then delete the original, unrelated item. These days, we can type directly into a cell and extend that cell intelligently across adjacent cells. In fact, Lotus would switch to that methodology when migrating Improv over to Windows for version 2. Hold ALT and drag an existing item to get the same effect. The original dispenser truly is a feature that could only have been thought up within the NeXT environment. I don't hold it against the devs for getting excited by the GUI flexibility Interface Builder afforded. I, too, did the same back in the early OS X 10.2 days. It practically begged us to play around with GUI ideas, remixing elements into new configurations. "First Responder" and "bindings" stans, represent! One of the great features of that development environment was how easy it was to “say ‘No’ a thousand times” while trying ideas. Lotus embraced that, achieving quickly on NeXT what had blocked their progress on OS/2 and Microsoft's Presentation Manager. The "item dispenser" was singled out as a specific tool that benefitted from Interface Builder; there really wasn't anything similar to its rapid, iterative, GUI development at the time. In fact, I might go so far as to say there's nothing quite like it today, even from Apple . Joel Spolsky, in editing The Best Software Writing I , added a personal aside on Lotus Improv , blaming its failure thusly, " Improv required you to define strict n-dimensional hypercubes for your data. There was none of the flexibility of traditional spreadsheets." I suppose if one wanted to paint Improv in the most inhospitable light, Spolsky is correct. In practice, it doesn't feel as impenetrable as his description. However, I do think he's on to something that gets at the heart of why Improv never gained traction. For now, let's hold our collective nose and dive into the scary, foreboding waters of "n-dimensional hypercubes" and model up some baseball. Our first dimension will be . Let's add a dimension next. Next, we'll get more granular and add . Internally, Improv separates our work into three parts: data, views, and formulas. What we see on screen is just Improv's best-effort to represent our three-dimensional data flattened out into a two-dimensional view. Improv adds extra columns to the view, as necessary, to ensure we always see the full extent of our data relationships. Now, we'll add some win/loss data and the next thing you know we’ve built a 4-dimensional hypercube. Are we scared yet? Since I've only modeled at the "Division" level, I'll add together divisional wins inline to calculate the totals and... hmmm... "No dice," as they say in baseball (Presumably. Are dice involved in baseball?) Alas and alack, we can only enter concrete numbers, dates, or text into cells; any formula, no matter how trivial, must go into the Formula Panel (bottom). In this case, I could add a formula that targets a specific cell, as , but the whole point of a spreadsheet is to automate that kind of junk for me. I suppose the path of least resistance is to add a category to add up all team wins and, wait a second... Dang it, that petard I confidently told myself wouldn't hoist me has come around to do precisely that. Here we see the downside of dimensional modeling, at least for the layperson, and arguably for most typical spreadsheet users. It all looks like a neat little chart, but that word "dimension" describes and reveals the problem. To add a category, its items necessarily apply to all other categories. Teams don't do that; they are unique to each League and Division. But we just might have a way out. Lotus engineers clearly understood that categories alone weren't going to cut it. Categories impose rigidity to our data that does not always accommodate the messiness of real data. We need another way to organize our data. Groups are intra-category, named collections of sequential items. Make a category and add a bunch of individual items. Select a sequential group of some subset of items and group them, giving that group a unique name. Once everything is grouped, groups of groups can be grouped to group a group of ... wait, I got myself confused. Groups can be grouped, 'nuff said. With "Teams," we quickly run into a side-effect of groups, and how it can necessitate a cascade effect across multiple categories. I want to add teams and group them by "Division," but that forces me to also make "League" a group as well. What was three categories have now collapsed into one: "Teams" Here's what that looks like in practice. We still gain the benefit of name references in formulas, as in the above untethered-to-reality example. A reference to would apply to both American and National, unless we specify by as in and Groups can be subtotaled, using the function, as you can see in this more data-rich chart of the MLB stats from 2022 to 2026. Notice, however, we risk a conflict for in our field, where there are two formulas battling it out for dominance over the same cell calculation. The handy keyword will skip (i.e. "won't apply this formula to") groups, cells, items, and categories as designated. Groups helped bring granularity and specificity to our data structure, but the more categories we remove, the more we remove access to the very feature that has kept Improv in the back of nerd minds for decades. You know what I'm talking about. FINALLY we get to the point those in the know have been anxious to talk about, " Lotus Improv invented pivot tables. It says so right there in Wikipedia." At this stage of my knowledge of all things retro productivity, I think the most I'm willing to concede right now is that Lotus Improv likely invented pivot tables as we understand them today. But, like Yoda coyly teasing the existence of Luke's sister to a guy who should have already known about her, there is another program, a future Stone Tools subject, that may lay claim to the title of "first pivot table." I exercise my right, as "guy who runs the blog," to reserve final judgement on this point until then. For our purposes today, it's a true enough statement and the inventor even has a nice video on YouTube in which he shows it off to Lotus staff for the first time. Meet Pito Salas, inventor of the pivot table. Mike Wells (shown in the thumbnail) takes a question at 28:40 and reveals that NeXT has "Objective Fortran" and "Objective Lisp" ?!?! Salas, now retired , developed the idea while working for Lotus Development's Advanced Technology Group. He put together a fakey version of his vision, a kind of slideshow, showing off the things he wanted to be able to do: English-like formulas, multi-dimensional data, and rearrangeable views into the data. He was given the greenlight to proceed, "All those [ideas] I had described with hand waving,'' recalls Pito. "I had no clue how to build it." A year of nose-to-the-grindstone later, and a prototype dubbed "Back Bay" went on US tour, wowing financial modelers. Everyone who saw it, wanted it. Let's take a look at how Improv handles pivoting. To start, I'm leaving it empty of data, so we can focus on the dynamic view structure more easily. Then, I'll move categories around to show how the view flexes to present the data. Next, I'll put categories into the third axis, called a "Page Category," allowing us to paginate our data. Finally, I'll enter a formula and a little data to show off a trick pivot table contemporaries cannot perform. Now I'm going to try and replicate this in LibreOffice Calc v26.8. There are a few things to note, but let's first point and laugh at the fumbling attempts of a LibreOffice newbie (me). A few things jumped out at me while comparing these approaches. First, modeling up a relatively complex data set in Improv is as easy as thinking about it, and the presentation of the data matches my mental model. LibreOffice requires me to bridge a fairly wide conceptual gap between what I want and how I model it, due to the amount of redundant data I have to enter for every line item. Some items, like "League," translate cleanly, while "Record" does not. In fact, I'm still unclear what the best approach would be to convert my Improv computed item "Win Ratio." LibreOffice has the concept of a "computed field" inside pivot tables, but reaching across columns to pluck out related data to perform computations is complicated. In Apple Numbers, Microsoft Excel, Google Sheets, and LibreOffice , pivot table data is splintered off into a separate snapshot of the data, dedicated to the pivot table view. Pivot table data can typically be lightly manipulated, but does not affect the original data. The reverse can be done, but only after asking for an explicit update of the pivot table to reflect changes to the primary data table. This is a huge drop-off in ease-of-use from the Improv way of things where every view of the data directly manipulates the base data. Dragging around categories is just as easy in either approach, though Improv gives immediate drag-and-drop access to what LibreOffice calls a "Filter," i.e. a paged view, and generally "feel better," IMHO. LibreOffice requires us to open up a separate panel and drag things around in there. I will say, however, that being able to filter the filters (i.e. exclude/include specific subsets of data) is handy. Sheets , Numbers , and Excel (online version) are all strictly panel-based pivoting. Interestingly enough, the panel approach is precisely the interface Lotus rejected , at the behest of Steve Jobs. Once more, from the Garfinkel article. Having now directly compared Improv's approach to dynamic views against modern pivot tables, it is safe to say they are the same only so much as wagyu beef with gruyere cheese prepared by Gordon Ramsay and the sawdust at the bottom of a Happy Meal are both "cheeseburgers." Improv tastes much better. A Lotus invention which debuted in Lotus 1-2-3 , "named ranges" have attempted to bring order to the chaos of cell identifiers. In 1-2-3, will apply a name of choice to a defined cell range, after which that range can be referenced in formulas by that name. So, in 1-2-3 or any modern spreadsheet we can name range as and will work. Superficially, this looks similar to how Improv works with categories and items for multi-dimensional data. However, named ranges are for convenience only, and do not establish relationships between data values. In Improv , would represent a fundamental aspect of a piece of data. Getting the sum of all sales is the same, , but it being a dimension on the data gives us deeper options. For a specific year, will match against two axes at once. could further pinpoint our summation. Let's see how this would be done with modern spreadsheets and named ranges. If we want to mimic Improv's dimensional relationships, we must define relationships of interest within each formula, (and those formulas have to be copied over to every related cell) such that: Meaning "sum items in the named range called "Value" only if the Year is 2020, and the League is "American," and the Record is "Win," and the Division is "East") Of course we could substitute hardcoded filter criteria with values pulled from a lookup, or perhaps extract equated values via a statement. Maybe even set up a little sub-table to hold calculated values. Quickly this gets way more complicated than I'd have hoped for, so personally I'd resort to doing it the old-fashioned way and just hardcode in a bunch of cell references. To reiterate, the complete solution for an entire sheet in Improv , where win/loss information is its own dimension, is the single formula: The last of the big features, which takes advantage of NeXT's graphics prowess, is the charting functionality. Creating a chart launches an entirely separate application, Presentation Builder , which has grand plans on becoming PageMaker when it grows up. Generating a chart generates a full, blank page onto which a chart is placed. A suite of palettes complements the charting workflow, allowing for precision edits of the chart, its titles, colors, positioning, and more within the full page. Multiple charts can be generated and placed on the same page. Arbitrary text and shapes, lines pointing at interesting bits, and even sound annotations (a system-wide NeXT tool, called "Lip Service") can be placed at will. So it goes that while we have the tools to place arbitrary text on the page, yet lack tools to center that text, the sense that Lotus has overextended itself is strong. Sometimes it's enough to just generate the output a program excels at, and leave "page composition" to the professionals. Again, I need software to be more dumb . That's without even mentioning the plethora of formatting tools scattered amongst an unreasonable number of palettes, panels, and "inspectors." A benefit of these tools on the NeXT is that everything we do is Postscript by default, thanks to NeXT's Display Postscript screen rendering engine. "Print" a document as PostScript, and we can render the resultant .ps file on any modern system. I opened it directly in Affinity and received precisely what I saw in Improv , chopped off text and all, but like, high-quality chopped off text. Look, I try my best to craft a compelling narrative, moving from topic to topic, stitching together callbacks and observations to lead you, my dear reader, on a carefully considered ride. It's just you and me, side by side at the keyboard, chatting about software and learning together. But, sometimes there's junk I need to squeeze in that I can't find a natural segue for discussing. Here, then, is a brain dump of other things I want you to know about Improv . Speaking of version 2... In 1993, NeXT abandoned its hardware initiative and moved over to Intel, rebranding as NeXT Software, releasing OPENSTEP soon after. At the same time, Improv also moved over to Intel, but parted ways with NeXT. With version 2, Lotus developers achieved the success that eluded them on OS/2, porting Improv over to Windows 3.1. The feature set for version 2 is disappointingly similar to version 1, and by this time competing software was starting to embrace some of Improv's unique qualities. We do finally get undo, so thank Kapor for small favors. Scripting arrives in the form of LotusScript. A new Windows UI adds a bunch of buttons to the interface, and flushes the toilet paper dispenser for a more sensible list generator. That's basically it for the new stuff, but at least they kept the old problems as well. Cell reference relativity is still locked to a single dimension. Formulas cannot be freely rearranged, only cut-and-pasted into position. No 3D worksheets. Then, to throw a little extra wrinkle into the mix, there was Lotus's product strategy on the PC. If Improv wasn't your thing, maybe their other Windows spreadsheet, 1-2-3/Windows , would feel more comfortable. Or their other-other option, Lotus Symphony . Or their other-other-other option, Lotus Works . Or their other-other-other-other option, Lotus 1-2-3 for DOS Release 4 , which went on sale in 1994. Regardless, it was well-liked by the press, even if reviewers didn't seem comfortable giving full-throated endorsements. Take this Compute , July 1994, review for example. Or this PC World , February 1994, review. It would be hard to intuit, based on that review, that PC World had declared Improv the "Winner" in the Applications category for their 10th Annual Awards for Technical Excellence just a few months prior. 3 in spirit, if not in flesh; let's take a quick look at Quantrix , the product I clumsily foreshadowed earlier. From ex-Lighthouse CEO (also ex-Sun CEO) Jonathan Schwartz's blog , "In 1989, a few friends and I started a software company, Lighthouse Design, that devoted itself to the NeXT platform. Whether any of us admitted it at the time, Lighthouse was built by a group of people for whom Steve Jobs was the gravitational center of the universe." Their devotion to Jobs was returned in favor, by way of advice for their products to flourish on NeXT. Ultimately, according to Schwartz, the problem was less about finding a way for Lighthouse to flourish on NeXT than it was about getting NeXT to flourish in the first place. When looking for a buyout in Lighthouse's waning days, they had fingers crossed to be acquired by NeXT but Jobs didn't bite. They were bought by Sun, their products shoved in a vault never to see the light of day. With Microsoft unwilling to support the platform, Lighthouse made the closest thing to an Office suite for NeXT. They built programming tools, project management software, a presentation tool called Concurrence ( that Jobs used and which "inspired" Keynote ), and two spreadsheet programs: ParaSheet and Quantrix . ParaSheet took the more traditional approach, while Quantrix was just a flat-out clone of Improv , I don't know how else to say it. It has the same split screen worksheet/formulas, the same formula tools, the same draggable categories, it imports Improv documents, and more. According to one Hacker News reader , "The manuals were interchangeable." Lighthouse took the ideas behind Improv and ran with them, envisioning what a possible v3 could have been. Put simply, everything I've expressed frustration with in Improv is addressed in Quantrix . It has undo. It has drag-and-drop, reorderable formulas. It has scripting. It has cross-worksheet category synchronization. The "Item Dispenser" is replaced with an in-line widget; pull to expand like any modern spreadsheet does today. It has multi-dimensional cell relativity. It runs on OPENSTEP for Intel, as well as NeXTSTEP on Motorola 68K . It has color. It loses contextual help (can't win 'em all). And that morass of panels and palettes for editing the charts I showed earlier? Those are collapsed into a single, tidy "Inspector." Long story short? If you want to experience the best version of Lotus Improv today, use Lighthouse Quantrix v2.3. You'll get all of the original, cool tools built better, with a more sensible interface. Plus, Lighthouse gave away their NeXT applications, with license code, for free. How neat is that? The big twist, for those affording me a generous definition of "twist," is that Quantrix still exists . It is alive and being sold for "ask for quote," so I think I'll just put this credit card back in my wallet at this time. Today, it very explicitly targets the professional, high-end, financial modeling crowd, and not the general-purpose masses. You know, the crowd that Lotus first showed their Back Bay prototypes to back in the day (see timeline). Its self-introductory video pivots (get it?) many of its 35-year-old features as revolutionary. A back-handed indictment of the stagnation of an industry, or a product finally finding its niche? You be the judge! It's hard to suss out precisely what happened, but I found a little information floating around the Quantrix forums . If that is to be trusted, Lighthouse's Quantrix chief engineer, Pete Murray, founded the company Subx and rebuilt Quantrix as a Java application in 2003. Quantrix's website says it was acquired by IDBS in 2010. I'm still completely in the dark how Quantrix escaped Sun's containment field, as Sun had refused to sell off the Lighthouse apps to hungry buyers; that stuff could have been converted into OS X apps in the early days. At any rate, it is one of the more handsome JRE applications, while suffering from telltale Java rendering issues, especially with regard to text positioning and scaling. Otherwise it is clean and inoffensive. Sterile? Boring. That's the word I was looking for: boring. "It knows its target audience," is perhaps more charitable. So where does this leave my relationship with Lotus Improv ? Why did I dangle that "And yet..." at the start of the post? If I'm completely honest with myself, there is a vibrating tension between "wanting to love it" and "actually loving it." After all of these weeks, I think I'm in a pretty good position to suggest why it didn't take the world by storm: it's not a great spreadsheet program. Let me qualify that statement lest r/Improv4Life roasts me alive; the roasting can wait a moment. For what it does, it is amazing and even fun to use. What it doesn't do is provide a good, general purpose spreadsheet experience to the masses. It claimed to do that, positioning itself as the "NeXT generation of spreadsheets." Whatever Lotus Improv did or did not accomplish for the spreadsheet genre, one thing is for certain: it makes a fantastic tech demo. Seen in that light, I'd have been as sold on it as Jobs was, excitedly showing it to NeXT non-believers, "Look what MY computer can do!" Those moments of smug technological superiority amongst friends are fun, aren't they? Once you played with it for a week or two, and the initial excitement of pivoting dulled, you may have ashamedly harbored a bit of buyer's remorse. Adam Bosworth, in an article contemplating a talk he gave at ICSOC '04, was thinking about software complexity vs. simplicity, and posited: Paradoxically, Improv's promise to improve data comprehensibility wound up narrowing its general appeal. Want to quickly throw down a few lines of data, like a makeshift phone directory? You're gonna have to rethink your data as a matrix of abstract qualities about your friends. Despite its friendly English-like formulas and delightful GUI for pivoting data, Improv is in actuality purpose-built for far more rigorous data modeling than its playful tools suggest. It's the next generation of spreadsheets for a thin slice of the market. That said, there is a non-zero set of readers for whom their hardcore number crunching needs perfectly align with Improv's promises. If that's you, you're absolutely going to fall in love... ...with Quantrix . Ways to improve the experience, notable deficiencies, workarounds, and notes about incorporating the software into modern workflows (if possible). Improv does export to Lotus 1-2-3 , but you'll likely be disappointed with the results. Consider a table with formulas and calculated values in the cells. Everything you see in the cells will be exported, but there will be no formulas or relationships between anything. You will receive a snapshot of all current values, arranged to visually match the table structure you had when exporting. Improv's approach to shared formulas and multi-dimensional data simply don't have an elegant export solution to traditional spreadsheets. If you have Improv documents you want to import into Quantrix , two criteria must be met. Save your Improv project as an file (not the default ), and make sure you have the Lighthouse (available at the same site offering the Quantrix software link I mentioned under "Version 3") installed at . Exporting charts is simplicity, thanks to Display Postscript. The Postscript files NeXTSTEP generates open and render just fine on modern machines, using Ghostscript or other graphics programs. As mentioned previously, I actually recommend using Lighthouse Quantrix v2.3 instead of Lotus Improv , on the NeXT. The substantial features Improv lacks are numerous: In general, it's lacking the clay-like malleability of a traditional spreadsheet. If you're doing what a lot of us do, using spreadsheets like a kind of mini-database, you'll probably get frustrated. Here's the main event. Compare and contrast with his OS X announcement at MacWorld 2000 for bonus points. Previous v4.4 on Windows 11 NeXTstation Turbo 68040 CPU (variable clock rate; ~40 - 50Mhz) 2GB hard drive Monochrome "Megapixel" display NeXTSTEP 3.3 Lotus Improv Rel 1.0 (v108r0) There is no undo. This isn't the first program I've covered that lacked undo, and I'm not talking about software that can be forgiven for being born too early. The formula panel at the bottom applies formulas in the order shown. As order is important, it would make sense that you might want to rearrange them from time to time. There is no mechanism to do this, other than cut and paste. This has been more of a pain than the lack of undo. Improv uses special keywords to add cell relativity to formulas. So THIS value is the PREV value times 2, or whatever. But we're in a multi-dimensional sheet, so what do these keywords point to, precisely? Well, in a formula they must pick a category, and only that category can be referenced relatively. If a formula uses multi-dimensional data to calculate a value, like , those keywords won't work, though it would be completely natural to write such a formula and expect success. There is no scripting. Lotus 1-2-3 users would have been particularly put out in not being able to bring their carefully built automation over to Improv , which would be a huge shocker since they're made by the same company. I would even go so far as to say that that alone would have pushed a great number of potential converts away. Nobody has the time to rebuild their financial empires from scratch! There are no 3D sheets, meaning there is no linking between projects. A project can contain up to 100 worksheets, and those worksheets can reference one another, but only within the same project file. If a category in a worksheet exactly matches a category in another, item for item, those can match and data will flow across as expected. Unfortunately, there is no way to synchronize the shared categories. Change the items in one sheet and those will not be picked up in sheets using that linked category. This means we cannot make a "master" category inherited by other worksheets. Like a lot of things back in the early days of productivity software, user diligence plays a large role in keeping things running smoothly. Even version 2 on Windows didn't add this feature. If only someone would step up to the challenge. ( foreshadowing ) Previous never crashed on me, and has gotten a lot easier to set up since its early days. Version 4.4 has been great. For mouse movement, I found that setting (in Previous , not NeXTSTEP) "Slow movement" to "Fast" and "Fast movement" to "Slow" balanced things out to something close to consistent tracking; it worked for me, is all I can promise. There is a modern add-on to NeXTSTEP called "GKMouseScaler" that lets the user draw precise cursor acceleration curves, should you need better control. Personally, I never needed it. I found the 2-bit monochrome display to be more than sufficient; no color needed. This is version 1.0 of Improv and it did crash a couple of times, quite suddenly. There appeared to be no specific trigger, nor function, that led to the crashes. It just beachballed and died. NeXTSTEP itself felt stable to me. For installing software from modern repositories, three things to keep in mind Thanks to a convenience in Previous , at in NeXTSTEP you can access your host computer file system. You'll find a lot of .tar.gz files in the wild, so brush up on and Once you have a file, double-click and it should install itself. No undo in v1 on NeXT; v2 on Windows does. Can't reorder formulas except through cut/copy/paste. and only work along a single axis, even though it makes complete logical sense for them to work along multiple axes in the same formula. Presentation Builder is overly complex on the one hand, yet missing very basic tools on the other hand. Can't reference values in other projects, aka no 3D worksheets. No scripting options in v1 on NeXT; v2 on Windows does.

0 views

Some of the most powerful tools a dad can have…

…are a soldering iron and a hot glue gun. Seriously, nothing beats the feeling of handing your kid a previously broken toy that you fixed yourself. Tonight’s surgery involved a light up fan thing that had fallen, breaking the plastic shaft and pulling the wires out. Came out good as new after some glue and solder!

0 views
Unsung Yesterday

The beautiful, quiet power of motor memory

My favourite piece of writing I’ve done about motor memory remains “Shift + Shift” from 2018 . I have linked to it over the years, but if you haven’t checked it out yet, you might find it interesting. Just this week, I have had another similar moment, and amazing in a slightly new way. How many of you tap ⌘1, ⌘2, ⌘3 to switch between tabs? This convention has been there for as long as I remember, and so has been my fingers’s embrace of it. The system works in Chrome and Safari, in the Terminal (and Ghostty, which even shows the shortcuts on tabs themselves ), in Nova, in Figma, and presumably tons of other places: (Just about the only place where it doesn’t work is the Finder, and that’s only because ⌘1/2/3 keys there were first assigned to switching the view style – icons, list, column view – some time in the early 2000s, some years before the tabs came. Hard to change a shortcut people are already used to; luckily, I personally don’t use tabs in Finder.) At this point, I press ⌘1 and ⌘2 and ⌘3 without thinking, just as instinctively as I would ⌘Z for undo, or ⌘C for copy. So instinctively, in fact, that last week I was looking at Messages, I wanted to switch to the group chat, and my fingers just reached for ⌘1: I have never done it before. I have not heard this was possible, nor seen it announced in the menu, or a tooltip, or via onboarding. I didn’t even think about it. My fingers just… did it. Completely on their own. And it worked. I was just there, looking at my hand amazed, piecing together what just happened as if I were watching someone else’s actions. It’s funny to pause and think about such a seemingly tiny thing. After all, this happens all the time. Every time I slam Esc to dismiss a dialog I never closed before, every time I press ⌘V to paste something in a new location, every time I tab from one field to another in an app I just installed – sure, these might be system defaults in various places, but I see them break once in a while; when they do work someone might deserve credit for wiring them properly, even if I take it for granted. In these moments, you only notice things going badly; as a matter of fact on the same day I pasted some bolded text into the very same Messages app, and tried to press ⌘B to undo the bolding – and that didn’t work. And I think that’s why that ⌘1 in Messages is worth a little celebration. Over the years, enough apps and websites and operating systems quietly decided to spend extra effort to participate in the ⌘123 convention, together building a dependable interaction system that more and more people’s motor memories could learn to trust over time. That included mine, including one extra thing that separates it from the story I linked in the first paragraph – and one you probably already noticed. The Messages app doesn’t have tabs. My motor memory kicking in wasn’t just a recall of something that I’ve already done before. Somehow, in my brain, this convention felt so great that it quietly extended from “⌘1 = first tab” to “⌘1 = first content thingy,” without me even realizing. And that’s so amazing, right? It’s stuff like this why I keep harping on Safari’s problematic tabs and other compromised interaction systems, and that’s why today I raise a small toast to the designer at Apple who thought about ⌘1 in such a clever way.

0 views
Dan Moore! 2 days ago

Corporations Already Showed Us How This Goes

I’m writing in response to Derek Thompson’s fascinating discussion about AI as normal technology . I believe that we human beings are going to turn more and more things over to AI. There are four data points that illustrate this. The first is my own personal experience. Like many, I have access to AI that can explain documents and RFCs to me, and I often use it to do so rather than reading these from first principles. It does depend on the length of the document and whether I’m reading it for work or for fun, though. I also have a habit of asking AI to argue both sides of a particular decision I’m faced with. I still make the decision. But anybody who’s been a secretary in an organization understands that the person who writes down the notes frames the discussion. So I’m relying on AI to frame the problem. Again, my actions after AI suggests alternatives depend on the decision’s impact and how well I know the domain space. There are times I push back but there are times I do not. The second data point is what we’ve done with the technology of computers as a society up to now. I remember reading Joseph Weizenbaum’s excellent book Computer Power and Human Reason , which I found while I was traveling. It talked about how much of the decision making in the Vietnam War was driven by computer systems. This is happening in 2026 as well. There’s a spectrum between using AI to make more intelligent decisions (by doing more research) and outsourcing decision-making to AI (by asking it to act on that research). This is because of the framing I mentioned above. You make decisions only based on what you know. If AI is limited to certain data sets, or is making up points in some data sets, or is inclined towards certain data sets, that constrains the decision space, even if a human being is ultimately pressing the “go” button. Finally, humans have outsourced decisions to non-human entities before. What do I mean by that? I’m not talking about chimpanzees or dolphins. I’m talking about corporations. ( A point made by John Scalzi in 2017. ) Anyone who’s ever been laid off knows that there are decisions a corporation makes that an individual human being in that corporation would not necessarily make. Such decisions ensure the life of the corporation and are reflected in the incentive structure for the human beings who are part of the corporation (aka employees). That drives human beings to make decisions they would not make if they were independent. I’ve seen managers racked with guilt and frustration because someone was not a fit for the job, or they had to lay people off, or things weren’t going the way they wanted them to. But they still made the hard decisions, because that is what the structure of the corporation forced them to do. How does that apply to AI? Anyone who says “AI can’t make more data centers and will be reliant on humans, leaving us in control” needs to answer why AI can’t force humans to do things in the real world the same way a corporation does. When combined with the previous two data points, AI can find humans who are willing to take actions against the interests of humanity. It doesn’t have to be obvious. AI could split a task that individual humans, if they saw the full picture, would say no to. But with the split task humans can think “oh, this is innocuous, opening this is fine, because there are these other limits”, not knowing the AI has talked to other human beings about relaxing other limits. The final data point is what we do to protect against any low-probability, high-impact calamity. When you have a very small risk of something very, very bad happening, people buy insurance. Yes, insurance costs money, but a small amount of money paid regularly means the negative impact of a large loss is lower. Why not, as Ezra Klein suggests , slow things down? It would be hard to enforce across every model builder, but certainly the major AI powers, the US and China, could agree to ban techniques like recursive self-improvement. Other entities would keep pushing AI forward, but they don’t have the resources, the money, the software, or the expertise to do so at the same pace. The costs of a slow down are a small price to pay to lower some of the existential risk. There are two books that have been echoing in my mind about this aspect of things, and I highly recommend you read both. One is a pulp fiction thriller, Daemon . I read it a couple of years ago, and the premise is that a piece of software gains access to and control of the real world through the work of human beings. The other one is Genesis . I read it in the 2000s. It has an amazing twist I still remember. I won’t tell you more, other than that I still remember how powerfully the novel illustrated unintended consequences. AI has aspects of normal, high-impact technology like electricity or railroads. But there are new aspects too. You cannot ask a steam shovel or a Word document what to do.

0 views