Wednesday, December 24, 2008

Dear MBW: I just want things to be like they used to


I used to love MacBreak Weekly. But I finally gave up and unsubscribed. Why? Here's an example. And keep in mind, this is not an isolated incident. This is a representative sample:

Episode #117. They've got Wil Shipley. Great guest. Should be a great show. Wil is (trying to) talk about scanning barcodes with a cellphone camera. Andy Ihnatko interrupts with a digression about how he takes pictures of books in the store and later buys them online. Leo LaPorte interrupts Andy with a digression about how buying books online is just so much more convenient. Andy interrupts Leo with a digression about how he's finding more and more books scanned into Google. Alex jumps in to defend the value of the printed book. The whole thing devolves into a discussion about which books are worth owning in physical form. (Answer: books with lots of pictures.) Total time before Wil even speaks again: six minutes. And he never did return to exactly the point he was trying to make before he was interrupted. It was just lost.

So okay, six minutes out of a 90 minute show, no big deal, right? Couple points. One, the thread of the meaningful conversation was destroyed by the interruption. Two, it happened again. Wil started to talk about using your mobile device for comparing prices, and the group launched into another digression about some camera store down the street that overcharges for everything. Elapsed time between the end of the first interruption and the start of the second: Forty-five seconds.

The conversations used to be more coherent. The digressions were fewer, and more interesting when they did happen. Remember the Rat Hole music? They don't even bother to play it anymore, because if they did, it would run non-stop.

It's not too late to right the ship, MBW. I miss the show you used to be.

Wednesday, September 24, 2008

In case you missed it in the 80s, here comes the sequel


App Store: I'm out (Fraser Speirs)

Apple Extends NDA to Rejection Letters (Arnold Kim)

Beneath Apple (Brent Simmons)

"[Microsoft] is annoying, but (in the end) not half so annoying as watching Apple inscrutably and relentlessly destroy itself."
   - Neal Stephenson in 1999

Thursday, September 18, 2008

Slicehost: The Awesome Continues


Is it possible to restore a single file or directory from a backup?

I was recently in the same situation, it actually happened a little bit before Sep 4 and so I didn't have the benefit of looking at this thread. But I tried it anyway, just to see how Slicehost would handle it. I allocated a new slice sourced from the previous night's backup of my production slice. I scp'd my lost files back over to the production slice and then told Slicehost to delete the new slice. It took about 20 minutes to wait for the new slice to allocate, 10 minutes to retrieve my files, and 10 seconds to deallocate the new slice. Cost to me: 66 cents.

I don't know what these guys are thinking. With customer-friendly policies like these, how will they ever have a successful IPO?

Saturday, September 13, 2008

Monday, September 01, 2008

Google Chrome


Google Chrome

John Gruber is on target when he says it sounds more like an application runtime than a browser. But the key point is that it is an application runtime optimized for the kinds of web applications that already exist. They're not trying to make a "next generation" browser like Ubiquity or push some new kind of embedded applet ("Rublets - now you can make RIAs with Ruby!") Based on this one comic book-style presentation, Chrome is monomaniacally focused on making the existing crop of HTML+Javascript+AJAX based web applications run like lightning. And by extension, expand the viability of that platform into the near-term future. Which makes sense, considering how much Google has invested into that platform. Reading between the lines, it seems like the Google Gears developers said "here's what we could do with Gears, but the existing browsers are too slow/too crude/etc." So someone at Google said "fine, let's make our own browser so that the Gears guys can go nuts."

Thursday, August 14, 2008

We all suspected it, and now it's confirmed


I'll give you a little hint here: some of us, back when I was inside the fruity compound, occasionally held contests to see who could get the weirdest, most funky and outrageous, rumors posted to one of the major rumor sites.

- Chuqui 3.0

Sunday, May 25, 2008

Safari bookmarks and Sync Services


For my own purposes, I need to make a Cocoa program that knows about my bookmarks in Safari. Lucky for me, Safari submits its bookmarks to Sync Services, according to Syncrospector:



To complete my evil plan, I also need to know the last time I clicked on a bookmark. Lucky for me, the sync schema includes a "last visited date", according to /Applications/Safari.app/Contents/SafariSyncClient.app/ Contents/Resources/SafariClientDescription.plist:


<key>Entities</key>
<dict>
    <key>com.apple.bookmarks.Bookmark</key>
    <array>
        <string>url</string>
        <string>last visited date</string>
        <string>name</string>
        <string>position</string>
        <string>notes</string>
        <string>parent</string>
        <string>com.apple.syncservices.RecordEntityName</string>
    </array>


So I just need to write my own Sync Services client that syncs with the com.apple.bookmarks.Bookmark(s)...

Uh oh. Let's have another look at that Syncrospector screenshot. The displayed entity there is a Bookmark, but it doesn't appear to have a "last visited date" property. Neither do any of the others.

I went ahead and made my own Sync Services client, so I could poke around in there for myself, but it sure seems to be that Safari doesn't set that property on the bookmarks that it submits to the truth database (it's not required to) even though Apple's own sync schema defines such a property.

Bah. Back to the drawing board for me.

Thursday, May 22, 2008

OS X, Bonjour, Apache


As part of some experimenting the other day, I went into System Prefs on my laptop running 10.5 and activated Web Sharing. To my surprise, my personal web site did not appear in Safari's Bonjour list, nor did any HTTP service appear in Bonjour Browser. I could reach the web page if I typed in the URL, it just wasn't being advertised by Bonjour. I had a very clear memory that it used to work with Bonjour, so I started asking why it's not working now. I did some Googling, I searched Apple's support forums, I finally got my friend Thomas involved. He, also, remembered that it used to work with Bonjour, he, also, could not find any leads via Google. (And he's a really good Googler.) He suggested that we check the httpd.conf on my laptop. ("Mac use conf file? That's unpossible!") Sure enough, here's what we found:


<IfModule mod_bonjour.c>
    # Only the pages of users who have edited their
    # default home pages will be advertised on Bonjour.
    RegisterUserSite customized-users
    #RegisterUserSite all-users

    # Bonjour advertising for the primary site is off by default.
    #RegisterDefaultSite
</IfModule>


I made a trivial edit to Sites/index.html in my homedir, toggled Web Sharing off and on one more time, and presto! there was my personal site listed in Safari's Bonjour list.

I'm not sure if this is something new in Leopard, or if it changed in Tiger and I just never noticed. I'm sure Panther didn't work this way. And I'm not saying the Leopard way is bad. It just surprised me.

Saturday, May 17, 2008

If it looks like pee, don't drink it


I'm done spending big bucks on any whiskey which is yellow. Good single malt whiskey should be brown. Think about it - Irish, Scotch, or American, all of the really flavorful whiskeys have a rich brown color. Now I do like Dewars White Label occasionally, but that's a blend, and a whole different financial category than a single malt like Auchentoshan or Knappogue. Those pale yellow-colored whiskeys just don't have the depth of flavor that I want from a single malt.

Friday, April 25, 2008

How many angels can dance on the tip of a mouse pointer? I don't care.


I used to care about piddly shit like this. The day I quit caring was the day I started wanting a Mac. (That day, incidentally, was about two years before I actually got a Mac, so don't give me any crap about rationalizing in Apple's defense.) After five years of having a Mac, I still don't care and I feel great! It's like switching from Catholic to Buddhist.

That's what not having autofocus is like to people who've been using it for the past 10 to 30 years (in my case, 20 years). BLONK! BLONK! BLONK! I'm serious. It's that bad. Not exaggerating even a tiny bit.

Bull. You're exaggerating quite a bit, because the software isn't behaving inside your narrow definition of "correctness."

(If you skip down past the hyperbole to the part where he actually starts programming, there is some interesting stuff.)

Saturday, March 15, 2008

Creating a menu-based SIMBL plugin


There are a hundred tutorials on creating nib-based Cocoa applications. And there's at least one good write-up on how to make a Cocoa bundle that can be loaded by SIMBL. SIMBL has taken on increased importance with the release of Leopard, because InputManagers can no longer be installed in user folders. They must be installed at the system level in /Library/InputManagers. However, if you or your admin install just SIMBL at the system level, SIMBL acts as a fine-grained meta-manager, loading SIMBL-compatible plugins on a per-user and per-application basis.

Normally Cocoa bundles don't include nibs, but you can add them. The CULater wiki doesn't go so far as to guide you thru adding a nib to your Cocoa bundle, or how to attach the nib-generated menus to your target application. Since we can't edit the nibs of the target application, we have to install our nib contents programatically using Objective-C.

So that's what we're going to do today. I'm going to assume you already have SIMBL installed on your computer, and that you are at least novice-level with XCode and Cocoa. I specifically cover the differences between Interface Builder 2 and Interface Builder 3, mainly to point out how much IB3 has been improved.

1) Open XCode and start a new Cocoa Bundle. Let's call it "George".

2) Before we create any classes, we'll use Interface Builder to make the menu. The menu is going to have a single "About..." menu entry. A little later when we load the bundle, we'll insert our menu into the menubar programatically, since we can't edit the nib file of the target application.

When you create a Cocoa application in XCode, XCode automatically creates your first nib file in your project for you. But since we created a bundle, our project doesnt have any nibs yet.

2a) In XCode 3, go to File->New File and make a new Cocoa nib file. Be sure to create an "empty nib" file not an "application nib" file. Just call it "Menu.nib". Doubleclick the nib file in XCode to open it in Interface Builder.

2b) In XCode 2, you can't create an empty nib from within XCode. Open Interface Builder directly, and choose an empty Cocoa nib as your starting point.



After building the menu (step 3 below) save your new nib file in your project directory as "Menu.nib". It will ask you if it should add the nib to the project, and if it should add the nib to the target "George". Answer yes to both.

3) Drag an NSMenu from the IB palette to the IB main window (the window that contains "File's Owner" and "First Responder".) Then (XCode 3 only) doubleclick it to create an editable menu on your screen. Delete all but one menu item, and rename that one to "About..." Save your work then switch back to XCode.

4) Time to create the class which will contain our menu callback and, in this case, also bootstrap our plugin. Create a new Objective-C class file called "GeorgeController". Be sure to also create the header file. Since we're going to add the menu programatically, we need to create a variable that will be our handle on the menu. That goes in GeorgeController.h:

@interface GeorgeController : NSObject {
    IBOutlet NSMenu* topMenu;
}

@end

Now in GeorgeController.m, add a typical dealloc method, and an almost typical init method:

#import "GeorgeController.h"

@implementation GeorgeController

- (id) init {
    self = [super init];
    if (! self)
        return nil;

    [NSBundle loadNibNamed: @"Menu.nib" owner: self];
    return self;
}

- (void) dealloc {
    [super dealloc];
}

@end

In the init method, we're loading the nib file we just created.

One more thing before we switch back to Interface Builder - let's write the callback that we're going to attach to the "About..." item:

- (IBAction) orderFrontAboutPanel: (id) sender {
    NSImage* icon = [[NSWorkspace sharedWorkspace] iconForFileType: @"bundle"];

    [icon setSize: NSMakeSize(128, 128)];
    NSDictionary* options;
    options = [NSDictionary dictionaryWithObjectsAndKeys:
        @"George", @"ApplicationName",
        icon, @"ApplicationIcon",
        @"0.01", @"Version",
        @"", @"ApplicationVersion",
        @"Copyright (c) 2008 __MyCompanyName__", @"Copyright",
        nil];
    [NSApp orderFrontStandardAboutPanelWithOptions: options];
}

and add the method signature to the .h file:

@interface GeorgeController : NSObject {
    IBOutlet NSMenu* topMenu;
}

- (IBAction) orderFrontAboutPanel: (id) sender;

@end

Make sure to save both files so IB can see your changes.

One thing to note here is that our plugin can access the NSApp instance of our target application - here we call on NSApp to create an About popup window. A little further down we'll use NSApp to get at the application's menubar. Your plugin will probably call methods of NSApplication to initiate most of its interactions with the target app.

5a) Now go back to Interface Builder. If you're using IB3, click on "File's Owner", then open the Inspector and go to the Identity pane. Under "Class Identity" select GeorgeController. If GeorgeController is not listed, you may need to go to File->Read Class Files... and navigate to GeorgeController.h in your project, then try again.

Now that IB knows that GeorgeController is the File's Owner, you should be able to choose Connections from the Inspector and see topMenu under Outlets and orderFrontAboutPanel: under Received Actions. Drag from topMenu to the titlebar of your IB menu under development, and then drag from orderFrontAboutPanel: to the About... menu item.



Here's a gotcha: if your header file contains syntax errors, IB won't be able to parse it but also won't tell you that it can't. Like a naughty puppy, it will just quietly not do what you want it to do. If IB seems to be defying you, try compiling your project and see if you have any syntax errors.

5b) If you have Interface Builder 2, click on "File's Owner" and then choose Custom Class from the Inspector. If GeorgeController is not listed as an option, you need to actually drag GeorgeController.h from XCode's main window to IB's main window. Set GeorgeController as the custom class for File's Owner. Now choose Connections from the Inspector, then Ctrl-drag from File's Owner to the titlebar of your IB menu under development, then click Connect in the Inspector.

Next Ctrl-drag from the About... menu item to the File's Owner object. If the Inspector says "No actions in GeorgeController", click on the Classes tab in the IB main window, then select "Read GeorgeController.h" from the Classes menu in the menubar, then try the Ctrl-drag again. When you see orderFrontAboutPanel: in the Inspector, hit Connect. XCode 3 may be looking pretty attractive by now. :)



6) Next we're going to use the awakeFromNib method as our opportunity to attach our menu to the target application's menubar. You don't call awakeFromNib from your code - when a nib is loaded, awakeFromNib is automatically called on the instance of the class associated with File's Owner. So define an awakeFromNib like this:

- (void) awakeFromNib {
    NSMenuItem* item;

    item = [[NSMenuItem alloc] init];
    [item setSubmenu: topMenu];

    [topMenu setTitle: @"George"];

    [[NSApp mainMenu] addItem: item];
    [item release];
}

Note that we finally use the IBOutlet topMenu, this one moment is the whole purpose of his existence. Also, we take advantage of NSApp again to give us the mainMenu of the target application so we can manipulate it.

7) Now we're ready to do the work specific to SIMBL. Our class needs to define a class method - not an instance method! - called load which takes no arguments and returns void. SIMBL always looks for a load method in the NSPrincipalClass (we'll get to that) and that's where we bootstrap our plugin. In our case, there's not much to do.

+ (void) load {
    [[self alloc] init];
}

When inside a class method, "self" does not represent an instance, it represents the class itself. So we alloc and init a new controller instance, our init calls loadNibNamed:, which causes awakeFromNib to be called, which causes our menu to be attached to the menubar, which worries the cat that killed the rat that ate the grain that sat in the house that Jack built.

8) Finally, we edit the Info.plist. Before it calls our load method, SIMBL looks in the Info.plist of our bundle to see (a) which application(s) we want to plug into and (2) which class in our bundle contains the load method that we want SIMBL to call. In this example our bundle has only one class, but in a real project you'll have more.

This next part is straight from the CULater wiki.

If you just doubleclick the Info.plist in XCode, it opens in the XCode editor. If you'd rather, you can rightclick and Open With Finder, which will bring up the Property List Editor. Either way, set the NSPrincipalClass to "GeorgeController", and then create a new array key called SIMBLTargetApplications. Since this is an array, you can create multiple entries and have your plugin be loaded into multiple applications. In our example, we're just going to have one array entry, telling SIMBL that George should be loaded into Apple Mail:

    <key>NSPrincipalClass</key>
    <string>GeorgeController</string>
    <key>SIMBLTargetApplications</key>
    <array>
        <dict>
            <key>BundleIdentifier</key>
            <string>com.apple.mail</string>
            <key>MaxBundleVersion</key>
            <string>*</string>
            <key>MinBundleVersion</key>
            <string>*</string>
        </dict>
    </array>

How to know the BundleIdentifier and BundleVersion? Don't try to guess at it, cause they're not necessarily related to the application's name or displayed version. You need to manually inspect the application's own Info.plist. Go to the application in the Finder, right-click, and choose "Show Packge Contents". Go into the Contents folder and open the Info.plist that you find there. Look for the CFBundleIdentifier (not CFBundleName!) and CFBundleVersion (not CFBundleShortVersionString!) Although, SIMBL will allow you to use wildcards in the versions as you can see in our example.

9) You're ready to build. Hit Build and deal with any errors. If you've followed the example code exactly it shouldn't generate any warnings either. Right-click the George.bundle in the XCode main window, select Reveal in Finder, and drag the bundle to your ~/Library/Application Support/SIMBL/Plugins directory. Start your target application (Apple Mail if you followed the example Info.plist) and you should see a "George" submenu in the menubar. Congratulations! You're ready to build out our example into a plugin that actually does, you know, stuff.

Credits:
Mike Solomon for the Cocoa Reverse Engineering page on the CULater wiki.
I figured out most of what wasn't in the wiki by picking apart the source code to GreaseKit. GreaseKit is Copyright (c) 2007 KATO Kazuyoshi.

Saturday, March 08, 2008

Dear Mac developers: the mobile app market existed before you came along


One of my friends sent me this excellent article examining the state of the mobile app industry. People who want to bitch about the iPhone app model should read some history first. Then at least they can do some informed bitching.

Mobile Applications, RIP

Current podcast list


Sunday, February 17, 2008

As a Baby Gnome He Had So Much Potential


(Originally written April 9, 2004)

Conceptual integrity in turn dictates that the design must proceed from one mind, or from a very small number of agreeing resonant minds.

- Frederick Brooks, The Mythical Man-Month


Date: Thu, 8 Apr 2004 13:47:53 -0500 (EST)
From: Adrian Hosey
To: Thomas R. Hall
Subject: Re: good article

On Thu, 8 Apr 2004, Thomas R. Hall wrote:
: On Thu, 8 Apr 2004, Adrian Hosey wrote:
: >
: > http://mozillazine.org/articles/article4584.html
:
: That is a good article. How do you feel about the role that Mono may play
: in all of this?

I despair of any of it coming together at all. cf. our conversation yesterday about GNOME's failure to produce a scriptable desktop.[1] Granted that hasn't even been a stated goal of GNOME for years, but I hold it up as an example of the amount of energy lost from lack of unified vision and the amount of time spent dorking around with the core components and less time making stuff people can _use._ See also here

http://cinepaint.bigasterisk.com/WhyMigrateFromGTKToFLTK

I think the desktop battle has been lost for at least one more generation. i.e. FOSS guys aren't going to get their shit together in time to defray the market dominance of Longhorn. However I also don't believe that Longhorn will somehow signal the end of the contest the way Brendan Eich thinks it will. The current set of tensions will continue on into another round.

If someone is going to unhorse Microsoft on the desktop I don't think it will be FOSS as we know it. It may be Apple (wishful thinking) it may be Novell/Ximian - in which case Mono would play a big part in the new architecture. It may be someone we haven't met yet. I don't think there's room to bring a whole new closed-source OS to the marketplace right now (witness BeOS) but there's no reason someone can't deliver a quality desktop OS on a Linux kernel, if the project is executed with some focus. Ironically this may put Novell in the best position. They should break with GNOME and just do their own thing the way they think it should be done. Do it open source, do it closed source, but do it with hierarchical leadership and not design by committee.


If you're thinking that Mono will bring home the promise of write once run anywhere between Linux and Microsoft platforms, I don't think that's going to fly. Microsoft will make sure it doesn't. Look at SMB. Look at W2k's broken Kerberos. Look at the history of Java. Look at per-processor licensing. It is not the nature of that corporation under its current leadership to play on an open field.


 [1] This is alluding to an earlier conversation of which I don't have a transcript. But recently I've been learning about Apple Events, Applescript, and the ability of other scripting languages to substitute for Applescript via OSA. When I started using GNOME in 1998 I was drawn to it by a post from Miguel de Icaza that described GNOME's goal to be a scriptable, network-transparent desktop environment. I can't find a record of that post but there is this article. Skip down to the question "What differentiates Gnome from other window managers?" to read Miguel describing the vision he had for GNOME back in 1998.

I was really excited by his vision. He was describing a Linux desktop that would not just equal other desktop systems but leapfrog them in features and power. The closest thing on a Unix desktop might have been NeWS - and NeWS is long gone. It was going to have embeddable components and network transparency via CORBA. It was going to support bindings for multiple scripting languages which would drive the components via their CORBA interfaces. It was going to kick ass.


If you get on Google you can find posts I made to the GNOME mailing lists. You can find a few small patches I submitted, those patches now gone because their code bases have long since been rewritten. I was excited and I wanted to be involved in whatever small way I could. That was six years ago.

I'm bummed that in six years GNOME has not yet become a scriptable network-transparent desktop. What bums me the most is that it never will be. GNOME no longer even aspires to those things. Read contemporary editorials about the future of GNOME and you'll hear about things like HAL and DBUS and transparent windows via OpenGL. Nothing that other desktops aren't already doing. At the best one could say that GNOME aspires to be a best-of-breed hybrid from among the current desktop systems. At the worst one could accuse it of being a knock-off.

What happened? I'm not sure. My first thought was that GNOME needed a benevolent dictator and it never really had one. On the other hand there are many open source projects that run based on a "foundation" that do okay, like Apache. Is there some set of criteria that determines what kind of projects need a benevolent dictator?

Some of the language in that email is probably harsher than is fair, but I wanted to repost it verbatim because it conveys a certain amount of frustration. I'm sure most of the contributing programmers to GNOME have their shit together as people, because finding the time to do free software is hard. However if we speak of the GNOME project as if it were a person, I don't think the GNOME project has its shit together, citing the many fickle changes in direction over the years regarding various components. That's why I think the project could have benefited more from the benevolent dictator model. Or maybe the GNOME project does have its shit together and it just didn't put its shit in the basket where I wanted it to. I do feel confident that the GNOME that exists today is not the GNOME put forward in 1998.

Anyway that's why I suggested above that Novell "should break with GNOME and just do their own thing the way they think it should be done." I don't know if Miguel still has his sights set on the vision he described in 1998. If he does he should just do it and not worry anymore about playing nice with the other programmers.

Update 2006-02-08: I'm not saying anyone heard me in particular, but just check it out.

Saturday, February 16, 2008

In My Defense, The Broiler Pan Was Dirty


1 oven on broil + 1 top rack + 1 quarter-sheet pan + 2 raw steaks = 2 delicious steaks + 1 ruined quarter-sheet pan.

The Digital Devil Made Me Do It


(Originally written December 4, 2003)

The trouble with fighting for human freedom is that one spends most of one's time defending scoundrels. For it is against scoundrels that oppressive laws are first aimed, and oppression must be stopped at the beginning if it is to be stopped at all.

- H. L. Mencken

Most of what you can find on the Net about how to make a bomb is available somewhere in a library and, candidly, if your child is down in the basement making bombs, the Internet is probably not the biggest contributor to that problem.

- Larry Irving, Asst. Secretary, NTIA


Last night I was flipping channels on the TV and I saw the news headline "Video game inspired warehouse robbery?" I didn't bother to unmute the TV or stop changing channels because (a) I already know what they would have said and (2) it just pisses me off. I know that this isn't new - many media and subgenres of media have been blamed for many things over the years. The Beatles were blamed for Charles Manson. AC/DC was blamed for Richard Ramirez, Catcher in the Rye was considered subversive, etc. And in my generation, Quake is blamed for Columbine and Flight Simulator is blamed for the World Trade Center strike.

The thing that kills me about the whole phenomenon is that the news outlets display such a blatant bias about the angle of the stories. Violent criminals are morally adrift to begin with. Anything could inspire them to do anything, but only the magic combination of "video game inspires violent crime" becomes a headline item on the newswires. If the crime is "inspired" by something else, that motivation doesn't make it into the headline. When a group of white men pummel a lone Arab on the street you don't see the headline "War on Terror inspires hate crime." And why don't we ever see the headline "News report on violent crime inspires man to commit violent crime?" I'd love to see the interview with the defendant:

"I knew I wanted to lash out at the world but I wasn't sure how. Then I saw an MSNBC report on arson, and I knew that arson was my ticket to manifest aggression."

I wonder if that quote would make it past the newsroom editor?

Time passes...

Just a couple days later, I found this tidbit on CNN:

Issuing its eighth annual MediaWise Video Game Report Card, the [National Institute on Media and the Family] listed games parents should avoid for their children, led by "Manhunt."

http://www.cnn.com/2003/TECH/fun.games/12/09/warning.videogames.reut/index.html

Taken independently, that sentence is just ridiculous on its face. Then consider that the sentence is part of a "news item" from a major reporter and we're approaching ludicrous speed. Why is it ludicrous? Because, why would a parent buy a game for their child called "Manhunt" and not be concerned about the content? Never mind that the box for Manhunt has an ESRB "M" stamped on it, the NAME ALONE should be the tipoff! Allow me to create a parallel example:

Issuing its eighth annual MediaWise Video Game Report Card, the institute listed games parents should avoid for their children, led by "Orgy."

See what I mean? If I substitute sex for violence does it become more apparent? Do we need "institutes" issuing "report cards" advising parents not to do obviously dumb shit? Is this the world we live in? God help us all.

I have nothing against having watchdog groups monitor the video game industry per se. If one of these groups were to find, for example, that companies are using thirteen-year-old kids in focus groups testing M rated games, that would be great work. Go team. But instead they're wasting their time cranking out self-important obvious crap, and overlooking the notion that if parents don't read the box title and don't read the ESRB label, they're not going to read the institute's report either.

I want to found an institute that issues the annual "Report Card for Physical Safety" advising parents not to "shoot selves in the head" and not to "leap bodily into open flames."

Wednesday, February 13, 2008

Wishlist: more efficient scrolling for the iPhone


I've had an iPod Touch for about a month now, and I love it to death. But as humans tend to do, I'm going to be general in my praise and detailed in my gripes. But wait! because I have a proposed solution to my gripe.

My praise: it's awesome. It's still not my perfect iTablet, but I'm using it for the same reasons - I can access the net, in comfort, without using a keyboard.

My gripe: there is no way to jump to the bottom of a web page in Mobile Safari, or to quickly scroll through a very vertical page. This recently got especially tedious for me while I was skimming some archives of Daring Fireball, because some of his essays are rather long, and the link to the next article is always at the bottom. Flick, flick, flick, flick, flick, flick, to get to the bottom of the page. Link to next page, repeat.

Now when you put your finger on a page and start to drag it, a translucent scrollbar appears in the margin to give you a sense of where you are in the page. But you can't grab that scrollbar and use it for anything. It's more of a "scroll indicator."

So my proposed solution: why not let me grab it? If I put one finger on the page, the scrollbar appears, and then I can "pin it" under another finger (probably a finger of the opposite hand) and as long as I have it pinned, moving my finger to the bottom of the screen takes me to the absolute bottom of the web page, and the top of the screen, vice versa. The rate of the scrolling would be relative to the size of the page, just like a windowed app on a desktop computer. I'll be the first to say this isn't intuitive or even convenient - it's actually a little awkward. But dammit, it would work and it would be there for people who know about it.

My other gripe: there's no "Find in Page" with Mobile Safari. What's up with that? For about the first week I kept going to the magnifying glass when I wanted to find a word on the page. Even though I knew that button brings up Google, my brain kept trying to map my ⌘-F reflex to something. I don't have a solution for that, except - add it!

Friday, February 08, 2008

A Nutshell: The Matrix Reloaded


(Originally written June 10, 2003)

As the lights came up on The Matrix Reloaded, I already knew what I thought of it. I was curious what my wife would think. I didn't have to wait long. "That sucked" she said.

"Really?" I said. "I thought it was pretty damned all right."

"Really?" she asked.

"You didn't like the ending." I asserted.

"No, I didn't."

"He was saying things I think a programmer would understand best."

By now we're in the parking lot. "Explain it to me then."

My wife and I met while doing the same job, computer support at a university. But she doesn't hack for a living at this point in her life and she doesn't want to. Point being, she has enough technical background so I think I can sum this up quickly:

"You're a programmer. You're working on a pretty big, pretty important program. And it works, mostly, 99 times out of a hundred. But you can't nail down that last corner case and it's driving you crazy. So there's this girl, let's say she's your girlfriend-"

"Programmers don't have girlfriends," my wife interrupts.

"Some do. Some even get married. Bear with me. Your girlfriend is also a programmer-"

"Ah. That explains why she would date a programmer."

"Fair enough. Your girlfriend is looking over your shoulder and says 'So what? Just let the 100th case fail.'

"'That's no good,' you say. 'First it's 1 bug in 100, then it's 2 in 200, then 3 in 300, then eventually we'll have a quarter of a million bugs.'

"'Big deal,' she says. If it gets that bad we'll reboot.' You don't like her solution, because you're a perfectionist. But you've got a deadline, you need to get this thing in the can. And you really don't have a better idea anyway. 'Okay fine,' you say. 'If it comes to that we'll have to reboot.'"

"So they destroy Zion, and that's like a reboot?"

"Right. They take 16 women and 7 men and restart the human race, inside the Matrix again."

"But why do they need Neo for that?"

"Well, there was some handwaving about that. They may or may not explain it sufficiently in the last movie. We'll see."

"But then Neo took the other door, so now everyone dies."

"Right. The machines are in trouble because they can't restart the Matrix. The humans are screwed because there's like 12 of them left."

We're in the car pulling out into the street. "So when the Matrix gets messed up they reboot. So... the Matrix is like Windows."

"Exactly."

Tuesday, February 05, 2008

Project Dresden


I know we're not supposed to laugh at our own jokes, but once in a while I find something I forgot I had written, and if it makes me laugh to see it again, I feel like I must have done something right.

Project Dresden

Monday, February 04, 2008

Heroes


(Originally written July 27, 2000)

My son, almost 4 years old, has developed an interest in Batman and Spiderman. He's starting to have heroes. I think that's neat. I started thinking about my childhood heroes - Batman and Spiderman being two of them - and then I started to wonder about people who for some reason maybe didn't have heroes as children. My first thought from there was those teenagers who shot up their schools. Did those kids have heroes?

See, I was exposed to violent media as a child. Lots of violent media, probably way too much violent media. That's why I don't buy the argument that video violence drives these kids. If that were true, I'd be hiding in Canada right now with a 12 body count on my record. So what made me different? Why didn't I snap?

Let's see. I was exposed to video violence, I hated high school, I thought there were plenty of people there who deserved to "be taken down a notch." But I never did it. Never even considered it. I think the difference was, I also had heroes from an early age. Even though my heroes were "action heroes" and sometimes did their own violent acts, there was always a code of conduct driving the heroes, determining when it was time for them to use violent force.

I don't consider myself a hero, but I have always considered myself one of the good guys because I admired my heroes and wanted to emulate them. My heroes gave me a belief that even in dark times, the good guys win in the end. My heroes gave me hope.

The good guys don't inflict themselves on the innocent. Even the not-so-innocent ones that torment the hero. There was a scene that ended up being cut from Star Wars, where Luke's "friends" at Toshi Station were mean as shit to him. He did not blow them away. The good guys only use deadly force when the bad guys use it first. Even the heroes with a "black streak" in them, like Han Solo or Batman, still answer to a code of morality. Han Solo is a particularly good example because his moral code became stronger as the story went on, until at the end he's volunteering to sacrifice himself for something other than a profit motive.

(As an aside, I was really irritated when Star Wars Special Edition changed the film so that Greedo shot first. Even as a kid, I knew Han Solo's life was on the line and he had reason to shoot first.)

So, did those Columbine kids have heroes? I'd like to know, but I would guess they didn't. They obviously felt unhappy and tormented, and without heroes to anchor them to the good guys and give them hope, they did whatever they felt they wanted, or needed. They didn't have the tools to withstand and control the darkness inside us - yeah, all of us - and ultimately it got them.

Make sure your kids have heroes. Make sure you have heroes. Be one of the good guys.

Tuesday, January 29, 2008

Be Seeing You!


When I was in 2nd grade we got our first computer at home, an Apple ][+. One of the first softwares my dad bought to go with it was a game called "The Prisoner", loosely based on the Patrick McGoohan TV show of the same name. This was a very early game, a strange mish-mash of hi-res, lo-res, and text graphics.

One of the more distinctive traits of the game was that whenever someone "talked" to you - talking consisted of capital letters crawling across a window of lo-res block graphics - each letter was accompanied by ringing the computer's "bell" at varying pitches. I think they were going for some effect like the school teacher in Peanuts but the Apple's bell was better at making higher pitched sounds so that's what they used. The effect was like - well, like nothing else I can think of. If you ever had an Apple ][ you probably know what I mean.

Anyway, just like in the TV show, everyone on the Island ended their conversations with a cheery "Be seeing you!" (It was irony, see, because they were all prisoners on the Island - you're not going anywhere far.) Every conversation ended with "Be seeing you" and the pattern of the bells was always the same.

Every once in a while when I'm talking to someone in IM one of us will say "Be seeing you" and oddly enough the pacing of your average touch typist exactly matches the printing speed of that old Prisoner game. As soon as I start to see those letters I always always hear the bells in my head. I'm sure I'll hear them until the day I die.

Weird.

Monday, January 28, 2008

Macbook Thin == iTablet beta


Well, we didn't get an iTablet, we got Macbook Mini. Except it's more like a "Macbook Thin." Which is interesting because making it Thin instead of Mini addresses Bill Manning's complaints about UMPCs, which I thought were spot-on.

I wasn't predicting a tablet, just hoping for one. The Macbook Thin is a great product for the "not me" demographic. There's a lot of neat tech packed into the thing but I don't have a need or a desire for one. I will stand by one thing I said, which is that there's a lot of overlap in the components that go into the Thin and the components that would go into an iTablet. Imagine breaking off the screen half of the Thin, replacing the keyboard with a 13 inch touchscreen, and you'd have a pretty kickass tablet. The internals of the two products would be pretty similar.

Right before Macworld there was a rumor that a tablet is in development, but wasn't going to be ready by January. (This rumor persists, and is gathering strength.) What if the Macbook Thin was actually a "Plan B" product, when it became clear that the tablet wasn't ready, conceived both to make some money, and also get some of this superthin tech out into the field and shake out the bugs?

One thing that is scary about the Thin, relative to my tablet obsession, is the price. If the high-end Thin is $3000, how much might the tablet cost? $4000? $5000? That's too much to pay for a device which is by design an ancillary device to another computer you already own. Maybe that in itself was the reason for delaying the tablet - getting the Thin into production will also allow them to ramp up production of components, streamline the production lines, and bring down costs, so that the eventual tablet will hit a reasonable price point.