Finished Fable 2

November 2nd, 2008

Fable 2 was a short game. I enjoyed it, but sometimes in spite of itself.

The menu system sucked, the spell system sucked, and the controls for moving around sucked.

It took me until I was about 80% done before I figured out how spells work. And once I did figure it out, they still didn't really make sense. You can assign a different spell to 5 levels of force. There's no mana - instead you hold down the B button at any time, and the longer you hold it down, the more force you have. When you let go, the spell at that force level is cast. This is good for something like a shock bolt, where the target is off a bit and you have time to wait for force to build up, but for area effect spells, where targets need to be close to you, you might as well not even bother. Most of the times I used an area effect spell I ended up taking damage, when if I'd just fought my way through I wouldn't have taken a scratch.

There's almost no visual character customization. There are 3 or 4 sets of clothing you can wear and that's it. But there are things that happen to you that change how you look. Eat some food, and you get fatter. You can fight your way through a forest full of baddies, surely working up a pretty good sweat, and you don't lose weight, but eat some pie and *poof* you're fatter. You also gain permanent scars when you get knocked out, and your skin gains bluish veins when you use magic. So by the end of the game, my cute girl was a huge, scarred blue-veined freak, with no apparent way back. Yuck.

One unique twist is you can turn on being able to see other players in your game. They show up as flaoting orbs in your world and while you can't interact with them in any way, you can hear them talk and they can hear you. It's an interesting way of comparing notes with other players on a tough fight.

There is definitely some cool in Fable 2. Your dog is very well done, the story is good, combat is fun, the economy is interesting, there's local co-op play (something I wish more games had), and it looks nice. In retrospect it probably would have been better as a rental.

Spammers hit Ottawa Events

November 2nd, 2008

My Ottawa Events website has become a target for spammers. I cleared out all the comments yesterday because of the amount of spam that had crept in, and now this morning there are another 927 pieces of spam. Bummer.

I've been running this site for years now, and this is the first time it's become a serious spam target.

I'm going to disable comments while I figure out what to do.

Developer Conference Videos

November 1st, 2008

Apple has made the videos from their latest WWDC available for purchase on iTunes, the way Microsoft did for the PDC videos.

Except that Microsoft doesn't charge you $999 to watch them.

Crappy move, Apple.

The iPhone SDK, from a Windows developer’s perspective

October 29th, 2008

I'm a PC. And now I'm trying to write software for the iPhone. Nothing serious, mind you, just some little toy apps. I did some Carbon development a few years back, but these days Cocoa is hot, Carbon is not. So I'm trying to grok Cocoa. Here are a few fun facts I've learned along the way.

1. iPhone Developers Need to Know Objective-C

Objective-C is basically C with some OO glue. It's about halfway between C and C++, but uses its own unique syntax for some of the OO things that C++ does. Here's a snippet:
// C++ code
foo.bar(42);

// Equivalent Objective-C code
[foo bar:42];

Objective-C is a dynamic language, and supports COM style AddRef/Release management of objects (although the actual methods are called retain and release).

2. Method names include parameter names.

This is related to #1, but combined with the verboseness of Apple's API names, this makes for some interesting method names. For example:

// Objective-C method
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
// method body
}

// Roughly equivalent C++ method
id MyClass::initWithNibName(NSString *nibNameOrNil, NSBundle *nibBundleOrNil) {
// method body
}

The documentation for this method would refer to it as:

initWithNibName:bundle:

3. Interface Builder builds objects

Windows developers typically use Visual Studio to create resources, like dialogs or menus, and then in code, instantiate the dialog and hook things up. MFC, Microsoft's Foundation Classes C++ class library, supports some macro-based hookup of buttons to handlers, but the resource format is just the resources.

When creating resources for the iPhone, developers use Interface Builder to create xib files, which are the iPhone version of nib files, the standard Mac resource format.

The xib file isn't just a description of some resources; it's a serialization of a graph of objects. When your app causes the xib file to be read, those objects are instantiated and available to use. And Interface Builder lets you define connections between objects, like what happens when you click a button, or what value in what model is used as the data source for what control. This lets you do a lot of the wiring up of the UI right in Interface Builder, and it's got some great UI metaphors for this wiring up.

4. AppKit, the iPhone UI toolkit, is very focused

Windows Mobile gives you basically a somewhat stripped down version of the desktop API; AppKit is much more focused on delivering only the capabilities that the iPhone supports. The best example of this is that there's no way to handle a keyboard event - because no iPhone has a keyboard. You can add a text input field, which, when it receives focus, automatically scrolls up a keyboard, but that's it.

5. Navigation is part of the toolkit

200810292301

That's a Navigation Bar. It's got a title, can have a button on the left and a button on the right. The view below it can have controls that take you to child views. It's a fundamental part of building an iPhone application, and if you've used an iPhone you know what I'm talking about.

The other navigation control is a tab bar, which goes at the bottom of the main window.

One or both of these navigation paradigms are used by almost every iPhone application, and they're supported in Interface Builder. Once you figure out how it works, you can use Interface Builder to build not only individual views, but the whole application including how you navigate from place to place.

6. The Simulator is great

The iPhone simulator launches quickly, communicates well with Xcode, and also with the debugger. I don't think I'd go so far as to say Xcode is better than Visual Studio, but I think the combination of Xcode and the iPhone Simulator is better than the equivalent combination for Windows Mobile.

---

I've only been playing with the SDK for a few days, and just wanted to post a few initial thoughts. Any other Windows developers digging into the iPhone?

A Few Fall Photos

October 28th, 2008

A few recent photos:

Setting up the change huts for skaters on the Rideau Canal:

First snowfall:

Snow in the back yard:

More snow in the back yard:

EC2 and Windows

October 27th, 2008

EC2 is Amazon's "computing in the cloud" infrastructure. Curious, I found this Getting Started page that documents how to bring up a machine in the cloud. It's a bit like rocket science.

Today Microsoft announced Windows Azure, their own cloud computing infrastructure.

I expect Microsoft will nail the tooling part and make it dead simple for anyone to bring up a machine instance in the cloud. I've applied; I'll post when I get to play with it.

I’m Not Watching a Movie Right Now

October 25th, 2008

I would be watching a movie right now (rented from the iTunes store), but:

200810252119
"The iTunes Store is unable to process Gift Certificates at this time".

I have credit in my iTunes account from a gift certificate, and it's not able to use it for some reason. And there's no option to not use it and use my credit card instead.

Momentus 7200.4

October 23rd, 2008

Seagate has announced a 7200rpm 500gb 2.5" notebook hard drive. Assuming they didn't break the form factor (as some other 500gb notebook drives have done, using 3 platters but making a drive that's slightly taller than the form factor allows), this will be a nice update for the 160gb drive in my MacBook Pro.

There are 5400rpm drives, like the Western Digital Scorpio Blue, but the Seagate spins faster, and has a bigger cache. No doubt it will cost more, too.

I don't much like the new MacBook Pro's, but the hard drive upgradeability they offer is nice. The computer I have requires some delicate surgery to upgrade the drive.

(And in case you missed it in that first link - they also have a 1.5 terabyte 3.5" drive. Wow!)

Upgrading Rails broke my site

October 22nd, 2008

My web host, Dreamhost, recently upgraded Rails to 2.1.1. This broke my Recipes site.

It's fixed now, but unfortunately it was down for a few days since I didn't notice right away.

The way I got it working again was surprisingly easy:

I created a new Rails application from scratch ("rails recipes"), I copied my app directory, config/database.yml, config/routes.rb, and public directory over, and that was about it. The app just worked.

I should go make some Cookies to celebrate.

Palin on SNL

October 19th, 2008

US Vice Presidential candidate Sarah Palin was on SNL last night, and it was the strangest guest appearance by a politican I've seen. And I've been watching SNL a long time.

SNL is a tough gig because it's Live TV and some of it is improv. John McCain was on SNL a few years ago, and he was funny. He did a good job. After seeing Obama do comedy at some big fundraising dinner a few days ago, I'm not looking forward to seeing him on SNL, but at least he tried.

Sarah didn't try. Her first appearance, during the opening skit, was mostly her reacting to what Lorne and Alex were doing, and her second appearance, during Weekend Update, didn't even try to hide the fact that she wasn't going to try to act. She basically said she decided not to do the skit she was going to do and let Amy did it instead.

It was a disappointing appearance, because we really didn't get to see Sarah Palin at all.

(Here's John McCain on SNL, and here's Sarah Palin on SNL last night).