NTFS on OS X

Trying to write to an NTFS volume on OS X, and all you find are third party packages and complicated config file manipulations asking you to reboot? Do this….

Every once in a while someone brings over an external NTFS formatted drive and plugs it into my Mac to exchange some large data sets. While the Mac can easily read NTFS, it doesn’t appear to have the capability to write to that file system.

Appears is the operative phrase.

If you search for a solution in the open, you’ll find companies selling commercial products, drivers, and mounters. Some people have posted complicated looking instructions telling instructing you to mess with low level system files, that may or may not exist, ending in a full system reboot that typically solves the problem for that lone drive.

NTFS on OSXHere’s the generic no-software required solution.

First connect your NTFS drive to the Mac, it’ll mount with some name like “My Disk.”

Open a Terminal window and enter the command:
$ mount

The mount command will tell you what drives are listed. Find the one that has your drive name listed in it and copy the device name:
/dev/disk1s2 on /Volumes/My Disk (hfs, local, nodev, nosuid, journaled, noowners, mounted by me)

Now eject the drive, but don’t disconnect it from the machine.

Go manually create the directory (shown in bold above); this is where the mount point will be:
$ cd /Volumes
$ mkdir My\ Disk

NOTE: The backslash escapes the next character, in this case allowing a space in the directory name.

Now, mount the drive as read-write using this command:
$ sudo mount -o rw -t ntfs /dev/disk2s1 /Volumes/My\ Disk

Make sure that you’ve used the same device location you copied down the the prior steps.

At this point your drive should appear on the desktop, and you ought to be able to read and write to it just fine. No rebooting necessary!

Note that you can get to it from the Terminal as well:
$ cd /Volumes/My\ Disk
$ ls

Note that sometimes Finder may act a little wonky with timing problems and a huge file. Apparently the underlying Unix system has no problem. You can copy a big file to the drive:
$ rsync –progress SuperBigFile.zip /Volumes/My\ Disk

Or a whole directory:
$ rsync -r –progress LargeDeepDirectory /Volumes/My\ Disk

When done, make sure you are not running any programs that are accessing the drive or have their current directory set to the drive:
$ cd /Volumes

Then, eject the drive normally, or unmount it from the command line — your choice.
$ sudo umount /Volumes/My\ Disk

Full disclosure and warnings: This was tested on OS X 10.6.5, though support has been around to do this for a while. And, any time you’re doing something that deals with questionable file system access, make sure there’s nothing on the drive you don’t mind losing. Have a backup. There’s always a slight risk, but it’s very close to zero — why state all this? Because I assume no responsibility if something goes wrong.

Snow Leopard: That Doesn’t Sound Like Apple

Had a very strange experience in the Apple Store in Reston, VA where I learned three very disturbing things. Snow Leopard purchasers beware. Hardware purchases, stop in your tracks.

I went to the Apple Store today with a friend that was looking at buying a MacMini and another friend that was picking up a copy of Snow Leopard, which sells for $29. That is, unless you’d like a copy for $25.

Apple’s policy toward operating systems has historically been a good one. There is no home, business, professional, expert, business, yadda-yadda-yadda flavors. There is no upgrade or full version. There is no pricing tier. Everything is one low price, you can upgrade or install fresh at any time.

And, if you buy a machine at the Apple Store it comes with the latest-and-greatest software, and if a new product on it comes out within 30-days, simply come back and pick up your updated version for either free or a very steeply discounted price. This is how it’s been at the Tyson’s Store for years. It shines of Apple customer service.

We went to the new Apple Store in Reston, VA and had the most disturbing news presented by Apple blue-shirt, John.

Unfortunately, I have no way of knowing at this time if what he told us is fact, fiction, or fallacy. So don’t take what you read here as gospel, but rather use it as guideline for formulating solid questions when you deal with Apple for the next few months.

#1) Apple had on display a Mac Box Set (OS X Snow Leopard, iLife ’09, and iWork ’09) for $169. My friend having iLife ’08 and iWork ’08 asked, “is it worth the cost to upgrade?” The Apple guy looked at us and said straight faced, “honestly, no… the features are minimal, just get Snow Leopard.” Now, I appreciate his honesty and opinion, and that alone commanded enough respect for me to retain trust in Apple — much like Macy’s sending people to Gimbel’s. However, I suspect we got lucky and that was not the Apple corporate line. Nor would pointing out you can get it for much less at about $114.

#2) We noticed the word “upgrade” all over the box and asked, “do you have to have Leopard installed to install this?” The answer, surprisingly, was yes. This was an upgrade and not a regular OS X disc like Apple historically has done. We were told that the real OS wasn’t coming out until December. Yes, December. When asked about machine recovery, he confessed they had a special version in the back they could use under dire emergencies. This begs the question if $29 is an upgrade price, with the ‘full’ OS will be the normal $120 later.

Update 31-Aug-2009: An Apple employee in BestBuy also confirmed what’s out now is an upgrade path. Although according to him, if you buy a new machine (with Leopard on it) you get the Snow Leopard update for free, which sounds like the Steve Jobs’s Apple policy we’re used to.

#3) When we asked about the MacMini, we were told that it had Leopard on it and that if we wanted Snow Leopard, we’d have to buy that for an additional $29. However, the electronic Apple Store online was selling MacMini’s with Snow Leopard already installed, without the extra cost. I probed deeply about this. Did the machines really have Leopard, and not Snow Leopard? Yes, the excuse was that they hadn’t moved inventory with the old OS on it. I asked if one simply got the upgrade for free like Tyson’s always used to do. Again, no. When I pointed out that buying online was the-cost-of-Snow-Leopard cheaper, I was met by an indifferent shrug.

All three of these things were very non-Apple.

Again, I don’t know if it was the sales person, the store in general, or Apple taking a page from the Microsoft book of marketing. But suffice it to say there was an abrupt halt on major purchases today.

Customers expect two things from a business, common sense and consistency. Price is often a very distance third.

A Side Note: Customer service plays a big role, and I have another Apple story which illustrates going above and beyond. In BestBuy, when we went to go get a copy of Snow Leopard, they were out of stock. However, while browsing another part of the store, the Apple employee came up and handed over a copy of Snow Leopard. Apparently, a FedEx shipment had just arrived, so he pulled one out of the box, and then hunted down our party in the whole store, on the off chance we hadn’t left yet. That’s service. You know that BestBuy’s floor staff would not have done that.

MobileMe Sync Problems – Resolved

Apple’s MobileMe service stopped syncing for me, claiming there was one conflict, which it wouldn’t let me resolve. Here are the steps and a Python script that fixes it.

Not very long ago, I noticed my iPhone was no longer pushing data up to MobileMe, and further investigation showed that my laptop was also having problems syncing.

The MobileMe icon had an exclamation mark in it, it told me there was 1 conflict, and if I tried to resolve it, nothing happened. If I attempted a sync, it’d attempt it, but I’d get a system log full of errors with no obvious signs of successful data synchronization.

I was seeing ominous system log failures in Console like this repeated many times:

Conflict Resolver[276] [110660] |ISyncRecordGraphNode|Warning| Warning: Failed to look up record with Id: 09000000-0000-0000-1234-430001005678
Conflict Resolver[276] [110660] |ISyncRecordGraphNode|Warning| Warning: Failed to get entityName for record with Id: 09000000-0000-0000-1234-430001005678 (record = (null))
Conflict Resolver[276] [110660] |Conflict Resolver|Error| failed to look up parent relationshipName for entityName: (null) (exception = *** -[NSCFArray initWithObjects:count:]: attempt to insert nil object at objects[0])

There were other strange messages like this:

Conflict Resolver[276] [110660] |UI Helper Proxy|Error| failed to look up UIHelper for attributeName: calendar on entityName: (null) (exception = *** -[NSCFArray initWithObjects:count:]: attempt to insert nil object at objects[0])

And this (my personal favorite as it has a sense of humor):

Conflict Resolver[276] [110660] |UI Helper Proxy|Warning| No data type returned for property “calendar” on entity “(null)”, displaying on blind faith…

And also this:

Conflict Resolver[276] [110660] |Conflict Resolver|Warning| Conflict Resolver: *** -[NSCFArray initWithObjects:count:]: attempt to insert nil object at objects[0]
Conflict Resolver[276] *** -[NSCFArray objectAtIndex:]: index (-1 (or possibly larger)) beyond bounds (2)

My guess is that MobileMe has some globally unique identifier that represents one of my sync-able objects, and for some reason it’s missing. That in turn throws off some collection count, and when things don’t balance out between what was expected and what was loaded, a software exception happens.

At that point, I was fairly sure I needed to converse with MobileMe support. Apple has free chat-based support services, but it’s buried. Really buried. Really, really, buried.

  1. Go to http://www.apple.com/support/mobileme/
  2. Expand Syncing With MobileMe
  3. Click Troubleshooting MobileMe Sync issues
  4. Click Chat Now at the bottom of the page.

It’s a good idea to have your machine and your MobileMe data backed up. TimeMachine, SuperDuper!, or Carbon Copy Cloner will help you do this.

Unregister and Re-Register the Machine


Bring up Apple / System Preferences… / MobileMe. Go to the Sync tab, and at the bottom click on Advanced…

Then select the computer name in the list, and a Stop Syncing Computer… button will appear. Press it. Confirm with Unregister.

Then press the Register Computer button. Press Done.

Check and set the synchronize with MobileMe to Manually. Leave the preferences panel up, you’ll be back in a second.

Blow Aware the Sync History


You’ll need to reset your sync history which requires the iSync tool and a Python script run at the command line:

  1. In the Finder, choose Applications from the Go menu, then double-click iSync.
  2. Choose Preferences from the iSync menu.
  3. Click the Reset Sync History button.
  4. When the window opens to confirm the reset, click Reset Sync History.
  5. Close the Preferences window.
  6. Quit iSync.
  7. Open the Utilities folder (located inside the Applications folder) and double click the terminal.
  8. Paste this command in the Terminal and press return: “/System/Library/Frameworks/SyncServices.framework/Versions/A/Resources/resetsync.pl full” – without the quote marks. There will be no output.
  9. Quit terminal.

Re-sync


Select the items you want sync’d. Change the Synchronize with MobileMe back to Automatically.

You might get prompted with a request to sync immediately. If you are trying to push everything on your machine to MobileMe, stepping on what’s there, then press cancel and follow the next step. Otherwise confirm and skip the next step.

This next part is optional and you do at your own risk, assuming you have a backup and this is what you intended to do:
Press the Advanced… button. Click Reset Sync Data… and select the direction you want to sync, most likely computer to MobileMe.

At this point, the conflict disappears, but you’re no long able to sync either. Move on to resetting the preferences.

Resetting Preferences for MobileMe


In the MobileMe preferences pane, select the Account Tab, and click Sign Out… Confirm with Sign Out.

Now provide a bogus username and password like: blah@me.com / blahblahblah

You’ll get a name or password invalid message, but your log will show some interesting stuff.

/Applications/System Preferences.app/Contents/MacOS/System Preferences[352] Warning: Removed .Me password
[0x0-0x2c02c].com.apple.systempreferences[352] com.apple.CSConfigDotMacCert-blah@me.com-SharedServices: Already loaded
com.apple.launchd.peruser.501[206] (com.apple.CSConfigDotMacCert-blah@me.com-SharedServices) Throttling respawn: Will start in 6 seconds
com.apple.launchd.peruser.501[206] (com.apple.CSConfigDotMacCert-blah@me.com-SharedServices[470]) Exited with exit code: 1
/System/Library/CoreServices/FileSyncAgent.app/Contents/MacOS/FileSyncAgent[462] PIDFilePath() => ‘/Users/yourname/Library/FileSync/01254cc20d18/.pid’

Sign back in. Once again, go to the Sync tab and set Synchronize with MobileMe to Automatically.

You will get a message that says “A computer named [your machine name] is already registered with MobileMe synchronization server.” If so, press the “Use same name” button.

You may see this in the logs, not to worry:

System Preferences[352] First pass at computer registration failed with error: Error Domain=DotMacProxyErrorDomain Code=-100 UserInfo=0x200e73280 “A computer with this name is already registered with MobileMe.”
System Preferences[352] First pass at computer registration failed with error: Error Domain=DotMacProxyErrorDomain Code=-100 UserInfo=0x200e5fa20 “A computer with this name is already registered with MobileMe.”
System Preferences[352] LightweightMallornLoginSession is registered.

Now check off the items you want sync’d again and press the Sync Now button.

If you are trying to move all of your machine’s data to MobileMe, select the correct replace option when prompted.

And just to be sure that it didn’t do a partial sync, press Sync Now a second time, just incase the automatic setting jumped the gun before you finished selecting all the desired items.

Your syncing woes should be resolved.

But what about me.com?


At this point it’s a good idea to head over the your web account by going to me.com and logging in.

Check to make sure your data is there.

At this point in time there is known issue with me.com in which the calendar and the contact data does not appear. It is a known problem. Apple is aware of it. It is specific to your profile (other MobileMe accounts aren’t affected). And you need to contact support (see above) and open a trouble ticket. Apple only knows this as a “contacts and calendar loading issue” it has no formal title.

The error you see will be this message on a grey screen: MobileMe is unable to load your contacts. MobileMe could not load your information from the server. Try reloading the page. If this problem persists, contact MobileMe Support.

You can try and clear out your Safari cookies and cache, but realistically this won’t work as other browsers, like Firefox, show the same thing.

  1. First click the log out button and close the MobileMe (me.com) window.
  2. Click the safari title (next to the Apple logo) and select “empty cache.”
  3. Next click the safari title and select preferences.
  4. Click the security tab.
  5. Click “show cookies” then hit “remove all”.
  6. Now close the preferences.
  7. After all that open a new browser window and log back into MobileMe.

Apple can fix the problem by escalating to the next level of support, and this is most likely more desirable than closing your MobileMe account and opening another, which will force your MobileMe account name to change.

“Mail: SafetyNet not needed” log messages

New messages about SafetyNet not needed are appearing in my logs from OS X’s Mail. Trying to figure out what they are. Looking for ideas as Google was dry.

Warning this is a geek-related post, if you’re looking for photography and humor, try another entry or browse the comics.

I’ve noticed OS X’s Mail going something a little weird. I’ve got GeekTool pumping messages to my desktop in the background, and I keep seeing this filling the log:

Mail: SafetyNet not needed – wrongState:0
Mail: SafetyNet issues SELECT before CLOSE – wrongState:0

I’m trying to figure out what it means.

I’ve also noticed before that happens, I see this from /Applications/Mail.app/Contents/MacOS/Mail:

ATS AutoActivation: Query timed out. (elapsed 5.0 seconds. params: queryString = {com_apple_ats_name_postscript == “Helv” && kMDItemContentTypeTree != com.adobe.postscript-lwfn-font}, valueListAttrs = {{type = immutable, count = 1, values = (
0 : {contents = “kMDItemContentType”}
)}}, sortingAttrs = {{type = immutable, count = 1, values = (
0 : {contents = “kMDItemContentModificationDate”}
)}}, scopeList = {{type = immutable, count = 1, values = (
0 : {contents = “kMDQueryScopeComputer”}
)}}.)

The only other interesting behavior is that sometimes when I close the laptop lid and it goes into calmshell sleep, when I open the lid, I soon find that Mail is locked up to the point that it needs a Force Quit to exit, as Quit is unresponsive. Activity Monitor as well as Mail’s own activity status shows nothing going.

Anyone else seeing this behavior or know what it means?

Found: The Best iPhone Development Book So Far

Want to write your own iPhone applications but Objective-C, XCode, Interface Builder, and the steep learning curve of Cocoa getting in the way? Have I found the book for you.

Warning: long and geeky post follows — iPhone wanna-be developers, read on!

Beginning iPhone Development - Exploring the iPhone SDKI’ve found it, finally, the best iPhone development book so far! Read on to see why.

Fairly recently, I decided to turn my attention to native iPhone application development, but I found the arena a little sparse when it comes to what I’d call good documentation.

For some perspective, I’m a software developer of 20+ years with background in Unix and Windows; I’m very well versed in C, C++, C#, and Java, among a good number of other higher-level languages, having produced a number of enterprise applications.

You’d think that picking up Objective-C and the Cocoa Touch frameworks would be a fairly simple task. However, the moment you step foot into the pool, you’re get a cold shock at how much you don’t know and it can feel daunting enough to want to retract back to familiar territory.

Don’t give up. It is easy.

Looking forward into the unknown presents a much more gloomy impression than when you’ve taken a few steps and looked back to see just how far you’ve come and in such a short period of time.

Here’s what’s happening: The Apple Frameworks represent a large and mature collection of some impressive code. The closest experience I’ve felt to it, and this is admittedly a horrible analogy, is Ruby on Rails.

With Rails, there’s so much going on by convention that you have to sling very little code to get impressive things to happen. This makes it hard to understand: there is no code to trace.

Same way with the Apple Foundation classes that are based on NeXTSTEP — a lot is handled for you, and often in new ways you might not have thought about because of limitations of other platforms, so that very little code is required to do something quite impressive. The problem is figuring out what that code is you’re supposed to write, and more importantly how’d you know to go about doing that in the first place. Hint: knowing the Foundation Framework is important to understanding the Cocoa Touch Framework.

This leaves one in the lurch that the sample code appears rather sparse, and the framework documentation overwhelming, with little guidance on how all the pieces fit together into a simple, cohesive whole. The problem is all too common.

My biggest gripe with many frameworks, especially Java and it’s auto-generated documentation, is that all you’re really presented with is a list of method signatures with very little discussion about what they do, purpose and limits to the input values, discussions of side effects, the importance of call order, and so forth. With other languages, you’re lucky if you can find the header file to include or the library file to link against. It’s all just expected that you somehow know this, and that doesn’t work when you’re learning a framework, though it’s fine if you just need a reference.

Apple’s online documentation is certainly comprehensive, but the reality is you’re going to be watching videos and reading tons of documentation, picking up crumbs of useful bits as you go. The cohesive moment of comprehension will come, but it will be a long and slow ride. You want something faster.

If you’re learning Objective-C at the same time, the ride is extra bumpy, because not only are there just a few language extensions sitting on top of C, but the ObjC library is actually doing some clever work that you want to know about, and this has additional implications because there’s a lot of convention going on as well. Further obscuring things is the fact that, due to historical reasons, the terminology you are most likely already familiar with doesn’t map nicely. A nice look under the hood solves this. Objective-C isn’t just some new keywords, it’s new application behavior.

What’s Wrong With Other iPhone Books At The Moment
As of early 2009, you’re going to find few iPhone books out there. Most of what exists is for the hacked version of the iPhone, and while that may even sound useful, the tearing apart of the SDK is rough and incomplete, not to mention the implementation to call is painful. This just isn’t applicable to the real world constraints of native mode development.

Think you can get by with a slightly out of date copy of a Cocoa book? Think again. The UIKit framework is just different enough that your approach needs to be slightly different. Tight, efficient, resource management becomes very important.

Also, unless you already know and understand Interface Builder, it can be a hard time following along when your book doesn’t match your software version. Apple keeps modifying Interface Builder, making it better, but the changes can come across as so dramatic, interface-wise, that to the new comer it looks like a totally different application each revision. Once you “get it” the sweeping changes are cognitively transparent. The iPhone SDK includes, you guessed it, a new XCode and Interface Builder.

What few modern iPhone books there are out there jump straight into a technical feast of SDK details, leaving the reader with a learning curve that’s as vertical as a brick wall.

What’s needed is a book that introduces only what you need to know, when you need to know it, explaining tips and tricks along the way, delving into the philosophies of why things are the way they are, what the developers were thinking, how the frameworks are structured, what the conventions are, and when those conventions aren’t followed. And, instead of showing you the end solution all refactored into a neat package, take the long way, when needed, to introduce you to what’s going on and then evolve into the optimal solution.

I’ve Found Such A Book!
The book, by Apress, is called Beginning iPhone Development – Exploring the iPhone SDK by Dave Mark and Jeff LaMarche. This book is about the fundamental concepts you need to understand in order to make the frameworks do their magic.

Its tutorials are very well constructed, easy to follow, and are specifically designed to teach the framework in such a way as you understand what’s going on and learn to fish for yourself.

This is in stark contrast to substandard books that merely cover a framework’s capabilities with cut’n’paste examples that have little bearing to real applications. This alone gives is five out of five stars by my standards.

My only complaint is a minor nit that there are a small handful of typos, and unfortunately, they happen in the code examples. However, they’re glaring, and you won’t get tripped up by them. (For example, on page 85, the tutorial is about UIImage. And, UIImage appears four times in a six line sample. The first one, however, says “jmUIImage” and the indentation is off. It looks like a macro expansion, a note, or the mangled initials of one of the authors. The code won’t compile with it, and it’s obvious from context what it should be.) To me, this is forgivable. Especially since it’s rare.

Tagging 1430216263I want to show you something.

I have a habit of tagging my books when I find an exceptional piece of information that I haven’t found elsewhere. I give a book high marks if it earns somewhere between three to seven tags, as the majority of my collection never gets any tags. Tagging, for me, is not note taking — it’s rare event.

I think the picture speaks for itself.

For Example…
So, at this point, I present for my own edification and future reference, some of that tagged content. Who knows, maybe something you see here might just get you traction on the learning curve.

– In Objective-C, colons are a legal character of the method identifier, they are not syntactic sugar.
– Even though a number of macros translate to nothing, void, zero, or null under the hood, their presence provides important hinting for data types and method calls.
– The NIB’s File’s Owner is a place holder for the class that loaded the NIB file.
– The NIB’s First Responder is the object the user is currently interacting with.
– The application icon is a 57×57 .png file, see Info.plist’s Icon File.
– The iPhone specially optimizes .png files so this is the best format.
– Reset the iPhone Simulator by deleting its directory from ~/Library/Application Support
– You want to use @property (retain, nonatomic) as often as possible.
– Interface Builder uses your defined accessors to properties, which use retain; that means you do need to deallocate Interface Builder objects, even if you didn’t instantiate them.
– There are four control states on a control, often you want UIControlStateNormal.
– Learn to use retain/release, there is no garbage collecting on the iPhone.
– It’s better to init/release than using factory methods; factories use autorelease pools, and while this will work, it often keeps resources around longer than you intend — avoid autorelease pools.
– Hog too many resources, whether CPU or memory, and the phone will reboot.
– Everything from UIApplication on down will fire messages to Delegate objects at certain well-defined times, you need to learn what these times are and what messages are sent; it’s not just subclass avoidance.
– You can Option-Click on a class or interface name in XCode and go right to the documentation.
– You can press ESC to cause auto complete to happen immediately.
– Command-equal_sign will size a control to fit.
– When you’ve got a lot of control hierarchies going on, use the View Mode button to see them as a list.
– Scaling an image takes computational overhead, avoid if you can.
– Set the Alpha slider to 1.0 in order to optimize the drawing sequence, it skips looking at the underlying background and factoring it in — it applies to the image drawn.
– Also set the Opaque checkbox in order to optimize the drawing sequence, it skips drawing the underlying background for the parts where the image is transparent.
– The Tag control allows you to assign a numerical identifier to controls to locate them later.
– You need to handle the Did End on Exit event in order to make the keyboard go away.
– You may also need a huge, invisible, custom button as well to make the keyboard go away.
– In XCode, use Option-Command-up_arrow to toggle between a header and its source file.
– In the Interface Builder, move the cursor over a view and hold down Option to see how many pixels there are between the item and its superview.
– Option-dragging a control in Interface Builder makes a copy.
– Nifty buttons are actually stretchable images, and Apple has buried a ton of them free for your use in the UICatalog sample code on their site.
– There are three different ways to handle layouts when rotation happens: autosize, reposition, and view swapping.
– The rotation callback passes you the orientation the phone came from, you need to use other means to get the current orientation.
– If you want to use Core Graphics, for things like view transitions, you need to link the framework into your application.
– Some frameworks, like Core Graphics, have one version for the iPhone hardware and one version for the iPhone Simulator.
– If you use the correct parameters, XCode’s build process can play games with the path and always target the right framework (use Relative to Current SDK, and do not select Copy items).
– Right-click the Resources folder and use Add / Existing Frameworks… to do this process in a safe way.
– If a view isn’t shown, it’s superview is nil.

…there’s plenty more, but you get the idea. The book is jammed with all kinds of useful things to someone who is new to iPhone development. This presentation of material makes the learning curve very approachable.

And, once over that hurdle, all those other books that I said were problematic suddenly make a whole lot of sense.

This book is the best first step I’ve seen in the journey to writing iPhone applications. Period.

Walt gives “Beginning iPhone Development” two thumbs up, five stars our of five starts, and a head nod of appreciation to the authors. Well done, guys. Well done.

Changes at the Apple Store – For the Better!

Apple has changed the Genius Bar policies and procedures. INCREDIBLE IMPROVEMENTS!

Anyone who’s been to an Apple Store, especially the one in Tysons Corner, VA, knows that Apple is experiencing some serious growth pains. Yes, as predicted, more and more people are starting to adopt Apple hardware and software and the cost/benefit factor becomes more apparent. The hardware is not that much more expensive, and if you take in to account all the stuff you get and all the stuff you don’t need to buy, it’s actually a pretty sweet deal for the total cost of ownership. Vista didn’t win any favors, Windows 7 is invoking similar fear, and Apple’s forth coming Snow Leopard looks like it’s going to be dealing a death blow. Meanwhile the number of ways to run Windows applications on a Mac, even the graphically intensive ones, are climbing — that a Mac won’t run Windows software is just not true.

Where Apple dropped the ball was the in-store support. If you walked into the store, all appointments were filled. Even if you registered in advance, you couldn’t be seen before hand. And turns were taken in the ordered registered — which meant if you had the identical problem as the person at the counter, and someone required 45 minutes of training in front of you, you had to wait. In short, it was awful and you had resort to gaming the system to get seen when scheduled.

As it turned out, my iPhone started wonking out on me when it came to WiFi. My connections would drop, and with the last firmware update, my WiFi connection would drop seconds after being established. Manually cycling WiFi, power cycling, rebooting, and even firmware reloading did not solve the problem. All I could use was Edge, even when someone next to me could see the network access point at full strength on their iPhone.

I loathed the idea of going in to the Apple Store with a real hardware problem, which would require seeing a Genius, especially a shopping day or so before Christmas Eve.

Unbeknownst to me, Apple had made substantial improvements in customer service, the likes of which exceeded all my hopes and expectations. Check this out!

The moment I crossed the store threshold, I was greeted with “Welcome to the Apple Store, is there anything I can help you with?”

“Uh, no, I’m here for a Genius Bar appointment, and I’m an hour ahead of schedule.”

“No problem sir, I’ll register you’re in-store, so head on over to the bar now, and we’ll see if they can take you early.”

Huh? Normally the Genius Bar has a crowd around it with very frustrated people, and four to six gurus working madly. However, as I looked over there were only two, and tons of empty stools, and zero crowd waiting. Meanwhile, the store looked busier than I have ever seen it.

I go over and take a seat. Again, I’m greeted, they ask my name, and they say they see me as appointment number 9. Usually that means that I can expect an hour and a half wait.

However, I’m watching as the two people there are taking cases, and the moment they require some hardware restore or check, they start the automated job and immediately start taking the next person. They’re working concurrently, and they are cranking through the list.

Less than five minutes later, it’s my turn.

“What seems to be the problem?”

As I’m describing it, I notice he’s typing. So I pause and ask what he’s doing.

He tells me, “I’m setting up an order in the computer to replace your phone with a new one. I’m going to flash the firmware, and if that solves it, I’ll press cancel and give you your phone back. If it doesn’t, I’ll hit submit. Either way, you’ll have a working phone in five minutes or less.”

My mouth drops.

“While I do this, do you mind if I take another customer?”

“Uh, no, of course not.” And he calls the next person in line. I’m shocked. I’m impressed. I’m please. And everyone at the Genius Bar starts socializing with one another. It’s turning into a little party.

As he’s talking to the other customer, he’s pulled out a box, moved the SIM card from my phone into the new one, and pushes the new phone and the paper work my direction. I sign it, and he says to me, “You’re all set. And 15 minutes before your appointment was supposed to start.”

That couldn’t be right, I was there an hour early. Looks like they bumped me up in line a few times when “Last call for Mr. Noshow” was hollered out.

I did get to talk with the Genius, and he stated that Apple now allowed them to take people early, as well as work concurrently, and group similar cases together. It was clear that this removed all congestion and put them ahead of the game.

For as I was talking with him, a floor person came over and said “I have a woman on hold, she was wondering if you could do a walk-in.” The Genius spread his arms and said, “absolutely, I have nothing but real-estate” and gestured at the empty bar.

The service was friendly, prompt, and I’d give it six stars on a five star scale.

Walt gives the new Apple policies and procedures at the Genius Bar two thumbs up!

OS X: Batch Rename from GUI

This is the third time I’ve had to go hunting how to enable batch filename manipulations for OS X. Now I’m documenting it so I don’t have to hunt this down again.

I keep forgetting about this trick, so I thought I’d post it in the event I have to ever do it again.

Part of the problem with a graphical GUI is that it’s very difficult to rename files in batches, for instance, prepending some text to a group of files.  This kind of thing is fairly trivial at the command line.

Apple has a facility to do this, but as it’s not something a regular user does often, it’s not enabled by default.  Here’s how to get all kinds of additional functionality out of OS X.

1) Open /Applications/AppleScript

2) Turn on Show Script Menu in menu bar

3) Optional: turn on GUI scripting, show library scripts, and choose where to show them.

You’ll notice up near the time in the menu bar a black scroll has appeared.

All the batch renaming and filename twiddling stuff is under the Finder Scripts.

UPDATE 19-Dec-2009: Upgrading to Snow Leopards deletes some useful scripts, specifically the Finder Scripts.

UPDATE 31-Aug-2010: The scripts live in “/Library/Scripts/Finger Scripts” and are

  • Add to File Names.scpt
    md5 4b0cd899acb19b5fc62ef2049d81a933 – 18114 bytes
  • Change Case of Item Names.scpt
    md5 af7429228be4d0e1a096092af5341c52 – 17808 bytes
  • Replace Text in Item Names.scpt
    md5 716493cab1c569953a7f40d76ed9a1f7 – 24328 bytes