2014

    I bought $40 of Bitcoin and now I have less money! I thought this was supposed to go the other way!

    Drinking the beer means I won’t eat the candy. Healthy!

    Odell Brewing beer bottle surrounded by a large pile of Halloween candy miniatures including Twix, Snickers, 3 Musketeers, Milky Way, and Kit Kat on a wooden bowl

    Happy Halloween!!! πŸŽƒπŸ‘»

    New #TeamSPS space is ready to roll. Here is one of the many collaborative tables with great tech.

    Modern office collaborative table with Apple keyboard and wall-mounted Mac display on a teal accent wall, open workspace behind

    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

← Newer Posts Older Posts β†’