I had the crazy idea last night that I should bundle Ethan the Dog into the bicycle trailer and ride out to the Dog Fun Park near the Queen Elizabeth Hospital so that he could get some exercise. This despite Ethan the Dog never having been in the bicycle trailer before, despite the 26ºC temperature, despite the Dog Fun Park seeming impossibly far from our house, and despite there being a chance that the Dog Fun Park wouldn’t actually be open, as it’s undergoing expansion.

Surprisingly, given all of this, it all went relatively smoothly. I did discover that a bicycle trailer is not a naturally comfortable place for dogs, at least on the first ride, so Ethan was a little ornery. Fortunately I was able to strap him in with his car seatbelt, so there was no danger of him leaping out of the trailer to chase a squirrel; he did, however, manage to nose his way through the mesh cover on the front of the trailer.

Ethan in the bicycle trailer

The highlight of the trip, for me at least, was discovering that it’s possible to cycle almost the entire distance from Joe Ghiz Park to the Dog Fun Park on a paved cycle trail that runs up Riverside Drive and then around the Queen Elizabeth Hospital along the Hillsborough River. The City of Charlottetown has a brochure that describes both trails:

11. Riverside Drive Path Distance 1.5 KM
The asphalt path begins at Park Street and runs along Riverside Drive and ends at Murchison Lane.
12. Hillsborough River Path Distance 1.2 KM
This asphalt path begins at the corner of Riverside Drive and Murchison Lane, and runs along the Hillsborough River, ending at Hillsborough Hospital.

I’d known about these two paths from many trips out to the hospital and to the dog park, but this was my first timing seeing them up close, so I turned on Google Fit for the cycle ride home and it made me a nice map of the route:

Google Fit map of my cycle ride to the Dog Fun Park

Google Fit has the distance from Dog Fun Park to home at 4.89 km, making the round trip 9.78 km. So, not “impossibly far,” but still longer than I’ve cycled in a long time.

Looking at OpenStreetMap this morning I discovered the both the path along Riverside Drive and the path along the Hillsborough River were missing; this is likely because they’re both difficult to make out from satellite imagery. I remembered that Google Takeout should allow me to export my ride from last night, which I should then be able to import as a trace into OpenStreetMap and use as a basis for adding the paths.

Sure enough, I found an option to export my Google Fit data in Takeout:

Google Takeout screen shot showing Google Fit export

I choose “Include all Fit data” and, a couple of minutes later, I had an 8 MB ZIP file with every single data point from Google Fit I’ve accumulated since I installed it in 2015. In the “Activities” folder inside the ZIP file was a file named 2018-07-09T18_43_53-04_00_PT35M3S_Cycling.tcx that contain the log of my cycle trip back from the dog park. The “.tcx” file extension is a Garmin-originated file format called Training Center XML that’s like GPX, but formatted to represent activities rather than just points. Here’s how it starts out:

<?xml version="1.0" encoding="UTF-8"?>
<TrainingCenterDatabase
    xmlns="http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2"
    xmlns:ns2="http://www.garmin.com/xmlschemas/UserProfile/v2"
    xmlns:ns3="http://www.garmin.com/xmlschemas/ActivityExtension/v2"
    xmlns:ns4="http://www.garmin.com/xmlschemas/ProfileExtension/v1"
    xmlns:ns5="http://www.garmin.com/xmlschemas/ActivityGoals/v1"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2 http://www.garmin.com/xmlschemas/TrainingCenterDatabasev2.xsd">
    <Activities>
        <Activity Sport="Biking">
            <Id>2018-07-09T22:43:53.636Z</Id>
            <Notes>Biking</Notes>
            <Lap StartTime="2018-07-09T22:43:53.636Z">
                <Track>
                    <Trackpoint>
                        <DistanceMeters>0.0</DistanceMeters>
                        <Time>2018-07-09T22:43:53.636Z</Time>
                    </Trackpoint>
                    <Trackpoint>
                        <DistanceMeters>29.938282012939453</DistanceMeters>
                        <Time>2018-07-09T22:43:54.000Z</Time>
                        <Position>
                            <LatitudeDegrees>46.26018524169922</LatitudeDegrees>
                            <LongitudeDegrees>-63.097129821777344</LongitudeDegrees>
                        </Position>
                        <AltitudeMeters>-6.199999809265137</AltitudeMeters>
                    </Trackpoint>

That first “Trackpoint” is the Dog Fun Park, and it continues with Trackpoints all the way home.

OpenStreetMap won’t read TCX files, but it will read GPX files, and GPSBabel will helpfully convert from one to the other:

Screen shot of GPSBabel, showing the conversion from TCX to GPX

The result of the conversion was a file cyclepath.gpx, ready for import into OpenStreetMap.

From the OpenStreetMap Upload GPS Trace page, I uploaded the GPX file:

Screen shot of OpenStreetMap Upload GPS Trace page

After a few minutes for processing, OpenStreetMap had the trace ready for use.

OpenStreetMap screen shot showing GPS trace processed

The Riverside Drive Path turned out to be easy to trace from satellite imagery, so I did that first, creating lines for parts of the path and for the crosswalks along the way, and adding them all to an OpenStreetMap Relation called Riverside Drive Path.

For the Hillsborough River Path, which is obscured by the tree canopy, I turned on the GPS Traces layer in the OpenStreetMap editor, and my cycle route appeared as a green line on the map:

Turning on GPS Traces in OpenStreetMap

Once I started adding the cycle path I realized that there are actually two paths involved in the journey from the corner out to the dog park: along the river to Hillsborough Hospital is the Hillsborough River Path, but once you turn inland it becomes the Hillsborough Park Path, which the city describes as:

13. Hillsborough Park Path Distance 0.8 KM
This asphalt path connects to Hillsborough River Path and runs along Murchison Lane and turns left and runs along Patterson Drive, ending at Pioneer Avenue.

So I started by adding a new OSM Relation called Hillsborough Park Path, and added all the lines and crosswalks to the relation. I then created a Hillsborough River Path relation, and combined some existing lines near the hospital with new lines over my GPS traces, and some new crosswalks.

With all of this in place, all three paths appear not only on OpenStreetMap itself, but on derivative works like Waymarked Trails, where you can now see all three:

Screen shot of Waymarked Trails, showing the three new paths

I’m happy that our night’s outing not only resulted in exercise for me, exercise for Ethan, but also some new open data for the community to profit from.

🗓️

Following on from yesterday’s experiments, I did some exploring today in Gephi, an open source graph visualization program.

Gephi will load DOT language files, of the type I generated yesterday showing the interconnections between my blog posts, and has a dizzying array of options for configuring the resulting visualization.

What emerges is something considerably more usable than the images I generated yesterday in OmniGraffle.

For example, this one, which I created using a combination of the Fruchterman Reingold and ForceAtlas 2 layouts:

Gephi visualization of the interconnections between my blog posts

This visualization shows a bunch of smaller clusters of interlinked posts–anywhere from two posts that are linked to a dozen—gravitating around a large central cluster of posts that are all linked together.

Exploring that dense central cluster I see that it consists almost entirely of posts about letterpress and travel; for example, here’s a detail showing links out from Spending the Summer in Berlin,

Detail of Gephi visualzation, showing links to and from one post

Here’s another detail, showing my post about Akzidenz Grotesk and its connections:

Another detail from the visualization

The linkfulness of posts about letterpress and travel makes sense: when I travel I visit people and places, often people and places I’ve visited before, and so I do a lot of linking; similarly, when I write about printing, I’ll refer to typefaces, or earlier projects, or the previous step in the current project.

In the outer reaches of the blog post galaxy are smaller, isolated, microclusters of posts: some of these are instances of a sudden interesting that quickly waned, like my interesting in Ruskin, PEI, which linked The Lost City of Ruskin to my post about the Ruskin Post Office. Others of these are simply times that I was writing in a less-linky way.

 

Outer regions of my posting galaxy

Note shown, of course, are the thousands of posts where I didn’t link to myself at all: a star system of lonely isolated posts disconnected from the rest.

Gephi is a tool that rewards experimentation, and so I’ve more experimenting to do. My next step, I think, is to look not at posts by the links between them, but rather by the tags I’ve applied to them.

🗓️

Earlier today I mused about linking to myself:

Discovering that I refer back to earlier posts as often as I do makes me wish I had a way of visualizing the interconnections between my posts; now that I have the building blocks for this, I’ll see what I can do about this.

Then I remembered that I did some graph visualizing work 10 years ago, as part of the OpenCorporations.org project, that allow inter-corporate of Prince Edward Island corporations to be visualized by generating DOT language files.

So I did the same thing for the 8,110 blog posts I’ve written here since 1999.

I wrote a script to go through each post and extract the links from one ruk.ca post to another ruk.ca post: there were 1201 of them in total.

As a byproduct of the counting, I found the most popular posts (measured by how often I link to them):

  1. Welcome to The Reinventorium (12 links)
  2. Adana Eight Five (10 links)
  3. Akzidenz Grotesk (10 links)
  4. How to Levee (9 links)
  5. The Golding Jobber No. 8: It’s Alive! (7 links)

I then wrote this to a DOT file, and then visualized the DOT file in OmniGraffle, and the result looks like this in the “radial” rendering:

 

Visualization, in OmniGraffile, of the DOT file

It’s hard to do justice to just a dense array of interconnections in such a small space as this, but you can get a sense of the nature of the forest even at this level.

Even less comprehensible, but still interesting, is the “hierarchical” rendering in OmniGraffle:

Hierarchical rendering of DOT file in OmniGraffle

Here’s a detail of that rendering:

Detail of hierarchincal rendering of DOT file

If you want to explore the rendering in more detail, I’ve exported a PDF file that you can zoom in and out of.

🗓️

By way of testing out my Webmention module for Drupal, I took the 256 posts I’ve written here this year, ferreted out all the external links, discovered their Webmention endpoints, and sent a Webmention.

Those 256 posts contained 840 links in total; of those links, 149 were to a target that supported Webmention.

This seemed like a lot until I realized that I link to myself a lot–to posts written earlier–and as my site supports incoming Webmentions, those get counted; of the 149 eligible targets, 105 were here on ruk.ca and 44 were on other websites.

Of those 44 targets supporting Webmention, the site-by-site breakdown is this:

Of those 44 targets, the HTTP status code sent back in response to the Webmention was:

  • 200 - 19
  • 201 - 9
  • 202 - 5
  • 400 - 11

The 200, 201 and 202 response codes are variations of “ok, we got it,” meaning a total of 33 Webmentions, or 75%, were successful.

Those 11 attempts that returned a 400 (error) were for two reasons:

  • 9 returned “Target is not a valid post” - these were instances where I’d link to a home page, or a taxonomy page, or an about page, rather than a post.
  • 1 was a malformed link, which was my fault
  • 1 returned “Pings are disabled for this post.”

Discovering that I refer back to earlier posts as often as I do makes me wish I had a way of visualizing the interconnections between my posts; now that I have the building blocks for this, I’ll see what I can do about this.

🗓️

A couple of years ago I turned on AMP rendering of pages here, a sop for Google, which was pushing this as a way of improving the browsing experience for mobile users.

While this was a relatively benign change, and one easy to implement with Drupal Accelerated Mobile Pages module, it never completely felt right, and so today I’ve turned it off.

To do this, I:

  1. Disabled the AMP module in Drupal.
  2. Added a 301 redirect for the AMP pages to the canonical non-AMP version:
  # Redirect AMP pages to canonical version
  RewriteCond %{QUERY_STRING} amp
  RewriteRule ^ %{REQUEST_URI} [L,R=301,QSD]

As a result of this, if you visit this site, via a Google search result, on a mobile device, you’ll see the site as I intend, not in a pared-down AMP view.

🗓️
AMP  •  Google  •  Search

As I mentioned when I was talking about my nascent Webmention setup, the tiny Drupal module I’ve coded up only sends Webmentions, it doesn’t (yet) receive them: for that I’m outsourcing things to Webmention.io.

This was as simple as inserting two lines in the header of each page of this website:

<link rel="pingback" href="https://webmention.io/ruk.ca/xmlrpc" />
<link rel="webmention" href="https://webmention.io/ruk.ca/webmention" />

Once I authenticate myself on Webmention.io as the owner of this site, I have access to a “dashboard” that shows me all my Webmentions; right now there’s only one, resulting from this post on Ton’s blog:

Webmention.io Dashboard showing one Webmention

I can also query Webmention.io’s API with a simple GET request, including the target, like:

https://webmention.io/api/mentions?target=https://ruk.ca/content/heres-my-opml

which returns JSON with all the Webmentions sent to that target:

{
  "links": [
    {
      "source": "https://www.zylstra.org/blog/2018/07/4347/",
      "verified": true,
      "verified_date": "2018-07-08T07:59:45+00:00",
      "id": 532400,
      "private": false,
      "data": {
        "author": {
          "name": "Ton Zijlstra",
          "url": "https://www.zylstra.org/blog/author/admin-2/",
          "photo": "https://webmention.io/avatar/secure.gravatar.com/59b7acc0ea30bd7a2bf210318b4640c2d1fe5d7d8f6358513edc1df0bd842535.jpg"
        },
        "url": "https://www.zylstra.org/blog/2018/07/wrapping-my-head-around-webmentions-pt-2/",
        "name": "#4347",
        "content": "<p>Hey Brad, <a href=\"https://ramblinggit.com/2018/07/the-indieweb-discovery-and-web-search/\">discovery</a> is why I started publishing the <a href=\"https://www.zylstra.org/blog/2018/04/time-for-a-return-of-the-blogroll/\">feeds I read as opml</a> for others to explore, and some I read <a href=\"https://ruk.ca/content/heres-my-opml\">do so too</a>. In <a href=\"https://www.zylstra.org/wp/wp-content/uploads/2018/07/Schermafbeelding-2018-07-03-om-15.07.38-541x1024.png\">2005 I used to have photos of blog authors I read</a>. Do you publish your feed list somewhere? <a href=\"https://tomcritchlow.com/feeds/\">Tom Critchlow also shows all the content of the feeds he follows</a> on his site. Works well as a discovery mechanism too I found. Maybe I’ll start doing that as well from my <a href=\"http://tt-rss.org\">TinyTinyRSS</a> instance I installed earlier this week.</p>\n<ul>\n<li style=\"background-color:#b3b3b3;\"><a href=\"https://share.diasporafoundation.org/?url=https%3A%2F%2Fwww.zylstra.org%2Fblog%2F2018%2F07%2F4347%2F&amp;title=%234347\" title=\"Share on Diaspora\" style=\"background-color:#999;color:#fff;\">share </a></li>\n<li style=\"background-color:#9baec8;\"><a title=\"Share on Mastodon\" style=\"background-color:#2b90d9;color:#fff;\">share </a></li>\n<li style=\"background-color:#1488bf;\"><a href=\"https://www.linkedin.com/shareArticle?mini=true&amp;url=https%3A%2F%2Fwww.zylstra.org%2Fblog%2F2018%2F07%2F4347%2F&amp;title=%234347\" title=\"Share on LinkedIn\" style=\"background-color:#0077b5;color:#fff;\">share </a></li>\n<li style=\"background-color:#32bbf5;\"><a href=\"https://twitter.com/share?url=https%3A%2F%2Fwww.zylstra.org%2Fblog%2F2018%2F07%2F4347%2F&amp;text=%234347&amp;via=ton_zylstra\" title=\"Share on Twitter\" style=\"background-color:#55acee;color:#fff;\">tweet </a></li>\n<li style=\"background-color:#4273c8;\"><a href=\"https://www.facebook.com/sharer/sharer.php?u=https%3A%2F%2Fwww.zylstra.org%2Fblog%2F2018%2F07%2F4347%2F\" title=\"Share on Facebook\" style=\"background-color:#3b5998;color:#fff;\">share </a></li>\n<li style=\"background-color:#a8a8a8;\"><a href=\"mailto:?body=https%3A%2F%2Fwww.zylstra.org%2Fblog%2F2018%2F07%2F4347%2F&amp;subject=%234347\" title=\"Send by email\" style=\"background-color:#999;color:#fff;\">e-mail </a></li>\n</ul>",
        "published": "2018-07-05T16:50:27+00:00",
        "published_ts": 1530809427
      },
      "activity": {
        "type": "link",
        "sentence": "Ton Zijlstra posted 'Hey Brad, discovery is why I started publishing the feeds I read as opml for oth...' linking to https://ruk.ca/content/heres-my-opml",
        "sentence_html": "<a href=\"https://www.zylstra.org/blog/author/admin-2/\">Ton Zijlstra</a> posted 'Hey Brad, discovery is why I started publishing the feeds I read as opml for oth...' linking to <a href=\"https://ruk.ca/content/heres-my-opml\">https://ruk.ca/content/heres-my-opml</a>"
      },
      "target": "https://ruk.ca/content/heres-my-opml"
    }
  ]
}

You’ll see that it includes a host of rich metadata about the Webmention, including the contents of the posts with the mention, a snippet that includes the sentence in which the mention appears, and the name and avatar of the author.

Right now I’m not rendering that anywhere on my original post; I’m considering whether the best way to do that is to simply pull the Webmentions in real time via JavaScript or, instead, to set up a webhook at Webmention.io that pushes the Webmentions to a process in my Drupal that converts them to a regular old Drupal comment.

🗓️

As the Charlottetown Farmers’ Market enters its chaotic July season, with the aisles clogged with the agog, it’s nice to seek solace in the arms of its Cardigan cousin,where Ola Hammarlund will make you a cappuccino and his son Leif will whip up a chocolate milkshake.

🗓️

Ton continues to wrap his head around Webmention, and wonders about how mentions should be displayed on the “mentioned” site:

What strikes me as odd now is how little control I have over how the Webmention and Semantic Linkbacks plugins actually deal with webmention data. The stuff I’d like to show is stored in my database, but I can’t through the plugins determine how that is shown.

The same is true on the flipside: my site adds microformats so others can machine read my blog, but apparently it doesn’t do it right. Yet I have no control from the mentioned plugins interfaces over how that is done, nor do I have documentation / insight into how the plugins are designed to comply with microformat specifications.

The h-entry page on the Microformats Wiki sheds some light on this, providing some options for marking up links in a way that affects the semantics, and the rel-values page in the IndieWeb wiki has some further discussion of options, but there doesn’t yet seem to be a clear way forward here.

It does seem like it would be useful to allow an author to add semantics to links that would differentiate between commenting, mentioning, liking and re-posting, and that seems to be the way that things are headed.

Looking at a section of Ton’s post, for example, where he links both to Sven Knebel’s contribution and to his own, both links are marked it with u-in-reply-to:

<p>I very much appreciate how <a href="https://www.svenknebel.de/posts/2018/7/4/" class="u-in-reply-to">Sven Knebel extensively responded</a> to my previous <a href="https://www.zylstra.org/blog/2018/07/wrapping-my-head-around-webmentions/" class="u-in-reply-to">posting on some Webmention issues</a> I came across. Some of his responses do make me have new questions.</p>

While he’s clearly replying to Sven’s post, Ton’s reference to his own post isn’t really “in reply to” himself, it’s merely mentioning it; perhaps these mentions should be rendered differently?

🗓️
Webmention  •  IndieWeb  •  Microformats

In this morning’s University of Winds newsletter, Mita Williams points to ici, a tool created by Ed Summers to help people help fill in missing imagery on Wikipedia.

While trying it out, I discovered that the Wikimedia Commons app includes the same functionality, so I decided to see how it works.

Opening the app for the first time, and giving it permission to access my current location, it shows me nearby Wikimedia Commons entries that are missing an image:

Wikimedia Commons App: Nearby Places view

Tapping on the nearest icon, I see that it’s the Honourable George Coles Building, just half a block from my house:

Wikimedia Commons App: Nearby Places view, showing nearest nearby place

Tapping the “+” icon, I can take a photo, and then, after confirming I want to upload it, I can add some metadata:

Wikimedia Commons App: saving new image

Clicking “send” uploads the image to Wikimedia Commons where, indeed, it sits there waiting to be used.

What I realized after uploading four images is that all the app does is to facilitate the upload; it doesn’t actually associate the images with the place it originally identified, it simply geotags them and makes them available for further use in the Wikipedia universe.

So, taking things forward, I created a Wikimedia Commons category called Honourable George Coles Building (Charlottetown) and, using the All Souls’ Chapel category as a template, I fleshed out the metadata.

Next, I edited the Wikidata entry that got me started, clicked “Add Statement” and added the images I’d just uploaded.

Finally, I edited the List of historic places in Charlottetown page in Wikipedia and added a thumbnail image and a link to the Wikimedia Commons category page.

Now that I’ve been through this once, the next time around should be all that much easier; and there’s a good collection of “missing image” markers nearby in the Wikimedia Commons app to keep me going.

🗓️

Diary of a Squirrel went to Summerside to demo comic-making. I love it when the doing of something involves documenting the doing of the something.

Oliver and I dropped in on the Behind the Panels exhibition at the Eptek Centre last week. Or at least we tried to: it is closed on Saturdays. Which is odd: when else would someone drive to Summerside?

So we had to make do with tasty crêpes from Viva la Crêpe, the food truck set up across the street.

The eponymous Viva is the same Viva who ran the late, great Viva’s on 35 Prince Street. The crêpes are very good, and Viva is as generous a host as she ever was.

🗓️

About This Blog

Photo of Peter RukavinaI am . I am a writer, letterpress printer, and a curious person.

To learn more about me, read my /now, look at my bio, listen to audio I’ve posted, read presentations and speeches I’ve written, see things I’ve favourited elsewhere, or get in touch (peter@rukavina.net is the quickest way).

I have been writing here since May 1999: you can explore the 25+ years of blog posts in the archive.

You can subscribe to an RSS feed of posts, an RSS feed of comments, an RSS feed of favourites elsewhere, or a podcast RSS feed that just contains audio posts. You can also receive a daily digests of posts by email. I also publish an OPML blogroll.

InstagramYouTubeVimeoORCIDOpenStreetMapInternet ArchivePEI.artDrupalGithub.