Miscellaneous software-related stuff

These have been stewing for a while, and I need to share (and in some cases, vent).

TortoiseCVS

First off: TortoiseCVS. Leaving aside the WTF of still using CVS, let's take a look at what I am presented with when I go to resolve a merge conflict:

TortoiseCVS TWF

Mine? Yours? WTF do those mean? This can be really confusing at times.

The .NET Framework

Apparently .NET treats any two methods with the same name and number of non-primitive arguments as identical. That means that the following two methods are indistinguishable:

public void Frobnicate(FrobnicationDelegate frobDel, string targetName)
public void Frobnicate(string targetName, Gizmo frobHelper)

Two problems arise from this. First, Visual Studio (at least VS 2005; that's all I have) uses the same mechanism to track method usage, so right-clicking on a call to Frobnicate("somestring", new Gizmo()) and selecting "Go to Definition" causes Visual Studio to ask which one I meant, even though it's obvious which one I meant if you pay attention to the argument types. Furthermore, if the Gizmo class is defined in the NiftyGizmos assembly, the assembly I am working on doesn't have a reference to NiftyGizmos, and I call Frobnicate(someFrobnicationDelegate, "omgwtf"), the compiler will complain that it doesn't know what a Gizmo is! YOU DON'T NEED TO KNOW WHAT A Gizmo IS!!! I'M NOT CALLING THAT METHOD! ARGH!

I think this sort of distinction works out fine if at least one set of arguments at some common position in the argument list of both methods have different primitive types. Note that string is NOT a primitive type; it's a class in disguise.

The Fruits of JavaSchools

There's also this. I can't help but wonder if that recommendation is the result of the focus on Java that is so common in colleges and universities today. You just can't teach pointers in Java; the syntax doesn't make the difference between references and actual values clear. I've seen people get confused by this. Honestly, if you can't understand the difference between C#'s out and ref parameter types, you are a code monkey, not a programmer.

Needless Complexity

Designing a needlessly complex system will not make your penis bigger. Needless complexity just makes anybody who has to maintain your code fantasize about printing your nightmarishly huge abomination, getting it bound in hardcover, and beating you to death with it.

The Zen of Visual Basic

(based on code provided by PSWorx on The Daily WTF)

Public Function TreeToString(Root as Node) as String
 Dim i as Node
 TreeToString = Root.Name & "("
 For Each i in Root.Children
  TreeToString = TreeToString & TreeToString(i) & " "
 Next i
 TreeToString = TreeToString & ")"
End Function

If you find yourself confused by this, note that in Visual Basic (and all other BASIC dialects I am familiar with), the return value is set by assigning a value to the name of the function. The name of the function can also be used for recursive calls. For reference, the same code in C# would be

public string TreeToString(Node Root)
{
  string returnValue = Root.Name + "(";
  foreach(Node i in Root.Children)
  {
    returnValue = returnValue + TreeToString(i) + " ";
  }
  returnValue = returnValue + ")";
  return returnValue;
}

Essentially, all this does is convert a tree structure to a S-expression. The VB version, while somewhat odd-looking to those not familiar with VB (and probably many who are), has a certain Zen quality to it.

Comcast

This isn't really software-related, but it's related to a network, so close enough. Stories like this are what keep me away from Comcast.

Lest We Forget

This post about the Debian/Ubuntu OpenSSL debacle is old news, but it's news that needs to be remembered. I think that blog post does a pretty good job of explaining what happened

Serialization of output? What's that?

From the output of nmake (under somewhat adverse circumstances):

NMAKE : NMAKE : ffataal etrarlo re rUr1o0r7 7U:1 0'5"8C::\P rtoegrrmaimn aFtielde s (bx86y)\ MuiscerrosSotopf.t

Compiler on Crack?

Unhelpful error message

How's this for an unhelpful error message? In fact, it seems that the compiler has gone completely insane, until you realise that SID is part of the base class, not the Image class.

VIPRE

VIPRE fail

Sunbelt VIPRE. Everyone where I work knows it and hates it. Usually, a scan takes about 20 minutes. Occasionally, though, it will get hung up on something, like the Qt SDK. Why? Hell if I know. It can also get hung up on the GStreamer DLLs if the Clementine music player is open and playing music (or paused). It will just loop forever on a few GStreamer DLLs, and the file name it displays will have a bunch of random junk after it, suggesting a buffer overrun or omitted NUL terminator. Oh, and I'm not the only one who doesn't like VIPRE.

MSDN Fail?

Regarding this: in my experience the part about needing a second call to ReleaseWriterLock if attempting to acquire a reader lock while already holding a writer lock is completely false. I'd love to hear if it is still false in the context of Mono (2.0 or 4.0 profile) or .NET 4.0.

Microsoft Video 1 (aka MS-CRAM)

Here is a real failure of a video codec. I recently received a video encoded with this codec. Compressing it with DEFLATE (the algorithm used by ZIP files) reduced it to about 20% of its original size. Using a non-shit codec like H.264 got it down to about 0.1% of its original size. The sad thing is that I think the file was produced by FRAPS. I thought FRAPS was better than that.

And now I no longer have any unread messages in my mailbox (most of the above came from stuff I sent to myself from work). That sure feels good.

Mass Effect vs Mass Effect 2

There has been some debate online about whether Mass Effect 2 represents a badly-needed overhaul or a horrible bastardization. Proponents of the former tend to accuse proponents of the latter of simply hating change, while proponents of the latter tend to accuse proponents of the former of simply hating RPGs.

I feel that I am unusually well-positioned to weigh in on this debate because I played Mass Effect 2 (hereafter referred to as "ME2") before Mass Effect (hereafter referred to as "ME1"). Thus, in my case, ME1 represents change rather than ME2.

WARNING! SPOILERS AND STRONG LANGUAGE AHEAD!

I'll be blunt: I like ME1 better. Before I begin, I will make a few concessions to ME2. Yes, all the elevators in ME1 were annoying (although ME2 randomly deciding to take a long time to load is annoying, too; see below). Yes, the Hammerhead handles much better than the Mako. Yes, ME1's hacking/lockpicking/archaeology/flag-planting minigame can be a pain in the ass, especially when it decides to be all laggy and unresponsive, which is about 70% of the time. Yes, the romances are better in ME2 because you don't have Ashley thinking she and Shepard are dating or something because he talked to her a few times without being a total asshole. ME1 IS STILL BETTER!

Better sense of progression

You level-up frequently in ME1. This is balanced by needing a lot of skill points to max out a skill. The end result is that you feel like you are making progress, more so than in ME2. Also, you can find newer, better weapons, armor, and modifications as the game progresses. While this does tend to cause the sort of inventory micromanagement that Yahtzee hates, it does provide a tangible sense of progress. Every time you find a better suit of armor or a better gun, you feel like you have accomplished something. In contrast, ME2 offers only one better gun of each type. Yes, there is a second better assault rifle, shotgun, and sniper rifle, but only Shepard can use these (unless you pay for upgrades that allow one other character each to use the better shotgun and sniper rifle).

Game universe feels big

In ME1, the Citadel is huge. There are a whole bunch of elevators (aka loading screens in disguise) because it's so huge. In ME2, it's just three small floors plus the Presidium (one room with a nice view) and a few mission-specific areas.

In ME1, almost every star system has a planet you can land on. Yes, the Mako handles like a shopping cart in a bouncy castle, but you get to drive around in a big open area and explore! It makes the game universe feel big, unlike ME2's succession of differently-colored shooting galleries. Plus, I like landscapes, and ME1 has plenty of interesting ones. Oh, and the Firewalker DLC does NOT cut it. For one thing, you can't revisit any areas you explored with the Hammerhead, and there are only a handful of such areas to begin with. Also, the Hammerhead's missles have a mind of their own and won't always fly toward the thing you're aiming at, unlike the Mako's cannon. On the other hand, the Hammerhead handles MUCH better, and, despite being a hovering vehicle, can still run over geth. That never gets old. Personally, I like Yahtzee's idea of exploring planets with jetpacks. Mass effect technology is all over the place; who's to say one couldn't make a jetpack using it? Heck, Schlock Mercenary once featured a bikini that enabled the wearer to fly. This is science fiction, damn it!

Note to EA: do not interpret this as an endorsement of jetpack-bikinis for ME3. If I see somebody in ME3 flying around in the vacuum of deep space wearing nothing more than a bikini and a breath mask, I will let Wrex eat you. Consider yourselves warned.

Free roaming

In ME1, visiting all the planets in the game world costs nothing but time. In ME2, it costs you credits. In addition to feeling a tad stifling, this is detrimental to the aforementioned sense of bigness.

Urdnot Wrex

In ME1, you have Urdnot Wrex in your party. Grunt may be a krogan, and he may have some good lines, but he just isn't the goldmine Wrex was. Stuff like this never happens with Grunt:

Reloading weapons

In ME1, you can keep firing until your weapon overheats. In ME2, you have disposable heatsinks that effectively act as ammunition. NOT AN IMPROVEMENT. Especially when you can only hold 11 or so shots for the shotgun.

Shit makes sense

In ME1, everybody wears armor. In airless or otherwise hostile environments, everybody wears a full helmet. In ME2, Miranda wears a catsuit all the damn time, and her hostile environment gear consists of a breath mask. Don't fucking tell me her genetically-enhanced eyes can withstand hard vacuum and chlorine gas. Piss off. Same damn thing with Mordin. Jack wears even less. Grunt wears a full helmet, but leaves his biceps exposed. That's excusable, since he's a krogan. Garrus and Shepard are the only ones who wear full armor with a full helmet in hostile environments. For some retarded reason, though, Garrus keeps the suit of armor that got shot up by the gunship instead of getting a new one. WTF?

CHANGE OF CONTROLS ARGCSADG$#@$#%YE^

In ME1, the R key throws a grenade. In ME2, it reloads your weapon (see above). In ME1, holding down the shift key causes Shepard to sprint. In ME2, it pauses the game. In ME1, pressing the space bar does nothing. In ME2, it does one of four things depending on context and whether it is held down or not. In ME1, pressing the E key activates an object. In ME2, it does nothing.

WHY THE FUCK DID YOU FUCKING CHANGE THE FUCKING CONTROLS LIKE THAT, EA? FUCK!

BUGS BUGS BUGS ARGCSADG$#@$#%YE^

Sometimes, ME2 decides that it will take a long time to load areas, regardless of what it needs to load. Restarting the program fixes it. Sometimes, Shepard gets stuck in midair for no good reason. The only solution is to load a saved game. ME2 DLC apparently screws everything up. I once had to play a section of the endgame three times because the first time, a floating platform didn't stop in the right place and Shepard ended up falling into the abyss, and the second time, Legion's AI glitched out, which prevented him from moving to the position he needed to move to in order for me to progress. I think telling Legion to use its sniper rifle was what triggered the glitch. Bah! The ME2 character screens have gotten quite laggy recently. I blame the DLC. During the last part of Garrus' loyalty mission, there's a bizzare hall of mirrors sort of effect in the background. WTF?

Conclusion

When I wrote this, Mass Effect 3 had not yet been released. I expected ME3 to continue the downward slide, and I planned to buy it purely out of a sense of obligation. I felt compelled to see this through to the end. My full reaction will be in my Mass Effect 3 review (which will be publish much more promptly than this one), but the short version is this: "I was pleasantly surprised. Then I wasn't."

Games For Windows Live: a new low for Microsoft

Just when I thought I had a handle on how low-quality Microsoft products were, they found a new way to surprise me. I recently purchased the game "Bulletstorm" on Steam. The game has some pretty tough battles, but the most difficult one was the battle to play the damn game!

After starting the game, I discovered that it is IMPOSSIBLE to play the single-player game without a Games For Windows Live (hereafter referred to as GFWL) account. WTF? After a few Google searches, I resigned myself to creating a GFWL account. I clicked on the "create account" button in the game, and Internet Explorer popped up with a form to fill out. So, I filled out the form, clicked the button to submit it, and...it gave me an error message that basically said "It didn't work. Try again." After several tries, I concluded that it simply wasn't going to work and tried a different tack.

A Google search lead me to the main Windows Live (not to be confused with Games For Windows Live) signup page, so I signed up for a Windows Live account. This, thankfully, succeeded, although I am frankly disturbed by the information they demanded from me. Specifically, they wanted to know my phone number and zip code, and they wouldn't take no for an answer. Fortunately, Windows Live accepted a blatantly invalid phone number and zip code.

I then went back into the game and signed in with my new Windows Live ID. It then told me that having a Windows Live account doesn't give me a GFWL account. So, I went back to Firefox, found a signup page for GFWL (not the same one I did battle with earlier, thankfully), and signed up. I was then confronted with the GFWL profile for a "FourBasilisk38". Huh? Did they give me that name, or did they connect my Windows Live account with some random person's GFWL account? After playing the game for a while, I got a message saying that I had been logged off of GFWL because another person signed on with the same account, so I guess it's the latter. HOW THE FUCK DOES THAT EVEN HAPPEN?

So, here's my advice: if you want to play a game that uses GFWL, pirate it. Trust me, it will be easier.

Update:

I contacted Xbox Live support (since GFWL seems to be under the Xbox Live umbrella--the GFWL sign-up site is at xbox.com). They replied with the following:

Dear Alex,

We understand you have an issue creating an account with Games for Windows Live.

This will have to be addressed by a separate team. You can find the contact information below:

Games for Windows Support

Toll free: (877)-274-4349

Hours of operation:

9 am to 1 am Eastern Time 6 am to 10 pm Pacific Time

If you need to reply to this e-mail, please reply 'with history' (include any previous e-mail) or reference to Service Request Number blahblahblah so we can expedite our service to you.

Thank you for visiting Xbox.com. If you should have future questions on Xbox products or services, please be sure to revisit our Web site as we are continually adding information to enhance our service.

Sincerely,

Xbox Live Support Team

Picard WTF

CenturyLink likes to jerk its customers around

So, today I got a letter from CenturyLink threatening to disconnect my service if I don't pay up. News to me; I have an auto-pay account.

Or at least I thought I did. As it turns out, when I upgraded my service a while back, they decided to give me a new account. I don't think they told me that they were doing so. The certainly didn't have the decency to copy over my auto-pay settings or even ask if I wanted to do that.

So, I went to their website to set up a new online management account. I use KeePassX to manage my passwords. When setting up a new account somewhere, I typically have KeePassX generate a horrifyingly long an complicated password, which I then copy and paste into the password fields. This has worked fine an every other site I've used. Not on CenturyLink's site! It works fine for the "type your password" box, but not for the "type your password again" box! Apparently they use some evil Javascript voodoo to prevent copy/paste (note to nitpickers: I'm pretty sure you can't copy from a password field).

I click the submit button, and the site then tells me that my user ID must be at least 7 character. WTF? WHY? What logical reason is there for that? THE USER ID IS NOT A PASSWORD. BEING DIFFICULT TO GUESS IS NOT ADVANTAGEOUS. After fixing that, I discovered that the section where they say, "You can change your security code if you want to" is, in fact, not optional. If you don't want to change it, you have to type in the existing code. Having a hint for the code is also not optional. My hint is entirely unhelpful for remembering the code. It is extremely helpful, though, for reminding myself how I feel right now.

I finally got the damn site to accept my password and user ID and such, so it then asked me if I wanted to use electronic or paper billing. I chose electronic. It then asked me if I wanted to use paperless (a.k.a. electronic) billing. I said yes. It then gave me this:

WTF

What happens if I click "Save Changes"? Will it apply the proposed change? What happens if I click "Cancel"? Will it forget everything else I've done, forcing me to start over from the very beginning? Also, why the fuck is it asking me this to begin with? I TOLD YOU TWICE, I WANT ELECTRONIC BILLING!

On top of all this, the first time it asked me which kind of billing I wanted, it also asked if I wanted to use auto-pay. I said yes, and it apparently forgot all about that. Also, the site is slow.

This is the sort of shit I expect from Comcast.

Picard Facepalm

Mass Effect

I've got some down time now, and I don't have a computer capable of running Minecraft in a satisfactory manner handy, so I guess I might as well finally write the Mass Effect review I promised. Like I said before, I will try to avoid comparisons to the sequel in this review, since that warrants its own post. Since Mass Effect and Mass Effect 2 are quite similar in some respects, that means there will be a bit of copy-and-paste. Deal with it.

Here's the short version: Mass Effect is one of my favorite games of all time.

Mass Effect is a shooter-RPG that follows the rise of Commander Shepard, a human soldier who lives just a few decades after humanity makes first contact with aliens. At the beginning of the game, Shepard is fairly well-known within the human Systems Alliance (exactly what he is known for is chosen by the player). After talking to a few characters right at the beginning of the game, it is soon revealed that Shepard is being put forth as a candidate for the first human SPECTRE. SPECTREs are basically elite operatives who answer directly to the Council, a small group of people who basically run the galaxy. In the process of becoming a SPECTRE, Shepard uncovers a thoroughly dastardly plot, and most of the game revolves around foiling it.

Like ME2, this is a Bioware game. Like most Bioware games, its story and dialog are superbly written. The characters behave in a fairly consistent manner, and they usually say sensible things in a sensible way, although there is one part where Shepard starts making wild assertions based (at that point in the story) largely on hearsay and speculation. The build-up to the game's climax is very well-done, and it makes the end feel like a truly great achievement.

The characters in the player's party have well-defined personalities and well-written dialog. Their outfits are fairly subdued, but they all wear armor while out on missions, and that leaves lots of room for differentiation: Mass Effect has a staggering array of weapons, armor, and upgrades that can be purchased or looted from fallen enemies (or from locked safes and crates, if your decryption skill is high enough). Usually, each character will end up wearing unique armor. Characters wear helmets when ordered to do so or when in hostile environments.

Combat is fairly standard cover-based shooting. Biotic (aka space magic) and tech powers are not particularly flashy but have fairly large areas of effect, making them useful for managing large numbers of enemies. Weapons have unlimited ammunition, but rate of fire is limited by their ability to dissipate heat. This adds an interesting tactical dimension to combat: you can fire slowly and deliberately to avoid overheating your weapon, or you can charge into the fray, firing until your weapon overheats, and then duck behind cover (or switch to a different weapon) until it cools off.

Interacting with NPCs is more evolved than standard RPG fare. You still have a standard dialog tree, but the options are arranged on a wheel, with three on the left and three on the right. Generally speaking, the options on top are the "nice guy" options, the options on the bottom are the "jerk" options, the middle option on the left is for more information, and the middle option on the right is a neutral response. The options on the top left and bottom left typically require Shepard to have a certain level of skill in Charm or Intimidate. Paragon or renegade points (obtained by choosing the "nice guy" or "jerk" options in certain scenarios) determine how far Shepard can advance in these skills. Paragon and renegade points form a sort of morality system, but not quite like what you find in, say, Knights of the Old Republic. It's a given that Commander Shepard will save the galaxy; it's just a question of what the price will be. As the inimitable Ben "Yahtzee" Croshaw put it, the paragon vs renegade choice determines whether Shepard takes after Captain Picard or Dirty Harry. That said, going pure renegade results in a Shepard who is an utterly heartless asshole.

Environments in this game are fairly varied, although most environments outside of plot-related missions are just variations on one of a few themes. Usually, non-plot-related missions happen on the surfaces of planets or on spaceships. The spaceships, unfortunately, are all more or less identical, with only the arrangement of crates in the main area to differentiate them. Planet surfaces vary from planet to planet, with some having more extreme terrain than others. Exploration of a planet is done by driving around in the Mako, which is basically a light tank with wheels. This gives the game universe a sense of grand scale, although the vehicle physics are...lacking. Yahtzee was spot-on when he compared the Mako on a planet to a shopping cart in a bouncy castle. In the grand scheme of things, though, it's not that bad, and I think it's a completely acceptable price to pay for the sense of scale. The things found on planets tend to be mines, surface buildings, and bunkers. These are also all largely the same, but there is a bit more room for customization inside them, so the sameness isn't quite as annoying as with the spaceships.

In terms of choosing locations to visit, most of the galaxy is available right off the bat, and the star systems that aren't available are unlocked with considerable regularity. You don't have to worry about fuel or anything like that, so you can go wherever you want, more or less whenever you want. This also contributes to the sense of bigness and freedom.

The minigame used for opening locked containers, bypassing doors, and other such things requires a decent amount of skill and quick reflexes, which makes it feel like a real accomplishment to open a secure crate. Helpfully, the difficulty of the minigame decreases according to the party's skill, not just Shepard's skill. Unhelpfully, it seems (at least on my computer) to be inexplicably laggy. It's just some circular arcs rotating in a few concentric circles; it's not like it uses cutting-edge graphics. Maybe it's better on the XBox. In some situations, such as marking a mineral deposit or retrieving an artifact, the minigame can be attempted as many times as the player would like. In other situations, such as unlocking a door, you only get one try, but the lock can be immediately opened with omni-gel, which the player sometimes finds in the field, sometimes receives as a reward, and can produce from unwanted weapons, armor, and upgrades.

Gaining a level does not provide a whole lot of benefit on its own, but it happens quite frequently (at least once per mission, even on the little side-missions). This provides a rather nice sense of progress over the course of the game, and while entering the endgame just one point away from maxing out a skill (or reaching a point where a new (or improved) ability is granted) is a bit disappointing, it doesn't make enough of a difference on its own to be really aggravating.

Gathering resources is quite easy, since there are only two: money and omni-gel. Omni-gel is sometimes found in the field, but money is found almost everywhere, and selling unwanted weapons and armor is fairly profitable. With the perks available after completing the game once, I have not found it particularly difficult to max out my money by the end of the game in subsequent playthroughs. Omni-gel's rarity is compensated for by the ability to produce it from unwanted weapons, armor, and upgrades. I often find myself with some weapons that are worth so little in cash that it is more economical to turn them into omni-gel. The end result is that you earn resources simply by killing enemies and looting their bases, which makes it fun.

Mass Effect has an annoying crasher bug, which mostly seems to be triggered by interrupting a character's dialog animation, but that's the only bug I have encountered. There is also a bug in which one character's face always has a low-resolution texture, which is annoying but not as bad as a crash. What really bothers me about the low-res-face bug is that the developers claim that fixing it would necessitate a multi-gigabyte patch. I shudder to think what sort of programming horror causes that.

As in ME2, the graphics are good but not spectacular. Pretty pictures are not the point of Mass Effect.

Overall, it's a great game, and well worth buying. Of course, buying it now means that you are giving money to EA, but it's still a great game, and I heartily recommend it, especially if you liked Knights of the Old Republic.

HP OfficeJet Pro 8000 Password WTF

WARNING! If you have an HP OfficeJet Pro 8000 and want to secure its web-based mangement interface, please note that it will only accept 15 characters for the password. If you enter more than 15 characters, the additional characters will be ignored. If you enter the additional characters when attempting to log in, you will be unable to log in. This leads to an utterly maddening scenario wherein the user enters a password and then attempts to log in with the exact same password, but the damn thing rejects it.

This is NOT MENTIONED ANYWHERE on the password change page. WTF, HP?

Ecosmart CFLs

Ecosmart fluorescent bulbs are crap. They produce a blueish light that is not very appealing at all. The only nice things I can say about them are the following:

  1. They are cheap.
  2. Assuming the packaging does not contain blatant lies, they will operate in -20 degree F temperatures.

GE Energy Smart CFLs have a much more pleasant color temperature and are not too expensive.

On rubber-stamp approvals

I found a reference to this on Planet Ubuntu. It reminds me of something Yahtzee once said. It was something to the effect of, "The worst thing you can do to somebody is to tell them that their work is good when it's not." Constructive criticism is called that for a reason: you can learn a lot when somebody tells you why your work is not up to snuff.

Skype and Microsoft have something to hide

Evidently, Skype and Microsoft have something to hide.. Why else would they go to such lengths (the Skype software itself does some things often seen in malware) to prevent people from figuring out the digital language Skype uses to communicate? Don't tell me it's for security; that's hogwash. Security by obscurity is useless. I suspect that they are placing more trust in the client software than they should, and they don't want to people to find out how flimsy the whole system is (if this is the case, then China probably already knows about it and has a plan to exploit it). They could also be trying to conceal a backdoor added for (ostensibly) use by law enforcement (in which case China probably uses it to crack down on dissent). Or, it could just be that they don't want to let anybody else make Skype client software so that they can maintain their iron grip on the whole system. Regardless of the reason, their behavior is awfully suspicious. I don't trust Skype, even more so now that Microsoft owns it.