Archive for June, 2007

MacUpdate alternatives

Saturday, June 30th, 2007

Following the recent flap about MacUpdate prematurely listing Perian 1.0 before it had really gone 1.0, I think it appropriate to present a list of software-listing sites that are not MacUpdate. If you want to boycott or just casually avoid MacUpdate, whether for that reason or other reasons, this list will help you do that.

You'll know some of these, but you may not know all of them. I'll start with the ones you probably know and build up to lesser-known sites. That said, the order is not strict, so just because site A came after site B doesn't necessarily mean site A is any better or lesser-known.


  • VersionTracker: The old standard. This was the very first Mac-specific software-listing site, and MacUpdate's primary competition (indeed, MacUpdate exists to compete with it).

    VT's main downside is used to be that it is was a very ad-heavy page. This inspired MacUpdate's founding principle: fewer (initially no, as I remember it) ads, so that the page would load faster.

    One handy—though well-hidden—feature is that on the “Updates by Category” tab, at the bottom, there's a list of single-license lists, including a freeware-only list.

    UPDATE 2007-07-06: VT has mostly done away with ads, and has a freeware view. Thanks to Hoopla for pointing out my error and the freeware view in a comment.

  • Download.com: The other old standard. I'm not sure which is older. Unlike VersionTracker, Download.com was for Windows (maybe even DOS) first, then added Mac software later.

  • Softpedia: A more recent entry (at least on the Mac). It's quite similar to Download.com and Tucows, IMO. You can tell that they were a Windows site first because of what every developer they list gets: an (unintentionally-)amusing email certifying that the developer's software is virus-free, along with an icon on the listing page indicating the same certification. Mac users (at least those who haven't used Windows recently) see this “100% virus-free” graphic and think “Yeah? Why wouldn't it be?”.

    One nice feature is that, like VT, it lets you filter the list to only freeware.

    UPDATE 2007-07-06: The same update as above. Specifically, I added “, like VT,”.

  • Tucows: The third of three (that I know of) sites that originally only listed DOS/Windows software; also the other other old standard. I never used it much, but it's much better than I remember it: the last time I tried it, I couldn't figure out how to download any of the software listed.

  • iUseThis: The newest entry into this field. The hook of iUseThis is that it works similarly to digg: If you use an app, you can go to its listing and vote it up (that is, digg it) using the “i use this” button. AppFresh integrates it, which is nice if you're both an iUseThis user and an AppFresh user. (Be sure to click the button on AppFresh's iUseThis listing for mad cyclicality.)

  • Macintosh Products Guide: The elder of Apple's two software-listing sites. Though it's open to any software, the MPG emphasizes commercial products.

  • Apple's Mac OS X Downloads: I suspect this isn't well-known, because Apple's main effort to publicize it is a menu item in the Apple menu. (It's much better-known among Dashboard widget authors, as it was the first site indexing widgets.) Trying to help that, MacBreak did a recent MacBreak Minute about it. (To be clear, I had already known about it before the MacBreak episode.)

    Not to be confused with the Macintosh Products Guide, listed above.

    (Added a few minutes later: Chris tells me it actually does bring in a fair number of downloads, especially if you get featured.)

  • Pure-Mac: Unlike the others, Pure-Mac places less of an emphasis on the running list of new and updated titles, instead presenting above the fold its list of categories. This is Pure-Mac's central feature: the other sites simply maintain a blob of software that you search with a field, whereas Pure-Mac breaks them down into smaller category blobs.

    Pure-Mac is also probably the fastest-loading of the sites, because it uses static pages rather than CGI.

    Full disclosure: I do know the maintainer somewhat, as both I and the maintainer have been regulars on the same IRC channel at the same time. That didn't affect Pure-Mac's placement within this list.

  • HyperJeff: Perhaps the smallest of the software-listing sites (though Pure-Mac gives it a run for its money). HyperJeff's site lists libraries and frameworks alongside applications, and notes whether each app is Carbon, Cocoa, or Java. He has written about his catalog's characteristics on his “Why this listing exists” page.

  • Open Source Mac: A simple, digested list of what the maintainers think are the best open-source apps on the Mac. If you'd like to use as little closed-source software as possible, this is a good first stop.

    Full disclosure: Adium is listed here, and I'm one of Adium's developers. Again, that didn't affect the placement of the site within this list.

  • Mac Games and More: Guess what it emphasizes!

    I found this one upon searching Google for “mac software” to check whether I'd missed any. I've never used it before, so I haven't much to say about it.

You know, I never realized how many Mac-software listings there are before making a list. There are nearly a dozen listed here. That's a cool fact right there.

How to use Plot

Saturday, June 30th, 2007

Plot is a freeware plotting and graphing application for Mac OS X. It's good, but its documentation and UI are not very effective at explaining its most basic usage. I eventually figured out how to use it, but while it could have been much worse, it certainly wasn't obvious. So I'm going to give you the 60-second primer that I needed.

If you're not familiar with the basic concept of a graph: It's zero or more data points with x and y values, lain out in a graphical depiction mapping the x and y values to positions on the graph. Plot is an application that turns your data into a graph.

This is the graph window in Plot. This is a composite screenshot showing both a bar graph and a line chart.

Plot is organized around buffers. Each buffer is a set of data: zero or more points with x and y values, and x and y error-values.

Buffers are listed and managed in the Data Inspector window, wherein Plot indicates the current buffer with a ➽ character. You edit the contents of the current buffer in the Data View window, and you edit its parameters (most of which concern the graphic display of the data) in the Inspector window (not to be confused with the Data Inspector window).

A new document doesn't contain any buffers. You create buffers using the New Empty Buffer command in the File menu, or by importing data from various sources, including text files and MySQL databases. It even has a feature to automatically update the buffer from the database periodically, but I haven't tried it.

You can have as many buffers as you want, and you can change the order in the Data Inspector window, using the ▲ and ▼ buttons.

The Data View is fairly straightforward, but there is one gotcha: Double-clicking the X or Y column header switches the column between number values and date values. I have no idea why this isn't in a more obvious place instead; I actually threw away a document, thinking that it had become corrupted somehow, before I figured out later that double-clicking the column header is what tells the application to switch it.

Another pitfall: There's no “your document is unsaved” warning. You may want to unplug your keyboard so you don't hit ⌘W or ⌘Q by accident. ☺

The text file format is good if you want to store data independently of the Plot document (especially since Plot uses NSKeyedArchiver for its native file format). The text format is very simple: the first column is the x value, and the other column is the y value. Each record is one line. Each file is one buffer. You can import multiple buffers at a time, but you can only export one at a time.

To change the width of a bar in the bar graph, change the “symbolsize” in the Data Style pane of the Inspector. This is also used for the symbol rendering; unfortunately, there's no way to have both a symbol and a bar graph and have them be different sizes (or colors).

To assign text along the sides of the graph indicating what the axes represent, use the Axis Text field in the Axis pane of the Inspector.

To have a legend (most useful for multiple buffers), first assign each buffer a comment in the Data Inspector, then turn on Plot Legend in the Legend pane of the Inspector. To place the legend, either use the two fields there, or use the “move legend” tool in the Inspector (which you can also activate by pressing the L key in the graph window). The move legend tool allows you to set the position of the legend by dragging within the graph window.

Here's a bar graph generated in Plot looks like.

Here's the Plot document for the example graph used herein (compressed with bzip2).

Constantly?

Friday, June 29th, 2007

From this article about kevent and why it's better than anything else:

Another approach is to set signal handlers to catch when I/O is available, and then put the process to sleep. […] However, the problem with this approach is that signal handling is somewhat expensive. For example a web server receiving 100 requests per minute, would need to catch signals almost constantly.

No; 100 requests per minute means one every 0.6 seconds. I do think most web servers can completely finish almost any request in less than 0.6 seconds, unless you're dealing with a broken CGI, broken database engine, etc.—in which case, signal handling is not your performance hit.

Really, the only amount of time that matters is how long it takes for your signal handler to fork or create a thread. After that, it's some other process/thread's problem.

Really cheap flash memory

Thursday, June 28th, 2007

At your local Micro Center, behind the counter, they have USB flash-memory sticks for $16 for 2 GB.

Here's a photo comparing the size of the stick to the size of a US 25¢ coin. The stick is about twice as long as the quarter, and ⅔ of the width.

There is a catch: It comes with a second read-only memory device containing preinstalled software for Windows. Fortunately, this is easy to disable with a simple fstab rule.

The main storage device, on the other hand, is easily reformatted in Disk Utility. The stick is USB 2.0, as you can see from my dd results:

Plugged into my keyboard (thereby constrained to USB 1.1)

dd bs=62914560 count=1 if=/dev/zero of=temp          %/Volumes/Stick of data(0)
1+0 records in
1+0 records out
62914560 bytes transferred in 63.105605 secs (996973 bytes/sec)

Plugged directly into one of my USB 2.0 ports

dd bs=62914560 count=1 if=/dev/zero of=temp          %/Volumes/Stick of data(0)
1+0 records in
1+0 records out
62914560 bytes transferred in 11.250311 secs (5592251 bytes/sec)

In case you're wondering, 62,914,560 bytes is 480 megabits, the theoretical maximum throughput of USB 2.0. If I were using 100% of that bandwidth, the write would have happened in one second. As it was, the write did about 5+⅓ MiB per second over USB 2.0, and 1920 MiB per second over USB 1.1.

Pretty good for $16, I think.

What’s in your menubar?

Saturday, June 23rd, 2007

Synapse forwards the question: What's in your menubar?

Here's a screenshot.
Screenshot taken 2007-06-23.

From right to left:

  1. MenuCalendarClock
  2. User MenuExtra (AKA Fast User Switching)
  3. Volume MenuExtra
  4. Text Input MenuExtra
  5. Keychain MenuExtra
  6. MemMeter (MenuMeters)
  7. NetMeter (MenuMeters)
  8. URLWell
  9. Strings Menu (lets me insert strings from a list I've predefined; eventually I'll port this to a service and release it)
  10. GrowlTunes
  11. (Not shown) Adium

Of course, that's not nearly as bad as it used to be…

(more...)

Apple Bug Friday! 63

Friday, June 22nd, 2007

This bug is hdiutil provides no facility to change bzip2 block-size. It was filed on 2007-05-25 at 13:49 PDT.

(more...)

Apple Bug Friday! 62

Friday, June 22nd, 2007

This bug is User 501 gets the admin bit after migration. It was filed on 2007-05-25 at 13:29 PDT.

(more...)

The well-hidden documentation of Core Audio

Sunday, June 17th, 2007

Ordinarily, I'd post this on del.icio.us, but this isn't on developer.apple.com and I don't think del.icio.us allows file: URLs.

Most use of Core Audio goes through Audio Units, but the Audio Unit API has historically been undocumented. Today, I finally found the Audio Unit documentation. Turns out that, rather than being in the /Developer/ADC\ Reference\ Library/Documentation folder (where you would expect documentation to be), it's hidden in the /Developer/Examples folder. This documentation is so good (damn near production-quality) that I feel like I've struck a rich vein of gold ore.

WTF, Apple?

People I’ve met at WWDC

Thursday, June 14th, 2007

This is a partial list until Friday night, but it's worth posting now because of all the people I met at the WWDC Bash.

Where possible, I've also listed their IRC nickname.

Adium-related people I met at WWDC

Other people I met at WWDC

  • Karl Adam (PantherMachina)
  • Dave Batton [Added Friday, though I met him before the Keynote]
  • Ken Ferry (kongtomorrow)
  • Andy Kim [Added Friday]
  • Paul Kim (mr_noodle) [Added Friday, though I met him after the Keynote]
  • Devin Lane (DevG5)
  • Gus Mueller (ccgus) [Added Friday]
  • Scott Stevenson [Added Friday; I'd met him previously at CocoaHeads]
  • Many Adium fans (thanks for your kind words, everyone!)

Bloggers I met at the WWDC Bash

Bloggers I met at CocoaHeads

The audience was SRO, so David and I (along with Devin and Michael Gorbach) just went off to The Studio and hacked code. After the meeting, I went up to Scott, and we shook hands and that was it. My guess is that it was a busy night and he wanted sleep.

People I've seen at WWDC, but did not talk to

People I saw at the WWDC Bash, but did not talk to

  • john calhoun
  • Martin Ott (I think he saw my Adium shirt and said “look, Adium!”, but it could just be wishful hearing, considering Ozomatli was blaring at the time)
  • Some other people I'm totally blanking on

A simple way to make your NSLogs and NSAsserts more informative

Wednesday, June 13th, 2007

OK, so I'm not totally radio-silent. I learned about this in a WWDC session, but since it's already public API in Tiger (actually, it's a GCC extension), I can talk about it.

It's a built-in macro called __PRETTY_FUNCTION__. This is a fully-qualified human-readable signature of the function you're in. The GCC docs don't mention this part, but it even works in Objective-C, in addition to C++ and plain C. Here's a test app, containing this code:

@implementation Blah(blah)
- (void)blah {
    NSLog(@"%s", __PRETTY_FUNCTION__);
}
@end

And the output:

2007-06-14 07:50:37.733 printmethod[1800] -[Blah(blah) blah]

Notice that it includes the class name, category name (if any), and method selector.

Note that that's a C-string, not an NSCFString. Be sure to set up your format string accordingly.

Scheduling note

Tuesday, June 12th, 2007
Since I'm at WWDC, all the bugs I'm filing this week are Leopard bugs. That means that their contents are under NDA, so I can't post them on the web. Thus, there will be no ABF this week. ABF will return next week with at least two bugs! And yes, they will both be Tiger bugs.

Bug in the accessors generator

Tuesday, June 5th, 2007
 unsigned short multiplierBase, multiplierPower;

The output from the accessors generator:

- (unsigned) short;
- (void) setShort:(unsigned)newShort;

- (unsigned) multiplierBase;
- (void) setMultiplierBase:(unsigned)newMultiplierBase;

- (unsigned) multiplierPower;
- (void) setMultiplierPower:(unsigned)newMultiplierPower;

This is both an advisory to you and a reminder to me. I'll be tackling this after WWDC.

Apple Bug Friday! 61

Friday, June 1st, 2007

This bug is Mac OS X should include pbzip2. It was filed on 2007-05-25 at 01:01 PDT.

(more...)

Blog spam count #2

Friday, June 1st, 2007
I've reset the NTT counter at 26,445 spams. Once again, next month will bring another count of spams-per-month. I think I'll do this every month and establish a trend. Maybe find some free graphing software and plot a graph with the counts.