Sunday, July 8, 2018

Golang Present tool - creating a slide with image and no text

Hello, everyone.  It's been a while.

I've been playing around with golang's present tool.  It's a great tool, overall, but there are some annoyances that come with it that don't come with more consumer oriented presentation tools.

One thing that had me pulling out my hair is that I couldn't figure out how to create a slide without a title at the top of it.  I know that you can use .background to create an image that goes behind the text, but sometimes I just want to put an image with no text at all.

I decided to plead to the void, and ask twitter for advice.  Lucky for me, someone responded!

This is the magic that you need to do in order to get a slide with just an image.

Create a new slide with the * symbol, like you usually do.  Put one space after it, and go to a new line. On the new line, do the usual .image path/to/your/image.file _ 800 that you usually do to insert an image into a slide.

Here's the text for an image with some title text:

* That Example
.image images/that.svg _ 800

Here's the same image on a slide without any text at all:
.image images/that.svg _ 800

Hopefully this helps you out and keeps you from experiencing some of the stress that I experienced trying to get this to work. I'm putting this post out here in the hopes that it shows up if someone tries to use Google to find the solution, like I did initially before begging the internet for help.

Thanks again to Dave Cheney for sharing this information with me on Twitter.

Tuesday, October 18, 2016

Uplink gets an update!

For any of you that remember Uplink, good news! The 2001 game is getting an update in 2016! Score one for the downtrodden hacker! The link to the unofficial (offically praised but still unofficial) mod is here. Sorry, Linux folks. The mod is Windows-only.

Sunday, August 14, 2016

Pebble Time Demo Sorcery - Rocky Reality

The demo scene is an interesting beast. I was impressed that I could make an API call on my Pebble. Then, I see what these people accomplished with Rocky Reality.


Thursday, August 11, 2016

MSDN and Installing Visual Studio 2015 Enterprise - An Identity Management Dumpster Fire

About 30-90 days after you install Visual Studio 2015 Enterprise, you may notice that your "trial version" is expiring.

"But, wait!" You say. "My company has an MSDN subscription!  They pay Microsoft so that I don't have to mess around with trial versions of Microsoft stuff!"

Well, sit down, partner.  This is probably going to take a while.

"But, wait!" You say. "Can't I just reinstall Visual Studio and avoid this pain and suffering?"


"But, wait!" You say. "What about a Visual Studio repair to avoid this pain and suffering?"

Nope.  Not unless you root around in your registry on your work machine.

Let's get started.

**Visual Studio 2015 "stuck in trial mode" --  fix steps:**

Assumptions: You have a work email address and have the appropriate MSDN license.

+ Go to the MSDN my account page ( and link your VS Team services account to your work account by clicking "link my work account to Visual Studio Team Services".

+ Close Visual Studio.

+ Per this stack overflow answer (, delete the registry
 keys in this directory with regedit: `HKEY_CLASSES_ROOT\Licenses\4D8CFBCB-2F6A-4AD2-BABF-10E28F6F2C8F`

+ Open Control Panel-> Uninstall a Program -> Find Visual Studio Enterprise 2015. Double-click it, but select "repair" instead of uninstall. This took about 90 minutes to complete. This should unlink the "profile" from the visual studio install.

+ Open Visual Studio. Go to "File"->"Account Settings" - Notice that the license isn't linked anymore, even if it claims to be a 30 day trial.

+ Click "Check for an updated license". Watch the updated license actually update Visual Studio and finally recognize the MSDN Subscription.

+ Bask in troubleshooting glory.

"But, wait!" You say. "I'm new at {company name}, a company has an MSDN subscription!  They pay Microsoft so that I don't have to mess around with trial versions of Microsoft stuff!  I have been warned of this problem by someone who has spent hours troubleshooting this, and would like to avoid their pain and suffering!  What's the right way to do this?"

**Getting Visual Studio 2015 Enterprise installed correctly the first time**

+ You need to create a Microsoft account.  One way to do this is to go to the MSDN Downloads page (, and try to select "My Account", which will force you to sign in.  Choose "Sign up now" where it says "Don't have a Microsoft Account?"

+ Respond to the email confirmation upon creating the account.

+ Your Internal IT will confirm that they wish to invite you to the MSDN organization.

+ You will receive an email from Microsoft to your work email address (, likely titled "Invitation to Associate with a Member Organization", which contains a link that will help you start the process of associating your accounts.  Follow that link and do everything that it asks.

+ You will likely receive an email from Microsoft that confirms your assignment to a role in your organization.

+ You may also receive a separate email from Microsoft confirming that you've associated to a Microsoft Partner Network Member organization.

+ Wait a couple business days for Microsoft to update its own servers.

+ Attempt to add your subscription to the account that Microsoft has already recognized by using this link: (

+ If you have not received a Technical ID from Microsoft, you cannot continue until Microsoft has processed everything and assigned you a Technical ID.  This ID is different from the Organization Partner ID (probably seven digits) and the Location Partner ID (probably a different seven digits).  The Technical ID is unique to you.  It may come in an email to either you or Internal IT, and it will often take 2-3 business days to arrive.

+ Once you have received a Technical ID from Microsoft, attempt again to add your subscription to the account that Microsoft has already recognized by using this link: (

+ It is possible (or probable) that Microsoft has not updated their own servers with the Technical ID that they themselves have just provided to you.  You may need to wait 2-3 more business days for Microsoft to update their own servers again.  The only way to determine if Microsoft has updated their own servers to recognize the ID that they've provided you is by repeatedly attempting to link your subscription until it succeeds.  I'd suggest trying about three times per business day until it works.  It does suggest contacting Microsoft support if can't log in, but only if you've waited three days or more.

+ Once you have successfully added your subscription, you're now allowed to download Visual Studio!  Go to the MSDN Downloads page ( and select the latest version of Visual Studio Enterprise (2015 with Update 1, as of 03/11/2016).  Download and begin the installation process.

+ Once the installation process has completed, on the first run of the program, Visual Studio will ask you to log in to your account.  DON'T DO IT.  This sets up an entirely separate Visual Studio Team Services account that is unrelated to any of the previous steps.  Instead, chose "skip this step".  Once you've picked all of your other IDE preferences and Visual Studio opens up, you can close it again.

+ Go to the MSDN subscriptions "My Account" page (  Under "Subscription Benefits", you will see "Visual Studio Team Services".  Link your VS Team services account to your work account by clicking "link my work account to Visual Studio Team Services".  As far as I can tell, if you don't link this together, Microsoft will refuse to recognize your MSDN subscription and cannot register Visual Studio to your MSDN license, despite the multiple steps and verifications that have already been performed.

+ Re-open Visual Studio.  Go to "File" -> "Account Settings".  Under "All Accounts", choose to add an account (namely, the Microsoft Account that you've created and linked to your organization using your work email address).  You will need to provide those login credentials to continue.  DO NOT SIGN INTO VISUAL STUDIO IN THE UPPER LEFT.  The login on the upper left is logging into VISUAL STUDIO TEAM SERVICES, the online project management tool and source control management tool, not the IDE.  If you do sign in, Microsoft will create a new Visual Studio Team Services account and link Visual Studio to that instead of anything relating to your MSDN account.

+ Once you have added your account into Visual Studio successfully, click "Check for an updated license".  If successful, your license should now say "License: MSDN Subscription".  You may notice that it also says "Unlock with a Product Key".  This option exists only to torment you.  Apparently, they stopped using Product Keys in Visual Studio 2013 and have moved exclusively to this method of registration, even for the free Visual Studio Community accounts.

+ You are now "officially sanctioned" in the eyes of Microsoft to begin coding.  Marvel at the process that has led you here.

Wednesday, December 30, 2015

Multi-select (multi-cursor) functionality in the Atom Editor

If you've used Sublime Text, you may have become familiar with the neat multi-selection/multi-cursor functionality that you can use.  
Recently, I've started using the Atom Editor, and I wanted similar functionality to quickly select multiple lines of text and do the same action on all of them.
Apparently, there is some built-in multi-cursor functionality in Atom, but it's mouse-only.  You have to Ctrl-Click each place you want to put a cursor.
Luckily, Atom is extendable with open source packages, and I was able to find multi-cursor, which did almost everything I wanted.
The original directions for updating the keymap were incorrect, so it didn't function for me until I updated it to this.
'atom-workspace atom-text-editor:not([mini])':
  # Expand current cursor
  'ctrl-down': 'multi-cursor:expandDown'
  'ctrl-up':   'multi-cursor:expandUp'
Warning: Ctrl-Alt-(Up/Down/Left/Right) can be the default hotkeys of changing your screen's orientation in Windows, so unless you want to do that, update the atom keybinding to something else or remove those hotkeys from the graphics settings.
Luckily, this code is open-source, so I opened up a pull request on Github to fix the documentation to reflect how it worked for me.
The correct syntax for the keybinding you want to change in Atom can be obtained by going to "Settings" -> "Keybindings".

  • Search for the keybinding that you're having issues with (like ctrl-down), and click the clipboard icon next to the keystroke.
  • Paste that syntax into the keymap.cson file and edit as necessary.

Wednesday, August 5, 2015

Civic Hacking - Creating a Pebble Watch App for Recycling Data in Appleton, WI

TL;DR:  I released a Pebble App for Appleton Recycling Data.  It was fun.

Long Version:
Civic hacking is an activity that encourages people to take existing public data and mash it together or organize it in a clever way to increase its usefulness.  I've been intrigued by civic hacking ever since I saw the great work being done by Hacking Madison and CityCamp Madison, especially Greg Tracy's SMSMyBus project, and Scott Resnick's work towards creating Madison's Open Data initiative.

Recently, I had the honor of being invited to the Appleton's inaugural city hackathon.  It was held at Lawrence University on June 6, 2015.  When I was invited, I began to think about what I should do at the event.

Here were my guidelines.  I wanted something that was:
  • interesting, 
  • useful, 
  • and simple enough that I could expect to complete at least a small version of it if given a day to work on it.
Enter: Mike Putnam's Appleton API.

In his free time, Mike had created a way to interact with public data that was on Appleton's public portal, found at  I thought that given the work that Mike had already done, I could probably make a way for Mike's API to interface with a Pebble Watch, which I could use to check whether or not I needed to bring out the recycling.  I then challenged myself to complete a working version of the application by the end of the June 6th hackathon.

Here are the typical steps to code a working application from scratch:
  • Decide what you're going to code.
  • Determine what tools you need to write code.
  • Set up your "environment" and start coding.
  • Do a "hello world" app to start.
  • Modify the "hello world" app slightly.
  • Modify your "hello world" app to do your task at it's least complex level.
  • (Optional) Add complexity to get new features or make the app work better.
  • Ship it!
I'll describe these steps in relation to my Appleton Recycling Date Checker for the Pebble Watch
  • Decide what you're going to code.
I'm going to make a "Recycling Checker" for the city of Appleton, Wisconsin.  It will help me figure out when to put out the recycling bin, so that I don't forget.  It will be a Pebble watch application.
  • Determine what tools you need to write code.
To write Pebble applications, I first needed a Pebble developer account (which I had already created).  Next, you can either download and install their Pebble SDK (Software Development Kit) or make an application online in a web browser using CloudPebble.  I decided that because this app is for a hackathon,and it's a relatively simple app, I'd try out CloudPebble.  Using CloudPebble also meant that I could test my code on a "virtual" watch without having to load each change on a watch, which made coding go faster.

  • Set up your "environment" and start coding.

Since I was using CloudPebble, all I needed was a laptop, a web browser, and an internet connection.  If I wanted to install the application on an actual Pebble watch, I needed one of those, but I already had one, so I was good to go.  I decided to try using PebbleJS since it looked like a simplified, streamlined way of creating my application.  Creating a CloudPebble application does give you some sample code, and it allows you to get your feet wet without having to create your first project from scratch.
  • Do a "hello world" app to start.
After noodling around in the default CloudPebble app, I used the PebbleJS Tutorial to create my first project, since the tutorial allows you to edit the tutorial code directly.  I thought that was an awesome touch.  I went from zero to "hello world" very quickly because of this tutorial and its integration with CloudPebble.
  • Modify the "hello world" app slightly.
My first modification was to change the word "world" with "Appleton".  Changing one word without changing functionality is a safe first step in editing code.  That worked, so I continued on.
  • Modify your "hello world" app to do your task at it's least complex level.

The sample tutorial application gets weather information.  I wanted to get recycling information.  However, I could change the URL of the "weather" API call to Mike's "Appleton API" and try to get a meaningful result.  Luckily, one of the results the API returns is the next day that your recycling needs to be put out.  I hard coded my property ID (which represents my address) in order to test the web application call and display the data.

This is how the URL would look for the Appleton Makerspace:
It would return lots of data, including this:
        "2015leafcollectiondates": "October 19-23, November 2-6, November 16-20",
        "elementaryschool": "Lincoln",
        "firestationaddress": "1701 W. Brewster St",
        "firestationnumber": "5",
        "garbageday": "Monday",
        "highschool": "Appleton West",
        "middleschool": "Wilson",
        "recycleday": "Monday, 08-10-2015",
        "sanitarydistrict": "Appleton",
        "schooldistrict": "Appleton Area",
        "watersource": "Appleton" 

What I needed was hidden inside all of the other data.  I wanted to show the value for "general infomation"->"recycleday" on my screen.

Through some reading of the documentation, trial and error, and effort, I was able to accomplish this in 47 lines of Javascript:

var UI = require('ui');
var ajax = require('ajax');
var Vector2 = require('vector2');
// Show splash screen while waiting for data
var splashWindow = new UI.Window();
// Text element to inform user
var text = new UI.Text({
position: new Vector2(0, 0),
size: new Vector2(144, 168),
text:'Downloading trash data...',
// Add to splashWindow and show
// Make request to Appleton API
//Proof of Concept - hard coded URL
function(data) {
// The location of the recycling day is data[1].recycleday;
var recycleDay = data[1].recycleday;
// Create a Card with title and subtitle
var card = new UI.Card({
title:'Next Recycle Day:',
// Display the Card;
function(error) {
console.log('Download failed: ' + error);
  • (Optional) Add complexity to get new features or make the app work better.
I created a github repository with this code, so that I could easily track and change the application as I saw fit.  Most of the complexity came after the June 6th hackathon.  CloudPebble's integration with Github was very convenient here.
  • Ship it!
I downloaded the compiled"pbw" (pebble watch) file to my phone.  Using the Pebble App, I could download the Appleton Recycling App to my phone, and it would fetch recycling information for me.  Success was mine!

So..... now what?

I succeeded, but only at the smallest level.  The application still couldn't check more than one address, which wasn't configurable without creating your own application.  To make the application useful for anyone besides myself, I needed to implement a configuration page.  I researched how to do this (which was more complex than I would have expected - you have to host your own web page somewhere on the internet).

City Hackathon- the return!

Luckily, I was invited to a follow-up hack night, which was held at Appleton Coworking in July.  It gave me another opportunity to interact with other coders and civic minded folk, and I had another excuse to improve the app.  After discussing the event in the #dhmncivichacks channel at the Northeast Wisconsin Slack channel, I went in with the goal of improving the app so that other people could use it, too.  Thanks to some more trial, error, and tutorials (and some pizza purchased by Omni Resources), I succeeded in making a Github Pages-based configuration screen, which I hosted from my own github account.  The source code for that config trickery came from a fork of 
PebblePages (thanks, PaulBGD! - you can check out his blog here).

Ship it!  This time,  with feeling!

Given that another human being may actually find this application useful, I decided to publish the application in the Pebble appstore.  I needed to describe the application, make some screenshots, and make the application "production ready".  I decided to create a fork on the DHMN Civic Hacks Github Organization, and I published from there.  This means that I can make crazy changes to my local version without upsetting the "maybe more than one" user of this application!  Hooray!

So, you're done?
Nope.  I'm still working on the application.  Check out my Github Issues List if you're interested in where the future of this application may be.  Hurry!  It sounds like there will be another hackathon within the next month!