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:
- 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.
- 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!
- 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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
One of my favorite new Tiger features is small, and tucked away somewhat, so
it's not widely known:
- Open up Mail, Safari, TextEdit, or just about anything Cocoa (sadly, no
Camino though)
- Hold down Command-Control-D (well actually you don't have to keep holding
the D, oddly enough)
- Mouse over some words
- 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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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:
- Give up the reverse-ordered list—not really an option
- 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)
- Use value anyway, and throw validation out the window—not
my first choice from a moral standpoint
- 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)
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)
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)
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)
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)
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)
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)
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)
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)