Day by day and almost minute by minute the past was brought up to date. In this way every prediction made by the Party could be shown by documentary evidence to have been correct; nor was any item of news, or any expression of opinion, which conflicted with the needs of the moment, ever allowed to remain on record. All history was a palimpsest, scraped clean and reinscribed exactly as often as was necessary.
George Orwell, 1984
Or not.
Source code. Rough code, badly documented
. Requires Python 2.2, MySQLdb, Cheetah, Movable Type 2.6x running off a MySQL database, and the ability to run cron jobs (I run history.py once a minute to update the revision history database). GPL-licensed. Ask questions in the comments or by email.
§
Completely. Missing. The. Point.
Look at the revision history.
— Mark ![]()
And that’s Godwin, not Goodwin.
http://info.astrian.net/jargon/terms/g/Godwin_s_Law.html
— Mark ![]()
“Completely. Missing. The. Point.
And that’s Godwin, not Goodwin.”
Cut me a break its past midnight! ;)
— MikeyC ![]()
Okay I didn’t see the revision thing…font too small…acknowledgement of revision…accountability…got it…but you throw in a passage from 1984 and what do you expect people to think when they are half asleep… ;)
— MikeyC ![]()
[applause]
— sleeper ![]()
Nice.
— Lach ![]()
Nice implementation. Care to publish the code?
+1
Revision history, so what? This is so trivial and obvious.
See, “font too small” is useful feedback. Changed it to same size as everything else, but italic. Better?
— Mark ![]()
Code is coming, but it’s not for the weak or the masses. Python directly querying Movable Type’s tables in a MySQL database. Code irreversibly intertwingled with layout (thanks Cheetah for making it so trivially easy to mix them!) and everything specific to my environment.
— Mark ![]()
“Changed it to same size as everything else, but italic. Better?”
Nah its still not obvious enough…
How about: {text-decoration:blink !important;}
;)
— MikeyC ![]()
So, supposing I wanted to be able to compare other XML feeds for diffs with highlighting via a web interface. How could I do it?
I don’t need your code line by line if you’re not prepared to release it; rather, I’m just after a logic walk-through. We grab a feed and isolate entries, (storing each entry in a databse?). When we next grab the feed, we compare posts (with the same permanent link? the same pubDate?) and look for diffs and highlight. I just need a little more specifics before I could roll my own.
— Lex ![]()
Interesting. I was just talking to my roommate about the ability to track changes in weblog posts and whether it would be a useful feature or not.
The problem is, of course, that unless there is an unbiased and unaffiliated party tracking the changes, then the revision-list history of posts is only as trustworthy as those managing the system – in your case, only as trustworthy as you.
Regardless, very interesting indeed.
— Dan ![]()
Oh, comment-posting-temporal-overlap. Damn CPTO.
— Lex ![]()
Steve: bwahahahahaha.
The thing is, though, you’re right. It *is* obvious. Many wikis do it (like MoinMoin, which we’re using for the Atom project). Many high-end CMSes do it. Operating systems have done it for decades (cough, VMS, cough). Why not weblogs?
(It was also trivial to code. A few hours tops, and most of that time was spent dicking around on IRC, er, I mean planning.)
— Mark ![]()
Mark, I’ve noticed that in the last few minutes you’ve changed the layout of the revision markers (added/deleted/changed)…
Perhaps a revisions page for the revisions page is in order?
Okay enough jokes…i’ve gotta go to work in less than 6 hours…damn you Mark and these late night postings!
— MikeyC ![]()
Dan: yup, I still have “god mode” over the database and the server its on, so this doesn’t solve the integrity problem in the long run. But it adds transparency in the short run; assuming you *already* trust me, you can use this to get more information from me than before. And if you’re not sure whether to trust me, I’m giving you *more information* with which to decide. (If you already think I’m the spawn of the devil, well, buh bye. Don’t bother to write. I’ve gotten enough hate mail from clueless sheep this week.)
I promise never to muck with my own revision history. It’ll get messy, especially on those long linkdumps (where I may add new links to the same entry 5 or 10 times throughout the day). But it’ll all be there. The script checks for updates every 60 seconds. As long as I keep the script running and the history available, I promise I’ll never muck with it.
— Mark ![]()
MikeyC: I haven’t made any changes in the past few minutes. Most likely, your browser is finally getting around to refreshing the CSS stylesheet.
— Mark ![]()
Surely you used the standard library difflib
(http://www.python.org/doc/current/lib/module-difflib.html)? ;-) Its algorithm is a bit different from the standard unix diff and the like. The algorithm even has that used-to-be-buzzword-but-no-more, “gestalt”, in its name.
Jarno: yes. Actually I’m using Aaron Swartz’s diff.py, which is an easy-to-use wrapper for using difflib on HTML.
http://www.aaronsw.com/2002/diff.py
— Mark ![]()
Back in the Don Park thread, I wondered whether you’d be willing to apply the same technology to your own weblog. I guess this answers my question…
This all looks technically nice and interesting, but what does this have to do with accountability?
Mark you wrote: I promise never to muck with my own revision history. It’ll get messy…..
The beauty of the print industry is the static nature of publication — but they have editors who respond, invariably, with a corrections column. Even those cases are based on an element of trust.
I can understand the fascination when someone on his/her personal site decides to publish something then revises it, to change tone or content. Monitoring that is smart if we can trust the arbiter — the changes are made, the original is lost, the monitor logs both. Couldn’t the log be manipulated? You alude to that. Historical engineering can happen on both sides.
I suppose my point is of the ‘who watches the watchmen’ ilk, and since you say it’s a matter of trust then that’s fine.
On an objective slant this is not accountability since you’re making yourself accountable through a system *you* control. Whether I or anyone else trusts you isn’t the point. Accountability only matters to the people who would like to hold you to your words, and by their nature they probably don’t trust you. Maybe you should revise the title: Dive Into Mark’s Accountability.
hmm… Dave Winer == Big Brother?
I see your point Mark (if that is your point), but the difference is that Dave has no actual control over your life. Some might suggest that ‘Winer Watcher’ was a form of Big Brother…
“Goodwin postulated that as the length of a discussion thread grows, the probability approaches one (1) that one participant will introduce the terms “Hitler” or “Nazi”.”
…i’d add ‘Orwellian’/1984 to that list.
— MikeyC ![]()
“then the revision-list history of posts is only as trustworthy as those managing the system – in your case, only as trustworthy as you.”
The difference, i think, is that if you were caught playing dirty there really could be no excuse and your credibility would be entirely shot. Currently Dave hides behind the “I publish at 10pm” disclaimer so he feels that he can revise at will… like it or not it is a reason… playing dirty with your list of revisions is something 1,000 worse. Someone would eventually call you on it.
— MikeyC ![]()
The only alternative, Gummi, is a system like the Winer Watcher (run by a third party), and we’ve all seen how well that went over (Danger! Falling lead balloons! Though I don’t think that Mark would have the same reaction to such a system turned on him as Dave did.)
Personally, I trust Mark when he says that he’s not going to muck around with his revision tracking. I think that even offering such a service on a personal weblog is a pretty brave step forward.
— John ![]()
This is a feature I think many people would welcome in feedster. They already have the rss cache; this is a logical extension of that. I think we will see this in feedster real soon, if Mark doesn’t go and patent it or something :)
— phyx ![]()
Maybe this quote from 1984 would be more appropriate:
“With those children, he thought, that wretched woman must lead a life of terror. Another year, two years, and they would be watching her night and day for symptoms of unorthodoxy. Nearly all children nowadays were horrible. What was worst of all was that by means of such organizations as the Spies they were systematically turned into ungovernable little savages, and yet this produced in them no tendency whatever to rebel against the discipline of the Party. On the contrary, they adored the Party and everything connected with it. The songs, the processions, the banners, the hiking, the drilling with dummy rifles, the yelling of slogans, the worship of Big Brother — it was all a sort of glorious game to them. All their ferocity was turned outwards, against the enemies of the State, against foreigners, traitors, saboteurs, thought-criminals. It was almost normal for people over thirty to be frightened of their own children. And with good reason, for hardly a week passed in which The Times did not carry a paragraph describing how some eavesdropping little sneak — ‘child hero’ was the phrase generally used — had overheard some compromising remark and denounced its parents to the Thought Police.”
Since manilla obviously doesn’t support a revision history, maybe Dave could just put something like:
Update: I changed blah blah blah.
at the end of his posts when he changes it. Personally, I think he just has a fear of commitment. He doesn’t want to commit to being as accountable as most professionals are.
The idea of getting post diffs is probably better applied in aggregators. Like others have commented, automated versioning doesn’t make others accept your accountability when you’re the one who controls the switch and can turn it on and off.
But it would sure make it easier to handle something like this: http://corky.net/dotan/log/2003/04/08.html#001222
(for those who don’t care to follow the link, it’s a post where I offended someone, he flamed me in the comments, and I later modified my post, while trying to keep the original text so that his offended comments would still make sense).
— Dotan ![]()
That’s a long weekend project! [ http://diveintomark.org/archives/2002/12/27/pushing_the_envelope.html ]
I did something like this over at http://waffle.wootest.net/past/000339.php although not quite so `diff`-ish.
— Jesper ![]()
Mark: “If you already think I’m the spawn of the devil, well, buh bye.”
No worries. Spawn of a lesser demon I could quite accept, but definitely not the devil. (wink).
Mark: “I promise never to muck with my own revision history.”
Good enough for me. But then, it was good enough for me before. Now it’s just more interesting.
Also, maybe I’m a dirty liar, but didn’t you have a per-post RSS feed available that would aggregate all the comments to a particular entry?
— Dan ![]()
Hey Mark, I can’t seem to reconcile this:
“[Last updated at 1:25AM on July 18, 2003 · revision history]”
with
“There are 2 versions of this post:
2003-07-18 12:09AM
2003-07-18 12:05AM”
If it was last updated at 1:25AM, shouldn’t there be a version from 1:25AM?
— Dan ![]()
Dan: He could have updated it without making any changes, like saving the entry as a way to force a rebuild without having to use the rebuild popup.
— Jesper ![]()
Ok, I just caught up on the feedster guy’s blog, and see he’s decided to _not_ implement rss diffs for the time being. Pity.
— phyx ![]()
A very nice proof-of-concept. Just because diffs work on Wikis doesn’t necessarily mean they’ll work, or have any value on blogs. I think you’ve nicely demonstrated they can be useful. I’m sure we’ll see this as standard functionality on the more sophisticated blog tools before long.
Shelley is dead right about perspective.
re: comment 28, Dave.
I made it explicit that trust is not an issue for people who obviously trust Mark. It falls down when it becomes a matter for people who don’t trust him. Whether I do or not is beside the point, it holds no consequence regarding my comment.
If the idea is to show changes and evolution of posts then that’s fine. When it becomes an accountability machine then it patently isn’t. Where’s the independence? Lets use an analogue, what would a person who knows nothing about Mark or his motives think? Please don’t take this the wrong way, but objectivity is the key of accountability.
Quoting Orwell is fine, posit: calling the machine a measure of accountability when its under the control of the person it’s watching could be considered Orwellian in itself.
Perspective is the right way to go.
Wouldn’t it be possible to create a post checksum based on a single post? You’d have to avoid using the tags so that a layout change wouldn’t corrupt it, but if different applications had a way of keeping track (such as RSS readers) it would be a way of keeping a revision history without storing the whole page. You could track more sites this way (drawback being that you couldn’t see what was changed, just be alerted to the fact that it had). Another solution might be for somenoe like technorati to implement it, as then it would apply to a lot of people quickly and easily. Everytime the checksum changes, the post has been edited.
I’m not as technically savvy as the rest of you… What are the drawbacks to something like this? Besides the fact that everyone is vehemently against having their edits publicized.
Here’s the deal with the last modified date:
It’s MTLastModified (thanks Kevin), so it’s maintained by MT and can never get out of date. That’s a good thing, except that MT updates the entry_modified_on column whenever I save the entry, whether or not there are any changes. I thought about it and decided *not* to display these in the revision history, because it’s not useful for my purpose. The purpose of the revision history is to show when the text /changes/, not just when I click ’save’.
For example, when I moderate comments, I have to click ’save’ to rebuild the entry afterwards. At some point I’ll close the comment thread, and that will require another ’save’. And so forth.
I should either make this clear, or remove the MTLastModified display altogether and just rely on the separate revision history page. Since the system is hacked in and not-quite-real-time (updates on a cron job), I don’t think I can get a perfectly accurate date-of-actual-last-modification-of-text on the entry page. Which, given the nature of the feature, will obviously lead to conspiracy theories.
— Mark ![]()
Re:Dan (35): Mark’s feed of comments is only for the most recent blog entry. Luckily, feedster archives it all and makes it searchable, even across many posts:
http://www.feedster.com/drill.php?id=32148
— phyx ![]()
This is about taking the pledge not to be a Winston Smith, not calling someone else “Big Brother”. I suspect that Mark is quoting Orwell to illustrate where the bottom of the “depublication” slippery slope lies, not to make veiled slanders against he-who-must-not-be-flamed.
—Orwell? For God’s sake man: get over yourself! It seems you needed to be reminded of The Golden Rule. Now move on.—
I think some of you need a refresher course in allusion. Haven’t any of you said that you were “slaughtered” in a competition of some sort, or remarked that finishing work that day was a “Sysiphean” effort?
Gummi: Hypothetically, if Mark was dishonest in his revision history, I’m sure somebody would notice, and if they cared enough, they could set up a “Pilgrim Watcher.”
— anode ![]()
OK, I tried a couple of different things to get the dates to match up, but I can’t do it. MT just doesn’t store the date-of-last-modification -to-this-particular-field, and I can’t reliably hack it in. So now it just says “revision history”. The history is still just as complete; it tracks changes to the main entry text, nothing more. If I change categories or moderate comments or change excerpt text or add keywords or just go in to the entry and save it for no reason, that doesn’t create a new revision.
— Mark ![]()
Re: comment feeds. This is slightly off-topic, but OK. I have never had per-item comment feeds. I have one main comment feed at http://diveintomark.org/xml/comments.xml which lists the most recent 15 comments to any post. Today there is only one post that has comments enabled, so that’s the trivial case; other days there have been multiple discussions going on at once, and the comment feed will track comments in all of them.
Unlike Sam’s comment feeds, mine only include comments, not trackbacks. This might be a simple change since I’m using MTSimpleComments, I should look into it.
— Mark ![]()
Several people have commented that the owner of a blog has control over the revision history just as easily as the entry itself. While that’s true, the conclusion that it’s impossible to have accountability in that environment is incorrect.
RFC3161, Internet X.509 Public Key Infrastructure Time-Stamp Protocol, lays out the principles for a Time Stamping Authority, but folks like http://time.certum.pl/ make it available to the common folk, for free.
Certum takes a GET/POST with a field ’sha1′, time-stamps it, and returns an RFC3161 application/timestamp-reply (an ASN1 blob). A requestor need only find a format that can be sha1sum’ed by themselves and others, then Certum notarizes it as having been summed at a certain time.
I would like to note, for the record, that the comment of Dan’s that I referred to as (35) before is now numbered (34), because Mark deleted a post I made above it, shifting all of the numbers after it down one. My deleted post is archived at http://nonymous.org/data/mark302.txt for posterity, or something. I’m saddened, Mark. I really liked your red line technique, and deleting legitimate comments really sucks.
— phyx ![]()
Mark, how about using <MTPerlScript> to grab the latest revision’s date and time from whatever the revision history grabs its data from?
— Jesper ![]()
phyx: my comment policy is *really quite clear*. Off-topic comments are deleted without warning. Asking about link redirection in a thread devoted to a new revision history feature is off-topic. I’m letting your second comment stand, just so I can make this point publicly and not fuel any further conspiracy theories. Any further comments on this topic will be deleted without warning.
If you want to ask me about something I’m doing on my site, I’m happy to answer questions via email.
— Mark ![]()
re:comment 47, anode.
I’m sorry, maybe I’m not making it very clear, or if I am it’s of no consequence.
The question is not whether Mark will be dishonest, it’s a question of he *could* be dishonest. The capability exists. In a similar vein, a Pilgrim Watcher would have the same problem. In both cases the tools would not be a good measure of accountability. Just because I mention the words Mark and dishonesty in the same sentence it doesn’t mean I believe they belong together, others may.
The feedster idea could have been a better measure along these lines. If you needed it.
I could have sworn Mark was talking about our old boy George W Bush. We see what we want to see I guess. RSS feed / deleted posts / unlwaful regimes in a democracy – same diff.
— Emily ![]()
If I could spell, it would have read “UNLAWFUL” – but it looks strangely like “awful” so that’s ok too!
— Emily ![]()
Bravo, Mark. I think the revision history option is wonderful. I’m building my own blogging system (sick of Blogger’s lack of development—it’s just not robust and doesn’t seem to be getting robust anytime soon) and I’m definitely going to squeeze that feature in. Not for me, of course, because I always clearly demarcate any changes, but I’m taking someone else’s blogging system as a base and modifying the hell out of it.
As for the quote, that pretty much sums everything up.
http://diveintomark.org/cgi-bin/history.cgi?id=2329
My brain just shorted out–this is so damn cool.
Nicely done.
— Ethan ![]()
As much as I’d love to continue this discussion, I’m getting on a plane in 2 hours, and I always prefer to close the site to new input while I’m travelling. I’ll open it up when I’m home safely. Cheers.
— Mark ![]()
Oh. Good. Lord. Quoting 1984 because of this whole thing when we’re in a country that is about to prosecute men on an island somewhere that this country has labeled terrorists. Who have been denied due process of our laws. Who has arrested people in this country on circumstantial evidence. Who get records from the library to see what we read. I wrote the following in another comment:
Mark sees himself as the persecuted crusader seeking justice in a world controlled by one man. But Mark’s actions give the control to the one man, and becomes himself the controller through his use of technology.
Not thoughtful discussion, not honest rage, but mindless automation is Mark’s weapon, his spear, his quest for truth. And the masses look at him in awe as some harbinger of What is Right — when he is really nothing more than the other side of the same coin.
In other words — give me a friggen break. George Orwell because webloggers edit? Quoting 1984 because of Dave Winer shenanigans? Mark, what a compliment to Winer. The ultimate compliment — you gave him ultimate power.
Folks, get a life and a sense of perspective comes to mind about now. I’ll post this in Mark’s comments. I wonder if it will be deleted (Ah, yes. Mark deletes comments he considers an attack — bad form for a crusader, don’t you think?)
I’m home safely. Code is up. Comments are on.
— Mark ![]()
Next step: Public Revision History web service which one pings whenever an entry is changed?
Unfortunately, that’d require changes to MT since it will only send pings automatically when an entry is first published.
— Tomas ![]()
Kevin (of staggernation.com) tells me that MT plugins can hook in as an entry is being created, and could probably do enough to produce a real-time revision history (as opposed to what I’m doing, which is polling the database for changes every 60 seconds). Presumably such a plugin could also check that the entry being edited was on the front page, and then call the ping routine to ping whatever pingable services had been configured.
Or I could just be talking out of my ass. Yes, that seems more likely.
— Mark ![]()
Mark:
I really like the revision history. It’s a nice touch regardless of how difficult (or not) it was to implement.
Shelley:
Circumstantial evidence does not equate to weak evidence. I’m not taking a position on either side of your argument, just pointing out a slight problem with your argument. Sometimes circumstantial evidence is extremely strong and people are sent to prison because of it every day.
Tomas, those services already exist, they’re called Time Stamping Authorities (RFC3161). Details for easily using TSAs with ordinary weblogs at:
For those looking for feed history, Syndic8 stores snapshotted copies of a feed’s content, taken 2 to 4 times per day, for 3 weeks.
Great concept, particularly for monitoring news organization sites who are always falling over themselves to publish news first (often at the expense of accuracy). Would have been great to have something like this on 9-11 keeping track of all of the reports with inconsistencies that I saw live but that were never mentioned again.
As far as monitoring Dave Winer is concerned, I’m not sure that many people really care. I’m sure the page will get a lot of hits from people curious to see how it works, but few are gonna be checking it regularly.
As far as what it does to the monitored poster: I don’t think something that makes someone think a bit more carefully before choosing words is really such a bad thing. If we were publishing to PAPER instead of the web, we’d make darn sure our thoughts were in order, spelling and grammar correct, etc. It seems that publishing to the web just lets us be a little bit sloppier/impulsive. Realizing that our errors may be caught for posterity only gives us more incentive to get it right the first time. I don’t see how it can be construed at evil or something terrible to do to our neighbor, particularly if our neighbor is in the habit of saying he didn’t say things that he in reality did say.
Confused yet?
: )
The “revision history” concept is worthwhile, but the flap about the “Winer Watcher” wasn’t about the technical merits of revision tracking. Looking at it from the standpoint of enforcing accountability is only one side of the coin; the other side is that it prevents someone who has that accountability forced upon them from ever reconsidering their words. Sometimes an addition isn’t enough: if you’ve posted something in the heat of anger, perhaps, and you’ve said things you regret, you can’t take them down.
If we’re to leave Mark Pilgrim’s personality out of this and abstract it, that means we have to leave Dave Winer’s personality out as well–as well as his record in revision without notation. The tool itself and the concept for tracking revisions on weblogs is fine, but the tool doesn’t address the ethical issue of whether one person should track someone else’s website, without their consent, to highlight all changes made. I don’t recall ever deleting a post on my own weblog nor making any substantive edits, but if I learned someone–particularly someone I might have had public spats with in the recent past–was tracking my words that closely, I would be pretty uncomfortable.
I have no idea what this amounts to, but I’ll throw in an orwellian reference by saying Mark’s work is “doubleplusgood” ;)
— Adrian ![]()
I agree that while Winer Watcher per se has little value to most people (and great value to an ever growing niche) the idea has broader application.
Monitor governemnt websites for changes in content. Monitor the HR page @ yourcompany to see when those policies change. Specific to blogs, as more and more politicians use them as a tool, the ability to monitor edits becomes a valuable tool for muckraking.
And the merits of monitoring FoxNews or the NY Times for edits in stories are self-evident.
Suggestion: how about only displaying the [revision history] link when the post has been edited at least once? Even better, how about [2 previous revisions] (or listing the number of previosu revisions in a title attribute of the link).
As alluded to earlier, the revision history system is completely seperate MT, so I can’t offer better affordances (like counting the number of actual revisions). If some kind soul (*cough* Kevin Shay *cough*) who knows Perl better than I (not hard) would come up with a similar system as an MT plugin, we could get better affordances.
— Mark ![]()
On re-reading, that sounds unspeakably rude. In my defense, Kevin *did* express interest (via email) in writing such a system. If my Perl were better than “um, that’s a for loop, right?” I might attempt it myself. Alas.
— Mark ![]()
The LastModified plugin has an MTIfModified tag that will display conditionally if the entry’s modified date is different from its creation date. That doesn’t mean a change was actually made (see #34 and #42 above), but you could put the Revision History link in it and it wouldn’t display if a post has never been re-saved–in other words, you’d still get some false positives, but no false negatives.
Mark, I should have some code to send you by tomorrow. Hadn’t thought about including a template tag to display the number of revisions, but it’s a good idea and should be easy to stick in…
— Kevin ![]()
Small bug:
I always thought it’s a shame INS and DEL can’t be “embedded” in things like list items. Luckily, XHTML 2 solves that.
— Jan! ![]()
Any chance of a decent url for the revision history? Something like http://diveintomark.org/archives/2003/07/18/dive_into_accountability/revision_history/
or seomthing?
interesting
— peja ![]()
I am no longer accepting public comments on this post, but you can use this form to contact me privately. (Your message will not be published.)
§
© 2001–9 Mark Pilgrim