Vincent Gable’s Blog

March 5, 2008

Calling the Command Line from Cocoa

Filed under: Cocoa,MacOSX,Objective-C,Programming,Tips,UNIX | , , , ,
― Vincent Gable on March 5, 2008

The best way to call a shell-command from Coca is by using an NSTask. Here are the three resources on using an NSTask that I found the most helpful:
CocoDev’s write up
A few quick exaples
NSTask Class Refrence

And here is some sample code to do it for you. You are free to use this code however you please, but attribution is always appreciated. The two principle functions are:

+ (NSString*) executeShellCommandSynchronously:(NSString*)command executes the command “command” with sh, wait until it finishes, and return whatever it printed to stdout and stderr as an NSString.
CAUTION: may deadlock under some circumstances if the output gets so big it fills the pipe. See http://dev.notoptimal.net/search/label/NSTask for an overview of the problem, and a solution. I have not experienced the problem myself, so I can’t comment.

executeShellCommandAsynchronously: will have sh execute command in the background, without blocking anything.

For quick hacks, the POSIX int system(const char* command) function, might be a good one-line solution. It synchronously evaluates command with sh.

Enjoy!

EDITED 2009-11-29: this code probably won’t have the same $PATH you would get if you used Terminal. See this question on stackoverflow for more details. A solution that seems to work is to do,

    [task setLaunchPath:@"/bin/bash"];
    NSArray	*args = [NSArray arrayWithObjects:@"-l",
    				 @"-c",
    				 commandlineHere,
    				 nil];
    [task setArguments: args];

This launches bash (not in sh compatibility mode), and -l (lowercase L) tells it to “act as if it had been invoked as a login shell”. I haven’t tested this on systems where bash isn’t the default shell. There are lots of ways $PATH could be set, and I haven’t tested them all. But you are almost certainly going to be OK if everything you refer to is in /usr/bin:/bin:/usr/sbin:/sbin.

Zooming can be Difficult

Filed under: Design,Research,Usability | , ,
― Vincent Gable on March 5, 2008

I hadn’t realized until today that “zooming” was a nontrivial task. I’m habituated to choose “zoom in” to see more detail, but less of the big picture, and “zoom out” to see how less-defined blocks fit together. But selecting which flavor of zoom is appropriate is not as easy as it first appears.

I didn’t realize this until I saw two participants in usability tests frequently choose the opposite kind of zoom from what they wanted. One lady would even explain how zooming would be helpful to what she was going to do, then say that she should perform the opposite kind of zooming that she described.

Understanding zooming involves forming and manipulating a three-dimensional model of abstract data represented on a two-dimensional screen. Sometimes there’s even the question of what is being zoomed. If you zoom in on a window containing a map, should the window itself change size (take up the fullscreen perhaps), or should the contents of the window be changed?

Small wonder then that some people choose the wrong kind of zoom, especially if they are not spatially-oriented.

The good news is that a zoom error is easy to recover from. You just hit the other button. Recovery is even easier if a knob, or other reversible input device, controls zoom. You just twist in the opposite direction, without having to acquire another button first. The scroll-wheel on a mouse is such a control, but …

But be careful when using the scroll-wheel to zoom, because users may trigger a zoom when they meant to scroll. I have this problem all the time with Google Maps. After a few hours of using the scroll-wheel to scroll webpages, I look something up in the Google Maps webpage — but if I attempt to use the scroll wheel to scroll the map it shoots my viewpoint up hundreds of miles into the atmosphere. Even though recovery is easy, it’s very disorienting, and quite annoying. It’s also slow, because the data has to be loaded over an internet connection — even the fast connection at the office is still orders of magnitude slower then loading the data from local memory.

It’s interesting that Mac OS X’s Exposé feature, while arguably a zooming-interface, is not described as one. To quote the help, “Your computer includes Exposé, a tool that temporarily rearranges windows to help find things.” No spatial reasoning is needed to use it.

« Newer Posts

Powered by WordPress