Updating Core Data object ID URIs on store migrations

I found out recently that Core Data object IDs can change. This usually happens if you migrate a store, such during a heavyweight migration (lightweight migrations don’t count, as they mutate in place). If you were like me and persisting object IDs, then you’ll have to update those URIs, or you will have a very bad day trying to fetch objects from these IDs.

The easiest way to do this is to lean on NSMigrationManager, because it has both the source and destination model versions, and can get the destination object version from the source version. If you’re manually doing the migration for model upgrades, you easily have it already. If you want to update it from a NSEntityMigrationPolicy, then the easiest option is to stash the NSMigrationManager by overriding beginEntityMapping:manager:error:. You provide it the source NSManagedObjects, and out comes the destination version’s managed objects, as shown below, of which you can get the new object IDs to persist in the new version of the model:

var manager: NSMigrationManager!

private func destinationURIsFromSourceObjects(_ objects: [NSManagedObject]) -> [URL] {
    return manager.destinationInstances(forEntityMappingName: "TrackToTrack", sourceInstances: objects).map {
        $0.objectID.uriRepresentation()
    }
}

Note that you need to provide the entity mapping name – regardless if your entities heavily changed or not. For the Xcode mapping model generator, check the name – it’s usually something like TrackToTrack. If you need to get the managed objects from the source version’s URIs, you can use the the sourceContext property in the migration manager to get the source model version’s managed object context.

Observation on the real-time strategy genre

Quick post sharing a theory I have. The RTS genre’s heyday was in the 90s. What used to be a big category of games that sold really well is mostly a niche, catering to the hardcore – and those just tend to play established games such as Age of Empires 2 or StarCraft. But the interesting thing to me is why it no longer is the case.

Continue reading

Fixing the “Not a heap block” error with networking with PCPro

I was trying to get the PC compatibility card (a Gemini II) in my Risc PC (StrongARM, running RISC OS 3.70) onto the network. However, when starting the emulated PC, I would get a “Not a heap block” error, and the emulated PC wouldn’t have its emulated network card.

It turns out this is because the program it invokes to find the most appropriate interface (this is called ScanDCI4) doesn’t actually work. This causes the script to fail, and not actually load the emulated NE2000 support module. To fix this, we’ll need to patch the script that starts the PC card networking support.

Continue reading

Formatting disks and clearing RAID config on Power systems with iprutils

I recently put some spare disks into a Power S814 server, and when I tried installing an OS, be it VIOS or Debian, it would say that there were no disks available to install onto.

It turns out that the RAID configuration on the controller and the disks didn’t match. This is par for the course with any RAID controller, even in the x86 world. It also didn’t help that some of the disks were formatted for IBM i, which uses non-512-byte block disks. We need to use the vendor utility to clear out the RAID config, and format the disks to be usable by commodity operating systems.

The two utilities IBM provides for this are either the diagnostics on the AIX Standalone Diagnostics disc, or using the iprutils set of software. Since netbooting Linux was easier as I don’t have a NIM server, I’m choosing to do the latter here.

Continue reading

Netbooting Alpine Linux on a PowerVM system

I had a need to run a utility that requires Linux (specifically, iprutils to configure a RAID card) onto a Power S814 that I had installed at a datacentre, and no remote hands to boot a CD with. However, there’s not much information documented on how to boot Linux on these systems from a network. This article aims to synthesize what I’ve found online, since information about IBM Power systems tends to be scant outside of IBM documentation..

Continue reading

Sleeping through a decade of Cocoa: Retrospective from modernizing an old Mac app

A few years ago since I started using Macs more often, one annoying thing I dealt with was using my local music library. My usual solution was to just drag files from the file manager to a music player, but this wasn’t as nice on macOS (due to i.e. SMB latency). However, I did have a Subsonic server, which provides a nice music streaming server, complete with an API for clients to use for things like phones. Why not use this on my laptop too?

Of course, if I bought a Mac, I’m not going to put up with bad cross-platform solutions that suck everywhere, when I can instead run bad native software that sucks uniquely for my platform of choice. However, there weren’t too many clients available on Mac. Mostly all of them were unmaintained and had been abandoned in the Snow Leopard era. One of them was Submariner, and it was open-source after the developer (Rafaël Warnault) had stopped working on it. Writing my own seemed a bit daunting with no background, but what if I used the Submariner codebase, and started from there?

Now I’ve been maintaining Submariner for almost two years at this point (it even has a minimal website), adding features and mostly just focusing on modernizing the codebase. It’s been an interesting experience as my first Objective-C/Mac project. A lot of the lessons of modernizing legacy code are universally applicable, but I’ve learned a lot about the specifics of Apple platforms and how they compare. This article aims to be both a retrospective on what I had to learn, what I had to do, and the lessons I took from it, including a comparison of what the development culture is like between platforms.

Continue reading

Fixing Returnal hanging at a black screen

I’ve been enjoying Returnal recently, but I’ve had a ton of technical issues with it. Half the time when starting the game, or performing certain actions, it would just hang at a black screen. Sometimes, the game would be still running and updating the system resource monitoring, but be completely unresponsive.

Turns out if you’re running Windows 10 LTSC, you lack the VP9 codec, which the cutscenes are in. The black screen is because it can’t play the cutscene properly. (Any bits about DX11/DX12 seem to be red herrings.) The VP9 codec is on the Windows Store, but since you don’t have that in LTSC, you can install it via other means. For example, this dump in the Internet Archive contains the codecs you’re looking for; install them, and after a reboot, things should work again.

Installing Photoshop CS2 on Windows 11

I was trying to install Photoshop CS2 on an ARM Windows 11 VM (this may affect x86 Windows 11 too), but was blocked by an error that went something like “Error 1926: Could not set file security for file C:\Windows\, Error 0”.

This is because the Windows installation directory has immutable permissions on Windows 11, but the Photoshop installer tried to reset file permissions on it anyways. (It’s quite possible other software might also be suffering from this too.) To fix it, we need to modify the MSI.

Continue reading

Restoring images without the futility of Disk Utility

I was trying to put a Mac OS X 10.6 image onto a USB stick to install on another system. To do this, I attempted to do it from a Mac running 13.6 and failed with a message like this when restoring the image to the partition:

Could not validate source - Invalid argument
The operation couldn't be completed. (OSStatus error 22.)

It turns out that Disk Utility is pretty broken at this. What you’re better off doing is using asr. This utility is what Disk Utility does under the covers anyways.

Continue reading

Why Macs don’t have games, or: Why Vulkan or the Game Porting Toolkit isn’t going to save you

Recently, one of Apple’s focuses at the latest WWDC keynote has been gaming. Two important pillars for this are an HLSL to Metal shader compiler, and the Game Porting Toolkit. Both are important, since HLSL is dominant for shaders in the industry, but the GPTK has become popular outside its intended target audience, with many videos with end-users instead of developers using it to try the latest AAA games. This has led to a lot of speculation online about what obstacles exist for game developers looking to port their games to Mac. What challenges actually matter?

(This is a bit of a rougher post, more addressing common points I see from Mac gamers on why they don’t have games. I’m not a game developer or expert in 3D graphics APIs, but I do keep up with the space. There is also some Kremlinology on Apple, but that’s inevitable considering the secrecy.)

Continue reading