(picture)

March 22, 2003

Offa's Gold

Apropos nothing, I stumbled across this fascinating piece of British history while helping with some homework research. King Offa of Mercia (757-796 AD, most famous for his Dyke, and for the silver penny which remained the English standard for 600 years) also minted a gold coin with the inscription "There is no God except Allah... Muhammad is the Apostle of Allah". Here's a picture.

March 19, 2003

Shrub's Rubicon

Robin Cook's resignation speech and letter says it best.

Britain is being asked to embark on a war without agreement in any of the international bodies of which we are a leading partner - not NATO, not the European Union and, now, not the Security Council.

To end up in such diplomatic weakness is a serious reverse.

Only a year ago, we and the United States were part of a coalition against terrorism that was wider and more diverse than I would ever have imagined possible.

[Iraq] probably still has biological toxins and battlefield chemical munitions, but it has had them since the 1980s when US companies sold Saddam anthrax agents and the then British Government approved chemical and munitions factories.

Why is it now so urgent that we should take military action to disarm a military capacity that has been there for 20 years, and which we helped to create?

Why is it necessary to resort to war this week, while Saddam's ambition to complete his weapons programme is blocked by the presence of UN inspectors?


Unilateral preemptive war by the US delivers a stinging blow to its friends and allies. What future for a United Nations, when there's a single, overwhelmingly powerful superpower? Here is GWB's Rubicon.

I only hope that the USA brings to its assumed role of global Imperator a modicum of wisdom. It's not just about making the homeland safe for big business, lining the pockets of friends and family, and wreaking vengeance on some while still shrinking from real and present danger. My kids are in this world. I'd like them to grow up with a feeling of proud internationalism. Today, there seems little chance of that.

March 13, 2003

Community

Somehow I missed Jon Udell's piece "the future of online community" last week:

What's broken, for me, is the idea that an online community is a place where people gather, and a centralized repository of the discussions held in that place. In that model, I've concluded, the costs are just too high. It's expensive to join. It's expensive to participate, because interactive discussion demands a lot of attention. And it's expensive to leave, because the repository has your data
Interesting, because today I happened across this old Habitat paper again: one of the places to begin. Centralised, of course (like, say, DAoC - another community evolution of sorts).

The weblog model indeed reduces Jon's costs. But there's still a barrier to entry, whether it's in technical knowhow or just in the willingness (or rash brashness) to commit trivia aloud.

Prerequisite: move control down to the user. Some time - the sooner the better - I'll have to ditch this webserver (or at least make it less central), put my weblog onto my laptop and home PC (and share my photos from the same place). I'm thinking of maybe doing that with GWS. That way I can bridge the modalities (googler, occasional visitor, regular, correspondent, collaborator, friend).

Any suggestions how?

Stunning

Code in motion. Animations of the Linux source depenencies over time. (via Interconnected).

(A while ago I wondered about using QViz (mirrored here) for this sort of thing. It would suit really well - needs good 3d hardware, but it's a powerful tookit. Inter alia).

March 12, 2003

Weinberger interviews Reed for Salon

The myth of interference.

It's clear in speaking with Reed that he's frustrated. He sees an economy that's ready to charge forward economically being held back by policies based on the state of the art when the Titanic sank. (That's literally the case: The government gave itself the right to license the airwaves in 1912 in response to the Titanic's inability to get a clear help signal out.) ...Says Reed, "when a new Super-Frabjoulous Ultra-Definition TV network broadcasts its first signal, the first bits it will send would be a URL for a Web site that contains the software to receive and decode the signals on each kind of TV in the market."

PopG weblog

PopG -- purveyors of centralised decentralised-collaboration services using Groove, which is pretty bleedin' awesome in its way -- weblog. Looks like Charles is finding his online voice.

I first met Charles when he called me about PinBoard: he had a few performance problems with an early version. Then I realized: a space with twenty pinboard tools, each with a dozen stickynotes, each with 20k of text. Wow.

And, I first met Andy in an Oxford pub...

JavaScript objects

Well. Isn't JavaScript just so unfashionable? It's slow, has a lazy garbage collector (too lazy for some of the strict-lifetime COM work we'd like to do), and there are a few really bad pitfalls in the syntax (for example, not requiring semicolons at the end of a statement).

But still, it's incredible. Here's a start at saying why.

Object == hashtable

So, the first (and probably the most important) thing is: everything (approximately) derives from "Object", and an Object is a hashtable. That is, a container for named values. Anytime you like, you can add new members into the hashtable.

Arrays are hashtables. Functions are hashtables. Strings are hashtables. Numbers are hashtables. And so on.

These pairs of statements are identical:

var a = new Object();
var a = {};

You can construct a whole hashtable at once with curly-braces and colons:

var a = { "Name" : value, "Thing" : somethingElse };

Secondly, the "dot" notation is the same thing as a hashtable lookup. There's another syntax for that: square brackets. So these are the same:

a["Thing"] = somethingElse;
a.Thing = somethingElse;

There's also a kinda-hidden "global object". If you're at the main path of a program, outside all the functions, you can usually get to it with "this". Everything you declare at global scope -- global functions, global variables, and so on -- ends up as a property on the global object. Which is a hashtable, of course.

Wild, huh?

Groove Web Services

I finally spent a little time playing with Groove Web Services. It's really good. A few rough edges, and not nearly enough features of course... but this is one of the most straightforward and elegant APIs I've ever seen.

I took the route of implementing a pure-JavaScript client: no WSDL parser, no infrastructure apart from XMLHTTP and XML DOM. Turns out, JavaScript is easily capable of building up interface abstractions at whatever level you need. So my code includes things like this:


with( _class( "GrooveDiscussionData" ) )
{
_implements( GrooveSOAPInterfaces );
_implements( Subscribable );
_property( "EventClass", "urn:groove-net:DiscussionEvent" );
_method( "Create", SOAPCall( "Discussion", "http://webservices.groove.net/Groove/1.0/Discussion#Create" ) );
_method( "Read", SOAPCall( "Discussion", "http://webservices.groove.net/Groove/1.0/Discussion#Read", "GetEntries" ) );
_method( "ReadEntry", SOAPCall( "Discussion", "http://webservices.groove.net/Groove/1.0/Discussion#ReadEntry", "GetEntry" ) );
_method( "UpdateEntry", SOAPCall( "Discussion", "http://webservices.groove.net/Groove/1.0/Discussion#UpdateEntry", "IsNoFault" ) );
_method( "DeleteEntry", SOAPCall( "Discussion", "http://webservices.groove.net/Groove/1.0/Discussion#DeleteEntry", "IsNoFault" ) );
_getter( "Entries", GetEnum( "./DiscussionEntry", GrooveDiscussionEntry ) );
_getter( "Entry", GetOne( "./DiscussionEntry", GrooveDiscussionEntry ) );
}

which means I can call it using code like this - which I think is even more compact than the using equivalent WSDL proxies which .NET will generate for you:


var pToolData = pTool.GetData();
pToolData.Subscribe( MyEventCallback ); // listen for any changes
var pDataEnum = pToolData.Read();
while( pDataEnum.HasMore() )
{
var pData = pDataEnum.OpenNext();
// create the simplest possible interface widget pLI as a LI in a UL (done elsewhere)
pLI.innerText = pData.GetSubject();
pLI.style.listStyleImage = pData.GetUnread() ? "url(Unread.ico)" : "url(Blank.ico)";
}

I recommend to everyone with even the vaguest interest in software development and Groove to take a look at GWS. The web services GDK and documentation will get you started in no time.

March 10, 2003

InfoPath

Clemens Vasters has been using Infopath...

March 09, 2003

A tough week...

...and I have very mixed feelings, which makes it incredibly hard to write about, but I can't just be silent. Bittersweet, says Paresh, which about sums it up. Lots of coworkers lost their jobs at Groove. But at the same time there's a strong (and seemingly much more secure) future ahead for the company.

No doubt about it, this cut bone - some of the best people I've ever worked with. Several I'll miss intensely. Good luck, and keep in touch.