Chaotic good artificer/ranger, sending you drive-by bugfix pull requests while sitting in a tree in the middle of nowhere. My psych degree hasn't stopped me from regularly getting nerd-sniped into writing operating systems. Making reliable things from unreliable parts, currently at Oxide Computer, previously Loon/GoogleX, NativeClient, etc bad at (but occasionally posting in): español, (简体)中文, nederlands he/him - Berkeley, CA
Public Key
npub19znrep7u2jrsfvqs5aa3s352l4ppfnxyun8pt28yulnkd7k9x08q9spj90 Profile Code
nprofile1qqsz3f3uslw9fpcykqg2w7ccg6906ss5enzwfns44rjw0emxltzn8nspz3mhxue69uhhyetvv9ujuerpd46hxtnfduqs6amnwvaz7tmwdaejumr0dssys89m
Show more details
Published at
2026-08-20T16:00:35Z Event JSON
{
"id": "b0fadce50758615366de1c949f87fca7458179bee75380fcf0544ffabc959745" ,
"pubkey": "28a63c87dc548704b010a77b18468afd4214ccc4e4ce15a8e4e7e766fac533ce" ,
"created_at": 1787241635 ,
"kind": 0 ,
"tags": [
[
"proxy",
"https://hachyderm.io/users/cliffle",
"activitypub"
],
[
"client",
"Mostr",
"31990:6be38f8c63df7dbf84db7ec4a6e6fbbd8d19dca3b980efad18585c46f04b26f9:mostr",
"wss://relay.ditto.pub"
]
],
"content": "{\"name\":\"cliffle\",\"about\":\"Chaotic good artificer/ranger, sending you drive-by bugfix pull requests while sitting in a tree in the middle of nowhere.\\n\\nMy psych degree hasn't stopped me from regularly getting nerd-sniped into writing operating systems.\\n\\nMaking reliable things from unreliable parts, currently at Oxide Computer, previously Loon/GoogleX, NativeClient, etc\\n\\nbad at (but occasionally posting in): español, (简体)中文, nederlands\\n\\nhe/him - Berkeley, CA\",\"picture\":\"https://media.hachyderm.io/accounts/avatars/109/350/463/385/849/191/original/952958f41543eaf9.jpg\",\"banner\":\"https://media.hachyderm.io/accounts/headers/109/350/463/385/849/191/original/fbb1548ca53e6069.jpeg\",\"nip05\":\"[email protected] \",\"fields\":[[\"Webbywebs\",\"https://cliffle.com/\"],[\"Codes\",\"https://github.com/cbiffle\"],[\"Embedded widgets for sale\",\"https://www.lectronz.com/stores/owl-lol\"],[\"Heading photo alt text\",\"A photo of me as a 10-year-old leaning against a sign that reads Dangerous Cliff\"]]}" ,
"sig": "ad96fe5d82c4499ed517a693e5e30d4142d24e69ab4dc0d6e800773b858e2bd9d4bac0c6c209ec54fcdbd0455b9e268ffd495da26709dd39e74b3ee4e9c92c01"
}
Last Notes npub19znrep7u2jrsfvqs5aa3s352l4ppfnxyun8pt28yulnkd7k9x08q9spj90 cliffle @nprofile…mv7s I think lately, the "dry ball" class of issues I've found on boards have usually been caused by, like, incomplete plugging of via-in-pad slurping the paste into the netherworld, or similar. But yeah, Oxide's got some crazy stackups that really need to bake thoroughly, and we had some thermal inconsistencies in reflow early on. That one's at least easy to fix with heat. npub19znrep7u2jrsfvqs5aa3s352l4ppfnxyun8pt28yulnkd7k9x08q9spj90 cliffle @nprofile…mv7s oh good. I don't have a CAT scanner at home. 😉 npub19znrep7u2jrsfvqs5aa3s352l4ppfnxyun8pt28yulnkd7k9x08q9spj90 cliffle @nprofile…mv7s missing a paste aperture on a BGA pad is such an evil defect. I've had panels where the ball manages to bridge the gap on, like, 10% of inventory, or in one really nasty case, only along one edge of the panel (temperature gradient I guess?) npub19znrep7u2jrsfvqs5aa3s352l4ppfnxyun8pt28yulnkd7k9x08q9spj90 cliffle @nprofile…mv7s well hey, at least you don't have to pare down your AICs npub19znrep7u2jrsfvqs5aa3s352l4ppfnxyun8pt28yulnkd7k9x08q9spj90 cliffle @nprofile…mv7s if you can get it booted far enough to get through dimm training and report the results without those AICs, it would be interesting. ... to me, at least. 😁 npub19znrep7u2jrsfvqs5aa3s352l4ppfnxyun8pt28yulnkd7k9x08q9spj90 cliffle @nprofile…mv7s say, if you have any pcie aics in there, and/or integrated graphics, might be worth disabling/removing them and seeing if it affects the RAM detection... sometimes bioses misbehave if cards have weird opinions about BAR locations etc npub19znrep7u2jrsfvqs5aa3s352l4ppfnxyun8pt28yulnkd7k9x08q9spj90 cliffle @nprofile…mv7s yeah, that should be new enough to avoid my concern. Guess we're back to just "bios bullshit" then. npub19znrep7u2jrsfvqs5aa3s352l4ppfnxyun8pt28yulnkd7k9x08q9spj90 cliffle @nprofile…mv7s which Intel microarchitecture is the machine that only sees 384GiB? I recall some of them using channels in sets of three, and either capping out around there due to bios bullshit, or expecting you to jump to the next multiple of 3. npub19znrep7u2jrsfvqs5aa3s352l4ppfnxyun8pt28yulnkd7k9x08q9spj90 cliffle @nprofile…s8xx incidentally this happens in my head every time I accidentally read the comments somewhere https://media.hachyderm.io/media_attachments/files/116/089/359/476/894/235/original/c5260442bb290973.jpg npub19znrep7u2jrsfvqs5aa3s352l4ppfnxyun8pt28yulnkd7k9x08q9spj90 cliffle @nprofile…s8xx yeah I need to curl up with a warm mug of something and these PoCs, thanks for putting this together npub19znrep7u2jrsfvqs5aa3s352l4ppfnxyun8pt28yulnkd7k9x08q9spj90 cliffle @nprofile…s8xx that's, uh... not the hmac they're truncating by any chance, is it npub19znrep7u2jrsfvqs5aa3s352l4ppfnxyun8pt28yulnkd7k9x08q9spj90 cliffle @nprofile…s8xx oh thank goodness npub19znrep7u2jrsfvqs5aa3s352l4ppfnxyun8pt28yulnkd7k9x08q9spj90 cliffle Chewing on Soatok's last commentary on matrix crypto. I haven't implemented DH in a while, but: If the system allows the other user to use the point at Infinity as their public key... Doesn't that mean if I'm in a position to tamper with both sides of the connection, I could tell each party separately that the other chose it, and they'd be none the wiser because they'd independently derive the same session key? But their traffic would be effectively unencrypted for any observer, not just me. I sure hope there's some other feature of the protocol that prevents this. #nevent1q…a70u npub19znrep7u2jrsfvqs5aa3s352l4ppfnxyun8pt28yulnkd7k9x08q9spj90 cliffle @nprofile…s8xx I swear, the whole "assert becomes a no-op" thing is an evergreen source of security vulnerabilities. npub19znrep7u2jrsfvqs5aa3s352l4ppfnxyun8pt28yulnkd7k9x08q9spj90 cliffle At the last minute, I submitted a talk suggestion to RustWeek this year, and... they took it! 🎉 So, in May, I will be presenting on patterns in systems software that are not worth carrying into Rust because they go against the grain of the language. And I would like your help. Have you tried to translate or recreate some systems-y software into Rust, only to be tripped up by a data structure, implementation pattern, or the like -- and found an alternative that unblocked you? I'm curious to hear about it. Surely I haven't seen them all. Some examples from my journey below. 1/ #rustlang npub19znrep7u2jrsfvqs5aa3s352l4ppfnxyun8pt28yulnkd7k9x08q9spj90 cliffle @nprofile…kjcu oh that's a depressing thought Mine is definitely cheaper (runs on a solar powered ARM machine) so we'll see how many tokens they bought npub19znrep7u2jrsfvqs5aa3s352l4ppfnxyun8pt28yulnkd7k9x08q9spj90 cliffle Years ago, Vercel scraped all the email addresses associated with my Github account and added them to their marketing lists. They still send me emails, with no unsubscribe option, because they insist I'm a customer. (I am not. Oxide, my employer, used Vercel.) This should be illegal, but I'm in the US, so. I've been musing on how to raise the cost of this behavior. My current leading contender: for each email I receive, generate 5-10 promising sounding leads using LLMs to engage their sales team and go nowhere. npub19znrep7u2jrsfvqs5aa3s352l4ppfnxyun8pt28yulnkd7k9x08q9spj90 cliffle Hm, potential 45-base RNA quine discovered. The conditions are _somewhat_ contrived but only somewhat. https://arstechnica.com/science/2026/02/researchers-find-small-rnas-that-can-make-copies-of-themselves/ npub19znrep7u2jrsfvqs5aa3s352l4ppfnxyun8pt28yulnkd7k9x08q9spj90 cliffle @nprofile…mv7s in addition to diffusion, there's also the "cloud edge effect," where diffraction around clouds produces spikes in power when the sun passes behind their edges. I found this terribly counter-intuitive. npub19znrep7u2jrsfvqs5aa3s352l4ppfnxyun8pt28yulnkd7k9x08q9spj90 cliffle Anduril founder Palmer Luckey says California's proposed wealth tax on his ~$3.9B would leave him "screwed for life," which serves as a useful illustration of how having $3.9B can destroy your perspective on what "screwed for life" looks like. npub19znrep7u2jrsfvqs5aa3s352l4ppfnxyun8pt28yulnkd7k9x08q9spj90 cliffle @nprofile…mv7s another block option would be to include a longer 128 bit timestamp per block and use 64 bit relative within (or even narrower, 9200s is a long block). I did something like this for the timebase for Loon's Iridium telemetry. npub19znrep7u2jrsfvqs5aa3s352l4ppfnxyun8pt28yulnkd7k9x08q9spj90 cliffle @nprofile…mv7s out of curiosity, what's your time precision here? npub19znrep7u2jrsfvqs5aa3s352l4ppfnxyun8pt28yulnkd7k9x08q9spj90 cliffle Yup, this has happened to me, except in my case it was "echinoderms have ventral mouths and dorsal anuses, so they're literally poopyheads!" https://www.smbc-comics.com/comic/nothing-3 npub19znrep7u2jrsfvqs5aa3s352l4ppfnxyun8pt28yulnkd7k9x08q9spj90 cliffle Collected this weekend's updates to my Smalltalk-80 VM into a new wasm build. (You may need to shift-reload it to get it to work if you've visited before.) https://cliffle.com/tmp-st80/ There's now a speed selector to experience what was considered "barely usable" back in 1983 (5000 bytecodes/sec, not remotely usable by modern standards). And the VM is complete enough to run "Benchmark testStandardTests." If you crank up the speed knob (and have enough host CPU) the standard tests complete in 537 ms, which is pretty darn fast, and compares favorably with Rochus Keller's optimized C++ VM, despite my rather naive display routines. #Smalltalk #rust npub19znrep7u2jrsfvqs5aa3s352l4ppfnxyun8pt28yulnkd7k9x08q9spj90 cliffle As of this morning, my toy Smalltalk-80 VM in Rust can make it through the first 68,139 bytecode instructions of the 1983 Xerox system image (before hitting a primitive operation I haven't implemented yet). Its behavior exactly matches dbanay's high quality C++ gloss of the book at an instruction trace level. It's also 3.5x faster, and I'm not honestly sure why. dbanay's code is deliberately not optimized for performance -- it's written to match the book. But for the most part, so is mine. I've taken a few small opportunities (like introducing that HeapOop type I mentioned the other day), but it's still doing essentially the same thing. I've profiled both programs and see no smoking guns. gcc is making some questionable inlining/not decisions but I'm not even LTO'ing the Rust code (and I _have_ tried LTO'ing the C++ code). There are a lot of reasons why mine _should_ be slower, naively: bounds checks, integer overflow checks, a lot more asserts added to the VM core during development... heck, I even use checked conversions to go from i16 to u16. And yet. Normally I can explain why my program is faster than another, so this is bothering me. npub19znrep7u2jrsfvqs5aa3s352l4ppfnxyun8pt28yulnkd7k9x08q9spj90 cliffle @nprofile…syqt ah, yeah, our parts are probably not integrated enough for your needs. npub19znrep7u2jrsfvqs5aa3s352l4ppfnxyun8pt28yulnkd7k9x08q9spj90 cliffle There are a bunch of albums that I originally experienced in the early 2000s through piracy with bad metadata, with the side effect that my brain now _really_ expects their tracks to be in alphabetical order. This has proven very difficult to unlearn. npub19znrep7u2jrsfvqs5aa3s352l4ppfnxyun8pt28yulnkd7k9x08q9spj90 cliffle @nprofile…stct nice. I'm thinking of doing this with my bucket of HP-35s. npub19znrep7u2jrsfvqs5aa3s352l4ppfnxyun8pt28yulnkd7k9x08q9spj90 cliffle @nprofile…syqt @nprofile…dpjt I admit I was hoping that would be possible when the part was announced. 😞 npub19znrep7u2jrsfvqs5aa3s352l4ppfnxyun8pt28yulnkd7k9x08q9spj90 cliffle @nprofile…syqt @nprofile…dpjt so, the closest I've found is probably the SAMA5D2 series from Microchip, which has 128 kiB of L2 cache that can be switched to just be SRAM, and are also available with a nontrivial amount (~256 MiB) of eDRAM in package. I have some eval hardware but I haven't brought it up yet. npub19znrep7u2jrsfvqs5aa3s352l4ppfnxyun8pt28yulnkd7k9x08q9spj90 cliffle @nprofile…syqt in case it's useful: one of the significant advantages of the dual AHB ports on the M33 is the ability to access vector table entries while stacking/unstacking interrupt frames. (Since the hardware does that on M.) So you can shave several cycles off interrupt response by ensuring that your stack is in some sort of TCM accessible through the S port on the M33, and the vector table and ISRs are accessible through the C port. This will ensure that the hardware can do the operations in parallel. (Note that ST has a historical habit of putting fast SRAM in the C region that's tempting to use for stack. Recently they've gotten more explicitly with the ITCM/DTCM split like on the H7.) Most applications aren't sensitive to latency to this degree, but mine often are, so I worry about these things. npub19znrep7u2jrsfvqs5aa3s352l4ppfnxyun8pt28yulnkd7k9x08q9spj90 cliffle @nprofile…syqt @nprofile…dpjt ...incidentally, why end-of-RAM-minus-anything? The ARM stack is full-descending so it's fine for an empty stack pointer to point at the word just above RAM. npub19znrep7u2jrsfvqs5aa3s352l4ppfnxyun8pt28yulnkd7k9x08q9spj90 cliffle @nprofile…syqt @nprofile…dpjt this was tweaked at some point during the development of M-profile, and older M parts actually have a bit for disabling the 8-byte alignment. I assume that ldrd/strd is the motivation, but I don't know that it's documented anywhere. ISRs will automatically push an additional word if the SP is 4-byte-aligned on entry, and set a status bit to record that it happened so the hardware can skip it on unstacking. That part is done for you. But particularly in your crt0 (or any asm that calls C code), if you don't maintain the alignment, things will eventually break in weird ways due to some code assuming stack alignment and not finding it. It generally won't crash. npub19znrep7u2jrsfvqs5aa3s352l4ppfnxyun8pt28yulnkd7k9x08q9spj90 cliffle @nprofile…syqt @nprofile…dpjt yeah, it mostly works at 4-byte until it doesn't npub19znrep7u2jrsfvqs5aa3s352l4ppfnxyun8pt28yulnkd7k9x08q9spj90 cliffle @nprofile…syqt fwiw, the M33 also wants 8 byte stack alignment. npub19znrep7u2jrsfvqs5aa3s352l4ppfnxyun8pt28yulnkd7k9x08q9spj90 cliffle @nprofile…syqt are you doing this on the STM32MP257F, or is there a cheaper board? npub19znrep7u2jrsfvqs5aa3s352l4ppfnxyun8pt28yulnkd7k9x08q9spj90 cliffle Frustrated with the size (and build quality) of my Framework 16 when traveling, I picked up this tiny (10 inch) Chuwi MinibookX for $350. So far I'm pleased! Thoughts in the replies. https://media.hachyderm.io/media_attachments/files/115/527/813/351/238/337/original/796a933fcd65ff96.jpg npub19znrep7u2jrsfvqs5aa3s352l4ppfnxyun8pt28yulnkd7k9x08q9spj90 cliffle Hey Unix history nerds: Do we know who wrote tar(1)? Like, the original tar.c included in V7 Research Unix (which is the earliest one I can find). The list of potential culprits is pretty short, but there's no attribution I can find. (If you have an answer, please clarify where you got it from, and reference any contemporaneous/primary sources if you've got them.) npub19znrep7u2jrsfvqs5aa3s352l4ppfnxyun8pt28yulnkd7k9x08q9spj90 cliffle Well! I've definitely seen my share of "idiosyncratic" C styles omitting braces and exploiting corner cases in 30+ years of having to read other peoples' C code, but this is a new one. I had not thought about what would happen if you left the braces off a switch. Because, of course, doing so would be utterly unhinged. I give you: the world's most obtuse version of "if (x == A || x == b)", indistinguishable from an editing mistake. https://media.hachyderm.io/media_attachments/files/115/459/685/184/154/963/original/377fc4b51e36a8f3.png npub19znrep7u2jrsfvqs5aa3s352l4ppfnxyun8pt28yulnkd7k9x08q9spj90 cliffle I'm reverse-engineering the Android app for the solar charge controller in my trailer, to try and understand some corner cases of the protocol. I tossed the dex at jadx and started grepping for known hex addresses in its MODBUS register space... without luck? In fact, I also couldn't find a CRC routine? And then I noticed a lot of StringBuffer usage in the code and... well, this app is manipulating all the MODBUS packets as StringBuffers containing hex bytes, separated by spaces. It even does math on this form. I know Java lacks unsigned bytes (a forever-crime) but this is a new one https://media.hachyderm.io/media_attachments/files/115/395/951/559/165/252/original/088b9e2a2703e053.png npub19znrep7u2jrsfvqs5aa3s352l4ppfnxyun8pt28yulnkd7k9x08q9spj90 cliffle In a sea of rapidly enshittifying e-commerce sites, McMaster-Carr remains a breath of fresh air. npub19znrep7u2jrsfvqs5aa3s352l4ppfnxyun8pt28yulnkd7k9x08q9spj90 cliffle @nprofile…syqt @nprofile…2yfz I'm not super familiar with modern Intel implementations of x86, but it's possible you'll still need to trap into SMM for small things here and there, just because so much of the system assumes its existence. (Is it still involved in scaling/power?) But you ought to be able to minimize it pretty aggressively! npub19znrep7u2jrsfvqs5aa3s352l4ppfnxyun8pt28yulnkd7k9x08q9spj90 cliffle @nprofile…syqt @nprofile…2yfz this is what we wound up doing -- the x86 core is physically incapable of writing to the SPI flash. It can work. In our case, firmware updates have to go through the separate service processor, but for an end-user machine a physical switch would also be fine. Assuming you're not trying to run an unmodified commodity operating system, of course. But we're not. npub19znrep7u2jrsfvqs5aa3s352l4ppfnxyun8pt28yulnkd7k9x08q9spj90 cliffle @nprofile…8x2j well then! And here I thought it was for (M)icro(C)hip and trying to make a joke npub19znrep7u2jrsfvqs5aa3s352l4ppfnxyun8pt28yulnkd7k9x08q9spj90 cliffle @nprofile…8x2j It's nice that they clearly designated both their Copyright and their...um...Mopyright npub19znrep7u2jrsfvqs5aa3s352l4ppfnxyun8pt28yulnkd7k9x08q9spj90 cliffle @nprofile…59k6 next most challenging task: keeping it working across Neovim updates! npub19znrep7u2jrsfvqs5aa3s352l4ppfnxyun8pt28yulnkd7k9x08q9spj90 cliffle My favorite under-appreciated trick for small solar arrays is "overpaneling." Solar panels themselves are now relatively cheap, compared to things like batteries and inverters. For highest production efficiency, you want to tie your solar panels to your battery using a Maximum Power-Point Tracking (MPPT) charge controller. This will have a power limit in watts. But it's not a hard limit. The hard limit is the Voc (open circuit voltage) of the solar array. As long as you don't exceed it, most MPPTs can support 1.5-4x their wattage, and they'll just limit current to not produce the extra power. Why would you want to do this? Because a solar array is only producing optimally (and thus potentially being power-limited) for a tiny slice of the afternoon. The _rest of the day_ you can accumulate more power if you add extra panels. Here's a crappy diagram I drew to illustrate this. Basically, you can get a big boost in the morning and evening, which (by following the area under the curve) dramatically increases your daily energy production, even if you are technically "under-utilizing" the panels in the peak hours. So you could totally strap 500W of panels onto that "300W" power box I just posted to maximize your daily collection. Just verify the Voc is within limits. https://media.hachyderm.io/media_attachments/files/115/164/855/138/929/059/original/a4b1926800546312.png npub19znrep7u2jrsfvqs5aa3s352l4ppfnxyun8pt28yulnkd7k9x08q9spj90 cliffle Home Assistant wants me to know that starting on Monday it will be ... night? Or a three-day partial eclipse? Is this an omen 👉🦋 https://media.hachyderm.io/media_attachments/files/115/034/976/144/632/432/original/8d0e09d7c9a72d3e.png npub19znrep7u2jrsfvqs5aa3s352l4ppfnxyun8pt28yulnkd7k9x08q9spj90 cliffle I got a wee CO2 monitor for home, after talking to @nprofile…wkxy about his experience. Since CO2 monitors have mostly been a proxy for other air quality properties that are hard to measure -- like virus concentration -- I hadn't ever used one in spaces where I'm alone. It turns out, when I wake up, my bedroom is at something like 2500 ppm. I have been having a heck of a time getting my brain to work in the morning, and having various focus problems. Some of that was due to the wrong brain pills, but it seems like this suggests another factor. npub19znrep7u2jrsfvqs5aa3s352l4ppfnxyun8pt28yulnkd7k9x08q9spj90 cliffle @nprofile…jrpu that is probably not how I would have done that, but, ok It's always important to ask: water quality test *for what* -- lead? Algal toxins? Turbidity? I think checking for noro or cholera is still a lab test and only covers the point of dispensing where the sample was taken npub19znrep7u2jrsfvqs5aa3s352l4ppfnxyun8pt28yulnkd7k9x08q9spj90 cliffle @nprofile…jrpu ...what were the circumstances around the graywater? (e.g. what kind of grey and why label it differently) (Edit to add context: I've done water management at burning man and the like, and I feel like "safety third" is all well and good until everyone gets norovirus -- so I'm curious what went down) npub19znrep7u2jrsfvqs5aa3s352l4ppfnxyun8pt28yulnkd7k9x08q9spj90 cliffle I have to say, while the Mastodon "thundering herd" whenever I post a link is not my favorite behavior, putting the instance names in the user-agent makes it a joy to encounter in the logs. Most traffic is all "iOS 14 like Mac OS Like Firefox I Am a Teapot Here Are Dimensions For THE MACHINE 34 12 345 2 677 3" Whereas mastodon traffic is all "gays.furries.lol, horrible.puns, whatisthis.computer, computers.were.a.mistake.horse" npub19znrep7u2jrsfvqs5aa3s352l4ppfnxyun8pt28yulnkd7k9x08q9spj90 cliffle Last week I was talking with my cousin (who is not an engineer) about how "artificial intelligence" has never really meant anything, and has been typified by "moving goalposts" as a result. Not six hours later, I was debugging her mom's 1991-vintage pinball machine, and found this sentence in its instruction manual. These "advanced artificial intelligence systems" used a 2 MHz 6809 processor. So, yeah, moving the goalposts. https://media.hachyderm.io/media_attachments/files/114/977/888/446/166/250/original/00751811f0bd94ef.png npub19znrep7u2jrsfvqs5aa3s352l4ppfnxyun8pt28yulnkd7k9x08q9spj90 cliffle Flying back across the country from a family medical thing, wherein relatives were convinced that climate change isn't happening. Meanwhile, every city I've been to is having an extreme heat warning, and my first plane on this leg had its engines overheat and got towed back to the gate. Now waiting on the replacement plane. So, you know, normal summer things npub19znrep7u2jrsfvqs5aa3s352l4ppfnxyun8pt28yulnkd7k9x08q9spj90 cliffle Alright Digikey, I admit I didn't think to set a filter for that https://media.hachyderm.io/media_attachments/files/114/937/805/767/485/614/original/c8a0684e2409b889.png npub19znrep7u2jrsfvqs5aa3s352l4ppfnxyun8pt28yulnkd7k9x08q9spj90 cliffle I don't know why people get upset about calling connectors "DB9." DB9 is a perfectly valid connector in the D-Subminiature connector system. Here is a helpful infographic explaining the DB9 connector. You're welcome. (@nprofile…dpft caused this) https://media.hachyderm.io/media_attachments/files/114/922/528/298/066/027/original/ff66b369c65b80d3.webp npub19znrep7u2jrsfvqs5aa3s352l4ppfnxyun8pt28yulnkd7k9x08q9spj90 cliffle @nprofile…vdjy when articles I've written somehow wind up on HN, there are comments complaining that my site is "too purple." A hive of scum and villainy, that place. npub19znrep7u2jrsfvqs5aa3s352l4ppfnxyun8pt28yulnkd7k9x08q9spj90 cliffle Obstacles I hit when trying to send a patch to a C++ project, as an experienced C++ dev who's been doing mostly Rust for a few years: - Figuring out their custom build system (because Make, CMake, Ninja, et al are build system _kits,_ not build systems, and different in each project) - Figuring out their implicit style rules (most don't use clang-format or equivalent and want you to do it by hand) - Working out which C++ standard is being targeted (it's often not stated explicitly and sometimes varies across platforms) - Discovering which subset of APIs available in that C++ standard are fine to use, and which will cause a violent immune reaction (this is rarely stated anywhere, but the "UNDER THIS ROOF WE DON'T USE {x}" reaction, where x is usually exceptions or errno or iostream or printf or initializer lists or templates or multiple inheritance or ... is strong) This is before we even get to "working out the lifetimes of pointers." And let's not talk about adding a library dependency. (Before anyone gets smug about C, don't make me write the C equivalent, it's just as bad.) npub19znrep7u2jrsfvqs5aa3s352l4ppfnxyun8pt28yulnkd7k9x08q9spj90 cliffle Player: "I take the value out of the std::optional<int>" Computer: "Did you remember to check has_value by any chance" Player: "...no, why?" Computer: "You succeed, with Fear. You are now holding a value. *quietly moves a bead over on a counter*" Player: "Wait what was that, what did you just do" Computer: "Don't worry about it. What would you like to do next?" Player: "...okay well I'd like to inspect the value I got." Computer: "e̸͇̺̦͒̓̏͊͒̿͘v̷̢̦̟͙͎͙̦̠͙͕̰̮̗̂̉͆̓͂́̐͂̎̀͋̓̒̇̾ͅė̵̲̪̑̚̚͠r̴̡̤̺̭̆̋̊̚y̶̧̡̨͈̻̮̪̘̜̹̥͚̺̥͎̲̣͒̎̐̑͋̿̾̿̾ẗ̶̨̧̯̱͕̫̖́̈́̈́͌̊̇̀̀͑̿͊͛͒̂ͅh̸̼͕̒̔́̿̈́͑̐̉̀̓̈́͒̊͂̔͋͠i̵̲̻̥̪͓̬̣̟̿̍̇͑́̈́̾̈́̅̾̑̉̊̚͝͝͝n̵̛̪̦̅g̴̢̝̻̪̫̲͕͚̱̪̎̊̀̐̍̀̂̔ ̷̢̨̛̲̹͖̝͚͎̺̱̗̏͗̃͐̾̈́̽̈̉͊̓̈́̉̕͝ḯ̷̧͓̲̱̝̟͂̌̄͛͐̃̅̇̑̅s̸̳̯͖̎̈́͐̐̄̏͋̇̕͘ ̶̧̻̣͈̰̣̼͊͂͛̓̔͑́̈́͌̄͑͘͜͝͝r̵͇̺̦͍̓̍̍̾̋̐̂̚ả̷̛͈̩̭͐̄̓̑́̃̾͊͆̌͝͝ͅt̸̨̮͓̯͍̽̒̔̊̊̋̍́̓̕͝͝͠͠s̶̢̟̞̘͉̒͐" npub19znrep7u2jrsfvqs5aa3s352l4ppfnxyun8pt28yulnkd7k9x08q9spj90 cliffle Watched some Daggerheart play videos, and I propose that we adopt one of their mechanics when discussing programming languages: Old: "this operation has undefined behavior" New: "this operation will succeed, with Fear. The computer receives one Fear point that it can use to make your program hurt you later." npub19znrep7u2jrsfvqs5aa3s352l4ppfnxyun8pt28yulnkd7k9x08q9spj90 cliffle @nprofile…59k6 ...alright, you may have seen this, but this is actually pretty neat. https://cs.nju.edu.cn/lxie/publication/MobiCom2024a.pdf (Edit: it kind of reminds me of the properties of a good one-way hash function: they're using the moiré effect to ensure that a small change in attitude/position has a large change, in both area and magnitude, in luminance sensed.) npub19znrep7u2jrsfvqs5aa3s352l4ppfnxyun8pt28yulnkd7k9x08q9spj90 cliffle @nprofile…59k6 I feel like the "periodic detail" bit means that you'd wind up sensing in frequency domain -- which is potentially still useful, and potentially reversible. I have not read about twisted bilayer graphene before but I sure as heck am doing so now (1.1 degrees is an awfully random-seeming number) npub19znrep7u2jrsfvqs5aa3s352l4ppfnxyun8pt28yulnkd7k9x08q9spj90 cliffle @nprofile…59k6 I'm consistently fascinated by this phenomenon -- I'm kind of amazed I haven't crashed a car while distracted by interfering chain link patterns on pedestrian overpasses. I feel like there's some interesting superresolution sensing you could do with this, but I've never quite worked out the details. npub19znrep7u2jrsfvqs5aa3s352l4ppfnxyun8pt28yulnkd7k9x08q9spj90 cliffle Here's a neat class of product that I didn't know existed: "travel routers." I bought a GL.iNet "Beryl AX" to serve as a wifi access point in my trailer. It runs OpenWRT (woo) and is set up to manage up to three upstream internet connections (wifi, ethernet, USB 4G dongle), multiplexing your devices using NAT and securing traffic with OpenVPN or Wireguard. Oh, and it runs off 5V USB. This is useful for e.g. hotel or trailer park Wifi that has a "number of devices" cap, but in my case, I've got it set up to use my home wifi when it's in range, and fall back to 4G when it isn't. Either way, it bridges to my home network via Wireguard so I can get to my stuff. Its little brother (Opal) starts at $35 but isn't as hackable. https://www.gl-inet.com/products/gl-mt3000/ npub19znrep7u2jrsfvqs5aa3s352l4ppfnxyun8pt28yulnkd7k9x08q9spj90 cliffle Here's a neat analysis of a subtle OpenZFS bug by @nprofile…6mn7. https://despairlabs.com/blog/posts/2025-07-10-an-openzfs-bug-and-the-humans-that-made-it/ I love reading thoughtful analyses of bugs and the factors that produced them. Nowadays I usually arrive somewhat resigned, and expecting a "zeroth order" C bug -- something like bad pointering or failure to initialize a variable. This is more of a "second order" C bug, and the author goes through the potential tradeoffs and rightfully points out that the answer is not "git gud." I'll put my thoughts on the bug in a reply so as not to spoil it for you. Anyway, it's a good short read. npub19znrep7u2jrsfvqs5aa3s352l4ppfnxyun8pt28yulnkd7k9x08q9spj90 cliffle Rolling a randomish character for a friend's D&D oneshot game, I used a dwarf name generator and got the best dwarf name. I AM JSON PARSE SYNTAXERROR https://media.hachyderm.io/media_attachments/files/114/707/567/299/660/245/original/6d9bfed7207c81c5.png npub19znrep7u2jrsfvqs5aa3s352l4ppfnxyun8pt28yulnkd7k9x08q9spj90 cliffle @nprofile…59k6 I wonder if peoples' experience with the first board game was similar. They're also arguably non-obvious as a concept, not gated by any specific technological development (some of the older recognizable ones are just lines scratched in a rock), etc. Though of course mass communications were slower back then. npub19znrep7u2jrsfvqs5aa3s352l4ppfnxyun8pt28yulnkd7k9x08q9spj90 cliffle @nprofile…59k6 a stochastic parrot trained on people discussing math on the internet, huh... it seems like it would be hard to _prevent it_ from being kind of a condescending ass at times. So, yes, I think it bolded that out of (emulated) condescension. npub19znrep7u2jrsfvqs5aa3s352l4ppfnxyun8pt28yulnkd7k9x08q9spj90 cliffle A friend tipped me off to the existence of "heat set threaded inserts," which are brass threaded things with grippy teeth that you can press into plastic with an iron to have robust screw threads. They're fantastic for making 3d printed parts take proper bolts and stuff. However, they _also_ turn out to be really useful for fixing cheap plastic objects. A friend dropped the gate remote for his apartment complex, and tore out the screw (which was straight into the ABS plastic). I pushed a heat-set insert into the old screw hole and installed an M3 bolt. Maybe five minutes of work. Highly recommended. npub19znrep7u2jrsfvqs5aa3s352l4ppfnxyun8pt28yulnkd7k9x08q9spj90 cliffle Took another crack at using FreeCAD today, now that it's officially 1.0. To its credit, it hasn't segfaulted on me once yet, which is improvement. It still does a lot of surprising things with no user feedback, particularly around removing constraints when it decides things are redundant (and doing so incorrectly). You really have to understand its mental model, without a lot of help, which I don't think is a good property in a UI. But, I have designed a part, and hope to try printing it later this week! https://media.hachyderm.io/media_attachments/files/114/193/434/158/565/810/original/d2deed2be7a117bb.png npub19znrep7u2jrsfvqs5aa3s352l4ppfnxyun8pt28yulnkd7k9x08q9spj90 cliffle Welp, I just learned about this cursed container format. Almost-but-not-quite a FAT filesystem image. Apparently used by Altium for PCBs. https://en.wikipedia.org/wiki/Compound_File_Binary_Format npub19znrep7u2jrsfvqs5aa3s352l4ppfnxyun8pt28yulnkd7k9x08q9spj90 cliffle Welp, other people have figured out that you can make a USB 1.1/2.0 device with a USBC connector that shows up as two different devices, depending on which way the cable's plugged in. I pointed this out as a _joke._ But, here's a dev board that gives you the RP2040 when plugged in one way, and the ESP32-C3 when plugged in the other way. Hope you've remembered to mark one side of your cable! https://lilygo.cc/products/t-pico?variant=42295946641589 npub19znrep7u2jrsfvqs5aa3s352l4ppfnxyun8pt28yulnkd7k9x08q9spj90 cliffle Gradually decorating my office, and I've been trying to get a nice poster of one of my favorite alternate periodic tables -- JF Hyde's. You can find these on Etsy, but every last one of them has removed the attribution and license block at the lower right corner. Because, y'know, Etsy. So I have caved, and I'm having one custom printed at VistaPrint. https://media.hachyderm.io/media_attachments/files/114/111/660/184/969/538/original/4fc7bc31df36b684.png npub19znrep7u2jrsfvqs5aa3s352l4ppfnxyun8pt28yulnkd7k9x08q9spj90 cliffle "Anything worth doing is worth doing badly." This has been a very important mantra for my personal development over the past few years. As a person who tends to get paralyzed about doing things "the right way" and wind up not doing them at all, it can be very helpful to remember that doing it poorly is almost always better than _not doing it._ (Though doing things well is of course nice.) Exercise. Art. Cooking at home. Hobby projects. Corresponding with your friends. Planning community events. All worth doing, and all worth doing badly. Not sure who needs to hear this, but, there you go. npub19znrep7u2jrsfvqs5aa3s352l4ppfnxyun8pt28yulnkd7k9x08q9spj90 cliffle For an art installation a friend and I acquired a cheap ultrasonic parametric array from AliExpress. It turned out to be painfully (perhaps dangerously) loud. But it also turned out to have some pads with its microcontroller's debug interface. So I did what you might expect: - Soldered on tiny wires - Convinced it to vomit its firmware - Loaded the firmware into Ghidra - Pored over it adding types and names and stuff and gradually figuring out what it did - Spent the weekend rewriting it in Rust and fixing a bunch of bugs So now we have output power limited to a safe (adjustable) level. In case you're curious... https://github.com/cbiffle/soundlaser-rs npub19znrep7u2jrsfvqs5aa3s352l4ppfnxyun8pt28yulnkd7k9x08q9spj90 cliffle @nprofile…59k6 it's probably a question of how much work the developer has put into the new windows/tablet modes. npub19znrep7u2jrsfvqs5aa3s352l4ppfnxyun8pt28yulnkd7k9x08q9spj90 cliffle @nprofile…59k6 "all applications are singleton, but some are more singleton than others" npub19znrep7u2jrsfvqs5aa3s352l4ppfnxyun8pt28yulnkd7k9x08q9spj90 cliffle Alright, so. Recently, about once a day, my #FrameworkLaptop 16 has been doing ... this. This results in the loss of all USB. Which includes the internal keyboard, any external keyboards, any bluetooth keyboards... basically, everything except the trackpad, which is HID-over-I2C, and the power button, which is wired to the cros EC. I wind up having to hard-power-cycle the machine. I'm resisting the urge to throw this annoyingly bendy laptop out a window. Anybody got any ideas for how to debug this? @nprofile…8xaf ? https://media.hachyderm.io/media_attachments/files/114/077/597/643/335/591/original/ba313eb4c363b537.png npub19znrep7u2jrsfvqs5aa3s352l4ppfnxyun8pt28yulnkd7k9x08q9spj90 cliffle After 36 years on the internet I'm starting to learn things about how to use it! People who show up in my threads making personal attacks with no substantive point will get a banal reply and a block. My values cause me to want to try to help them understand that they're being hurtful in case there's any hope of turning them into an ally, but I suspect that in most cases they're well aware of what they're doing, and fundamentally I can't heal the trauma of everyone on the internet. (As a friend said, "You do not owe random strangers this level of emotional labor.") I will no longer follow links to repos that don't seem immediately relevant to the conversation, which definitely includes ones presented with no commentary -- even to repos I respect (which is what tricked me this morning). Low-effort messages that require high effort to respond are a denial of service attack on my time, and are a more subtle form of trolling. Alright, let's see if I can continue being on Mastodon. npub19znrep7u2jrsfvqs5aa3s352l4ppfnxyun8pt28yulnkd7k9x08q9spj90 cliffle yessssss https://media.hachyderm.io/media_attachments/files/113/988/216/565/737/320/original/3f3db15bb068aac6.jpg npub19znrep7u2jrsfvqs5aa3s352l4ppfnxyun8pt28yulnkd7k9x08q9spj90 cliffle Been recording some profiles to try to explain _why_ my Rust translations of C programs tend to default to being faster. Here's an unexpected culprit: strlen/strcmp. The "natural" string representation in C is a char* pointing to a buffer that ends in a NUL (ASCII 0). To determine its length you have to crawl along it to find the NUL. To compare two strings, you need to do the same. In particular, because strcmp's return value isn't just a flag, but an integer giving the lexicographic relationship between the two strings ... it can't early exit if the lengths differ. The "natural" string representation in Rust is a &str, which combines a pointer and a length. Finding the length is a constant-time near-no-op; comparing two strings for equality can trivially early-exit. This might sound trivial, but profiles suggest it's a significant factor in wartcl being 4x faster than partcl across the board. In part, I suspect a lot of C programs do a lot of redundant strlen-computation unintentionally. #rustlang npub19znrep7u2jrsfvqs5aa3s352l4ppfnxyun8pt28yulnkd7k9x08q9spj90 cliffle Google, when questioned about poor service quality in Palestine: "We at Maps are above politics." Google under Trump: https://edition.cnn.com/2025/01/28/tech/google-maps-gulf-of-mexico-america/index.html Yeah how's that apolitical thing going npub19znrep7u2jrsfvqs5aa3s352l4ppfnxyun8pt28yulnkd7k9x08q9spj90 cliffle This is probably the best modern writeup on decoupling capacitance that I've seen. It's clear and brings the receipts! https://codeinsecurity.wordpress.com/2025/01/25/proper-decoupling-practices-and-why-you-should-leave-100nf-behind/ My EE colleagues at Oxide (who are much better at this than I am) have been trying to drive this point into my head for years. In related news, I just last week made my first board that was unstable at full CPU speed until I swapped out the 100nF "habit cap" for a 1u. It's real! npub19znrep7u2jrsfvqs5aa3s352l4ppfnxyun8pt28yulnkd7k9x08q9spj90 cliffle @nprofile…kyyd @nprofile…qz4x @nprofile…5n8f we really need an emoji for describing the seething disdain with which these companies view their customers (except as money sources). Like, "Made With 🙄 In Palo Alto" npub19znrep7u2jrsfvqs5aa3s352l4ppfnxyun8pt28yulnkd7k9x08q9spj90 cliffle @nprofile…gyrf but seriously, undefined behavior aside, I'd really want to see perf counter results on that negate. If the compiler takes it literally that's a move back and forth between functional units at best, and a move through cache at worst. Particularly when your processor probably... ...oh god. Is this all because x86 doesn't have floating point negate? I don't know the arch but I see a suspicious lowering in llvm. npub19znrep7u2jrsfvqs5aa3s352l4ppfnxyun8pt28yulnkd7k9x08q9spj90 cliffle @nprofile…gyrf I also notice the author is using "go faster spacing" around all operators. npub19znrep7u2jrsfvqs5aa3s352l4ppfnxyun8pt28yulnkd7k9x08q9spj90 cliffle 7.3 quake offshore from Eureka (CA), tsunami warning down the coast. Couple hours before the swell gets here, if it gets here. Check on anyone you know in Eureka/Arcata. npub19znrep7u2jrsfvqs5aa3s352l4ppfnxyun8pt28yulnkd7k9x08q9spj90 cliffle Wait, wait, wait. You're saying that we installed pervasive monitoring backdoors into all of our telecom systems, and then... ...the people we currently don't _like_ used them? How could that be possible? I thought we installed magical backdoors only we could use! Sigh. https://gizmodo.com/china-wiretaps-americans-in-worst-hack-in-our-nations-history-2000528424 npub19znrep7u2jrsfvqs5aa3s352l4ppfnxyun8pt28yulnkd7k9x08q9spj90 cliffle I'm, uh, "pleased" to report that the vulns found in Ubuntu's needrestart program are _not_ memory safety C problems! They are instead a shitshow of environment variable management problems. Did you know this program runs both Python _and_ Ruby interpreters in attacker-controlled environments? I SURE DIDN'T https://www.bleepingcomputer.com/news/security/ubuntu-linux-impacted-by-decade-old-needrestart-flaw-that-gives-root/ npub19znrep7u2jrsfvqs5aa3s352l4ppfnxyun8pt28yulnkd7k9x08q9spj90 cliffle Here's an interesting article on the use of tech that encourages "commodity" developers...as a deliberate tactic to deskill and disempower labor (that is, us). In hindsight, I feel that a lot of Google's internal rules around style/platform/technical consistency were more or less this class of thing. A tool to ensure that you can replace people with other people as needed, if they get too loud. (Which is not to say consistent style is bad. But.) https://www.baldurbjarnason.com/2024/react-electron-llms-labour-arbitrage/ npub19znrep7u2jrsfvqs5aa3s352l4ppfnxyun8pt28yulnkd7k9x08q9spj90 cliffle PCBWay isn't the best for _everything,_ but for bare PCBs they have one killer feature: If you place a second order before an earlier order ships, you can retroactively combine shipping. Given that shipping dominates the cost of short-run PCBs, this is _huge._ Particularly for people like me who may not have the best advance planning skills. npub19znrep7u2jrsfvqs5aa3s352l4ppfnxyun8pt28yulnkd7k9x08q9spj90 cliffle @npub1f3n…e887 code belongs in the liability column of the balance sheet. The ability to produce more of it should not be touted. How about the ability to produce less of it? npub19znrep7u2jrsfvqs5aa3s352l4ppfnxyun8pt28yulnkd7k9x08q9spj90 cliffle Heat pump is installed and working and oh man is it nice. - It's absurdly quiet -- the fan is variable-speed and mostly runs at its lowest setting. You can hardly tell it's on. - It's very good at maintaining the temperature in my (insulated) house. - It is noticeably not dying like my gas furnace was. - I can run it on electrons that I whittle myself on-site. In theory. Not there yet. Only used it for heat so far (because it's "summer" in Berkeley). npub19znrep7u2jrsfvqs5aa3s352l4ppfnxyun8pt28yulnkd7k9x08q9spj90 cliffle @npub1c9m…9xjd you know, that's another interesting point of variation between the two cultures: In scissors paper stone, it's presumably A4 npub19znrep7u2jrsfvqs5aa3s352l4ppfnxyun8pt28yulnkd7k9x08q9spj90 cliffle @npub1c9m…9xjd what does 14 pounds have to do with paper npub19znrep7u2jrsfvqs5aa3s352l4ppfnxyun8pt28yulnkd7k9x08q9spj90 cliffle My tote bag is attracting a lot of questions that I was pretty sure were answered by my tote bag. https://media.hachyderm.io/media_attachments/files/112/979/887/680/118/978/original/94714bb76ade20fa.jpg npub19znrep7u2jrsfvqs5aa3s352l4ppfnxyun8pt28yulnkd7k9x08q9spj90 cliffle Plums are ripening really fast right now, and I can only eat a few a day before people start to look at me funny. So preserves it is! #cooking https://media.hachyderm.io/media_attachments/files/112/912/411/623/184/764/original/b0a72be3bc916652.jpg https://media.hachyderm.io/media_attachments/files/112/912/412/644/597/603/original/e581975ca6ba5d2b.jpg npub19znrep7u2jrsfvqs5aa3s352l4ppfnxyun8pt28yulnkd7k9x08q9spj90 cliffle I'm sure this is my Rapid Eval brainrot, but I see a lot of pages about "how much will it cost to run a heat pump vs gas." They estimate heating/cooling hours based on your location, use SEER ratings and stuff, and come up with vague numbers. But if you _have your gas bill_ and an efficiency rating for a gas furnace, the question is basic thermodynamics? Like, your place required this many BTUs of heat input in the winter including losses; heat pump could've made that with this many kWh. npub19znrep7u2jrsfvqs5aa3s352l4ppfnxyun8pt28yulnkd7k9x08q9spj90 cliffle Thinking about how many C programs I've written, read, and maintained, that contained a subtly broken, buggy, partially implemented, and difficult-to-read implementation of Vec::retain. #rustlang npub19znrep7u2jrsfvqs5aa3s352l4ppfnxyun8pt28yulnkd7k9x08q9spj90 cliffle Well, great. My #FrameworkLaptop 16 has stopped detecting displayport alt mode connections on any of its expansion ports. It's been working okay since I replaced the non-functional keyboard and webcam they initially sent me, but I'm starting to run out of patience with the hardware issues on this expensive-ass laptop.