Deprecated: Function split() is deprecated in /mnt/home/cn/cn-web/songshu/lib/pages/DisplayBlogArticleList.php on line 36
Articles matching: Mac
Ninjas are deadly. Chipmunk Ninjas are just weird.
About this blog
Marc Travels
Marc on Twitter
JustLooking on Twitter

Marc Wandschneider is a professional software developer with well over fifteen years of industry experience (yes, he really is that old). He travels the globe working on interesting projects and gives talks at conferences and trade shows whenever possible.

My Publications:

My book, "Core Web Application Programming with PHP and MySQL" is now available everywhere, including

My "PHP and MySQL LiveLessons" DVD Series has just been published by Prentice-Hall, and can be purchased on Amazon, through Informit, or Safari


Popular Articles:

Top Tags:

Recent Comments:

cncool wrote:

GLint zeroOpacity = 0;
[[self openGLContext] setValues:&zeroOpacity forParameter:NSOpenGLCPS...
Posted to: Things I've learned about CoreImage (and Quartz, and OpenGL) in two weeks
Jun 28, 2009 | 04:20:13
JustLooking 3.3.1 Released
By marcwan

Visit the JustLooking home page

I am happy to announce the immediate availability of JustLooking 3.3.1. This is a minor maintenance release, and includes the following:

  • A quick bug fix for image blurring in the main window that I accidentaly re-introduced in 3.3.
  • A completely new Turkish translation by Oğuzhan Öçbe (thank you).
  • Updates to French and Korean

The original 3.3 release announcment has links to the new files to download.

As always, any feedback, comments, or gifts of bottles of wine are appreciated! :)


[Read Rest of Article]
Jun 19, 2009 | 22:07:00
JustLooking 3.3 (Mac Image Viewer) now available for Download
By marcwan

Visit the JustLooking home page

I am thrilled to announce the immediate availability of JustLooking 3.3.2. JustLooking is a program to view pictures and images on your Mac OS X (Tiger or newer) based computer. JustLooking is a Universal Binary, and can be run on both PowerPC and Intel Macs. The program is and will always be very free

Version 3.3.2 of JustLooking is the best version yet, and contains some massive changes and improvements over previous versions:

  • Switching between images is significantly smoother and less jerky than before.
  • Images can now be sorted by the same order as “Finder”, or by date, with support for reverse sorting.
  • Shuffle mode for full screen slide show.
  • You can now rename files or move them to a different folder
  • When you ‘save as’ or move an image to a different directory, you can now tell JustLooking not to switch folders and reload the file list.
  • Image properties and meta data (i.e. Exif) are now properly saved along with files. Colour Profiles are also correctly managed now.
  • Zooming is fixed to be a bit less unpredictable
  • File resizing and saving is also much better than before, although, due to limitations in the CoreImage filters I’m using for resizing, still not perfect. The huge white lines seen in previous versions after resizing are now gone, but there are still some unfortunate artifacts on occasion. I will completely rewrite this code for the 4.0 series of JustLooking.
  • The JustLooking application icon looks less horrible now.
  • New Slovakian translation!

JustLooking 3.3 ships in the following languages:

  • French
  • Italian
  • Chinese (Simplified)
  • Portuguese
  • Spanish
  • Dutch
  • Slovenian
  • Polish
  • Korean
  • Catalàn
  • Finnish
  • German
  • Slovakian (new!)
  • Turkish (new!)
  • Croatian (new!)

Swedish, Russian, Traditional Chinese, and Norwegian have not been included in this version as they are getting too out of date now.

Feedback and Bug Reports

I will soon begin work on 4.0, although I have a full time job now (gotta pay the bills, y’see), so the progress will be a bit slower again. If you have any feature requests, please do let me know, and I will endeavour to add them.

[Read Rest of Article]
Mar 15, 2009 | 19:53:09
A mouse most unmighty indeed
By marcwan

As a child, my parents were very much of the train of thought that if you can’t say anything nice, it’s far better not to say anything at all. This leads me to frequently try to mute my (lack of) enthusiasm about various things I encounter, to varying degrees of success. And so, with the purchase of an iMac a few months ago, I’ve been constantly biting my lip, saying only wonderful things about it. But I can continue this charade no longer. It must be said:

The Apple Mighty Mouse sucks. Spectacularly so. Were it not for the pretense that this is supposed to be a semi-serious blog that semi-serious people will read and use to judge me in my professional activities, the length of the stream of invective that would come forth from my mouth (uh, fingers) would be surpassed only by the creativeness of the language chosen.

This is an assertion that didn’t just come overnight, either. I decided to overlook the fact that the mouse looks and feels like a Mentos suffering from gigantism, as well as the fact that the cable is about as flexible as a three day old corpse, as long as a cotton swab, and has a penchant for sticking up in the most annoying possible ways.

Indeed, even the stunningly annoying right mouse button that requires you to lift your finger from the mouse in an-RSI inducing manner before pressing it again so that it registers as a right click (with a failure rate of about 30%, I’ve found) is something that I was willing to tolerate. I pretended that the two side buttons, which work so poorly that that one scratches one’s head as to why they’re even there, don’t even exist.

The straw that broke the camel’s back? The mouse thumb roller ball. At first, it doesn’t even feel like a ball, but instead some sort of rubber nubbin thing that just registers vibrations and follows the motion. But appearances are deceiving: It’s just a little rubber ball with tiny pins inside that track its motion.

Remember how computer mice used to all have rollers in the bottom before everybody decided they massively suck and moved to optical systems? It wasn’t because of cost or construction – it was because that every single piece of dust, fuzz, or body hair that got within 10 feet of it would immediately be sucked inside the mouse and gum up the rolling pins. Consumers had to spend time every month disassembling their new fan-dangled computer equipment to remove the human detritus that had been gathering on their desk.

So, why did Apple decide to not only include a roller inside their new mighty mouse, but include one so delicately placed and finely tuned that it was guaranteed to gunk up within a matter of weeks? The mind boggles. What’s that? You live in a dusty climate that doesn’t resemble Silicon Valley? Hrm, we hadn’t thought of that one. I lost the ability to scroll vertically after 3 short weeks of ownership.

It gets better! Not only is there a mouse roller ball with pins and loads of goonk inside their mouse that requires constant cleaning, but they made the mouse impossible to open and clean! Yes, they super-glue the assembly together so that the only way to open it is with a very sharp blade, some equipment to pry it open, and the very real risk of serious hand injury. Never mind that you effectively have to destroy your mouse as part of the opening process.

Once you’ve got the thing open, there are two delicately placed cables that require disconnecting – open the mouse too quickly, and they’ll rip. And you’re not done yet! Then there are some screws to remove, and finally a plastic snap-on cover that requires lifting. Pull out the 0.5g plastic pins, clean them, try not to drop and lose them, figure out how to put them back in, and then put the whole thing back together, ignoring the fact that the plastic ring at the bottom is now wrecked and cracked from all the prying you had to do. I didn’t even care that, post repair, only vertical scrolling worked properly and horizontal was acting all weird and wiggly.

Of course, you could take it to the Apple Store (provided you’re lucky enough to live near one) for some service, but – really? Do you really want to have to make a trip to the repair centre (and wait for who knows how long) every few weeks for your computer mouse?

Thus, four weeks later, when my computer mouse once again started acting up and I lost the ability to scroll through pages vertically, I did what I should have done when I first bought the computer:

I went to the local computer market and bought a real mouse. It’s glorious. It just works.

(And apart from that, I love my new iMac. It’s blazingly fast compared to my old laptop, and it’s wonderful having large and fast hard disks again. The only downside is that I suddenly have to worry about power failures again, something I have not thought about in nearly four years.)

[Read Rest of Article]
Jan 08, 2009 | 18:59:34
Coolness vs. Age: FIGHT! (Hint: coolness loses)
By marcwan

During my third year of university, I took a course in compilers where, essentially, we wrote a pascal (well, Oberon 2) compiler in 3 months. I would wake up at 7am, go to the computer lab and start programming, attend classes as time permitted, and then go back to the lab and program until sometime around midnight. While this upset the girlfriend immensely, I did get a passing grade in the class.

About halfway through the semester, however, a weird thing started happening to my right eye: it was getting slower. I would move my eyes and my left eye would move very quickly to look at whatever I wanted to look at, but my right eye would take a fraction of a section to arrive at the same destination. It made for a very strange blurring / dizzying effect, and completely freaked me out.

I spent the next few months doing the most comical and insane eye exercises constantly. If you’ve programmed a lot, you know the kind: eyes up, eyes down, eyes up, eyes down, eyes left, eyes right, eyes left, eyes right, clockwise circle, three times, counterclockwise circle, three times. repeat ad nauseam, many times daily. People thought I was completely retarded or, at least, quite nutty (now that I back on it, it might not have had anything to do with the eye exercises … hmm).

But it worked: the class ended, the exercises continued for a while, and my right eye got better. A few eye tests showed that I had excellent vision in both eyes and would be fine.

Cue forward many (many) years to the present, where I’ve been working like a mad-man for the last n months on a new startup project, adylitica. My right eye is grouchy again. But this time, I suspect that no amount of eye exercises are going to do the trick – it’s very likely that I’m just getting older. The classic hyperopia that causes old people to tilt their heads at weird angles, pull out their bifocals and read things from as far away is slowly creeping its way into my life. It’s not all that bad yet, and the zany eye exercises have started again, but there’s no denying: I’m getting older.

When I first got into Macs, in addition to the unix underpinnings, I was always impressed with how stylish and well deisgned the UI was compared to other systems. One of my favourite things was the ability to have transparent Terminal windows:

It was super cool and made my computer look more bad-ass geeky (in a completely non-female attracting kind of “bad-ass” way).

Sadly, with the latest developments, I’m back to good ole’ old-folks style Terminal windows:

I’m still not at the point where I need to increase the font-size or do head gymnastics, but that’s coming, I’m sure!

Age: 1. Geekiness: 0.


[Read Rest of Article]
Jun 03, 2008 | 21:34:13
1080p MKV playback on Mac OS X (VLC)
By marcwan

If you’re like me, you used to think that your Intel Mac was a pretty powerful computer. With all of those super zippy cores and RAMs and caches and all that, everything does seem to go a lot faster on the newer machines. My JustLooking compiles went from nearly 4 minutes on my PowerBook G4 to about 35 seconds on my 2.33GHz laptop.

But then came all those 1080p MKV files, with their unbelievable (basically unwatchable) jerkiness, and you found yourself questioning the new religious order. Is the machine, perhaps, actually a piece of junk? Was it that hard disk upgrade you did? The new RAM you installed? Leopard? Some awful combination thereof?

[Read Rest of Article]
Apr 13, 2008 | 20:54:21
CoreImage memory leak in Leopard and its effect on JustLooking
By marcwan

It was with no small amount of dismay that I recently noticed JustLooking was leaking tonnes of memory on my Leopard machine here at home. When developing the program, I put enormous amounts of time an energy into ensuring the program behaved well and didn’t leak. And yet, browsing through 75 photos from a trip to Hong Kong ground my 2GB system into the dirt in a hurry.

Upon further investigation, this appears to be a bug in Leopard—my Tiger machine has absolutely no leaking at all. The bug occurs specifically when using CoreImage and NSImage interchangeably. In effect, CoreImage works entirely on video card RAM, and NSImage works entirely in system RAM. The resizing method I use causes the system to copy some of that memory from the VRAM to the system RAM, and that code leaks a tonne at a time.

The good news is that you can fix this by just having CoreImage do the rotation. The bad news is that this is 100% incompatible with the fade effect transitions I use. So, right now, I have the choice between transitions or memory leaks. Or just using Tiger (for which there are a number of other great arguments).

One of things I had been looking at for JustLooking 3.2 was reworking exactly how I use CoreImage, filters, and the system’s loading code. It looks as though this work has just taken on added urgency.

[Read Rest of Article]
Jan 08, 2008 | 21:36:33
Announcing TunnelerX 0.9.5 - An SSH Tunnel for your Mac OS X menu bar
By marcwan

TunnelerX is an application for Mac OS X to let you run a single SSH tunnel from your system menu bar, typically to securely re-route HTTP (web browsing) traffic to a remote proxy server. If you have ever had to run one of the following commands in a little Terminal window in the corner of your screen, then this application is for you:

ssh -N -L 8123:localhost:8123
ssh -N -D 8123:localhost

Changes for 0.9.5:

  • The application is now named TunnelerX instead of Tunneler
  • A few bugs have been fixed related to sleeping and waking up the computer
  • New graphics and icons for the application. It’s a bit less ghetto looking now.

For the 1.0 release (upcoming), I will add Growl notifications for those who wish them. The Growl website is currently down, so I can’t do much yet.


[Read Rest of Article]
Nov 20, 2007 | 21:23:17
Announcing Tunneler 0.9 - An SSH Tunnel for your Mac OS X menu bar
By marcwan

Tunneler is an application for Mac OS X to let you run a single SSH tunnel from your system menu bar, typically to securely re-route HTTP (web browsing) traffic to a remote proxy server. If you have ever had to run one of the following commands in a little Terminal window in the corner of your screen, then this application is for you:

ssh -N -L 8123:localhost:8123
ssh -N -D 8123:localhost


[Read Rest of Article]
Jun 29, 2007 | 20:50:34
Things I've learned about CoreImage (and Quartz, and OpenGL) in two weeks
By marcwan

I recently spent two weeks converting JustLooking, my Mac OS X Image Viewing program, from NSImage to CoreImage and friends. This experience was overall much easier than I expected, and I have learned a bunch of things, some of which might have been handy to have known in advance.

The good news is that it mostly lives up to the hype. The bad news is that it’s not without tricks and traps of its own. Here are some notes and comments.

[Read Rest of Article]
Mar 08, 2007 | 20:07:45
Weird Cocoa Errors 101
By marcwan

The other day, I was working on JustLooking, changing the appearance and the like of a couple of dialogs. As I ran the programs and went to show the dialogs (“panels” in the local terminology), nothing would show and I’d get an error in my XCode results window:

"Unknown class 'CustomCombo' in nib file. using 'NSObject' instead."

I spent the next half hour trying to figure out why Interface Builder didn’t know about this class: it was there in the class inspector, and the ui widgets were correctly set up to use that new class, and all the hookups in the UI also seemed correct.

Well, I finally figured out: when I first developed the class, I had some errors in it, but wanted to test a few things out in my program elsewhere. So I had unchecked it in XCode, telling the IDE not to compile and link it.

Thus, when Cocoa tried to load the NIB file, it couldn’t find the definition for the class, and just put in NSObject instead.

Here’s to hoping that this blog entry saves somebody that 30 minutes I spent on that one.

[Read Rest of Article]
Mar 03, 2007 | 22:26:50
JustLooking 2.0 Preview!
By marcwan

So, after a month or so of active development, I’m almost ready with version 2.0 of JustLooking. I’m just waiting for some localisation help, and then I’ll go ahead with the release. The first releases were quite functional, but pretty ugly, I think. A few users from the internet made some suggestions on how to improve the UI and I have completely redesigned it.

Click for larger version

In addition to a complete update to the user interface, I have added the following new features to version 2.0:

  • Saving of rotated images (JPEGs, GIFs, PNGs, BMPs, and TIFFs)
  • Remote Control Support in slide show mode.
  • Image displaying and resizing is muuuuucchhh faster now.
  • Hold down the ‘OPTION’ key on startup goes to full screen slide show.
  • many bug fixes in the code, including some animated GIF problems.

I will spend the next week or so fixing the last couple of bugs in the program and waiting for the last bits of localisation help to come in, and will then release it both on this server and on the BitTorrent networks.

Please feel free to send me your requests for future versions or reports of any bugs or problems you find in the program. I’m thinking the next big features will lie in image resizing and saving of images in different formats.

[Read Rest of Article]
Oct 26, 2006 | 07:15:59
Cocoa Programming: How to fetch Paper Names, Localised Names, and Page Sizes for a Printer
By marcwan

For a recent project written in Cocoa for Mac OS X, I found myself wanting to get the following set of information for a particular printer:

  • A list of all available paper types
  • Printable names for these paper types
  • Page Sizes
  • Imageable Margins for those same pages.

It turns out that there is no way to get this in Cocoa, and actually it’s not all that easy to find this information in Carbon either.

So, after some research and investimigation on the Intarwebs, as well as much combing through the various PM* header files (buried so deep in a directory on my machine that I had to save the directory name somewhere so I’d be able to find them again!), I’ve come up with the following method to do all the above.

It returns an NSArray. Each paper type supported by the printer gets one item in the array, which is an NSDictionary set-up to use key/value pairs. There are the following pairs:

  • PAPER_NAME (NSString): The system name for the paper.
  • LOCALISED_PAPER_NAME (NSString): The display name for the paper.
  • PAPER_SIZE (NSValue): The size of the paper in 72dpi User Space Units. Use [NSValue -sizeValue] to get the actual value.
  • PAPER_IMAGEABLE_MARGINS (NSValue): The imageable bounds of the paper in 72dpi User Space Units. Use [NSValue -rectValue] to get the actual value.

I’ve noticed that there are some issues with memory allocation in the following code: If I run it a few hundred thousand times, I start to see some memory leaks, which is most upsetting. Given that I can’t free anything else in this code without crashing it, I worry that it might be a system leak. However, given how rarely this code is ever executed (maaaaayyybe 5-10x per process lifetime in an extremely print happy case), It’s something that can be investigated later.

Here be the code, laddies:

+ (NSArray *)paperSizesAndNamesForPrinter: (NSString *)printerName
    PMPrintSession printSession = NULL;
    CFArrayRef printerList = NULL;
    PMPrinter thisPrinter = NULL;
    int numPrinters;
    OSStatus err;
    int i;

    err = PMCreateSession(&printSession);
    if (err != noErr)
        [JLUnknownPrinterErrorException generate];

         * Get a list of all printers.
        err = PMServerCreatePrinterList(kPMServerLocal, &printerList);
        if (err != noErr)
            [JLUnknownPrinterErrorException generate];

         * Now, loop through them until we find the printer we're looking
         * for.  Then we can get the properties.  We throw if the printer
         * isn't found.
        numPrinters = CFArrayGetCount(printerList);
        for (i = 0; i < numPrinters; i++)
            CFStringRef thisPrinterName;
            thisPrinter = (PMPrinter)CFArrayGetValueAtIndex(printerList, i);

            thisPrinterName = PMPrinterGetName(thisPrinter);
            if ([(NSString *)thisPrinterName caseInsensitiveCompare: printerName] == NSOrderedSame)
                return [NSPrinter extractInfoFromPrinter: thisPrinter];

            thisPrinter = NULL;
         * Clean up.  Exceptions will still throw back up the stack.
        if (printerList != NULL) CFRelease(printerList);

    return nil;

+ (NSArray *)extractInfoFromPrinter: (PMPrinter)printerInfo
    NSMutableArray *outputArray = [NSMutableArray arrayWithCapacity: 10];
    CFStringRef paperName = NULL, localised = NULL;
    NSMutableDictionary *paperProps;
    CFArrayRef paperList;
    PMPaper thisPaper;
    int j, numPapers;
    OSStatus err;

     * First, get a list of the paper sizes and create an NSArray 
     * for them all.
    err = PMPrinterGetPaperList(printerInfo, &paperList);
    if (err != noErr)
        [JLUnknownPrinterErrorException generate];

        numPapers = CFArrayGetCount(paperList);
        for (j = 0; j < numPapers; j++)
            NSValue *imageableMargins, *paperSize;
            double paperHeight, paperWidth;
            NSRect adjustedMargins;
            PMPaperMargins margie;

            thisPaper =  (PMPaper)CFArrayGetValueAtIndex(paperList, j);

             * Get the system non-localised paper name.
            PMPaperGetID(thisPaper, &paperName);

             * Get the localised paper name.
            err = PMPaperGetName(thisPaper, &localised);
            if (err != noErr)
                [JLUnknownPrinterErrorException generate];

             * Finally, build up the size.
            err = PMPaperGetHeight(thisPaper, &paperHeight);
            if (err != noErr)
                [JLUnknownPrinterErrorException generate];
            err = PMPaperGetWidth(thisPaper, &paperWidth);
            if (err != noErr)
                [JLUnknownPrinterErrorException generate];

            paperSize = [NSValue valueWithSize: NSMakeSize(paperWidth, paperHeight)];

             * This gets the imageable margins for the page type, which
             * is very useful.
            PMPaperGetMargins(thisPaper, &margie);
            adjustedMargins = NSMakeRect(margie.left,,
                                         (paperWidth - margie.left - margie.right),
                                         (paperHeight - - margie.bottom));
            imageableMargins = [NSValue valueWithRect: adjustedMargins];

             * Finally, create a dictionary with these values and then add
             * them to da array.
            paperProps = [NSMutableDictionary dictionaryWithCapacity: 3];
            [paperProps setValue: [NSString stringWithString: (NSString *)paperName]
                        forKey: PAPER_NAME];
            [paperProps setValue: [NSString stringWithString: (NSString *)localised]
                        forKey: LOCALISED_PAPER_NAME];
            [paperProps setValue: paperSize forKey: PAPER_SIZE];
            [paperProps setValue: imageableMargins forKey: PAPER_IMAGEABLE_MARGINS];

            [outputArray addObject: paperProps];

            paperName = NULL;
            localised = NULL;
        if (paperName) CFRelease(paperName);
        if (localised) CFRelease(localised);

    return outputArray;

I actually implemented this as a category on NSPrinter. You can do this too by simply creating the following header:

#import <Cocoa/Cocoa.h>

#define PAPER_NAME               @"paper_name"
#define LOCALISED_PAPER_NAME     @"localised_paper_name"
#define LOCALIZED_PAPER_NAME     @"localised_paper_name"
#define PAPER_SIZE               @"paper_size"
#define PAPER_IMAGEABLE_MARGINS  @"printable_margins"

@interface NSPrinter (MyNSPrinterExtensions)

// returns an NSArray of NSDictionaries: see constants above.
+ (NSArray *)paperSizesAndNamesForPrinter: (NSString *)printerName;
+ (NSArray *)extractInfoFromPrinter: (PMPrinter)printerInfo;


Finally, you’d then wrap the above two functions in

@implementation NSPrinter (MyNSPrinterExtensions)



Sorry if you’ve got a small screen and this article scrolls horizontally. I’ve decided that, unlike other languages that I can easily keep to 80 columns (or even 65 for writing articles), Objective-C simply requires huge amounts of horizontal real estate.

Also, like most of my code, this uses the new Objective-C structured exception handling, which requires Mac OS X 10.3.9 or greater. If you’re not using it, you should be. I was slow to get into SEH when I first saw them many years back, but now I feel any language is incomplete without them.

[Read Rest of Article]
Sep 26, 2006 | 06:33:05
JiaId3 0.9.1 Released
By marcwan

I am happy to announce the immediate availability of JiaId3 0.9.1. New features in this release include:

  • Fixed bugs that caused error dialogs to pop up on Intel Macs as well as some Panther systems.
  • I fixed up the .dmg so that it looks a bit better when you mount and show it for the first time.

I have actually coded up a lot of FLAC support, but it is currently disabled, as FLAC files appear to have a number of wild permutations, including native FLAC format, FLAC embedded in Ogg streams, and weird FLAC/ID3 hybrids that are widely seen but not supported by any available code base.

You can download the (Universal Binary) .dmg file from:

More details about JiaId3 can be found in the following locations:

As always, any comments, questions, or bug reports should be sent to me. I’d love to hear from anybody using the program.

[Read Rest of Article]
Sep 20, 2006 | 19:56:12
Rotating an NSImage object in Cocoa
By marcwan

I recently started working on an image viewing program for Mac OS X using Cocoa, and one of the features I decided to add was the ability to rotate images in 90° increments. I did some searching on the internet, and found a few things:

Neither of the first two was exactly what I wanted—the first didn’t quite work, while the second was too complicated and, in order to support arbitrary rotation, created an NSImage object that was way too large.

[Read Rest of Article]
Sep 01, 2006 | 07:20:54
Version 0.9.0 of JiaId3, an Audio File Tag Editor, now Available
By marcwan

I am happy to announce the immediate availability of version 0.9.0 of JiaId3. The big change in this version is support for Ogg/Vorbis (.ogg) audio files. I have also seriously cleaned up error handling and added some architecture to support more audio file formats as I learn about them.

JiaId3 0.9.0 can be downloaded from:

The source code can be downloaded from:

About JiaId3

JiaId3 0.9.0 is an information tag editor for your audio files. It currently supports editing the ID3 information associated with MP3 files, as well as the tag information associated with Ogg/Vorbis .ogg files. I will add support for more file formats as I approach version 1.0.0. I first sat down to write this application when I found a directory on my hard disk with a bunch of “junk” MP3 files whose tag information was all messed up. Instead of throwing them all away, or having them mess up my audio libraries, I set about to write an application to let me fix them.

[Read Rest of Article]
Aug 24, 2006 | 03:40:51
Announcing JiaId3, A Mac OS X Audio file tag Editor
By marcwan
JiaId3 0.8.0 is an information tag editor for your audio files. It currently supports editing the ID3 information associated with MP3 files, and I’ll add support for more file formats as I approach version 1.0.0. I first sat down to write this application when I found a directory on my hard disk with a bunch of “junk” MP3 files whose tag information was all messed up. Instead of throwing them all away, or having them mess up my audio libraries, I set about to write an application to let me fix them.

JiaId3 version 0.8.0 can be downloaded from:

[Read Rest of Article]
Aug 21, 2006 | 01:06:55
When Apples go Bad
By marcwan

Last night, after a nice weekend of varying activities (yoga, studying, yoga, sleeping), the plan was to lie in bed and read some Apple Developer Connection documentation for a while and generally learn more about some stuff I’ve been working on lately.

So, it was with some dismay that I sat down with Samantha’s PowerBook G4, clicked on Safari and got … nothing. The icon bounced twice and then stopped. System logs showed nothing, and the application appeared to be all fine in its folder in /Applications.

Uuuuuh. Now what? Oh yes, the System Console, in /Application/Utilities. It gave me the following very helpful message:

2006-08-20 22:32:29.825 Safari[249] Unable to load nib file: MainMenu, exiting

[Read Rest of Article]
Jun 16, 2006 | 06:51:45
The End of Mac OS X
By marcwan

Today I had a glimpse into the future of Apple’s Mac OS X, and I was more than a little frightened.

When I think about why I use my Powerbook so much and shun Windows whenever possible, the reasons are not what most people might think. I don’t care about the cost (okay, 200$ USD for Windows is a bit much, but I happily paid 130$ USD for the 10.4 “Tiger” Upgrade to OS X on our 12” Powerbook), and while I’m more than a little alarmed by the security problems endemic in Windows, I can avoid many of them by using Firefox, and Microsoft is slowly learning how to do the automated patching game.

[Read Rest of Article]
Oct 15, 2005 | 14:52:40
Finding the Love
By marcwan

In March of this year, having largely finished writing my first book on web application programming with PHP and MySQL, I realised it was time to find another contract. I hadn’t worked in nearly a year, and the reserves were getting a little bit lower than I would normally like.

Around then, I started getting a number of emails and phone calls from people interested in having me come work for them for a while. Most of the jobs were to write some .NET applications or tools, or otherwise C/C++ things related to OLE2/COM that I did all the time when I worked for Microsoft in the 1990s. The money for these contracts is usually good, and I was relieved to learn I wasn’t going to be smashing open the piggy bank for extra funds.

[Read Rest of Article]
Jun 17, 2005 | 17:33:17
Installing PHP, MySQL, and Apache on Mac OS X
By marcwan

Many Mac OS X users seem to be having problems getting AMP (Apache, MySQL, and PHP) working properly on various versions of the operating system. In this article, I will describe the process by which I did this on my Powerbook which started out running Panther (10.3) and then Tiger (10.4) (the instructions are the same for both OSes).

[Read Rest of Article]
Copyright © 2005-2008 Marc Wandschneider All Rights Reserved.