February 6, 2019

Book: Scale

Scale Book Cover

My book club just finished reading Scale: The Universal Laws of Growth, Innovation, Sustainability, and the Pace of Life in Organisms, Cities, Economies, and Companies by Geoffrey B. West. This was a dense book focused on the concept of scaling, in the abstract. The author did a lot of research and shows some surprising scaling views to look at different animals, cities, and even companies. He identifies some amazing correlations that show how entities scale.

I felt like this book was profound, and important. However I wasn’t sure how I would action any of it. 🤔

Book
February 5, 2019

JSONFeed on Blot

I’ve been enjoying Blot a lot. I’ve enjoyed its approach to blogging. There is plenty of power there, and it’s dead simple to add new content. I’ve now moved most of my websites to Blot, and it supports RSS automatically, but I also wanted to support JSONFeed. When I tried to set that up I could not make it work. I hit a brick wall 🧱 with the Mustache templates that Blot provides, with no ability to safely encode HTML into JSON. I sent an email to David who runs Blot. He replied right away that he was going to add something to make this work. He sent me an email today to let me know he added a {{#encodeJSON}} capability. I plugged it into my view and it worked like a charm.

I’ve spent a bit of time making sure this template works as it should and I think I got it. If you would like to add support for JSONFeed to your Blot site, you can create a new view in a custom template, I used the name jsonfeed.json. Beware that you cannot use the same basename for two different views, so you cannot make feed.xml and feed.json for no good reason. For now, use a different name.

{ {{! First build the header for the feed. }}
  "version": "https://jsonfeed.org/version/1",
  "title": "{{#encodeJSON}}{{{title}}}{{/encodeJSON}}",
  "description": "{{#encodeJSON}}Feed for {{{title}}}{{/encodeJSON}}",
  "home_page_url": "{{{blogURL}}}",
  "feed_url": "{{{blogURL}}}/jsonfeed.json",
  "items": [
    {{#recentEntries}}
    { {{! Now create an entry for each post }}
      "id": "{{{blogURL}}}{{{url}}}",
      "title": "{{#encodeJSON}}{{{title}}}{{/encodeJSON}}",
      {{#summary}}"summary": "{{#encodeJSON}}{{{summary}}}{{/encodeJSON}}",{{/summary}}
      {{#thumbnail.large.url}}"image": "{{{blogURL}}}{{{thumbnail.large.url}}}",{{/thumbnail.large.url}}
      "content_html": "{{#encodeJSON}}{{#absoluteURLs}}{{{body}}}{{/absoluteURLs}}{{/encodeJSON}}",
      "date_published": "{{#formatDate}}YYYY-MM-DDTHH:mm:ssZ{{/formatDate}}",
      {{#metadata.externalurl}}"external_url": "{{{metadata.externalurl}}}",{{/metadata.externalurl}}
      "url": "{{{blogURL}}}{{{url}}}"
    }{{^last}},{{/last}}
    {{/recentEntries}}
  ]
}

Once I got this setup Feedbin, which supports JSONFeed, was able to once again see my feeds and pulled in new content right away. It works great! Thanks to David for such a great service as Blot, and for adding this capability to support JSONFeed! 👏

February 2, 2019

Minnesota Kubb 2019 Winter Tournament

The Kubbchucks played our 8th annual Minnesota Kubb Winter Tournament this weekend. After a week of record cold temperatures we were treated to a fabulous day in the mid-30’s, nice sunshine and no wind. Perfect for winter Kubb!

Round Robin

We opened the round robin versus Team Dondante. This was their first tournament and we helped them with tournament rules. They were good players, but needed to work on their drilling technique. We took the match 2-0 and it went on way too long because we were able to close it out. We went very cold on our 8m and that makes for a long game, if you don’t lose.

We played the Free Agents next, serious Kubb talent here. We had an epic fail in our first game and left a field Kubb on our very first turn, throwing 4 batons at 2 Kubbs. The Free Agents then kindly put us out of our misery. We drug out the 2nd game for a good long time. We got to 8 Kubbs in play and went back and forth for about 20 minutes. Sadly we broke first and left a line, which resulted in the expected immediate loss. 0-2 on that match.

We finished the round robin versus The Four Old Guys, however there were only three of them. They had a good game, just lacked some consistency. We were never really at risk in these games, and closed out the match 0-2.

Bracket

With a 2-1 record out of the round robin we went into the difficult end of the Round of 16.

We had to play Skol in the round of 16. Three monster Kubb players including Evan Fitzgerald. We didn’t stand a chance. On top of that, we played horribly. I don’t mind to lose, but our play was really sub-par. It took about 10 mins for them to put us away.

Free Agents, the team that we lost to in the round robin ended up winning the whole tournament.

We had a great day of Winter Kubb! 👍🏻

IMG 4552

IMG 4555

IMG 4562

IMG 4573

IMG 4575

IMG 4579

IMG 4581

IMG 4585

IMG 4565

IMG 4572

IMG 4591

January 27, 2019

Hack the Gap 2019

Hack the Gap hosted their 5th annual Hackathon for women and non-binary individuals this weekend. I was able to attend the demo event today where each team showcased what they created. There were cool ideas, with a lot of progress in such a short period of time.

Hack the Gap Voting Coin

The organizers kicked the demos off.

Hack the Gap Organizers

Securiosity!

Securiosity Presenting

Security education for non-technical people. Built with React. They worked as a group to get the initial things running, then split into feature teams. Design friendly focus. Humaaans free and inclusive image library. Accessibility focused.

🏆 I put my voting coin in for this team. I liked their design and approach to security education.

whenIneedU

whenIneedU Presenting

Helping people break out of episodes of anxiety or depression. Used JavaScript, Java, Android, Twilio. Sends personalized affirmations, relaxing activities, and helps you connect with friends and family. Watches your location and detect if you haven’t gone anywhere for a long time. Uses text messages to reach out and request connections on your behalf.

Ready Play

Ready Play Presenting

Help navigate family daycare, activities and camps for kids, focused on summer activities. Complexity around logistics, themes, and costs. Built using React.js and Elastic Search backend. Framework provided fast mocking, and allowed easy acquisition of real data.

Hack the Bra

Hack the Bra Presenting

Help with sizing and determining best fit for bras. Focusing on measurement for fit. Built with React.js. The BRA-culator” with video walk-through to guide you through measurement. Discovery, rapid prototyping and co-creation were the focus for the team. Not focusing on e-commerce, but instead education.

Make Friends Minnesota

Make Friends Minnesota Presenting

Connect the 5.6 million people in Minnesota. Meet people, make friends, and have fun. Recommends friends. Focused on starting connections safe and easy. Uses Facebook for login. Builds a profile using an interest survey. Built using Node and Express with EJS templating engine.

Seshat Swap

Seshat Swap Presenting

Making access to books written by people of color more accessible, focusing on very long hold times at the library. Try to get more access without having to purchase the book. Allow users to exchange, or indicate wish lists of books, in marginalized communities. Built with React with Firebase. Non-profit effort to pay for shipping costs. Sort of a virtual, crowd funded library.

Cat Flat

Cat Flat Presenting

Small, connected DIY cat shelter that detects health of the cat and provides shelter, warmth and a place for stray cats to stay safe. React app with Express server and SQL database. Particle Photon and Particle Cloud in cat shelter to run sensors. Node server to send data to the server. Revenue by selling the flats pre-made.

A bit to my surprise, I almost voted for this team. I really liked how they used the IoT stuff to make this a smart device.

Little Free Library

Little Free Library Presenting

Leveraging the existing library of micro-libraries. Largest predictor of kids reading levels is the quantity of books in the home. Goal is to make it possible to get 100 books in every home. Card catalog of free libraries close to you, with inventory capabilities to check out or indicate that you are going to keep it. Allow steward to manage their inventory.

Sweat Connect

Sweat Connect Presenting

Need a workout friend? Increase frequency and help friends with anxiety about going to the gym. Create profile and facilitate connecting with others to workout. Built with Angular 7, to allow for desktop and mobile. Gather specific data around your gym, time preferences and goals.

I think this team could have put a go-to-market strategy of partnering with gyms and offering a white-label version of their service.

Planet

Planet Presenting

Planning tools for coordinating gatherings. Event planning templates, collaborate on tasks, and good for discovery. Built React and Node. Google Maps for location.

Give Back

It makes me happy that we at SPS Commerce have been able to support Hack the Gap for a number of years now!

Hack the Gap 2019 Sponsor Board

January 22, 2019

Using API Credentials in Shortcuts

Shortcuts on iOS can do incredibly powerful things, and with a little bit of extra magic you can connect to most APIs as well. Pulling data from APIs, manipulating it, and extending your shortcuts is really powerful. However, you need to have a good way to manage the authentication tokens and secrets for those APIs.

Most Shortcuts I have seen use a Text variable and put the token in that variable. It’s then used throughout the Shortcut. This works, but it exposes problems if you share that Shortcut. It also has issues if you use the same API in multiple Shortcuts. You are now copying that token in numerous places.

Another approach that I prefer is to create Shortcuts that do nothing but return those tokens. You can then call those Shortcuts from another Shortcut to get the token. I prefix these Shortcuts with the prefix Secret”.

Then when I need to use an token for an API I call the Shortcut and then reference the magic variable returned from it. You can even hide the execution of that second Shortcut.

In addition to reuse, you also get other benefits from this approach. Your Secret Shortcut can have some logic. For example, I access Working Copy from Shortcuts and it does so with a local URL call, protected with a random key. That key is specific to each iOS device. So, rather than try to synchronize the keys I have the Secret shortcut return whatever key is right for the device that is running.

I do a similar thing with MailChimp’s API token that requires some encoding be applied to it.

I find this a better way to manage these secret tokens, get reuse, and make it easier to change them. 👍

January 11, 2019

Moving Day

Today the movers will be showing up to move all the big things to our new house! It’s been nearly 9 years since we last moved. It is the first time that our kids are part of the moving process, making it a completely new experience for them.

We have really loved this house and the neighborhood. It’s been a great 9 years, without any reservations.

Tammy and I have watched a couple of episodes of Tidying Up on Netflix. Marie Kondo takes a moment in the beginning of each episode to introduce herself to the house. It’s humorous to see the homeowners in each episode react to her meditatively sitting on the floor doing this. It seems both odd and entirely fitting to communicate with the house.

In my own way, I would like to send a message to our home for the last nine years on Morgan Ave. Thank you. You have been a great place for our family to grow, have fun, and be happy together.”

January 9, 2019

UGears Locomotive

Over the holidays I assembled the UGears Steam Locomotive moving model. It was my second UGears project. I assembled the Chronograph a couple years ago. UGears models are very intricate and the working gears, mostly driven my rubber bands, add a fun aspect to them.

The Chronograph was 107 parts and the Locomotive is four times more at 443. I found the Chronograph directions confusing numerous times. The Locomotive was much more complex, but UGears has vastly improved their manuals.

I made one mistake with the side panels, putting them on the wrong side and reversing the text. I realized too late and didn’t want to try and disassemble it to fix it.

The Locomotive has an impressive set of gears. I haven’t had great luck getting the rubber bad engine” to smoothly move the gears. You use a lot of candle wax as lubricant for the wooden gears, but mine catches too much to work reliably.

The coal car has doors that rise up when you move the lever on the side.

The doors that open and even a retractable ladder are nice details.

Here is the Locomotive sitting next to the Chronograph.

December 30, 2018

Maybe Blot?

There is a bit of a trend on micro.blog to use Blot for longer form blog hosting. I’ve not dug in too deeply largely because it seemed to put Dropbox in the middle of everything, and my initial impression was that it would be a bit too simplistic. Blot has added git support as an option outside of Dropbox, and I really like how they did it. Your Blot site is a Git repo by itself, so there is no dependency on GitHub. If you add an iOS app like Working Copy to the mix you can have robust editing on mobile as well. My other concern about being overly simple is just good user experience. There is a lot of power where you need it, but you don’t have to dig through it all to get the basics.

I’m going to give this a go as well. For some of my sites, particularly my photography one, I think this might be a very good fit.

December 27, 2018

Book: When Breath Becomes Air

I’ve had When Breath Becomes Air” sitting at our cabin for a while, but decided to pick it up and read it on winter break. The book is a memoir by Paul Kalanithi told in two parts. The first part is his path through medical school and becoming a neurosurgeon, being close to serious illnesses, and dealing with death as a Doctor. The second part is after his cancer diagnosis with stage IV lung cancer, which causes his death within 18 months.

There were two things that struck a chord in me while reading this.

I kept thinking back to Being Mortal by Atul Gawande. I’m sure it was in part because Kalanithi, like Gawande, is a Doctor. The first part of the book had many references to the Doctor’s perspective when diagnosing a patient with a terminal illness. This book did too. Being Mortal is a very different book, and one that I highly recommend reading, but this touched on similar topics with a more personal perspective.

The other thing about this book was more personal. It reminded me in so many ways of the path of my friend David Hussman, who passed away earlier this year. He had the same diagnosis, stage IV lung cancer. I’m pretty sure he even had the same EGFR mutation and received similar treatments. Similar to Kalanithi, he did remarkably well for a long while after getting treatment. Enough that you could kind of forget a bit. But the cancer is just held back a bit. I was wishing I would have read this book when I got it, as it would have given me some deeper perspective when talking with David.

September 27, 2018

Goodbye Chase

On Friday evening we had to say goodbye to our dog Chase. We adopted Chase into our family in 2007. The adoption agency had given him the horrible temporary name of Lurch. When we met him, the couple that had been fostering him had named him Chase. I had the fancy idea that a somewhat geeky name like Comet would be better. After a day of trying that out, we realized that he was Chase. It just fit. Chase was a Black Lab / Border Collie mix. Smart, loyal, and full of energy.

We don’t know exactly when he was born, but he was in full puppy mode when he came to us. If Mazie left any wooden toy on the floor, he would chew it to nothing. We learned the hard way that he shouldn’t be allowed on the couch, after the couch upholstery was so trashed it had to be redone.

He was always looking to please. He never ran off, not once. He liked the snow. The Border Collie in him wanted the family always together. He listened well and only barked when he needed something. Almost always a single bark. Our neighbor called him the One Bark Dog” because he would just give a single bark, after waiting a couple of minutes at the door to come in. He even stood in for photos once.

I had grown up around dogs but had never had one. Chase was my first dog and he and I had our rituals. I always fed him in the morning. On the weekends I get up early, and he’d hang out with me while I did whatever. At the cabin we would go down to the dock in the morning with a cup of coffee and look at the water and the occasional bird or fish jumping.

Of course Chase wasn’t just my dog. Mazie loved Chase and would play with him a lot. Tyler declared Chase his best friend in Kindergarten and was hoping to take him to school for show and tell. Tammy liked Chase being around, going on walks and his friendly personality, although his shedding she could have skipped.

I didn’t realize that Labs live to about 12, more or less. I hoped we had more time. I knew Chase was getting older. He was slowing down and enjoyed long afternoon naps at the lake. He would find a spot in the grass and have a good day of it.

Sadly he wasn’t just getting old. We took him in because his teeth looked bad and his breath was beyond bad. We figured he just needed a dental cleaning. They found a growth in his mouth. Melanoma. They cut it out and asked us if we wanted to do cancer treatment. We declined, that seems to me like a hard thing for a dog, especially at his age. He also developed a number of other growths on his chest and stomach. To add to the challenges, he tore both his CCLs and for over a week he couldn’t walk up the stairs in the house. His whole life he also got rashes and sores on his skin. An allergic reaction of some kind. Medication usually helped, but with the cancer the meds didn’t do anything for that. For the last month we’ve had to help him out quite a bit.

On Friday we had a vet come to visit the house. We all went out on the deck. It was a cool evening, just gorgeous. We all sat with Chase petting and soothing him as the vet put him to sleep.

It was tough. I expected it to be difficult, but it was even harder. He was part of our family. Chase was everyone’s dog and we all felt the loss. 😢

I didn’t realize how much he was always there with us, and particularly with me. The mornings have been lonely without him there to do whatever was the plan. When we come home from doing something, there is no welcoming tail wagging at the door with eager eyes.

I miss my buddy.

Chase