Grafana Overview Dashboard

There should be an “Overview” dashboard for your infrastructure that gives you a quick, high level view of how everything is working. The idea isn’t to necessarily use this for diagnosing problems, but for knowing where to look next. Here’s a quick one I put together for fun.

Radio Milwaukee AppleScript

I’ve been listening to Radio Milwaukee a lot lately. They play it at a lot of my favorite coffee shops in Milwaukee that I haven’t been able to visit for a while.

I like to listen to music in the Music app (previously iTunes) because I have AirPlay speakers in my office and around the house. This script opens the Radio Milwaukee stream and hides the Music app.

tell application "Music" open location "https://wyms.streamguys1.com/live?platform=88nine" play set visible of every window to false end tell

The Day I Met Joe Biden

The Friday before the 2016 Presidential Election, I was at the same coffee shop that I had been going to almost every day for years. At one point I looked up from my laptop and noticed someone with an ear piece standing outside the window. After working for a while longer, I remembered that Vice President Biden was speaking in Madison that morning, campaigning for Hillary Clinton and Russ Feingold, who was running for his old Senate seat again.

A little while later, I noticed that Secret Service had actually stopped letting people in without Press credentials and there were many reporters inside and outside the cafe.

The next thing I remember is the motorcade coming around the corner and stopping right in front of Colectivo. I just found the moment in Slack where I was in the middle of a conversation when I said:

brb, joe biden is here
i think he’s literally walking into Colectivo
he is

First Russ Feingold came in. I had been sitting in the front of the cafe when all this started, so I was one of the first people to shake his hand when he walked in the door. (It probably didn’t hurt that I had a huge Russ Feindgold bumper sticker on the cover of my laptop 🙃)

Then Joe Biden came in and shook everyone’s hand. He noticed someone with a Green Bay Packers phone cover and told a story about how he got out of school early on Mondays if the Packers won. Then he walked into the middle of the restaurant and announced, “I’m Joe Biden and I work for Russ Feingold.”

I think about this day a lot when I encounter people that are less than enthusiastic about the idea of a President Biden. He wasn’t my first choice in the Democratic primary, but he is qualified to be President, he’s a good person, and he would make things better for most people instead of worse. In a lot of ways, he’s the opposite of our current President.

iOS 14 Smart Stack

For me, the best new iOS 14 feature is the Smart Stack widget. Widgets in general are neat, but I’m hoping the Smart Stack technology will be implemented in other parts of iOS as well.

If you’re not aware, Smart Stack is basically a way for apps to report when they have something interesting to report. In the example below, it had just started raining in Madison, so the weather widget was surfaced.

The obvious extension of this is for Watch complications. Having a temperature complication that switched to a weather conditions complication to warn you about pending inclement weather is a simple example that would make the Watch more useful and easier to use.

Switching to Calendar when you have a meeting coming up, Reminders when you have a task due, or Stocks when the stock market would be very convenient.

A Smart Stack on the lock screen would also be interesting. While you can already put widgets in the dashboard to the left of the lock screen, a single, customizable Smart Stack on the lock screen itself would be able to quickly surface similarly important information about weather, an important meeting, breaking news, and so on.

Fingers crossed for iOS 15. 🤞

IPv6 PAC Support

If you’re not familiar with a Proxy Auto-Configuration (PAC) file, it’s a JavaScript function that determines whether web requests should be forwarded to a proxy server or not.

There’s a minimal set of JavaScript functions defined that you can use to conditionally send your web traffic through a proxy. One of those functions, isInNet(), returns true if an address (an IPv4 address) is included in a given network range. Unfortunately there are no functions in this standard set that provide similar support for IPv6 addresses.

There are many IPv6 parsing libraries on GitHub, but all of them depend on at least a few npm packages. I’m normally not one to complain about npm dependencies, but this is once instance where the dependency model is not really tenable.

Here I’ve put together a copy/pastable inIPv6Range() function that provides limited functionality for determining whether a given IPv6 address is in a predetermined range.

function expandIPv6( ipv6 ) { const parts = ipv6 .replace( '::', ':' ) .split( ':' ) .filter( p => !! p ); const zerofill = 8 - parts.length; // Fill in :: with missing zeros return ipv6 .replace( '::', `:${ '0:'.repeat( zerofill ) }` ) .replace( /:$/, '' ); } function parseIPv6( ipv6 ) { ipv6 = expandIPv6( ipv6 ); // Check is valid IPv6 address ipv6 = ipv6.split( ':' ); if ( ipv6.length !== 8 ) { return false; } const parts = []; ipv6.forEach( function( part ) { let bin = parseInt( part, 16 ).toString( 2 ); while ( bin.length < 16 ) { // left pad bin = '0' + bin; } parts.push( bin ); }); const bin = parts.join( '' ); return parseInt( bin, 2 ); } function inIPv6Range( ipv6, low = '::', high = 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff' ) { ipv6 = parseIPv6( ipv6 ); low = parseIPv6( low ); high = parseIPv6( high ); if ( false === ipv6 || false === low || false === high ) { return false; } return ipv6 >= low && ipv6 <= high; }

If you clean this up or add CIDR support, let me know!