Ann Arbor’s public schools are thinking like the web

As I review and improve the elmcity hubs in selected cities, I am again reminded of William Gibson’s wonderful aphorism: “The future is already here, it’s just not evenly distributed.” Yesterday we saw that the future of community calendars hasn’t yet arrived at the University of Michigan. But today I was delighted to see that it has arrived, in a big way, for the Ann Arbor public schools. Almost all of them, it turns out, are making good use of Google Calendar to publish machine-readable calendar information. This morning I rounded up thirty of those calendars and added them to Ann Arbor’s elmcity hub, bringing the total number of feeds from 194 to 224.

Here’s the breakdown of the 309 events from the grade schools:

Abbot Elementary 8
Allen Elementary 13
Angell Elementary 7
Bryant Elementary 29
Dicken Elementary 118
Eberwhite Elementary 19
Haisley Elementary 25
Mitchell Elementary 23
MLK Elementary 12
Pittsfield Elementary 5

And the 322 events from the middle schools:

Clague Middle School 28
Forsythe Middle School 71
Scarlett Middle School 15
Slauson Middle School 181
Tappan Middle School 33

And the 966 events from the high schools:

Community High School 67
Huron High School 396
Pioneer High School 294
Skyline High School 210

Among grade schools, Slauson is notable not only for the number of events but for the exemplary self-categorization applied to them. When you click the Google Calendar subscribe button on the Slauson calendar page here’s what you’ll see:

This is a best practice I wish everyone would adopt. It illustrates the seventh of my seven ways to think like the web: #7: Reuse components and services. The Slauson calendar is both a user of other services (the district-wide calendars) and a provider of services. And as a provider, it understands the idea of componentization. In an era of abundance it costs no more to create and manage a dozen calendars, using free services like Google Calendar and Hotmail Calendar, than to jam everything into a single calendar. The benefits are manifold. They include:

Delegation

In most schools and businesses, maintenance of “the” public calendar is one person’s job. That person becomes a bottleneck. When you recognize that logically there isn’t one public calendar, but instead several or many, each with its own appropriate maintainer, then you can break that bottleneck.

Precision

A parent who subscribes to a single undifferentiated school calendar may be overwhelmed by the flow. Parents of kids who are in music programs, or on sports teams, or who are going on the Chicago trip, should be able to focus on those activities.

Scope

Slauson Middle School is part of the larger Ann Arbor community. When Slauson’s calendars are self-categorized, they can align with community-wide views. Here’s a picture of some sports-related activites in Ann Arbor on November 17th:

Slauson’s publication of a set of self-categorized machine-readable calendar feeds enables it to represent its sports activities on a city-wide timeline that includes, in this particular view, events from the Ann Arbor Triathlon Club, the Wolverines basketball teams, and Ann Arbor’s kickball Meetup group.

Well done Slauson! And kudos to all the Ann Arbor public schools. You have become web thinkers. I hope schools everywhere will learn from your example.

Long live Harry Tuttle!

Here’s one of my favorite scenes from the movie Brazil,

Sam Lowry (Jonathan Pryce): Are you from central services?

Harry Tuttle (Robert De Niro): Hah! They’re a little overworked these days. Luckily I intercepted your call.

Sam Lowry: Can you fix it?

Harry Tuttle: No, but I can bypass it with one of these.

Back in 2003, my InfoWorld column APIs, protocols, and rogue plumbers made three points:

  1. The web of data shouldn’t require the services of Harry Tuttle.

  2. Unfortunately it still does.

  3. Fortunately the web’s architecture (a series of tubes) enables Harry to intervene when he must.

Those points are all still valid in 2011. From time to time I still have Harry Tuttle moments. Today’s involved the campus events system at my alma mater, the University of Michigan. In the current phase of the elmcity project I’m rebuilding hubs in various cities in order to dramatically beef up the number of feeds and quality of tagging. Ann Arbor’s hub was conspicuously lacking feeds from the University of Michigan. When I investigated I found that the central service, http://events.umich.edu, does offer iCalendar feeds. Yay! You can’t take that for granted, many if not most schools don’t make their public calendars available in a machine-readable way. Unfortunately there’s a problem with the feeds produced by the UM service. They’re invalid. You can’t load them into an iCalendar-aware program like Google Calendar or Outlook, and the elmcity engine can’t aggregate them.

I reported the problem to central services and have been awaiting a fix for some time. Today, because I wanted to get my hands on that data, I unleashed Harry Tuttle. There are two major problems with the iCalendar export from events.umich.edu. First, the lines of text aren’t properly folded. Second, the timezone properties don’t refer to a timezone definition. So I made a filter that fixes these major problems (plus some other minor ones). Here’s what the filter does:

Original: http://jonudell.net/data/failed-ics-umich.ics.txt. Validation result: Unparseable.

Line-folding fixed: http://jonudell.net/data/fixed-ics-umich.ics.txt. Validation result: Better.

VTIMEZONE added: http://jonudell.net/data/clean-ics-umich.ics.txt. Validation result: Valid.

Then I used the filter to add a bunch of feeds to the hub. Here’s one for the Taubman Health Services Libraries, and another for the Gerald R. Ford Presidential Library. These merge with other library feeds, notably from the Ann Arbor District Library, in the hub’s top-level library view.

Now, where do I fill out that twenty-seven-B-stroke-six form?


From Wikipedia’s Brazil_(film) page:

The reference to form 27B-6, without which no work can be done by repairmen of the Department of Public Works, is a reference to George Orwell, who lived at 27B Canonbury Square Apartment 6, while writing Nineteen Eighty-Four.

X-WR-TIMEZONE considered harmful?

In a pair of recent entries, Semantic web 101: Say what you mean and The long tail of the iCalendar ecosystem, I’ve begun to report on what I’m learning about the state of the iCalendar ecosystem as I work in parallel on the elmcity project and on the iCalendar Validator. Today I’ll focus on just one of a number of issues I’ve run into. Consider these two screenshots:

google calendar hotmail calendar

On the left you see Google Calendar displaying two calendars, each representing a single event — the Brower Youth Awards on October 18 at the Herbst Theater in San Francisco — in a different way. On the right you see Hotmail Calendar displaying the same two calendars. The event will happen at 5:30 Pacific time on the 18th. I found it on the Berkeleyside site whose events page offers a companion iCalendar feed.

If you load that feed into both Google Calendar and Hotmail Calendar, and if your calendars are set to Eastern time, you’ll see what’s shown above. If your calendars are set to another timezone the times will be shifted but the pink ones still won’t match.

The green ones should always match and should always be what you’d expect. For me, looking at a 5:30 Pacific event through the lens of calendars set to Eastern, I’d expect both calendars to display 8:30.

What’s the difference between the pink calendar and the green calendar? Here’s the pink one. It’s just the original calendar reduced to a single event. Like the original it declares its timezone using the nonstandard X-WR-TIMEZONE property:

BEGIN:VCALENDAR
VERSION:2.0
METHOD:PUBLISH
CALSCALE:GREGORIAN
PRODID:-//Refresh Web Development//Helios Calendar//EN
X-FROM-URL:http://www.berkeleyside.com/BerkeleysideCalendar/events/
X-WR-RELCALID:Berkeleyside
X-WR-CALNAME:Berkeleyside
X-WR-TIMEZONE:America/Los_Angeles
BEGIN:VEVENT
URL;VALUE=URI:http://www.berkeleyside.com/BerkeleysideCalendar/events/index.php?com=detail&eID=6
DTSTART:20111018T173000
DTEND:20111018T210000
SUMMARY:Brower Youth Awards 2011
LOCATION:Herbst Theater - 401 Van Ness \, San Francisco\, CA US 94102
END:VEVENT
END:VCALENDAR

And here’s the green one. Again it’s a derivation of the original calendar that reduces to a single event. But it also declares its timezone in the standard way, using a VTIMEZONE component and then referring to it using the TZID parameter of the DTSTART and DTEND properties:

BEGIN:VCALENDAR
VERSION:2.0
METHOD:PUBLISH
CALSCALE:GREGORIAN
PRODID:-//Refresh Web Development//Helios Calendar//EN
X-FROM-URL:http://www.berkeleyside.com/BerkeleysideCalendar/events/
X-WR-RELCALID:Berkeleyside
X-WR-CALNAME:Berkeleyside
BEGIN:VTIMEZONE
TZID:America/Los_Angeles
X-LIC-LOCATION:America/Los_Angeles
BEGIN:DAYLIGHT
TZOFFSETFROM:-0800
TZOFFSETTO:-0700
TZNAME:PDT
DTSTART:19700308T020000
RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
END:DAYLIGHT
BEGIN:STANDARD
TZOFFSETFROM:-0700
TZOFFSETTO:-0800
TZNAME:PST
DTSTART:19701101T020000
RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
END:STANDARD
END:VTIMEZONE
BEGIN:VEVENT
URL;VALUE=URI:http://www.berkeleyside.com/BerkeleysideCalendar/events/index.php?com=detail&eID=6
DTSTART;TZID=America/Los_Angeles:20111018T173000
DTEND;TZID=America/Los_Angeles:20111018T210000
SUMMARY:Brower Youth Awards 2011
LOCATION:Herbst Theater - 401 Van Ness \, San Francisco\, CA US 94102
END:VEVENT
END:VCALENDAR

As we see in the picture above, the event time on the green calendar shows up the same way in both Google Calendar and Hotmail Calendar. It should also be the same in any calendar program that supports the iCalendar standard.

The event time on the pink calendar, though, is a up for grabs. Calendar programs that strictly follow the iCalendar standard should ignore X-WR-TIMEZONE and always display the local time, 5:30PM, which will be right for people in the Pacific timezone and wrong for everybody else. Hotmail Calendar does this. Programs that use X-WR-TIMEZONE, on the other hand, can render this calendar just as they would render a standard calendar. Google Calendar does this.

Why do I care? I have to decide whether the elmcity service will or won’t consider X-WR-TIMEZONE to be meaningful. The service is based on DDay.iCal, the same standards-based parser that powers the iCalendar Validator. So when the the service reads the pink calendar, and renders it for users in Berkeley, it will do the wrong thing from their point of view.

To do the right thing for Berkeley it would need to do the wrong thing by iCalendar: transform the nonstandard X-WR-TIMEZONE property into a standard VTIMEZONE component, and then transform all the dates so that they refer to the VTIMEZONE’s TZID. In order to create that VTIMEZONE component, it would interpret X-WR-TIMEZONE value as a TZID (timezone ID) from the Olson database. A Unix-based service would look up the TZID in Olson, find the rule for the timezone — i.e., offsets from GMT for standard time and daylight savings time, and when to appy them — and express the rule using VTIMEZONE syntax. A service running on Windows Azure, like mine, would instead need to map the Olson name to a Windows timezone name, look up the rule using a Windows API, and then express the rule in VTIMEZONE syntax.

Of course this is a slippery slope because, in the end, I’m only guessing what X-WR-TIMEZONE is supposed to mean. Here’s Rick DeNatale engaging in the same kind of guesswork:

Someone pointed me to this icalendar file of Australian holidays for a test case:

http://icalx.com/public/rohanl/Australian32Holidays.ics

This contains NO VTIMEZONE components, but does have the calendar property: X-WR-TIMEZONE:Australia/Sydney

Googling indicates that this is a non-standardized property, but it seems to be used by several calendar apps including Apple’s ical.app
and Google calendar.

I know that it’s non-standard, but it seems to be somewhat important for interoperability. I’m looking for some kind of information about
what it means in general.

It seems to indicate a default tzid for the whole calendar. In the absence of timezone components I’m not sure how to interpret the tzid, though.

Australia/Sydney IS a time zone identifier in the Olsen database, is it standard practice to use olsen tzids in X-WR-TIMEZONE calendar attributes?

Fortunately I can bring some data to bear on this question. Thanks to the iCalendar Validator I can analyze public calendars produced by a variety of iCalendar producers. In The long tail of the iCalendar ecosystem I listed the names of about 600 producers seen recently by the Validator. Of those, about 100 use X-WR-TIMEZONE instead of VTIMEZONE, and 70 of those 100 use local rather that UTC date syntax which implies they are depending on X-WR-TIMEZONE for correct interpretation of those dates.

Note that Google Calendar, the 800-pound gorilla in this space, is not one of those 70 producers. When it writes iCalendar format it uses both X-WR-TIMEZONE and VTIMEZONE; the latter ensures that Google Calendars can be understood properly by standard parsers that don’t support X-WR-TIMEZONE. The 100 producers I’m talking about, though, are using only X-WR-CALENDAR in a way that suggests they expect a nonstandard transformation. The fact that Google Calendar performs that transformation is, of course, a major reason why producers would expect it to happen everywhere.

Should X-WR-TIMEZONE be standard? That’s debatable. It would certainly make life easier for iCalendar producers. They could just mention a timezone rather than having to extract its rule from their operating systems and express the rule in VTIMEZONE syntax. One of the reasons for the success of RSS and Atom, after all, is that it’s always been easy to whip up an RSS or Atom feed which you can then check with the Feed Validator. An analogous simplicity for iCalendar producers would help grow the iCalendar ecosystem.

On the other hand if an iCalendar feed were to only mention a timezone without fully defining it, then the consumer would have to do the work that the producer didn’t. That’s problematic as Doug Day, author of the iCalendar Validator, notes in a recent email exchange:

Unfortunately, without including the actual time zone information in the calendar (i.e. via VTIMEZONE), you can’t be sure that the date/times you’re representing are accurate, even when using X-WR-TIMEZONE. For example, if you’re on a Windows XP machine that hasn’t been updated in 5 or 6 years, your system time zone information will be inaccurate. However, if the VTIMEZONE were included in the calendar, it would remain accurate, even on an older machine with out-of-date time zone definitions. Also, in order to interpret X-WR-TIMEZONE, you’d need to be in an environment where interpreting Olson time zone is realistic (easy on Linux, harder on Windows). I know a global, online time zone registry is in the works, but I don’t think it’s to a point where it’s useful, yet.

You might wonder why all this timezone stuff is even necessary. After all, an iCalendar feed can simply omit VTIMEZONE (and/or X-WR-TIMEZONE), express dates and times in UTC (Coordinated Universal Time), and use UTC syntax for all dates and times. Why not just do that? I asked Doug Day about this a while ago, and here was his reply:

The biggest problem is with recurring events and daylight/standard time transitions. For example, consider the following (all hypothetical):

1. I live in Salt Lake City, Utah

2. I want to schedule a meeting, starting on September 7, 2009 at 9:00 A.M, which recurs every month on the first Monday.

3. Some of the people attending this meeting live outside my current time zone.

So, here are the occurrences you’re ultimately after:

– September 7, 2009 – 9:00 A.M. (3:00 PM UTC)

– October 5, 2009 – 9:00 A.M. (3:00 PM UTC)

– November 2, 2009 – 9:00 A.M. (4:00 PM UTC)

As you can see, once the time changes from daylight back to standard time, so does the UTC representation of that time. So, if you had scheduled your event in UTC time, when the time zone changes, your event time will actually have changed (to 10:00 A.M., rather than 9:00 A.M.)

For this reason, among others, it’s always best to include time zone information whenever available. Traditionally, it’s been pretty difficult to include that information, and it’s more often left out than included.

So what shall I do with X-WR-TIMEZONE? I’ve decided to support it experimentally. If you start a new hub on the elmcity service, the default is to ignore X-WR-TIMEZONE. But if your hub has important sources that depend on it, as Berkeley does, then you can override the default so the times will be as you expect.

Meanwhile we’re going to update the iCalendar Validator to warn producers about this issue. There’s nothing technically invalid about a calendar that uses X-WR-TIMEZONE without VTIMEZONE. To a parser that strictly interprets the RFC5545 standard, that property is just a name that’s “reserved for experimental use.” But as has always been true of the RSS/ATOM Validator, the iCalendar Validator aims to deliver useful real-world guidance. Producers that use X-WR-TIMEZONE alone to declare a timezone should know that while it may often yield expected results, it’s not guaranteed to do so. It would be better to use a standard VTIMEZONE.

The long tail of the iCalendar ecosystem

A couple of months ago I began saving the iCalendar files that are submitted to the iCalendar Validator. Today I extracted a list of unique names of iCalendar producers along with associated counts of the number of calendars validated for each. Here they are, with Google Calendar at the head and a classic long tail distribution of almost 600 other iCalendar producers. (You can also see them elsewhere by name as well as by count.)

The next step will be to analyze how well these these producers conform to the validator’s interpretation of the iCalendar spec. But the list itself forms an interesting data set. We know intuitively that, after 12 years of evolution, the iCalendar ecosystem must have become broad and diverse. Here’s a nice illustration of that breadth and diversity.

(Note that these counts don’t necessarily reflect the real distribution of iCalendar producers. The iCalendar Validator is closely associated with the elmcity project, so certain producers used heavily there — DDay.iCal, EVDB, Meetup — are overrepresented. On the whole, though, I’d guess this is a reasonable proxy for the distribution of producers.)


-//Google Inc//Google Calendar 70.9054//EN 2102
-//DDay.iCal//NONSGML ddaysoftware.com//EN 334
-//SchoolCenter/NONSGML Calendar v9.0//EN 280
-//EVDB//www.eventful.com//EN 200
-//hacksw/handcal//NONSGML v1.0//EN 163
-//Meetup Inc//RemoteApi//EN 145
-//Meetup//RemoteApi//EN 143
-//Events at Stanford//iCal4j 1.0//EN 137
-//Drupal iCal API//EN 133
NingEventWidget-v1 131
-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN 101
-//CustomICS by Robert Brady 888-523-7275 81
PHP 76
-//Last.fm Limited Event Feeds//NONSGML//EN 61
e-vanced event management system 56
-//Microsoft Corporation//Windows Live Calendar//EN 55
-//Microsoft Corporation//Outlook 12.0 MIMEDIR//EN 55
-//openmikes.org/NONSGML openmikes.org//EN 53
PRODID;X-RICAL-TZSOURCE=TZINFO:-//com.denhaven2/NONSGML ri_cal gem//EN 49
-//ActiveDataExchange/Calendar V3.12.0//EN 47
Data::ICal 0.16 36
-//Facebook//NONSGML Facebook Events V1.0//EN 36
-//sports.yahoo.com//San Francisco Giants Calendar (MLB)//EN 35
http://devliquid.hillel.org/ 33
-//University of Oulu//SEAA 2011 Conference Program//EN 33
iCalendar-Ruby 32
-//Microsoft Corporation//Outlook 11.0 MIMEDIR//EN 31
https://news.piratenpartei.de/calendar.php 31
-//sports.yahoo.com//San Francisco 49ers Calendar (NFL)//EN 31
-//Refresh Web Development//Helios Calendar//EN 30
-//strange bird labs//Drupal iCal API//EN 29
-Consultation Manager iCal File 28
-//Kennedy Space Center launches by Chad//NONSCML//EN 27
-//ddaysoftware.com//NONSGML DDay.iCal 1.0//EN 27
-//Apple Inc.//iCal 4.0.4//EN 26
-//Ascensha//Causeway Workgroup Calendar//EN 25
-//Events Calendar//iCal4j 1.0//EN 25
-//Enzian Specials by Chad//NONSCML//EN 24
Absorb LMS 24
-//Apple Inc.//iCal 3.0//EN 22
Clear Books 22
-//University of Geneva//Calendar v1.0//EN 22
PRODID;X-RICAL-TZSOURCE=TZINFO:TeamPages.com 22
-//lanyrd.com//Lanyrd//EN 20
-//Upcoming.org/Upcoming ICS//EN 20
TT-Kalender 19
-//ForeTees//NONSGML v1.0//EN 19
-//Webmaster-Portal// 19
-//suda.co.uk//X2V 0.9.2.1 (BETA)//EN 18
-//Partyflock//Partyflock_agenda_user_350057//EN 18
-//John Papaioannou/NONSGML Bennu 0.1//EN 18
-//collegefootballcalendar.net//2011-2012 NCAA Football Calendar//EN 17
-//Kerio Technologies//Kerio Connect//EN 17
BedeWork V3.5 17
-//Apple Computer\, Inc//iCal 2.0//EN 17
-//Trumba Corporation//Trumba Calendar Services 0.11.8113//EN 17
-//Schedule Star LLC//HighSchoolSports.net Calendar 2009.02.19//EN 16
-//MH Software Inc//Calendar – 3.2.13-pre8//EN 16
-//Springshare//LibCal//EN 16
-//University of California\, Berkeley//UCB Events Calendar//EN 16
-//ViableIT Inc//athletechs.com Calendar 1.0//EN 15
-//FBC//Turnierkalender//EN 15
-//Microsoft Corporation//Outlook 14.0 MIMEDIR//EN 14
-//Sølvguttene\, //Aktivitetskalender//EN 14
TOUTWEB http://www.toutweb.ac-versailles.fr 14
-//yeltzland/Calendar v1.0//EN 14
-//SimpleMachines//SMF 1//EN 14
-//Korfball.de//NONSGML Korfball.de V2.0//EN 13
-// Kansas Humanities Events Calendar //NONSGML v1.0//EN 13
RSS2iCal 0.0.1 13
-//Calendar//Calendar Event//EN 13
-//Dasos//NONSGML berksevents.com//EN 13
-//davical.org//NONSGML AWL Calendar//EN 13
-//Evolvera AB\, //TimeEdit//EN 12
-//Pingstkyrkan Sundsvall//Kalender//SV 12
-//Apple Inc.//iCal 5.0//EN 12
-//GMN training events//NONSGML v1.0//EN 12
-//RidgeStar//NONSGML v1.0//EN 12
-//Microsoft Corporation//Outlook 12.0 MIMEDIR//EN 12
-//Intand Corporation//Tandem for Schools//EN 12
-//Gala Festival Engine//gala-engine.com//EN 12
https://vertrieb.panomizer.de 12
-//loco.ubuntu.com//EN 12
Coldfusion8 12
-//VTM//TEXT Causeway Calendar//EN 11
-//Generated by RSScal//Tom Henderson 2007 11
-//herald-dispatch/calendar//NONSGML v1.0//EN 11
-//Events Manager//1.0//EN 11
-//CHECK24 Vergleichsportal GmbH//Kfz iCal Termin v0.1//DE 11
-//FwdMeeting.app//EN 11
-//FAST//NONSGML v1.0//CZ 11
Mobile Geographics Tides 3988 2011 11
-//Punahou School/finalsite//NONSGML v1.0//EN 11
-//Bryce Campbell/NONSGML v1.0//EN 11
-//beTicketing/Events//EN 11
-//djeebus/scheduleanywhere//NONSGML v1.0//EN 11
-//mySportSite Inc.//mySportSite//EN 11
-//nikatla.de//MoDuL//DE 11
PRODID;X-RICAL-TZSOURCE=TZINFO:-//ArcticStartup//ri_cal gem//EN 11
-//Weather Underground Inc//Wunder Weather Calendar//EN 11
-//CALENDARSERVER.ORG//NONSGML Version 1//EN 10
-//Ben Fortuna//iCal4j 1.0//EN 10
-//Linux Users’ Group of Davis//events-as-ics 2006.09.12//EN 10
-//WestConn Events//iCal 2.0//EN 10
-//Korrio Inc//Korrio Calendar 0.42//EN 10
-//TPP//v2.2.6//DE 10
soe_events 10
Ajax Event Calendar WordPress Plugin 10
de.rwth-aachen.filmstudio.www 10
-//Datasport//Datasport Events V0.1//EN 9
-//Vertical Magazine//VerticalADCalendar//EN 9
-//denef.design\, //iCalCreator 0.1//EN 9
-//Oakland Unviersity//NONSGML Events//EN 9
-//sports.yahoo.com//Connecticut Huskies Calendar (NCAA Men’s Hoops)//EN 9
-//blogTO//NONSGML Toronto Events V1.0//EN 9
-//CiviCRM//NONSGML CiviEvent iCal//EN 9
-//Microsoft Corporation//OutlookMIMEDIR//EN 9
-//sports.yahoo.com//Central Conn. St. Lady Blue Devils Calendar (NCAA Women’s Hoops)//EN 9
-//Export//Set-a-Date//EN 9
-//winchesteryouthhockey.com//Schedule Calendar 0.001//EN 9
-//guthrietheater.org///Schedule Calendar 0.001//EN 8
-//The Horde Project//Horde_iCalendar Library\, Horde 3.3.4//EN 8
-//UB Events Calendar//NONSGML v1.0//EN 8
-//jEvents 1.5 for Joomla//EN 8
-//crystalbootssilversaddles.org//NONSGML // 8
i-Aspect IAF 1.0.23 8
-//ReminderFox V1.9.9.4.2//EN 8
-//Arnolds calendar// 8
-//flaimo.com//iCal Class MIMEDIR//EN 8
Computers in Personnel Ltd – Ciphr 8
-//ISCOPE GmbH//NONSGML iCalendar library for PHP//DE 8
-//WebCalendar-v1.1.2 8
Town of Chapel Hill Calendar Creator 8
-//Edtech\\\, //Ultranet 2.3.4//EN 8
-//Proweso/TeamData//DE 8
-//AntonDesign//NONSGML LUCS//EN 7
-//LEARNING CURVE PLANNER//DAIRY WIDGET//EN 7
-//Ascensha//Causeway Calendar//EN 7
-//ABC Denayer//NONSGML DenayerAgenda//EN 7
-//DNN//Events 05.00.02//EN 7
-//F30//NONSGML Text Editor//EN 7
-//Terrapinn//The Internet Show Middle East//EN 7
-//Clubless//NONSGML//EN 7
-//zulily//reminders//EN 7
-//Lotus Development Corporation//NONSGML Notes 8.5//EN 7
Zimbra-Calendar-Provider 7
-//WebCalendar-ics-v1.2.3 7
//RESEARCH IN MOTION//BIS 3.0 7
+//IDN hrooster.nl/icsFeed//NONSGML v1.0//EN 7
-//ESD105//NONSGML v1.0//EN 7
-//University of St Andrews//Galen Timetable//EN 7
-//Cairns State High School//Events Manager Export//EN 7
-//ELT Calendar//Eventer 1.0//EN 7
bnmng 7
-//UT///NONSGML v1.0//nl-NL 7
-//Telerik Inc.//NONSGML RadScheduler//EN 6
-//InstituteOfClinicalResearch//NONSGML v1.0//EN 6
-//Skoonhoven//VUrooster//NONSGML v1.0//EN 6
-//TPP//T P P v2.2.6//DE 6
-//Vereniging Voor Natuurkunde//NONSGML Activiteitenkalender//NL 6
-//MNC Heren 8 Kalender//NONSGML kigkonsult.se iCalcreator 2.10.5// 6
-//Costasoft//CalGen//IT 6
-//MGL//APPOINTMENT//EN 6
-//ReminderFox V1.9.9.4//EN 6
-//Typo3 CMS\, News Event Extension 6
-//Nevobo/Competitie/NL 6
-//Scientia Ltd//iCalendar Server v 1.0//EN 6
-//kex.se//NONSGML kigkonsult.se iCalcreator 2.10.5// 6
-//TYPO3/NONSGML Calendar Base (cal) V1.4.0//EN 6
-//Trumba Corporation//Trumba Calendar Services 0.11.8009//EN 6
-//Day Software//CQ5 Calendar 5.4.2//EN 6
CALENDAR_APP_EXAMPLE_FOR_PMP 6
-//RHHA//NONSGML Cal//EN 6
-//sphereinc//jira to iCal Vacations 0.09//EN 6
-//stgeorge.org//calendar.php//NONSGML v1.0//EN 5
-//polishprofessionals.org.uk//NONSGML kigkonsult.se iCalcreator 2.8// 5
-//SHEA/syndicated//NONSGML v1.0//EN 5
-//Remember The Milk//rtm.Service.iCalendar.Export 3.0//EN 5
-//SFU CourSys//courses.cs.sfu.ca// 5
iTV – televizni program 5
-//www.byucougars.com//NONSGML kigkonsult.se iCalcreator 2.8// 5
THARTSCAL 5
-//jhart//skytools_icalendar//EN 5
Microsoft Exchange Server 2007 5
Integrated Resources Booking System 5
-//Air Crew Portal//.air V0.2b//EN 5
http://www.billomat.net/service/feed/ical/ 5
HSJ – Excel 5
-//Abreu Viagens//CorpAbreu//PT 5
-//ED//Agenda Harmonie//EN 5
VBCPS Calendar Application 5
-//192.168.100.199//NONSGML iCalcreator 2.4.3// 5
-//Microsoft Corporation//Outlook 10.0 MIMEDIR//EN 5
-//Apple Computer\, Inc//iCal 1.0//EN 5
-//The Highbar LLC//BoardOnTrack//EN 5
-//Trumba Corporation//Trumba Calendar Services 0.11.8016//EN 5
-//64.56.109.132//NONSGML iCalcreator 2.6// 5
-//Leaguerunner//Team Schedule//EN 5
-//Legends Racing UK//Race Calendar//EN 5
-//Trumba Corporation//Trumba Calendar Services 0.11.8024//EN 5
-//ABC Corporation//NONSGML My Product//EN 4
-//Algit d.o.o.//NONSGML iUrnik 7.0.680//EN 4
Common Place 4
-//Schoolonline//Schoolonline 1.0//NL 4
-//78.47.136.163//NONSGML iCalcreator 2.6// 4
-//Revoshop//Brønshøj kampe//EN 4
-//agenda.strasweb.fr//NONSGML kigkonsult.se iCalcreator 2.10.5// 4
-//RidgeStar//NONSGML v4.8.2//EN 4
-//glenallenpool.com//GlenAllenCommunityCenter//EN 4
-//Incom.org//iCal Helper//DE 4
-//iCal Parser Test//NONSGML v1.0//EN 4
-//Novell Inc//Groupwise 12.0.0 Beta 4
-//Middlebury College//Dining Menus//EN 4
-//Mercury//cam.ac.uk// 4
-//Lotus Development Corporation//NONSGML Notes 6.0//EN 4
-//D2Rec WEB//EN 4
-//Church of Jesus Christ of Latter Day Saints//LDS Calendar 2.0//EN 4
-//Cambridge Publications//NONSGML ConferenceSys//EN 4
-//Double Yellow//DY//EN 4
-//HOCZ.org//srazy.hocz.org//EN 4
-//Foris//Meetings//EN 4
-//eZ Systems//eZ Publish//EN 4
-//Trumba Corporation//Trumba Calendar Services 0.11.7922//EN 4
http://www.jeripeier.ch/piper+ 4
-//UM//UM*Events//EN 4
//Dave Warker//Remember? 4.6.2d1 4
-//TIMEANDDATE AS//NONSGML//EN 4
Clubless Event Invite 4
http://aol.animanga.at/ 4
-//ungarn.brunstadworld.org// Ungarn.iCal 1.0//EN 4
infosys@rn.inf.tu-dresden.de 4
GIGPRESS 2.0 WORDPRESS PLUGIN 4
-//vodafoneprojects-hr.mediaxplosion.nl//NONSGML kigkonsult.se iCalcreator 2.10.5// 4
IntraSEIC ICS Generator 4
-//Terrapinn//World National Oil Companies Congress 2012//EN 3
-//test.org//NONSGML kigkonsult.se iCalcreator 2.10.5// 3
-//CBIT//eAdministration//DK 3
-//MightyMax/JPT/ripper v1.0//NL 3
-//ELT Calendar//Add to calendar//EN 3
-//Tethr.co.uk/NONSGML Tethr 0.1//EN 3
-//Microsoft Corporation//Outlook 9.0 MIMEDIR//EN 3
-//TBP\ Inc//iCal 1.0//EN 3
-//NONSGML Events //EN 3
-//Taxi Licensing//MOT BOOKINGS//EN 3
-//NOVASOFTWARE//Calendar//IT 3
http://www.example.com/calendarapplication/TZ:+01:00 3
http://www.trinews.at 3
DaisyTest 3
-//DNN//Events 05.02.00//EN 3
-//Novell Inc//Groupwise 8.0.2 3
eAdministration 3
-//MIA Consulting//MIA_Toolkit v1.0//EN 3
-//hugoviste.cz//NONSGML kigkonsult.se iCalcreator 2.10// 3
-//i:FAO Aktiengesellschaft//NONSGML cytric r10//EN 3
-//localhost//NONSGML iCalcreator 2.6// 3
-//Trumba Corporation//Trumba Calendar Services 0.11.7914//EN 3
-//Hester Jans//Agenda//NL 3
-//Ibooqu Calendar 1.0//EN 3
-//University of Florida//NONSGML Calendar v1.0//EN 3
-//Intand Corporation//Tandem//EN 3
-//koivuniemi//navettabroker 1.0//FI 3
-//WBT Systems//NONSGML TopClass//EN 3
-//University of Cambridge/WattLab V1.4//EN 3
-//LOGICS SOFTWARE GMBH//MOBILE APP 2.1//EN 3
-//Example/ExampleCalendarClient//EN 3
-//meds.queensu.ca//iCal MEdTech Central Calendar MIMEDIR//EN 3
-//MGL MakingGreatLeaders//NONSGML MGL//EN 3
-//Eveoh//Eveoh iCalExporter 1.2//EN 3
-//The Taft School//NONSGML v1.0//EN 3
-//Maxinutrition//iCal 2.0//EN 3
-//GENTICS Content.Node//NONSGML AWO Event//DE 3
-//Lotus Development Corporation//NONSGML Notes 7.0//EN 3
-//Lotus Development Corporation//NONSGML Notes 8.5.2//EN_C 3
-//Markthisdate.com\,0.7 3
-//Generated by PHP in Linux!//NONSGML v1.0//EN 3
-//OHAI.CA//Brian Lai’s Awesome iCal Parser 1.01//EN 3
-//Appointments On Time//EN 3
-//SweepAround.Us: Ward 40\, Sweep Area 5//EN 3
TEST 3
NetProfits Guidance Scheduling 3
-//Plan 2011Z CB//NONSGML v1.0//EN 3
Microsoft Exchange SERVER 2007 3
-//Schedule Star LLC//HighSchoolSports.net Calendar 2009.02.19//ENVERSION:2.0CALSCALE:GREGORIAN 3
UVT/ESG 3
-//Saltech Systems//NONSGML Saltech CMS 2011//EN 3
-//sol3//EN 3
ReflexAppointment 3
-//Amtelco/Oncall//NONSGML V1.0//EN 3
-//Rentmanager XI//EN 3
-//Reincubate Ltd//iPhone Backup Extractor 3.0.8//EN 3
Nova-Migration-PC-1.0 3
-//Sotic Ltd//EN 3
-//Roundcube Webmail//NONSGML Calendar//EN 3
-//Scott Crevier//SouthEndZone.com//EN 3
-//Brian Victor//BTBCal 3
-//OHAI.CA//Brians iCal Generator 1.01//EN 3
-//ServeiTIC ETSAB//iCal4j 1.0//EN 3
-//p77b Inc//iCal Splitter r1//EN 3
-//Sølvguttene//Aktivitetskalender//EN 3
IE – 2011 3
-//Ascentis Corporation//CalExporter 1.0//EN 3
-//synexarium_arabic@copticchurch.net//NONSGML kigkonsult.se iCalcreator 2.10// 3
-//IP.Board Calendar 3.1.4//EN 2
-//iwooweb.umcn.nl/rooster/B1GM1t_rooster_12-8-2011.ics//NONSGML iCalcreator 2.6// 2
-//Zarafa//7.0.1-28479//EN 2
Reflex Appointment 2
-//WebCalendar-v1.0.2 2
-//YuMe Inc//NONSGML My Product//EN 2
-//www.bostonharborislands.com//NONSGML kigkonsult.se iCalcreator 2.8// 2
-//jaegerlacke.de//NONSGML kigkonsult.se iCalcreator 2.8// 2
-//Genbook, Inc//Genbook Calendar 1.0//NONSGML v1.0//EN 2
-//flybe SDRA iCal Export//Daniel Giles//EN 2
-//inter-actief//amélie//NL 2
-//AbanQ/AbanQCalendarClient//EN 2
-//Volleyball calendar 2011-2012// 2
VMH Akademie Mailer 2
-//192.168.65.8//NONSGML iCalcreator 0.9.9// 2
-//127.0.0.1//NONSGML iCalcreator 2.6// 2
– // LuxCal 2.5.0 // I+R Web Calendar // EN 2
-//Vrijhof Cultuurcentrum//Admino 3//EN 2
-//Abilene Christian University//CM 2011.1//EN 2
UWA Whatson 2
-//adb_birthdays2ical//V0.1//EN 2
SuperOffice Calendar 2
-//http://nitalk-dev.natinst.com//ics-export-sbs-plugin//EN 2
-//Hochschule Heilbronn//ICS Downloader//DE 2
http://www.handball.no 2
feed2ical 0.0.1 2
Microsoft CDO for Microsoft Exchange 2
Fenwick/Kinopop 2
feed2ical 0.1 2
-//dukamunka.hu// DukaMunka.iCal 1.0//HU 2
ApplyMate Reminders 2
-//DougBrown//WHS Date Generator – copyright 2011 //EN 2
Microsoft Exchange Server 2010 2
METHEUS 2000 2
-//Church of Jesus Christ of Latter Day Saints//LDS Calendar 1.6//EN 2
JustaTest 2
-//chapterboard.com//NONSGML iCalcreator 2.6// 2
-//Chris Malton//UKS_WebExport v1.0//EN 2
-//d-elft.nl//NONSGML kigkonsult.se iCalcreator 2.10.5// 2
-//blah/test 2
http://ortsring-weiler.de/ 2
http://cybot.eu.org/zapo/ 2
//annando/mybb-ical//DE 2
-//Air Crew Portal//Air//EN 2
//Bedework.org//BedeWork V3.7//EN 2
-//Annual//Annual 70.9054//EN 2
-//Feuerwehr Eriskirch//NONSGML v1.0//EN 2
-//Air Crew Portal//Air v//EN 2
-Consultation Manager 2.0 2
-ANSJOB//IKSTYM//1112 2
-//AntonDesign//NONSGML v1.0//EN 2
-//Apple Inc.//iCal 4.0.3//EN 2
//opencampus.ssig.ch\ v2.0//IT 2
NONE 2
-//EMA Inc//EMA Private//EN 2
-//EventPoint, Inc.//TechEd Australia 2011 Calendar//EN 2
-//Apple Computer\, Inc//iCal 1.5//EN 2
//Nokia Corporation//Maemo5 Calendar PR1.2//EN 2
-//Apple Inc.//iCal 3.0m//EN 2
-//MKIVC//Public//EN 2
-//Terrapinn//Hedge Funds World Asia 2011//EN 2
-//PBS Arts//NONSGML GIVE ME THE BANJO//EN 2
-//Songkick//iCal 1.0//EN 2
-//SYFADIS//PORTAIL FORMATION//FR 2
-//TV-kalendern.se//NONSGML Calendar feed for television//EN 2
-//NC State OIED//NONSGML v1.0//EN 2
-//P2D Prontuario Universal//P2D Calendar 1.7//PT-BR 2
-//Paprikka_ERP//NONSGML kigkonsult.se iCalcreator 2.10// 2
-//localhost:2026//NONSGML v1.0//EN 2
-//Rearden Commerce//iCal4j 1.0//EN 2
-//suda.co.uk//X2V 0.7.2 (BETA)//EN 2
-//Maxinutrition//iCal 1.0//EN 2
-//Meetup//Meetup Events v1.0//EN 2
-//The Horde Project//Horde_iCalendar Library\, Horde 3.3.8//EN 2
-//Microsoft Corporation//Outlook MIMEDIR//EN 2
-//SoPA UoE//Event Calendar//EN 2
-//LUIS/handcal//NONSGML v1.0//LV 2
-//Planetarium Hamburg//Planetarium Hamburg Technikeinsatzplkanung//DE 2
-//test//Set-a-Date//EN 2
-//USBank//NONSGML v1.0//EN 2
-//Snow B.V.//NONSGML ldap2ics.pl v0.1//EN 2
-//JH-data//www.kobh.dk v1.0//EN 2
-//K Desktop Environment//NONSGML libkcal 4.3//EN 2
-//Skiteam Wolfskamer//Wedstrijdagenda//NL 2
-//Taxi Licensing//Basildon Borough Council//EN 2
-//TAO Outlook-Converter//software.tao.at// 2
-//School Datebooks Inc//The Zoneâ„¢ – Ursuline Academy of Cincinnati//EN 2
-//Sølvguttene//Aktivitetskalender//NO 2
-//TheWeddingDJ 2
-//northwestern_econ_pinksheet//NONSGML iCalcreator 2.6// 2
-//Union Korneuburg//iCal4j 1.0//EN 2
-//CE Systems//calendarexchange 1.0//EN 1
-//Numara Software, Inc.//FootPrints Calendar//EN 1
-//NWHS Events//EN 1
1
-//CitySocialising//NONSGML CitySocialising Socials v1.0//EN 1
-//CMS4Schools.com//NONSGML Pro//EN 1
http://www.htw-aalen.de/ 1
-//Plan 2011Z CA//NONSGML v1.0//EN 1
-//PIRATEN//NONSGML ELSAevent//DE 1
http://www.mscbeuern.de/ 1
-//arqcore.com//NONSGML iCalcreator 2.10// 1
-//Asia Pacific Civil-Military Centre of Excellence//NONSGML v1.0//EN 1
-//Calendar For 1
-//Calendar Labs//Calendar 1.0//EN 1
-//Cambridge Folk//NONSGML Cam-French//EN 1
-//BusyMac LLC/BusyCal 1.5.4/ET 1
-//CalendarONE Pte Ltd//Entourage Mac 11.0 MIMEDIR//EN 1
-//OJP/Thales//EN 1
-//calendar-workoptions b.v..eazymatch.net//NONSGML kigkonsult.se iCalcreator 2.8// 1
-//Open Source Applications Foundation//NONSGML Chandler Server//E 1
-//bughome/tasks//NONSGML v1.0//EN 1
livesportontv.com 1
-//BlackParadigm/Schedule/FR 1
-//ATK Palvelu Hakosalo Oy//Yrinet3-asiakashallintajärjestelmä//FI 1
-//PimlicoSoftware Inc//Pimlical Calendar ICS Export//EN 1
-//Broadnet Teleservices/Event manager//EN 1
Id de procedencia (Compa�ia) 1
Lagsidan 1
-//PBS Arts//NONSGML 1
-//212.90.148.26//NONSGML kigkonsult.se iCalcreator 2.8// 1
-//216.71.91.126//NONSGML iCalcreator 2.4.3// 1
-//193.202.110.157//NONSGML iCalcreator 2.6// 1
-//SMW Project//Semantic Result Formats 1
-//192.168.65.8//NONSGML kigkonsult.se iCalcreator 2.10.5// 1
University of Kent THALIA 1
-//Sol-3/sol3-export-crm-calendar-ics.pl//EN 1
-//Schedule Star LLC//HighSchoolSports.net Calendar 2009.02.19//CALSCALE:GREGORIAN 1
-//schleifring//messen 1
TT-KalenderMETHOD:PUBLISH 1
-//78.47.136.163//NONSGML kigkonsult.se iCalcreator 2.10.5// 1
-//002511509501000000000000000000000002000_NÖ Männer Meister PlayOff//NONSGML kigkonsult.se iCalcreator 2.10// 1
ANSJOB IKSCRIPT 1
-//SHEA//syndicated//NONSGML v1.0//EN 1
XVU iCal 1
-//Shrimad Rajchandra Mission//Mission Calendar 1.0//EN 1
PRODID;X-RICAL-TZSOURCE=TZINFO:-//Full Slate\, Inc.//NONSGML fullslate.co 1
HIP-HOP.DK 1.0 1
–//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN 1
-////NONSGML kigkonsult.se iCalcreator 2.10.5// 1
-//scrollday.com//NONSGML kigkonsult.se iCalcreator 2.8// 1
http://www.apartmentsapart.com 1
-//SimpleMachines//SMF/RAphotoclub v1.0 1//EN 1
-//anzevents.adobe.com – Creaive Class: for creative people// 1
ONNET OFFLINEKALENDAR 1
-//St. Luke University Parish//stlCalendar v1.0//EN 1
Projektron BCS 1
Open-Xchange 1
-//Reincubate Ltd//iPhone Backup Extractor 3.0.8//EN // RECOMMENDED INCLUSION 1
-//PYVOBJECT//NONSGML Version 1//EN 1
-//Apple Inc.//iCal 4.0//EN 1
-//Raco//iCal4j 1.0//EN 1
ONLINEBOOQ 1
-//stgeorge.org//calendar.php//NONSGML v1.0//ENb 1
-//Something.org//NotesCalendarExport 0.96//EN 1
Rooster-janwal2010 1
-//ActiveDataExchange/Calendar V3.12.1//EN 1
-//Acme Corporation//NONSGML V1.0//Widget 1
-//Schedule a Meeting 1
SFPL Web Calendar 1
-//ACVB//RSVP Event//EN 1
-//Rillsoft GmbH//Rillsoft Integration Server//DE 1
-//Solvguttene\, //Aktivitetskalender//EN 1
-//agenda.strasweb.fr//NONSGML kigkonsult.se iCalcreator 2.8// 1
-//SABA SOFTWARE//NONSGML iCal//EN 1
-//RIT Events Calendar//events//EN 1
-//GEOclubbing//NONSGML//EN 1
-//timetable.staircase.dur.ac.uk//NONSGML kigkonsult.se iCalcreator 2.10// 1
-//Lotus Development Corporation//NONSGML Notes 8.0//EN 1
-//generated//sprungknoedl.at// 1
-//GENTICS Content.Node// AWO Event//DE 1
-//WebCalendar-ics-v1.2.4 1
-//LG Electronics//LG Remarq//EN 1
-//WebCal.fi//NONSGML iCalendar Creator version 3.3//EN 1
-//WebCal.fi//NONSGML iCalendar Creator version 3.3//FI 1
-//WebCalendar-ics-v1.2.1 1
-//Henrik Levkowetz//ietf-agenda-ical 1.03//EN 1
-//TimeEdit\, //TimeEdit//EN 1
-//XYZ Corp//My Product//EN 1
-//Flogs//NONSGML Flogs iCalendar interface v1.1//EN 1
-//Five Borough Bicycle Club//genics.cgi//EN 1
-//M&V Software//NONSGML Yritysmappi 1.4.2//EN 1
-//Freshcookies.org//NONSGMLNotesCalendarExport 0.96//EN 1
-//Lotus Development Corporation//NONSGML Notes 8.5.2//EN_S 1
-//www.bad-homburg-tourismus.de//DE 1
-//Lotus Development Corporation//NONSGML Notes 8.5.3//EN_C 1
-//www.ziv-zweirad.de//NONSGML kigkonsult.se iCalcreator 2.10// 1
-//Lotus Development Corporation//NONSGML Notes 8.5.3//EN_S 1
-//LFP//iCal 3.0//FR 1
-//Intracore 13092011 103801 AM //iCal 2.0//EN 1
-//IP.Board Calendar 3.2.2//EN 1
-//University of Oulu//NONSGML SEAA 2011 Conference Program//EN 1
-//University of Michigan Museum of Art//Events Calendar//EN 1
-//Integrated Resources Booking System 1
-//Irish Orienteering Association//NONSGML Fixtures//EN 1
-//jCRM//iCal 0.1//EN 1
-//Jeb//edt.pl//EN 1
-//Verkkovaraani Oy/Generated by eAdmin//FI 1
-//IS4U//EN 1
-//virtual-loup-de-mer.org//NONSGML iCalcreator 2.6// 1
-//HZ93//HZ93//EN 1
-//Typo3 CMS\, News Event Extension //MIMEDIR//EN 1
-//Hypermatix//NONSGML Andal BETA//EN 1
-//http://notclive.co.uk/IC-DoC-iCal//NONSGML kigkonsult.se iCalcreator 2.10.5// 1
-//http://www.ibestat.es 1
-//TYPO3/NONSGML Calendar Base (cal) V1.3.3//EN 1
-//Infragistics,Inc.//UltraWinSchedule 1
-//University of Illinois//Web Services Calendar//EN 1
-//Kiiba ApS//NONSGML Kiiba//EN 1
-//ICal by EliasSoft//EN 1
-//ical.net//NONSGML kigkonsult.se iCalcreator 2.9.1// 1
-//MAT Foundries Europe GmbH Informationsportal//NONSGML Infoportal//DE 1
-//Day Software//CQ5 Calendar 5.3.0//EN 1
fenwick/kinopop 1
-//NCEO//Web site//EN 1
-//Nevobo/Competitie 1
Hasso Plattner Institute Potsdam, Germany, AOSD 2012 1
-//TBP\, Inc//iCal 1.0//EN 1
-//mulberrymail.com//Mulberry v4.0//EN 1
-//Terrapinn Holdings Ltd//The Internet Show Middle East//EN 1
-//multifunction.nl/#SPLUS630532//NONSGML v1.0//EN 1
-//delftcalendar.tudelft.nl//NONSGML iCalcreator 2.6// 1
-//musique4.localhost//NONSGML kigkonsult.se iCalcreator 2.10// 1
http://tute.ch/events/ical/ 1
-//Cozi Group Inc//Cozi Calendar//EN 1
-//NorthEastSocial//NONSGML NorthEastSocial Events v1.0//EN 1
-//collegefootballcalendar.net//2011-2012 NCAA Football Calendar (ACC)//EN 1
-//collegefootballcalendar.net//2011-2012 NCAA Football Calendar (SEC)//EN 1
-//None/1.0//EN 1
http://calendar.rockhurst.edu/ 1
-//Dallas Theological Seminary//NONSGML v1.0//EN 1
-//d-elftwedstrijdkalender//NONSGML kigkonsult.se iCalcreator 2.10.5// 1
-//NLFacMgr_v.2.288//FM//EN 1
-//Newcastle University//Personal Student Timetables v2.0//EN 1
-//Doodle AG//Doodle//EN 1
-//MIA Consulting//NONSGML MIA_TOOLKIT v1.0//EN 1
//Dave Warker//Remember? 4.6 1
//MCPS//iCalendar//EN 1
-//Test//NONSGML My Calendar//EN 1
-//The Horde Project//Horde_iCalendar Library//EN 1
-//thinkdigital/webkit-calendar//NONSGML v1.0//EN 1
-//zugunited.ch//NONSGML kigkonsult.se iCalcreator 2.10.5// 1
-//Zermelo Roostermakers//NONSGML Infoweb rooster//NL 1
-//MAT Foundries Europe GmbH Informationsportal//NONSGML Infoportal//DE 1
-//EZ Bill Tracker// 1
-hanmade 1
-//dsek.lth.se//NONSGML dCalMaker 1.0// 1
-//mjoberg.net//NONSGML kigkonsult.se iCalcreator 2.10.5// 1
-//Drupal iCal API//EN 1
-//dorky.bkbruntal.cz//NONSGML iCalcreator 2.4.3// 1
CommuniGate Pro 5.4.2d 1
BYU Calendar 1
AndroidEmail 1
//SMP 1
-//test.org//NONSGML kigkonsult.se iCalcreator 2.10// 1
-//Mijn Rooster//osiris.uu.nl// 1
-//Eloqua//NONSGML Eloqua Conversion Suite//EN 1

Semantic web 101: Say what you mean

If you think that the semantic web is just some kind of geek rapture, like the singularity, I can understand why. As with Zeno’s Paradox we’re always advancing but never arriving. Unlike the singularity, though, I do expect a semantic web to emerge in my lifetime. The latest initiative is schema.org, sponsored by Google, by Yahoo!, and by my employer, Microsoft. Schema.org recapitulates prior efforts to define how webmasters can mark up web pages to include structured data. I hope that this time, thanks to collaboration among the major search engines, we’ll finally cross the activation threshold.

Meanwhile I’ve been toiling in another part of the semantic web. I’ve been trying to get webmasters people to understand why and how to publish calendars as machine-readable structured data in addition to human-readable text. If you’ve followed the elmcity saga you know I’m on a crusade to make more and better use of the Internet’s venerable standard for exchanging structured calendar events: iCalendar.

It’s been a struggle. Almost every website run by a school, club, business, or town has an Events page. Those pages are, almost always, data siloes: HTML or PDF files that can be read by people but cannot be processed by machines. Only rarely do such pages offer links to iCalendar feeds served up by Google Calendar or Drupal or Hotmail Calendar or some other service capable of producing such feeds. So when elmcity curators discover one of these rare feeds, it’s cause for rejoicing.

Sadly that joy is sometimes short-lived. A surprising number of iCalendar feeds just plain don’t work. That’s why I invited Doug Day to create the iCalendar Validator, a service that helps producers of iCalendar feeds conform to the specification. It’s always painful when I have to explain to a curator that the shiny new feed they’ve discovered doesn’t conform and won’t deliver events to the hub.

Here are three sources of iCalendar feeds that, I’ve recently discovered, don’t work.

1. The University of Michigan’s UM Events. It’s a major hub that serves many campus websites. As far as I can tell, all of those sites are providing feeds with malformed descriptions. Here’s an example of the problem and the fix. (iCalendar producer ID: UM//UM*Events)

2. CiviCRM is a “free, libre and open source software constituent relationship management solution.” Its feeds also have malformed descriptions. Here’s an example of the problem and the fix. (iCalendar producer ID: CiviCRM//NONSGML CiviEvent iCal)

3. Drupal is a popular open source content management system. I’ve seen Drupal feeds used successfully, but today I found one that fails for two reasons: a malformed recurrence rule, and a missing timezone definition. Here’s an example of the problem and the fix. (iCalendar producer ID: Drupal iCal API)

These problems are minor and would be easy to resolve. I’ll try to contact the authors of these iCalendar producers; if you can help put me in touch I’d appreciate that. I’m also going to look through the logs written by the iCalendar Validator, compile a list of producers of invalid feeds, and try to contact them as well.

Where’s the connection to the semantic web? At the end of the day, as RSS/Atom validator co-creator Sam Ruby likes to say, “It’s just data.” But structured data, whether it conforms to the dozen-year-old iCalendar standard or some newfangled microdata standard, is easily screwed up. And the consequences of screwups are often silent. Services that were looking for that structured data find nothing, mutter to themselves, and move along.

As we collectively create the semantic web we’ll need to make sure that the structured data we intend to publish really says what we mean.

I want to be the customer, not the product

If you follow this sort of thing, you already know about IFTTT. It’s a new web service that enables non-programmers to compose other web services. The acronym expands to If This Then That, and here are some ways you can use the metaphor:

If I am tagged in a Facebook photo, then save the photo to Evernote

If the library sends email saying my book on hold is ready, send me a text message

My colleague Scott Hanselman says this is bloody brilliant and I agree. It’s the next step in a journey that began for me back in 1999 when I mashed up Alta Vista’s search engine with Yahoo! directories to measure the mindshare of sites by category. More recently Yahoo! Pipes made service mashing easier for non-programmers. Now IFTTT enables everyone to play. Wonderful!

So why am I less enthusiastic about IFTT than I thought I would be? There are two related reasons. First, here’s what IFTTT says when you ask it to activate its Twitter channel on your behalf:

This application will be able to:

  • Read Tweets from your timeline.
  • See who you follow, and follow new people.
  • Update your profile.
  • Post Tweets for you.
  • Access your direct messages.

Excellent! This is an example of OAuth, a protocol that enables you to delegate powers to IFTTT without giving up credentials. Most of the services you can use with IFTTT support OAuth, and that represents another huge step forward for the web.

What if I only want to give IFTTT the power to tweet on my behalf, though, and not give up access to my private direct messages? More generally, how can I think about the tradeoffs involved in delegating all versus some versus no powers to IFTTT, across a range of services I might authorize it to use on my behalf?

This leads to the second and broader concern. If I’m not paying for the product, I am the product. As is true for many free services on the web today, I have no contractual relationship with IFTTT. I pay for the service it provides by surrendering access to my data. OAuth helps me negotiate how much access, but if I give up none then IFTTT is powerless.

Why, though, can’t I pay for the product instead of being the product? I want IFTTT to work for me, I want to pay for the service, and in return I want it to promise never to keep or use any of the data it exchanges on my behalf. I realize this may not be a popular option anytime soon. But it’s time to start the conversation. Services don’t only want to be free, they also want to be valuable. That’s rarely a choice nowadays. It needs to become one.

Beating the drum for Delicious

Yesterday’s stream of notifications brought two links paired with invitations for me to comment. The first link points to a NY Times story about how AVOS, the new owner of Delicious, plans to remake that service. Chad Hurley:

The home page would feature browseable “stacks,” or collections of related images, videos and links shared around topical events. The site would also make personalized recommendations for users, based on their sharing habits. “We want to simplify things visually, mainstream the product and make it easier for people to understand what they’re doing,” Mr. Hurley said.

The second link points to a blog post from Mark Surman, executive director of the Mozilla Foundation, who wants to teach the world to code:

This has been the premise behind much of what we have done with Mozilla Drumbeat: people who make stuff on the internet are better creators and better online citizens if they know at least a little bit about the web’s basic building blocks. Even if they only learn a little HTML, the web gets better.

I wish I could broker a conversation between Chad Hurley and Mark Surman. If mainstream folk used Delicious and understood what they’re doing when using it, they’d understand themselves to be makers of things on the Internet. The things they make are custom information systems. They make them by writing code, but not in the languages of HTML or JavaScript. Instead they use tag vocabularies that produce and consume web services. And services, I argue, are the most fundamental of the web’s basic building blocks.

Here is an example: http://www.delicious.com/judell/del.icio.us. Ostensibly it’s a list of dozens of articles I’ve written over the years about what I mean when I say that Delicious enables non-programmers to code and use web services. But it’s not just a list. I think of it as a web service. One aspect of the service provides the list in HTML format for people to read in browsers. Another provides the list in RSS format that enables cooperating services to watch the list and react when new items are added. Another enables the list to combine with other lists. Here, for example, is a subset of my Delicious-related articles that are also related to the elmcity project: http://www.delicious.com/judell/del.icio.us+elmcity.

More than anything before or since, Delicious empowers me to manage web resources — both personally and socially. Once those resources were mainly things we found on the web. Now they’re also things we make on the web. I hope the forthcoming Delicious makeover will help people understand it to be a tool for creating, mixing, and sharing web resources. And I hope it remains the sort of open web tool that Mozilla Drumbeat wants to popularize.

Why Sears doesn’t want you to think computationally

Last September we bought a new dishwasher to replace the old one that had failed. It was a reluctant purchase. We’d actually gone a couple of years doing dishes by hand, partly because we’ve been so disappointed by the modern generation of appliances. When the salesman at Sears mentioned their free 5-year preventive maintenance program, though, we decided to opt in. The plan entitles you to an annual appointment with a dishwasher tech who will come by to inspect your machine and do what’s needed to keep it in good working order.

Stoves, dishwashers, and vacuum cleaners shouldn’t require this kind of life support. I’m not going to win that argument, but I can at least make effective use of the life support service. Doing so requires a bit of a hack, though. Why? Remembering something annually, on a certain date, for five years running, isn’t the sort of thing that humans do well. It’s a task that begs for automation.

Of course Sears could remind me, in September of 2011, 2012, 2013, 2014, and 2015, about my dishwasher checkup. It would be easy for them to do. They’re a mega-corporation with a mighty IT department that can easily perform this feat of magic. But Sears doesn’t want to remind me. They’re betting that I’ll forget, as I’m sure most people do.

So they sounded quite surprised when I called yesterday, on the anniversary of my dishwasher purchase, to schedule my appointment. How did I do it? By casting this magic spell:

BEGIN:VEVENT
DTSTART;VALUE=DATE:20110902
DTEND;VALUE=DATE:20110903
RRULE:FREQ=YEARLY;COUNT=5
SUMMARY:sears dishwasher
END:VEVENT

That’s an event recorded by my calendar program. It happened first on September 2, 2011, and will happen again yearly for five years. I cast my spell using Outlook but you can do the same thing using any calendar program: Google Calendar, Apple iCal, Hotmail Calendar, Lotus Notes, many others.

When I talk about iCalendar feeds in the context of the elmcity project, I tend to focus on the idea that these are data feeds, which they are. But iCalendar has a special property. Some of that data is actually code. In this example, here is the one line of code:

RRULE:FREQ=YEARLY;COUNT=5

In iCalendar lingo, RRULE means recurrence rule. From Outlook’s or Google Calendar’s point of view the rule is a tiny program and they are the operating systems that run it. Here are some other RRULES that calendar applications enable you to express:

every Tuesday at 10AM

every first Sunday until October 2011

every September 2 for five years

You don’t have to do it this way. You can, instead, record each event separately. Even though calendar software makes it quite easy to define repeating events, I’ve got a hunch that in the dishwasher scenario a lot of people would use data (five discrete events) rather than code (one event that expands to five). Why? For the same reason that many people will manually adjust the font size used for every paragraph in a document, rather than creating a rule that governs all the paragraphs.

My list of core principles for web thinkers doesn’t yet include the idea of code that generates data. I’ve found it plenty challenging just to get people to think about the nature of their data, about how they do or don’t control it, and about how it does or doesn’t flow through networks.

But if we want everyone to be able to automate tasks that otherwise get done poorly or not at all, we probably do need to find a way to teach patterns like code-generated data and Don’t Repeat Yourself more broadly than just to students of computer and information sciences.


If you want to read a lovely short essay on calendar software and our relationship to the future, I highly recommend Paul Ford’s Tickler File Forever.

Be authoritative to stay DRY

As the environments in which we live and work become augmented by networked information systems, it behooves us to learn something about how those systems work — and about how to work those systems. “But I don’t need to know how my car works,” you say, “why do I need to know how my computer works?” You don’t. That’s the wrong analogy.

Our civilization’s enabling infrastructure exists only because we’ve created many different kinds of specialized knowledge, and because we — the knowers and practitioners of these specialties — participate in networks of exchange. It’s a good thing that most people don’t need to know how to repair faulty disc brakes or laptop hard drives.

It would be really bad, though, if most people didn’t know anything about the physical laws that keep the car’s rubber on the road, or the social laws that govern traffic intersections. That’s the level at which people need to know about networked information systems.

A lot of what the creators of those systems know isn’t at that level. A few things are, though, and I’ve been working up a list of things creators know that users could and arguably should know. From time to time I think of adding another item to the list. So far, though, everything that comes to mind is already, in some essential form, on the list.

The latest example is a rule known as Don’t Repeat Yourself. Programmers invoke DRY when they squeeze redundancy out of code or data. Where does the duplication come from? Information systems, like human cultures, evolve by copying parts of themselves — and of one another — and then by modifying the copies. That’s the natural and healthy trend toward diversity. But systems and cultures also evolve by converging on a core of shared commonality. That’s a natural and healthy countervailing trend. The most successful copies need to merge, at the right level of generality, with the core.

These two styles are in dynamic tension. On the C2 wiki, where Ward Cunningham has for many years hosted a conversation about the core principles that govern information systems, the topics DontRepeatYourself and PrematureGeneralization express that tension. It’s good to DRY things out, but bad to generalize prematurely.

Does that rule belong on the list? Maybe. I wish programmers weren’t the only ones feeling and responding to the tension between DRY and WET1. Anyone who aims to automate work, for example, needs to learn how to walk the WET/DRY tightrope.

But maybe wringing out redundancy isn’t the essence of DRY. Here’s what the noted software pragmatist Andrew Hunt says on the DontRepeatYourself wiki page:

Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.

That’s an assertion about the value of authority, not the problem of duplication. And the first rule on my list already says: “Be the authoritative source for your own stuff.” In the context of the elmcity project, which is the incubator for the list, that means if you’re promoting a calendar event online, you ought to publish a single authoritative version of that calendar entry to a system that’s accountable to you. You shouldn’t have to repeat yourself by making copies of the calendar entry in systems that aren’t accountable to you.

When you’re the authoritative source for some set of facts, and when you inject those facts into the networked information system called the web, Don’t Repeat Yourself is a great principle to keep in mind. I’ll be delighted if you do. But it’s the underlying core principle of authority that I most want you to embrace. When you’re the authoritative source for your own stuff, you’ll naturally tend to stay DRY.


1 There’s no agreed-up expansion of DRY’s opposite, WET. Here’s mine: Watch, Emulate, Transcend.

Learning to automate work

I’ve been mulling Michael Schrage’s recent essay, Why You Should Automate Parts of Your Job to Save It, since I read it last week. Here’s the conclusion:

What is the most important thing you do on your job? What portion of that could be turned into an app that anyone in your organization could effectively use? What portion of that could be automated and fed directly into the larger system with only minimal review by you? What’s the least valuable but essential part of your job? Why aren’t you figuring out ways to automate it on your iPad or Android?

People with the best answers will likely discover they also have the best job security.

I agree with the premise. But something kept bugging me about the argument and today I realized what: the gadget focus. We’ve seen this before. Remember when computers in the schools were the answer? Now it’s smartphones and tablets in the workplace. But these are all just access devices. We focus on them because they seem more real than the networks they connect us to. It’s easy to see that devices made of metal and plastic are tools. It’s much harder to see that networks made of data formats and application protocols and communication topologies are tools. But information networks matter more than the devices we use to access them, or the applications that run on those devices. The key to the automation of knowledge work that Schrage righly prescribes isn’t learning how to use smartphones or tablets. Rather, it’s learning and then applying core principles that govern information networks.

Sadly we don’t teach these principles. Not even, in any systematic way, to information technologists. And certainly not to the bank loan officers and nurses and “iPad-wielding waitresses” in Schrage’s essay. Can it be done? I don’t know but I think I’d enjoy trying.

The unaugmented mind

A couple of years ago, when I needed to call someone, my phone wasn’t where I thought I’d left it. This was a problem. Back then I often called this person but I had no idea what his phone number was. Why would I? Remembering numbers is a job I delegate to my phone.

And finding my phone when I forget where I left it is a job I delegate to other phones. But when I reached for my cordless office phone it wasn’t where I thought I’d left it either. No problem. Finding my cordless when I forget where I left it is a job I delegate to its base station which is tethered and can’t wander.

So I walked over to the base station, paged the cordless, found it under a pile of papers, used it to call my cellphone, found it under another pile of papers, and used it to call my friend. Then I paused to reflect on technological augmentation.

Now don’t get me wrong, augmentation is a wonderful thing. Even fish, we have recently learned, use tools. I love delegating mental chores to devices and to the cloud. I am not a Luddite. But I am starting to think more about when not to delegate, and why not.

My mom is almost 90. She’s always known the numbers of the friends she often calls, and she still does. That’s a good thing because macular degeneration makes it impossible to read the numbers in her phone’s directory and difficult even to read the numbers she’s printed extra-large in her address book.

I’m not planning to memorize phone numbers. But I am exploring ways to usefully exercise the memory muscle. Just because I can look everything up doesn’t mean that I always must. Some kinds of things are worth keeping in the cache. But which?

In Behind the Dream Clarence Jones, Martin Luther King’s lawyer and adviser, writes:

What amazed me was that there was absolutely no reference material for Martin to draw upon. There he was [in the Birmingham jail] pulling quote after quote from thin air. The Bible, yes, as might be expected from a Baptist minister, but also British prime minister William Gladstone, Mahatma Gandhi, William Shakespeare, and St. Augustine.

If there’d been a web in 1963, and if MLK could access it from that jail, would the Letter from a Birmingham Jail have turned out differently? Would the differences have mattered? I’m not sure. It’s interesting to note that the quotes Clarence Jones seems to recall being in the letter aren’t all there. I don’t find Gladstone, Gandhi, or Shakespeare. I do find, along with St. Augustine, Socrates, Thomas Aquinas, Paul Tillich, Abraham Lincoln, Thomas Jefferson, T.S. Eliot and others. Does the discrepancy matter? Not really. What Jones remembers, and what I will now remember, is that MLK could remember, not precisely what he did remember.

Clarence Jones continues:

I have often said the sheer processing power of Martin’s mind left me awestruck. His dexterity with memory and words ran along the lines of the cut-and-paste function in today’s computer programs. The “Letter from a Birmingham Jail” showed his recall for the written material of others; his gruelling schedule of speeches illuminated his ability to do the same for his own words. Martin could remember exact phrases from several of his unrelated speeches and discover a new way of linking them together as if they were all parts of a singular ever-evolving speech. And he could do it on the fly.

Jones tells us that it was he who wrote the draft of I Have a Dream speech. And that Martin Luther King began to deliver it more or less as written. Then Mahalia Jackson called out, “Tell ’em about the Dream, Martin.” So he did. He set aside the text that Jones had written, and that he had edited the night before, and gave an impromptu speech for the ages. Among many factors that conspired to make that possible were the processing and memory powers that Jones describes.

As our relationship to devices and the cloud reorganizes our brains, those powers are changing. But we’re not just passively experiencing these changes. We are actively co-creating the powers of our individual brains and of the collective brain we’re becoming.

When I was a kid I used to memorize poetry. A couple of years ago I was feeling no need to do anything like that ever again. But now I find myself wanting to exercise the memory muscle. I’ve decided that certain kinds of things belong in the unaugmented part of my brain. Among them, for me, right now, are fingerstyle guitar arrangements. My repertoire has grown slowly over the years, and it’s been a challenge to learn new arrangements. Lately I’ve been working to improve my ability to memorize them, though, and the effort feels intrinsically rewarding.

I’ve also noticed that one of the best talks I’ve ever given was the product of careful memorization. I think I see now why Ignite talks and Moth stories are done live without notes. I love having an outboard brain. But until we get the implants, we’ll want to keep the onboard one humming.

Distracting chatter is useful. But thanks to RSS (remember that?) it’s optional.

When I left the pageview business I walked away from an engine that had, for many years, manufactured an audience for my writing. Four years on I’m still adjusting to the change. I always used to cringe when publishers talked about using content to drive traffic. Of course when the traffic was being herded my way I loved the attention. And when it wasn’t I felt — still feel — its absence.

There are plenty of things I don’t miss, though. Among them is the obligation to be an aggressive early adopter of (and opinionator on) every new tech fad. Now I can hang back, wait for the fads to spread beyond the geek echo chamber, and watch how my civilian friends, family and acquaintances react to them. Since none of the civilians I know have moved to Google+, I can’t gauge their reactions yet. While waiting for some of them to jump into the pool I’ve dipped a toe in the water, considered my own reaction to the New Thing, and compared it to the collective reactions of the geek tribe.

Mine seems atypical: I’ve reached into a corner of my closet, pulled out the RSS reader I left there, and used it to find nourishment that online social networking seems no longer to provide. Last night’s 17-course meal was a selection of recent essays by Gardner Campbell, Brian Dear, Lorianne DiSabato, John Faughnan, Paul Ford, Cliff Gerrish, Ned Gulley, Eugene Eric Kim, Adina Levin, Hugh McGuire, Cameron Neylon, John Quimby, Antonio Rodriguez, Scott Rosenberg, Doc Searls, Ed Vielmetti, and Ethan Zuckerman.

These writers are among many who write because they want to and because they can. They write in their own online spaces which I follow in my RSS reader. When I seek nourishment from them I can go directly to their spaces. No business models drive me there. Often, to be sure, I have been led there by way of a comment on one or another of the social networks. That had become so common that I came to accept a lot of distracting chatter as the price of discovering things to read. But Google+ seems to be the camel’s-back-breaking straw. The price has gone too high. So I’m rediscovering what made the blog network so thrilling to me a decade ago: unmediated access to people writing for the love of it in their own online spaces. Distracting chatter has its uses. But it’s optional.

A California-sized solar panel

Guy Sorman’s The End of Green Ideology begins:

The meltdown at the Fukushima nuclear plant has sent political aftershocks racing around the globe. More often than not, however, the shocks have been ideological, with no basis in science.

I’ve been reexamining the case for nuclear power for a while now. I still think we’ll probably need to keep developing it, improving it, and including it in the mix. But I’m willing to be convinced otherwise and I’ll watch Germany’s forthcoming nuclear exit with great interest. In any case, I agree with Guy Sorman: let’s make sure our energy future is based on science not ideology.

So I was puzzled to find this assertion in the middle of his critique of green ideology:

If California were to rely on solar power for its electricity consumption, the entire state would have to be covered with photovoltaic cells.

Really? That seems wrong. According to an infographic called Surface Area Required to Power the World (with zero carbon emissions and with solar alone), assumptions and methodology here, it looks like a California of solar panels could more than power the world.

For reasons Sorman alludes to — cost, environmental impact — it probably wouldn’t make sense to build a California of solar capacity, regardless of how it’s distributed around the world. But let’s just focus on the assertion that California would need all of itself to keep the lights on using solar photovoltaics. Is that really wrong? If so, how wrong? What’s the right answer? And how can we find out?

Before the advent of WolframAlpha I would sometimes idly speculate about these kinds of questions, but I wasn’t able to effectively analyze them. Now I can. From various sources, I think I know that a PV panel can produce on the order of 10 watts per square foot. So we can ask WA directly:

area of california in square feet * 10 watts per square foot = 45.64 TW

How can we think about 45 terawatts? I recall from Saul Griffith’s Climate Change Recalculated that the whole world runs on about 16TW. This confirms what I gleaned by eyeballing the infographic: Solar California could more than power the world.

But where does Saul’s 16 TW number come from? Can we cross-check it? The infographic assumes that we were running at 500 quadrillion BTU in 2008, projected to rise to around 680 quadrillion BTU in 2030. The US Energy Administration’s International Energy Outlook 2010 cites similar numbers. I’m not good at unit conversions, but WA is:

500 quadrillion btu in watt years / 1 year = 16.73 TW

This matches so closely that I wonder about the provenance of the number. Do all these analyses use the same source, or are there independent estimates that converge? But anyway, let’s assume that 16 TW is in the ballpark. How much electricity does California use? (Recall that this was the quantity of energy Guy Sorman thinks would require a California-sized solar panel to produce.) A couple of sources say that California uses about a quarter million gigawatt hours of electricity in a year. How much is that? WA provides useful comparisons:

a quarter million gigawatt hours = 1/15 total production of electrical energy in US in 2001 = 2 * electricity consumption of Norway in 1998 = 28 * daily electric energy production of all nuclear power plants

a quarter million gigawatt hours / 1 year 2000 hours = 28.5 125 GW

45 TW is about 1600 360 times more than that, so I think that’s how wrong Sorman’s claim is.

If a California-sized solar panel could produce 45 TW, then how much of California would be needed to produce 28.5 125 GW? Let’s ask:

area of California / 1600 360 = 102 455 square miles = 1/15 1/3 area of Rhode Island = 2.2 * area of Walt Disney World 1.1 * land area of Hong Kong

As with other essays in my energy literacy series I am mainly interested here in how tools like WolframAlpha can help us reason our way through a thicket of quantities and unit conversions. Hundreds of people liked Guy Sorman’s essay on Facebook. Dozens tweeted it and the one comment I can retrieve calls it a “balanced and scientific assessment of world’s current and future energy outlook.”

I don’t know enough to agree nor disagree with Guy Sorman’s conclusion:

Future energy supplies will most likely rely more and more on miniaturized nuclear plants and shale gas — a mix capable of responding to a rapidly urbanizing world population’s growing demand for electricity.

But I do know that we need to be able to verify and reproduce analyses that purport to be scientific. WolframAlpha has become the View Source button that helps me do that.

3D printing and human skill

This National Geographic video about 3D printing exemplifies the worst kind of gee-whiz reporting. Just scan a crescent wrench, print it, and bingo, you’ve copied a real tool with moving parts!

Not.

A commenter notes differences between the copy and the original and concludes:

If the real wrench was simply scanned, this would not have happened. A human has built the design data.

3d printing is cool, why do they feel they have to lie about the input method?

The input method is, of course, 3D CAD. From the product brochure for the printer:

Z Corp.’s 3D printing technology leverages 3D source data, which often takes the form of computer-aided design (CAD) models.

Gee-whiz reporting insults our intelligence and trivializes its subject matter. It’s fun to imagine a magic replicator, but it’s more interesting to know about the human/computer interaction that makes real replication possible.

Once I wrote a review of a dozen 3D CAD programs for BYTE Magazine. The benchmark was a model that I commissioned an architect to design. We called it the BYTE Pantheon and it looked like this:

My job was to construct that model in each of the dozen CAD programs. It was hard! That was partly because I had no prior experience with CAD software. But it was also because each program had its own way of using 2D gestures to manipulate 3D objects. That was my main takeaway from the project. There wasn’t (and I think still isn’t) a standard suite of gestures. Even if there were, and even (I suspect) when you can use 3D gestures, it would still be hard because you are making a precise description of a complex object. Wikipedia calls CAD an “industrial art” for good reason. Models with the same functional qualities can differ in terms of style and sophistication. Those differences come into play when the model is shared and modified. Or so I imagine, anyway. I’m not a 3D modeler but I understand 3D modeling to be a process akin to programming.

A friend of mine, Gary Spykman, describes himself as a designer, furniture maker, and artisan. He has also become a 3D modeler, and uses SketchUp to explore his designs and render them for clients. A couple of years ago, Gary designed and built what he calls his cabana. Here it is as designed in SketchUp, and as built in Gary’s back yard.

When I saw what Gary was doing in SketchUp I was inspired to try using the program for some simple needs of my own — to visualize my geodesic tomato suspension dome, and more ambitiously to visualize a remodeling of our kitchen. And you know what? It was just as hard as I remembered! If you do this stuff for a living, as Gary does, then it becomes second nature. But if you only do it occasionally, like me, you’ll be impressed every time with the level of skill required to precisely describe an object or a scene.

Like the commenter on YouTube I have to ask: why lie about this? National Geographic’s gee-whiz reporting doesn’t just fail to inform. It also fails to celebrate the synergy between computational power and human skill that makes 3D modeling so fascinating.

Can elmcity and Delicious continue their partnership? (2nd try)

Delicious has been part of my life for a long time. I first wrote about it back in August of 2004. I know this because Delicious helped me remember. The link has gone stale because I wrote the article for an online publisher, which turns out to be a good way to get published but a lousy way to stay published. Thankfully Wayback remembers what InfoWorld forgot:

Pub/sub, tags, and human filters

In 2002, InfoWorld gave a Technology of the Year award to “publish/subscribe” technology. In the writeup I mentioned Kenamea, KnowNow, and the Flash Communications Server. The del.icio.us bookmarking system has some of the pub/sub flavor of those systems, as well as some of the blogging flavor.

In the blog network, you publish to a personal identity (your own), and you subscribe to other people’s identities. In systems like KnowNow and Kenamea, people (and also applications) publish to, and subscribe to, topics.

Consider the del.icio.us tag e4x, which I created today to help me keep track of this article on a subject I expect to learn more about soon. At the moment, my e4x page and the systemwide e4x page are the same: mine is the one and only use of that tag.

Even if I’m the only one to collect e4x references by means of that tag, it will have value. I’ll be able to access a set of bookmarks from anywhere, and easily share them. Things could get more interesting if other people’s e4x references start to show up when I visit (or subscribe to) the tag. Whether del.icio.us (or an analogous service) will reach a scale that makes that likely, for specialized as well as common terms, is an interesting question.

Once a tag does reach critical mass, another interesting question arises. Do you monitor the global view or do you rely on one or more user-filtered views? I guess the answer is both, at different times. When a tag is new and receives little traffic, watch the whole thing. If traffic grows too heavy or too noisy, interpose trusted human filters.

Looking back I can see what attracted me to Delicious. It embodies what I’ve come to know as ways of thinking like the web.

I am now working on a service that invites people to learn and apply web thinking in order to systematically inform one another about things. My web service uses Delicious as a partner service. One reason is that I am virtuously lazy. I would much rather use a service than create one. The elmcity project only cares about one thing: calendar syndication. If it can partner with a service like Delicious for other things — managing lists of feeds, configuring hubs — then I can focus on trying to do the one thing that really matters to my project.

But there’s another reason. I believe that people who use Delicious in the way that elmcity curators do are learning to apply some key principles of web thinking. Things like informal contracts, information chemistry, the pub/sub communication pattern, and the structure of information,

I wrote up specific examples recently in Can elmcity and Delicious continue their partnership? Today I realized that I still lack an answer to that question. If the new terms of service are going to require me to swap out Delicious for another service I should get cracking. But first I’ll try again. Is it OK for elmcity to keep using Delicious the way it has been? If anyone reading this can help me get that question answered I will be grateful.

Practicing for an Ignite talk

Recently I did my first Ignite-style talk[1]. It’s an interesting format: a 5-minute 20-frame slideshow set to auto-advance every 15 seconds. The format has its roots in the 5-minute lightning talks that I remember from early Perl conferences. In lightning talks the slides were optional, you just had to finish on time or get gonged. (I can still see Larry Wall cheerfully ringing the gong on others and just as cheerfully having it rung on him.) Ignite makes slides mandatory. The 15-second cadence invites you to think in stanzas; it’s a nice constraint to embrace.

The lore on how to prepare for these talks also has roots that connect Mark Fowler’s 2004 Giving Lightning talks to Jason Grigsby’s 2008 How to Give a Successful Ignite Presentation to many others more recently. Everyone agrees: practice. But how?

For mine I wrote a script in 20 stanzas and then set about tuning them to the required intervals. My first thought was to refer to a clock while reading the script aloud and editing it, but it was hard for me to look back and forth between the clock and the script. So I made a couple of audio tracks for timing. countdown-slide.mp3 says “3, 2, 1, slide” and then every fifteen seconds, “slide” again, finishing with “end.” countdown-5-10-slide.mp3 adds “five” and “10” at the appropriate intervals. Both turned out to be helpful in different ways.

For tuning the written script to the intervals, I used the countdown-5-10-slide track which gave me plenty of cues to help gauge the edits. For practicing the script I used the countdown-slide track which emits exactly the stream of cues you get in the talk: start, a cue every 15 seconds, then stop.

As is often appropriate for an Ignite talk my slides were mainly pictures not words. I tried to search for and use only images licensed for sharing, but the discoverable pool of such images isn’t nearly broad or deep enough. So I fell back to grabbing images from Google and Bing searches, feeling guilty about that, and wondering what it will take to make the pool a lot broader and deeper.

I wasn’t sure at first I’d need the countdown-slide track — the one that just says “slide” every 15 seconds. If you practice and memorize the script while watching the slides then you’ve got your cues, no need for audio timing. But after a few run-throughs I got antsy and wanted to go for a hike. That’s where the countdown-slide track really worked, in a couple of ways. It not only provided the cues, it prompted me to visualize the slides. From then on I could practice anywhere I wouldn’t mind being seen talking to myself: running, hiking, driving to the airport. I hardly used the slides again.

When I did use the slides, in a few practice runs and then in the talk, I saw how helpful it had been to have visualized them, but not seen them, while practicing. I’d learned to do the talk from memory without the slides. Doing it with them was, by comparision, easier.

This makes perfect sense, of course. I think it’s related to how musicians memorize music: hear the tune, see the notes on the page, feel your fingers on the instrument. Then selectively omit the audio track, the sheet music, and even the instrument, and do the hearing, seeing, and feeling in your mind.

A couple of weeks later I was on a panel where I had up to 10 minutes to speak. I wound up using only 4 minutes, and while there weren’t any slides, I still wrote it out as a story told in memorizable stanzas. I think it turned out better than if I’d used the whole time for something less tightly constructed.

The 4-minute panel talk turned out to be harder to learn than the 5-minute Ignite talk, and now I see why. Even though slides weren’t required, I could have used them as practice cues! I guess that’s what Joshua Foer and other memory experts keep telling us: divide things into chunks, tag the chunks with pictures.


[1] The subject was barefoot running. I think it’ll be posted soon.

A Bretton Woods solstice

Yesterday I joined a panel at the New England Conference of Public Utilities Commissioners. I was the odd man out in the group but that was the point. The organizers wanted somebody other than the Usual Suspects to bring an outside perspective to the panel. Here’s roughly what I said.

My phone bill is itemized down to the last minute and second — every call, every number. For the longest time I’ve wanted my electric bill to be itemized in the same way, right down to the watts actually used by every appliance.

How can you decide whether to replace your old fridge if you don’t know what it really costs to run it? Or how guilty should you feel, or not feel, about turning on the air conditioner in June, if you don’t have the data?

Well I’ve finally got the data, at least sort of, thanks to the smartmeter I installed recently. It’s a first-generation device; it’s a little flaky; it doesn’t track individual appliances. But it does give me realtime feedback about how many watts my house is burning.

That’s a really interesting number. When you turn off some lights, you see the difference right away, in watts and in pennies per hour. It’s a powerful behavior changer.

Around the time I was installing this thing I heard a commentary on NPR about smartmeters, The title of the piece was “Smart Meter, Big Brother,” and you can guess what it was about. Smartmeters are an unpredictable new technology, they bring unforeseen privacy risks that none of our statutes and regulations have ever thought about.

What was the guy worried about? Well, suppose you come home every night around the time the bars close. The electric company can tell because it sees your lights and appliances come on. Then somehow it leaks that data to your insurance company, which raises your premiums.

Really? I don’t know, to me there’s nothing new here. Most people I talk to have given up on privacy. They just expect that’s what would happen with your data.

Here’s what would be a new twist. Why do we just assume that a smartmeter will automatically phone its data home to the electric company? Mine doesn’t. It only feeds data to my own home computer, and from there to wherever I route it. PSNH doesn’t know anything about this. [ed: Well, I guess they do now :-)]

This reminds me of what we’ve been seeing in IT for quite a while. Consumer technologies at the edge of the network have disrupted enterprise technologies at the core, Telecom feels this disruption intensely right now. I’m wondering if other utilities, like power, will start to feel it too.

I know a guy who runs a company that does demand management for big box retailers like Michaels and Petco. He drops a package of instrumentation and controls into your store, he connects it to the web, and then when there’s a rolling brownout in California he can dial down the lights and ventilation and AC in all the buildings across his network.

He picked the retail sector because every one of those stores has the energy footprint of 20 or 30 homes. And he avoided the residential sector because it’d be a lot harder to have the same kind of impact there.

But now I’m wondering if we’re going to start to see the crowdsourcing of demand management. I’ve already got a do-it-yourself Internet-connected smartmeter. How much longer until I can add DIY controls to dim the lights or schedule the dishwasher to run off peak? And then how much longer before I can connect up with a bunch of other people who want to do the same things?

I’m not saying this will happen. But it could. And if it did, we wouldn’t need to wait for legislators and regulators to figure out how to deal with some new privacy threat, because there wouldn’t be a threat. It would just be people choosing to share their data with other people in order to conserve energy. And, by the way, they’d be having a lot of fun doing it too! Think massively multiplayer online game for the smart grid.

Now maybe I’ve told the wrong crowd about my DIY smartmeter. Maybe I’ve already broken some rule I don’t know about. But if not, or in any case, I’d like to put this crazy idea onto the table for discussion.

For me it was a chance to hang out with a bunch of public utility regulators and watch them wrestle with thorny issues. Does regulation often stifle innovation? Yes. Is regulation a means to socially just ends, like rural broadband? Yes. I found it fascinating.

Also, I got to spend an evening and a morning at the fabulous Mount Washington hotel during a perfect New Hampshire solstice.

Dream slack key for Father’s Day

I guess because I lost my own dad a few years ago, I was really moved by Sunday’s outpouring of Father’s Day sentiment. On Twitter, on Facebook, on blogs, everywhere you looked online you found people sharing an “I miss my dad” moment. Then today, while searching YouTube for renditions of a beautiful Hawaiian slack key guitar tune I’m learning, called Moe ‘Uhane, I found this wonderful version. And even better, this comment:

I was there when he taped this on my little tape recorder back in the 80’s. I was sleeping and woke up to find him playing still in his pj’s. Miss my dad. Thanks for representing. Sounds awesome!

– Mahina Chillingworth

Sweet! The tune came to Sonny Chillingworth in a dream, and then his dreaming daughter woke up to hear him recording it.

Garden gates can swing two ways

My latest Radar essay makes the modest proposal that Facebook might, in some cases, syndicate my data from elsewhere rather than requiring me to type it in. Most people think that’ll never happen. Paulo Eduardo Neves sums up why not:

I don’t think they have any intention to open gates in their walled garden.

Of course garden gates can work two ways. They can keep things in or out. We can all appreciate why Facebook wants to keep things in. But is it really in Facebook’s interest to keep things out? That would require Facebook to become the home for all of our photos, our calendars, and every other stream of data we create. What a burden! Why not let a decentralized internet carry some of that burden?

What’s matters most to Facebook, I should think, isn’t my photos and my calendars, but the surrounding interaction that it can uniquely enable, capture, and monetize. Couldn’t inbound syndication amplify that interaction? Dunno, just asking.

Liberating the Swamp Bats calendar

One of the great pleasures of summer in Keene, NH is our New England Collegiate Baseball League team, the Swamp Bats. I tell people that going to one of the Bats’ home games at the high school’s Alumni Field is like winding the clock back fifty years and bringing a Norman Rockwell painting to life. Fans arrive early and set up lawn chairs along the first base line. Kids run potato sack or frozen T-shirt races between innings. College players from teams around the country, some destined for the big show, remind you how sweet the little show can be.

Of course the Swamp Bats schedule should syndicate through Keene’s calendar hub. And last year it did. The Swamp Bats site was using Google Calendar, which provides an iCalendar feed, so I just added that feed to the hub.

This year there’s a new website based on the Joomla content management system. When I first looked at its rendering of the schedule, my heart sank. The iCalendar feed was gone!

On closer inspection, though, I found that it was still lurking in the background. The sites’ calendar is served up by a Joomla component called GCalendar which wraps an instance of GoogleCalendar. Why? The documentation explains:

No longer are you forced to use an i-frame and settle for a less then ideal look. Now you can integrate a Google Calendar directly into your website – using AJAX. This extension pulls directly from your Google Calendar within Google and displays it directly on your website.

Fair enough. The standard IFrame method for displaying a Google Calendar widget is, indeed, less than ideal. But in the process of wrapping the widget so that webmasters can make pages that look nicer, the iCalendar feed was left on the cutting room floor. That deprives visitors to the Swamp Bats website of the opportunity to add the Swamp Bats calendar to their personal calendar programs. It also prevents the Swamp Bats calendar from syndicating through an elmcity hub or directly to media outlets.

This omission isn’t an exception, it’s more like the rule. Web designers and builders obsess about how sites look, but typically ignore how they connect — or don’t — to the emerging web of data. As a result, I had to ferret out the hidden Google Calendar in order to connect the Swamp Bats schedule to the elmcity hub.

After some poking around I found it by viewing the source of the month view, which looks like this:

It’s not obvious, but if you click the down arrow above June 2011 a list expands:

In the HTML source for the list, two Google Calendar IDs appear:

<tr>
<td>
<input type="checkbox" 
  name="5nmm1e33jj6bfo14jq9jv44p18%40group.calendar.google.com" 
  value="/index.php?option=com_gcalendar&view=jsonfeed&format=raw&gcid=1&Itemid=110" 
  checked="checked" onclick="updateGCalendarFrame(this)"/>
</td>
<td><font color="#6b49b0">Keene Swamp Bats</font></td>
</tr>
<tr>
<td>
<input type="checkbox" 
  name="8s9qdhf61u2q3697vocm6abkg0%40group.calendar.google.com" 
  value="/index.php?option=com_gcalendar&view=jsonfeed&format=raw&gcid=2&Itemid=110" 
  checked="checked" onclick="updateGCalendarFrame(this)"/></td>
<td><font color="#9e8462">Keene Swamp Bats Away</font></td>
</tr>

A Google Calendar ID is an email address at the root of a family of related URLs you can use to embed the calendar’s widget on a page, or subscribe to the calendar’s public (or maybe private) feed. In this case I’m after the public feed. Here’s how you form its URL from a root email address:

http://www.google.com/calendar/ical/ + EmailAddress + /public/basic.ics

Applying the rule to the first item in the list1 produces this iCalendar feed. I plugged its URL into the Keene hub, and now it knows that the Bats are playing the Holyoke Blue Sox tonight at Alumni Field:

I’ve also subscribed to the feed in Outlook, so I can see the games as an overlay on my personal calendar. Another Swamp Bats fan could do the same in Google Calendar, or Hotmail Calendar, or Apple iCal, or any other standard calendar program.

All’s well that ends well, I suppose, but geez, it really shouldn’t be this hard. Web designers and builders ought to think like the web. If you regard the web is an interactive experience, they do. But the web is also an ecosystem of linked data. That way of thinking has, so far, tragically failed to sink in.

Web pros! Wake up! There’s more to this game than achieving the “ideal look.” When you are working with data, please make it available as data to the people and the systems that need it.


1 What about the second item? That calendar is empty. It seems the intent was to provide two calendars, one for home games and the other for away games. But in fact, for some reason, the first calendar has both, and the second has none.

Ernest Hebert’s William Faulkner rant

Ernest Hebert is an author and Dartmouth professor who was born in Keene and writes fiction about this area. During an interview with the Keene Sentinel he unloaded a gorgeous rant about William Faulkner. It’ll soon vanish behind the Sentinel’s paywall. So as a public service, and to ensure I can refer to it later, I’m placing it here for safekeeping.

Q: How do you feel about being compared to William Faulkner?

A: I hate being compared to Faulkner — this kind of uppity, snooty southerner with his turgid prose based more or less on the Bible. I can’t bear to read Faulkner. It makes me want to puke. I just loathe Faulkner. And you can quote me on all of that.

Done!

Syndicating Facebook events

My wife Luann showed her new art work at a local venue last Saturday. Here’s how the event looked in Keene’s elmcity hub:

It got there by way of a new technique I just added to elmcity’s repertoire. Until now, the only way to syndicate events from Facebook through an elmcity hub was the one described here. In that scenario a curator asks an elmcity hub to search Facebook for public events in the hub’s location. This hasn’t worked well. If you use Facebook’s API to search for public events using the term Keene, NH you’ll find events, but only ones that include Keene, NH in the event’s title. Events that mention Keene, NH in the location field are oddly missing.

So until now, if you wanted to use Facebook to promote a public event in Keene, you had to use Keene, NH in the title to get it to work. Being married to me, Luann knows to do that, and her event was already appearing in the hub. But for most people this sort of hack will (and should) be a non-starter.

Even if Facebook’s API worked the way I’d expect, and could find public events by location rather than just by name, it’s not really the right thing. The elmcity model puts event owners in charge of data feeds that hubs (and other consumers) access at specified URLs. It’s nice to know that your public events in Facebook can be found via search. But if you want to syndicate those events through a hub you’d rather publish an explicit feed URL.

It turns out that you can, but in an odd way that requires some explaining and raises important questions about the evolving landscape of online identity. The new elmcity technique relies on the Export link at the bottom of Facebook’s Events page. The label, Export, connotes private use of the iCalendar feed behind that link. The feed is primarily for Facebook users who want to sync their Facebook Events pages to their personal calendars. When you click the link, you’re shown an URL like this:

webcal://www.facebook.com/ical/u.php?uid=652&#8230;.115&key=AQD…qcT

If you change webcal to http you’ve got one of those special sharing URLs that are public, in the sense that they live on the open web, but also private, in the sense that they’re not discoverable. You wouldn’t use this kind of URL for anything really sensitive. But it can be appropriate for calendars, or friends-and-family photo galleries, or other cases where security-by-obscurity is a reasonable tradeoff.

Syndicating Facebook events

When I fetched the URL for Luann’s Facebook events, by way of her Export link, I had an iCalendar feed that was a mixed bag. It included events to which Luann had been invited by friends; those events were marked private. It also included the event that Luann was promoting; that one was marked public. Ideally Facebook would provide a separate URL for just Luann’s (or any Facebook user’s) public events. There would be nothing secret about that URL, it could be shared freely on the open web.

Lacking such an URL from Facebook, elmcity has to synthesize it. To do so, it filters the private feed to include only events that meet two criteria:

  1. They belong to the Facebook user, not to a Facebook friend of that user.

  2. They are marked public.

Here are the iCalendar properties that enable such filtering:

ORGANIZER;CN=Luann Udell:MAILTO:luann@luannudell.com
CLASS:PUBLIC

In this example, when I excluded everything in Facebook’s iCalendar feed that wasn’t organized by Luann, and wasn’t public, I was left with a feed containing just one event: Luann’s art opening. That’s the feed I wanted to tell the Keene hub to subscribe to.

My first thought was to use the normal elmcity mechanism for subscribing a hub to calendar feeds. The hub’s curator bookmarks the feed in a designated Delicious account. In this case, there would need to be an extra bit of metadata to enable the hub to filter the feed properly. It could easily find events marked PUBLIC. But how would it know to find Luann’s public events? For that it would need the name of a Facebook user, in this case Luann’s name.

At first blush that seemed easy to solve. The elmcity service uses Delicious tags to convey metadata to hubs. I could define a new convention like so:

The combination of the trusted and ics and feed tags is the normal way a curator tells a hub that the bookmarked URL is an iCalendar feed that the hub should try to process. The who=Luann+Udell tag would be extra metadata telling the hub to restrict a Facebook calendar feed to only the events organized by the named Facebook user.

Problem solved? Unfortunately no. Do you see why not? This mechanism leaks private information. Although the elmcity hub isn’t going to publish anything other than Luann’s public event, her Facebook feed also contains a private event from Judy. Anyone who scans the feeds for the Keene hub would see the unfiltered URL and could find Judy’s private event.

If the architecture of elmcity were more typical, this wouldn’t be a problem. Curators would create accounts at elmcity, they’d log into those accounts to add feeds, the lists of feeds subscribed to by hubs would be hidden from the world. But elmcity does things differently. Hubs are transparent conduits through which public information flows. They reveal their sources. Nothing needs to be hidden, and so nothing is hidden. Curators do their work out in the open. Communities served by elmcity hubs can see how those hubs are constituted.

If Facebook provided a Publish link for public events, along with an Export link for all events, then it could participate directly in elmcity-style calendar syndication. Since Facebook doesn’t offer a Publish link, elmcity needs to receive the Export link from curators by way of some private channel of communication.

Syndicating Facebook events privately

If the architecture of elmcity were more typical, curators would have accounts at elmcity and would use those accounts to send private messages to the service. But again, elmcity does things differently. You shouldn’t have to create an account for everything under the sun. You already have plenty of perfectly good accounts. Why not reuse them?

The relationship between elmcity and Delicious is one example of such reuse. A curator creates a new elmcity hub by designating a Delicious account to control it. If the administrator of the elmcity service deems the proposed new hub legitimate, he or she (so far, just me) tells the service to use that Delicious account to specify the hub’s settings and list its feed URLs.

There’s an analogous relationship between elmcity and Twitter. If a hub’s Delicious settings name a curator’s Twitter account, then Twitter becomes a channel for private messages between the curator and the hub. For example, a curator can send a Twitter direct message to the hub that simply says: start. When the hub receives the start message, it immediately refreshes all the hub’s feeds instead of waiting for the next scheduled refresh.

Until recently that was the only control message that a curator could send to a hub. But now there’s another: add_fb_feed. From my Twitter account I just sent a direct message to the elmcity service’s Twitter account. The message said:

add_fb_feed id=652...115 key=AQD...qcT who=Luann+Udell category=art

Which means the following:

  1. Make this Facebook iCalendar URL: http://www.facebook.com/ical/u.php?uid=652&#8230;.115&key=AQD…qcT

  2. Restrict it to public events organized by Luann Udell

  3. Use art as the tag for events in this feed

The hub read that message and responded:

elmcity received your add_fb_feed command

And then:

facebook feed successfully added

This isn’t ideal. Curators still need to trust the elmcity service not to disclose URLs sent through the private Twitter channel. Such disclosure could happen in any of the following ways:

  • The operator of the elmcity service gives up the data on purpose. I wouldn’t, of course, but it’s theoretically possible.

  • The elmcity service gives up the data accidentally. It’s just software; mistakes happen.

  • A curator gives up the data either accidentally or on purpose. This risk exists because the elmcity service only has trust relationships with curators. They, in turn, have trust relationships with the contributors who provide calendar feed URLs. Contributors who want to use Facebook as a source for public events that flow through an elmcity hub will give their Export URLs to curators. And curators, accidentally or on purpose, could leak those URLs.

This post is already too long, so I’ll say elsewhere why I think you probably shouldn’t use Facebook as the authoritative source for public events that you want to promote. But if you understand the mechanism I’ve explained here, and if you think the risk/reward tradeoff is acceptable, then you’re welcome to use it. If you’re an elmcity curator who has designated a Twitter account for private communication with the service, here’s the new command you can send to add a Facebook feed from one of your contributors:

add_fb_feed id=UID key=KEY who=USER [category=CATEGORY]

Usage is as follows:

add_fb_feed is a required verb

id=UID is a required parameter. Replace UID with the xxx from uid=xxx in your Facebook Export URL

key=KEY is a required parameter. Replace KEY with the yyy from key=yyy in your Facebook Export URL

who=USER is a required parameter. Replace USER with your Facebook name, using + instead of the space character.

category=CATEGORY is an optional parameter. You can use a single term or a comma-separated list of terms. These will appear as tags on each event flowing from the feed through the hub.

If you send a bogus or missing command verb, or id, or key, you’ll get a Twitter message describing what went wrong.

A new appreciation of security theater

The WSJ reported recently that the FBI, looking for fresh leads in the 1982 case of Tylenol poisonings, suspects Ted “Unabomber” Kaczynski and is trying to get hold of a sample of his DNA. Coincidentally I was just thinking about that case thanks to Bruce Schneier. In his recent TED talk he mentions that the Tylenol incident led to tamper-proof caps — a perfect example of what Schneier likes to call “security theater”:

As a homework assignment, think of 10 ways to get around it. I’ll give you one, a syringe.

So far this is typical Schneier. It’s a great point, but one I’ve heard him make many times before. In the next sentence, though, he breaks new ground:

But it made people feel better. It made their feeling of security more match the reality.

Bruce Schneier used to mock the theatrical dimension of security. Now it seems his thinking has evolved — and in a really interesting way. He’s alway viewed security in a relativistic way, and as a game of economic tradeoffs. Here he twists the lens to bring something else into focus: the relationship between how secure we feel and how secure we are.

We know that modern hominids evaluate risk poorly:

One way to think of it is that we’re highly optimized for risk decisions that are endemic to living in small family groups in the East African highlands in 100,000 B.C. — 2010 New York, not so much.

There are two ways our feelings about our security can disconnect from reality. We can have a false sense of security, as when we underestimate the risk of automobile travel. Or we can have a false sense of insecurity, as when we overestimate the risk of air travel.

What matters most, Schneier suggests, is that we align feelings and reality. And if security theater helps us do that, then it’s a perfectly good thing. The Tylenol episode represents the kind of risk that the media thrive on and magnify. People felt unsafe even though they were astronomically more likely to die in other ways. Tamper-proof caps may be a purely theatrical response, but that may still be useful.

Technologists too rarely display this kind of nuanced thinking; it’s refreshing to see it.

Awakened grains of sand

Many people assume that web thinking comes naturally to anyone born after 1990. Yes and no. Yes, the experience of 21st-century digital natives is qualitatively unlike what all prior generations shared, as far back as the dawn of genus homo over a million years ago. But no, the virtual dimension hasn’t fundamentally changed us — at least not yet.

Consider the physics of things in the real world. As hominids we have a million years of experience with the properties and behavior of physical things. And as individuals we have lifetimes of such experience. Based on those experiences, here are some things we know:

  • If I give you a thing then it’s yours until you give it back. We can’t both use it.

  • If I want to make a collection of things, I get a bucket and put things into it. A thing is either in the bucket or it isn’t. The same thing can’t be in two buckets at the same time.

  • If I invite you to work on a project using my collection of things, you have to visit my house.

In the virtual dimension none of these laws apply.

  • I can give you a link to a thing, and we can both use it. If either of us improves it, we both share the improvement.

  • If I want to make a collection of things, I can invent a tag that identifies things in a collection. We can invent many tags for many collections. A thing can be in more than one collection.

  • If I invite you to work on a project using my collection of things, you can join me in a virtual place.

As we begin to colonize the virtual dimension, we begin to learn about the physics of virtual things. But we still haven’t fully internalized the laws and properties that govern them. All of us, digital natives included, still tend to treat virtual things as if they were physical things.

Making and sharing collections of things is a common scenario that illustrates the tension between these two different sets of laws. When the things are physical objects — say, coins — there’s no choice about how to collect them.

Scenario 1: Somebody passes around a bucket, people toss coins into the bucket, whoever holds the bucket has the coins.

But when the things are virtual objects — say, chunks of information, existing as web resources, identified by URLs — there is a choice. Somebody can still pass around a virtual bucket, people can still toss virtual coins into it, and whoever holds the virtual bucket will have access to the collection of coins. That’s exactly what happens when we use an email conversation as the virtual bucket. Or:

Scenario 2: We can invent a name for a virtual bucket, and toss web resources into it by tagging them with that name. Now anyone who searches for the tag will have access to the collection of resources.

This new scenario raises important questions. How do we choose a name for the collection? How do we choose a service that binds the name to things in the collection? How do we restrict access to the collection? On what terms are these name-binding and access-control services provided to us?

I can’t answer all these questions at once, so let’s start with the most fundamental one: How can we name things?

In A tale of two dams I made up a tag, WestStDamKeene, that could be used by anyone to co-ordinate web resources related to an ongoing conversation in my city about the fate of the Ashuelot River dam on West Street. The tag is 14 characters long. With 14 characters you can make quite a lot of names. If each character can be a letter or a digit, then there are 36 choices for each character — 26 letters plus 10 digits. There are 3614 strings of 14 such characters. When faced with big numbers like that I turn to my favorite scientific calculator, WolframAlpha. It evaluates the number like so:

In a recent talk I failed (spectacularly) to convey the point I’m about to make, so I’ll try it again and more carefully here. We can make about as many 14-character tags as there are grains of sand on Earth. True, a lot of those won’t be nice mnemonic names like WestStDamKeene, instead they’ll look like good strong unguessable passwords. But there are still unimaginably many mnemonic names to be found in this vast namespace. Each of those can serve as a virtual bucket that we can use to make and share collections of arbitrarily many web resources.

The implications take a while to sink in. Grains of sand are inert physical objects. They just lie around; we can’t do much with them. But names can be activated. I can create a 14-character name today — actually I just did: WestStDamKeene — that won’t be found if you search for it today on Google or Bing. But soon you will be able to find at least one hit for the term. At first the essay I’m now typing will be the only hit from among the 30 billion indexed by Google and 11 billion indexed by Bing. But if others use the same term in documents they post to the web, then those documents will join this one to form a WestStDamKeene cluster.

This isn’t even tagging in the conventional sense. Set aside, for now, the clusters that can form around that tag on Delicious, or on WordPress, or on Flickr, or on Twitter, or even at the intersection of all those tag-oriented services. Consider only what can happen when you make up a never-before-seen term, utter it in a document placed on the web, and invite others to utter it in documents that they place on the web. When we enact this scenario we are, in effect, creating an ad hoc web service that we can use to make and share collections of things related to (in this case) a particular dam project in a particular town. Of course tag-oriented services enhance our ability to make and share such collections. But even without them we can still do it. In the realm of virtual things, names are as plentiful as grains of sand. But they aren’t inert. We can wake them up and use them to co-ordinate our activities.

Can elmcity and Delicious continue their partnership?

The elmcity project thinks like the web, and invites users to do the same. Direct users of the elmcity service (hereafter just elmcity) are curators who run calendar syndication hubs. Indirect users are people who contribute calendar feeds that flow through the hubs. Everyone involved in this dance practices key principles of web thinking. Here are some ways:

the principle how it’s practiced by curators how it’s practiced by contributors
1. Be the authoritative source for your own data Curators tell elmcity to get their hubs’ settings from an account on another service — the curator’s Delicious account. Contributors use online calendars that they designate (Google Calendar, Hotmail Calendar, many others) to manage their events and send them to hubs.
2. Pass by reference not by value Curators send hub settings and feed lists to elmcity by referring to Delicious URLs. Contributors send feed data to elmcity by referring to feed URLs.
3. Know the difference between data that’s structured and information that isn’t.

Curators use apps and services that support iCalendar, the structured Internet-standard data format for exchanging calendar information.

Curators tweak hub settings by bookmarking a Delicious URL and adding structured (name=value) tags.

Contributors also use apps and services that support the structured format iCalendar.

Contributors also use structured tags — in their case, to send event metadata to elmcity.

4. Create and adopt shared naming conventions. Curators can work with contributors to build tag vocabularies for classifying and grouping feeds and events. Contributors, not coicidentally, can work with curators on the classifying and grouping.
5. Push your data to the widest appropriate scope. Curators run community information systems, the world is a community now, so the appropriate scope is global. The merged calendar data is world-public by default. Contributors to community information systems also use a world-public policy for the feeds they contribute to hubs.
6. Play in pub/sub networks as both a publisher and a subscriber. Curators publish various flavors of data feeds from their hubs. They can also subscribe to feeds about their hubs: project news, development status, support forum discussion, Contributors publish calendar feeds. They can also subscribe to a variety of calendar feeds published by family members, by work associates, and by community groups.
7. Reuse existing services. Curators use Delicious for hub settings and feed lists, friendfeed for project collaboration, and many services to acquire event data (Eventful, Upcoming, Eventbrite, Facebook, various iCalendar apps/services). Contributors choose from a variety of iCalendar apps and services.

In these scenarios the elmcity service partners with a number of other services, most notably Delicious. During last December’s Delicious-is-going-away scare I compiled a list of essays I’ve written since 2004 about how and why Delicious is far more useful than the tagline “social bookmarking” might suggest. Here’s the gist: Delicious, more than any other online service I know, encourages and rewards the practice of web thinking. That makes it a natural partner of elmcity, a service that invites communities to think like the web.

There are, of course, other ways to manage hub settings and feed registries. Various social bookmarking services can do what Delicious does. More conventionally, the elmcity service could manage this data directly. I’ve always been prepared to swap out Delicious for something else, and when it looked like Delicious might go away I reviewed my options.

Then came news that Delicious had been acquired by YouTube’s founders and would continue as part of a new company called AVOS. The transition promises to be seamless. In order to continue using their existing accounts and data after July 2011, Delicious users need only opt in to the AVOS terms of service.

For typical users it’s all straightforward, though you’ll want to note that AVOS declines responsibility for backing up your contributed data. I’m glad to see that in writing. Too many people assume, wrongly, that the data they send to free cloud services, in order to socialize with other people and other people’s data, will be backed up. It’s the cloud, right? The cloud can back up your stuff, right? Yes it can, but don’t expect that to happen unless you’re paying for it.

The elmcity service isn’t a typical user of Delicious, though. It accesses Delicious programmatically, scanning curators’ bookmarks several times a day in order to check for updates to their hub settings and feed registries. That may not square with this item from the list of Things Not To Do in the AVOS terms of service:

Attempt to access or search the Service or Service Content or download Service Content from the Service through the use of any engine, software, tool, agent, device or mechanism (including spiders, robots, crawlers, data mining tools or the like) other than the software and/or search agents provided by AVOS or other generally available third party web browsers.

That’s quite a change from the comparable paragraph in the existing terms of service:

Delicious provides access to portions of Delicious via RSS feeds and an API; for the purposes of these Delicious Terms, such access constitutes use of Delicious. Delicious asks that you use these features respectfully, as outlined in the documentation.

Elmcity actually makes very little use of the Delicious API. But it relies heavily on the fact that for every HTML page that Delicious presents, there is a corresponding RSS feed. For example, curators add iCalendar feeds to their hub registries by bookmarking the URLs of those feeds, and tagging them in a certain way. As curator of the hub for Keene, NH, I review my hub’s registry using this Delicious query:

http://delicious.com/elmcity/trusted+ics+feed

When the elmcity service checks for updates to my registry, it uses the corresponding RSS feed:

http://feeds.delicious.com/v2/elmcity/trusted+ics+feed

That same feed serves another purpose. The elmcity support forum and project collaboration space is on FriendFeed. One of FriendFeed’s endearing features is ad-hoc RSS aggregation for groups. The elmcity group on FriendFeed compiles project status from a variety of RSS feeds, including Delicious feeds of the form shown above. What that means is that when any curator discovers a new iCalendar feed and adds it to his or her hub, everyone in the FriendFeed space is notified. It’s a wonderful example of how pub/sub networks can enable ambient awareness.

I hope that AVOS wants to celebrate, not forbid, this kind of emergent capability. But it does require accessing the service with tools and services other than “generally available third party web browsers.” I have always done this kind of access respectfully, and would like to continue on that basis. But if that won’t be acceptable I’ll make other arrangements. Either way I want to thank Delicious for many years of stalwart service and creative stimulation, and to thank AVOS for carrying on. I’m sending the Delicious/AVOS support team a link to this post, and I’ll use comments here to report what I find out.

The pleasures of small airports

I love small airports. When we moved to Keene, NH, over 20 years ago, I could roll out of bed, drive three minutes to our town’s airfield, hop onto a flight to LaGuardia, arrive in midtown Manhattan for a day of meetings, and be home for a late dinner. It was a good thing that didn’t last. The federal subsidy that kept those flights going ran dry, and Keene’s commercial air service ended long ago.

Years later I read James Fallows’ Free Flight and fell in love with its vision of an alternative air travel system that thought like the web: a decentralized and fluid network of interoperable resources.

Still later an old acquaintance, Ed Iacobucci, made a valiant effort to bring that vision to life. Our 2007 conversation about DayJet, the on-demand regional jet travel service Ed had then just launched, inspired me to hope that I might again fly to and from the Keene airport. Our hopes were dashed by the 2008 economic collapse, and now that vision is on hold. But last night I had a taste of what air travel once was and might someday be again.

I’m in Toronto for a couple of days. On my last two visits, not knowing another way, I used Toronto’s international airport, Pearson. It’s a typically unfriendly major hub, made even less friendly by its atypical lack of rail service into the city center. But on my last trip, during a morning lakeside run, I saw small planes landing at the city airport on Toronto Island within a stone’s throw of downtown. I wondered what it would be like to arrive on one of those flights.

Well, now I know. It’s delightful! I flew Porter Airlines from Boston Logan direct to Toronto Island Airport. It was a trip from a bygone era. The plane was a turboprop. The complimentary wine was served in a real glass. The customs queue was quick. The ferry crossing to downtown, over a hundred yards of water, was seamless. Then I simply walked, less than a mile, to my downtown hotel. True, it cost a hundred bucks more than flying into Pearson. But I saved almost that much money, plus a chunk of time, by not cabbing from Pearson. And I arrived refreshed and happy. When does that ever happen?

Porter Airlines isn’t the kind of service that James Fallows’ book imagined and Ed Iacobucci’s company created. But the retro 1950s-era experience that Porter offers may help to remind us that small airports are everywhere, waiting to offer pleasure and convenenience once again — if we can find ways to reactivate them.

HTTP Status Codes: The Teen Years

I recently asked a web server for something and it responded like a teenager:

403 Forbidden: The server understood the request, but is refusing to fulfill it.

I thought the description of this status code was a joke, but no, it’s right there in the HTTP specification. Here are some others that you won’t find there:

200 OK: Are you happy now?

202 Accepted: I’ll do it tomorrow.

206 Partial Content: I’ll do the rest of it tomorrow.

301 Moved Permanently: It’s not my job.

305 Use Proxy: I can’t remember, ask mom.

401 Unauthorized: You’re not the boss of me.

404 Not Found: Why does everybody always ask me for that?

410 Gone: Zzzzzzzzzzzzzz.

417 Expectation Failed: I thought you were going to put gas in the car.

500 Internal Server Error: I’m not allowed to make a mistake?

My fave new cool app: PowerNow

The most interesting app on my phone at the moment is called PowerNow. Here’s the display:

1090

Thursday April 14 12:14

At 12:14AM today, when I took this snapshot, my house was using 1090 watts. The data comes from the TED5000 smartmeter I recently installed. It reports all kinds of data but that single number matters most. When you can monitor your power use in realtime, you can regulate it far more intelligently than you can if your only instrument is a monthly bill.

The other day, for example, I finally got around to swapping out a bunch of incandescent bulbs for compact fluorescents. I took a baseline measurement with PowerNow, and then swapped out a total of 17 bulbs in six batches. After each batch I took another measurement. You can see all the data here. Step by step the wattage drops, by a total of 900. And step by step the hourly cost drops, by a total of $0.15/hr. Of course I won’t really save $0.15/hr because I took the baseline with everything turned on, which isn’t normally the case. But it’s wonderfully motivating to be able to measure the effect directly.

The TED5000 comes with a wireless display that I could have used to take those snapshots, but its ZigBee controller isn’t working well and I’m awaiting a replacement. So I turned to Google PowerMeter, which can receive data posted from the TED. But PowerMeter only reports cumulative use, not realtime use. When I put up my own experimental service to receive TED data, I found out why: cumulative data is all that the TED sends.

There are actually two TED APIs, though. The one used by PowerMeter, and by other services like the one I wrote, requires an activation protocol and then accepts data packets sent from the TED gateway. In other words: TED pushes to the service.

There’s also another API that enables a service to pull data from TED. It’s just this:

http://ted5000/api/LiveData.xml

This URL refers to a TED gateway that’s hooked into a home network which resolves the name ted5000 to some private address like 192.168.2.100. There are variant URLS for fetching historical data but this URL just brings back the realtime data which is all I want for now.

One way to view that data from anywhere would be to open up an inbound port on the router. But I’d rather not, so instead I’m running a scheduled process on one of my networked PCs. It polls the TED, extracts the one number I want, and posts it to a web page along with the date and time.

If I were in marketing, here’s how I’d describe this “cool app”:

    Monitors realtime power use in your home!

    Works anywhere, anytime!

    Compatible with all smartphones, including iPhone, Android, BlackBerry, and Windows Phone!

And that’s all true. But of course it isn’t really an app, it’s just a web page backed by a suite of cooperating services: the TED’s software, my data extractor, and the website that hosts the page.

Or is it, in fact, an app? For me the word connotes not just software that runs on your phone, but rather software that runs in various places including your phone, and ties together various services.

Apps defined that way can be ridiculously easy to write. I tweeted that PowerNow is just 6 lines of Python. I went back and checked and, well, it’s a bit more, but not much more:

import urllib2, re, ftplib, datetime
from ftplib import FTP
from datetime import datetime

url = 'http://ted5000/api/LiveData.xml'
s = urllib2.urlopen(url).read()
power = re.findall('<PowerNow>(\d+)</PowerNow>', s)[0]

html = """<html>
<head><title>PowerNow</title></head>
<body>
<p style="font-size:x-large;text-align:center">%s</p>
<p style="text-align:center">%s</p>
</body>
</html>""" % (power, datetime.now().strftime('%A %B %d %H:%M'))

fname = '/users/jon/dev/PowerNow.html'

f = open(fname, 'w')
f.write(html)
f.close()

ftp = FTP('_______.net')
ftp.login('_______','________')
f = open(fname)
ftp.storbinary('STOR PowerNow.html', f)
f.close()
ftp.quit()

That’s the script that polls the TED, extracts the current power use in watts, packages it in HTML, and posts it to a webserver. To run it, I scheduled a once-per-minute process using the Windows 7 Task Scheduler. I hadn’t used Task Scheduler in a while, and I noticed something non-obvious about it. When you specify repetition, it looks like you only have these choices:

What’s non-obvious is that you can edit the values in the list, like so:

I also chose the One time setting:

That’s how you set up a task to repeat with arbitrary frequency. Then you tell it what to do. In my case:

I avoid home automation projects that require soldering, it just isn’t my thing. But stitching web componentry together? I can do that in my sleep. I’m really looking forward to the coming wave of appliances that will enable me to do that.

Installing TED (The Energy Detective): a tale of two cultures

When I wrote about my experience with the Kill-A-Watt, commenters alerted me to the next level in the real-time power monitoring game: gadgets that watch the whole house instead of one appliance at a time. Back then the only solutions I could find were for UK power systems, not US power systems. But recently I found The Energy Detective and ordered a TED 5000 straightaway.

The bottom line is that it works. I’ve got a real-time display showing how many watts my house is burning at any given time, along with the equivalent hourly cost. When I turn off lights or appliances that don’t need to be on, I can see the difference. There’s much more data available, but continuous instant feedback is the essential thing. It’s a powerful behavior changer.

Unfortunately my TED system isn’t yet working as well as it should. One of the components is ailing. It’s the gateway that receives data from the transmitter I put in my distribution panel, and sends it along to the wireless display and to my LAN. The gateway’s local webserver won’t respond to requests, and the gateway’s connection to the wireless display is flaky. So I’ve ordered a replacement. I hope it’ll work properly, and if it does I’ll have more to say about the software aspects of the TED. But meanwhile, this is a good time to talk about the basic hardware setup. It’s pretty straightforward, but I think the vendor, Energy Inc., explains it misleadingly. That’s a shame. I hope lots of people will be able to use this remarkable tool, and I want them to have good experiences with it. So here’s what I think Energy Inc. does wrong with its installation guide, and how I think it could be improved.

The guide says:

A technically-savvy homeowner, neighbor, friend or electrician can install TED in 10-15 minutes.

And that’s true. But there are different ways to be technically savvy. The TED is a mashup of two different technologies: electrical distribution and data networking. Each has its own set of concepts and associated terminology. An electrician may know little about data networking. A homeowner like me may know a lot about data networking but very little about electrical distribution. A map of concepts and a glossary of terms would be really helpful.

On the electrical side, the terminology includes 120/240V single-phase, A phase, B phase, two-pole breaker, and handle tie. If you’re an electrician it won’t occur to you that the terms single-phase, A phase, and B phase will confuse somebody who isn’t an electrician. Like me. If it’s a single-phase system, I wondered, how is there an A phase and a B phase? I had to consult Wikipedia’s article on split-phase electric power:

A transformer supplying a 3-wire distribution system has a single-phase input (primary) winding. The output (secondary) winding is center-tapped and the center tap connected to a grounded neutral. This 3-wire system is common in countries with a standard phase-neutral voltage of 120 V. In this case, the transformer voltage is 120 V on either side of the center tap, giving 240 V between the two live conductors, shown as V1 and V2 in Fig. 1. The two outputs are properly called “legs”, not “phases”.

Ah. Now I could see why the TED’s MTU (measuring transmitting unit) needs (I wrongly thought) to be connected to the A “phase” and the B “phase” — all the wiring in my house is divided into two “legs” and the MTU (I wrongly thought) needs to reach both of them. Here’s the recommended procedure:

Step 3.

A.) Connect the black and red wires from the MTU power cord to a spare 15, 20, or 30 amp two-pole circuit breaker.

B.) If there is no spare circuit breaker in the panel, it can be attached to any 15, 20, or 30 amp two-pole breaker in the panel. If a two-pole breaker is not available, then use an approved handle-tie to create one.

At this point, as a data-network-savvy but electrical-distribution-naive homeowner, I’m ready to call in an electrician. It’s lucky I didn’t, though, because a data-network-naive electrician would likely have missed the significance of this cryptic remark stuck in between steps A and B:

(Option: For increased signal strength, connect only the black wire.)

Huh? Oh. Now my data networking knowledge kicks in. The MTU uses power line networking. That means it sends data over electrical wiring. Where does it send data? To the gateway, a little box that plugs into an outlet somewhere and talks to the wireless display and also to a computer or, if you run a local area network, to your Ethernet router. The recommended place to plug in the gateway is an outlet near your router, so you can control it and read data from it using any computer on your LAN.

The instructions tell you to connect the MTU to both legs of your electrical distribution. In theory that enables you to plug the gateway into any outlet in the house. In practice, as you’ll find if you try, fail, and then consult the troubleshooting guide, probably not.

But now I began to see that you don’t need to do that. You could connect just one of its wires to one breaker that controls an outlet near your router. And in fact that’d be better, because power line communication can be flaky and you want to use the most direct signal path. (The outlet should preferably be near your router but not actually on a circuit that powers noisy devices like the router, or computers, or the TV. And I found one that met that requirement.)

I found confirmation for this direct approach in the troubleshooting guide:

3.7. Considering the factors affecting PLC communication, if the Gateway is still not receiving a signal, do the following:

3.7.1. Connect the black wire of the MTU to the circuit on which the Gateway is connected.

3.7.2. Remove the red wire from the circuit in which it is connected, and put a wire nut onto the red wire.

Further confirmation came from the tech support guy I spoke with when I reported the sick gateway. “Yeah, I don’t know why the manual says to use a spare two-pole breaker,” he told me. “A lot of times that doesn’t work, then people call me up and I tell them to do it the way you did.”

Documentation that spelled out the concepts and terminology in each domain, and the relationships between the domains, would help people grounded in one or the other of the domains see the whole picture.

On the data networking side, the terminology includes PLC (power line communication), Ethernet, and ZigBee. There are actually three kinds of data networking happening. The MTU talks PLC to the gateway. The gateway talks Ethernet to your computer or, if you’re running a local area network as many now do, to any computer on the LAN. And the gateway talks ZigBee to the TED handheld wireless display. All this was obvious to me, but might not be to an electrician or electrically-savvy homeowner. Spelling out concepts and terminology would help that person sort out what gets distributed where:

– Electricity to the whole house, via the two legs of the power system

– Data to the gateway, via the electrical wiring

– Data to/from a computer or router via Ethernet cable

– In a LAN situation, data to/from one or more computers via Ethernet cable and/or WiFi

– Data to the wireless display via ZigBee

Maybe a lot of this context was provided by other TED users in the support forum. Except, oops:

Several weeks ago our Forum Server crashed, and we were unable to recover the valuable library of comments that our users had posted over the prior year.

Those forum members have now learned, the hard way, to appreciate the first of the seven ways to think like the web:

1. Be the authoritative source for your own data

The Energy Inc. site goes on to say:

Our new Forum Server has built-in safeguards to prevent the loss of data should there be a hardware malfunction. We do encourage those of you who have been avid online supporters to please continue to assist those new TED users in their quest to become experts!

Sure, happy to do it, but not by posting this article to the forum. Instead I’ll invoke the second Thinking Like The Web principle:

2. Pass by reference not by value

I want this article to help new TED users. Maybe somebody in the new forum will link here. Maybe I’ll do it myself if I can be bothered to create Yet Another Account. But even if that doesn’t happen, there’s an implicit connection via search. Anybody searching for key terms in this article, along with TED 5000, will land here.

I’m glad the forum server has backup now. But I still don’t want to commit a lot of my own keystrokes to somebody else’s cloud database. I want to keep those keystrokes in a cloud database that’s accountable to me, and then link them to wherever else they need to show up.