Edward Thomson

Blog Entries Tagged: tee

Recently Jesse Houwing, one of the Team Foundation Server MVPs, wrote a helpful blog post outlining client/server compatibility in TFS. One of the interesting points in this list is that our cross-platform TFS tooling, Team Explorer Everywhere, is compatible with a wide range of TFS servers, going all the way back to the first version of Team Foundation Server. Having worked with this team for many years now, this isn't surprising to me; this is a team that takes compatibility very seriously.

You can see this passion in the requirements sheet - it reads more like a who's-who of modern operating systems than a typical supported platform list from Microsoft (and, frankly, some of these platforms are starting to feel... less than modern). But one thing most people don't see is the actual infrastructure that we use to support all these platforms. The machine room in the TFS North Carolina office is home to the TEE build and test lab, much of the hardware becoming increasingly rare anywhere but certainly these machines are unique at Microsoft. Only a handful of people are familiar with this lab, but this is one of my favorite places in the Raleigh-Durham office, so I was certain to snap a few pictures the last time I was in town.

The first thing you notice when you walk into our lab is a cabinet full of servers and, unsurprisingly, these workhorses wouldn't look out of place in any lab in any Microsoft building. These are a few large multi-core servers with big fast disks that run Hyper-V and handle virtual machines for our x86 amd amd64 build hosts:

  • Linux
  • Solaris
  • FreeBSD
  • Windows 8

We run VMs for all of these platforms on both x86 and amd64, comprising our primary build and test hosts for their respective platforms. They contain the most recent JDK update to the oldest JDK that we support (currently 1.5). On the platforms where we support the plug-in for Eclipse (everywhere but FreeBSD), we have Eclipse versions from 3.5 through 4.2 for compatibility testing through the range of versions.

In addition, these hosts maintain a variety of other test VMs. Our largest install base is Windows, as you might imagine, so we have a bunch of Windows VMs to test TEE in various Windows versions (all the way back to XP!) and with various Eclipse products, different JVMs, odd networking setups and other idiosyncrasies that have been problematic for us in the past.

Outside of the server cabinet you'll find a very popular x86-based platform that we can't virtualize through Hyper-V: Mac OS. Instead, we have a lovely aluminum Apple tower that provides builds for our Mac OS platforms. An astute observer will notice that this tower looks a little odd - as if this Mac Pro is missing one of its optical drives. That's because this machine is not a Mac Pro; it's a PowerMac G5.

You may recall that when Apple wants to support multiple architectures they just added cross-compilers to Xcode and gave the toolchain the ability to produce a single fat binary that concatenated all the architectures together. Thus a "universal" file can contain 32- and 64-bit PowerPC and 32- and 64-bit Intel all in a single executable. Unfortunately, recent Xcodes won't cross-compile to PowerPC (and because it was a short-lived architecture at Apple, very few versions of Xcode are able to target PPC64), so we keep this lovely old machine running for our Mac OS builds. I admit we probably don't have too many people using Team Explorer Everywhere on PowerMacs these days, but this has always been our Mac build machine, and it's a great piece of hardware, so I haven't seen any reason to change it.

In fact, we like those old PowerMacs so much that we even have two. The second is our build and test machine for Linux PPC, a platform that has waned in popularity a bit since we first started supporting it (almost a decade ago), but a platform that we still love nonetheless.

Like Apple, Hewlett-Packard changed architectures on their workstations a few years ago, from PA-RISC to Itanium. Unlike Apple, who chose a technology called "Rosetta" for their backward compatibility story, emulating their old hardware, HP actually decided to slap both processors in a chassis and call it a day. They only did this for select machines, though, and these machines have names like "Superdome", which kept them a little bit out of my price range. Instead, we have two HP-UX machines, one for each platform.

Our HP-UX Itanium build and test machine is a ZX-6000. The ZX-6000 is a fine machine: dual 1.5GHz IA-64s, 8GB of RAM and Ultra320 SCSI. But it's a little uninspired with it's black 2U chassis and it gets lost in a cabinet full of other similar-looking machines.

Our PA-RISC machine, on the other hand, has no risk of getting of getting lost anywhere. It's a Visualize J5600, weighing in at a whopping 11U that, while not as big as something called a "Superdome", is still the largest machine in the lab by at least double. This monster was quite a machine in its heydey over a decade ago, with dual PA-8600 processors and 1GB of RAM. I have a soft spot in my heart for the Visualize workstations -- I had a C240 on my desk so many years ago -- and I think that this classy machine offsets the sterility of its Itanium cousin.

Another machine I have a soft spot for is our Sun. This one's a SunBlade 2000 which, in the fine tradition of confusingly named Sun products, is not a blade server at all but just a normal tower-format workstation.

It's not the most powerful machine, just a single UltraSPARC-III clocked at 900MHz with only 1GB of RAM. And the funny curved purple plastic chassis makes it look like it's a workstation out of a cartoon, or maybe an early-90's SGI workstation. Or both. And it's running that newfangled Solaris 2 which is always a sad reminder that Sun threw away their fine BSD roots. Despite all that, though, this machine still manages to bring a smile to my face every time I log in and I see "SunOS", reminding me just a little bit of all the Sun servers and workstations I used earlier in my career.

And then there's our AIX box, an RS/6000 Model 44P-170 sporting a 400MHz Power3 and 1GB of RAM. I must admit that despite my general and unabashed love of old Unix machines, I've never really "clicked" with AIX. I've never been a big fan of SMIT, its graphical administration console, and even less a fan of the not-quite-BSD, not-quite-SysV config files you have to work with if you avoid it. Plus the IBM JVM has a tendency to treat filenames in Latin1. (But hey, at least it doesn't speak EBCDIC.) Still, personal preferences aside, this machine has been a workhorse for us.

Finally, the newest build machine is not in the lab at all, but at yet another branch office, this one in Northern Ireland. Martin Woodward has a Raspberry Pi for our Linux ARM builds which are not officially on the supported platform list, though we are certain to always update the binaries in our distribution.

Some people look at this lab and wonder why we bother supporting some of these old platforms. I look at it and I see a commitment fulfilled, back when Team Explorer Everywhere was acquired, that we would support developers on all platforms. So I'm very proud that Microsoft has continued their investment in Team Explorer Everywhere and I'm impressed by the hard work the TFS Cross-Platform Team does to support all these platforms.

Team Explorer Everywhere on Windows Azure

September 16, 2011 6:03 PM

Brian Harry recently announced our preview of Team Foundation Server hosted on Windows Azure. I'm happy to add that the Team Explorer Everywhere team has developed a preview of our cross-platform client for the hosted TFS Service preview.

When you sign up for the hosted TFS Service, you'll be able to download the Team Explorer Everywhere client. Check out Brian's blog for a special invitation code.

Introducing the TFS SDK for Java

June 6, 2011 6:47 PM

We recently introduced the TFS SDK for Java, to allow Java developers to target applications to Team Foundation Server. One of the great features of an SDK for Java is that it allows cross-platform access to TFS.

As you might know, I'm the resident Mac guy on the TFS team, so I wanted to whip up a little demo for how you might use this on Mac OS. This little sample shows how to pop up a Growl notification every time a new work item is created that falls within a specific query. Obviously it's fairly simplistic, but hopefully it's a good starting point for thinking about what you might be able to do with the new SDK.

import java.util.HashSet;
import java.util.Set;

import com.microsoft.tfs.core.TFSTeamProjectCollection;
import com.microsoft.tfs.core.clients.workitem.WorkItem;
import com.microsoft.tfs.core.clients.workitem.WorkItemClient;
import com.microsoft.tfs.core.clients.workitem.query.WorkItemCollection;
import com.microsoft.tfs.core.profiles.Profile;
import com.microsoft.tfs.core.profiles.ProfileProperties;

public class WitToast
      * This is a simple WIQL query to execute - work items included
      * in this query will be notified for.
    public static final String WIQL = "select [System.Id], [Microsoft.VSTS.Common.StackRank], [Microsoft.VSTS.Common.Priority], [System.WorkItemType], [System.State], [System.Title] from WorkItems where [System.AssignedTo] = @me and [System.State] <> 'Closed' and [System.WorkItemType] <> 'Shared Steps' order by [Microsoft.VSTS.Common.StackRank], [Microsoft.VSTS.Common.Priority], [System.WorkItemType], [System.Id]";

    public static void main(String[] args) throws Exception {
        Growl growl = new Growl("Team Foundation Server");

        Set workItems = new HashSet();

        /* Build a connection profile */
        Profile profile = new Profile();
        profile.addValue(ProfileProperties.USER_NAME, "username");
        profile.addValue(ProfileProperties.USER_DOMAIN, "DOMAIN");
        profile.addValue(ProfileProperties.PASSWORD, "Password");

        /* Get the work item SOAP service */
        WorkItemClient wit = new TFSTeamProjectCollection(profile)

         * Set up the initial set of work items - anything created
         * after this initial query will be notified for.
        WorkItemCollection results = wit.query(WIQL);

        for (int i = 0; i < results.size(); i++) {

        while (true) {
            results = wit.query(WIQL);

            for (int i = 0; i < results.size(); i++) {
                WorkItem workItem = results.getWorkItem(i);

                 * This work item hasn't been seen - pop a notification.
                if (!workItems.contains(workItem)) {
                    growl.notify("The work item " + workItem.getTitle()
                        + " was created.");



    private static class Growl
        private final String applicationName;

        public Growl(final String applicationName) {
            this.applicationName = applicationName;

        public void notify(final String message) {
            final String[] growlArguments = new String[5];
            growlArguments[0] = "/usr/local/bin/growlnotify";
            growlArguments[1] = "-n";
            growlArguments[2] = applicationName;
            growlArguments[3] = "-m";
            growlArguments[4] = message;

            catch (Exception e)

Team Explorer Überall

April 8, 2011 2:01 PM

One of the interesting things about working for Microsoft instead of a tiny little startup company is that they actually expect us to do all the things that people expect out of a software company. For example: Microsoft actually ships localized software! Which means that if you're in Germany, you actually get dialogs and buttons and other widgets in German. I suppose this is something that those crazy Germans have come to expect, but it was quite a revelation to this programmer who grew up in the redneckier parts of Illinois and thinks that the French road signs in Canada are quite exotic[1].

When it was suggested[2] to us that we'd need to ship a localized version of Team Explorer Everywhere, I laughed. Several years of strings piling on top of each other and we're supposed to extract those and get them translated? Ouch.

Fortunately, when we were brought into Microsoft, our team was beefed up with some very smart people who don't laugh at hard problems. And so we present to you language packs available for download in German, French and Japanese.

  1. Hey, I'm down with kilometers, but arrêt?
  2. And by suggested, I mean told.

Team Explorer Everywhere 2010 SP1 (Beta)

November 5, 2010 10:23 AM

Yesterday we released the beta of the first service pack of Team Explorer Everywhere, and while a service pack is just supposed to be a roll-up of bugfixes, we managed to sneak in some great new features.

I mentioned before that Team Explorer Everywhere 2010 was sort of a tough release for us... fortunately we got a second chance with our service pack and we were able to add some new features that we didn't have time to include for the initial release.

We were able to add Gated Check-in, which is a great feature for bringing your continuous integration up a notch to ensure that your code quality stays high. This was one of the flagship features of TFS 2010 and something we use internally, so it was especially important for us to provide it to our customers.

We added support for conflict resolution using the built-in Eclipse Merge Tool. While we've always had the ability to use an external merge tool like SourceGear DiffMerge, we'd never investigated using the internal Eclipse compare/merge tool to resolve a conflict. In SP1, we're going to add that as the Eclipse merge tool as a resolution option so that you don't need to install a 3rd party tool.

Finally - and perhaps most visibly - we've added rich text editing for Work Items, which will allow you to easily edit the rich text in HTML field controls in work items. (Previously we provided a poorer experience with HTML in controls.) In SP1, we're able to leverage the web browsers on each platform to render a nice rich text editor.

Of course, we've also been busy fixing a bunch of bugs. We're really pleased with the way our first service pack has come together, and we think that this is a release that you'll be very happy with.