The Windows 7 Upgrade that isn't

Windows 7 Family Pack box shotA couple of weeks ago, I upgraded my Windows XP machine to Windows 7. I used the Windows 7 Family Pack special, which includes three Windows 7 upgrade licenses in one pack for better value.

Now, the back of the Family Pack box says:

This version of Windows 7 is designed as an upgrade for Windows Vista®. If you are upgrading from Windows® XP, you will need to back up your files and settings and perform a clean install and then re-install your existing files, settings, and programs.
Visit for important information.

Which is completely fine with me, because I always do a fresh install anyway, for performance reasons. So, with all my important data backed up, I formated the disk and proceeded to install.

The initial stages of the installation were pleasantly slick - feeling much more refined than good old XP, but the pleasantries were put on hold when it came time to enter my product key, which was consistently rejected! :(

Read more Comments

Re-scaling QtSvgDialGauge's Tachometer skin

I've been experimenting with QtSvgDialGauge in a personal project, and so far, I like it a lot! :)

For those who don't know, QtSvgDialGauge is nice SVG-based dial/gauge widget, which is part of the Qt Embedded Widget demos. You can see it (and several other embedded widgets) in action in the Qt Embedded Widgets Catalog and Qt Patient Care Demo applications. And you can download the source for both applications here.

Now, the Qt Embedded Widget demos includes three SVG-based skins for the QtSvgDialGauge class: Tachometer, Thermometer, and Amperemeter...

Read more Comments

Pre-pre-build commands with qmake

With most non-trivial Qt projects that I create, I like to include a pre-pre-build command in the qmake project file. I'll explain why as we go, but first off, let's look at what I mean by "pre-pre-build" (it is not at all a standard term).

The typical build process (as performed by make) looks something like this:

  1. For the given target, check if any of the target's dependencies have been updated since it was last (re)built.
    1. If no dependencies have changed, do nothing - we're done ;)
    2. If one or more dependencies have changed, then:
      1. Build each dependent target.
      2. Build this target.
      3. If appropriate, link this target with its dependencies.

That is, of course, a gross oversimplification... but it will do the purpose of this post.

Now, like most Qt developers, I use qmake to generate the Makefiles that drive the build process. Qmake, being an excellent tool, allows you to customise the generated Makefiles in many, many ways. For example, you can add custom commands to be executed just before or after the link step (1.b.3 above) via the QMAKEPRELINK and QMAKEPOSTLINK variables.

However, qmake does not provide a QMAKEPREBUILD variable for adding pre-build commands, and certainly no QMAKEPREPRE_BUILD variable either. The former, it turns out, is pretty easy to achieve anyway, but the latter (the topic of this post) is a little bit trickier.

Read more Comments

1M+ Spam Emails Per Month!

Whoa!! I just got a rather surprising (to me) warning from Gmail. It reads:

You are almost out of space for your Gmail account.
You can view our tips on reducing your email storage or purchase additional storage.

As I said, this was a bit of a surprise to me. When I first began using Gmail, I kept a close eye on my storage usage, but it used to climb so slowly that I soon forgot all about it. But upon seeing the above message, I quickly glanced down to read:

You are currently using 6989 MB (95%) of your 7356 MB.

Read more Comments

Getting Chromium

Chromium Logo
Since Google released Chrome last year, I've gotten used to regularly using two browsers on my PC: Google Chrome for all of my "simple" personal browsing such as webmail, and Firefox for more advanced browsing such as website development. This also tends to create a nice separation of personal (Chrome) versus work (Firefox) tasks.

However, one thing that has bothered me for some time is the (slightly) proprietary nature of Google Chrome... don't get me wrong, Chrome is built from the opensource Chromium project, so it's not all *that* proprietary, but still, something does not quite sit right with me.

Read more Comments

Friends with blogs

A few of my friend's have their own blogs now. So I thought I'd add a simple Friends' Blogs page to my site... which I did ;)

See /node/142 (or the menu links at the top of the site).

If you know me personally, and also have your own blog, then let me know and I'll add ya to the list ;)

Read more Comments

Solid State Media PC build: Part 2

Back in part 1 of this build, I ran in to some overheating concerns with the northbridge. So I decided to try a passive tower cooler for both the north and south bridges.

So here's the new parts that are ready to go... from left to right, they are:

Read more Comments

Improving Apache's canonical hostname rewrite rules

According the the Apache URL rewriting guide, the way to handle Canonical Hostnames is like this:

RewriteCond %{HTTP_HOST} !^fully\.qualified\.domain\.name [NC]
RewriteCond %{HTTP_HOST} !^$
RewriteRule ^/(.*)$1 [L,R]

Well, those rules are not always sufficient. Specifically, what if you also owned the domain, and wished to redirect it also to the primary domain? The solution is simple - we just need to add a single $ character to the end of the match-pattern of the first RewriteCond like this:

RewriteCond %{HTTP_HOST} !^fully\.qualified\.domain\.name$ [NC]
RewriteCond %{HTTP_HOST} !^$
RewriteRule ^/(.*)$1 [L,R]

Now that will work nicely as long as the hosts use standard ports (ie 80 for HTTP, and 443 for HTTPS). However, some Python versions unnecessarily append the standard HTTPS port number to the Host HTTP header. Also I discovered today (after some Apache debug logging) that Adobe AIR applications have the exact same misbehavior for HTTPS, but only when running under Mac OS X.

Read more Comments

My new Drupal theme

I've thought about creating my own Drupal theme for this site for sometime now, but haven't really found the time and motivation to get started. That is, until my friend Mike recently radically altered his blog by creating his own Drupal theme. Well, that inspired me to finally have a go at replacing this site's much-loved default "Garland" theme.

Well, after some initial head-scratching, I was pleasantly surprised to find out just how easy it can be to theme Drupal sites! My new theme, for example, is done entirely with three CSS files, and two images.

Read more Comments

PDF Alchemy

PDF Alchemy is an interesting new service that I've helped to build. It's a PDF conversion service aimed at developers - that is, it's entirely API based, and not intended for end users. But what makes PDF Alchemy interesting to me, is the way it uses a number of Amazon's cloud services.

To start with, the PDF conversion servers themselves run on Amazon EC2. EC2 is an excellent match here, since it allows PDF Alchemy to easily, and rapidly, scale to handle almost any possible volume, but also to then scale back again during off-peak periods.

Read more Comments