New Year’s Day 2026

Well, here we are, with another New Year’s Day post. I’ve been doing these posts since 2008 or thereabouts. It occurs to me now that I should create a category for these posts, so I can see them all together. So I just did that. The category is NYD, and I have added it to all (or most) of my previous New Year’s Day posts.

Health

2025 was a bit of a rough year. Honestly, it didn’t start well, and it didn’t end well. I started the year sick, and I ended the year sick. There were a good number of healthy days in between, of course, but right now I’m fighting a cold (or flu or whatever) that’s been on and off since Thanksgiving. And I had my second bout of COVID in 2025, in July. That was unpleasant.

Travel

I don’t think I left NJ at all in 2025. No trips to NYC or anywhere else. I didn’t even go too far within NJ. I finally closed my E-ZPass account and returned my tag last month. I hadn’t used it since 2019.

Weight

I started the year at 165 pounds, and ended it at 167. (It’s gone as high as 169, but hasn’t stayed that high for more than a day or two.) I’d hoped to keep it at 165, but I haven’t quite managed to do that. In 2024, I went from 160 to 165, and the year before that, from 150 to 160. So I’ve cut my yearly increase from 10, to 5, and to 2 pounds. So that’s progress!

Exercise

It’s kind of funny that Apple Fitness doesn’t have a fancy “year in review” function the way so many other apps/services do. Going into the Health app, and looking at some yearly graphs, here’s what I see:

  • I’m averaging around 500 move calories per day over the last year.
  • I’m getting an average of 7800 steps in per day.
  • I’m averaging 28 minutes per day of exercise.

I also just downloaded an app called Fitness Wrapped, which is supposed to generate a year-in-review, but it requires payment before showing me the 2025 summary. It looks interesting, but I don’t know if I want to pay for it.

Either way, I think I did fine on exercise in 2025. It seems to be down from 2024 (550 move calories and 45 minutes exercise per day), but it’s fine.

Work

We didn’t do performance reviews this year, but I did get a small raise. It was slightly bigger than 2024’s raise, but smaller than 2023’s, for what that’s worth.

In January 2025, I transitioned to a new boss. (My previous boss is now my boss’s boss, so he’s moved up a bit.) The new boss is someone I’ve worked with for years, and I think we have a good relationship. It can be hard to tell, when you don’t have a formal performance review or any other structured review, but I think I’m doing OK.

Learning

My 2024 performance review included a goal (from my previous boss) that I pursue a SAFe Certification. I wasn’t that enthusiastic about it, but I figured I should give it a try, so I did a bunch of e-learning around it, including a long series of videos on O’Reilly Learning. The cert exam is pretty expensive, and I never got an OK to go through with it, so I dropped it at some point and concentrated on other stuff.

I also mentioned in interest in pursuing an AZ-204 certification in my New Year’s post for 2025. I did actually go through with that one, and two other Microsoft certs. I passed the AZ-900 in April, the AZ-204 in June, and the GH-300 in December. So I’m a bit proud of getting all of that done.

This year, I’ll need to renew the AZ-204, if I want to keep my “Azure Developer Associate” status. I have until June to do that. And the renewal test is simpler than the initial one; you can do it without all of the Pearson OnVUE nonsense. So I’ll probably do that.

Books

Now onto some fun stuff. My Goodreads 2025 reading challenge shows me as having read 60 books. I think it was actually more like 50; the challenge picks up stuff from my Kindle that it probably shouldn’t, but I’m not going to try to clean that up.

I finished reading A Memory of Light in January, so that finished up the Wheel of Time series that had taken up so much of my time in 2024. I didn’t take on a similar project in 2025; I just read a bunch of random stuff, really.

  • I read a few Robert A. Heinlein novels that I thought I hadn’t read before, but which I discovered that I had read, probably in my teens. So that was interesting.
  • I was going to read a few Kurt Vonnegut books, but I see I only read one, Breakfast of Champions. Maybe I’ll get to a few more this year.
  • I managed to finish The Stand, by Stephen King, which I’d started in 2019, and then abandoned. That’s a very long book, and took a good chunk of time to get through.
  • I got on a Star Trek kick near the end of the year, and finished the Rise of the Federation series. I also started the Prey series. I’m almost done with that. (I was going to try to finish off the last book yesterday, but didn’t quite make it.)
  • I didn’t do a lot of self-help reading this year. I did finally manage to read How to Win Friends and Influence People, but that’s about it.
  • And I didn’t do much book reading for professional purposes. I read one random book on AI, and started another. I’ll probably mark that second one as “abandoned” on Goodreads and give up on it. I wasn’t getting much out of it. At this point, I guess I’m mostly doing all of my professional learning in video form, via O’Reilly and Pluralsight.
  • My comic book reading this year was pretty random. I read through a few volumes of Greg Rucka’s Lazarus series. I’m enjoying that, and should get back to it soon. I read all three volumes of Ed Brubaker’s Velvet series. I really enjoyed those too.

For next year, I’d like to maybe make some progress on my backlog of Dresden Files novels, Laundry Files novels, or maybe Discworld. (I said the same thing in last year’s post, and didn’t do any of that. So maybe in 2026.)

Summary

2025 felt like a “let’s just get through this” kind of year. I don’t blog about politics much, but… geez. And my health has been up and down. I’m hoping 2026 will be better, on several fronts, but I’m not sure it will. I’m pretty sure I’ll get through it though. I’ll end with links to a couple of funny New Year’s Day comic strips: Over the Hedge and Lio.

Evernote to Obsidian, work in progress

As per my previous post, I went ahead and migrated myself from Evernote to Obsidian yesterday. I’m now almost at the point of no return. (Or at least at the point where I’d have wasted a lot of effort if I were to throw it away now and go back to Evernote.)

I used Yarle for the migration. I’d done several experimental, partial, migrations first. For the final migration, I did all of my Evernote notebooks all at once. (I had a thought in my head that Yarle might resolve cross-notebook links if I did that.) The migration went pretty smoothly, but Yarle seemed to lock up at one point. I checked the count on the output files, and it seemed like it had created all of them, so I did an “end task” on it and proceeded from there.

In the end, I’ve wound up with a lot of broken links. I’m starting to wonder if killing the Yarle process was a mistake. Maybe it had created all of the .md files, but was still reconciling the links? I don’t really know enough about how Yarle works.

Either way, I’m now cleaning up hundreds of broken links. With the broken links plugin, I’m able to at least identify them easily. There are actually two different kinds of broken links in my vault now: there are many ‘regular’ broken Markdown links; I can ID those with the plugin. Then, there are links that point out to share.evernote.com, which didn’t fully get converted to Markdown links. Those are technically ‘valid’ links, but of course they open up my original Evernote notes in a web browser, so I’ll need to clean those up too.

I started doing the link cleanup manually, but at some point, I saw how big the job was getting, and decided to write a couple of helper scripts. With the help of Kagi Assistant, I wrote two PowerShell scripts. The first cleaned up links where Yarle had left them in a format like this:
[[guid/guid|name of link]]
In that case, I wanted to change them to:
[[name of link]]

Here’s the script I used:

 Get-ChildItem -Recurse -Filter *.md | ForEach-Object {
    $content = $_ | Get-Content -Raw
    $new = [regex]::Replace($content,
        '[[[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}|([^]]+)]]',
        {param($m) "[[{0}]]" -f $m.Groups[1].Value},
        'IgnoreCase'
    )
    if ($new -ne $content) {
        $_.FullName                    # show changed file
        Set-Content -NoNewline -Path $_.FullName -Value $new
    }
 }

And for the second case, I wanted to clean up the external Evernote links, like this:
[name of link](https://share.evernote.com/note/guid)
To again change them to this:
[[name of link]]

So here’s that script:

Get-ChildItem -Recurse -Filter *.md | ForEach-Object {
    $content = $_ | Get-Content -Raw
    $new = [regex]::Replace($content,
        '[([^]]+)](https?://share.evernote.com/[^)]+)',
        {param($m) "[[{0}]]" -f $m.Groups[1].Value},
        'IgnoreCase'
    )
    if ($new -ne $content) {
        $_.FullName                    # print the altered file
        Set-Content -NoNewline -Path $_.FullName -Value $new
    }
}

I didn’t even really test these scripts, I just backed up my vault, then ran them. And, surprisingly, they seemed to work right on the first attempt.

So that got me through most of the link cleanup. I then did a bunch of manual fixes, and just kept going until the “broken links” list was empty.

(I may have mixed up my tenses in this post. I started writing it as I was working on the migration, and finished it after I got all the link cleanup done. Sorry.)

My next task will likely be attachment cleanup. I guess that’ll go in yet another blog post!

GitHub Copilot GH-300 exam

I took and passed the GitHub Copilot GH-300 exam last week. That’s the third Microsoft exam I’ve passed this year! (The others were AZ-900 and AZ-204.) This exam was pretty easy. I did these two learning paths from Microsoft:

…and that was it, really. I worked through some of the example projects. And I made a point of trying to use GitHub Copilot for some stuff at work over the last couple of months.

Overall, I’m not that impressed with GitHub Copilot. It’s cool when it works, but when it gets confused, or gives me bad info, then I feel like I’ve wasted my time. Generally, for most stuff, I’ve found that searching Stack Overflow gets me better results than asking Copilot.

I haven’t found a single case yet where trying to get agent mode to do something even mildly complicated produces good results. I have, of course, already hit the issue where agent mode insists that it’s doing something, when in fact it is not doing anything. That’s frustrating. And once it’s gone down that path, you really can’t convince it that it’s lying/hallucinating/whatever.

Maybe I just haven’t learned all the ins and outs of prompting it yet. I’ll keep trying. I’m still not quite “drinking the Kool-Aid” on all of this AI stuff. There’s a lot of overblown hype out there. I do think there’s some usefulness to it, but it’s not as powerful as some people think it is.

Fun With Windows Sandbox

I managed to solve a problem using Windows Sandbox a while back, and I thought I should blog about it.

The basic problem was this: I needed to run a PowerShell script that relied on a specific combination of old modules. It had to be run in the old Windows PowerShell, not PowerShell 7. I had originally hoped that I could find some way to set up a PowerShell sandbox of sorts, but there didn’t seem to be an obvious way to do that. So then I started looking into Windows Sandbox.

We start with a .wsb file that defines the sandbox. Mine looks like this:

<Configuration>
  <Networking>Enable</Networking>
  <MappedFolders>
    <MappedFolder>
      <HostFolder>\\my-pc\c$\dev\Projects\myproject</HostFolder>
      <SandboxFolder>C:\myproject</SandboxFolder>
      <ReadOnly>false</ReadOnly>
    </MappedFolder>
  </MappedFolders>
  <LogonCommand>
    <Command>c:\myproject\myfolder\sb-start.cmd</Command>
  </LogonCommand>
</Configuration>

This maps \\my-pc\c$\dev\Projects\myproject from my dev VM to C:\myproject in the sandbox.
And it runs c:\myproject\myfolder\sb-start.cmd once the sandbox starts.
I had a little trouble getting all of this right. I really wanted to have the logon command set up the PowerShell environment fully, and maybe even run my script, but that didn’t work.
So the startup command file just has this:

cd C:\myproject\myfolder
explorer.exe .
powershell.exe -executionpolicy unrestricted -command "start powershell {-noexit}"

So it starts Explorer and PowerShell, pointing at my work folder. Good enough.
Then, I manually run a script I call sandbox-setup.ps1, which looks a bit like this:

Write-Warning "This script installs the modules needed for the weird old script." -WarningAction Inquire
Set-ExecutionPolicy RemoteSigned -Force
Install-PackageProvider -Name NuGet -Force
Set-PSRepository PSGallery -InstallationPolicy Trusted
Install-Module -Name WeirdModule -AllowClobber -Scope CurrentUser
Install-Module -Name Az.Accounts -RequiredVersion 2.9.1
Install-Module -Name Az.KeyVault -RequiredVersion 4.6.1

And then I can run the actual script. It produces a .CSV file, which is written to the mapped drive, so I can shut down the sandbox after running the script.

On the one hand, this feels like a kludgey way of doing this. On the other hand, it’s the simplest way I could think of. For more info on running PowerShell scripts in Windows Sandbox, see here.

playing with AI and enjoying sports

OK, so that’s two completely different topics, but I’m going to throw them together in one post. I’ll start with AI.

At work, I’m still very limited in the AI tools I can use: basically, just Copilot and our own internal chatbot. (And it’s just the plain Copilot chat that I can use, not GitHub Copilot.) I’ve been wanting to experiment with some of the coding tools that are out there, so I decided to try some stuff out on my (personal) laptop. I was going to try Claude Code first, but I decided that GitHub Copilot would be easier for me to set up.

I started by enabling it in my personal GitHub account, and setting up the extension in Visual Studio Code. Then I tried something simple: asking it to write a “hello world” console app in C#. It did that successfully, but of course that’s a pretty low bar. I then tried to get it to help me create a git repo for the project. That worked, but it didn’t create a .gitignore file , so all of the binary output files got added to the repo. When I pointed that out, it apologized and created a .gitignore file, but it didn’t really offer me any help with cleaning up the mess it created. And, while the .gitignore file it created was “good enough”, it was a little questionable.

So I stepped back a bit, deleted the git repo and the .gitignore file, and tried again in Visual Studio 2022. I went through the usual steps in VS 2022 to initialize a git repo, and that created the usual VS .gitignore, so that was a lot cleaner than what Copilot did. Then, I set up Copilot in VS 2022. It probably works a bit better in VS 2022 over VS Code, at least for me.

I had Copilot in VS 2022 make a few little changes to the program to see how it worked. I had it add a line to output the current date and time, and that was simple enough. I then had it add some code to show the operating system and version, and that was a bit dicier. I had to coach it through making changes so that the program would actually output “Windows 11 Pro” instead of Windows NT or Windows 10.

So my opinion on this stuff hasn’t changed much. It’s interesting, and can be useful, but it’s wrong about half the time, and it’s often no more efficient than just doing an internet search and copying something from Stack Overflow. I kind of want to try it on something bigger, but I’m not sure what I should try.

On the sports topic: as per my last post, I signed up for NFL+ Premium recently, and have been watching some preseason football. The annual Jets/Giants preseason game is tomorrow night. That’s usually fun.

I’m still not sure what I’m going to do about the new ESPN service. I’ll have to look at the price for switching my Disney+/Hulu/ESPN+ bundle to include the full ESPN.

And I’m still planning on skipping the new Fox service, on general principle. Which is a bit tough, since the first two regular season Giants games are on Fox, so I won’t be able to watch them. My plan, for now, is to watch NFL RedZone (via NFL+) on Sundays and see if that’s good enough to keep me entertained and show me enough of the Giants game.

I’ve been looking into RedZone a bit; it’s interesting. It seems to be quite popular. I’d been aware of it previously, but have never watched it or really learned anything about it. There’s been some concern about what will happen to it after the NFL/ESPN deal goes through (assuming it does). That shouldn’t affect anything this season; it should be at least a year before that’s finalized.

Meanwhile, I’ve watched a lot of Phillies baseball this week. I’ve just been in the mood for baseball instead of, really, anything else. They’ve lost their last three games, so that’s disappointing, but I still like watching them.

Frustration

I have a bunch of stuff on my mind, and a few topics for blog posts I want to write. But I’m going to start with a little decompression about my work week. (I should first say that I need to be careful about this, since our policy on blogging about work has been tightened up recently. But none of this will come anywhere near to violating it, I think.)

We’re working on an upgrade to our AX environment right now, and we started some testing in a new test environment this sprint. This includes (for me) getting some web services working on the new test server, and getting them to point at the new AX test env. So a lot of my time this week has been spent whacking away at web services with a hammer, trying to get them to work. That’s always frustrating. It always seems like I need to try six different things until I finally hit on the one that actually fixes the issue. And I always feel like an idiot for not being able to get there faster.

I’ve been thinking about why this kind of work is frustrating, and I think a big part of it is having no clue how long it’s going to take, or how close you are to solving it. With certain kinds of work, you can break a problem down into parts, and work through them, so you know when you’re 10% done, or 30% done, or 80% done. But with this kind of troubleshooting, you don’t know if you’re going to need to try 5 things or 10 things or 20 things before you find the right thing. And you don’t always know if there’s one thing wrong, or two things, or ten things.

I won’t get into details on the actual issues I hit, but I will say that one of them was basically a new permutation of this issue I hit back in 2011, so it was fun to see that again! And another one was related to the topic of this post from 2020.

I’ve been using AI tools to help me with this work, and I’m not sure if they’re any more useful than just plain old internet searching. Sometimes it seems like they are; I can get a lot of seemingly-useful ideas from a chat with Copilot. But then the real answer comes from a simple search that leads to a Stack Overflow question/answer, or a GitHub issue. (For instance, one big problem I had this week was solved by reading through this GitHub issue from Microsoft’s WCF repo.)

My big project for this afternoon was working on a side-project for a little competition we’re having at work. (It’s one of those things where small project teams propose something, do a little work on it, then present it to the CIO. And then I guess the winning project actually gets green-lit.) That project is turning out to be a bit frustrating too. (It was supposed to be a nice break from the frustrating stuff!) First, I needed to get myself set up under our corporate developer account with one of the big package carriers, which we only managed to get done yesterday. And I’m still not completely set up, to where I can do what I actually need to do. But I can start testing, so I started work on that.

The project involves using the carrier’s webhook API for package tracking. My idea was to start out with a simple Azure function that I could point the webhook at. Then, to start, I’d just log the info I got from the carrier. The next step would be to hook that Azure function up to some kind of queue in Azure. Then, after that, writing another Azure function that would pick stuff out of the queue and send out notification emails. Basically, I was going to put my AZ-204 skills to work on a real project! (Well, not entirely real, but a POC at least.)

It took me the whole afternoon to get a simple Azure Function set up. I started out trying to use Copilot chat with GPT-5, which they rolled out yesterday, to help me out. That looked really impressive, showing me status info about what it was doing, and generating a lot of text with pretty specific instructions. But it seemed to be giving me quantity over quality. I turned GPT-5 off, and then managed to get a lot farther.

My initial idea was to just enter the C# code for the function directly in the Azure portal, but I set it up in isolated mode, which apparently doesn’t let you edit code directly in the portal. So then I tried using Visual Studio Code, which is supposed to be an easy way to quickly develop and deploy Azure Functions. That led me down a path of installing a bunch of stuff locally. I was initially doing this on my laptop, so I had to install .NET SDK 8, plus a bunch of VS Code extensions. At some point, I got nervous about how much stuff I was installing on my laptop, and switched over to my regular dev VM, which is where I’m supposed to do development. So then I had to install all that stuff there too, since I’d never installed the .NET 8 SDK there, or set up VS Code for Azure dev. So I probably killed an hour just getting my environment set up.

And then, once I had everything set up, I started hitting a bunch of weird little snags with editing, compiling, and running the function. I eventually gave up, and with some help from Copilot, set up the simplest Azure Function project I could, entirely from the command line, then got it running and uploaded to Azure. So that probably took another hour, and the end result was just something that would print “Welcome to Azure Functions!” when you hit the URL for the function.

After that, I got the thing working in VS Code, and managed to change the function from a GET to a POST function. And I thought I had gotten far enough with it that I could hit it from the carrier’s test page, but all I can get back from that is an error, with no details giving me any clue what’s wrong. And that’s pretty much where I ended my week.

I don’t really drink anymore, but I think I kinda want a beer right now. Or maybe just a bowl of ice cream.

passed the AZ-204 exam

I’ve posted a few times recently about my efforts to study for the AZ-204 exam. TL;DR: I passed the exam today!

I’d scheduled it for today, back in May, using a free voucher that expires on June 30. So I had to schedule it before then.  I was pretty sure I wasn’t going to be ready for it, so the plan was to take the test today, fail it, and then use the score report to figure out where my strengths and weaknesses were, then come back and take it again in a month or two, after doing some targeted studying.

But I managed to eke out a passing score: 707 (where 700 is passing). So, just barely, but good enough.

These tests always take a lot out of me. I’m not sure why. I’ve always been like this. I used to get physically sick before big tests, back in high school. I managed to figure out how not to do that, or I never would have made it through college. But even, oh… 40 years later, I still get stressed before a big test. These days, of course, I don’t need to take very many tests.

I’m not really sure where I’m going to go next, in terms of learning and certifications. I was really assuming I’d need to keep working on the AZ-204 material for the next couple of months. Maybe I’ll just take a break and watch a lot of TV and read a lot of comics over the summer. Then get serious again in September!

mixed feelings about Microsoft

I’ve been having a lot of mixed feelings about Microsoft lately, and I feel like I need to blog about this, so I can get some stuff straight in my head.

Overall, my feelings about Microsoft have gone back and forth, over the years. At one point, I thought of Bill Gates as being pretty darn evil. After his retirement, and his reinvention as a philanthropist, I softened up on him a bit. I never liked Steve Ballmer. And I liked Satya Nadella quite a lot, in the beginning, and even read his book, but I’m starting to have mixed feelings about him. So that’s the CEOs.

As for operating systems, I tolerated MS-DOS and Windows 3.1, and knew I had to learn and use them, but never much liked them. When Windows 95 came out, I was actually kind of excited about it, enrolled in the preview program, and installed it on my home machine, from floppy disks. My enthusiasm for later Windows versions has varied. I do mostly like Windows 10, which is what I’m running on my home desktop PC right now.

And as a programmer, I’ve also gone back and forth. I liked classic ASP when that was released. And I liked ASP.NET, and .NET in general, when that came out. I’ve been an enthusiastic .NET developer since 2002.

Microsoft Build was this week, and I (as usual) registered for the online component of the conference, and tried to watch some of the content. Honestly, I couldn’t find much of interest to me. They’re really pushing AI, and, while I’m not entirely against it, I’m also just not as enthusiastic about it as they’d probably want me to be.

Watching this week’s Windows Weekly reminded me of some of the issues I have with Microsoft right now. First, MS is having issues with employees protesting during events, mostly around Israel/Palestine, and I don’t think they’re handing that well. (And here’s something from Brian Eno about the issue.) Second, I don’t think the layoffs they did recently were necessary, or handled well. Third, they had Elon Musk on stage during the Build keynote. (I don’t think I need to say why that’s bad…) Overall, they’re doing what I guess I should expect a giant tech company to do, but, well, I was hoping for better.

So, where does that leave me? Well, I still need to use Microsoft products for work, and a big part of my job is supporting our relationship with Microsoft, so I still need to be invested in the ecosystem. I registered for the AZ-204 exam today, for the end of June. (I blogged about that recently here.) I still have a lot of studying to do, to prepare for that. So, in general, I’m still going to keep learning and trying to keep up with this stuff. I can’t give it up and switch to Linux.

On the home front, I’ve been thinking about what I should do about my ten-year old Windows 10 desktop PC. It’s still my main machine, and it still works fine. With Windows 10 reaching end of support in October, I need to do something, but I can’t decide what to do. I might decide to subscribe to a third-party update service for Windows 10. That’s probably a little risky, but might be my best choice.

I’ve also been playing around with the idea of switching the machine over to Linux. That’s probably a horrible idea, but I kind of want to do it. There’s a campaign going on to encourage switching from Win 10 to Linux, and that’s what put the idea into my head. I would really still need to run Windows, though, so I’d have to figure out if I could make do with using my Lenovo ThinkPad for all my Windows stuff, or if I could dual-boot the desktop machine, or run Windows in a VM, or something. Regardless, I would just be complicating things and making life harder for myself. (Which doesn’t usually stop me from doing something stupid, but…)

My other thought was getting a Mac Mini and trying to gradually move my home stuff off Windows and onto Mac. That’s a lot more doable. (I already have a MacBook and use it for a lot of stuff.)

Well, this post has been a mess, and I don’t think I’ve decided on anything. But maybe I’ve moved forward a bit with my thinking. I going to leave it there, and try not to worry about it too much right now.

Programming for Dynamics AX 2012 in 2025

Yes, it’s 2025 and I’m still writing X++ code for Dynamics AX 2012. Sometimes, there are hurdles when you have to write code in an almost dead language for an almost dead product, and you’re trying to get information from the internet. I thought I would take a quick break and write a blog post about that.

First, the state of internet search, in general, is kind of rotten right now. That’s well-documented. And when you’re searching for information about an almost-dead product, it gets harder.

In terms of search engines: at work, I can generally use Bing, Google, and DuckDuckGo. None of those is blocked, though I can only log in to a Microsoft account, not a Google account. So whatever advantage there is to having your search history saved, I can only get that with Bing.

(At home, I’ve been experimenting with Kagi. That’s blocked at work, so I can’t use it there. I may be writing up a blog post on Kagi soon, but that’s for another day.)

I haven’t seen any advantage to using one search engine over another when searching for Dynamics AX content. I think Google is probably the best, to be honest.

A few general observations:

    • Microsoft documentation for AX and X++ is usually still out there, somewhere, on Microsoft’s site, but it doesn’t always surface near the top of any given search. A good starting point for that might be here.
    • AX lives on as “Dynamics 365 Finance and Operations”, or… something like that. Some of the documentation for FinOps also applies to AX 2012. A good starting point for that is here.
    • Axaptapedia used to be a good resource for AX info, but it seems to be gone. It does occasionally still show up in search results. You may be able to find it on archive.org. (Though that’s another thing that’s blocked at work. Sigh.)
    • There are a lot of AX-related blogs out there. Most of them are dead at this point, but still up on the web. And many of them were never really much good. Some were just cash grabs, scraping info from other blogs and sticking Google ads on them and hoping to make some money (presumably). Some were well-intentioned, but provided questionable advice. You can still find some useful blog posts out there, but you need to sift through some dross to get to the useful stuff.

Aside from using search engines, you can also try to get useful information about AX and X++ from LLMs, like ChatGPT and Copilot. I’ve had some success with that, but I’ve found that LLMs are prone to a lot of hallucination when it comes to X++ code. (Again, there are limits to the LLMs I’m allowed to use at work. I’m basically limited to Copilot and our internal LLM chatbot.)

I’ve recently been working on a problem, trying to optimize some fairly complex X++ code. I got some fairly useful advice and assistance out of our chatbot, but also some entirely wrong information. For instance, I needed to review some stuff about X++ collection classes. Our LLM hallucinated a few functions which would be great, if they existed, but they don’t. One was “Global::conSort()” which was supposed to sort a container, and “Set::toContainer()” which was supposed to convert a set to a container. Alas, neither of those exists!

It also gave me some incorrect information about sets. It told me that using a SetEnumerator does not necessarily guarantee that the set will be returned in a sorted, or even predictable, order. But I’m pretty sure that it does always return the set in sorted order. I haven’t found a definitive answer for that anywhere, but here’s a blog post that indicates that sets are returned sorted. And Axaptapedia seems to agree. (And all my testing supports that.)

And here’s one more blog post that has what I think is a pretty good answer:

No matter what order elements are added to a set or keys are added to a map, when using an enumerator to traverse the set or map, the elements are in a sorted order (for string and numeric types). However, the MSDN documentation for the set class states that elements are stored in a set “in a way that facilitates efficient lookup of the elements.” It might not be safe, therefore, to rely on this sorting behavior as it might possibly change in the future.

Good enough for me, for now. So maybe the LLM wasn’t entirely wrong on this, but for my purposes, I’m fine assuming that the output of a SetEnumerator is sorted.

AZ-900 Azure Fundamentals exam

I’ve been messing around with various prep materials for various Microsoft exams for a while now. I go back and forth, but I never seem to get far enough to actually take a test. The ground shifts under me, and I have to switch my focus to something else.

I’d been working towards taking the AZ-204 exam, starting in mid-2024, but I kept getting sidetracked. Well, I got serious about it again recently. But then I realized that there’s some overlap between AZ-204 and AZ-900, and I could probably prep for the AZ-900 in just a few days. I already know a lot of the material on AZ-900, so there wasn’t much extra stuff to learn.

So I spent some time last week studying, then got enough done over the weekend that I felt I could take the exam today. And with the online exams, you can generally get a same-day appointment. So I did that, and passed the exam today!

The process for the online, at-home, exam is pretty much the same as it was in 2023, when I passed the PL-900 exam. The one wrinkle I had this time was that I couldn’t get through the pre-exam system check. Long story short: I had to go into “Windows Features” on my laptop and disable anything related to Hyper-V. They don’t want you taking the exam on a VM, which I can kinda understand, but they also make it impossible to take the exam on a laptop that’s configured as a VM host, which is kinda silly. I also had an issue where the proctor made me wander around my table with my laptop, showing her my entire kitchen table via the webcam, to make sure the table surface was actually clear. And she had me take off my watch. So the prep was a bit of a pain, and took longer than the actual test. I don’t remember the proctor bothering me at all last time.

I paid for the exam myself, using a 50% discount that I can get through ESI (Enterprise Skills Initiative), so it was only $50. I might get reimbursed for it, or I might not. I decided to take this exam without running it by my boss first. I was afraid he might throw some obstacles in my way, and I just wanted to “strike while the iron was hot,” so to speak.

I’ve also rediscovered today that my “test anxiety” problem is still a thing. I’ve always had it. It peaked in high school, where I went through a phase where I would get physically sick when dealing with high-pressure tests (like finals or mid-terms). At some point, I realized what was happening, and got it under control. (There was really no guidance for mental health stuff for teenagers back then, so I’m not sure how I did it. I just figured it out on my own.) Anyway, even taking a dumb little Microsoft cert exam still makes me break out in a sweat, apparently.

I’m probably going to try for the AZ-204 later this year, if I can find the time to finish the prep.