Archive

Archive for the ‘technical’ Category

These posts are technical in nature. The casual reader may not care about these posts. These are for my fellow geeks.

#MIX11 Day 2 Impressions

April 14th, 2011 No comments

Yesterday was the second official day of the MIX11 conference. It was quite clear from the audience reaction that the second keynote was far more interesting and appreciated than day 1. There was an energy in the air that was palpable.

Customers seemed to love each and every part of the keynote — from the virtual 3D ScottGu to the Blue Angels web site being developed in HTML5 and Silverlight. The applause was thundering. I encourage you to go check out the recorded keynote here: http://live.visitmix.com/Keynotes

I had a lot of fun talking with developers from all over the world about what they were working on, what they were interested in seeing at Mix and what they thought about the conference so far. I’m always amazed at how inventive our customers are with our software. More so, I’m always happy to see the passions that come out when geeks of various walks of life come together to talk about the field of software development.

I also had the opportunity to watch the Channel 9 booth live as Miguel de Icaza sparred with Scott Hanselman about open source development. The laughs were frequent but more importantly, I think developers had the opportunity to see different views on the same community by both of these dynamic individuals.
I attended the “Future of Windows Phone 7″ presentation to see all of the fantastic features we are adding to the “Mango” release of Windows Phone 7. The list seemed endless. The presentation was literally an hour long presentation that listed the features of the phone that were coming up without much deep dive. From being able to take screen shots to having direct access to the hardware sensors, to the inclusion of new sensors, the list was amazing and should make for a great update to the Windows Phone 7 developer story.

Just as I did the day before, I spent breakfast speaking with developers about what they saw in the sessions the day before. Kevin Griffin said that he attended the Deep Dive into HTML5 and Graphics/3D with Silverlight 5. He said that he enjoyed it, but “it was like watching a DirectX or XNA 3D talk for the first time.” Apparently he felt the session level was misidentified as level 300 when the content was actually level 100. Kevin also said that the HTML5 Canvas discussion proved that it was “tedious to do cool stuff. We need good tooling in order to do that stuff right. Browser support is wonky.” He was referring to the disparity of support between each of the browsers. Of course I’ve known Kevin a long time and I couldn’t resist ribbing him about his new acquisition of a Windows Phone 7 device. He picked one up yesterday and just started learning to develop. I jokingly asked him what was taking him so long to develop his app. “Most good developers I know can have an app ready to submit to the marketplace within hours of getting their device. What’s your problem?”. Of course Kevin is no slouch and he immediately responded “well, I keep trying to use MSDN to learn how to develop my app — that might be my problem.” Yeah, Kevin can give the barbs as well as he can take them.

The MIX11 attendee party was apparently “successful” in all senses of the word last night. I was unfortunately unable to go as I’ve been sick all week. I took this opportunity to rest. Based on the looks of the crowd this morning, they didn’t let the party affect them too much. They all seem attentive.

I’m looking forward to this last day of presentations. However, the MIX11 experience doesn’t end when I get on my flight. We will all be able to “attend” the presentations at Mix online when the session recordings are posted at http://live.visitmix.com

Thanks for reading!

Categories: events Tags:

Day 1 #Mix11 Impressions — From the Customer

April 13th, 2011 No comments

I had the opportunity to sit down with a number of MVPs last night and this morning at breakfast to discuss what they learned at the Mix conference on day one. I wanted to get a sense for what we were doing right and what we needed to improve upon. I thought I would share those thoughts with the public and ask for your input. If you are at the conference, feel free to find me and give me your feedback or leave a comment here and I’ll be glad to start a dialog with you.

Last night I spoke with Dave Ward in depth about his experience. He spoke overall positively about the conference. He said that the keynote wasn’t as exciting as he would have expected but he was overall really pleased with the conference. He attended a breakout session titled “50 ways to speed up your HTML.” He said that they actually covered 57 tips in the session time which is amazing. Dave said that the session was awesome and that he learned at least 2 or 3 things. I laughed and told him “You do realize that leaves you with about a 5% retention rate, right?” Of course he said that he knew a lot of the other things that were discussed but that he was overall very impressed with the quality of the session.

VanThis morning I had the opportunity to speak with Van Van Lowe about his experience with the conference. He said that he too was very happy with the conference and that Mix is his favorite. When I asked what he liked most about Mix that he didn’t see at PDC, he indicated that he enjoyed the web focus because he is a web developer. Strangely enough, I met Van at PDC 2010 while talking with Scott Hanselman. Needless to say this guy gets around to our conferences! Van attended the Orchard breakout session because he said that he has big plans to use Orchard. Van said that he got enough out of the session to get him started and that was basically the point.

I attended the Orchard Session yesterday as well. I was surprised how far this project has come since I blogged about it so long ago. I am good friends with a former developer, Erik Porter, and a current developer, Nathan Heskew, on the Orchard project. Talking with others who attended afterward, they seemed extremely pleased with the progress and many said “this is ready for prime time and it’s so much better than anything out there right now.” and “They’ve thought everything through.”

I’m looking forward to the Mix day 2 keynote just about to start now! See you there!

Categories: events Tags:

Photos from the #mix11 keynote

April 12th, 2011 No comments





Categories: events Tags:

#Mix11 keynote rolling along.

April 12th, 2011 No comments

Sitting in the darkness of the Mix11 keynote with only my Windows Phone 7 i can see the excitement around the IE presentation. We’ve seen some great IE9 demos and seen some hilarious videos. What will come next? The audience is watching intently as we just announced we are 3 weeks into the development of IE10. More to come.

Posted from WordPress for Windows Phone

Categories: events Tags:

Why Didn’t You Come to Mix11?

April 12th, 2011 3 comments

As mentioned in my previous post, I had the opportunity to talk to a number of people — some on twitter, some in person and some even on my way to Mix — about why they didn’t come to Mix.

The responses from the community were very interesting. Of course, I received some very useful and some very comedic responses on twitter.

In response to my query about why some wouldn’t come to Mix, @ardalis responded, “You’re looking for a list of 6 billion people not going to MIX?”. Touché my friend. I wasn’t looking for EVERY reason some were not attending this year, I was looking to understand what regular conference-goers and community-influentials were not coming and why. Here are some of the main reasons I received:

I’m Working!
Many of the individuals who responded were too busy working to take time off and come to Mix. @brheal said “Wish I could be there! Always falls at the end of tax season (tax software developer).” I thought this was a one-off but I soon received another response from my friend @pmourfield who said “I wish that #MIX11 didn’t fall during the last week of tax season. So wishing I was able to be there!” Apart from tax software developers, others are just too involved with their clients. @mranlett said, “I didn’t make it to #MIX11 this year. Busy satisfying client needs & working on proposals for future work w/future clients.” And of course @dpenton stated that “I have too much work happening right now.” That’s completely understandable on all accounts. I wish you all could be here too.

It’s too Expensive
My friend @akcoder isn’t coming because, in his words, “I am not going because I’m saving my travel/conference budget for PDC.” It seems understandable that most of us have to pick and choose where we spend our money and pay for conferences where we see the most value for our needs. Yet another long-time friend and Microsoft MVP @sarajchipps told me “I’m not, because it is waaaay too expensive for an independent.” When pressed as to what value would be appropriate to make it not so expensive, Sara indicated “That’s a great question, I would want to go to talks and events… I could live without the food and amenities.” She went on “my budget is usually around $500 for a pass when it comes to conferences.” At further prompting and discussion amongst others in the community said “I’ve pretty much gone without MS conferences this year. Last year I was given a few passes, but $1500+ isn’t at all feasible.” It would appear that some of the independents are feeling the squeeze on financial resources. Of course @robwindsor had a solution “Mix should have something like TechEd Exhbit Hall pass ($100). Gets you into Commons and Connect lounge”. That’s a fair point and perhaps we can give that feedback to the folks running Mix. I have it from the rumor mill that Microsoft already loses money at the conferences, but you never know if something like this is possible. This seems to be overwhelmingly more important considering the number of responses in this category. @simonech said that he “cannot afford 2 flight[s] to the US in less than 2 months (been at mvp11)AND ticket + hotel/flight could be off budget for my company.” Truly we must all pick our battles. Response after response from this point forward seemed to point to the cost of the conference — either the cost of the conference itself, or the complete cost after hotel, flight, food, ground transport and of course the conference.

So why haven’t you come to the conference? Why did you come to Mix this year? What did you hope to get out of the conference? Alternatively, why didn’t you come this year? What is competing for your time/money? What would make the conference most valuable to you?

Thanks for reading. Stay tuned until later on this morning when I cover the keynote presentations!

Categories: events Tags:

I Have Arrived … At #Mix11 that is

April 11th, 2011 No comments

I have just landed and got my bags rather quickly. I’m standing in a rather long line waiting for a cab in sweltering heat (comparatively speaking that is). I have been reading tweets from those who have been here and already joined in the excitement — from Scott Hanselman tweeting about his rehearsals to random conversations I started with those who couldn’t make it. The anticipation is killing me but one thing is for sure, I have arrived at Mix!! The cab line is filled with chatter about design, development and plans for a geek-long getaway. I brought my trusty Nikon D-7000 which at this point weighs a ton on my shoulder. I’ll be sure to put it to use and give you all regular updates. Stay tuned!
Posted from WordPress for Windows Phone

Categories: events Tags:

On My Way to Mix11

April 10th, 2011 No comments

Be on the lookout for new posts this week. OK, this is really a placeholder post for the “mix11″ tag I just added. Move along now. Nothing to see here. ;)

Categories: events Tags:

PMing my Technical Skills: a guide to ramping back up technically speaking

September 7th, 2010 No comments

I’ve been transitioning away from a solely technical skillset to a PM skillset at Microsoft for a while now. That said, I have found that personally, I prefer to still keep my technical chops. Why should I have to sacrifice one for the other? My love for the technical world should drive my passion for the PM role. In fact, I’ve now found that I’m using my PM skills to compliment my technical skills as well.  I don’t mean to say that I’ve applied all of the PM principals to my technical studying. However, I have realized that I inadvertently used those things I’ve learned in my PM career in a very lose way to help my technical skills.

Competitive Analysis

I like to see what other people are doing. Not just from a purely social standpoint, but also to understand what skills other’s find valuable and easy to use, and what skills are most common among everyone. I often also cruise the job boards (Microsoft Career Site, TheLadders.com, Monster.com, Dice.com, etc). I tend to look in various places around the country just so I know if certain skills are hot in one area, but not in another. So, I composed a spreadsheet of available positions, skills required (soft and technical), optional skills, pay, benefits, region, etc. I don’t do this because I’m looking for work, I do this because by gathering enough information, I can find that jobs that require iPhone app development skills pay more than say, Silverlight development skills. Once I had this data, I could see what skills were most valued. This serves as a rudimentary competitive analysis or “potential performance” and represents part one of a good gap analysis.

Skill Inventory Assessment (actual performance)

Part two of creating a good gap analysis, involves determining your actual performance to compare against your potential performance. To do this, I find it useful to also look at what skills I have in my inventory, see where they intersect with my “potential performance” from above, and see if I somehow missed your other skills as potentially valuable in the market. So, I made another sheet in my spreadsheet to list skills that I had and the self-assessment level at which I rank myself. For any skills that I added which were not in my “competitive analysis”, I did further research to see if those skills were found in the job boards or on friends blogs, or anywhere that I could assign some value to the skill. I use this as a secondary sanity check for skills that I might need to beef up on. Once I had this done, I moved on to the actual gap analysis.

Gap Analysis

I compared the competitive analysis against the skill inventory assessment and came up with a reasonable gap analysis of skills that I either needed to improve or acquire, and a list of other skills that I had which I needed to deemphasize in my studies for the next year. This list represents the gap that I have between where I want to be and where I am – otherwise known as the gap.

Action Plan

Once I had a my gap analysis complete, I had to create a plan to get from point a to point b. I looked first at books. While many people don’t learn well from books and prefer other methods, I still prefer a good solid technical book at least to start, and then I move on to other resources. So, for each skill, I set out to collect a list of books for each skill area on amazon. To assess each book, I looked at the number of ratings, amazon ranking, average rating, release date, and a number of other factors (including glancing through the table of contents to see if I felt those skills would be adequately covered in the book. Once I had the list of books, I didn’t stop there. I created a new sheet in my Excel file for each book that I intended to purchase. I listed each chapter and it’s length so that I could determine how fast I could read each book – giving myself milestones to complete by certain dates for each book. I made sure to account for downtime, upcoming vacations, goofing off (all work and no play…), and various other factors to give me a reasonable burn down rate on my learning plan.

Prioritizing the Plan

This is one area I thought about for a while. I could simply make this all about money and learn the most valuable skills first. However, I like to have fun, and I have specific projects in mind where some of these skills could be put to good use. That said, I opted away from prioritizing in any way that would be meaningful to anyone else. I am my own customer and I think it’s fair to let me set my own priorities in this instance. For others, however, you might want to prioritize based on projects you have at your job, getting a specific job, or just for pure fun. The option is yours.

Metrics / Performance Analysis

I’ve set clear goals for what I want to accomplish and set a timeline for completion. I have milestones that can help me determine my progress and help me assess risks. I have a project calendar and a burn down chart. I stopped short of creating a project file or creating work items in TFS. I’ll just use my spreadsheet to keep me in check for now.

Summary

This obviously doesn’t represent solid PM work, but I realized after the fact that I had just done a great deal of the same type of work I would do when I start a real project. It’s easy to say that you need to pick either PM or Development, but I’m finding that skills from both disciplines can compliment themselves quite well.

Azure Storage Client helpers

July 23rd, 2010 No comments

In my last post, I described how the configuration setting publisher worked. More specifically, I covered how to use the typical use-case of retrieving connection strings from Azure or local configuration and the typical errors you might produce when you use this incorrectly. I found myself writing the same code very often so I encapsulated this into a simple set of fluent-ish extensions (I say “ish” because by technical definition of fluent, these aren’t self-referencing… yet). That said, I thought I’d share this code as it helps me get my apps started pretty quickly.

// Author: Tobin Titus <tobin.titus@gmail.com>
// Copyright (c) 2010 Tobin Titus
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//   http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

using Microsoft.WindowsAzure;
using Microsoft.WindowsAzure.StorageClient;
using Microsoft.WindowsAzure.ServiceRuntime;
using System.Configuration;

namespace AzureNinja.Storage
{
  public class Client
  {
    public const string DEFAULT_CONNECTION_STRING_NAME
          = "StorageConnectionString";
    static Client()
    {
       CloudStorageAccount.SetConfigurationSettingPublisher(
          (configName, configSettingPublisher) =>
          {
              var connectionString = RoleEnvironment.IsAvailable
                 ? RoleEnvironment.GetConfigurationSettingValue(configName)
                 : ConfigurationManager.AppSettings[configName];
               configSettingPublisher(connectionString);
          });
    }

    public static CloudStorageAccount FromConfig(
       string configSetting = DEFAULT_CONNECTION_STRING_NAME)
    {
        return CloudStorageAccount.FromConfigurationSetting(configSetting);
    }

    public static CloudStorageAccount FromString(string connectionString)
    {
       return CloudStorageAccount.Parse(connectionString);
    }
  }

  public static class CloudStorageClientHelpers
  {
    public static CloudBlobClient ForBlobs(this CloudStorageAccount account)
    {
       return account.CreateCloudBlobClient();
    }
    public static CloudQueueClient ForQueues(this CloudStorageAccount account)
    {
        return account.CreateCloudQueueClient();
    }
    public static CloudTableClient ForTables(this CloudStorageAccount account)
    {
        return account.CreateCloudTableClient();
    }
  }
}

You can then construct your requests for a CloudXxxClient as follows:

CloudBlobClient  client1 = Client.FromConfig().ForBlobs();
CloudQueueClient client2 = Client.FromConfig().ForQueues();
CloudTableClient client3 = Client.FromConfig().ForTables();

This uses “StorageConnectionString” as the default configuration key. And you can specify configuration key as well:

Client.FromConfig(“myConfigKey”).ForBlobs();

Furthermore, this allows you to concentrate on your calls to an otherwise fluent Azure API:

Client.FromConfig().ForBlobs().GetContainerReference(“myContainer”).Delete();

or

Client.FromConfig().ForBlobs()
     .GetContainerReference("myContainer").CreateIfNotExist();

Let me know if you have any questions or input.

Categories: technical Tags: ,

CloudStorageAccount.SetConfigurationSettingPublisher

July 23rd, 2010 2 comments

Those venturing into Windows Azure development for the first time may find themselves in a bit of a quandary when they try to devise a strategy for getting their storage account credentials. You dive into the Windows Azure APIs and determine that you must first get a reference to a CloudStorageAccount. You are all aglow when you find the “FromConfigurationSetting” method that takes a single string parameter named “settingName”. You assume that you can store your connection information in a configuration file, and call “FromConfigurationSetting” from your code to get dynamically load the connection information from the config file. However, like most of the Windows Azure documentation, it is very light on details and very heavy on profundity. The documentation for “FromConfigurationSetting” currently says:

Create a new instance of a CloudStorageAccount from a configuration setting.

That’s almost as helpful as “The Color property changes the color.” Notice that it isn’t specific about what configuration setting this comes from? The documentation is purposefully generic, but falls short of explaining why. So I’ve seen multiple questions in forums and blogs trying to figure out how this works. I’ve seen developers try to put the configuration setting in various places and make assumptions that simply providing the configuration path would get the desired result. Then they try to run the code and they get the following exception message:

InvalidOperationException was caught

SetConfigurationSettingPublisher needs to be called before FromConfigurationSetting can be used

Of course, this causes you to look up “SetConfigurationSettingPublisher” which also is a little light on details. It says:

Sets the global configuration setting publisher.

Which isn’t entirely clear. The remarks do add some details which are helpful, but don’t go as far as to help you understand what needs to be done – hence this blog post. So that was the long setup to a short answer.

The FromConfigurationSetting method makes no assumptions about where you are going to store your connection information. SetConfigurationSettingPublisher is your opportunity to determine how to acquire your Windows Azure connection information and from what source. The FromConfigurationSetting method executes the delegate passed to SetConfigurationSettingPublisher – which is why the error message says this method needs to be called first. The delegate that you configure should contain the logic specific to your application to retrieve the storage credentials. So essentially this is what happens:

  1. You call SetConfigurationSettingPublisher, passing in the logic to get connection string data from your custom source.
  2. You call FromConfigurationSetting, passing in a setting name that your delegate can use to differentiate from other configuration values.
  3. FromConfigurationSetting executes your delegate and sets up your environment to allow you to create valid CloudStorageAccount instances.

So, going back to a typical application, you want to store your configuration in a .config file and retrieve it at runtime when your Azure application runs. Here’s how you’d set that up. When your application starts up, you’ll want to configure your delegate using SetConfigurationSettingPublisher as follows:

CloudStorageAccount.SetConfigurationSettingPublisher(
  (configName, configSettingPublisher) =>
 {
    var connectionString = RoleEnvironment
         .GetConfigurationSettingValue(configName);
    configSettingPublisher(connectionString);
 }
);

If this is an ASP.NET application, you could call this in your Application_Start event in your global.asax.cs file. If this is a desktop application, you can set this in a static Constructor for your class or in your application startup code.

In this example, you are getting a configuration string the Windows Azure configuration file, and using the delegate to assign that string to the configuration setting publisher. This is great if you are executing in Windows Azure context all the time. But if you aren’t running your code in the Windows Azure context  (for instance, you are exercising your API from NUnit tests locally) this example will throw another exception:

SEHException was caught

External component has thrown an exception.

To solve this problem, you can set up the delegate to handle as many different environments as you wish. For example, the following code would handle two cases – inside a Windows Azure role instance, and in a local executable:

CloudStorageAccount.SetConfigurationSettingPublisher(
  (configName, configSettingPublisher) =>
  {
      var connectionString = RoleEnvironment.IsAvailable
          ? RoleEnvironment.GetConfigurationSettingValue(configName)
          : ConfigurationManager.AppSettings[configName];
      var connectionString = RoleEnvironment
          .GetConfigurationSettingValue(configName);
      configSettingPublisher(connectionString);
});

For your unit tests to work, just add an appSettings key to your configuration file:

<configuration>
 <appSettings>
  <add key="DataConnectionString"
    value="DefaultEndpointsProtocol=http;
              AccountName=<accountName>;AccountKey=<accountKey>;"/>
 </appSettings>
</configuration>

Note: Make sure to replace <accountName> and <accountKey> with your custom values.

In the context of your Windows Azure application, just make sure that you configure the same configuration key name there. In Visual Studio:

  1. Right click your Windows Azure role and choose Properties from the dropdown menu.
  2. Click on the Settings tab on the left.
  3. Click the Add Setting button in the button bar for the Settings tab.
  4. Type “DataConnectionString” in the Name column
  5. Change the Type drop down box to Connection String
  6. Click the “” (ellipsis) button in the right hand side of the Value column
  7. Configure your storage credentials using the values from the Windows Azure portal
  8. Click OK to the dialog
  9. Use the File | Save menu option to save your settings then close the settings tab in visual studio.

With this code, you should now be able to retrieve your connection string from configuration settings in a Windows Azure role and in a local application and retrieve a valid CloudStorageAccount instance using the following code:

var account = CloudStorageAccount
                   .FromConfigurationSetting("DataConnectionString");

Of course, you aren’t limited to these scenarios alone. Your SetConfigurationSettingPublisher delegate may retrieve your storage credentials from anywhere you choose – a database, a user prompt, etc. The choice is yours.

For those of you who need a quick and dirty way to get an CloudStorageAccount instance without all the hoops, you can simply pass your connection string in to the Parse or TryParse method.

var account = CloudStorageAccount.Parse(
   "DefaultEndpointsProtocol=http;" +
   "AccountName=<accountName>;" +
   "AccountKey=<accountKey>");

This should give you all the information you need to get a CloudStorageAccount instance and start accessing your Windows Azure storage.

Categories: technical Tags: ,