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!

Follow

Get every new post delivered to your Inbox.