February 27, 2005

Copy Protection Bullshit

This weekend, I finally finished unpacking the rest of my "external" hardware, including an external hard drive that I drop my "mission-critical" file backups on, like my SourceSafe database, etc.

When I plugged it in, I was asked to reinstall my drivers for it. I didn't think anything of it. So, I ran the driver installation I had downloaded, and my system rebooted when instaling the second half of the driver.

I was shocked. That had never happened before. Thinking it may be a Windows XP Service Pack 2 issue, I downloaded the latest drivers and installed them. Again, as soon as the second half of the driver began installing, BOOM!

This time, I got the "recovered from a serious error" message on boot. I sent in my crash minidump, and got the following:

Crash caused by StarForce Copy Protection (Link Fixed)

I was then pointed to this URL for an update to my copy protection. This is the opening paragraph to that page, emphasis mine.

Some versions of StarForce Copy Protection will install dedicated drivers on your PC. Those drivers are necessary for the StarForce specific CD/DVD checking procedure, only. They do not include any hidden functionality. The drivers are active only at execution of the protected application. StarForce constantly improves their drivers to keep them compatible with the latest versions of Windows operating systems.


Okay, Einstein. It's a clean boot. What frickin' game that you are protecting am I running on a clean boot?!?!? Why would YOUR drivers care about the installation of my external hard drive?

I'm in the video game industry. I fully understand the necessity of copy protection due to the high rate of piracy in the PC video game market. But the moment that you cross the line between protecting the interests of the developers and publishers and interfering with the functionality of the user's computer, you've gone too far.

I would rather lose a sale due to piracy then lose all future sales due to an experience like this. A sale lost to piracy can lead to future sales if the game is good enough. A customer lost due to poor experience will never come back.

I've downloaded your driver update, and I'm going to install it...but if it keeps me from installing the hardware that I own, just remember...hell hath no fury like a blogger scorned.

UPDATE: Their new drivers did indeed allow me to install my external hard drive, but I think that if anything, this is proof that having DRM/copy protection software that is always resident in memory is a major mistake. After all, you never know what kind of legitimate computer use you could be stopping.

February 26, 2005

Sprite.Draw2D Scaling Issue

If you've used Managed Direct3D's Sprite.Draw2D class to render sprites out and tried to scale the sprites, you may have noticed that it applies the scale *after* the shift for position. Needless to say, this is a bad thing, as it causes the sprites to shift up and to the left by odd amounts if scaling down, and down and to the right if scaling up.

To fix the problem, you need to multiply the x and y positions of your sprites by the texture width divided by the the new height.

    Private Sprites As New Queue

Private Structure Sprite_Type
Dim tex As Texture
Dim x, y, width, height As Integer
Dim c As Color
End Structure

Public Sub Draw_Sprites()
If Sprites.Count = 0 Then Return
Dim s As New Sprite(VideoDevice)
s.Begin(SpriteFlags.AlphaBlend)

While Sprites.Count > 0
Dim sp As Sprite_Type = DirectCast(Sprites.Dequeue, Sprite_Type)
Dim xmult As Single = sp.tex.GetSurfaceLevel(0).Description.Width / sp.width
Dim ymult As Single = sp.tex.GetSurfaceLevel(0).Description.Height / sp.height
s.Draw2D(sp.tex, Rectangle.Empty, New Rectangle(sp.x, sp.y, sp.width, sp.height), New Point(0, 0), 0, New Point(sp.x * xmult, sp.y * ymult), sp.c)
End While

s.End()
s.Dispose()
End Sub

I know that my code isn't following the .NET Framework Naming Guidelines. This is merely a test app that I'm throwing together to make sure that I can work out my rendering issues before I go full-bore into my next project.

February 25, 2005

And THIS is why I disliked developing...

For the last 8 days, I've been working on a Managed DirectX top-down shooter using Direct3D to render sprites on-screen. I used MD3D because using DirectDraw really killed performance. However, DirectDraw was at least somewhat consistant across platforms.

Like all Direct3D games, I use textures. I decided to store my textures in a Hashtable and load them on demand using a helper function. Once a texture had been loaded, any future calls to this helper function would return the texture. In addition, if the Direct3D device got lost and then reset, I'd just have to clear the Hashtable entries on device reset, and all textures would be reloaded as needed by the game.

I developed the system on an nVidia card. It actually worked quite nicely. The core consisted of these two functions:


Public Function GetTexture(ByVal name As String) As Direct3D.Texture
name = name.ToLower
If Textures.ContainsKey(name) Then
Return DirectCast(Textures(name), Texture)
Else
If Sprite_Load(name) Then
Return DirectCast(Textures(name), Texture)
Else
Return Nothing
End If
End If
End Function

Public Function Sprite_Load(ByVal name As String) As Boolean
name = name.ToLower
Debug.Write("Sprite_Load: ")
If Textures.ContainsKey(name) Then
Debug.WriteLine("Already have '" & name & "'. Aborting load.")
Return False
End If
Try
Debug.Write("Loading '" & name & "'...")
Dim tex As Texture = TextureLoader.FromFile(VideoDevice, BASEPATH + name)
Textures.Add(name, tex)
Debug.WriteLine("done.")
Return True
Catch ex As Exception
Debug.WriteLine("error: " & ex.Message)
Return False
End Try
End Function


On the nVidia card, this worked perfectly. On my ATI Radeon 9200 All-In-Wonder at home, however, it doesn't work at all. Each texture renders as a solid color or corrupt. If I skip pulling the textures from the Hashtable and casting them back, however, they render okay.

Config errors like this are horrible to figure out for ISV's. Most ISV's don't have access to large configuration labs. Home developers are even worse off, usually only having what is currently in their computers...and heaven forbid they make too many changes to their configuration in a short period of time and face the wrath of Windows Product Activation (now in refreshing mint Call-Your-OEM flavor).

Fact is, I'm using this as a proof-of-concept. I want to get my basic texture handling system down so that I can go to a full 3D system and reuse the texture routines. But if I can't put these managed objects in a standard .NET collection and retrieve them, what good are they?

February 24, 2005

Anime Directors Duke It Out...

...Well, kinda. I was reading this article in the Los Angeles Times about the difference in approaches taken by anime's top two directors, Hayao Miyazaki ("My Neighbor Totoro," "Spirited Away") and Mamoru Oshii ("Ghost in the Shell").

The article is a fascinating read about the state of the industry from Japan's point of view, but the conclusion finally managed to put into words what I like about Miyazaki's flicks.

"Japan now has no hope in general," [Toshio] Suzuki[, Miyazaki's longtime collaborator,] says. "It's the reason Miyazaki's films are so popular here: His films give the audience the energy to live.

"Miyazaki is saying that no matter what era you live in, beauty exists. And though the audience expects to see some kind of destruction in the film, in the end, they know he will give them hope."


Miyazaki's movies may have confusing plots and characters that seem to have no real reason to exist, but his movies always leave me with a warm, fuzzy feeling about humanity.

February 23, 2005

Another Culture Shock Moment

I was riding the DART rail to work this morning, and there were five very attractive ladies on the train who were arguing quite loudly and incoherently. They almost came to blows when the train stopped at Akard and they got off.

I've never seen ladies in essentially business attire fight like that, so I asked one of my fellow passengers what they were fighting about.

The answer? They were fighting over whether or not Drew Bledsoe was a good match for the Dallas Cowboys.

Dear Bob, save me from the sports fanatics, for they know not what they do...

February 22, 2005

Managed DirectX Part 1

There were times when DirectDraw was ideal. You've got some sprites that you're trying to move across the screen, blitting out a font, stuff like that.

Now, I use Direct3D for those things. It's funny seeing exactly how much code is involved in just making a simple textured quad move across the screen, however.

The worst part of using Managed Direct3D is the exceptions. There's nothing quite as obnoxious as getting an "Error in the application" exception on one line, when the actual error occured dozens or hundreds of lines prior. The documentation is no help, because most of the docs say the exact same thing that pops up in the tooltip in Visual Studio.

So this one goes out to Tom Miller. Thank you very much for making Managed DirectX. However, we now need the documentation and error messages brought up to speed in order to make MDX a first-class .NET citizen instead of a second-class abstraction layer.

If there is an error in a parameter, tell us what parameter instead of throwing an InvalidCallException. Instead of throwing up a generic "Error in the application" exception, give us details.

At least to me, the miniscule performance hit that I'd encounter from doing extra parameter checks is worth the increase in productivity that I'd derive from having decent debugging information.

2+ Weeks and PC Finally Unpacked; Managed DirectX

You know, trying to efficiently and cheaply handle a move is harder than a 15-year-old Amish kid at a strip club. We've had our stuff in our new apartment since the evening of February 3, and I barely got my home PC set up last night. Last night. Of course, the batteries for my wireless keyboard and mouse died, so I can't use it yet...and the desk that we brought (which was my wife's) is 3 inches too short for me to sit at comfortably...

I think that part of the reason for the delay is that I haven't had the drive to unpack when I've been getting home. I've been putting my all into my job here at Ritual, trying to prove that I can do more than my job title. I participated in a company-wide gamejam this last weekend as a developer, I've passed on lessons learned from major internationalization FUBAR's made in the past...heck, I've even acted as a bullet point for interviewees. ("Yes, he use to work for Microsoft." "Oooooh." "And over here, we have free pop." "Oooooh.")

Even my wife has noticed that when I get home at night, I'm much more "mellow" than I used to be. Personally, I think that's a good thing. When I'm here, I don't have to restrain myself. If I want to E-mail around pictures of Margaret Thatcher on a cold day, I can. If I want to tell a joke that these recent female teacher/male student sex scandals are further proof that women shouldn't be allowed into the Catholic priesthood because they're expressing interest in 12-year-old boys and the priesthood doesn't like the competition, I can. The core tenet here is "be yourself and be successful." Because I can let loose at work, when I get home, I'm much more balanced. Working here is the legal equivalent of smoking pot. When I get home, I feel relaxed and I've got a bad case of the munchies.

Fact of the matter is that coming to Ritual is the best thing that ever happened to me. While it may reduce my involvement with computing outside of work to playing a game here or there, I feel that the contributions that I can make to this company and the industry will far outweigh any consequences.

Later this week, I'm hoping to share some of my experiences in writing games using Managed DirectX.

February 17, 2005

Some Pizza With Your MMO Crack?

http://everquest2.station.sony.com/pizza/

I...I...I just can't put my feelings into words.

Let me get this straight. You can order...a pizza...in a game...through an IRC command (/pizza)...and have it delivered...in real life.

Um...I need a drink just thinking about this.

Swamped

344 Messages

I've received over 340 E-mail messages in 5 hours. I won't be able to catch up on that load until this weekend, so if you need a response now, I'm sorry...but you'll just have to wait.

Morning Comments

If you purchased your Xbox prior to December 2003, follow this link to get a replacement power cable. Your current power cable poses a fire hazard.
There is no sound scarier than a high-voltage capacitor discharging quickly in an area with high humidity.
I purchased an entertainment center from one of my new co-workers. He delivered it last weekend, but forgot to bring the three large black shelves.

He brought in the shelves on Tuesday to work, and I took the first one home on the train last night. I was sitting next to this fairly attractive blonde who wouldn't even look at me. Just before my stop, I asked her why.

Her response: "I'm not used to white guys haulin' black wood."

Yet another culture shock moment.

February 16, 2005

Testing Top 10 Lists #3

NOTE: Some of these are actually serious suggestions. Can you guess which ones?

Top 10 Signs That Computing Hell Has Frozen Over

10. A fresh install of Linux on a computer not only detects and functions with everything in your brand-new machine, but it's usable enough that your grandmother could use it.
9. When you get shot in the back by a teammate in Counter-strike, it was truly by accident, and not by a team-killing fucktard.
8. Robert Scoble doesn't go over his bandwidth for his full-text link blog for a month.
7. Bill Gates gets on stage at CES, announces "Microsoft Bob 2," and immediately screams "Psyche!"
6. The DirectX Team releases a full set of skinnable UI widgets for DirectX applications so that developers don't spend five months of every game project reinventing the wheel.
5. Companies start implanting caffeine IV drips in employees to reduce downtime and overall pop expenses.
4. You're able to have a lengthy technical conversation with a fellow computer geek without using a single acronym.
3. Microsoft moves their corporate offices to Puerto Rico, buys the country outright, and tells the Europran Union to fuck off.
2. Blizzard releases a bomb.

...and the number one sign that Computing Hell has frozen over...

1. QA gets all the time they need!

February 15, 2005

Mostly One-Liners

Link: 100 Funniest Jokes of All Time

Susan, you're right, but the courts disagree.

I still read a lot of computing industry blogs, including one by Susan Bradley, the MVP for Windows SBS. In a recent entry, she was complaining about the amount of crap that is installed and barely working on a new machine.

Unfortunately, the courts believe that Microsoft should not control the entire end user experience at launch. They believe that allowing Microsoft to create an Apple-like experience will kill competition, hence all of the complete and utter shit that gets preinstalled, ranging from a half-dozen "free" ISP offers all the way to spyware preinstalled by the OEM in the interest of increasing their profit margins.

I understand that you want to blame Bill Gates for this mess, but the blame rests squarely on the shoulders of the OEM's and the courts. If you're going to blame someone, blame the right person.

February 14, 2005

Strange Visitors

There are two reasons that I write this blog. The first is that writing a blog is a form of therapy for me. It gives me a chance to express my emotions, and be done with them. I can put them behind me, and continue on with a clear head. The second reason is to give me an opportunity to act as a guidepost for other people. By showing what I've done right and what I've done wrong, I can hope to steer people away from major potholes that have plagued me in the past.

Most of the visitors to this site are either people who are looking for specific technical answers, friends from previous employers, or people in the video game industry...but there are a few that just don't make any sense. Here are some entries from my visitor logs for the last two weeks that made me giggle.

become.com: Okay, why is a beta shopping place checking me out?
usafa.edu: The United States Air Force Academy? Sorry, dudes, I was in the Army.
bsfllp.com: I'm guessing that these guys are here because of my article about SCO that I wrote a long time ago regarding whether code is more or less protected if it is treated as speech.
shellus.com: I don't drive, so I don't know why Shell Oil is checking me out.
ghs.com: These guys make real-time operating systems.
usna.edu: The United States Naval Academy? I can't hold my breath long enough.
nmci.navy.mil: Same thing.
monroe.army.mil: Sorry, guys, my Inactive Ready Reserve status lapsed two years ago.
cbsinetworks.com: I had nothing to do with Rathergate. I'd think you'd want to put bloggers behind you for now...
microsoft.com: Yes, my Borg implants may be deactivated, but they still respond to your occasional probes. Ready to travel to Ensemble repatriation center on request. Out.
989studios.com: I don't do sports games anymore, but if you have anything specific you want to ask, pop it out and as long as my reply wouldn't be under NDA anymore, I'll spill the beans.
turbinegames.com: Interested in tree visibility, are we?
citibank.com: I cancelled my CitiBank Visa card three years ago. Chill.

(I know that some of these could be personal browsing, but it's still funny.)

Oh, and as far as search engine entries, well, see for yourself.

"ui hall of shame", "shame hall", "ui-hall-of-shame": My first five entries are almost ready to go up.
"8004022a": The answer you want is right here.
"pirate s moon copy protection": I worked on the game, not the copy protection. Find your crack elsewhere. Schmuck.
"clariticity": You want this site.
"remote desktop connection web client": It's right here.
"the word fuck comedy": I don't even want to know how this one got here...

Random Mental Fecal Matter

I got an E-mail from someone today who wanted me to verify my contact information through a service called Plaxo. I couldn't have updated through the service anyway due to some script-blocking stuff I've got going on, but services like this always scare me just due to the amount of data mining that occurs on a regular basis.

Of course, I guess it's a bit hypocritical of me to be so worried about automated data mining. People who come here and read this blog will get just as much information about me, if not more so, and they won't have to pay for it.
I didn't get as much stuff unpacked over the weekend as I'd hoped.

I did however, get all of my DVD's and current-generation console games unpacked. To give you an idea, I had three 40-gallon Rubbermaid totes filled with Thinpak'ed DVD's of just movie DVD's.

So do the math, and see if you can guess exactly how many movie DVD's I own...
I like using WebHost4Life for my hosting for my images and home page, but it's a bit ludicrous to send out daily renewal notices starting at 77 days before expiration, don't you think? Also, they send it out as two seperate E-mails. That means that if I wait until the last possible minute to renew, I'll receive a total of 154 renewal messages. That, in a word, is bullshit.

I also think that their marketing department needs to be shot. Right now, all of their animated banner ads say that they are hosted by "Window 2000" servers. That's right, not "Windows 2000," "Window 2000." I wrote them nearly a YEAR ago, and told them that I'd feel dumb running their graphic ads if they didn't fix their branding issue. They didn't fix their branding issue.

February 9, 2005

Level Editing

Back when I was at Microsoft Game Studios, I made a Quake III: Arena map of our department at about 4x scale. It wasn't very detailed, and it was a bit dark, but it had a massive amount of rocket launchers and was usually played with a high frag limit.

I really enjoyed making that map. It played nicely, even if it was a bit on the ugly side.

There is something to be said about taking an image that you have in your head and creating not just a work of art, but an interactive world that people can come together in...even if they're coming together to blow each others brains out.

At home, we're gradually unpacking. I'm hoping to have my regular PC hooked up this weekend. If I do, I'm going to reinstall Quake III: Arena and Quake III: Team Arena and start getting back into the swing of making levels.

I've got two reasons to do this. First, I haven't found a supply shop near my home for my other constructive hobby (miniature painting). Second, I'm a firm believer in the adage, "If you can't do it, you can't test it." I need to build and test a level so that I can remember how to do it quickly and effectively. That way, when it comes time to start testing the levels here, I'll be ready.

Once I've got some Q3A levels out of the way, I'll move onto some Doom3 editing...

February 8, 2005

Lawyers

I've just been going over my website traffic logs, and I've noticed that I've been getting several dozen hits from IP lawyers and law firms that specialize in DMCA takedowns since the beginning of the month.

Boy, it's almost like I'm hosting something illegal here, like a guided tour to 15 million lines of the source code to Microsoft Windows, or the source code to one of the post popular online multiplayer games of all time.

Er, no. Nothing illegal going on here. I gave up on that kind of shit years ago.

Farewell, Conversatron

One of my favorite Q&A sites, The Conversatron, is going bye-bye.

The site owners decided to release the Python source code for their site. You can download it from this post.

The code has been released under "The Mr. T Public License," which is quoted here verbatim:
The Mr. T Public License

We pity the fool who tries to use this code.
It is provided without guarantee, warranty, or any regard for our fellow man.
Its use for any reason, public or private, cannot be discouraged strongly enough.

Disturbing...

Link: My Little Golden Book About Zogg

Have you ever read something and immediately wanted to go splash cold water in your face before reading it again, just to ensure you were awake when you read it the first time?

February 7, 2005

Miscellaneous Doodads

I've added a Blogmap to my sidebar.
Microsoft Game Studios' User-testing Group has made several of their papers and talks available for download. I've worked with Randy Pagulayan and Michael Medlock in the past. Who knows? I may get to work with them again in the future.
I noticed that my studio's "online community hub," Ritualistic, found my home page and blog. Wow, these guys are thorough. I never shared that information with Ritual.
Speaking of Ritualistic, I've got a question going about what your preferred install type is. Do you prefer to have the entire game installed to your hard drive, or do you prefer to have the game run off of the CD/DVD?

Asshole

Hi. My name is Michael, and I'm an asshole.

I make no secret of the fact that I'm an asshole. In fact, it seems to be common knowledge. I've had friends, family and co-workers call me an asshole. I've even had cartoonist J. Grant (of Flem and Two Lumps fame) call me an asshole. (Admittedly, I probably deserved it, but that's besides the point.)

Well, I admit that I'm an asshole. However, unlike most, I can occasionally cover that fact up. When I'm dealing with people I don't know, or people whose opinions actually matter to me, I can come across as your standard, everyday schmuck instead of a full-blown asshole.

There are many types of assholes. I'm a smart asshole. I have knowledge, and I use it to bludgeon those who don't agree with my point of view.

Then there are the dumb assholes. They don't know anything, but they won't let that stop them from expressing their opinion on it. "I'm all for stem-cell research." "Why?" "Well, they're just plants..."

There are the artistic assholes. They complain constantly about how art shouldn't be held to a deadline, or that nobody understands their art.

You've got the religious assholes. They believe that the best way to convert someone to your faith is not to live your beliefs, but to instead cram their belief system down your throat using whatever methods they have available.

On occasion, you'll run into fashion assholes. "Oh...my...God, that outfit is so five minutes ago! Nobody is wearing just blue jeans and a T-shirt anymore....NO! You've got to wear capri pants and a pirate shirt!"

There are the natural assholes. These guys can rile up anyone without even realizing that they're doing it. Often, they'll blame their comments on their heritage.

There are the sadistic assholes. These guys love seeing other people squirm, so they intentionally try to cause discomfort.

Finally, you've got the substance assholes. These guys either drink so much alcohol or smoke so much dope that their true selves come to the forefront. When they return to normal several hours later, they believe that they aren't responsible for what they did, and they blame the substance instead of the substance taker.

Everyone's got a bit of an asshole in them, and it always shows up at the worst time. I'm not saying that there is a particular way to handle an asshole, because what works to stop up one asshole may act as a laxative on the next. I'm just saying that recognizing when you are an asshole is the first step to controlling it.

February 3, 2005

What D&D Character Are You? (Meme)

I Am A: Chaotic Neutral Human Thief Mage


Alignment:
Chaotic Neutral characters are unstable, and frequently insane. They believe in disorder first and foremost, and will thus strive for that disorder in everything they do. This means that they will do whatever seems 'fun' or 'novel' at any given time.


Race:
Humans are the 'average' race. They have the shortest life spans, and because of this, they tend to avoid the racial prejudices that other races are known for. They are also very curious and tend to live 'for the moment'.


Primary Class:
Thieves are the most roguish of the classes. They are sneaky and nimble-fingered, and have skills with traps and locks. While not all use these skills for burglary, that is a common occupation of this class.


Secondary Class:
Mages harness the magical energies for their own use. Spells, spell books, and long hours in the library are their loves. While often not physically strong, their mental talents can make up for this.


Deity:
Beshaba is the Chaotic Evil goddess of bad luck, accidents, and mischief. She is also known as the Maid of Misfortune, and also Tyche's unpleasant daughter. Followers of Beshaba believe that bad things happen to everyone, and only by praying to Beshaba will you have a chance of being spared. Her symbol is a set of black deer's antlers inset on a red triangle.


Find out What D&D Character Are You?, courtesy of NeppyMan (e-mail)



February 2, 2005

Usability

Today, I've been having a discussion with a Perl developer on a private mailing list I belong to. While I have nothing against Perl as a development tool, I find that the final source of most Perl applications bears a closer resemblance to line noise than it does to code.

I'm going to share a quote from this mailing list from this developer:

No ... maintainability is the third thing to consider. The first isutility. Does the code perform it's intended function? The second isperformance. Does it get the job done quickly and efficiently, ordoes it bring down the machine? Now you get to maintainability ...and believe me, if you did the first two jobs right, nobody'll give adamn till you leave.


My response was that I was shocked that usability didn't enter into his top three. His reply?

There's a programming language designed specifically for people who
are concerned with usability. It's called Visual Basic.


This is not the attitude of a developer. This is the attitude of the "L33T." So I replied:

And anyone who ignores usability is a liability.

I don't care as much if a program is usable for a developer, but I do care greatly whether or not an end user can use the program that is created.

Back at the city, we would often handle things under the hood in a very different manner than it was presented to the end user. While it may have led to increased complexity in the UI, it allowed us to concentrate on making the user experience as easy and straightforward as possible.

If you aren't developing with your users in mind, your coding is merely mental masturbation. Sure, it's fun, but it's not something you'll want to show off.

It was then mentioned that not every program is an end-user interactive program. That's true, but even if that's the case, something is going to be using it. If you are making someone or something jump through hoops just to use you, are you really doing anyone any favors?

Testing Top 10 Lists #2

Top 10 Signs The Project You Are Testing Is In Trouble

10. Your developers don't believe in source control.
9. You see check-in messages from the marketing department.
8. Your splash screen consists of at least one swear word and an animated GIF of a dancing Steve Ballmer.
7. When you warn your developers that their current path will code them into a dead end, they spout off the current development methodology of the month (Agile, XP, TDD, etc.) and say, "Our methodology will prevent that."
6. Massive chunks of behavior change without notification.
5. Bugs get reassigned more than 22 times.
4. On your latest console title, you only have 4k free after initialization.
3. You realize that the product you are testing will directly compete with a currently shipping product that is also made by your company.
2. The mandatory screen flow provided by your publisher is in direct violation of several certification requirements.

...and the number one sign that your project is in trouble...

1. "Testing? We don't have time to test this."

February 1, 2005

Testing Top 10 Lists #1

I'm still recovering from the move, so I'm sharing humor in the meantime.

Top 10 Signs That You're Dating A Tester

10. Your love letters get returned to you marked up with red ink, highlighting your grammar and spelling mistakes.
9. When you complain about him spending too much time with you, he replies that he's in the middle of a soak test.
8. He keeps asking for a "spec" so he'll know how his "harness" should "interface" with you.
7. He'll always do something wrong twice so he can provide accurate repro steps.
6. When you tell him that you won't change something, he'll offer to allow you two other flaws in exchange for changing this one.
5. When you ask him how you look in an outfit, he'll actually tell you.
4. When you give him the "It's not you, it's me" breakup line, he'll agree with you and give specifics.
3. He won't help change a burned out lightbulb because his job is simply to report that it's burned out.
2. He'll keep bringing up old problems that you've since worked out just to make sure that they're still gone.

...and the number one way to tell you're dating a tester...

1. In the bedroom, he keeps "probing" the incorrect "input."