Blogroll

The internet of essays

November 2, 2008 — November 6, 2022

academe
computers are awful together
faster pussycat
information provenance
learning
UI
workflow

Content warning:

Contrary opinions

The blog roll of blogs/substacks/mediums etc. that I subscribe to. Apparently, I should mention that reading blogs is a distinct activity from agreeing with or endorsing the opinions of their authors, and thus this list is not a list of people I agree with. The criteria for inclusion in this list are that the blog in question should have written more than one interesting (to me) thing, and also for me to believe they might write more interesting things in the future. Additionally, it helps if they are pleasant to read and have a good signal-to-noise ratio.

For tips on how to use a blogroll, you might want to check feed readers. There is also a machine-readable OPML which you could import into your own feed reader, which would be much easier than clicking on hundreds of links, IMO, but you live your own life.

1 Specialists

These are people producing content in my technical field, or at least near to it.

Figure 1

2 Pundits

Figure 2: Dispatches from the internet trenches

3 Making things

Figure 3

4 Make your own automatic blogroll

This is the script I use to generate a blogroll from my OPML, a.k.a. my list of feed.

#! /usr/bin/env python3
"""
opml_to_blogroll.py

Parse OPML into markdown

opml_to_blogroll.py static/feeds.opml | xclip -selection clipboard
"""
import sys
import re
from xml.etree import ElementTree
from smartypants import smartypants, Attr

#https://pythonhosted.org/smartypants/reference.html#smartypants.smartypants
ATTRS = Attr.D | Attr.e | Attr.q | Attr.u

def main(fname):
    with open(fname, 'r', encoding='utf8') as fp:
        tree = ElementTree.parse(fp)
    for cat_node in tree.find('body').findall('outline'):
        print("\n## {}\n".format(cat_node.get('title', '').strip()))
        for node in cat_node.findall('outline'):
            name = smartypants(node.attrib.get('text', '').strip(), ATTRS)
            name = name.replace("_", r"") # underscores upset the pandoc parser
            line = "* {}".format(name)
            url = node.attrib.get('htmlUrl', '')
            if len(url)>0:
                line = "* [{}]({})".format(name, url)
            feedurl = node.attrib.get('xmlUrl', None)
            line += " ([feed]({}))".format(feedurl)
            print(line)


if __name__ == "__main__":
    main(*sys.argv[1:])

Your feed reader can likely import that OPML and subscribe you to all of these at once, if you want to swim in the same waters I do