Andrew Coates ::: MSFT

It's all about community!

  • Andrew Coates ::: MSFT



    dgii Just trying out a new look. After my plan comes to fruition, I should be ready to subsume the brand.

  • Andrew Coates ::: MSFT

    Standing on the Shoulders of Giants


    26-Sep Updated table formatting


    "If I have seen a little further it is by standing on the shoulders of Giants"

    Isaac Newton 1676*

    As a Developer Evangelist, I'm often talking about the value of "the Platform" and sometimes it takes a little while for people to see that value. I like to tell a story about the evolution of a platform

    image image Imagine it's 10,000 years ago and you live in a cave up the hill to the left. Getting water is a matter of walking the 500m down to the stream, using the water and then walking home. That’s fine if it’s a beautiful day like in this picture. The next day, however, there’s a severe storm so going outside is already unpleasant. To make matters worse, a large carnivore chases you when you do venture out into the elements go to get water. Once you get there, you find that one of your neighbours has slaughtered a woolly mammoth just upstream and the water is polluted and unusable. You have to go over the next hill (5 km) just to get water.
    image image Fast forward to 4,000 years ago and you’re living in a village in the African desert. Your village has constructed a well and you maintain it collectively. You still have to go outside for water, but not nearly as far, and all of the people in the village contribute to the maintenance.  Your water supply occasionally dries up, but is much more reliable than having to go down to a stream. 
    image imageFast-forward to 150 years ago** in the city of London. You now live in a lovely house in Broad Street. Just outside your front door, the City of London has installed a pump (or, more accurately, has contracted a private company to install a pump) connected to the new-fangled plumbing. You still need to go outside for your water, but you don’t have to worry about maintaining the pump, and there are public health professionals ready to remove the handle of the pump if too many of your neighbours catch cholera.
    image imageimageFast forward to today. Now you get water plumbed into every part of your house. The question now is not "how do I get water?", rather it’s "what do I want to do with water?"  Delivery of water is now a platform on which you can build, rather than being a task on its own.
    image We've seen this platform evolution (albeit on a much shorter time scale) in pretty much everything that happens with computers. From having to write your own code to read and write bytes from a disk (or punch card, or circuit board) to letting the operating system handle it for you. From having to write your own code to paint a window on the screen to letting the framework handle it for you. From sourcing drivers for every piece of hardware to having it just work when you plug it in and so on.

    One of the questions I often get asked is whether abstracting away the details of the working of the platform makes us less connected from the source and therefore somehow less capable. There's no requirement to not understand how the platform works (just like, as a Civil Engineer, I understand water supply systems pretty well), but equally, there's no requirement to rebuild the platform every time you want to build something on top of it. Whether I'm installing an espresso machine or a hydroponics farm, I can use the water supply platform without having to drill a well, install a reverse-osmosis plant, install solar panels for power and so on.

    MPj04008460000[1]This also makes a distinction between platform and services. Pat Helland pioneered the concept of a metropolis where he described the various utilities (water supply, sewerage, electricity, roads, railway lines, ports, telecommunications infrastructure etc) as services (I haven't done Pat's work any justice at all here - go and read his paper). I'd argue that these are actually the platform on which services (schools, high-speed internet access, parcel delivery, banking, petrol stations etc) can be built. In a similar way, in the Software plus Services story both the software and the services are built on a platform (or platforms). The more common functionality the platform provides, the more time service providers can spend on the provision of the actual service. For example, pretty much every provider of any significant services in the cloud needs to have a way to authenticate and bill (or otherwise gain benefit from) users of the service. There aren't that many schemes for doing either of these things and so it makes sense to have the platform (on which the service is built) provide this functionality. By factoring out commodity platform capabilities (i.e. billing, provisioning, SLA monitoring and management, auth[n|r], messaging, CRM, monetization services etc.), the service provider is free to invest fully in an offering in their domain of expertise, without being encumbered by having to build out these concerns.  Customers are also free to pick and choose those services that make the most sense, again without having to build out (and care and feed for) commodity capability. 

    This has the related effect that the costs of these cross-cutting platform capabilities – which cost a lot to develop and maintain – can be amortised against a much larger population of users. In turn, this tends to bring the cost of the services down, which makes them more accessible to smaller organisations (i.e. further along the tail).  This is a democratising effect  - i.e. now a small software firm can afford an enterprise-grade provisioning, billing and SLA management engine, and can scale this according to their needs, and therefore potentially compete with larger players, or offer lower-cost services to customers who are also further along the tail.

    Time to value is shorter.  If a service provider can focus on their offering sans the surrounding infrastructure, they can deliver services much more quickly, and can respond to opportunities in the market more rapidly.   Related to this is the expectation that markets and offerings will evolve much more quickly than ever before.  If you aren’t tied down by infrastructural drag, you can innovate much more quickly.


    Many thanks to Nigel Watson for his insight and additional thoughts.

    * Yes, I'm aware that Isaac probably wasn't the first person to use this phrase, but he's probably the most famous
    ** OK, OK, the picture's obviously not from 150 years ago (of course, the first one is from 10,000 years ago), but I really wanted a picture of this pump - it's because of my background in GIS

  • Andrew Coates ::: MSFT

    .NET Framework 3.5 Namespaces Poster Available


    clip_image002This just in from Paul Andrew.

    We just completed the .NET Framework 3.5 update to the Commonly Used Types and Namespaces poster.

    Here's a link to the file (PDF, XPS and 16-page XPS) if you want to grab it now and be the first on your block to get it on your wall. We'll be using it at a variety of places, if you think it would be a cool thing to have at a Microsoft event then please go suggest it to some Microsoft employee that you know.

    Let me point out the little additive circles diagram at the bottom right. We've found that this is a great way to explain the additive version releases of the .NET Framework 2.0 – 3.0 – 3.5. The primary reason for updating the .NET Framework this additive way instead of the side-by-side nature of .NET Framework 1.1 – 2.0 is to make it easier for customers to upgrade their apps. Here's that diagram again.

  • Andrew Coates ::: MSFT

    Office Object Model References on MSDN


    Sample Object Model Map

    On an internal alias, I recently got asked a question that had come from a customer:

    "I wouldn't have harassed you like this, except that I've done heaps of searching and can't locate what I need.
    My company has a new CIO, a consequence of which is the need to now embrace all things Microsoft.  We are currently doing some investigation on .NET stuff and Office 2007, but I'm having difficulty finding some concise documentation on Object Models.  I've trawled through MSDN and managed to find a few things out, but what I was really wondering was if there are any one or two page Object Model posters, similar to the ones you use to get in Notes?  I can't see anything useful on MSDN and was wondering if you had access to anything."

    I wasn't able to find any posters, but there is a great set of hyperlinked object model diagrams available. Here are a few:

    In general, I started at the Office Developer Centre and clicked on the Library tab. I navigated using the treeview to get to the 2007 Microsoft Office System node and then chose the various products, the Developer Reference and then the Object Model reference.

  • Andrew Coates ::: MSFT

    Resize Images - a Thumbnail Maker


    Nic was hanging out with Nick (a combination that's just asking for trouble if you ask me) a couple of weeks ago near my desk, and Nic was bemoaning the lack of a resizing utility. This triggered something in the back of my mind and lo! I found a post by Rick Strahl on (almost) this very thing. I tweaked the code a little to turn it into a console app from a web app and built it.

    I added a shortcut to the exe both on my desktop and in my SendTo folder so now I can right-click on an image or images and send it to the resizer and it will do its magic.

    (508k) turns into this (23k):

    Pretty cool!

    Here's the code - most of it pinched directly from Rick remember. Note that in its current form, it makes the maximum dimension of the thumbnail 120px. You can change that at the top. I've also attached a zipped version of the solution to this post. Of course, this is provided as-is with no guarantees of stability, suitability or any other -ability. Use at your own risk, contents may be hot, don't run with scissors etc.

    You could add some nice bits like:

    • the ability to detect that it had been passed a folder and have the code traverse the folder and resize all the images therein.
    • the ability to set the max size as part of the command line
    • the ability to specify an output folder for files
    • Actually handling the exceptions in ErrorResult() :)

    Anyway, enough already. Go play!


    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Drawing;
    using System.Drawing.Imaging;
    using System.IO;
    namespace Resizer
        enum ImageSize
            Default = 120,
            Small = 120,
            Medium = 240,
            Large = 480,
        class Program
            static void Main(string[] args)
                foreach (string Image in args)
                    // string Image = args[0];
                    if (Image == null)
                    int Size = (int)ImageSize.Default;
                    //if (args.Length > 1)
                    //    string sSize = args[1];
                    //    if (sSize != null)
                    //        Size = Int32.Parse(sSize);
                    string Path = Image;
                    Bitmap bmp = CreateThumbnail(Path, Size, Size);
                    if (bmp == null)
                    string OutputFilename = null;
                    FileInfo OutputFile = new FileInfo(Path);
                    OutputFilename = OutputFile.DirectoryName + "\\" + OutputFile.Name.Remove(OutputFile.Name.Length - (OutputFile.Extension.Length)) + "[" + Size.ToString().Trim() + "]" + OutputFile.Extension;
                    if (OutputFilename != null)
                        catch (Exception ex)
            private static void ErrorResult()
                //throw new Exception("The method or operation is not implemented.");
            /// Creates a resized bitmap from an existing image on disk.
            /// Call Dispose on the returned Bitmap object
            /// Taken from Rick Strahl's code at 
            /// Bitmap or null
            public static Bitmap CreateThumbnail(string lcFilename, int lnWidth, int lnHeight)
                Bitmap bmpOut = null;
                    Bitmap loBMP = new Bitmap(lcFilename);
                    ImageFormat loFormat = loBMP.RawFormat;
                    decimal lnRatio;
                    int lnNewWidth = 0;
                    int lnNewHeight = 0;
                    //*** If the image is smaller than a thumbnail just return it
                    if (loBMP.Width < lnWidth && loBMP.Height < lnHeight)
                        return loBMP;
                    if (loBMP.Width > loBMP.Height)
                        lnRatio = (decimal)lnWidth / loBMP.Width;
                        lnNewWidth = lnWidth;
                        decimal lnTemp = loBMP.Height * lnRatio;
                        lnNewHeight = (int)lnTemp;
                        lnRatio = (decimal)lnHeight / loBMP.Height;
                        lnNewHeight = lnHeight;
                        decimal lnTemp = loBMP.Width * lnRatio;
                        lnNewWidth = (int)lnTemp;
                    // System.Drawing.Image imgOut = 
                    //      loBMP.GetThumbnailImage(lnNewWidth,lnNewHeight,
                    //                              null,IntPtr.Zero);
                    // *** This code creates cleaner (though bigger) thumbnails and properly
                    // *** and handles GIF files better by generating a white background for
                    // *** transparent images (as opposed to black)
                    bmpOut = new Bitmap(lnNewWidth, lnNewHeight);
                    Graphics g = Graphics.FromImage(bmpOut);
                    g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
                    g.FillRectangle(Brushes.White, 0, 0, lnNewWidth, lnNewHeight);
                    g.DrawImage(loBMP, 0, 0, lnNewWidth, lnNewHeight);
                    return null;
                return bmpOut;
  • Andrew Coates ::: MSFT

    Wow, Now I'm MCPD!


    Call me unusual, but I like doing the MS Certification exams. First, some history.

    MCP LogoMy first exam was way back in 1999, when I participated in the beta program for the (then) new Visual FoxPro exams, 70-155 (Designing and Implementing Distributed Applications with Microsoft® Visual FoxPro® 6.0) and 70-156 (Designing and Implementing Desktop Applications with Microsoft® Visual FoxPro® 6.0). These were awarded when the beta program for those exams finished on 09 Feb 2000. All of a sudden I was an MCP.

    MCSD LogoI was hooked. Soon afterwards I followed up with the compulsory 70-100 (Analyzing Requirements and Defining Solution Architectures) and the optional 70-029 (Designing and Implementing Databases with Microsoft® SQL Server 7.0) exams and by April 12 that year I was an MCSD (although not MCSD.NET - this was in the Win32 timeframe).

    I haven't hyperlinked any of the exams above, because they've since been retired and are no longer listed on the MCP exam site. Some time passed after this as I hadn't moved to .NET (I was still working a lot with VFP), and there were no new exams that seemed relevant.

    That changed in 2004 when I accepted this role at MS, and in August 2005 I passed my first .NET exam: 70-305 (Developing and Implementing Web Applications with Microsoft® Visual Basic® .NET and Microsoft® Visual Studio® .NET). I sat the exam at our internal technical conference, TechReady and I found that sitting exams at a conference made a lot of sense. It was time that was already out of band for me, I was half-way across the world, immersed in the technology and I wasn't likely to get distracted by the day-to-day events that seem to sap your time for doing "optional" things.

    The next year (2006) at TechReady, I really went for it. I sat and passed 4 exams in a week (in chronological order) - 70-431 (TS: Microsoft® SQL Server™ 2005 - Implementation and Maintenance), the foundation 70-536 (TS: Microsoft® .NET Framework 2.0 - Application Development Foundation), 70-528 (TS: Microsoft® .NET Framework 2.0 - Web-based Client Development) and 70-526 (TS: Microsoft® .NET Framework 2.0 - Windows®-based Client Development). This gave me a new certification in the new generation of certifications. I was now a MCTS three times over (2 in .NET and one in SQL 2005).

    This year I took the same approach. I sat and passed another 4 exams in a week: one TS; 70-529 (TS: Microsoft® .NET Framework 2.0 - Distributed Application Development) and three PRO; 70-547 (PRO: Designing and Developing Web-based Applications by Using the Microsoft® .NET Framework), 70-548 (PRO: Designing and Developing Windows®-based Applications by Using the Microsoft® .NET Framework) and 70-549 (PRO: Designing and Developing Enterprise Applications by Using the Microsoft® .NET Framework). This gave me an additional MCTS (.Net Framework 2.0: Distributed Applications) and also certified me as a MCPD three times over (Web Developer, Windows Developer and Enterprise Application Developer)

    My impression of the certification program and the exams is very positive. Each time I study for and sit an exam I feel that I learn more and more about the breadth and capability of the product or technology I'm studying. Being forced to explore all of the parts means that I discover areas I may never have come across day-to-day, but that prove useful as I go about my job. It also helps me build an overall picture of (in this case) the framework and how its parts fit together. Finally, it gives me a tangible set of achievements to which I can point my manager (or a potential employer). Having passed these exams demonstrates a base level of knowledge and at least some interest in furthering my understanding of the tools I'm using. Note that I'm not saying that this is the only way to further one's understanding, indeed it's not the only way I use, but it is something that is easily demonstrated. I only need to point interested parties at the Transcript Sharing Page and tell them to use TranscriptID 735419 and Access Code AndrewCoates.

    If you've got to the end of this rather long post and you want more information about Microsoft Certifications, there's the official site, but you can do a lot worse than to subscribe to Trika Harms zum Spreckel's entertaining blog (although, if you get a chance to meet Trika in person as I just have at TechEd, you won't be at all surprised that her blog is so entertaining). Local MVP and certification junkie Rob Farley also often posts great information.

  • Andrew Coates ::: MSFT

    New Machine Checklist


    I'm doing a (long overdue) rebuild of my Toshiba M200 to get rid of any Beta1/Beta2/CTP/RC gremlins.

    Here's the process I use, as well as the checklist of things to install (in no particular order)

    0. Backup the data that live on my HDD and are not replicated elsewhere. I use folder redirection for my My Documents folder, so all that lives on a server somewhere that's backed up, volume shadow copied and generally made available offline. I use the Files and Settings Transfer Wizard and also do an xCopy of my working folders to an external HD

    1. Install the base OS from the media or the network (in this case it's from my VISTA CD burnt from the internal share)

    2. Install Patches, SPs and Hotfixes (Microsoft Update is your friend)

    3. Install Anti-virus

    4. Join the Domain

    5. Install all the Apps

    Application Installed From
    Wireless Certs Internal Share
    ISA 2004 Client Internal Share
    Office 2003 Internal Share
    Office 2003 SP MSDN DVD
    Office Hot Fixes Office Update
    Plus! Super Pack Internal Share
    VFP 9.0 MSDN DVD/Internal Share
    Acrobat Reader
    VS2005 (Team Suite) MSDN DVD/Internal Share
    SQL2005 (Developer Edition) MSDN DVD/Internal Share
    HeadTrax Internal Share
    Windows Mobile 5.0 SDK for Pocket PC
    Windows Mobile 5.0 SDK for Smartphone
    MS Smart Card Utilities Internal Share
    Tablet PC Platform SDK
    Virtual PC 2004 SP1 Internal Share
    Virtual Server 2005 Internal Share
    RichCopy Internal Share
    MS Anti Spyware
    E-Learning Offline Player
    MSN 7.5
    Refactor! DevX
    iBurst Drivers CD
    Experience Pack for Tablet PC
    Streets and Trips 2006 Internal Share
    MS Timezone
    Voice Command Internal Share
    Nero CD
    Power Toys for Tablet
    Power Toys for XP
    SOTI Internal Share
    WinZip Internal Share
    ActiveSync 4.0
    Mobile Developer Power Toys
    MapPoint WebService SDK
    Pocket PC Powertoys
    MSN Toolbar
  • Andrew Coates ::: MSFT

    Learning Online with Virtual Labs - ASP.NET Virtual Labs


    Celebrate the new Financial Year with another great set of labs. ASP.NET Virtual Labs (from the MSDN Suite of Virtual Labs)

    With ASP.NET you create richer Web applications with fewer lines of code. These virtual labs teach you about the innovations that debuted with ASP.NET 1.x and introduces you to the major improvements introduced with ASP.NET 2.0. These include dozens of new controls, new Membership and Profile application services and support for creating multiple pages based on a common template using Master Pages. Begin exploring Web development with ASP.NET and Visual Web Developer 2005 Express Edition today.

    What's new in ASP.NET 2.0
    Virtual Lab Express is the fastest and easiest way to test drive Microsoft products and the Virtual Lab environment. These are 20-minute hands-on overviews of some of your favorite Microsoft products and developer tools. Try them out online now - no need to download full trial versions or dedicate test machines.

    ASP.NET 2.0 Virtual Labs

    ASP.NET Virtual Labs

    Fritz Onion's Intro to ASP.NET Virtual Labs

    You get a downloadable manual and a 90-minute block of time for each module. You can sign up for additional 90-minute blocks at any time.

  • Andrew Coates ::: MSFT

    MapPoint Web Service COM wrapper and VFP Sample


    I've been talking about this for a while, and I've finally uploaded a COM wrapper around the MapPoint Web Service and a sample VFP form that shows the Find and Render services. You can grab them both from Darren's most excellent ProjectDistributor site.

    To use them, you'll need a MapPoint WS eval account, or, if you're an MSDN subscriber Sign up for a MapPoint Web Service Developer Account. If you want to explore the SDK, you can get it here.

  • Andrew Coates ::: MSFT

    Training and More


    I've just spent 4 days of last week on Readify's excellent Industrial Strength .NET Course, lead by the incomporable Mitch Denny. Things really started to hot up on the last day when we discussed the merits of natural vs artificial primary keys in tables (try as we might, we couldn't get Mitch to see the light <g>). Mitch also proposed the ditching entirely of SQL to be replace with an object-oriented construct something like:

    objectDataSet Customers = new objectDataSet("select * from Customers");
    objectDataSet ImportedCustomers = new objectDataSet("Select * from ImportTable");
    objectDataSet MissingCustomers = ImportedCustomers - Customers;

    An interesting overloading concept, but it leaves a lot of questions unanswered.

Page 4 of 47 (470 items) «23456»