Latest Posts (20 found)

Knife Sharpening

I’ve got a basic block of Zwilling J.A. Henckels knives. They are fine? Or were they when I got them? They got dull. I bought the HORL®3 knife sharpener to bring them back to life. It absolutely didn’t work after really committing to trying to get it to. Note how I’m not even going to link to HORL®3; that’s how much I don’t recommend that thing. I took them to one of those knife-sharpening vans that parks once a week at my local grocery store. Cost me $25 (with tip) to do 4 knives. Seems fine. Are they back to amazing?! You ask. No , they are not. They are a little better. But for the time/effort/money of taking them to a professional knife sharpener, the return just isn’t there. Why aren’t they sharper than 15-year cheddar? Do the knives just suck? Were they too far gone? Is the knife-sharpening guy just not very good? I honestly don’t know. I do know that I have a (fairly cheap) little knife-and-cutting-board set from REI in my van. I don’t use those knives nearly as much. They are super sharp. They are sharper than your mother’s tongue.

0 views

Removing the fancy button

My blog is standard.site ready but I’m pausing full integration for now. I desperately wanted the fancy button but after its novelty wore off I’ve accepted the truth. The Bluesky button is bad UX. This has been widely complained about from day one. The problem is obvious for Bluesky users. Clicking the fancy “View publication” button opens the homepage and not the actual article. This subverts the UI design pattern for ‘card’ components which is long established, evident by unhappy feedback. I keep clicking the button myself despite knowing better. I’ve seen Bluesky posts from Bluesky people suggesting this will change. It was a design assumption for v1 that turned out to be … less than correct. We’re hard at work on v2. @jimray.bsky.team It sure is taking a while! Ideally they’d benefit by pushing a quick fix for this alone. Maybe that’s not feasible for a project like Bluesky. It’s frustrating because it gives standard.site a bad smell that’ll be hard to shake off. The easiest way to temporarily remove the button is to remove the element. This is the one for individual pages. If I share my homepage I still get a button which uses the variation. Unfortunately removing the metadata means my website is now not fully standard.site compliant. Although I am still publishing atproto records. It’s possible Bluesky’s metadata extractor can be identified server-side and I could dynamically strip the element by user agent. I’m hosted on Bunny CDN so my only option would be to use a JavaScript worker. Bunny’s “edge scripting” add tens of milliseconds of latency to every page request which I’m not willing to entertain. Let’s hope Bluesky fixes this soon because I reckon there’s something to atproto and standard.site . It may be yet another standard ( obligatory link ) but spicy JSON has a certain quality that holds my interest. Thanks for reading! Follow me on Mastodon and Bluesky . Subscribe to my Blog and Notes or Combined feeds.

0 views

How I Develop Pure Commons Apps

A couple 1 of people have asked what my process is for developing the various Pure Commons apps . This comes after I've mentioned a couple of times that I've released a feature I've been working on for months . So I thought I'd write a quick post that explains how I do it, so I can refer people to it if/when they ask in the future. I also find this kind of post interesting, so I'm hoping you do too. If not, feel free to skip this one. 🙃 Git is a staple in my development workflow, so you'd think I'd use it the same way most other developers do, but I don't. You see dear reader, I'm a visual learner, so branches in Git are confusing to me as they're abstracted away inside the folder. This means I often forget which branch I'm on. Which in turn has led to all kinds of issues over the years when it comes to committing shit to the wrong branch. So instead I simply copy and paste the entire repo (less the folder) into a new subfolder and use that as a "branch". Then, when I want to work on a feature, I go into that subfolder and work away, knowing it's completely separate from the core production code. My " branches " look something like this: I always prefix my branch folders with so they're always at the start of my folder tree and easy to see. Switching branches is then just a simple away and I can easily see which one I'm in from the command prompt. And since there's no folder in the branch, I can't accidentally mess things up by merging back to (or any other branch) accidentally. Almost idiot Kev proof! I've created a local Python tool called 2 which manages all things Pure . With it, I can do things like pull or push to/from remote for this website, update if there's a new version released, create releases, run local tests, create branches etc. So if I want to create a new branch, all I need to do is run: It will then ask me for the branch name, so I enter something like and it will automagically create a new folder called and copy the latest version of Pure Blog into that folder, excluding . This is where things get interesting. If I'm working on multiple branches at the same time, merging back can be... interesting as I can't use the command, since I'm not using Git for branches. But that's fine, I actually prefer it this way as I have more control. Merging back to requires me to do a side-by-side comparison of any files I've changes on that branch, so I have to review everything before manually while merging in changes. This is definitely not the most efficient way of developing software, but it works for me. So there you go, that's my approach to developing the Pure Commons apps. I think it's somewhat scalable for a single person project, such as Pure Commons . If I were working in a team this approach would fall apart quickly though. Lucky I have no friends, ey! I'm not a professional software developer, and I think that's clear from the way I manage all this. But this system has been working well for me, and is far less abstract for my monkey brain than Git's native branch handling. What can I say, I'm a Luddite. 🤷🏻‍♂️ Literally 2 people, but that's enough to warrant a post, right?  ↩ Short for "Pure Control".  ↩ Thanks for reading this post via RSS. RSS is ace, and so are you. ❤️ You can reply to this post by email , or leave a comment . Literally 2 people, but that's enough to warrant a post, right?  ↩ Short for "Pure Control".  ↩

0 views

Every package is already installed

tl;dr; omnibin is a FUSE filesystem that puts every binary nixpkgs ever shipped on your . Nothing is installed. Nothing needs building. 0 bytes on disk until something actually reads a file. 😈 It’s 2026, why am I still installing packages individually? 1 Why must I go through the ritual of adding a package to my , running or succumb to the hellscape of . Nix gives us the power of having packages installed side-by-side without conflict. Why do I have to pick which ones I want to install? Why can’t I just have them all? What if the machine just had all of them? That is over fifty thousand 2 top-level binaries available on my , from 2013 to 2026 built by Nixpkgs , available on-demand, without installing anything. This is the magic 🧙‍♂️ of Nix , but it’s not restricted to Nix. Everyone seems to still love Docker and OCI , why am I still picking which base image to use? Why can’t I just have them all? Is this the ultimate agent harness? It’s a container with everything in it, right from the start. Try it at fmzakari/omnibin . Of course, I cannot forget our NixOS friends. You no longer have to curate your or , you can just have them all. What is “package management” if every package is already installed? Turns out that Hydra writes a file next to every single narinfo on cache.nixos.org that describes the contents of the archive as JSON: That metadata turns out to be the perfect index for a FUSE filesystem that can lazily fetch the NARs from the cache and unpack them on-demand. 🤓 None of this would mean anything without nixpkgs-multiverse , which already resolves any in nixpkgs history to the store path Hydra built for it on cache.nixos.org . When you combine the two, you get a filesystem that can answer the question “where is ” and then fetch it from the cache and unpack it for you, all without ever having to install it. I crawled all of it the files in under twelve minutes. 🤯 Once you have that, the filesystem writes itself: That is CPython 3.6.2, from 2017. That downloaded nothing , it is answered from the pre-crawled index. Agents are “a thing”. Making them useful is a thing. Making them useful without installing anything is a thing. If your agent tried to and stat every single entry, it would have a really bad time. There are 881,933 binaries in the tree, and it would take a long time to stat them all. To help the agents out a bit, lists only the bare names, one per executable, each resolving to the newest package that provides it. The versioned forms all resolve, but they are not listed. For example, resolves to the latest Python 3, which is 3.14.6 at the time of writing, but resolves to the 2017 version. For everything else there is the index, which is sitting right there in the mount: That UX is a little rough, so you can also use the CLI to query the index: Lastly, there is a /omnibin/README.md whose entire job is to tell whatever is exploring the filesystem to stop exploring the filesystem and query the database instead. 🤖 At this point it should be obvious, but you pay for this on startup for the first access. The first run took 2.7 seconds to fetch the NARs and unpack them, the second run was instantaneous because the store paths were already present. Other than that? Not really, which is pretty amazing. For any long-lived machine, you would expect your to already be warmed up with the packages you need, so the first access penalty is not a big deal. I remember one of the first things that blew my mind and sold me on Nix, was seeing a demo by @burke on comma . The capability to test a package, at a single nixpkgs revision, without “installing it”; revolutionary! I believe this to be a spiritual successor and I hope to imbue others with the same sense of wonder and amazement that I felt back then as a beacon of the power of Nix. The repo is at github.com/fzakaria/omnibin . Please responsibly. Yes, I am a little inspired after watching DHH’s keynote at RailsConf 2026 . I feel the same way about package management.  ↩ There are actually 881,933 binaries in the tree, but only lists the latest version of each binary. The versioned forms are still available, but they are not listed.  ↩ Yes, I am a little inspired after watching DHH’s keynote at RailsConf 2026 . I feel the same way about package management.  ↩ There are actually 881,933 binaries in the tree, but only lists the latest version of each binary. The versioned forms are still available, but they are not listed.  ↩

0 views

Hotkeying browser extensions in Ungoogled Chromium

Something I didn’t know existed until this week was the ability to hotkey Chromium extensions so that you have them one keypress away. Two examples for me would be the following: Running no javascript via uBlock origin (you can easily install full uBlock in Ungoogled Chromium via downloading the latest release zip and pointing to it in developer mode in Chromium settings) has been a great experience, turning it on only when sites are entirely borked makes the web far more enjoyable, less distracting, and safer. But, clicking into the extension, hitting the JS button, and reloading the page was a bit annoying - So, Ctrl+Shift+J and I have JS enabled/disabled. Simple. I have also been blocking a ton of distracting sites with LeechBlock NG , but sometimes I need to view >reddit for discussions on a topic I am researching or poast to various social platforms, so Alt+Shift+O opens up the override page where I usually disable the extension for 2 minutes or so, and then go about my day. Navigate on over to , and set the keys for any extensions you run. Although you don’t have full access to all functionality of most extensions, It’s pretty nice for the most used interactions. As always, God bless, and until next time. If you enjoyed this post, consider Supporting my work , Checking out my book , Working with me , or sending me an Email to tell me what you think.

0 views
Unsung Today

“Hey, this isn’t your father’s 737.”

À propos the previous post , wanted to share a 2019 article by Gregory Travis about the two Boeing 737 Max disasters that shook the world in late 2018 and early 2019. It’s titled How the Boeing 737 Max Disaster Looks to a Software Developer , and I found it fascinating, well-written, and filled with great details. = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/hey-this-isnt-your-fathers-737/1.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/hey-this-isnt-your-fathers-737/1.1600w.avif" type="image/avif"> The Max variant of the 737 was redesigned to allow larger, more efficient engines, but this made it less predictable, which the company decided to paper over in software: The airframe, the hardware, should get it right the first time and not need a lot of added bells and whistles to fly predictably. This has been an aviation canon from the day the Wright brothers first flew at Kitty Hawk. Apparently the 737 Max pitched up a bit too much for comfort on power application as well as at already-high angles of attack. It violated that most ancient of aviation canons and probably violated the certification criteria of the U.S. Federal Aviation Administration. But instead of going back to the drawing board and getting the airframe hardware right (more on that below), Boeing relied on something called the “Maneuvering Characteristics Augmentation System,” or MCAS. Boeing’s solution to its hardware problem was software. This feels like an interesting extension to the fly-by-wire story of Air France Flight 447 , where Boeing seemed to be on the other side of the fence to the Airbus. Perhaps no more: […] It seems that with the 737 Max, Boeing has changed philosophies about human/​machine interaction as quietly as they’ve changed their aircraft operating manuals. Travis argues that people building the software did not fully understand the shift, and particularly didn’t really understand how pilots fly the airplane during more challenging moments: Those lines of code were no doubt created by people at the direction of managers. Neither such coders nor their managers are as in touch with the particular culture and mores of the aviation world as much as the people who are down on the factory floor, riveting wings on, designing control yokes, and fitting landing gears. Those people have decades of institutional memory about what has worked in the past and what has not worked. Software people do not. The real reason? Money. MCAS is certainly much less expensive than extensively modifying the airframe to accommodate the larger engines. […] What’s worse, those changes could be extensive enough to require not only that the FAA recertify the 737 but that Boeing build an entirely new aircraft. Now we’re talking real money, both for the manufacturer as well as the manufacturer’s customers. That’s because the major selling point of the 737 Max is that it is just a 737, and any pilot who has flown other 737s can fly a 737 Max without expensive training, without recertification, without another type of rating. Airlines—Southwest is a prominent example—tend to go for one “standard” airplane. They want to have one airplane that all their pilots can fly because that makes both pilots and airplanes fungible, maximizing flexibility and minimizing costs. It all comes down to money, and in this case, MCAS was the way for both Boeing and its customers to keep the money flowing in the right direction. The necessity to insist that the 737 Max was no different in flying characteristics, no different in systems, from any other 737 was the key to the 737 Max’s fleet fungibility. That’s probably also the reason why the documentation about the MCAS system was kept on the down-low. Put in a change with too much visibility, particularly a change to the aircraft’s operating handbook or to pilot training, and someone—probably a pilot—would have piped up and said, “Hey. This doesn’t look like a 737 anymore.” And then the money would flow the wrong way. There are some harsh words toward the entire software industry toward the end. This feels directionally accurate to me, and resonated even before the arrival of generative AI: I believe the relative ease—not to mention the lack of tangible cost—of software updates has created a cultural laziness within the software engineering community. Moreover, because more and more of the hardware that we create is monitored and controlled by software, that cultural laziness is now creeping into hardware engineering—like building airliners. Less thought is now given to getting a design correct and simple up front because it’s so easy to fix what you didn’t get right later.

0 views
ava's blog Yesterday

elizabeth holmes

I remember at some point growing up, I saw Elizabeth Holmes on magazine covers and spread across the internet as the "new Steve Jobs". I was fascinated to finally see a woman in that position; I think the #girlboss era wasn't quite there yet, and I welcomed a role model in spaces that were usually male-dominated. I kinda liked that she seemed very focused on her craft and the tech, while dressing in a more understated, but professional way. Instead of coming across like other "successful" women who always seemed to be overshadowed by a more successful husband, propped up by generational wealth, and visibly wanting to spread the message " Yes, I am a business woman, but I am still a very feminine, fuckable trophy wife! " I could see myself in Elizabeth, because I also had a lower voice (but not as low, and not cartoonishly faked) and wore black turtlenecks. When it came out that Theranos was a huge scam, I was shocked, but also very intrigued. How can people lie that long, and involve so many people in that lie? How did people comply for this long? What role did she play in it? I sucked up as much as I could about it at the time, which initially wasn't as much as it is now, aside from press and YouTube videos covering it. The facts about her person and Theranos' product were clear, as well as the allegations from the article, but nothing else had been established. From the initial reveal to the trial and sentencing was quite a while (reveal in 2015, went to prison in 2023), and the book, podcasts, and documentaries took so long to come out or were partially inaccessible to me. I kind of lost sight of it for a while, especially because of the pandemic. I got into other grifters like Anna Delvey, who also fascinated me by the way she seemingly avoided the usual subtle "checks" we have to detect if someone is real, just by acting like she belonged and making it up as she went. Puzzles me. I have never idealized the crimes these women did, nor do I want to emulate any of it - I just want to understand how something so impossible in my mind was actually pulled off. The audacity, the tower of lies, the house of cards they build, everything. I am obsessed with the way audacity and luck seem to line up just right for these women to support their fantasy/delusion, and how it all falls apart. The announcement of the documentary " You Can See Everything " ( teaser , trailer ) by Nathan Fielder and Lance Oppenheim really rekindled my passion for the Theranos scandal. I haven't gotten my hands on The Inventor yet, but I finally was able to watch The Dropout on Disney+ and listen to Season 2 of the podcast of the same name (which covers the trial), I read Bad Blood by John Carreyrou, the journalist who initially broke the story in the WSJ and then wrote a book about it, and immersed myself back into some YouTube videos like Some of these inevitably cover the same thing at times, but still, CoffeeandCults was basically covering this from day 1 even back then as things developed, and even went through court files and chat messages between Elizabeth and Sunny, and I love the way she does it. So I knew I needed to go back there and catch up on new stuff I had missed. What fascinates me about her now is to continuously find more crumbs that settle the question whether she knowingly lied, or whether she really believes it. At this point, it seems she really does believe it, even after all this time, and after the lengthy trial. She really thinks she was sabotaged, unfairly treated, and put behind bars for no reason. Someone pulling off an insane grift can be scary by itself, but it's less scary to me if they knew they were doing it and were calculated about it (like Sunny was). But the other option is way scarier to me... that you can really give 20 years of your life to the scam, sleep like 4-6h a day and work the rest of it, no life experiences, no friends, all into the company since 19, known no life outside it... and it was all for something that was never real and could have never worked. All the praise you got was ill-gotten. Everything you thought you achieved is gone. And your mind cannot even comprehend that or give that up or see it for what it is because it's so painful and would make this huge chunk of your life just void. You are so delusional and it's all you have left and all you have ever experienced... that's a scary outcome. Makes sense then that she is already admitting she will continue this grift once she gets out; this is all she has ever known and the only goal she has ever had. Theranos and Elizabeth Holmes are the kinda interest of mine I could talk ages about, but only when prompted, only when asked something, or when something new about it comes out or piques my interest. I get no fun out of it if I would just write a Wikipedia article 2.0 about her upbringing or something, so I won't summarize everything here. But what still (or currently) moves me about this case in no particular order is: It's so unbelievable that after all of this, there is no regret, no admission, and the open declaration to do it again. This woman is dangerous. I'm looking forward to the documentary to not only see her extremely concerning and off-putting behavior, but also because apparently 2/3rds of it is dedicated to exposing how messed up Billy also is. They really deserve each other apparently, and she has not learned from Sunny at all. Will definitely write another post once the docu is out on Oct 16. Published 24 Sep, 2026 The Video You Need To See Before The Elizabeth Holmes Doc (recently) A Deep Dive Into The Dangerous Lies, Riches & Narcissism That Built Theranos & Oceangate (recently) The Rise & Downfall of The Ex-Billionaire Felon Elizabeth Holmes (from 4 years ago) Everything You Don’t Know About Elizabeth Holmes (from 3 years ago) The Crazy Things You Don't Know About Elizabeth Holmes & Theranos (from 3 years ago) The Wild Things The Dropout Left Out (from 4 years ago) And an interesting trailer body language analysis by BehavorialArts , will look forward to his full analysis of the documentary This woman doesn't have any degrees. She's not an engineer, she is not a doctor or otherwise an expert in the medical field, and people still believed her. Just dropping out of Stanford after a little over a year or so was enough to give her credence, which is nuts if you think about it. None of the patents her name was on actually had considerable contributions by her. She still cannot grasp what even went wrong. That while her cartridges and all physically worked in the sense that they diluted blood or pushed it around, they were useless for tests. The way you press the blood out of the finger completely ruins potassium tests and others. The volume is too low, or the dilution too high. The fact that she had to use competitor machines to do the tests. The fact that her employees were instructed to fake the validation of the results. Even after the laboratory was so bad it was forcibly closed for 2 years, she still doesn't see why. She created a fake lab with machines lined up just for Joe Biden to visit and see, even though this was never used for testing. Rupert Murdoch and Henry Kissinger were on the board! People were wrongly diagnosed with cancers, HIV, or a supposed miscarriage when they weren't. It led to medication changes, fears and trauma. She was not afraid to trial her non-functioning machines on terminal cancer patients either. She and Sunny abused employees and created an environment of fear at work, and constantly immediately fired people. She had people followed by private investigators, had employees build up dossiers on other employees to be able to blackmail them, had the social media of all employees surveilled, and more. An extreme control freak that has repeatedly threatened to ruin people's lives if they go against her. Ian Gibbons' suicide is her fault and she never even reached out to his wife or apologized; to her, it was just one less person to speak out about her. Her prison sentence doesn't even include a punishment for the patient mistreatment, just the (wire) fraud, as they weren't able to prove it was maliciously/with negligence, because they couldn't get any functioning viable records out of Theranos in that regard. Such a joke honestly. I love Erika Cheung for what she did and how strong she was. She's in the same prison as Ghislaine Maxwell and befriended her. Man, what a collab that will be of women who are sure they did nothing wrong and it was mostly the evil men in their lives (allegedly)... Despite only starting her prison sentence in 2023, she'll move to a halfway house next year. What a joke, right? It's pretty widely accepted that a big reason for having her two children at the time she did was to delay the trial or turn it in her favor by weaponizing motherhood and the kids; hoping to elicit pity and the view that one shouldn't separate her from her children. Pretty sick. She even went to court with those glowing milking machines on her breasts to make that point. Her Twitter account is super active because her new boyfriend Billy is running it. She seems to think (and and says so in her bio) that Billy only posts what she tells him to. But the volume of posts and interactions with others suggest otherwise; she can't even tell Billy to post that much, let alone spend hours every day telling him who or what to respond to. She has no phone or internet in prison. "Her" tweets are also pretty unhinged at times; seems like they aren't afraid to suck up to the MAHA crowd as well. She and said boyfriend are already organizing the new grift, Haemanthus, a company in Billy's name that does virtually the same thing Theranos does and even shares some branding of it, but initially limited to pets this time because that has less regulations. And yes, despite everything, they already managed to raise some money, and he also comes from money. It seems like Elizabeth is only disgraced in the general (poorer) public; for rich people, the problem seems to have been that she let herself get caught. Running schemes like this is seemingly normal in the world of investors, just a slipup, better luck next time. Her not being allowed to be on boards of public companies runs out before her prison sentence even ends, and it doesn't apply to Haemanthus anyway, which is private.

0 views
ava's blog Yesterday

the reduction of intellectual labor

In my first student job, my team was responsible for scanning any incoming bills for the company. A software then detected all the different positions and numbers, and then our job was to verify the text fields and if necessary, correct them manually (a 6 could sometimes become a 0 or 8, etc.) before sending them off to whatever finances/controlling SAP setup they had. So was it very similar to work in the TV Show “Severance”? Yes. I was validating numbers for four hours a day. In my current job, I’ve been doing the work for so long now that everything runs on autopilot. It’s mostly product management necessitating data entry, document management, handling deadlines, sending out autogenerated emails, or using previously approved bits of text. I click buttons and copy in words or slightly edit a template. No intellectual labor needed at this point, really. Everything that actually necessitates it is short-lived, rare, or concluded. It’s what bothers me greatly and is unsatisfying; I wanna use my brain, work on problems, write things, discuss matters with people, analyze and create things myself. Not just as an outlier, but as a core part of the job. What I am currently seeing at my workplace is that even the intellectually demanding jobs requiring expertise opinion here will be reduced to the workslop that I do. That’s their plan. Ideally, instead of writing a report, it will (mostly) be generated by AI. The stuff the report is based on is documents that other companies have created with the help of AI that they submit to us. If we receive a report (which is also likely partially or fully AI generated), we’re gonna have AI summarize it and suggest points to comment. When we comment on the report, AI will pre-generate a text. In meetings, they’ll probably discuss a draft AI generated instead of working together to create that draft. And some people actually push for that and are excited. I think they are misguided and don’t know what they’re actually wishing for. This is abolishing what makes their job interesting, memorable and varied, and they don’t even know yet what else they’d fill their time with. And let’s be real: Almost no workplace will just let you leave early for the same pay as long as the work is done, especially not this one. You’ll be reduced to clicking buttons, copy pasting text, pressing enter, and editing pre-generated text… and waiting. From experience, I can tell you that’s not satisfying at all if you want (or got used to getting) more stimulation from work. It’s not mentally engaging, and how easy and repetitive it all is makes even the easiest task feel like it’s not worth even focusing on. It’s a huge hurdle to get started at all. You sit there for hours needing to waste time. It might be cool the first 1-2 years, but it starts to negatively affect you at some point, especially on office days (and even more so when it’s exclusively on-site with no WFH!). You can see it right now with so many people in IT getting sick of working with AI and feeling disillusioned because all they do is generate and watch. Many people wanna iterate and create by themselves, not be a robot’s manager. I talked to coworkers about it and they just laugh at it. One told me that it’s true that AI will eliminate intellectual labor, but then we can just go do physical labor like painting walls because AI won’t be able to do that. I don’t wanna paint walls for a living! I don’t want us to have went to university for degrees and even doctorates just to waste away at the desk as we autogenerate everything and just observe AI for legal reasons and the option to stop it or readjust it in case something is wrong. I wouldn’t even have any qualifications for the sort of physical labor I’d likely then have to do (though, I wonder sometimes if I should just throw in the towel and start training to become a welder). I am hoping so badly to one day do more intellectual work that necessitates written reports and in-depth analysis or critiques of things, “deep work”, consultations and meetings with experts on the field in the same company or on conferences… being a what’s often referred to as a “knowledge worker”. But now, AI possibly jeopardizes that or at least greatly limits it, maybe decimates it to a few exceptions and opportunities. The actual day-to-day tasks won’t be like I need them to be. I’m simply more academically inclined, yet I was never able to live that. I was never able to live the campus life and fully focus on learning and classes and summer school, labs, exchanges, trips and discussions with peers and professors and all that… and now I can’t give up my full-time job at 30 to do that. I have to do a part-time degree alone at home with none of that and no one else to talk to or bounce ideas off of, no networking, no campus life, can’t even reach the professors. I wonder if I’ll ever get out of this career hole, even after my degree(s). At this point, they seemingly want a university degree for bullshit work like preparing envelopes, generating stupid PowerPoint slides or putting appointments into someone’s Outlook calendar as if that’s what people really got a Bachelor’s for. And now my workplace is on its way to let people with a doctorate press “Enter” all day like they’re sitting on slot machines and call that scientific work because an expert pressed the button and had possession of two eyes to catch any obvious discrepancy. We’ll call it progress when the bots just talk to each other and we only get summaries. Anyone I talk to about this is trying to calm their fears and mine with the idea that either this is still going to take a decade, or that it’s gonna fail because of the quality and hallucinations. Both isn’t helpful for me because I disagree with the pace of progress (or the idea that a simple delay is enough), and I have learned the hard way recently that the people here do not care about quality anymore if it means getting to play with AI and having less work. They are encouraged by leadership to be this way because putting AI into everything and potentially finding cost-cutting options is more important under the guise of “exploration” and “supporting innovation”. They also put too much confidence into their willingness to keep checking the AI output thoroughly every time or their ability to catch plausible sounding hallucinations, so in their eyes, the error rates are easily made up for by their supposed spidey senses. I also see some people say that no one will force you to use AI, but I assume they will at some point, or you at least can’t afford to always take longer than your coworkers who do use it. Not that you’d care about speed or “efficiency”, but your boss probably does. If only it would exclusively take over office workslop like useless emails and calendar management, but no… instead, I look at what’s ahead and office work possibly will instead just become even more monotonous, repetitive and soul-sucking if it all succeeds like planned and the costs and token limits don’t prevent the worst of it. My last hope is the true costs being too high. I recognize that mentally enriching work is a privilege, but I at least need work that doesn’t turn my brain into a depressive pulp. I know, princess-and-the-pea levels of complaining when others on this world die in Cobalt mines and sweatshops, but I can’t help it. The alienation of labor is reaching intense levels, and I’m tired. So much feels like a bullshit job now while I am begging to use my brain. Published 24 Sep, 2026

0 views
Martin Fowler Yesterday

Fragments: September 24

Rob Bowley is “flipping tables in his head” with anger at the current media coverage of the danger of AI killing us all The risk I’m worried about isn’t a future machine deciding to wipe us out. It’s today’s AI, being wired into everything, carelessly and fast. Cyber attacks have already cost millions of dollars in lost economic output, often without AI being involved at all. Bowley feels the push to slow down AI is distracting us from the problems that are lurking with current technology. Too often agents are deployed in situations where they include the Lethal Trifecta , opening up a gaping security hole. What we really need to slow down on is wiring it all up to everything. Not because of what the models might become, but because nobody has worked out how to do this safely yet. We are building on something we don’t know how to contain, and shipping it to everyone while we work it out. ❄                ❄                ❄                ❄                ❄ I ran into Nikita Prokopov’s post: I am sorry, but everyone is getting syntax highlighting wrong . His core complaint is about color themes that give every different code element a unique color. if everything is highlighted, nothing stands out. Your eye adapts and considers it a new norm: everything is bright and shiny, and instead of getting separated, it all blends together. He recommends using an absolute minimum of colors, in his case four: string, constants, comments, and top-level definitions. That’s not far off my approach, where I’m also careful to use muted colors for things that shouldn’t stand out, and bright colors for things that should (primarily function names when they are defined). It’s common for color schemes to mute comments so they are easily skipped. He agrees that this good when there is excessive commenting, but when comments are used properly they are important so need bright highlighting. I also like his suggestion to use background colors for light mode work. I use light mode, and that’s a tip I should try out. With agentic programming, lots of folks are reading more code than ever. Careful use of color can do much to make that easier. ❄                ❄                ❄                ❄                ❄ Like many folks whose remaining hair is getting gray, I’ve been rolling my eyes about all this talk about Forward Deployed Engineers, as much of it involves breathlessly relating what so many of us have been advocating for decades. I did find this recent post by Vinoo Ganesh interesting, as he’s deep in this trend, including a chunk of time at Palantir, who may be patient zero for FDEs. If you know me at all, you’ll not be surprised by my lack of surprise at this observation: A few months ago, a16z launched the Forward Deployed Engineer Fellowship and I was nominated as one of the fellows, alongside a handful of people I used to work with. It’s a great program and I’ve enjoyed so many of the conversations. Last week I went to my first fellow dinner in SF. Around the table were FDEs from Snowflake, Anthropic, and a number of startups I’d been reading about, and over the course of the evening it became clear that we were all using the same two words (forward deployed) to describe jobs that had almost nothing in common. In one part of the conversation an FDE was a sales engineer who joined ‘the second call,’ somewhere else it was a quota-carrying rep who could write Python, and a few seats down it was closer to a consultant with a laptop and a statement of work, brought in to deliver something the product couldn’t. Ganesh goes on to explain his view of what an FDE should do, and it’s all sensible stuff (albeit written with rather more LLM-voice than I would prefer). He says the FDEs job is to understand the business, to “collect nouns and verbs”, which mirrors what the Domain-Driven Design folks have been doing since before Eric wrote the blue book. Despite all my eyeball rolling at this, the FDE meme is pushing for something valuable. Yes, it’s easy for me to remark that it’s nothing more than the Agile Manifesto’s principle that “Business people and developers must work together daily throughout the project”, or the desire to co-locate users and developers which my colleagues have been championing for all of this century. I’ve argued for decades that the biggest issue in software development is the communication between developers and the folks that benefit from software, and thus we need to focus on bridging the yawning crevasse of doom . But despite all this, we haven’t had much success, so I think it’s important that a new generation of pundits try again, with some different framing, names, and slogans. Ganesh’s perspective is not a custom software developer’s point of view, but rather a product - or more strictly - platform team’s. The FDE is a developer who “sits with” their users, applies customizations - but importantly - feeds these changes back to the core platform to decide whether the platform should be enhanced for everyone else. Keeping the customer happy is a real job and a good one. It belongs to solutions architects, who are rightly measured on it. The forward deployed engineer is there to turn what the field teaches into the thing every future customer gets. An FDE engagement that ends with one delighted account and nothing changed upstream has failed at the only thing the role exists for. You got the context and you spent it locally.

0 views
Martin Fowler Yesterday

Healthy Feedback

Human collaboration, like most things, improves with feedback. But it's not obvious how to make feedback effective. Anuja Karnik and Sumeet Gayathri Moghe pass on a bevy of tips for healthy feedback, based on the principle that both praise and criticism should be seen as positive.

0 views

An addiction

“Talk about technology is an addiction, ” writes Joanna Russ. She continues: An addiction is a situation of constantly escalating need—in short, an insatiability. Not only that, but the cause of the escalation is the satisfier of the need. Russ, To Write Like a Woman , page 28 Insatiable seems an apt description for the moment. Doomscrolling is a kind of insatiability, an act that can never complete or resolve. Likewise: talk of so-called AI in terms of its “existential” risk. Russ again: First, the addict is the ideal customer. Second, addiction is a beautiful and effective method of social control. It is especially good at obfuscating and confusing—in political terms, mystifying —what it is the addict really needs. From the point of view of profits, the perfect stimulus is one which satisfies a human need only briefly or partially, and at the same time exacerbates the need. Russ, To Write Like a Woman , page 28 So we talk about about how AI will kill us, and it seems like we’re doing something, but then ever more terrible news emerges and the talk carries on. Meanwhile, all of the potential horrors ascribed to a future AI are in fact real and present today, but have been (are being) enacted by humans. We need not contemplate how an AI could infiltrate an organization and turn it to its own ends when—today—we have chatbots encouraging people to commit suicide . We need not speculate about AI taking all of our jobs when—today!—the same humans peddling AI are also laying people off right and left . We need not prophesy a future in which a rogue AI murders people en masse when— today! —we have humans making the choice to fire missiles at schoolchildren . Talk of a god-like AI that needs to be constrained projects our present fears into a hypothetical future, one that can only be addressed with more talk; meanwhile, we neglect our obligations to name and prosecute war crimes that have already happened. Casting AI as the monster-to-come obfuscates the monsters already in our midst. Hiding grayly behind that sexy rock star, technology, is a much more sinister and powerful figure. It is the entire social system that surrounds us: hence the sense of being at the mercy of an all-encompassing autonomous process that we cannot control. If you add the monster’s location in time (during and after the Industrial Revolution), I think you can see what is being discussed when most people say “technology.” They are politically mystifying a much bigger monster: capitalism in its advanced industrial phase. Russ, To Write Like a Woman , page 36 This is the same point that Hagen Blix and Ingeborg Glimmer will make, fifty years later, in Why We Fear AI . If there is anything novel about the language of AI (and I’m not convinced there is), it’s not the mystification of capitalism or the threat of a power out of our control or the manner in which technology is used to obscure human choices and human agency. It’s that we seem to have forgotten how to talk about anything else. View this post on the web , reply via email , or become a supporter .

0 views

To Write Like a Woman

“[S]o much of what’s presented to us as ‘the real world’ or ‘the way it is’ is so obviously untrue that a great deal of social energy must be mobilized to hide that gross and ghastly fact….Hence my love for science fiction, which analyzes reality by changing it.” In this collection of essays originally published in the 70s and 80s, Joanna Russ turns to what science fiction is , how it works, and how our understanding of the world is either expanded or (in the case of terrible sf) constrained by it. Russ is routinely and delightfully acerbic in her writing, but that is in many ways the point: the world is too often a very sour place. We must speak directly of the devastation around us if we’re to have any hope of knowing it well enough to change it. She was writing at a time when sf was not taken entirely seriously relative to traditional literary criteria; that has changed somewhat in the decades since, but her analysis of how sf works has not penetrated as much as the tropes (space ships, time travel, robot overlords) have. Which is to our shame; but the remedy, close to hand, is to read, and to read as she did—attentive to what the writing is asking of us, and what we must ask of it. View this post on the web , reply via email , or become a supporter .

0 views
Stratechery Yesterday

An Interview with Colossus EIC Jeremy Stern About Profiling Mark Zuckerberg

An interview with Colossus EIC Jeremy Stern about profiling Mark Zuckerberg and other prominent tech figures.

0 views
Unsung Yesterday

“Apple has developed an unexpected workaround.”

= 3x)" srcset="https://unsung.aresluna.org/_media/apple-has-developed-an-unexpected-workaround/1-framed.1600w.avif" type="image/avif"> From The Verge : Apple has developed an unexpected workaround to prevent the iPhone 18 Pro Max from being hit by shipping restrictions on big batteries. There’s a “battery-firmware solution” in place on the new iPhones, according to Apple’s support page , which keeps capacity below the 20Wh limit for single-cell batteries set by international shipping regulations — but this firmware lock automatically removes itself when the device is booted up for the first time. […] If the user needs to send off their phone for repair or resale, the charging limitation can be restored using the “Prepare to Ship” feature, which caps charging to 80 percent for 14 days. This is interesting, and reminds me of a category that should be present on Unsung more often – software fixing the sins of hardware.

0 views
./techtipsy Yesterday

Replacing the battery on a CyberPower UT650EG and UT850EG UPS

Back in 2022, I gave the CyberPower UT650EG a try. At the end, I mentioned: What I’m concerned about is the battery. The specifications say that the battery is not user replaceable. I hope that this is simply something the legal team thought of to avoid any liability when dealing with users who messed this process up. 4 years later, the UT650EG battery does not seem to hold a charge, so it’s time to replace it, for real. At the same time I also decided to do the same for an UT850EG that I got in the second half of 2022. And yes, as the title mentions, you can replace the battery on these UPS-es, but I advise you to take every precaution that you can take: The process is reasonably simple: The power cables coming from the battery may feel stuck, so you will need to use a little bit of carefully applied force to disconnect the cables from the battery terminals. For connecting a new one, ensure the connectors fit snugly and don’t come loose with a little bit of wiggling. The process is the same for both units. The only obvious difference between the two units seems to be the battery. The plastic case supports using both the smaller and larger battery, and as long as you use ones with same voltage and at least the same amperage, you can put anything here that fits. This will have an impact on the battery runtime, but if you’re someone like me and bought the wrong replacement battery for this unit, then this does serve as a bit of a saving grace. With UT850EG, the power cable alignment was slightly trickier with the smaller battery, but workable. To find a replacement, I had the luxury of just bringing the old battery with me and walking into an IT shop where I picked one up based on the physical dimensions and matching specs. The capacity of the replacement battery was a bit lower, but for 13 EUR a piece I did not mind it at all. For UT650EG, the battery size is 70x90x101mm. For UT850EG, the battery size is 151x65x94mm. Looking back at the experience with an APC Smart-UPS 750 and these CyberPower units, I’m not sure if getting the CyberPower units was worth it. Sure, they’re more power efficient, but I expected them to be more gentle against the batteries, which they were not. At least I’ve confirmed that the battery replacement isn’t that scary if you take the precautions, but the APC one feels physically much more solid with a humongous metal case, the batteries just slot in the front, and the USB port and its readout actually works well enough that I can write a custom Prometheus exporter script and monitor it. do it when the battery is empty double-check the first point remove the fuse at the back, look for a small flat-head screwdriver shaped slot and unscrew it use rubber gloves don’t touch anything but the battery and the power cables connecting to it don’t use metal prying tools keep cats and children away during the event ask your partner to keep an eye on you remove the four screws from the back of the unit, next to the power outlets remove the three screws from the bottom lift the back panel off, then gently pry the side cover off you now have access to the battery!

0 views
Chris Coyier Yesterday

Bass

I bought a standup bass back in June! I set up a Facebook Marketplace alert for them, and it actually worked; a good option came up. It feels like Craigslist and Facebook Marketplace are the only options for local sales online, and it’s been that way for a long time. And Craigslist sucks? It used to be this site super fancy people would point to and say see, design doesn’t actually matter that much. Sure, ok, fine. Well, Craigslist still looks like shit, and it’s riddled with scams. I can’t believe it still exists, honestly, but I also completely understand the absolutely no-Facebook people, so I guess I’m glad it does, even if it’s not for me. The woman selling the bass was named “Kay” which I found very funny, because Kay basses are very expensive and sought-after vintage instruments, which this was definitely not. I don’t even really know what this bass is. It was made in China. It’s… a bass. Notably, it’s a 1/2 size bass. Most standup basses are 3/4 size, so this is a bit smaller. It fits in the passenger seat of my van, which I like. The bass was Kay’s COVID project that didn’t materialize. Totally get it. She wanted $800, and I didn’t haggle. So it’s mine now. I don’t even have a case for it; I just lug it around as-is. I’m not very precious about instruments, but this bass feels extra hearty and can handle it. I’m already a passable bass player in Americana-esque music. But I wanted to get better, and it’s nice to, ya know, actually have a bass to practice with. I also like having it because it’s a rare-ish instrument to have handy, so I feel extra welcome at jams and the like when I have it, rather than being yet another guitar, banjo, or whatever else. Plus, I just leave it lying around at festivals, and other people can pick it up and run with it. OK — end of story. I have a bass now. I put it on the timeline .

0 views
Schneems Yesterday

A Type Stronger than the Sum of its Components

Have you ever written a type that you appreciated so much you still think about it? Like eating a really good meal, where if you try hard enough, you can still recall the taste in your mouth. I had a mini moment of Rust joy the other day and wanted to share the experience. TLDR: I turned an enum with N variants into N types. Nothing earth-shattering, but it made my life better. Specifically, is an enum that you can get from any std::path::Path reference. Where a path can be viewed as an iterator of components. To give you an example is . This enum is very handy for decomposing and working with paths, but an interface that takes one component that could be any of those variants is overly broad and not terribly useful. In a library where I work with paths a lot I made owned structs for each of those component types so that I could write a function signature like this: Where is a that is guaranteed to come from a variant. In the example above, I’m using properties of this type to guarantee that joining it to a path that is already absolute will produce a path that is also absolute. It might not sound earth-shattering, but prior to that, the alternative was something like: But an could be anything. It could contain or be an absolute path (in which case, the join API replaces the target ). Another use case is using it to represent the entries inside a directory . In hindsight, it’s such an obvious move: Take an existing, well-designed enum and make a type for each of the variants it can hold. If it’s useful to know you have 1 of N possible things (an enum), it’s probably also useful to know you have 1 very specific thing that can also fit into that enum. An enum is also known as a “sum type.” So another way to think of this is if it’s useful to have a sum type, it’s also useful to have the individual components of that type. Prior to this abstraction, I produced a range of other types: I found these useful, but still overly broad. A weird thing with working with paths is that they represent a lexical value and a physical location, and the two can be different. A path that is lexically relative might be a symlink on disk with an absolute target. And trying to normalize or transform paths can have weird consequences. Like if you try to get metadata from a file at it will fail if does not exist or is not a directory. However, if you canonicalize the path first, that will succeed and produce , which will not fail when you try to get metadata from it. An absolute path is not normalized, so it can have ( ) and ( ) in it. But if you don’t know how the path will be used (in my library, I don’t know why someone is asking for facts about that given path). You cannot safely normalize those values unless you’ve resolved their physical parent. That’s because from above could also be a symlink to a completely different absolute path, which needs to be resolved before the “apply to fold parent directory” happens. And to make matters worse, Windows has special paths that change the behavior of lookups. So paths that start with like treat and as literal values. That means, when you run a path through it returns a path with this syntax. Which also means that it is unsafe to call on Windows. If contains a , it will produce a verbatim lookup that will likely fail. Thankfully, the parsing is consistent here, so it always returns a for a rather than a . Join safety is probably the biggest benefit I got out of this new type, but it’s also fun that I can do things like this: Here, the function is walking/tracing a path on disk one component at a time. Previously, this was taking an , which required the programmer to be careful. This type signature forces the developer to prove to the compiler that they hold a component in hand before they can call this logic. Not earth-shattering either, but this level of pedantic confidence is just so…delightful here. Not everyone’s taste in food or types is the same. It’s fine if you don’t like the examples I’m serving here, but I thought this was satisfying and wanted to give you some food for thought. I would love to hear about other satisfying type patterns you’re still savoring. An AI disclaimer: Gen AI coding tools, I also code a lot of stuff by hand, and advocate for something like a “manually coded Monday.” This is exclusively my meat brain child. I actually coded it while I was in a car with no internet, waiting for my kids’ soccer practice to be over. I use Grammarly (non-gen-ai mode) to help me edit my prose. AbsPath - A path that is -ized. RelativePath - You guessed it, a path that is relative. CanonicalPath - A path that has been -d.

0 views
Corrode Yesterday

We Have Named Arguments at Home

Steve Klabnik recently wrote about named arguments, optional arguments, default arguments, function overloading, and why most of that design space has historically made him nervous in Rust. I agree with Steve. In fact, I think I agree slightly more strongly than Steve does. :) I actually think we can get most of what we want without adding any new language features. Instead, we can lean into what Rust already provides. None of these is an exact substitute for what you get in Python, Ruby, C++, or Kotlin, but that’s sort of the point. Instead, you can get 80% of the ergonomics without adding any magic to function calls at all. The recurring pattern is that Rust takes something another language puts into function-call semantics and represents it as a normal part of its type system, elegantly sidestepping the mentioned design problems. Let’s revisit Steve’s example from the crate: The obvious problem is that four consecutive s are not a great API that you can reliably use without reading the docs. Let’s assume for a moment that we had named arguments: That’s clearly better, but stable Rust has another syntax in its place: structs. A struct is a named argument with one extra type name. On top of that, we also get arbitrary field order: We also get typo checking, autocomplete, and per-field documentation for free! And we can put invariants on the type and pass the arguments around as values. And, perhaps most importantly, the names belong to the type , rather than becoming part of every function’s calling convention. That last property neatly avoids several problems with actual named arguments. Consider function pointers: What would the parameter names of be? With an argument struct, the question simply wouldn’t come up: If names are semantically important, give the names a type. If they aren’t, then… don’t. There is another delightful benefit here. Steve brings up evaluation order: I.e., should arguments be evaluated in the order they appear at the call site, or in the order the parameters appear in the declaration? Here, does that mean computing before moving or after? Rust already answered this question for structs: Expressions are evaluated where you wrote them. No new rules required. This feels extremely idiomatic to me: rather than teaching function calls a second field-like syntax with subtly different semantics, just use the field syntax that already exists. Of course, declaring a bespoke argument type for every two-argument function would be ridiculous. I would not write: That would be silly. The trick is to notice that named arguments are most useful exactly where an argument bundle becomes conceptually meaningful, which is the same point at which you reach for a struct anyway. These are bad: And these are often better APIs anyway : The design pressure forced us to uncover missing domain concepts. An optional argument is, to some extent, an argument which may or may not exist. Rust has a type for that. This is not as pleasant as: But it has a useful property: the optionality appears in the function’s type. There isn’t a hidden second calling convention for . There is but one function: and every caller supplies both arguments. This is obviously not what you want once you have six optional arguments: I’ve personally been found guilty of this pattern in the past. The problem is that the arguments have stopped being a parameter list and started being configuration. So: Instead of optional arguments, we deal with data. And that adds a nice property: there is no special distinction between “arguments supplied syntactically to this invocation” and “options I calculated elsewhere.” It composes nicely because it’s just a value. Now the obvious objection: writing all those s is terrible. Correct. So don’t. That’s why we have and struct update syntax: That is getting awfully close to: with one minor wrinkle: That is not nothing. But look at what we didn’t have to add: rules for which arguments may be omitted, how positional and named arguments interact, or whether you can omit something in the middle. There’s no special syntax for declaring parameter defaults, no question about whether default expressions run at declaration time or invocation time, and no special representation in types. is just a trait, and function calls remain untouched. Defaults are now usable independently of the function: That is frequently useful in its own right. For library APIs, I often like being slightly more explicit: I think this gets most of the important bits right. Sometimes even the options struct is too noisy, often when construction requires validation or conversion. Then, yes, there is the builder: Steve is right that builders should not be the default. They can become their own tiny programming language. But a small builder has a very useful property: each “argument” is an ordinary method call. That means we can do things like: Doing that with language-level keyword arguments generally requires constructing a map, splatting things, or some other mechanism. In Rust, it’s method calls. I personally find this very pleasing to read. In Java, you can write: Rust doesn’t let you define both: I am very happy about this. But there are several different things people mean when they say they want overloading, and Rust already covers most of them separately. Give them different names: The standard library does this often. See and , for example. This costs the library author one additional name (often just ) and saves every user from doing overload resolution in their head. Use a trait. The standard library does this all the time with traits like , , and . For example: This gives us another useful part of overload-like behavior: one API can accept different input types. For owned conversion: That’s just a single function with one parameter list and trait dispatch. And unlike unrestricted overloading, the relationship between accepted types is explicit: they work as long as they satisfy the bound. That’s a trait, too: That’s polymorphism; we just put it in the trait system instead of in name resolution. Steve’s Ruby example has this equally lovely and terrifying quality: These calls look like they’re invoking one conceptual operation, but they mean wildly different things. In Rust, we can model that directly: That’s more verbose, but in a good way. And I can ask, “Hey editor, what can I redirect to?” and the editor replies with the variants of . That’s more helpful than “read the docs and discover which keys and values this hash accepts.” If we really cared about smoothing down the edges, we could add conversions: And for the structurally interesting case: Remember that this has no runtime cost and is fully type-safe. Not bad for a compiled language. An “options hash” is basically a dynamically typed anonymous struct. So the extremely boring Rust translation is: use a statically typed, named struct. Yes, the Rust version is noisier, but it also detects when we misspell . It’s impossible to pass a string where the status code goes, and it’s straightforward to list every supported option. I don’t think Rust should optimize for making the syntax as dense as possible. Instead, if a set of options is common enough to deserve convenient syntax, it is probably common enough to justify a type. Now, options have a name and the fields can be documented in one place. Rust does not have general-purpose variadic Rust functions. But once again, it already has several ways of expressing the same concept. If all arguments have the same type, take a slice: Or accept an iterator: That is arguably more composable than: because the caller can naturally pass an existing collection. (All type-safe, of course, and with zero indirection at runtime.) If the arguments are heterogeneous, the last resort is to write a custom macro. To be clear, I would not use macros just to fake variadic functions, but I do like how macros can be used in stable Rust, and how the exclamation mark stands out from normal function calls. There is one tiny affordance in all of these examples that I think deserves more credit: field-init shorthand. Rust lets you turn this: This directly addresses one of Steve’s complaints about keyword arguments: Rust’s answer is effectively: In my opinion, that’s even better than keyword arguments. That’s because the labels are still present, the duplication disappears, and nothing needs to change in how we call functions. The thing I like the most about Rust is how each concept nicely interacts with the others. That is not an easy task, and Rust deserves a lot of credit for that. For example, suppose we want a complex HTTP request API with: We could imagine a pile of language features that lets us write: Now wouldn’t that be nice? However, we can already do this in stable Rust with a combination of already existing, composable features: And all we had to do was write the code we’d likely write anyway: Or maybe you prefer a builder? We combined standard Rust concepts: structs, enums, , , struct update syntax, field-init shorthand, traits, generics, iterators, and methods. Those mechanisms are all useful far beyond argument passing. Basic Rust syntax is all the machinery required to build ergonomic APIs. Keeping things simple doesn’t mean worse ergonomics. The obvious response to everything above is: Come on. These aren’t actually named/default/overloaded/variadic arguments. They’re workarounds. All of the above might be useful, though localized, syntax improvements. But the hidden tax is that the language becomes more complex, for arguably little gain. Friction in APIs often pushes us toward solutions that turn out to be useful beyond the original problem: In a sense, the concrete issue points to a broader design problem, and resolving it opens up completely new ways to solve similar problems. That’s great systems design. I think there’s a broader design principle behind all of this. A common design philosophy in dynamic languages is to make familiar constructs more powerful by overloading them with additional semantics. After all, that is one affordance which dynamic typing allows: the ability to decide the meaning of an object at runtime. Rust, however, tends to move complexity outward and let the type system do all the work . One might ask: “In the age of agentic development, doesn’t verbosity become cheaper while redundant labels may make a call easier to understand locally?” I agree with the premise. I’m less sure it changes the conclusion. An agent looking at: gets essentially the same local information. Arguably it gets more: gives the bundle a semantic identity which the function parameter list alone does not. says something useful to both humans and agents. is not merely an optional syntactic argument to this particular invocation; it is a way to configure a request. And if agents really do make typing cost increasingly irrelevant, then the principal downside of these slightly-more-verbose Rust idioms gets cheaper too. The robots can type for me. I’m not opposed to Rust ever gaining named arguments. There may be a proposal that finds a tiny, coherent design which handles patterns, function pointers, traits, evaluation order, compatibility, and all the other sharp edges described. But I don’t feel much urgency. Stable Rust already gives me structs for named options, and for optional values and defaults, traits and enums for varied inputs, and slices and iterators for repeated arguments. Collectively, they cover a lot of ground. And they do it by reusing features Rust already needs. And I think that’s a core part of Rust’s design philosophy: finding the smallest, composable, orthogonal set of abstractions, which, when combined, can solve many problems in elegant ways. The whole is greater than the sum of its parts. Where to go from here Want a second opinion on your team’s Rust APIs? Let’s review the types and abstractions together. a required URL, several accepted URL-like input types, named options, optional timeout, configurable redirects, and a variable number of headers. Actual named arguments might let me turn into: That surely is nicer at the call site. Actual default arguments might let me write instead of introducing . Actual overloading might let two functions share the same name instead of forcing me to invent . These four coordinates become a . Seven random config parameters become . A bunch of dynamically accepted values turn into an enum. A family of related operations becomes a trait. For your team . Training, code review, and architecture support to ship Rust with confidence. For yourself . 1-on-1 mentorship for Rust design, architecture, and code review on real projects.

0 views
Unsung Yesterday

“I want to release it, even if the quality would be a little lower.”

In 1996, Street Fighter Alpha 2 was ported onto Super Nintendo Entertainment System, a 1990 machine on its way out and not really up to the task of running such a modern game. The team put up a hell of a job, involving adding a custom compression chip, with the game being much better than anyone expected – but still suffering from a big flaw, which was a momentum-breaking 3-second freeze at the beginning of every battle. Dimitris Giannakis, also known as Modern Vintage Gamer, describes the problem and community’s more recent efforts to fix it : = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/i-want-to-release-it-even-if-the-quality-would-be-a-little-lower/yt1-play.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/i-want-to-release-it-even-if-the-quality-would-be-a-little-lower/yt1-play.1600w.avif" type="image/avif"> Turns out, the problem wasn’t the compression chip, but sound effects – and the fix to complelty remove the delay relatively trivial in hindsight. A community member named gizaha posted a patch to the game in 2020, and its description can send shivers down your spine: Sounds good. Alright, fair enough, perhaps the game was rushed to market and some light optimizations skipped. Also in 2020, people set their sights on another 1990s game, Super Mario 64. MattKC on YouTube talked about a similar problem as SFA2 – the game seemingly wasn’t properly optimized: For years, if not decades, this has been accepted as fact: Bowser’s sub is just too big and too goofy for the N64 to draw consistently. But what if I told you it didn’t have to be? Nintendo just… forgot to turn on a C compiler optimization feature before shipping the game. The result wasn’t as egregious as random 3-second freezes, but still gave people much lower framerate on certain levels: = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/i-want-to-release-it-even-if-the-quality-would-be-a-little-lower/yt2-play.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/i-want-to-release-it-even-if-the-quality-would-be-a-little-lower/yt2-play.1600w.avif" type="image/avif"> However, Giannakis followed up on that, and discovered the story wasn’t as simple . The optimization in question was still itself evolving at the time, and had known issues when Super Mario 64 was being developed. As easy as it is to turn it on in 2020, all polished and tested, it was a different story in 1996: = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/i-want-to-release-it-even-if-the-quality-would-be-a-little-lower/yt3-play.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/i-want-to-release-it-even-if-the-quality-would-be-a-little-lower/yt3-play.1600w.avif" type="image/avif"> The video actually compares the versions visually, and even investigates other optimizations. But it all pales in comparison to this 2024 video by Kaze Emanuar , who says “hey, guys, you have been looking at the wrong place the entire time” – as a matter of fact, it wasn’t the optimizations that Nintendo didn’t turn on that made the game slower. It was the optimizations they added: = 2x) and (width >= 700px)" srcset="https://unsung.aresluna.org/_media/i-want-to-release-it-even-if-the-quality-would-be-a-little-lower/yt4-play.2096w.avif" type="image/avif"> = 3x) or (width >= 700px)" srcset="https://unsung.aresluna.org/_media/i-want-to-release-it-even-if-the-quality-would-be-a-little-lower/yt4-play.1600w.avif" type="image/avif"> The video is kind of intense, but I feel you can learn a few really interesting things from it: It’s a fascinating watch, suggesting framerate increases of up to 50% on the original hardware, with just software changes . Both the Street Fighter 2 Alpha and Super Mario 64 efforts also portray a terrifying notion: imagine your code being hyperanalized by a group of people 25–30 years later, pointing at your flaws. Disable some waste sample loads Tweaked audio engine for faster start of loading Faster audio load, upload 2 bytes at the time instead of 1 how you show the debug information matters, there is such a thing as a “performance lottery,” naïve efforts to optimize can be heavier than not doing anything at all, it’s best to optimize for maximizing minimum frame rate, rather than average frame rate.

0 views

Shrinking a Fedora virtual disk

I have a weird setup for my laptop. In summary, I have been irrationally scared of running Fedora on bare, dual-GPU metal, so I run it in a virtual machine with Hyper-V on Windows as a hypervisor. The idea was to let Windows manage GPUs and power management stuff like hibernation, and then use Fedora as my main UI to the computer. This has worked surprisingly well, but that’s only because my expectations were low to begin with. The VM can barely access the hardware of the underlying machine: it can’t use the GPU, it can’t use the front-facing camera, Linux starts thrashing weirdly when the VM runs out of memory, among other quirks I’ve learned to work around. Thus, I’ve wanted to re-install on bare metal for a while, but! problem! Come on a journey with me. It’s got a hero with hubris, mistakes, tension, and a cliffhanger. (Continue reading the full article on the web.)

0 views