> I thing the most important are the definition of uuid fields and their
> semantics and working together with tw, including the ability to track
> changes and the history of where the tiddler came from. I think this
> is non trivial.
Can you give a few more details on what the communication protocol
would be accomplishing? I acknowledge that it would be cool to do,
in the abstract, but knowing some more concrete reasons for having
it will help to understand the structuring that we need to do.
I ask because earlier this year I was getting quite keen on
federation in general, and federated social web protocols, but over
time I've come to wonder about the extent to which they are really
necessary above straight up HTTP and hypertextual links. In the FSW
world, federation has come to mean distributing copies of stuff all
over the place. I think this is entirely regressive and
counter-productive on an open and public web. We don't want copies
of content, we want more links (with links that actually work), and
more servers.
Ward's information makes it pretty clear that part of the goal in
his stuff is a collaborative workflow. Is this the sort of things
you are thinking about?
In that context, how important is tracking changes and history
compared to the content itself. I've been working on collaborative
content systems for a long time now and one of my observations is
that strict content tracking is far more important in code than it
is in narrative. And not only that, because of the structure of code,
tracking the changes is far _easier_.
Given that I keep finding myself coming back to a situation where if
the content is fairly unstructured human communication what we need
is just accessibility.
In a tiddler context that means URIs for individual tiddlers with
good capacity to link.
Can you provide a use case or user story that fleshes out the need
for what you describe above? I'm not saying it doesn't exist, I'm
sure it does, I would just like to understand it more clearly.
--
Chris Dent http://burningchrome.com/
[...]
I've found myself less keen on making UUIDs be a part of the core
definition of a tiddler. I can see that there are some scenarios that
need UUIDs to work, and so I'm interested in ensuring that the core
definition of a tiddler allows for the use of UUIDs (the simplest way
being to choose to use UUIDs in the title field, and use a different
field for the human readable title). I don't see a role for UUIDs in
the TiddlyWiki core, rather I see their usage being driven by server
side (or federation) concerns.
Adding UUIDs to the core tiddler model would make tiddlers more
specific to a particular class of servers and/or federation systems.
Some of these systems might well want slightly different semantics for
UUIDs. If the tiddler concept is to be universal then I think it needs
to be surgically minimal: it is primarily about cutting up information
into little chunks, and the details of particular persistence or
federation approaches using UUIDs shouldn't intrude on the core model.
We want the idea of a tiddler to be as simple as possible so that as
many people as possible can agree on it.
Best wishes
Jeremy
> --
> You received this message because you are subscribed to the Google Groups "TiddlyWiki" group.
> To post to this group, send email to tiddl...@googlegroups.com.
> To unsubscribe from this group, send email to tiddlywiki+...@googlegroups.com.
> For more options, visit this group at http://groups.google.com/group/tiddlywiki?hl=en.
>
>
--
Jeremy Ruston
mailto:jer...@osmosoft.com
http://www.tiddlywiki.com
> Another one: I use tw for todo lists. When a job is done it gets
> marked. Once every month i clean the list of done jobs. But what did
> i do a year ago? just look up the history. And now my friend likes
> the system. He just forks the tiddler to his own tw, keeping a
> history reference to my tiddler. If i improve the system, he gets
> (actually he queries my tw for an update) a notification, because his
> tw is still tracking my tiddler because it keeps "federated server
> history".
>
> Hope that makes my thoughts more clear.
It does, somewhat, yes, but what I'm hearing is a need for more
robust revision handling for tiddlers, not a need for a tiddler
communication or federation protocol. I'm fairly certain that most
of the information you're after can be communicated (at least
initially) via an Atom feed between related servers.
Full featured history that survives renames and tracks forks
requires persistent (and thus meaningless) identifiers. This is
pretty much a fact, so can be taken as a given I suppose. It's
something that's always been in the back of my mind for implementing
with a TiddlyWeb store but I've always put off because it was a
layer of complexity that I wanted to put off until either I was
smarter or somebody else smarter would do it themselves.
But what then is the actual meaning, semantics or process of
"federation" and the associated use cases which require a tiddler
communication protocol (in excess of HTTP/Atom/stuff what already
exists)? That's what I'm really after.
> I would suppose there is a reason for most all database(-like) systems
> to equip "records" (a tiddler being a somewhat generic record) with a
> persistent id.
I'm hundred percent in favor of tiddlers having a persistent id. When
putting TiddlyWeb together I wanted to tiddlers to not only have a
unique id on the server, I wanted them to be unique across the
universe of TiddlyWeb servers _and_ for there to be, in addition to
/bags and /recipes -based tiddlers URIs, another /tiddler/{id} route.
That id would have been a uuid and would have been a first class
attribute of the tiddler.
This idea was rejected.
So given that there is at least some people who support the idea of
ids, and "tiddlygrp" says that atom might work as transport, or a
variety of other things, then the remaining open issue is tiddler
attribute handling?
> @Jeremy: For me a tiddler uuid has nothing directly to do with a
> tiddler. At creation time put a uuid in a field in the tiddler is the
> absolute minimum I think tw should do. A lot other stuff can be done
> server side. The advantage of creating a uuid at tiddler creation
> time is that then it is "uniquely" marked. Then the tiddler might
> move to a server (or not). My thought is that by putting the uuid in
> tw, all servers should support this standard. If each server builds
> up its own uuid semantics, than its hard to get federation and sharing
> of tiddlers peer to peer without a server.
Yes, agree with all this. If any tiddlers are gonna have uuids it is
far better if _all_ tiddlers have them.
> And probably the uri/url's to get a tiddler will be server dependent.
> That is not a problem. The problem to be solved it what do you get
> back when you call GET /some.tiddler.json? Which fields are in the
> tiddler and what do they mean?
Okay that makes more sense. I'm not sure how or who to decide the
syntax and semantics.
I like the way that people explore using TiddlyWiki with different,
pre-existing serversides, such as the current experimentation with
CouchDB, and Zooko's experiments with Taho-LAFS.
My concern is that different serversides may have somewhat different
semantics for their UUIDs, and it would be bad for TiddlyWiki to get
in the way of experimenters by imposing a slightly incompatible way of
using UUIDs.
I know it's not quite the same thing, but a related thing that I would
like to see standardised is the field that identifies the global URI
for the canonical copy of the content of a tiddler. It seems
reasonable for future TiddlyWiki to directly support clean, RESTesque
serversides like TiddlyWeb by using HTTP verbs on that URI.
> My thought is that by putting the uuid in
> tw, all servers should support this standard. If each server builds
> up its own uuid semantics, than its hard to get federation and sharing
> of tiddlers peer to peer without a server.
I'm not sure that fixing an implementation within TiddlyWiki is the
best way to find the optimum federation architecture. The core of the
tiddler concept is pretty well established now, as Chris says, there's
more than one implementation that we can use as a reference. Let's
record what we've got as the core tiddler standard, and make sure we
leave space for the experiments on federation and sharing.
Part of my resistance is that I'm concerned that the consequences of
enforcing UUID semantics on the client seem complicated. They seem
straightforward enough when thinking in terms of how the
synchronisation works, but I'm less confident when it comes to the
user interface; on the face of it, UUIDs would allow multiple tiddlers
with the same title field to exist. How would it choose the right one
for navigating links? How would users access the others? I'm
disinclined to start grappling with all of that when it's not strictly
a prerequisite for exploring the actual underlying federation and
sharing mechanisms that so many of us are interested in.
Best wishes
Jeremy
> For the client tw adding a uuid doesn't matter directly. It wouldn't
> allow for tiddlers with different titles to exist, as it is forbidden
> in tw now. It would be just an extra field. In fact just introducing
> a uuid field needs no user interface.
Yes.
> The uuid is important to establish a standard a server or another
> client can count on.
Yes, something that has been bewildering me in the back and forth
about this is the discussion about "semantics of uuids". If we're
talking about uuids in the RFC 4122 sense or in the sense of
universally unique identifiers then the exact point of having such
things is because they _don't_ have semantics.
An identifier which is persistent and unique may not have semantics.
So question really becomes one of representational syntax, and
tiddlers already provide us with the fields attribute and if we want
deep coverage we have to use uuid4 (as it can be done without access
to the hosting system) and since we are using fields the stored
information must be a string, of hex digits.
In Python that's:
>>> import uuid
>>> str(uuid.uuid4())
'0d9b98c0-5f73-45eb-ac4a-386d445905e3'
The goal of an identifier is not to provide meaning or activity, it
is simply to allow something to be identified in a process. In a
universe of tiddlers, the tiddler title can _never_ be the id
becuase it will never be unique. The host of the tiddler plus the
title can never provide an id either, because we want tiddlers to be
able to move. So you have to make the tiddler have a unique id,
without meaning.
And, if you want that id to actually work as an identifier througout
the entire lifecycle of the tiddler where it may go or do, it _has_
to be created when the tiddler is born.
Similarly, in order for the id to remain "safe" it must _never_
encode information about the tiddler in itself. No hash of the title
and host or anything like that. Doing so means that the identifier
has gained semantics and when it does, it isn't a _universal_
identifier any more, and in order for federation (migratory
tiddlers) to work they have to have identifiers that are universal.
> As Jeremy said the easiest way to use UUIDs would be, to use it as a
> tiddler title. All TW core functions will work quite well.
No, not at all. It is not the easiest, and it would break everything.
Because the uuid isn't there for
> [[prettyLink|0d9b98c0-5f73-45eb-ac4a-386d445905e3]] to make a tiddler
this
> <<list filter [tag[0d9b98c0-5f73-45eb-ac4a-386d445905e3]]>> will work
or this
It's there for identification. That's all. It's not a name nor an
address nor a label.
> If you don't want to use the tiddler.title as an UUID, you'll need to
> rewrite most of the core functions. But all this stuff has to be
> programmed. Since the underlaying system doesn't force you to do it,
> nobody will do it. It's as simple as that.
No, if the uuid a field, _nothing_ needs to change in tiddlywiki.
Nothing at all.
> <<list filter [tag[U-U-I-D]]>>
Why would you ever do this?
> I would argue that also a standard TiddlyWiki is dished out via some
> server, hence serving tiddlers in a predefined way.
I don't understand the meaning of this. Are you simply saying there has
to be a common format for tiddlers - we already have that, though it's
extensible of course (I doubt anyone thinks that's a bad thing).
> In other words, while of course one would expect there to be some
> client for editing tiddlers, it always is a server that delivers these
> uuid's, since they are stored in tiddlers and thus delivered in
> whatever serialization or representation is being used.
This primacy of servers seems like the wrong approach. The point of
UUIDs is that anyone can generate them. There doesn't even have to be a
server involved (think exchanging tiddlers via e-mail, thumb drives or
numbers stations).
> Consider this scenario: [...]
Unfortunately, I can't make too much sense of this either right now.
-- F.
>>> <<list filter [tag[U-U-I-D]]>>
>> Why would you ever do this?
>
> Because with uuids disambiguation would be based upon them and not
> upon titles.
Why? Adding a uuid _can_be_ for disambiguation within a tiddlywiki,
but it doesn't _have_to_be. In the use case we are considering
(federation, inter-wiki communication, etc) there's no requirement
that tiddlywiki's behavior change internal to itself. The uuid is for
asking "is this tiddler the same as that tiddler". Where/when that
question is asked is within our control, and need only happen at the
wiki bounary.
> So therefore, as Mario rightfully so points out... if uuids were just
> another field, then there would be no core support to make use of them
> in any of the standard makros or functions.
Yes, that would be intentional, to make the surface are of the change
contained and least impactful.
> So, in my thinking UUIDs could be used for everything. The
> tiddler.title's are "hollow words".
This would change everything about TiddlyWiki. The core code, hundreds
of plugins.
We don't want that do we?
Thus: uuid as a field. Low impact change.
> But if anyone can think of an assertion that can safely be made if you
> can identify a specific field as being a UUID, please tell me.
assert this.tiddler == that.tiddler
That's the _only_ assertion you can make with a real id. But that's
the one we want.
From that assertion you can't make many conclusions other than at some
point these two tiddlers came from the same place. Only once you know
they came from the same place can you then investigate (using
associated data) if the tiddlers are different revisions, have
different content, have traveled along different branches, etc.
I've been watching this discussion, and it sure doesn't sound like a
discussion about communications protocols (speaking as someone in that
business).
I've been remiss in not jumping in earlier to point out that at least
one obvious approach to a "tiddler-based communication protocol" is
simply to
- define an XML representation of a tiddler
- start from the Atom schema
- move Tiddlers around using Atom feeds (post using Atom Publishing
Protocol, read as Atom feeds, search w/ OpenSearch)
- done
Miles Fidelman, Principal
Protocol Technology Group, LLC
--
In theory, there is no difference between theory and practice.
In<fnord> practice, there is. .... Yogi Berra
> I've been remiss in not jumping in earlier to point out that at least one
> obvious approach to a "tiddler-based communication protocol" is simply to
> - define an XML representation of a tiddler
> - start from the Atom schema
> - move Tiddlers around using Atom feeds (post using Atom Publishing Protocol,
> read as Atom feeds, search w/ OpenSearch)
> - done
Something like this has already been asserted elsewhere in the thread,
and at least some portion of the participants has agreed to it in
principle. Which is why things then moved on to the question of how to
accurately identify tiddlers.
The sticking point on _that_ aspect of the discussion is when and
where to assign an identifier and what doing so means.
It's remarkable how familiar so much of this conversation is if you've
been through it before in other contexts.
You get people (I guess I'm probably one of these) who think that as
long as you can generate a good identifier all the rest kind of falls
out from being good about the web and existing protocols.
You get people who "believe" in XML and probably once thought XSLT was
going make everything okay and if we can get tiddlers to fit in that
world, all the rest kind of falls out.
You get people who lose focus from the original concept and start
talking about all the things that will be possible _locally_ if the
global functionality is achieved, distracting discussion from
actually achieving the local functionality.
Sun.
Nothing. New.
> You get people who lose focus from the original concept and start
> talking about all the things that will be possible _locally_ if the
> global functionality is achieved, distracting discussion from
> actually achieving the local functionality.
s/local/global/
That's almost a pun.
> My point about UUID's was that strictly speaking, you really need to
> know what it is that the uuid identifies, and that's a semantic issue.
Ah, okay, somewhere along the line I thought we had already gotten
past that. I think in relation to the need for revision identifiers
to be separate from identifiers for the tiddler which "has" those
revisions.
> I could imagine that a collection of tiddlers had the same value for a
> named uuid, because either:
>
> * they were different versions of the same tiddler.
This is what I was thinking. And those different versions may exist
anywhere (in a tiddlywiki file, on a server, on some other server).
In aggregate they are "the tiddler". How the resolution of all those
revisions is handled is a _different_ issue from identifying that they
are in fact the same tiddler.
> on two things:
> 1) What the tiddler-identifying id is named (simple).
> 2) What it means to have identified a tiddler. Not so simple. IMHO.
Yes.
> If, say, you receive a document that contains 42 more or less
> different tiddlers having 17 different uuids, what can be deduced
> about their relationships..?
> A plausible interpretation would be 17 tiddlers, some of which have
> several versions. You may of course choose not to accept such a
> document. Or try to figure out which is the current version - but
> don't assume that it's the one with the latest timestamp.
This is aligned with my thinking.
> Additionally I propose to add an optional journal or history field
> analogous to Ward's federated wiki (
> https://github.com/WardCunningham/Smallest-Federated-Wiki/wiki/Story-JSON
> ).
If you put the journal in the tiddler, then when trying to reconcile
a lot of forks you need to merge up the journal.
That's non-trivial. And what does it get?
> By just adding these fields nothing substantial has to change in the
> core. Nothing needs to change in the ui! and the use of tw.
>
> But these changes are building blocks for tiddler identification,
> server side integration and federation. Let's see how they are used.
>
> Keep it simple. Keep tw extensible.
+1
I had a think on how to bootstrap and also enforce uuids yesterday,
which led me to an important conclusion:
Assuming the tiddlywiki core did not get a uuid field extension, or
an old tiddlywiki interacted with a server:
* when the server first saw the tiddler
if tiddler is new in this context (not persisted on this server):
if a uuid field is included:
persist that field with the tiddler
else:
add a uuid field
if tidler is not new in this context:
if a uuid field is included:
replace it with the uuid of the stored tiddler
The idea behind this pseudo-code is that it would insure that
the server has authority about uuids: You can't give it false uuids.
However the only way this works is if the server can determine,
accurately, if the tiddler is new in a certain context, and in order
for it to determine that it must use something other than the uuid
as the identifier for the tiddler (in the tiddlyweb context this
would be bag.name and tiddler.title). But then you have clobbered
the capability for uuid's to transcend renames and similar actions.
So, if you want real ids they gotta happen at the birthplace.
(We mostly know that, but just reinforcing the point.)
1. While using IncludePlugin, one can have two tiddlers with the same
name in different documents (say, "Notes"), and also can desire to use
both (for instance, include "Notes" from a document about web-
technologies into the "Notes" regarding TiddlyWiki). In this case it's
enough to distinguish tiddlers by their *source*. Here are some
though.
It is desirable to have a "syntax" (formatters and macro definitions)
such that each link or transclusion macro can have a target outside
the document (smth like [[...|Notes]]@webTech like in TiddlySpace, or
[[...|Notes@webTech]]) and a "destination table"
|webTech|./web-technologies-learning.html|
|...|...|
which allows, besides other things, to *move* or rename a webTech
destination or even *change it to another document*. In this aspect,
it is about aggregation of tiddlers, not exactly their distinguishing.
Problems with distinguishing will occur if one would like to make a
non-distributed TiddlyWiki document i.e. import the external "Notes"
tiddler into the document.
2. Second use-case, or rather prospective is semantical versioning of
tiddlers. There's still no for managing system for multilangual
tiddlers or author's/public versioning of content. While this can be
done (rather awkwardly) using different tiddlers for each "version",
it creates many eclectic constraints and other problems, it seems that
the only proper way to implement such things is to have multiple text
areas in each tiddler.
It may be useful to keep this second one in mind for the protocal
design.