Escaped Thoughts

So You Want to Write a Mac NPAPI Plugin

Or, Everything You Wanted to Know About Mac Browser Plugins, and Are About to Wish You Hadn't Asked

I've answered enough questions about this topic, and corrected enough slightly (or grossly) inaccurate information, that I finally decided it would be easier to just write it all out once, and refer people to that. If you are just getting started with writing an NPAPI plugin for the Mac and are trying to figure out what all this drawing model and event model stuff is all about, you've come to the right place.

(If, on the other hand, you are reading this because you are a regular reader here, you probably want to skip this one. The audience for this post is very specific.)

First, a Bit of History

In the beginning, there was QuickDraw and Carbon. Until recently, that was all there was for plugins, because NPAPI predates all the fancy new technologies these kids today take for granted (full disclosure: I am such a kid).

The first problem was QuickDraw, which was officially deprecated in 10.4; Apple needed a migration path for all the existing QuickDraw-based plugins. Making up a new plugin format from scratch would be problematic, since it would be harder for people making cross-platform plugins to support, harder for all the existing plugins to transition to, and only really be viable if all the browser vendors adopted it. Even then, it would be a pain for plugin vendors, since they would have to ship two copies of their plugins for as long as they needed to support browsers that didn't support the new plugin. (Sidenote: Apple did in fact try this in the form of the .webplugin format, but no non-WebKit.framework-based browsers ever supported it, or likely ever will.)

Enter the CoreGraphics drawing model, and runtime drawing model negotiation. The idea is that the plugin can ask the browser at runtime what drawing models it supports and, depending on the answer, tell it which one to use. Any browser that doesn't even understand the question can be assumed to support only QuickDraw. The differences between the old and new models are hidden behind part of a structure that is already a void* that means different things on different platforms, so binary compatibility is preserved. This allowed a single plugin to support old and new browsers, and browsers to roll out support for the new model, all without end users having to worry about any of it.

Next on the hit list was Carbon. With the trail already blazed, this was pretty straightforward in principle: the same negotiation system is used for the plugin to decide whether to use the old Carbon event model, or the new Cocoa event model. In terms of understandability though, things is where things start to get confusing. At this point there were three possible combinations of models (the fourth, QuickDraw+Cocoa, doesn't make sense, so is disallowed), and some of the differences overlap. For example, the NPWindow structure is different in each of the three cases.

But having replaced both the deprecated technologies, that was the end of it, right? Well, no. Because the CoreGraphics model doesn't allow for an end-to-end hardware-accelerated drawing pipeline, which some plugins really want. So now there's another drawing model, Core Animation, to address that. And that model as spec'd has some technical issues for some browser implementations, leading to its closely related cousin the invalidating Core Animation model—although these are so similar that I'll consider them as one model for most of this discussion. Oh, and Core Animation requires the Cocoa event model, adding another wrinkle to the matrix of possibilities.

(Eagle-eyed readers of the NPAPI headers might notice that there appears to be yet another model, called, temptingly, OpenGL. All you need to know about that model is that for all practical purposes it doesn't exist, and never will, so you should just ignore it.)

Aaaand a Bit of Recent History

But then things got really exciting. And by exciting, I of course mean confusing. Because before things could settle down, two new related developments came along: 64-bit apps, and out-of-process plugins. I say related because making a browser 64-bit is problematic in that you can't load 32-bit plugins into a 64-bit browser directly, and all the plugins lying around were 32-bit. Everyone had just gone through the PPC-to-Intel transition, which was painful enough for plugin vendors and required quite a bit of lead time. Rather than do it all again, Apple released 64-bit Safari with the ability to run plugins out of process, allowing it to keep using the 32-bit plugins. There was a catch though: it doesn't support QuickDraw out of process.

At around the same time, Chrome for Mac came out, and it runs all plugins out of process (even though it's still 32-bit) for philosophical reasons. It has minimal support for QuickDraw, but it's kind of a crapshoot whether a QuickDraw+Carbon plugin will work in it, and the performance will be very poor. It's bad enough, in fact, that when negotiating Chrome will claim that it doesn't support QuickDraw, because the support is really only there for a few specific legacy plugins and shouldn't be used by anyone writing new plugins.

And now Firefox 4 for Mac is about to come out, and it too is 64-bit, so needs to support out-of-process plugins. Mozilla went one step further than Apple, in that it doesn't support either QuickDraw or Carbon out of process.

And no matter the browser, if you want your plugin to compile as a 64-bit binary you can't use either QuickDraw or Carbon, since they don't exist in 64-bit.

Enough History; What Can You Use?

The landscape of supported options is confusing at this point:

32-bit Safari (on 10.5+)
Any valid combo (QuickDraw+Carbon, CoreGraphics+Carbon, CoreGraphics+Cocoa, Core Animation+Cocoa)
64-bit Safari
Anything but QuickDraw (CoreGraphics+Carbon, CoreGraphics+Cocoa, Core Animation+Cocoa)
Chrome
Same as 64-bit Safari (CoreGraphics+Carbon, CoreGraphics+Cocoa, Core Animation+Cocoa)
Firefox 3.6 and earlier (and any other pre-Gecko-2 Gecko browsers, such as Camino)
Anything Carbon (QuickDraw+Carbon, CoreGraphics+Carbon)
32-bit Firefox 4
Any valid combo (QuickDraw+Carbon, CoreGraphics+Carbon, CoreGraphics+Cocoa, Core Animation+Cocoa)
64-bit Firefox 4
Anything Cocoa (CoreGraphics+Cocoa, Core Animation+Cocoa)

Before we move on, three important points that many people get confused about:

  1. 10.6 != 64-bit. It's true that browsers can only be 64-bit on 10.6+, but there are plenty of people with 32-bit machines running 10.6.
  2. More importantly, out-of-process != 64-bit (or 10.6+). Chrome runs all plugin out-of-process even on 32-bit, even on 10.5. That means that having a 32-bit binary that only uses QuickDraw+Carbon and a 64-bit binary that uses the newer models is not a good solution. The runtime negotiation exists for a reason—use it!
  3. QuickDraw can't be assumed just because your plugin is 32-bit. You can only assume that QuickDraw is present if the browser either says yes when you ask, or returns an error (meaning it doesn't understand negotiation at all).

Okay, So What Should You Use?

The more you support the more forward and backward compatible you'll be, of course, but it's also more work. Here are some rules of thumb for each pairing.

Core Animation+Cocoa

If you want hardware-accelerated drawing, or you want to do OpenGL without having to manually draw your OpenGL surface into a CoreGraphics context, you should support this. See the note about invalidating Core Animation below.

One caveat is that Safari 4, and Chrome up to at least Chrome 10, do not composite Core Animation plugins correctly. For those of you coming from a Windows or Linux NPAPI background, it's akin to windowed-mode plugins, drawing above all web content regardless of z-index. If that's deal-breaker, you'll need to use CoreGraphics and do a readback from an off-screen OpenGL buffer. Hopefully this will be fixed within a couple more releases of Chrome (it already works in Safari 5).

CoreGraphics+Cocoa

If you don't care about hardware acceleration or OpenGL, you should support this. While you could use Core Animation, the advantage is that if you are in this case you will likely also want to support...

CoreGraphics+Carbon

If you want to support Firefox 3.6 or earlier (so, if you want to support 10.4, and/or PPC), and don't care about hardware-accelerated drawing, you should support this model.

QuickDraw+Carbon

If you need to support browsers that don't support Core Animation, and you really, really need hardware acceleration, then you have to support this. It will be painful though, because the way to get hardware acceleration isn't so much to use QuickDraw, as to do sketchy things with the WindowRef you get from using the Carbon event model, attaching your own OpenGL surface to the window at the right location. You will have to debug this carefully in any browser you do it in, because it's a hack, and thus fragile. If you screw up you'll create nasty bugs like plugins that keep showing even after the user changes tabs. It will also not composite correctly since it bypasses the browser's drawing system, so it will be like a windowed Windows or Linux plugin (except even the iframe hack won't work).

In short, if you are writing a new plugin, please just don't do this. Use CoreGraphics and do a buffer readback for the legacy support. Despite the performance cost, it's almost certainly the better choice.

(If you do feel the need for that kind of hackery though, whatever you do don't negotiate CoreGraphics+Carbon and do it there. It won't actually help, because in browsers that don't support QuickDraw, it won't work anyway. It will just confuse any browser developer debugging issues with your plugin.)

The Bottom Line

If you don't need to support users of Firefox 3.6 or earlier (or Camino), just support whichever of the Cocoa options makes the most sense for you. Not having to implement the Carbon model will save you a lot of work (especially since the Cocoa model is more consistent across browsers, due to its clear spec).

If you need to support Firefox 3.6, support either both flavors of CoreGraphics, or Core Animation and CoreGraphics, depending on your need for things like OpenGL and hardware acceleration.

If you need to support Firefox 3.6, really want accelerated graphics, and are crazy, support Core Animation+Cocoa and QuickDraw+Carbon.

Core Animation's Strange Duality

Why are there two different Core Animation models? In a nutshell, Gecko and Chrome need to know when the plugin's CALayer has changed in order to work right, and WebKit.framework-based browsers (like Safari) don't. There's no way the browser can find out from the layer itself though, so Gecko and Chrome have to assume that it has always changed. That means running the drawing pipeline on a high-frequency timer, which is not so efficient. The solution is for the plugin to tell the browser when it draws instead—that's how the invalidating version of the Core Amination model works, and it's literally the only difference. But that's less efficient in browsers using WebKit.framework, where the calls are unnecessary, so those browsers only implement the original.

The good news is that if you support one, supporting the other should be trivial: just treat them the same except for making one extra call in the invaliating version each time you draw. When negotiating, prefer the invalidating version, since any browser that supports it will be more efficient when using it.

(As of the time of writing, Chrome supports both versions (although the non-invalidating version only on 10.6+), and it looks like Firefox 4 will as well. You shouldn't rely on that, however, as support for the non-invalidating version may be removed from one or both to ensure that plugins aren't accidentally opting into the version that requires the wasteful timer.)

Where to Learn More

Unfortunately, most of the basic NPAPI docs still date back to the QuickDraw and Carbon days (at least, they do as I write this). The best resource for learning about the new models is the set of specifications for the updates.

Category: Geek

Comments (1)

This Is Why We Can't Have Nice Things

Security on the internet is hard. Really hard. Trying to help people understand how to make good security decisions, and avoid bad ones, is a whole field of ongoing research. There are lots of open questions, lots of things that reasonable people disagree on.

But there are also things that everyone agrees on. For example, that when people get emails that tell them to log in to some random web site they've never heard of and enter their username and password, they shouldn't do it, and anything that helps steer people away from doing that is a win for security.

Which is why the email I got today is, for lack of a better word, appalling:

Dear My Verizon User,

We have launched a completely new My Verizon website (http://www.myverizon.com), with improved security, easier access to all our services, and richer features.

[...]

To make this change happen, please sign in to My Verizon with your Verizon Email (verizon.net) user ID.

Seriously, Verizon? Why not just come out and say “Hey Verizon customer! You should go to a site you've never heard of, and give it your verizon.net password! You can trust it, because it has ‘verizon’ in the name, so clearly it's legit. I mean, it's not like hackers could easily get any number of domains (or subdomains) that have the word verizon in them. No way. Besides, this email says it's from Verizon, and everyone knows you can't lie in email!”

This email is so bad that I actually assumed that it couldn't possibly be legit, and was in fact a very polished phishing attempt. It was only when I actually looked up the domain owner, and then visited and saw that it redirects to verizon.com, that I could actual believe the horrible truth. (And consider for a moment: they are ultimately using verzion.com anyway, but still decided to tell people to go to another domain.)

On behalf of internet users everywhere, and especially those of us who have ever tried to help teach people what is and isn't safe online: Shame on you. Whoever is responsible for that email going out to your customers should—and I say this in absolute seriousness—be fired.

Category: Geek

Comments (0)

Now With 25% More HTML!

I just finished applying the tips from the “What Does It All Mean” section of Mark Pilgrim's awesome “Dive Into HTML5” to this blog, so now there's even more depth and structure to my posts. At least for machines. It doesn't have any real upsides for non-metal readers, but it makes me feel better—and let's face it, that's all this is really here for. If it were about you, I'd actually post here from time to time.

Even though it doesn't really matter at the moment, it's nice to be able to turn a bunch of structural ids and classes in the HTML into something standard. As an exercise in playing with the new HTML5 elements it was definitely a success.

I also used the <audio> tag for the first time, making the sample player for Astraios's website use that instead of a plugin in browsers capable of playing back mp3 via <audio> (I didn't feel like dual-encoding to ogg to get Firefox support; at least not yet). It was amazing how easy it was; it definitely is living up to its goal of making audio as easy as images (syntactically, that is—obviously the codec situation and the browser support aren't quite there yet). Even layering it over the existing code so the other browsers still work was trivial. It's definitely an exciting time for the web!

Category: Geek

Comments (0)

A Cautionary Tale of Hosting

When last we left our hero, he was transitioning to a new web host. Shrouded in mystery as this event was, I'm sure many of you have been asking yourself: “But why is he changing hosts? What could it all mean?” Well, I'm glad you presumably asked!

First, the summary. (Spoiler alert!)


For anyone finding this post while researching Jumpline/DigitalSpace to try to decide whether to use them for hosting, here's my condensed Jumpline review (based on several year with two domains hosted on the starter plan): Jumpline sucks (presumed motto: ‘As little support as we think we can get away with, if that’). On three separate occasions Jumpline staff actively caused the majority of my site to stop working, twice through negligence. Not one of the support tickets I filed ended with what I would consider to be a satisfactory resolution, and even when the problems were very, very obviously their fault the responses I got were generally a mixture of lack of interest in the causes, and attempts to shift blame to me. A ticket filed about ongoing email loss took almost a full day to get the first (unhelpful) reply, and more five days to get a second (totally useless) response.

My overall impression is that support's primary role is to close tickets as quickly as possible, with investigating and fixing problems a distant second, and common-sense customer service (e.g., apologizing when they make serious mistakes) not even on the radar.

And as an added bonus, I just discovered that they categorically refuse to provide pro-rated refunds on the remained of annually-paid hosting, even if the reason for closure is their own repeated negligence.

If anyone from Jumpline reads this, spare me a defensive reply that explains how my unvaryingly poor support experience was actually my own fault. If you feel the urge to write one, take that energy and instead apply it to figuring out what you should be doing differently so that people don't have experiences like mine.


And now, the very long rant version.

Since escapedthoughts.com's inception, it had been hosted by DigitalSpace, which was a cheap but developer-friendly (shell access, lots of supported scripting languages, etc.) hosting company recommended by a co-worker, and for quite a while everything was great. Then, one fateful day about two years ago, I received an email with “exciting news”! Yay! DigitalSpace was being acquired by Jumpline. We were all assured that the transition would be smooth and easy, and there was nothing to worry about.

This turned out to be code for “we will break everything”. I woke up one morning, and escapedthoughts pretty much didn't do anything any more. I ssh'd in to look around and see what had changed, and discovered that I didn't have the ability to read or write to my own home directory. Huh. One exchange with support later I could read my home directory (but not write to it—this turned out to be a permanent, intentional “feature” of the transition that was supposed to be so smooth I wouldn't even notice), so I set about trying to assess damage.

Well, it didn't take long to figure out why my site (mostly a motley collection of python, ruby, and perl scripts) didn't work:

    $ irb
    bash: irb: command not found
    $ ruby
    bash: ruby: command not found
    $ which ruby
    bash: which: command not found
    $ find . -name ruby
    bash: find: command not found
    $ perl
    bash: perl: command not found
    $ python
    bash: python: command not found
    $ chmod
    bash: chmod: command not found
    [...]

In migrating my mostly-script-based site to their new and improved machines, they remove all access to all the scripting language interpreters (what could go wrong?), and pretty much everything else for good measure. Support ticket number two, which included the above output, got me access to most things. But not ruby, because apparently the fact that half the transcript of commands was me trying to figure out where the hell ruby had gone wasn't enough of a clue that I'd like ruby access thank you very much. Total number of support tickets before I could even start figuring out all the other ways my site was broken: three.

Yes, my smooth and painless transition was off to a great start. It took me the better part of a weekend to go through and fix all my scripts, which had been further broken by the changes they made to their directory structure.

I'm a big enough man to admit my mistakes, and at this point I made a big one; as a result I share the blame for everything that follows. When I saw what a complete Charlie Foxtrot they made of the transition, I should have gotten out immediately, but instead I gave them the benefit of the doubt. I chose to believe that in less stressful and turbulent times they would surely be more competent.

And things did settle down for a while. It was over half a year before they totally broke my site again—shortly after I decided that they were all right after all, and added a second domain with them. It turned out that one of their admins had moved the script that powers this blog into a “disabled” folder four days earlier (yes yes, insert joke about me neglecting my blog here), and didn't bother to tell me. Naturally the reply to my support ticket (summary: ‘OMG, WTF?’) was profusely apologetic.

Ha ha. No. I was told that my script was using too much CPU, and had to be disabled, followed up with: “Please note that if your account does continue to consume enough CPU that other customers service is impacted, the account could be suspended or deleted without warning”. To be fair to them, I do understand that on shared hosting they have to act quickly if my mistake is messing with other hosted accounts, so not getting advance warning is understandable. Less understandable was the fact that in four days they couldn't manage to email me a heads-up that they crippled my site, and that their reply to my ticket totally ignored the (very explicit) question about why, exactly, that was. When I asked again, this was the helpful reply: “Typically we do notify the user when a script is moved or disabled. Usually before we move it unless it is an emergency.”

No apology, no explanation. Apparently I was supposed to be mollified by the fact that they have a policy of telling people about changes like this, despite the fact that they totally failed to follow it in my case.

I made some changes to the blog software that I expected to reduce CPU use, then set about trying to find out how much I was using, so I could make sure my account wouldn't be deleted without warning—it was clear that whatever their faults, they were good at this “without warning” thing, so I took the threat seriously. Turns out (you guessed it, another support ticket!), you can't find out what your CPU usage is. And they won't say what the limit is. I just had to accept that if a number that I couldn't measure went over a number I didn't know, I would be shut down and all my content deleted. Nice. When I pointed out that this was perhaps not entirely fair, they assured me they would let me know in advance were there any further problems.

Filled with confidence, I made very sure that I was doing regular backups of my site.

A few months later, I asked them to turn on the web stats that their documentation claimed was available but wasn't. Apparently, it required .htaccess settings, and instead of adding them to my existing file, they just destroyed mine and replaced it with theirs. I bet you can guess what effect that had!

This time, I noticed that everything was totally broken the same day, and thanks to my backups it was easy to fix. The response to my support ticket (summary: ‘OMG, WTF? You need to fix your system so it doesn't delete user content.’), in its entirety:

“It is strongly recommended that anytime you make custom changes to .htaccess that you back it up everytime you do so to prevent such issues from occuring. We have never heard of the webstats program overwriting an .htaccess file but we will keep our eye out for similar issues with our customers.”

So instead of an apology, I got 'You should assume that we will delete files without warning. Oh, and I think you just made this up.' Because blaming the customer for your own mistakes is always a winning support strategy. (Note also the misspelling of ‘let you fix our mistakes after you notice that we've broken your site’ as “prevent such issues from occuring”.) By now it's really obvious that I should change hosts, but finding a host that does what I wanted and wasn't way more expensive was not so easy, and reviews for the ones I found were mixed. Gambling with going through the pain of switching when I might be as worse off afterward didn't appeal to me, so I gritted my teeth and decided to give them one more try.

Fast forward a year (a whole year without incident—unprecedented!) to the end of last month, when I hear that email sent to a couple of forwarders on the other domain just weren't showing up any more. I try this out with my addresses there (webmaster@ as a full email account, and admin@ as a forwarder to webmaster@), and sure enough, in two tests an hour apart, the messages to the forwarder just vanished while the ones to the full account work fine. This was perfect, because they couldn't just hand-wave it away as being a problem with whatever mail system the forwarder was sending to; it was all within their own severs. I wrote up a detailed ticket, explaining that a) this was a general problem affecting multiple forwarders, and b) I had a very simple, reproducible test case using the admin@ address. It took a full day for them to answer, even though it was clearly a serious issue (although l was working under the assumption that they would continue to be made of fail, and converted the other forwarders to full accounts while I waited so that no more important mail would be lost). Again, their entire reply:

“The admin redirect should be working for you now. I am not sure what got modified on it, but I ended up deleting it, and recreating it to get it to work. I was then able to send 6 test messages in a row to your account, and all were forwarded.”

I wish I were making this up, I really do. Their solution to a general problem was to destroy the test case without investigation, and close the ticket. When I reopened it to ask what they had done to fix the underlying problem, it took them only five short days to write back to say, basically ‘Nothing; we don't know what happened. Do they work now?’

A series of exchanges ensued, with me getting increasingly irate. Highlights from their replies include:

  • “We cannot duplicate your problem. Do you have any specific details about your problem?” (‘Even though you handed us a test on a silver platter and we destroyed it, it's your fault we can't investigate this.’)
  • “We are not getting any other complaints from other customer's [sic] and the server logs do not show any issues with email” (‘We don't know what happened, so we're going to assume you are making this up.’)

And then, my personal favorite, when I asked them in the clearest terms I possibly could how they expected me to use the forwarders again when they couldn't explain a spontaneous, nearly domain-wide failure.

  • “I feel very confident it will not happen again because we have several thousand clients and this issue was not reported by anyone else.” (‘The same conditions that didn't prevent a failure before will definitely prevent one in the future.’)

It seems that the mission of Jumpline support is to explain how all failures are figments of my imagination and/or my fault. Their ongoing lack of interest in understanding why their processes or systems failed so that they can actually fix them just boggles my mind. I can't tell if they truly believe that they are infallible, and thus the best way to keep customers happy is to convince them of the happy truth that Jumpline never made a mistake in the first place, or if they just don't have any interest in customer service.

Category: Geek

Comments (3)

Pardon Our Dust

I'm in the process of moving escapedthoughts to a new host (on account of the old host sucking so badly; more on this later), so some things are going to be broken for a bit. On the bright side, comments are almost certainly one of those things, so you probably won't be able to complain about it!

Category: Geek

Comments (0)

100% Chance of Precipitation

As I started storing more and more of my data in the cloud, I really missed the ability to find and launch those documents using Google Desktop the way I would local files; it's hard to beat being only a handful of keystrokes from any document, and I didn't want to have to trade that for the convenience of accessing my documents anywhere and sharing them easily.

That's where Precipitate—my first contribution to the Google Mac Developer Playground—comes in. Precipitate is a little app for OS X that automatically creates proxy files for things stored in Google services (Docs and Bookmarks so far) that are indexed by Spotlight and will jump right to the document in your browser when they are opened, so that cloud data is as easy to find and launch as local files. In short: “Tastes great—and just look at that shine!”

Category: Geek

Comments (0)

Back On The Air

After three rounds with support, about half of the things I have on escapedthoughts are working again. So far, the “seamless” transfers and upgrades that were supposed to result from my hosting provider's buy-out have been anything but. Either they really screwed up my transition or when they said that everything would continue to work just as it had before, they only meant things that used no scripting languages and didn't refer to any paths. Whee.

On the bright side, support has been very quick to respond, so that's something. Hopefully once things settle down a bit I'll be no worse off.

Category: Geek

Comments (0)

Sorry For Not Caring

I've now had my first and second experiences with the obnoxious auto-reply verification system that some people are apparently using to try to prevent spam. For those not familiar with the system, the idea is that only people you have placed on a pre-approved list can actually email you directly, while everyone else gets an automated reply email telling the sender to jump through some hoops to prove they aren't spam. When (if) they do so, then their email shows up in your inbox. In other words, it's a “guilty until proven innocent” approach to email.

The text of the two auto-generated emails is fairly similar. Both start out with “Sorry for the inconvenience”, and a plea for understanding that they just don't want to deal with spam any more. That's nice, but guess what? I get spam too, just like everyone else. Yes, it sucks, but you don't see me making my spam someone else's problem.

Both emails I had challenged where replies to someone who had emailed a list address looking for help. I was willing to spend some time trying to help them, but not if it means having to go to some website and fill out a form to prove that I'm not a spammer. So here's a tip: if you want people to actually reply to emails you send, don't use challenge-response email systems. If you go out of your way to make it hard for me to talk to you, I'm just not going to.

Category: Geek

Comments (0)

Admitting Partial Defeat

Trackbacks on posts more than a month old will now go to a bucket where I have to approve them, rather than being posted directly (not that I imagine anyone will run into that limitation, given the rarity of trackbacks to my posts).

In related news, I hate spammers.

Category: Geek

Comments (0)

Is It Leopard Yet?

Having to do a bunch of work that seems like it should have been made available in the Cocoa APIs is always annoying, but I've been learning how intensely painful it is when you are trying to implement functionality that turns out to be messy to do correctly yourself when you went to a developer conference a few months earlier and learned that it would all be a single method call in a version of the OS that you unfortunately can't design for yet.

I guess it will help me appreciate the API I do have. And build character or something. I guess someday I'll be able to say “Why, back when I was a developer we didn't have all these new-fangled APIs. We had to code all that ourselves, and we liked it!” and it'll all be worthwhile.

Category: Geek

Comments (0)

The Arms Race Continues

Over the last couple of weeks, my comment-spam filter has been breaking down. Considering how basic a test it was, I'm pretty surprised it held up as long as it did; it relied on the fact that the strategy of the bots was very dumb: grab the page, parse it, and submit. It happened so quickly that it was pretty easy to distinguish from a valid comment, since rarely do real people submit a comment within a handful of seconds of loading the page. Now, as I've been expecting for some time, the bot pattern has changed to: grab a bunch of pages to parse, wait a minute or so, then post to all of them. They are even smart enough to make sure that although they are rotating through proxies to prevent IP-filtering, they always match up the proxy that requested the page and the proxy used to post the comment, so there's no obvious attack point there.

So now I've implemented another silly trick that shouldn't really work in general, but will in fact catch all of the spam that's been slipping in recently. Hopefully that will hold until I decide what my next big gun will be.

Category: Geek

Comments (2)

Problem Exists Between Chair And Keyboard

I just spend 10 or 15 minutes trying to figure out why I couldn't get a mini ethernet network set up between my laptop and my iMac (to transfer some large files without waiting forever to do it over the wireless network I use for most things). No matter what I did, I just couldn't get the machines to see each other—in fact, I couldn't even get the iMac to show the ethernet port as anything but inactive. I even unplugged and replugged the network cable, to make sure it wasn't something stupid like a loose wire.

If only it had been something that stupid, instead of something much, much stupider. You see, I'm very used to my G4, with the tower on the floor next to my desk, and the monitor on my desk. And because I haven't yet decommissioned the G4, the tower is still sitting next to my desk. Right next to where I set the laptop down. And the iMac really does look like it's just a monitor. I think we can all see where this is going...

Lesson learned: plugging in the ethernet cable is good, but it's even better to plug it into the right computer.

Category: Geek

Comments (0)

SNAFU

I finally sat down and put the time into debugging and researching that I needed to do to get the blog up and running again. I'm still not sure what all was changed on the server end that fouled everything up; I'm guessing some sort of directory structure change in addition to the change in the user that services requests (www-data? What's up with that?)—the second wasn't the problem that actually brought the whole blog down, but even if it had been the only thing it still would have screwed up the commenting system.

Anyway, despite not knowing what happened a combination of good luck and my growing familiarity with Perl meant I didn't have to go crawling to an admin whose job doesn't even begin to cover keeping my blog running (but would probably have helped anyway) to get help. Just one of the many benefits of higher education.

After all, I do have a masters degree... in Science!

Category: Geek

Comments (0)

Spam Update

Number of attempted Joe-job spams since yesterday: 68. Number that actually ended up on the site: 0.

It's really nice using a simple perl weblog, so that I can hack around problems quickly and in a way that the spam scripters aren't as likely to have encountered elsewhere.

Category: Geek

Comments (0)

A Lovely Welcome

So when I finally sit down to post again after long neglect, I find some net vandal has just left me spam on not fewer than 35 of my old posts. At first, I was confused, because the spam pointed not to cheap drugs, porn, or gambling, but to a couple of what appeared to be random personal weblogs. That seemed pretty odd, so I followed one and found a bunch of comments saying, basically, “Why are you spamming my weblog's comments?”. I tried another, and hit pay dirt: a likely theory as to what the heck was going on. Apparently one of the anti-blogspam methods is to maintain a big blacklist of sites that pay to be listed in comment spam, and subscribers automatically ban anything related to that site. So the slime molds of the spam industry took their giant list of weblogs, and started randomly spamming them with links to other weblogs on their list, in the hope of totally mucking up the blacklist by filling it with legitimate, innocent sites. That's really, really dirty. I really wish that we could track down these spammers on by one, find something in each of their lives that gives them happiness, and do everything possible to ruin it for them out of spite. Just so they'd know how it felt.

Anyway, cleaning up spam is a tedious process with my weblog setup, so after the 30 minutes or so it took to erase the damage I am completely fed up (and it really didn't help that I got another one while composing this post). There's no obvious way to block these posts by content, so I'm doing something I really didn't want to do: making commenters jump through hoops. I'm trying to start small—a check-box indicating that you are not, in fact, spamming. If the spamming programs (or people, if it's actually an army of soulless peons) are smart enough to check the box, I guess I'll have to do something even more annoying. I absolutely refuse to use the standard captchas, since they are an accessibility nightmare, so I'm hoping I won't have to consider what I would use instead.

In conclusion, I'm back, and I really, really hate spammers.

Category: Geek

Comments (2)

Same Great Pointer Control; Half The Calories

The mouse I had rescued from my problem pile to use at work died again recently, and this time taking it apart and reassembling it didn't help. Since I can't live without a scroll wheel, it was time for a little visit to the company store. Last time I bought a mouse, I toyed with the idea of getting a trackball, since I have almost no mouse space on my desk at home. I have no trackball experience though, and they look strange enough that I was afraid it would be too awkward and I'd have to buy yet another mouse right away. This time, since I seem to be burning through mice fairly quickly, I decided the risk was worth taking and got a trackball instead of a mouse.

Considering how different the control method is, I was surprised at how easy it is to use. I was able to handle it reasonably well straight out of the box, although fine control was difficult. After a couple of days it's starting to feel more natural (although my thumb is confused by having to do so much work), and I suspect it will be just as good as a mouse before long.

Besides being better-suited to the space I have at home, I get the added advantage of having a different pointing device at work and at home—I figure that regardless of which is “better” for routine use, doing something different at work and at home is even better, especially given how much computer time I log between the two. Now I just need some sort of bizarre alternative keyboard construction, and I should be all set.

Category: Geek

Comments (0)

Is It That Hard To Delete?

Pet peeve of the day: seeing people copy my old EECS 338 home page and/or recitation notes including the “Valid XHTML 1.1” badge at the bottom, but then break the validity when they make whatever changes they need to make. If you don't know what the badge means or aren't going to make valid changes, then delete it! The fact that the people doing this are TAs in the Computer Science department makes me sad.

Also, as a general rule, when copying forward text that says it was updated “last year”, and said text is two years old, there's a little bit of editing that needs to be done. I mean, come on.

On the other hand it certainly is gratifying to see that the notes I spent two years creating and tuning appear to have become the de facto syllabus for the recitations.

Category: Geek

Comments (0)

Yeah, Because That's Going To Help

It's getting to the point that I wouldn't be at all surprised to see an exchange like this in the support section of one of the big Mac forum sites:

Posted by mac_n00b
so I opened up my hard drive and smeared the insides with butter to make it run faster but when I put it back in smoke came out of my computer and now it doesn't boot... help please!!!!

Posted by EliteMacGuru
Try booting from CD and running “Repair Permissions” on the volume

Given a week and a handful of fake accounts on some big Mac forums, I wonder what other bizarre witch-doctor fixes could be made to take root.

Category: Geek

Comments (2)

My Tiger Tip

One of my favorite new Tiger features is small, and tucked away somewhat, so it's not widely known:

  1. Open up Mail, Safari, TextEdit, or just about anything Cocoa (sadly, no Camino though)
  2. Hold down Command-Control-D (well actually you don't have to keep holding the D, oddly enough)
  3. Mouse over some words
  4. Make “ooh” and “aah” noises

You can get the same effect on just one word with the selection context menu item “Look Up in Dictionary”—by default that will open the new Dictionary application, but there's a preference in Dictionary that makes it use the panel instead. I'd have used the much cooler panel as the default myself, but having the preference is enough for me.

Update: Buzz has posted a picture of the dictionary panel, which should be handy for those of my readers too misguided to be able to try this out for themselves.

Category: Geek

Comments (11)

The Cat's Out Of The Bag

Tiger will be available soon! I think it can be best said in the words of one of everyone's favorite internet memes:

It's the best! Beats the rest!

  • Cellular
  • Modular
  • Interactive-odular

And as if that weren't enough: it's 100% PABA free!

Category: Geek

Comments (0)

Why Is “Prosumer” A Word?

This was originally going to be a post linking to pictures I took of the new baby ducks in our apartment complex, but unfortunately those pictures will never see the light of day (or even the pale glow of the internet). For whatever reason, my SmartMedia card failed or was destroyed when I tried to get the pictures off, leaving me not only without duck pictures but in need of a new high-capacity SmartMedia card (as the 8 and 16 MB cards aren't quite as useful as the 64 MB that's now defunct). But the geek in me said, “Why buy new media for $20 when you could buy a new camera for $500 instead?”

Okay, so it's actually been building up for a while—I'm not that far gone. My Olympus D-460 has been a fine camera (and I'm not just saying that because Laura is reading), but as I've grown slightly in my photography I find myself hitting the limits of the D-460. Most glaringly, 1.3 Megapixels just isn't enough, as I learned when I tried to enlarge some of my favorite Hawaii pictures. But I'm also at the point where I'd like to play around with more manual controls sometimes, and I'd like more zoom as well.

Armed with that knowledge I struck out into the web, where I quickly learned that I am (or at least have aspirations of being) a “prosumer”—or a serious amateur in non-marketing-speak. The really tough part is deciding what form factor I want though. Everything I've read suggests that I really need a camera with either a fixed-zoom or interchangeable lens to get the full serious-amateur range. But that means a bulkier camera, and I've been spoiled by the easy-to-sling-around D-460.

In the end, I think I'm going to go with a high-end retractable-zoom-lens camera. Will it limit me? Probably. But ultimately I think I'm always going to want to have a small camera that I can use for point-and-shoot (but can at the same time rise to the challenge of an unexpected opportunity for a better shot), so even if I decide to really get serious down the road a camera like that will always have its niche for me. Besides, I'm not sure I'm quite ready to shell out the cash for a digital SLR (interchangeable lens) camera, and I suspect that a fixed-zoom camera would ultimately be unsatisfying if I grow, and unsatisfying at the more point-and-shoot end either way.

The current contenders, from my reading, are:

The first two are smaller and lighter, which appeals to me, but it remains to be seen whether I actually care when I'm holding them in my hands. All have at least 4x optical zoom, which is better than the D-460, all are 7 MP, which will work just fine for all my uses, and all are somewhere around $500 dollars. I'm leaning toward the Olympus, partially because I was so pleased with the D-460 and partially for the extra zoom (although I'd take a slight hit on landscapes with the 38mm min (max?) at the other end), but I'll have to play with it to see if the reported auto-focus difficulties will hurt its point-and-shoot ability in normal use.

Next stop: the camera store, to see what I can see. Advice and personal experiences welcome.

Category: Geek

Comments (1)

Mmmm, FUD

I am getting really tired of reading press releases from iPod competitor wanna-bes saying that their product is better because the iPod can “only” play music from the iTMS, whereas their product can play music from “all the other major online music stores.” First off, they should be sued for saying it, because it's completely untrue. There is another new-fangled source of music that they may have heard of called “CDs”, which iPods have no problem with, so this vendor lock-in they try to make people afraid of is completely made up. But lets look at just online music stores now, and take a moment to count all the major online music stores other than the iTMS:

*chirp* *chirp* *chirp*

And we're done! Hey, here's a tip for all the iPod wanna-bes out there: users don't care about your FUD. I doubt anyone has ever returned an iPod because they couldn't get music onto it easily enough. Instead, if you want some market share, try, you know, making a better product. Think different.

I've got to run. I need to get a better VCR, because this lame model I have only plays VHS, and none of the other major video-cassette formats.

Category: Geek

Comments (0)

Arrogant Programming

I was doing some Perl hacking today (in strict mode, of course) and stopped when I realized I had typed the following:

my $failures = 0;

“For both our sakes, I would that word were true.”

Category: Geek

Comments (1)

Gadget Dilemma

Working inside the reality-distortion field every day has intensified my innate need to buy gadgets that I probably don't need—luckily, Laura acts as a force of sanity, causing me to ration my purchases. The problem is, this leaves me with the task of picking which gadget to get first. Here's my current wish list:

  • 512 MB RAM – there's nothing quite like RAM to make an old computer feel zippy and new again. The 512 I have now is nice, but I'm often near or past the upper end because of all the stuff I keep open all the time (as the 1 GB of virtual memory files that live full time on my drive can attest to).
  • Keystation 49e – I've always sort of wished I'd stuck with piano, and now Garage Band is making getting back into it even more tempting. Sure it's not a real piano, but it's much smaller, cheaper, and easier to move, so it's actually feasible. This is perhaps the most dangerous of the items on my list, since it could be a starter drug for larger, more expensive keyboards (like the 61es).
  • iSight – What would I use it for? Who would I talk to? I have no clue. Do I want one anyways? Heck yeah. The RDF at its finest. In my defense, I do have some plans to play around with stop-motion and time-lapse recording, which should be fun.
  • iTalk – It's less important now that I'm not on the move as much as I was in college, but still potentially useful for filling the iPod's input void.
  • AirPort Express – Right now my G4 is our wireless basestation, which means I can't put it to sleep and, more importantly, it has to live on the wall with our cable modem. As a bonus for the AirPort, that's the wall with our stereo stuff (for the moment at least). So although not vital, it would give us more freedom, which could become even more important whenever we move, depending on what the new layout is like.

I've pretty much narrowed my first choice down to the RAM (boring, but safe) and the keyboard (cool, but risky). On one hand, I'll never say to myself, “Boy, I sure wish I hadn't bought that RAM. I never use it!” On the other hand, I won't be saying “This RAM is so much fun! I could just play with it for hours and hours!” Do I want the subtle, pervasive improvement to my whole computer experience, or the Christmas-morning excitement and the possibility of a new creative outlet?

So here I am, balanced between childishness and fuddy-duddydom, stability and excitement. If you think about it, isn't that really a metaphor for the struggle we all face daily in our lives to define who we are?

No, I didn't think so either.

Category: Geek

Comments (0)

Whoops

Note to self: test blog after making changes (even minor ones) to blosxom plugin code. Although I guess giving everyone coming here an error does reduce blogspam, so it was effective at some level...

Category: Geek

Comments (2)

This Will Change The World

Microsoft has come up with a fantastic new concept: a place where you can legally download music, for only 99 cents per song! If only someone else had thought of it earlier, and beaten them to the punch.

Seriously though... I know Apple didn't come up with the idea but it's pretty hard to pretend that they didn't make it very successful very quickly, and even harder to pretend you're launching a competitor, but have never heard of the iTunes music store. But apparently not impossible:

Yusuf Mehdi, corporate vice president for MSN said, “Our goal with the MSN Music service is to finally bring digital music to the masses by offering what we believe is the largest and highest quality catalog of legal music on the Internet, available on the broadest selection of portable devices.”

First off: which masses are they “bringing it to”? The millions of people in the world who are both trendy enough to want digital music, and yet who have been living under a rock and haven't heard of iTunes and/or the iPod? Do this guy really think there are people sitting on their couches watching iPod commercials and thinking, “I'd love to have digital music, if only I could find somewhere that sells it”?

Second: does he think that because Microsoft's PR group has been living under a rock? If they believe that the library of 500,000 songs mentioned in the article is the largest catalog of legal music online, they might want to, you know, check some recent numbers from their only serious competitor.

It's nice that they want to compete and all, but perhaps they should focus a little more on not sounding like they are either criminally ignorant or lying while they do it.

Category: Geek

Comments (0)

GIMP The Way It Should Be

I've been using fink's GIMP 2.0 installation for a while, but my old drag-and-drop script was still set up for 1.2. I could have just fixed it by changing the symlinks that point GIMP commands to a specific version so that they refer to 2.0 instead of 1.2 (which I ultimately also did), but I've been bugged for a while by the old script's requirement of launching GIMP in advance, and having to fix another part of the process finally motivated me to do something about it. Poking around a little I found this hint, which improves on the script I'd been using (the one mention at the beginning of the new hint).

The new script has some issues, mentioned in the comments, but unfortunately the fixed version that is alluded to is MIA. The bright side it that it gave me an excuse to play with AppleScript a bit, and now I have a script that uses X11 and handles multiple files correctly in almost all cases. I still need to fix it so it doesn't launch multiple instances of the GIMP if it tries to open several files and finds that the GIMP isn't already running, but that should be easy enough to fix. And if not, it's still worlds better than the old script. Here's to progress! AppleScript is very cool, but I never quite get around to learning more than a tiny bit of it... but I guess that's what Automator is all about: automation without learning/remembering AppleScript.

If any of the other 20 people running GIMP on OS X using fink instead of Gimp.app need good drag-and-drop support, drop me a line :)

[Update: It now handles all drag-and-drop cases correctly, and also launches the GIMP if you run it without dropping a file, so it's now an app for all purposes that matter to me!]

Category: Geek

Comments (0)

Any Day Now

So not a lot of activity on the category/layout front recently. Or on the weblog front in general, really—I keep almostposting, but I never quite seem to get around to it. The hot weather is inspiring me to spend some quality weblog time today though, so changes should be coming really soon. A few things to watch for:

  • Categories displayed with each post (for RSS feeds as well).
  • Date-stamped comments. The timeless nature of comments has bothered me for a while, but I just hadn't gotten around to hacking it into the writeback plugin.
  • Photo galleries.

Also, keep your eyes peeled for an exciting new addition to the blogging arena!

Category: Geek

Comments (0)

Dividing The Waters From The Waters

I finally finished moving everything into categories, rough though they are. Perhaps the coolest part for me is the count of each section (raise your hand if you are surprised that "Geek" is the biggest category). So now I can have nth post anniversaries and the like.

I still need to figure out how I want to display the category in the posts, and probably how to hack Blosxom to show the prettified version instead of the raw directory name. But first I may come up with a whole new layout/style, since the more I look at this one the less I like it, which would also be an overkill solution to my dilemma of where to put the category name in each past without it looking stupid. A geek's job is never done.

But the organization is there, and user-visible even if somewhat crudely, so I'm happy for the moment.

Category: Geek

Comments (1)

Inside The Gates

Life at Fruit Co. is notoriously shrouded in mystery, but after my first day I can tell you the following about what it's like inside:

  • Most of it is underground
  • The work is done by unpaid midget slave labor that is never allowed to leave
  • The chocolate is mixed by waterfall, the whipped cream is whipped with real whips, and the poached eggs are stolen from the king's forest in the dead of night.

So that's what it's like there. Or maybe that's what it's like at Wonka's Chocolate Factory—I get mixed up sometimes.

Category: Geek

Comments (0)

Joys Of Clueless Speculation

There's little I love more than a speculative opinion piece pretending to be a statement of obvious facts. Apparently I'm only heading out west for the lucrative stock options, and I'll have deflated morale and dissatisfaction in no time.

Of course, during my visits I got the distinct impression that people were excited about, you know, the software they were writing. But hey, what do I (and all the current and former Apple employees telling him he's wrong in his comments) know? He's looked at a stock graph, which has given him insight that's not available to anyone else. Never mind the fact that he apparently didn't do enough research to discover even Hyatt's widely famed weblog about upcoming Safari features—this is clearly a man who knows his stuff.

Category: Geek

Comments (0)

Curse You, W3C

Ok, as the badges on the right suggest, I'm something of a standards nut. I like web standards, and I generally take pride in coding to them.

However, the standards sometimes frustrate me to no end. You would think that something as simple as a reverse-order list would be relatively straightforward. And in older HTML, it more or less is; you simply use the value attribute to override the numbering. However, that attribute is deprecated in XHTML, so I went hunting for an alternative using CSS, and found: nothing. Ok, not nothing, but only a CSS3 method that's widely unsupported. Yippee.

That left me with three options for my last post:

  1. Give up the reverse-ordered list—not really an option
  2. Not actually use a list, but instead make the numbers part of the content and carefully align everything by hand—not only a pain, but also ugly from a semantic standpoint since being a reverse-order list is structural, not just presentational (not that value overrides are exactly structural, but it's a start)
  3. Use value anyway, and throw validation out the window—not my first choice from a moral standpoint
  4. Use value anyway, and convert my whole weblog to Transitional so that I can technically get away with doing so—this option irks me, because in every other respect I strive constantly to conform to the Strict standard, and throwing that all away for one measly post seems overly harsh

I went with option 3. That's right, I've thrown validation to the wind, and am now living a lie by continuing to display the badge. If the W3C wants better, they should have given us a new standard that was complete before taking away functionality we had in the old standard (and this is hardly the first time they have done so). I blame society for my faults.

Thank you for bearing with this brief interruption. Now back to your regularly scheduled, valid XHTML 1.1 weblog.

Category: Geek

Comments (0)

Category Dilemma

I'm firmly resolved to use categories more widely now, but I have an important issue giving me pause: Should I load my old posts into categories retroactively, thus breaking links (primarily this would be Google, since I'm not cool enough yet for actual people to link to me), or should I leave them where they are, and make a mess of the miscellaneous top-level category? Beloved readers, I turn to you for advice.

Category: Geek

Comments (3)

Sweet Syndication Goodness

Simmoril's prodding, along with my having reached the point where I'm reading enough stuff that using an RSS aggregator is starting to look like a pretty good idea, has finally inspired me to mess with my RSS feed. Because Blosxom rocks, it's incredibly easy to get RSS going. All I had to do was mirror my strange templating changes into my story.rss file so that I won't be missing my starting and ending HTML tags, and bam: fully functioning (I hope) feed. To celebrate, I've added the little orange icon we've all come to know and love to my badge collection.

Happy feeding!

Category: Geek

Comments (0)

Though This Be Madness, Is There Yet Method In 't?

So I definitely want to set up at least a few categories (one for Camino, and at least two or three others so that the Camino category won't get lonely), but the trick is finding appropriate categories. I don't want to go crazy, and have 30 categories with a post or two in each. At the other end of the spectrum is just one category ("Huge Geek") that encompasses all my posts, but that's a bit too broad.

There's a reason things mostly stay scattered around my desk in a chaotic jumble, and this is it.

Category: Geek

Comments (0)

With Great Power Comes Great Responsibility

So now that I have this iPod, I'm confronted with the challenge of organizing 1,000 or so songs in such a way that I can easily listen to whatever I want. I've never really given it much thought, since I didn't listen to much music on my computer, but suddenly I find my tiny set of playlists inadequate. It's funny how even with all these tags, it's still tricky to come up with a good organizational system. Maybe it's because my musical tastes are strange, and vary quite a bit with my mood and the alignments of the planets. How do I make playlists when I don't know what I want to listen to?

Basically, I need a musical TiVo that will learn what I like and make playlists on the fly.

Category: Geek

Comments (2)

3,700 Songs In My Pocket

Today Laura bought me 15GB iPod as a master's graduation present. It is, without a doubt, insanely great.

I was originally thinking of a Palm instead, but after my last Palm fiasco I did some research. It turns out that in the last two years they have apparently chosen not to address their issues of horrible quality control and horrible customer service/support. So basically, getting a Palm at this juncture looks about the same as betting several hundred dollars on a coin toss, which wasn't really what I was looking for.

Thus, the iPod. Most of what I want out of a PDA is the ability to check phone numbers and my calendar when I'm not at my computer, and the iPod gives me that, but from a company known for its quality and service in a good way. Plus, it's an MP3 player (which will be great in general and invaluable for our upcoming cross-country road trip), a 15GB firewire hard drive (in case I want to back up almost everything on my computer easily), and potentially a voice recorder (which is both really cool and solves a lot of the 'lack of input' issues). It also has the advantage of a clear, beautiful screen and a sexy case. On top of which it's tiny; I just can't get over the fact that it's this small, and it's not even the mini! Heck, even the box is awesome.

Oh, and did I mention the software integration? No? That must be because it was so easy, unobtrusive, and fast that it synchronized all my music, contacts and calendar practically without me noticing.

In conclusion, it's basically the coolest thing ever. Go buy one, right now.

Seriously.

Category: Geek

Comments (0)

The Browser Formerly Know As

There's a shiny new version of Mozilla's stand-alone browser, formerly known as Phoenix, then Firebird, but now called Firefox. They promise they won't change it any more. I didn't like it at first, partially just because a new name for something is never quite as good as the old one (*cough*Case*cough*), and partly because it didn't make sense. What the heck is a firefox? But now I know that "fire-fox" is a translation of the Chinese name for the red panda, and after seeing a few pictures, I am an instant convert. Instead of "The browser, reloaded" (which I'll grant is clever in a pop-culture sort of way), their tag line should be "as powerful as its namesake is cute." And they could have a web button with a picture instead of their logo. I bet their adoption rate would soar.

Speaking of web buttons, I'm torn. I'm a big fan of CSS, XHTML, and accessibility buttons, which are about raising awareness of standards and showing that you care—I proudly slap standards buttons on my sites. But a browser button smacks of the dark ages of "best viewed with" buttons. On the other hand, good CSS designs often are best viewed with a compliant browser. But back to the first hand, I myself use several different, non-Firefox, highly compliant browsers (Camino and Safari), so I don't think it's right to presume to tell people that they should use Firefox if they are in a similar situation. But returning yet again to the second hand, the vast majority of people using the web don't have a clue that IE isn't "the internet", so getting the word out is important.

Of course, the bottom line is that buttons aren't likely to make a noticeable difference anyway: the people who put buttons on their sites are likely to have predominantly readers who already know about other options, and the people most likely to click on (or even notice) the buttons even more so. The real battle will be fought on a person-by-person level, telling family and friends and, in many cases, doing the install and bookmark import for them.

Note to self: convert people to Firefox (using pictures if necessary) instead of Firebird, and hope there aren't any more name changes that might confuse converts.

Category: Geek

Comments (0)

The Coolness That Is CSS

I've been getting back up to speed on CSS and web design, and I've found some incredibly cool stuff since my list bout of interest—some because it's new, some because it was way above my level when I was first learning CSS. Among the coolest developments are CSS-based drop-downs (example); CSS image map replacements, complete with very cool roll-over effects (example); and "sliding doors" and sliding doors part II for making sweet expandable tabs (example)—especially cool since I'd just finished patting myself on the back for coming up with CSS tabs that looked just like their example ugly tabs. A List Apart is definitely the best resource I've found for CSS-oriented coolness.

The other incredibly cool CSS effect I've come across is faux image compositing with CSS—don't bother to visit unless you are using a standards-compliant (or "not-IE" as they call it in the trade) browser, as it will just look weird. Of course, the better solution is to simply use semi-transparent PNG backgrounds (this also doesn't work in IE (well, Win-IE) without ugly hackery, but that's no loss over the multi-image method), but it gets points for cleverness.

And then, of course, there is the CSS Zen Garden, which demonstrates the awesome power of CSS. My personal favorite is this design, but once again IE users need not apply.

Note to self: convert more people to Firebird.

Category: Geek

Comments (0)

Back in the Saddle

Lets talk for a minute about Apple's iLife programs, and whiny babies. Up until last week's keynote, iTunes, iPhoto, and iMovie were free, and only iDVD required buying the iLife suite (unless it came with your computer, in which case they were all free). Now it appears that the only way to get new versions is to buy iLife, or buy a new Mac—although iTunes will, almost assuredly, remain free, since it creates revenue by pushing the iTunes music store.

That, if you have the emotional maturity of a 5-year-old, is terribly, terribly unfair, not to mention devious and underhanded. Of course, this being the internet, most of the vocal people do have the emotional maturity of small children. Some people are very up-front that they are simply spoiled brats who feel they have some right to free upgrades (and boldly proclaim that they will feel perfectly justified pirating the new iLife suite), but most try to dress it up in rational-esque arguments or comparisons. If you are one of those people, I offer you this simple guide to why you are wrong:

It's always been free before, so it should continue to be free.

You're an idiot (translation to your language: u R a 1d10t). Go home.

It's a bait-and-switch! It's just like what happened with the .Mac fiasco!

No, no it's not. First, and most importantly, you still have all the iApps, and they will all continue to work indefinitely. If you have trouble with that concept, try reading the sentence a few more times. They are not a service that will vanish, and you will not have to change your email address if you don't pay for the new version. You will continue to have good, free products; just not the absolute best.

Well, it's still devious, hooking people in like that.

Not really... it's not uncommon for people to give away beta software, then charge for it when the final version is ready. The only difference is that often the beta is set to expire, so you can't keep using it. So Apple is being much more generous than most software companies.

Oh yeah, what about backward compatibility?

Huh? Compatibility with what exactly? Future digital cameras that don't use jpeg? Not too likely. Future versions of Quicktime that don't play current mpeg files? Not a chance. New DVD players that can't read current DVDs? They would fail on the market if released in the foreseeable future.

Ok smarty-pants, but what about the next OS X release?

Well, first off, I think it's safe to say that 10.4 (or whatever) will run 10.3 applications. Second, it's not unlikely that it would come with the new iApps anyways. Third... you're willing to shell out $130 for an OS upgrade every year, but are too cheap to pay $50 for a really under-priced software suite?

I still think it's too much.

How nice for you. Use something else, and pipe down.

Shouldn't they sell iPhoto as a stand-alone?

Ok, yes, I think they should. I would imagine that there's a sizable market for iPhoto in the $15-20 range, of people who don't have any need for iMovie, iDVD, or Garage Band. Hopefully they'll agree, and sell it that way. Does that make iLife any less of an awesome deal? Nope.

Are you just an Apple apologist?

No. Among other things, I think that the .Mac switch was devious, underhanded, a bait-and-switch, and leaned way out over the border of false advertising. Whoever was responsible for that mess should be smacked with a ruler, repeatedly.

Category: Geek

Comments (0)