Press "Enter" to skip to content

Russell Finn’s Blog Posts

Updating the cover of the Swift iBook

Apple updated the cover of The Swift Programming Language to match the new book in the series, but deleting and redownloading the book within iBooks in OS X Mavericks didn’t update the cover — it continued to display the original cover.

The solution was to quit iBooks, delete the iBooks cache located at ~/Library/Containers/, and restart iBooks.

You’re welcome, Internet.


Improved cwd restoration in tcsh

My previous post illustrating a technique for restoring the current working directory in Apple’s Terminal for tcsh users was discovered by Khoo Yit Phang, who suggested an improved version down in the comments. I’m reproducing it here for greater visibility:

if ("$?TERM_PROGRAM") then
  if ("$TERM_PROGRAM" == "Apple_Terminal") then
    alias cwdcmd '( set echo_style = both; echo -n "33]7;file://${host}${cwd:ags/ /%20/}a" )'

Compared to my approach, it has two improvements: (1) by using cwdcmd (of which I was previously unaware) rather than precmd, it only runs when you actually change directories; and (2) by using a suitably configured echo, it avoids running an external command (printf is not built into tcsh, but is present in /usr/bin).

Thanks, Yit.

Update: Of course, with this technique you have to explicitly run the command once, to restore the working directory to the title bar for the first time when you start up. Fixed above.

Leave a Comment

Current working directory restoration in Mavericks Terminal with tcsh

In John Siracusa’s excellent review of OS X Mavericks, he (originally) mentioned that the Terminal application is able to restore the current working directory of open shells across launches.

However, this section has subsequently disappeared from the online version, perhaps for the reasons given below (update: see below). Try looking here for a cached version of the original; scroll down to page/slide number 94. Sorry, John. Please purchase the full review on the iBooks store or the Amazon Kindle store to support John’s work.

Of course I was excited to try this out as, in the course of my work as a software developer, I often have several shell windows open in specific directories. So I tried it, and it didn’t work. It turns out the built-in support supplied by Apple assumes that you’re using the bash shell, but as an old-timer I’m stuck on tcsh instead:

Well, that’s no good, I thought. So I looked in the supporting code’s implementation (/etc/bashrc), and figured out how to do the same thing in tcsh. Simply place the following in your .tcshrc file:

if ("$?TERM_PROGRAM") then
 if ("$TERM_PROGRAM" == "Apple_Terminal") then
  alias precmd 'printf "33]7;%sa" "file://$host$cwd:ags/ /%20/"'

This uses the appropriate escape sequence to send the URL of the current working directory to the terminal before each command; Terminal detects this information and uses it to update the state of the window (including a proxy icon in the window’s title bar for the corresponding folder). It turns out that the key is doing it using precmd (tcsh’s equivalent of PROMPT_COMMAND), and not sending the sequence in the prompt string itself as one might think. (The outer if statement is necessary to avoid an error when remotely logging in, as with ssh. It has to be a separate statement because of the variable expansion rules in tcsh.)

I’ve notified John via Twitter, so perhaps he add restore this information back to his review. In any case, it’s documented here for future generations. Drop me a note below if you have any issues with it.

Update: It turns out John removed it because he discovered it was a feature in Mountain Lion as well, which had happened not to work on his machine:

If you listen to John’s podcasts, you’ll realize that makes sense: he wouldn’t let something not new in Mavericks stand in the Mavericks review. Regardless, I wasn’t aware of the feature before and it still wouldn’t have worked in tcsh, so this post is presumably still useful. (Note that I haven’t tried it on Mountain Lion, and I’ve already upgraded my working machines to Mavericks; I don’t know why this technique wouldn’t work on Mountain Lion, but use it at your own risk.)

Update 2: OK, so it turns out the feature was first implemented in Lion, and other people have already figured out how to port it to other shells; see here for an implementation in zsh, for example. How did I manage to not learn about this for the last two years? Oh, well…


“Regime Change” at Apple

Matt Drance nails it:

There’s a long-standing pattern of separating watershed products important to the company’s future. The Mac and Apple teams. Mac OS X and Classic. The iPod division. iOS and Mac OS X. Suddenly, Tim Cook has pulled the reins in. Federighi owns software. Ive owns design. Cue owns services. Period.

Apple’s insane growth has pushed the situation over the edge. Too much size and separation inevitably bring politics, chaos, dropped balls, and finger pointing. None of those things are good for Apple’s products or customers.

Best summary of the significance of the change I’ve heard to date.  This should end up being a net positive for Apple (despite the loss of Forstall’s talent, which was apparently becoming increasingly overshadowed by his interpersonal style).  And, to overuse a cliché, this is now Tim Cook’s Apple.

Leave a Comment

Debugging software for laymen

Brent Simmons provides what is possibly the best description for laymen of the joy/agony of debugging software that I’ve ever seen:

If it took 10 minutes to reduce memory usage by 96MB, then — were there a linear relationship — it should take under half a minute, less than 30 seconds, to go the rest of the way.

That’s the way things work in the real world, after all. If you have 100 bags of leaves to carry out to the curb, each bag will take about the same amount of time as the others.

Instead, it will probably take me about two hours, maybe more, to get rid of that last 4MB.

It’s almost as if you carried out 96 bags of leaves easily and quickly, then realized you can’t get those last four bags, even though they’re exactly the same as all the others, without pouring a new driveway first.

Which is crazy, right? If the real world operated like that all the time, we’d go completely nuts.

Leave a Comment

O @comcastcares, hear my plea

As of this evening the TV Guide channel is not displaying the scrolling list of program information — just the mindless “American Idol Rewind” and other programming at the top of the screen. You can usually see an empty space at the bottom where the program listing would fall.

When we called the customer support 800 number, the representative was completely clueless and apparently unable to understand our description of the problem. First she told us to unplug our cable-ready TV set from the cable and plug it back in (we’re still analog here and have no cable box). Predictably that had no effect. After my wife and I tried to explain the problem again, she finally decided that the problem was with the network — that is, the TV Guide Network had chosen to stop sending us program listings. She suggested we contacted the network to complain about the change.

As a result, we have no source of program listings from Comcast. The “Channel Lineup” page on has had the message “We are currently working to provide channel lineup information for your area” for at least a year. (Our town straddles multiple counties and has its own cable franchise. Last summer Comcast decided to move everyone in town to the same system, which means that we’re now on the “other” system.)

The CSR dutifully ended the call with “Thank you for choosing Comcast”, which is a joke since our original system (Adelphia) was bought out by Comcast. Oddly we had no problems with Adelphia, but the major impact of Comcast (beside shifting our system) was to repeatedly raise our rates while moving channels from the analog tier to the digital tier.

I personally watch very little television and would ditch cable for over-the-air (and over-the-Internet), but my wife enjoys having the TV on while working in the kitchen, and the kids watch Nickelodeon, Disney Channel, etc. Frankly, Verizon can’t bring FIOS to our town fast enough for me. (Sadly there’s no evidence that they’re even considering this, although they’re hooking up an adjacent county.)

[The six loyal readers of my blog probably couldn’t care less about this issue; this post is really just to have something to point Frank Elias (@comcastcares on twitter) toward.]

Edit: In the interest of full disclosure, I got two responses on Twitter the same evening; apparently it was a known issue (involving the digital transition?) and cleared up in a few days.

1 Comment

Where have you gone, Fake Steve Jobs?

As Fake Steve Jobs, Dan Lyons made a terrific anonymous satirist. As Newsweek’s technology columnist, he leaves something to be desired.

Pass over the Microsoft marketer’s crack about Macs being “washed with unicorn tears” pass by, because, really, that just makes him look like a dick. Move on to Lyons’ observation that Apple is declining to build cheap netbooks and instead, “in January … rolled out that 17-inch laptop with a $2,800 price tag. Talk about tone-deaf.”

Yes, how terribly tone-deaf to introduce a long awaited upgrade to a machine in high demand among Apple’s customer base, on which Apple can continue to make a comfortable profit margin in a difficult economic environment by selling customers with ready money just the machine they want. What could they have possibly been thinking?

Meanwhile, PC manufacturers race to the bottom and wring the last bits of profit from cheaper and cheaper machines. But that’s no skin off Microsoft’s nose, because they (presumably) get the same profit putting Windows on netbooks as they do on high-end workstations.

In fact, Microsoft probably makes more off netbooks, because they typically ship with Windows XP, for which the bulk of Microsoft’s R&D costs have long since been paid.) No wonder they’re “turning the corner.”

Meanwhile, Apple has consistently declined to compete in the low-end market, and yet has continued to flourish financially, to the bewilderment of analysts everywhere. Presumably, unlike doctors, financial analysts are not taught about Willie Sutton.

As for me, I’m looking towards Apple’s next set of financial results, due out on the 22nd of April. I’m also (speculatively) waiting for the day when Apple announces its next low-cost portable computing device, which I predict will (a) not be a “netbook” as we think of one today, (b) cost significantly more than $300, and (c) sell like hotcakes.

I’ll come back to Dan Lyons’ “commentary” then.

(Tip of the hat to Daring Fireball.)

Comments closed

OCPython, anyone?

As dynamic scripting languages become more widely used, many developers are interested in using them to write “native” Mac OS X software, rather than having to learn Objective-C (which, of course, is a dynamic language in its own right). And in fact it is often possible to do so, using Apple’s BridgeSupport to generate the necessary metadata. Apple explicitly supports bridges for Ruby (RubyCocoa) and Python (PyObjC).

Nevertheless, there is necessarily an impedance mismatch between the runtime models — when passing objects to Cocoa, the bridge must convert the object from the dynamic language’s runtime to an Objective-C object derived from NSObject, and vice versa. This introduces a certain amount of inefficiency, which is not normally a big problem, but it would be desirable to avoid it.

Now, over the last few months, I’ve seen a variety of projects to do this by using the Objective-C 2.0 runtime to implement the object model for the dynamic language. In other words, objects in the dynamic language are subclasses of NSObject and no conversion is necessary.

These range from the venerable F-Script, which is even closer to Smalltalk than Objective-C, to Tim Burks’ original language Nu, which uses a Lisp-like syntax. I believe I’ve seen a reference to a JavaScript implementation as well, but I can’t seem to find it now.

The project that seems to be getting the most buzz in the Mac community right now is MacRuby, a port of Ruby 1.9 done by the developer of RubyCocoa (who is also an Apple employee). There was even a article about it featured on the Apple developer site recently.

Conspicuous by its absence from this list is my preferred dynamic language Python. I would love to see an implementation of Python hosted on the Objective-C runtime. I’ve always felt Python’s language model was a good match for Cocoa (of course, PyObjC not only predates BridgeSupport but even Cocoa itself, going back to the days of NextStep), and I’m personally more familiar with it than Ruby or other dynamic languages. So it seems like a logical step to take.

This project couldn’t be called MacPython, because that name has already been used to denote the Mac port of Python. For now I’m calling it “OCPython”, but I’m certainly open to a cleverer name (especially if there’s one that can riff on IronPython; unfortunately the element most associated with Mac OS X is Carbon, which is entirely wrong for this project).

I’ve been thinking about which version of Python to use as a jumping-off point; originally I was leaning towards 2.5 because it’s the version shipped with Leopard, but now I’m persuaded by Bill Bumgarner’s comment to use 3.0 and take advantage of the revised, less crufty implementation. (This is based on the stated goal of the 3.0 development project; I haven’t actually looked at the source code yet.)

I wish I could say I’m prepared to get the project off the ground myself, but right now I’m between jobs, as they say, and given the current financial situation I’m actively looking for full-time employment and can’t dedicate much time to something that won’t bring in any revenue. (Of course, if anyone out there would like to fund development of OCPython, contact me immediately.)


Visual Studio 2005: Not Ready To Lead

Glenn Howe writes of an anomaly in Visual Studio 2005’s C++ compiler:

… I discovered today (Friday) that if you compile something like:

double x = (false) ? 0 : 1.4;

that x will not equal 1.4 as most people (and the gcc compiler) would think, but rather it will equal 1.0. Why? Because it sees 0, interprets it as an integer and decides that if both halves of the : have to have the same type, then that type will be integer. The fact that this is in the middle of an assignment to double means nothing.

Yes, in fact it does mean nothing; the type of the lvalue on the left-hand side of an assignment expression has no effect on the type of the rvalue on the right-hand side.

He goes on:

I’m not even saying that Visual Studio is wrong. It’s different from gcc which leads to platform specific bugs, …

Well, I was a language lawyer in a previous life, so I can’t let it rest there. (And those of you out there saying “Of course Visual Studio is wrong!” should recall that gcc doesn’t always get it right, either.)

Where were we? The type of the conditional operator, right. To find what that type should be, we have to look at the definition of the operator.

In C99, this is pretty straightforward. Section 6.5.15, which defines the conditional operator, says the result of the expression “is the value of the second or third operand (whichever is evaluated), converted to the type described below”. Looking “below”, it further says when you have two operands of arithmetic type, the result type is the type that would be determined by the “usual arithmetic conversions” applied to the two operands.

Now a simple jump to section, which defines the “usual arithmetic conversions”, tells us: “… if the corresponding real type of either operand is double, the other operand is converted, without change of type domain, to a type whose
corresponding real type is double.”

OK, so that’s not completely straightforward, talking about “real types” and “type domains”, but basically we have two numbers, and if one of them is double the other is converted to double, and so that’s that; the type of the expression should be double, as we’d expect, and so Visual Studio 2005 is wrong.

If we’re in C.

C++ is more complicated.

(What a shock, right?)

Well, C++ has to allow for the possibility that either or both operand is a class type, and if so can it be converted to the other’s type, blah blah blah (section 5.16, if you’re following along at home).

Since we don’t have class type operands, we go on, applying the “standard conversions” to the operands (none of which apply here), and then, if “the second and third operands have arithmetic or enumeration type[,] the usual arithmetic conversions are performed to bring them to a common type, and the result is of that type.”

Hey, that was pretty simple after all. No, wait: are the usual arithmetic conversions the same in C++ as they are in C? Good question; let me see… (flip, flip, …) here we are, clause 5: yes, they are.

So from where I sit, Visual Studio 2005 is wrong in C++, too.

Wrong on conditional operators.

Wrong for America.

(I can’t wait for this election to be over…)

Comments closed

Will no one rid me of this troublesome plugin?

So, facing the “Would you like to install Flash Player 10?” message in the browser page at Adobe’s, I had a micro-aneurysm or something, and thought, my daughter spends all her free time playing Flash games, so I’ll need this soon anyway, right? So I clicked “Yes.”

[If you’re reading along at home: STOP! DON’T DO THIS!]

Whereupon Flash downloaded and tried to launch some oddly named helper program which bounced in my dock for about a minute, while Safari spun its rainbow pizza. Finally, the system asked me to confirm I really wanted to run this program downloaded from the Internet —

[Reader, I implore you again, turn back!]

— and finally launched the installer. Which proceeded to ask me to close all running browsers. OK.

No. Wait. I can’t close my browser BECAUSE YOUR STUPID PLUG-IN IS STILL SITTING IN A LOOP WAITING FOR THE HELPER PROGRAM, so it won’t respond to the quit request.

Criminey. Doesn’t anyone at Adobe ever test this stuff out?

I know, I must have this odd configuration where I’m running the latest update of the operating system with the standard system web browser. There’s no way they can be expected to test for that.

Leave a Comment