Confessions For Exist

Name:Ryu the Red Dragon

Wednesday, July 27, 2005

The little things

The journey of a thousand miles begins with a single step (regardless of whether that journey's ultimate destination is heaven or hell). I know the non-parenthetical part of that saying is supposed to mean that you have to start somewhere, but I'm using it here to illustrate another cliché — it's the little things.

Consider my Windoze laptop. I was really excited to get it, but now I hate it, to the point that, if it belonged to me and not the school I would smash the fuck out of it for the sheer satisfaction of it, economics be damned.

Why? The little things, like how I can't get it to connect to the internet via my wireless network. Oh, I know, all my Winfriends always tell me, "did you try renewing your DHCP lease while inhaling through your left nostril and exhaling through your right nostril, balancing on one foot, thinking the word "chicken" and sticking your finger in your butt?" No, I haven't, and ew.

You know I connect my Powerbook to the network? I turn it on. I know Windows has major problems, but it's the little things that drive me nuts. Similarly, I know the Mac operating system isn't perfect, nor are the hardware platforms on which it runs, but Apple gets so many of the little things right, where Windows gets them wrong, and let me tell you, I am the kind of guy who sweats the little things.

What I'm not is the kind of guy who honks at people all the time. Consider this list of annoying driving behaviors I don't honk at people for:

  • Failure to signal
  • Cutting me off
  • Changing multiple lanes

Also, have you ever seen that phenomenon where traffic is moving very slowly, but the carpool lane is more or less empty, yet some clown in the carpool lane insists on driving slowly, like it makes them nervous to be driving so much faster than everyone else, which is the very purpose of BEING in the carpool lane?

Similar is when you have two lanes of traffic, one frozen, one moving freely, and someone in the free lane wants to be in the frozen lane, so they stop, jamming the free lane, and just sit there, trying to get into the frozen lane.

As an aside, this is a sub-behavior of the greater problem of people who make a mistake when driving, like, say, being in the left lane when they want to turn right. I have seen people turn right across three lanes of traffic, drive backwards up a freeway onramp, and, my favorite, just sit there, frozen in indecision, unable to make the maneuver they want, but unwilling to finish the maneuver they began.

I never do this, and I'm not just whistling Dixie. Yesterday, for example, I meant to be in the left lane, but instead was in the right lane, which merged onto the 520 bridge, which took me across a lake several miles out of my way, but once I realized I was getting on the freeway by mistake, I just let it happen. I would rather drive to Mercer Island and turn around than be "that guy."

Anyway, the five behaviors I've listed here are all annoying, but they're all relatively little things. However, this morning, someone did all five to me, simultaneously. That is, a guy cut across multiple lanes of traffic, not a signal to be seen, cutting me off, causing me to slam on my brakes to keep from rear-ending him, then proceeded to drive 40 down the completely unfettered carpool lane until eventually coming to a complete stop when he couldn't get back over.

Yeah, I honked at that guy, just like I honked at the woman yesterday who didn't go when the light turned green because she was digging around in the her purse while talking on her cell phone. Of course, when she started driving, she was still bent over sideways looking around in her purse while talking on her cell phone. Good thing she was driving a giant SUV. I'd hate to think she was endangering her own life.

Yes, the little things add up, and sometimes they form trends. Consider my car, which I hate. There are a lot of little things about my car, like the fact it's a Kia, lacks "get up and go," has surprisingly poor gas mileage, and didn't come with air conditioning. Still, I can't blame it for those things. I knew, or should have known, all those things when I bought it.

No, I hate the car because it's an unreliable piece of crap, a rather noticeable trend made up of little things. For example, the driver's side vanity mirror shattered. I didn't do anything to it, just one day it was shattered. Maybe it came like that from the factory and I never noticed it. Maybe it's the tension from the mounting. Who knows, but it's one little thing.

The trunk release doesn't work, and every time I got it fixed, it would break again within 24 hours. I finally just gave up on it, just as I've given up on the high-mounted brake light, which is dissolving, I guess from the sun. Also, the trunk assembly in general is full of little plastic pieces that keep falling off or breaking in half.

The car has random electrical problems. The driver's speaker doesn't work. The headlights once stopped working. The fan has stopped working on more than one occasion, and I actually had to get the master wiring harness replaced, which is a can of worms I don't even want to get into right now.

Suffice it to say, I spent a lot of time sitting in the lobby of my local dealership, and unlike your friendly neighborhood Lexus dealer, Kia dealers are not very friendly, give a level of service surprisingly poor for the cost, and leave you coated with a layer of slime simple showering doesn't remove.

When I bought the car, I did so because I was driving this unreliable Accord with electrical problems and wanted something I could trust. I wasn't looking for cool or fast or comfortable or (believe it or not) cheap. Oh sure, it was all I could afford, but let's be real — a new Kia and a used Mark 1 Lexus aren't too far apart in price.

But, I wasn't thinking of cars as anything more than the means to satisfy my need to get to point B from point A, and I thought having a new car under warranty would spare me from being in that situation where I have a car, I pay for a car, yet I'm riding the bus to work. With all the repairs I've needed, that ten year warranty has been worth the car's weight in shit.

For one thing, a warranty means your repairs are free. It doesn't mean the car won't be in the shop for a week while your ass is riding the bus. It doesn't cover a rental car or a loaner and, here's the real key, it doesn't make the dealer give a rat's ass about your transportation needs. Oh, and it doesn't mean your repairs are free. What?

So the fan on the Kia broke at least twice before the total electrical failure and subsequent "don't want to talk about it" clusterfuck that led to me falling out with my dealer. When the fan went out again I assumed it was the same electrical problem rearing its ugly head and took it in to a (different) dealer, who subsequently charged me several hundred dollars to fix it.

You see, the cable that connects the fan to the controls had simply fallen off, and had to be put back, necessitating the removal of the dashboard, which takes several hours, and results in a rather large labor cost. This service is not a repair, but an adjustment, according to the definition of the word subscribed to by the dealer, and as listed in the Oxford English Dictionary of the Criminally Insane.

Cars require a lot of adjustments and it's held that these are not covered under warranty, because they are to be expected. For example, the fluids need to be checked, the tires need to be dealt with, and the wiper blades need to be changed. Another great example of an adjustment is the brake service you need from time to time, and the wheel alignment I had to get after the car chewed through its idiotically hard-to-find stock tires.

One thing you'll notice about adjustments is that they do not involve anything falling off, nor do they involve safety features (such as an already piss-poor defrost fan) suddenly failing, nor do they involve removing the dashboard. Now repairs, the kind covered under warranty, can involve those things, but adjustments, no.

But here's the punch line — the fan has stopped working again. That's right, the fan has failed for one reason or another, at least once a year, every year I've owned the car. Looks like I better prepare my wallet for getting adjusted again. I tell you one thing, and mark my words, as soon as I can afford it, I'm getting a Lexus.

Cars — all cars — are noisy, dirty, expensive pains in the ass that may or may not be there for you when you need to get somewhere, so you might as well make the most of them. Yes, my Lexus once (and only ocne, in over ten years) randomly stopped working, and, yes, it was expensive to fix, but you know what? In the meantime, it was still a Lexus.

Tuesday, July 12, 2005

Someone else's ice cream

So you've just had a great meal. Good food, good wine, good conversation, and you're sitting there feeling so satisfied. Those tummy endorphins are flowing and you're feeling like life is so good. Then one of your dinner mates says, "hey, let's go get some ice cream," and even though you hadn't had the thought cross your mind, you suddenly realize that some ice cream would be a great cap to your great meal.

So you leave the restaurant of utter satisfaction and head to the ice cream place of your choice, and it's closed. What had been a one-off suggestion is now an obsession. You really want some ice cream, and now you can't have any, and even though you are really no different than you were half an hour ago, suddenly you've been denied someone else's suggestion, and it sucks. Your state of satisfaction has become a state of disappointment.

I bring this up as a metaphor for what's just happened to me.

A couple of weeks ago I was feeling so satisfied and really, wanting nothing. I had left my job with enough money that I wasn't going to have to work for the man anymore. Not that I wasn't going to have to work anymore, but that I had the flexibility to do what I want to do, which is to become a Code Samurai, a master of Macintosh programming.

But it was more than that. I had a plan. I knew where I was going, and I liked where I was going. I was going to finish school, then move back to Hawaii. In the meantime, I was going to have Wil mentor me in the ways of Code Bushido. Then Apple called, changed my plans, then left me where I am today: disappointed over ice cream I never even wanted.

When I was at WWDC, they had a student job fair. I wasn't really interested in finding a job, but there was free food and drink, and I figured it would be a good idea to go ahead and participate, if only to justify the pizza on my plate. I passed out a few résumés to companies I admired — Macromedia, Aspyr, Omni — but even I that I just took as an opportunity to tell them I thought they did good work.

Of course, Apple also had a table there. It was so pimp, because instead of a sign saying "Apple Computer," analogous to the other company's signs, Apple just had the Apple logo. Everyone knew who they were, of course. I got in line, and gave them a résumé, and to my surprise, they gave me a little mini-interview on the spot.

One thing about me: I always feel like I know where I blew it. In this case, it was when they asked me about PHP and I talked at great length about Apache. I did this because I had had another interview, years before, where they asked if I knew LAMP, and I told them I had never heard of it. I didn't realize they meant Linux-Apache-MySQL-PHP, which I know like the back of my hand, and I felt really stupid when I didn't get the job.

So, in effect, I was answering the question I had failed to answer, which was a bad idea, and which, I figured, cost me whatever chance I had of working at Apple in the next couple of months. It was OK though, because I still had the Hawaii plan, and a couple of days later I met Wil, which made the idea of packing up and moving to California all the more unattractive.

To my utter shock and amazement, Apple called me a couple of weeks later and gave me a phone interview for a job as an integration engineer. This is basically someone who tests new versions of OS X against third-party applications, debugs regressions, and lets those responsible know what needs to be fixed to ensure the next update doesn't break everyone's apps.

It's a weird job that requires a lot of different skills, many of which I have, and the ability to communicate effectively, which I like to think I do. It was a job that would tap the fact I have a very broad-based knowledge of computers, and a lot of experience outside the comfortable environment of programming Cocoa. Of course, after the one hour phone conversation, I knew where I blew it.

I talked about this in the last entry, but one of the problems with using a Mac is that you get out of the habit of filling your head with obscure knowledge and into the habit of simply looking things up. Thus, when he asked what was in a crash log, I told him I didn't know, because when I have cause to open one up, I get the information I need and move on. When he asked where preferences are stored, I actually drew a pressure-activated blank and told him I would just use spotlight, which would certainly work, but is hardly 1337.

I didn't really mind though, because I wasn't expecting them to call me, and I wasn't expecting them to phone screen me, and I wasn't expecting to get past the phone screen anyway. Like I stupidly told my interviewer, I'm like a guy who runs around the block every day — I'd like to run a marathon, but I don't really think of myself as being good enough. So that was that and I was still satisfied and perfectly happy doing my thing.

Then they called back. They actually liked talking to me and wanted to set up a conference call, sort of a round two. My phone screen was on Thursday, and this was Friday, and the recruiter told me that, while she didn't have a date picked out yet, she just wanted to let me know I made it so I wouldn't spend my weekend worrying about it. I was not only happy I had made it, but really into the way they did things. The last person who interviewed me — you know, Lampy? — never got back to me one way or the other, and I thought that was pretty uncool.

Then it got kind of weird. I went out with Wil on Monday, so I woke up late on Tuesday, and there was a message on my voicemail that I was supposed to have been interview that morning. I pretty much shit. It was OK though, because I had left my phone in the bathroom, and was actually sitting on the toilet when I heard the message. Then he said, "but some of the people are not here yet so we are going to have to reschedule" and I felt that bullet just whiz right by.

I always over think things, so you can imagine the hell of trying to figure out what to do next. Do I call back? Do I write to the guy and tell him the recruiter screwed up? Or do I write to the recruiter and say what the hell? In the end, I wrote to the recruiter and said I must have missed the e-mail and would she please let me know when the reschedule was. Over the next few days she said she was having a hard time getting everyone together because it seemed some of them were on vacation and other weird challenges.

When I was finally scheduled for a week ago, I had a realization. If the people I was supposed to be talking to were on vacation, that meant that this pentumvirate was not a standing committee, but rather, an ad hoc one. That suggested they were not interviewing a large group, but rather, just me. That suggested this five-way was less of an interview and more of a confirmation hearing. In other words, I was in, and all I had to do was not screw it up.

By the time it was 1 p.m. on Wednesday, two things had happened. One, I had more or less decided I was going to be moving to California and working for Apple. I started looking for apartments, looking at realtors, revising my time tables, that sort of thing. Two, my car, which I would drive to a place of good cell phone reception, heated up in the summer sun to about a million degrees.

The interview went sort of OK. I managed to get about halfway through most of their questions, which were largely technical in nature. I was especially proud of myself when I worked through, completely in real time, what it would take to implement a stack in C. It was a little tricky, because I had to think procedurally, and didn't have things like mutable arrays at my disposal. Of course, there was the one place where I really felt like I screwed up, but this one felt different.

The question was something like, "how does calling a function with arguments work?" They asked this question, and I told them I basically didn't know. Then they asked a bunch of other questions which, I didn't realize at the time, worked around it, then asked it again. I said a bunch of stupid things, including confusing the stack and the heap, and admitting I don't really know what registers are. It was an oven in my car and I was sweating so much my clothes were literally soaked through and my phone actually short-circuited.

The key concept I was missing is something from Computer Science 101, which I know really well, and which escaped me until the moment I hung up the phone and rolled down a window. That concept is this:

When you call a function, it gets pushed onto the stack in a new frame — with the notable exception of LISP's beloved tail-end recursion, which happens in the same frame. Any variables in the calling function are still in scope, and anything you pass as an argument, the new function has access to. If that function in turn calls functions, they are pushed. When a function returns, it is popped, with any return value entering scope in the new top function, and play continuing as such until the stack is empty and the main function exits, closing the program.

Well, I guess that was the final screw up, because I haven't heard from them, and I see that they've reposted the job to their openings page. So, here I sit, disappointed over someone else's ice cream.

Monday, July 11, 2005

First Post! OMG!

Welcoming back to the stage... me!

Wow, it's been a long time. I'm sure I'll be telling the stories of these lost years in time, but for now, I've got so much to talk about from today's madness that I'll just give you the necessary background information in one compact, easy to swallow pill. It's the American way.

I'm unemployed and busier than ever. My productive hours for the past month or so have been spent learning the technology necessary to write applications for the Macintosh. When programming, you have three things you've got to learn: an interface with which to communicate with the computer, a language to facilitate that communication, and, because this conversation is persisted in the form of an executable application, a programming environment to handle the overhead of organizing your thoughts, making sure the computer understands you, and packaging your work into a form usable by others who want relive your conversation in a way that's useful to them.

When talking about the Macintosh, these three things are Cocoa, Objective-C and XCode.

Cocoa: Hot drink for a cold day

Cocoa is the interface, what we call an Application Programming Interface, or API. Well, in truth, Cocoa is one of the available sets of APIs, which is why we call it Cocoa, and not simply "the API." Originally called NeXTSTEP, Cocoa is to programming what the Mac is to everyday computer usability. Having spent the past few years toiling in Java (and its evil twin, C#), Cocoa is like a breath of minty fresh air. The most obvious example of how this is true is in looking at what I spent most of time on with Java versus what I spend my time with in Cocoa.

Consider what every application has. I'm talking about basic things like drag and drop, the ability to undo and redo, saving things to disk and reloading them, changing colors, changing fonts, making things bold or italic, saving application preferences, and a graphical user interface. In Java, I spent a vast majority of my time — I'm talking at least 80% of every productive hour — just trying to get these things working. I say trying, because some things, like a complete drag and drop implementation, or the whole undo/redo thing, never got done, and a lot of things, like saving and loading, never got done well.

With Cocoa, all that stuff's done. It's about as difficult as saying, programatically, "Drag and drop seems like a good idea" and "Undo/redo? Yes" and "Saving stuff? Give me some of that!" and it just works. That's right, the whole "it just works" mentality that Apple's engineers work toward in Mac OS X also guides the APIs that programmers use to make programs for Mac OS X. This probably has a lot to do with the fact that people at Apple actually use the the same tools as any other programmer, so when they make those tools, they expect them to be usable. With programs, as with so much, never use a product its creators are unwilling to use themselves.

Using Java, I really got the impression those guys weren't using the same tools. From the very first line of code you write in any Java application, public static main(string[] args), you can see this to be true. Nobody else gets to have variable-length arguments in their methods, yet every Java program relies on this ability just to get running. We're definitely not playing by the same rules as the guys who made this tool, then, are we?

Objective-C: Reading glasses for code

The second part of the Mac development triad is the programming language, Objective-C. When you come from any of the C-syntax languages, such as C or C++, as well as Java and C# (I'll save the "C# is not C" rant for later), you get used to things looking a certain way. That way, if you're curious, is function(argument). Then you look at some Objective-C and it blows your mind with it's [receiver message] syntax. However, when you spend a little bit of time with Objective-C, disregarding any issues other than syntax at the moment, you can quickly see why this is better.

For example, let's say I had this Sandwich class that allowed me, via a completely contrived static method, to create a sandwich object into my previously declared lunch variable. It's a really big, complicated method, and in Java it would look something like this.

lunch = Sandwich.createSandwich(ham, swiss, potato, true, true, false, true, true, potato)

When you look at this method it's kind of hard to tell what's going on. All of the booleans are meaningless, and while ham and swiss are pretty obvious, potato shows up twice, which doesn't seem to make any sense at all, especially given that we are making a sandwich, and potatoes are not the kind of thing you usually eat between two pieces of bread. This causes the Java programmer to spend a lot of time going back and forth to the Java documentation because every time you write another argument you need to make sure what exactly you're adding, and if your methods are overloaded, you're really up the creek.

Of course, the Java community is smart and they have Javadoc, which makes it really easy to generate good documentation while you're coding. As a Java programmer, that seemed the ideal solution, but, of course, what I didn't realize was that instead of spending half my time writing self-documenting comments, I could just be writing self-documenting code. Look at the same order in Objective-C.

lunch = [Sandwich createSandwichWithMeat:ham cheese:swiss bread:potato lettuce:YES tomato:YES mayo:NO mustard:YES sidePickle:YES sideSalad:potato]

Suddenly we've got the light of day. All those booleans are tied to something explicit, and the weird potato phenomena make sense. Why are there two potatoes? Because one is soft, delicious potato bread, and the other is a nice side of potato salad. Why are there potatoes in a sandwich order? Well, same reason. The method name is so obvious (createSandwichWithMeat:cheese:bread:lettuce:tomato:mayo:mustard:sidePickle:sideSalad:), you might not even need to look at the method description, which makes coding faster, without the mental shift of having to read documentation every ten seconds, and does much to increase accuracy and reduce bugs.

It doesn't take a genius to see why, when NeXT was looking for a language, they chose Objective-C, and that's not even getting into the functionality of the language, which has something all other object-oriented C-ish languages lack: C. Unlike C++, Java, or the incredible mis-named C#, Objective-C is C. This means that the entire C language is right there when you need it. Can't get your drawing code right with the object libraries? Bust open the procedural libraries and get med-C-val on its ass.

Anyway, I hate to get this technical for my non-technical readers, but the utter joy that is Objective-C comes into play later in today's dispatch, so if you skipped all the code and explanation, let me just sum it up for you: Objective-C seems weird at first, but give it about an hour and you will see that it is, in fact, awesome.

XCode: In a nutshell, it doesn't suck

Third — and I will make this very short — I've been learning XCode and its little buddy, Interface Builder. I will just say that I've been avoiding such tools for a long time, instead using a text editor and command line tools, because I could not find an integrated development environment that didn't just suck. If you're an HTML wonk like me, and you see the garbage that tools like Frontpage and Dreamweaver spit out, you know my frustration. As an aside, I don't mean to say that Dreamweaver sucks nearly as hard as Frontpage. I mean merely to point out that even really good machine-generated code sucks a donkey's left nut. The greater point is that the Apple dev tools are IDE done right, and after worshipping at the alter of plain text, from VI through 8 versions of BBEdit, XCode has changed my religion.

Back to school

For the past year I've been going to school at DeVry University, in an attempt to finally finish my damned bachelor's degree. I picked DeVry for several reasons. First, it's right next to my house, and I hate commuting like the Supreme Court hates private property. Second, they have this accelerated program for working adults whereby you can go to class nights and weekends, which was important when I worked on weekdays. Third, they were highly recommended to me by a high school teacher I really admired. Finally, during my initial interview with the admissions counselor, I expressed my frustration with the University of Hawaii's policy that you had to start the computer science program at the bottom, no matter if you already knew, say, what a mouse was. He said that not only do you get to test out of that crap, you get to do so as a matter of course, In other words, they seemed to "get" the fact that if you are seeking a college degree in computer science, you probably already know some computer science.

I have a couple of frustrations with DeVry, however. One of them is they really don't have a washout rate. Pretty much, if you show up and do your work, you will probably end up with a degree. I think the barrier to entry in the computer science field needs to be harder than that, because it's a hard field. You have to really love the stuff to be good at it, and the last thing we need are more mediocre application developers developing more mediocre applications. This has led to there being some pretty frustrating individuals in my classes, and one of these individuals caused quite a ruckus in my first day back after summer vacation.

Honor fight

During the first break, I was talking about how I bought a ton of books over the summer, including one on learning Python. This kid, who has to be at least 21 to be in the program, but who acts 14, made this "eugh!" noise reminiscent of the woman who doesn't like Spam. I responded to that sound by saying, "well, I've seen some really cool things you can do with Python and I wanted to check them out, plus it seems like I know every other scripting language, so I figure I might as well learn this one. His response was to the effect of "Python is the crappiest language to come along since Objective-C."

I think I've made pretty clear my feelings on Objective-C, so of course I wasn't going to just let that go. I said that, while Objective-C seems weird at first, when you work with it a little while you start to really appreciate the readability and dynamism its strange syntax provides. His response was simply that "it ain't C," which, I pointed out, is complete and utter nonsense. Objective-C is C, and indeed, before it was a programming language in its own right, it was simply a C pre-processor. He said that if he wanted to objectify C, he would just use C++.

Then it occurred to me that this kid always talks smack about things he couldn't possibly understand, and that arguing with him on the subject was going to be pointless, because his stated opinions were completely uniformed. All I was going to get was frustrated, so I called him on it. "You don't actually know anything about Objective-C do you? In fact, you couldn't even stand up to the whiteboard and write a single line of Objective-C code, could you?" He got defensive and said I was shit talking and that he hated shit talkers. I told him he was the biggest shit talker up ins, and he told me if I shit talked one more time...

I told him I wasn't shit talking at all; that I was simply pointing out that he was shit talking something he didn't know the first thing about, and he actually started walking toward me, then, when the professor came back in, told me I was lucky. I was lucky? Wait, he was going to fight with me? He was going to actually, physically fight with me, over a programming language? And worse than that, a programming language he not only doesn't know, but in fact, doesn't even know about? That is the stupidest, saddest, most pathetic thing I've heard of, but at the same time, it got me really annoyed.

Let's say this guy jumped me in the parking lot. I wouldn't run, because that wouldn't solve anything, but indeed, would make my life hell. No, I would fight with him, and I would win, and what's more, I wouldn't just subdue him, because that would be half-ass, and I don't do anything half-ass. I would pound the living fuck of him until it took a team of skilled surgeons to put him pack together into something resembling a living being. When the police came, as they inevitably would, they would look at me and they would say, "you're 30 years old, six-three, three hundred pounds, and you just wiped the asphalt with a kid half your size? You're going to jail."

The little man is always scrappy like a little dog. I always thought that was somehow a defensive gesture, like, "I'm little, so I have to be mean, just to survive." This near-altercation made me realize that line of reasoning is bullshit. For one thing, I was small my entire pre-adult life, and I didn't get mean. No, it occurs to me that while the big man may make empty threats of physical violence, the small man can afford to call anyone out — the bigger the better — because even though they would get pounded, they know that in the court of public opinion, they are always going to be the victim, and that the big man must know this, thus they know the big man will not fight with them, and they will be able to seem tough by always showing the big man down.

Other Challenges

The class I'm in is advanced database, which means getting elbow deep in Oracle's PL/SQL, as well as doing some data mining and warehousing work in Microsoft's SQL Server 2000. Now, I don't mind Oracle, but I don't really like Microsoft or their products, so I was loathe to deal with SS2K. However, I don't really know database stuff, so I'm just as loathe to strike out on my own, which is what I usually end up doing when I get frustrated with my school-issued Windows laptop and start doing stuff on my Powerbook. Thus, I went ahead and (tried) to install SS2K.

Instead of simply, of, I don't know, working, the installer told me I didn't have enough free disk space. No, it said, you need at least 475 MB free to install this miserable piece of software. I checked the disk, and it had some 24.4 GB free. Now, where I come from 24 billion is bigger than 500 million, so I was a bit confused. I brought this up to the Windows using people behind me and they said that, in order to install from a CD, you either need to copy the CD to disk first, or mount the CD as a network drive. What amazed me about that response was not that it was so in defiance of any kind of logic, but that it was something that they "just knew," and indeed, that they not only accepted, but considered as normal.

I copied the disk, but it still didn't work. I tried and checked everything I could think of, and let me tell you, I can think of a lot of things. Then, when all else failed, and had been failing for an hour or more, I went ahead and consulted that most useful of technical resources, Google. I found, within the first page of my search results, not only an error that was similar, but indeed, a person in an experts forum complaining of the exact same issue, with screen shots and everything. His conversation, which lasted over gods-know-how-many frustrating months, was a lot of other people telling him what he needed to do, and his telling them that he already did that and, just as he had said three posts up, it didn't work.

Nobody really seemed to grok his problem, as they kept making suggestions that would, say, rely on the software being successfully installed, whereas I knew that the installer package had not even unpacked. Indeed, I felt his pain in the most real way possible, except that I was simply some student, and this was a person who was actually using this thing for its intended usage. I point this out, because SQL Server 2000 is enterprise software, which Microsoft deems fit for you to stake your multi-billion dollar business on. He eventually discovered the problem in Microsoft's own bug database, and I didn't believe it.

As I had picked the laptop up from re-imaging only that morning, I went ahead and downloaded and installed the software I download and install every time I pick the laptop up from re-imaging. That is, iTunes, Quicktime, and Firefox. Then, those done, I went ahead and tried SS2K again, and it installed without incident. I couldn't believe it, but his research had been correct: SQL Server 2000, an enterprise product that has been out for five years with this known bug, will not install if your disk's free space is divisible by four. Go ahead and take a minute to let that sink in.

It occurs to me that using Windows must be extremely satisfying. That's right, I said satisfying, and I say that because when you figure out the bizarre, illogical way to do something, you really feel like you've won a victory over your computer, since, to the Windows user, the computer is your enemy. When you've been using Windows a long time, since they have been known to let their bugs stand for a decade or more, you really start to accumulate an expert's level of knowledge. This much satisfying, arcane knowledge is a real investment, and you would be loathe to give that up for some computer that has the annoying habit of just working.

Indeed, in a recent interview whereupon I was asked to prove my Mac expertise, I found it difficult, because a lot of that stuff never happens, or happens in a logical way that gets solved without a lot of learning, or has an answer that is pretty easy to find. In the end, using a Mac for five years, I haven't really accumulated the tome-like memories that make you an expert. This gets you out of the habit of learning the arcane, so even things like the Unix terminal become pretty simple. Why memorize the ps command or the various bitmasks of chmod when you know help or man or a small book will know it for you. This may have bitten me in the ass, but I won't apologize.

So now my Windows brain has expanded a little. Now I know about the "free space divisible by four" error, and I know that when it occurs, the computer doesn't tell you that it has run into the error, but instead gives you a different, illogical error, from which you must simply psychically divine what it really means. This doesn't make me feel smart, however. Instead, it makes me feel dirty, like you feel after visiting rotten.com or hearing about your parents having sex. At the same time, it emboldens me in my decision to abandon the Windows using masses, and give up this idea of platform-neutrality as promised by Java, in favor of programming to the logical minds of the Mac user.

A new character enter

So now you know about my student status, which means I can tell you that I applied for a received a scholarship to attend Apple's Worldwide Developer's Conference. If you've heard about Steve Jobs' announcement that Apple is moving to Intel processors, you can add to that knowledge that I was there, in the auditorium, when he made that announcement. This was, of course, the WWDC keynote, on the first day of the conference.

What you may not know is that the conference has an extra day for students. The day before, Sunday, is student day, which is a day of goings on for students only. Our own sort of keynote address was given by Wil Shipley, a celebrity among Mac users in the know for founding the Omni group. The Omni group is the company that makes, among other things, Omni Graffle, a program that, when held next to its PC counterpart, Microsoft Visio, pretty much settles the whole Mac vs. PC debate. Well, Wil stopped working for Omni and started a new company called Delicious Monster, which has a product called Delicious Library, which I've used since it came out, and which I love.

For now, I'm not going to get into DM or DL or even how I met Wil or what his talk was about. I will plug his site, wilshipley.com, where you can actually download his talk, and where, I dare say, Wil can speak for himself. I will say, however, that Wil has become my mentor, and more, we have become fast friends. I mention this not only to brag that I'm friends with THE Wil Shipley, but also to finish out my stories of the day.

Yesterday, as on so many days, the Lemur and I drove up to Seattle to have dinner and play Munchkin with Wil. While we were there, he popped into an electronics store and bought a projector. The projector was not in stock, and the warehouse is in Kent, where we used to live, and Wil didn't want to wait for them to have it sent over blah blah blah so I picked it up for him and delivered it to his house. We played with a bunch of different ways to set it up, taking it from a 60" screen to a screen that is so large it's ludicrous to measure it in inches. (It was like, ten feet). Wil is a big fan of the new Battlestar Galactica, and I've been desperately trying to track down the first season so I can be caught up for the big Season Premier party in ten or so days.

Finishing up

From there we drove down to Tacoma to attend a birthday party of one of the Lemur's old friends. There was meat and drink and drunk girls making out and all that sort of goings on. Having already worked on this for several hours, I won't go into it too much, but I will take this as a chance to plug the Lemur's own blog resurrection, Frink! Script! Ptank!. Enjoy.