<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.objectsharp.com/CS/utility/FeedStylesheets/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en"><title type="html">Bruce Johnson's SOA(P) Box</title><subtitle type="html">Using SOA in the .NET world</subtitle><id>http://blogs.objectsharp.com/CS/blogs/bruce/atom.aspx</id><link rel="alternate" type="text/html" href="http://blogs.objectsharp.com/CS/blogs/bruce/default.aspx" /><link rel="self" type="application/atom+xml" href="http://blogs.objectsharp.com/CS/blogs/bruce/atom.aspx" /><generator uri="http://communityserver.org" version="2.1.61129.2">Community Server</generator><updated>2009-04-10T23:36:23Z</updated><entry><title>The Benefits of Windows Azure</title><link rel="alternate" type="text/html" href="http://blogs.objectsharp.com/CS/blogs/bruce/archive/2010/03/01/the-benefits-of-windows-azure.aspx" /><id>http://blogs.objectsharp.com/CS/blogs/bruce/archive/2010/03/01/the-benefits-of-windows-azure.aspx</id><published>2010-03-01T15:03:43Z</published><updated>2010-03-01T15:03:43Z</updated><content type="html">&lt;p&gt;The age of cloud computing is fast approaching. Or at least that's what the numerous vendors of cloud computing would have you believe. The challenge that you (and all developers) face is to determine just what cloud computing is and how you should take advantage of it. Not to mention whether you even &lt;u&gt;should&lt;/u&gt; take advantage of it. &lt;/p&gt;  &lt;p&gt;While there is little agreement on exactly what constitutes 'cloud computing', there is a consensus that the technology is a paradigm shift for developers. And like pretty much every paradigm shift there is going to be some hype involved. People will recommend moving immediately to the technology &lt;i&gt;en masse&lt;/i&gt;. People will suggest that cloud computing has the ability to solve all that is wrong with your Web site. Not surprisingly, neither of these statements is true.&lt;/p&gt;  &lt;p&gt;And, as with many other paradigm shifts, the reality is less impactful and slower to arrive than the hype would have you believe. So before you start down this supposedly obvious ‘path to the future of computing’, it's important to have a good sense of what the gains will be. Let's consider some of the benefits that cloud computing offers. &lt;/p&gt;  &lt;h3&gt;Instant Scalability&lt;/h3&gt;  &lt;p&gt;If you are tasked with building a customer-facing Web site, then one of the main concerns is scalability. Regardless of the type of site being created, there will be considerable intellectual energy spent determining how to configure the Web servers to maximize the up-time. And in many cases the infrastructure design must also consider issues not related solely to reliability. The ability to handle peak times, which can be a large multiple of the normal level of activity, must also be designed into the architecture.&lt;/p&gt;  &lt;p&gt;These spikes in usage come in a couple of different varieties. Sometimes, the spikes come at predictable times. Think of the holiday season for a retail site or a price sale for a travel site. Sometimes the spikes cannot be predetermined, such as a breaking news event for a current events site. But regardless of the type of spikes, the infrastructure architect must create an infrastructure that is capable of absorbing these variations in stride. The result, especially if the peak is 10 times or higher than the average load, is that extra (and mostly unused) capacity must be built into the design. Capacity that must be paid for, yet remains idle.&lt;/p&gt;  &lt;p&gt;Into this picture comes cloud computing. Regardless of the cloud platform for which you develop, the ability to scale up and down with the click of a mouse is readily available. For Windows Azure, there are a number of different scalability points, including the number of virtual machines assigned to the application, the number of CPUs in each of the virtual machines, and so on. Within the application itself, you as the designer would have already partitioned the application into the various roles that are then deployed onto the virtual machines. &lt;/p&gt;  &lt;p&gt;As the demand on the Web site increases, additional machines, CPUs or roles can be added to ensure a consistency of responsiveness through all of the loads. More importantly, when demand decreases, the resources can be removed. Since these settings form the basis for price paid for the cloud computing service, companies will end up paying only for the capacity that they require.&lt;/p&gt;  &lt;p&gt;The price to be paid for this flexibility is that mostly that the application needs to be designed with the necessary roles in mind. As well, there are other constructs (such as the AppFabric and the ServiceBus) and technologies (such as WCF) that need to be mastered and integrated into the application. As a result, it is easier to build a Web application that works with Windows Azure right from the start. This is not to say that existing Web applications can’t be refactored to take advantage of the cloud…they certainly can. But starting from scratch allows you to take full advantage of the benefits offered by Azure.&lt;/p&gt;  &lt;h3&gt;Expandable Storage&lt;/h3&gt;  &lt;p&gt;The ability to avoid idle resources is not the only appeal of cloud computing. Another resource that can be virtualized for most applications is the database. Just like the CPU, database usage can rise and fall with the whims and patterns of the user base. And the fact is that the vast majority of business databases do little more that grow in size as time goes one. Again, infrastructure architects need to consider both growth rate and usage patterns as they allocate resources to the database servers. As with the machine-level resources, over-capacity must be designed into the architecture. By using a database hosted in the cloud, the allocation of disk space and processing power can be modified on an as-needed basis. And you, as the consumer, pay only for the space and power that you use.&lt;/p&gt;  &lt;p&gt;There are some additional thoughts that need to be given to the use of a cloud database. In order to provide the described flexibility, cloud database providers freely move data from one server to another. As a result, there must be a fairly high level of trust in the provider, particularly if the data is sensitive in nature. For the traditional non-cloud database, the owner of the Web site maintains physical control over the data (by virtue of their physical control over the database servers). Even if the server is hosted at a co-location facility, the Web site owner ‘knows’ where the data is at all times. &lt;/p&gt;  &lt;p&gt;When the data is persisted to the cloud, however, this is no longer the case. Now the data is physically in control of the cloud provider. The owner has no idea on which server the data is stored. Or even, when you get right down to it, which city. For some companies, this is a level of trust well beyond what they might have been comfortable with in the past.&lt;/p&gt;  &lt;p&gt;As a person who lives abroad, (I’m from Canada), there is one more consideration: privacy. Data privacy laws vary from country to country. When data is stored ‘in the cloud’, there is little weight given to the physical location of the data. After all, the actual location has been virtualized out through the cloud concept. Information can (and does) move across national boundaries based on the requirements of the application. And when data resides in another country, it may very well be subject to the privacy laws of that country. If those laws are significantly different than your own, you might need to modify your corporate policies or the Web application itself to address whichever requirements are more stringent. This sort of situation brings rise to a common approach to cloud storage – data segregation.&lt;/p&gt;  &lt;p&gt;In data segregation, the data required by the Web application is stored in multiple locations. Data that is static and/or not particularly sensitive is stored in the cloud. Data that is sensitive is stored in a traditional (and more subject to owner control) location. Naturally, the Web application needs to be structured to combine the data from the different sources. And the traditionally located data needs to be stored in an infrastructure that is reliable and scalable…with all of the problems that the implementation of those features entail. &lt;/p&gt;  &lt;p&gt;The functionality offered by cloud computing will be enticing to some, but definitely not all, Web sites. For those who fit the target audience (Web sites that have a wide fluctuation in usage patterns) or just those who want to outsource their Internet infrastructure, cloud computing is definitely appealing. For developers of these sites, platforms such as Windows Azure represents a significant change in the necessary development techniques. And even with the inherent complexity, the shift to cloud computing is beneficial to developers (the resulting applications tend to be more modular, composable and testable), enough to make further exploration of the details worthwhile. &lt;/p&gt;&lt;img src="http://blogs.objectsharp.com/CS/aggbug.aspx?PostID=197004" width="1" height="1"&gt;</content><author><name>bruce</name><uri>http://blogs.objectsharp.com/CS/members/bruce.aspx</uri></author><category term="Home" scheme="http://blogs.objectsharp.com/CS/blogs/bruce/archive/tags/Home/default.aspx" /><category term="Newsletter" scheme="http://blogs.objectsharp.com/CS/blogs/bruce/archive/tags/Newsletter/default.aspx" /><category term="Azure" scheme="http://blogs.objectsharp.com/CS/blogs/bruce/archive/tags/Azure/default.aspx" /></entry><entry><title>Order Fixation</title><link rel="alternate" type="text/html" href="http://blogs.objectsharp.com/CS/blogs/bruce/archive/2010/01/25/order-fixation.aspx" /><id>http://blogs.objectsharp.com/CS/blogs/bruce/archive/2010/01/25/order-fixation.aspx</id><published>2010-01-25T12:39:00Z</published><updated>2010-01-25T12:39:00Z</updated><content type="html">&lt;p&gt;One of my current tasks for a client has been to facilitate the integration between a Java client and a WCF service. The mechanism for doing this is JSON and I have been quite grateful that WCF makes it relatively easy to implement this type of communication. However, there is one area that has been causing some grief for me (and my Java colleagues) that I finally create a workaround for yesterday.&lt;/p&gt;  &lt;p&gt;The source of my problem starts with the contract used by the WCF service. A number of the methods include parameters that are abstract data types. Consider the following class declaration.&lt;/p&gt;  &lt;p&gt;&lt;font color="#800000" face="Courier New"&gt;[KnownType(ButtonCommand)]     &lt;br /&gt;&lt;/font&gt;&lt;font color="#800000" face="Courier New"&gt;[KnownType(MouseCommand)]     &lt;br /&gt;[DataContract]&lt;/font&gt;&lt;font color="#800000" face="Courier New"&gt;     &lt;br /&gt;&lt;/font&gt;&lt;font color="#800000" face="Courier New"&gt;public abstract class AbstractCommand&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;The AbstractCommand class is just a base class for a couple of concrete classes (ButtonCommand and MouseCommand). The WCF method is declared as accepting an AbstractCommand type, but the value passed into the method will be either a ButtonCommand or a MouseCommand. &lt;/p&gt;  &lt;p&gt;&lt;font color="#800000" face="Courier New"&gt;[OperationContract]     &lt;br /&gt;[WebInvoke(BodyStyle=WebMessageBodyStyle.Wrapped,      &lt;br /&gt;&amp;#160;&amp;#160; RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]      &lt;br /&gt;StatusCode ExecuteCommand(AbstractCommand command);&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Naturally, when the client invokes this method, the expectation is that a concrete class instance will be passed along. However, if all you do is pass in the JSON for one of the concrete classes in, you get an exception saying that an abstract class cannot be instantiate. The reason for the error can be found in how WCF dispatches message. When the request arrives, WCF examines the message to determine which method is to be invoked. Once identified, the parameters for the method (found in the JSON) are created. This creation involves instantiating an object using the default parameterless constructor for the type and then assigning property values as found in the JSON. However, the AbstractCommand type cannot be instantiated (it is abstract, after all). And there is no immediately apparent mechanism to determine which concrete type should be used.&lt;/p&gt;  &lt;p&gt;To address this final problem, Microsoft introduced the idea of a type hint. The JSON for a concrete type passed into the ExecuteCommand method would look something like the following:&lt;/p&gt;  &lt;p&gt;&lt;font color="#800000" face="Courier New"&gt;{&amp;quot;command&amp;quot;:{&amp;quot;__type&amp;quot;:&amp;quot;ButtonCommand:#Command.Library&amp;quot;, &amp;quot;prop1&amp;quot;:&amp;quot;value&amp;quot;, &amp;quot;prop2&amp;quot;:&amp;quot;value&amp;quot;}}&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;The name/value pair of “__type” is used by WCF to determine the type that should be instantiated before performing the property assignment. This is conceptually similar to how types are provided through SOAP. This mechanism does have the hard requirement that the “__type” value be the &lt;strong&gt;first&lt;/strong&gt; pair in the JSON list. &lt;/p&gt;  &lt;p&gt;Enter Java into the picture. In order to communicate with my WCF service, the client using the Java JSONObject class. This class takes a collection of name/value pairs and converts it into a JSON-formatted array. This array is then sent to my method, where it goes through the previously described process. However the JSONObject seems to take the portion of the JSON specification where it says the name/value pairs are ‘unordered’ to heart. There is (apparently) no way to force a particular name/value pair to be emitted as the &lt;strong&gt;first&lt;/strong&gt; pair. In other words, the JSONObject cannot reliably produce JSON for a concrete type that is being passed into a parameter of an abstract type.&lt;/p&gt;  &lt;p&gt;Crap. &lt;/p&gt;  &lt;p&gt;Well, it was actually stronger language than that once I figured this out.&lt;/p&gt;  &lt;p&gt;The solution was not nearly as complicated as identifying the problem. I created a WCF endpoint behavior extension. In the AfterReceiveRequest event handler, I look at the body of the request (which has already been converted into XML, as it turns out..a surprise, albeit an easier choice format for the next step). If the “__type” property is the first pair in the JSON array, it is converted to a “__type” attribute in the XML element. Otherwise, it appears as a regular child node. So the transformation consists of finding the XML elements that have a name of “__type” and moving the value up into an attribute of the parent node. The modified message is then injected back into the WCF pipeline. And now the request is processed as desired.&lt;/p&gt;&lt;img src="http://blogs.objectsharp.com/CS/aggbug.aspx?PostID=192654" width="1" height="1"&gt;</content><author><name>bruce</name><uri>http://blogs.objectsharp.com/CS/members/bruce.aspx</uri></author><category term="Service-Oriented Architecture" scheme="http://blogs.objectsharp.com/CS/blogs/bruce/archive/tags/Service-Oriented+Architecture/default.aspx" /><category term="Newsletter" scheme="http://blogs.objectsharp.com/CS/blogs/bruce/archive/tags/Newsletter/default.aspx" /><category term="AJAX" scheme="http://blogs.objectsharp.com/CS/blogs/bruce/archive/tags/AJAX/default.aspx" /><category term="VS2008" scheme="http://blogs.objectsharp.com/CS/blogs/bruce/archive/tags/VS2008/default.aspx" /></entry><entry><title>Setting the Default Style for a Custom Silverlight Control</title><link rel="alternate" type="text/html" href="http://blogs.objectsharp.com/CS/blogs/bruce/archive/2010/01/14/setting-the-default-style-for-a-custom-silverlight-control.aspx" /><id>http://blogs.objectsharp.com/CS/blogs/bruce/archive/2010/01/14/setting-the-default-style-for-a-custom-silverlight-control.aspx</id><published>2010-01-14T14:47:24Z</published><updated>2010-01-14T14:47:24Z</updated><content type="html">&lt;p&gt;Like so many of my posts, this one is as much about keeping a log of what I learned. And, in this particular case, since I had a difficult time finding the answer (and the answer is relatively new), a blog posts is doubly worthwhile. &lt;/p&gt;  &lt;p&gt;I was trying to write a custom control for Silverlight 3. It was an extension to a ListBox, so I created a class that derived from ListBox and added my neat-o cool functionality. However, part of the requirements for the control was (for example) that it needed to be horizontal and that the scroll bars needed to be hidden. For this, the best approach is to define a default template for the control.&lt;/p&gt;  &lt;p&gt;The default template is basically the style that is applied to the control in the absence of designer requests to the contrary. Practically, it is exactly the same as any other style that you would create. What makes it different is that the user of the custom component does not need to do anything to have the style applied. &lt;/p&gt;  &lt;p&gt;In order to accomplish this feat requires &lt;u&gt;three &lt;/u&gt;steps. The first has been true since Silverlight 2, that being that the style needs to be placed into a file named Generic.xaml. In the past it was sufficient to place the style in said file and set the TargetType of the style to be the custom control. However at Silverlight 3, two additional requirements were added. The first is that the Generic.xaml needs to be placed into a directory called Themes. The second is that the following line of code needs to the constructor for the custom control.&lt;/p&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;&lt;font color="#804000"&gt;this.DefaultStyleKey = typeof(&lt;em&gt;customcontrolname&lt;/em&gt;);&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Once these conditions have been met, the default style will get picked up. It was the last two steps that stymied me, as many of the existing posts talk about one, but not both of the requirements.&lt;/p&gt;  &lt;p&gt;As a convenience, there is now a TemplatedSilverlightControl template that actually sets up the necessary files, directory and code to make all of this work without further thought. And I like not having to think (other than remembering to use the correct template, that is).&lt;/p&gt;&lt;img src="http://blogs.objectsharp.com/CS/aggbug.aspx?PostID=192027" width="1" height="1"&gt;</content><author><name>bruce</name><uri>http://blogs.objectsharp.com/CS/members/bruce.aspx</uri></author></entry><entry><title>Getting Value from your Data</title><link rel="alternate" type="text/html" href="http://blogs.objectsharp.com/CS/blogs/bruce/archive/2009/05/20/getting-value-from-your-data.aspx" /><id>http://blogs.objectsharp.com/CS/blogs/bruce/archive/2009/05/20/getting-value-from-your-data.aspx</id><published>2009-05-20T14:41:17Z</published><updated>2009-05-20T14:41:17Z</updated><content type="html">&lt;p&gt;For those of you who are not on the ObjectSharp mailing list, you might not be aware that next week we have another in our Smart Breakfast series. This time it’s David Chennels talking about Business Intelligence. You can find the details out &lt;a href="http://www.objectsharp.com/about/events/Pages/smart-breakfast-business-intelligence.aspx" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Now the term “Business Intelligence” is one of those amorphous phrases that have the potential to make people crinkle their nose. It has the good buzzwords to entire management and it’s vague enough so that you can put many different technologies under that umbrella. If you’re a geek in the Microsoft space, typically business intelligence includes the OLAP and Analysis Services parts of SQL Server, maybe a third-party tool to visualize the data (if Reporting Services isn’t enough) and perhaps Integration Services. &lt;/p&gt;  &lt;p&gt;But those tools have been around for a while. And, even though there is no licensing fee added to be able to use then, they don’t seem to have much traction, at least in the companies that I’ve been working with. So what is the reason for this lack of interest?&lt;/p&gt;  &lt;p&gt;From my perspective, the answer seems to be lack of awareness. If you ask any managers whether more information is better than less, most will want more. If you qualify the question by letting the managers specify the type and format of the information that is presented, the percentage answering in the affirmative goes up. And yet, even though the information is already stored in the corporate database and the tools to create the desired reports are readily available, nothing is done. &lt;/p&gt;  &lt;p&gt;And what is the solution? Education. Spend some time getting up to speed on what you can do with the tools already at your disposal. Is the creation of a business dashboard a zero-effort project? No. But it’s probably much less effort than you think. And in the current business environment, doesn’t it make more sense to find a way to use your existing resources to their fullest event? Of course it does.&lt;/p&gt;  &lt;p&gt;So take a morning to learn about the possibilities. More specifically, take the morning May 28th and come to the ObjectSharp Smart Breakfast on Business Intelligence. Along with a good breakfast, you’ll learn about some tools and techniques that can make an immediate difference to your business. Now that’s &lt;u&gt;really&lt;/u&gt; getting value.&lt;/p&gt;&lt;img src="http://blogs.objectsharp.com/CS/aggbug.aspx?PostID=173613" width="1" height="1"&gt;</content><author><name>bruce</name><uri>http://blogs.objectsharp.com/CS/members/bruce.aspx</uri></author></entry><entry><title>Getting Trained in an Economic Downturn</title><link rel="alternate" type="text/html" href="http://blogs.objectsharp.com/CS/blogs/bruce/archive/2009/04/30/getting-trained-in-an-economic-downturn.aspx" /><id>http://blogs.objectsharp.com/CS/blogs/bruce/archive/2009/04/30/getting-trained-in-an-economic-downturn.aspx</id><published>2009-04-30T22:34:07Z</published><updated>2009-04-30T22:34:07Z</updated><content type="html">&lt;p&gt;I’m sure that, for the vast majority of the readers of my blog, becoming more productive with your programming tools is a desirable goal. Not all developers go out of their way to advance their skills, but the very fact that you read blogs means that getting better is of interest to you. And, for most companies, they would also like you to make better use of your existing tools. It’s certainly obvious that it’s in your company’s best interest for this to happen, even if they don’t go out of their way to explicitly advance your skills. &lt;/p&gt;  &lt;p&gt;And this is the ugly truth for most companies. In the best of times, a large number of companies don’t provide any significant budget for formal training. Usually developers are expected to pick up any new skills on their own time. Or, worse, they are expected to apply new technologies without spending any ‘exploratory’ time with them. As most of your are aware, the first time you try a new technology, the result is usually only partially successful. Only after you have worked with it a few times does it become possible to take full advantage of it. And yet, management is reluctant to pay for training classes, tech conferences, or even a programming book that will help you get ‘into the zone’ for the stuff that would make a difference in your day-to-day efforts. Here's a few suggestions that might, &lt;em&gt;possibly &lt;/em&gt;get your manager to approve educational expenses, even in the economic conditions that exist today.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Working with Books&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Over the years, I have worked with a number of different companies. Each of them takes a slightly different view of what appropriate training costs are. For companies that have a large number of developers and a small educational budget, sometimes books are all that fit. For some companies, creating a library of programming books is a viable books. Your company could purchase well-reviewed (reviews are easy to find on Amazon) programming books on the relevant topics. Employees could then ‘borrow’ books that were appropriate to their current tasks. The books end up being purchased just once, but can be shared between developers as the need arises. &lt;/p&gt;  &lt;p&gt;A more high-tech solution to the problem can be achieved with a solution to the on-line technology book site &lt;a href="http://my.safaribooksonline.com/?portal=informit"&gt;Safari&lt;/a&gt;. Safari allows for books to be searched electronically and even be downloaded (in a PDF format) or even printed on an as needed basis. This is a decent mix between the need to search for a specific answer and still being able to read a book cover-to-cover when called for. &lt;/p&gt;  &lt;p&gt;However, a corporate library is not always the best solution. Finding answers in a book requires, in many cases, that you have some inkling of the solution beforehand. At a minimum, you need to frame your query appropriately, something that is as much art as science. And the pace of technology advances means that books are almost always going to lag new technology and best practices by a period of months, if not years. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Selling Management on Training: Speak Their Language&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;When you want to convince your boss to let you go to a conference or attend a course, the first thing to do is look at the expenditure from their perspective. After all, the cost of the training is an expense to them. If there is no corresponding benefit, it becomes difficult to justify spending the monies. And, ultimately, you need to convince management that the benefits that they will gain are more than the money that they will spend.&lt;/p&gt;  &lt;p&gt;In general, you will find that the attitude that a company has towards the training of developers is dictated by &lt;em&gt;how&lt;/em&gt; the company makes money and &lt;em&gt;who&lt;/em&gt; is responsible for helping to making that money. Usually, companies whose product is technology-based tend to be better at providing and paying for skill improvements for their employees. When developers productivity is closely aligned with corporate revenues, it is easier to get the boss’ attention. However, if you work on an application that has no direct correlation with how the company makes money, you’re much more likely to face an uphill battle. &lt;/p&gt;  &lt;p&gt;But regardless of where you fit in this spectrum, focus your arguments on what &lt;em&gt;they&lt;/em&gt; get out of sending you across town or across the country. Make the conversation about their Return on Investment. Show that the training will have concrete and immediate value to the company and you’re a lot closer to getting approval. &lt;/p&gt;  &lt;p&gt;One way that you might be able to do this is to offer to share materials and experiences with your team upon return. At ObjectSharp, we call these sessions ‘Lunch &amp;amp; Learns”. You many know them as “Brown Bag Training”. By offering to present such a session after your conference or course, your company gets to spread some of the benefits of sending one person on training across multiple people. And your team benefits from having the new technologies couched in terms that are directly relevant to your environment. &lt;/p&gt;  &lt;p&gt;In some cases, it’s also possible to get the trainer to offer to help with these sessions. This is something that ObjectSharp offers to attendees of our courses. We’re more than happy to have one of our instructors speak to your company about the newest technologies. While any course is on-going, instructors work hard to make the content relevant to you. To accomplish this, we ask about the kinds of projects that are being worked on and where the technology will be applied. So by having an ObjectSharp instructor give the Lunch &amp;amp; Learn, you get a person who is well-versed in the technology, but who also has a basic understanding of how it will fit into your corporate development plans.&lt;/p&gt;  &lt;p&gt;You might consider shouldering some of the burden of training yourself. I don’t necessarily mean to pay for it directly. But if you take your time to attend user group meetings and Code Camps (both of which take place in non-work hours), you show a dedication to improving your skills that might make a difference. At a minimum, you will get some insight into the latest technologies, even if it’s not quite the same personalized and intensive hand-on experience that going on a course might be.&lt;/p&gt;  &lt;p&gt;Finally, I’d like to leave you with one final, and surprisingly creative, argument. One of the most common questions we get from potential training clients is 'What if I train our developers and they leave?'&amp;quot; Our answer is invariably 'What if you don’t train them and they stay?' This usually gets an 'Aha' moment from management, followed by a realization that perhaps investing more in staff development might not be quite the pure expense that they think.&lt;/p&gt;&lt;img src="http://blogs.objectsharp.com/CS/aggbug.aspx?PostID=171788" width="1" height="1"&gt;</content><author><name>bruce</name><uri>http://blogs.objectsharp.com/CS/members/bruce.aspx</uri></author><category term="Not-so-SOAP" scheme="http://blogs.objectsharp.com/CS/blogs/bruce/archive/tags/Not-so-SOAP/default.aspx" /><category term="Home" scheme="http://blogs.objectsharp.com/CS/blogs/bruce/archive/tags/Home/default.aspx" /><category term="Newsletter" scheme="http://blogs.objectsharp.com/CS/blogs/bruce/archive/tags/Newsletter/default.aspx" /><category term="Certification" scheme="http://blogs.objectsharp.com/CS/blogs/bruce/archive/tags/Certification/default.aspx" /></entry><entry><title>Data Bondage in WPF presentation at Toronto Code Camp</title><link rel="alternate" type="text/html" href="http://blogs.objectsharp.com/CS/blogs/bruce/archive/2009/04/26/data-bondage-in-wpf-presentation-at-toronto-code-camp.aspx" /><id>http://blogs.objectsharp.com/CS/blogs/bruce/archive/2009/04/26/data-bondage-in-wpf-presentation-at-toronto-code-camp.aspx</id><published>2009-04-26T05:28:00Z</published><updated>2009-04-26T05:28:00Z</updated><content type="html">&lt;P&gt;My final presentation in my April World Speaking tour was at the Toronto Code Camp this afternoon. As always, the code camp was a huge success. The efforts of many people went into making it so, but the organization was top notch.&lt;/P&gt;
&lt;P&gt;As part of the lead-up to my presentation, Joey de Villa made good on a promise to wear Microsoft branded assless chaps. And he even regaled the crowd with his version of Hit Me With Your Best Shot, a choice completely in character with the theme of the presentation. &lt;/P&gt;
&lt;P&gt;As for the presentation, it went very well. Something like 70-80 people where there and I was pleased by the questions that were asked. I have always preferred an interactive audience because it means that they are probably listening. :)&lt;/P&gt;
&lt;P&gt;As I promised at the end of the presentation, here are links to the slides and demos. Any questions are most welcome.&lt;/P&gt;
&lt;P&gt;Slides: &lt;A href="http://www.slideshare.net/LACanuck/data-bondage-in-wpf" target=_blank&gt;here&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Demos: &lt;A title=Download href="http://blogs.objectsharp.com/CS/files/folders/171303/download.aspx"&gt;Download&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Update: For those who want a more complete story surrounding the title of the presentation and the assless chaps references, check out Joey's blog post &lt;A href="http://www.globalnerdy.com/2009/04/27/assless-chaps-and-data-bondage/" target=_blank&gt;here&lt;/A&gt;.&lt;/P&gt;&lt;img src="http://blogs.objectsharp.com/CS/aggbug.aspx?PostID=171326" width="1" height="1"&gt;</content><author><name>bruce</name><uri>http://blogs.objectsharp.com/CS/members/bruce.aspx</uri></author><category term="Home" scheme="http://blogs.objectsharp.com/CS/blogs/bruce/archive/tags/Home/default.aspx" /><category term="Newsletter" scheme="http://blogs.objectsharp.com/CS/blogs/bruce/archive/tags/Newsletter/default.aspx" /><category term="Silverlight" scheme="http://blogs.objectsharp.com/CS/blogs/bruce/archive/tags/Silverlight/default.aspx" /><category term="WPF" scheme="http://blogs.objectsharp.com/CS/blogs/bruce/archive/tags/WPF/default.aspx" /></entry><entry><title>Never Test Alone – Presentation at KWSQA Testing Conference</title><link rel="alternate" type="text/html" href="http://blogs.objectsharp.com/CS/blogs/bruce/archive/2009/04/22/never-test-alone-presentation-at-kwsqa-testing-conference.aspx" /><id>http://blogs.objectsharp.com/CS/blogs/bruce/archive/2009/04/22/never-test-alone-presentation-at-kwsqa-testing-conference.aspx</id><published>2009-04-22T20:14:59Z</published><updated>2009-04-22T20:14:59Z</updated><content type="html">&lt;p&gt;I finished presentation four of my April World Tour of the GTA earlier today. It was actually a co-presentation with Deb Forsyth and I was basically code-monkey and the 'developer’ that she could point to with here ‘bad developer’ stories. This was an unusual conference for me, in that I was a lone developer in a room full of testers. Daniel never had it so bad with the lions. :)&lt;/p&gt;  &lt;p&gt;Anyway, as I mentioned in the presentation, the slides are now available for download at the following link. As always, questions are welcomed.&lt;/p&gt;  &lt;p&gt;Slides – &lt;a title="Download" href="http://blogs.objectsharp.com/CS/files/folders/171100/download.aspx"&gt;Download&lt;/a&gt;&lt;/p&gt;&lt;img src="http://blogs.objectsharp.com/CS/aggbug.aspx?PostID=171104" width="1" height="1"&gt;</content><author><name>bruce</name><uri>http://blogs.objectsharp.com/CS/members/bruce.aspx</uri></author><category term="Home" scheme="http://blogs.objectsharp.com/CS/blogs/bruce/archive/tags/Home/default.aspx" /><category term="Newsletter" scheme="http://blogs.objectsharp.com/CS/blogs/bruce/archive/tags/Newsletter/default.aspx" /></entry><entry><title>Dropping Cookies in IE7</title><link rel="alternate" type="text/html" href="http://blogs.objectsharp.com/CS/blogs/bruce/archive/2009/04/17/dropping-cookies-in-ie7.aspx" /><id>http://blogs.objectsharp.com/CS/blogs/bruce/archive/2009/04/17/dropping-cookies-in-ie7.aspx</id><published>2009-04-17T13:41:32Z</published><updated>2009-04-17T13:41:32Z</updated><content type="html">&lt;p&gt;I was asked an unusual question yesterday about cookies, Silverlight and WCF. The scenario was that a Silverlight application was being used in a consumer-facing situation. The application itself communicates with the server using WCF. The service which is the target of the communication uses ASP.NET Authentication to authenticate the user. It’s an implementation detail (but critical to this post) that the method of storing the authentication token is a cookie called .ASPXAUTH.&lt;/p&gt;  &lt;p&gt;In a normal (that is, working) scenario with Silverlight, the credentials are sent to the server and an .ASPXAUTH cookie is returned. The browser strips off the cookie and stores it. On any subsequent requests, Silverlight creates a request and sends it the the server through the browser’s networking API. The browser is responsible for determining which, if any, cookies should be send with the request and adding them to the outgoing header. In other words, the Silverlight application has no specific knowledge of or interaction with the .ASPXAUTH cookie.&lt;/p&gt;  &lt;p&gt;As you would expect, this mechanism works the vast majority of the time. If it didn’t, I think it would have been a significant story long before now. But my questioner was running into a situation where the Silverlight application was unable to communicate with the server even after authentication was performed. What’s worse, this behavior was only happening on IE7. When Silverlight was run through Firefox, it worked exactly as it was supposed to.&lt;/p&gt;  &lt;p&gt;The diagnostic step in a situation like this is to use Fiddler (or whatever your favorite TCP trace application is) to view the raw messages. And what was seen is that although the authentication response had the .ASPXAUTH cookie in it, any requests sent back to the server after authentication did not. Given when I’ve already explained about the processing of cookies with Silverlight requests, this eliminates the Silverlight application as the most likely culprit. But it also makes one scratch your head, as we can be pretty certain it’s not a widespread failure of IE7 to process cookies.&lt;/p&gt;  &lt;p&gt;The answer likes in a strange bug in IE7. It turns out that &lt;strong&gt;if a domain name has a underscore in it, IE7 doesn’t persist the cookies&lt;/strong&gt;. Let me repeat that, because it’s such a bizarre sounding problem. In IE7, if the domain name has an underscore (‘_’) in it, then any cookies returned from the domain will not be persisted. Which also means that subsequent requests will be ‘cookie-free’.&lt;/p&gt;  &lt;p&gt;I’m guessing that most domain names don’t have an underscore, which is why this bug didn’t get widespread notice. In this particular case, the domain was one used for development, which would keep the problem from being a production issue. But I have no reason to believe that the bug would be restricted to a local problem. Deploy a ‘underscored’ domain name to the public internet and no authentication, shopping carts or other state information can be saved.&lt;/p&gt;  &lt;p&gt;Fortunately, the solution was a simple one. If the domain name in the endpoint configuration is replaced with the raw IP address, IE7 is more than happy to save the cookie. I wouldn’t be surprise if an entry in your local hosts file would have the same effect. And the final solution would be to have your domain administrator create a DNS Alias entry…one that doesn’t have an underscore, of course.&lt;/p&gt;&lt;img src="http://blogs.objectsharp.com/CS/aggbug.aspx?PostID=170639" width="1" height="1"&gt;</content><author><name>bruce</name><uri>http://blogs.objectsharp.com/CS/members/bruce.aspx</uri></author><category term="Home" scheme="http://blogs.objectsharp.com/CS/blogs/bruce/archive/tags/Home/default.aspx" /><category term="Tips" scheme="http://blogs.objectsharp.com/CS/blogs/bruce/archive/tags/Tips/default.aspx" /><category term="Newsletter" scheme="http://blogs.objectsharp.com/CS/blogs/bruce/archive/tags/Newsletter/default.aspx" /><category term="ASP.NET 2.0" scheme="http://blogs.objectsharp.com/CS/blogs/bruce/archive/tags/ASP.NET+2.0/default.aspx" /><category term="Silverlight" scheme="http://blogs.objectsharp.com/CS/blogs/bruce/archive/tags/Silverlight/default.aspx" /></entry><entry><title>Code Contracts at Toronto VB User Group</title><link rel="alternate" type="text/html" href="http://blogs.objectsharp.com/CS/blogs/bruce/archive/2009/04/17/code-contracts-at-toronto-vb-user-group.aspx" /><id>http://blogs.objectsharp.com/CS/blogs/bruce/archive/2009/04/17/code-contracts-at-toronto-vb-user-group.aspx</id><published>2009-04-17T13:37:53Z</published><updated>2009-04-17T13:37:53Z</updated><content type="html">&lt;p&gt;On Wednesday past, I did a Code Contracts presentation to the &lt;a href="http://www.tvbug.com/default.aspx?MainFrameURL=diary.aspx" target="_blank"&gt;Toronto Visual Basic User Group&lt;/a&gt;. It was a continuation of my whirlwind ‘April Presentation Tour’, in that it was my third presentation in a week and the third of five that I’m doing in April. Tee shirts for the April Presentation Tour were available for sale from vendors as you left the arena&lt;/p&gt;  &lt;p&gt;I have posted the slides and the source code to the following links:&lt;/p&gt;  &lt;p&gt;Slides: &lt;a title="Slides" href="http://www.slideshare.net/LACanuck/code-contracts-in-net"&gt;Here&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Source Code: &lt;a title="Source Code" href="http://blogs.objectsharp.com/CS/files/folders/170636/download.aspx"&gt;Here&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;If you have any questions, please feel free to drop me a comment or an email message.&lt;/p&gt;&lt;img src="http://blogs.objectsharp.com/CS/aggbug.aspx?PostID=170637" width="1" height="1"&gt;</content><author><name>bruce</name><uri>http://blogs.objectsharp.com/CS/members/bruce.aspx</uri></author><category term="Home" scheme="http://blogs.objectsharp.com/CS/blogs/bruce/archive/tags/Home/default.aspx" /><category term="Tips" scheme="http://blogs.objectsharp.com/CS/blogs/bruce/archive/tags/Tips/default.aspx" /><category term="VS2008" scheme="http://blogs.objectsharp.com/CS/blogs/bruce/archive/tags/VS2008/default.aspx" /></entry><entry><title>What’s New in Silverlight 3 at the Toronto Silverlight User Group</title><link rel="alternate" type="text/html" href="http://blogs.objectsharp.com/CS/blogs/bruce/archive/2009/04/10/what-s-new-in-silverlight-3-at-the-toronto-silverlight-user-group.aspx" /><id>http://blogs.objectsharp.com/CS/blogs/bruce/archive/2009/04/10/what-s-new-in-silverlight-3-at-the-toronto-silverlight-user-group.aspx</id><published>2009-04-11T03:36:23Z</published><updated>2009-04-11T03:36:23Z</updated><content type="html">&lt;p&gt;This past Thursday, I had the opportunity to present on Silverlight 3 to the &lt;a href="http://www.torontosilverlight.com/" target="_blank"&gt;Toronto Silverlight User Group&lt;/a&gt;. It was my first time presenting to the group and I was impressed by the number of attendees (I would say 30-40) who managed to hang around on the Thursday evening before a long weekend. &lt;/p&gt;  &lt;p&gt;As promised, I have posted the slides and the source code to the following links:&lt;/p&gt;  &lt;p&gt;Slides: &lt;a title="Slides" href="http://www.slideshare.net/LACanuck/whats-new-in-silverlight-3"&gt;Here&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Source Code: &lt;a title="Source Code" href="http://blogs.objectsharp.com/cs/files/folders/169860/download.aspx"&gt;Here&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;If you have any questions, please feel free to drop me a comment or an email message.&lt;/p&gt;&lt;img src="http://blogs.objectsharp.com/CS/aggbug.aspx?PostID=169861" width="1" height="1"&gt;</content><author><name>bruce</name><uri>http://blogs.objectsharp.com/CS/members/bruce.aspx</uri></author><category term="Home" scheme="http://blogs.objectsharp.com/CS/blogs/bruce/archive/tags/Home/default.aspx" /><category term="Silverlight" scheme="http://blogs.objectsharp.com/CS/blogs/bruce/archive/tags/Silverlight/default.aspx" /></entry></feed>