buggy iTunes on Windows, and alternatives

Part of my normal work-from-home routine is to fire up iTunes on my personal desktop PC and play music throughout the day. (On and off, depending on what I’m doing, of course.)

My desktop is a Windows 10 box, so I’m still stuck with iTunes. There’s a preview version of the new Apple Music client available in the Windows Store, but I’ve been leery about trying it. I’m afraid it might do something horrible to my local library, which is almost 18,000 songs, and around 125 GB, at this point. I’d prefer to wait until a 1.0 release.

But iTunes has been locking up on me a lot recently. So I got a bit fed up today and decided to give an alternative client a try. I’d previously tried Cider, but didn’t like it enough to keep it. That was a while ago, though, so I decided to give it another try. It used to be an open-source project, and you can still download that, but the new version is (I guess) closed source, and costs $4 in the Windows Store. I went ahead and bought it and tried it out today, so I thought I’d post some notes on it.

First, it’s mostly just a shell around the web interface for Apple Music. So if you go to music.apple.com and sign in to your account, that’s basically what you’re getting, with some added bells & whistles. It doesn’t deal with your local library at all. (I don’t mean to belittle it here; the bells & whistles might be really handy for some people.)

My major issue with it right now is that it’s got a “dark mode” interface, and no way to switch to a light mode. And I find that hard to deal with. So it’s definitely not something I’m really happy with. But it has done what I needed it to do today: let me stream music to my PC without locking up, like iTunes was doing.

It has occurred to me that another solution would be to stream Apple Music from my iPhone to my desktop via AirPlay. I have something called AirServer on my PC, and it works pretty well for streaming audio from my phone to my PC. Though that, also, is not a great solution.

Or I could go back to CDs! I do still have a CD player in my PC. I could just play CDs via VLC or Windows Media Player or something like that…

Oh well, I’m starting to overthink this stuff again. Time to get back to work…

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.)

Smoke

From NJ.com: Wildfire smoke to cause dangerous air quality, darken skies again today.

Yesterday wasn’t great, but today is really bad. I don’t remember air quality around here ever getting quite this bad. I managed a short walk early this morning, but when I tried a quick walk after lunch, it was too bad and I had to give up and go back inside. (And it’s not perfect inside either.) I’m not sure how much of this is due to air quality, but I’ve had a headache all day today and most of the day yesterday. And I’m getting itchy eyes and a rough throat. I may take a nap this afternoon, if I can get away with it.

I think I’m glad that I’m working from home today, but I’m also wondering if my office building’s HVAC system might be doing a better job of filtering out the bad stuff than my apartment building’s HVAC is doing. It wasn’t bad in the office yesterday, but overall it wasn’t as bad yesterday as it is today. I guess that if it’s really bad again tomorrow, I’ll find out how good the office HVAC system is, since I’m supposed to go in tomorrow.

Memorial Day

Well, it’s Memorial Day again. They started assembling the fencing for the Tour of Somerville at 6 AM this morning. I was already up, though, because I’m an old man and I usually wake up before 6 now, whether I want to or not. It’s been relatively quiet outside so far. I went for a morning walk around 7:30. They were just about done with the fencing by then, and most of the tents and banners and stuff were also up. The “family fun ride” starts at 8 AM, in just a few minutes. I’m surprised they haven’t tested the PA system at all yet. Last year, they were doing that quite early, and it was a bit of an annoyance.

I haven’t decided if I’m going to engage with the race much this year, or just stew in my apartment and try to shut it out, which is pretty much what I did last year. I’m still on my Wheel of Time kick, and I’m well into book three, so I may spend the day reading, and ignore the race. If it gets really crowded outside (and I suspect it will), that’s probably what I’m going to want to do. I’m not as afraid of COVID as I was last year, but I’m still not enthusiastic about getting mixed up in a big crowd. I might try to venture out and buy a race t-shirt, if I can, but I’m guessing the t-shirt stand will probably be on the other side of the street, which will make it hard for me to get to.

I’m actually starting to feel a bit stressed just thinking about crowds right now, so I don’t know… I’d like to get into the spirit of things, but I’m not sure I can. Meanwhile, I’ve got WPRB playing, and the show on right now is called “The Cosmic Mosh,” so that’s fun. A little metal at 8 AM on a holiday is nice…

Getting Deeper into The Wheel of Time

I finished reading The Eye of the World yesterday. I liked it a lot, and got through it fairly quickly, considering the length of the book and how slowly I usually read. Here’s my Goodreads review.  I noticed yesterday that the books has almost half a million ratings and 20,000 reviews, so I’m pretty sure no one is ever going to stumble across mine on the site, so I might as well link it here.

Per my last post on WoT, this series has activated that part of my brain that likes to go down rabbit holes researching a thing, shopping for stuff, and spending more time on that than actually reading the books. But I did finish the first book, so I’m patting myself on the back for that! Meanwhile, Amazon sent me $5 off coupons for most of the series, so I went ahead and bought the Kindle versions of books one through eleven. I find it hard to imagine myself actually reading my way that far into the series, but, well, I’ve got them in my “official” Kindle library now, at least.

I also paid $7.50 for the “Audible narration” add-on for the first book, in case I want to re-read it at some point, in audiobook format. I assumed that would get me the newer Rosamund Pike version, but instead it got me the older Kate Reading and Michael Kramer version. (Which is fine, since that one is also supposed to be pretty good. Though Pike won an Audie for her version, so maybe I should pick up that version too, and listen to them both… You see how quickly I spiral out of control with these things?)

I may start reading the second book, The Great Hunt, today, since it looks to be a quiet Sunday, and I have nothing much else to do. And I’m interested to see where the story goes. As I’ve said before, I expect that I’ll lose interest in this stuff at some point, but I’m not there yet.

As I read the first book, I followed along with the Reading The Wheel of Time blog post series at tor.com. I’ll likely continue that habit with the next book. It’s fun to connect with other people’s opinions and enthusiasm for a series like this, and there’s quite a community around WoT.

And, as usual with these things, I’ve gotten side-tracked on a couple of fiddly little technical things. First, I started reading Eye of the World from the EPUB file that I got from Tor a long time ago (as mentioned in the previous post). But then I bought the “official” Kindle store version, and switched to that, at about the halfway point in the book. That got me thinking about whether or not I could transfer my highlights from the EPUB to the Kindle store version. Short answer: probably not. But I might hook my Kindle up to my PC via USB today and see if I can copy all of the highlights into a text file and then stick them in Evernote, just for yuks. I could go off on a tangent here about a couple of services I found that automate (or semi-automate) pulling your notes & highlights from the Kindle into other systems, but I’m going to avoid going down that hole right now.

Second, I’ve been thinking about better ways to deal with the tor.com blog post series. The first book had twenty posts, usually covering 2 or 3 chapters each. To read them, I was simply keeping a tab open in Firefox on my MacBook, and never closing Firefox. (That’s unusual for me. I always close Firefox when I’m done, and I don’t have it set to reopen previous tabs on launch.) Then, I would just go back and forth from the series page into the individual posts. And I was keeping a note in Drafts to keep track of how far I had to read in the book before reading the next post. So it was a workable system, but a little weird.

For the next book, I was thinking I could open all of the articles, send them all to Instapaper, in a new folder, and then read them from Instapaper, deleting them as I finished them. If I did that, I’d probably read them on my iPad, so I’d be switching back and forth between the Kindle and iPad. Or, there’s an RSS feed on the series page, so I could subscribe to that in my RSS service, The Old Reader, and then read them from Reeder on my iPad. Or, I could put the RSS feed into Calibre and send the articles from there directly to my Kindle. Or… there are a bunch of things I could screw around with here. You see where things start spiraling out of control for me when I go down these rabbit holes… But I guess it keeps me out of trouble, mostly.

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.

Wheel of Time

My Pathfinder fixation is on hold for now. I haven’t quite given up on it, but my brother still hasn’t started our campaign up, and I’m a bit tired of reading the rulebook. So now I’m on a Wheel of Time kick. It started out as an offshoot of the Pathfinder kick. You see, I’d read the Pathfinder comics that I had in my collection, and that led me to reading the Wheel of Time comics I had, since both were published by Dynamite and part of the same Humble bundle from a long time ago.

And now I’ve finished reading those, which serve as an adaptation of the first Wheel of Time novel, The Eye of the World. Then, I remembered that Amazon has a Wheel of Time TV show that I hadn’t watched yet. So I watched that.

And then I remembered that I have an ebook for the first novel that tor.com gave away for free some years ago. So now I’m reading that. It’s not a short book, and will likely take me a while to finish.

I also have an ebook of the complete Wheel of Time series, all fifteen books, that I got as part of the Hugo packet from 2014. I’m not sure if it’s morally OK for me to read that now, though. The purpose of it was to let Hugo voters read all the nominated works, and I didn’t get around to reading it then. So, if I want to read it all now, I should probably buy the books.

There’s a Complete Wheel of Time ebook available for the Kindle, but it costs $163, which is more than buying the 15 books separately, so that’s kind of weird. Well, it’s going to take me a while to read the first one, and I don’t know if I’ll really want to keep going, so best not to worry about that until I’ve finished the first book. I think a lot of the ebooks are available from my library, so I can always go that route.

I’ve also been enjoying dipping my feet into some of the nerdery surrounding the Wheel of Time. There’s a ton of stuff at the Tor site about it, including this series from someone who is reading the series for the first time, and this series from a different writer, who did a re-read of all the books. I’ve also listened to a number of episodes from the Dragonmount podcast, which were fun.

I’m not sure why it took me so long to give this series a try. I guess I used to be more of a snob about certain kinds of books, particularly “epic fantasy” books. But I’m kind of OK with this stuff now. I enjoyed the comics and the TV show, and I’m liking what I’ve read of the first book so far.

Speaking of snobbery about epic fantasy, Wired published a profile of Brandon Sanderson recently, and it’s gotten a lot of negative feedback from Sanderson fans. (Sanderson wrote the last few Wheel of Time books, after Robert Jordan died.) I’m not sure how I feel about Sanderson, since I haven’t read anything from him, and don’t know much about him, but the profile makes it seem like he’s a pretty decent, down to earth, guy. (Which seemed to be a problem for the guy who wrote the profile…) Sanderson responded to the kerfuffle on Reddit, and his response reinforces my impression that he’s probably a decent guy. I don’t know if I’ll ever make it far enough into the Wheel of Time series to read that ones that Sanderson co-wrote, but I’m curious.

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.

Get Back to Work

From Tom Tomorrow, via The Nib: Meet the Old Boss. This is from 2021, but I stumbled across it again today, and thought I’d link to it here, just for yuks. I guess the deluge of “work from home” vs. “return to office” articles that I saw in the news back in 2021 and 2022 has mostly died out. I don’t recall seeing much about it lately, but I’ve been thinking about it, since we just hit the three-year mark on the start of the pandemic WFH period.

I’m still on a hybrid schedule, two days in the office and three days from home, and I hope I get to stay that way. Today was a work from home day, and I had no meetings today and no tech support emergencies, so I actually got a lot done! And I can stop working and go straight into cooking dinner right at 5 PM!

See also: work from wherever, from 2022.