Monday, January 30

Call for beta testers... [closed]

We'd like to increase the pool of people who are in our private beta program for Delicious Library (version 1.6 and then version 2.0). If you like messing around with unreleased, buggy software for no money, here's your big chance!

Actually, it should be pretty fun; on 1.6 we urgently need people to test our Intel port and our new software focus for machines with internal iSight cameras. Then it's straight to 2.0, and all the really cool stuff in it.

It's worth pointing out that beta testing is a great way to start a career in software. It looks good on a resume, and it gets you noticed by engineers in your field -- if you submit a bunch of bugs to a company, it shows you have a keen eye and understand software, and they are going to remember your name later. Seriously, we've always known our top beta-testers by name, and they get much respect; someone might say, "Oh, O'Donnel reported a cosmetic bug in the main panel," and the engineers would be all, "O'Donnel? Dang, I better hop on that!"

I was a very active beta tester for NeXT and Lighthouse Design back when I first started my career, and ended up consulting with both of them as I started Omni. And, in turn, lots of the guys I've hired over the years first came to our attention as beta testers.

So, if all this entices you, for a limited time you can head over to our super-secret signup page, and start your new life!

--

UPDATE: Wow! Thank you all for your enthusiasm! We were positively buried in responses, and have all the testers we need for now. We will be periodically adding people as the current pool grows bored or moves on or what-have-you, so don't despair if you didn't make it in this round. Software always needs testers!

Labels:

Monday, January 23

The (OS) X Prize.

Here's a tiny link to the kind of activism I support: a prize for the first person to figure out how to boot XP on a new Intel Mac.

If you've got brains OR bucks, you can help out. Larry Page (one of the funders of the real X-Prize) told me last year he felt this kind of prize incentive was an effective way to fund basic research in America, since our government has essentially abdicated its role in, you know, the quest for knowledge. (I was all, like, "Hey, LP, why don't you give your billions to researchers, huh?" And he was all, like, "The real trick is to spur citizen activism, because the power of all of us working together is so much greater than just a puny couple billion dollars." And I was all, like, "Hey, I'll take a billion," and he was all, "Ok, sure, I've got my wallet right here... PSYCHE!" Ok, that last part is not true.)

Anyways, let's prove him right. Let's get out there and win one for LP!

Labels:

Thursday, January 19

Pimp My Code, Part 7: Pimplette?

Here's a little code-McNugget. Recently someone wrote:
Delicious Library is a great program and I admire the ways you've customized a lot of the controls. It's always the little things that obsess me, specifically the way NSTextField in the details view in EDIT mode loses focus/committs the edit when the user mouses down anywhere it's bounding box. I've managed to produce a similar effect by adding this mouseDown method to the NSBox my NSTextField is held in.

How did you solve it? Here's my code for reference:
-mouseDown:, Original Code
- (void)mouseDown:(NSEvent *)theEvent {

[self acceptsFirstResponder];
[[self window] makeFirstResponder:self]; // I can make myself accept firstResponder
but I have to get the parent window to make it so.
// Not sure why this works but it made sense when I typed it.
[super mouseDown:theEvent];
}
Ok, so, restated, the question is, what code did I add to the view that contains my NSTextFields so that, when I click just outside the NSTextField (and in the custom view around them) the NSTextFields stop any editing they may be doing?

Now, I don't get off on being mean, but sometimes I feel like Lisa Simpson as Sacagawea in Margical History Tour, speaking to the new American settlers who are eating berries, rubbing leaves on themselves, and trying to tie their belts: "These berries are poisonous, these leaves are poisonous, and your belt is a snake... which is also poisonous."

To be fair, this person did write me about this method asking for help, but, seriously, whenever I see a comment that says, "Not sure why this works..." I die a little inside. It happens a lot, which explains why I can't move most of the left side of my body any more (and why I'm still single).

ANYways, there's nothing in the original code that can be saved. First off, don't call [self acceptsFirstResponder]. It doesn't have any side-effects, and it just returns 'YES' or 'NO'. So, essentially this method as written is:

-mouseDown:, Original Code, translated
- (void)mouseDown:(NSEvent *)theEvent {

1;
[[self window] makeFirstResponder:self]; // I can make myself accept firstResponder
but I have to get the parent window to make it so.
// Not sure why this works but it made sense when I typed it.
[super mouseDown:theEvent];
}

Also, don't call [super mouseDown:], because it's documented in NSResponder thusly: NSResponder’s implementation simply passes this message to the next responder. You don't actually WANT this message to be passed on, because you've already acted on it. In this case, it'll do nothing, but you're wasting time and lines of code for no reason.

So, that leaves us with only one line, the middle one, which is a snake, and poisonous. Ok, it's not a snake. But it's not really correct. What you want to do if you want to de-focus an actively editing NSTextView is tell the NSWindow to set the first responder to nil, not self. In this case, you're just a simple NSView subclass, so it may not really hurt anything for you to be responding to events as they come out, but it's confusing and less efficient and it sure doesn't help. And, it could screw up the focus ring and tab-to-next field editing to set yourself as the first responder.

The other problem with the middle line is that you don't actually check to make sure the first responder IS something you want to de-focus before you steal the focus, which isn't too friendly of you. I mean, if the first responder is just a popup (keyboard navigation is on), it's kind of mean to steal it when it wasn't hurting anyone.

So, here we have the pimped-out method, straight from Delicious Library. Yup, I'm giving away my production code, folks! Get it while it's hot! This crap won awards, you know!

-mouseDown:, Pimped
// NSResponder subclass

- (void)mouseDown:(NSEvent *)theEvent;
{
NSWindow *window = [self window];
if ([[window firstResponder] isKindOfClass:[NSText class]])
[window makeFirstResponder:nil];
}

Labels:

Sunday, January 15

Thinking, boxes, & what kittens can do to them.

Recently a fifteen-year-old developer wrote me:
Quite often I find myself outside lighting left over sulfer-powder mixes from the fireworks last 4th of July and thinking of product ideas. However I just can't think of a single unique idea that would actually turn out to be a hit. Everyone just tells me to think "outside of the box." Honestly, that never works for me.

Do you have any suggestions on how I might increase my developer creativity?

Delicious Library is what mostly sparked my mind, this is probably the most unique and yet still useful application released for Mac OS X.
Aw, I'm blushing. No, wait, I'm hungover. I get those two confused.

First off, left me discourage you from playing with homemade fireworks. My earlier advice notwithstanding, as a programmer you'll need your fingers and sight.

Second, my inclination is to tell you to think INSIDE the box. Because, honestly, when I think back to ideas that have changed the world, they aren't really that crazy. They're pretty normal when you think about it. It just took someone to put the pieces together and DO A GOOD JOB OF IT.

Let's take the canonical example, the iPod. Now, portable music players have existed for a long time. So that part was obvious. Digital music was completely taking off, led by iTunes. That part was obvious. Portable hard drives were very common. Obvious again.

So someone at Audible says: Gee, people like music to go, they have music on their computers, and we now have tiny hard drives that are portable... hmm, I could come up with a new device here. And Audible makes the first MP3 player. And the world yawns, because it's not that amazing and because it doesn't have a great user experience for downloading all the music you've stolen from the net. And Audible marketed it for audible book downloads (surprise!), which is frankly not nearly as exciting to our nearly illiterate, constantly gum-snapping country.

Then someone at Apple says, "Hey, we can deliver the whole experience, and make a device that's really beautiful, because we've got iTunes and we've got good engineers and we've got Jonathan Ives who is good at making things look sexy and is bizarrely muscular himself and was recently knighted but we don't have to call him sir."

So Apple makes the iPod, and everyone says, "Wow, they totally invented the MP3 market," which they totally didn't. They just did a good job of it. Hell, to this day Creative still sells some P.O.S. MP3 player called the Bedouin or some shit and nobody even acknowledges their existence. Creative is like that ugly guy who shows up to the party with bizarre, wispy, patchy facial hair and parks himself by the food table and everyone pretends not to notice him so they don't have to actually talk to him. (Note to ugly guy: sorry, man. Try shaving and eating right.)

THAT is the key. (No, not shaving.) The key is taking an idea that the world obviously wants and doing a GOOD job of it. This is how I've made my living.

I've only had like seven truly original ideas in my life. Three of them are in OmniGraffle 3 (see if you can find 'em!) and a couple more are in OmniWeb. (iSight barcode scanning is one, as well.)

All the others are just refinements of other people's ideas. I stand on the shoulders of giants, which weighs them down a ton, and frankly they probably resent it, but it works great for me.

Delicious Library was not an original idea. It was a new approach to an idea that's been around for as long as computers. Hell, longer. I think the first cavemen carved on rocks when they lent out their, uh, sticks to other cavemen. Which wasn't efficient, but still worked better than Microsoft Windows. There are many other shareware programs that do approximately the same thing as ours, in theory, they just kind of bite. We took the idea of a media cataloging app and we made the friendliest, most fun version of it we could. But the basic idea was NOT ours. We don't ever claim it was.

So, think inside the box. Look at what people are using right now. Can you do a better job? Is there any chance people will switch to yours, or is there a market leader that's so entrenched you're going to get killed? Or can you write a simple version of what is now a program only for professionals? Can you do the converse? Can you adapt an idea from one market to another, like making a word processor for screenwriters? (Don't really do this, it's been done.)

I mean, sure, don't write a generic word processor, even if you think you are a super-genius. Word is a de-facto standard, and you don't want to mess with that. And don't re-write Excel. But, for example, when the Excel product manager got up on stage at MacWorld several years ago and said, "We've found that 85% of our customers use Excel just to make lists and outlines," we (Omni) said, "Shoot, that'll be our next product. We can do a GOOD job of making lists and outlines, and sell it for a lot less." And OmniOutliner was a pretty decent success.

Use all kinds of software yourself. Play with Final Cut Pro even though you don't make movies, because there are metaphors in there you need to know. Talk to people about what they do with software. Watch everyone around you and what they are doing, and not doing, on their computers. If there's a solution out there to some problem, but it's so complicated that most people don't use it, then there effectively IS no solution; it's a wide-open market. In my experience, programs don't get simpler in subsequent versions. You can kill your competition if you come out of the gate with something simple and friendly and cheap, even if they have a head-start with a crappier program.

Labels: ,

Tuesday, January 10

Picking on People with MS is Not Cool.

Someone shared a very snarky link to me about Windows Vista (motto: "Now we've put even more... uh... stuff out the window"). I about peed myself.

Normally even I think a lot of the Microsoft bashing I see seems kind of petty; it's like beating the living crap out of a 10-year-old for bragging that he's tougher than you (or racing a Civic with a fat pipe). But, honestly, these videos were really well done. Let us add them to our collective record.

My favorite part of the whole thing is actually something the Microsoft guy did to himself -- he has this gem of a quote: "There are several ways to do [thing]; the two that I like are..." [Emphasis is mine.] Notice he doesn't say "...the two that I like best are..." Nope, he actually dislikes the other methods.

This really sums up Microsoft's problem in a gorgeous nutshell, doesn't it? There are several ways to do EVERYTHING, and usually one will kind of not work and another will be kind of a kludge and if you try a lot you might find one you kind of like, but lord god Microsoft couldn't just pick the good way and go with it, they HAD to include them all, like Pokémon in reverse.

Take shutting off your Windows machine. Would you like to restart, shut down, sleep, or hibernate? "Hibernate"? What the hell is that, and how does it differ from sleep? They don't say. On my (off-the-shelf, year-old) machine, "hibernate" is like sleep except my X800 video card fan keeps whirring the entire time. So, you know, it's like a noisy sleep, with snoring. In fact, hibernate is off by default, although you can enable it in a preference, but they don't explain why you would or wouldn't do this. Which I think is hilarious, because essentially they are saying, "Look, we know this feature is broken, but we spent a lot of time on it and we want credit, so we've turned it off by default so most people don't get tripped up on it, but we still included a way to activate it so we can claim we have it."

"Sleep," on the other hand, often comes back with my network not working any more. (I noticed this a lot back when I was playing Half-life, which is on the Steam network.) So, that leaves us with "restart" and "shut down" as the two methods I like from the plethora of options. And I only wasted a couple hours of my life figuring out the problems with the other methods! I triumph, sort of!

So enjoy your Vista, Windows users! There's probably a ton in there to like... somewhere.

Labels:

Friday, January 6

Come say "Hi" to us at MacWorld Expo!

The Delicious Crüe is going to be at MacWorld Expo in SF this week (#710), so if anyone is in the area please come say hi to us. We even have free expo passes we can give out; write to our support dude here at Delicious.

Also, we're looking for the hip parties during MacWorld week, so if you've got something happening and you'd like some Delicious people there, drop me a line. We'll even bring our Delicious booth babes! (Four of them! Some of whom have, surprisingly, actually asked about going to MacWorld parties!)

--

As a side note, if you're not totally sick of me (and at this point even *I* have grown tired of the sound of my own voice ), then my interview with CocoaRadio is finally available for public consumption.

There are some bits that I like in there (Java's VM, how to recognize a good product idea), mixed in with the usual blather I do. Honestly, I don't think I did a great job on this interview, or even a good one. If you fast-forward to about fifty minutes in and just listen to the last bit I think you'd be better off than listening to the whole thing.

Labels: