Tech in the 603, The Granite State Hacker

Data Persistence in Windows Universal (8.1) apps (Boston Code Camp 23)

Thanks to everyone who joined me for my Boston Code Camp 23 presentation.  Shuffling data around is a core responsibility of any serious computing platform.  Windows Universal really goes above and beyond the mundane call of duty with consistency and utility. It’s part of what makes the Windows client platform a true “cloud car”, especially with its Backup, Roaming Settings / Folders, and Roaming Password Vault capabilities as native functionality… all from the Windows.Storage namespace.

Here are

For the individual who asked what encryption level the Windows Password Vault functionality uses, I looked it up, and it’s 128bit AES encryption.  Stern stuff there.

Another question came up about app backups.  As I said in the presentation, the content of the Local storage is backed up automatically to the cloud by the OS.  (Isn’t that fantastic?!)

Likewise, as mentioned, the Temporary storage is excluded from backups.

One detail I missed however… the LocalCache storage area.  LocalCache is like Local except that it is not backed up.  LocalCache differs from Temporary storage in that the OS will not wipe it as it occasionally does the Temporary storage.  Next time I do this presentation, I’ll make sure to update it to discuss LocalCache.

Here’s a comparison of the storage options available to developers in the 8.1/universal platform. Note that each user on a device gets their own app-specific sandbox *and* OneDrive space for each installed app.

Type Availability Limits Settings hashtable Backed Up By OS Sync’d to all App / User / Devices by OS Encryption Wiped By OS if space is low Uri prefix Suggested use
Install Package Universal Static/ReadOnly Media from Install No No No Sandboxed No ms-appx:// Version specific static app media
Local Universal Available free storage Yes Yes No Sandboxed No ms-appdata:///local/ General
Local Cache Windows Phone Only Available free storage Yes No No Sandboxed No   Persistent cache
Temporary Universal Available free storage Yes No No Sandboxed Yes ms-appdata:///temp Semi-persistent cache
SD/Removable Universal Available free storage No No No None No   Removable/general
Roaming Universal 100k Yes (by virtue of roaming) Yes Cloud Partitioned No ms-appdata:///roaming Roaming settings
Password Vault Universal 100k (included in Roaming) Password-friendly structure (by virtue of roaming) Yes Cloud Partioned + 128bit AES No   Roaming credentials /OAuth tokens

I asked my stunt audience (the kids) later what my presentation had been about.  I was glad to know at least one of them had gotten it right. 

They were inspired, though, and that’s the important part. 

I hope you found inspiration in technology from both the day and maybe in some small part from my presentation.

Tech in the 603, The Granite State Hacker

Is Your Solution Delivery Strategy About to get Avalanched by Windows 10?

HoloLens took the spotlight when //build/ 2015 announced it had sold out in under an hour, but I can’t help but think at least as big a chunk of the excitement is around Windows 10 (or as we developers like to think of it, Windows Unified). As cool as HoloLens is, Windows 10 will most likely be landing in your lap long before HoloLens has images dancing in your living room. 

If you’re not already preparing for Windows 10, your solution delivery stack could be in for a shock from the client up. Microsoft is in the process of launching a re-boot of itself, and Windows 10 is the fulcrum of that effort. As usual, many of its changes are aimed at pulling developers in. If solution development has a place in your organization, this will likely impact you as well. 

“Mobile First / Cloud First” is, as always, the key phrase, and for a client OS… if it’s not for cloud devices…. give it a moment…  let that sink in…   Yes.  Windows 10 is an OS for mobile devices. Even if your device is a big heavy block of a workstation sitting near your monitor.  It will have the same mobile app store as phones and tablets, and it can be managed by the same Enterprise Mobile Device Manager (MDM).

Windows 8 was an introductory / transitional OS. With Windows 10, the transition matures.  Windows 10’s maturity is likely to make it far more palatable than Windows 8 was. (Keep in mind that Windows 8 is only a “failure” in terms of Microsoft’s other OS releases… Windows 8/8.1 has a bigger install base than some of the most “successful” of its non-Microsoft competitors. If Windows 10 becomes the hit many foresee it to be, it has potential to become the de facto standard platform to truly de-throne XP and even Windows 7.)

Windows 10 also adds a bit of a surprise, especially around browser technology.  Microsoft is tossing in to Windows 10 a whole new web browser (in addition to Internet Explorer) currently code-named Spartan. This new browser is intended to go after the consumer browser market, which IE has lost considerable ground in. I speculate that Spartan will be a breath of fresh air for consumers who feel IE’s bloat-related flaws collectively compels them to download Chrome or Firefox.

If you’re a web application developer who does more than a little HTML, on the other hand, you’re probably already groaning. You know what a pain browser compatibility is. (The browser was never intended to be a homogenous cross-everything platform, but that’s how a lot of web designers treat it, and they’ve shaped culture to expect it. Despite the best efforts of tools like jQuery and others to try homogenize, and trends like responsive to try to change the culture of presentation homogeny, web application developers get severely burned in the crossfire.  I’ve got more than a few scars to prove this, but you don’t have to look further than jQuery’s failed mechanisms for helping developers with these issues.    (First there was $.browser and $.browser.version, then $.support… then, “awe… heck… we give up, use Modernizr“.) /rant )

Spartan is a move that makes total sense, but it can’t help but add complexity to web application developers’ lives.  

In fact, in my mind, the long term net message is… there’s only one way to end browser pain… by getting out of web as a client platform. (Web services are the only part of the web worth salvaging.)

Microsoft has seen what platform diversification has done to its core OS business, and it’s not good. Developers need a consistent platform to deliver consistent solutions on, and that’s been a bigger part of Microsoft’s success over the years than even they seem to have realize.

So if web application development is becoming ever more complex in an already over complicated domain, how should one produce and deploy apps?

In a word:  native (aka mobile).

Windows 10 is a unifying platform, a “pentecostal” event to counter the “tower of babel” event of Windows platforms that have fractured into existence since the end of the .NET Compact Framework era. Where before development was requiring more and more effort to support PC, tablet, smartphone, wearable and even Xbox, Windows 10 has a unified SDK across all those platforms. For the first time ever, a .NET developer can build a single solution that runs in all those devices. There may be runtime differences between platforms that have to be ironed out, still, but not compile-time  (if(system.capability.phone) {} rather than #ifdef WINDOWS_PHONE_APP)

And think about it… what are the big reasons for web deployment?   Centralized management and centralized deployment.  Think back to MDMs and mobile app stores.

(Xamarin plays a roll in all this as well. Between Windows 10 and Xamarin, developers will be able to leverage a good chunk of their code base across all hardware, even non Microsoft platforms such as IOS and Android. This, too, is a breath of fresh air, because the cost of maintaining multiple code bases (and talent pools) is ever climbing. Xamarin will likely never be the 110% development experience that the latest .NET framework is, but neither was Silverlight for Windows Phone 7, yet one could do some fairly heavy lifting with it.)

Because Windows 10 is one platform that runs across form factors, it essentially means that any app written for Windows 10 is a mobile app. In that light, it means that Windows 10 is most likely to vault Windows into the top spot for mobile platforms by its projected install base. 

This on top of Microsoft’s recent “trickle up” theory of mobile market share growth, where Microsoft has been grabbing market share by targeting the feature phone market.  (This tactic has little effect in the US, where carrier subsidies nullify the low end to “$0”)  At some point Windows Phone will hit critical mass outside the US. Once that happens, even US developers will no longer be able to afford to ignore it.

Even if Microsoft is not contributing directly to your solution stack, Windows 10 and its biases have potential to culturally influence your solutions and solution delivery over the next decade.

Tech in the 603, The Granite State Hacker

Lumia Problems

I’m a pretty serious fan of Windows Phone, and especially Lumia devices.   In addition to the NH Windows Phone Users Group (now Granite State Windows Platform App Devs),  I’ve convinced everyone in my immediate family, and a good chunk of my extended family to go Lumia… 

So it breaks my heart when I see a Windows Phone that’s gone awry.  Among the many I’ve come in contact with, I’ve seen one or two develop issues that seem outside of normal hardware wear & tear.

My own device has occasionally had trouble with its SD card, occasionally forcing a restore.   These are annoyances to me, Windows Phone is a cloud car, so resetting the device and getting it back to normal is really only a mater of re-entering credentials, and the phone’s back in business.   The restore tends to re-apply start-screen layout and the set of installed apps on the device… the apps themselves are responsible for their individual recoveries, typically from their own cloud backups.   The few times I’ve been forced to do a full hard reset & restore, it’s been an ordeal that typically lasted under an hour (with a good Wifi connection).

This past week, I think the SD card flaked out again, but restoring from a backup didn’t resolve the issues.   I identified a number of odd behaviors, and was almost convinced my device was beyond recovery:

  • Power button:  the typical short-click which should toggle the device in & out of standby mode simply was not operating.   Long clicks, intended to shut the device down completely, were working, so… not a hardware disconnect.   In order to wake the phone up, I had to plug in a power source… and then had to wait for it to put itself to sleep.
  • App updates:  app updates were identified and the device would queue them, but rather than automatically downloading and installing, they’d hang in the download queue, all marked as Pending.  Occasionally one would come up with an error, but a retry would simply hang it back in Pending state.
  • WiFi internet sharing would not allow clients to connect.
  • Power saver:  on a whim, I put the device in power saver mode.  At first, it wouldn’t take the change.  Then I told it to always go in powersaver mode, and then, ironically, I couldn’t get it OUT of power saver mode.
  • Data Sense:  the app would crash and abend when trying to open it.
  • Mail sync:  would only sync manually
  • Alarm:  I missed my usual bus twice this week because my alarm failed & I overslept.

The end solution:  hard reset, but don’t restore from a backup…  just manually set up your accounts and re-download apps.  It took me a couple hours, but to get my 1520 back on track again, it was well worth the time.  In retrospect, I’m also happier because I didn’t re-install a ton of apps that I don’t use anymore, so the device is much leaner.  

The Windows Phone platform is relatively mature… it doesn’t fail often, but I think I’m going to have to pick up a better SD card.  The hard part is that I think I’ve heard rumors of some of these symptoms on devices that don’t have SD card slots.

My understanding is that it has something to do with the Cyan firmware update.  The Denim firmware may provide more stability, and that update started rolling out to devices in December with a promise that by the end of that month, it would be rolled out to the full Lumia nation.  We’re pushing into Feb 2015, and most in the US are still waiting.

[Addendum, 5/7/2015]:  My Lumia 1520 had a relapse of the above symptoms on Windows Phone 8.1.1 / Denim.   On a whim, I decided to try upgrading to the Windows 10 Insider Preview.  The problems with the SD card intensified as well.  I finally bit the bullet and replaced the SD card.  I did have to hard reset the phone back to the “stock” Windows 10 Insider Preview, but after that, not only were all the above symptoms resolved, but another long running annoyance…  a problem I thought to be related to the Lumia 1520 itself, went away.  The problem…  often, entering the unlock code, number presses would repeat so quickly that the phone would fail to unlock.  Occasionally it was bad enough to lock my phone for a minute or two.    Again, this issue is now resolved along with the other symptoms I noted in this post by replacing the SD card with a new one.

Tech in the 603, The Granite State Hacker

AppStudio gotcha

Recently, I upgraded the Granite State (NH) SharePoint Users Group’s website from WSS 3 (MOSS 2007 generation) to SharePoint Foundation 2013.  The upgrade itself went as well as a 2007 to 2010 to 2013 upgrade could go, in general.

The only real “problem” I ran into was the Windows Phone app I wrote for the group years ago.  It was coming up with a 401 error trying to grab content from lists.asmx.  

I spent some time digging in the dirt, trying to resolve the 401, and hit a few common settings known to have an impact, but no good.  

Rather than struggle with it in my not so copious amounts of spare time, I decided to trash the old app, and build a new one with AppStudio.  

The app loads content from the #NHSPUG web site (http://granitestatesharepoint.org), mostly via RSS feeds.  I put a little extra effort into this.  Using AppStudio (http://appstudio.windows.com), I found a couple hours…  after that, I had not only a much prettier v3 of the Windows Phone app, but a Windows 8.1 (tablet style) publishing package as well.

One thing that caught me off guard though… the Gotcha:

The Windows 8.1 edition of the app wouldn’t load the content from the users group website. 

With some debugging, I found that attempts to load the content were coming up with “Unable to connect to the remote server. hresult=   -2146233088”.

Turns out the error had to do with the fact that I had not enabled Capability “Private Networks (Client & Server” in the Package.appxmanifest.   Ironically, the app works fine anywhere except where I was trying to test it:  on the same network as the content source server. So, to be fair, this is an environmental/configuration issue, not AppStudio, but it was worth mentioning, since my original assumption led me down that path. Maybe this will help someone else.

Oh… Here’s the Windows Phone app:
http://www.windowsphone.com/s?appid=8c1ce3ea-9ffd-46a0-80bd-6b45d1019b32

And here’s the Windows 8.1 (tablet style) app:
http://apps.microsoft.com/windows/app/granite-state-sharepoint-users/01ea0a83-f3af-4be6-abb0-268587072686

And here’s my moment of shame recording the incident and solution in the forums:
https://social.msdn.microsoft.com/Forums/windowsapps/en-US/be7b02cf-25d0-4aa2-8850-e0e2dce21fd2/appstudio-windows-81-apps-not-loading-external-content?forum=wpappstudio&prof=required

Tech in the 603, The Granite State Hacker

Lumia Denim, Windows 10 Phone

Lots of folks have been looking forward to the impending Lumia Denim update for Lumia Windows Phones.  I know, cause I’m one of them.   I wish I had special insight into when my AT&T 1520 will be updated, but I don’t… so I find myself checking sometimes multiple times a day hoping that the upgrade will suddenly become available. 

The amount of buzz on Lumia Denim is overshadowing a more important update, in my humble opinion.  The Windows 10 Phone update (not Windows Phone 10, but Windows 10 Phone.)

The killer feature for Windows 10 is the integration across hardware form factors…  Desktop, Laptop, Tablet, Phone and even Xbox will all be running editions of Windows 10 (thus we will have a Windows 10 Phone OS, rather than a Windows Phone 10 OS).

Recently my son ran across my old Windows Phone 6.   One thing that made me really love the platform was that I could develop code using the .NET Compact Framework, and the EXE worked anywhere that had a .NET runtime installed… and I mean anywhere.   I literally was able to take an EXE and drag it from phone to desktop and back without any form of recompile, and it would run great on either hardware.   More impressively still, I was able to take DLLs compiled for the .NET CF, and run them in unexpected places, like reference them in ASP.NET web applications…   at one point, I had code for a Sudoku game model that was running desktop, phone, and WEB server!  🙂

Needless to say, I was disappointed by the fact that Windows Phone 7 used a different flavor of the .NET Compact Framework called Silverlight, and Silverlight was a lot less compatible, and required a re-write of my hobby code to make it run.   This re-write wasn’t nearly so portable.  In fact, come Windows Phone 8, I had to we-write a chunk of the code I’d done for Windows Phone 7.   This has been the plight of the Windows Phone developer;  with each release of the OS comes a new set of SDKs to code against.

Like the undoing of the curse of the tower of Babelon, with Windows 10, we’ll see the all the hardware speak the same language again, and this will be huge.   It’s already massive to be able to suggest that you can run tablet apps on your Windows 8.1 machine.  Imagine how it will be when the lines blur further.

So… bring on Denim, please, but don’t hold back Windows 10!

Tech in the 603, The Granite State Hacker

Cobbler’s Shoes

Happy New Year! I hope you enjoyed the holidays!
 
I took time off for the holidays… not as much as I’d have liked to, but enough to enjoy it.

What’d I do?

The cobbler finally got a chance to tend to his own shoes, at least infrastructure wise.

A few years ago, I caught that MS was giving away a license to Windows System Center Core, and I realized I had enough retired hardware to cobble together a hobby-level host. I then did a Physical->Virtual on my small network of Windows 2003 based servers that I ran the NHSPUG website from.

The setup was nice, actually… all three virtual machines ran with room to spare on what was originally an old client-class PC. With dynamic RAM turned on and all three VMs cranking, they occasionally managed to consume nearly a third of the host’s 8GB of RAM.

Having recently had opportunity to get a hold of platform MSDN licensing, I upgraded my entire home network infrastructure by two platform generations across the board.

Seriously… Windows Server 2003 ->  2012 R2 64, SQL 2005 -> 2014, SharePoint WSS3 -> SharePoint Foundation 2013.

Almost all of it was build, replace, rip… build new VMs, integrate them into the domain, migrate data & config as needed, then shut down the systems they replace. The fun one was SharePoint WSS 3.0 upgrading to Foundation 2013. I had to bounce the content databases off a spare 2010 farm I had left over from a project at work. It was nice that it was possible to do that, given that the 2010 farm was a different domain. It’s amazing how much you can get done in short order when you are a one-man IT shop… the communications overhead savings alone is unreal.

The hard part is that newer software in the 64bit range uses much more system resources, so I have extended hosting not just to my System Center, but also to two Windows 8.1 Pro systems running Hyper-V, just to spread out the necessary load and provide some critical system redundancy.

With that, only obvious thing externally is that the Granite State NH SharePoint Users Group website ( http://www.granitestatesharepoint.org ) is now SharePoint 2013 based.

Internally, things generally seem a touch faster, smoother… maybe that’s just psychological, but I notice the difference, even if my wife & kids think it just functions as always, as expected.

I guess the irony in this is that my hobby infrastructure backlog is knocked down a few more notches than I thought I would ever get to… (yes, I took time off from work, and, to chill, I did some of what I do at work.) now my hobby development backlog has new possibilities and subsequently grown substantially.

One of the first things I’ve got to take care of is the few services the SharePoint upgrade has caused… the NHSPUG site still has some cosmetic issues I want to sort out. My Windows Phone apps that integrated with the WSS3 site are now broken, and I have some jiggering to do with my dev environment before I can even diagnose them. That doesn’t even cover some of the things I want to do with the NHWPAD group and my hobby/portfolio projects (e.g. Jimmy Sudoku).

Tech in the 603, The Granite State Hacker

Getting Display Names from User Names in a hostile SharePoint environment

I recently ran into a nasty situation where I needed a reliable way to get a list of user Full Names (or Display Names) from a list of usernames in a SharePoint process.

The short answer was easy…  The code runs server side so…

SPUser theUser = web.EnsureUser(username);
string DisplayName = theUser.Name;

//Right?

Well, under normal circumstances, sure.  

In this circumstance, I was checking a list of lists of user names, a condition where I might need to check hundreds of items, each of which could have a list of users to check.

No biggie, just add a lookup table and cache the results over multiple calls so that I only ever have to look a user up once in my process.

Now here’s the real kicker.  In my target environment, EnsureUser comes back instantly if the username is a valid, active user in Active Directory.  If the user is not a valid user?   The command takes over 40 seconds per call to fail!

My solution was two-fold.  

1)  use the aforementioned cache strategy, which I have in my sample code below as _nameMap.
2)  Use a simple worker thread.  Give it two seconds to succeed.  Kill the thread if it takes longer than that for any reason.

I initially made the mistake of using SPContext.Current.Web in the thread, but that can *sometimes* produce a threading violation.   The code below creates a whole new instance of SPSite/SPWeb on every pass, but that’s a lot safer and better performing than a lot of alternatives.

private Dictionary _nameMap = new Dictionary();  

private string GetUsersWithTempCacheAndTimeoutEnforcement(string rawUsers)
{
string result = string.Empty;
SPContext.Current.Web.AllowUnsafeUpdates = true;
foreach (string aUser in rawUsers.Split(';'))
{
try
{
string addUser = string.Empty;
string checkUser = aUser.Split('#')[1];
if (checkUser.Contains("\\"))
{
lock (_nameMap)
{
if (_nameMap.ContainsKey(checkUser))
{
addUser = _nameMap[checkUser] + "; ";
}
else
{
SPUser userResult = null;
SPContext context = SPContext.Current;
string webUrl = context.Web.Url;

System.Threading.ThreadStart st = new System.Threading.ThreadStart(
() =>
{
try
{
using (SPSite site = new SPSite(webUrl))
{
using (SPWeb web = site.OpenWeb())
{
userResult = web.EnsureUser(checkUser);
}
}
}
catch (Exception)
{ }
});
System.Threading.Thread workThread = new System.Threading.Thread(st);
workThread.Start();
workThread.Join(2000);
if (workThread.IsAlive)
{
workThread.Abort();

}
if (userResult == null)
{
_nameMap[checkUser] = checkUser;
addUser = checkUser + "; ";
}
else
{
_nameMap[checkUser] = userResult.Name;
addUser = userResult.Name + "; ";
}
}
}
}
result += addUser;
}
catch (IndexOutOfRangeException)
{
}
catch (Exception ex)
{
}
}
return result;
}

Tech in the 603, The Granite State Hacker

Looking into Continuous Delivery / Lean Enterprise

After a conversation with my boss I just downloaded Continuous Delivery to my Kindle reader (Windows 8 / Windows Phone app). 

On first brush, I can see it’s akin to the next phase of a process I’m somewhat familiar with.  I’ve referred to it as Software Factory in the past, and even have a label for it in this blog.  I designed and delivered a “Software Factory” solution around some of these concepts at one of the few product based companies I worked at in my career…  

“Software Factory” took Continuous Integration (CI) up a  few notches by automating not just builds, but code generation, deployment packaging, and then an early stab at what might now be called a private cloud, where we automated spinning up an instance of target test systems, deployed the fresh baked product, ran smoke tests, and (if smoke tests looked good) notified the folks in QA for more complete testing of a solid candidate.   


I’ve been a fan of Domain Specific Language (DSL) for the purpose of custom build & automation ever since. 

For that company our solution was an on-premises deployment, so it was still a matter of convincing customers to deploy the updates…  but our automation produced both full install kits as well as patches that would upgrade a running system from a known build to a target build.    


That company was preparing to take the product into the SaaS model which was very new at the time, and this would have been a part of that, as well.   

I’ve worked with TFS to integrate smoke testing and build automation, as well.  That could easily extend to this sort of thing. 

That company suffered from lack of customers, unfortunately, but it was a process I’ve been looking forward to getting back to, and expected we’d get back to in the consulting world some day.    It’s interesting that Software Factory (as Continuous Delivery) is working it’s way back to top of mind relevance through the cloud…  I’m looking forward to reading what the authors of this book have to say about it.
Tech in the 603, The Granite State Hacker

An Alternative Profile, in C#

The folks at BlueMetal keep profiles of each team member on the web site.  They asked all of the recently added teammates to draft up a profile. The hard part for me was that it felt like I needed to model and express myself in terms of… C#, of course.  🙂   I wrote this with enough supporting scaffolding to get it to compile…

using System;
using System.Threading;
using System.Threading.Tasks;
using BlueMetal;
using Microsoft;
using Database.SQL;
using Web;
using Mobile;
using Services;
using Cloud;
using Experience;
namespace Profile
{
   public class Jim_Wilcox : SeniorApplicationDeveloper
   {
     private Jim_Wilcox()
       : base()
     {
       Blog = “http://granitestatehacker.kataire.com”;
       CommunityLeader =
         Community.NH_SharePoint_UsersGroup |
         Community.NH_WindowsPlatformApplicationDevelopers_UsersGroup;
       EventCoOrganizer = Community.SharePointSaturday_NH;
       YearsOfExperience = Qualifications.Decades;
       Vision = Qualifications.EnterpriseLevel;
       LearningMode =
           Qualifications.Continuous | Qualifications.EarlyBinding;
       Skills =
           Skill.NET | Skill.MVC | Skill.SharePoint | Skill.TFS |
           Skill.Azure | Skill.SQL | Skill.Many_More;
       Industries =
           new System.Collections.Generic.List<Industry>() {
             Industry.Military, Industry.Telecommunications ,
             Industry.Retail, Industry.Financial ,
             Industry.Healthcare, Industry.Hospitality ,
             Industry.Concierge, Industry.Construction ,
             Industry.Many_More};
     }
     public static async Task EngageAsync(StatementOfWork context)
     {
       await BlueMetal.Project.Execute(context).UsingDeveloper(Individual);
     }

     public static Jim_Wilcox Individual{ get { _unique = _unique ?? new Jim_Wilcox(); return _unique; } }

     }
}

Tech in the 603, The Granite State Hacker

Winds of Change

If you hadn’t heard yet, Jornata merged with BlueMetal.  As part of the merger, BlueMetal organized a session of “BlueMetal Academy” to help transition the team.  In spirit of a true merger, Jornata members participated as trainers, as well, showing that Jornata’s culture is really being assimilated, not purged.  (The merger is a solid marriage, rather than simple annexing of resources, both sides bring common values but distinct strength to the partnership). 

At the end of the training, we were asked to come up with one word to reflect what we’d learned over the course of it.  Just one…  on a moment’s notice.  Responses were things like “Integrity”, “Consistency”, “Connection”, “Inspiration”, “Committed”, “Legit” and a few other words of similarly positive connotation.

I had the advantage of being among the last in line to respond, so I considered each of them as they were spoken.   In my head, I responded to each word as it was spoken.  “Yes”, “True”, “Good one”… those all fit.  “What says all of that?”, I thought.  Digging deep, I could only think of one word that conveyed all those qualities… everything we learned.  there’s only one word that says it all, and I didn’t say it to play Captain Obvious…  “BlueMetal”  

Ok…  the cool-aid is either totally Stepford, or totally legit.

Given my experience with BlueMetal teammates in both the SharePoint AND Windows Phone Dev communities, before I ever had the opportunity to join… it’s not Stepford.

That said, I think the expected answer was “Mahan”, as in Mahan Khalsa, author of “Helping Clients Succeed” which plays an over-arching theme across the company.  Someone may have even said that, but I didn’t catch it. I still like my original answer.

This past spring I joined Jornata, mostly to shake up my career.  Jornata was/is a fantastic team to be a part of in its own right.  My prior experience with them in the SharePoint community was also first rate. 

I might have pursued a job at BlueMetal years ago on my own were it not for the daunting commute.

The winds of change clearly had more in store.

Now, I find myself thinking that BlueMetal really looks like the company I always had in mind to work for when I was teaching myself programming as a kid.. and I mean everything..  from its respected thought leaders to its community involvement to its extremely purposeful corporate structure…  being employee-owned…  I realize this team is top to bottom, front to back, enterprise ready, industrial strength, yet premium consumer quality… and they have my back. It will be my honor to have this team’s back.

I’m very much looking forward to settling into the new team, and really looking forward to digging in on a nice juicy app development project.  Duty to the customer has pulled me quite a bit toward infrastructure build outs… Being successful at those things has had the curse of being asked to do more of it. The further away from C# I get, the further I am from my true passion & real value add, and that doesn’t really cut it for me or my team, longer term.

so…  the commute sucks… but if that’s all I can think of to “complain” about…  I guess that’s what it takes to be “The Granite State Hacker”, for keeps.  (I’ll secretly blame NH politicians for making it so hard to find a sufficiently legit tech offices in NH, and work at home every chance I get.)

This marks a new chapter for my career, without a doubt, and I’m sure I’ll be inspired to blog deeper than what had become all too common Microsoft cheerleading posts.  (Now I can be a BlueMetal cheerleader, too!   ok…  I’ll try to refrain from geeking out about my team too much.)