Send a suggestion!

We're building a brand new version of the site, and we'd love to hear your ideas

Members

Technology Zones

IBM Learning Center

Articles

Hosted By

MaximumASP

Info

30 Jul 2006 - Developer Blogs in United Kingdom

Blog Entries (30 Jul 2006) RSS << Earlier | Later >>

  • Glass in C#, an alternative approach

    Published on 30 Jul 2006 from

    My blog post on extending Windows Vista's glass into the client area of managed applications seems to have drawn a lot of attention (and some questions). If you haven't already, please read glass and C# (it assumes you are already familiar with Glass on Vista).

    In that approach we looked at 5 steps. There is an alternative approach to extending glass with C# on Vista. The alternative approach has the same 1st and 2nd steps. The step that changes is the 3rd step: explicitly using a black brush to paint the extended area of the form in the form's paint event handler.

    Rather than do that, do this:
    3. Place a panel on the form's top edge, set the panel's BackColor to color X and then set the form's TransparencyKey to the same color X.

    When you run the application, the area occupied by the panel will have the glass effect :-)

    Note that just using the BackColor of a panel combined with TransparencyKey of form, results in transparency (also applicable to WinXP). The fact that we do that on Vista in an area that we extended with DwmExtendFrameIntoClientArea, is what gives it the glass effect.

    This approach of using panels and transparency was first described (afaik) by Tim Sneath here. If you read the comments on Tim's blog post you'll find a heap of unanswered questions regarding a fundamental problem: At runtime, clicking anywhere on the glass area, actually brings to the front the application behind it. In other words, there is true transparency i.e. inability to click on the glass area while retaining focus in this application.

    The solution to the problem actually lies in what color you pick. Above I state that you should pick color X but I have not said what X must be. In Tim's example, he picked Gainsboro. If you look at Gainsboro it has the following values: R=220, G=220, B=220. The problem of the unwanted true transparency stems from the fact that all values are equal. So if you just change for example the R to be 221, then the problem goes away :-) Another gotcha if you create your own color is setting the Alpha of the color to anything but 255 (doing that will not render as glass).

    So, now we have two approaches for achieving the same goal (I still prefer the explicit black painting) and you can download a project with the transparencykey approach here. Before I finish off, it is worth pointing out that when a window is maximized, any glass area appears black, which is the reason that most windows rendered fully in glass, do not offer a maximize button (to the dismay of Goths I guess :-p).



    While from a practical point of view it all works, some of you will have open questions such as "why black?" and "what makes one color result in true transparency while another doesn't". I'll try to answer those in a future blog entry (if no one else beats me to it).

  • Disruption in the IT market

    Published on 30 Jul 2006 from

     

    So how has this disruption effected the IT market? In this context we have to think of the market as being the Enterprise Market and the Consumer Market. The Enterprise can in turn be thought of as two different parts; the Business element and the IT Organization. The IT groups in enterprises have been struggling for a number of years now with the rapid and flexible creation of new applications for the business in a cost constrained environment whilst they have to support, maintain and integrate with an ever increasing number and complexity of applications and platforms. They have investigated standardization, governance and "one size fits all" approaches, new tools and technologies and outsourcing and off shoring as possible solutions for the delivery of business support in this complex environment but in general haven't yet been able to deliver the level of flexibility that the business is looking for at the level of cost it wants to pay.

     

    In the last five years there has been a great deal of interest in service based application development to provide the levels of responsiveness and flexibility that the business side of the organization is looking for by building or buying in business level elements of service which are loosely coupled using a standardized message passing approach. This approach to building IT systems has been dubbed "Service Orientation" (SO) and an organization where all the systems are Service Oriented is said to have a "Service Oriented Architecture" (SOA). Of course in practice with real Enterprises such a homogeneous SOA approach is unlikely to be achieved but SO does hold great promise for building more flexible IT systems. A more recent development of SOA is the Enterprise Service bus (ESB) which provides SOA support via a messaging engine (the bus).

     

    It should be noted that the most important aspect of a SO based approach is the ability to quickly link together services from a number of different sources built at different times (which is not the same as reuse). This implies the use of a standards based approach such as Web Services.

     

    Microsoft strongly believes in a Service Oriented approach to provide a more flexible IT system and has invested heavily in Web Services support in areas such as .Net and WCF and support for Web Services Standards. It also supports ESB with Biztalk but believes that some of the wilder claims that are made for SOA and ESB should be tempered with pragmatism based upon the realities of large organizations and IT systems.

     

    Whilst the enterprise has been focused on a rigorous and standards based Service Oriented approach the consumer web has focused on using the technology already available to be able to read and write from the browser to the web. Web 2.0, a read / write internet which allows users to create, save, use, interact and discuss rich content (text, documents, data, audio, music, images, photos' graphics, video, movies, games) and applications rapidly and easily, has become very important to all types of users in the consumer space and has had incredible take-up by small startups and consumers.

     

    Web 2.0 systems are also built around the concepts of "business" level services (such as a map or photo) and loose coupling using a message passing approach (HTTP PUT and GET) so could be termed a "Service Oriented" approach but the message passing implementation is different with the services generally accessed as a mashup application running under the Ajax framework in the browser and provided over a Representational State Transfer (REST) message passing system from a software service supplier or as Software as a Service (SaaS). Architecturally however the SOA and Web 2.0 approaches are very similar with them both being based on asynchronous, loosely coupled message passing services. The following table shows the implementation differences between the approaches:

     

      Consumer SO Enterprise SO
    Marketing name Web 2.0 SOA
    Application type Mashup Composite application
    UI Ajax (Atlas) Smart Client (WPF)
    Communication system REST (ESS) Web Service (WCF)
    Service SaaS (Live Mail, Search, Local) Server (Exchange, SQL, Biztalk)
    Microsoft Name Windows Live Windows Server

     

     

    Microsoft supports both the Enterprise SO approach (SOA) and the Consumer SO (Web 2.0) approach with tools, technologies, services, servers and products.

  • Common Gotcha: Slow VS 2005 Web Site Build Performance Because of “Dueling Assembly References”

    Published on 30 Jul 2006 from

    Symptom:

    When building a VS 2005 Web Site Project you experience very slow build times – where compilation seems to mysteriously pause for 30+ seconds (or even minutes), before continuing each time you do a build or F5 of the project.

    This compilation performance slow-down might be the result of a problem I call “dueling assembly references”.  This can occur when you setup multiple “automatic refresh enabled” file-system assembly references within your web site project to multiple assemblies that in turn share common assembly dependencies whose version numbers are different.  The post below describes this in more detail and how to fix it.

    Some background on how file-assembly references work:

    Developers using VS 2005 Web Site Projects can add references to assemblies in multiple ways.  When you right-click on a project and choose the “Add Reference” menu option, it provides a dialog like the one below that allows you to reference .NET assemblies registered in the GAC, class libraries built as projects in the same VS solution, COM components, and file-path based assemblies that you pick using the “Browse” tab of the “Add References” dialog:

    When you add a file-system based assembly reference using the “Browse” dialog above, VS 2005 Web Sites will copy the assembly picked into the \bin directory of the project as well as (by default) add a .refresh file into the \bin directory that contains a relative path string that points back to the original assembly path location:

    When you build the solution, VS will automatically check those assemblies with .refresh files to see if a newer version of the assembly is available, and if so automatically re-copy the assembly and re-compile the solution using it.  This avoids you having to manually update the assembly yourself every time it changes (it also avoids you having to check-in the assembly under source control).  If you don’t want this “automatic refresh” capability, you can delete the .refresh file – in which case VS will not check the timestamp nor update the assembly for you.

    Because assemblies often have dependent assembly references, Visual Studio will also automatically copy dependent assemblies that a reference assembly requires into the \bin directory of the target web-site as well.  For example: if you setup a file-based reference to ClassLibrary1.dll, which in turn uses an assembly called SharedLibrary.dll that resides in the same directory, Visual Studio will make sure both assemblies are copied into the Web Site’s \bin directory (note: if it didn’t do this then the app would fail to run).

    Dueling Assembly Reference Problem

    The problem I refer to as a “dueling reference” occurs when you setup multiple file-based references to assemblies from a VS 2005 Web Site Project that are each updated dynamically (using .refresh files), and which in turn have dependencies on different versions of a common shared assembly library.  

    For example, assume your web-site has a reference to AssemblyA.dll and AssemblyB.dll – which in turn each reference AssemblyC.dll.  This will work without problems if the referenced AssemblyC.dll is the same version for both AssemblyA.dll and AssemblyB.dll.  But it will cause problems if the AssemblyC.dll being used is different between the two:

    In cases where AssemblyC.dll is different, VS ends up copying the AssemblyC.dll file twice for each build – since it continually thinks that the assembly has been updated (once for each reference).  This ends up requiring all references to be recalculated by the compiler, and a full re-build to occur within the IDE.  This will cause build performance to slow down dramatically, and will cause builds to appear to pause as VS does this reference recalculation and fix-up on every single build.

    How to Fix This Problem

    There are a couple of ways to fix this problem:

    1) The “most correct” way to fix this issue is to make sure your class library references are built against the same version of any dependent assemblies.   This is good to-do not just to fix the above build performance problem, but also because it decreases the likelihood of introducing hard to figure out bugs in your application (at runtime only one version of the shared assembly is going to be used –so if you don’t fix this at least one of your dependent assemblies will end up running against an assembly it wasn’t built/unit-tested with).

    2) The “easiest quick fix” way to resolve this issue is to modify one or more of your assembly file-based references to not be “automatic refresh enabled”.  You can do this by deleting the .refresh files within your \bin directory that produce that shared conflict.  This will avoid having VS auto-update the assemblies, and so will prevent the dueling update conflict altogether.   You might find it useful to quickly disable this behavior by deleting the .refresh files as a stop-gap, and then re-enable the auto-refresh behavior once you fix the shared assembly conflicts.

    Note that VS 2005 Web Application Projects don’t have this dueling reference issue (since they don’t use .refresh files for file-assembly references).  So you won’t have this build-performance problem with it (instead it will just pick one version of the shared assembly to use).   However, you still want to be careful about cases where you have two components built against two separate versions of a shared assembly – since this can still cause hard to understand behavioral bugs at runtime that end up bypassing your carefully written unit-tests (which were run against a different version of the shared assembly).

    Hope this helps,

    Scott

    Share this post: Email it! | bookmark it! | digg it! | reddit!

  • Java, security, and Lily Allen

    Published on 30 Jul 2006 from

    Java's more secure than ActiveX, right? It can be, but users visiting, for example, Lily Allen's official website may be hard pressed to tell the difference. Lily Allen, by the way, is the up-and-coming pop songstress of the moment in the UK. If you have the CD, you can access exclusive content; to do so, you first have to click this link. Fill in the form, and a Java applet pops up a security dialog. Here it is:

    Fair enough; I've not heard of Push Entertainment Ltd; and I'm not sure why, by default, I should "always trust content from this publisher"; but it's a sandboxed Java applet. Or is it? If you are the cautious type, perhaps you click More Information:

    Now I'm really worried. Apparently this applet will not be sandboxed after all. Do I trust Push Entertainment Ltd to do no harm to my machine? The applet is most likely fine (all it needs to do, in reality, is check whether a certain CD is in the drive); but on balance I'll live without the exclusive content.

    My observations. First, this looks like the exact same security model as ActiveX: if it's signed and you agree, anything might happen. Second, I'm disappointed that the warning about running outside the sandbox is hidden behind a "more information" link that few people will click. Third, it underlines the importance of running with limited rights. That offers more reliable protection than application sandboxing.

    In reality, Java does have a more fine-grained security model than ActiveX (as does .NET). However, in cases like this where there is no easy way to tell exactly what permissions the applet is asking for, what is the real-world difference? The answer perhaps is that ActiveX has a history of cases where the intended security model simply hasn't worked - in the worst cases, controls download and execute without any prompt thanks to bugs in Internet Explorer. I'm not aware of so many problems with signed Java applets.

    These screengrabs all done with FireFox, by the way.

    Tags:

  • Service Component Architecture

    Published on 30 Jul 2006 from

     

    So yet again I think I must be stupid because I don’t understand the whole Service Component Architecture thing. It looks like a programming model (e.g. set of API's) to build web services. I thought that’s one of the many things that J2EE was meant to be supplying. Anyway Microsoft already has that with Windows Communication Framework (WCF) so what's the big deal? Why do we need yet another way of calling web services?

  • The New Marketing

    Published on 30 Jul 2006 from

    As I have commented on before the disruption that is taking place in the consumer space that is commonly called web 2.0 will rapidly move into the enterprise and cause massive dislocations in product development, marketing, sales, support and training. The first hit will be marketing, indeed I am already having meetings with "Directors of Disruptive Marketing" for fortune 100 companies. John Hagel has a interesting and accurate assessment of the change in marketing in his latest post. Watch this space!

  • The Next Disruption

    Published on 30 Jul 2006 from

     

    We are entering a time of rapid change in the IT industry which will cause considerable disruption and change in business, IT companies and the way that people perceive and use technologies. This dislocation is similar to the PC and internet revolutions in terms of scope and effect, touching millions of people, huge marketplace, models of commence, ways of making money and IT usage. It has already spawned new marketplaces, industry's and multibillion dollar companies, has engaged hundreds of millions of people and will have a dramatic effect on all aspects of business. Microsoft strongly believes that this dislocation is underway and we are just in the early days of seeing how it will to effect all our lives.

     

    The driving forces behind this dislocation are the same ones that have driven the previous dislocations we have seen in the IT space; Creativity, Communication and Commerce. People want to be creative and individual, they want to innovate and build, to make new things and generate new ideas. Additionally people want to communicate and share with one another, to work in teams, to collaborate, discuss and interact both locally and globally. This desire to share and the value that can be created by collaboration is tearing down organization barriers, blurring the divisions between consumers, suppliers and business and making all enterprises more transparent. Finally people and organizations want to expand their businesses, marketplaces, revenue and profit; to benefit from their endeavors. Microsoft calls this triumvirate of Commerce, Collaboration and Creativity the Experience hub; it is the driver for the services platform which will provide the infrastructure for all these experiences.

     

    The tipping point that is enabling this dislocation, as in the previous ones, is technology. The lowering cost of bandwidth, the availability of computing in new and cheaper form factors and devices and the increase in productivity and ease of use enabled by simple web based applications and tools have caused a massive uptake of web based applications; the so called "web 2.0" space. This dislocation is in it's early days yet as yet and the full ramifications of what will happen and who will be the leaders has not yet emerged but the opportunities are clearly all around us and those people and organizations which recognize them will be the ones to benefit going forwards.

     

    What is happening at the moment is the learning's, businesses, activities and  technologies that have been incubated in the consumer space are rapidly migrating to and being assimilated by organizations of all sizes. Senior executives in businesses and their families are being able to create, store, find, communicate and share content faster and better than ever before for nothing and are wondering why the same isn't true in their organizations. People expect at least the same if not better facilities at work than they have at home. This expectation will cause many of the consumer based techniques and technologies to move rapidly into the enterprise and forward looking companies are already investigating ways of utilizing this dislocation for their own growth and profit. Talking to the business side of organizations of all sizes this assimilation of consumer based ideas and techniques for innovation and growth in product development, marketing, sales, support and training.

     

    Finally the incredible business opportunity that has been demonstrated by the use of an advertising based revenue model to provide "free" services has created great interest in businesses of all sizes in new charging and revenue models and the associated growth and profit potential. It is clear that moving forward there will be three commerce models: unit, subscription and advertising based.

  • Charlie Poole @ OSCON

    Published on 30 Jul 2006 from

    Charlie Poole has just returned from OSCON and seems to be on a bit of a roll. He writes:

    NUnit on Linux
    Running NUnit Tests in Ruby
    I "Discover" Ruby

    This last few days I keep hearing people rave about Ruby. Last week Sean McCormack was singing the praises of Ruby on Rails. On Friday Howard van Rooijen was encouraging me to try Watir (web testing using Ruby). How much longer will I be able to hold out? ;-)

    Share this post: Email it! | bookmark it! | digg it! | reddit!

  • Loading workflows into Workflow Foundation

    Published on 30 Jul 2006 from

    One of the interesting things about Workflow Foundation is the dazzling array of services that you can plug into it in order to alter/extend the base functionality.   I’ve just been playing very slightly with plugging in a WorkflowLoaderService which takes responsibility for loading workflows into the runtime and so I thought I’d share the very basic stuff that I’ve been playing with.   When you come to the WorkflowRuntime and ask it to create a Workflow for you, you have two choices (note – this is pseudo code which I haven’t compiled);                 Type myWorkflowType = typeof(SomeWorkflowClass);             XmlReader myXmlReader = new XmlTextReader(“c:\\somefile.xml”);               WorkflowRuntime runtime = new WorkflowRuntime();               // Choice 1             runtime.CreateWorkflow( myXmlReader );               // Choice 2             runtime.CreateWorkflow( myWorkflowType );   so you can get a WorkflowInstance created either by passing in an XML definition of the Workflow or by passing in a type.   The runtime handles these two instances itself but if you add an instance of a WorkflowLoaderService into the runtime then the runtime will delegate this responsibility down to your class. The two methods for overriding on WorkflowLoaderService match up with those two CreateWorkflow methods on the WorkflowRuntime in that they have signatures;               Activity          CreateInstance ( XmlReader, XmlReader )             Activity          CreateInstance ( Type )   Note – that second XmlReader is for reading rules definitions and I’ve not really thought about that yet.   One thing I’m slightly disappointed about is that the choice of class here is XmlReader rather than something a little less specific in the sense that I’m not quite sure how you’d build a WorkflowLoaderService here where the Workflow definition did not come from XML. I can see binary scenarios or maybe just plain text scenarios and I had planned to build a plain text scenario before I looked at the base class in detail and realized that it enforces XML on you.   Regardless, I thought I’d have a short stab at providing a WorkflowLoaderService that loads Workflows from XML that is non standard in that it is not XAML based but is, instead, just using XML Serialization in order to do its work. This is just for fun and I think it’s a long way from being complete.
    So, my simple definition of a Workflow ended up giving me an XML file that looks something like this (I’ve taken all the long strings out of it here for formatting);     <?xml version="1.0" encoding="utf-8"?> <activity activityName="" typeName="">   <children>     <activity activityName="" typeName="">       …     </activity>   </children>   <properties>     <property name="" value=""/>   </properties>   <bindings>     <binding propertyName="" sourceActivityName=""               sourceActivityPath=""/>   </bindings> </activity>     So, we simply say that we have an activity which may have some child activities and the activity may need some properties setting on it and it may also bind some properties to properties on other activities in the persisted graph.   I wrote boiler plate CLR classes that map to the activity, property, binding elements in the XML above (I called them ActivityDefinition, PropertyDefinition, BindingDefinition) and just used XML serialization in order to pull that whole definition from the XmlReader provided to me by the override of CreateInstance.   From there, I need an implementation of WorkflowLoaderService something as below;     public class MyLoader : WorkflowLoaderService {   static MyLoader()   {     serializer = new XmlSerializer(typeof(ActivityDefinition));   }   private static XmlSerializer serializer;     protected override Activity CreateInstance(     XmlReader workflowDefinitionReader, XmlReader rulesReader)   {     ActivityDefinition definition = serializer.Deserialize(       workflowDefinitionReader) as ActivityDefinition;       // Note: Assuming it's right to throw from here rather than to     // return null.     return (definition.BuildActivityTree());   }   protected override Activity CreateInstance(Type workflowType)   {     // We don't do this, sorry :-)     throw new NotImplementedException("We don't do this, sorry");   } }   and the slight bit of magic happens in ActivityDefinition.BuildActivityTree where we essentially take what has been de-serialized from the XML file and recursively build up the real Activity graph itself using the types that we’ve been told to create, setting their properties via Reflection and setting any bindings required via SetBinding.   The little test application looks like this (you just click the two buttons in order to get it to load the workflow from the non-standard XML in the textbox and then run it).     Note: This sample is far from complete because it really only handles string properties on Activity and there’s probably a number of other things missing – it was written whilst delayed on a flight through Heathrow so the quality will be my usual low standard J   Here’s the link if you want to play with it though (Beta 2 build).

  • The next generation of in-house software development?

    Published on 30 Jul 2006 from

    A recent McKinsey Quarterly article (registration required) “The next generation of in-house software development” describes how some pioneering banks, pharmaceutical and media companies have taken a lead from software product developers and turned elements of their custom-application support into packaged products that can be reused in multiple applications. The headline benefits they’ve reported include: A 30% reduction in [...]

  • SharePoint User Group Roundup - part 2

    Published on 30 Jul 2006 from

    The second SharePoint User Group meeting of July was held last Wednesday in Reading and hosted by HP. Natasha from HP was very kind and sorted the speakers, venue, and food which meant I could have a rest from the organising! The evening was a mix of SharePoint 2003 and Live Communications Server, a presentation on managing change and benefit realisation from SharePoint projects, and a demo of Knowledge Network which is the free addin for MOSS 2007.

    Natasha’s presentation on managing change and benefits was the first ever presentation at a suguk event that didn’t involve any SharePoint demos! It was well received though and there was some good debate and questions after the session about managing users expectations.

    The best part for me though was Kevin Laahs who presented on Knowledge Network. I missed the Knowledge Network presentation back at the SharePoint conference in Seattle so it was great to see it here. Hopefully organisations and employees will look at using this and see past the whole Big Brother worry that people always mention.

    Thanks again to HP for hosting and presenting. I’ll probably organise only one meeting for August in London as people may be away on holidays. Watch this space for more details. If there are any particular topics you’d like to see presented, please let me know.

  • Not the monsters they're made out to be... Not even close

    Published on 30 Jul 2006 from

    Just about everyone has heard the horror stories associated with the words "Pit Bull". Those two words used together strike fear in the heart of many people in the United States. So much so that a lot of municipalities have started passing breed legislation banning the American Pit Bull Terrier.

    As a devout animal lover, it makes me sad, even angry to learn of this type of animal predjudice. If you have time, I'd like you to browse the link below. It's pretty amazing and has some good facts about the American Pit Bull Terrier, and the lovers and good pets, workers, and helpers they really are.

    For Pits Sake
    www.forpitssake.org

  • Syndicated content search - still broken

    Published on 30 Jul 2006 from

    For a few months now, Randy Charles Morin has been tracking and grading the performance of search engines specializing in syndicated (RSS'd or Atomized) content.

    These search tools can be invaluable when you are trying to keep track of what customers, partners, influencers and press are saying about your product.

    Now, having customers use your feedback systems is great and all very well, but you don't get the whole picture, no matter how convenient these might be to use. From a product development / design point of view, listening to what your customers are saying about your existing and planned products requires the effort to reach out and listen to them in the places where they are talking.

    Increasingly, 'those places' are blogs. 35m+ of them depending on who's numbers you believe. Needles in haystacks, and all that...

    This where these tools come in and why they can be so valuable.

    From reading through Randy's research and from my own personal experience I can only conclude that there is still plenty of room for improvement required from these types of syndicated content search service providers. In fact, I'd say there is still even room for a new player (or players) to enter and dominate this space.

    The engines Randy has been tracking are:

    • Blogdigger
    • Bloglines
    • Blogpulse
    • Google Blogsearch
    • Feedster
    • Pubsub
    • Icerocket
    • Technorati.

    For the last few months I've been running the same query ("ado.net") on these engines. The frustrating thing is that one week Icerocket might do better than Google's Blogsearch. Then the next week Technorati seems best. And the next week Bloglines. Without any of these making significant (apparent) improvements overall. This space is broken.

    It means that in order for me to track what I want to, I have to track a number of search results (which I subscribe to) in order to get the complete picture. Lots of de-dupping. And yet there seems to be no rhyme nor reason for all this variation in performance.

    This isn't a short term phenomenon. I've tried them all myself (some for over two years +) in a number of contexts, and like Randy, I've found their results variable at best, but sadly they perform mostly poorly, most of the time.

    So what is 'performance' is this space? Performance attributes I consider high priority (listed in order of priority) are:

    • Completeness / size of index
    • Time taken for items (from publishing) to be included within index (i.e. minutes, not days)
    • Consistency of service performance over time
    • Order results by content type (e.g. blogs, 'news', forums)
    • Order results by date and relevancy
    • Low spam pollution

    You can judge for yourself - here are the following results for "ado.net":

    As you can see, most of the results are all over the shop. Track them for a few days and weeks and you'll see the pattern - broken, broken, broken.

    Today, it seems Bloglines provided the best results - today. Tomorrow? Who knows...Please, someone win here.

  • Virtual Earth SDK - New Download

    Published on 30 Jul 2006 from

    There's a new SDK out for virtual earth - and by SDK I mean Help File (and it's a good help file).

    There are some good samples and snippets in there such as: -

    Bird's eye images are low-angle, very high-resolution aerial images. Unlike the other map styles, bird's eye images exist only for specific regions and do not provide continuous map coverage.

    The Virtual Earth map control has built-in support for the bird's eye image type. You do not need to add any additional code to your Web page to enable your users to see bird's eye images. If users move the map to a region where bird's eye images are available, the map navigation control changes automatically.

    However, there may be times when you want to show a specific bird's eye image or create your own bird's eye navigation control. This topic explains how to