I am afraid I am becoming a workaholic. I keep returning to work or work-related stuff in the evenings now, almost every day. I feel like I can’t get enough done during the day anymore.

Today was my son’s preschool graduation. The whole family went to his very cute graduation ceremony this morning. We had a pizza party in his honor this evening, and my wife made a delicious cake to his specifications (chocolate cake, vanilla buttercream). He is very proud of himself and I am very proud of him.

I watched Apple’s WWDC keynote this afternoon. I am most excited about the new MacBooks because I have been hoping for that kind design since 2020. I really want one, but the closest I will ever get is buying one for my daughter next year to use for middle school.

Ask Micro.blog: Can anyone recommend a good PC game controller for young children? I think my kids' hands are too small for my Xbox controller. There are many choices on Amazon but many seem low quality. I’m planning to set up a retro gaming machine.

My son, the programmer

Today I showed my son how to do a couple things in Python for the first time. We only spent about half an hour on it, but it was a lot of fun. First, I showed him how to to use a Jupyter notebook in Visual Studio Code. We made Markdown and Python cells. For the Python cells, I walked him through a Hello World example. I then had him print out whatever he wanted many times in a for loop. That was the first fun thing I used to do in BASIC on the Apple ][ in school. In a short amount of time, he learned print, for, and range, which is pretty good for a five-year-old’s first lesson. I plan to get turtle graphics (maybe this, I’m not sure) installed on his machine soon.

My current Python project

I have been burning the midnight oil over the past week writing a data validator program—basically a front-end to the PETL validate function—in Python. This would be my third such program, and it is going to be the sort where it can be configured entirely, and flexibly, with configuration files. Theoretically, it should not require coding, or at least not that much coding, to set up validation rules. It has been a fun project thus far, and it is nearing the point where all the pieces will come together.

Lately I have been writing unit tests, and that has been where all the pain points have been. I used to use Python’s standard unittest framework for unit testing, but it requires so much repetitive code that I decided to use pytest instead. Pytest lets you parametrize unit test functions, which reduces code repetition considerably.

I never used pytest before, and ended up spending a lot of time trying to figure out how to get it working correctly. Getting my test module access to the package I’m testing was the first major hurdle. After that I spent a couple hours figuring out that I couldn’t make test fixtures that return lists, and that I couldn’t use text fixtures as test parameters. For the latter, I found a workaround in the form of the pytest-lazy-fixture package.

Today was my son’s first playdate, which has been long delayed due to COVID. We met our son’s friend’s parents, who were very nice, and had a fun cookout this afternoon. I even made coffee ice cream in my new ice cream machine.

Enable Recycle Bin on mapped network drives

My favorite tech discovery of the week was this one: an old TechNet post titled “Enable Recycle Bin on mapped network drives.” This article helped me figure out how to get the Windows Recycle Bin working on my primary documents folder, which is a mapped drive that isn’t really a mapped drive.

For historical reasons, I store my documents on a mapped drive that is actually a deeply nested folder on my hard drive. Several years ago, my company implemented Microsoft OneDrive for file sync, sharing, backup, and so on. While that is great, it did mean that I had to move my folder tree to a very long path. Because I like to use long, descriptive names for everything, I ended up bumping into “file path too long” errors, especially in Excel. Excel will not even open a file whose path is over 256 characters long.

When your Microsoft OneDrive root folder already takes up almost 100 characters, that leaves too little left for me to use. To get around the character limit, I used the [SUBST] command in a startup script to substitute a drive letter (Z: in my case) for a folder on the C: drive.1 The downside of using SUBST is that you get no support for the Recycle Bin2. To get around that limitation, I found that using FAR Manager, rather than File Explorer, as my file manager would actually move files to the Recycle Bin upon deletion. Unfortunately, FAR Manager’s text-only interface and general jankiness led me to abandon it for Double Commander, which is superior for my needs but does not move the file to the Recycle Bin on my mapped Z: drive.

The TechNet post I found describes a way to make a .reg file that will update the Windows Registry and create a new mapped drive to whatever location you want, with full Recycle Bin support. You create the file, run it once, and you are all set. The drive, unlike one mapped with SUBST, will persist across reboots, and it will have full Recycle Bin support.

I love it, and think I should try to write a PowerShell or Python script that will create such mappings without having to edit a .reg file manually.


  1. Believe it or not, but I still remembered the SUBST command from my MS-DOS days in the late 1980s and early 1990s. ↩︎

  2. I take it for granted that it is preferable to have the safety net of the Recycle Bin, in case I delete something accidentally. ↩︎

I did my first workout at my new gym tonight. I am happy I did, and am proud to say that it was not as hard as I thought to get back into cardio and weights again after many years away from them.

Robocopy

Much to my surprise, I have been relying heavily on a very old Windows app, Robocopy, at work the past few days. Part of the work I need to do this week involves moving very large files to and from a network share over a very slow VPN connection. Those file transfers were hosing my file manager, DoubleCommander, so I started doing them from Windows Terminal via Robocopy. It’s a tool I haven’t really used in about 20 years, when I wrote batch jobs to deploy my software or move data files around, but it still works.

It defaults to copying folders, but it is easy to configure the command to move individual files or groups of files. I love how it provides a summary of what it is going to do, and provides a completion percentage as it copies or moves each file.

Tonight, I learned of a feature that I should have been using the whole time: the /compress flag. It will request network compression during the file transfer, if it is available. I will try that tomorrow to see if it speeds up those enormous file transfers I have been doing.

I joined a gym 💪

I joined a gym today. It has been 12 years since I last had a gym membership. Getting to the gym has seemed impossible to me due to work and kids—and then the pandemic. Last weekend, my wife said I should try, and I jumped at the chance. I hope I like it, and can find time to go—probably after my kids are asleep (or, at least, sopposed to be asleep.

I’m setting up a web server for my five-year-old son to play with on an old Raspberry Pi that fell into disuse a long time ago. I was delighted to discover the Raspberry Pi imager exists now to make OS installs a breeze.

Windows PC setup is still a pain

I set up an old MacBook Pro for my son a little while ago, which I finally gave to him today. I set up an old—but, compared to the Mac, far newer and far more powerful—Windows machine today for my daughter. Setting up my son’s Mac was a breeze. Nearly everything was downloaded via the Mac App Store, and I needed one reboot for a system update.

Setting up the Windows 11 machine took a lot more work. To be fair, it was, in one way, easier: almost all the software could be installed and updated on the command line via winget. Most of the updates were handled by one command: winget upgrade --all -h, which is close to the apt update and apt upgrade -y commands I use on my Ubuntu servers. Unfortunately, some packages would not update because reboots were needed, and Windows was very bad at explaining that to me.

Overall, it took about six reboots to get everything updated and to satisfy Windows Update. Sadly, the first time I booted into my daughter’s new account, which was just a few minutes ago, Windows Update requested a reboot immediately, so all the updates may not yet be done.

Overall, my experience Windows has gotten a lot better in the past few years, but it still lags behind the Mac and Linux in some important areas.

Today was the first 90º+ day of the year for us in Central New Jersey. I took my family out for ice cream, and later to the beach, to beat the heat. I think everyone had a great day.

🎧 Sony WH-1000M4 headphones are just OK and that sucks

Listening to the AirPods Max for five minutes in an Apple Store ruined me for other noise-canceling headphones. Not because they sounded good. In fact, I listened to them only long enough to learn that they are bass heavy and exciting. What wowed me about them was the active noise cancellation. It was far better than anything I had ever experienced. It made the din of the Apple Store—all those human voices, which are difficult for ANC to cancel out—go away completely.

Sadly, they are $550 headphones (street price $479) that don’t even have an analog headphone jack, so they are both outside my price range and unsuitable–at least for me—for listening to lossless quality audio. Still, I wanted “industry leading” active noise cancellation, something better than I already have in my fancy Beoplay H9, for the times that I need it.

I read a lot of ANC headphone reviews and came to the conclusion that most reviewers recommend the Sony WH-1000M4 for its sound, excellent noise cancellation, and price. At $300 (street price $279) they are not cheap, but one could buy them and the AirPods Pro for cheaper than the AirPods Max (at its list price). Also, compared to the AirPods Max, the Sony WH-1000M4 is lighter, folds into a small, protective case, and has a headphone jack for wired listening.

I received them and immediately discovered that I don’t love them. They are fine, but that is disappointing to me. Perhaps they are overhyped by reviewers. Perhaps I am asking too much from them. For whatever reason, I, unlike most people, I guess, think they fall short of greatness.

This is my list of complaints that should serve as a counterpoint to all the glowing, uncritical reviews.

  1. They sound good, but not great. The nearest analog to them that I own is another Bluetooth ANC headphone, the Beoplay H9, which sounds punchier, tighter, brighter, and more exciting than the Sony WH-1000M4. I have three non-Bluetooth headphones that sound better than both the Beoplay and the Sony, too1. I have tried to EQ the Sony via its iOS app, but I have found no preset that I constantly prefer.
  2. The active noise cancellation has an audible hiss and creates a bit of ear pressure. The hiss is disappointing. You don’t notice it during music, and probably won’t notice it in loud conditions where I would use these headphones, but it is annoying during podcasts or TV shows.
  3. Active noise cancellation does not live up to the hype. I actually use ANC headphones a lot in my home office because they remove the drone from the window air conditioner I use when it gets hot. Sadly, I found that the Sony WH-1000M4, with its industry-leading ANC, blocks that noise no better than the Beoplay H9, which is an also-ran in the ANC space and has essentially no passive noise cancellation in its earcup design.
  4. They aren’t that comfortable. My biggest problem with the BeoPlay H9 that I already had is its hard headband, which hurts my head after a while. The Sony headband does the same thing, despite the headphone being lighter and the headband being covered with softer material. The AirPods Max headband is very comfortable, but its clamping force borders on the extreme, so I probably would find it uncomfortable, too.
  5. While their moving parts are silent, the faux leather ear cups creak and squeak when I move my head. It is infuriating. I have no other headphones that do this.

I probably should have returned the Sony WH-1000M4 while I still had the chance. While I do expect to use them during walks on the treadmill and for plane travel in the future, I find that I almost always choose the Beoplay H9 over them for my everyday home-office-with-the-air-conditioner-on listening.


  1. I realize that part of my problem is that I have too many audiophile-quality headphones already. If I were comparing the Sony WH-1000M4 with my aging (non-Pro) AirPods, I would probably think they sound great. ↩︎

Thinking about my next role at work

I spent nearly all of my writing time this evening drafting a job description for the Senior Data Analytics Manager job I hope to be promoted to, sooner or later, at my firm. I feel good about what I wrote, which describes the specialist position that I have carved out for myself at my company, but I’m running it by a couple mentors for feedback anyway. I had a great year at work this past year, but promotion is by no means guaranteed. I am hopeful, though, that I will earn it soon.

I am trying the no-case lifestyle again with my iPhone 12 mini. I am pretty sure my case is the reason why wireless charging is so flakey. Let’s see how long I can go before I drop the slippery thing.

Generating dummy data with Python

Today I learned a good way to generate dummy data for use in the data analysis training I am going to perform next month.

While there are services like dumbdata.com that can produce dummy datasets without requiring any programming at all, those tend not to work for me. My data needs are domain-specific. I don’t just need random names and addresses and things like that; I also need specific columns, including some inter-related financial data columns, for a dummy dataset to make sense to my audience.

I have been using Python a lot lately, so naturally I wrote a Python script to generate a table full of randomized, but real-looking, data. First I used petl’s dummytable command to create a base table full of randomized identifier numbers, dates, data categories, and dollar amounts. To generate real-looking data for that table, I used functionality from the Faker package and from the standard random library, including Faker.date_between and random.choice. Then I used petl’s addfield to add some fields with calculated and inter-related values. Next, I used the petl cut function to re-order a subset of the table columns and prepare them for export. Lastly, I used the petl toxlsx function to export the data to Excel.

It was surprisingly easy. Not having to write any of the functions to randomly generate the data or pick random selections from value lists made the process far quicker than it otherwise would have been. I wish I had known about these tools the last time I created a data analytics training demo.

I am starting to write a job description for what will be (I hope) my next job—or at least my next job title. As a start, I am researching all the other similar job descriptions from open job postings. I hope I can cobble together something good by the end of the week.

I finally caught COVID

My blogging interlude this month has been brought to you by COVID-19.

For a long time I didn’t know I had it. It entered my house just as peak tree pollen season started, and its symptoms mimicked my springtime allergy attacks.

At present, I am still getting over it. I hope to feel 100% by the end of the month.

My seasonal allergies have been worse this week than they have been in years. I can’t think straight. I’m hoping pollen season ends early this sprint. 🙁

Working Late

Because I seem to get far less done in the daytime hours than I think I should, I found myself working late tonight. I created a short presentation on data validation using Python. I dared to include a tiny bit of source code in this one. It will be fun to see how that goes over.

Ah (Choo!), Spring

I did bit enjoy being in an allergy-induced brain fog all day. My son’s allergies are much worse than mine. He is too little to willingly take his allergy medication, which makes helping him difficult. My wife identified a bush near our front door that flowered for the first time I years, and seems to be a major source of our allergies. She is wants to get rid of it, which is understandable, but it hard for us to do quickly enough for it to matter.

I’m writing my self-evaluation tonight for work. I’ve blown past the suggested length, but hope it will be OK. I’m that good, after all. 😀

Annual Reviews Are a Terrible Way to Evaluate Employees

Of course, on the weekend I have to write my annual self-evaluation essay for work, I read this article in the Wall Street Journal by Marcus Buckhingham. He spells out the problems with the annual review process:

The failings of the annual performance review fall into three broad buckets:

They are too infrequent. They are dehumanizing. They are irrelevant to real-world performance.

For years I have complained to my “performance advisors” about the absurdity of the annual review process. Part of the problem is that goals—even SMART goals—are often unachievable because priorities, projects, and clients change over time. Another problem is that too much time is spent ranking employees, which leads to an outside focus on areas of improvement. Not enough time is spent highlighting areas of strength. Imagine how empowering a performance review would be if it was focused on what employees are good at and on finding ways to let them do those things even more.

I thought this detail, from deep in the article, was especially well-observed:

Workers want attention, not feedback, and mostly attention on where they’ve shown glimpses of something good, and how they might show more of them.

Over the past two years I have cultivated a much better attitude about performance reviews. I believe that the managers at the various companies I have worked at want to do the right thing with performance reviews, and are doing the best they can with the tools they have available. I think the problem is that the wrong tools are being used—and have been being used, for my whole career, at every place I worked. The reason for that is that how performance reviews are performed has been baked into general workplace culture. It’s pretty much the same everywhere; blame the MBAs and management experts who developed the general processes and the ideas behind them, I guess1. No annual review process I have been a part of tries to break out of that mold and define a new culture.

In general, employers should help their employees develop their strengths and allow them to spend more time on them. It’s true that various weaknesses can and should be improved with training, coaching, and experience. In many cases, however, greater gains can be had in letting employees drop those areas of weakness and concentrate instead on further developing their areas of strength. That approach would develop the kind of employees that companies in my field want to hire: specialists with unique, world-class skills. In the market for workers, that’s what’s valuable. Why strive hard to become average in your areas of weakness when you could spend equal effort to become truly great at something?


  1. I’m an MBA with a concentration in management. Maybe I’m part of the problem. ↩︎