Whole family at Wild game! Mazie is practicing teenager looks already.

Family of five posing for a selfie in a crowded hockey arena, with a teen in a teal jersey and two young children in the foreground.

30 foot whiteboard surface with 5 operational dashboards. New #TeamSPS space is awesome!

Row of 5 wall-mounted monitors displaying dashboards in a modern office corridor with colorful carpet and caution tape on the floor.

One detail. Each desk in the new #TeamSPS space has these handy USB power ports. Mobile friendly.

Workers in blue shirts installing green-paneled open-plan office workstations with white desktops and built-in USB power ports.

Updated Dynamic Questy Captchas

A little over a year ago I shared a method of generating dynamic Questy Captchas for the MediaWiki ConfirmEdit extension. This method has been awesome for stopping registration spam on the thingelstad.com wiki farm and many other wiki admins have used it with success. Unfortunately it was more useful in it’s novelty than in it’s difficult to solve, and eventually some spammers wrote the logic to solve it and the registration spam started flooding in.

I decided to put a new method in place that is based on the same question. The previous question generated 8 characters and asked the user to provide one of them based on a random index. I’ve now changed this to generating a number between 100,000,000 and 999,999,999, turning that into spelled out words and then asking to identify one digit. It looks like this:

What is the sixth digit of the number nine hundred fifty-one million eight hundred ninety-eight thousand four hundred twenty-seven?

That turns out to be a somewhat hard question for a human too. I find I typically have to type out the number as I read it. The benefit of this is the solution isn’t in the text of the page. And while I’m sure there are great libraries for turning written numbers back to digits, it’s not immediately obvious.

Implementation

I had no interest in implementing my own code to convert a number into words, and happily there is a PHP package called Numbers_Words that does just that. The URL and install information are in the comments right before the require line. Everything else is pretty simple stuff.

To implement this I used the same technique I did previously. Here is what this looks like in LocalSettings.php.

# Let's stop MediaWiki registration spam
require_once( "$IP/extensions/ConfirmEdit/ConfirmEdit.php" );
require_once("$IP/extensions/ConfirmEdit/QuestyCaptcha.php");
$wgCaptchaClass = 'QuestyCaptcha';

# Set number question for questy
# sudo pear install channel://pear.php.net/Numbers_Words-0.16.2
# http://pear.php.net/package-info.php?package=Numbers_Words 
require_once("Numbers/Words.php");

$myChallengeNumber = rand(0, 899999999) + 100000000;
$myChallengeString = (string)$myChallengeNumber;
$myChallengeStringLong = Numbers_Words::toWords($myChallengeNumber);
$myChallengeIndex = rand(0, 8) + 1;

$myChallengePositions = array (
    'first',
    'second',
    'third',
    'fourth',
    'fifth',
    'sixth',
    'seventh',
    'eighth',
    'ninth'
);
$myChallengePositionName = $myChallengePositions[$myChallengeIndex - 1];

$wgCaptchaQuestions[] = array (
    'question' => "What is the $myChallengePositionName digit of the number <strong>$myChallengeStringLong</strong>?",
    'answer' => $myChallengeString[$myChallengeIndex - 1]
);

Initial results of this are very solid.

The Numbers_Words package also supports localization into over a dozen languages. I didn’t explore this but clearly this should work for multiple languages pretty easily as well.

Have you ever seen a ~ in a URL where the hostname did not end in .edu?

SPS Kubb Class

Garrick and I joined forces and auctioned off a Kubb Class at the annual SPS Charity Auction this year. The sales engineering team won the event and we got 12 of them together this past week for a tournament level Kubb class. It was an awesome time with a ton of great questions on the game and a jump-start into Kubb strategy and technique.

SPS Kubb Event
2

SPS Kubb Event
3

SPS Kubb Event
4

SPS Kubb Event
1

Business Hours: I wonder how you put this into Yelp? From the mini-donut stand in Nisswa, MN.

Framed sign with humorous business hours reading open most days about 9 or 10, closing about 5:30 or 6, sometimes not there at all.

Minnesota United v San Antonia Scorpions

Minnesota United FC Culvers tailgating dinner with Mazie.

Man in a plaid shirt and a young girl in a colorful knit hat sitting together in the open trunk of a yellow car, both smiling.

Good luck Minnesota United FC! Let’s win this! ⚽️

Two soccer teams in red and gray jerseys line up at midfield with referees before a night match at a packed stadium.

Well done Atomic Data sponsoring Minnesota United FC! ⚽️

San Antonio Scorpions must have a flopping clinic mandatory for all players. Go Minnesota United FC! ⚽️

Is it possible to get the ElevationLab NanoPad off of a surface? I can’t get it to even budge.

Tammy is in full force cabin shopping mode. Not sure how this happened.