Detecting the presence of a given font in .NET
Maybe this seems obvious to other people, but I couldn't find anything in Google on it. Maybe I didn't know the right keywords to search for.
At any rate, lets say you have an application that's optimized for a specific font -- but you can't guarantee that font is installed. You might want to, as a contingency, fall-back to a different font -- maybe one that isn't quite as attractive, but that you know for sure will be present. This other font might have slightly different sizing, so in the case where you fall back, you might want to tweak your UI widgets, or alignment margins and widths, to look better if the fall-back is used. Here's my solution (C#)...
Font fnt = new Font("GoodLookinFont", 10);
if (fnt.FontFamily.Name != "GoodLookinFont")
{
//adjust display for fall-back font
}
What happens is simple: .Net attempts to create a Font object using your preferred font. If it can't find that font on the local system, it will instead create the Font object using "Microsoft Sans Serif." If the Font object's FontFamily Name is not what you expect, you know you'll have to adjust your display.
Leopard doesn’t quite stack up
I'm a Mac fan boy, and I'm very tolerant of change. When the Mac using world screamed when they replaced OS 9 with OS X, killing a lot of the nice functionality in OS 9 in favor of a brand new OS, I drank the kool-aid and made the change as soon as I could.
And I've been a big fan of each major revision of X -- and have run all of them right out of the gate, warts and all. But I'm not sold on Leopard.
The loudest touted features are either useless, or already existed in 3rd party apps for 10.4.
- Spaces is just VirtuDesktops -- and a concept I never had any use for. I'd much rather have multiple monitors then multiple "virtual" screens.
- TimeMachine is just a back-up app -- granted its well integrated and looks pretty. But the method I have in place now is much less intrusive (not to mention more fire-proof) and doesn't require me to be tethered to a local external hard drive.
But nothing bugs me more than Stacks...
Stacks kills a feature I've used and loved in OS X since they killed the Apple menu's hierarchical app-launching capabilities from OS 9.
It used to be, in OS X 10.2-10.4, that you could drop any folder onto the right side of the Dock and turn it into a menu by right clicking on it. In this way I could add my very organized Applications folder to my Dock and use it to find applications in a very simple manor (I'll admit, its kind of like a Start Menu, but come on -- its a good way to organize your apps).
In 10.5 that great feature was replaced with either a silly, and surprisingly static, curved list, or a box full of icons. Now that box can contain subfolders -- but if you click on them, it opens a window. That's a window you have to close after you find your application. Unacceptably stupid.
Know what else is stupid? Apparently there's a massive data loss bug in the new Finder. For years -- literally, we've been complaining about how awful the Finder is (even compared to its OS 9 grandparent) and this is the fix they offer us?
Damage to the Dock and a bad upgrade for the Finder aside (I do like the new sidebar, btw) Stacks are not what they were supposed to be. A "Stack" was designed as a replacement for (or addition to) the folder concept. It was an organizational item that existed in the Finder, had a single icon that could be dragged around like a file, but expanded when clicked to show a collection of items. There are plenty of UI prototype videos on the web showing what Stacks meant to us before Apple polluted the term.
I'm ditching Leopard for the time being. The only feature I really wanted was the improved Front Row... maybe there's a way I can run it in 10.4. If not, I'll just hold out hope that Apple gets their crap together with upcoming updates.
Update: Yay! It looks like they fixed stacks... a little bit!
Experiments in Virtualization
Virtualization is so hot right now... (although it can't be that hot, because my spell-checker doesn't even recognize it as a word.)
The concept is that as hardware gets faster and faster, we've actually reached the point of diminishing returns on all but the most grueling of tasks (HD Video rendering is the only other thing I've seen that really taxes a modern PC.) Now we've got hardware that can support not just one environment without breaking a sweat, but 2 or 3.
At work we have a server running VMWare's ESX Server that's currently running 16 "virtual" computers at once. None of this is that new -- what is new is the way processors are being built with this kind of thing in mind. Intel's Core2Duo is made for virtualization, and nothing proved this to me faster than Parallels Workstation.
I have a fairly recent Dell Laptop, based on a the Centrino chipset -- essentially a P4, at 1.3GHz with 2GB of RAM. It runs Windows and VisualStudio adequately. For awhile, I was given the use of a MacBook Pro, running a CoreDuo. The thing screamed running its native OS -- OS X 10.4, but when I booted up Windows XP inside a Parallels virtual machine, I was astonished to find that Windows actually ran faster virtualized on my MacBook then it did on my Dell. I used it for my day-to-day development, rendering video in one machine, while compiling code in another. And I was sold.
A colleague of mine has taken this concept to its logical extreme, and I won't pretend to have his knowledge on the subject. Rather, if you're interested, you should read his posts.
- Build Machine Virtualization discusses how he eliminated the need for frequent hardware replacement and streamlined our company's build process using VMWare.
- Development Machine Virtualization discusses how he's created specific environments for different development tasks, while still adhering to our I.T. departments onerous rules.
The latter article is the one I'd like to build on with my own thoughts here. My set-up, briefly...
I'm using a desktop computer -- not a laptop, as my afore-mentioned Dell left a bad taste in my mouth. The desktop is a Dell as well, since I.T. gives us no other choices, but despite being as ugly as sin cosmetically, its a very nice machine:
Processor: Intel Core2Duo @ 2.4Ghz with a 1Ghz FSB
RAM: 4GB @ 800Mhz (although Windows XP only recognizes 3GB)
Hard Drive: 250GB SATA II 7200RPM
Operating System: Windows XP SP2 - I.T. Core Load
The real beauty of this set-up is that the OS referred to above, which I consider to be less than satisfactory (at the least, they should have used Windows XP 64-Bit), really doesn't matter -- it could even be Ubuntu. Its only the host OS. As Shawn recommends, I'm running a very light-weight collection of apps, that I'm happy to let I.T. manage for me. I've got Windows and Office, plus a messaging client and FireFox, and various Remote Desktop/VNC clients. That's it. Add VMWare, and from here, I can have the world...

Currently I'm running two "virtual" computers running Windows XP, one running Windows Server 2003, and one running Mac OS X...
My Development VM gets 1GB of RAM, and has a 50GB pre-allocated virtual hard drive. I took a snap-shot when I started, but I realised later I could have achieved the same thing, just by copying the VM directory off to an external archive hard drive. Either way, if anything gets messed up in Windows (which, lets admit, happens fairly frequently) I can just revert the whole system to a working state with a couple mouse clicks.
My Test VM gets 512MB of RAM, more if it needs it, and a 15GB growable hard drive. This is a "clean" install of Windows XP, updated with nothing installed on it. I run the latest version of the software I'm developing on this.
Whenever I want to test how a specific build of my software behaves when installed on a customer's computer, I can snapshot back to its "clean" state, and run the Setup program.
My Server VM is a machine I took from our Green Bay office while there. They had a virtual server configured with a replica of a customer's configuration, and all I had to do was copy it to a portable hard drive and carry it with me. It has a pre-allocated hard drive, and gets 512MB of RAM -- more if needed.
My OS X VM lets me run Mail.app (my preferred mail client), PhotoShop and other nice programs that only Mac has to offer. It should be noted that performance on this machine is not stellar -- but that's only due to a lack of driver support, since Virtualizing Mac OS X is not supported.
The coolest of these virtual machines is the Development VM -- it was made from an actual physical computer. A little app called VMWare Converter can run on a machine, and create a VM out of it. So doing, I was able to switch from my old computer to my new one in a matter of hours, instead of the day or two it normally takes to get Windows, VisualStudio + Orcas, SQL Client Tools, .NET 1.0-3.0, and TortoiseSVN up and running on a fresh box.
The performance on any 3 of these machines running at the same time is equal-to, or better-than a physical computer only a year or two old. With two monitors, and an RDP connection to another headless server I have running behind me, I can juggle 5 computers at once, (6 if you count the host) with more than adequate performance.
I'll point you again to Shawn's articles if the benefits of this set-up aren't self-evident. I was initially a little unsure that the VMs would be responsive enough for my daily use, but VMWare and the Core2Duo have proven to be a stellar team...