back to the office (more often) and other autumn stuff

Next week, we go from two days a week in the office to three days. The old way was that half the employees came in on Mon/Wed and the other half on Tue/Thu. (I was in the Tue/Thu group.) The new plan is for everyone to come in Tue/Wed/Thu, with Monday and Friday being work from home days for everyone.

I’m not looking forward to it. I think I get a lot more work done from home, and I’m a lot more comfortable. In the office, even with only half the folks there, it can get pretty noisy, since almost all of our meetings are on Teams now. I generally need to keep my AirPods in with some music playing to drown out everyone else’s Teams calls and concentrate on my own work. And I’m not a big fan of driving 20 minutes each way just to sit in a cubicle for eight hours. I’ve probably made these complaints on this blog already at some point, but it always makes me feel a little better to vent about it.

I’m also a little worried about my own stamina. I’ve been finding that my in-office days are kinda exhausting, sometimes. Maybe I have some kind of medical problem, or maybe I’m just getting too old for this stuff. I don’t know. I guess we’ll see if I can manage three days in a row or not.

NFL

On a different subject, today is the first Sunday of the NFL season. So that’s cool. The Giants are on the Sunday night game and the Jets are on Monday night, so there are no local afternoon games. I’m pretty sure I’ll turn on whatever games are on, and just let them play in the background today. It’s a rainy day and I don’t have much else to do.

I spent a little time this morning trying to figure out what NFL-related content I can watch on my streaming services this season. I can still watch NFL Matchup on ESPN+, it seems. And NFL Primetime too. Apparently, Inside the NFL has moved from Paramount+ to the CW, which is a bit weird. I guess I can watch that on my TiVo then, if I can figure out when it airs. And I guess I can watch PFT Live on Peacock, if I need more football news.

I’ve been getting into sports enough recently that I’ve been flirting with the idea of signing up for cable again, or one of the cable-like streaming services that includes ESPN. But any of those would cost me way too much money, and the prices are going up on some of them soon too. So I’m trying to stick with just what I have now. That means I can’t watch stuff like the US Open men’s final today, which is only on ESPN, but I guess I can live with that.

another position change

I don’t think I wrote a post specifically about my last position change at work, from back in October 2022, but I guess I hinted at it in this post. At that time, I went from being a “Senior Application Developer” to an “IT Solutions Manager,” with three direct reports. And those folks were CRM developers, so I had to start learning CRM.

That all went reasonably well, I think, but there have been a lot of changes recently, and one of those is that they don’t want managers with only a few direct reports. So they’re taking all the programmers reporting to me, and those reporting to a couple of other senior folks, and putting them all under one manager, who will now have about a dozen direct reports. So now I’m back to not being a manager, and I have a new title: “Sr. Advanced Applications Developer – Lead”. Kind of a weird title, but it’s fine, I guess.

I updated my LinkedIn profile. I’m wondering if the nine-month stint as a manager looks bad. The change was only done because of a desire to have fewer managers with more reports per person, not because I did anything wrong. But I could see a potential employer wondering why the position only lasted eight months. Oh well. I’m not looking for a new job right now, so there’s no need to worry about it yet.

Meanwhile, I see that back in that October post, I was talking about new stuff I was learning for work. I talked about Razor Pages a bit. I had planned on doing some other stuff with Razor Pages, but that didn’t get very far. I had a specific project I wanted to do that way, but it was decided that we should use Angular for it, since that’s our standard for front-end stuff, apparently. I started learning about it (and mentioned it here), but I haven’t gotten far, and the project I was going to need it for has been put on indefinite hold.

Today, I spent some time trying to learn about Sumo Logic, which is going to replace Splunk for us. I’m a little annoyed about that, since I’ve managed to learn a good bit about Splunk, and I have a bunch of saved queries in it and notes on how to extract stuff I need. So now I need to relearn all of that, in a new system. Sumo Logic looks like a pretty good system, honestly, but learning new stuff all the time gets tiring as I get older. Sometimes, I just want the world to slow down a bit and let me catch up.

And one more semi-related subject: I noticed today that, in Outlook, the old interface for managing tasks is gone, and the Microsoft To Do interface is the only way to access tasks now. I’m not fond of that interface, but I guess I’m stuck with it now. (It might be possible to turn the old tasks stuff back on, but I’m guessing that it’ll eventually go away completely, so I might as well get used to To Do.) I’ve blogged about my many troubles with task management at work several times, most recently here, I think. My current system is to use Planner for long-term reminders (since Outlook items get deleted after a year) and now, I guess, To Do for short term stuff. That’s not great, but it’s the best I can do in our environment.

I’m going end this post with a link to a comic strip I included back in that October post. Still true.

A.I.

From AI Is a Lot of Work:

Put another way, ChatGPT seems so human because it was trained by an AI that was mimicking humans who were rating an AI that was mimicking humans who were pretending to be a better version of an AI that was trained on human writing.

There’s been a lot written about AI lately. And a lot of hype around it. A lot of articles I’ve read (OK, skimmed) aren’t saying much of value. This one is pretty interesting though.

And here’s a link to a podcast that might be interesting: The Culture Creating A.I. Is Weird. Here’s Why That Matters. (I haven’t listened to it yet, but it was recommended to me.)

Personally, I was hoping to sit the whole thing out, but I guess it’s too late for that. I remember taking an “Intro to AI” class in college that was basically an intro to LISP and Prolog programming. It’s come a long way since then, but it hasn’t come as far as a lot of people would like to convince you it has.

General learning stuff

First, a little follow-up from my last post: The Credly thing was a little weird. There’s a working LinkedIn integration that will add the credential to your profile and let you post about it. So that’s good. There are options to share to Twitter and Facebook too, but neither worked. I manually posted the credential link to Facebook, Twitter, and Mastodon, just for yuks. So maybe I’ll get some “likes” out of that. Not that it matters, but I crave attention and validation, like most 21st-century humans.

On the broader topic of education: I’ve been working on figuring out some of the newer .NET Web API stuff lately. My existing .NET Web APIs are all .NET 4.x. Until recently, I hadn’t tried to create one under ASP.NET Core. I’ve been working my way through this course on Pluralsight.

I still get access to Pluralsight through work, which is great. My company recently discontinued access to Percipio though. I wasn’t really using Percipio that much, and I still have access to it through ACM, so it’s no big deal that work has stopped paying for it. That got me thinking about O’Reilly Learning again. When I got the email telling me that we were dropping Percipio, I responded with a suggestion that they look into O’Reilly. I don’t have much hope that our L&D folks will want to spend the money on O’Reilly, but I thought I’d suggest it. You never know.

Our L&D folks (and I guess someone influential in management) have been pushing a lot of leadership stuff lately in a couple of areas that I wasn’t previously familiar with. First is John C. Maxwell’s 5 levels of leadership. I guess that Maxwell is actually a pretty big name in the “leadership” area, though I’d never heard of him. He’s written a bunch of books. I’m considering picking up the 5 Levels of Leadership book, either in Kindle or Audible format. I’ve got mixed feelings though. On the one hand, I want to learn stuff that might be important and help make me a better manager. On the other hand, I’m about halfway through the third Wheel of Time book, and I don’t want to get off track on that.

The other big thing they’re starting to push at work is something called Emergenetics, which sounds pretty fishy to me, but is apparently not a weird pseudo-religion or anything like that. I don’t have much to say about it, since i haven’t really started looking into it yet.

I’m not really sure where these two initiatives came from. It might be somebody in L&D, or somebody in management. We do have a bunch of new high-level managers that have been hired from outside recently. We used to get most of our high-level managers from internal promotions, but I guess our president wanted to bring in some fresh blood. Overall, there’s a good bit of uncertainty in the company, due to all of the new managers coming in, and various changes going on. I’m trying to take a “wait and see” attitude, and keep an open mind.

I do have three direct reports now, so I should probably try to keep up on the management philosophy stuff. I haven’t really been an active manager in a long time. And, since they made me a manager about six months ago, I’ve actually done very little management. I’m mostly just letting my direct reports do their work, and leaving them alone. But I should probably try to more actively engage with them. At some point, I’ll probably have to do performance reviews, so I guess I should at least engage enough to be able to do that properly.

It’s hard to juggle all of this. I want to keep up on all the technical stuff, like ASP.NET and Power Platform, and so on, but I also need to work on the “soft skills” stuff.

finally Microsoft certified, again

Well, it’s just about three months since I committed to taking the exam for Microsoft’s PL-900 certification. Per this post, I got an exam voucher from my company, back in March. At that time, I set a “next week” reminder flag on that email in Outlook, and I’ve just been kicking the reminder to “next week” again every Friday. So finally I decided to just stop putting it off and take the test today. (It helps that it was a quiet day, with nothing else on my calendar.)

I have a few observations about the exam-taking process that I thought I’d share, since I wasn’t at all sure how it was going to work, so maybe this will help someone else who is planning on taking a Microsoft exam.

First, I wasn’t sure if I should go for the at-home option or go to a testing center. I checked Pearson’s site for local testing centers, and there’s one that’s about 10 miles away from here. So not too far, but far enough that I thought I’d try the at-home option instead.

At-home, of course, was not an option the last time I took an exam, back in 2010. I’d heard some worrying things about the requirements for at-home tests, which I wasn’t sure I’d be able to fulfill. They want to minimize cheating, of course, so you have to take photos of your work environment, to show that you don’t have any reference material at hand. My apartment is so cluttered that I wasn’t sure I’d be able to do that. But I managed to clear everything off my kitchen table, and I guess the photos I took were good enough for them.

But to back up a bit, first I had to schedule the exam. I know that there’s supposed to be some human review/monitoring of the exam, so I wasn’t sure if it would be easy to get a spot, but it turned out to be quite easy to schedule the exam for today. If I’d wanted, I could have taken the exam right away. I didn’t want that though, so I scheduled it for 1:45 PM. You need to check in for the exam prior to the start time, and you can do that 30 minutes prior.

After registration, I went through the “pre-flight check” that involved downloading a small program to my computer and verifying that my webcam and microphone worked, and that my internet connectivity was good enough. That was no problem.

After that, I spent some time taking (and failing) the MeasureUp practice exam again. Given that I’ve never successfully passed the practice exam, I really wasn’t sure I’d be able to pass the real one.

So at 1:15 PM, I went ahead and checked in for the exam. That process takes a while, and requires you to go through the webcam and microphone check again. Then it requires you to take some photos on your phone. They need a photo of your face, your ID (front and back), and four photos of your workspace. That all went smoothly enough. There’s no phone app for this; it’s all done through a website, which you can get to through a QR code or a text message link.

Once you’ve done all that, you have to put your phone away, so it’s out of reach, then you get put into a queue to start the test. I’m guessing that a human needs to manually review your photos and OK them. Or maybe it’s all fed into an AI thing, and only manually reviewed if the AI fails. I don’t know. It took a while for me to get out of the queue, and there were a couple of notices about connection issues that worried me a bit. But eventually I got through and the test started.

I kind of thought that there might be some required human interaction before the test, either in chat or onscreen via webcam/mic, but there was none. I just got transferred into the test.

There weren’t any unexpected surprises in the test itself. The questions were all pretty similar to what I’d seen in the practice exams. It took me about 30 minutes out of the 45 allowed to finish. And I got my results onscreen right after the exam.

I passed by a pretty reasonable margin, I think. I guess that result is a combination of (1) taking the real test more seriously than the practice tests, (2) having learned something from my repeated practice test failures, and (3) the practice tests being purposely harder than the real test.

So, post-exam, I went to the MS Learn site and downloaded a little PDF certificate, showing that I passed. I couldn’t initially find a detailed report on my score, but I just went back and checked again, and it’s there, on Pearson’s site. So my actual score was 822, where 700 was passing. Info on the scoring and the reports can be found here. I guess that’s 822 out of 1000, so… good enough.

I guess the next step here is to boast about passing the exam on social media. I think there was something on LinkedIn at one point where you could link your MCP profile to LinkedIn and then post a verified link to show that you’ve actually passed. I’m not sure if that’s still there, or if I’m even remembering that correctly. So I’ll want to look at that. And I kind of remember at one point that if you tagged MS Learning in a tweet about passing an exam, they’d retweet it and congratulate you. So I should see if I can do that. (Though I’m mostly staying off Twitter these days, for obvious reasons…)

I’ve already sent the scoring report to the person at my company that sent me the exam voucher. I guess that having a certain number of certified professionals on staff does something to help us maintain our partner status, or something like that. I know that we keep track of it.

I don’t really get much, personally, out of passing this exam. I’m not looking for a new job, and if I was, it wouldn’t be as a Power Platform guy anyway. And I don’t get a raise or bonus for doing it. But it was kind of fun and interesting to do. It’s been so long since I’ve had to take a test that it felt kind of weird to do it.

On the broader topic of continuing education, I’ve got a lot of stuff going on. This post is getting pretty long, so I’m not going to get into any of that here. Maybe I’ll write up another post over the weekend.

(UPDATE: Since I first published this, I’ve figured out that I can share a certified link to the certification through a site called Credly. So here’s the official link. So now you know I’m not lying about all this.)

getting authentication tokens from MSAL via PowerShell

I have a little PowerShell script that I can use to get tokens from MSAL, for an API project I maintain, and I could have sworn that I’d blogged about it at some point. But I can’t find a post mentioning it. So I guess it’s one of those things I meant to blog about, but never got around to it.

I just rewrote it for a new API project, so I thought I’d blog about that. And since I never actually blogged about the first version, I might as well include that too.

So the first API is an older .NET Framework project. In the Visual Studio solution, I have both the API and a console program that can be used to run some simple tests against it. The console program, of course, uses MSAL.NET to authenticate. (I blogged about that in 2021.) I also like to do little ad-hoc tests of the API with Fiddler, using the Composer tab. But I need to get a bearer token to do that. There are a bunch of ways to do that, but I wanted a simple PowerShell script that I could run at the command line and that would automatically save the token to the clipboard, so I could paste it into Fiddler. I also wanted the PowerShell script to read the client ID and secret (and other parameters) from the same config file that was used for the console program. The script shown below does that, reading parameters from the console program’s app.config file, and pulling the actual client ID and secret from environment variables. (All of this is, of course, to avoid storing secrets in any text files that might get accidentally checked in to source control…)

# get-auth-hdr-0.ps1
# https://gist.github.com/andyhuey/68bade6eceaff64454eaeabae2351552
# Get the auth hdr and send it to the clipboard.
# ajh 2022-08-29: rewrite to use MSAL.PS.
# ajh 2022-11-23: read secret from env vars.

#Requires -Version 5.1
#Requires -Modules @{ ModuleName="MSAL.PS"; ModuleVersion="4.0" }

# force TLS 1.2
$TLS12Protocol = [System.Net.SecurityProtocolType] 'Tls12'
[System.Net.ServicePointManager]::SecurityProtocol = $TLS12Protocol

echo $null | clip	# clear the clipboard.

# read the settings file.
$configFilePath = ".\App.config"
[xml]$configXML = Get-Content $configFilePath
$configXML.configuration.appSettings.add | foreach {
	$add = $_
	switch($add.key) {
		"ida:Authority" 		{$authority = $add.value; break}
		"xyz:ServiceResourceId"	{$svcResourceId = $add.value; break}
		"env:ClientId"			{$client_id_var = $add.value; break}
		"env:ClientSecret" 		{$client_secret_var = $add.value; break}
	}
}
if (!$client_id_var -or !$client_secret_var -or !$authority -or !$svcResourceId) {
	Write-Error "One or more settings are missing from $configFilePath."
	return
}

# and the env vars.
$client_id = [Environment]::GetEnvironmentVariable($client_id_var, 'Machine')
$client_secret = [Environment]::GetEnvironmentVariable($client_secret_var, 'Machine')
if (!$client_id -or !$client_secret) {
	Write-Error "One or more env vars are missing."
	return
}

$scope = $svcResourceId + "/.default"
$secSecret = ConvertTo-SecureString $client_secret -AsPlainText -Force

$msalToken = Get-MsalToken -ClientId $client_id -ClientSecret $secSecret -Scope $scope -Authority $authority
$authHdr = $msalToken.CreateAuthorizationHeader()
$fullAuthHdr = "Authorization: $($authHdr)"
$fullAuthHdr | clip
"auth header has been copied to the clipboard."

For my new project, I needed to create a new version of this script, since the new project is in .NET Core, using an appsettings.json file rather than the old XML format app.config file. I’m also now using the Secret Manager to store the client ID and secret.

# get-auth-hdr-1.ps1
# https://gist.github.com/andyhuey/de85972ec0f6268034e5ce46b0278a07
# Get the auth hdr and send it to the clipboard.
# ajh 2023-04-06: new. 

#Requires -Version 7
#Requires -Modules @{ ModuleName="MSAL.PS"; ModuleVersion="4.0" }

# force TLS 1.2
$TLS12Protocol = [System.Net.SecurityProtocolType] 'Tls12'
[System.Net.ServicePointManager]::SecurityProtocol = $TLS12Protocol

echo $null | clip	# clear the clipboard.

$secrets = dotnet user-secrets list --json | ConvertFrom-Json
$clientId = $secrets.'AuthConfig:ClientId'
$clientSecret = $secrets.'AuthConfig:ClientSecret'
$secSecret = ConvertTo-SecureString $clientSecret -AsPlainText -Force

$appSettings = Get-Content appsettings.json | ConvertFrom-Json
$scope = $appSettings.AuthConfig.ResourceId
$authority = $appSettings.AuthConfig.Instance -f $appSettings.AuthConfig.TenantId

$msalToken = Get-MsalToken -ClientId $clientId -ClientSecret $secSecret -Scope $scope -Authority $authority
$authHdr = $msalToken.CreateAuthorizationHeader()
$fullAuthHdr = "Authorization: $($authHdr)"
$fullAuthHdr | clip
"auth header has been copied to the clipboard."

So this one is calling “dotnet user-secrets list” to get the secrets. And it’s using “ConvertFrom-Json” for both that and the appsecrets.json file.

Both scripts are using MSAL.PS for the MSAL call.

One thing that might not be obvious in the second script is that the “Instance” value is formatted like this: “”https://login.microsoftonline.com/{0}” so we’re using the “-f” string format function to pop the tenant ID into that {0} placeholder. (I took that functionality from an online sample I found somewhere, but I may change that around, since I think it just confuses things.) Also, in the first example, I added “/.default” to the $scope variable in the script, while the new version already has that in the config file.

I’m not sure if any of this will ever be useful to anyone but me, but it seems like something that might help someone else out there on the internet somewhere, at some point.

more on Microsoft certification

Since this post from earlier this month, I asked my boss about whether or not the company would pay for a cert exam for me, and I got back not just a “yes” but an exam voucher code, and a code for a free MeasureUp practice exam! Which is great, but now I guess I have to take the exam.

I just noticed this post in my “on this day” sidebar, with a nice photo of the three giant books I bought to study for the three cert exams I was going to take for ASP.NET certification, back in 2010. I only ever took the first exam, then I got too busy with work to study for and take the other two.

I feel like I’m in a similar situation now, except that I’m not even going to find time to study for and take the first exam. I used the MeasureUp code, and got access to the practice test for PL-900. It seems to be identical to the MeasureUp test that I previously got for free through ESI. I took it again, and got less than 60% on it, which is definitely not a passing grade. If I want to pass, I think I need to study up on some areas I didn’t do well in, which are basically the areas that I’m not interested in and that aren’t relevant to my job right now. But if I want to pass the test, I guess I need to learn them. Sigh.

Microsoft certification

I’ve been trying to learn a lot of new stuff lately, including Power Platform, which I’ve mentioned a few times recently. And I’ve been thinking about taking the certification exam for that, PL-900. My company has access to something called ESI from Microsoft, which used to allow us to take MS exams for free. Well, I guess I waited too long on the PL-900 exam, since they changed ESI so it now only provides a 50% discount. And the ESI site used to allow us to take MeasureUp practice exams, but now it just shows us simpler Microsoft-provided practice tests. I’ve seen some talk about both of these changes on reddit, here and here.

Well, at 50% off, the test is only $50, which I can, of course, afford. Thirty days of access to the MeasureUp practice exam is $99, though they’ve got a 30% off sale going on right now. That might be worth it, but maybe not. I haven’t tried the new Microsoft practice test yet, though it seems to be less full-featured than the MeasureUp one.

Anyway, my last Microsoft cert exam was in 2010. It’s so hard to keep up with all this stuff. I’ve been busy enough this week that I haven’t gotten back to any of my “spare time” learning work. If I really want to take (and pass) that PL-900 exam, I need to brush up on a few things first.

Power Platform and Pathfinder

My head is spinning a lot lately, from all the new stuff I’m trying to get up to speed on. I did a full-day App in a Day workshop last Friday, to refresh my memory on how to build canvas apps and model-driven apps for Microsoft Power Platform. I’ve also been working through a lot of the stuff at Microsoft’s Low-Code February site, including the Cloud Skills Challenge, which I completed.

Meanwhile, I also need to try to learn about Dynamics 365 F&O (which isn’t called F&O anymore, but I’m not sure what else to call it). And I started trying to learn Angular a while back, but I keep putting that to the side. My last post about “being overwhelmed by the amount of random stuff I need to learn” was this one from October. Things still haven’t settled down.

And, on the personal side of things, I’m continuing to try to figure out Pathfinder. At this point, I’ve managed to create a character (a half-elf wizard), but really don’t have him fully fleshed out yet. I’ve been reading both the Core Rulebook and the Strategy Guide. And, for some reason, I decided to pick up a hard copy of the Core Rulebook. It’s the “pocket edition,” and the print is too small for me to read comfortably, so it’s mostly useless for me, but I like picking it up and feeling how heavy it is. (Is that weird?) We still haven’t played yet, but we’ve had one organizing session over Zoom (mentioned here), and a second brief session over Discord. I guess we’re going to use a combination of Discord and Roll2o to run the game.

Ten years at SHI

I happened to notice my five year work anniversary post earlier this week, and thought I should write a ten year anniversary post. I hit my ten year anniversary about a week ago. I guess it’s kind of a big deal, since this is only the second job I’ve had that’s lasted this long. The previous one was NMS, where I worked for around 13 years (1996-2009). I probably would have hit 15 years there, if the company hadn’t got out of business.

A lot has changed at SHI since that five-year mark. A lot of those changes happened in 2022. I switched to a new boss, then back to the old boss. There have been a lot of management changes within IT in 2022. And I got promoted to “IT Solutions Manager,” whatever that means. I now have three direct reports, all CRM developers (which is kind of awkward, since I don’t really know our CRM system).

I’m doing less AX 2012 development, and am gradually moving into more Dynamics 365 development. We’re just in the planning stages of moving off of on-prem AX 2012 to Dynamics 365 F&O. And, since the CRM devs have been moved into our group and now report to me, I’m learning about our Dynamics 365 CRM environment. It’s all going pretty slowly, but we’re a big company and there’s a lot going on. (And yes, I know that F&O apparently isn’t called F&O anymore and CRM isn’t called CRM anymore. I can’t keep up with Microsoft’s crazy product naming shenanigans…)

I think there’s a good chance I’ll still be with SHI in five years. (Though I worry that saying that out loud will jinx it…) There have been a lot of layoffs at tech companies recently, but I don’t think SHI is planning any. And it seems like there’s a lot of opportunity there to do interesting work.

I’m realizing now that I’ll be 60 years old in five years, and 65 in ten years. I don’t know if there’s any point in thinking that far ahead, but it seems to me like there’s a real chance I could finish out my working years at SHI.

There’s a lot more I could say about my job right now, but there wouldn’t be much of a point to it. I’m relatively content where I am. There’s a lot of uncertainty, but there’s uncertainty everywhere. I think I have some good coworkers, and I think I’m in a pretty good situation.