An Experiment in LCD TV Repair

Recently, my wife’s grandmother’s completely awesome Phillip’s 47” LCD television decided to go all wonky.  Shipping it for repairs would have cost well over $100 with no guarantee of success, so she just went ahead and bought a brand new 50” LG TV with 3D support and all that good stuff.  She asked if I would like to have the old broken one to see if I could work on it and I said sure.

I got it back to the house a couple weekends ago and learned that the only real problem with it is that the backlighting on the left side of the screen was malfunctioning. With the help of a techy friend I took the back panel off of it, which is something I’d never done before.  I’ve fixed what seems like hundreds of computers, and even some other small electronics and video game consoles, but never a television.  Here’s what we saw when we got in there:

 2011-11-12_16-49-44_820

After analyzing everything for a bit, we deduced a few things.  The green board center-right is the main logic board and receptacle for all video input.  The tan board to its left is the power supply, much like a power supply you’d find in a PC except as a flat board rather than a box.  The large capacitors were a bit intimidating, so we were careful to stay clear of them.  The TV had been left unplugged for 24 hours prior to our opening it, but we still felt like it would be smart to not reach out and grab a giant capacitor.

We also determined that the two green boards on either side, partially obscured by metal covers, are the power inverters for the LCD backlight.  Some Googling told us that the most common problem with LCD screens’ backlighting is actually the power inverter boards, not the bulbs themselves.

I unscrewed the metal covering over the inverter on the right side (which lines up with the left backlight lamps on the front) and saw that it was marked “slave.”

2011-11-12_16-57-02_387

 

The gray-brown cables on the bottom left seemed to carry power from the power supply board.  The black cable with the white plug on the right side carry power to the lights themselves.  And the white cable with the blue connector on the upper left runs directly to the other power inverter, which we confirmed was the “master” in the relationship. 

We further deduced that if the master were defective, all of the lights would likely be out, which wasn’t the case.  If the slave were defective, then only some of the lights would be out, specifically the ones powered by the slave, which was exactly what we experienced when turning the TV on.

I did some shopping around online and was able to find that part on sale for $35 plus $7 shipping.  It arrived after 4 days and my friend and I met back up, with yet another techy friend, and made the repair/replacement.  My dog even helped with the old board:

2011-11-17_22-00-55_20

After the three of us (and the doggy) got everything back together, we plugged it in and hit power and BAM it works like brand new!  We got it moved to my game room and put to some good use:

2011-11-17_20-21-39_960

MISSION ACCOMPLISHED

I’ve now got the PS3, Xbox 360, original Xbox, Dreamcast, and SNES hooked up to it, with plenty more inputs just waiting for more consoles.  I’ve put in a couple hours of Deus Ex Human Revolution and love it on the new screen.  Can’t wait to play some more on it!

Now then, I need to do something super nice for my wife’s grandmother!

Pirates, Ninjas, and C++

Last night, in the C++ course that I teach at a local community college, we worked through a code sample that was a little more interesting than what I’ve done in past semesters.  I like choosing fun examples (i.e. class SushiChef : Person) and generally see good results- the class is engaged in conversation and the code and most students end up learning something new.  Yesterday I decided to try a new example and it went so well that I thought I’d post it here.

The course is more of an introduction to Object Oriented Programming than a strict C++ syntax seminar.  The three big tenants of OOP that we learn in this course are encapsulation, inheritance, and polymorphism.  In my day there was a fourth: data-hiding.  But it’s whatever.  We’re very early in the semester right now so the class is still coming to grips with encapsulation.

To demonstrate a decent use of encapsulation, which is the aggregation of multiple pieces of data and even behaviors into a single entity or “class,” while also showing how encapsulated ideas can work together, I usually set up a Request-Processor-Response pattern of sorts.  One boring example that I did one was a BankAccount (request) gets passed to an AccountValidator.Validate method (processor) and hands back a ValidationResult (response).  Once I did a SushiOrder getting passed to a SushiChef.Prepare method and returning a SushiPlate.  I think you get the idea.

Well the new idea I wanted to try, in the interest of garnering more class engagement, was a Pirates Vs. Ninjas theme.  The idea is that Pirates are bad, and we want to kill them.  We do this by hiring their natural enemy, Ninjas, to destroy them.  And we gauge the resulting attack with a FightResult object.

To explicitly conform to our pattern of Request-Processor-Response, we are saying that:

  • Request = Pirate
  • Processor = Ninja
  • Result = FightResult

There is something fun about the idea of a processor being a Ninja.

Anyway, to keep things simple, we decided that both the Pirate and the Ninja classes should each contain a SkillLevel (int) and that conflict is resolved by checking if the Ninja’s skill level is equal-to or greater-than the target Pirate’s SkillLevel.

I had already decided on throwing a fun wrench into this equation later on by having an IsTurtle property on the Ninja, since we do have 4 precedents of ninjas being turtles, and that any Ninja that IsTurtle will get a 5 point boost on his/her skill level when fighting a pirate.

That was really the only spin I put on the thing, and with hardly any prompting my students came up with some wonderful ideas for extending the example.  Some of them we added to the code, but most we didn’t.  The reason being is that I would like for them to download the source that I wrote last night and implement their ideas.

Before I even had a chance to get to my IsTurtle idea, one of my students raised his hand with the very same notion!  Another student said that the Pirate class should have a boolean for IsDrunk, and I think that might be my favorite line of code I’ve ever written.  Another student wanted to add a boolean HasParrot to the pirate.  Yet another student wanted the Ninja to have a WasSeen flag, which brings up the idea of having style points factor into the equation.  And yet another student had the brilliant idea the if the Pirate.HasParrot then the Ninja.WasSeen!  And if the Ninja is detected then the Pirate gets an advantage- that is one handy parrot!

Again, the code that I demonstrated is very simple and only really the starting point for a much more deep and complex example.  This is deliberate, so that the students (and yourself!) can download it and start tinkering and extending it.  One student pointed out that we had practically come up with a Pokemon game and I hope he takes the code in that direction and finishes it!

So, let’s take a look at the code!  All of this is compiled using Visual Studio 2010, as a 32-bit console app.

First up, here is our Pirate class- this is only the .h file.  The corresponding implementation (.cpp) file is unnecessary as all funtionality here is inline:

#pragma once
#include <string>

using namespace std;

class Pirate
{
public:

    string Name;
    int SkillLevel;
    string Weapon;
    bool IsDrunk;
    bool HasParrot;

    Pirate() { Name = "Black Beard"; SkillLevel = 5; Weapon = "Musket"; IsDrunk = true; HasParrot = true; }
    ~Pirate(void);
};

Next up is our FightResult class- again, all that is needed is the .h file:

#pragma once
#include <string>

using namespace std;

class FightResult
{
public:

    bool Success;
    string Message;

    FightResult(void) { Success = false; Message = ""; }
    ~FightResult(void);
};

Now let’s take a look at the Ninja class, both the .h file and the relevant piece of the .cpp are presented here:

#pragma once
#include <string>
#include "FightResult.h"
#include "Pirate.h"

using namespace std;

class Ninja
{
public:

    int SkillLevel;
    string Weapon;
    float HitFee;
    bool WasSeen;
    bool IsTurtle;

    FightResult Attack(Pirate p);

    Ninja(void) { SkillLevel = 5; Weapon = "Katana"; HitFee = 200.0; WasSeen = false; IsTurtle = false;}
    ~Ninja(void);
};

FightResult Ninja::Attack(Pirate p)
{
    FightResult result;

    int bonus = 0;
    if(IsTurtle)
    {
        bonus = 5;
    }

    if((bonus + SkillLevel) >= p.SkillLevel)
    {
        result.Success = true;
        result.Message = "The Ninja we hired successfully destroyed " + p.Name + " with his " + Weapon + "!";
    }
    else
    {
        result.Success = false;
        result.Message = p.Name + " has killed the Ninja we hired!  Yaarrrrrr!";
    }

    return result;
}

Here is a sample of the test main that we wrote to put these classes to work:

#include "stdafx.h"

#include <iostream>

#include "Ninja.h"

#include "Pirate.h"

#include "FightResult.h"

using namespace std;

int _tmain(int argc, _TCHAR* argv[])

{

    Pirate pete;

    pete.Name = "Pete";

    pete.IsDrunk = true;

    pete.HasParrot = true;

    pete.SkillLevel = 7;

   
    Ninja leonardo;

    leonardo.IsTurtle = true;

   
    FightResult result;

    result = leonardo.Attack(pete);

    cout << result.Message << endl;

    system("pause");

    return 0;

}

And that’s it!  It’s not fancy, but its some straight-forward, basic OOP.  I’ve never seen my class so energized and alive and willing to participate in a code example!

Windows 8 Developer Preview – It’s Kinda Annoying

Earlier this week Microsoft released a preview ISO of Windows 8 with some dev tools for developers to play around with.  This let’s them start building some hype while garnering feedback from the opinionated masses, like myself.  On the whole, I think I’ll like Windows 8 just fine.  The things I take issue with, which I’ll happily enumerate in a moment with illustration, are things that I can likely overlook or just get used to.  I don’t see anything though that makes me think I should jump from Win 7 to Win 8 with the eager anticipation that I had when leaping from Vista (which I consider far worse than WindowsME) to Win 7.

My biggest issue with Windows 8 is that I can’t escape the feeling that it was developed with these people in mind:

As a nerdy developer I feel annoyed by things that “dumb down” the experience for the masses.  It’s just patronizing.  What I want is an OS that feels like it was developed for this guy:

Because that’s pretty much how I see myself.  And I’m sure a lot of people will quickly argue that such an OS already exists, and that all I have to do is download [insert completely obscure Linux distro name here] and then set that up on a separate partition and then once I get the Bluetooth drivers compiled and working from this website [insert the scariest URL you’ve ever seen here], and run these 18 thousand scripts I’ll be in nerd nirvana.  Great. 

So I guess what I want is something that has the kickassery of Linux but the ease of use of Windows… WAIT! DON’T YOU DARE SAY IT!  I sensed you about to write comments regarding the MacOS and I want to stop you right there.  For the cost of a MacBookPro, I could buy two of my current Sony VAIO systems AND a cheeseburger.  If the MacOS would run on this hardware I’d have given it a shot by now.  But it can’t.  Because it’s so freaking limited.  Making it the most expensive consumer OS on the market.  Moving on.

Let’s get back to the point: Windows 8 is weird.  It rides the thin fence between mobile and desktop OS so tightly that I keep wishing it would make up its mind and fall off that fence, on one side or the other, and just be really good at being that one thing and leave it to another version of the OS to be good at the other… just like Win 7 and Win Phone 7.

Here are some of my more specific issues…

The lock screen that exists prior to your login is interesting.  It’s just like the mobile side of things and feels unnecessary on a desktop/laptop, but at least the lock screen is useful for something now I suppose.  However, it is limited in its use:

Lock Screen Limits

Choose up to six apps?  Six??  I want something like WidgetLocker on my Android phone, where I can just keep adding shortcuts and widgets and go crazy with it.  I have what is likely the ugliest lockscreen you’ve ever seen on my phone, and I don’t give a damn because it is functional as all hell!  Six apps?  Please.  With the screen real estate of dual monitors and multicore CPU I think I’d like more than six, dangit.

So no more Start Menu.  Instead I have this:

Metro Start

Great, now my desktop is exactly Win Phone 7.  It’s okay I guess- could definitely be worse- but feels weird to use with a mouse.  It scrolls horizontally, which isn’t the direction I scroll my mouse wheel to make it move.  Odd.  I do like though that all I have to do to get to the run/search functionality here is to just start typing.  That’s cool and a decent design decision.  Except that I use Launchy instead of search, which encompasses everything search can do and much, much more.  And I can’t use Launcy from this screen since this is all Metro and Launchy isn’t.  Dangit, again.

When I click on the IE 10 icon there on the upper left, I get a brief full-screen splash screen:

Giant IE Spash

I would say, “DON’T EVER FREAKING SHOW ME THIS SCREEN AGAIN,” but I don’t have to worry about that because the likelihood of my giving IE 10 a second run is slim.  Chrome exists… so why does IE?  Also, this Metro version CAN’T RUN ANY PLUGINS.  Seriously, if Microsoft tried any harder to push me to use Chrome, they would have to fly Bill Gates to Memphis, have him install Chrome on every computer I touch, while personally telling me how good I look today.  That’s how much I feel like they want me to NOT EVER use IE 10.

Now if I right-click on one of those tiles on the Metro menu, I get a context menu at the bottom of the screen with its own sub-context menu:

Metro Advanced Tile Options

Why can’t that white sub-context menu just popup on the tile where I clicked on it, LIKE EVERYTHING ELSE IN WINDOWS HAS ALWAYS DONE?  Dangit.

I noticed that whatever app I’m in, even the desktop, moving my mouse to the left side of the screen shows me a thumbnail of whatever other process is running and acts as a shortcut to that app:

Left Side Multitasking

WHY?!?  What the crap is that about?  Maybe this one makes more sense with a touch-screen, but I doubt it.  Weird.

Now this one is kinda cool- in the new Control Panel there is a whole section for Send:

Send Options

This lets you control what all apps get displayed as options for when you click a file and tell it to “Send To” a location.  I like that.  Reminds me of the “Share” options in Android, which I’ve always really dug.  Not bad.

Finally, since I have the “Developer” preview, This thing is loaded up with tech previews of Blend 5 and Visual Studio 11, along with this handy Windows App Certification Validator:

Windows App Cert Kit

So this is what I run on my software to get it certified to add to the Windows Store.  I think I like this but I don’t have any code to test out on it yet.  I tried running my LaunchLater software on Win8 but it failed miserably.  I think I know what the issue is so I might code a fix for it and try again soon.  If I can get it to work, I’ll try it out with the certification kit.  Who knows- maybe I can get LaunchLater into the Windows App Store at some point.  Cool.

That’s about it for my first impressions.  It’s been fun to play with even if it has been somewhat annoying.  The issues I didn’t mention here I have attributed to being side-effects of running it inside of VirtualBox, rather than on real hardware.

So that’s it.  What do you think about it?

My Panasonic 3DO Broke, So I Fixed It

Over the weekend my friend and I were playing some epic RoadRash on my classic Panasonic 3DO console.  A few minutes in we noticed that some of the textures weren’t loading.  Then, all of a sudden, the machine froze and then ejected the disc.  Afterwards, it wouldn’t play any games but it would boot fine and the CD tray would open and close like normal.  I tried using a CD lens cleaner but it wouldn’t play that either. 

So I did what any of you would do: I TOOK IT APART AND FIXED IT.

To make this easier on myself, I set the system up on my desk and then set my GameCube-with-built-on-LCD-screen next to it.  I disconnected video from the GameCube and hooked the screen up to the 3DO.  I thought this looked pretty freaking awesome so I began taking pictures.

11 - 1

Once I had everything set up where I could start to disassemble the 3DO and then easily test it out on the little GameCube-mounted LCD screen, I took off the top piece by removing four annoying screws on the bottom.

Next up was this gigantic metallic shield coving the CD drive. 

11 - 1 (2)

I popped it off fairly easily and then had a clean view of the CD tray and lens.  Cleaned the lens and tested again, but no luck.

2011-08-08_18-12-23_897

Every time I’d test, I could tell that the lens’s sliding housing wasn’t moving along its rails.  I used a flathead screw driver to loosen where it seemed to be jammed against one of the rails and it came free, letting me slide it back and forth with ease.  I cleaned the railing as best I could, but I’ll likely have to go back in with a touch of WD-40 at some point.

I hooked everything back up and dropped a game in and guess what!  It worked!

11 - 1 (1)

Mission Accomplished.  Oh- and what was the game I tested it with?

2011-08-08_18-16-50_873

Hell yeah.

Kudos to Google Plus for Phrasing

The Liberated Software blog would like to express great pleasure in the name that Google+ gives to the process by which you can download your account’s data to your local computer.

image

People Jeff Hates – My Blog of (Mostly) Lies

A few weeks ago while discussing a tech issue with my officemate (@thomaslangston), I realized that the best way to convey my thought was to draw it on our whiteboard in Venn diagram form.

We were discussing the issue of mobile location tracking that had just made it into headline news as something that seemed to be universally agreed upon as “bad,” yet I was convinced that there had to be some subset of those complaining people that also use social location services such as Foursquare.  I determined that whoever that subset is, should it exist, is worthy of my hatred.  Thusly, the center, overlapping piece of the Venn diagram in this instance was labeled “People Jeff Hates.”

Now I want to be clear on this point: I’m not a hateful person.  I might curse and use a certain finger at other drivers in traffic on occasion, but really, I’m a pretty agreeable guy.  That’s why we got a good laugh out of the overlap of “People Jeff Hates.”  I’m just not hateful.

The diagram stayed on our whiteboard for a couple of weeks until one day, in another conversation with the same officemate, I realized that I could comically make my point yet again simply by erasing the two outer labels (“People complaining about location tracking”, and “People who use Foursquare”) and replace them with new labels that were relevant to the current conversation.  The humorous bit, again, was that the overlap in the center remained “People Jeff Hates.”

Now that two of these diagrams had been thought up, it became a game to think of more.  The challenge for me is like I said- I’m just not a hateful person.  But, after much effort, I was able to come up with several more ideas, almost entirely tech themed.

Next thing I know, my coworker is drawing them crudely in Gimp and creating a blog for them to live on.  And that’s how People Jeff Hates came into being.

It gets updated each week on Wednesdays and now holds a couple months’ worth of content.  I only have a few more weeks’ worth thought up so I’ll have to go think up more people to hate.  I’ll likely have to occasionally break from the tech-theme and I may even mix it up with some non-Venn diagrams, but we’ll just have to wait and see.

A Year of Launching Later

A Year ago today I released my LaunchLater project into the wild as open source software.  This has been one of the most fun adventures in my career as a software developer.

Since its initial launch, it has gone through several versions.  There have been bug fixes, new features, and improved user interface design.  It has been mentioned on blogs in the U.S., Russia, Brazil, Italy, Slovakia, Japan, Turkey, and even shown up in a video blog from Spain.

It has included code written by one of my coworkers, who added one of my most desired features to the app: the ability to import existing Windows startup items.  Another coworker has forked the project to play with his own ideas of where the app could go.

The app itself has been downloaded over 4,500 times as of this writing, and its source code has been downloaded by over 70 developers.

I’ve gotten to receive and respond to feedback via Twitter, blog comments, Reddit, messages over Codeplex, and conversations with friends and coworkers.

Most importantly though- it does its job well for me.  My Windows-based computers boot faster because of it, and I love that.

Happy Birthday, LaunchLater!

How I Upgraded to HDMI

Last week I upgraded my overly-complicated mixed cable setup in my living room to run almost exclusively off of HDMI cables, and now my wife and I are happier people.

WHY THE UPGRADE?

In a few months I’m going to be moving to a new house and my LCD living room television will be wall mounted.  All of my consoles will be located in either a media box in the wall under the mounted TV, or further below that in a cabinet.  To accommodate that arrangement, I need longer cabling, and preferably fewer cables in general.

Since HDMI is capable of HD video AND audio over a single wire, moving everything to HDMI seemed like the right path to follow.

WHAT’S GETTING UPGRADED?

I previously had a cable box (component based), an Xbox 360 (component based), a Wii (component based), and a PS3 (HDMI + optical audio based) hooked up.  The three component cable based devices were connected to a component switch box that was switched manually.

I plan on demoting my Wii to the game room in the next house, so the only things I want to connect to the TV are the PS3, Xbox 360, and the cable box.  All of them are HDMI ready. 

WHAT DO I NEED TO BUY?

Since I already owned one HDMI cable, I only needed to purchase the HDMI switch with three additional cables.  This gives us a short cable per device, and a fourth longer cable to lead from the switch to the TV.  The switch I bought can be found here.  It provides you with 5 HDMI inputs and auto switching between them.  It will even automatically switch back to a previous input if it detects a feed coming from it after you turn off your current input device, such as switching back to the cable box after the PS3 is turned off.  The switch also comes with an option AC adapter that let’s you control it via remote.

HOW’D IT GO?

It went great!  Should have done this a long time ago!  I’ve been using this setup for over a week now and not once have I needed the switch remote, or even pressed the Select button on the switch.  I was able to get rid of a ton of unnecessary wiring and replace it with much simpler, cleaner HDMI cabling and a switch.

AND FINALLY, HOW MUCH DID IT COST?

The total cost of the switch as well as two 3’ HDMI cables and one 15’ HDMI cable was just over $21 on Amazon.  Not bad, huh?

Crappy old cabling – The pile of cabling and component switch box no longer needed. What a mess!

 

 

 

 

 

 

 

 

 

 

Shiny!  New!  Inexpensive! – The nice shiny new switch with its swank HDMI cables!

My Spoiler-Filled Love Letter to Mortal Kombat (2011)

Go buy this game now if you haven’t already. 

The new MK game, simply titled Mortal Kombat, is a masterpiece.  The controls are spot-on, the graphics and animations are crisp and fun, and the Fatalities are hilarious.  This game has polish that can only be appreciated by those who have been finishing them! for nearly two decades.  I wanted to write this sooner, but I needed the time to truly see the game, and to travel back to my younger years and see the original games through fresh eyes.  There be spoilers ahead, so you have been warned.

***SPOILER ALERT***

I deliberately avoided much of the pre-release hype just so that when I started the single player story mode, I had no idea what I was about to get into.  I wanted to experience it the way the devs had intended.

What I thought was going to be a cheesy storyline with even cheesier voice acting just leading through a series of excuses to play as the game’s different fighters, turned out to be not just that, but so much more.  It only took me a few moments to realize that I was playing through the storyline of Mortal Kombat 1.  Some of the fighters originated in subsequent MK games, but the combat zones and structure of the plot mimicked MK1 perfectly.  I found myself LOVING the cheesiness because it was explanatory now- I was finally seeing WHY the brutal fight with Goro takes place just prior to what I always thought was the much easier final fight with Shang Tsung.  The levels were drawn with such attention to detail and reverence for the original game’s art design that I actually went back and played Mortal Kombat 1.  I noticed things that I hadn’t noticed before in the game because this new game bought it all to such vivid life. 

In 1993 I was twelve years old and in the seventh grade when Mortal Kombat landed on my Super Nintendo.  Today I’m 30 years old, but when I realized I was playing Mortal Kombat 1 re-imagined I felt like I was playing alongside my twelve-year-old self.  This is why I play video games.

Once I progressed the plot past that initial Shang Tsung battle, I realized I was deep within the plotline of Mortal Kombat II and I was utterly thrilled.  MKII is to this day my favorite fighting game.  This new Mortal Kombat is the first fighting game since that fateful release date in 1994 that I have considered being maybe better than MKII.  Just like the combat zones from MK1, the MKII arenas looked fantastic and full of life in the new game.  The storyline continued its B-movie style of cheesiness and I loved it. 

Surprisingly I hadn’t thought about it until this point, but it hit me that most of the characters remaining in the game were from MK3, with the exception of Quan Chi, and I realized that once I defeated Kintaro and then Shao Khan the game wouldn’t be over- instead I would begin the MK3 plot. 

This really shook me because as huge a MK fan as I have been for 18 years, I never liked MK3.  I’d never beaten its arcade mode.  I’d never perfected any of the new combos.  Or is it kombos?  I’d laughed at the poor graphics of the Animalities.  I just never liked the game.  And I knew that I was about to enter into an area of this new game that would hold value to only those who revered MK3 as much as I did with MK1 and MKII.  With great trepidation, I continued on through the storyline and loved it.  There were subtle changes that I did recognize, like Sub Zero becoming a cyborg instead of Smoke, but most of the plot here was new to me and I found myself enjoying it. 

Since finishing the storyline, and loving the moments after the climactic final fight, I purchased the Midway Arcade Treasures game for PSP which contains MK3.  After a good bit of cursing and improving my skills, 16 years after its release, I have beaten MK3.  And I actually like the game now.  It will never replace the grandeur of MKII for me, but I get it now, and I see how well the new game reflected its influence on the series. 

At that point I felt like my life playing Mortal Kombat had come full circle.  I grew up playing the old games.  I grew disinterested in the series starting at MK3, a score that I had never settled.  I fell in love with the new game and its great respect for what had come before it.  And that led me to a new appreciation of the third game in the series, which I had previously considered the beginning of MK’s descent into worse and worse titles.

And there were so many wonderful moments through that new story line.  Johnny Cage quips about calling him “crazy with a K” since all words starting with “c” in the Mortal Kombat universe are converted to k’s.  Motaro, the penultimate boss fight of MK3, who is widely regarded as one of the cheapest and most difficult bosses in fighting game history, is relegated to a background character who is killed off-screen.  His body is shown to the player via cut-scene as a means of saying, “Here, he’s dead, you don’t have to re-live this horrible fight too!”  There are subtle character animations that are reminiscent of moments from the Mortal Kombat film.  There are lines in the cut scenes that conjure memories of some of the other MK games, such as when a reference is made to a “deadly alliance.” 

I kould go on and on, but I’ll stop here.  I kan’t say enough good things about this game.  It truly is a flawless victory.

I’m So Happy You Found A Bug In My Code

Over the weekend I had a POSITIVE EXPERIENCE AS A PROGRAMMER.  So positive that it put me in a chipper mood all weekend- so chipper in fact that several days later I’m still using words like “chipper.”  What could have happened to make me so happy?  Someone told me that I had a bug in my code.

Last year I released the open source application LaunchLater.  You might have heard me blog/tweet/facebook/yell about it.  It has collected over 3800 downloads as of the time of this writing, though I haven’t received a lot of feedback.

The feedback I have received has come in a handful of forms.  First there has been the immediate feedback of friends and coworkers who have used it.  That has been infinitely helpful.  Second, I gave a talk on it at a local .Net User Group meeting last fall and got some wonderful questions and suggestions.  Third, every few weeks or so a blogger or tech site picks up on LaunchLater and decides to put up a post about it.  Sometimes they will leave comments open and I get to see what people are saying about my software on their site.  That has actually led to a couple of current features in the app.

But the feedback I had never received until last Friday was direct feedback from a stranger right on the Codeplex page itself, under the Discussions tab.  A gentleman left me a message to say that so far the app is useless to him, due to a bug that prevents it from launching.  He provided me an error message that had some vague details, and he informed me of his OS and architecture type.   This was a WONDERFUL start.  I wrote back, thanking him for notifying me, and asking him for more info from his Event Log.  He got the info to me in a timely fashion, and by Saturday I had patched the code and provided him with a custom build.  Through further communication he confirmed for me that the bug was squashed, so I released LaunchLater 2.1 to the public!

He further explained why he is using LaunchLater, so that he can more precisely control the execution of the XBMC software on his media center PC.  I’ve never heard from anyone else using the app for that purpose so it was great to hear that my software helped him engineer a better user experience.

The full conversation is open for all to read on the site here.

I have no way to know right now how many others, of those 3800+ downloads, were users who experienced the same issue as this gentleman and simply uninstalled the app and didn’t say a word to me about it.  Maybe none of them, who knows.  But since this one user let me know about it, no one else will experience this bug.

The moral of this story is: when you have feedback for an open source developer, give it to them!  You just might make them so happy that they blog about it!