566Writing and Reading Preferences

Writing

CFStringRef textColorKey = CFSTR("defaultTextColor");
CFStringRef colorBLUE = CFSTR("BLUE");
CFPreferencesSetAppValue(textColorKey, colorBLUE, kCFPreferencesCurrentApplication);
CFPreferencesAppSynchronize(kCFPreferencesCurrentApplication);

Reading

CFStringRef textColorKey2 = CFSTR("defaultTextColor");
CFStringRef textColor;
textColor = (CFStringRef)CFPreferencesCopyAppValue(textColorKey2,kCFPreferencesCurrentApplication);

textColor must still be releasesed with CFRelease(textColor);

Side note As we should know by now, CFStringRef is a toll-free bridge to NSString, meaning it's possible to use a CFStringRef like a NSString.

NSLog(@"my CFStringRef %@", textColor);

More at Preferences Programming Topics for Core Foundation

553CAAnimation and the Snapback Problem

Having previously done Core Animation only on the iPhone, I am still a beginner when it comes dealing with in on OSX.

The first thing that surprised me, is that layers have implicit animations; meaning whenever you change a value, the layer will animate to it using certain defaults. (duration = 0.25, etc.) While it is nice, I am still looking for a way to control it.

When you want to know, when an animation is finished, you need to make a CAAnimation, set the delegate and let it call animationDidStop:

CAAnimationGroup *group = [CAAnimationGroup animation];
group.delegate = self;
group.duration = 0.25;
group.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut];

CABasicAnimation *position = [CABasicAnimation animationWithKeyPath:@"position"];
position.fromValue = fromPointValue;
position.toValue = toPointValue;

CABasicAnimation *opacity = [CABasicAnimation animationWithKeyPath:@"opacity"];
opacity.fromValue = [NSNumber numberWithFloat:1.0];
opacity.toValue = [NSNumber numberWithFloat:0.0];

group.animations = [NSArray arrayWithObjects:position, opacity, nil];

[removeTarget addAnimation:group forKey:@"group"];

While this animates nicely, it still is not quite right. Because the layer basically does not know, that it values are changed in the animation, and therefore, after the animation stopped, the values are reset to the ones BEFORE the animation.

That's the annoying snapback.

To get rid of it, tell the layer the new values, right after you add the animation.

removeTarget.opacity = 0.0;
removeTarget.position = toPointValue;

%nbsp;

Interesting to see, that others seem to go throught the same learning experience.

391Creating a RAM Disk in OSX

OSX 10.6.2

diskutil erasevolume HFS+ "ramdisk" hdiutil attach -nomount ram://1000000

Would create a 500MB RAM Disk. The size is calculated in 512K Block, 512K * 1000000 = 500MB

Works nicely.

From here.


However, if you want to mount the RAM Disk at a specific point in your filesystem, the method above does not seem to work.

Instead try:

hdiutil attach -nomount ram://10000 Create, attach but do not mount our RAM Disk (returned /dev/disk2)

newfs_hfs -v Ramdisk /dev/disk2 Name and format the disk

mount -t hfs /dev/disk2 /your/path/ Mount the disk at a specific point. The address has to be absolute, and should point to an empty folder. Once mounted, the folder gets replaced by the RAM Disk.

umount /dev/disk2 Unmounting by ejecting the disk does not seem to work...

Sources: - - - - -

327Launchd – Reacting to System Events

launchd can be used to montor files and folder and execute certain actions when these files or folders change. Especially useful when an App crashes and writes a log to the CrashReporter. Tutorial, Lingon Helper App

442Transparent Background in Safari 4.0

http://127.0.0.1/transparent/

Enable Debug Menu in Safari 4.0:

defaults write com.apple.Safari IncludeInternalDebugMenu 1

via http://trac.webkit.org/wiki/WebDevelopers

Also, an interesing option is to modify the .nib file of Safari and insert a new menu: http://pointum.com/safari-tweaks.html