Tech in the 603, The Granite State Hacker

Microsoft Most Valuable Professional (MVP)

Jim Wilcox – 2019-2020 Microsoft MVP – Developer Technologies

This showed up in the mail today! Despite the April 1st date, it’s not an April Fools’ gag after all! I’ve only ever seen one of these trophies in person before this one. I’ve been trying to stay chill about it…. but heck, here it is…

I’m profoundly honored and thankful to say that Microsoft has chosen to award me with this 2019-2020 “Most Valuable Professional” (MVP) award, in the category of Developer Technologies!

If you’re not familiar with this award program, check out the program’s official web site: https://mvp.microsoft.com

Tech in the 603, The Granite State Hacker

MVP IoT with Windows 10, C#, Raspberry Pi and Azure IoT Hub

Boston Code Camp 28 is in the books as one of the greatest community events of recent times in my book.  Attendance was fantastic, we had amazing sponsors, and a ton of great speakers, but the thing that really made things hop was attendance.  I’m personally convinced it was the best attended Code Camp I’ve ever participated in.
As a presenter, I don’t often get to attend as many of the amazing presentations as I’d like, but yesterday I found myself especially regretting that… there was just so much great content from so many great presenters. I did manage to get into more sessions than I usually do… how could I not?

Sure, you get a few “look at this cool stuff I can do” presentations.  These are great for folks looking for inspiration on the tough challenges.  I love the spirit of “look at this cool stuff you can do (if you apply your skills in a modestly different direction)”.
This is why I do this MVP IoT presentation.  This presentation is about taking skills you already know and love (namely C# development) and applying them to what’s classically though of as “embedded” development.  Yes, there’s overhead in this approach…  you might have to use hardware that’s slightly better equipped to handle Windows 10 IoT Core such as the Raspberry Pi 2b & 3b… but the difference is mute at small scale, and masked at large scale by not having to have a separate team with different skills. 

IoT apps on the Windows 10 IoT Core platform ARE Windows 10 apps.


The point I always try to drive home is IoT apps on the Windows 10 IoT Core platform ARE Windows 10 apps.  The very same exe you compile for your embedded device runs just as well on laptop, desktop, server, Windows 10 phone, et al.

I do regret the couple snags I had during my demos.  Still, someone approached me after the presentation with the idea that I should pre-record portions of my presentation in order to avoid these kinds of things.  I like to run live for several real reasons.  1)  I’m a coder, not a professional presenter… I don’t often have time to polish my presentations to that level.  2)  Glossing over rough edges hides what development is.  Development is tough.  You have to have backup plans and contingencies.  My Raspberry Pi didn’t want to connect to the guest WiFi, so I fell back to plan B, and moved on.  It’s a real world scenario;  you hit a snag, but keep pressing on.

IoT is already about the last mile of the Sci-fi story, bringing Internet omnipotence to the fringes of reality, enabling the “Computer” of Star Trek (or the Cortana of the modern desktop) to reach it’s potential (hopefully without becoming Skynet).

It’s the stuff of science fiction… but it’s not fiction.

Visual Studio 2017’s ability to debug into a remote embedded device and make hot changes to a running executable is beyond top notch; it’s the stuff of science fiction… but it’s not fiction.

If you look through my post history, you’ll see how this presentation has evolved over the past decade.  It’s been an interesting evolution…  starting with connecting Windows Phone 7 to SharePoint.  Then Windows Phone 8 and SharePoint online (and the story got really muddy for a bit there).  Then CSOM hit and smoothed out the SharePoint side of things.  I changed the story to Field Enablement using Xamarin for iOS, Android, and Windows Phone with SharePoint as a back end for a bit. (It’s a surprisingly compelling story, even if it’s only academic).  Eventually I started focusing on UWP for Windows 10, and my love of small form factor development drew me back to Raspberry Pi. 
Finally, I’ved bridged off of SharePoint and started talking about Azure IoT Hub, which is the modern accepted best practice in the domain of this development stack.  This change happened so relatively quickly that if you notice, the synopsis for the session didn’t mention it.  (  https://www.bostoncodecamp.com/CC28/sessions/details/16540 )

One can explore the code I developed for the demo at git hub, here:
That leads me to my final bit:  I am sorry I ran out of time in my presentation.  I was so psyched to show how to send telemetry back to Azure IoT Hub, and while I got to step through the code that sends updated reports, I did not get to explore any of what that looks like in the Azure IoT Hub portal, and didn’t get to explore the event-driven API on the embedded side that allows you to send code with Device Twin down to a the device.
Here’s the event that commits the post:

        private async void iotHubButton_Click(object sender, RoutedEventArgs e)

{

try

{

using (var client = DeviceClient.CreateFromConnectionString(

$"HostName=BOSCC-IOTHub.azure-devices.net;DeviceId=GraniteStHacker;SharedAccessKey={Credentials.LuisAccessKeyFromAzurePortal}",

TransportType.Mqtt))

{

var twinProperties = new TwinCollection();

twinProperties["MeasuredTemperature"] = manager.MeasuredTemperature;

twinProperties["HeaterPowerOn"] = manager.HeaterPowerOn;

twinProperties["ACPowerOn"] = manager.ACPowerOn;

twinProperties["Device_BOSCC"] = DateTime.Now.ToString();

await client.UpdateReportedPropertiesAsync(twinProperties);

Console.WriteLine("Done");

}

}

catch(Exception ex)

{

Console.WriteLine(ex);

}

}

}


Click the image below to see the device I was using for the demo in Azure IoT Hub’s Device Twin view.

Here’s the resulting Device Twin JSON:
{
  “deviceId”: “GraniteStHacker”,
  “etag”: “AAAAAAAAAAE=”,
  “version”: 8,
  “status”: “enabled”,
  “statusUpdateTime”: “0001-01-01T00:00:00”,
  “connectionState”: “Disconnected”,
  “lastActivityTime”: “0001-01-01T00:00:00”,
  “cloudToDeviceMessageCount”: 0,
  “authenticationType”: “sas”,
  “x509Thumbprint”: {
    “primaryThumbprint”: null,
    “secondaryThumbprint”: null
  },
  “properties”: {
    “desired”: {
      “$metadata”: {
        “$lastUpdated”: “2017-11-14T01:48:45.8322179Z”
      },
      “$version”: 1
    },
    “reported”: {
      “MeasuredTemperature”: 74,
      “HeaterPowerOn”: true,
      “ACPowerOn”: false,
      “Device_BOSCC”: “11/18/2017 8:34:08 AM”,
      “$metadata”: {
        “$lastUpdated”: “2017-11-18T16:34:20.1258514Z”,
        “MeasuredTemperature”: {
          “$lastUpdated”: “2017-11-18T16:34:20.1258514Z”
        },
        “HeaterPowerOn”: {
          “$lastUpdated”: “2017-11-18T16:34:20.1258514Z”
        },
        “ACPowerOn”: {
          “$lastUpdated”: “2017-11-18T16:34:20.1258514Z”
        },
        “Device_BOSCC”: {
          “$lastUpdated”: “2017-11-18T16:34:20.1258514Z”
        }
      },
      “$version”: 7
    }
  }
}

Tech in the 603, The Granite State Hacker

UWP Equivalent for HttpUtility.ParseQueryString

Getting ready for my LUIS presentation at the Granite State Windows 10 Platform Devs Users Group (@WPDevNH), it made sense to demo LUIS using UWP rather than .NET classic.  (Join us, 11/16 at the Microsoft Store in Salem, NH…  https://www.meetup.com/Granite-State-NH-WPDev/events/243099117/ )

For a demo related to LUIS querying, I needed an alternative to System.Web.HttpUtility.ParseQueryString.  (based on this demo:  https://docs.microsoft.com/en-us/azure/cognitive-services/LUIS/luis-get-started-cs-get-intent )

I did a simple decorator of a Dictionary, adding a constructor to parse using WwwFormUrlDecoder, and overriding the ToString() to put it back together…

I whipped one up relatively quickly, but decided this would be a decent quick post.  Here’s my alt code:

usingSystem.Collections;
usingSystem.Collections.Generic;
using System.Net;
using System.Text;
usingWindows.Foundation;
namespaceLUIS_Examples
{
    public class ParseQueryString : IDictionary<string, string>
    {
        private IDictionary<string, string> _internalDictionary = new Dictionary<string, string>();
        public ParseQueryString(string queryString) :
            base()
        {
            var decoder = new WwwFormUrlDecoder(queryString);
            foreach (var item in decoder)
            {
                _internalDictionary.Add(item.Name, item.Value);
            }
        }
        public override string ToString()
        {
            var sb = new StringBuilder();
            foreach (var aPair in _internalDictionary)
            {
                sb.AppendFormat(“{0}={1}”, WebUtility.UrlEncode(aPair.Key), WebUtility.UrlEncode(aPair.Value));
            }
            return sb.ToString();
        }
        public string this[string key] { get => _internalDictionary[key]; set { _internalDictionary[key] = value; } }
        public ICollection<string> Keys => _internalDictionary.Keys;
        public ICollection<string> Values => _internalDictionary.Values;
        public int Count => _internalDictionary.Count;
        public bool IsReadOnly => _internalDictionary.IsReadOnly;
        public void Add(string key, string value)
        {
            _internalDictionary.Add(key, value);
        }
        public void Add(KeyValuePair<string, string> item)
        {
            _internalDictionary.Add(item);
        }
        public void Clear()
        {
            _internalDictionary.Clear();
        }
        public bool Contains(KeyValuePair<string, string> item)
        {
            return _internalDictionary.Contains(item);
        }
        public bool ContainsKey(string key)
        {
            return _internalDictionary.ContainsKey(key);
        }
        public void CopyTo(KeyValuePair<string, string>[] array, int arrayIndex)
        {
            _internalDictionary.CopyTo(array, arrayIndex);
        }
        public IEnumeratorstring, string>> GetEnumerator()
        {
            return _internalDictionary.GetEnumerator();
        }
        public bool Remove(string key)
        {
            return _internalDictionary.Remove(key);
        }
        public bool Remove(KeyValuePair<string, string> item)
        {
            return _internalDictionary.Remove(item);
        }
        public bool TryGetValue(string key, out string value)
        {
            return _internalDictionary.TryGetValue(key, out value);
        }
        IEnumerator IEnumerable.GetEnumerator()
        {
            return ((IEnumerable)_internalDictionary).GetEnumerator();
        }
    }
}

Tech in the 603, The Granite State Hacker

Trading iPhone for Windows Phone – What You Give Up

As Jornata continues to integrate with BlueMetal, lots of things internally are coming together.  One of the things I’m loving is the internal dialog with the team that I’m now a part of at BlueMetal.  Our “geek chat” messaging reminds me of the best dialogs I’d been a part of at other companies, except amped. This isn’t coming from just any technology architect. These folks are well-known technology thought leaders, evangelists, and MVP’s. With sincere respect, I’ll try to avoid getting myself in trouble with them and BlueMetal, but I’m feeling a bit like a kid in a candy store.

Being the C#/mobile (and therefore Windows Phone) junkie that I am, I always watch what’s going on in the space. 

While the Windows Phone market share at BlueMetal is significantly higher than the general population, BlueMetal’s not just some extension of Microsoft.  There’s a lot of the team internally that are Apple and Android fans.   Naturally, when the news of Apple Watch broke, the conversation really picked up, and it was all fantastic stuff to consider.

One bit that came up that I wanted to write this post about, however, was a number of misconceptions that Apple fans had about Apple vs. “not Apple” in the smartphone area.  I can’t resist. There are good reasons to not consider Windows Phone, but some are just misunderstandings.

Here was a viewpoint:
————-
The things I would be giving up by switching [from iPhone] to Android or Windows Phone:

  1. iMessage 
  2. Photostream
  3. Find My iPhone
  4. My apps – the ones which I’ve already bought and the free ones which all work so well.  Windows phone doesn’t have the volume of Apps and Android doesn’t have the stability and polish
  5. iCloud backup
  6. iTunes – songs  I purchase are automatically downloaded to other iPhones and Macs
  7. Apple Watch
————-
 
The response was quick and, interestingly slanted in defense of Windows Phone… here’s a synopsis, including my own viewpoint:
  1. iMessage is platform specific, locking out non Apple users.   Consider Skype, Lync, or even Facebook Messenger instead.
  2. Photostream – Windows Phone has this functionality built into the OS, uploading photos to OneDrive.  (and OneDrive has working multi-factor authentication, so you won’t have to worry so much about selfies unexpectedly going viral.
  3. Find my Phone – yes, built into the Windows Phone OS… just a check box, and yes, it’s saved several of my family members more than once.
  4. Apps –  I have to admit, there’s no recovery for the investment made on iPhone/iPad apps, but there is this saving grace…  with Windows Unified apps, the app purchases you make on phone apps often entitle you to the same app for tablet and PC as well.   The marketplace is improving daily, so the general marketplace app gap is narrowing.  The Windows Phone app marketplace has better technical governance than Android’s, but not as mature as Apple’s, yet.
  5. iCloud backup – Windows Phone has OneDrive backups with much easier access to the content.
  6. iTunes – consider Xbox Music. With a low priced subscription, you can stream music to your phone, PC, tablet, and Xbox, and if you purchase or rip music, it makes it available thru the cloud to ask your devices… No need to sync your phone with a PC. Content just shows up.
  7.  Apple Watch?   Hard to say on this one… but I consciously traded my watch for a good smartphone long before iPhone came out.
Still others piped up and noted how well integrated Windows 8 & Windows Phone 8 (and I would add Xbox)…  All of them work independently, but put them together, and you have a ton of really great ways to do things like manage your home network, participate in entertainment, and even keep your kids safe while browsing the ‘net.
 
In my opinion, Apple serves a few purposes…  they change folks’ minds about what technology is socially acceptable.  The industry needs them for their competition and for their tech fashion sense.
 
It seems clear to me that the net result is that by trading in an iPhone for Windows Phone, you give up some investment in Apple, but you gain quite a bit of functionality and security for doing so, especially if you’re also a Windows and/or Xbox user already.
Tech in the 603, The Granite State Hacker

Publishing Content Separately from Presentation

Separating content from presentation is a very old “Best Practice”™. 

Publishing using web technology is not new anymore, either, but mobile puts a newish urgency in that best practice.  I’m seeing ignorance of the old best practice bite some in a potentially surprising way as the age of mobile apps become the preferred way to consume content.

Here’s what I mean by publishing separate content and presentation… 

Take for example a menu from a restaurant.  I’m finding in many cases, restaurants have web sites that publish their menu.  Their menu items are content, and the web site presents it in a pleasant manner.  In many cases, the presentation and the content are published just in that web page.  (The menu items are “hard coded” as HTML into the page.)

If the restaurant’s menu items are “hard coded” into the page presentation, it’s very hard for anyone to re-use that information in any other presentation.  It’s not impossible.  It can be “scraped”, and some tools do a decent job of it.  It’s just not easy enough. 

The more technically correct path is to publish the content as a web service, and then publish the web site.  The web presentation layer should consume content it gets from the service. 

Why does this matter?

There’s lots of functionality that can be provided by a content service.  Users can consume portions of the content by filtering it, sorting it, or classifying it.

To expand on that, I’ll pick on Microsoft’s Windows Phone AppStudio a bit, since they’re the star in my circles right now.  Microsoft’s AppStudio is one of many ways to create apps for mobile devices.  (In this case, for Windows Phones, but that’s beside the point.)  AppStudio’s niche is making it easy for people to pull in content from various sources and present it in their own Windows Phone app.  LOTS of people are building apps for just about everything you can imagine…  members of the Granite State Windows Phone Users Group are producing a ton of apps based on it.  

Here’s some statistics to try to paint a picture of this.  The NH Windows Phone UG community publishes a list of apps produced by its members.  In the past three months since App Studio was released, I estimate that the number of apps in that catalog has doubled, and 95% of the new apps are AppStudio apps, consuming and re-presenting, making use of content provided by 3rd parties. 

What makes it easy to build AppStudio apps is that it has a simple presentation of its own… all folks need to do is find content that’s been formatted in one of a few very standard ways.

We have, for example, a grade-school aged member of the #NHWPUG community building and publishing apps with AppStudio.  His publisher name is YoungMaster, and his first app is called “Kids Zone”.  The cool part about Kids Zone is that he was able to add video content from YouTube.  His app merely queries YouTube for certain kinds of videos, and YouTube responds with a list (in a standard format) of items.  Users of the app simply tap the list for more information about it, or to watch the video.

Now, back to that restaurant…  if a patron/fan developer wants to make an app for a specific restaurant, it would be very hard to add that restaurant’s menu items if the menu item information is not published separate from the web site presentation.  

Another application might be to allow a person searching for a meal to browse menu items from a number of nearby restaurants.  Will your restaurant’s menu items be available in the list?

Lots of folks already understand this concept of separately published content and presentation, and apps pop up around the content all the time.  Movie theaters, travel agencies, transit authorities, social media updates, news agencies… all publish their content separate from their web site presentations. 

What’s rougher, for folks using a CMS (Content Management System), chances are, you have the ability to publish a Syndicated Feed or RSS Feed that would do the job… but if you’re not enabling and exposing it, you’re missing a chance for folks to help spread the word about your company in these new ways.

Tech in the 603, The Granite State Hacker

Feb 2014 Meetings for the Granite State NH Users Groups

Two things for the Granite State Users Groups for February 2014…

  1. The Granite State SharePoint Users Group will be meeting on a special night in a special place for a special speaker. Monday, Feb 10th, Daniel Webster College, Eaton Richmond Room 100, Joel Oleson will be presenting “Your Enterprise Social Journey”.  Alexander Technology Group will have the pizza hot at 6 PM, the presentation will begin at about 6:30.  Please RSVP (FREE) Here:  http://granitestatesharepoint.eventbrite.com
  2. The Granite State Windows Phone Users Group will be meeting at its regular date & location (6 PM, Microsoft Store in Salem, NH on February 20th), but our format will be a bit different from the normal.  Instead of a feature presentation, we’ll have an exercise in community app reviewing & rating.  This semi-dynamic RSS feed represents the list of apps known community published apps:  http://www.kataire.com/gswpug/gswpugservices.svc/getdata .  Please, bring your friends, phone(s), and RSVP for the meeting here:  http://granitestatewinphone.eventbrite.com

Hope to see you there!

Tech in the 603, The Granite State Hacker

Aggregating Windows Phone Store Apps into RSS

Naturally, there’s an app for the Granite State NH Windows Phone Users Group.   🙂

I recently added the ability to aggregate listings from the Windows Phone app store to create a list of apps published by our members.  RSS seemed the natural way to present the info, since it was consumed easily by an App Studio app.

I showed it off a bit at the users group, and got a few requests for some of the code.

Once published, you should be able to go to http://{yourserver}/{optional}/GSWPUGServices.svc/GetData to load the RSS feed.

It’s currently published at http://www.kataire.com/GSWPUG/GSWPUGServices.svc/GetData

Here’s the project.

http://sdrv.ms/1cNYO9T