I just received an email from US Airways (my preferred airline) in my inbox…here’s an excerpt:

It's no secret that the airline business is facing difficulties of unprecedented proportions; and 'unfortunately
US Airways is no exception. Surviving high oil prices is going to require some substantial changes to the way the industry is run. Today, we announced a series of changes designed to prepare our airline for these new ways of doing business.

Specifically, we announced changes to domestic capacity, the Dividend Miles program and our overall business model. We're transforming our business by initiating a 'pay-for-what-you-use' model for items like baggage and beverages. We're also making changes to the Dividend Miles program that you should know about.
Among the changes we announced today, we will:

    • Assess a $25, $35 or $50 award processing fee (depending on where you travel) for award tickets booked on or after August 6, 2008.
    • Introduce a first checked bag fee of $15 for tickets booked on or after July 9, 2008. As a Preferred member, you and anyone traveling on your reservation will be exempt from the baggage fee.
    • End Preferred bonus miles for travel booked on or after August 6, 2008.

I knew this had to be coming.  American was the first to charge for baggage and then others (including US Airways) indicated they would stop serving snacks.  I expect that the free drink services will transition to a full charge service shortly as well. [UPDATE: wow, I didn't click through the email until now -- they will charge for soft drinks--$2!]

Now before you comment about “US Scare” or “America Worst” I realize that the airline is not without faults.  In fact on a recent trip to New York, my baggage was lost (which included my suit for a wedding I was to attend the next morning).  I was livid.  As an exclusive traveler on US Airways (I’m not a huge traveler, but did clock 170K miles last year on the airline) I felt the way I was being treated was horrible.  My initial compensation offer was $25/ticketed passenger.  I eventually got this to $250/ticketed passenger which met our needs until our baggage was found (2 days later and at the end of the trip).  During this time I reflected on the airline.  I could have easily said that US Airways sucked horribly and I would never fly them again.  There were other situations on that particular trip that could have easily swayed me that way.  But I realized that no airline is perfect.  Especially calculate that with each airline is actually interfacing with other staff in hundreds of airports across the world, it isn’t always in complete control of the situation.  But I came to one conclusion during my anger toward the situation.

Given all that is happening with the airline industry the customer service group and how it treats its customers is the most important part of the business and should be given 100% budget and attention. 

You see it isn’t the crap that happens (like lost luggage) that makes you a bad or good airline (or any other company for that matter), it is what you do in those situations that defines you as an organization.  The airlines claiming all these price crunches, gas prices, etc. need to refocus on customer service…because right now since I have to pay for a ticket and pay to bring clothes with me on my trip – the only differentiating factor in the industry is how I’m treated as a customer…all other things to me are now equal.  My preferred airline program now is barely yielding me benefits it initially promised.

This brings me to a thought on this whole baggage fee thing got me and my wife talking.  Specifically she asked why they don’t just raise ticket prices.  And I agree.  You see, charging for checked baggage I think has negative effects in a few places:

    • It will encourage people to carry-on which will lead to even more dis-satisfaction (DSAT) because you’ll now have even more crowded overhead space.  What will happen if I run out of space and have to check?  Is the gate agent prepared to accept a transaction fee at the gate?
    • It makes customers feel unhappy and feeling targeted as consumers to excessive fees…we look at it as double-charging us.

But on the other side I get it.  You see US Airways couldn’t have just raised their fares.  Well, they could have, but it would likely have even more a negative effect on their business bottom line.  Why?  Because we as consumers are irrational.  You see, when we (most of us, so if you are an anomaly, disregard :-)) book airfare, we’ll search for airlines and see that PHX-EWR might be $200 on US Airways and $200 on American.  Great, they are the same so we’ll book with our preference.  But if US Airways raised their price, then it would be, for example, $215…we’ll look at that and say that American is cheaper and book that ticket…not realizing that American will still charge us $15/bag checked.  You see unless all airlines raised their fares, then everyone is trying to play by the same sneaky rules.  US Airways is raising their bag fees because it can’t raise the fares or would be less competitive on fares.  We consumers don’t mentally take into account fees until after the purchasing decision has already been made.  It’s lame, but true.

But instead of trying to change the industry and just being honest – raising fares – the airlines are taking these fees in a way to disguise the fares (which are probably being raised anyway) remaining the same.  This is happening, however, at the DSAT of the customer.  I mean, c’mon – how many of you are reading into baggage fees and saying Are you kidding me?  I have to pay to bring my [clothes] now?  Ridonkulous!  I hope that the geniuses at the airlines know what they are doing…I don’t think they do.  Consider the email above.  What if it read something like this:

Let’s face it, the economy isn’t the greatest right now.  You likely have an automobile, were you happy the last time you put gasoline in your car?  Neither were we.  US Airways is faced with these same economic pressures as you are and unfortunately we’ve had to make some tough decisions.

We could have easily said we’re going to charge you to check your baggage or stop feeding you the small snacks that we provide, but we figure we’d be more honest.  We are likely going to have to raise our fares in most situations.  This is not an easy decision to make, but a necessary one in the current environment we are faced with.  We felt it would be better to be honest with you rather than assess new fees for baggage, etc. that would cause more trouble during your travels.  We want you to have the same travel process as you always have done and not interrupt preparation for your business trip, weekend getaway, or family vacation.  We want your flights to continue to be as smooth as possible, enjoy the same service you’ve been accustomed to with US Airways on the ground and with the in-flight service.

We’re sorry about this and as one of the nation’s largest, low-cost airlines we strive to continue to provide the best service.  We hope that you will continue flying with us as we’ll do our best to put YOU first.

Now, I’m not sure if that would have changed your mind, but had I received that, it would have been refreshing honesty.  “Hey, we need to raise rates…we don’t want to, but are going to have to to remain in business and provide the service you expect.”  That’s the message I want to hear.  Instead I hear “We’re not creative enough to think otherwise or bold enough to try to change the industry thoughts, so we’re going to charge you $15 to bring your bathing suit with you on your trip to San Diego.  Enjoy suckers.”  Here’s a suggestion of reducing costs instead of charging me to bring my underwear:  Get rid of those credit card peddlers in PHX.  It’s annoying and not adding value to the brand of US Airways!

It sucks.  The industry is really not being smart.  They need to get creative.  Think hard on putting the customer first while still surviving in a highly competitive industry.  Changing your fees only is NOT differentiating yourself.  US Airways now to me is no different than anyone else.  In fact Southwest is looking more and more attractive and for me is a decent alternative flying out of the southwestern United States.

What do you think?  Maybe Doug Parker will read this and respond?  Doug?  Are you listening?  Have you really thought different?

Suggested reading:

I hope it gets better…soon.

I’ve just finished updating my modification of Joel’s original concept.  Joel had a really great base for me to build off of and used styling and templates to create simple controls for a standard Silverlight media player that could be embedded.  I took his sample and made some minor adjustments to accommodate automatic sizing as well as make it a bit more parameter-driven.  The end result was (what I think at least) a fairly nice player that could be flexible if needed:

Joel made great use of styling primitive controls to be able to leverage core functionality rather than building it all himself.  One of those controls used was the ToggleButton (the play/pause feature) which makes sense for the implementation.  In the beta 1 version of styling we were able to use different styles for MouseOver states for checked/unchecked features.  A snippet of the styling XAML looked like this:

<Storyboard x:Key="MouseOver Unchecked State">
    <DoubleAnimation Duration="0:0:0.1" Storyboard.TargetName="playSymbol" 
Storyboard.TargetProperty="Opacity" To="1" /> <DoubleAnimation Duration="0:0:0.1" Storyboard.TargetName="pauseSymbol"
Storyboard.TargetProperty="Opacity" To="0" /> </Storyboard>

This worked fine in beta 1.  Beta 2 introduces the VisualStateManager model which is an exciting new feature for developers and designers.  Opening the video player project in the latest tools had some things blow up for us…no problem, let’s make use of VSM to change the styling implementation.

One problem…the ToggleButton no longer supports MouseOver states specifically for Checked/Unchecked as we’ve implemented in the video player.  My first thought (and a few emails to the team) was to inherit from the ToggleButton and do my own implementation, adding those states into the control.  I was able to do this by creating a new class file in my Silverlight project, then inheriting from ToggleButton and a few overrides.  I first wanted to support VSM so I added the appropriate TemplateParts to my class:

[TemplateVisualState(Name = "CheckedMouseOver", GroupName = "CheckStates"), 
TemplateVisualState(Name = "CheckedMouseOut", GroupName = "CheckStates"), TemplateVisualState(Name = "UncheckedMouseOver", GroupName = "CheckStates"),
TemplateVisualState(Name = "UncheckedMouseOut", GroupName = "CheckStates")] public class ToggleButtonEnhanced : ToggleButton {

This worked fine and they showed up in Blend designers as well for me to implement.  I then chose to override the MouseEnter/Leave events and did something quick like this:

protected override void OnMouseEnter(MouseEventArgs e)
{
    base.OnMouseEnter(e);
    if (base.IsEnabled)
    {
        if ((bool)base.IsChecked)
        {
            VisualStateManager.GoToState(this, "CheckedMouseOver", true);
        }
        else if ((bool)!base.IsChecked)
        {
            VisualStateManager.GoToState(this, "UncheckedMouseOver", true);
        }
    }
}

Fair enough right?  Well it appeared to be working.  The problem was that ToggleButton maintained a Normal state that was conflicting with certain scenarios I had in my implementation.  You see the base.OnMouseEnter() was essentially the rathole here.  Some spelunking showed that when a state changed it actualy went from the desired state, then back to ‘Normal’ – for example the Pressed action wend: MouseOver,Pressed,Normal.  The final transition was causing my problem.

Now I was looking at overriding the OnApplyTemplate method and thus virtually having to re-implement all the other state transitions as well.  Now I’m no longer really getting a huge benefit out of my inheritance.  So I went back to some experts for some advice.  Dave gave me some pointers and we chatted about the implementation and desired outcomes.  Dave’s much smarter than me on VSM, well, because he had to implement it :-).  For my particular scenario he pointed out that I really had only one property that was changing in the MouseEnter/Leave events: Opacity.  So why not just change Opacity for the Grid container rather than worry about the elements.  Duh.

So now I no longer needed my custom ToggleButton, but could use the primitive ToggleButton to do my dirty work.  I implemented the MouseOver, Checked, and Unchecked states is all I really needed to manage my transitions.  A few learnings about some things I was doing wrong and boom, the new player works as expected.

I learned a few things in this quick journey through VSMville, and one was that it was pretty easy to implement a custom control to support the VisualStateManager model as well.  I think I’ll be digging into this one deeper soon.

Hope this helps someone!  Here’s the code for the updated Video Player.  While the ToggleButtonEnhanced is not used in the final implementation, I kept it in the code file so you could see what path I started along.

One of the things I love about the Microsoft developer ecosystem is the partner channels that are enabled to create great add-ons to our platforms and frameworks.  Our partners in this space usually get to the better implementations before we do, taking on the task of filling some gaps in unique implementations while our teams can focus on providing the best framework for enabling that construction.

In December of last year, Telerik showed their intentions of making a control suite for Silverlight (then v1.1).  Well now that beta 2 is released for Silverlight 2, they’ve updated their RadControls for Silverlight 2 suite and have now provided a downloadable CTP of the suite.

Their controls implement support for DataBinding, the new VisualStateManager model, Templates/Styles, etc.  Some of the controls they are providing are some that you may find interesting or enhance the existing control suite from the Silverlight core:

    • Menu
    • TreeView
    • Upload
    • RadCube
    • RadNumericUpDn
    • RadProgressBar
    • Animation framework

One of their key features is they’ve decided to make these source code compatible with WPF.  The full WPF are not yet available.  You can download the CTP for free right now on their site and view some sample implementations on their sample site.

Telerik is widely known for providing great products and this is really great to see them provide controls for Silverlight that are also compatible with WPF.  I’m excited to see this control suite evolve to release state and perhaps more from the Silverlight team at Telerik!

I’ve been getting a few notes on issues relating to people trying Silverlight beta 2 and WCF or other services.  The most common issue I’m seeing reported is “my exception is showing a 404-not found error message, but the service is there and works!”

Okay, there could be several things happening here, but let’s tackle the “make sure it is plugged in” type situations.  I don’t mean to make light of the error, because at first I, too, was banging my head against a wall.  Sometimes it helps to have a second set of eyes or a deeper understanding of the issue…or both.

First, the situation.  Most of the time you’ll see this exception when your Silverlight application is accessing a service not hosted on the same application domain.  This is considered cross-domain access and requires the service host to enable an opt-in policy file so rich client platforms are allowed to access the service.  In Silverlight we call that the clientaccesspolicy.xml file.  You can learn all about cross-domain policy files by viewing this video on the Silverlight community site (a great resource).  In beta 2, there was a subtle change to the policy file that is required.  I wrote about that here as well (and note the code download for the video has the updated policy file).

Ok, so under what conditions might you get the “(404) Not found” error message when accessing services?

No policy file at all

Silverlight will first check for clientaccesspolicy.xml first and then fallback and see if a supported crossdomain.xml file exists.  If neither exists at all, 404 baby.  Also remember Silverlight is looking for this file in the root of the requesting domain.  So if you have a file but it is in your app root…this could be the issue at all.

Incorrect, mail-formed, just plain wrong policy file

Silverlight will check for a clientaccesspolicy.xml file and if it finds one but it has an incorrect format or is mal-formed it will treat it as invalid and then look for crossdomain.xml…and if not found, boom: 404.  This is what most are running into in starting to use beta 2 with your policy files.  The missing http-request-headers attribute renders the file mal-formed.

HTML response

Most sites have custom error messages for page not found.  For example, when you visit google.com/timheuer you’ll get a less-than-helpful message, but custom nonetheless or as another example microsoft.com/timheuer you’ll get another custom response with a sitemap.  Both of these are essentially custom error messages that are returning valid HTML, but not a valid policy file.  In these instances, Silverlight sees the response, but sees it as invalid/mal-formed and treats it like it didn’t exist: 404.

These are the most common instances where a 404 would be generated and making you bang your head against the closest semi-hard surface.  How can you figure out what is going on?  Well first, make sure you do your best to ensure you meet all the requirements.  But also use some development helper tools.

Web Development Helper

For me, in service/remote/AJAX development there is a single indispensable tool that I can’t live without.  That is NikhilK’s Web Development Helper.  This tool is a plugin to Internet Explorer (yes I know there are others similar in nature for Firefox, etc. – but I LOVE this implementation and IE is fine by me) that provides in the browser HTTP-traffic sniffing.  No need for any funky port configuration or changing proxy server settings, etc.  Just enable it and it works.  I highly recommend you use this tool or something similar like it (Fiddler is another good one although requires some additional config steps usually when working with Visual Studio’s web development server).

Seriously, a tool like this will save you so much time in troubleshooting your service interactions with Silverlight, Flash, AJAX, whatever – it will help you immediately figure out where to start looking rather than grabbing your climbing gear and spelunking in unknown caverns.

So why a ‘404’ – what gives?

I’ve also heard people say “you need to make that exception be more descriptive, 404 is not accurate.”  I’m on the fence on this one.  As a .NET developer I can see where the concerns are coming from in having the most descriptive exception possible.  But one must realize what is happening under the hood.  The polciy file is being requested as a GET request, so basically an HttpWebRequest object is our object here.  Because of this, we return HTTP-specific errors.  There isn’t one for “Silverlight policy file found, but not correct” in the HTTP spec right now.  So because of this, we use a RESTful approach in providing a standard HTTP response.  In our case “404-not found” seems to be a valid response – indicating “The request for a valid policy file resulted in a valid policy file not being found.”  We make no distinction between partially valid or finding a specific typo, etc. – we simply indicate that a valid policy wasn’t found.  One could argue 406,409 or 417 might be other responses, but I’m not sure that would make anyone feel any better – we’re still going to use an HTTP response code.

Hope this helps!

Now that beta 2 is out and some of the features or more solid, and a majority of the breaking changes have been announced, there is no excuse to hold back anymore.  Oh yeah, and there is a commercial go-live license available now, so no more excuses :-).

So where to get started?  Well you should first head over to the Silverlight community site and visit the Get Started section.  There you will find a rather simple formula to get started:

The community feed includes some great folks like Pete Brown, Shawn Wildermuth, Dave Campbell just to name a few.  As an example…all things ADO.NET Data Services (and with Silverlight): Shawn is your man right now.  I was thinking about giving him a hard time about his “ADO Guy” moniker…but he’s holding true to it for now :-).

The Learn section of the Silverlight community site is intended to help you.  Watch the videos, download the source code, read the tutorials, try the hands-on-labs (thanks Hanu!), post feedback – and post here what you want to see.  We have a lot in production right now that will be filtering over the next weeks (including some “Silverlight for Business” content) so be sure to stay posted (and subscribed for auto updates).

Once you’ve created that masterpiece, be sure to let us know about it!