Notes for March 4-10

A busy, exhausting work week punctuated by surreal moments that shall remain forever .

Monday, 2024-03-04

Woke up at 4AM, which kind of set the mood for the day.

Mark Knopfler tried his best to perk me up.
  • Powered through my morning calls by dint of using my standing desk and doing my best to keep a flask of coffee level.
  • Found new and enthralling ways to pick up 99 individual DuPont connector sheaths off the floor (Note to self: do not shake shipping baggies like sugar packets to settle the contents, because like sugar packets, they can have unseen rips). I have no idea if the missing one parachuted off the plane from China or if it is stuck in a cranny someplace.
  • Received a Keychron K7 Max (which I will be writing on–and about–at length in due time) and another set of replacement fans for my 3D printers. For someone who hates fans, I certainly spend a lot of time and effort trying to find quiet ones.
  • Managed to do a little more yak shaving and bump a few more items off my To-Do list, this time to streamline doing some repetitive tasks with images:
Most of these use Pixelmator Pro's local ML features.

Tuesday, 2024-03-05

Had to make a trip to the office again, which is becoming far more usual this year than I expected, so my free time was shot.

  • Got a new set of soldering helping hands in the mail. They’re not as nice as the exquisitely designed Omnifixo, but I really needed to find something that could hold bigger than “Pi-sized” PCBs and where I could fasten both an endoscope camera and a large (20cm across) Fresnel lens I have someplace. And yes, I should get a soldering microscope, but all the nice HDMI ones are outrageously expensive.
  • Got some P1P rubber feet and printed out some PETG holders to fasten them to the .
  • Had a somewhat unexpected early evening meeting.
  • Printed a Califlower to check and correct the for skew and dimensional error (which was minimal, but still a fun exercise). I suspect there are a lot of identical coasters in my future.

Wednesday, 2024-03-06

I have only vague recollections of the day, which was so productive work-wise that it risked spilling over and nuking my quality time.

  • Re-charged the batteries and cleaned the lenses on my Canon compacts–I still have an S95 and an SX710HS which I decided to start using again as more than a fashion statement towards “real” photography.
  • Had something like 5 calls in a row, including a couple of surprise ones that upended my work schedule a fair bit.
  • Had a quick lunch and benchmarked on the AceMagic AM18 (which is still running ), because who knows for how long that’s going to be possible. Spoiler: it can do a lovely 4K at almost 30fps, and the bottleneck seems to be mostly on the iGPU side. I suspect that 30fps with some aliasing tweaks are entirely possible, but am going to move on to other workloads ASAP because I need to get back to my AI stuff.
  • In the meantime, printed more Califlower coasters, this time on the . Calibrating printers is a meditative experience, and it’s such a nice respite from work than even though I have , all my desks are overrun with components and parts and I only have one unencumbered flat surface at shoulder height, I’m already considering if I shouldn’t build a new printer from kit.
  • On the tails of the above, spent a while spread throughout the day trying to re-pack the stuff that needs to be atop my electronics workbench into something functional.
  • Wrote a fair bit on the Keychron K7 Max and started fiddling with VIA to tweak a couple of things to my liking, but in the end went straight for raw QMK config editing, because simple macros didn’t cut it.
  • Had another somewhat unforeseen late night meeting.
  • Spent a couple of hours poring over ESP32 code to decompress and tried to get to bed early.

Thursday, 2024-03-07

Woke up at 4AM again with a splitting headache (either travel doesn’t agree with me or late night meetings, and I suspect both).

  • Celebrated #MARCHintosh by using my lovely to start a Basilisk build in the wee hours of the morning. I have plans for something portable, but am not sure it will get done this month. I would love to join the Global AppleTalk Network people are setting up, because it is so wonderfully nostalgic…
  • Another set of meetings that overran my lunch hour. Ate at 2PM, did chores, went back into the fray.
  • Had another late night meeting that, well, reminded me of the “may you live in interesting times” mis-quote.

Friday, 2024-03-08

Miserably rainy day. Woke up exhausted.

  • Got reacquainted with btop, which despite looking either like a “l33t” tool or like pants on a standard terminal is a great all-in-one solution for monitoring CPU, GPU, I/O, disk usage and network traffic and saves me the trouble of constantly installing iotop and htop.
  • Hacked together a kludgy Python script to mirror GitHub release artifacts. You know, just in case:
from os import environ, listdir, makedirs
from os.path import join, exists, getmtime, isdir
from shutil import rmtree
from json import loads
from asyncio import run, create_task, sleep, create_subprocess_shell
from asyncio.subprocess import PIPE, STDOUT 
from aiohttp import ClientSession
from logging import basicConfig, INFO, DEBUG, WARNING, getLogger

basicConfig(level=INFO, format='%(asctime)s %(levelname)s %(funcName)s:%(lineno)s %(message)s')
log = getLogger(__name__)

PROJECTS = environ.get('PROJECTS', 'Ryujinx/release-channel-master').split(',')
ARCHIVE_PATH = environ.get('ARCHIVE_PATH', 'releases')
RELEASE_COUNT = int(environ.get('RELEASE_COUNT', 5))

async def fetch(path: str, url: str) -> None: 
    proc = await create_subprocess_shell(f"wget -P {path} -N {url} -qnv", stdout=PIPE, stderr=PIPE)
    log.info(f"fetching {url} to {path}")
    stdout, stderr = await proc.communicate()
    log.debug(stdout)
    log.debug(stderr)

async def main() -> None:
    async with ClientSession() as session:
        for project in PROJECTS:
            log.debug(f'Fetching releases for {project}')
            async with session.get(f'https://api.github.com/repos/{project}/releases') as response:
                data = await response.json()
                filtered_data = [element for element in data if ((element["draft"] != True) and (element["prerelease"] != True))][:RELEASE_COUNT]
                for release in filtered_data:
                    folder = join(ARCHIVE_PATH, project, release['tag_name'])
                    if not exists(folder):
                        makedirs(folder)
                    for asset in release['assets']:
                        if not exists(join(folder, asset['name'])):
                            create_task(fetch(folder, asset['browser_download_url']))
                            await sleep(0.1)
                folders = [f for f in listdir(join(ARCHIVE_PATH, project)) if isdir(join(ARCHIVE_PATH, project, f))]
                log.info(f"checking for old releases in {project}")
                if len(folders) > RELEASE_COUNT:
                    folders.sort(reverse=True)
                    folders = folders[RELEASE_COUNT:]
                    for folder in folders:
                        log.warning(f"removing {project} release {folder}")
                        rmtree(join(ARCHIVE_PATH, project, folder))

if __name__ == '__main__':
    run(main())
  • Ended the day with another early evening call, and then just crashed without even managing to read a book

Saturday, 2024-03-09

Decided this was going to be a procrastination-friendly weekend, so after reading the news I went full on random geekery mode:

  • Tweaked my GitHub release mirroring script and checked it into my local Gitea instance.
  • Decided to fully upgrade on my (which I’d kept stable until getting the , so now I can use it for bleeding edge stuff again) and replace the puny 40mm internal fan with an 80mm one (my working theory is still that the Y layer shifts I’m seeing occasionally stem from poor cooling).
  • Tested on the Zero 3 again to take some screenshots. Then, for the sake of science, I installed moonlight-embedded on a Raspberry Pi Zero 2W and actually played stuff on it:
Not the best gameplay (and I need to plug some speakers into the LCD board), but it's a bit of a miracle given the hardware involved.
  • Printed a couple of school projects for the kids.
  • Since I needed a long duration print to test whether my was fixed, I printed my first miniature:
Not bad for 0.28 layer height

This may turn out to be addictive, but not yet. I don’t really fancy accumulating pretty dust collectors and am happy with sticking to functional parts…

Sunday, 2024-03-10

Election day, which I had completely forgotten about. I mean, it’s not as if Portugal has been under particularly effective government for a few years now.

  • Did some sysadmin stuff.
  • Voted. Found the number and naming of political parties hilarious (I remember when it was less than half a page).
  • Dove into IKEA for a bit of strategic storage implement acquisition (I always knew there would be a pegboard in my life sometime).
  • Got a VINDSTYRKA air quality sensor (that uses Sensirion hardware and Thread) to try out, because is tying up a Zero W I have other uses for and the poor Enviro+ board design generates inaccurate temperature readings since the cursor is too close to the Pi CPU. I do lose the ability to do my own metrics, but the VINDSTYRKA “just worked”–I paired it with my zigbee2mqtt network by tapping the pair button four times (took me a while to figure that out, as it isn’t documented in the booklet), and it immediately popped up in HomeKit and I can get centralized metrics from it, so… Net win, I guess. And yes, I’ll be checking the actual metrics in detail as soon as I have some time (I’ve got a vague “revise home IoT telemetry” entry in my TODOs since last year).
  • Upgraded ollama on my test machines and resumed fiddling with LLMs–this time I did some RAG over my notes, which might not have been the best of ideas:
If a measly ARM CPU can figure this out...

Decided to call it a day and do non-computer stuff afterwards.

Update: I went to check on my desktop Mac (a Mac Mini M2 Pro) and it had spontaneously rebooted barely 15 minutes before I got to it. I started digging into the logs (log show --last 45m is your friend) and saw nothing obvious except this:

...
2024-03-10 18:43:55.246304+0000 0x1743     Default     0x0                  0      0    kernel: (AppleThunderboltNHI) AppleThunderboltGenericHAL::lateSleep - complete - took 0 milliseconds
2024-03-10 18:43:55.246312+0000 0x1743     Default     0x0                  0      0    kernel: IOPlatformSleepAction -> AppleThunderboltHALType5
2024-03-10 18:43:55.246326+0000 0x1743     Default     0x0                  0      0    kernel: (AppleThunderboltNHI) AppleThunderboltGenericHAL::lateSleep - complete - took 0 milliseconds
2024-03-10 18:43:55.246332+0000 0x1743     Default     0x0                  0      0    kernel: IOPlatformSleepAction -> AppleThunderboltHALType5
2024-03-10 18:43:55.246346+0000 0x1743     Default     0x0                  0      0    kernel: (AppleThunderboltNHI) AppleThunderboltGenericHAL::lateSleep - complete - took 0 milliseconds
2024-03-10 18:43:55.246355+0000 0x1743     Default     0x0                  0      0    kernel: IOPlatformSleepAction -> AppleThunderboltHALType5
2024-03-10 18:43:55.246369+0000 0x1743     Default     0x0                  0      0    kernel: (AppleThunderboltNHI) AppleThunderboltGenericHAL::lateSleep - complete - took 0 milliseconds
2024-03-10 18:43:55.246378+0000 0x1743     Default     0x0                  0      0    kernel: PMRD: trace point 0x18
2024-03-10 18:43:55.246641+0000 0x1743     Default     0x0                  0      0    kernel: PE_cpu_power_disable>turning off power to cluster 1
2024-03-10 18:43:55.246810+0000 0x1743     Default     0x0                  0      0    kernel: PE_cpu_power_disable>turning off power to cluster 2
# Last line before crash
2024-03-10 18:43:55.246836+0000 0x1743     Default     0x0                  0      0    kernel: PMRD: trace point 0x19
2024-03-10 18:52:57.788824+0000 0x1743     Default     0x0                  0      0    kernel: PMRD: trace point 0x23
# ^^^ First line after crash
#...lots of IOPlatformQuiesceAction -> AppleT8101GPIOIC and similar stuff elided
2024-03-10 18:52:57.788995+0000 0x1743     Default     0x0                  0      0    kernel: cpu_start() cpu: 1
2024-03-10 18:52:57.789010+0000 0x1743     Default     0x0                  0      0    kernel: cpu_start() cpu: 2
2024-03-10 18:52:57.789017+0000 0x1743     Default     0x0                  0      0    kernel: cpu_start() cpu: 3
2024-03-10 18:52:57.789026+0000 0x1743     Default     0x0                  0      0    kernel: cpu_start() cpu: 4
2024-03-10 18:52:57.789039+0000 0x1743     Default     0x0                  0      0    kernel: cpu_start() cpu: 5
2024-03-10 18:52:57.789041+0000 0x1743     Default     0x0                  0      0    kernel: [ 7257.592453]: arm_cpu_init(): cpu 1 online
2024-03-10 18:52:57.789054+0000 0x1743     Default     0x0                  0      0    kernel: cpu_start() cpu: 6
2024-03-10 18:52:57.789055+0000 0x1743     Default     0x0                  0      0    kernel: [ 7257.592462]: arm_cpu_init(): cpu 2 online
2024-03-10 18:52:57.789057+0000 0x1743     Default     0x0                  0      0    kernel: [ 7257.592458]: cpu_start() cpu: 5
2024-03-10 18:52:57.789068+0000 0x1743     Default     0x0                  0      0    kernel: cpu_start() cpu: 7
2024-03-10 18:52:57.789080+0000 0x1743     Default     0x0                  0      0    kernel: cpu_start() cpu: 8
2024-03-10 18:52:57.789086+0000 0x1743     Default     0x0                  0      0    kernel: [ 7257.592498]: arm_cpu_init(): cpu 4 online
2024-03-10 18:52:57.789098+0000 0x1743     Default     0x0                  0      0    kernel: cpu_start() cpu: 9
2024-03-10 18:52:57.789100+0000 0x1743     Default     0x0                  0      0    kernel: [ 7257.592508]: arm_cpu_init(): cpu 5 online
2024-03-10 18:52:57.789111+0000 0x1743     Default     0x0                  0      0    kernel: PMRD: trace point 0x22
2024-03-10 18:52:57.789113+0000 0x1743     Default     0x0                  0      0    kernel: [ 7257.592522]: arm_cpu_init(): cpu 6 online
2024-03-10 18:52:57.789121+0000 0x1743     Default     0x0                  0      0    kernel: IOPlatformWakeAction -> AppleThunderboltHALType5
2024-03-10 18:52:57.789134+0000 0x1743     Default     0x0                  0      0    kernel: IOPlatformWakeAction -> AppleThunderboltHALType5
2024-03-10 18:52:57.789145+0000 0x1743     Default     0x0                  0      0    kernel: IOPlatformWakeAction -> AppleThunderboltHALType5
2024-03-10 18:52:57.789150+0000 0x1743     Default     0x0                  0      0    kernel: [ 7257.592555]: arm_cpu_init(): cpu 8 online
2024-03-10 18:52:57.789152+0000 0x1743     Default     0x0                  0      0    kernel: [ 7257.592564]: arm_cpu_init(): cpu 9 online
2024-03-10 18:52:57.789165+0000 0x1743     Default     0x0                  0      0    kernel: IOPlatformWakeAction -> AppleThunderboltHALType5
2024-03-10 18:52:57.789167+0000 0x1743     Default     0x0                  0      0    kernel: [ 7257.592564]: arm_cpu_init(): cpu 9 online
2024-03-10 18:52:57.789169+0000 0x1743     Default     0x0                  0      0    kernel: [ 7257.592564]: IOPlatformWakeAction -> AppleThunderboltHALType5
2024-03-10 18:52:57.789181+0000 0x1743     Default     0x0                  0      0    kernel: IOPlatformWakeAction -> AppleMCA2Switch
2024-03-10 18:52:57.789373+0000 0x1743     Default     0x0                  0      0    kernel: IOPlatformWakeAction -> IODTNVRAMPlatformNotifier
...

…so I went and filed Feedback FB13682232, in hope that Apple can make some sense of it. Smells like a kernel bug to me.

Update 2: I managed to get the panic log by logging in as an admin user, and the first lines are:

panic(cpu 0 caller 0xfffffe002fc97ce8): Wake transition timed out after 35 seconds while calling power state change callbacks. Suspected bundle: com.apple.driver.AppleThunderboltNHI. Thread 0x1bff1f.
Debugger message: panic

And guess what, this particular kind of issue with com.apple.driver.AppleThunderboltNHID has been reported since the M1 days.

I’m going to update Feedback FB13682232, but I’m not holding my breath given how long this issue has been around.