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:

↩ Replied to

Nice! This reminds me a lot of the Look Around You series that parodied British science television.

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β„’!

Fri Dec 23
↩ Replied to
post from
Day 3. Today's theme is "breaking news intro song", and also "Aaron attempts to spend less than 5 hours on this today unlike yesterday". I think I accomplished both! #100daysofmusic #100daysproject #the100dayproject

Loving these so far! BTW - what license (if any) are you making your #100daysofmusic posts available under?

Wed Dec 21
↩ Replied to
post from
Currently debating between #100DaysOfMusic or #100DaysOfIndieWeb for my #100Days project.

This sounds like a really great challenge either way! I am rooting for #100DaysOfIndieWeb because I learn so much about #IndieWeb from your stuff.

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.
Mon Dec 19
↩ Replied to
post from
Bikey friends: talk me out of getting this used Brompton folding bike to replace my stolen bike. It's a 2016 M6L from the Clever Cycles rental stock, on sale for $1349 down from the normal price of $1812. It has the Dynamo hub already built in. It seems like a really good deal, …

I love my Brompton. They fold so small that I typically carry it in wherever I ride it. It’s amazing for multi-modal travel; I’ve taken it on buses, trains, taxis, and ferries.

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
↩ Replied to
post from
Hi, Joe. We get that not everyone feels the same about machine learning. If you'd prefer, you may opt out.

It’s overdue, but the new TOS pushed me to act. Tonight I liberated my Evernote content. Likely will import into

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
↩ Replied to

I am going to BIG’s Friday Dec. 16th Show!

Come see Hostel strut our stuff with the help of special guest Charles Graham from Philadelphia, PA!

πŸ” 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 1231, 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 …
Mon Dec 12
↩ Replied to

I am going to Homebrew Website Club Baltimore on 1214!

Join us to work on your own website and take control over what you post online!

Can’t make it out physically? Homebrew Website Club also has a virtual meetup this time around!

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
↩ Replied to
post from
Kristen is a great podcast guest and real-life gem!

@mkphenicie It’s so true! I can’t believe she’s in our improv troupe!

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.