I bought 1st & Goal, an American football board game, last year but hadn’t really played it through until today. Feels like a more detailed simulation of a football game than one might expect for a board game.
🎬 We took our kids to see The Kid Who Would Be King. It is an earnest take on the modern children’s fantasy genre. My older kids enjoyed it but my youngest found it too suspenseful. I thought the costume and set design was terrific. 👍
I hit a wall on a work project earlier this week and I find sometimes it helps to return to an old stomping ground: blogging. I’ve been happy with my Hugo & AWS blog setup but I’m always on the lookout for a better system. Based on positive feedback in the micro.blog community I wanted to try out Blot.im from David Merfield.
Overall, my initial impressions are extremely positive.
Blot hits the sweet spot of a baked blog with the development responsiveness of a more dynamic system. The custom theme system is simple enough to quickly customize but robust enough for someone like me to gently push it a little farther than a custom theme might typically go. There are a lot of nice touches - including a dashboard view of 404 (missing file) requests and a method to help you quickly redirect those to the right place.
The other strong thing Blot has going for it: David. David comes across as a responsive and thoughtful person. Over a couple of days David listened to my stream-of-thought experience with his software and gave helpful feedback while also leveraging our dicussions to improve the Blot software for the community as a whole. I know a the “one person” software model has scaling issues and there’s always risk involved with such a tight coupling of individual to the product but in this case I think David is absolutely the biggest selling point of Blot over something like my previous blog tooling (Hugo.)
The HomePod, by all accounts, “sounds” amazing but the fact that it is a single user device when it comes to the Siri features (“check my email”) seems like a real drawback when the thing is going to live smack-dab in the middle of my living room with family of five Apple users.
Airplay 2 seems pretty cool particularly the ability to stream music to multiple AirPlay devices at the same time. Our current “home speaker” is usually our Apple TV playing music through our TV speakers over HDMI. It is not great but it works and it is easy for everyone to use… for the most part.
I just so happen to have an Airport Express lying around, not used. We retired our Airport-based WiFi network after years of Apple neglecting it and the performance being subpar giving our home’s fast fiber connection. The interesting thing about the Express is that you can disable the WiFi radio, put the device into “bridge mode”, and just plug into your existing router with an ethernet cable.
With that in mind I plugged a pair of old computer speakers that sound reasonably decent into the Airport Express optical audio input. I updated the device’s firmware and used the Airport Utility to configure it as an ethernet-only AirPlay hub as noted. Then I used the Home app on iOS 12 to add it as HomeKit device. This was a little finicky but I had to “Add an Accessory”, then select the manual “I don’t have a HomeKit code” option. It took a few tries but the Express device did show up and was added in a just few seconds. I added it to same HomeKit room as my Apple TV (which is also in the same “main floor” zone.)
From there I went back to my Phone’s Music app picked a song and was able to tap both speaker options and music was streaming at the same time with no lag from both my Apple TV and the Express speaker output. It is pretty amazing. I suspect this setup will not work if I wanted to say watch a movie on my Apple TV and have the Audio come out of both places but I’m going to mess around and see if I can get it to work.
Update: I’m not sure what I was thinking about audio not working from both sources during movies - it works just fine and there was nothing else required. A nice little bit of Apple magic.
If SeaTac Airport is in your top-ten US airports list (at least in 2018) you need to throw out your research and start over. The TSA wait times are terrible 24/7 and the food options stink outside of 9-5 hours.
The results of WebAIM’s second survey of Users with Low Vision is out. One data point of interest was “60.4% always or often use a keyboard for web page navigation” - keyboard support is the biggest deficiency I find in most Web and mobile applications today.
A fresh batch of pizza dough for our Calzone Mummies that we make every Halloween for the kids.
🎵 I came across CVSBANGERS in my iTunes library and it reminded me that things were not terrible for a while.
DEVONthink To GO, an iOS knowledge manager, has powerful search tools but is crippled in odd ways. Example: You can import a photo and it will capture the geolocation but you can’t search by location. ¯\_(ツ)_/¯
ferret is a web scraper written in go that provides it is own declarative language for defining tasks and works over HTTP or on-top of a headless Chrome instance so you can deal with a DOM. I particularly like the interactive command-line tool for exploratiory scraping.
Sans Forgetica is a font “designed using the principles of cognitive psychology to help you to better remember your study notes.” The typeface was created by Stephen Banham, founder of Melbourne’s Letterbox type foundry, along with others from Royal Melbourne Institute of Technology (RMIT) University.
Tonight I downloaded my Twitter archive then wrote a Python script to delete all 15,000+ tweets found in the archived JSONtweet.js file. Twitter brings me only sadness and anger lately. Hilariously, my Twitter archive says I’ve blocked over 18,000 accounts. What a nice place!
Eddie Hinkle suggested I write up how I use Amazon Web Services (AWS) to build this website, so here’s a high-level walk-through.
As a warning to someone who is a bit new to this stack, this may seem like a lot of acronyms or terminology - it is but I’m not sure how much of that is avoidable from AWS’s side of things. Just break things down and do one part at a time and it is not so bad - I find the responsibilities are logically separated.
I did find a lot of tutorials online, but many of them had outdated screenshots of the AWS console interface (missing fields or things that had changed in how they worked.) That said, these were generally the most helpful and should be read before hand:
CloudFront as a content distribution network to speed up content delivery and serve up the contents under SSL
Other factors: I’ve been using Hugo for years and I was already very familiar with AWSS3, AWS CloudFront, and have a deep understanding of HTTP, Content Distribution Networks, Caching, DNS, etc. It does not necessarily matter for this setup but I work entirely from an iPad Pro and this configuration works quite well with my development and writing workflow which relies heavily on Working Copy, Drafts, GoCoEdit, and Siri Shortcuts.
Why CodeCommit over Github or Bitbucket? No reason other than I wanted to use AWS exclusively as a learning exercise. CodeCommit’s free tier is rather generous - private repos, 50gb, 5 users limit. More than enough for my needs.
For CodeBuild, I choose to use the Ubuntu 14.04 “long term support” image. It is not ideal from my point of view to be using an image that will no longer receive support from Ubuntu by next year (2019) but that’s life.
I have a CodeBuild “buildspec” file in my CodeCommit repo that defines the build steps I want to have happen after I push a commit to the repo. It is important to remember that CodeBuild has everything from Ubuntu 14.04 (and the AWSCLI tools) already installed when building. In this case the steps are:
Install Pygments for code highlighting via python’s pip tool.
Download and install the latest Hugo binary
Build the website using Hugo (no additional command line flags were necessary for my needs - everything is defined in my Hugo config file)
Use the AWSCLIS3 tool to sync content over to my S3 bucket. Make sure to use (and set a reasonable for your website) --cache-control setting here.
Use the AWSCLIS3 tool again to set a different --cache-control for my index.html and index.xml - basically a “no-cache” directive. This is important later for CloudFront to not aggressively cache files that will change frequently.
Use the AWSCLIS3 tool again to set a different --cache-control setting for content that is really old (things I posted years ago.) This way CloudFront can hold on to that content much much longer than I might want for my newer material where I might still be fixing a typo or adding an “update” that corrects things.
After the contents have been copied to S3, I issue a curl command to send a WebSub ping to micro.blog letting them know my RSS feed has changed.
Publish a SNS message that have an email subscription to so I can get notifications that my builds have completed.
This an optional step - you could just as easily point your domain name straight to the S3 bucket. I wanted to use SSL and it seems like AWS really wants you to use CloudFront for that need. As a bonus the content is cached and served up quickly to folks depending on their network’s physical location. Presumably if S3 is offline but CloudFront is not - basic HTTPGET requests could conceivably work as long as the file is still in the CloudFront cache.
Website Creation & Posting
Like any static website generator, Hugo defines certain folders and files it expects to find in order to generate your website depending on whether it is building an index page, a single page, or a list of pages.
Here’s what the workflow looks like for me then.
I design and maintain the website templates in GoCoEdit and commit the results to my CodeCommit git repo using Working Copy.
I write posts in Drafts and use a Siri Shortcut to automate creating a new blog post file in Working Copy as well as the git commit/push steps.
CodePipeline monitors CodeCommit & CodeBuild for changes. CodeBuild is ultimately responsible for pushing content out to my S3 bucket but CodePipeline is the glue that automates CodeBuild picking up on CodeCommit changes.
The Siri Shortcut I wrote does a number of “nice” things - it looks for input from an iOS Share Sheet:
website (from Safari)
If it finds no input it’ll give me a little text prompt to type out a quick entry but I mostly trigger this Shortcut from Draft’s “share” action - but it could be triggered from any app that integrates with the iOS share sheet. After that the Shortcut goes to work formatting a Hugo blog entry with all the correct “YAML” front-matter, dates strings, file names, etc. It does all the heavy lifting. This makes posting as frictionless as using Wordpress or any other fancier system, from my POV at least.