Back in 2004 (Mon, Nov 29, 2004 at 8:41 PM to be exact), I wrote Flickr asking if they could add sha1 hashes of user emails (in an obvious attempt to be able to convert the data into FOAF). Here's the original request email:

Hello,

Would it be possible to add a sha1 hash of a person's email address tothe response of flickr.people.getInfo ? I understand that we don'twant to give out email addresses, and it's nice that the API doesn'texpose them. But to help in uniquely identifying users acrosssystems, a good identifier is often their email address. To safeguard against spam, creating a SHA1 hash is a good way to hide theemail, yet still provide a unique identifier for the user.

This sha1'ed email address becomes a candidate key to the user, so to speak.

Thoughts?

Thanks!Seth

To which Stewart replied (and I have his permission to quote him):

Seth, I guarantee that the problem is not that we don't know how toprovide the functionalty - as you say, it's easy.

It's more that it has a lot of complications at the social level. Howdo you know whether any of our users *wants* their Flickr profile(potentially filled with cool, beautiful or emotionally importantfamily photos) to be associated with their Tribe profile (potentiallyfilled with descriptions of their kinky fetishes)? I know I don't wantmy professional profile on LinkedIn tied to my clownish profile onOrkut.

Remember http://beta.plink.org/ ? ... read about why it shut down. Alot of those lessons apply to us. I think Dan Brickley is a super guy,and I think FOAF is well intentioned. But I also think it has nothingto do with Flickr (or even Tribe/Orkut/Friendster/whatever).

Last, since approximately 0% of users want or care about thisfunctionality, it's not a good deal for us to implement it. It'd bereally neat if there were a machine-readable description of who I amand what I'm up to online tied to a single idetifier, enablingsoftware that could make all kinds of inferences about me and tie allkinds of facts about me together. On the other hand, that would reallysuck. If you know what I mean.

We don't even want to get into explaining to people what this is, letalone build a UI to allow them to opt out, etc., etc.

I appreciate your enthusiasm, and I know you're coming from the rightplace, but it's just not something we're willing to support right now.(And you can quote me if you'd like ;)

- Stewart

So, at least back in 2004, Flickr was concerned about making it too easy to "connect the dots". I wonder if this still holds true today? Is anyone else worried about this?

I can certainly see Stewart's point. But I bet with some solid privacy controls, or as Stewart puts it, "opt in" controls, I think a middle ground could be found. Like it or not, sooner or later there will be systems to tie it all together anyway. Might as well preempt it all and put the power into the hands of the users.

In which I port a snazzy little JavaScript audio web app to Dart, discover a bug, and high-five type annotations. Here's what I learned.

[As it says in the header of this blog, I'm a seasoned Dart developer. However, I certainly don't write Dart every day (I wish!). Don't interpret this post as "Hi, I'm new to Dart". Instead, interpret this post as "I'm applying what I've been documenting."]

This post analyzes two versions of the same app, both the original (JavaScript) version and the Dart version. The original version is a proxy for any small JavaScript app, there's nothing particularly special about the original version, which is why it made for a good example.

Three new language features just landed in the latest dev channel build of the Dart! Collectively known as null-aware operators, these new features will help you reduce the code required to work with potentially null objects.

I'm excited for these new abilities, because typing less is always a good thing. Read on to learn more, and be sure to try these new features on Dart Pad.

??
Use ?? when you want to evaluate and return an expression IFF another expression resolves to null.

exp ?? otherExp
is similar to

((x) => x == null ? otherExp : x)(exp)
??=
Use ??= when you want to assign a value to an object IFF that object is null. Otherwise, return the object.

obj ??= value
is similar to

((x) => x == null ? obj = value : x)(obj)
?.
Use ?. when you want to call a method/getter on an object IFF that object is not null (otherwise, return null).