Marty McGuire

Archive for December 2016

Tue Dec 6

🗓️ 2017: The Year of Peak Sloth - Live Podcasting Event

Single Carrot Theatre 2600 N Howard St Baltimore MD 21218
📆 Add to Calendar: iCal | Google Calendar

Join us for a night of live podcast recordings from We Have to Ask, The Digression Sessions and Hobo Radio and improv brought to you by the Baltimore Improv Group.

2016 has been a rough year filled with tragic celebrity deaths and awful headlines. It’s time to say so long so we can look to the future. It’s time to look to 2017: The Year of Peak Sloth.

So before you head out to drink and party 2016 away, join the Peak Sloth Podcast Network for a live podcast event at the Single Carrot Theatre!

Admission is free! Beverages may be available! Live music may be part of the show! Celebrity guests may be interviewed! The only way to find out is to be there!

Fri Dec 30

🗓️ BIG Mainstage Performance Dec 30

Single Carrot Theatre 2600 N Howard St Baltimore MD 21218
📆 Add to Calendar: iCal | Google Calendar

Remote Possibilities makes their debut at the Single Carrot Theater tonight at 8pm.

It will be a special show because we will have some SPECIAL GUESTS!

The only way to find out who is to pay $5 and come to the show.

Tickets available here:

Thu Dec 29

After today, there are only two more days in 2016.

Coincidentally, that’s two final opportunities to see me do some improv comedy!

Friday, Dec 30th, at 8pm, come see Remote Possibilities make up a TV show for you at the Single Carrot Theatre!

Finally, on New Years Eve, from 6-8pm, also at the Single Carrot Theatre, have a few drinks and laughs with us at the Peak Sloth Podcast Network’s live podcasting event! We’ll have live shows from The Digression Sessions Podcast,’s Hobo Radio, and We Have to Ask featuring special guest Heather Moyer! But that’s not all! We’ll also have some improv thanks to some wonderful players from the Baltimore Improv Group!

So come on out and laugh as 2016 finally drains away!

Sun Dec 25

It’s a Christmas Miracle™!

Tue Dec 20

Thanks to our guest Terry Withers for makin’ it hot this week!

post from Do You Sweat The Small Stuff? • Ep 29 - Terry Withers
Jonathan and Marty sit down with scientist Terry Withers to discuss his research into human sweat. The team answers audience advice questions.
Sun Dec 18
📗 Want to read How to Make Sense of Any Mess: Information Architecture for Everybody by Abby Covert
📗 Want to read The Hardware Hacker: Adventures in Making and Breaking Hardware by Andrew Huang ISBN: 9781593277581
Sat Dec 17

Great write-up by Aaron Parecki about web reviews, the dangers of letting individual companies control standards.

post from Why Microformats? Owning My Reviews
Back in October, I wrote a bunch of short mini-reviews on products and services that I use regularly. I published them all on a single page called "Favorite Things". In the past, I've written a couple of reviews on Amazon and then copied them to my website as a blog post.I …
📕 Finished reading Resilient Web Design by Jeremy Keith
Wed Dec 14

🗓️ BIG's Friday Show 12/16

Single Carrot Theatre 2600 N Howard St Baltimore MD 21218
📆 Add to Calendar: iCal | Google Calendar

Marvel at the improv stylings and comedic flourishes of BIG’s best performers.

Tonight’s show featuring: Hostel, Heather w/Strangers, Dad Joke, GUS

Tickets available here:

Fri Dec 16

This chemical/fluidics powered soft robot octopus is extremely amazing.

Wed Dec 14

HWC Baltimore 12/14 Wrap-Up

Baltimore's final Homebrew Website Club meet up of 2016 happened at the Digital Harbor Foundation Tech Center on 12/14/2016. We had a nice quiet writing hour followed by discussion and demos!

Notes from the "broadcast" portion of the meetup:

Jonathan Prozzi (co-organizer) - Completed 2017-01-01 commitments of h-feed and h-entry markup. Working on webmentions setup. Also figuring out separate post types (e.g. status vs articles). Also settled on a permalink and taxonomy structure. Documenting process of making an indieweb-compatible Hugo theme. Added self to /hugo.

Jean-Carlos Cedré - Has an older website. Wants to revisit it and get portfolio pieces on there. Might want to move off of Wordpress.

Marty McGuire (co-organizer) - Completed image-related 2017-01-01 commitments. Needs to write up some new ones. Working on owning his own events. Event posts with photos now get a nice Facebook-inspired poster look to them. Added upcoming events section to home page. Wants to add RSVPs to that list. Also working on a new micropub client for creating and RSVPing to events. Discussion led to the name suggestion "Slater".

Adam Bouhmad - been focusing on classwork, Docker, GitHub issues. In 2017 wants to get back to working on a malware collection site, starting with a UI design.

Here's the customary HWC group selfie:

Left-to-right: Jean Carlos, Jonathan, Adam, Marty

We also took the time to tune in with the Virtual HWC meetup. Sorry to all the folks in quiet time that had to listen to us have our social time. :}

We are excited about the turnout and the discussions at HWC Baltimore so far! We hope you'll join us for the first HWC Baltimore of 2017 on 1/25!

Tue Dec 6

🗓️ Homebrew Website Club Baltimore Meetup 12/14

Digital Harbor Foundation Tech Center 1045 Light St. Baltimore MD 21230
📆 Add to Calendar: iCal | Google Calendar

Create or update your personal web site!

  • Finish that blog post you’ve been working on.
  • Demos of recent IndieWeb breakthroughs.
  • Share what you’ve gotten working.
  • Ask the experts questions.

Join a community with like-minded interests. Bring friends that want a personal site!

Any questions? Ask in chat:

Optional quiet writing hour starts at 6:30pm. Meetup begins at 7:30pm.

More information:

Facebook event:

Tue Dec 13
🔁 Reposted
post from Introducing Resilient Web Design
I wrote a thing. The thing is a book. But the book is not published on paper. This book is on the web. It’s a web book. Or “wook” if you prefer …please don’t prefer. Here it is:

Hey! You’re already planning on coming to the Peak Sloth Podcast Network’s New Years Eve live podcasting event at the Single Carrot Theatre from 6-8pm on 12/31, right??

Sure, I know you’re excited about the chance to see live shows from The Digression Sessions Podcast and Hobo Radio, plus improv from the Baltimore Improv Group along with snacks and booze.

Let me add fuel to that fire because Jonathan and I will be putting on a live, improvised episode of We Have to Ask with EXTREME SPECIAL GUEST HEATHER MOYER!!

Did I mention that admission is free??

post from
Single Carrot Theatre 2600 N Howard St Baltimore MD 21218
2017: The Year of Peak Sloth - Live Podcasting Event
Join us for a night of live podcast recordings from We Have to Ask, The Digression Sessions and Hobo Radio and improv brought to you by the Baltimore Improv Group.

Thanks to our guest Jon Ulrich for putting the old in old school for this episode!

post from How Do You Kick It Old School? • Ep 256 - William Winkle
Jonathan and Marty go even more old school than usual with guest William Winkle, whose memories extend back to WW I.

Great post from @aaronpk about his #IndieWeb setup. I should make one of these!

post from A Brief Intro to My Website Architecture
This is a description of all the pieces and tools that I use to post to my website and handle comments and responses. Many of the pieces are open source and/or based on open protocols that you can implement yourself.WritingI write posts using an app called Quill. It's an open …
Wed Dec 7

Great writeup by about the positive effects of setting aside even an hour a month to learn and work on new things.

Tue Dec 6

Thanks to our guest this week Kristin L. McKenzie for teaching us that there are always more ways to share.

post from Do You Care Enough To Share? • Ep 72- LeeAnn of P.E.T.I.
Jonathan and Marty chat with LeeAnn of PETI about her mission to make humans more tolerant of our friends with more than 4 legs. A question from listener Alex B leads to sharing disappointing ride-share stories.
Mon Dec 5

Rescuing my tiny videos from Vine

Ah, Vine. I loved the idea of a platform for sharing tiny video moments. It was truly a platform for some really amazing things.

Personally, I didn't make very many posts. Most that I did centered around my involvement with the BlinkyTape Kickstarter that we ran at the height of my awareness of Vine. So, while I had not thought about Vine for quite some time, I was disappointed to hear that it was shutting down the ability to upload.

Announcement like these tend to trigger my site-deaths reflex, so although they have announced plans for some kind of easy export mechanism, I thought: why wait?

This post documents the haphazard, poke-it-with-a-stick-and-see-what-happens method by which I rescued my Vines and their metadata to post them on my own site.

Getting all my Vine URLs

First up, I needed a way to get all of the permalinks to my Vines. The first stumbling block here was that Vine uses an "infinite scroll" technique that shows only the latest vines until you scroll down the page, triggering it to load more for display. Checking out the source of the page, I realized that I could simply scroll to the bottom of my List view to get all the Vine metadata loaded into the page, and I could then open up the Developer Console for Chrome, and drop in a short one-liner to print out all the URLs for my permalinks:

> console.log($('li.permalink a').map((i,el) => el.href));
["", "", ...

After copying this to a text file and editing out all the quotes and commas, I had a simple text file with the permalink for one of my Vines on each line.

Fetching the HTML

Next up, I grabbed the HTML for each Vine's permalink with a simple script:

#!/usr/bin/env bash
# Usage: ./ < some_file_full_of_vine_urls.txt
while read url
do # each vine has a unique id after the last '/' character
id=`echo "${url}" | cut -d'/' -f 5`
if [ ! -f "${html_file}" ]; then
wget -O "${html_file}" "${url}"
sleep 5

Extracting the Useful Data

It's often "enough" to have all the HTML on a page - you can write a script to parse the HTML, select out various attributes and text values from the elements on the page, and grab whatever data you need. In the case of Vine, they make it a little easier. Each HTML page has an embedded <script> element in JSON-LD format:

After playing with the data in there a bit, I wrote a quick script using the pup command line tool to do parse the HTML and extract the (valid parts of the) JSON-LD chunks from each HTML page.

#!/usr/bin/env bash
# Usage: ./ htmls/*
# Extract <script type="application/ld+json"> content from Vine
# page, filtering out attributes that are not valid JSON.
# - description - invalid quoting and redundant with author and name values
# - duration - invalid non-value
for html_file in "$@"
id=`basename "${html_file}"`
if [ ! -f "${jsonld_file}" ]; then
pup 'script[type="application/ld+json"] text{}' < "${html_file}" \
| grep -v '"description":' \
| grep -v '"duration" :' \
> "${jsonld_file}"

These JSON-LD chunks gave me all the metadata I cared about, including URLs to the media that I wanted to save: the videos, their thumbnail images, and the avatar image that accompanied each post. So, it was time to write tools to extract those, too. One of my recent favorite command line tools is jq aka "sed for JSON", so I used that to extract the URLs I needed to fetch all the media.

The videos:

#!/usr/bin/env bash
# Usage: ./ json_lds/*
for jsonld_file in "$@"
id=`basename "${jsonld_file}"`
if [ ! -f "${video_file}" ]; then
video_url=`jq -r '.contentUrl' < "${jsonld_file}"`
wget -O "${video_file}" "${video_url}"
sleep 6

The thumbnails:

#!/usr/bin/env bash
# Usage: ./ json_lds/*
for jsonld_file in "$@"
id=`basename "${jsonld_file}"`
if [ ! -f "${thumb_file}" ]; then
thumb_url=`jq -r '.thumbnailUrl' < "${jsonld_file}"`
wget -O "${thumb_file}" "${thumb_url}"
sleep 6

And finally, the avatars. I really could have just manually saved my one avatar image, but that is not my way. Instead, this script finds every avatar URL, hashes that URL to get a filename-safe name, and fetches it (once):

#!/usr/bin/env bash
# Usage: ./ json_lds/*
for jsonld_file in "$@"
avatar_url=`jq -r '.author .image' < "${jsonld_file}"`
id=`echo "${avatar_url}" | shasum - | awk '{ print $1; }'`
if [ ! -f "${avatar_file}" ]; then
wget -O "${avatar_file}" "${avatar_url}"
sleep 6

Finally, it was time to synthesize all of this info to put these Vines on my own site. I currently use Jekyll to generate my website, so I wrote a pair of scripts to convert the JSON-LD data into Jekyll posts. First, a Python script that converts a single Vine into a Jekyll post with YAML metadata:

#!/usr/bin/env python
import json
import sys
import yaml
import os
with open(sys.argv[], 'r') as f:
jsonld = json.load(f, )
vineid = os.path.basename(jsonld['url'])
post_meta = {
'date': jsonld['datePublished'],
'files': [ vineid + ".mp4" ],
'filemeta': {
(vineid + ".mp4"): {
'poster': (vineid + ".jpg")
'h': 'entry',
'syndication': [ jsonld['url'] ],
'vine_metadata': jsonld,
'updated': jsonld['datePublished']
content = jsonld['name']
print "---"
print yaml.safe_dump(post_meta)
print "---"
print ""
print content

And finally a shell script to run the Python converter over each JSON-LD file, save the resulting Jekyll post output in the appropriate place, and copy over the related media assets:

#!/usr/bin/env bash
# Usage ./ json_lds/*
for vine in "$@"
vineid=`basename "${vine}"`
vinedate=`jq -r '.datePublished' < "${vine}"`
filename="${BASEDIR}"/_posts/`date -j -f "%FT%H:%M:%S" "${vinedate}" +"%F-%H%M%S"`.md
asset_dir="${BASEDIR}"/_assets/posts/`date -j -f "%FT%H:%M:%S" "${vinedate}" +"%Y/%m/%d/%H%M%S"`
echo "${vine}"
mkdir -p "${asset_dir}"
cp videos/"${vineid}.mp4" "${asset_dir}"
cp thumbs/"${vineid}.jpg" "${asset_dir}"
python "${vine}" > "${filename}"

At last, I created a Jekyll include to render the Vines out as HTML5 video elements, with the thumbnail as the poster image, visible play controls, and the obligatory feature of looping forever once started. My Jekyll theme is a bit out of scope for this post, but it pretty much looks like this:

{% raw %}{% capture poster %}
  {% if include.filemeta and include.filemeta.poster %}
    poster="{{ page | asset_path | append: include.filemeta.poster }}"
  {% endif %}
{% endcapture %}{% endraw %}
<video loop controls {{ poster }} style="width: 100%">
<source class="u-video" type="video/mp4" src="{{ include.asset }}" />

What is the end result? How about some example posts?

While I am not particularly happy that Vine is seemingly closing down, I do enjoy data liberation projects like these. I learned a bit about how Vine was built, got to play with some neat tools, and I now own my Vines, having brought them into my own site. While I'm not in control of whether Vine works in the future, I do have control over the future of the videos that I posted there.

Was this useful to you? Let me know! I don't have my #indieweb comments system in place, yet, but you can hit me up on Twitter or Facebook and I'd love to read your thoughts!

Thu Dec 1

Almost went for the Nitro cold brew at 3 Bean. Made a more relaxed choice of tea at the Bun Shop.