“The never-ending notary nuisance,” or, “infinite loop at Infinite Loop”

A couple weeks ago, Apple posted a note that says:

In an upcoming release of macOS, Gatekeeper will require Developer ID–signed software to be notarized by Apple.

Being a developer of Developer ID-signed (i.e., non-App-Store) software, I set out to vault Apple’s latest hurdle.

Xcode includes a command-line utility called altool that manages the notarization process. That seems appropriate since my app isn’t built using Xcode’s build system.

Emulating "defer" in C, with Clang or GCC+Blocks

In the Go language (and now Apple’s Swift), there’s a new control-flow mechanism: defer.

When you tag a function call with the defer keyword, its execution is deferred until the end of the current scope. This makes it easy to construct an ad-hoc use of the RAII pattern — handy for placing resource initialization and finalization next to each other, to make it less likely that you’ll forget to finalize a resource.

I was curious whether it was possible to do something similar in C. It turns out it’s pretty straightforward.

Found: 25-year-old COSI visitor guide

I’m in the middle of cleaning and packing to move house, and I came across a time capsule I made as part of a workshop at COSI (Columbus, Ohio’s science museum), 25 years ago today (1988.07.14). I was 5 years old at the time.

Included in the time capsule were two pieces of yarn identifying my height and circumference, and a personal-facts sheet, mentioning such things as my favorite musician (Herbie Hancock, of whom I’d recently become aware via his appearance on Sesame Street) and my favorite toy (the Yamaha PSS-470 synthesizer with its wonderful FM modulation control panel).

And this Souvenir Program, submitted for your approval —

Apple Radar vs. Time

I recently filed an Apple Bug Report, which was marked as a duplicate. The actual bug isn’t terribly important, but the difference between the serial number of the bug I filed (10426480) and the serial number of its alleged duplicate (3323328) – about 7 million – surprised me. Just how old was this still-unfixed bug?

I slogged through the lists.apple.com archives and the bugs users have manually posted on openradar.appspot.com to compile a list of Radar Numbers and the dates they were filed, and ended up with this:

Recovering From a Failed ZFS Root Mirror Disk

Hypothetical. Say, for example, you’ve got a ZFS mirror on disk0 and disk1, from which your Nexenta system boots. A year or two later, disk0 crashes, and starts spewing messages such as the following:

 ahci: [ID 860969 kern.warning] WARNING: ahci0: ahci_port_reset port 0 the device hardware has been initialized and the power-up diagnostics failed

Shortly thereafter there’s a storm and the power goes out for several hours and drains your entire humongous UPS, and when the power finally comes back on, the system won’t boot — it stops at the grub prompt; issuing a standard boot command fails.

JFS on Linux = Surprisingly Lossy

I set up a RAID media server a couple years ago, and decided to give JFS2 a try, since it’s touted as being fast and reliable across the spectrum of usecases. My setup is primarily write-once-read-many, for storing the terabytes of audio and video recordings I’ve made over the last decade for project ruori and the like.

Several weeks ago, the power went out for an extended period of time while I was away, and, while it was on UPS backup, it failed to shutdown cleanly and the power was suddenly cut when the UPS ran out.

When I brought the machine back up, the volume wouldn’t mount, so I ran jfs_fsck on it. jfs_fsck said that the journal was corrupt, and started block-scanning. It came up with a pretty big list of files and directories that were irrevocably corrupt. Parts of a few of them got linked into /lost+found, but the majority simply vanished.

Funny thing is, I hadn’t made any changes to these files in several years. I could understand if maybe some very recent FS updates were lost due to write-caching, but why did it lose track of these ancient files?

This reminds me of the rampant table corruption of MS-DOS’s FAT16 filesystem, which couldn’t keep track of a needle dancing on the point of a needle.

So, plus one for backups of backups, and minus one for JFS on Linux. I think I’ll be rebuilding the machine with ZFS-fuse. Or OpenSolaris, for that matter.


Steve Mokris is a developer at Kosada, Inc.

NSSound and Enumerating CoreAudio Output Devices

Cocoa’s NSSound provides a blindingly simple way to play back audio asynchronously, and even provides some metadata and control over how the audio is played back.

It uses the default sound device, by default. It gives you the ability to change the output device.

According to the documentation:

- (void)setPlaybackDeviceIdentifier:(NSString *)playbackDeviceIdentifier
 
Specifies the receiver's output device.
 
playbackDeviceIdentifier
    Unique identifier of a sound output device.

That’s it. What is the “Unique identifier of a sound output device”? What format is this “Unique identifier”? How do I get a list of the “Unique identifiers” of the available output devices on my system?

PHP's __autoload() function is Deprecated: Use spl_autoload_register() Instead.

PHP logoPHP 5’s spl_autoload_register() function has been around since late 2005, yet documentation on it is still pretty sparse.

spl_autoload_register() does basically the same thing as __autoload(), but – instead of being a callback defined in the global namespace (reminds me of ON ERROR GOTO in BASIC) – it allows you to add your autoload handler onto the end of a chain of callbacks. Useful if you don’t want to clobber everyone else’s autoload code.

More info here.

Apple Mail Hack: Move Message To Sent Folder

In the year that has elapsed since I failed to explain why I was using PINE for email, I’ve switched to Apple Mail.

Well, it’s been alright, but much to my regret the improved latency due to keystrokes only traveling around my local machine – instead of through the interweb and back as was the case with PINE on a remote machine – makes it almost justifiable. Almost.

Some Wild MacBook Pro Checkerboard Graphics Corruption / Crash

Last summer Kosada purchased a MacBook Pro for the president of one of Kosada’s consulting clients. It’s been a great improvement over the old Dell laptop he was formerly using, and, though he was initially worried about whether he’d be able to grasp the new UI, he seems to have picked it up quickly, and he reports that he’s been loving it.

But this morning he called me with a rather odd problem:

“I hooked up my Treo and started syncing it, then walked away for a few minutes. When I returned, the screen was covered with a bunch of squares, and I can’t do anything.”

NSURLConnection's sendSynchronousRequest enforces minimum 30 second timeout?

While writing the new Image Downloader (Blocking) QC patch for CoreMelt, I ran into what appears to be a bug in Mac OS X’s NSURLConnection framework – if you construct an NSURLRequest and specify a timeout of less than 30 seconds, it’s ignored when you perform a [NSURLConnection sendSynchronousRequest:returningResponse:error:]. The request takes at least 30 seconds to time out, contrary to what the documentation suggests..

Steps to Reproduce:

How to make Pop-Up Menus in Custom Quartz Composer Patches

screenshot of a custom Quartz Composer patch's pop-up menuMaking pop-up menus in custom Quartz Composer patches is actually surprisingly easy.

This release is only compatible with Tiger (10.4).
Please see kineme.net for Leopard-specific informations.
  1. Set up a QCIndexPort input. QCIndexPorts provide values from 0 to whatever max you specify using - (void)setMaxIndexValue:(unsigned int)max;.