Monday, December 22, 2025

Building A Better Digital Bat Signal - Part 1 - The Plan

The Problem

Some people find it difficult to unplug from their day job while on vacation. Not me. When we travel, I quickly transition from work being a primary focus to a distant memory.

This is usually a good thing, as travel is precious and I want to make the most of it. But this is problematic, because even when I'm away I want to support customers who depend on me.

The compromise that I've had in place for years is to tell my clients that if they find themselves with a critical emergency, drop me an e-mail with URGENT in the subject line. I then keep an eye on my inbox, and jump on these messages as quickly as possible. This lets me leave the rest of the messages in my inbox to pile up.

What's nagged at me, however, is that my system requires me to monitor my email. This is less than ideal for everyone. I'd like to be able to stop checking email altogether, and my customers would benefit from a system that is not susceptible to human error.

Essentially, I've set up a bat signal, now I need to write some code to alert me if it's lit up.

The Fun Solution

My first thought was to build some wearable tech, perhaps a pendant that would serve to announce the presence of an urgent message. The jewelry would be delightfully simple, signaling state by glowing in one of three colors. Green means all is good, yellow means that I've lost connection to the status-checking service and red means that I have an urgent issue.

While primitive, this color based UX would let me fully unplug, yet react quickly if there was a problem.

The tech to build such a device is inexpensive and readily available. What I'm after is little more than a bluetooth compatible micro controller, a grid of LEDs and some odds and ends to tie them together. This can be simplified even further, if I used a platform like the Circuit Playground Bluefruit, which has both Bluetooth and LEDs built in.

Oh my, would this be fun to build. And there are a number of tutorials on adafruit.com that seem like a great place to start. Ones that jumped out at me include: NeoPixel LED Heart Necklace, DotStar Fortune Necklace and the NeoPixel Ring Clock. All of these involve an LED based piece of jewelry powered by a microcontroller.

But alas, there are a number of demerits with a hardware based approach. In my mind's eye, the pendant is compact and smart-looking. Yet, the project will start its life as a series of raw components and a heap of wires. Turning this jumble of components into a compact and comfortable to wear piece of jewelry is non-trivial to say the least.

There's also the question of battery life: how big a battery do I need, and how can I camouflage it and make it comfortable to wear?

If I did manage to produce my magical pendant, would I be happy to have another piece of tech to bring on travel? That's more hardware to keep track of, charge and generally debug. Will it be worth the hassle?

And finally, the software to power the pendant is broken into three stages. First, there's code that runs on a server to determine the status of my inbox. That code will send a message to my phone. Next, my phone will process this message, and forward it to the pendant via Bluetooth. Finally, the pendant's microcontroller will convert the message from the phone into a glowing LED.

A far more practical phone based solution calls for precisely these first two steps. So, the smart play is to build a phone version of my bat-signal detector first, as I'll need to write this code anyway. In the future, I can opt to add hardware to display this status in a novel way.

So yeah, while it's incredibly tempting to take the hardware based approach, the ideal MVP should rely on the hardware I already own and carry everywhere: my phone.

The Tasker Solution

While a custom hardware solution is sexy, an Android Tasker based solution should be easy. My plan is this: on a Linux server, use the Gmail API to determine whether I have an unread message in my inbox with the word URGENT in the subject line. If so, then my inbox status is urgent, otherwise, I'll consider the status as ok.

Next, I'll send this status as a message to my phone using AutoRemote. AutoRemote is an amazing service that delivers messages to any phone from any system with a web request. In the case of a Linux server, this can be accomplished with a curl command.

On my phone, I'll use Tasker to react to the AutoRemote message. Specifically, I'll map the status message into a background image and then call SetWallpaper to make this new image my background.

In short, a customer will email me with an urgent message, and in short order my phone's background will change to something attention grabbing. That means I don't need to check my email, I just need to interact with my phone, which of course, I do throughout the day.

If all goes well, in less time than it would take to figure out what hardware I need to buy to build the wearable, the entire project can be completed.

Let's do it!

Wednesday, December 17, 2025

hbo-blogger.el: Still Editing Blogger Posts in Emacs, Still Loving It

Last week I updated the packages that power my local emacs config by running:

  • M-x package-refresh-contents
  • M-x list-packages
  • U
  • x

While I'm sure I picked up many helpful updates, the oauth2 update was problematic: it contained changes that broke my blogging package: hbo-blogger.el.

hbo-blogger.el was written years ago and its use of specific oauth2 functions like oauth2-url-retrieve-synchronously was a poor design decision in the first place.

I've since updated this package so that it not only works with the latest oauth2.el, but it also makes use of the standard url-retrieve function.

If you're looking for an example of using oauth2.el or a comically simple Blogger interface, you should check out the latest code.

Absence Makes the Heart Grow Fonder

During the stretch that hbo-blogger.el was broken, I switched back to editing content within Blogger.com's web interface. While this was functional, it definitely made me appreciate the value of writing within emacs.

Reflecting on this, I appreciated that first and foremost, I missed emacs' core editing capabilities: the keyboard shortcuts, html-mode's ability to complete tags, the ability to access previously copied items to the clipboard, on demand access to the spell checker, and hundreds of other small details that have become second nature from using emacs for 30+ years.

I also missed having access to my project-notes package. This tiny add-on lets me effortlessly jump from the draft of my writing to a scratch pad and back with a single keystroke. This lets me switch from writing to research mode and back with zero friction.

And finally, I missed gptel, which provides brilliant emacs integration with an LLM AI of your choice. This lets me do research and proofreading within emacs with zero distractions.

Man, does it feel good to be back!

Tuesday, December 09, 2025

Sun Pillar!

On my run tonight, what appeared to be a normal sunset turned into a first for me: a sun pillar:

This effect is create by millions of falling ice crystals. It's sort of like a rainbow, but also not at all like a rainbow. Either way, how magical!

Friday, December 05, 2025

US open 2025 - Homeward Bound and Closing Thoughts

[Composed 8/29/2025]

Thanks Mom and Dad!

A couple of years ago we found the pefect answer to one of my parent's FAQs: what can we get you guys for your anniversary? The answer: lounge access at the airport. This is the perfect gift because every time we take advantage of it, it feels like an absolute luxury.

And so today, as we flew from La'Guardia to DC, our first stop after security was the lounge, where we got to eat, drink and reflect on how amazing the last couple of days have been. Thanks Mom and Dad!

The lounge also delivered in terms of practicality. Shira and I needed to join a foster parenting related video call. Doing so in one of the lounge's mini-private meeting rooms was ideal, as convo could remain private. The fact that I could nosh on little pastries and drink tea while the meeting was going on was a nice bonus.

A Mid Air Mystery

Our flight back to DC was easy and the scenery gorgeous. I snapped some pics of what appeared to be an unexpected site in the area: pit mine or quarry. But for the life of me, I can't identify it.

I tried busting out my innner Sherlock Holmes, but every lead I chased down was a dead end. I checked Flight Aware to analyze our flight path, tried Googling landmarks that appeared in the photo and did a bit of timestamp math to determine where on our trip the photo was captured. Of course, I asked ChatGPT for help, but in this case, it told me to try the things I was already trying. How can such a disctinct location from above be invisible on the ground? On our next flight home from LGA, I'll keep my eyes peeled and the GPS Test app ready to grab a set of coordinates. This site can't hide forever.

A Little Less Tennis?

For the second year in a row, we visited the tournament on Tuesday and Wednesday, versus coming for the middle weekend. We did this last year out of neccessity, and this year because we liked the larger match selection the earlier days offer. Compared to last year, however, there was slighty less tennis going on. That's because for the first time in the Open era, the US Open started on Sunday and not Monday. Some players seem quick to point to this move as a way for the tourament to make more money. However, I have to imagine that spreading the tournament out over an extra day means that rain delays and other glitches don't quite pile up into the into scheduling nightmares; like they seem to do every year.

So while there was something special about having an impossible amount of tennis to watch on Tuesday, with matches going deep into the night, the extra day did seem to make the schedule more consumable. I have to imagine that's a good thing for the tournament.

Goodbye T6s, Hello JJ02 and OpenCamera

This year my US Open gear remained nearly unchanged in all but one department: my camera gear. In a major break of tradition, I left my Canon T6s DSLR with 300mm lens at home. The fact is, the aging DSLR just can't compete with the quality and convenience of my Galaxy S22 cell phone. I considered using this as an opportunity to slurge and pick up a new, probably mirror less camera. While I could no doubt get a camera that would outperform my cell phone, I can't justify the cost and bulk of such a setup. Whatever I'd gain in image quality, auto-focus speed and shots per second, I'd lose in portability. My goal is ultimately to capture the story of the Open, and my cell phone lets me do this more than well enough.

Still, I couldn't resist using the Open as a proving grounds for two new photography add-ons: one hardware, one software.

On the hardware side, I brought along a ULANZI JJ02. This is combination tripod, selfie-stick, bluetooth trigger and camera grip all in a fist-sized package. The JJ02, like most multi-purpose tools, doesn't fully excel in any one area. All the features work, but all have limitations that a dedicated item wouldn't have. For example, the tripod can has only the most basic adjustment options and the Bluetooth trigger isn't USB rechargable. Yet, the sheer portability and functionality of the JJ02 makes it a winner. The tournament forbids tripods and selfie-sticks, yet I had no problem bringing it through security. When we wanted to grab a group shot, the Ulanzi was quick to set up, use and tear down. I took well over 1,700 photos during the tournament and the grip definitely made the camera more comfortable to use. So yeah, the JJ02 may be a compromise, but on the balance, it's a winner.

On the software side, I experimented with using Open Camera. Conventional wisdom is that no 3rd party app can beat the phone's built in camera. That's because the built in camera has access to features that aren't available to 3rd party apps. And for everyday use, I find this to be true. Yet, Open Camera does have a number of advantages that made it shine during the Open. The repeat option let me capture sequences of images with ease. I was also able to select Focus Continous Picture, so that the camera refocused on each shot. Combining these features let consistently snap action sequences.

Other cool features that Open Camera offers includes exposure and focus bracketing, focus peeking, alternative implementations of HDR and NR modes, and impressive control over things like file naming and image metadata.

The user experience of OpenCamera is far less sexy than the built in photo app. Yet, it brings a degree of consistency which is much appreciated. Most importantly, the apps settings are truly sticky. If I carefully input a series of settings, they aren't lost, as often seems to happen with Pro mode in the stock camera.

For day to day snapshots, the S22's default camera is amazing. But for specialized tasks, Open Camera is an excellent tool to have in the toolkit.

Tuesday, November 18, 2025

US Open - Day 3 - Tennis with Heart, Tennis with Drama

[Composed 8/28/2025]

Finding a Seat

We had a delightful walk to the US Open grounds this morning, with the weather cooperating and a seemingly endless stream of graffiti and sticker art for me to ooh and ahh at.

Security at the Open this morning was notably tighter than yesterday. Despite having less metal on me (opting to leave an extra power bank at the hotel), the metal detectors flagged my bag. I'm not sure if yesterday's settings were too relaxed, or if it was always planned to make the machines more sensitive as the tournament progressed. Either way, I was glad to open my bag and show off all the baked goods I was bringing into the stadium. I ultimately got through without incident.

We spent some time scurrying around the grounds before the first match. Along with picking up some freebies (thanks, Fage! The yogurt was delish), we stepped into the main gift shop to purchase a game ball. This is a tennis ball that was used on court for a period of time, typically 7 games. While the balls lack specifics of which match it was from, they are often scuffed up in interesting ways that suggest they are legit. This makes each of them unique. Because balls are changed out so frequently, a match can rack up quite a few. So while each ball is unique, they aren't in short supply. Apparently, the Open uses between 70,000 and 100,000 balls for the entire tournament! We've got a collection of game balls going back to 2018, and while I'm not usually a fan of accumulating tchotchkes, these do make me smile every time I look at them.

We started the day in Grandstand and had pretty much perfect seats: in the shade and positioned right behind the ends. It was going to be a good day!

Let's Tennis!

Our first match of the day was Andrey Rublev vs. Tristan Boyer. Rublev got off to a strong start, taking the first two sets 6-3, 6-3. This looked to be a continuation of yesterday's upset-free day.

To Boyer's credit, he didn't give up. In the third set, he kept fighting and was ultimately victorious in the tiebreak. He battled hard in the fourth set, almost taking it. Rublev came out on top, but the young American distinguished himself as one to keep an eye on.

During Rublev's match, I loved watching two older, obviously local New Yorkers make their way through a paper copy of the New York Times. There was something timeless about the scene, which almost certainly has been playing out on these grounds since they opened back in the late 1970s. While Rublev and Boyer were making bold choices on court, these two gentlemen were doing the same by working on the New York Times Crossword in pen. Such chutzpah!

From Boyer, we made our way to Arthur Ashe to watch Jannik Sinner take on Alexei Popyrin. Ranked 40 in the world, Popyrin had promise to at least push Sinner. Alas, it wasn't Popyrin's day: Sinner steamrolled over him. At 6-3, 6-2, 6-2 Popyrin never gained any momentum. Sinner looked great and is an obvious candidate to take the whole tournament.

Walking out of the half-full, subdued Arthur Ashe stadium, we found the grounds buzzing with activity. That's one of the quirks of having such a large stadium in the mix: its mood can be completely independent from the grounds that surround it.

Tennis At Its Best

Up next, we made our way to the Renata Zarazua vs. Diane Parry match. On paper, this hardly seemed like must-watch tennis. Ranked 70 and 127 respectively, neither player has the name recognition that top 10 players bring. Joe, however, was confident that this was going to be the match to watch. Zarazua had just upset #6 ranked, Madison Keys, and is a beloved player in her home country of Mexico.

We took our seats just a few rows back from the court, and in no time the place was packed. If you squint, you can see us in this photo:

Zarazua got off to a slow start, losing the first set 2-6. But she didn't waver and took the second set 6-2. Both players brought their A-game for the third set, with the contest being decided in a tiebreak. Ultimately, Parry came out on top, but it was an absolute nail biter to the end.

While the competitive matchup and close-in seats helped, it was clearly the energy of the crowd that made this a highlight match of the Open. With every seat and then some occupied, the rowdy crowd made the experience feel more like a (I'm guessing very tame) football match rather than a tennis match.

Joe, who's a dedicated Spanish Duolingo user, translated the crowd's Spanish chants and shouts for me. "What'd they say?" I'd ask after hearing an outburst. "Yes, we can!" he'd explain. Or "don't call immigration!" "What are they saying now?" I asked later in the match. Joe shook his head, uh, they're just saying her name, Zarazua. OK, maybe that last one I should have been able to figure out myself.

By the time the match had entered the tiebreak, the crowd was euphoric at every Zarazua point. The tiebreak had the energy of a final, with the tug of war between the players making for must-watch tennis.

The most remarkable scene in the match came after Parry won and the two players shook hands. Tennis protocol is that the loser leaves the court first, often slinking away with emotion bubbling over.

But instead, despite losing the match, Zarazua's fans treated her like Roger Federer: ecstatic just to be there and perhaps get an autograph, selfie, or exchange a word with the player. She and Parry both remained on court for a time signing autographs and receiving love from fans.

The whole experience was tennis at its best. The players battled, and Parry was the winner. But both were beloved by their fans, and most importantly, honored for having the opportunity to play in such a high-level tournament.

After Zarazua's match, Joe hit up the Gauff match, Shira wandered over to watch Tsitsipas, and Sara quietly slipped off to probably do anything but watch tennis (Sara, I feel you!). I liked the seats we had, so I hung around, hoping that the next match, Felix Auger-Aliassime vs. Roman Safiullin would be as captivating as what we just saw.

It's been some time since I'd seen Felix play, and I'd never been this close to the action so I was wowed by the power he brought. I stayed for part of the first set, which he ultimately took 6-1. I ended up leaving that match to join Shira, but I left with the sense that if Felix could keep that level up, he'd be in the running to win this tournament.

While I wasn't there to witness it, the match didn't end up being the blowout the first set suggested. At 7-6, 7-6, Safiullin put up one heck of a fight. He certainly held his own in a way that the first set suggested he couldn't.

Tennis At Its Most Dramatic

I joined Shira at the Stefanos Tsitsipas vs. Daniel Altmaier match that she promised was going to be worthy of our time. While Tsitsipas had lost the first set in the tiebreak, the fact that he took the second set 1-6 surely meant that he was going to finish this match off with ease. Altmaier, however, had other plans for the evening.

Shira was right to pick this match to watch. Not only was the underdog putting up one heck of a fight, but it also contained a bit of juicy tennis drama. Altmaier, to Tsitsipas's obvious annoyance, served an underhand serve. This 'changeup' of tennis is a sort of anti-power serve and is a rarity in pro tennis. Shortly after this unexpected move, Tsitsipas hit a ball directly into Altmaier. At the time, Tsitsipas raised his arms in apology. However, at the net as the two shook hands, Tsitsipas explained: "Next time, don't wonder why I hit you, okay? No, I am just saying...if you serve underarm...". You can see the chain of events play out in this video.

Altmaier kept his cool, staving off a match point and was ultimately victorious. His upset was the most significant one we'd end up seeing this year at the Open. Well done, Daniel!

Sara and Joe joined us for the end of the Tsitsipas match, and when it was completed, we called it a night. As we left the grounds for the night at around 12:30 a.m., everyone agreed we'd had a successful day at the Open.

On our way back to the hotel, a plastic buckle on Shira's bag gave way. My Eagle Scout reflexes kicked in, and I quickly fixed her bag using a 3-foot piece of cordage that's quick-deploy-ready on my keychain. Did my ego appreciate the chance to show off my MacGyvering skills in front of the gang? I mean, it didn't not appreciate it.

Good friends, good tennis, and looking like you know what you're doing? I mean, c'mon, what more could I ask for?