With all the news about web fonts lately...

With all the news about web fonts lately, I've been thinking about typography as a difference between web apps and desktop apps. No one expects web apps to conform to any standard UI, so designers can experiment and give us distinctive interfaces, using different fonts and color schemes.

It seems like there's less room to play in desktop apps - you'll see unique interfaces with new button styles, new controls, different color schemes, but as far as I can tell, not much variation in typography.

The only example off the top of my head is Panic Sans, used in Coda.

Why so little variation?

Is it the presence of a standard system font, UI guidelines, or just habit?

Is there a licensing issue for redistributing fonts with software? I tried to look for licensing terms, but this doesn't seem to be a common question.

I wouldn't mind some more tasteful variation in my desktop apps - I think the best web apps have shown us that different isn't always bad.

SVN in emacs vs. TextMate

Some responses I got to my post about SVN workflow pointed out TextMate's SVN integration. It looks like I could do what I want in TextMate, but it didn't look as smooth as the dedicated clients, and I might be wrong but it gave the impression that I couldn't set it all up without a lot of mousing around. Since I'm an emacs addict, I'm probably not going to give TextMate a real try, but in this case I think there'd be no reason to. I'll explain why.

It's not hard to get the layout I want in emacs with VC-mode. I put a screenshot below. On the left is a window (the whole OS window is an emacs "frame") with dired under VC - the directory edit mode showing what's modified. I've marked two of them so I can commit them together. In the middle I'm viewing the diff for one of the files, and on the right I'm editing the log entry for the entire commit. I can change things around without losing my log message - view other diffs, make edits, etc.

SVN in Emacs: Dired under VC / VC-Diff / Log-Edit

The only real problem I have with this is that it takes a bit of manual window setup every time to get to this arrangement and clean up the diff buffers, and that the display could be nicer. Cornerstone fixes the display issue, and if it (or another SVN client) got the workflow right, it'd fix the first.

I wrote an emacs function once to do that setup automatically. I called it vc-checkin-mike, and it got about 80% of the way there. Enough to feel like I'd spent too much time on it, but not enough that I wanted to use it.

As far as I can tell from screenshots, TextMate is roughly in the same spot as emacs - I can do what I want but it takes a bit of manual setup, and it's not as pretty as the dedicated clients like Cornerstone.

I was listening to the [Core Intuition](...

I was listening to the Core Intuition podcast on dog walks for a while, and I sent in a question they covered in Episode 17 (hi guys - better late than never).

Since I'm in research, I think about future trends and what things are going to be like 5, or 10 years out. It's fun, but it made me wonder when I listen to these indie dev guys - do they have a plan? What if web apps and Chrome OS take over everything (they won't) or everything has to be seamlessly synced with some "cloud" (it will)? How will their apps and businesses react?

In answering, Daniel and Manton made a great point that's a real positive for small, low-investment indie development - if the ground moves, they can pretty easily just stop what they're doing and retool. Changing feature plans is fast, starting a new app project is fast. Projects can be dropped without laying off a bunch of people.

It was a real lesson in the agility of indie development. Now if only they'd post another podcast, and Austin would cool off enough for me to walk the dog for longer than a few minutes…

I wouldn't normally post something abou...

I wouldn't normally post something about my weblog software, but I was apparently stumbling along with a really old wordpress that didn't accept new comments anymore, so I've upgraded.

As a result my custom theme bit it, and I am fresh out of PHP edits. So I'm trying this twitter-inspired thing out, the new "P2" theme for wordpress. It might make a good place for things that won't fit in twitter.

So say hi, leave a comment and let's do this thing.

Subversion Client Issues

I use subversion, and won't switch to something newer for a while, so it's worth looking at how to polish that old hammer. I'm used to using the command line svn, or emacs. But recently I decided to try out a few of the nice GUI clients that are around, including Versions, ZigVersion and Cornerstone.

Of these, the only one that's polished enough to lure me away from emacs and seems to support my favorite mode of working is Cornerstone, and it still gets it a little wrong.

I like to write log comments while looking at (and scrolling through) the diffs for the files I'm committing. This means I want a text field for writing log comments on the same screen as the diffs, that isn't modal, and doesn't stop me from moving around between multiple diffs.

As far as I could tell, I couldn't get the comment field and the diff display shown together in Versions, and while I could in ZigVersion, that app had a subpar diff display and lacked polish overall, missing key shortcuts where I'd expect them, for instance. Cornerstone almost lets me do what I want, but it displays the comment field in a modal sheet, so I have to cancel to change which diff I'm looking at.

This is easy in emacs, but I like a nicer diff GUI. Am I just missing something? This feels like a natural workflow, so it seems strange that no clients support it well.

Something Buckets

Alex Payne's recent post The case against everything buckets makes a strong point in favor of using the filesystem for filing. To paraphrase: If your problem is that you have a bunch of files you need to search through, and possibly tag, then the filesystem and Spotlight are probably closer to solving your problem than you expect.

I enjoyed reading his post, because I like rules of thumb for simple design, and one of my favorites is "why not just use files?" - there are often reasons to do something else, but the filesystem is faster, more reliable, and more open than anything you're likely to come up with on the first try. So you'd better be sure you're not just poorly reimplementing it.

Buzz Andersen has a thorough response, centering on the fact that VoodooPad is a very useful app. Certainly I agree - I use it all the time, and its hyperlinking sets it apart from other notes apps (and the filesystem). So yes, VoodooPad is a Good Idea.

But is VoodooPad really an "Everything Bucket"? I'm not sold - you can use it to store PDFs and images and other files, but it really focuses on pages, and those files are just attachments to your pages. I see it as a notes app. I think if your problem is keeping notes - with images if necessary, linking between them, and searching those notes, then VoodooPad is clearly better than the filesystem. But you don't have to put everything else in there too.

I agree with Alex that I don't want one program to keep everything in a proprietary database. I like apps that keep my files as files. (like EagleFiler.) But I do want layers on top of the filesystem - you wouldn't want to use just files for email, for example.

The only solution that's always bad is the solution to someone else's problem.

iCal's Text Field Jumble

I've written here before about text fields, particularly the problem of having a good-looking 'display' mode and a separate 'edit' mode for data you don't edit so often, like in AddressBook.

The most recent version of iCal decided that events are write-once-read-many as well. You now have to use cmd-E to get into edit mode, while cmd-I just gives you a small display mode.

I'm mostly OK with that, although I find I edit events about as often as I look at their info windows - after editing I usually just deal with alarms, not the events themselves. The casual glance at the time and title is always enough - I think either you're looking at the time and title or you're editing. I don't see the appeal in the new 'info-only' mode (if it's actually new - it seems new.)

However, the change does highlight the jumble of editable text fields and text-like fields in the edit window:

The "Add Attendees" link and the "None" placeholder for url act the same - you click on them, and enter text. One's a link and one's mute gray text. Why? For my part, I think the gray text is too understated, and the link is too garish.

There are other differences: you can tab to the "url" field, but you can't tab to "attendees"... until you add one, then you can. Once you click on either of them, the url field pops up a plain white raised NSTextField, but the attendees field is sunken and translucent, apparently an NSTokenField?

Both of the blue links could also be buttons. I'm still not completely sold on replacing buttons with links, but I can understand the trend. I think a small plus-sign button would be fine for "Add File", though, and "Attendees" ought to be a text field. Why force the user to use the mouse when adding data to an event?

All in all, I think the "Add Attendees" link/field is pretty strange. I'm curious if I missing a precedent somewhere.

go juggle — an attention callback

Sometimes progress on a project for me consists of a few short bursts of activity in between stretches of waiting for some long-running thing to complete so I can figure out what I need to do with it next.

Because I always have more than one project going, I don't actually wait much. I just switch workspaces and try to make progress on the next thing. If I can't make progress on anything immediate, I'll end up checking email or looking up something for a side project.

This kind of multitasking is inefficient, but inevitable when I might have to wait for 20 minutes or more for a compute job or a compile to finish.

The problem with this approach is that the things I'm waiting for often finish while I'm off doing something else, and if I get too involved, the low-priority research or emails will eat up my day while the high-priority work sits waiting for me.

I've attacked this problem in the past when using OS X with growl, but I can't call growlnotify from remote systems. However, I just found dzen for X Windows, a lightweight notification display utility that compiles easily on every system I've tried, and works remotely with ssh X forwarding.

I wrote a simple script called go, which just executes its arguments and runs dzen when it's done. Now I type (for example) go make and I can switch over to something else, confident that I'll see a big popup window letting me know when I can get back to working on my highest priority project.

Here's basically the entire go script:

echo $@
echo $@ completed on `hostname` \
 | dzen2 -p -h 64 -bg darkblue

It's simple but it's working great for me. I've tried some improvements like randomizing window placement to avoid overlapping notifications, but the simple version above really does all I need.

Finally, a couple of details. zsh always seems to want to spell-check 'go', so I really named it '~/bin/executeAndNotify.sh' and just aliased 'go' to that. Also, I've found it can mess with shell quoting as is, so sometimes I have to do 'somecommand ; go echo done'. If someone has a tip on getting the quoting right in the script, I'd love to hear it. The problem crops up when you try something like 'go make CC="cc -g"' - the quotes don't make it through.

Two hours

Daniel Jalkut just wrote about a desktop bookmarking app called Pukka, which despite being apparently nice enough to warrant a positive review, was simple enough that Leo Laporte wasn't comfortable just saying it cost $15. I felt like adding to the discussion after a few commenters described the app as trivial - in one case saying that any good programmer could write it in two hours.

This bothered me, so I downloaded Pukka and gave it a try. I was curious to see if it was indeed trivial.

While it definitely doesn't seem like the most feature-rich program up front, there's a lot of stuff in there - it works with more than one bookmarking site, it integrates with RSS readers, uses the OS X keychain, includes Bonjour discovery of nearby users, and has AppleScript support.

Further, it shows attention to detail. Although I may not agree with some of Justin's UI design choices, it's clear that he spent time thinking about bookmarking workflow. I know in some of my projects, just pondering design choices takes hours - drawing mockups, and trying things out.

End-user app development isn't just programming, and programming isn't just typing.

I think it's fair to say that that although you might be able to retype the code by hand in a few hours, Pukka represents a good chunk of serious work. I'm sure the mac developers in the audience will agree - Applescript support alone is almost guaranteed to be more than two hours of work.

I'm glad that there's a market for small apps and small developers, and I hope downwards price pressure from large subsidized or bundled apps doesn't kill that off.

VoodooPad 3.5

From Flying Meat, VoodooPad 3.5 is out. (release notes here).

It's a solid update, including welcome image-editor integration and more. I thought I'd point out my favorite feature in the release notes:

"You can now edit pages and sort the results in the search window (woo!)."

I like this because it matches a kind of manual refactoring habit I picked up with Project Builder / XCode's excellent "Find in Project…" window - I search for a keyword that marks places I need to look at and edit the files right in the search window. (Note: 'occur-mode' and kin are a powerful way to do the same in Emacs…)

It's a powerful habit if you plan for it, by using comments in code to keep track of what you've touched when making a lot of cross-cutting changes, like # @addsearch Then when you think you're done with a change, you can run a quick search to see if you forgot to fix anything.

Sometimes in VoodooPad notes, I'll write in placeholders like that comment when I don't have a bit of information yet, and now I can follow my trails the same way I do in code.

Thanks, Gus!