Thursday, October 16, 2025

Continue printing when Brother HL-L6200DW says it's out of toner

My old HL-6200DW Brother laster printer ran out of toner. It happens. I've never been able to get it to bypass the low toner hard stop, but now we have Perplexity.

The ai suggestions didn't work. I suspect they do work on newer printers. But the description of oddball key combinations made me look at bit further with some additional search terms. This time old decrepit and battered Google Search actually found a fix on an obscure toner sales site.

Here it is, from them, for posterity (or until I die):
 Open the toner access door on your printer.
• Press the Secure and Cancel buttons at the same time.
• Use the arrow buttons to select the correct toner yield of the toner you are using
TNR-STR = Starter cartridge
TNR-STD = TN-820 standard yield
TNR-HC = TN-850 high yield
TNR-S.HC = TN-880 super high yield
• After you have found your toner cartridge type, press OK
• Press up arrow to Reset

I don't think it matters which cartridge you choose, that just determines what count is applied and any of them will exhaust your low toner. But it does allow continued printing while waiting for a replacement.

(The printer is end-of-life, it's had one drum replaced. I keep it because it's unlikely there's anything better today.)

Thursday, October 09, 2025

Vibe coding a python script to create a plain text file with my macOS Photos (Aperture) folder hierarchy

My single greatest Photos.app frustration (I have many) is the inability to search the folder hierarchy. Mine contains hundreds semantically important folder names where the hierarchy is also meaningful. Meaning lost in the catastrophic Aperture to Photos migraiton.

This morning I had an hour free so I asked an ai about available utilities and workarounds. It said there are really no good options, but the Python osxphotos module might be able to traverse the folder hierarchy.

I have dabbled in minor Python coding and I have a half-baked Visual Studio Code environment. So I asked Claude 4.5 in Perplexity (this is not a formal supported coding environment) to write me a script that would use osxphotos to build a text file representation of the hierarchy. I ran whatever it generated.

It took 4-5 tries. I never edited the code myself. The first time there were copious errors, I describe errors and requested a redo. The next two times there were fewer errors, but I only got the top level of the hierarchy. The ai added debug code. It took two more tries of running and reporting errors to get a script that generated the text file I wanted (example):

[Teams and Orgs / MN Special Hockey / MNSH 2006 pre-season] MNSpecialHockey_060317
[Teams and Orgs / MN Special Hockey / MNSH 2022-2023] MSH 2023 Printed
[Teams and Orgs / MN Special Hockey / MNSH Woodbury 2019-2020] MSH Portraits Jan 2020
[Teams and Orgs / MN Special Hockey / MNSH 2008-2009] Nov 2008 MN SH Section 108 Event
[Teams and Orgs / MN Special Hockey / MNSH 2021-2022] Portraits MNSH Woodbury 2022

This is most personally valuable code I have ever "produced" since my days of writing the "medtrans" C program to turn 1990s MEDLINE output into tab delimited importable text.

And I wrote none of it.

I'll be cleaning it up and refining it, but below is the code I have today. It also included album names within a containing folder - I didn't want that but now I find it useful so I'll leave it.

Code

#!/usr/bin/env python3
"""
Export Photos folder and album hierarchy to a text file with tab indentation.
Requires: pip install osxphotos
"""

import osxphotos
from pathlib import Path

def export_folder_hierarchy(output_file="photos_folders.txt"):
"""
Export Photos library folder/album structure to a text file.
Args:
output_file: Path to output text file (default: photos_folders.txt)
"""
# Initialize connection to Photos library
photosdb = osxphotos.PhotosDB()
# Get folders and albums
folders = photosdb.folder_info
albums = photosdb.album_info
print(f"Found {len(folders)} folders and {len(albums)} albums")
# Build maps for folders
folder_map = {f.uuid: {'obj': f, 'children': [], 'type': 'folder'} for f in folders}
# Add albums to the structure
for album in albums:
# Albums have folder_names property which is a list of folder names in the path
if hasattr(album, 'folder_names') and album.folder_names:
# Try to find the parent folder by matching folder names
# folder_names is a list like ['Top Folder', 'Sub Folder']
# We want to match the first (top-level) folder name
top_folder_name = album.folder_names[0] if album.folder_names else None
if top_folder_name:
# Find folder with matching title
parent_folder = None
for folder in folders:
if folder.title == top_folder_name:
parent_folder = folder
break
if parent_folder and parent_folder.uuid in folder_map:
folder_map[parent_folder.uuid]['children'].append({
'obj': album,
'type': 'album',
'title': album.title,
'folder_path': ' / '.join(album.folder_names) if album.folder_names else ''
})
# Recursive function to write hierarchy
def write_item(f, item_data, level=0):
"""Write item and its children with proper indentation."""
indent = '\t' * level
if item_data['type'] == 'folder':
folder = item_data['obj']
f.write(f"{indent}{folder.title}/\n")
# Sort children alphabetically
children = sorted(item_data['children'], key=lambda x: x.get('title', x.get('obj').title).lower())
for child in children:
if child['type'] == 'album':
# Write album with its folder path if nested
folder_path = child.get('folder_path', '')
if folder_path:
f.write(f"{indent}\t[{folder_path}] {child['title']}\n")
else:
f.write(f"{indent}\t{child['title']}\n")
else:
write_item(f, child, level + 1)
# Find root folders
root_folders = [folder_map[f.uuid] for f in folders if f.parent is None]
root_folders = sorted(root_folders, key=lambda x: x['obj'].title.lower())
# Write to output file
with open(output_file, 'w', encoding='utf-8') as f:
f.write("Photos Library Folder Hierarchy\n")
f.write("=" * 50 + "\n\n")
for root in root_folders:
write_item(f, root)
print(f"Folder hierarchy exported to: {Path(output_file).absolute()}")
print(f"Total top-level folders: {len(root_folders)}")

if __name__ == "__main__":
export_folder_hierarchy()

Monday, August 04, 2025

Apple's ai opportunity is context

I use Perplexity as my $20/m answer engine -- and for generic ai tasks. I don't want Perplexity as a longterm ai provider, but I do like being able to experiment with different models. Currently all the leading not-free models are pretty good, but some are more sycophantic than others. I dislike sycophancy; ChatGPT and Sonnet have less of it than Gemini but all are too eager to please (prompts help but one has to be careful not to reveal a preference for a particular response).

For me, at this time, all of the models work significantly better with quite a bit of context. In Perplexity that context is provided in Spaces. Spaces include reference material and the model/prompt settings for the Space.

The great mass of people are not going to do that sort of context work. So vendors are trying to answer questions and apply (lower cost) models without context. Meanwhile they try to scrape together a lot of knowledge about the user from whatever source they get.

Apple's opportunity is they can assemble a lot of context. In my case GBs of information on my main drive, not to mention my calendars, contacts, notes and so on. Apple could ask questions to provide a general default context, such as preference for sycophancy, references to use, web resources, textbooks and so on. 

I consider Apple to be a broken company. I don't think they will be able to get their ai act together under Cook. But if they can, they do have advantages.

Sunday, July 20, 2025

Tip: Let your ai tell you what's new and novel in an iOS or macOS release

I like to wait a month (iOS) or six months (macOS) before applying major updates. By the time I apply them all the useful tips and tricks I read along the way are ancient history.

Instead of trying to keep track of these things before the OS is installed wait until you are ready to pull the trigger. Then ask your ($20/m) ai to summarize known issues and interesting new features, tips and tricks. You can provide context as needed (ex: I am an expert user, etc).

PS. Apple got away from providing PDF versions of manuals and user guides -- but if they still did that I'd drop the PDFs into my Perplexity macOS Space.

Wednesday, July 16, 2025

New lessons on macOS network home backup: WiFi issues and so many bugs

Recently we had a flurry of home computing issues. They feel typical of our time where multiple bugs interact across multiple environments.

In this case there were 3-4 different bugs and failures that impacted our home network and especially backup. The lessons learned were not in my ai responses so they seem worth sharing. The interacting bugs included:
  1. Apple hardware bugs in the M1 Air that can make the Air WiFi unreliable. (Could be drivers/software but persistence suggests either a very hard problem or hardware with possible software mitigation.)
  2. The odd behavior of Eero wifi
  3. Bugs and limitations in macOS SMB networking and in HPFS mean network share filesystems can be corrupted beyond repair.
  4. A completely unrelated red herring that turned out to be due to CenturyLink's parent org messing up their DNS configuration.
Such is the nature of our times, where complexity and unsustainable share prices combine to decrease reliability of core systems.

At the core was WiFi instability. Our M1 Air WiFi was constantly fluctuating, leading to constant disconnects. I knew there was something wrong as Carbon Copy Cloner would quite often warn that a backup was being transiently disrupted by the network share disappearing. The very frequent write/read failures presumably led to the HPFS hard drive file system corruption. I had to diagnoses and fix the drive connection before focusing on the underlying WiFi issue.

Things I am doing differently now:
  1. Reconfigured physical layout of our Eero base stations so there was a direct "line of sight" short distance between the M1 Air dock location and the Eero base station. The M1 Air needs a much stronger than usual WiFi connection to be stable. The new configuration also offloads some traffic from an overloaded Eero device.
  2. We use a Synology Time Machine server as a secondary (not robust) backup. That backup was also corrupted (happens normally anyway -- because bugs, but WiFi issues sped it up). At least in Sequoia if you remove a Synology TM backup destination and then add it back there's an option to replace the original. This is faster than wiping it from the Synology side.
  3. I used advanced preferences so Carbon Copy Cloner will dismount the network share after a clone/backup is compete. The less that share is open the better because it's hosted from a MacBook Pro that can be disconnected from the network, and macOS/SMB does not handle that disconnect gracefully.
  4. I had configured a user quota for one of our machines that had become too small. Time Machine should have provided guidance about capacity but did not do so in a useful way.
Related

Thursday, June 26, 2025

Bug in iOS 18.5 eSIM removal - you have to let it update your contacts

When Tello failed to transfer my CenturyLink number I canceled their service. I then tried to remove their eSIM from my phone. Apple's instructions worked -- but the line name remained even with a deleted eSIM.

It's a bug.

When Apple asks if you want to update any contacts using the number associated with the removed eSIM you have to say yes -- even if there are none. Looks like a simple logic bug. Then the entry will be removed.

Tuesday, June 24, 2025

Create a macOS desktop shortcut (.inetloc) that deep links to a specific note in Notes.app

Writing this up quickly, I might get back to it later.

I want to have a shortcut to a specific macOS Notes.app note that I can put in a folder.

1. In the note I want to link to hit ⌘K. Search on name of the current note.

2. Do NOT use the note title option. Unclick that and provide your own title. Create link in note.

3. A link is created in the note. Click on that that and then drag it to the desktop. An inetloc file with a deep link is created.

This is what the .inetloc shortcut has in it:

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">

<plist version="1.0">

<dict>

<key>URL</key>

<string>applenotes:note/fcbf1ab3-4779-49d5-b12f-ab33e9809113?ownerIdentifier=_5e4c6731f56ce6c061ce7014d9bc1b2a</string>

</dict>

</plist>