<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" xml:lang="en" xml:base="http://www.heikniemi.net/hardcoded/wp-atom.php">
	<title type="text">Heikniemi Hardcoded</title>
	<subtitle type="text">Jouni Heikniemi's IT adventures</subtitle>

	<updated>2010-09-02T12:33:56Z</updated>
	<generator uri="http://wordpress.org/" version="2.8.6">WordPress</generator>

	<link rel="alternate" type="text/html" href="http://www.heikniemi.net/hardcoded" />
	<id>http://www.heikniemi.net/hardcoded/feed/atom/</id>
	

			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/HeikniemiHardcoded" /><feedburner:info uri="heikniemihardcoded" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry>
		<author>
			<name>Jouni Heikniemi</name>
						<uri>http://www.heikniemi.net/hardcoded/</uri>
					</author>
		<title type="html"><![CDATA[Twitter and OAuth in desktop applications]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/HeikniemiHardcoded/~3/Gh3hZ09VeSY/" />
		<id>http://www.heikniemi.net/hardcoded/2010/09/twitter-and-oauth-in-desktop-applications/</id>
		<updated>2010-09-02T12:33:56Z</updated>
		<published>2010-09-02T09:01:10Z</published>
		<category scheme="http://www.heikniemi.net/hardcoded" term=".NET" /><category scheme="http://www.heikniemi.net/hardcoded" term="Web" /><category scheme="http://www.heikniemi.net/hardcoded" term="OAuth" /><category scheme="http://www.heikniemi.net/hardcoded" term="Twitter" />		<summary type="html"><![CDATA[If you’re into Twitter API programming, you probably know that the end of basic authentication is here. This post delves into the question of using the OAuth authentication mechanism in desktop applications. If you know the subject, this post will give you some practical advice for C# application development. If you don’t, it’ll act as [...]]]></summary>
		<content type="html" xml:base="http://www.heikniemi.net/hardcoded/2010/09/twitter-and-oauth-in-desktop-applications/">&lt;p&gt;&lt;strong&gt;If you’re into Twitter API programming, you probably know that the end of basic authentication is here. This post delves into the question of using the OAuth authentication mechanism in desktop applications. If you know the subject, this post will give you some practical advice for C# application development. If you don’t, it’ll act as a primer on OAuth for modern web sites.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The context: A typical application making use of Twitter or another web service almost always needs to act on behalf of a user. The need might be read-only (such as reading a user’s friends list or status history), or it might be read/write, such as with a Twitter client.&lt;/p&gt;
&lt;h2&gt;Why OAuth?&lt;/h2&gt;
&lt;p&gt;First, it is necessary to define OAuth and its place in the world as a step forward from basic authentication. When I say “basic authentication”, I mean the technology of sending the users’ credentials in an HTTP header, essentially in plain text.&lt;/p&gt;
&lt;p&gt;This approach has three main caveats. First, intercepting the HTTP traffic allows the attacker full control of the user’s account. Second, the application needs to know and store the credentials for the user. Third, since the credentials by definition mean full control, there is no way to grant a limited permission set to an application. And a fourth minor thing, more an inconvenience, is the fact that when a user changes his password, he must change it in all the applications he is using.&lt;/p&gt;
&lt;p&gt;The Twitter API has traditionally supported both basic and OAuth approaches, but basic authentication has now been deprecated. The preceding reasons are the main causes for this.&lt;/p&gt;
&lt;h2&gt;OAuth how?&lt;/h2&gt;
&lt;p&gt;&lt;a href="http://www.oauth.net/"&gt;OAuth&lt;/a&gt;, an open protocol designed for secure API usage, builds on a fundamentally different model. The following describes a basic exchange for OAuth-based authentication. In the exchange, three parties take a role: &lt;strong&gt;the user&lt;/strong&gt; (a human being), &lt;strong&gt;the service&lt;/strong&gt; (e.g. Twitter) and &lt;strong&gt;the consuming application &lt;/strong&gt;(i.e. the code running on the user&amp;#039;s behalf).&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The user indicates his/her desire to use a given service provider, like Twitter.&lt;/li&gt;
&lt;li&gt;The consuming application issues a request to the service, asking for an URI where to push the user for authorization.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.heikniemi.net/hardcoded/wp-content/uploads/2010/09/image.png"&gt;&lt;img style="border-right-width: 0px; margin: 10px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" src="http://www.heikniemi.net/hardcoded/wp-content/uploads/2010/09/image_thumb.png" border="0" alt="image" width="244" height="111" align="right" /&gt;&lt;/a&gt;The consuming application redirects the user to the authorization URI hosted within the service.&lt;/li&gt;
&lt;li&gt;The service asks the user for permission. See the image to the right for an example of Twitter’s permission grant dialog. Note that a more granular permission dialog might contain checkboxes allowing the user to control the level of access to the application.&lt;/li&gt;
&lt;li&gt;Once user clicks Allow, he is redirected back to the application; the URI contains a token that enables the application to authenticate.&lt;/li&gt;
&lt;li&gt;All further API calls will be made with said authentication tokens, establishing user identity.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Details have been skipped and some mechanics may vary between services, but that’s the rough idea.&lt;/p&gt;
&lt;p&gt;Note that one element this Twitter example presupposes is that &lt;em&gt;the consuming application must be registered in beforehand&lt;/em&gt;. When any API calls are made, the consuming application always identifies itself, which identification Twitter then shows in the permission dialog. This makes it much harder for malicious apps to impersonate other applications. We’ll look at this in more detail shortly.&lt;/p&gt;
&lt;h2&gt;OAuth and desktop applications&lt;/h2&gt;
&lt;p&gt;The previous example had details that clearly show it was engineered for the web. For example, note the use of the word “redirect”. Works great if you’re in a browser context – and in fact, opening the permission grant dialog isn’t really a problem in any scenario, because the browser is readily available.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.heikniemi.net/hardcoded/wp-content/uploads/2010/09/image1.png"&gt;&lt;img style="border-right-width: 0px; margin: 10px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" src="http://www.heikniemi.net/hardcoded/wp-content/uploads/2010/09/image_thumb1.png" border="0" alt="image" width="244" height="108" align="left" /&gt;&lt;/a&gt;However, the step 5 is more of a problem. Unless the consuming application happens to be a web site, redirecting to it isn’t really possible. Well, most consuming applications work on the web, and that’s exactly the scenario OAuth has been designed for.&lt;/p&gt;
&lt;p&gt;Yet still, there are quite a few applications that run on the desktop without a browser GUI. For these, the “redirection” must be done manually, by transferring the token through methods such as look-and-type or copy-and-paste.&lt;/p&gt;
&lt;h2&gt;xAuth then?&lt;/h2&gt;
&lt;p&gt;&lt;a href="http://dev.twitter.com/pages/xauth"&gt;xAuth&lt;/a&gt; is a protocol that enables browserless token exchange, essentially simplifying the process to this: The application asks for user name and password and then calls an API that turns the username/password into authentication tokens.&lt;/p&gt;
&lt;p&gt;xAuth thus provides a compromise between the values described earlier: The consuming application will get its hands on the username/password combination, but it doesn’t have to store them. If the application is benign, it will not misuse the credentials and will discard them right after getting the tokens (and storing them instead), thus bringing all of the OAuth benefits into play for the rest of the time. Malicious applications will, of course, be able to misuse the username/password combination.&lt;/p&gt;
&lt;p&gt;Unfortunately, xAuth isn’t widely available for Twitter yet, and needs special activation by the Twitter API team. So, in the next example, we’re going to tackle this with OAuth. And while xAuth will probably become mainstream one day, the next steps will still be a valuable learning experience – xAuth is, after all, mostly a layer upon OAuth.&lt;/p&gt;
&lt;h2&gt;Twitter, OAuth and a console application&lt;/h2&gt;
&lt;p&gt;In the next example, I’m going to build a .NET console application that supports OAuth authentication, storing the authentication tokens in a local file store and then use them to allow the user to send tweets. Actually, the syntax help for the application is pretty informative of the application’s capabilities:&lt;/p&gt;
&lt;pre&gt;Syntax: TwitterOAuthDemo &amp;lt;command&amp;gt; &amp;lt;arguments&amp;gt;

Valid commands and arguments are:
  authenticate &amp;lt;accountIdentifier&amp;gt;
  tweet &amp;lt;accountIdentifier&amp;gt; &amp;lt;text&amp;gt;

A typical usage sequence is to call authenticate, which opens up a browser
that you can use to get the OAuth PIN, then enter the PIN into the console
window. Once done, you can use the tweet command to actually send
tweets. Since the OAuth access tokens are stored, you only need to call
authenticate once.

Note that the account identifiers are only strings used in this system.
The OAuth system does not need to know the actual user account name.
You can use whatever identifiers you want. The identifiers will get mapped
to twitter usernames at the time of authentication.

For example:

TwitterOAuthDemo authenticate OurNewsInEnglish
TwitterOAuthDemo tweet OurNewsInEnglish "This is a hot news headline"&lt;/pre&gt;
&lt;p&gt;Ok, let’s look at how this works.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.heikniemi.net/hardcoded/wp-content/uploads/2010/09/image2.png"&gt;&lt;img style="border-right-width: 0px; margin: 10px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" src="http://www.heikniemi.net/hardcoded/wp-content/uploads/2010/09/image_thumb2.png" border="0" alt="image" width="414" height="72" align="right" /&gt;&lt;/a&gt;First of all, we must register the application. You do this by going into &lt;a href="http://dev.twitter.com/apps/new"&gt;Twitter’s application registration page&lt;/a&gt; and entering some basic information. Perhaps the most important choice there is to denote the application as a Desktop app, so that Twitter will know to show the PIN instead of redirecting the user to another page.&lt;/p&gt;
&lt;p&gt;When registered, you receive a pair of tokens for your application – essentially, a user name and a password. Whenever you want to access the service, you always need to authenticate yourself (the application). These tokens must be stored inside the application.&lt;/p&gt;
&lt;div id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:ec17ce37-9808-4f83-a7a7-51d3c622a6c5" class="wlWriterEditableSmartContent" style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px"&gt;
&lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt;
&lt;div style="background: #000080; color: #fff; font-family: Verdana, Tahoma, Arial, sans-serif; font-weight: bold; padding: 2px 5px"&gt;The application secrets&lt;/div&gt;
&lt;div style="background: #fff; max-height: 300px; overflow: auto"&gt;
&lt;ol style="background: #ffffff; margin: 0; padding: 0 0 0 5px;"&gt;
&lt;li&gt;&lt;span style="color:#0000ff"&gt;static&lt;/span&gt; &lt;span style="color:#2b91af"&gt;TwitterClientInfo&lt;/span&gt; clientInfo = &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af"&gt;TwitterClientInfo&lt;/span&gt; {&lt;/li&gt;
&lt;li style="background: #f3f3f3"&gt; ConsumerKey = &lt;span style="color:#a31515"&gt;&amp;#034;DQtmU4Gs3wiAlU3Qw&amp;#8230;&amp;#034;&lt;/span&gt;,&lt;/li&gt;
&lt;li&gt; ConsumerSecret = &lt;span style="color:#a31515"&gt;&amp;#034;tu6oidbDb5XK5MMqmAsMQyZdkIOX0gkW&amp;#8230;&amp;#034;&lt;/span&gt;&lt;/li&gt;
&lt;li style="background: #f3f3f3"&gt;};&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The created clientInfo object will then be passed on into each of the method calls made to the Twitter API. In this example, I will be using the &lt;a href="http://tweetsharp.codeplex.com/"&gt;TweetSharp&lt;/a&gt; library, which while having reached version 1.0, is also out of support by the original authors. However, until drastic changes occur with the Twitter API, it’ll work quite OK.&lt;/p&gt;
&lt;h2&gt;The authorization part&lt;/h2&gt;
&lt;p&gt;Like stated earlier on in the syntax help example, &lt;em&gt;the application does not know the Twitter username of the account it uses&lt;/em&gt;. So, say the user gives a command of “TwitterOAuthDemo authenticate MyAccount”. The “MyAccount” part is just an identifier within the application, necessary mostly because typing the authentication tokens would be very cumbersome indeed. What happens next?&lt;/p&gt;
&lt;div id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:4ddd37c8-3083-42b9-8611-8bb86716b201" class="wlWriterEditableSmartContent" style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px"&gt;
&lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt;
&lt;div style="background: #000080; color: #fff; font-family: Verdana, Tahoma, Arial, sans-serif; font-weight: bold; padding: 2px 5px"&gt;Unauthorized token&lt;/div&gt;
&lt;div style="background: #fff; max-height: 300px; overflow: auto"&gt;
&lt;ol style="background: #ffffff; margin: 0; padding: 0 0 0 5px;"&gt;
&lt;li&gt;&lt;span style="color:#008000"&gt;// Get an unauthorized token first&lt;/span&gt;&lt;/li&gt;
&lt;li style="background: #f3f3f3"&gt;&lt;span style="color:#0000ff"&gt;var&lt;/span&gt; twitter = &lt;span style="color:#2b91af"&gt;FluentTwitter&lt;/span&gt;.CreateRequest(clientInfo)&lt;/li&gt;
&lt;li&gt; .Authentication.GetRequestToken();&lt;/li&gt;
&lt;li style="background: #f3f3f3"&gt;&lt;span style="color:#2b91af"&gt;OAuthToken&lt;/span&gt; unauthorizedToken = twitter.Request().AsToken();&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This step is required to get a token, a text string that identifies the forthcoming authentication request. Even though the result is wrapped in an OAuthToken, it’s really a pair of strings pretty much like the ConsumerKey and ConsumerSecret in the example above. Looking at the generated request in &lt;a href="http://www.fiddler2.com/fiddler2/"&gt;Fiddler&lt;/a&gt;, we see this (unnecessary pieces elided for readability):&lt;/p&gt;
&lt;pre&gt;GET http://api.twitter.com/oauth/request_token HTTP/1.1
Authorization: OAuth oauth_consumer_key="DQtmU4Gs3wiAlU3Qw...",
  oauth_nonce="l8hn3ftmxrnw4umd",
  oauth_signature="C2EHUSpCJOjtgeE5ObQybJ9Q8qg%3D"&lt;/pre&gt;
&lt;p&gt;Note that while the request does contain the consumer key, it does _not_ contain the consumer secret. Rather, the message is &lt;em&gt;signed&lt;/em&gt; with the secret (again, skipping some less relevant details). Thus OAuth protects both the user and the application from having their identity stolen: this message could not be crafted without knowing the ConsumerSecret.&lt;/p&gt;
&lt;p&gt;The HTTP response to this message contains a token (yet another string) and its secret. With the token received, we should get the user out to Twitter to grant us the permission. This operation is really nothing more than formatting an appropriate URI, although the TweetSharp API makes it look like a complex API call. With the URI prepared, we can redirect the user to the authorization page.&lt;/p&gt;
&lt;div id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:282b4b9a-f382-4143-8ca9-98ac32896763" class="wlWriterEditableSmartContent" style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px"&gt;
&lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt;
&lt;div style="background: #000080; color: #fff; font-family: Verdana, Tahoma, Arial, sans-serif; font-weight: bold; padding: 2px 5px"&gt;The user interaction part&lt;/div&gt;
&lt;div style="background: #fff; overflow: auto"&gt;
&lt;ol style="background: #ffffff; margin: 0; padding: 0 0 0 5px;"&gt;
&lt;li&gt;&lt;span style="color:#008000"&gt;// Now get the URI of the page we&amp;#039;re going to redirect the user into&lt;/span&gt;&lt;/li&gt;
&lt;li style="background: #f3f3f3"&gt;&lt;span style="color:#0000ff"&gt;string&lt;/span&gt; authorizationUri = &lt;span style="color:#2b91af"&gt;FluentTwitter&lt;/span&gt;.CreateRequest(clientInfo).Authentication.GetAuthorizationUrl(unauthorizedToken.Token);&lt;/li&gt;
&lt;li&gt;System.Diagnostics.&lt;span style="color:#2b91af"&gt;Process&lt;/span&gt;.Start(authorizationUri);&lt;/li&gt;
&lt;li style="background: #f3f3f3"&gt;&lt;span style="color:#2b91af"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color:#a31515"&gt;&amp;#034;The Twitter authentication page has been opened in your default browser.&amp;#034;&lt;/span&gt;);&lt;/li&gt;
&lt;li&gt;&lt;span style="color:#2b91af"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color:#a31515"&gt;&amp;#034;Please authenticate and return with the PIN code.&amp;#034;&lt;/span&gt;);&lt;/li&gt;
&lt;li style="background: #f3f3f3"&gt;&lt;span style="color:#2b91af"&gt;Console&lt;/span&gt;.WriteLine();&lt;/li&gt;
&lt;li&gt;&lt;span style="color:#2b91af"&gt;Console&lt;/span&gt;.Write(&lt;span style="color:#a31515"&gt;&amp;#034;PIN code: &amp;#034;&lt;/span&gt;);&lt;/li&gt;
&lt;li style="background: #f3f3f3"&gt;&lt;span style="color:#0000ff"&gt;string&lt;/span&gt; pin = &lt;span style="color:#2b91af"&gt;Console&lt;/span&gt;.ReadLine().Trim();&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="http://www.heikniemi.net/hardcoded/wp-content/uploads/2010/09/image3.png"&gt;&lt;img style="border-right-width: 0px; margin: 10px 15px 10px 10px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" src="http://www.heikniemi.net/hardcoded/wp-content/uploads/2010/09/image_thumb3.png" border="0" alt="image" width="408" height="37" align="right" /&gt;&lt;/a&gt;In this example, the URI opened by the default browser was http://api.twitter.com/oauth/authorize?oauth_token=pzvqEf1HybC4z… – i.e. it contained the token returned by the previous API call to request_token. Now, the user gets to see the authorization page shown earlier in this blog post. When he clicks Allow, he gets the PIN code he then can type into to the application.&lt;/p&gt;
&lt;div id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:35daea43-5702-4d3a-8f53-46bfbdef5eb1" class="wlWriterEditableSmartContent" style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px"&gt;
&lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt;
&lt;div style="background: #000080; color: #fff; font-family: Verdana, Tahoma, Arial, sans-serif; font-weight: bold; padding: 2px 5px"&gt;Validating the PIN&lt;/div&gt;
&lt;div style="background: #fff; overflow: auto"&gt;
&lt;ol style="background: #ffffff; margin: 0; padding: 0 0 0 5px;"&gt;
&lt;li&gt;&lt;span style="color:#2b91af"&gt;OAuthToken&lt;/span&gt; accessToken =&lt;/li&gt;
&lt;li style="background: #f3f3f3"&gt; &lt;span style="color:#2b91af"&gt;FluentTwitter&lt;/span&gt;.CreateRequest(clientInfo)&lt;/li&gt;
&lt;li&gt; .Authentication.GetAccessToken(unauthorizedToken.Token, pin)&lt;/li&gt;
&lt;li style="background: #f3f3f3"&gt; .Request().AsToken();&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;With the PIN, we now use the original unauthorized token and the given PIN code to &lt;em&gt;verify&lt;/em&gt; the login. The response to this request is an &lt;em&gt;authorized token&lt;/em&gt; – again, essentially a pair of strings. Looking at this request in Fiddler (with nonrelevant parts sliced off):&lt;/p&gt;
&lt;pre&gt;GET http://api.twitter.com/oauth/access_token HTTP/1.1
Authorization: OAuth oauth_consumer_key="DQtmU4Gs3wiAlU3Qw...",
  oauth_token="pzvqEf1HybC4zD7MbIqiJzuuAMnsyqmQrsb1WdzOVbE",
  oauth_signature="jJ%2BEYt72JT548tZsTNw725Er5Ko%3D",
  oauth_verifier="8771529"&lt;/pre&gt;
&lt;p&gt;For a response, we get (headers removed):&lt;/p&gt;
&lt;pre&gt;oauth_token=185590444-Z4PWQNxM4PnoWMZfAXhJMOgjA0alTy8d2s3QVJv6&amp;amp;
oauth_token_secret=SxMO9duioXhRcpf1llXWdppEdAEIqgYfE9APrpQcjc&lt;/pre&gt;
&lt;p&gt;It is now this pair of strings we need to store for future use and pass them in each of our requests.&lt;/p&gt;
&lt;p&gt;Next, we store them locally. There is a hand-written TokenStore class for this purpose, but its implementation is irrelevant and needs no revising here. Check out the source package if you’re interested.&lt;/p&gt;
&lt;h2&gt;Tweeting with the credentials&lt;/h2&gt;
&lt;p&gt;With the OAuth credentials stored, we can now use them to create requests. The Tweet method thus becomes extremely simple, the core being this:&lt;/p&gt;
&lt;div id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:fe151636-f15c-48cd-b9ef-9b418331e68c" class="wlWriterEditableSmartContent" style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px"&gt;
&lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt;
&lt;div style="background: #000080; color: #fff; font-family: Verdana, Tahoma, Arial, sans-serif; font-weight: bold; padding: 2px 5px"&gt;Tweeting with OAuth login&lt;/div&gt;
&lt;div style="background: #fff; overflow: auto"&gt;
&lt;ol style="background: #ffffff; margin: 0; padding: 0 0 0 5px;"&gt;
&lt;li&gt;&lt;span style="color:#0000ff"&gt;var&lt;/span&gt; twitter =&lt;/li&gt;
&lt;li style="background: #f3f3f3"&gt; &lt;span style="color:#2b91af"&gt;FluentTwitter&lt;/span&gt;.CreateRequest(clientInfo)&lt;/li&gt;
&lt;li&gt; .AuthenticateWith(authToken.Token, authToken.Secret)&lt;/li&gt;
&lt;li style="background: #f3f3f3"&gt; .Statuses().Update(message);&lt;/li&gt;
&lt;li&gt;&lt;span style="color:#2b91af"&gt;TwitterResult&lt;/span&gt; response = twitter.Request();&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;While the clientInfo structure contains the identity of the application, it is the AuthenticateWith call that specifies the user credentials. But again, note that the application only stores the oauth_token and oauth_token_secret – it does &lt;em&gt;not&lt;/em&gt; store or even know the username. The account identifiers are only used as easy-to-type names for tokens inside the application – Twitter knows nothing about them.&lt;/p&gt;
&lt;p&gt;Look at the request at the HTTP level:&lt;/p&gt;
&lt;pre&gt;POST http://api.twitter.com/1/statuses/update.json HTTP/1.1
Authorization: OAuth oauth_consumer_key="DQtmU4Gs3wiAlU3Qw...",
  oauth_token="185590444-Z4PWQNxM...",
  oauth_signature="opZPjnyd1PQg2tz%2FEd1hhPi95po%3D"

status=ThisIsMyNewStatus&lt;/pre&gt;
&lt;p&gt;As you can see, the oauth_token_secret is not conveyed in the request, but again, rather used as a part in signing the message. Thus, anyone capturing this request could not use it to hijack the application’s access to the user’s account.&lt;/p&gt;
&lt;h2&gt;Where’s the source?&lt;/h2&gt;
&lt;p&gt;&lt;a href="http://www.heikniemi.net/hardcoded/wp-content/uploads/2010/09/TwitterOAuthDemo.zip"&gt;Here, go get it&lt;/a&gt;. The source compiles to a fully functional executable with two additions: First, you need to download &lt;a href="http://tweetsharp.codeplex.com/"&gt;TweetSharp&lt;/a&gt; and fix the references in the project, and second, you must &lt;a href="http://dev.twitter.com/apps/new"&gt;register your application in Twitter&lt;/a&gt;, then fill in the OAuth consumer key and secret from the Twitter site to the initialization of the ClientInfo structure (the source has my test app’s keys removed).&lt;/p&gt;
&lt;p&gt;Have fun!&lt;/p&gt;

&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/4tuWV2mpmx4lUnJkRMVhpBt90EQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/4tuWV2mpmx4lUnJkRMVhpBt90EQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/4tuWV2mpmx4lUnJkRMVhpBt90EQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/4tuWV2mpmx4lUnJkRMVhpBt90EQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/HeikniemiHardcoded/~4/Gh3hZ09VeSY" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://www.heikniemi.net/hardcoded/2010/09/twitter-and-oauth-in-desktop-applications/#comments" thr:count="1" />
		<link rel="replies" type="application/atom+xml" href="http://www.heikniemi.net/hardcoded/2010/09/twitter-and-oauth-in-desktop-applications/feed/atom/" thr:count="1" />
		<thr:total>1</thr:total>
	<feedburner:origLink>http://www.heikniemi.net/hardcoded/2010/09/twitter-and-oauth-in-desktop-applications/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Jouni Heikniemi</name>
						<uri>http://www.heikniemi.net/hardcoded/</uri>
					</author>
		<title type="html"><![CDATA[Dreamers, shapers, singers, makers]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/HeikniemiHardcoded/~3/8Ee6iqRUQLs/" />
		<id>http://www.heikniemi.net/hardcoded/2010/08/dreamers-shapers-singers-makers/</id>
		<updated>2010-08-18T08:46:45Z</updated>
		<published>2010-08-18T08:46:45Z</published>
		<category scheme="http://www.heikniemi.net/hardcoded" term="Entrepreneurship" /><category scheme="http://www.heikniemi.net/hardcoded" term="General" />		<summary type="html"><![CDATA[As Lauri announced, our company is called Offbeat Solutions. But in the announcement, he also quoted Technomage Elric from Babylon 5 in a way that deserves a closer look.
“We are dreamers, shapers, singers, and makers. We study the mysteries of laser and circuit, crystal and scanner, holographic demons and invocation of equations. These are the [...]]]></summary>
		<content type="html" xml:base="http://www.heikniemi.net/hardcoded/2010/08/dreamers-shapers-singers-makers/">&lt;p&gt;&lt;strong&gt;As Lauri announced, our company is called Offbeat Solutions. But &lt;/strong&gt;&lt;a href="http://blog.rytmis.net/2010/08/whats-in-name.html"&gt;&lt;strong&gt;in the announcement&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;, he also quoted Technomage Elric from &lt;/strong&gt;&lt;a href="http://en.wikipedia.org/wiki/Babylon_5"&gt;&lt;strong&gt;Babylon 5&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt; in a way that deserves a closer look.&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;“We are dreamers, shapers, singers, and makers. We study the mysteries of laser and circuit, crystal and scanner, holographic demons and invocation of equations. These are the tools we employ, and we know many things.”&lt;/em&gt;&lt;/p&gt;
&lt;p align="right"&gt;&lt;em&gt;&amp;#8211; Technomage Elric, in Babylon 5 episode “The Geometry of Shadows” &lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Never mind the lasers, scanners and holographic demons for a while. Let’s instead look at being a dreamer, shaper, singer and maker.&lt;/p&gt;
&lt;h2&gt;Any single part just won’t cut it&lt;/h2&gt;
&lt;p&gt;&lt;img style="border-bottom: 0px; border-left: 0px; margin: 10px 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" align="right" src="http://www.heikniemi.net/hardcoded/wp-content/uploads/2010/08/image1.png" width="316" height="284" /&gt;I believe these four bear an excellent link to successful technology consultancy – especially a forward-looking one. We practice them all, and they all link together to support one another.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;We dream of a more productive, more straightforward way to solve problems with software.&lt;/strong&gt; We feel the future, and we have an idea on how to wield it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;But future doesn’t come for free, so we shape it.&lt;/strong&gt; We stay in contact with Microsoft, with open source circles, with software methodology evangelists, with business decision makers. We give them feedback from the field and test drive the next step. &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;True leaps happen within the community, and community needs leadership. Thus, we sing.&lt;/strong&gt; Sharing our experience with our customers, competitors, fellow developers – not only it challenges &lt;em&gt;us &lt;/em&gt;to become better, but also powers the innovation cycle and raises the IT business standards further.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;And yet, it would all be for naught if we didn’t actually make it happen.&lt;/strong&gt; Almost everything valuable in the software world is realized through actually working software. If we kept to a role of a philosopher, we’d bear less risk, but we’d also be irrelevant. Besides giving the real hands-on experience, it powers our dreams, thus restarting the cycle.&lt;/p&gt;
&lt;h2&gt;On competition&lt;/h2&gt;
&lt;p&gt;Some of the previous might seem like new age altruism to you. Where’s the business in sharing your findings? Won’t you give up the competitive advantage?&lt;/p&gt;
&lt;p&gt;Yeah, sure. However, we have a broader view of the issue. It consists of these points:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;There is more than enough to do on the IT scene. No single deal really makes the difference.&lt;/li&gt;
&lt;li&gt;The main threat to IT business comes from software having excessive cost.&lt;/li&gt;
&lt;li&gt;The key way to drive down cost is to manage quality and productivity.&lt;/li&gt;
&lt;li&gt;For the last statement, having good people is pretty much the only real cure.&lt;/li&gt;
&lt;li&gt;Therefore, sharing information is not really all that critical (compared to the people).&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;But with that said, isn’t sharing information then fake charity, and building the community just an illusion?&lt;/p&gt;
&lt;p&gt;No. First of all, people are not inherently good or bad developers. Good people grow within organizations driven for – and by &amp;#8211; improvement. The stronger community we have, the more it pushes companies towards &lt;em&gt;improvement in substance&lt;/em&gt; (instead of &lt;em&gt;growth in numbers&lt;/em&gt;). Sharing information works here: It accelerates the growth and skill level of the community.&lt;/p&gt;
&lt;p&gt;More good companies results in more good developers, and more good developers push down software cost, creating more and more opportunities. And finally, the more demanding customers we have, the more opportunities there are for the best of the market. &lt;/p&gt;
&lt;p&gt;Of course, there’s no quick win here. But Offbeat Solutions feels that business success and money is a result of doing things right, and we are here to improve ourselves and have fun. If it produces results, so be it.&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;&amp;quot;The ability to learn faster than your competitors may be the only sustainable competitive advantage.&amp;quot;&lt;/em&gt;&lt;/p&gt;
&lt;p align="right"&gt;&lt;em&gt;&amp;#8211; Arie de Geus&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/F4pc7I55aQAe8Mhb-uln2hCOk80/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/F4pc7I55aQAe8Mhb-uln2hCOk80/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/F4pc7I55aQAe8Mhb-uln2hCOk80/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/F4pc7I55aQAe8Mhb-uln2hCOk80/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/HeikniemiHardcoded/~4/8Ee6iqRUQLs" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://www.heikniemi.net/hardcoded/2010/08/dreamers-shapers-singers-makers/#comments" thr:count="0" />
		<link rel="replies" type="application/atom+xml" href="http://www.heikniemi.net/hardcoded/2010/08/dreamers-shapers-singers-makers/feed/atom/" thr:count="0" />
		<thr:total>0</thr:total>
	<feedburner:origLink>http://www.heikniemi.net/hardcoded/2010/08/dreamers-shapers-singers-makers/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Jouni Heikniemi</name>
						<uri>http://www.heikniemi.net/hardcoded/</uri>
					</author>
		<title type="html"><![CDATA[All good things&#8230;]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/HeikniemiHardcoded/~3/lllB4ZUDxAc/" />
		<id>http://www.heikniemi.net/hardcoded/2010/08/all-good-things/</id>
		<updated>2010-08-12T07:22:42Z</updated>
		<published>2010-08-12T07:22:42Z</published>
		<category scheme="http://www.heikniemi.net/hardcoded" term="Entrepreneurship" /><category scheme="http://www.heikniemi.net/hardcoded" term="General" />		<summary type="html"><![CDATA[It is time to head out and risk everything to find a yet another great world. 29th August will be recorded in the annals of history as my last day in Sininen Meteoriitti.
I have been working for the company for six years now. And what six years have they been! I was employee #13 when [...]]]></summary>
		<content type="html" xml:base="http://www.heikniemi.net/hardcoded/2010/08/all-good-things/">&lt;p&gt;&lt;strong&gt;It is time to head out and risk everything to find a yet another great world. 29th August will be recorded in the annals of history as my last day in &lt;a href="http://www.meteoriitti.com/'"&gt;Sininen Meteoriitti&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I have been working for the company for six years now. And what six years have they been! I was employee #13 when I joined, and now we number close to 80. I’ve been experiencing – and to an extent, hands-on creating &amp;#8211; the change from a small web outlet to a fast-growing, ambitious SharePoint consultancy. So yeah, it’s been a great experience with a lot to be thankful about!&lt;/p&gt;
&lt;h2&gt;Freedom?&lt;/h2&gt;
&lt;p&gt;First, the answer to the critical question: &lt;strong&gt;The time is ripe to start one’s own company.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;When all this finally clicked into place, a quote from Star Trek: The Next Generation came to mind. In the scene, Captain Jean-Luc Picard is pushing his first officer to take up a promotion that will give him his own ship – not entirely unlike leaving a visible position in a recognized company.&lt;/p&gt;
&lt;blockquote&gt;&lt;div&gt;&lt;cite&gt;Your present position as first officer of the Enterprise &lt;/cite&gt;&lt;/div&gt;
&lt;div&gt;&lt;cite&gt;brings you prestige, distinction, even glamour of a kind. &lt;/cite&gt;&lt;/div&gt;
&lt;div&gt;&lt;cite&gt;You are the second in command of Starfleet&amp;#039;s flagship &amp;#8212; &lt;/cite&gt;&lt;/div&gt;
&lt;div&gt;&lt;cite&gt;but still, second in command. Your promotion will &lt;/cite&gt;&lt;/div&gt;
&lt;div&gt;&lt;cite&gt;transfer you to a relatively insignificant ship &lt;/cite&gt;&lt;/div&gt;
&lt;div&gt;&lt;cite&gt;in an obscure corner of the galaxy, but it will be your ship. &lt;/cite&gt;&lt;/div&gt;
&lt;div&gt;&lt;cite&gt;&lt;/cite&gt;&lt;/div&gt;
&lt;div&gt;&lt;cite&gt;&lt;/cite&gt;&lt;/div&gt;
&lt;div&gt;&lt;cite&gt;Being who you are, that ship will vibrate with your authority, &lt;/cite&gt;&lt;/div&gt;
&lt;div&gt;&lt;cite&gt;your style, your vision. There is no substitute for &lt;/cite&gt;&lt;/div&gt;
&lt;div&gt;&lt;cite&gt;being in the center of the stage &amp;#8212; any stage.&lt;/cite&gt;&lt;/div&gt;
&lt;div style="text-align: right"&gt;&amp;#8211; Jean-Luc Picard, in “&lt;a href="http://www.twiztv.com/scripts/nextgeneration/season2/tng-214.txt"&gt;The Icarus Factor&lt;/a&gt;”&lt;/div&gt;
&lt;/blockquote&gt;
&lt;h2&gt;&lt;/h2&gt;
&lt;/p&gt;
&lt;p&gt;I need nor want no more control or authority over others. But freedom, in the form of having the maximum available choice of options for your destiny, that is certainly something worthy. Freedom, in the form of maximum liberty to arrange the work/life balance, that certainly has value. &lt;/p&gt;
&lt;p&gt;And thus, at this time in life, this just feels right.&lt;/p&gt;
&lt;h2&gt;Details?&lt;/h2&gt;
&lt;p&gt;Unfortunately, there are few yet. I’ll share what I have, though:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;We are four people (&lt;a href="http://fi.linkedin.com/pub/sami-poimala/2/549/a00"&gt;Sami Poimala&lt;/a&gt;, &lt;a href="http://fi.linkedin.com/in/rytmis"&gt;Lauri Kotilainen&lt;/a&gt;, my wife &lt;a href="http://www.linkedin.com/profile?viewProfile=&amp;amp;key=7315383&amp;amp;authToken=Q5tO&amp;amp;authType=NAME_SEARCH&amp;amp;locale=en_US&amp;amp;srchindex=1&amp;amp;srchid=b5b09d61-dd15-48f2-a3c8-cae09acabee5&amp;amp;srchtotal=1&amp;amp;pvs=ps&amp;amp;goback=%2Efps_riikka+heikniemi_*1_*1_*1_*1_*1_*1_*1_Y_*1_*1_*1_false_1_R_true_CC%2CN%2CG%2CI%2CPC%2CED%2CL%2CFG%2CTE%2CFA%2CSE%2CP%2CCS%2CF%2CDR_*2_*2_*2_*2_*2_*2_*2_*2_*2_*2_*2_*2_*2_*2_*2_*2_*2_*2_*2"&gt;Riikka&lt;/a&gt; and me). &lt;/li&gt;
&lt;li&gt;We all have versatile software development backgrounds particularly in the Microsoft space, so it’ll be the business we’re in.
&lt;ul&gt;
&lt;li&gt;Honest, we don’t have a very exact business plan yet! Of course, we have a few dozen leads and zillions of ideas, but we’ll get the right people together first, then look at what we’ll actually be doing. &lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;We won’t be having an office quite yet, but will rather work from our homes. &lt;/li&gt;
&lt;li&gt;We will be available starting from 30th August, although we’re likely to keep a rather low profile in the beginning. &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The company name and more details will be published as things mature. Meanwhile, I have a bit over two weeks to get my desk clean and make sure nobody at Meteoriitti notices my absence when September comes. Better get crackin’.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;(Oh, and of course, if you are in Finland and happen to need some quite professional developers/consultants on the .NET platform, please feel free to &lt;/em&gt;&lt;a href="mailto:jouni@heikniemi.net"&gt;&lt;em&gt;contact me&lt;/em&gt;&lt;/a&gt;&lt;em&gt;)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/-aur_jrxF1rYBj7lyyJDg2-6dGQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/-aur_jrxF1rYBj7lyyJDg2-6dGQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/-aur_jrxF1rYBj7lyyJDg2-6dGQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/-aur_jrxF1rYBj7lyyJDg2-6dGQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/HeikniemiHardcoded/~4/lllB4ZUDxAc" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://www.heikniemi.net/hardcoded/2010/08/all-good-things/#comments" thr:count="6" />
		<link rel="replies" type="application/atom+xml" href="http://www.heikniemi.net/hardcoded/2010/08/all-good-things/feed/atom/" thr:count="6" />
		<thr:total>6</thr:total>
	<feedburner:origLink>http://www.heikniemi.net/hardcoded/2010/08/all-good-things/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Jouni Heikniemi</name>
						<uri>http://www.heikniemi.net/hardcoded/</uri>
					</author>
		<title type="html"><![CDATA[&#8220;Quadrant&#8221; scrapped, &#8220;M&#8221; refocused &#8211; Oslo soon under water?]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/HeikniemiHardcoded/~3/psP8pFC6UPo/" />
		<id>http://www.heikniemi.net/hardcoded/2010/08/quadrant-scrapped-m-refocused-oslo-soon-under-water/</id>
		<updated>2010-08-06T09:22:33Z</updated>
		<published>2010-08-06T09:22:33Z</published>
		<category scheme="http://www.heikniemi.net/hardcoded" term=".NET" /><category scheme="http://www.heikniemi.net/hardcoded" term="Oslo" /><category scheme="http://www.heikniemi.net/hardcoded" term="SQL Server" />		<summary type="html"><![CDATA[Mary-Jo reports that her sources tell Quadrant is going to get scrapped and the M language refocused. What’s up with the previously massive Oslo codename?
Both parts were key to Oslo – in fact, the most visible parts left of the original vision that once seemed to span the data modeling needs of the entire universe. [...]]]></summary>
		<content type="html" xml:base="http://www.heikniemi.net/hardcoded/2010/08/quadrant-scrapped-m-refocused-oslo-soon-under-water/">&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.zdnet.com/blog/microsoft/another-piece-of-microsofts-oslo-modeling-puzzle-disappears/7014"&gt;Mary-Jo reports&lt;/a&gt; that her sources tell Quadrant is going to get scrapped and the M language refocused. What’s up with the previously massive Oslo codename?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.heikniemi.net/hardcoded/wp-content/uploads/2010/08/image.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; margin: 10px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" align="right" src="http://www.heikniemi.net/hardcoded/wp-content/uploads/2010/08/image_thumb.png" width="244" height="216" /&gt;&lt;/a&gt;Both parts were key to Oslo – in fact, the most visible parts left of the original vision that once seemed to span the data modeling needs of the entire universe. Quadrant was the visual designer (see the image), M was the language that allowed the description of data structures and much more. Supposedly, M was going to get some ground also outside the pure developer space – for example, it was planned to be used in the next version of Active Directory.&lt;/p&gt;
&lt;p&gt;I think Quadrant sucked all the way in its complexity. Even for pre-alpha software, it failed to generate any excitement in me whatsoever. Admittedly cool concepts, but really, rather little in terms of immediate benefit for practical, everyday software development. In this sense, its dismissal is no surprise. There’s so much available in terms of cheap or free Visual Studio and its designers already – and the platform certainly can be extended further.&lt;/p&gt;
&lt;p&gt;M, on the other hand, looked like an abstraction that would have unifying impact across various forms of data storage (AD, relational data, SharePoint lists, …). In that sense, it’ll be very interesting to see the scope of this “refocusing”. If M loses its universal nature, it loses its appeal – or at least, I tend to think so. &lt;/p&gt;
&lt;p&gt;Whether or not SQL Server Modeling will &lt;a href="http://www.heikniemi.net/hardcoded/2010/02/denali-to-finally-ship-oslo/"&gt;ship in Denali&lt;/a&gt; or not remains to be seen. The third part of said module is the model repository, but with Quadrant’s and M’s shuffle, will there be anything to store there? At any rate, &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=29e4ead0-fd81-42ba-862b-f3589378466a&amp;amp;displaylang=en"&gt;SQL Server Modeling November CTP&lt;/a&gt; is still out there for download. While supplies last, at least. &lt;/p&gt;
&lt;p&gt;Oh, and yet another PDC with a chance to announce something regarding Oslo? Looking forward to October…&lt;/p&gt;

&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/XSbZeTPwfIE3G_wTuBd5kkqW-cw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/XSbZeTPwfIE3G_wTuBd5kkqW-cw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/XSbZeTPwfIE3G_wTuBd5kkqW-cw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/XSbZeTPwfIE3G_wTuBd5kkqW-cw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/HeikniemiHardcoded/~4/psP8pFC6UPo" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://www.heikniemi.net/hardcoded/2010/08/quadrant-scrapped-m-refocused-oslo-soon-under-water/#comments" thr:count="0" />
		<link rel="replies" type="application/atom+xml" href="http://www.heikniemi.net/hardcoded/2010/08/quadrant-scrapped-m-refocused-oslo-soon-under-water/feed/atom/" thr:count="0" />
		<thr:total>0</thr:total>
	<feedburner:origLink>http://www.heikniemi.net/hardcoded/2010/08/quadrant-scrapped-m-refocused-oslo-soon-under-water/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Jouni Heikniemi</name>
						<uri>http://www.heikniemi.net/hardcoded/</uri>
					</author>
		<title type="html"><![CDATA[Windows Azure Appliance &#8211; Your private corner of the Microsoft cloud]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/HeikniemiHardcoded/~3/7_iabDjVSyg/" />
		<id>http://www.heikniemi.net/hardcoded/2010/07/windows-azure-appliance-your-private-corner-of-the-microsoft-cloud/</id>
		<updated>2010-07-13T12:46:58Z</updated>
		<published>2010-07-13T12:46:58Z</published>
		<category scheme="http://www.heikniemi.net/hardcoded" term="Cloud" /><category scheme="http://www.heikniemi.net/hardcoded" term="Windows IT" /><category scheme="http://www.heikniemi.net/hardcoded" term="Azure" /><category scheme="http://www.heikniemi.net/hardcoded" term="Azure Appliance" />		<summary type="html"><![CDATA[The “private cloud” concept (i.e. the idea of running the cloud-designed applications on your premises) can be implemented in a variety of ways. Not surprisingly, each cloud vendor also provides its own notion of “private cloud”. Now Microsoft adds yet another approach to the mix by launching Windows Azure Appliance. 
Before looking into the appliance [...]]]></summary>
		<content type="html" xml:base="http://www.heikniemi.net/hardcoded/2010/07/windows-azure-appliance-your-private-corner-of-the-microsoft-cloud/">&lt;p&gt;&lt;strong&gt;The “private cloud” concept (i.e. the idea of running the cloud-designed applications on your premises) can be implemented in a variety of ways. Not surprisingly, each cloud vendor also provides its own notion of “private cloud”. Now Microsoft adds yet another approach to the mix by launching Windows Azure Appliance. &lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Before looking into the appliance launch made yesterday in &lt;a href="http://www.heikniemi.net/hardcoded/2010/07/coming-next-week-wpc-2010-in-washington-d-c/"&gt;WPC10&lt;/a&gt;, I’ll provide a short backgrounder on the cloud, private cloud and the different &lt;em&gt;XaaS&lt;/em&gt; approaches. If you just want to read about the launch, skip ahead!&lt;/p&gt;
&lt;h2&gt;What is private cloud? &lt;/h2&gt;
&lt;p&gt;Private cloud could be defined as the cloud-level infrastructure implemented in an enterprise setting. Perhaps the simplest example is the one often used with VMware products: Instead of buying a bunch of servers for a specific purpose, you buy a stack of general-purpose servers, assign them into a massive pool and start dividing out the resources (computing power, storage, …) to the various purposes within your organization. &lt;/p&gt;
&lt;p&gt;The key levers to this are automated management and the virtualization. These advances allow reasonably sized pools of computers to act with a cloud-like elasticity, providing fault tolerance and scalability on-demand. Thus, the role of IT operations change: They become more like a service provider, perhaps with less exact control over the applications running in the datacenter.&lt;/p&gt;
&lt;h2&gt;The different levels of service &lt;/h2&gt;
&lt;p&gt;The virtualization-based level of abstraction from the cloud is typically called &lt;strong&gt;IaaS&lt;/strong&gt;, &lt;em&gt;Infrastructure as a Service&lt;/em&gt;. In an IaaS setting, the application is a normal Windows, Linux or whatever application – it just runs on servers virtualized in a specific way. The virtualization environment could be your local Hyper-V or VMware installation, but it could also be a cloud provider such as &lt;a href="http://aws.amazon.com/ec2/"&gt;Amazon EC2&lt;/a&gt;. &lt;/p&gt;
&lt;p&gt;It is a reasonably simple notion when compared to &lt;strong&gt;PaaS&lt;/strong&gt;, &lt;em&gt;Platform as a Service&lt;/em&gt;, which Windows Azure mostly represents. With a PaaS application such as a Windows Azure Web Role, the software is &lt;em&gt;specifically built for the service platform&lt;/em&gt;. In exchange for requiring a slightly different development skill set, the PaaS platform hides the complexity of scale and fault tolerance. For example, a failure of a Windows Azure server is transparent to the application. Likewise, an Azure application can be scaled to thousands of computers without code changes – if the Azure programming paradigm has been duly followed.&lt;/p&gt;
&lt;p&gt;Above both these is the notion of &lt;strong&gt;SaaS&lt;/strong&gt;, &lt;em&gt;Software as a Service&lt;/em&gt;. The users of SaaS applications are the end users – they don’t want a platform, they just want an application that works for their purpose. Typical offerings include &lt;a href="http://www.google.fi/url?sa=t&amp;amp;source=web&amp;amp;cd=2&amp;amp;ved=0CC4QFjAB&amp;amp;url=http%3A%2F%2Fwww.google.com%2Fapps%2F&amp;amp;ei=Ofs7TJOFCdPGOJS2kfIO&amp;amp;usg=AFQjCNEQwjGZpKRtvkMb8kjBL2odai_iJg&amp;amp;sig2=4ZHS6TK_Zk2wGIc8_f9TdA"&gt;Google Apps&lt;/a&gt; (email, document sharing etc.), &lt;a href="http://www.microsoft.com/online/business-productivity.mspx"&gt;Microsoft Business Productivity Online Suite&lt;/a&gt; (likewise), &lt;a href="http://www.salesforce.com/"&gt;Salesforce.com&lt;/a&gt; (CRM) and so on. &lt;/p&gt;
&lt;p&gt;Note that all these XaaS offerings are layers upon one another. There is no grading here: one is not better than the other, nor does one represent an advance over the others. What works for you depends on your needs.&lt;/p&gt;
&lt;h2&gt;What is the Windows Azure Platform Appliance?&lt;/h2&gt;
&lt;p&gt;Essentially, it is a container of about a thousand servers, deployed on your own premises. You can’t touch the inside though – just plug in lots of electricity, cooling and network capacity, and you’re good to go. What runs inside is the same application platform as in the public Azure cloud. &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The key point is that the software platform is managed by Microsoft&lt;/strong&gt;. When Windows Azure gains new capabilities, the software inside your container will be upgraded. And although you’re in charge of the schedule, you don’t need to – and you can’t – touch the actual upgrade process.&lt;/p&gt;
&lt;p&gt;This is what separates the Appliance from various other private cloud offerings. For example, VMware’s notion of a private cloud mostly revolves around the idea of getting cloud &lt;em&gt;technology&lt;/em&gt; to run on-site. Microsoft now extends this notion by bringing the &lt;em&gt;service&lt;/em&gt; into the on-premise datacenters. The Azure Appliance is not just the platform on-premises, it is the &lt;em&gt;platform service &lt;/em&gt;on-premises.&lt;/p&gt;
&lt;p&gt;So far, it has been promised that the appliance will be running both Windows Azure and SQL Azure. This means that it will be a sufficient platform for most cloud-based application that can be currently run on the public Azure cloud.&lt;/p&gt;
&lt;p&gt;The figure of thousand servers was thrown in the air by &lt;a href="http://www.sfgate.com/cgi-bin/article.cgi?f=/g/a/2010/07/12/urnidgns002570F3005978D88525775E00610753.DTL"&gt;Bob Muglia&lt;/a&gt;; he also stated that somewhat smaller appliances were in the plans. Given that the container model requires a rather considerable amount of nodes in order to provide sufficient fault tolerance (remember: the container is probably replaced once a certain percentage of hardware requires replacement), I doubt we’ll see anything below 300 servers.&lt;/p&gt;
&lt;h2&gt;Why the Appliance?&lt;/h2&gt;
&lt;p&gt;The Appliance strikes an interesting balance. It provides the usually quoted benefits of private cloud (better control of data, less dependent on the Internet connectivity, faster data transfer inside the organization etc.). It also provides much of the public cloud benefits – most importantly computing without the need to setup or maintain the servers – the “serviceness”. &lt;/p&gt;
&lt;p&gt;Scalability and elasticity don’t really apply to the appliance on a hardware level, but it does provide reasonable scalability inside the box. It remains to be seen if Microsoft will start supporting various more complex scenarios such as resource pooling between appliances and even perhaps the public cloud.&lt;/p&gt;
&lt;p&gt;The appliances will be available both for hosters and end customers. Initial partners are HP, Fujitsu, Dell and eBay – the last of which is an actual customer. Since the big partners have their own datacenters around the globe, this also broadens Microsoft’s reach considerably: For example, organizations who have a legislative (or policy-based) need to keep their data in Finland could not have done so with Azure so far. However, a sufficiently big customer might buy a container of his own, or a smaller one might depend on Azure services provided by his local hosting company.&lt;/p&gt;
&lt;p&gt;The pricing was not announced yet. This is an interesting point, because there is no precedent. Such appliances could be sold with a sizeable upfront cost, but they could also reasonably be rented. And yes, usage-based billing is an option too. If Microsoft decides to go with usage-based billing, it essentially takes a great step towards month-based licensing for on-premise software, a vision from long ago. At any rate, &lt;em&gt;some&lt;/em&gt; monthly cost is definitely to be expected, given Microsoft’s commitment to providing the updates.&lt;/p&gt;
&lt;p&gt;Sadly, no idea of the schedule so far.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Bs5W5Qdf38i10glcpCdd5gCf-uw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Bs5W5Qdf38i10glcpCdd5gCf-uw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Bs5W5Qdf38i10glcpCdd5gCf-uw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Bs5W5Qdf38i10glcpCdd5gCf-uw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/HeikniemiHardcoded/~4/7_iabDjVSyg" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://www.heikniemi.net/hardcoded/2010/07/windows-azure-appliance-your-private-corner-of-the-microsoft-cloud/#comments" thr:count="1" />
		<link rel="replies" type="application/atom+xml" href="http://www.heikniemi.net/hardcoded/2010/07/windows-azure-appliance-your-private-corner-of-the-microsoft-cloud/feed/atom/" thr:count="1" />
		<thr:total>1</thr:total>
	<feedburner:origLink>http://www.heikniemi.net/hardcoded/2010/07/windows-azure-appliance-your-private-corner-of-the-microsoft-cloud/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Jouni Heikniemi</name>
						<uri>http://www.heikniemi.net/hardcoded/</uri>
					</author>
		<title type="html"><![CDATA[PDC 2010 &#8211; 2 days in Redmond]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/HeikniemiHardcoded/~3/xJfMuHsUi5c/" />
		<id>http://www.heikniemi.net/hardcoded/2010/07/pdc-2010-2-days-in-redmond/</id>
		<updated>2010-07-14T05:54:34Z</updated>
		<published>2010-07-12T12:07:43Z</published>
		<category scheme="http://www.heikniemi.net/hardcoded" term="General" /><category scheme="http://www.heikniemi.net/hardcoded" term="PDC10" />		<summary type="html"><![CDATA[And we all thought PDC 2010 wasn’t coming, but it does. Not sure if Microsoft intended to slip it already, but www.microsoftpdc.com is live!
It’s only two days, so getting shorter every year. No idea on the agenda, but I’d be surprised if the slippage wasn’t related to the WPC keynote starting in 50 minutes. So [...]]]></summary>
		<content type="html" xml:base="http://www.heikniemi.net/hardcoded/2010/07/pdc-2010-2-days-in-redmond/">&lt;p&gt;&lt;strong&gt;And we all thought PDC 2010 wasn’t coming, but it does. Not sure if Microsoft intended to slip it already, but &lt;a href="http://www.microsoftpdc.com"&gt;www.microsoftpdc.com&lt;/a&gt; is live!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;It’s only two days, so getting shorter every year. No idea on the agenda, but I’d be surprised if the slippage wasn’t related to the WPC keynote starting in 50 minutes. So stay tuned…&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; &lt;a href="http://www.zdnet.com/blog/microsoft/microsofts-upcoming-cloud-pdc-whats-on-tap/6831"&gt;MJF covers some of the content in her blog post&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Nertpd64Ph-mRMtIn2aoikWfsuI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Nertpd64Ph-mRMtIn2aoikWfsuI/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Nertpd64Ph-mRMtIn2aoikWfsuI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Nertpd64Ph-mRMtIn2aoikWfsuI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/HeikniemiHardcoded/~4/xJfMuHsUi5c" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://www.heikniemi.net/hardcoded/2010/07/pdc-2010-2-days-in-redmond/#comments" thr:count="0" />
		<link rel="replies" type="application/atom+xml" href="http://www.heikniemi.net/hardcoded/2010/07/pdc-2010-2-days-in-redmond/feed/atom/" thr:count="0" />
		<thr:total>0</thr:total>
	<feedburner:origLink>http://www.heikniemi.net/hardcoded/2010/07/pdc-2010-2-days-in-redmond/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Jouni Heikniemi</name>
						<uri>http://www.heikniemi.net/hardcoded/</uri>
					</author>
		<title type="html"><![CDATA[Coming next week: WPC 2010 in Washington D.C.]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/HeikniemiHardcoded/~3/8Yu7DtqaYPA/" />
		<id>http://www.heikniemi.net/hardcoded/2010/07/coming-next-week-wpc-2010-in-washington-d-c/</id>
		<updated>2010-07-07T09:10:34Z</updated>
		<published>2010-07-07T09:10:34Z</published>
		<category scheme="http://www.heikniemi.net/hardcoded" term="General" /><category scheme="http://www.heikniemi.net/hardcoded" term="WPC" />		<summary type="html"><![CDATA[Next week is the holiday-breaker for Microsoft partners as Microsoft’s Worldwide Partner Conference, colloquially known as WPC, kicks off. WPC is not much of a technical launch conference, but it does provide an interesting perspective into various things. I’ll be staying here in Finland, watching the news wave from afar. 
A short recap of the [...]]]></summary>
		<content type="html" xml:base="http://www.heikniemi.net/hardcoded/2010/07/coming-next-week-wpc-2010-in-washington-d-c/">&lt;p&gt;&lt;strong&gt;Next week is the holiday-breaker for Microsoft partners as Microsoft’s &lt;a href="http://www.digitalwpc.com"&gt;Worldwide Partner Conference&lt;/a&gt;, colloquially known as WPC, kicks off. WPC is not much of a technical launch conference, but it does provide an interesting perspective into various things. I’ll be staying here in Finland, watching the news wave from afar. &lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A short recap of the last year is available in &lt;a href="http://www.heikniemi.net/hardcoded/2009/07/microsofts-three-day-wpc-blaze-recapped/"&gt;my blog post from July 2009&lt;/a&gt;. The main themes were Azure pricing and Office 2010. But what are we really looking forward to for WPC 2010?&lt;/p&gt;
&lt;h2&gt;First and foremost, there is the cloud&lt;/h2&gt;
&lt;p&gt;2010 has been the year when Microsoft announced the “We’re all in” mantra for cloud computing. No doubt, this will be the key theme for the whole WPC, as Microsoft tries to convince its partners, critics and the press of its plans for the cloud era. There’s a lot of ground to cover, too. &lt;/p&gt;
&lt;p&gt;The main question is: How do partners take part in the cloud ecosystem, where customers start paying directly to Microsoft? On a theoretical level, this really isn’t a problem. Microsoft’s cloud offering without professional assistance will satisfy only the most tech-savvy customers and perhaps those with very simple and flexible requirements. But a lot of the actual business mechanics are still… well, clouded. Hopefully we’ll be a lot wiser a week from now.&lt;/p&gt;
&lt;h2&gt;Plus partner program and everything else&lt;/h2&gt;
&lt;p&gt;Another key theme should be the heavily refreshed partner program, now known as Microsoft Partner Network (MPN). Although the key new things were already announced last year and a lot has already been implemented, I think there’s still more to come.&lt;/p&gt;
&lt;p&gt;And of course, a plenty of hype around the commercial success of Windows 7, SharePoint, Azure and whatnot. And surprisingly, I look forward to all that :-) Despite being a bit excessive even on the border of religious fervor, it does provide a good mindset for envisioning the future and thinking about your competence goals for the next few years.&lt;/p&gt;
&lt;p&gt;And yeah, I’ll post the keynote highlights this year here in this blog, too. If you want a live part of the action, the keynotes will be streamed on &lt;a href="http://www.digitalwpc.com"&gt;digitalwpc.com&lt;/a&gt; on Monday, Tuesday and Wednesday next week.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/JKgyQIKr55HGdAOBa3CqlWeZIcs/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/JKgyQIKr55HGdAOBa3CqlWeZIcs/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/JKgyQIKr55HGdAOBa3CqlWeZIcs/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/JKgyQIKr55HGdAOBa3CqlWeZIcs/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/HeikniemiHardcoded/~4/8Yu7DtqaYPA" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://www.heikniemi.net/hardcoded/2010/07/coming-next-week-wpc-2010-in-washington-d-c/#comments" thr:count="1" />
		<link rel="replies" type="application/atom+xml" href="http://www.heikniemi.net/hardcoded/2010/07/coming-next-week-wpc-2010-in-washington-d-c/feed/atom/" thr:count="1" />
		<thr:total>1</thr:total>
	<feedburner:origLink>http://www.heikniemi.net/hardcoded/2010/07/coming-next-week-wpc-2010-in-washington-d-c/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Jouni Heikniemi</name>
						<uri>http://www.heikniemi.net/hardcoded/</uri>
					</author>
		<title type="html"><![CDATA[Changing the capri pants &#8211; a reminder on customer service]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/HeikniemiHardcoded/~3/-zp9B-xfwXg/" />
		<id>http://www.heikniemi.net/hardcoded/2010/06/changing-the-capri-pants-a-reminder-on-customer-service/</id>
		<updated>2010-06-29T03:52:35Z</updated>
		<published>2010-06-29T03:52:35Z</published>
		<category scheme="http://www.heikniemi.net/hardcoded" term="General" /><category scheme="http://www.heikniemi.net/hardcoded" term="customer service" />		<summary type="html"><![CDATA[I recently visited the Vero Moda boutique in Kamppi, Helsinki on an errand to change a pair of pants unfit for my wife. The affair was done accordingly to their change/return policy, except for one thing: the missing original price tag.
The lovely salesperson decided to give me hard time on this one. Despite the fact [...]]]></summary>
		<content type="html" xml:base="http://www.heikniemi.net/hardcoded/2010/06/changing-the-capri-pants-a-reminder-on-customer-service/">&lt;p&gt;&lt;strong&gt;I recently visited the Vero Moda boutique in Kamppi, Helsinki on an errand to change a pair of pants unfit for my wife. The affair was done accordingly to their change/return policy, except for one thing: the missing original price tag.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The lovely salesperson decided to give me hard time on this one. Despite the fact that the conditions indicated a nigh-zero chance of an attempt to cheat, she immediately started by stating “I really can’t help you here”. Which is, basically, quite fine. She &lt;em&gt;was &lt;/em&gt;correct: their policy said no returns without the receipt and the price tag, and it’s not an unreasonable policy. I could’ve understood that. &lt;/p&gt;
&lt;p&gt;However, the next step was that she begrudgingly admitted to taking them back, after closely examining them for possible wear and tear. Finding nothing, she felt almost disappointed as she told me she’d make an exception &lt;em&gt;this time&lt;/em&gt;. “Just remember to keep the tag attached the next time”. I seemed to need this reminder for a couple of times, even.&lt;/p&gt;
&lt;p&gt;Yeah yeah, we will remember.&lt;/p&gt;
&lt;h2&gt;If your customer is wrong, swallow it&lt;/h2&gt;
&lt;p&gt;The worst thing is that we do this all the time in IT as well. A customer rolls in a ridiculous-sounding request. We tell him it’s a no, but then turn our heads due to one reason or another. And while we are working on the request, we whine about how things should be differently, how the customer has no clue and so on.&lt;/p&gt;
&lt;p&gt;For your deity’s sake, &lt;strong&gt;if you decide to comply with your customers’ wishes, don’t make him feel bad about it&lt;/strong&gt;. Once you make the call of going one way, focus on making the situation a customer service victory. Perhaps you did expose your company to a risk of a few extra man-hours of unbillable work, or perhaps there is a slight chance that those pants were used and somebody gained unjust advantage. But once you decided your course of action, you couldn’t retreat anyway.&lt;/p&gt;
&lt;p&gt;Perhaps there is a time for politics, but the it is almost never when you’re actually working with an immediate customer problem.&lt;/p&gt;
&lt;p&gt;Well, I got my (or my wife’s, actually) pants changed. However, I’m left puzzled: It’s almost like I felt worse than I did at the first phase when my request for a change was reasonably and politely denied.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/QjThTu3TFDuI1lYXPsCl8KbDpMs/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/QjThTu3TFDuI1lYXPsCl8KbDpMs/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/QjThTu3TFDuI1lYXPsCl8KbDpMs/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/QjThTu3TFDuI1lYXPsCl8KbDpMs/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/HeikniemiHardcoded/~4/-zp9B-xfwXg" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://www.heikniemi.net/hardcoded/2010/06/changing-the-capri-pants-a-reminder-on-customer-service/#comments" thr:count="0" />
		<link rel="replies" type="application/atom+xml" href="http://www.heikniemi.net/hardcoded/2010/06/changing-the-capri-pants-a-reminder-on-customer-service/feed/atom/" thr:count="0" />
		<thr:total>0</thr:total>
	<feedburner:origLink>http://www.heikniemi.net/hardcoded/2010/06/changing-the-capri-pants-a-reminder-on-customer-service/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Jouni Heikniemi</name>
						<uri>http://www.heikniemi.net/hardcoded/</uri>
					</author>
		<title type="html"><![CDATA[Avanade collaboration study, and what can we learn from it?]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/HeikniemiHardcoded/~3/p2suIrZPQfg/" />
		<id>http://www.heikniemi.net/hardcoded/2010/06/avanade-collaboration-study-and-what-can-we-learn-from-it/</id>
		<updated>2010-06-24T04:30:07Z</updated>
		<published>2010-06-24T04:30:07Z</published>
		<category scheme="http://www.heikniemi.net/hardcoded" term="Information Worker" /><category scheme="http://www.heikniemi.net/hardcoded" term="collaboration" />		<summary type="html"><![CDATA[In the beginning of June, Avanade published a study on collaboration practices (press release [PDF], executive summary [PDF]) in enterprises. Here are some of the key findings from the study, spiced with some of my own views.

Target group: 538 executives, IT decision-makers and business unit leaders in 17 countries. 
80% of executives see enterprise-wide collaboration [...]]]></summary>
		<content type="html" xml:base="http://www.heikniemi.net/hardcoded/2010/06/avanade-collaboration-study-and-what-can-we-learn-from-it/">&lt;p&gt;&lt;strong&gt;In the beginning of June, Avanade published a study on collaboration practices (&lt;a href="http://www.avanade.com/_uploaded/pdf/pressrelease/uscollabreleasefinal344577.pdf"&gt;press release&lt;/a&gt; [PDF], &lt;a href="http://www.avanade.com/_uploaded/pdf/collaborationresearchspring2010executivesummary132612.pdf"&gt;executive summary&lt;/a&gt; [PDF]) in enterprises. Here are some of the key findings from the study, spiced with some of my own views.&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Target group: 538 executives, IT decision-makers and business unit leaders in 17 countries. &lt;/li&gt;
&lt;li&gt;80% of executives see enterprise-wide collaboration as a key element necessary for business success.&lt;/li&gt;
&lt;li&gt;35% feel that the communication and collaboration tools have made it easier to work with others.&lt;/li&gt;
&lt;li&gt;75% of companies plan on increasing the use of collaboration technologies in the next year. &lt;/li&gt;
&lt;li&gt;The collaboration tools’ importance was assessed as follows (percentages indicate the proportion of respondents considering a given medium as “essential”):
&lt;ul&gt;
&lt;li&gt;90+% email &lt;/li&gt;
&lt;li&gt;89% phone calls &lt;/li&gt;
&lt;li&gt;74% shared disk volumes &lt;/li&gt;
&lt;li&gt;62% corporate portals, intranets and team sites &lt;/li&gt;
&lt;li&gt;57% conference calls &lt;/li&gt;
&lt;li&gt;&lt;em&gt;(too bad there’s no data on instant messaging!)&lt;/em&gt; &lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;44% of companies think that collaboration technology must pay for itself in 24 months. 42% do not measure cost benefits, but this certainly doesn’t mean they wouldn’t name cost savings as a key driver.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;On the negative side:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;38% of respondents think that people equipped with collaboration tools solve less problems on their own. In the US, this number is as high as 54%.
&lt;ul&gt;
&lt;li&gt;The fear centered on the idea of people offloading responsibilities and work onto their social network. &lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;25% of executives and IT decision-makers were “dreading” collaboration because of the amount of time and energy it wastes. &lt;/li&gt;
&lt;li&gt;In companies with less than 1000 employees, 12% of employees consider collaboration to slow down their work. On the other hand, in larger companies only 6% find collaboration a slowing factor. &lt;/li&gt;
&lt;li&gt;Also, C-level executives consider collaboration a slowdown &lt;em&gt;three times more likely&lt;/em&gt; than IT decision-makers or business unit leads. &lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;So what?&lt;/h2&gt;
&lt;p&gt;I think we’re looking at a significant cultural change here. I definitely agree with the 80% of executives holding collaboration as a key factor in business success. Simultaneously, I can clearly see a significant part of the workforce using social networks to avoid responsibility. &lt;strong&gt;But these are the people who were avoiding it all along anyway&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Collaboration tools (team sites, instant messaging, unified communications) aren’t really a revolutionary change, perhaps with the exception of IM and cheap video conferencing for geographically dispersed teams. Rather, they are an accelerator. A SharePoint Team Site, for example, can potentially combine data from dozens of applications and provide it in an easily browseable, offline-usable and shareable format. &lt;/p&gt;
&lt;p&gt;But that doesn’t make anyone more lax or slow than before. What slows people down is either the improper control of work flow (see the classic &lt;a href="http://www.amazon.com/Slack-Getting-Burnout-Busywork-Efficiency/dp/0767907698"&gt;Slack: Getting Past Burnout, Busywork and the Myth of Total Efficiency&lt;/a&gt; for the typical stories) or the lack of competence. Collaboration tools make social, energetic and determined individuals shine, leaving less accomplished persons more alone. Social tools can be used to alleviate this loneliness, perhaps causing the phenomenon the upper management fears.&lt;/p&gt;
&lt;p&gt;Now, &lt;em&gt;that&lt;/em&gt; is a workplace problem worthy of C-level executive attention, but it’s hardly a tool question. It can be mitigated, but it requires a cultural change. C-level officers, often further away from the daily hum of the workplace, often see this as a structural problem. It rarely is; effective use of collaboration is probably best facilitated by first-level managers and middle management, driving their team culture towards effective working model.&lt;/p&gt;
&lt;p&gt;To facilitate this, compliance and governance rules laid by the top brass should be simple and generic enough to allow relative organizational independence. The corporation never dictated the agenda of team meetings, so why should all team sites be forced to the same template?&lt;/p&gt;
&lt;h2&gt;Gold rush ahead?&lt;/h2&gt;
&lt;p&gt;There’s a whole bunch of work to be done. But that doesn’t mean it’s going to be a gold mine for everybody. First of all, while the late recession left companies yearning for innovation in technology (in fact, the Avanade study says 80% of companies have become more open to new technology due to the economic turmoil), building a credible business case for collaboration tools isn’t exactly trivial. Apart from the obvious reduction in travel expenses, the financial gains are hard to measure and prove. &lt;/p&gt;
&lt;p&gt;I think there are two types of vendors benefitting from this next wave.&lt;/p&gt;
&lt;p&gt;The first ones are the big ones who actually can provide a credible enough story to convince the top management. This approach breeds the traditional enterprise adoption problems. &lt;/p&gt;
&lt;p&gt;The second ones are the small ones who empower smaller units within a corporation by providing a solution that actually turns out to be effective, becoming a phenomenon within the company (see an example of &lt;a href="http://zaanahoward.com/2010/02/09/enterprise-microblogging-part-1-a-love-story/"&gt;enterprise micro-blogging spread&lt;/a&gt;, from my previous &lt;a href="http://www.heikniemi.net/hardcoded/2010/03/so-whats-this-officetalk/"&gt;OfficeTalk post&lt;/a&gt;). &lt;/p&gt;
&lt;p&gt;Also, there’s going to be intense competition from the cloud, particularly within the second group. Services like &lt;a href="http://basecamphq.com/"&gt;Basecamp&lt;/a&gt; provide an excellent bang-for-the-buck ratio, and the setup is easy enough to enable adoption even without centralized support.&lt;/p&gt;
&lt;p&gt;Winners in this game are those who not only setup the tools, but also facilitate the cultural change required to use them successfully.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Te-OLk_Sxrq7scAd5RZD4Kmmhmw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Te-OLk_Sxrq7scAd5RZD4Kmmhmw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Te-OLk_Sxrq7scAd5RZD4Kmmhmw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Te-OLk_Sxrq7scAd5RZD4Kmmhmw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/HeikniemiHardcoded/~4/p2suIrZPQfg" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://www.heikniemi.net/hardcoded/2010/06/avanade-collaboration-study-and-what-can-we-learn-from-it/#comments" thr:count="0" />
		<link rel="replies" type="application/atom+xml" href="http://www.heikniemi.net/hardcoded/2010/06/avanade-collaboration-study-and-what-can-we-learn-from-it/feed/atom/" thr:count="0" />
		<thr:total>0</thr:total>
	<feedburner:origLink>http://www.heikniemi.net/hardcoded/2010/06/avanade-collaboration-study-and-what-can-we-learn-from-it/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Jouni Heikniemi</name>
						<uri>http://www.heikniemi.net/hardcoded/</uri>
					</author>
		<title type="html"><![CDATA[Live Mesh dying soon &#8211; some saved by Live Sync, some not]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/HeikniemiHardcoded/~3/pC_HkfMXick/" />
		<id>http://www.heikniemi.net/hardcoded/2010/06/live-mesh-dying-soon-some-saved-by-live-sync-some-not/</id>
		<updated>2010-06-14T07:59:26Z</updated>
		<published>2010-06-14T07:28:46Z</published>
		<category scheme="http://www.heikniemi.net/hardcoded" term=".NET" /><category scheme="http://www.heikniemi.net/hardcoded" term="General" /><category scheme="http://www.heikniemi.net/hardcoded" term="Live Mesh" /><category scheme="http://www.heikniemi.net/hardcoded" term="Live Sync" />		<summary type="html"><![CDATA[The fact that Microsoft had Live Mesh, Live Sync and SkyDrive offerings was always confusing. Things are getting a turn for the clearer, as the Live Mesh brand gets nixed and Live Sync gains much of what Mesh used to be. But it’s not a change without losses.
 When installing the Live Wave 4 package, [...]]]></summary>
		<content type="html" xml:base="http://www.heikniemi.net/hardcoded/2010/06/live-mesh-dying-soon-some-saved-by-live-sync-some-not/">&lt;p&gt;&lt;strong&gt;The fact that Microsoft had Live Mesh, Live Sync and SkyDrive offerings was always confusing. Things are getting a turn for the clearer, as the &lt;a href="http://windowsteamblog.com/windows_live/b/windowslive/archive/2010/06/10/coming-soon-windows-live-sync-beta.aspx"&gt;Live Mesh brand gets nixed and Live Sync gains much of what Mesh used to be&lt;/a&gt;. But it’s not a change without losses.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.heikniemi.net/hardcoded/wp-content/uploads/2010/06/image1.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; margin: 5px 15px 5px 10px; display: inline; border-top: 0px; border-right: 0px" title="image" src="http://www.heikniemi.net/hardcoded/wp-content/uploads/2010/06/image_thumb1.png" border="0" alt="image" width="135" height="132" align="left" /&gt;&lt;/a&gt; When installing the Live Wave 4 package, Mesh will be removed and replaced with Live Sync. You can’t have both on the same computer. But a branding change isn’t really that touching. What is actually changing?&lt;/p&gt;
&lt;p&gt;Not very much, in fact. Live Sync gains the Remote Desktop capabilities from Mesh. It is also designed to sync far more data and more intelligently. For example, if you want to sync movies between two computers on the same network, Live Sync uses the local network to do the synchronization instead of passing the data up to the cloud and back again.&lt;/p&gt;
&lt;p&gt;On the other hand, Live Mesh used to provide users with 5 GB of cloud storage for their files. This change shrinks the storage to 2 GB; a change perhaps not that significant for many, but a somewhat surprising direction. If you’re more interested in this, check out &lt;a href="http://community.winsupersite.com/blogs/paul/archive/2010/06/11/microsoft-sort-of-explains-what-s-going-on-with-live-mesh-and-live-sync.aspx"&gt;Paul Thurrott’s criticism on the issue&lt;/a&gt;; it also speculates on the possibility of providing the ability to buy more storage space in the future.&lt;/p&gt;
&lt;h2&gt;Platform support slashed&lt;/h2&gt;
&lt;p&gt;A somewhat challenging issue is the cut on the platforms supported. Live Sync will only be available on Vista and Windows 7, leaving Windows XP, Mac and Mobile users out in the cold. The Live Mesh infrastructure will be supported for a while – at least six months from the RTM release of Live Sync. But after that, users without Vista/7 will be looking for alternatives (&lt;a href="http://www.dropbox.com"&gt;Dropbox&lt;/a&gt;, anyone?).&lt;/p&gt;
&lt;p&gt;The key problem here is shared folders. While Sync supports sharing folders between your friends just like Mesh did, it does not support sharing between Mesh and Sync users. So if you want to upgrade to Live Sync, you’ll be leaving out your old Mesh friends. Simultaneous upgrade for all your friends works great… until it turns out one of your sharing mates has XP or still needs Mesh to collaborate with users on XP.&lt;/p&gt;
&lt;p&gt;This upgrade policy will certainly lead into broken social networks, as people lose a lot of the flexibility originally provided by Mesh. It doesn’t make the new Live Sync a bad product, but a cutback from the current state provided by Live Mesh beta. Certainly, the upside will be a far more integrated and better supported solution.&lt;/p&gt;
&lt;h2&gt;The Mesh train losing steam?&lt;/h2&gt;
&lt;p&gt;&lt;img style="border-bottom: 0px; border-left: 0px; margin: 10px 10px 10px 15px; display: inline; border-top: 0px; border-right: 0px" title="image" src="http://www.heikniemi.net/hardcoded/wp-content/uploads/2010/06/image2.png" border="0" alt="image" width="131" height="227" align="right" /&gt;When the Live Mesh was at its hyped peak in 2008, the Mesh concept encompassed everything in the world. The Mesh was intended not just as a data synchronization platform for files, but also a conduit through which applications and their attached data could be shared.&lt;/p&gt;
&lt;p&gt;For example, you could install HTML or Silverlight-based applications on Live Mesh, which would then propagate these apps to all your devices. The Live Operating Environment would make sure that the structured data needed by these applications would be available at all locations, synced in real time. There were grandiose demos with things such as &lt;a href="http://channel9.msdn.com/posts/Charles/Ori-Amiga-Mesh-Mobile/"&gt;Ori Amiga’s car equipped with a Mesh-connected computer system&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Today, there’s none of that. In August 2009, the &lt;a href="http://www.heikniemi.net/hardcoded/2009/09/the-death-of-live-services-what-to-expect/"&gt;Live Framework developer tools were cut&lt;/a&gt;. In PDC 2009, &lt;a href="http://www.heikniemi.net/hardcoded/2009/11/live-frameworks-next-steps-are-fuzzy-at-best/"&gt;the promises were already watered down to file sharing&lt;/a&gt;. In this announcement, remote desktop stays, but much of the platform independency is stripped off. Also, the idea of implementing even that trivial Wine Cellar (see the previous link) on top of the currently announced Live Sync seems far-fetched.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;We can safely say that Live Mesh has been reduced to a platform-integrated, cloud-capable synchronization tool&lt;/em&gt;. That’s not a bad offering per se, but looking at Ray Ozzie’s visionary statements on the future of Mesh and the feature cuts involved, it does feel a bit cheap right now. In this regard, MIX10 delivered far less than expected.&lt;/p&gt;
&lt;p&gt;I’m sure the team is working on the next increment even as I type this, but given the relative maturity of Live Framework in 2008 and the natural synergy with out-of-browser Silverlight, I’m surprised to see the delays. While HTML5 is gaining support for local storage and whatnot, the original Mesh offering provided device-independence and sharing as features that the standard web technologies will struggle to match for a long time. I would have expected Microsoft to better take the advantage of all that.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/iK6bFzG4mPFDKejkb9q3Z_Q-KWY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/iK6bFzG4mPFDKejkb9q3Z_Q-KWY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/iK6bFzG4mPFDKejkb9q3Z_Q-KWY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/iK6bFzG4mPFDKejkb9q3Z_Q-KWY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/HeikniemiHardcoded/~4/pC_HkfMXick" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://www.heikniemi.net/hardcoded/2010/06/live-mesh-dying-soon-some-saved-by-live-sync-some-not/#comments" thr:count="1" />
		<link rel="replies" type="application/atom+xml" href="http://www.heikniemi.net/hardcoded/2010/06/live-mesh-dying-soon-some-saved-by-live-sync-some-not/feed/atom/" thr:count="1" />
		<thr:total>1</thr:total>
	<feedburner:origLink>http://www.heikniemi.net/hardcoded/2010/06/live-mesh-dying-soon-some-saved-by-live-sync-some-not/</feedburner:origLink></entry>
	</feed>
