Tuesday, June 26, 2007

Why Is My Computer So Slow?

The list of computers I've owned and used over the years almost sounds like some kind of computer museum. It includes (but isn't limited to) the following:


My early computers (the TRS-80 Color Computer and Commodore 64) were great machines, but even I'll admit they only had enough power for one person to run one application at a time (generally speaking). (Yes, I'm aware there were multi-user, multi-tasking operating systems available for the TRS-80 Color Computer and the Commodore 64, but I'm aiming this article at a more general audience.)

The Fat Mac and Amiga were another story. They easily had enough power for one person to run multiple applications at the same time, those applications being reasonably modern (GUI based). They also had enough power for dozens of users to run simple (likely text based) applications at the same time (though you would need to install an alternative operating system on the machine).

Jump to the 25 MHz 80386 and 90 MHz Pentium, and we're entering a new realm of power. These machines, when using the right operating system, could handle multiple users running multiple applications at the same time, those applications being reasonably modern (GUI based). In fact, the 90 MHz Pentium has enough power to handle the needs of most modern users: web browsing, email, word processing, even listening to music. (To be fair, though, decoding MP3 audio requires enough power that it would cease to be a good multi-user machine).

Enter the 600 MHz Pentium III, more than enough machine for, most likely, 95% (or more) of the computer using population. Decode MP3 audio? No problem. Watch HD video? No problem. Unless you're editing your own movies, this machine probably has all the power you need (and then some).

Last, but not least, the AMD Athlon 64 3200+. By today's standards (at the time this article was written, June 2007), this machine is already starting to show its age, but it's a beast with some serious power. With the right operating system, it could easily support dozens of users running multiple applications at the same time, those applications being very modern (GUI based, with all the bells and whistles).

And yet, too often, the performance disappoints. I type a few letters into my word processor, and at that exact moment, the operating system (Windows XP Professional) decides I'm less important than something happening in the background, and I see a noticeable delay before my typing appears on the screen. Perhaps I restore a program that's been minimized and idle for a while, and wait while the hard drive grinds and brings my application back up (and, in case you're interested, I never exhaust the physical RAM in this machine, which has 2 GB). Or perhaps I decide to listen to some music in iTunes, and watch it slowly boot up. There are many other examples of the computer being just plain lethargic.

What's going on here? We all have the equivalent of supercomputers on our desks, with far more power than we really need. How could it be that we ever wait so long for such mundane things to happen on our computers?

A big part of the problem, probably the primary problem, is the operating system (usually Windows). It should be smarter. The computer is our electronic servant, and should always give their owner a higher priority than, well, anything else. For example, I should never see a delay while typing in my word processor. I should never encounter a delay while restoring an application that's been idle for a while (unless I exhaust physical RAM and it has to be restored from disk, but once again, I never exhaust physical RAM). Microsoft is obviously doing something terribly wrong inside Windows.

Another part of the problem is software development. As computers have gotten faster, software developers have used increasingly easier computer programming languages. There are a lot of advantages to using languages that are easier to use and faster to develop with, but each and every user of your application pays a performance penalty. Perhaps too much of a performance penalty in some cases? I love the safety and ease of use of these modern languages as much as the next software developer, but frequently, I can't help but think that perhaps my users would be better served if I was using a more efficient language, even if it made my job harder.

If you'd like to get a taste of the kind of speed and responsiveness you could see from your computer if you were using more efficient software, consider giving Damn Small Linux a test drive. It's a very small, efficient operating system, but also very capable and powerful. I've got it booted right this minute, with a few applications running (including the Firefox web browser), and the entire thing is consuming just 50 MB of RAM. In fact, the entire OS itself (with all sorts of handy applications) is just 50 MB -- about 1/14th the size of a single CD.

The next time you ask yourself, "Why is my computer so slow?", you should already know the answer: Because the people who wrote your operating system and your applications decided their time is more important than yours. You might want to consider using more efficient operating systems and applications.

Friday, April 13, 2007

TV on a Cell Phone?!

I guess I first really noticed this while watching American Idol on my real TV. They were advertising that you could watch video clips on your cell phone. Lately I've seen and heard commercials for Verizon's VCast videos. They're talking about it like it's the greatest new technology on Earth. Hooray! You can take video with you! See what you can watch 48 hours in advance!

I find the whole thing ridiculous.

Not only are cell phone screens way too small to be useful as a streaming video player but is it really necessary to have video available to you at all times? Has our society gotten so dependent on not being bored that we have to have something entertaining every second of every day no matter where we are? We gotta have iPods in our ears at all time, cell phones that can surf, IM, and play videos, GameBoys and PSPs to play games, and Blackberrys so we can do business anytime anywhere. Ever wonder why, as a society, our attention spans are getting shorter and we seem to have much less patience?

I don't. We're training ourselves.

Tuesday, April 03, 2007

When is the last time you had fun programming?

Ask yourself that question. Be honest with the answer.

If your answer is something similar to, "It's been a long time since I had fun programming," you owe it to yourself to check out the Python programming language.

Even though I have my doubts about dynamically typed programming languages in general, I have to admit that learning to program in Python, and programming in Python, is just plain fun. It's easy to get started: Just download and install Python, and hop into the interactive interpreter. There's an excellent Python tutorial to help you get started, and even a free, high quality online book.

The Python interactive interpreter is a big part of what, for me, makes Python so much fun. It reminds me of programming BASIC on the Commodore 64 in the early 1980s. The Python interactive interpreter gives you that kind of instant gratification. (With suitable apologies to anyone under 30 years old, who probably has no idea what I'm talking about.)

For example, let's say you're starting to learn about Python lists. Instead of flipping back and forth between an editor and running your Python program to check the results, you can experiment with Python lists right in the interactive interpreter. Here's an example:

>>> mylist = ['one', 'two', 'three', 'four']
>>> print mylist
['one', 'two', 'three', 'four']
>>> mylist[1] = 'TWO!'
>>> print mylist
['one', 'TWO!', 'three', 'four']

This kind of experimentation in the interactive interpreter saves a lot of time. It's also a good way to learn how different functions behave in Python. Here's another example:

>>> myfile = file("hello.txt", "r")
>>> line = myfile.next()
>>> print line
hello world
>>> myfile.close()

You can even ask the interactive interpreter for help on objects and methods:

>>> help(file.close)
Help on method_descriptor:

close(...)
close() -> None or (perhaps) an integer. Close the file.

Sets data attribute .closed to True. A closed file cannot be used for
further I/O operations. close() may be called more than once without
error. Some kinds of file objects (for example, opened by popen())
may return an exit status upon closing.

The standard Python library is also quite comprehensive. You'll find support for just about anything you might need to do. For anything not built into Python by default, you can probably find a Python library that does what you need.

The community support for Python is impressive, too. If you have a question about Python, type your question into Google and you're likely to get a relevant result in your first search results page. You can also ask the friendly people at comp.lang.python on Usenet (though, admittedly, some of them are misguided and solidly in the "Python can do no wrong!" camp, or the "Why would you want to do that anyway?" camp -- you can identify and ignore them pretty easily, though).

In case you're worried or wondering, Python is plenty buzzword compliant. Dynamically typed, garbage collected, object oriented, etc. It's also very portable: You can run Python on your Java Virtual Machine (thanks to Jython) and on your .NET runtime (thanks to IronPython), as well as running the standard Python interpreter. Projects are well underway and making nice progress that enable you to compile Python to native code, as well.

If your corporate software development has you singing the blues, and you feel like bringing back some of that magic you used to feel when writing software, give Python a test drive. The worst that can happen is you waste a few hours, and the best that can happen is you'll discover a new, favorite programming language.

Friday, March 02, 2007

Libraries: Java vs. C and C++

Java is bloated. I hear it over and over. I hear it from colleagues; I hear it from C programmers, I hear it from C++ programmers. I hear it from Java programmers. I even hear it coming from my own lips (or typed from my own fingers), even though I generally like the Java programming language!

And, to be honest, the fact that Java is bloated is becoming increasingly irrelevant (though, to be honest, it's not always irrelevant -- sometimes you really do need all the performance you can muster and/or and the smallest executable you can achieve).

However, having been a software developer as long as I have, I can still remember the Assembly vs. C wars, and the C vs. C++ wars. The wars stay the same, only the names change: Now it's usually C++ vs. Java, with the C++ advocates on the side that always seems to lose.

With Great Bloat Comes Great Power!

One of the reasons Java is bloated is actually one of its greatest strengths: the standard Java library.

I had a (very brief) debate with someone on Usenet regarding libraries. He was trying to convince me that the fact that C came with a very spartan standard library wasn't a disadvantage. He felt it was advantageous: It keeps C small and agile, and gives you a lot of third party libraries to choose from, so you can be sure to choose the very best. I'll admit that there's some small truth to his argument, but the disadvantages outweigh the advantages in most application domains, as I'll attempt to show here.

When Will I Actually Get To Start Coding?

To complete any non-trivial application in C or C++, you need to involve a lot of libraries. You may end up needing GUI libraries, database libraries, scripting language libraries, arbitrary precision math libraries, collections libraries (this being more true of C than C++), networking libraries, security libraries... The list goes on and on.

In the world of C and C++ development, each of those libraries may, in turn, depend on other libraries. You pretty quickly end up in a hell of spaghetti dependencies. Just look at any non-trivial Linux application. The dependency tree on many of them will blow you away.

Of course, if you're being diligent, you'll want to evaluate multiple libraries in each category, right? You need a GUI? Okay, no problem: Do you use Qt? How about Gtk+? Have you considered wxWindows? Maybe FLTK? <Insert a dozen more GUI libraries here!>

Qt looks nice, but... Oops, your budget is small and Qt is expensive, really expensive. No problem, we'll use the free (GPL licensed) version of Qt. Oops, the onerous restrictions of the GPL doesn't meet the requirements of your company? That's a shame. Let's try Gtk+.

Oh dear, the latest version of Gtk+ has a security advisory out against it? Wait, it's not the Gtk+ library itself, but a library the Gtk+ library itself depends on? Better keep track of all those dependencies...

Bah, let's try wxWindows. Happy days, it looks like the wxWindows library will meet your needs!

Aw, darn it. wxWindows doesn't support all the platforms you're targeting. Back to the drawing board.

Now repeat this exercise for the dozen or more libraries your application may require. Good luck finding some time to actually, you know, start coding your own application. (And, yes, I'm exaggerating a little bit to make my point. Sue me.)

Java, on the other hand, comes standard with Swing for your GUI; JDBC for your database connectivity (or even Dirby if you need a lightweight database); a JavaScript interpreter for scripting (Rhino); arbitrary precision math APIs, collections APIs; networking APIs; security APIs; etc.

All of a sudden, the burden of evaluating libraries, researching licensing issues, tracking dependencies, ensuring platform support, and keeping abreast of security vulnerabilities has dropped to zero. You work has been reduced to making sure an appropriate Java Runtime Environment is installed.

Every developer probably already knows this, but Sun also offers Java with an extremely generous license (free as in beer). This includes the development kit and the runtime environment.

Starting with Java 7, Sun even plans to release Java under a license that should make most Free Software advocates happy. There won't be any barriers to anyone shipping Java with their operating system, whether it be Windows, MacOS X, Linux, BSD, etc.

Conclusions

In any case, I hope I've made my point. The rather spartan standard libraries that come with C and C++ are a huge disadvantage in many application domains, putting a much greater burden on the developer. I'm convinced C and C++ still have their place and will still be in active use decades from now, but a huge number of applications are better built on higher level languages with massive (read: bloated) standard libraries.

Go Bloat!

Monday, February 26, 2007

Where are all the fancy schmancy graphics?

And where are the real links? We mention a lot of stuff here and we never seem to link up the stuff.

No graphics. No links.

I would love to add a bunch of sweet looking eye candy to this blog but the reality is that I suck at graphics. I could spend hours putting graphics together but I'd much rather spend it doing something else. Like writing here. Or playing guitar. Or playing a board game. Or watching the Osca...er...wait. I'd rather make graphics than watch the Oscars. But not American Idol! I'm a sucker for that show.

As for the links? I'm still not sure I want to litter my blog with tons of links. They're distracting in a paragraph and usually take something away from the meaning of it. They focus the reader on the links rather than other parts you may want to emphasize. I'll try to make them more subtle with the CSS and if that doesn't work I may put the links at the end of the text in each blog entry.

Friday, February 23, 2007

FYI, I've opened the comments to anonymous users. If this becomes a problem I will have to change it back to registered users only. Let's hope for the best!

Decaffeinated

A couple weeks ago I had a life changing event. I was home alone with the kids and completely out of Pepsi. I don't drink tea or coffee so I tried to go without the caffeine. I was doing alright until about 1 o'clock when I started getting the dreaded lack-of-caffeine-headache. At that point I should have packed the kids up, gone to the store, and gotten some caffeine. But no, I decided to stay the course and wait for my wife to come back with some Pepsi.

Bad plan.

The headache kept getting worse. By the time I finally decided to take some ibuprofen for it I realized we didn't have any of that either. Shortly after that my wife arrived with some Pepsi which I quickly opened up and gulped down. Then I went to lay down for a while and wait for the headache to go away.

Wrong.

It kept getting worse. And I had to go to the bank. I grabbed another Pepsi and went up to the store to buy some Ibuprofen. My headache was so bad at that point my vision was starting to deteriorate. Fortunately the grocery store is only a few block away. I got the pain killers, went back out to my car, took 3 or 4 and slammed down some more Pepsi. Then I proceeded to the bank -- painfully. When I got there I felt like throwing up but they didn't have a public restroom (small town bank). So I finished my business there and went back home. When I got home I lied down for a short time and the nausea went away.

After a while I was finally able to sleep. A couple hours later I awoke to a very minor headache and an incredibly valuable lesson learned.

There's really no punchline to go in here. It was the most miserable day in recent memory. I don't get migraines but I suspect what I got was much like one. I don't think I have ever felt pain that bad in my life. The lesson?

Caffeine wreaks havoc on your body.

On that day I vowed to myself that I would never have that kind of reaction again to the lack of caffeine and the only way to do that was to break my addiction. Was it a combination of factors? Possibly. But it certainly wasn't worth taking that risk.

So I quit. It took a long time to do it and it wasn't without moments of minor headaches. I had to slowly wean myself off of it. Every day I'd drink less caffeine and wait longer between feeding it to my body. Eventually my body adjusted, grudgingly.

It's Friday and I had a Coke this morning. Before that I had one Wednesday afternoon. Before that it was Tuesday morning. I didn't drink one this morning because I was getting a headache. or because I'd get one if I didn't . I drank it because I like the taste. But I realize that if I have another one today I could fall into bad habits. This isn't going to be easy. When this 12-pack is gone (only 2 left) I'm going to get decaffeinated cola drinks. That'll be good.

The caffeine is still pulling at me. I'm craving one right now. But I'm not going to risk getting that kind of headache again. Not ever.

Monday, February 12, 2007

Memory Management: C vs. Java

Like many other companies, the company I work for decided to move from C to Java. There were a lot of good reasons for the switch. One of the biggest reasons was that we could ditch manual memory management (malloc(), free(), etc.) for automatic memory management (garbage collection).

Garbage collection is usually marketed as having the following advantages:

  • No memory leaks
  • Less development time spent on memory management

Let's examine these claims in more detail.

No memory leaks?

It's not really entirely true that garbage collected languages have no memory leaks, depending on your exact definition for "memory leak". Here are a few ways you can still leak memory in garbage collected languages like Java:

  • Accidentally keeping object references in collections.

    Garbage collected languages induce a false sense of security in many developers. I've seen code that leaks memory by the megabyte because of developers forgetting to remove object references from collections when they're done with those objects.

  • Forgetting to release non-memory resources which themselves have allocated memory "under the covers".

    Many APIs, such as AWT, Swing, and JDBC are partially implemented in native code. That native code often allocates memory from the operating system. If the application fails to release one of these kinds of resources, memory is leaked more often than not.

It's worth pointing out that I'm not suggesting garbage collected languages are just as likely as non-garbage collected languages to leak memory. I'm just trying to show that garbage collected languages can also leak memory.

Less development time spent on memory management?

There's no doubt that it takes more time to write software that does manual memory management. After all, those developers have to take the time to think about when memory resources can be safely disposed.

There's also no doubt that developers will likely spend less time fixing memory leaks in garbage collected programs. That's because there should be less memory leaks to track down and fix in the first place.

However, there's another issue that's often swept under the rug...

Before switching to Java, the company I work for used to sell products written mostly in C. Not surprisingly, these products had the occasional memory leak. It usually caused quite a stir around the office. One or more developers would spend anywhere from a few hours to several days hunting down and fixing the leak. Manual memory management was wasting our time! Garbage collection would free us from this onerous task!

Fast forward to the present. Hardly a day goes by that I don't hear about our JVMs running out of memory, or our products not scaling well because they consume such a massive amount of memory. It seems like developers are constantly trying to determine where the memory is going and how to use it more efficiently.

All of a sudden, the occasional memory leak doesn't sound so bad. Personally, I'm quite convinced we have more memory problems now than we did before.

Conclusion

To be fair, I can't say with any certainty that massive memory consumption is a common issue in garbage collected languages in general, though it does seem to be a problem with Java in particular. The company I work for has a lot of really smart architects: too smart, if you know what I mean. They're ready and eager to deploy complicated patterns and over-engineered solutions for every problem, which most of us mere mortal developers find really hard and time consuming to maintain.

Apparently, someone forgot to tell them that more time is spent on maintenance than on new development. Writing easily maintainable code should always be priority #1. Using every pattern imaginable isn't nearly as important.

But I can say with certainty that we seem to be spending inordinate amounts of time worrying about the shocking memory requirements of our applications these days. It seems garbage collection isn't quite the panacea that we were sold.

Thursday, January 04, 2007

Using Seams for Test Cases

I promised I'd write something techie one of these days so here it is.  It's a technique I've been using to write unit tests against code that has a problem with dependencies.  Many times this is a third party system or a database with a variable data set that you can't write a good case against.  Michael C. Feathers describes this as a Seam in Working Effectively with Legacy Code (a fantastic book -- buy it).

So let's say you have a class something like this...

    public class Report {
        public Integer[] fetchDataSet() {
            Integer[] lDataSet = null;
            // Go to the DB and fetch the data set (use your imagination here...lol)
            return lDataSet;
        }
       
        public int sumDataSet() {
            Integer[] lDataSet = fetchDataSet();
            int sum = 0;
            for (int i = 0; i < lDataSet.length; i++) {
                sum += lDataSet[i].intValue();               
            }
            return sum;
        }
    }

...and you need to write a test for the sumDataSet() method.  Normally you would write a JUnit test something like this:

    public void testSumDataSet() {
        Report report = new Report();
        int sum = report.sumDataSet();
       
        assertFalse(sum == 0);
    }

The two main problems with this is that it has a dependency on the database and you might not know what the values in the database are going to be so it's hard to make a proper assert.  There may be some cases where a sum of 0 is a valid sum so the assert in the example isn't a valid assert.

Fortunately, this problem is easily solved.  All you need to do is subclass your Report object and replace the fetchDataSet() method with one of your own that returns a set of known values.  It looks like this:

    public class ReportTest extends Report {
        public Integer[] fetchDataSet() {
            Integer[] dataSet = new Integer[2];
            dataSet[0] = new Integer(1);
            dataSet[1] = new Integer(5);
            return dataSet;
        }
    }

Now you can write your test case like this:

    public void testSumDataSetWithoutDB() {
        Report report = new ReportTest();
        int sum = report.sumDataSet();
        
        assertTrue(sum == 6);
    }    

And voila!!  A true test of your sumDataSet() method that has no dependencies and a set of known values you can write a true assert against.  It's a real unit test!  Yes!!

If you have any questions please refer to the Feathers book.  Every group that has legacy code should have a copy of it.  Buy it, read it, live it.

Sunday, December 31, 2006

Quit Stealing my Browser Windows!

These days, a lot of applications open browser windows, for whatever reason. Maybe you clicked on "Help" or "FAQ", and the application politely started an instance of your default browser, displaying whatever it is you wanted to see. And that's great. There's no reason to reinvent the wheel. A web browser is really good at displaying help information, FAQs, and lots of other things.

However, have you ever noticed that if you already have one or more browser windows open, applications will often steal one of those preexisting browser windows? That is, the application has decided that it's time to navigate one of your preexisting browser windows to a different page, rather than opening a new browser window.

Dumb, dumb, dumb.

Happy New Year! :-)

Thursday, December 21, 2006

About a month ago the company I work for changed their name (more like simplified their name) and introduced a new logo. At the big Town Hall meeting where they unveiled the new logo they gave all the attendees some branded merchandise. Cool, right?

The problem is that it was (and you can't make this up) old leftover merchandise with the old logos!

Here was a golden opportunity to give all their employees a bunch of t-shirts, sweatshirts, and hoodies with the new logo that they would wear out in public (i.e., free advertising) and promote the new corporate brand and image.

But they blew it. Utterly and completely blew it.

What's worse is the demoralization effect on the employees. I don't feel like a valued employee by receiving that stuff -- I feel like I'm one step above the garbage dumpster out back. I would have been much happier if the company would have donated that stuff to local charities and then given out nothing.

Wednesday, December 20, 2006

My Love/Hate Relationship with Microsoft

It seems every time they do something really stupid (i.e., Vista) they do something really good for the community. One of those is their constant battles against spam and spyware. I applaud Microsoft for using some of their vast resources to combat these plagues. This is from the SANS NewsBites newsletter which you can sign up for here (it's well worth it).

--Microsoft Wins Summary Judgment Against Man for Selling Spam Lists
(15 December 2006)
A UK court granted a summary judgment against a man who was selling lists of email addresses for use in spamming schemes. A lawsuit filed by Microsoft alleged that Paul Martin McDonald's sale of the lists violated the Privacy and Electronic Communications Regulations. A summary of the case indicates the judge found that "the evidence plainly established that the business of [McDonald's company] was supplying email lists of persons who had not consented to receive direct marketing mail and that it had encouraged purchasers of the lists to send emails to those people."

Saturday, December 16, 2006

The Cell Phone Charger Scam

Just a few days ago, I replaced my old cell phone with a new cell phone.

The good news: It was a free upgrade! (I'm saying that tongue-in-cheek, since cell phone upgrades are typically subsidized by outrageously high monthly service fees. I'm looking at you, Verizon Wireless!)

The bad news: I locked myself into two more years of slavery. Oops, I mean, I signed another two year contract.

Every time I've ever upgraded my cell phone, I get a new cell phone charger, and they're always different. Why don't cell phone manufacturers settle on a standard interface for cell phone chargers? Probably because they make more money when they're all incompatible. Why sell people just a cell phone when you can sell them a cell phone and a charger every single time they upgrade?

To be fair, you can buy universal cell phone chargers that claim to fit most cell phones. Be prepared to pay $20 to $30 for one, though. And remember, there's no guarantee your universal cell phone charger will fit your next cell phone.

It gets even worse when you're talking about car cell phone chargers, the kind that plug into the cigarette lighter jack in your car. New cell phones almost always come with a regular charger (which plug into standard house power receptacles), but they never seem to come with a car cell phone charger. Open your wallet and prepare to pay another $20 to $30 for the privilege of being able to charge your cell phone in your car.

Enough is enough! This time, I'm saying "NO!" to the man! I'm not going to pay $20 to $30 for a car cell phone charger that required maybe $4 to $5 worth of parts! Power to the people! Ahem...excuse me.

This time, I've decided to buy an inverter. For those of you that don't know what an inverter is: It's a circuit for converting direct current (which is the kind of current the cigarette lighter jack in your car provides) to alternating current (which is the kind of current the power receptacles in your house provide). That way, I won't need a car cell phone charger: I can plug my regular cell phone charger into the inverter.

Inverters run about $30 to $50, which is certainly more than a $20 to $30 car cell phone charger, but they also give you a lot more utility, since they can power lots of different devices depending on your need at the time. For example, they can power:

  • Cell phone charger
  • Laptop computer
  • An extra light
  • Video camera
  • Portable DVD player
  • Television set
  • Hand-held games
  • Rechargeable battery chargers

Of course, the list goes on.

Inverters are also bulkier, but if you're careful to buy an inverter with a long enough cord, you can easily stash it under your car seat and mostly forget about it. Also, most inverters can power more than one device at a time.

If you upgrade your cell phone regularly, and each time, buy another car cell phone charger, you should consider an inverter. Do a bit of research and get a quality inverter, and it should be a long, long time before you ever need to worry about buying a car cell phone charger again. And, as I've already mentioned, the extra utility provided by an inverter can be quite valuable.

Thursday, December 14, 2006

I am protesting the current trend of Tiny Font Syndrome and increasing the average size of all fonts on this blog. Sorry tiny font lovers.

Friday, December 08, 2006

Windows XP Professional vs. Ubuntu GNU/Linux

In the not-too-distant past, my hard drive crashed, and that made me sad. It also made me happy, because it gave me an excuse to purchase a larger hard drive. I ended up buying a hard drive with enough space to install both Windows XP Professional and Ubuntu GNU/Linux (which I'll just call Ubuntu going forward).

All of this happened on my rather crappy Dell Inspiron 1150 laptop computer. (Dude, I'm never getting another Dell! Ya, like they care...)

Like most people, I expected the Windows install to be easy, and the Ubuntu install to be hard. To my surprise, the exact opposite happened:

Windows did not recognize my video.
Windows did not recognize my audio.
Windows did not recognize my touch pad (it worked, but none of the advanced features worked).
Windows did not recognize my internal modem.
Windows did not recognize my Ethernet port.

About the only thing that worked out-of-the-box was Windows making damn sure I had a valid serial number.

The last two problems could have been a big issue. Fortunately, I had a USB Flash Drive and another computer, so I could download all the appropriate drivers.

And that I did. Search for driver, download. Search for driver, download. Search for driver, download. Etc.

And then the really fun part. Install driver, reboot. Install driver, reboot. Install driver, reboot. Ah, Windows, how I hate thee sometimes.

After downloading a bunch of Windows patches and rebooting a few more times, I had a fully functional Windows install. A fresh Windows install is a wonderful thing. It boots fast, it uses less than 128 MB of RAM to boot to your desktop, and it runs fast. Too bad it never lasts more than a few weeks, or a few months at most. Why is it that every piece of software on the planet thinks it's so important that it has to install and start parts of itself during system start-up? Sigh.

After a few hours of installing Windows (and a few gray hairs), I installed Ubuntu. It went something like this:

Ubuntu automatically recognized and configured my video.
Ubuntu automatically recognized and configured my audio.
Ubuntu automatically recognized and configured my touch pad (including the advanced features).
Ubuntu automatically recognized and configured my internal modem.
Ubuntu automatically recognized and configured my Ethernet port.

Um...wow?

Not only that, but Ubuntu gives you a real system. That is, it installs a decent (but not overwhelming) array of productivity applications for you automatically. Right after an Ubuntu install, you hit the ground running. And installing more applications is just a few clicks away. It's fantastic.

People sometimes ask me, "Is Linux ready for the desktop yet?" From now on, I think I'll have to respond, "Yes, it is. Is Windows ready for the desktop yet?"

Monday, December 04, 2006

I would like to welcome Ed to my blog. I've known him forever and he's a great friend. He'll be writing occasionally here on many of the same topics that I cover -- though I suspect most of them will be more technical than mine. See his first blog entry below.

I'll try to write some techie stuff soon. Really. I actually do work as a programmer as I have for the last 15 years and I do have some things to offer in the programming world. I hope.

I'll also try to update the look and feel of the site. Right now it looks like a complete n00b put it together. Which is...well...actually true. I'm really not much of a css guy but I'm going to have to learn because I want to change a few things.

Friday, December 01, 2006

Why my next computer won't be a MacBook

Lately I've been wanting my next computer to be a Macintosh. Beautiful GUI, Unix under the hood, Apple hardware. Yummy goodness!

One of my co-workers was kind enough to give me a demonstration of his white MacBook. I was very impressed, but there are a number of things that I didn't like:

  1. The pixels are too small for the screen size.
    Here's the standard response I typically get: Change your font size! Icons in MacOS X are scalable! Etc.
    I know, I know. Believe me, I know. But I still spend a lot of time doing things like browsing the world wide web, and there's a lot of content on the world wide web which (a) doesn't render correctly if you increase the font size in your browser, and (b) has graphics (such as navigation icons) that are fixed size (and often very tiny).
    For most people this probably isn't an issue, but my vision isn't that great.
  2. I don't like glossy screens.
    I'm sensitive to glare. I prefer matte screens. Enough said.
  3. The MacBook only has one mouse button.
    I'm not sure why Apple has been pig-headed about this issue for so long. The utility of a second mouse button is huge. I know there are ways to work around the lack of a second mouse button, but they're simply not ideal.
  4. I'm not happy with the keyboard.
    Some highlights: There are no stand-alone Page Up, Page Down, Home, and End keys. I use those keys frequently. The Eject button is too prominent. Reaching for Backspace results in hitting the CD/DVD Eject button too often.
  5. Smooth laptop surface picks up too many fingerprints.
    Perhaps it's just my Obsessive Compulsive Disorder talking, but I don't want a laptop full of ugly fingerprints.
  6. Lack of built-in analog modem.
    Part of the allure of laptops is their mobility, right? We might want to use them for traveling, right? And the MacBook doesn't have a built-in analog modem?! It just seems like a strange oversight to me.
  7. Strange power adapter.
    The MacBook power adapter sticks out from the wall even farther than typical wall warts. Bad design.
  8. Video adapter needed for external displays (at extra cost, of course).
    Forgive me for having old fashioned monitors and LCD panels. I don't want to pay extra for the adapter. A standard (translation: old fashioned) video port should be built-in.

Despite all these things, MacOS X is so damn good, it almost (almost!) overrides the things I don't like about the MacBook. But that's a subject for a different time. :-)

Wednesday, November 29, 2006

The Grinch

I've always liked The Grinch. I've also always liked Ebenezer Scrooge. Yeah, they go through a rough time in their life (who hasn't?) but in the end they just "Get it".

Unlike most Americans.

Every year I go to the Mall of America/Target/Best Buy and see people frantically buying....stuff. I don't know how else to describe it. It's just stuff. And about 90% of it is crap.

Target sent out a nice looking mini Christmas Catalog last week. It had maybe 40 pages of toys and several pages of coupons for those toys. In the front were the video games and DVDs -- most of which were crap. Followed by about 20 pages of crap toys. Followed by one page of great games from Cadoo. And the last pages were filled with...you guessed it...crap. I just looked at that stuff and stared at how bad it was. I went through the thing again. And again. I shook my head.

I think this sad state of toys started to happen when toys stopped being just toys. It used to be that a Barbie was a Barbie. Sure, you could buy a million outfits for Barbie but that was the whole point. Now you have Barbie and her 100 friends in 100 different packages. You have Beach Barbie, NASCAR Barbie, Redhead Barbie, Ballet Barbie. You have Barbie video games, Barbie DVDs, Barbie chairs, girls clothing with Barbie on it, Barbie coloring books, Barbie fruit snacks, a Barbie board game, and Barbie tennis shoes (I kid you not). It's freaking everywhere.

And I wish it would just stop.

This world doesn't need Barbie tennis shoes. It doesn't need Barbie fruit snacks. It doesn't need 90% of the garbage that has Barbie's logo on it. It really just needs what it had back in the 70's. A couple of dolls and a million different outfits that kids could creatively mix and match.

And don't think I'm just picking on Barbie. You can apply the same thing to Mattel's other cash cow Hot Wheels. Then there's Bratz and Spongebob Squarepants. Just go to Target or Wal-Mart and walk down the toy aisles. Then go to the kids shoes. Then go to the kids bed sheets. Then go to the kids underwear. Then go to the kids DVDs. You'll see who the offenders are.

But guess where everyone goes for kid's Christmas gifts? Yep, Target. And Wal-Mart. So everyone is most likely to end up with a bunch of junky crap toys to give to kids.

It's not much better at Best Buy. Yes, I'd rather see a kid get a cool MP3 player than a 6-pack of Spongebob underwear. Heck, even a Kidz Bop CD is better than that. But most of the stuff that Best Buy features as gift ideas are equally as crappy as the stuff at Target. Want to buy something for an adult? Hey, he's a John Wayne fan. Maybe score him that Deluxe Box Set of DVDs that he probably already has. Or a cheap MP3 player instead of the iPod he wants. Or a battery-chewing cordless optical mouse (those suck, BTW) to replace his corded one. Can't find anything? No problem! Give him a nice shiny Gift Card. The basic problem is that all the cool stuff in Best Buy that you would really want to receive costs a lot more than most people are willing to spend. The odds of getting something cool from Best Buy from your second-uncle-twice-removed defines zero in the dictionary. He's got $20 to spend and there's damned little in Best Buy worth buying for $20. It's all......yup.......junk.

There's a Revolution Calling

Why does your second-uncle-twice-removed feel the need to buy something for you for Christmas anyways?

Because that's the way the retail industry wants it and it works hard to reinforce the fallacy that Christmas will suck unless you give everyone you care about a gift -- no matter how crappy it might be.

I SAY ENOUGH!!

We need to get back to the basics. Everyone talks about it or knows it but almost nobody does it. How many times have you heard "Christmas is about more than just the gifts"? Prove it! People ask themselves "What would Jesus do?" I can guarantee that Jesus wouldn't be buying a crappy $20 MP3 player or a 6-pack of Spongebob underwear for his second-cousin-twice-removed. And he most certainly wouldn't just grab "whatever" at 4:59 PM on Christmas Eve so he'd have something to give someone.

Let's all take a step back and remember what Christmas is all about and flip the bird to mass commercialization. Buy fewer but more meaningful gifts. Spend more time with the family. Enjoy a great dinner. Sing some carols, play some family games, have a snowball fight. Make a Christmas decoration for next year. Start a new tradition. There are so many wonderful things about the holidays that we shouldn't pollute it with the stress and pain of the commercial aspects.

Happy Holidays!!

Monday, November 27, 2006

Another Reason for Microsoft to Get Bent

As if we needed any more...

If you double-click on an M4A file (standard iPod music file) and don't have iTunes installed then Windows XP tells you that it can't open the file and asks you what to do. If you select "Use the Web service to find the appropriate program" and click OK you get this:

File Type: Unknown

Description: Windows does not recognize this file type.

Microsoft doesn't recognize the file format of the most popular portable music device in the world?? BULL. Microsoft damn well knows what the file format is. They just don't want to tell you to because you might choose an iPod over their crappy Zune.

Tuesday, November 07, 2006

Separation of Church and State?


I voted in a Christian church this morning. I wonder how the local Muslims felt about that? And I wonder how Christians would have felt if they had to vote in a Muslim church? I'm guessing both situations make certain areas of population a little uncomfortable which can affect the voting results.

I would like to see all polling places be either public schools, public libraries, or some other public government building. Keep religion out of it and keep the voting fair for everyone.