Posts between 2015/01 and 2016/01 (477 out of 479)
TA and Marker, Semantic Web Systems
School of Informatics, University of Edinburgh
Same as last year, but with twice as many students. Tirelessly answered student emails, made a few supplementary materials, mostly got the feedback sent on time; was nominated for a Best Teaching Award ^^ Oh, also organised a hands-on workshop this year, because I generally disagree with lectures.
I've been thinking about adopting a polyphasic sleep cycle for some time. I really just want more hours in the day. In theory I like mornings, but I usually struggle to get up. When I do, it's very rewarding. Usually I'll drag myself out of bed an hour before the first thing I have to be at (meeting, seminar), which could be anywhere between 0830 and early afternoon. If I don't have anything specificially scheduled, I won't set an alarm, figuring I trust my body to wake up when it's ready. When I do this, I usually sleep a solid 10 hours and feel pretty shitty when I wake up.
Regardless of when I get up, I start to crash around 1500. By crash, I mean suddely find myself staring, zombielike, at Buzzfeed and Facebook and stuck in a constant cycle of clicking mindless linkbate and scrolling through social feeds. Ugh. If I catch myself, I'll probably call it a day and go to do something physical like make food or clean. Sometimes (usually only possible if I have some decent food in my office) instead I push through the zombie and hit a second wave of productivity in the early evening. I start to wake up, feel more alert, and can get sucked into coding or researching something until the early hours of the morning.
That feels great, but sometimes I have to make myself stop work before midnight so I can go home and get enough sleep to be awake for my first scheduled thing the next day. Sometimes I fail at stopping, only get a few hours sleep and feel like shit the next day.
Occasionally I'll find time to take a nap if I'm feeling completely out of it, but naps often overrun by many hours, and then I hate myself for 'wasting' even more time asleep.
So I want to figure something out that lets me fit in my nighttime productivity, and see the sunlight, and not oversleep or undersleep. Setting a rigid timetable for sleep and naps will help with this, I think. If I know I'm trying to be consistent, and naps are purposeful and scheduled, my willpower should kick in get me up when I need to be. In theory, anyway. I know these things look much different in the cold hard light of day[*][#cold-hard-light] than they do from a warm, comfy bed... just 5 more minutes...
I'm aware that transitioning to polyphasic is going to be a nightmare, but if I keep putting it off until I don't have anything important to do, I'll never do it. Right now, I know I'm not travelling until at least March, so I've got time to adjust on my own schedule (and figure out how to handle conferences when I come to it). I've pulled all-nighters and had remarkably productive periods of sleep deprivation before, so I figure I'll cope. Oh, to be young. I read a lot of people have problems with actually being able to fall asleep for naps, but I have this superpower whereby I can go to sleep easily on any surface, in any situation, with any background noise, so I'm not worried about that.
The schedule
Turns out the reason some people can get away with fewer than eight hours is because there are different types of sleep, and not all of them are necessary to being alert when you're awake. So the 'science' is to cut out the useless sleep and train your body to fall straight into useful sleep. This is possible by paying attention to your natural circadian and ultradian rhythms, and reading websites by people who have already figured this stuff out.
Sleep cycles in 1.5 hour blocks for most people, and the useful types are SWS (Slow Wave Sleep) and REM (Rapid Eye Movement). Knowing when and how long for these are likely to occur, over the course of a 24 hour period and in relation to each other, can help you to time your sleep sessions to maximise them.
The Everyman 3 schedule consists of 4.5 hours sleep broken into a 'core' 3.5 hours, plus three 20 minute naps at approximately 4-6 hour intervals. I read that SWS happens best around dusk, so the core sleep should be around 2100 to 0030, and naps (when you get your REM) at 0410, 0810 and 1440. This is flexible of course, and once you've forced yourself into a pattern you can adjust by listening to your body (eg. move your nap an hour earlier or later if you're consistently tired/awake at certain times). It also needs to be adapted into the schedule of daily life.
There are versions pre-planned for people with 9 to 5 jobs, but my schedule can be pretty irregular. There are certain things I have to do on certain days at different times. I think the day I'm going to have the most problem fitting around is Friday, when I have a 0930 seminar. Anyway, term hasn't started yet so most things aren't kicking off for another one to two weeks, so I have time to figure it out.
So for now, I've put the Everyman 3 schedule in my calendar, and will ease into it. I might make my core sleep longer to start with, depending on how I feel when I wake up after 3.5 hours, and maybe have 40 minute naps instead of 20. I'm probably also going to shift the schedule mentioned above later by 2 hours, as I already know I won't be able to go to bed at 2100 any night.
Diet and exercise are obviously important, and have an impact on how well one can sleep. Part of altering your sleep cycle is retraining your body to do things like digestion at different times. Sensible advice I've read so far seems to be to have a main meal at least two hours before the core sleep, and use breakfast to train your body to expect to be awake. Also not to exercise too close to core sleep, but exercising or eating right before naps is okay.
* Metaphorical cold hard light of day. Most of these decisions I've made around 4am during a Scottish winter, so I have to use my imagination.
As mentioned in Blog Post URIs, I'm a bit concerned about people replying to the 'wrong' URI for a post. That is, using the URL of a HTML page with the post rendered within it, rather than the post's permalink.
I couldn't find a Microformats2 term for permalink, which I thought would be the obvious solution.
The webmention 'protocol' says that when I recieve a webmention:
Check the target is a valid URI on my site after following redirects.
In my case, upon recieving a target of a https://rhiaro.co.uk/yyyy/mm/id, to validate it, rather than 'following a redirect' I'll actually be getting it's foaf:topic from the triplestore, which is fine. But in accepting this as the target I'm confirming to the sender that this is the correct URI to reply to. Hypothetically this non-permalink could break, breaking the reply. The permalink URI is one I'm promising won't break, so it's in everybody's interests to send the reply there. But logically, if somebody is linking to me in a post of their own, they're going to want to link to the rendered version, rather than whatever my raw version will look like (probably crappy, but that's on me, and maybe part of the problem).
Replying to shortlinks
Because I'm a linked data nut, my problem derives from a deliberate differentiation between a blog post and a page about a blog post. The connection between them (or from one to the other) can be discovered through RDF, but there is no HTTP redirection. I suspect this is a very much minority use-case for #indieweb folks.
However, use of shortlinks is widespread (and you can see redirects are accounted for in the webmention protocol), and so as soon as someone's URL shortner breaks (or moves) permanently, unless they store the post contents and metadata themselves, they might have to have to think about this a bit.
Solution?
I'd like to be able to send back the correct URI (303 redirect style) so the sender can either:
I haven't looked at any implementations yet or thought about how to do it, so maybe I can just do this. I'm not sure how to anticpate people handling it.
Straw poll: What do you/your system do if you send a webmention and it's rejected, though you're sure the target is valid?
And if you're going to send your reply as a webmention from your own system, please target this post's permalink - the URI without a year and a month in :)
Amy wrote about http://vocab.amy.so/blog#Done, http://vocab.amy.so/blog#Done, life, quantified self, sleep, & polyphasic
Sleep deprivation definitely kicking in a bit. Finding it hard to concentrate or remember what I'm doing. Feels like Friday because I've slept so many times since Saturday. Feel pleasant, but out of it.
Amy added 'Sciencen AMA Series: I am Michael Eisen, Professor of Biology at the University nof California, Berkeley. I co-founded the Public Library of Science, npublisher of open access journals including PLOS ONE. AMA! : science' to Bookmarks
Amy added 'Overleaf: Real-time Collaborative Writing and Publishing Tools with Integrated PDF Preview' to Bookmarks
Co-organiser, Smart Data Hack
University of Edinburgh
Reprised my role as very-stressed-person and just about pulled off another successful week with around 100 students including (!!) business and design students; smartdatahack.org.
Amy added 'JMIR-Ann Ontology of Quality Initiatives and a Model for Decentralized, nCollaborative Quality Management on the (Semantic) World Wide Web | nEysenbach | Journal of Medical Internet Research' to Bookmarks
Everything starting with h- looks like it's a class. Typically RDF classes are capitalised so this makes me cringe, but I'll cope.
Woah, there are a lot of properties. Seventy unique properties. I didn't realise. On the wiki most don't have a description, many are duplicated in the list, and none of them seem to have their own description page (and thus no URIs to refer to them with). Pasting them into a spreadsheet was the quickest way to de-dup and alphabetise them. Now I'm working through one at a time, adding descriptions and mapping them to existing properties in FOAF (because many are obvious), VCard (because many (all?) are derived from this), ActivityStreams 2.0 (because SocialWebWG) and hesitantly Dublin Core and SIOC. Where they map to something well-described in RDF, I don't bother with rdfs:comment and domain and range of their own, but I'll add for those with no good sameAs mappings.
Is dt-reviewed same as dt-published? If not, why do reviews get special treatment with regards to differentiation between when they're written and published, and nothing else does?
Is there an official definition of e-content? Couldn't find one on the wiki, so made one up that is compatible with AS2.0 content, with additional caveat about including markup, which is explicit on the mf2 wiki: "The contents of something like a post, including markup and embedded elements."
Are e-description and e-instructions sub-properties of e-content?
I keep getting caught out by AS2.0 terms that are in the JSON-LD document but are actually deprecated (the JSON-LD contains no information other than property and class names and sometimes types; I have to remember to check the written docs). Eg. as2:author -> as2:attributedTo.
I couldn't find an AS2.0 equivalent property for category. Am I missing something? Oh wait, tag will do it.
How does p-description from p-summary?
Wiki says p-education should contain a nested h-card (of school and location). Doesn't that mean it should be an e- or have I misunderstood that completely?
It also says p-education is "an education h-calendar event" but h-calendar doesn't exist, it's h-event. Probably just a typo? Ditto p-experience.
ActivityStreams2.0 doesn't have a name property for Actors (only displayName). Interesting.
Wiki says label 'new in vCard4' but vCard4 says it's deprecated, and in any case was for address labels, so not sure what use this is in mf2.
What's p-note for specifically?
Why is p-reviewer not just p-author?
Maybe I just don't know how to read the vCard4 spec, but the mf2 wiki says sex and gender-identity are part of it, but all I can see is hasGender.
AS2.0 has rating but it's explicitly defined as "a non-negative decimal number between 0.0 and 5.0 (inclusive) with one decimal place of precision". MF2 says it's a number between 1 and 5. I think even less specification is better, as ratings come in come in many forms. Anyway, because I'm not venturing into SKOS, I'm owl:sameAsing them for the time being.
Update: Dropped all domains and ranges because all properties in microformats2 are actually global.
"Micropub is an open API standard that is used to create posts on one's own domain using third-party clients. Web apps and native apps (e.g. iPhone, Android) can use Micropub to post short notes, photos, events or other posts to your own site, similar to a Twitter client posting to Twitter.com." (Micropub on Indiewebcamp)
This means I can now publish blog posts to my site using other peoples' posting clients, of which there are several. Previously, I was ftping markdown files to my server, then running a slightly unreliable PHP script to process the queue based on when the files were last updated. Which mostly worked, but when it didn't it was a pain to untangle.
IndieAuth
I wasn't expecting to have a micropub endpoint any time soon because it needs you to be able to sign into your site with IndieAuth. Fortunately, thanks to amazing work of aaronpk and others, most of the legwork has been done here, and you can delegate your IndieAuth; in your site <head>:
Initially I wanted my endpoint at https://rhiaro.co.uk/micropub and set an .htaccess rule to redirect to the PHP script. This doesn't work; POST requests can't follow redirects.
Next, here's a bare minimum PHP script to store things posted to your site with a micropub client. This just dumps the POST request to a text file, which is where I started to see if it would work. What I actually do now is turn posts and metadata into triples and insert them into my triplestore, but you probably don't want to hear about that :)
<?
// Tell client where I can syndicate to
if(isset($_GET['q']) && $_GET['q'] == "syndicate-to"){
header('Content-type: application/x-www-form-urlencoded');
echo "syndicate-to[]=twitter.com%2Frhiaro";
exit;
}
// Check for post
if(!empty($_POST)){
$headers = apache_request_headers();
// Check token is valid
$token = $headers['Authorization'];
$ch = curl_init("https://tokens.indieauth.com/token");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, Array(
"Content-Type: application/x-www-form-urlencoded"
,"Authorization: $token"
));
$response = Array();
parse_str(curl_exec($ch), $response);
curl_close($ch);
// Check for scope=post
// Check for me=https://rhiaro.co.uk
$me = $response['me'];
$iss = $response['issued_by'];
$client = $response['client_id'];
$scope = $response['scope'];
if(empty($response)){
header("HTTP/1.1 401 Unauthorized");
exit;
}elseif($me != "https://rhiaro.co.uk" || $scope != "post"){
header("HTTP/1.1 403 Forbidden");
exit;
// Check that something was posted
}elseif(empty($_POST['content']){
header("HTTP/1.1 400 Bad Request");
echo "Missing content";
}else{
// DO YOUR THING HERE
// ie. insert post content and metadata into your store, write it to a file, whatever you do to add it to your site.
// For demonstration purposes, let's dump the POST request into a file and return the URL of the file.
$fn = "posts/".time().".txt";
$h = fopen($fn, 'w');
foreach($_POST as $k => $v){
$data .= "[$k] => $v<br/>";
}
fwrite($h, $data);
fclose($h);
// Set headers, return location
header("HTTP/1.1 201 Created");
header("Location: ".$fn);
}
}
?>
I got this far by working through the instructions as part of setting up Quill, so that's a good place to start!
Finally you can get my blog post content in a number of different formats. You'll notice alternative URLs (noted currently as 'Permalink') in the metadata section of a normal view of a post. Hit this up with no Accept header, and you'll get neat markdown (which is what I authored it in; the 'source', as it were).
Browsers automatically send Accept: text/html, in which case they are redirected to the rendered HTML version of the post you're probably reading now. But here are some alternatives you can try:
Briefly discussed with Tantek, Aaron and Bret at IWC Cambridge and on IRC about how a micropub client could fetch post content for editing. Many people aren't editing raw HTML as it's presented on the page, but maybe markdown or some other syntax, so a client needs to be able to discover this (the 'source') to present it to be edited. Now if someone makes their client check a post for a rel="source" or shoots off a request with Accept: text/plain (less likely, since static sites can't do conneg) then they'll get my markdown directly (uh, when I actually put rel="source" in my HTML, which I haven't yet).
As a related aside, I also return source="markdown" if a micropub client asks my endpoint q=source.
Recently I've been trying to wrap my head around the implicit vs. explicit post types debate (in the Social Web WG, indieweb community, and elsewhere). Here is some analysis of the different perspectives, and report on my own experiences so far.
tl;dr
I think each side of the debate about explicit vs implicit types are misaligned, due to conflation of Objects and Activities. I think Objects (like blogposts) needn't have explicit types, but Activities (like the act of creating a post) should do.
Thanks to Tantek, Aaron, elf Pavlik, Chris and everyone whose conversations I've listened in on in #social and #indiewebcamp IRC channels for discussing this stuff with/around me.
"explicit post/object types are architecture-centric design, rather than user-centric design" - tantek, #indiewebcamp irc
Posting UI
Another rationale against explicit post types is that it encourages posting clients to constrain users regarding what kind of posts they can create.
"...content types dictate the kinds of content you actually allow people to create with your software" - benwerd, The tyranny of content types
Most mainstream social networks now have a generic posting interface, that allows one to add things like photos, videos, people tags, etc, without forcing you to choose what type of post you want to make first.
Software architecture
Some people started with explicit post types and ran into problems when structuring their software around this idea. TODO: Citation from aaronpk in irc in March/April that I can't find right now.
URL design
If you include a slug for a post type in your URLs and decide to change the post type, this is definitely a pain. I figured this pretty early and dropped it from Slog'd. See also: Update URL Scheme issue for p3k.
On the other hand:
"but including type [in URL] because I like clustering by type in a day" - tantek, #indiewebcamp irc
Clarification: content-based vs intent-based post types
Often photo-type-post vs article-type-post is thrown up: ie. if you start with an article, then edit it to add a photo, does the post type change? I completely agree that typing based on content doesn't make sense here. When I talk about post types, I'm referring to types for like, bookmark, repost, log/metrics (eg. food, sleep), where they may look like a note in terms of content, but aren't. I display different icons for all of these at the moment, and you'll note that twitter for example displays retweets differently in the timeline.
Post all the things
Conclusion: in the indieweb community, so far, everything created is considered a post (a h-entry in microformats), and display differences can be inferred from properties of the post.
an article is a post with a title.
a like is a post with a like-of.
a reply is a post with in-reply-to.
etc.
ActivityStreams2.0
ActivityStreams2.0 has explicit object types and explicit activity types. It's easy to conflate them; I think this is what is happening when discussing types in AS2 with indieweb people, and I certainly had this problem for a while.
Taking an action generates an Activity, which might result in an Object (like a post).
Beyond posts
Contrary to indieweb stuff so far, AS2 allows for the idea that not every action on the social web results in a post. Having been immersed in indieweblogworld for ages, this was briefly a hard sell, but then I started to think of social actions (activites) I might want to take - that it's reasonable to want to publish in a feed - that I probably don't need to create a post for. Eg:
edit a post (or a wiki page)
git commits
follow someone
reading/viewing/watching something
blocking someone / reporting content
joining or leaving a group
I don't publish any of these activities on my site yet. There are some activities I do publish with posts (or plan to imminently), that don't necessarily (I might need convincing on some fronts) need to be posts:
Editing a post could generate a Update activity for which the object is the post being edited, but there is no new post as a result.
Liking a post could generate a Like activity for which the object is the post being liked, but there is no new post as a result (if you're into that sort of thing, so far I'm not).
I strongly feel that all Activity should have URIs so that if it doesn't result in a post, it can still be interacted with (eg. you can like my edit). (However, this presents another point for confusion: when do I like a post, and when do I like the fact you published it (the create activity). Anyway, this is for another time..).
Since activities are generated as a result of an action, not explicitly created by a user (unlike objects), arguments for not explicitly typing them fall down:
you're unlikely to need to edit an activity, causing a need to change its type.
If you want to generate an activity stream from your actions, we do get an additional argument for explicit types of objects: it makes it much easier to generate a suitable Activity.
Querying
Explicit types for objects or activities make it easy to query by type. Inferring types - particularly from a combination of properties - complicates this a lot. I recently temporarily dropped quicklinks to /articles and /notes in Slogd after removing sioc:BlogPost and sioc:MicroblogPost as explicit post types made it suddenly more complicated to get them. Given a stream of many people's activities from all over the place how do you filter for specific things?
Human-friendly display
Displaying an activity (the fact that someone did something) is different to displaying an object. You might want to form a sentence ("alice likes bob's tweet") without caring what the properties of the object or possible result are. It's easier to figure out how to display it if it just has a type, without needing to follow links to the object or possible result to infer what's going on.
Generating activity streams
I guess... If you want to take a bunch of objects and generate an activity stream from them, and they don't have explicit types, it's totally up to you (an implementation detail, aka plumbing) how you decide what types the corresponding Activitys have.
I'm not sure if it would be nice to have something in the AS2.0 spec to help with consistently deciding how to infer activity types from object properties. Maybe it doesn't matter.
...Wait, is this ISSUE-4? Lack of explicit mention of activities or objects makes it hard to tell.
Conclusions
Every creation of a post should (can) generate an Activity.
Not every Activity-generating action needs to result in a post, but it's cool if it does.
Activitys need types. Objects (like posts) do not (necessarily).
If you don't want to generate a stream of all of your possible actions, but rather a feed of objects (as appears to be the case for indiewebbers so far) then you don't need activities, and this conversation is basically irrelevant... but if you think someone else might generate an activity stream from your objects, you're at their mercy regarding Activity types.
Next?
I should probably generate an AS2.0 feed from my posts.
Start integrating non-post-resulting activities into it.
Other notes
I went through the lists of Activity types and Object types in current draft of AS2.0 vocab and did a first pass at things I am using, might use and probably won't use. I'll publish this in another post.
I drew lots of diagrams of how I'd turn my different types of posts into Activitys based on their properties (how I'd infer activity types from object properties). I'll also type these up for another post.
Activity is a subclass of Object in AS2. Practical and conceptual differences could be discussed in more depth, but include things like ephemerality of activities vs objects.
Amy wrote about http://vocab.amy.so/blog#Done, http://vocab.amy.so/blog#Done, hacking, linked data, slogd, sparql, & query
So SPARQL DESCRIBE queries are literally 8x slower than an equivalent CONSTRUCT { ?s ?p ?o . }. Who knew? Not me. Maybe this isn't news to anyone who knows anything about graphs and/or query languages.
I'm supposed to be working, so instead I'm making a list of wee annoying bugs in Slog'd that I could and should fix fairly easily this weekend:
likes, bookmarks and reposts appear in no particular order. Investigate.
I now have one post that is a like and a bookmark (semantically: "this is great!" and "will read again/use later"). Including reposts, I don't see a hierarchy here, so I need to make it display appropriately as all of them.
There are a bunch of author and reply URLs in my store with extra http:// on the beginning due to an earlier posting bug. Clean up.
Get author display picture and name from following link and looking for microformats (currently it has a placeholder image and URL).
RSVP posts that appear in lists aren't marked up correctly (posts have start and end times, but really markup needs reshuffling so the event has start and end time).
Shorten the lists on my homepage so they don't take so long to load.
Add most recent post and 'where' boxes to homepage.
Page with a full h-feed of everything.
Prev and next buttons on posts don't work.
Replacing a post via Quill drops the published date.
Amy wrote about http://vocab.amy.so/blog#Done, http://vocab.amy.so/blog#Done, phd, social web, social science, web science, social networks, & sna
In talk by a computer scientist to social scientists on crawling for SNA. Q: 'is it ethical?' A: 'yes data is public'. Resisting challenge about expectation of privacy cos I want to go to the pub. But honestly, damn computer scientists.
Amy added 'EUA > EUA launches Open Access checklist for universities' to Bookmarks
Amy wrote about http://vocab.amy.so/blog#Doing, http://vocab.amy.so/blog#Doing, socialwg, w3c, standards, & working group
Just listening to / reading discussions and debates in W3C groups is tiring; taking part even a tiny bit is exhausting, and I haven't decided if the reward is worth the brain-melt yet. I hope so. I admire all these people who manage to do standards work full time.
Amy wrote about travel, microformats2, three, & 3g
Take note weary travelers, Three's Feel At Home plan does not include Germany. Silly of me to just assume it did. I spent £5 on IRC and reading the microformats wiki.
This post is my own opinion, and does not necessarily represent the opinion of the Social Web WG!
tl;dr: There is increased understanding and expectation of convergence between Micropub, ActivityPump and SoLiD. We're all excited about working towards this convergence. There is increased agreement and understanding about similarities and differences between protocols, and where strong points of one protocol could plug weak points in another. More people are excited about implementing experiments to really figure out what works and what doesn't.
What follows is more detail on my perspective of the main conversations we had over the two days. Clarifications and corrections welcome.
Issues in the tracker
Closed a bunch of ActivityStreams2.0 issues with the general conclusion that issues raised in future should be more specific and actionable, rather than vague problems. An alternative for reporting this kind of issue wasn't mentioned specifically, but vague problems can probably go in brainstorming sections on the wiki somewhere (indieweb style) or into github issues.
A note that we can always re-open issues if they turn out to be a problem in the future, but we shouldn't keep them open just in case they might be.
Awesome user-story protocol walkthroughs
Aaron, Jessica and Andrei and Henry walked us through exactly how some of the user stories would be carried out according to the protocols Micropub, ActivityPump and SoLiD respectively. This was super useful, and if you weren't there you need to read the accompanying documents (linked just prior) and minutes (linked at the top of this post).
Results of this were:
Proponants of each protocol started to really understand how the other protocols worked, in a way that just reading all the specs couldn't do.
Everyone really started to see where some protocols were strong and where their own weak points or gaps were.
Everybody started to express that their protocols aren't complete and entertain the idea that they could make changes.
We started to get a feeling of how the three protocols could complement each other well, and the feeling of competition between them was gone.
We started to get really excited about making this happen.
I particularly noted:
Sandro said he could see how Micropub and SoLiD were similar/complementary (SoLiD advocates seem keen on adding webmention for notifications).
Aaron and Jessica agreed that ActivityPump and Micropub were actually way more inline than they realised before.
I can see the ways in which ActivityPump and SoLiD are similar, and Evan also noted the complementary nature of the two.
That's a full triangle of connections! The protocols are all friends.
The resolution, then, was that we won't rush to pick a base to work from, and instead will spend some more time (with regular updates to the group) tweaking each protocol to get closer to convergence, so everyone will be happier when a base does eventually need to get chosen.
(Exciting, right?! This was like the best meeting of minds that has happened so far. If you weren't in the room you might have missed this, so... trust those of us who were).
Extensibility
There should be some kind of clear warning in the spec that extensibility won't work well if you're using plain JSON, not JSON-LD (implying the best way to do vocabulary extensibility is through URI namespacing, which hasn't neccessarily been agreed, but to me seems like a sensible way). It also needs to be clear that upon receiving terms that a server does not understand it should not drop the data, even if it ignores it - in case that data gets passed forward to a server that might understand it.
We resolved "ISSUE-36, Remove all non AS2 namespaces from the normative context, keep the normative context limited to only AS2 vocabulary terms". I'm not totally sure what this means: that if there are terms we decide are crucial we will include AS versions of them even if they already existing another vocabulary (instead of reusing)? In the name of 'completeness' might we overload ActivityStreams, and because we consider AS 'complete' risk sabotaging easy extension? I still don't get everything that is throw around during extension mechanism conversations, so I could be missing something. Mostly I'd love to see someone implement AS and extend it to a specific domain, to see how this would work in practice. On a related note, I don't think I've seen documentation of the use-cases / origin of all of the vocabulary terms in AS2, does this exist?
Activities vs objects binary is false
The activity-oriented model of AS2 and the object-oriented model of microformats are actually basically the same but looked at from different perspectives. I think it's really important people try to see this, and not see them as conflicting. We're all trying to do the same thing, and there's no reason AS2-based and microformats2-based implementations can't interoperate. I'm going to work more on this, and others are too. We closed issues related to this as too vague, but it'll need revisiting when we have some more concrete proposals about what to do. By the end of the two days, people were starting to generally agree that this is the case.
People and profiles
We clarified that Person in AS2 does not need to refer to a real-world person, and agreed we should make this clearer in the spec (eg. it could be a fictional person, a persona or aspect of someone, etc). We resolved to add Profile to AS2 to enable talking about documents about people separately to talking about people, and to facilitate connecting one Person to multiple Profiles, which I think is useful but not everyone agrees. Thus Profile is at-risk until there are implementations.
It's worth emphasising the two different parts of this discussion: Person vs. Persona is different from Person vs. Profile (ie. Person != Persona != Profile). There was some conflation of this during discussion. Whilst everyone tends to agree that there are three different things there, we disagree about which level of modelling is practically necessary. Figuring this out based on observing how existing social sites model this, implementing my own aspect-based profiles, and shunting my own data around between different profiles, is something I'm concentrating on over the next couple of months.
Clients and servers
Describing things as client or server can be misleading. Things act as a client or server depending on the perspective, and it doesn't necessarily matter if they run in the client or on the server. We either need to clarify or alter our terminology, perhaps rephrasing to describe which componants we see having which responsibility.
Namespacing terms
Not at all, with strings, with URIs? Uh... decent arguements for and against all, strong opinions all around. I dunno.
Audience targeting vs group membership
Subtle distinction between access control via the author of a post deciding who to send it to (or who can see it), and someone actively joining a group in order to see additional content.
In ActivityPump (and pump.io) you specify to to decide who can see a note, eg. your followers. If someone new follows you, and someone else unfollows you, then you update your note, which list do the changes get propagated to? The original receivers of the note, or the current list of followers? I think this isn't specified and needs to be clarified. In ActivityPump, following someone is effectively adding yourself to a group (Collection) of their followers.
Side effects and propagating changes to the social graph
LDP doesn't have any side effects by itself, it's simply posting and getting of data to a generic store that doesn't understand the data itself. But for more domain specific purposes like social, LDP could be one layer with another layer that handles side effects like notifications and distribution of changes.
Certain activities in ActivityPump cause specific side effects. This is a fixed list, and could do with being better described in the spec. These are things like: if A creates a follow activity of B, side effects are A is added to B's list of follwers, B is added to A's list of followings, B is notified that A followed them, and anyone with permission to see A's activities also sees that A followed B. From what I can tell, side effects tend to be updating/deleting objects or adding to/removing from collections.
Micropub's side effects could include syndicating a post to other sites, or triggering webmentions (notifications). There is increasing discussion about having a following list that a reader can subscribe to (so you don't have to enter all of your subscriptions if you change reader) and keeping track of when you followed/unfollowed someone; actively doing one could trigger the other.
My vague conclusion is that specifying an extensible way to describe side effects of activities would be useful, with perhaps some core musts and shoulds, but open ended for implementations to do more focused things (eg. if Floop-o-matic decide that posting a Floop automatically likes the second most recent post of everyone named Fred, then they could describe that in a spec-conformant way. Okay that was silly, but you know what I mean).
RESTful vs endpoints
LDP is RESTful; Micropub (and Webmention) use discoverable endpoints; ActivityPump mostly uses endpoints (specific paths rather than discoverable I think) with some things able to be done RESTfully. Endpoints mean services can be delegated to third-parties, and can therefore be used on static sites. Not sure if there's a specific benefit to RESTful (or RESTfulish) but with a bit of sideways thinking they could actually co-exist, allowing implementers to use the method they prefer.
Cooperation++
General observation: We're all working towards the same thing. Nobody in the group is trying to sabotage this effort. I don't think it would hurt to listen more, and maybe imagine that you want someone else's [solution|use case|constraint|idea] to be better than yours, and try to fit it to your world, instead of just insisting one is the best.
Every community has different constraints, and different use cases they're trying to solve. We can't elevate one set of requirements above another, but need to try to accept - or at least entertain the idea - that they're valid, without dismissing them outright just because you haven't experienced it directly. Periodically mentioning the business use cases from IBM and Boeing (for example) is helpful in reminding everyone that there are legitimate long-standing needs that probably aren't considered by most of us, but will be implemented if we support them, and will be implemented some non-standard way if we don't.
Addendum
TimBL made sure to remind everyone that JSON is 'in fashion' just as XML once was, and really everyone will regret not just using RDF from the start in the future :)
When is it a checkin (with a note) and when is it a note (with a location)? Hot topic. I differentiate them for display purposes (currently I just show a map-marker icon next to checkins, but I'm also going to want to show them on a map and stuff).
For now, my rule is:
If a post has a location property, which should be a URL of a place (venue/city/country/vague), it's a checkin.
A checkin may have a latitude and longitude (my vague checkins, eg. 'home', do not).
A checkin may have content.
If a post has a latitude and longitude and nolocation, it's a note with a location.
A note should have content.
My inner semantic pedant is unhappy with attaching a lat and lon to a post directly, so I might rethink this at some point.
Offline, Tantek and Loqi have never been seen in the same place at the same time, are they secretly the same person?!
New Quill editor
I'm writing this post with Quill's shiny new editor. It's so pretty and I'm having the best time typing right now. I might use this for literally everything, including taking notes in meetings etc. Actually that's a really good idea, then I can just post meeting notes straight to my site. YAY.
Someone took my correctly labelled and desperately craved juice from the hostel fridge :((( I don't know how to react other than by sharing my anguish with the world.
Amy wrote about travel, hostel, austria, mountain, & innsbruck
I thought today was going to be one of those staying-in-the-hostel sorta days.
But the old Vietnamese women sharing my dorm said she was inspired yesterday by my desire to climb the mountain on foot (instead of cable car) today, and wants to come with me, despite the torrential rain. So, I guess that's happening.
First she has to sleep off overeating at breakfast though.
I picked Innsbruck pretty randomly as a mid-point between Dusseldorf (where I was for IWC) and Florence (where I need to be for WWW). I haven't been to Austria before, or even the Alps bar a day-trip during a school trip to France like ten years ago. The first day I was here was clear, sunny and crazy hot, so I started loving Innsbruck pretty immediately. I wandered around town, got a feel for the place, and found the only place I could get vegan pizza and eiskaffee.
The Inn river is fast-flowing and a cartoonish blue-green. The houses are bright colours, and everywhere is walkable. The town is surrounded by a ring of snow-capped mountains.
I booked a hostel so I wouldn't have to socialise too much, as I need a break from people between all of these conferences. The hostel is super quiet, and mostly pretty good. The first night I shared my dorm with two Canadian girls. They told me the funicular up one of the mountains is reasonably priced, and that it was silly to think of walking to the base as it's really far, and I should get the bus. Also that I should pay the EUR 2.60 for a bus ticket, as one of them didn't and got caught and fined ;)
Yesterday I hacked a bunch on Slog'd in the morning, then at 2pm set off with vague intentions of either climbing a mountain or swimming in a lake, ideally both. I ignored the advice of the Canadian girls, and walked to Hungerburg where the cable car starts. It was less than an hour from the hostel, and the mountain parts were easy. Turns out the cable car to the top is over 25 EUR, and it's about a 3 hour climb to Seegrube. And climbing is WAY more interesting. However, from Seegrube to the summit at Halekefar I was advised there is too much snow for climbing, so the cable car for that stretch is mandatory (and Seegrube-Halekefar is EUR 6.10 return, which I can handle). So I figured I'd climb to Seegrube, take the cable car to the summit and back, and climb all the way back on foot. But by that point, the odds of me making it to Seegrube before the cablecar stopped running at 1730 were pretty slim. I toyed with trying to find an ATM and taking the cablecar all the way, but decided I'd prefer to climb anyway and can come back the next day, earlier.
Then I walked to Lake Rossau, which the internet claims cost EUR 3.50 to swim in but I mean, it's a lake, so nobody seemed to be enforcing this. So I swam in the lake surrounded by mountains and it was beautiful.
Then I came back to the hostel and added a first pass at ActivityStreams2.0 JSON to my site. Woo! Productive day.
Today it is raining heavily and the mountains are shrouded in clouds. Naturally. Turns out I'm going to give getting to Halekefar a shot anyway, even if I can't see anything from the top, thanks to encouragement from my new hostel roomie, a fairly old Vietnamese lady who lives in Belgium.
Also, I'll post some photos just as soon as I implement display of albums and attaching Collections to posts on Slog'd.... Aaaaany day now.
I have in-dispersed this report with messages I sent either on Twitter or to anyone who might pay attention over the course of the journey..
Rosa (the elderly Vietnamese lady) and I walked to Hungerburg. It was raining heavily, but warm. I messed up the route a bit and we did a lot of scrambling through mud and up steep slopes, but Rosa seemed thrilled to have found someone to have this adventure with.
She told me about when she had left Vietnam for Belgium as a political refugee, and all of the horrible things her family and friends had endured because of "crazy communists". Her brother and sister live in California now, and none of them ever want to go back to Vietnam even though it's safe now.
She also told me about her 27 year old son who she considers a huge disappointment as all he does is browse the web and talk to his girlfriend, and doesn't have a job. He has a masters in Informatics, but there is no work in Belgium, and he refuses to move somewhere he can find work.
She told me about a friend's son, whom everyone thought was stupid until at around 22 years old he went to university, completed some degrees in record time, and now works as an accountant in London and is married to an African woman, apparently to spite his racist family, which she finds hilarious, and wishes her son was like this instead.
She calls all of her cats 'Baby'.
This was super fun, and I'm glad she encouraged me to go out in the rain.
She didn't have time (or suitable shoes) to climb to Seegrube, so we parted ways at Hungerburg. I hope she made it back okay!
I continued to Seegrube. It was pretty thick fog the whole way, though sometimes I could see a few hundred meters ahead instead of a few meters. I took lots of pictures of where I expected there would be spectacular views if there wasn't cloud in the way.
[14:09] Just checking in. Literally in a cloud. Can't see fuck.
[14:12] It's pretty creepy. I think I hit a pub in about an hour.
[14:13] I'm soaking. GPS is good though.
I mostly followed the main road, which zigzagged and was a much less direct route, but the through-forest trails were wet and muddy and the fog didn't instil me with confidence. At one point a sign expressly pointed into the forest, so I clambered for a bit, but then found a hut and lots of scary looking forestry equipment and decided it was a horror movie waiting to happen, so back-tracked to the road...
[14:18] Ooh a sign! Pub 40 minutes. Assuming alm means pub. Then just another hour to next cable car stop..
[14:21] Mystery crashing sounds
I saw two humans and one dog for the whole three hours I was walking. Occasionally I'd see a completely empty cable car glide by overhead. The air was heavy and still, and the mist was creepy. I started to worry about flash flooding, wolves, bears, and crazy humans.
[14:24] Can you look up what to do in event of flash flood, bear, or mad axeman?
[14:25] Also if there are bears or wolves on hafelekar
[14:26] Omg if this cloud wasn't here views would be incredible. I hope it isn't all the way to the top. I at least want views over expanse of cloud.
About an hour before Seegrube was Bodensteinalm, a pub-type-thing a few minutes off the main trail. I was entertaining the idea of a cup of coffee and human contact, but the place - a cute little Alpine hut - was completely deserted. The temperature was starting to drop, so I pressed on.
[14:44] Omg snow
[15:11] Human being!!!
[15:12] And he's gone. Swallowed by fog.
[15:23] Omg mist clearing and can see end of cable car!
The last stretch to Seegrube, 6,250ft, was pretty cold, and there was snow. After 8km uphill, I was ready for a cup of coffee, and splashed out 3 Euros at Seegrube Restaurant; the coffee was horrible. I did a circuit of the top, but alas the clouds did not part in divine glory and reveal the spectacular views I had been missing. There was nobody around but weary-looking restaurant staff.
[16:02] 6,250 feet, still can't see shit. Cable car to very top is less terrifying for being engulfed in cloud.
I got a return cable car ticket to Hafelekar, the summit. I was charged for an under-18 ticket \\\\o/ (EUR 4,90). The ride was less than 10 minutes.
I stepped out briefly, but there was nothing to see. I'd really hoped the summit would be above the clouds. Took some more photos of white. Met some Australians. Cable car back to Seegrube. Was freezing and tired, so decided to cable car it all the way back to Innsbruck but I didn't have enough cash, and they didn't take card. I must have looked suitably pathetic, because the staff took pity on me and let me ride free back to Hungerburg. Also the driver liked my hat. I'm pretty sure that helped.
Back in Hungerburg, it was so much warmer! I had a snack and recovered a bit, then walked the 5km back to the hostel. I managed to go off-route again (this being the fourth time I'd walked between Innsbruck and Hungerburg); didn't have to scramble through mud but did accidentally walk through a wedding reception in the grounds of a hotel, and ended up going via the centre of Innsbruck, which was a bit out of the way.
Really I'm fine with having missed out on seeing for miles, as climbing a mountain in thick fog is an interesting experience by itself. I will post all of my photos of white in due course, but my favourite is this convenient sign showing what I could have been seeing...
Amy wrote about http://vocab.amy.so/blog#Done, http://vocab.amy.so/blog#Done, indieweb, social web, www2015, emax, decentralisation, & personal data stores
I spy @emax telling the world about awesome rad social decentralisation stuff and how silos are bad #indieweb
Amy wrote about social web, www2015, emax, & decentralised
"If we were still in a web 1.0 world where everyone was their own server and client [data siloing] wouldn't be a problem, but now we have to duct tape it" ~ @emax
Amy added http://www.slideshare.net/pmika1/social-networks-and-the-semantic-web-a-retrospective-of-the-past-10-years to https://rhiaro.co.uk/bookmarks/
If you've been paying attention to me IRL or in IRC lately, you'll have had me try to persuade you that activities and posts are basically the same thing. People advocating post-centric views and people advocating activity-centric views are really describing the same thing from different angles, and with slightly different data models.
An activity looks generally like:
And a post looks generally like:
Colour coding indicates what correlates between the two. Differences:
Activity
Post
type
explicit
implied by properties
relationship to another object
object
value of arbitrary property
meta
some on activity, some on result
all on post
But you can see that the data they contain are basically the same. Bear with me.
What are activities for?
To propagate changes through a network. To tell people that somebody did something.
What are posts for?
Posts are content, an end in themselves.
Who cares?
As someone who just wants to publish stuff and interact on the web, do I care if I'm creating and pushing around posts, or activities? Probably not. I just want to do stuff, and have people see it.
As a developer, I want to post objects around that contain as much data as needed, and no more. I want the right people to know when something has changed. Whether I prefer to do this with activities or posts (or JSON or HTML) is, as far as I see it, personal preference. I don't think there's an inherant advantage to one over the other.
So which to start with?
Starting with a blog perspective, the most important thing is that people see my content. Posts are my content, so I start there.
I create a post, which are objects with various properties.
If I want to explicitly notify someone of a post - because I'm replying to them, favouriting, bookmarking, sharing, tagging, etc, I send them a webmention.
The reciever is then free to act upon this as they like: display my post on their site, update their own internal friends list, add my post to a collection, ignore it completely, or whatever.
If I want to make a general announcement that something has changed on my site (eg. a new post) I either use PuSH and the hub lets subscribers know, or I don't do anything, and wait for interested parties to pull (visit my homepage, or open their reader) and find out for themselves.
For humans, the posts are displayed in html, and for machines they're marked up with minimal microformats, which allows a reader such as Woodwind to parse out the relevant information and display however necessary. (Mine are also avaiable as RDF, but to the best of my knowledge nobody has built a blog reader that consumes RDF yet).
In the ActivityStreams model, rather than creating posts directly, the user performs some activity which may generate as a side-effect a post. The activty could be something like Post, Share, Like (with many other terms currently in the vocab), with an optional target of an object being acted upon, and an optional result of a new object being created. Upon creation, the activity is sent by the server to the servers of anyone who is expected to receive it - either a default list such as people who have subscribed to the author, or a specific list of other people specified when the activity is created, or anyone mentioned or replied-to etc. Anyone for whom the activity ends up on their inbox might get a notification, and their server can fetch the associated post for them.
Not all activities generate a result post and some activities generate a result that is the same as the object. In these cases, I would argue that an activity == a post...
Currently, when I like something I create a like post, that looks like this:
A like activity looks like this:
See how similar they are?!
So given this apparent direct mapping between posts and activities...
Posts as activities
Dreaming of interoperability with ActivityPump implementations, I want to generate AS2.0 compliant activities that I can send out. I stuck to super basic representations for now, nesting as little as possible (figuring everything with a URI can be dereferenced anyway, so all of the data doesn't need to be present in the first layer of JSON).
So for a new post such as:
<article class="h-entry">
<h1 class="p-name">Post title</h1>
<div class="e-content">
<p>This is a post!</p>
</div>
<time class="dt-published" datetime="2015-05-15T13:06:00+02:00"><a href="https://rhiaro.co.uk/2015/05/a-post" class="u-url u-uid">15th May 2015 13:06</a></time>
<p class="h-card p-author p-name"><a href="https://rhiaro.co.uk/about#me" class="u-url">Amy Guy</a></p>
</article>
With no explicit audience specified, an ActivityPump compliant server would post this to the inboxes of all of my followers. Their server would see the new activity and insert it into their feed; they could click it and view the object (the post). Note that the object of the activity and the result here are the same, so there's some redundancy.
For a like post - because I start with posts, I keep the result of the activity as the like post and retain this redundancy, though this isn't necessary and (see diagram above) you could in fact consider the activity to be equivalent to the like post, and use the ID of the activity to interact with it (if someone wanted to like my like, etc). I have no explicit post types, so it's implicitly considerd a 'like' post due to the like-of microformats property:
In this case, as well as any explicit or default audience specified, my server would post this activity to Jessica's inbox, whether Jessica is following me or not, as it's a like of her post. Her server can notify her, insert this into her feed, and it's also her server's job to send this activity out to everyone (probably Jessica's followers) who recieved the original post (the one I'm liking), so the 'like' counter can be incremented consistently for everyone, whether they know you or not.
Without activities (my current setup), I'd send a webmention to Jessica, and there's nothing specified about how her server should handle this (beyond checking it's valid), so propagating the like out to everyone who had seen her post wouldn't necessarily happen. However, she is likely to display the number of 'likes' on her post, so a reader could pull the new number of likes each time anyone viewed it (or poll continuously if it wanted a live-update), which puts a lot of burden on the client rather than the server.
Microformats to ActivityStreams
So I generate activities like this for all of my posts so far. As I removed all explicit post types from my storage, I rely only on the properties of a post to decide how to display it. I implemented similar rules to generate the activity types required by AS2.0. These rules cascade:
name exists (object has a title) -> Post
location exists -> Arrive
like-of exists -> Like
bookmark-of exists -> Save
repost-of exists -> Share
otherwise -> Post
in-reply-to exists and has category "rsvp" -> Accept
otherwise -> Respond
I also check nameless posts for eat and sleep tags, as these indicate a lifelog post for eating or sleeping, and use types _:Consume and _:Sleep (my own namespace, as AS2.0 doesn't have these types. TODO: Reuse an existing vocab for these). I'll be adding running, yoga, hiking, listening to music and committing code imminantly, so I might need more activity types. I probably need to model these better than relying on tags (but... maybe not. We'll see).
Known issues
If you noticed that the object of a Consume activity is a blog post, you're a semantic pedant, and you're right, this doesn't make sense. The next best option given the data I currently store is the object being blank node with a label of the contents of the post, eg:
But ideally the object would have it's own URI. This probably isn't something I'm going to do any time soon.
Note an object (a post) is still created as a result of the Consume activity. This isn't necessary - as with likes, the pure activity could be sent and displayed to people - but since I start with posts, I wouldn't drop them.
Sometimes, when you want to do something on the web, it doesn't feel like making a post. For example, if I want to delete a blog post, I need to tell everyone who received it that it's deleted. In indiewebland, you just delete the post, return a 410, and send a webmention to anyone who needs it. However, this doesn't leave any record of when it was deleted (or when it was created). You might have noticed I like tracking everything, so the ActivityPump way of deleting - which retains a trace of the deletion - appeals to me:
(In the current ActivityPump spec, the result is a shell of the object that is being deleted, so the URI of the deleted post is retained with a deletion date attached, but all other properties deleted).
But when you think about deleting a post, you're not thinking about creating a delete post which references the post you want to delete (if this is how you think about it, I'd love to hear from you). You want to hit delete, and have everyone suitably notified. The same for updates/edits/modifications (of your own post - creating a diff post as an edit to somene else's post or a wiki page is a different matter).
Nonetheless, if I wanted to display the delete activity for humans, I could mark it up in HTML with microformats, just as if it were a post, something like:
I have invented microformat property u-delete-of, this doesn't currently exist.
There is content in the HTML version that is not present in the JSON version. Probably a content (or existing displayName) property on the activity could be used for this. Where this content comes from could be implementation-dependant, with some sensible default fallback.
So even though they're basically the same thinking about 'delete' as an activity rather than a post feels easier and it is still possible to treat as a post for display if you need to.
At the moment I store a modified date and just update this whenever I edit a post. For now I plan to add something that checks all posts for a updated date and slots Update activities into the stream (even though there is no explicit update-of post). When I can update posts properly with micropub, I will generate the update activity then.
There are other activities ((un)follow/add/remove/join/leave) that I also think would be simpler to think of in this way. I don't currently know of anyone in indieweb who is displaying posts for these marked up with microformats, though I have a couple of experimantal follows posts with u-follow-of.
Next
Once I have AS2.0 compliant activities, I could post them to inboxes of [ActivityPump]() compliant servers. Someone should implement one please :)
Addendum
Certain activities (like Follow) may trigger special side-effects (a user is added to another users followers collection according to pump.io and ActivityPump (not ActivityStreams)). In indieweb, if you want to follow someone you type their URL into a reader and it fetches their content. What's missing is the reader being able to post a follow activity to your site via micropub so that others (including who you have just followed) can be notified of your follow, and if you have a public list of follows, that can be updated too.
This is out of scope for this post, but I think core side-effects like this need to be clearly defined, and we also need a clear way of defining new side-effects as extensions.
Well that was a bust. W3C track, cool WebRTC demos... "our idea is to build a new advertising model inside media streams" ... "location aware targeted advertising" ... "on the fly product placement in video". I quit.
So why are all the use cases for cool tech that people come up with at conferences 'to sell more stuff'? I know there are other uses. People are going to buy crap anyway, but so much energy is spent on this :(
Amy wrote about academia, www2015, advertising, tech, & industry
if the only way to get anything done in academia is to be a pawn for industry, fuck that. It's not the case - research for general public good is funded, tho probably not nearly enough. It's depressing that that is entirely not reflected in today's conference sessions
My favourite thing about Italy is whenever I hear sirens I expect Morrissey to jump out belting The Youngest Was The Most Loved. Also polenta toast with porcini mushrooms. But, happy birthday Morrissey.
Yeah it's an earlier delayed train. Terminates half way to where I'm going so I can pick up the correct train there assuming that one remains ritardo. Had to figure this out by scouring interrail timetables as there are entirely no hints on the train or any platforms passed through.
I enjoyed WWW2015 because I got to hang out with emax and Dave and other SOCIAM people and talk about decentralisation, and eat lots of vegan gelato, and was still on a travelling and hacking high from the two weeks prior.
But content-wise, what I saw was disappointing at best, largely depressing. I unfortunately missed most of the SOCM workshop, which I'm sure would have catered to my tastes a lot more, as my presence was mandated in Microposts2015 on the same day. The Microposts workshops have a bias towards SNA of Twitter, in which I'm tangentially interested, but there's only so much SNA I can take and I think I took it all in 2013. The social science 'track' (two papers) was most interesting. I much prefer when social network users are treated as complex beings than dots and lines.
I flitted between tracks on security and privacy, and web science for a couple of days. I deliberately avoided anything to do with social networks which turned out to be damned difficult. Web science can be a bit big-data-analysis heavy, but often has some interesting human-social (as opposed to social-data) stuff to pique my interest. I went to security and privacy sessions because it's almost guarenteed to not have any social networks, and is usually either scandalous or practical, or both. Often over my head, but also often contains concepts directly relevant to my day-to-day that I wouldn't pick up on otherwise.
I almost cried at the programme for the last couple of days. Literally every session was about social data mining, bulk analysis of social data for tracking and profiling social network users, targeting advertisements, and generally selling people stuff. There was even a track called 'Monetization'. I figured the safest bet would be the W3C track which promised awesome WebRTC demos, which Claudio from Telecom Italia delivered, but then he [reminded](socialwg irc minutes) me that their interest in this stems from wanting to do live product placement in streaming video based on people's interests from social media and ohmygodicannoteven. I tweeted in anguish for a while, then dret summed it up pretty well:
"generally speaking, i'd like to see more "how to make the web work better" at #www2015, and less 'how to make more money with the web'." - @dret
In desperation (I'm on a linked data burnout currently) I dropped by the RDF session but it was ten similar-but-different-mine-is-better-i-promise ways of doing entity recognition - or if it was anything else it was so far divorced from practical application - and I just don't care.
In a last ditch attempt to learn something interesting, I went to the Industry Knowledge Graphs pecha kucha session. Google, Micorsoft, Elsevier and Tagasauris talked about how great they are at absorbing all the data. And.. getting the crowd to curate it nicely... and... not giving any of it back... oh. Because if someone uses it and it's wrong they might get sued? Sure. Whatever. Oh and then Lora Aroyo broke my heart by describing how to make anything and everything a 'shoppable experience' and Dave and I bolted to join Max in a coffee shop.
I had a great ciocolatte with almond milk, then we went for pre-dinner spaghetti in a rave cafe and talked about decentralisation and I recovered.
Overall it was a pretty productive couple of days, because I wrote this post about ActivityStreams and did some more AS2.0 experiments, fixed some bugs in my micropub endpoint and templates, and tweaked my CSS and added my /travel page. And evangelised the Social Web WG to Max a bit. Maybe I couldn't have done that if the conference had captured my interest, who knows.
And I discovered polenta toast with porcini mushrooms, and ate a lot of different flavours of vegan gelato. That's a net win.
I decided last minute to get a ferry from Ancona (Italy) to Split (Croatia). I thought I'd write a note about navigating Ancona and ferries, because I didn't find much online beforehand and if you don't read Italian and/or have an intricate understanding of ports it's not a particularly welcoming experience.
Initially - which is unrelated, but sets the tone - I planned to take trains from Firenze to Faenza, then Faenza to Ancona. The train from Firenza was delayed by 25 minutes, but fortunately I had an hour to make the connection at Faenza. I have already noted that most regional trains I've been on in Italy so far don't have any clues on the outside about where they're going, and lots don't have screens or announcements on the inside either. On top of that, smaller stations don't have live departures signs on platforms (ie. which train is here next) but paper posters for looking up platform based on time and destination. Which are good, but there is a certain amount of hoping for the best when you jump on the mystery train that rolls up to where you think you should be waiting. Anyway, at Faenza the Ancona train was also delayed by 35 minutes. Despite knowing this, I jumped on a mystery train that rolled up at the correct platform at about the correct time, then realised what I'd done. This turned out to be a delayed train from earlier. This was one of the great ones with zero hints on the inside about route audibly or visibly. The Interrail timetable app is great however, and after a couple of stations I managed to pin down which train I was on and could work out that it should terminate at a station where I could pick up the train I should have got - assuming that one was still running late.
It was - even later, in fact - and I eventually switched to the Ancona train at Rimini. The last stretch of the journey was along the coast, which is always good.
The internet advised me to check in to the ferry 2 hours before departure, and I'd left an hour of buffer time, so I still had 20 minutes or so spare even with the delays when I got to Ancona. It was absolutely chucking it down, but I'm getting good at imagining how beautiful towns are in the sun. Pretty sure Ancona would've been stunning. Turn left out of the station and follow the road for about 20 minutes to reach the Ferry Port Authority. Got soaked through, but it was easy to find.
And, all closed up. I could see the ferries, but not where to go to check in. There were signs, but it wasn't clear where I was supposed to go first. I followed various signs for passport control until a disgruntled police officer managed to put me on the number 20 bus. She was grumbling and pointing in Italian so I did as she said, without really knowing why. The bus driver asked where I wanted to go in English, and I said 'check in' and he said 'aha, terminal' and took me there, which was about half way between the train station and the Port Authority, but I'm not really sure if it's reachable on foot or not. This is apparently a free shuttle bus between the different bits of the port you need to visit to successfully board a ferry.
Step one: don't walk for half an hour to the Port Authority in the rain. Take the number 20 bus to the Terminal.
There, the signage was more helpful, and I swapped showing my passport and PDF ticket for a paper ferry boarding pass. The next instruction was to go to Port 9, which I recalled was back by the Port Authority where I'd already been. It looked like the number 20 bus went round in a circle, so I picked that up again outside the checkin terminal and sure enough, it took me back to the Port Authority.
Step two: The number 20 bus is good. Take it back to the ferry ports.
This time was different, because the bus was full of other ferry-bound tourists, so I was able to follow them. Also the same passport control building appeared to be open now, so I followed them into precisely where I'd failed to get in before.
Step three: Go through passport control. There is no security check or anything. Possibly this is not available until two hours before your departure time.
Inside the post-passport-control waiting room was zero indication of where to go next. I followed other people.
Step four: Go straight out the door on the right as you enter the post-passport-control room. You'll see ferries. Walk along past ferries until you see your ferry.
We had to wait in the rain a bit, but then got straight on the ferry to be greeted by extremely cheerful staff, presumably to make up for all of the grumpy port staff.
Step five: Board ferry. Yay!
I booked a 'deck passage' which translates to 'sit wherever you can find'. I briefly considered an extra 4 euros to guarantee a seat but then remembered I could get like three gelato for that. That turned out to be great, as the ferry isn't busy (or everyone is in super expensive cabins) and any empty 'paid' seats are fair game. I found one beside a window and a power socket!!! They're good seats, too; big and recliny, and I have a whole row to myself right now so I'm going to lie down and sleep properly in a bit.
(By the way, the ferry ticket was 38 euros with an Interrail discount).
I've eaten all of my stolen conference lunch food and I'm still starving, so Imma go on a ferry-adventure-food-quest.
Update: There are people sleeping everywhere, floors and bar sofas; weird they're not using the empty seats, but more space for me. I procured some overpriced paprika crisps and a jar of souvenir antipasti for sustainance. The rest of the ferry is pretty boring, and largely full of loud middle-aged Italians.
Arrived in Split just after 7am; it was a beautiful day and I couldn't check in to the hostel until 9, so I wandered into town. The world was just waking up, the sun was warm even though it was early, the sea was sloshing, there were mountains in the distance. Even though there were a lot of people about, and market stalls being set up, everything felt so calm.
Naturally, I got sidetracked by a hill and ended up climbing pretty far up Marjan, the forest-park-hill. The views were beautiful, and passing runners made me excited to run there. Even with two rucksacks the climb was pleasant. I looped back in time to get to the hostel just after 9.
The hostel (Tchaikovsky) is tiny and tucked away down a side street; the owner was really friendly and welcoming, and when I arrived he was running around helping out other guests, picking up laundry, fixing travel plans, and booking other hostels for people he couldn't find rooms for here. Tea and coffee are on tap, and the place is relaxed and super well maintained.
Whilst waiting for my key I made friends with R from near Manchester and L from Singapore. We all headed out together for today's adventure. First stop was a vegetarian cafe 5 minutes down the road from the hostel, where I picked up a seitan sandwich. Then we started by climbing Marjan again, and continuing all the way to the very end of the park, where we spotted this beach:
I, erm, needed to go there. So we did.
And L and I swam in the sea and it was lovely.
We headed back to town, the guys got some food. I discovered through extensive market research that here everyone makes sorbet with cream. How frustrating.
R left and L and I followed a trail of monuments and ruins in the town that he had a map for. There are 14 points with big signs that tell you all about them, which was cool. We never did find number 5 though (Jupiter's Temple). Below is not what the trail looks like on the map...
Then we wandered further east and discovered some more beaches. I paddled and pegged some more good swimming spots for tomorrow.
The threat of torrential rain was looming all day, according to the ominous clouds and the weather forecast. We obviously got seriously lucky. But even it it rains for the next few days I've now seen most of Split (L is leaving tomorrow, hence urgently covering the main attractions). Though I do plan to take a trip to Krka national park, this week is supposed to be a relaxed working environment rather than an actual holiday, so being trapped in the hostel by storms would probably be pretty good.
On that note, the hostel is great. Rooms are really nice, and the beds have privacy curtains, power sockets, big free lockers, and it's like a tenner a night.
If micropub used JSON instead of (/as well as) form encoding, what might submissions look like? Aaaron Parecki brainstormed about this on our Social APIs brainstorming doc. I'm going to repeat his examples for create/update/delete here, compare them with equivalent AS2.0 json, then explore other post 'types'.
No URL is given so it's implied that a new post is being created. Most of this is Aaron's example but I added the explicit published date and author, but these could also be added automatically by the micropub endpoint as the current time and the authenticated user who is sending the request.
ISSUE:actor vs author may never get agreed upon. I think actor is too abstract and author is too specific. I'm a fan of agent to mean 'whatever caused this to happen' (be it human, group, process or bot) but I know that's not an easy sell either. I think one side is going to have to suck it up, and I don't know who this is going to be. AS also has attributedTo which may be a reasonable compromise but seems a bit clunky.
Response per micropub spec: 201 Created and the URL of the post in the Location header.
An AS2.0 Activity for creating a new post would look like:
Response per ActivityPump spec: "This has the side effect that of the object that they are posting is being created." - either I missed something more specific in the spec or this remains to be clarified (I'm not criticising, AP is very much under-development!).
I prefer the first one. Key differences:
Explicit type on the activity (whereas Post or Create is implied in the micropub example).
Metadata (eg. published and actor) are attached to the activity, not the object.
There has been a bit of discussion about whether things like audience targeting (to) would be better off attached to the object rather than the activity; I'm inclined to think there's no metadata related to the creating of an object that can't/shouldn't be attached to the object itself, rendering the activity redundant. I keep asking people of examples that contradict this, but so far nobody has given me one.
But the latter doesn't contain the updates made to the object... I might be missing something, but there are no specifics in the ActivityPump spec about this; presumably the user updates the object directly and the Update activity is generated from that, which is a curiously object-centric happening in an activity-centric world. Neither contain the updated date; presumably for micropub the endpoint is expected to fill this gap automatically, and possibly in the AS example the activity is meant to have a published property which could also automatically be filled in by the server. I'd like to be explicit about the updated date, though I don't know if this is a must or a should or a may. An alternative I like is:
They look pleasantly similar :) ActivityPump specifies that "this must leave a shell of the object that will be displayed in activities which reference the deleted object. If the deleted object is requested the server should respond with the HTTP 410 Gone status code."
The empty 'shell' with the deleted date is useful if you want to preserve when you deleted things. Discussed this in #indiewebcamp IRC a bit, and tantek suggested that emptying a post of all metadata but the updated property would suffice for implying a delete. An alternative to the examples above could be:
where "...": "..." means... well, we need to define update behaviour before we can define delete-via-update behaviour. If omitting properties during an update removes them, then we don't need to send empty values for a delete. But if partial updates work, and the properties you send are changed and all others remain the same (which I think is better) then we need to send empty values for everything to delete them. This also allows the possibility of replacing content with say "This post has been deleted" or "this post was removed due to its offensive nature" or "I spelt literally every word wrong and it seemed easier just to forget about it" and so on, which could be useful for smarter display of deleted posts (ie. as normal posts that have been updated to say they've been deleted). I'm sure someone will have something to say about the semantics of delete vs update; if so, please back it up with practical examples/use cases :)
We also need to consider that someone deleting a post may not want to leave a trace, even if just an updated date and simply return a 410 if someone tries to access. This should be allowed, with the caveat that it's not possible to advise other servers that may have consumed the post that it's gone if they don't actively try to retrieve it and see the 410.
Liking a post
Or posting a like. Depending on whether you have object- or activity-tinted glasses. New grounds, so I'll start with what exists in ActivityStreams:
Remember in microformats we have the like-of property which would have the same value as object does above, this time, and the 'like' is a first-class post object in itself. So submitting one via micropub could look like:
These are preeetttty different with regards to how terms are being used. A more AS-friendly version where the like is still treated as a first-class object would be:
Even though a like post is implicitly created through the result you have to go via the activity that generated it to find out what it's a like of so it doesn't really stand on its own. In the same way as audience targeting and other metadata is useful attached to the object I think having the like relation directly between the objects is practical. For semantic pedants, one post is a like-of another post, so it's closer to having a like type than being a like verb. But it's an implicit type, rather than an explicit one. Just to reiterate: I'm not saying 'post A likes post B'. That would be silly. 'Post A like-of post B' pretty easily implies the author of post A likes post B. It's not worth trying to overthink that, and you don't need RDF inferencing to make sense of it.
In summary, even for things other than creating posts, I think just sending an object works. You can attach other things like "content": "I like Jessica's post" too if you wanted, for nicer display.
Checkin
The closest example in ActivityStreams is an Arrive activity:
{
"object": {
"published": "2015-05-23T13:00:00+02:00",
"location": "http://dbpedia.org/resource/Edinburgh",
"content": "Finally back in Auld Reekie!"
}
}
These are just like regular posts, but with a location property. Which is magically compatible with ActivityStremas and Microformats!
Where location is always a URI, so that display name, latitude, longitude, etc, can be attached to that and don't need to be included in the checkin. I'm a big fan of not nesting. If you submit a checkin with a nested venue object, the endpoint has to try to create the venue before it can do the checkin, which means it needs to attempt to de-dup venues as part of the checkin process; and if the creation fails then there's more hassle... there's probably a smart way of designing the UI plus use of javascript that can make this pretty smooth, but it's definitely not something I want to have to deal with.
RSVP
In AS we have Accept which is supposed to have an object of Invite which in turn has an object of Event (whether these are all nested in the Accept activity or just referenced by URI doesn't really matter, the structure is the same. I included the nesting here cos I just copied the example directly from the AS vocabulary spec):
While it's all semantically-pedantically very lovely, I reckon the microformats way of just having an RSVP be a regular post with a reply-to another regular post which happens to have a location, start and end (thus making it an event) is easier to follow and generally simpler (and effective as evidenced by all the people posting and RSVPing to indie events). In JSON, I think that'd look like:
Microformats does have invitations too though - what's the fun of RSVPing to an event if you can't invite your friends! Invite posts can be part of an event post, part of an RSVP post, or a post by themselves. That's because all we're really doing to create them is adding invitee properties for everyone you want to invite, and then sending them webmentions. If your invitation is not also the original event, you can send the original event post a webmention too (since you've mentioned it, after all) which could allow it to update its own list of who has been invited. Your invitee should reply with their RSVP both to your invitation and the event (which they can do with one post). Brainstorming about this, which is by no means sent in stone, on IWC wiki.
Neither ActivityStreams nor Micorformats have things to do with eating and drinking, but this is something I log on my site. My micropub endpoint currently recognises Aaron's p3k-food property so I'll use that here, but I'd prefer it to be something more generic..
A potentially useful fall back for something that wants to display this post but doesn't understand p3k-food could just to be to treat it as content.
Yes, I do desire to tag my food posts.
The value of p3k-food could also be a handy URI for the food, if one existed, which when dereferenced could give you things like different language display names, calorie count, cuisine affiliations, ingredients, etc.
Conclusion
My micropub endpoint will accept JSON and expect an object with a bunch of properties. From these properties my server can infer how to treat them with regards to who to send webmentions to (ie. who to explicitly notify that this object was created; if I was implementing ActivityPump I'd send the whole object to these people's inboxes) and how to display them. It dosen't need explicit types, or properties spread over activities and objects to do this.
In anther post I'll run through this for (un)follows, adding to and removing from collections, exercise posts, music listens, code commits, travel plans, offers and requests, and see if they hold up the same.
If you have examples of online social stuff you do that you don't think you could publish and propagate this way, please tell me all about it. I really want to know.
Hey Jeremy, what date did you decide for IWC Brighton? I felt like it was in June, but also that it coincided with Portland which is July, so now I'm confused. http://indiewebcamp.com/2015/Brighton is empty..
Also if you get a minute, could you give me the Mailchimp contact you mentioned?
Yesterday I jumped on a ferry at 0645 to Šolta, one of the smaller and closer islands to Split. The ferry took about an hour and was 56 kuna (£5.60) return. It seemed to be full of manual labourers commuting to work. This made a lot of sense when I arrived, as there's a lot of building work going on on the island. I'd heard there isn't anything in particular to do or see on Šolta, and that it's peaceful. My main aim was to find a nice bit of beach to set up office on for a few hours.
I thought I'd walk around the coast until I found a good spot, so set off east from Rogał. It was beautiful; the sea was shades of blue and green I can't even comprehend, and once everyone from the ferry had dispersed there wasn't a soul in sight. I only managed to get so far before my way was blocked by inpenetrable trees and/or sheer cliffs and I had to turn back. Intead of backtracking all the way back to Rogał to take a road though, I had a shot at pushing through the forest a bit. All over are tracks of rocks, like someone started building wide drystone walls and stopped after a few layers. These came in pretty handy for following through the brush, and eventually I cleared the denser part of the woods. Everywhere were vineyards and olive groves, and it was utterly peaceful. GPS was strong, so I kept off the roads and aimed for Stomorska. After an hour or so of (scr)ambling through the woods, I had noted the variety of lovely butterflies, become hyper-aware of all rustling sounds having seen several snakes disappearing into crevices not far from my feet, and carefully disassembled no small number of webs belonging to giant spiders so that I could pass. Suddenly I realised I had got turned about, and wound up on a road to Grohote, in the opposite direction to Stomorska. I particularly wanted to visit Maslinica at the west end of the island because I'd seen photos of more smaller islands off the coast there, so I kept on to Grohote. I stopped in the village for juice and chocolate, then continued the remaining 8km by following the road.
I was enjoying the walk, and it was warm, though often raining very gently. Not many cars passed, but over half that did (including one scooter) stopped to offer me a ride. I figured based on this I'd hitch back.
I made it to Maslinica and followed the coast around until I found an empty seafront bar with wifi, where I settled.
All day the only people who came by the bar seemed to be friends or family of the couple who were working there. It was also a beautful spot for a swim (but really where wasn't?), with a stoney beach. I worked on my site until my battery ran out, then wandered around Maslinica.
My legs were not impressed with the idea of walking 10km back to Rogał, and in any case I wouldn't have time to make the last ferry. I set off down the road, and sure enough the first car to come by picked me up, after about 20 minutes. They were going to Grohote, which is 2km from Rogał and a route I hadn't walked yet, so no problem, but last minute they decided to take me the last extra few minutes to Rogał anyway. So suddenly I had two hours to kill before the return ferry!
This time I wandered west around the coast, and found some more gorgeous swimming spots, and chilled out in a spot off the track from where I could see the ferry come in.
In conclusion, if you need distractions you should probably pick another island, but if you want understated beauty and a calm retreat, Šolta is definitely worth checking out.
It was crazy hot this morning, though my legs made me promise not to do anything too strenuous. I deliberately set out ill-equipped for any adventures involving mountains, rocks or undergrowth. So you can imagine how that went ;)
I picked up a hemp burger and interesting couscous cake thing from Makrovega, dropped off clothes at a laundrette, and made for the beaches on the north side of Marjan. I was spoilt for choice regarding beautiful and deserted spots of clear water. I noticed this starting to roll in...
Becoming rapidly closer, and emitting thunder, but still far enough away..
I had enough time to dry off in the sun, eat my burger and get dressed and duck into the woods before the first rain started to fall. Seeing and hearing it approach across the water was cool, and I sheletered under a pine tree until it passed. I carried on around the edge of Marjan, each little rocky cove more blue and clear than the last. The next wave of rain was heavier and lasted longer. I sheltered under the trees for the worst, and managed to make it to a restaurant before it got really bad. The restaurant had wifi, coffee and a sea/rain view, so I bedded in. The rain didn't look like it was going away any time soon. I did, however, have a pressing need to pick up a chocolate amaranth pudding from Makrovega before the socialwg call at 7 (not to mention my laundry), so I couldn't stay there all day. I heard an Irish couple asking the staff to help call a taxi, so I got in on that, and they wouldn't even take any money. They happened to be staying in a perfect proximity to the laundrette, Makrovega, and my hostel, so I successfully completed all tasks shortly after being dropped off and made it back in time. And the rain had stopped.
Later I wandered out to pick up food from Vege on the seafront, but despite Google's assurance they were open til 2300, they were not. I found some pretty great box noodles on the way home, with seitan, many veggies and peanuts. Split's answer to Edinburgh's Red Box, but cheaper and all round better.
I made the 0800 bus from Split to Zadar, which was later than I intended, but oh well. That was 94 kuna, and took about 3.25 hours. I dozed a bit, but the sea views were pretty good. I floated around Zadar complete with rucksacks. I saw/heard the sea organ, wandered around the marina, sat at a cafe for the bit watching boats, wandered through the university campus, wandered through Konzum for a snack, and wandered back to to the bus station. Most of the things to see in Zadar seem to be churches, which I'm sure are very impressive and maybe I would have bothered if I hadn't been rucksack-laden. I was disappointed not to stumble upon a beach I could sit at, it was all harbour. Or at least, where I got to was all harbour. I definitely like Split better from this experience, but Zadar has some epic (and closer) islands I hear, which I'd love to hop between.
The bus to Korenica is presently 15 minutes late and counting, and if I hadn't noticed loads of other buses being late I'd be a bit concerned I was waiting in the wrong place...
Amy added 'Achieving human and machine accessibility of cited data in scholarly publications [PeerJ]' to Bookmarks
Amy wrote about travel, croatia, korenica, & plitvice
This hostel has Settlers of Catan and free mountain tours and a nice kitchen and friendly staff and I can already tell one night and one day here isn't going to be enough. Also I love travelling alone, but I wish I had someone to share this with right now. (Also to play Settlers of Catan with. Yeah that might be it actually).
Tomorrow I'm going to literally walk for ten hours, so I should probably start sleeping soon.
Amy added 'Resounding success of the Open Science Commons in Lisbon - The EGI blog' to Bookmarks
Falls, lakes, and my feet hurt
Last night I arrived in Korenica (the bus showed up 35 minutes late; 84 kuna, somehow arrived on time 2 hours later, really spectacular mountain scenery), and successfully navigated to Falling Lakes hostel. I thought Tchaikovsky in Split was the best, but Falling Lakes is even nicer. Croatia could really teach the world a thing or two about how to do hostels. I was greeted by Irena, who helped me figure out buses and gave me a ton of advice about how to explore Plitvice. The hostel has a lovely kitchen, plus fresh herbs in the garden, so I immediately went to Konzum to get things I could cook. The hostel is so nice and I was dreading the rush of picking up my rucksack and catchign the bus to Zagreb after walking all day. Then suddenly I realised I could just book another night in Korenica and go to Zagreb in the morning. My host in Zagreb was happy with the change of plan, and suddenly that was a weight off.
I didn't get up quite as early as I'd planned, but still early enough that I didn't want to wait for the official (35 kuna) hostel ride to Plitvice. It's about a 15 minute drive, and the highway is not safe to walk on, with no footpaths, sometimes steep banks, many trucks and everyone going really fast. But I hadn't even made it out of Korenica before I was picked up by a middle aged couple from Zagreb who were very interested in all of my travel. They dropped me at Gate 1 at 0900, which threw off my well thought out agenda that began at Gate 2.
Entrance to the park is 80 kuna with a student card, and the ticket includes one boat ride and one mini-bus-thing ride. Maps are 20 kuna, but fortunately Irena gave me one at the hostel. I did some dynamic replanning, figured there was no way I wasn't going to have to cover a stretch twice if I wanted to leave from Gate 2, and headed for the boat. This was supposed to be the last thing, and I considered walking the length of the lake and getting the boat for the repeat of that later, but then it arrived, so I hopped on. I'm really glad I did, because when I went past again later there were three boats worth of people waiting. That took me to near Gate 2, and the start of the main bit of world-famous multi-tiered waterfalls. I followed the path.
I could have done with learning a few Japanese phrases, like "if you must walk this slowly at least stop zigzagging", "this walkway is too narrow for you to stop and look at every little thing" and "put that selfie stick away you're going to have someone's eye out". There were a lot of elderly Japanese tourists who walked very slowly and had no regard for the high risk of sending people flying into the waterfalls when they stopped suddenly and started brandishing cameras. Sigh.
The waterfalls were impressive and everything, but I had a bit of human overload. Not just the tourists (I know they were all there for the same reason I was), but the work that had gone into making the surroundings traverseable. The walkways were all wooden, and very tasteful; often stretching across whole lakes, low to the water, or steps directly above a waterfall so you were always really close.
I couldn't help wondering what this place would be like without the intervention. How many of the waterfalls and streams were actually there as a result of some footpath sculpting? I enjoyed more when the walkways were flooded and the water was trying to take back its space.
Following Irena's advice, I took a less-trodden trail, from point 1 to point 3 (purple on the map) which led deeper into the woods of the park, away from the main area. I'd have loved to go via point 2, which goes way into the park through small settlements that are still occupied, but I didn't think I had time for the full 24km. I was soon deep in peaceful woods, and saw only two other hikers the whole time. That's more like it. I started to recharge. The trail was well-marked with little read dots on trees, so I could drift. After the intial excitement of interesting mushrooms and rocks, and dappled sunlight, the woods were pretty samey. I love the woods, and it gave me lots of thinking time. I was hankering to work on indieweb and socialwg stuff.
The route took me back to the park, and in a lot less time than I expected. I was back at the Big Waterfall, not far from where I started, at 1430. This time I walked around the eastmost side of the lake, close to the water, to Gate 2. That didn't take long either, and I didn't feel I could just go back so early. I sat for a bit, and then wandered south. I decided to see how far I could get in the direction of Korenica without going back to the highway. Technically the park goes all the way, but I had no terrain information. I ploughed on over a definitely-off-track hill. The ground was leaves and squish and the trees were close and I had to fight through them. The ground though! That's what the world is made of. Decaying things, packed together. It was nice. I made it to the top of one hill and there was another, and another, and another. I'd gone too far to turn back, and my GPS was telling me I was slowly progressing in the right direction. The hills were steep; like I said, off-track, and I basically just had to charge directly upwards, clinging to bushes.
It doesn't seem to matter where I go, I will always ultimately end up scrabbling up hills through undergrowth.
It was such a relief when the track/settlement I could see on google maps appeared over the hill. I made for the highway, cos there was no way trying to go through the park all the way back was a good idea. The verge was such that I could stay off the road, so I followed the highway for about 20 minutes before I was picked up by a local. He didn't speak English but I think we managed to communicate a bit. I was passed by loads of cars that didn't stop this time; I presume they were tourists. Bah.
He dropped me in the centre of Korenica, and I stumbled back to the hostel and collapsed for a bit, by 4pm.
I walked around 18 miles today. My legs, aside from being extremely reluctant to support me, have developed all kinds of interesting enormous red lumps with varying degrees of itchiness. I assumed they were insect bites (they have been developing for several days now) but some of them are going a bit weird. I should probably at least document it...
Also I should sleep... 0625 bus to Zagreb in the morning!
I just jumped on the train from Zagreb to Ljubljana for the final leg of my trip. My stay in Zagreb was short but magical. I will be back. To make a positive generalisation, Croatians seem to be the most hospitable people ever. Perhaps too hospitable; over the past 24 hours I've been scolded many times for saying 'thank you' too much and offering to help move/carry/cook/clean things, I've overeaten, and eaten enough dairy that I feel a bit queasy because I was already being looked after far too well, and the delight with which fritula, biscuits, pancakes and cappucinos were sent my way was impossible to say no to. I did manage to turn down ice cream a couple of times, and communicate 'vegetarian' before it was too late.
So remember L who I met in Split? He put me in touch with D, with whom he'd stayed in Zagreb. D was quick to offer me a bed too. She met me at the station on Friday morning, and I joined her, her neighbour S (who reminds me a lot of my grandma) and her daughter M in wandering around a flower exhibition for a couple of hours. D bought fritula with chocolate sauce and insisted I try this local speciality (they're like doughnut holes, but chewier). The flower exhibition was in Bundek park, and was a lovely, relaxing start to the day. We stopped in a cafe for a coffee, and S insisted on paying for mine. D shared wifi from her phone and I caught up on the internets.
Then they bought some plants; I was really tempted by a teeny tiny cactus, but it would never have made it home.
D dropped me in the city centre and headed home (with my rucksack so I didn't have to carry it). I wandered through the old town and upper town. Zagreb is pretty hilly. There were anti-government protests and lots of police near the government buildings. There also seemed to be some kind of police-escorted muscle car demo in the centre. I saw all of the main buildings listed on wikitravel, and thought about visiting the Museum of Broken Relationships but the weather was so good I didn't fancy spending the afternoon inside.
Despite this, when I found Nishta, a vegetarian restaurant with power, wifi and incredible food, I bedded in and ended up being there for a productive and delicious three hours. I 'splashed out' and spent 112 kuna on amazingly floral iced tea, BBQ barley and tofu burger, almond cream panna cotta, and coffee. So. Good. So I stayed much longer than intended, and needed to hurry back to D's place, which is in the north of the city at the base of the mountain. I took what I thought was a short diversion via Mirogoj cemetery on the way, but this ended up adding over an hour to my route. What looked close on the map was actually separated by several hills and impenetrable forest. As usual.
The cemetery was pretty spectacular, and I could spend more time there.
The walk from there to D's was mostly uphill, but so scenic. There were some rad, modern houses and tons of foresty space. The city was well and truly out of sight; views from all balconies and gardens were green. I could definitely live there.
I eventually navigated to D's, where I met her six excitable jack russells, and S's son, M. I had a room in D's attic, with a gorgeous view and my own bathroom. She made dinner, and even offered to wash my clothes. I ate rice and salad (with pumpkin oil), pancakes and homemade jam, outside on the terrace while the sun set over the mountain and M quizzed me about who controls the internet, why being vegetarian is reasonable when plants have feelings too, and why Tigo wouldn't be better off if I set him free.
This morning D was out for a bit, and I was under instruction to visit S across the road for coffee when I got up. Not only coffee, it turns out, but chocolate wafers and bread and apricot jam (I managed to stop her from cooking eggs for me) but I wasn't at any point allowed to stop eating the bread and jam >.< Again, I wasn't allowed to help, either. We sat in the garden, in the blistering sun until D got back.
D drove me to the train station, but not before S had wrapped up an armful of chocolate wafers for me, and D made me jam pancakes for the road.
Wow I'm full.
Need to go back to Zagreb.
I just reached Dobova, and Croatian and Slovenian police came through to check passports. I think the train is sitting here for about half an hour. The train is super nice! Power sockets, and every six seats are in their own little compartments with doors.
This afternoon was probably the most ad-hoc bit of travel in this whole barely-organised trip so far. I couldn't find any information online about buses from Koper to Portoroz, other than that such things exist, so I figured I'd show up in Koper and figure it out from there. What could go wrong?
Step one was easy: bus station was right outside the train station. Bus stands were all labelled with destinations, and no fewer than three had Portoroz listed.
Step two was easy: there were buses in the stands, with Portoroz even in their window signs.
Step three was more difficult: there were no timetables, and no bus drivers.
So I started to deviate from the obvious plan.
Step four: talked to accumulating small group of fellow rucksack-bearing young people. Discover nobody knows the timetable and everyone is waiting around hoping for the best. Discuss how long we should wait.
Step five: more adventurous Americans go to speak to nearby taxi drivers.
Step six: we realise splitting the cost of a taxi is the same as the bus, and all seven of us pile into a taxi-van. Most are bound for Piran, two of us to Portoroz and one person (the only other ESWC-goer) for somewhere in between.
Step seven: success! Arrived in Portoroz for a mere 3.5 Euros, less than half an hour later. Mohammed, the other Portoroz passenger, turned out to be staying in the same hostel as me, so we climbed the hill together.
The hill was knackering, and it was hot, so I was keen to crash but ended up taking an hour to check-in because Andrej the hostel owner was fun to chat to.
I'd booked a bed in a 10-bed dorm, as usual, but apparently I'm the only girl staying in the hostel. So I have a family room to myself, with my own bathroom! Score. Seems like yet another great hostel. Feeling bouncy, so I'm going to meet other ESWC-ers for dinner (thanks, twitter!).
Amy wrote about linked data, event, academia, & eswc2015
I'm really hoping ESWC2015 reignites my excitement about linked data, which has been kinda damp for a while. SemDev2015 seems like a great place to be for that already.
Hoooooly shit that was close. Got to the gate with seconds to spare thanks to the bus being an hour slow, a mental taxi driver who only spoke German but took me catching this flight personally (+40eur) and Ljubljana airport being teeny tiny.
I'm flying back to the UK having been away for five weeks. I attended a meeting, a hackathon and two conferences, and in between climbed some mountains, hiked through some forests, swam in lakes and sea, spent an awful lot of time on trains and buses, visited some new countries and cities and met a ton of awesome people.
Most people are incredulous when I say I'm actually working and not on a break from my PhD, and tell me how they'd never get away with this at their university or organisation. But it turns out, I've been way more productive over the last five weeks than I would have been if I had been in my office.
I'm excused from obligations like meetings and seminars, I don't have to run errands or do chores, and as much as I love coffee breaks with my officemates six of them a day at half an hour each can be a bit of a time sink.
There have been other distractions instead of course. Mountains that won't climb themselves. Chasing buses that never come. Hunting for a last minute bed to sleep in. These kinds of distractions keep me awake though, paying attention, instead of turning my brain to mush or making me feel resentful of everything around me. I'm primed for ideas and inspiration at all times. Turns out I work much better on the beach and in trains than I do in the same room every day.
I've felt more awake and more able. My confidence is boosted every time I resolve some travel-related inconvenience or handle a difficult situation. I've been able to be spontaneous and felt empowered because of it. I'm stronger for living day by day out of a rucksack and not always knowing where I'm going. I've been able to focus on the moment and follow my instincts.
It helps that I've been healthier, physically and mentally. I've been able to totally relax. The eczema on my hands cleared up completely and my nose has been more often functional than ever before. I've spent a lot of time outside, and been active. I've walked hundreds of miles, worn myself out completely and slept solidly. The flip side of this is I've pushed my feet and legs further than they're used to and they're starting to complain quite a lot. I've gained all kinds of new and weird injuries and rashes from insects, plants, rocks, sea creatures, my shoes, and miscellaneous things I've walked into.
People. I've had days of intense socialising, and days of total solitude. I need the solitude. Between WWW in Florence and ESWC in Portoroz, I spent a week mostly alone. I realised how much good this had done me when I arrived in Portoroz, immediately sought people to have dinner with and was chirpy and social all evening. Throughout ESWC I've been keen to talk to people and didn't start feeling the need to hide until the very last afternoon. I've managed to see lots of friends I see rarely or only talk to online, which makes everything worth it by itself. I've had wonderful experiences with great people - travellers, hosts, friendly locals or conference-goers - who I'll probably never see again or keep in touch with. And I've made solid new friends I'm planning to keep hold of for the long term.
I've had new experiences, and unexpected incredible opportunities have come my way. It's clearer what's important. I've been more myself. I hope I can keep this up when I'm back. But if not, I'm going to coin PhD-by-interrail.
Incidentally, I've also spent less money than I would have at home (if I'd stopped paying my Edinburgh rent for this month; 60% couchsurfing, 40% hostel dorms is quite a bit cheaper).
Amy wrote about travel, phd, life, productivity, & office
So I went to Heriot Watt for the SWeL meeting today. I worked on the bus on the way there, and on the way back (apparently I've completely overcome the severe travel sickness I've had my whole life over the past few weeks). But back in my office for the afternoon, I've been at my desk, but hardly done anything. So now I'm going to the pub, and I expect to pick up where I left off, and finish what I was working on there.
I guess tomorrow I might try the Forum roof. If that fails, maybe I'll try the Meadows, or the middle of Holyrood Park.
I was starting to panic about the amount of UK travel/events I have coming up over the next couple of months, but looking at this it might actually improve my productivity.
This is a summary of a few bits and pieces that stood out to me from ESWC2015. I haven't covered every session I attended or paper I saw, just the ones that remained with me (other people will do full summaries of all the paper sessions I'm sure, or you can refer to the programme or Fabien Gandon's closing slides which have an excellent summary). For a more 'live' overview of my view on the conference you can see everything I posted during it.
Overall, I had a great experience, met some fantastic people and absorbed lots of interesting ideas. I feel more positive about work in linked data; I'd been slacking off following the community for a while, but I've been reassured that there are plenty of practical-minded researchers out there who are doing great things, and I'll be paying more attention again henceforth. Daily swims in the sea probably didn't hurt.
SemDev2015
The developers workshop was great, full of people positive about building tools and applications, and finding ways to make the power of linked data accessible to actual end users. The focus was on building for web developers rather than on end-user applications, with projects being great libraries and tooling for working with linked data, as a way to bridge the gap. There was an air of frankness, with attendees keen to address problems openly, without handwaving or glossing over things that weren't working out. There was even live debugging during presentations.
I missed the final discussion session, but this was recorded and I hear it was good.
Philoweb
For a philosophy of the web workshop, the talks and discussions during this workshop were around pretty pragmatic issues. In particular how we can obtain true decentralisation, problems with centralised DNS and internet infrastructure, the lack of attention paid in this community to security issues, and the importance of understanding social processes and current practice for ensuring the web continues to function and that we don't "break it by accident" (Henry Thompson). These aren't things that tend to get much of a forum at conferences like ESWC, but semantic web academics being at the forefront of a truly linked information space should definitely be encouraged to think about the effects of our work on society, particularly underprivileged and minorities.
USEWOD
This workshop - usage analysis and the web of data - had a general focus on understanding and getting the most out of the web as we know it today, in order to shape the web we want in the future. As well as traditional paper submissions, they were also accepting submissions via blog posts, and will continue to accept articles on an ongoing basis, which is a great way to keep the discussion alive. I was gutted to miss Max van Kleek's keynote "Not in my Castle" because I got the timing wrong, but I hear it was awesome.
In Use & Industry
Harry Halpin and Francesca Bria worked on an interesting project to map social innovation projects (like hacklabs, open data initiatives, community enterprises) across Europe. It wouldn't have been strictly necessary to use linked data for this, and doing so might have actually caused the site to be pretty slow. However, it allowed them to do a bunch of interesting network analysis on the hundreds of different projects and organisations mapped and gain some insights into how to strengthen such initiatives (for example, by increasing collaboration opportunities). Also, I suspect technologies for building sites on the back of linked data have probably improved quite a bit since this work was started, so the speed issue might easy to overcome. I paid attention cos I'm generally interested in putting stuff on maps but I'd really like to see more decentralised mapping things; projects/organisations publishing their information independently as linked data, such that they're in control over what's available, rather than having to submit their info to a centralised service.
Crowdsourcing and web science
Seyi Feyisetan from Southampton discussed different factors that affected the performance of crowd workers, by looking at features of the tasks themselves rather than the platform or rewards, when asking workers to classify entities in tweets. It was suggested that their results could be used to work out if NER on your microposts dataset would be better performed by machine, human experts or crowdworkers, depending on the contents of the dataset.
Revanthy Krishnamurthy presented about using general background knowledge and the contents of tweets to detect the location of twitter users, as most twitter users don't have geolocation enabled when posting. They did smart stuff like correlating mentions of events, landmarks and slang terms with physical places, but I don't remember them saying much about respecting the privacy of people who actively don't use geolocation..
Demos
The demos and poster session I thought was particularly lively. I liked that it didn't overlap with any other sessions, and breakfast cakes and fruit were distributed through the demos area. It was pretty cramped though, and possibly would have been better off earlier in the week too (it was in the morning of the last day).
I appreciate the principles and technologies behind Sarven Capadisli'sLinked Research project, to the point that I implemented it for one of my own papers immediately. Encouraging web scientists to publish their research using the native web stack, using RDF to make research queryable and discoverable on a more granular level - in other words, to practice what we preach - is a worthy goal. And it was really easy to set up. Everyone should do it.
Entity annotation isn't something I know much about, but I think I understood a bit more after talking to Ricardo Usbeck about GERBIL, a tool for evaluating entity annotators. This easy to use online tool lets you compare some of the different annotators available against different types of datasets, to see which would perform the best for your particular use case, without you needing to access any of the test datasets yourself (as you often have to pay for licenses). You just plug your annotator in and leave it running, and it returns results. This also allowed them to check reported results of popular annotators and compare them according to different standards, for a more well rounded view of their capabilities. I dunno if the preceding paragraph made much sense, but that's what I got.
Other
Had some great discussions about microformats, RDFa, schema.org, federated/decentralised social web stuff and whatnot. I was also approached by a bunch of people who knew who I was from reading my WWW2015 post o.O Which was weird, but most people seemed to like it..
Finally, this was one of the better catered conferences I've been to, so props for that :)
I tend to react to day-to-day things on a scale from nbd to idgaf. Other people seem way too melodramatic to me, but sometimes I wonder if I should care more about stuff.
For years I relied on PDFs and LinkedIn to share my professional experiences. But I am of the Web. I can no longer live this lie.
I have backdated a series of blog posts containing the kind of information one might expect to find on a CV. They are all tagged with cv and resume (look, i18n) so you can use this to view them together in chronological order of start date. They also have other related tags, which you can use to explore each particular entry in more detail if I blogged about it at the time (which is hit and miss). It's not organised quite like a traditional CV, with things clustered into categories like 'education' or 'work experience' - as such, it's not very good for skimming - but I'm sure you'll cope.
As each entry is a normal post, people can reply to them (via webmention). I might solicit some references for certain positions and add them as replies. Feel free to also reply to this post with general recommendations. Take that, LinkedIn!
Amy added http://www.smallbusiness.co.uk/news/outlook/2485411/quality-of-data-suffers-as-consumers-are-reluctant-to-disclose-personal-information.thtml to https://rhiaro.co.uk/bookmarks/
Amy wrote about phd, academia, research, social networks, & studies
Omg I have a lot of tabs open. When do I decide I can ignore all SN profiles studies conducted before 2012? Could also filter out 'myspace', 'digital natives' and 'college students'.
Digital personhood is simultaneously becoming more fragmented and more centralised. People are giving more of themselves (consciously and unconsciously) to services which help manage communications and activities, and at the same time spreading themselves across multiple services in order to manage different aspects of themselves. (There's something to say about Goffman here). We perform roles in different social situations, to different audiences, in order to manage people's impressions of us and our place in the world. Interaction on social networks can involve a great deal of performance; there is potential for a high level of control over the version of oneself presented according to what data one makes available to the system, and what activities are explicitly published. However this control is diminished by increasing complexity and opactiy of systems, and users' limited understanding of how their data is propagated and presented to others. The more data given to third parties, the less control individuals have over their own presentation of self, even if (especially when?) the systems in question present the opposite impression (through privacy controls etc).
Since people can't exist on the web directly (yet), a profile is a document which exists on the web on a person's behalf. But what goes into that document, and how it is addressed, created and distributed, varies between social network providers.
Regardless of what the social network provider intends, how individuals choose to use the profile-related tools they are provided with also varies. Some systems impose rules, policies or technical barriers against certain things. People find ways to do 'certain things' anyway. The ways in which people subvert affordances of social systems - and why they do it - might give us some insight into how to improve social systems to better meet people's needs.
Aside: Profiles also exist for products, places, organisations, etc... I'm not ignoring this, but not focussing on it for this post.
A taxonomy of profiles
To get started, we should observe existing profiles and compare them; try to find commonalities and differences, and eventually start to classify them. Even within networks, people use profiles differently of course, so I'll start by looking at the affordances of some systems with regards to profiles rather than individual instances of profiles for now.
Existing taxonomies
I didn't find much, but I might have not looked hard enough. A few 'taxonomies' of social networks are on marketing blogs, and are aimed at helping companies leverage their social media presence; high level descriptions of networks focussed around the content people post, mostly, and not hugely useful here.
The Classification Framework for Social Machines (Shadbolt et al, 2013) considers a broader scope than social networks and classifies systems fairly generally, but includes some useful constructs like roles of participants within a system, level of user autonomy and anonymity and motivations of participants to use a system.
I was pleasantly surprised to find Taxonomy for Social Network Data Types from the Viewpoint of Privacy and User Control (Richthammer et al, 2013) is fairly recent and focussed specifically on social networks. They used a methodology called 'design oriented research' which I haven't looked into yet, but appears to include a magic step between comparing existing taxonomies and deriving their own terms. They classify existing social networks after the fact, to evaluate their taxonomy. That aside, great critique of a few existing frameworks that are not sufficient along various dimensions, and they fill in the gaps pretty well (in my humble opinion). This seems like something I can build on by going deeper into the profiles part of things. In particular:
Semantically specified and semantically unspecified data: the latter (like freeform bio text or posting a photo with no tags) impedes service providers from processing it automatically.
Mandatory and extended profile data, and to what extent mandatory data can be hidden from public view. Only Facebook and Google+ offer "selective disclosure of attribute values"; on Twitter and LinkedIn something is either public or private only to yourself.
Disclosed and disseminated data: data explicitly created by a user vs data created about them or in their space by someone else, including how much control a user has over visibility of data created in their space by someone else (like someone else posting on your Facebook wall).
First pass
I made a list of things I want to find out about how profiles work in different systems that I should be able to figure out from looking:
What is displayed on a profile? (Attributes, activities, other people's content, ...?)
How are profiles updated?
via the UI?
via the API
How are people notified of profile updates?
via the UI?
via the API
What granluarity of access control exists for parts of a profile?
How are different people's profiles connected together (within and between systems)?
How portable is a profile? (Can it be exported? Can it be imported to a different system?)
What restrictions are placed on the creation of profiles?
And other things that might require a bit more digging or analysis:
How does a site appear to model a person and their relationship to profile documents and other activities or content objects in the system?
What is a profile for? (To what end was it created? What results from its existence?)
Who is a profile for? (You, others, a service, ...?)
And a list of services/ways-of-representing-people-online, of varying degrees of specialisation, that I know reasonably well which would be good to compare:
FOAF
Indieweb/Microformats
Twitter
Tumblr
Pump.io
YouTube
CouchSurfing
Facebook
Quora
OkCupid
StackOverflow
LinkedIn
PeoplePerHour
Academia.edu
AirBnB
Friendica
So I'll work my way through a few, refine the questions based on what I observe, and repeat. I'll see if this results in some kind of clustering or patterns that might bring us closer to an answer to 'what is a profile?'.
Analysis
Ongoing. TODO: screenshots.
What does a profile contain?
FOAF: Attributes (fixed in FOAF but extensible with other vocabs), connections, links to authored content (maybe).
Indieweb: Attributes (fixed as per microformats2 but extensible), authored content.
Twitter: Attributes (fixed set), connections (subset), authored content, activities within the network (heavily curated).
How are profiles updated?
FOAF: not spec'd (likely hand editing or through a client).
Indieweb: not spec'd (likely editing static HTML).
Twitter: Web form / client UI.
How are people notified of profile updates?
FOAF: not spec'd
Indieweb: not spec'd
Twitter: None.
Access control?
FOAF: not spec'd (WebID+TLS/WebAccessControl for protecting whole documents not individual attributes).
Indieweb: not spec'd
Twitter: All or nothing for content. A blocked user can still see some attributes (avatar, banner, name). Protected accounts show all profile data but not content or followers/ing
Connections?
FOAF: knows - one way relationship, deliberately vague.
Indieweb: Under debate, some people use XFN (eg. rel=following)
Twitter: One directional; notifications sometimes sent to your followers when you follow someone, especially if others in your network also do; follows (some? all? curated how?) appear in your timeline; no notifications of unfollows; configurable notification when someone follows you.
Portability?
FOAF: Server agnostic, move data as you please, but you need to control your domain.
Indieweb: Server agnostic, move data as you please, but you need to control your domain.
Twitter: You can download an archive of content and snapshot of profile attributes (and date of snapshot) but no changes history.
Restrictions?
FOAF: n/a
Indieweb: n/a
Twitter: ~"may not create multiple accounts with overlapping use cases"
Model?
TODO: add diagrams
FOAF: [ PersonalProfileDocument] -- maker --> [ Person ] -- {attributes} --> "value". Usually inferred that a foaf file is a PersonalProfileDocument where the subject is the maker. Definite distinction between the person and the document about them.
Indieweb: Use site URLs to refer to people. Attributes attached to h-card, embedded in homepage alongside other content.
Twitter: account ~= profile ~= person
What is a profile for?
FOAF:
Indieweb:
Twitter:
Who is a profile for?
FOAF:
Indieweb:
Twitter:
The many dimensions of lying online
People lie in online profiles for all kinds of reasons:
to manage what people think of them.
to protect themselves.
to experiment.
to mitigate against mass surveillence.
because they don't understand why a system needs so much information about them in the first place.
People also break the rules: multiple accounts, fake names, etc.
And people 'misuse' mandatory content fields to force a system into meeting their needs (eg. using YouTube video description boxes for profile links and attribution).
These are all techniques for managing nuanced online self-representation. But people are fighting the systems to do this, not working with them. We can learn from this.
Owning my profile data
Of work I've seen to do with Personal Data Stores so far [citation needed] there's little taking into account of faceted identity or different audiences for versions of oneself. There's an assumption of a single, consistent version of a person and a set of facts to describe them. PDSs in 'serious' domains like healthcare tend to also require a link to a 'real world' person. This doesn't resemble how people currently manage their data on the social web, and nor is it strictly necessary for services to function.
I'm gradually migrating my social web activities from the different services they're spread out over onto my own site. This is straightforward for generic things like twitter where I don't use a pseudonym or have any particularly tailored profile information or try in any way to curate my audience. It gets harder as I branch out into more specialised sites. How do I organise my content so people only see what they're interested in? (Presumably only my three friends on RunKeeper care about my runs so I don't need to subject everyone to them. Pretty sure nobody cares about recommendations on LinkedIn, but people insist on sending them so how best to pull them through to my site?). How do I organise my content so only the people I want to see certain things get to see it (I don't want to mix OkCupid and CouchSurfing)? Do I need new domains for my semi-anonymous (Quora) or anonymous (secret Tumblr anyone?) activities? What do I do with shared accounts (organisational Twitters, shared joke Tumblrs) especially where the content posted might be explicitly attributed to me. Some of the content in these profiles overlaps, as do some of the audiences. But there isn't a one-to-one mapping between most of them. My profiles are defined not only by the data about me they contain, but by others in the network, the social norms of the platform and related content. I haven't figured any of this out yet, and one of my big questions is how I can be sufficiently methodological about this to make the process useful for helping to answer 'what is a profile?'. I suspect I'm going to do a lot of accidental oversharing in the process.
There is contention between controlling all of my data myself, and adequately managing my identity across social contexts. I want to own my data, so I need tools to resolve this.
Understanding current practices of self-representation online for improved privacy and greater online freedom
I hear "people don't want to manage their online personas themselves" a lot, but people are already doing it despite the inadequate tooling. If we can understand the nature of online profiles, and examine how people are getting by at present, we can make things easier for them (and ourselves, since we're all participating in this). Then we can spend less time fiddling with Facebook privacy settings and wondering if we accidentally shared that inappropriate picture with our boss - or endlessly reporting Twitter abuse - and more time linking ideas, expressing ourselves and using the web to its full potential.
Where the good enough boundary lies for managing? When is it dangerous, when serendipitous. What 'matters'? No perfect model of social management/access control.
Easier to look at different systems doing the same thing in different ways (things of a similar species)
Profiles shaped strongly by the needs of the service providers Problems of their own survival are also played out in this space Difficulties people may have managing profiles are sometimes down to easily fixable poor design things Interests of people fight with interests of service
Github
Definition of ownership
ACNE and other diseases communities on twitter - people create second accounts to participate
"epidemic communication patterns" - Robin Williams
Amy added https://medium.com/@zip/my-name-is-only-real-enough-to-work-at-facebook-not-to-use-on-the-site-c37daf3f4b03 to https://rhiaro.co.uk/bookmarks/
Amy wrote about websci15, web science, web we want, & digital rights
"If Mark Zuckerberg had done GCSE Web Science, how would the web be different now?" How can Web We Want influence new creators/entrepreneurs/innovators on top of educating the users.
ACM Web Science 2015 (Oxford, UK) was the complete opposite of WWW2015. Almost to a point of saturation... but I shouldn't complain :)
With a heavy weighting of social science (or social science influenced) papers, despite still having a majority of computer scientists in the audience, most sessions and panels were about ethics, privacy, digital rights, inclusivity and a 'pro-human' Web. The focus was overwhelmingly social media, with a side of Internet of Things, plus a weird smattering of robot ethics. Usually a focus on social media means lots of SNA, detecting content trends, and user profiling and other things I hate, but instead substantial discussion of people as people, rather than users (or targets), was refreshing. There was also plenty of work on sites other than Twitter and Facebook! Such as individual blogs, social gaming sites, specialist and smaller communities. Though I'm not sure if we figured out any solutions to the personal data crisis.
That's not to say it was all social! There were technical talks too, including a few papers on linked data.
Max presented our paper The Many Dimensions of Lying Online during the first Online Social Behaviours session, and along with the other three papers presented formed a great narrative about the complex and nuanced nature of online identities, and how they both affect and are affected by technical systems.
I'm not going to write up content here. Instead, see all my posts from during the conference at /tag/websci15.
Other things. The structure of the conference felt unusual (in a good way); parallel paper sessions were dispersed amongst panels and workshops. All sessions were very interdisciplinary. The catering was really good. There were fewer people than I expected.
Amy wrote about volunteer, teaching, gender, kids, sutton trust summer school, & lego
This group is 50-50 gender split. At the start, girls all claimed no/little programming experience, guys each listed a few languages. Interesting to see who is progressing fastest with the tasks.. :)
First ever non-stop lap of Holyrood Park this evening, hills and all. Just over 7km in total as I went office to home, so not quite the whole way. But I've never managed that before, I usually have to walk the hilliest parts. Running the whole way was something I was expecting to work up to over several months or a year. And I haven't even had a regular running schedule recently. And I didn't even really feel it; the last stretch was like flying. So, achievement unlocked.
Amy added 'Data visualisation | Style.ONS' to Bookmarks
Webmention receipt and display
This weekend at IndieWebCamp in Brighton, my main goal is to display received webmentions on my posts. Currently I collect them at webmention.io and will occasionally manually add them to my store when there's a reply I'd particularly like displayed. This is just displayed as a link at the bottom of the post.
Initially I thought about just running a cron job to pull from webmention.io into my store. Since webmention.io does all the validating etc, this takes away a lot of work. Maybe I'll do that first, and sort out the display of full comments (not just URLs), and then look at dealing with the whole process myself. Here's the expected flow:
// If target not exists
// Fail
// else If source not exists (404 or 410)
// If have had webmention from this source before OR have mentioned this post myself
// Delete
// -> Remove $source from local store
// else
// Fail
// else If source not contains link to target
// Fail
//
// else If have had webmention from this source before
// This is an update: what has changed?
// Content - edit "$source-author edited their {inferred post type} of/to $target"
// -> Store updated $source for display
// {property} - edit or addition of property "$source-author edited/added {property} of their {inferred post type} of/to $target"
// -> If this is a property I store/display, store update
// Replies/comments - new reply (receiving salmention) "$reply-author {inferred post type}d $source-author's post that mentions $target"
// -> Store for future threading display purposes..
//
// else Infer mention type
// Content - mention "$source-author mentioned $target in a post."
// like-of - like "$source-author liked $target"
// repost-of - repost "$source-author reposted $target"
// bookmark-of - bookmark "$source-author bookmarked $target"
// category - tag "$source-author tagged $target in a post" / "$source-author tagged a post with $target"
// in-reply-to - reply "$source-author replied to $target"
// {other property} - {other} "$source-author {other}-ed $target"
// -> Store necessary $source contents for display
// -> Resend webmentions to all links in $target (send salmention)
Once automatic display is working, one way or another, I'll also:
add a form to let people send webmentions to my posts from my site.
display all mentions aggregated at /mentions (including homepage mentions aka person mentions).
some sort of push notifications hack, possibly an email, SMS or a poke from an IRC bot.
Other things I might get around to this weekend:
Displaying reposts properly.
Fixing my micropub endpoint; it's currently rejecting Teacup posts for unknown reasons.
Automatically sending bridgy webmentions for likes and reposts of tweets.
Amy wrote about life, w3c, academia, standards, & arguements
If someone had told me a year ago all this w3c stuff would involve so much arguing I might not have bothered. On a similar note, if someone had told me academia would have involved so much public speaking, I might have given that a miss too. Probably best I just keep obliviously forging ahead.
@synvila If you haven't seen indiewebify.me, that's a much less daunting starting point. And IndieMark might be helpful for breaking stuff down. More links to things to read, I know... Hopefully worth it though :) You never have to do 'everything', just pick and choose what meets your needs.
For about fourteen years I kept detailed daily journals. I couldn't sleep unless I'd written. And I couldn't just write "Went to school, Polly and Laura fell out again." I had to write every detail. Food, friends, lessons, homework, learning to make websites, gerbils, cats (those are all the things associated with being a normal teenager, right?), and all the thoughts and feelings associated with everything I'd encountered that day. It was habit, and compulsion. It was also a burden. When I went away, I had to plan to carry a notebook with me, and keep it somewhere other people wouldn't get hold of it. I had to make time before bed to write, usually for a full hour. If I had to skip a night, I had to double time the next night, and felt the pressure of holding onto the memories I hadn't manage to record for an extra day.
This continued during my undergrad. But was harder. Entries got shorter, even though more was happening. I'd pull spontaneous movie, coursework or just hanging-out all-nighters with friends who lived across town. Even if I happened to have the journal on me for some reason, ducking into another room for an hour to write would have been.. pretty weird. Sometimes I'd miss a few days, then spend a full afternoon, day or even weekend catching up. And while I was doing that... I was missing out on other things.
I have a heavy box containing dozens of notebooks. This is also a pain when I move house (as noted by people who have moved it for me). After living things, it's what I'd save in the event of a fire. It's really heavy though.
After moving to Edinburgh, I found less and less time to write. I'd do catch up spurts, but they became less frequent. It became exhausting. Eventually they seemed fruitless because I couldn't remember nearly as much detail as I wanted to. At first this was terrifying. I've read back journals from years ago, and don't remember thinking or feeling a lot of what I wrote about. If I hadn't written it down at the time... it'd be gone. So by not writing in the present, I'm depriving my future self of a lot. But eventually not-writing normalised, and the burden started to lift. When it was no longer a compulsion, it was no longer painful when I missed it.
My social media use was happening in fits and starts around then too. Posting to facebook probably helped to ease into worrying about journaling less, as I was recording my day-to-day elsewhere. But when I realised banal status updates had become a compulsion too, coupled with some people taking facebook activity far too seriously, I deleted everything from there (post by agonising post). I didn't think to export it beforehand. I was using twitter, but not for personal stuff.
We pour a lot of ourselves into digital archives, one way or another. But how do we get it out again? Why do we need to? Most of us post to silos like facebook and twitter, providing fuel for the corporate advertising machine and seeing only fleeting value for ourselves. My skepticism of this restricted how I used social media. Then I got into this decentralised social web malarkey, and my journaling addiction started to re-stir. Now I'm posting a lot again. Some of it makes it to twitter, but I post more solely on here, rhiaro.co.uk. It's not the journal, daily records material of old, but shorter, realtime, in the moment posts that in aggregate provide a record of the day (particularly as I pull in more quantified-self activity tracking type stuff).
And the burden is back.
I noticed it when I started posting less again this past month. I was tracking every single thing I ate for long enough that it became habit; tracking when I left or arrived at home, office, meetings, events, social occasions, and more. I stopped tracking both food and locations because some bugs have materialised in my code and I haven't got around to fixing them yet. It was agonising to start with. But as I still haven't made time to find out what the problems are, I realise I don't miss the stress of trying to log food or check-in on a poor mobile connection or worse, scribbling notes on paper to back-fill later when I can't do it in the moment. Once I started logging something, it didn't seem worth doing unless it was complete, unless I logged everything. Things missing made me anxious. Wtf?
Not everyone has this problem. Some people (so I've heard) post to social media because it satisfies an immediate need, and what happens to it after that doesn't matter. Many people aren't interested in the Own Your Data mantra, because this 'data' is ephemeral, not archival. Some people are totally happy to drop their thoughts and feelings into the black hole of the social media machine, never expecting to get them back. How freeing that must be.
I've never been blackout drunk and I have never understood the appeal; I'm kind of terrified of the idea that in a few years time and I want to look back over my years in Edinburgh there are going to be enormous gaps. Does that mean the memories I have retained are the only ones that were worth keeping? Or am I poorer because the things I neglected to record are gone forever?
Collectively, the Web-privileged world is recording an insane amount of unstructured personal data; so many fleeting thoughts and feelings and desires and needs. Where did this come from? Didn't we used to manage fine without? If it's a sign of progress, maybe we should be using it to progress. Whether it's stored under the originator's control or surrendered to a corporation, all together we have a detailed picture of what it is to be (certain types of) human. But nobody is using this for anything other than personalisation, recommendation, profiling... selling more crap to people. Except for the academics doing cool disaster-relief stuff with realtime twitter data: props for that.
Imagine if we could tap into the historical archive and use it to understand different perspectives, to boost empathy and tolerance. To create a concrete, collective ancestral memory that helps us build a better future for everyone.
If we're not going to do that, we should probably focus on living in the moment a bit more. I feel like that is healthier, but it goes against my impulse to (at least try to) record and permanently store everything.
Given all this, you'd think I'd have a better strategy for automatically backing up my database.
Note: These requirements are deliberately limited by the contents of the user stories. If things seem obviously missing, this is because they were not referenced in the user stories. I've tried not to over-generalise when summarising them, too.
Process:
List required functionality from each user story.
Cluster related functionality, find overlap between stories (see colours/tags).
Organise requirements into shortlist.
Requirements shortlist
In no particular order. Tags/colours map to requirements by story, below.
sub Subscribe to content
According to some filter, eg. by a certain user, posted to a certain group.
Undo a subscription.
pub Publish content
Including text, photo, video, audio.
Including metadata and relations to other things, ie. audience/to, tags, reply-to, likes.
Update published content.
Delete published content.
notif Notifications
User is somehow alerted when content is created that explicitly targets them (ie. as recipient or subject).
read Read content
According to permissions.
Discovery of content according to criteria:
type (text, photo..);
associated with group;
created by a particular user;
by the content's target (replies/likes of a particular post).
I made honeycomb! Strictly bee-exploitation free, of course. It was way easier than I expected, and didn't result in my entire kitchen becoming sticky. Just most of it.
100g caster sugar
4 tablespoons refined sugar [golden] syrup
1.5 teaspoons bicarbonate of soda
Mix the sugar and sugar syrup together and heat until bubbling and golden brown. Lots of people seem to have trouble with this (burning it etc), but I never have when making caramel in the past and didn't this time. Just gotta not take your eyes of it. It doesn't take long. The fun part is removing it from the heat and quickly mixing in the bicarb, when it bubbled up spectacularly. Poured into a lined tin to cool:
I have to deal with this later..
It took about 20 minutes to cool fully:
And was amazing. Pretty much like the inside of a Cadbury's Crunchy:
I crunched some up and added it to vegan apple cupcake mix:
130g caster sugar + 100g dairy-free margarine
plus Three small apples very finely chopped
plus 190g self raising flour + teaspoon baking powder
plus ~140ml caramel rooibos, which I had brewed earlier (any liquid will do until cake batter consistency reached..)
plus...
Equals:
(Icing was icing sugar, chopped apple and margarine).
The exposed honeycomb in the cakes burnt though, so watch out for that. The icing is a coverup. Nobody will know.
Rikki and I walked from Edinburgh to North Berwick, almost 30 miles, in 11 hours. This is the longest walk I've ever done in one go, and I pushed my legs and feet to the absolute limit. Here's the GPS trace on Runkeeper.
We departed Edinburgh at 2am, and walked straight to Portobello.
From there, we just followed the coast. Next stop: Musselburgh.
The sun started to make an appearance around 5am, albeit on the other side of clouds. Looking back at where we'd come from, the distinctive shape of Arthur's Seat and the Crags:
And forward to the decommissioned power station at Port Seton:
From here, Morrison's Haven:
Murals welcomed us to Prestonpans.
Above is John Muir, whose Way we followed for most of the walk.
Undergoing deconstruction, the old power station:
And some very personalised graffiti in Port Seton:
Finally the rain let up (did I mention it had been raining for the entire first few hours?).
By now, the power station and Holyrood are recognisable silhouettes in the distance. Our feet were starting to ache slightly.
But beautiful beaches and encouraging signs awaited us.
Soon we were deep into golf course territory.
My knees were saying things like "ohai I see you've been walking for several hours now, might want to get that looked at."
So naturally we decided to take a 3 mile diversion via the Aberlady nature reserve, rather than head straight down the road to North Berwick.
This paid off with gorgeous empty beaches.
And interesting things from the sea.
Then we lost the path, scrambled through undergrowth, aggressive plantlife shredded my legs (why do I always head out in shorts?) and we emerged on a golf course. Bemused golfers advised us to get a bus, and directed us to the road. We had other plans, headed through private golf course residents land, with fancy houses.
"Look at those children, running around like they still have feet." - Rikki
We figured that if we were caught somewhere we weren't supposed to be, the worst that could happen is they'd take is to an office somewhere and... sit us down... in chairs!! Didn't seem so bad.
But we limped on, to North Berwick at last.
Except the distance between the 'welcome to North Berwick' signs and the town itself was eternal. We were both feeling a bit sick at this point, on top of all lower-body pain. But eventually we made it, and celebrated by SITTING DOWN.
Also chips.
We slept on the grass overlooking the beach for a couple of hours. Then limped to the train station. Some old ladies with walkers got stuck behind us in the street.
30 minutes and £4.10 later we were back in Edinburgh, via the sensible route.
The last book I finished was The Long Walk by Stephen King. That's pretty much all I could think about on this journey.
On Monday evening my left knee started being painful, and very gradually has got worse over the past couple of days. I now can't use stairs comfortably in either direction, and sloping ground is starting to cause problems too.
It hasn't taken much for me to realise how much I take good mobility for granted. I feel hugely guilty whenever I've stepped in a lift to travel one or two floors today, and keep forgetting and skipping at stairs like I usually would; one step is enough to remind me that that way lies only pain. I'm distressed that I'm unlikely to be able to run this week.
Other inconveniences include having to remember not to sit with my legs folded under or beside me or crossed over like I usually do, and tying my shoelaces and picking things up from the floor being more difficult.
I'm not in that much pain, and it's all pretty minor really, and it'll probably be gone soon, but even this is having an impact on going about my day. I'm really posting this to remind myself, and anyone reading, to take more time to imagine life in this ableist world for people with more severe or long term mobility issues.
People who don't understand what microformats2 are used for beyond SEO.
People who like linked data, and think microformats2 is a small, centrally controlled vocabulary.
People who think microformats2 is not extensible, and don't understand when microformats people say 'of course it is!'
People who like microformats2 and don't understand when linked data people insist that it's not extensible.
People who like microformats2 and don't understand what all the RDF fuss is about.
Machines who can't read the microformats2 documentation (heh, just kidding, the contents of this post aren't machine readable, sorry machines, maybe one day).
tl;dr: The extensibility mechanism of Microformats is alien to people used to linked data because extensions that are not [yet] accepted into the core are not [consistently] documented by their authors to make them reusable, and from the outside the process for getting things accepted into the core looks very centralised and... cliquey. Things may also be confusing due to conflation of syntax and vocabulary.
Disclaimer: I'm writing this tongue in cheek because I have to entertain myself somehow, please don't take offence at anything.
From hereon I will refer to microformats2 as mf2.
Background: I use mf2 and linked data, and appreciate the benefits of both. From what I've heard from the people with the loudest voices, folks tend to be on principle on one side or the other, as if they're in opposition or fundamentally incompatible. Y'all should check your koolaid. My goal is not to promote one over the other, just to try to explain things as I see it and maybe clarify some stuff for some people. I'm sure there are people out there who use and appreciate both, but I can't say I've heard from many of them.
What are microformats for?
Mf2 has been adopted by the indieweb community for interoperability of social websites. There is now a large overlap between the microformats and indieweb communities. The scope of indieweb is social. Whilst technically the scope of microformats is everything one might want to publish about on the web, you might find yourself in debate with microformats advocates who dismiss anything not social as irrelevant:
Example debate 1
LD: I want to describe all of the properties of volcanoes, I can't do that with microformats therefore microformats is bad.
MF: Wat why would you want to do that? Linked data is stupid.
LD: I am a volcanoes researcher and I want to publish all my volcanoes data for other volcanoes researches to read.
MF: I don't care about volcanoes, bye. (exit stage left, muttering something about fax machines).
...just worth bearing in mind.
There are mf2 parsers in many different languages. If you parse mf2 from a page, and your code knows the mf2 vocabulary, you can do something useful with the data you've parsed. In the indieweb, we use this to find out who the author of a blog post is, what it's tags are, it's relations to other posts (eg. in-reply-to), and other metadata. A practical example of use is when I am alerted (however that may be) that someone has replied to my post from their own website, my site can parse their post and display under my post "Bob replied to this on 1st August 2015 and said 'I fundamentally disagree with all of this.'", which might add value for other readers of my post. Because I've parsed out the metadata, I can decide which parts I want to display, and display them however I like.
Example debate 2
LD: But we can do that with linked data!
MF: Well... you're not. Come back when you are?
(Seriously, if you're doing social interoperability with linked data from your personal site, I want to interoperate with you, contact me).
Syntax and vocabulary
Syntax:
"The syntax of a language describes the form of a valid program" - Wikipedia
The syntax of microformats tells parsers where to get a value from when they encounter a certain property, using a defined set of prefixes. Eg. <span class="p-name">Amy</span> tells the parser the value of name is the plain text contents of the tag, ie. "Amy". <a href="https://rhiaro.co.uk" class="u-url">my website</a> tells the parser that the value of url is found in the href property on the tag (and other places URLs are found). Here are the prefix rules. Parsers do not care what the property itself is, and all the parsers I've looked at drop the prefix for the parsed output (though this does mean a consumer of the parsed output loses any indication of the datatype of the value), so adding new microformats properties does not mean that parsers need to be updated.
The semantics of mf2 come from the vocabulary, which is documented on the wiki. To add things to the mf2 vocabulary, one must go through the microformats process.
Example debate 3
LD: LD is better because if I want to add a new term I can just make one up myself and don't have to go through a centralised authority.
MF: Mf2 isn't centralised you just have to go through the process then talk about it in IRC and hope core community members approve. You can add it (and all of your going-through-the-process documentation) to the wiki yourself.
LD: What if core community members don't approve eg. because they are morally opposed to volcanoes? Also this 'process' seems long and arduous.
MF: The process helps keep the vocabulary focused and avoid duplication with what's already out there, over-engineering not based on practical implementation, or random useless cruft from creeping in.
LD: Actually us linked data people tend to do our due diligence and check for existing terms before we create new ones, and reuse what already exists, that's kind of a thing. By the way, on the web "anyone can say anything about anything", not "anyone can say anything about only things the microformats community deems appropriate".
MF: Well anyway, you can start using your new term experimentally, and see if it catches on.
So, to extend the current microformats vocabulary, you could do something like <p class="p-volcano-height">4000m</p>. This is syntactically correct mf2, but not semantically correct as volcano-height isn't an approved mf2 property. Nonetheless, mf2 parsers would correctly output "volcano-height":"4000m" based on your syntax. It's then up to the consumer to decide what they want to do with the value of the property volcano-height. If they're your volcano researcher buddy, they might use it for something. If they're a cake blogger, they might ignore it.
Whether you want to go through the 'process' to see if it'll get accepted into the core is up to you, and debating the validity of the 'process' is out of scope for this blog post.
In summary:
Example debate 4
LD: Microformats is not extensible (meaning: I can't just add my own terms and have everyone know how to use them).
MF: Microformats is extensible (meaning: parsers are vocabulary agnostic).
... LD is talking about the vocabulary (semantics). MF is replying about the syntax. I think that's why this debate goes round in circles. I hope that clarifies something for both sides.
Documentation and namespacing
This is the most interesting issue, and the reason I started this post, really.
Example debate 5
MF: .. (continuing) use your new term experimentally, and see if it catches on.
LD: How do I find out if someone else is already using something like this?
MF: Ask in IRC or check the wiki.
LD: Okay, I found someone's site using volcano-height but I don't know if they mean prominence or height from sea level. I can't contact them and they haven't updated the wiki. How do I find out what they mean?
MF: Why do you need to?
LD: What if we use the same property but mean different things? How can anyone combine our data?
MF: Add a prefix so it's different, like ld-volcano-height.
LD: So what if it turns out we mean the same thing, how will we show equivalence so someone combining our data knows they're the same?
MF: Why would anyone combine your data? I don't believe in volcanoes.
So, LD is used to checking out data, seeing a property they don't know, and being able to dereference its URI (ie. visit the webpage about it) and find out how it should be used, any logical constraints, maybe see labels and descriptions in different languages, or equivalence to a term from another vocabulary that maybe they already know. If LD is building something more sophisticated, their system can dereference the URI and consume a machine-readable version and automatically figure out what to do with it.
But mf2 doesn't have this expectation of documentation of experimental properties, even on the wiki, or at least, I haven't seen it happening. That's not to say it couldn't:
All new experimental properties could get a page on the microformats wiki:
Con: the domain isn't under the control of the author, and the content could be edited by someone else, too.
Con: someone finding the property who is unfamiliar with microformats has no idea where to look to find out more.
All new experimental properties could get a description page on the author's own site:
Con: someone finding it still doesn't know where to look for the documentation, from the property name alone.
And also the documentation is still not machine readable. Ooh but what if there were microformats to mark up documentation of microformats?! Like:
<dl class="h-extension" id="extension">
<h2><dt class="p-name">extension</dt></h2>
<dd class="p-summary">An entry that serves as documentation for a Microformats extension.</dd>
<time class="dt-published" datetime="2015-07-01T23:12:00+01:00"><a class="u-url" href="https://rhiaro.co.uk/2015/08/extensibility-microformats#extension">1st July 2015, 23:12 BST</a></time>
</dl>
I'd support this. But.. it does seem to be a reinvention of RDF...
And this still doesn't solve the documentation discoverability problem, nor the fact that multiple people can document their properties to their heart's content, but if they call them the same thing there is no way for a third party to distinguish between them. And if you want to reuse someone else's experimental property (which you should, otherwise how will they ever catch on?) how/where do you point to the documentation of that for someone who might discover this term for the first time through your site, rather than the origin? We could come up with conventions on where to find stuff, maybe rel="vocab"... Then what if you want to mix terms from multiple sources? I dunno, RDF namespacing seems to be handling this already.
The other thing
I can't reaaally be bothered to go into this, but there's one other problem:
Example debate 6
while(1){
MF: Linked data is too complicated.
LD: No it isn't.
}
I think what's going on here is that MF gets concerned about various academic Semantic Web baggage. But really the core tenet of linked data is... everything has a globally unique identifier - a URI.. or, fine, a URL if the 'I' is offputting. Forget everything else. But this means that properties - the relation between a thing and another thing - also have URLs. They're pretty important, worth having webpages about. To me, that's a reasonable building block.
But I'm really bored of this argument, so I don't want replies from anyone that are just retelling one side or the other, please.
Conclusion
To LD:
Mf2 is actually being used for social interop. Right now. That is not to be sniffed at, or dismissed as 'hacky'. Instead of saying that linked data can do the same thing but better... go do it.
Starting by marking up with mf2 results in human-readable data foremost. Let's face it, they're still the most important audience, especially for social web. Figuring out what's important for humans helps you to prune what you really need to be publishing, and focus on rapid iteration (because people can see and interact with what you're publishing) rather than trying to pre-empt theoretical edge cases or getting hung up on hypothetical data models.
To MF:
Your vocabulary extensibility and documentation is what LD has a problem with, so claiming mf2 is extensible based on syntax alone is not helpful.
People like to publish other kinds of data on the web, often more complex than can easily be marked up with mf2, and where consumption by machines is as useful as human readability. It also opens the door for mixing data from different domains on a massive scale. I know you're not interested in this, but don't dismiss linked data out of hand because of that.
Wonderful, now I've pissed of both sides of the debate, I'll go get back in my box.
Amy wrote about life, beach, family, & sutton-on-sea
Amy wrote about hacking, indieweb, events, slogd, hwc, & calendar
I want to completely run my calendar from my website, even if it's just as a series of RSVPs. I think tomorrow at HWC I'll scope out exactly what I do for this to happen. Off the top of my head, I need:
Restricted access to event details (potentially just by obscurity).
Reoccurring events.
Inviting people, or at least tagging people I expect to be there.
Amy wrote about phd, academia, chi2016, writing, emax, & acwri
Astounded and humbled by eMax's epic sleep-deprived multi-paper writing skills. When I grow up, I want to be just like him. I am privileged to coauthor with him and DMR.
I mostly use this to display different icons by posts. Worth noting that I don't in anyway differentiate photo type posts, just notes or articles with photos embedded in them, sometimes with properties that make them display as more specific types (like a checkin). Speaking of, I've previously written my quite specific handling of checkins vs notes with location.
if content
note post
if header (aka title aka name)
article post
if startLocation and endLocation
travel plan post
if reply-to
if rvsp
rsvp post
else
reply post
if location
checkin post
if like-of
like post
else if repost-of
repost post
else if bookmark-of
bookmark post
else if follow-of
follow post
else if type(LlogPost)
llog post
if food tag
food post
if sleep tag
sleep post
if exercise tag
exercise post
if read-of
read post
if mention-of
// I use this when I'm displaying incoming webmentions that don't pick up another type, I don't have any of my own posts I consider 'mentions' posts yet
mention/link post
if location and not content
vague checkin
My algorithm cascades; ie. the last criterion that matches takes effect.
However, I don't display different posts very differently... in fact, I use one template for everything, and for all posts with content, display all properties which are present. So all posts with additional properties might as well also be considered notes and articles.
Issues
In just writing this out I've noticed a few things I need to tighten up. For example, I see no reason a like post can't also be a bookmark and a repost (you might disagree..) so I will tweak to allow that, and make decisions about how to display that. Vague checkins need to check for latitude and longitude properties.
LlogPosts (lifelog aka metrics) still have an explicit type, as they're otherwise just notes with specific tags. Currently this is the easiest way to filter them out of a list, as I don't want to display them in my main feed. At some point I will enhance the display of these from just text, and I'll need to alter how these are identified to do that.
Querying
For my implementation it's a huge pain to exclude posts from a list based on their properties, but this is because I'm stuck on SPARQL 1.0. Plumbing.. So I won't labour that. It does seem instinctively easier to query posts based on explicit types, so I'm still not sure if I won't actually start storing these again anyway, when the post is created.
On the other hand, why is that any easier than querying based on properties? Seems like preferences would be dependant on programming and query languages, so maybe neither way is clearly better. Adapting a UI based on the properties present may allow more flexibility in display, in the end. I'll be playing around some more, anyway, and in particular adding in some more activity-like posts fairly soon.
Additionally, when I start sorting my different feeds out, some by 'type' and some containing a mixture of 'types', this could get more interesting.
Amy wrote about travel, phone, mobile, sim, & contact
USA mobile plans... It seems to be really complicated (or at least, phone provider websites are bad) to get a SIM-only, monthly rolling contract with minimal texts/minutes/data. Specifically on a network that will work with Fairphone (2G is fine, believe it or not). So I'm seriously considering not bothering. I started to worry about it being inconvenient/expensive for people with US numbers to call me, then had an epiphany. Making it more difficult for people to call me is a feature, not a bug.
I can call US numbers from Hangouts, and there are a million ways people can instant message me other than SMS. (FYI best results currently from Hangouts or Twitter, will probably make space for Viber again soon).
Today set out to be a quiet day of working/procrastinating from home, then a flurry of last minute plans and serendipity meant I got to meet people I previously only knew of online, and have some good conversations that will lead to future exciting work and travel related things. Sweet!
At short notice, my roommate Liz invited me sailing on the Charles. When we got there there were no boats available, but some friendly strangers had space in theirs and picked us up. One of those strangers happened to be Nate, whose Microsoft Research blog posts I'd read this summer and who had been twitter-introduced to me a couple of months ago by our mutual friend Doc. I'd been meaning to follow up and find time to meet up with him. After about 15 minutes of chatting with him and his friends in their boat, I realised who I was talking to. What are the odds?! Nate's research is relevant to mine, and he recommended a seminar group I should attend; bumping into him this way was an incredible stroke of luck!
Earlier today I learned that Shane is in town for a couple of days as part of a roadtrip around the US, so I met him and Morgan for dinner, and we talked indieweb, travel and vegan food for a few hours. And I might now have exciting and exotic christmas plans as a result.
I couldn't find 'world foods' in Wholefoods today; will broaden my search. UK-style baked beans are my childhood favourite food. Technically Brits eat Marmite, but I consider Vegemite far superior. Marmite will do in a pinch though.
Amy wrote about phd, life, work, notes, productivity, & etherpad
Starting to think actually I can use a self-hosted etherpad for everything and there's no need for any other communication or note-taking applications.
Of course, I will think this until my server goes down and I lose everything.
Amy wrote about travel, food, bread, life, vegan, & usa
PSA for the USA: Milk and sugar are not normal ingredients in bread. Stop. Please.
On a related note, can anyone recommend an actual bakery in Boston/Cambridge? I'm giving up on supermarkets. Even Wholefoods doesn't have sensible bread.
Amy added 'Andrej Karpathy Academic Website' to Bookmarks
Amy wrote about phd, social web, socialwg, resume, cv, w3c, standards, social api, specification, editors draft, & decentralized
I finally pieced together my thoughts on the Social API over the last couple of weeks, and yesterday it was accepted as an Editor's Draft for the W3C Social WG. Over the next month or so I'm hoping the group can work together to plug the gaps and reach consensus where there are various alternative ways of doing things so we can have a First Public Working Draft by our next face-to-face on the 1st of December.
And you could generally ask around IWC about various interfaces other people are using and see if there's one you like. You can use different things for different types of post. I'm totally going to write a checkins client soon.
Amy added https://www.digitalocean.com/community/tutorials/how-to-set-up-password-authentication-with-apache-on-ubuntu-14-04 to https://rhiaro.co.uk/bookmarks/
Amy added 'Impactn of Social Sciences u2013 101 Innovations in Scholarly Communication: How nresearchers are getting to grip with the myriad of new tools.' to Bookmarks
I think CHI submission reviews coming in tipped me over the TODOs edge, I developed a powerful cake craving, but didn't want to leave my apartment/pyjamas so the natural outcome is... procrastabaking!
This was improvised, and I don't normally have much success with full-size cakes, but lack of other baking dishes left me with little choice. It turned out great! Maybe using US units of measurements is the secret after all.
All measurements approximate:
1 1/4 cups wholewheat flour
handful of cocoa powder
handful of coconut sugar (I have small hands and not a sweet tooth, you might want more)
handful of coconut flakes
teaspoon baking soda
1/2 cup vegetable oil (I would have used melted coconut oil but I didn't have enough)
juice of one small lime
enough warm water to bring to cake consistency, about 1/2 cup I guess
Combined dry and wet ingredients separately, then mixed together. Baked for 40 minutes (with poking breaks at 20 and 30) at 350F.
For the chocolate coating:
1/2 cup melted coconut oil
whatever drizzle of soy milk I had left.. uh 1/4 cup?
half a handful of cocoa powder
half a handful of coconut sugar
Stir vigorously over a very low heat to make it foamy and wonderful. When it cools it separates, so as soon as the cake is cooled, pour it over and immediately refrigerate. Still separated a bit, but tastes great.
Amy wrote about Kyle Mahan, hacking, indieweb, slogd, twitter, webmention, bridgy, & like
Let the records show that I will never click or tap the twitter heart icon. Apparently it explodes or something? Dumb. All twitter likes are henceforth (finally) fully automated via bridgy.
(And a million thanks to kylewm for spontaneous inclusion of error logs in bridgy profile pages!)
Amy added 'The Beilstein Journal of Organic Chemistry and the changing face of scientific publishing' to Bookmarks
Week in review
16 - 22 November 2015
Submitted a tutorial proposal to WWW2016: Building decentralized applications for the social web.
Digested CHI reviews for our pro-social deception paper; mostly neutral, we need a very strong rebuttal.
Rewrote the ActivityPump spec in the structure of my SocialAPI document with the goal of decoupling the constitent parts and making it easier to implement in pieces rather than requiring all or nothing. Awaiting feedback from AP editors/implementors/interested parties.
Wrote a script for publishing photo albums as AS2 JSON-LD and HTML+RDFa at img.amy.gy. Each album is served as HTML+RDFa by default and can be retrieved as AS2 JSON-LD with the Accept header set to application/ld+json, application/activity+json or application/json.
The next Internet of You smart device wakes you up in the morning and says hmm, based on current brain patterns, various external factors, and those of the other people you are likely to interact with today, your mood is on a negative trend. So I've turned off the router for 12 hours, and here are some colouring books.
Amy added 'Frontiers | Deep impact: unintended consequences of journal rank | Frontiers in Human Neuroscience' to Bookmarks
Amy wrote about standards, & life
A. "That person says they do not agree with my experience, but I experienced it! They are wrong."
B. "Maybe they just had a different experience to you."
A. "If they had a different experience to me that means my experience was wrong, which it was not, therefore theirs is wrong."
B. "You can both have equally valid yet different experiences, that have led you to different conclusions about the same thing."
A. "I understand that they had a different experience, but their conclusion is wrong based on my experience. They are wrong!"
B. "But their conclusion isn't based on your experience, it's based on their experience."
A. "But their conclusion is different to mine, contradicting my experience."
B. "It doesn't contradict or invalidate your experience. You can both have different experiences, reach different conclusions, and each are equally valid for each of you."
A. "Okay, I see. They're wrong though, and I'm going to continue the argument on that basis.
This is part of an ongoing series of notes about Star Trek episodes that remind me in some way of interactions with W3C Working Groups.
On issue closing and edit wars
In TNG S1E26 ("The Neutral Zone"), a man from the late 21st century is found cryogenically frozen. He is awoken aboard the Enterprise, and soon becomes frustrated that he can't speak to the Captain (who is busy diffusing a dangerous situation with the Romulans). He uses a communications panel to call the Captain, who isn't best pleased. When reprimanded for unauthorised use of the panel, he says "If they are so important, why don't they need an 'executive key'?" to which Picard replies "Aboard a starship, that is not necessary. We are all capable of exercising self-control.
This is part of an ongoing series of notes about Star Trek episodes that remind me in some way of interactions with W3C Working Groups.
On maintaining a sense of humour in dire situations
In TNG S1E7 ("Contagion") a computer virus attempts to rewrite the software of the Enterprise. Geordi: "We have two completely incompatible computer systems trying to interact!" Sound familiar? A potential consequence is complete destruction of the Enterprise, as happened to the USS Yamato shortly before. Later, during multiple systems failures and faced with imminent Romulan attack, the shields are going up and down and weapons systems are going on and off, Troi smirks: "In another time and another place this could be funny." Riker adds "In case it should become necessary to fight, do you suppose you could find me some rocks to throw at them?
Filling: tofu (less than the recipe), melted coconut oil + cocoa (melted chocolate substitute), more cocoa, coconut sugar, coconut milk, drizzle of maple syrup. (Omitted salt and vanilla).
As promised on Katie's blog... really good. It set perfectly after about half an hour in the fridge. And before it set, it worked great as mousse.
Thanks to Liz for the decorative sprinkling of coconut creamer.
Learnt how to write a rebuttal for a CHI paper, mostly be reading a ton of stuff Max threw at me and watching Max and Dave do it.
Poked a bit at SocialAPI for potential consideration as a FPWD for the SocialWebWG on Tuesday.
First pass at restructure of SoLiD spec according to the structure of my SocialAPI document, with the aim of making its constituent parts easier to implement individually, and to make it easier to map parts on to other equivalent specs. Needs work.
I just took a 17 hour train (Starlight 14) from San Francisco to Portland, right up the west coast of the USA. At 9 last night, a connecting bus (the Thruway) took me from SF to Emeryville, Oakland, where I boarded the train at 10. I bought my ticket in advance online ($132, which includes the bus and also a Portland to Seattle stretch for later this week) and was assigned a seat upon boarding via the sophisticated system of a lady with a handdrawn grid and a pen.
Totally different from any other train I've been on, which is why I'm writing about it. The train is huge. I didn't manage to count the carriages, but there are many. The cheapest Coach seats are wide - probably the same as the Caledonian Sleeper - but recline further with more legroom, and have an extra leg rest bit that pops out underneath, so it's a totally viable bed. The whole train is two storey, with most seats above, and loads of bathrooms below.
Overnight I pretty much slept through, waking at Sacramento to close the curtain as the station lights were bright. There were many stops, and people came and went from the seat beside me. At one point there was some kerfuffle from someone who thought her phone had been stolen, and also the seat assignment system resulting in people being assigned to the same place, but mostly I wasn't really disturbed. At one point I woke up to nobody, and rotated to lie across the two seats. I woke again at 0730 when the sun was up and we arrived in Klamath Falls. Plenty of empty seats in my carridge.
From my vantage point it was largely dilapidated sheds situated amongst unkempt scrubland. Some tourist-looking people disembarked here, so there must be something to do. There are both a restaurant and a cafe car, the latter of which serves decent coffee with a smile for $2, and there is at least one vegan option on the menu (a burger, unsampled). The restaurant took reservations for breakfast and lunch, with a member of staff passing through the train to offer this. Above the cafe is an 'observation lounge', with seats clustered around tables, and reclining armchair-types, all with power outlets, but the special feature is double-sized windows. So really light, great vantage. I considered relocating, but wasn't sure about the etiquette of permanently occupying space here, and couldn't be bothered dragging my stuff back and forth.
We proceeded and the scenery picked up with lakes and mountains, gradually becoming more epic, peaking at alpine-esque snow-covered pine forests. Scenery became less interesting after Eugene. Flat, industrial-farmland-y. Some stops are long enough for 'smoke breaks', with passengers allowed to disembark to stretch their legs for around half an hour.
Way more interaction with fellow passengers than I'm used to in the UK. Always takes me by surprise. A bunch of friendly (I think?) comments on my hair, plus a few people who wander through the train rambling good wishes at everyone. Someone giving out homebaked cookies. An old couple dressed as Santa Claus. Most people - in great variety - seem consistently intimdating when silent, and friendly when they open their mouths. Maybe I just don't know how to read Americans yet. The expectation/demand of interaction with strangers here is something I'm still figuring out, and I think I unintentionally offend people when I'm not very good at making conversation.
At 1430 there was a wine tasting. Who boards a train and goes to a wine tasting?
Arrived in Portland over 30 minutes early. No data connection here. Not even 2G. Wilf's Wine Bar just beside Union Station let me use their wifi.
Amy wrote about travel, food, vegan, usa, & portland
Plotting vegan food places on a map of Portland. Plots whole of Portland. Going to have to find another way to narrow this down. Haven't even opened Happy Cow yet.
Followed instructions for domain validation (dealt with rogue .htaccess file that stopped .well-known being accessible).
fullchain.pem, chain.pem, cert.pem and privkey.pem were generated into /etc/letsencrypt/live/mydomain.tld.
cPanel -> SSL/TLS Manager.
Uploaded privkey.pem to Private Keys. Uploaded cert.pem to Certificates.
Manage SSL Hosts -> Browse Certficates -> picked the cert (it prefilled domain automatically). First two boxes prefilled with private key and cert. Pasted CA bundle into the third box from the lets encrypt site.
Fixed a paging bug (December was an edge case, apparently).
Added sessions so indieauth logins ot my site persist.
Made progress on my webmention endpoint which in addition to the base webmention spec accepts the property parameter and will be able to verify mentions marked up with RDFa.
Wrote about different social web worldviews and how that affects data models: Things and happenings.
Attempted to figure out https with letsencrypt on two different server setups. One was not terrible, the other was pretty terrible.
tl;dr I didn't figure it out yet, if you're looking for a guide you're not in the right place.
Disclaimer:
Things I currently run through the reverse proxy:
A simple standalone python webapp2 app.
One Apache server.
Another Apache server.
Gold (a Solid server written in Go).
Etherpad.
Decided off the bat not to bother with Etherpad, as I haven't looked under the hood and don't know how I'd do domain validation at all. Figured the others would be doable.
Generating certs
Ran the letsencrypt Docker container. The current docs run it with -p 80:80 443:443 and the auth command and no plugins. I left out the ports and used the manual plugin, as I can't conceive of how it would do domain validation it across containers, so I'm not even going to try rig that up:
I gave it several subdomains, for each of the different apps I have running, and Worked through domain validation for all of them (putting a file in .well-known).
Apache servers were easy.
Spent far too long figuring out the best way to route the python app to serve .well-known because I am dumb, but got there.
Creating the .well-known for Gold was super easy, but it wasn't accessible over http as Gold forces https even without a cert, so I dropped that until I can make it serve on http.
Down to three subdomains, I (finally!) generated one cert for all of them. It stored the files (cert.pem, chain.pem, fullchain.pem and privkey.pem) under the name of the first one on the list (in /etc/letsencrypt/live/sub.mydomain.tld).
Installing certs
I had it on good advice that if I restarted the proxy container I wouldn't need to restart all of the other containers. The instructions for SSL in the docs for the proxy say:
It also says "The certificate and keys should be named after the virtual host with a .crt and .key extension". I had .pems so I threw caution to the wind and renamed:
fullchain.pem -> sub.mydomain.tld.crt
privkey.pem -> sub.mydomain.tld.key
Put them in a directory that I mounted to the proxy container when I relaunched it (above command). Given the rename, the proxy is supposed to just find them I guess?
Failure 1: port 443 is already in use. o.O I couldn't figure out what is already using it, but later wondered if Gold is maybe sneakily hijacking it. Otherwise I found this docker bug which may be it but I am in no position to upgrade docker right now (I know, I know). Faced with imminently needing to relocate to somewhere without wifi and not being able to cope knowing my Etherpad was down, I relaunched the proxy container as above, without -p 443:443, but still with the path to certs. Whew, everything came back up.
Except... The first subdomain, the one that the certs are named after, is now serving Gold, not the Apache container it was supposed to point to. The subdomain that is supposed to be serving Gold is also serving Gold. Neither are using the correct cert.
So... that's where I'm at.
Next?
A cursory search suggests that one does not simply convert .pem to .crt by renaming the file. I will attempt to convert with openssl.
I'm not totally sure if I'm supposed to be using fullchain or one of the others? Since nginx only asks for cert and key, I assume fullchain is the right one.. I've seen tutorials which cat the cert with the CA bundle, which I believe is what fullchain is, so..
Get Gold out of my port 443 shiz and see if that stops confusing nginx.
Cry.
Try launching the other two subdomains with the CERT_NAME=sub.mydomain.tld flag as they all point to one shared cert.
If you've read this far and have the remotest clue about any of these puzzle pieces, please let me know all the things I'm getting totally wrong.
Things and happenings: modelling social for the web
The online social world is simultaneously and varyingly a mirror, augmentation, and reduction of our offline social lives. Human behaviours are complex and nuanced and context-dependant, inconsistent, sprinkled across many different media, subject to multiple interpretations.. and all kinds of other words that mean it's difficult to wrangle this space into a coherant or complete data model. But, we (computer scientists, software developers) do it anyway.
For some reason, nobody has come up with a solution that pleases everybody yet.
It seems probable, given the diversity of systems, requirements, desires and general worldviews, nobody ever will. So here I come, blazing in with neither history nor experience, to try to write about how I see things. There's a lot of interesting past work in this space, and a full literature(/mailing list/blog post) review is worth doing. But for now, in the interests of time and sanity, I'm sticking to the current state of things as I understand them. In this post, I look at only two different (but overlapping) models. I also want to emphasise that there can't possibly be a single right way of looking at this space. Such models aren't in conflict (as some may think) but simply different ways of looking at the same thing. Where proponants of one may see shortcomings in the other, the opposite is equally true. People's different experiences and needs have led them a way of looking at things that they find perfectly intuitive. Often, this means alternative perspectives are seen as unintuitive and perhaps even in competition. Of course, there's a fine line between accounting for different perspectives, and losting interoperability entirely.
So, let's take stuff. We start with the idea that there is stuff on the social web that we want to describe. One subset of stuff is people. I'm not thinking about modelling people and relationships here.
Other subsets of stuff, which I want to focus on right now, are things and happenings. I'm deliberately trying to pick silly terminology to keep this abstract. You might also think of things as content, items or objects, and happenings as events, interactions or activities.
The two social data models I've spent the most time thinking about recently are ActivityStreams 2.0 and microformats2 (AS2 and mf2 henceforth) and the relationship between them. To various degrees, I've writtenabout them before.
AS2
ActivityStreams was designed as a model for logging happenings (as opposed to a command language, which in some systems it has been used for). AS2's strength is happenings. A happening is modelled as an Activity, which may have a relation to a thing, aka an Object. (Technically an Activity is a type of Object, as is everything else, Actor, Collection, etc, but what I'm referring to here are generic Objects that don't belong to one of these other special classes). There are more specific types of Activity in the AS1 vocab than there are Objects.
mf2
Microformats was designed for marking up all kinds of web documents, and a subset of mf2 is focusing on social, specifically feeds and blog posts. Most people who work with mf2 find that they can adequately represent anything they need to as a thing. mf2's strength is things. The most common type of thing is an entry (a post), and you're also likely to see feeds and cards (profiles). All things can have relationships with other things. There's no particular language for logging happenings with mf2; the existence of a set of things serves that purpose. And no specific types of thing; rather, types of thing are inferred from the semantics of their properties and relationships with other things.
jf2
Both have JSON representations. This is the default for AS2, but mf2 is embedded in html, which means their JSON representation is generated by a parser. Even though there are a set of parsing rules, output can be complicated and vary depending on the structured of the html being parsed, and I've found myself writing my own 'parsing rules' to extract what I want from parsed mf2. Fortunately Aaron and Ben are working on a vastly simplified JSON representation of mf2, called jf2.
All together now
AS2 is already under the remit of the W3C Social Web WG (edited by James), and at the recent face-to-face, jf2 was (somewhat controversially) accepted as an Editor's Draft for the group as well.
The WG is chartered to produce a 'social syntax'. AS2 works great for those with happenings-centric worldviews, but doesn't always sit right with those who want to focus on things. On that basis, I think the two syntaxes have the potential to complement each other. I don't see why the WG can't produce two syntaxes for these two perspectives, which can be used together in systems which mix and match things and happenings. Not everyone agrees. There are certainly some redundancies and overlaps with both specs in their current state, and thus a lot more work to be done. But the editors are all keen to work together to iron these out, and I'm hopeful that now there's more of a feeling that these specs are complementary rather than competing, working on this will improve both. The strengths of one can plug the weaknesses of the other, and everyone can benefit. We also need to leave room for expansion in the future, as obviously this is anything but a static space.
An addendum for those who are adamantly opposed to one or the other of the models, because the other is obviously right/better: I encourage you to accept that different experiences lead to different conclusions, and if there was an obviously right/better way of doing this we'd have solved it long ago. Bringing together the different experiences of different people in order to benefit everyone is kind of the point of the WG.
These are the two models being considered because their supporters wrote them up as specifications and can demonstrate history and implementation experience. Anyone have a different model of the social world they wish to bring to the table..?
What follows is more detail on my perspective of the main conversations we had over the two days. Clarifications and corrections welcome.
tl;dr
Most AS2 issues are closed! CR-blocking issues are now due by 15th December.
We took a bunch of things to Editor's Draft and are pushing for FPWDs as soon as is viable.
Some of the drafts overlap but there's a general feeling that since there are keen editors we should work on everything and iron out issues and redundancies as we go, rather than holding out and waiting for clarity.
Go check out the specs and build bits of them and give the editors feedback!
ActivityStreams 2
We steamrollared through AS2 issues, which included core simplifications, vocabulary changes and reductions and editorial clarifications. James made most edits during the meeting, so there's a much updated working draft available now. You should read it and post any issues you see to be CR-blocking by the 15th of December.
JSON-LD related stuff has been moved to its own section; since it is optional, having references sprinkled throughout was confusing for people who don't necessarily want to deal with it. Chris pointed out that even for extensions, if you know the extension you want to handle you can still do that in plain JSON.
Still some consternation about which alternative syntax examples should be in the spec. Since they're non-normative/editorial anyway they're not a CR-blocker so left alone for the time being.
We don't need a verison number in the URL because any future widely-deployed extensions that want to make it into the core will likely be incorporated as part of a full new version (ie. AS3). At some point we should start a registry for extensions; James is keeping track himself on github, we could move this to a wiki page and ultimately a CG when the WG wraps up.
Lots of discussion about testing frameworks and how to meaningfully test production and consumption of syntax and vocabulary. I refer you to the minutes, as this is beyond my ability to summarise well enough, but it seemed like the people working on this gained some clarity and a plan to move forwards.
Social API
Editor's Draft all the things
There's some contention around what it means to accept a spec as an Editor's Draft in the WG. Our general consensus was that it means a spec isn't necessarily going to be rec-track, or even the direction the group is going to take, but it's in-scope and worth some portion of our attention, even if that is just to inform other things. Most specs we've picked up are work that the editors were doing anyway, and this just means the WG should explicitly not ignore them. It's expected that the specs will change significantly going forward, in response to input from the WG.
As such, it's okay that some of our now-ED specs currently cover overlapping territory. We hope that WG attention will serve to refine, cut, expand, merge, and otherwise sort this out. We may end up multiple small specs derived from our current set of EDs which cover pieces of the social puzzle, or several specs will demonstrate multiple viable ways of doing the same thing. My preference is for the former, but the latter is better than nothing. (I tentatively extrapolate the latter into either one gets wide adoption and the others quietly fade out, or they all get equal adoption and people build bridges between them, either way not a total loss).
Social Web Protocols
I finally convinced people to stop calling this "Amy's SocialAPI Document" and renamed everything to Social Web Protocols. This document describes the individual componants we are trying to standardise (based on user stories), covering both the API and Federation. Given the potential for the WG to produce multiple small specs, work on this is to continue to describe and serve as a guide to each building block. This should highlight both points of convergence between separate specs, and gaps that no existing specs are filling adequately.
Issues filed should be to that end. Point out obvious points of commonality between specs that I haven't noted, or where it would be worth replacing the vague overview with more spec-like details.
I aim to take this to FPWD next week (which does not imply WG consensus on the contents yet) with the expectation that this is currently an overview document: a guide to the different areas being standardised by the WG. If we end up with a bunch of small (or overlapping) specs, this could end up as a Note, detailing how they relate to each other as a guide to implementors. If we end up with one spec that covers everything, either this becomes it following input from the other drafts, or this has done its job at converging things and is dropped completely. The rationale behind going to FPWD with this document is to better advertise and explain the different angles of work the WG is doing to other WGs and the public, and to seek wider feedback thereon. The issues become a place to discuss features based on functionality, where they are not specific to one of the other individual specs.
ActivityPump and Micropub
Both now EDs. Micropub covers a subsection of functionality of ActivityPump, but is uncoupled from any other pieces of functionality, whereas ActivityPump intertwines lots of things. There are distinct similarities - both POST JSON to a specific endpoint to create, update and delete content. The editors are keen to cooperate so there's value in working on them both in sync.
jf2
jf2 is a social syntax to complement (not compete with!) AS2, where jf2 is content-centric and AS2 is activity-centric. The editors of both agreed that it would be beneficial to work on these in conjunction. I've written more about the relationship between them here.
Post type discovery
PTD is an algorithm to help consumers who find themselves with implicitly typed objects to derive explicit AS2 types, if that's what they prefer to work with. My concern is that it's biased towards the microformats2 vocabulary and currently useful for a niche - but a very small niche. However, James pointed out that types are actually optional in AS2 in general, so it could be expanded to help go from untyped AS2 objects to typed ones as well.
My other concern is that this space is such a moving target, and having a fixed algorithm to derive post types based on properties is going to get dated really fast. A constantly shifting algorithm doesn't fit into W3C workflow, and of course brings its own problems (who has implemented which version as it changes over time). I don't have an answer to this.
Federation: Realisations and moving forward
Evan forced us to slow down and really think about what we meant by federation. I don't know if anyone else did, but I had a bit of a lightbulb during this discussion. Bogged down in the particular bits of federation that are within reach to me (basically, notifications), I forgot there are a great many other things one might want to federate, like search, following topics, user discovery, recommendations... The WG is not required to tackle all of these, as a 'federation protocol' is the icing on our charter cake, but we absolutely don't want to de-prioritise federation completely as it's important and actually ties in well with a lot of the work we're already doing. But taking a step back to reassess - and clarify to the outside world - what we're actually doing is important, and there's some effort going into that now.
Webmention
Webmention has been an ED for a short while, and there were some issues to work through. Some really interesting points have been raised around technical details, security concerns and functionality enhancements, and lots of different ways to refine this spec are emerging. We talked through open issues, and group resolutions were made for most of them.
The one I'm most interested in is addition of the property parameter for better disambiguation of the assertion being made by a webmention. It surfaces a need of people outside of the current core webmention implementors to send and verify claims more precisely, whilst adding minimal additional overhead for those who don't need it. Since bringing this spec to the WG is an effort to gain wider adoption and investigate broader use cases than what we have at present, taking these kinds of expansions seriously is good. The benefits were positively acknowledge overall, and I was hoping we'd see this added to the current version, even if marked 'at risk' pending future implementations. But the decision was taken to leave it out, in the same vein as AS2 currently relegating all addition suggestions to extensions. On the plus side, the webmention spec will link to all proposed extensions which are written up as specs, and if any extensions see enough adoption over the course of the work they can be integrated into the core.
Cooperation
Bridging between worlds has been an ongoing theme in this WG.
Chris has done some great work on Activipy, a Python library for handling AS2, and overnight between meeting days he added support for jf2 as well by simply passing in an alternative JSON-LD context. This means you can pass in AS2 and serialize out again as jf2, and vice versa! More or less, at least... this might even be improved by adding PTD in between for where mappings aren't already obvious.
In general, tensions between specs that could be overlapping have changed to editors supporting each other to drive all of the work forward, and, I'm hoping, to optimise where redundancies exist. We all have the same goals, after all. We've still got a long way to go, but we ended on the feeling that we can probably get there.
And we played almost no SocialWG bingo, so it must have been a good meeting.
Following on from a terrible experience, I discovered that indeed Gold had taken over port 443. As soon as I kicked it off, I could launch the nginx proxy container with -p 80:80and-p 443:443. So now the proxy knows where to find the key and cert, and is trying to load the subdomain over https, but is getting connection refused. The proxy docs say this might happen "if the container does not have a usable cert" so now I have to find out what is wrong with my cert?
Is it permissions? It's usually permissions. Nginx might reject things if they key is world readable? Tried setting to 0600 for the key and cert. No dice.
Amy added 'AMiner - Open Science Platform' to Bookmarks
Amy wrote about travel, & portland
Unexpectedly found the ever-sought golden trio in Portland train station - seats and power outlets in just the right place to pick up wifi from the restaurant next door.
Arrived in Portland after a 17 hour train journey. Had no data connection and had done no prior planning, including caching a map or getting the address of where I was staying. Pantsed around Union Station looking for wifi for a while, and eventually the restaurant next door (Wilf's) were sympathetic. I made it to my destination, discussed the boundless possibilities of vegan food with my hosts for a few hours, and then we went for dinner at Epif Restaurant & Pisco Lounge; Charciqan. Also headed to a bar where I tried Kombucha. Not sure how I feel about it.
Ground Kontrol for a vegan corndog, weird Liam Neeson movie and pinball. The nostalgia for Windows pinball I got from playing IRL pinball was incredible. Reverse nostalgia?
Went to White Owl for vegan s'mores, but they don't sell them any more due to complaints from the fire department. Stopped by the entirely vegan mall (!?!), but everything was closed. Finally ended up at Rimsky's for tea, a truly fantastical place that would have been the highlight of the day had the day not been entirely highlights. "Sit at a table which hums."
Tuesday
Breakfast tacos. Torrential rain. The best burrito, empanadas rellenas, I've ever had in my life from Los Gorditos.
I went on a walking tour of 'underground' Portland. I was the only person, and the tour guide wasn't super keen to go out in the downpour, but he humoured me. I learnt lots about racism and crimping and tunnels.
After years of occasional trying and giving up, I finally figured out the foundation single crochet stitch. Now I'm bored of it.. Only 189 more to go for this round.