Travis Pettijohn: Blog

Windows Mobile 6.1 Upgrade

I just upgraded my HTC Sprint Mogul/PPC6800 to Windows Mobile 6.1. Before I upgraded, I took down a list of the key software that I needed to reinstall. In no particular order, I present my key Windows Mobile utilities:

  • S2U2 - an iPhone screen locker clone. Search to find the latest version in the XDA developers forums.
  • gpsVP - Open source/Garmin Research project for GPS. Works with most (all?) Garmin GPS maps, and best of all, it can be used offline (no active cell/data connection required). Save trails, import & export waypoints, etc. Very cool.
  • Live Search - Good for turn-by-turn driving directions and location-based services (like, show me bars near where I am right now).
  • OneNote Mobile - Take your favorite notebook on the road. You do use OneNote, don't you? Install from OneNote on the desktop: Tools / Options / OneNote Mobile.
  • SKTools - Utility for cleaning up the Notifications Queue on Windows Mobile. If you have ever experienced the "phantom alarm," this utility can clean that up.
  • Google Maps - Good for driving directions and "where am I right now." Not as feature-rich as Live Search, but more user-friendly. Depends on what I'm after.
  • VisualGPSce - Another GPS utility. Just gives raw data from the satellites.
  • TouchPal - The best on-screen keyboard I've found. I have stopped using the hardware keyboard on the Mogul in deference to this.
  • Streaming Media - For playing streaming media, especially from m.youtube.com.
  • Remote Desktop - Sprint removes Remote Desktop from their firmware. Why? I add it back in.
  • Total Commander - Replacement for Explorer, and also a registry editor.

How to make URLs clickable in Office Communicator

Edit: This is the lame. All it does is make links that you send clickable. All incoming URLs are still plain text.

Source.

  1. Open registry editor and go to the following registry entry:
    HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Communicator
  2. Add the following key to above mentioned entry
    EnableURL (Type:DWORD), value can be either 0 (URL will appear as plain text) or 1 (makes URL clickable)

Now close the registry editor and restart Microsoft Office Communicator 2007, URLs should now be clickable. Administrators can control values of this feature via group policy settings.

WMP Keys

WMP Keys, a Media Player plugin to let you assign global keyboard shortcuts. Pretty handy to not have to alt-tab or jump to the mouse to perform common WMP functions.

Sideshow for Windows Mobile

I'm a few days late with this one, but Microsoft has released a Sideshow application for Windows Mobile. Download link for the Developer Preview.

Hyper-V

This weekend I added a second hard drive to my Toshiba M9 laptop (in the CD-ROM bay). I then was able to install Windows Server 2008 on a second partition on the primary drive. After that was up and running, I set up Hyper-V with the goal of migrating my primary Vista installation (the one on the first partition) to a virtual machine. The process was easy enough: in the Hyper-V Manager, create a new VHD and tell it to clone a copy of the existing first hard drive. A few hours later, I now had a VHD on my second hard drive that was an exact clone of the first drive. I mounted it in a virtual machine and booted: to my surprise, there were my boot options, Server 2008 and Vista. And Vista x64 started right up (amazing it didn't blue screen during boot with all the hardware changes; also amazing, a 64-bit guest OS). But, here's the rub and the deal breaker: I couldn't install the "virtual machine additions" (I forget the correct Hyper-V term), as they aren't supported on 64-bit Vista. Performance was quite good, and I was able to share both physical CPUs inside the virtual machine. Here's to hoping they fully support 64-bit Vista as a guest!

reCAPTCHA: Stop Spam, Read Books

I just discovered this site, http://recaptcha.net/. They do the regular "image verification" stuff you see to prevent spam on web sites, except they use scans from real books. They present two words: one for which the result is known and a second for which the OCR had low confidence. If you match the known word, they assume you're probably right on the unknown word, too (and they verify it multiple times to improve confidence). I think it's a great idea: as a side effect of preventing spam, they're digitizing old books. Cool.

SSTP VPN

Now that I have Vista SP1 on my primary machine, I wanted to set up my Windows Server 2008 box to act as an SSTP VPN endpoint. SSTP essentially tunnels a PPP VPN over HTTPS. What's great about this is that port 443 is almost always open, increasing the odds that I can connect to home from anywhere. I actually bought an SSL certificate (see?) from GoDaddy (it was $15/year). I had a couple issues installing the certificate and making the VPN work. First, I had to install the certificate on the command line, as the UI was giving me an error (ASN1 bad tag value met). Second, I had to remap the certificate to port bindings. I believe that my setup was incorrect because it had only ever been bound through the IIS UI. Again, using the command line fixed it.

Further Reading:
Detailed post of how SSTP works.
More blog entries on SSTP.

uTorrent

After the aforementioned upgrade, I was going to install Azureus, but instead decided to try uTorrent. I have to say, it's pretty slick. Super light and fast, and the UI is very familiar-feeling for an Azureus convert. But the best part is that it doesn't have any of that Vuze content crap that I don't want. Just a lightweight BitTorrent client—you know, like Azureus used to be.

Upgraded

I had a little down time this morning as I upgraded from Server 2008 RC0 to RTM. The upgrade blue-screened, so I ended up wiping the boot partition and reinstalling from scratch. A little more time consuming, unfortunately.

TouchPal

I just discovered TouchPal, an on-screen keyboard for Windows Mobile optimized for fat-fingering. I'm pretty happy with my Mogul, but one of my biggest gripes is the delay when I slide out the hardware keyboard (and it switches from portrait to landscape mode), and the on-screen keyboard requires a stylus (or the corner of a fingernail). This little freeware utility has nice finger-sized buttons, predictive input and an easy way to be precise (tap on the big QW key and then slide right to pick W, or left to pick Q). If you share my gripes, check out this utility.

FLAC to WMA Lossless Script

Requires Windows Media Encoders and FLAC.

foreach ( $file in dir *.flac )
{
	# Prep input and output filenames 
	$shortName = $file.Name.Substring(0, $file.Name.Length - $file.Extension.Length);
	$wav = $shortName + ".wav";
	$wma = $shortName + ".wma";
	
	# Decode FLAC to WAV
	& 'C:\Program Files (x86)\FLAC\flac.exe' -d $file.Name

	# Encode WAV to WMA Lossless
	cscript "C:\Program Files\Windows Media Components\Encoder\WMCmd.vbs" -input $wav -output $wma -a_codec WMA9LSL -a_mode 2

	# Cleanup
	del $wav;
}

Yikes!

After the first drive in my old file server died, I made a backup of all of my photos...or so I had thought. But actually, I didn't get them all. For some reason NONE of my Africa pictures got backed up!! YIKES. I discovered this tonight when I wanted the original image for the header on this web site. I checked the original card in my camera, my external hard drive..., the copy I had made on the new file server...nothing. A few minutes later I remembered that I had at one time burned other copies: one I sent to my Dad so he could view a slideshow on his DVD player, and another that I kept for myself. Thankfully, I found my copy in my "box 'o pictures" and have recovered all of the photos...PHEW.

It goes to show you: even when you make a backup (or even when you have an implicit backup with a RAID), you could make a mistake and unknowingly miss something. Be proactive in making backups, ESPECIALLY with irreplaceable things like photographs.

I would have been a sad little boy if I had lost all of those pictures. Imagine how it would make you feel if you lost all of those digital photos you have of your kids/grandkids/friends/whatever. Consider even burning another copy and sending the CD/DVD to someone else.

(Now that this blog is online, I may devote some time to that Amazon S3 application I've been wanting to write for encrypted off-site backups.)

Back Online

Hi, everyone. I'm back online after a pretty catastrophic file server crash. I built a new file server (Quad Core Q6600 (2.4GHz x4), 4GB RAM, 3x500GB hard drives in RAID 5 for 1TB storage) and then wrote a new blog engine. There's more than meets the eye to this engine, as it supports an extensible typing system at its core (I'll be able to create a Restaurant Review type with extended properties for the name, the type of cuisine and a 0-5 star rating, for example) that is strongly typed, indexable and searchable, yet transparent to the data access layer. More on that later. It also supports tagging and nicely designed URLs (courtesy of Intelligentcia's URL Rewriter). I was able to recover about half of my existing blog posts from the Live Search API's cache and Google's Cache.

Some links have changed, yet I'm doing a 301 Moved Permanently for all legacy URLs, so you're probably reading this as a result of that. Regardless: RSS. Home page (unchanged). Feels good to be back! Stop by and check out the new layout, while you're at it.

Vista Elevated Command Prompt

Registry hack to let you right click on any directory and open an administrator command prompt. Pretty cool trick. I added /T:4f to the command line to give it a nice, clear administrator designation (red background). My reg file looks like this:

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Directory\shell\runas]
@="Administrator Command Prompt here"
"NoWorkingDirectory"=""

[HKEY_CLASSES_ROOT\Directory\shell\runas\command]
@="cmd.exe /T:4f /k \"pushd %L && title Command Prompt\""

[HKEY_CLASSES_ROOT\Drive\shell\runas]
@="Administrator Command Prompt here"
"NoWorkingDirectory"=""

[HKEY_CLASSES_ROOT\Drive\shell\runas\command]
@="cmd.exe /T:4f /k \"pushd %L && title Command Prompt\""

Does anyone know a command line to elevate me? I mean...if I start a regular non-admin cmd.exe and I want to elevate at some point, is there an easy way?

Tom Hollander article

Tom Hollander has a good post on the success of software projects.

Each project is governed by the "iron triangle" of scope, schedule and resources. ... The thing I am trying to understand is why we (meaning both the development teams and the business groups) insist on playing this game by pretending it can all be done. ... The business can blame the development teams for failing to meet the agreed deadlines or requirements. The development teams can blame the business that the initial requirements were not detailed or accurate enough. Everyone walks away vindicated that it wasn't their fault that the project failed.

Electron God

I said to a friend at work today, "We've spent the last few weeks designing some really cool algorithms, and I'm excited to start breathing some life into them." And then I thought... does that make me a God? Breathe life into something. On some very basic level, a lot of what I do is just manipulating electrons (at least the programming part of my job... not so much the interacting with people part). Yes, I decided, I am an Electron God.

Event Viewer on Vista

Looks like the Event Viewer got a major overhaul on Vista. You can create views that filter on chosen criteria. I just created an "application errors" view, which only shows Error events from the Application log. Pretty cool!

Encrypting sensitive data on my external hard drive

Quick bulleted list post of how I encrypt data on my external hard drive and usb thumb drive. The idea is that if I ever lose the drive, no sensitive client data would fall into the wrong hands. TrueCrypt creates a file that represents a drive. Think of it like mounting an ISO in Daemon Tools, except TrueCrypt is a writable removable storage device that encrypts and decrypts on the fly. Assuming the external hard drive mounts to G::

  • Unzip TrueCrypt to G:\programs\truecrypt42a
  • If you're running Vista or as a Non-Admin, install it onto your local machine once as an Admin.
  • Start it up, create a volume called G:\encrypted.tc (I'll leave this as an exercise to the reader)
  • Create G:\enctypted-mount.cmd
    @echo off
    "programs\truecrypt42a\Setup Files\TrueCrypt.exe" /v encrypted.tc /lx /e /q /m rm
  • Create G:\enctypted-dismount.cmd
    @echo off
    "programs\truecrypt42a\Setup Files\TrueCrypt.exe" /dx /q

It's just a double-click to mount or unmount the encrypted volume stored in encrypted.tc as my X:

TrueCrypt can also mount a encrypt a whole volume, but I chose to only encrypt sensitive data in a file like this so that I don't waste time encrypting my music collection. Also, it allows me to keep the TrueCrypt installer right there alongside the encrypted volume so that I can plug in, mount, and go, even without an Internet connection.

Have fun!

Don Box on Google Search API

Don Box weighs in on Google deprecating their SOAP search API and releasing an AJAX one. Choice snippet:

In my mind, this is a significant step backwards.

It's one thing to say move from SOAP to POX or even XML to JSON - the former move trades off extensibility in the spirit of YAGNI, and the latter move trades off SGML synergy for a better impedance match to most people's programming languages.

It's another thing entirely to require someone to use a specific language, runtime, and even local API to get at your service.

No matter how you define "web service," I don't think this newest offering qualifies.

I'm hoping this is just an anomaly and not a trend, lest we all fall back into the world of opaque/closed protocols.

Been there, done that.

Yes, this is Microsoft advocating openness...and Google advocating proprietary-ness. Right on, Microsoft.

Hello World

Check out how convoluted this Hello World is using an anonymous method in C# 2.0:

using System;
using System.Collections.Generic;
using System.Text;

namespace HelloWorld
{
    /// <summary>
    /// Declare a delegate that will do something with a string.
    /// </summary>
    public delegate void AcceptString(string s);

    public class Program
    {
        static void Main(string[] args)
        {
            //create the delegate using an anonymous method
            //in other words, this object is really a method
            AcceptString writeConsole = delegate(string s)
            {
                Console.WriteLine(s);
            };

            //call the object/method
            writeConsole("Hello World!");
        }
    }
}

Symbolic links in Vista

Windows Vista includes a new command, mklink, for creating symbolic links on NTFS. More info. Very cool... although the linux guy buried inside me is quietly sighing, finally.

Upcoming downtime

This server will go down for a couple of weeks starting sometime this week. That means this blog, the subversion repository and the wiki will be down. Sorry, but them's the breaks when you host at home and you move.

More on Oddmuse

I left a comment on the Oddumse wiki with a feature request on Saturday. Alex replied about three hours later agreeing. It got checked into revision 1.701 about 45 minutes later. How cool is that?

Wiki fever

I was recently introduced to Oddmuse, a simple Wiki engine written in Perl. I initially set it up for a side software project I'm working on with friends (we needed a simple way to capture and share requirements and ideas). After that, I made www.pettijohn.com use it. One thing about it that appeals to me is that it's so easy to set up. Literally drop the script in, change one config value, and it works. You can tweak (which I've done), but there are no dependencies on databases or anything (it's filesystem-based). Nice job, Alex.

Mapopolis Transformer

I mentioned earlier the tool I wrote to view my GPS trail in 3D on Google Earth. I cleaned up the program, added some comments, documentation, error handling, logging, etc, and released it. Download Mapopolis Transformer. Run it and hit F1 to see the help doc. I don't know if anyone will really use this program, but I thought it would be fun to release it.

Burn a DVD ISO for Free

I was poking around after installing the Windows Server 2003 Resource Kit Tools and noticed that it installed a little app called dvdburn.exe. It does just what you would expect: burn a DVD ISO to disc (I'm actually using it on XP MCE). It also includes the related cdburn.exe. I'm also a fan of cmdhere.inf (right click, choose install). It lets you right click on any folder and open a command prompt to that directory. And let's not forget robocopy.exe! So there you go: some nice little free utilities from Microsoft.

Connections

On a coworkers recommendation, I downloaded and used XsdObjectGen from Microsoft's web site. I opened up the documentation and saw that one of the principal authors of the tool was Colin Cole. I worked with Colin on a project a not too long ago...shook his hand, had a beer with him even. I feel so special.

Lotus Notes

The best thing to ever happen to Lotus Notes. Thanks, Microsoft!

Outlook Connector for IBM Lotus Domino enables you to use Outlook 2003 or Outlook 2002 to access your e-mail messages, calendar, address book, and To Do (task) items on an IBM Lotus Domino Release 5.x or Release 6.x server.

The Rule of Mike

In any gathering of "tech people," there will be more guys named Mike than there will be total females.

(I read that in a slashdot comment a few months ago and it just popped into my brain, so I decided to share it.)

SyncToy

SyncToy is one of the best utilities I've ever used. I'm using it to make backups of critical files (OneNote files, some source that's not in source control, work documents, SharpReader settings to read from multiple computers and stay in sync) from my hard drive to my USB thumb drive. I plug in the drive, start the app, click a button, and a half dozen folder pairs sync automatically. And if I modify some of those files on the thumb drive from a different computer, SyncToy is smart enough to move changes back the other direction. Well done.

Monad

I was reading a blog from a guy on the Monad team and saw this snippet. Monad (or MSH) is the next command-line from Microsoft. It's a dynamic scripting language. It reminds me of some sort of mix of Bash, PHP, Perl and .NET. I just had my ah-ha moment:

foreach ($f in $feeds) { 

    #snip..

    # read the content from $feeduri as XML 

    $wc = new-object System.Net.WebClient 
    $s = $wc.OpenRead($feeduri) 
    $sr = new-object System.IO.StreamReader($s) 
    $rssdata = [xml]$sr.ReadToEnd() 

    # display title 
    write-host $rssdata.rss.channel.title

    # display title and date of each item 

    $rssx.rss.channel.item | 
        foreach-object { 
            write-host "-" $_.title 
            write-host "     " $_.pubDate 
        } 

}

Look at how Monad allows you to use .NET objects. Also note the implicit xml support; you can navigate the DOM as if it were an object ($rssdata.rss.channel.title). Very cool.

New del.icio.us bookmarklet

The following bookmarklet, when clicked, will prompt you to enter a del.icio.us tag query. Enter something like "blog+friend" to be taken to the view of those tags. This is faster than going to your del.icio.us page, waiting for it to load, clicking in the address bar and then typing the tags.

javascript:location.href='http://del.icio.us/username/'+prompt('del.icio.us tag query', '');

Back online

Sorry to my one reader for the downtime...thanks for sticking around. What can I say, I moved. The new cable modem is up and running, the network has been pieced back together. Until I move again in a few months, that is. Sorry to my friends: I still haven't installed a feed reader on this laptop yet, so I'm behind on reading your blogs. I'll do that soon and get caught up. I've got a few blog entires outlined in OneNote that I'll be posting over the next few days. Stay tuned.

Offshore development

Reposted from Boing Boing:

Three San Diego entrepreneurs plan to start a cut-rate outsourcing plant for software development three miles off the coast of Los Angeles aboard a used cruise ship moored in international waters.

Wired with a fat T3 pipe fed by microwave, SeaCode would employ 600 developers - the bulk of them non-U.S. citizens - who could crank out code around the clock at a lower cost and higher rate of efficiency than their American counterparts. The beauty part (at least according to the proponents) is that business would be booming, the headquarters could change sail wherever business took it, and RnR would be just a half-hour water-taxi ride away. In your neighborhood.

Firefox about:config

This is a post mainly for my future reference. I may edit it as I learn new things. Feel free to ignore.

  • Full list
  • browser.startup.page - Page to open on browser startup. 0: Blank, 1 (default) Home (a.k.a. browser.startup.homepage), 2: Last (probably does not work)
  • browser.block.target_new_window - True: Links with target set to _blank will open in the current tab instead of a new window. False: Links with target set to _blank will open in a new window. Note: No longer in use. Use browser.link.open_newwindow instead.
  • browser.link.open_newwindow.restriction - 0 (default): Force all new windows opened by Javascript into tabs. 1: Let all windows opened by Javascript open in new windows. (Default behavior in IE.) 2: Catch new windows opened by Javascript that do not have window attribute values set; otherwise allow them to open a new window.

What I learned today

It's been said that you learn something new every day. I thought it might be fun to keep track of at least one thing each and every day. My goal is to write a single sentence daily. I don't know if I'll keep it up (I just started a few hours ago). I present: What I learned today. It's written in PHP with an XML datastore (yay for separation of data and presentation!). Maybe in the next iteration of this blog I'll integrate it (I want to do some sort of Wiki/blog combo thing that's pluggable to add things like WILT). We'll see.

Edit, 2005-03-29 22:19: I added an RSS feed. I'm hoping that "what I learned today" will become the next big thing on the Internet (like blogging) and I'll get to say that I started the craze, and I'll get interviewed on cable news and people will write books about me. Ready everyone? Add WILT to your blog!

Prediction

Ruby will be the next big open source programming language. It will rival (if not beat out) Perl, PHP and Python in terms of popularity. I say this because ever since I was made aware of it, it seems to keep popping up...and always in a positive light. Read this blog entry for an example of what I mean.

How to remove search engines from the Firefox search box

  • Go to C:\Program Files\Mozilla Firefox\searchplugins
  • Each search engine has two files; a .src and either a .png or a .gif file. All you have to do is delete the two files for the search engine you wish to remove (for example google.src and google.gif) and restart Firefox.

Source.

Upcoming Downtime

I've requested a transfer of this domain (pettijohn.com) to a new registrar, so over the next week or so there might be a few days of downtime. Not that that's a big deal :)

128-bit storage

How much energy would it take to fill a 128-bit address space with data? More energy than it would require to boil the oceans. Fun read.

Firefox tweak

By now, everyone reading this knows that Firefox 1.0 has been released. Firefox is, of course, the best web browser currently available. Let's reflect. First it was Netscape. At the version 3 point, IE was preferred. I stuck with IE through 6. And now Firefox my preferred browser. The reasons are countless and frankly I don't care to list them all here. What I do know is that when I'm forced to use IE, web browsing is a much different, much less pleasant experience. Of course, a good deal of that is the result of Adblock. But I've gotten off topic.

My tweak: If you go to about:config, you can set browser.block.target_new_window to true, which prevents web sites from opening new windows. If I want a new window (or tab), I'll do it myself, thank you very much. But after upgrading, it stopped working! A little messing around found the answer: set browser.link.open_newwindow to 1. I'm not sure what that means, or what other values of it do, but it works. So if you're struggling with this issue, give this a shot.

No Private Methods

Jaybaz writes about a programming concept that intrigued me: no private methods. If you ever need to encapsulate something into a private method, you should make it an object instead with a public interface. He describes it as performing Extract Class until there are only public methods left. Private fields are okay, but methods must be public.

It's intriguing.... It would be a little bit of overhead, extra work, sure, but it leads to some cool ideas. It pushes the idea of design encapsulation. It should lead to better code reuse. And better reuse means less bugs over time: you fix it in one spot and everything that uses that object is fixed, too.

Of course if you define your object boundaries poorly, refactoring might become a nightmare. But if they're defined well, refactoring might become a breeze.

I haven't made up my mind on this yet. I want to try it and see if I like it. Will I stick with it? Will the overhead and extra work be outweighed by the encapsulation and reusability prospects in that code? Will it be an end to or a cause for refactoring?

Follow me...

...to San Diego! Tomorrow morning I leave for Microsoft Tech Ed 2004. All next week my blogging and picture posting will take place at http://teched.virden.org/. I was the primary developer for that blog app. It has some cool features. It supports image entries, so you can attach a picture to the blog (not just text). You'll start seeing that tomorrow I bet, when we get to our room after traveling. The batch uploading of pictures is slick. You can upload a zip and it thumbnails them and allows you to view all pictures that don't have entries yet. It reads exif and stores it in the database. Customizable CSS for everyone, too (click down all the names and see what everyone has chosen). It's a pretty cool app. I'm amazed at how much I got accomplished in one week. I guess, when you enjoy what you're doing (and especially when it benefits you), you're willing to be more dedicated.

Again, this blog will fall more or less silent for the next week. Check out the above link; There will be a lot of traffic there as everyone will post regularly.

Least Privilege Shortcut

I've been running as a Power User on this laptop for as long as I've had it. In all, there are no real problems. A few programs don't work, but you can always shift-right click -> Run As. Then it takes two clicks: one to select another user, then another to focus the password box. I've created a faster, less click solution. In the directory %USERPROFILE%\SendTo, create a batch file (I called it "Runas Administrator.bat") with one line in it: "runas /user:Administrator %1" (substitute your Administrator user name). Then, on any "runasable" file (exe, mmc, cpl, etc), you can just right click -> Send To -> Runas Administrator, type your password, done! I should have thought of this sooner!

Subversion

This evening, I installed the Subversion versioning control system on my Linux server. This is more or less a temporary setup. I plan on rebuilding that box (travis.pettijohn.com) when Fedora Core 2 comes out. It's due out in mid-May. At that time, I want to shift it to more of a server role than a desktop. I want to build that server with a mirrored RAID. I need a place where I can (more) safely store photos, music, web content, a database server and a versioning control system. The Linux Kernel supports software RAIDs natively. Fedora Core 2 uses the 2.6 Kernel, so it will be nice to get to use that without having to compile it myself.

Back to Subversion. It wasn't too difficult to install. I had to upgrade Apache from 2.0.40 to 2.0.48. The Subversion download page had RPMs of everything I needed. I also got an upgrade of PHP while I was at it. The documentation was pretty good. It explained how to create a repository and configure Apache. One of the best features of Subversion is that it was designed to use DAV, thus it needs a web server. (Actually, Subversion can run a standalone server or even use SSH, though DAV makes it the most accessible from platform to platform.) The only problem I had was a stupid oversight I made: the web server process needed permissions to read and write to the repository (duh).

Once I got the repository up and running, I installed TortoiseSVN for Windows. TortoiseSVN is a Windows Subversion client. I have to say, compared to SourceSafe's client, TortoiseSVN wins. My use of Vault has been very limited, but I'm tempted to say that TortoiseSVN wins. Here's why: it's just an Explorer add-in. You browse using Explorer like you would any other folder or file. Files and folders that are under version control get little green checkmark overlays. When files change, they get little red exclamation point overlays. If any file underneath the current directory (recursively) is changed, the folder gets the red exclamation point. Right clicking on a file allows you to bring up a log, perform diffs across versions, rename or move files (Subversion tracks movements, they don't just get re-added under a new name)...all that good stuff. It even has a Blame feature (just like Vault). So far I've been impressed. Another thing I really prefer about Subversion (and CVS and Vault) over SourceSafe is that they use Copy-Modify-Merge instead of Lock-Modify-Unlock. If you've never used a Copy-Modify-Merge solution, I suggest you follow those links to learn about the differences (and why Lock-Modify-Unlock can create a false sense of security).

I haven't tried it yet, but there's also a Visual Studio add in for Subversion called AnkhSVN. The screenshots look promising. It seems limited compared to TortoiseSVN or the command line svn binaries, but it's off to a good start.

Today

Today was my 23rd birthday. It was a pretty standard day. I worked, I worked out, I watched a little TV and I made dinner...nothing fancy. I released WeatherCornerAlert version 2.0 this evening...a birthday gift from me to you. I cleaned things up a little, hid one annoying exception that no one on microsoft.public.dotnet.framework could help me with. Hopefully swallowing it doesn't cause any additional problems. It should be all good. Try it out; I think you'll like it.

For a birthday present to myself, I bought a MuVo 4GB off of eBay today. It'll be great when I'm able to store over 1000 pictures on a single medium. I'm officially back to the Nikon D70 as my camera of choice. My one day flirtation with the Olympus 8080 has ended. I think the extra money is worth the advanced flexibility of the D70. The difference in resolution is really a non-issue, especially since the D70 has better image processing. Those "prosumer" cameras like the 8080 tend to do a lot of image processing in the camera. I'd much rather have that fine degree of control that Photoshop provides than have an algorithm decide at snap time. Anyway, in a week or two I'll be purchasing the camera. I'm excited!