fix unable to receive wm from wordpress-wm plugin with unusual author hcard microformat

Wouter Groeneveld 2 years ago
parent dd5dca5d98
commit 529bf932b8

@ -109,22 +109,40 @@ func Map(mf *microformats.Microformat, key string) map[string]string {
func HEntry(data *microformats.Data) *microformats.Microformat {
return hItemType(data, "h-entry")
func HCard(data *microformats.Data) *microformats.Microformat {
return hItemType(data, "h-card")
func hItemType(data *microformats.Data, hType string) *microformats.Microformat {
for _, itm := range data.Items {
if common.Includes(itm.Type, "h-entry") {
if common.Includes(itm.Type, hType) {
return itm
return nil
func mfEmpty() *microformats.Microformat {
return &microformats.Microformat{
Properties: map[string][]interface{}{},
func Prop(mf *microformats.Microformat, key string) *microformats.Microformat {
val := mf.Properties[key]
if len(val) == 0 {
return &microformats.Microformat{
Properties: map[string][]interface{}{},
return mfEmpty()
for i := range val {
conv, ok := val[i].(*microformats.Microformat)
if ok {
return conv
return val[0].(*microformats.Microformat)
return mfEmpty()
func Published(hEntry *microformats.Microformat, utcOffset int) string {
@ -135,10 +153,36 @@ func Published(hEntry *microformats.Microformat, utcOffset int) string {
return publishedDate
func NewAuthor(hEntry *microformats.Microformat, hCard *microformats.Microformat) IndiewebAuthor {
name := DetermineAuthorName(hEntry)
if name == "" {
name = DetermineAuthorName(hCard)
picture := DetermineAuthorPhoto(hEntry)
if picture == "" {
picture = DetermineAuthorPhoto(hCard)
return IndiewebAuthor{
Picture: picture,
Name: name,
func DetermineAuthorPhoto(hEntry *microformats.Microformat) string {
photo := Str(Prop(hEntry, "author"), "photo")
if photo == "" {
photo = Str(hEntry, "photo")
return photo
func DetermineAuthorName(hEntry *microformats.Microformat) string {
authorName := Str(Prop(hEntry, "author"), "name")
if authorName == "" {
return Prop(hEntry, "author").Value
authorName = Prop(hEntry, "author").Value
if authorName == "" {
authorName = Str(hEntry, "author")
return authorName

@ -48,7 +48,7 @@ func (recv *Receiver) processSourceBody(body string, wm mf.Mention) {
data := microformats.Parse(strings.NewReader(body), wm.SourceUrl())
indieweb := recv.convertBodyToIndiewebData(body, wm, mf.HEntry(data))
indieweb := recv.convertBodyToIndiewebData(body, wm, data)
if indieweb.Author.Picture != "" {
err := recv.saveAuthorPictureLocally(indieweb)
if err != nil {
@ -64,21 +64,20 @@ func (recv *Receiver) processSourceBody(body string, wm mf.Mention) {
log.Info().Str("key", key).Msg("OK: Webmention processed.")
func (recv *Receiver) convertBodyToIndiewebData(body string, wm mf.Mention, hEntry *microformats.Microformat) *mf.IndiewebData {
func (recv *Receiver) convertBodyToIndiewebData(body string, wm mf.Mention, mfRoot *microformats.Data) *mf.IndiewebData {
hEntry := mf.HEntry(mfRoot)
hCard := mf.HCard(mfRoot)
if hEntry == nil {
return recv.parseBodyAsNonIndiewebSite(body, wm)
return recv.parseBodyAsIndiewebSite(hEntry, wm)
return recv.parseBodyAsIndiewebSite(hEntry, hCard, wm)
// see
func (recv *Receiver) parseBodyAsIndiewebSite(hEntry *microformats.Microformat, wm mf.Mention) *mf.IndiewebData {
func (recv *Receiver) parseBodyAsIndiewebSite(hEntry *microformats.Microformat, hCard *microformats.Microformat, wm mf.Mention) *mf.IndiewebData {
return &mf.IndiewebData{
Name: mf.Str(hEntry, "name"),
Author: mf.IndiewebAuthor{
Name: mf.DetermineAuthorName(hEntry),
Picture: mf.Str(mf.Prop(hEntry, "author"), "photo"),
Name: mf.Str(hEntry, "name"),
Author: mf.NewAuthor(hEntry, hCard),
Content: mf.Content(hEntry),
Url: mf.Url(hEntry, wm.Source),
Published: mf.Published(hEntry, recv.Conf.UtcOffset),

@ -112,6 +112,14 @@ func TestReceive(t *testing.T) {
wm mf.Mention
json string
label: "bugfix interface conversion panic unusual author part in mf",
wm: mf.Mention{
Source: "",
Target: "",
json: `{"author":{"name":"Ton Zijlstra","picture":"/pictures/"},"name":"","content":"De allereerste Nederlandstalige meet-up van gebruikers was interessant en leuk! We waren met zn vieren, Sebastiaan, Wouter, Frank en ik, en spraken bijna 2 uur met elkaar. Leuk om te vergelijken waarom en hoe we notities maken in Obsid...", "name":"Nabeschouwing: de eerste Nederlandstalige Obsidian meet-up", "published":"2021-04-25T11:24:48+02:00", "source":"", "target":"", "type":"mention", "url":""}`,
label: "receive a Webmention bookmark via twitter",
wm: mf.Mention{

@ -0,0 +1,355 @@
<!DOCTYPE html>
<html lang="nl-nl">
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width" />
<link rel="profile" href="" />
<link rel="profile" href="" />
<link rel="microsub" href="">
<title>Nabeschouwing: de eerste Nederlandstalige Obsidian meet-up &#8211; Interdependent Thoughts</title>
<meta name='robots' content='max-image-preview:large' />
<link rel='dns-prefetch' href='//' />
<link rel="alternate" type="application/rss+xml" title="Interdependent Thoughts &raquo; Feed" href="" />
<link rel="alternate" type="application/rss+xml" title="Interdependent Thoughts &raquo; Comments Feed" href="" />
<link rel="alternate" type="application/rss+xml" title="Interdependent Thoughts &raquo; Nabeschouwing: de eerste Nederlandstalige Obsidian meet-up Comments Feed" href="" />
<script type="text/javascript">
window._wpemojiSettings = {"baseUrl":"https:\/\/\/images\/core\/emoji\/13.0.1\/72x72\/","ext":".png","svgUrl":"https:\/\/\/images\/core\/emoji\/13.0.1\/svg\/","svgExt":".svg","source":{"concatemoji":"https:\/\/\/wp\/wp-includes\/js\/wp-emoji-release.min.js?ver=5.7.1"}};
!function(e,a,t){var n,r,o,i=a.createElement("canvas"),p=i.getContext&&i.getContext("2d");function s(e,t){var a=String.fromCharCode;p.clearRect(0,0,i.width,i.height),p.fillText(a.apply(this,e),0,0);e=i.toDataURL();return p.clearRect(0,0,i.width,i.height),p.fillText(a.apply(this,t),0,0),e===i.toDataURL()}function c(e){var t=a.createElement("script");t.src=e,t.defer=t.type="text/javascript",a.getElementsByTagName("head")[0].appendChild(t)}for(o=Array("flag","emoji"),t.supports={everything:!0,everythingExceptFlag:!0},r=0;r<o.length;r++)t.supports[o[r]]=function(e){if(!p||!p.fillText)return!1;switch(p.textBaseline="top",p.font="600 32px Arial",e){case"flag":return s([127987,65039,8205,9895,65039],[127987,65039,8203,9895,65039])?!1:!s([55356,56826,55356,56819],[55356,56826,8203,55356,56819])&&!s([55356,57332,56128,56423,56128,56418,56128,56421,56128,56430,56128,56423,56128,56447],[55356,57332,8203,56128,56423,8203,56128,56418,8203,56128,56421,8203,56128,56430,8203,56128,56423,8203,56128,56447]);case"emoji":return!s([55357,56424,8205,55356,57212],[55357,56424,8203,55356,57212])}return!1}(o[r]),t.supports.everything=t.supports.everything&&t.supports[o[r]],"flag"!==o[r]&&(t.supports.everythingExceptFlag=t.supports.everythingExceptFlag&&t.supports[o[r]]);t.supports.everythingExceptFlag=t.supports.everythingExceptFlag&&!t.supports.flag,t.DOMReady=!1,t.readyCallback=function(){t.DOMReady=!0},t.supports.everything||(n=function(){t.readyCallback()},a.addEventListener?(a.addEventListener("DOMContentLoaded",n,!1),e.addEventListener("load",n,!1)):(e.attachEvent("onload",n),a.attachEvent("onreadystatechange",function(){"complete"===a.readyState&&t.readyCallback()})),(n=t.source||{}).concatemoji?c(n.concatemoji):n.wpemoji&&n.twemoji&&(c(n.twemoji),c(n.wpemoji)))}(window,document,window._wpemojiSettings);
<style type="text/css">
img.emoji {
display: inline !important;
border: none !important;
box-shadow: none !important;
height: 1em !important;
width: 1em !important;
margin: 0 .07em !important;
vertical-align: -0.1em !important;
background: none !important;
padding: 0 !important;
<link rel='stylesheet' id='cattopage_wud_site_style-css' href='' type='text/css' media='all' />
<link rel='stylesheet' id='cattopage_wud_img_style-css' href='' type='text/css' media='all' />
<link rel='stylesheet' id='wp-block-library-css' href='' type='text/css' media='all' />
<link rel='stylesheet' id='indieweb-css' href='' type='text/css' media='all' />
<link rel='stylesheet' id='simple-location-css' href='' type='text/css' media='all' />
<link rel='stylesheet' id='semantic-linkbacks-css-css' href='' type='text/css' media='all' />
<link rel='stylesheet' id='parent-style-css' href='' type='text/css' media='all' />
<link rel='stylesheet' id='sempress-style-css' href='' type='text/css' media='all' />
<script type='text/javascript' src='' id='jquery-core-js'></script>
<script type='text/javascript' src='' id='jquery-migrate-js'></script>
<!--[if lt IE 9]>
<script type='text/javascript' src='' id='html5-js'></script>
<link rel="" href="" /><link rel="alternate" type="application/json" href="" /><link rel="EditURI" type="application/rsd+xml" title="RSD" href="" />
<link rel="wlwmanifest" type="application/wlwmanifest+xml" href="" />
<meta name="generator" content="WordPress 5.7.1" />
<link rel="canonical" href="" />
<link rel="alternate" type="application/json+oembed" href="" />
<link rel="alternate" type="text/xml+oembed" href=";format=xml" />
<meta name = "viewport" content = "user-scalable=no, width=device-width">
<meta name="apple-mobile-web-app-capable" content="yes" /> <style type="text/css" id="sempress-custom-colors">
body { text-shadow: 0 1px 0 #ffffff; }
body, a { color: #555555; }
#access {
border-bottom: 1px solid #cccccc;
-moz-box-shadow: inherit 0 1px 0 0;
-webkit-box-shadow: inherit 0 1px 0 0;
box-shadow: inherit 0 1px 0 0;
.widget {
border-bottom: 5px solid #000000;
-moz-box-shadow: inherit 0 1px 0 0;
-webkit-box-shadow: inherit 0 1px 0 0;
box-shadow: inherit 0 1px 0 0;
article.comment {
border-top: 1px solid inherit;
-moz-box-shadow: #cccccc 0 -1px 0 0;
-webkit-box-shadow: #cccccc 0 -1px 0 0;
box-shadow: #cccccc 0 -1px 0 0;
<link rel="pingback" href="">
<style type="text/css">.recentcomments a{display:inline !important;padding:0 !important;margin:0 !important;}</style><style type="text/css" id="custom-background-css">
body.custom-background { background-color: #ffffff; background-image: url(""); background-position: left top; background-size: auto; background-repeat: repeat; background-attachment: scroll; }
<link rel="micropub_media" href="" />
<link rel="micropub" href="" />
<link rel="microsub" href="" />
<link rel="webmention" href="" />
<link rel="" href="" />
<style type="text/css" id="wp-custom-css">
code {background-color: lightgray;} </style>
<body class="post-template-default single single-post postid-16107 single-format-standard custom-background multi-column custom-header" itemscope="" itemtype="">
<div id="page">
<header id="branding" role="banner">
<div id="newbanner" style="height:200px;background:url(">
<h1 id="site-title"><a href="" title="Interdependent Thoughts" rel="home">Interdependent Thoughts</a></h1>
<h2 id="site-description">by Ton Zijlstra</h2></div>
<nav id="access" role="navigation">
<h1 class="assistive-text section-heading"><a href="#access" title="Main menu">Main menu</a></h1>
<a class="skip-link screen-reader-text" href="#content" title="Skip to content">Skip to content</a>
<div class="menu-menu-on-top-container"><ul id="menu-menu-on-top" class="menu"><li id="menu-item-2897" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-home menu-item-2897"><a title="Back to frontpage" href="">Home</a></li>
<li id="menu-item-2898" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-has-children menu-item-2898"><a title="Some background" href="">About me</a>
<ul class="sub-menu">
<li id="menu-item-15935" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-15935"><a href="">About me</a></li>
<li id="menu-item-15934" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-15934"><a href="">Now</a></li>
<li id="menu-item-2899" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-has-children menu-item-2899"><a title="Daily feed of smaller items, excluded from the main blog" href="">Day to Day</a>
<ul class="sub-menu">
<li id="menu-item-7207" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-7207"><a title="Daily feed of smaller items, excluded from the main blog" href="">Day to Day</a></li>
<li id="menu-item-7023" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-7023"><a title="My IndieWeb postings" href="">Indieweb</a></li>
<li id="menu-item-14105" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-14105"><a href="">Flashes</a></li>
<li id="menu-item-7206" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-7206"><a title="What I&#8217;ve read recently" href="">Books</a></li>
<li id="menu-item-7205" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-7205"><a title="Places I&#8217;m visiting" href="">Plazes</a></li>
<li id="menu-item-3537" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-3537"><a title="wikilike reference section" href="">Digital garden</a></li>
<li id="menu-item-3981" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-privacy-policy menu-item-3981"><a href="">Privacy Policy</a></li>
<li id="menu-item-7209" class="menu-item menu-item-type-taxonomy menu-item-object-category current-post-ancestor current-menu-parent current-post-parent menu-item-7209"><a title="Soms schrijf ik in het Nederlands" href="">Nederlands</a></li>
<li id="menu-item-7208" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-7208"><a title="Manchmal schreibe ich auf Deutsch" href="">Deutsch</a></li>
<li id="menu-item-14558" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-14558"><a href="">Feeds</a></li>
</ul></div> </nav><!-- #access -->
</header><!-- #branding -->
<div id="main">
<section id="primary">
<main id="content" role="main" class="h-entry hentry">
<nav id="nav-above">
<h1 class="assistive-text section-heading">Post navigation</h1>
<div class="nav-previous"><a href="" rel="prev"><span class="meta-nav">&larr;</span> Federated Bookshelves Revisited</a></div>
</nav><!-- #nav-above -->
<article id="post-16107" class="post-16107 post type-post status-publish format-standard category-knowledge-management category-knowledgemanagement category-nederlands tag-obsidian kind-article" itemref="site-publisher">
<header class="entry-header">
<h1 class="entry-title p-name" itemprop="name headline"><a href="" class="u-url url" title="Permalink to Nabeschouwing: de eerste Nederlandstalige Obsidian meet-up" rel="bookmark" itemprop="url">Nabeschouwing: de eerste Nederlandstalige Obsidian meet-up</a></h1>
<div class="entry-meta">
<span class="sep">Posted on </span><a href="" title="11:24" rel="bookmark" class="url u-url"><time class="entry-date updated published dt-updated dt-published" datetime="2021-04-25T11:24:48+02:00" itemprop="dateModified datePublished">25 April, 2021</time></a><address class="byline"> <span class="sep"> by </span><span class="author p-author" itemprop="author" itemscope itemtype=""><a rel="author" class="p-author" href="" title="Ton Zijlstra" itemprop="url"><span itemprop="name">Ton Zijlstra</span></a></span></address> </div><!-- .entry-meta -->
</header><!-- .entry-header -->
<div class="entry-reaction"></div>
<div class="entry-content e-content" itemprop="description articleBody">
<p>De allereerste Nederlandstalige meet-up van gebruikers was interessant en leuk! We waren met z&#8217;n vieren, <a href="">Sebastiaan</a>, <a href="">Wouter</a>, <a href="">Frank</a> en ik, en spraken bijna 2 uur met elkaar. Leuk om te vergelijken waarom en hoe we notities maken in Obsidian, te horen over de (vaak lange) historie die iedereen heeft met notities schrijven, met de hand of in een reeks tools. Het gesprek ging vooral over onze werkwijzen bij het <em>toevoegen</em> van notities, en in mindere mate over het <em>gebruik</em> van die notities. </p>
<p>Dat gebruik is zeker iets om over door te praten een volgende keer, en voor mezelf om bewuster bij stil te staan. Ik merk dat ik nog vooral in de modus zit om mijn collectie voldoende te laten groeien, en minder in het bewust raadplegen van mijn materiaal als ik met een onderwerp aan de slag ga, of iets wil maken. Tegelijkertijd merk ik wel dat ik nieuwe verbindingen leg tussen notities, en (omdat ik mijn oude weblog postings tot notities verwerk) tussen oudere en nieuwere gedachten waarover ik heb geblogd. En dat ik in het afgelopen half jaar een paar blogpostings en twee presentaties heb gemaakt die direct voortkomen uit het samenbrengen van bestaande conceptuele notities. Dat soort productieve uitkomsten is al heel nuttig, maar ik ben nog op zoek naar het een grotere rol geven van mijn notities in het reflecteren op een onderwerp, in het nadenken over vragen etc. Dit allemaal ten aanzien van conceptuele dingen dan, want m.b.t. mijn uitvoerend werk zijn mijn notities het werk als het ware.</p>
<p>Daarvoor is in ieder geval regelmatige blootstelling aan mijn notities nodig denk ik. Enerzijds door beter te weten wat ik er in heb zitten, en anderzijds door me in mijn workflow vaker bezig te houden met wat ik over een thema al heb bedacht, verzameld en geschreven. In de afgelopen weken ben ik daarom meer index-achtige notities gaan maken, emergente outlines. Door anderen wel maps of content genoemd, ik noem ze olifantenpaadjes. Zo&#8217;n notitie verwijst vooral naar bestaande notities, met wat zinnen er bij waarom ik die links bij elkaar plaats. Zo&#8217;n verwijs-notitie helpt me makkelijker de weg te vinden in mijn digitale tuin. Ik maakte eerder al emergente outlines maar die waren niet op navigatie gericht maar op het samenbrengen van notities in een ruwe verhaallijn, dus meer op schrijven gericht.<br />
Een andere manier van blootstelling is via spaced repetition de inhoud van mijn notities voorbij laten komen, in <a href="">de vorm van Anki vragen</a> bijvoorbeeld. Sebastiaan liet gisteren zien dat hij een plugin aan het maken is die dat binnen Obsidian zelf doet, niet gericht op vragen of onthouden, maar gericht op herlezen. </p>
<p>De belangrijkste ingang voor hergebruik van mijn eigen materiaal is vaker mijn notities raadplegen als ik met een vraag aan de slag ga. Te veel leun ik op mijn eigen actieve herinnering, en dat leidt vaak tot reconstructie van dingen terwijl ik die al keurig heb uitgewerkt in mijn notities. </p>
<p>Wouter schrijft veel met de hand, en liet zien hoe hij al die handgeschreven pagina&#8217;s scant en in zijn Obsidian vault opneemt. Op die manier kan hij ze raadplegen en er naar verwijzen als hij er dingen uit tilt en in een notitie opneemt. Dit is een interessante manier. Al schrijf ik veel direct digitaal, ik maak ook veel handmatige aantekeningen, en er ligt hier een stapel A5 notitieboekjes. Nu heb ik ook een <a href="">staande scanner met voetpedaal van CZUR</a>, en die leent zich goed om snel notitieboekjes te digitaliseren realiseerde ik me na de meet-up. Daar maar eens mee experimenteren.</p>
<p>Tot slot, was ik blij met hoe prettig mijn Jitsi server werkte zo met z&#8217;n vieren. Benieuwd hoe dat gaat als je met een grotere groep bent. Alleen het scherm delen had een rare bug waarbij de bovenste strook van een scherm bleef hangen op het eerste beeld. </p>
<p>Wil je ook met andere Obsidian gebruikers in het Nederlandse praten over je ervaringen? Kom dan naar het #nederlands kanaal op de <a href="">Obsidian Discord server</a>. </p>
</div><!-- .entry-content -->
<footer class="entry-meta">
Posted <span class="cat-links">
in <a href="" rel="category tag">knowledge management</a>, <a href="" rel="category tag">Knowledgemanagement</a>, <a href="" rel="category tag">Nederlands</a> </span>
<span class="sep"> | </span>
<span class="tag-links" itemprop="keywords">
Tagged <a class="p-category" href="" rel="tag">obsidian</a> </span>
<span class="sep"> | </span> <!-- hieronder het woord reaction gezet waar comment stond -->
<span class="comments-link"><a href="">Leave a comment</a></span>
</footer><!-- #entry-meta -->
</article><!-- #post-16107 -->
<nav id="nav-below">
<h1 class="assistive-text section-heading">Post navigation</h1>
<div class="nav-previous"><a href="" rel="prev"><span class="meta-nav">&larr;</span> Federated Bookshelves Revisited</a></div>
</nav><!-- #nav-below -->
<div id="comments">
<div id="respond" class="comment-respond">
<h3 id="reply-title" class="comment-reply-title">Leave a Reply <small><a rel="nofollow" id="cancel-comment-reply-link" href="/blog/2021/04/nabeschouwing-de-eerste-nederlandstalige-obsidian-meet-up/#respond" style="display:none;">Cancel reply</a></small></h3><form action="" method="post" id="commentform" class="comment-form" novalidate><p class="comment-notes"><span id="email-notes">Your email address will not be published.</span> Required fields are marked <span class="required">*</span></p><p class="comment-form-comment"><label for="comment">Comment</label> <textarea id="comment" name="comment" cols="45" rows="8" maxlength="65525" required="required"></textarea></p><p class="comment-form-author"><label for="author">Name <span class="required">*</span></label> <input autocomplete="nickname name" id="author" name="author" type="text" value="" size="30" maxlength="245" required='required' /></p>
<p class="comment-form-email"><label for="email">Email <span class="required">*</span></label> <input autocomplete="email" id="email" name="email" type="email" value="" size="30" maxlength="100" aria-describedby="email-notes" required='required' /></p>
<p class="comment-form-url"><label for="url">Website</label> <input autocomplete="url" id="url" name="url" type="url" value="" size="30" maxlength="200" /></p>
<p class="form-submit"><input name="submit" type="submit" id="submit" class="submit" value="Post Comment" /> <input type='hidden' name='comment_post_ID' value='16107' id='comment_post_ID' />
<input type='hidden' name='comment_parent' id='comment_parent' value='0' />
</p><p style="display: none;"><input type="hidden" id="akismet_comment_nonce" name="akismet_comment_nonce" value="e8289749a3" /></p><input type="hidden" id="ak_js" name="ak_js" value="184"/><textarea name="ak_hp_textarea" cols="45" rows="8" maxlength="100" style="display: none !important;"></textarea></form> </div><!-- #respond -->
<p class="akismet_comment_form_privacy_notice">This site uses Akismet to reduce spam. <a href="" target="_blank" rel="nofollow noopener">Learn how your comment data is processed</a>.</p><form id="webmention-form" action="" method="post">
<label for="webmention-source">To respond on your own website, enter the URL of your response which should contain a link to this post's permalink URL. Your response will then appear (possibly after moderation) on this page. Want to update or remove your response? Update or delete your post and re-enter your post's URL again. (<a href="">Learn More</a>)</label>
<input id="webmention-source" type="url" autocomplete="url" name="source" placeholder="URL/Permalink of your article" />
<input id="webmention-submit" type="submit" name="submit" value="Ping me!" />
<input id="webmention-format" type="hidden" name="format" value="html" />
<input id="webmention-target" type="hidden" name="target" value="" />
</div><!-- #comments -->
</main><!-- #content -->
</section><!-- #primary -->
<aside id="sidebar">
<div id="secondary" class="widget-area" role="complementary">
<section id="text-8" class="widget widget_text"> <div class="textwidget"><p><a href="">I don&#8217;t track you here, but others might</a> (due to embedded content)</p>
</section><section id="custom_html-3" class="widget_text widget widget_custom_html"><div class="textwidget custom-html-widget"><img src="" alt="" width="150" height="150" class="aligncenter size-thumbnail wp-image-8895" />
Are you a maker, a creator of technology? Sign the <a href="">TechPledge</a>! Commit to human centered tech and continuous reflection on the impact of your work.
I helped shape the <a href="">TechPledge</a>, and signed on September 10th 2019. Hold me to account.
</p></div></section><section id="text-5" class="widget widget_text"> <div class="textwidget"><div style="background-color: #dee514; padding:2px; padding-left:4px; padding-top:15px;padding-bottom:15px;text-shadow: 0 0 0;"><a rel="license" href=""><img alt="Creative Commons-Licentie" style="border-width:0" src="" /></a><br />This work is covered by a <a rel="license" href="">Creative Commons Attribution-Share Alike 4.0 International-license</a>.</div></div>
</section><section id="text-7" class="widget widget_text"> <div class="textwidget"><div style="background-color: #e58414; padding: 2px; padding-left: 4px; padding-top: 15px; text-shadow: 0 0 0;">
<h3>Subscribe to my blog</h3>
<p><img loading="lazy" class="size-full wp-image-5516" src="" alt="rss icon" width="14" height="14" /> <a href="">full article feed</a></p>
<p><img loading="lazy" class="size-full wp-image-5516" src="" alt="rss icon" width="14" height="14" /><a href="">Feedburner feed (Google tracking!)</a></p>
<p><img loading="lazy" class="size-full wp-image-5516" src="" alt="rss icon" width="14" height="14" /> <a href="">comments feed</a></p>
<p><img loading="lazy" class="size-full wp-image-5516" src="" alt="rss icon" width="14" height="14" /> <a href="">all reactions feed</a></p>
<p>See <a href="">/feeds</a> for more feeds
</section><section id="search-2" class="widget widget_search"><form itemprop="potentialAction" itemscope itemtype="" role="search" method="get" class="search-form" action="">
<span class="screen-reader-text">Search for:</span>
<input type="search" itemprop="query-input" class="search-field" placeholder="Search &hellip;" value="" name="s" />
<input type="submit" class="search-submit" value="Search" />
<meta itemprop="target" content="{search} "/></form></section><section id="text-2" class="widget widget_text"><h3 class="widget-title">About</h3> <div class="textwidget"><div style="background-color: #10b1bc; padding:2px; padding-left:4px; text-shadow: 0 0 0;"><p class="h-card vcard hcard">
<img class="u-photo" src="" alt="" width="75" height="75" class="aligncenter size-thumbnail wp-image-2931" /><br/>
Blog <a class="u-url url u-uid uid" rel="me" href="">In<em>ter</em>dependent Thoughts</a> maintained since 2002 by <span class="p-name fn">Ton Zijlstra</span>. <br/>
<span class="p-note">European citizen in a networked world. Based in the <span class="p-country-name">Netherlands</span>, living in Europe, working globally. There are no Others. There is just me and many of you.
I write about how our digital and networked world changes how we work, learn, decide and organize. I explore the tools and strategies that help us navigate the networked world.
I am passionate about increasing people's ability to act (knowledge), and their ability to change (learning). Key-words: open data, open government, fablabs, making, complexity, networked agency, networked learning, ethics by design.</span>
Contacting me is easy and appreciated!<br/>
<a class="u-email email" href=""></a> (<a class="u-key key" href="TonZijlstra _0xFE213A186E5FA4B1_public.asc">PGP pub key</a>) or use<br/><a class="u-email email" href=""></a> (encrypted webmail)<br/><br/>
Mastodon <a rel="me" href="" ></a> <br/>
Twitter <a rel="me" href="" >@ton_zylstra</a><br/>
Keybase <a rel="me" href=""></a>
<a rel="me" href="">Proto</a> WP sand box, <a rel="me" href="">Meso WP</a> sand box</p></div></div>
</section><section id="text-4" class="widget widget_text"> <div class="textwidget"><div style="background-color: #76e514; padding: 2px; padding-left: 4px; padding-top: 20px; padding-bottom: 20px; text-shadow: 0 0 0;">Like what you&#8217;re reading? Here&#8217;s a <a href="">Tipjar</a></div>
</section><section id="text-3" class="widget widget_text"><h3 class="widget-title">Read my book!</h3> <div class="textwidget"><div style="background-color: #dee514; padding:2px; padding-left:4px; padding-top:25px;text-shadow: 0 0 0;"><a href=""><img src="" width="200">
How to Unconference Your Birthday, by Ton & Elmine</a>
</section><section id="text-6" class="widget widget_text"> <div class="textwidget"><div style="background-color: #e58414; padding: 2px; padding-left: 4px; padding-top: 15px; text-shadow: 0 0 0;">
<p><a href="">OPML Blogroll</a>, human and machine readable</p>
<p>I support the <a href="">IndieWeb</a></p>
<p>I support the <a href="">Internet Archive</a></p>
</section><section id="custom_html-2" class="widget_text widget widget_custom_html"><h3 class="widget-title">On this day&#8230;</h3><div class="textwidget custom-html-widget"><div style="background-color: #10b1bc; padding:2px; padding-left:4px; text-shadow: 0 0 0;"><p>There are <strong>3</strong> posts found on this site published on April 25</p> <ul class="todaypost"><li><strong>April 25, 2018</strong><ul><li><a href="">ELLIS as the CERN for AI</a> <span class="today_excerpt">I an open letter (PDF) a range of institutions call upon their respective European governments to create ELLIS, the European Lab for Learning and Intelligent Systems. It&#8217;s an effort to fortify against brain drain, and instead attract top talent to Europe. It points to the currently weak position in AI of Europe between what is [&hellip;]</span></li><li><a href="">Time for an RSS Revival</a> <span class="today_excerpt">Wired is calling for an RSS revival. RSS is the most important piece of internet plumbing for following new content from a wide range of sources. It allows you to download new updates from your favourite sites automatically and read them at your leisure. Dave Winer, forever dedicated to the open web, created it. I [&hellip;]</span></li></li></ul><li><strong>April 25, 2006</strong><ul><li><a href="">Should Mainstream Media Be Worried?</a> <span class="today_excerpt">The discussion whether blogs will replace journalism is as old as blogs are, and the answer still is a resounding No, afaik. But we will increasingly see attempts to blend different aspects and pieces of functionality from both sides of the discussion. Our local newspaper is one of the few main stream media companies that [&hellip;]</span></li></ul>
</div></div></section><section id="tag_cloud-2" class="widget widget_tag_cloud"><h3 class="widget-title">Tags</h3><div class="tagcloud"><a href="" class="tag-cloud-link tag-link-753 tag-link-position-1" style="font-size: 8.8376068376068pt;" aria-label="adtech (12 items)">adtech</a>
<a href="" class="tag-cloud-link tag-link-410 tag-link-position-2" style="font-size: 8pt;" aria-label="agency (10 items)">agency</a>
<a href="" class="tag-cloud-link tag-link-609 tag-link-position-3" style="font-size: 10.632478632479pt;" aria-label="AI (17 items)">AI</a>
<a href="" class="tag-cloud-link tag-link-476 tag-link-position-4" style="font-size: 14.700854700855pt;" aria-label="amersfoort (39 items)">amersfoort</a>
<a href="" class="tag-cloud-link tag-link-488 tag-link-position-5" style="font-size: 8.4786324786325pt;" aria-label="blockchain (11 items)">blockchain</a>
<a href="" class="tag-cloud-link tag-link-817 tag-link-position-6" style="font-size: 8pt;" aria-label="brexit (10 items)">brexit</a>
<a href="" class="tag-cloud-link tag-link-1233 tag-link-position-7" style="font-size: 9.6752136752137pt;" aria-label="cal (14 items)">cal</a>
<a href="" class="tag-cloud-link tag-link-1509 tag-link-position-8" style="font-size: 13.384615384615pt;" aria-label="covid19 (30 items)">covid19</a>
<a href="" class="tag-cloud-link tag-link-837 tag-link-position-9" style="font-size: 8.4786324786325pt;" aria-label="cph150 (11 items)">cph150</a>
<a href="" class="tag-cloud-link tag-link-845 tag-link-position-10" style="font-size: 9.3162393162393pt;" aria-label="creativecommons (13 items)">creativecommons</a>
<a href="" class="tag-cloud-link tag-link-18 tag-link-position-11" style="font-size: 8.8376068376068pt;" aria-label="enschede (12 items)">enschede</a>
<a href="" class="tag-cloud-link tag-link-451 tag-link-position-12" style="font-size: 8.4786324786325pt;" aria-label="ethicsbydesign (11 items)">ethicsbydesign</a>
<a href="" class="tag-cloud-link tag-link-57 tag-link-position-13" style="font-size: 10.871794871795pt;" aria-label="EU (18 items)">EU</a>
<a href="" class="tag-cloud-link tag-link-229 tag-link-position-14" style="font-size: 11.589743589744pt;" aria-label="evernote (21 items)">evernote</a>
<a href="" class="tag-cloud-link tag-link-419 tag-link-position-15" style="font-size: 13.025641025641pt;" aria-label="facebook (28 items)">facebook</a>
<a href="" class="tag-cloud-link tag-link-496 tag-link-position-16" style="font-size: 14.820512820513pt;" aria-label="gdpr (40 items)">gdpr</a>
<a href="" class="tag-cloud-link tag-link-181 tag-link-position-17" style="font-size: 9.3162393162393pt;" aria-label="google (13 items)">google</a>
<a href="" class="tag-cloud-link tag-link-711 tag-link-position-18" style="font-size: 20.205128205128pt;" aria-label="IndieWeb (115 items)">IndieWeb</a>
<a href="" class="tag-cloud-link tag-link-914 tag-link-position-19" style="font-size: 13.264957264957pt;" aria-label="indiewebcamp (29 items)">indiewebcamp</a>
<a href="" class="tag-cloud-link tag-link-520 tag-link-position-20" style="font-size: 9.6752136752137pt;" aria-label="information strategies (14 items)">information strategies</a>
<a href="" class="tag-cloud-link tag-link-521 tag-link-position-21" style="font-size: 11.350427350427pt;" aria-label="infostrats (20 items)">infostrats</a>
<a href="" class="tag-cloud-link tag-link-759 tag-link-position-22" style="font-size: 8.4786324786325pt;" aria-label="internet (11 items)">internet</a>
<a href="" class="tag-cloud-link tag-link-241 tag-link-position-23" style="font-size: 12.307692307692pt;" aria-label="iot (24 items)">iot</a>
<a href="" class="tag-cloud-link tag-link-36 tag-link-position-24" style="font-size: 8.4786324786325pt;" aria-label="makerhouseholds (11 items)">makerhouseholds</a>
<a href="" class="tag-cloud-link tag-link-834 tag-link-position-25" style="font-size: 12.068376068376pt;" aria-label="mastodon (23 items)">mastodon</a>
<a href="" class="tag-cloud-link tag-link-231 tag-link-position-26" style="font-size: 8.4786324786325pt;" aria-label="notetaking (11 items)">notetaking</a>
<a href="" class="tag-cloud-link tag-link-1614 tag-link-position-27" style="font-size: 12.905982905983pt;" aria-label="obsidian (27 items)">obsidian</a>
<a href="" class="tag-cloud-link tag-link-354 tag-link-position-28" style="font-size: 13.025641025641pt;" aria-label="opendata (28 items)">opendata</a>
<a href="" class="tag-cloud-link tag-link-552 tag-link-position-29" style="font-size: 8pt;" aria-label="opendatars (10 items)">opendatars</a>
<a href="" class="tag-cloud-link tag-link-52 tag-link-position-30" style="font-size: 9.3162393162393pt;" aria-label="opengov (13 items)">opengov</a>
<a href="" class="tag-cloud-link tag-link-553 tag-link-position-31" style="font-size: 8pt;" aria-label="otvorenipodaci2018 (10 items)">otvorenipodaci2018</a>
<a href="" class="tag-cloud-link tag-link-504 tag-link-position-32" style="font-size: 9.3162393162393pt;" aria-label="pei (13 items)">pei</a>
<a href="" class="tag-cloud-link tag-link-1313 tag-link-position-33" style="font-size: 9.9145299145299pt;" aria-label="pkm (15 items)">pkm</a>
<a href="" class="tag-cloud-link tag-link-236 tag-link-position-34" style="font-size: 12.307692307692pt;" aria-label="privacy (24 items)">privacy</a>
<a href="" class="tag-cloud-link tag-link-622 tag-link-position-35" style="font-size: 13.74358974359pt;" aria-label="rss (32 items)">rss</a>
<a href="" class="tag-cloud-link tag-link-326 tag-link-position-36" style="font-size: 9.3162393162393pt;" aria-label="serbia (13 items)">serbia</a>
<a href="" class="tag-cloud-link tag-link-394 tag-link-position-37" style="font-size: 13.264957264957pt;" aria-label="sf (29 items)">sf</a>
<a href="" class="tag-cloud-link tag-link-499 tag-link-position-38" style="font-size: 12.666666666667pt;" aria-label="stm18 (26 items)">stm18</a>
<a href="" class="tag-cloud-link tag-link-687 tag-link-position-39" style="font-size: 9.3162393162393pt;" aria-label="techfestival (13 items)">techfestival</a>
<a href="" class="tag-cloud-link tag-link-692 tag-link-position-40" style="font-size: 10.871794871795pt;" aria-label="utrecht (18 items)">utrecht</a>
<a href="" class="tag-cloud-link tag-link-704 tag-link-position-41" style="font-size: 12.905982905983pt;" aria-label="vathorst (27 items)">vathorst</a>
<a href="" class="tag-cloud-link tag-link-783 tag-link-position-42" style="font-size: 10.632478632479pt;" aria-label="webmention (17 items)">webmention</a>
<a href="" class="tag-cloud-link tag-link-526 tag-link-position-43" style="font-size: 22pt;" aria-label="weeknotes (162 items)">weeknotes</a>
<a href="" class="tag-cloud-link tag-link-538 tag-link-position-44" style="font-size: 13.74358974359pt;" aria-label="wordpress (32 items)">wordpress</a>
<a href="" class="tag-cloud-link tag-link-731 tag-link-position-45" style="font-size: 9.3162393162393pt;" aria-label="wp (13 items)">wp</a></div>
</section> </div><!-- #secondary .widget-area -->
</div><!-- #main -->
<footer id="colophon" role="contentinfo">
<div id="site-publisher" itemprop="publisher" itemscope itemtype="">
<meta itemprop="name" content="Interdependent Thoughts" />
<meta itemprop="url" content="" />
<div id="site-generator">
This site is powered by <a href="" rel="generator">WordPress</a> and styled with <a href="">SemPress</a> </div>
</footer><!-- #colophon -->
</div><!-- #page -->
<script type='text/javascript' src='' id='cattopage_wud_script-js'></script>
<script type='text/javascript' src='' id='cattopage_wud_cat_img_script-js'></script>
<script type='text/javascript' src='' id='comment-reply-js'></script>
<script type='text/javascript' src='' id='sempress-script-js'></script>
<script type='text/javascript' src='' id='media-fragment-js'></script>
<script type='text/javascript' src='' id='wp-embed-js'></script>
<script async="async" type='text/javascript' src='' id='akismet-form-js'></script>