I'm at the back of a dark room sitting next to an air vent
listening to Let Me Entertain You being played by a big band on a
stage 20m in front of me.
Look me up in the yellow pages
I will be your rock of ages
Your see-through fads and your crazy phases, yeah
Little Bo Peep has lost his sheep...
This dark room is far underground for a shopping mall which has
been rented away for the night for the purposes of entertaining 4000
people. Actually the mall is only half the party, they are also using
the concert hall across the street.
The 4000 people are all musicians, members of Norwegian concert
bands who are here for the annual concert band competition. I'm here because I'm a member of one of
those bands, the Romerike Konsertorkester.
"Here" is in Trondheim, the furthest north I've ever been as far as
I know. This town has the prettiness of Bergen but the weather of
Oslo. In fact the weather is probably even worse than Oslo. It was
sunny yesterday (if ridiculously cold), but today someone aimed an
incessant stream of crystallized water pellets at the town for no
apparent reason, and it became all slippery, white, and wet.
The band I'm in came fourth out of about twelve in our division.
We're in division 1. (It's a zero-based index. There is one division
above us, the Elite division, and three divisions below us.) I've
never been here before so I really have no point of reference, but
based on the looks of extreme joy on my fellow band members, I'm
guessing this is extremely good. (We were apparently hoping
to be lucky and place eighth or ninth.)
I'm currently singing along quite loudly to the music being played
on stage. It's drawing looks. It has to be said, I'm the only person
who has a laptop here. They are all enjoying themselves with alcohol
and tobacco, much to my disgust, but hey, to each his own.
Before sitting down here I tried to get myself a drink.
Me: Har du eplemost?
Bartender: ...?
Me: Har du eplemost?
Bartender: ...!
Me: EPLEMOST?!
Bartender: ...!!
They didn't have any apple juice.
Me: Vann?
Bartender: ...?
Me: Vann!
Bartender: ...?!
Me: VANN!!
Bartender: ...!!
They didn't have any water either.
Eventually I found a bar that did have water, about 100m
from where I'm sitting now. I came back to enjoy the Jazz with my
glass; by the time I'd gotten here I'd drunk half of it already.
I'm not going for more water for a while. Trying to push myself
through the increasingly drunk people isn't too fun.
The age range here is quite dramatic. There are people from early
teens all the way to retirement age. Sadly the smoker population spans
the same age range. There are also quite a few cute girls, although
many are smokers too, and none of them are the right cute
girl.
Much to my amusement somebody just asked me if what I was doing
(using a computer) had anything to do with what was going on around
me. I went for "no". How anyone can communicate with the level of
noise in here I have no idea. There's no wireless network, so the
obvious answer (an IRC network) is right out. It certainly isn't
vocally. I can't hear a word of what people say even when they shout
in my ear. I've often wondered this about events of this nature.
As is probably obvious, I don't go to these kinds of these parties
very often. My kind of party is usually very quiet, with very little
sound except the hum of several dozen fans and the occasional
expletive from an indignant party-goer. (And at that kind of party,
IRC usually is indeed the preferred communication
method.)
Young man, there's no need to feel down.
I said, young man, pick yourself off the ground.
I said, young man, 'cause you're in a new town,
there's no need to be unhappy.
Everybody just stuck their arms in the air simultaneously, then
folded them, then threw them to the side, then brought them together
again above their head. How odd.
The same guy just asked me what I was doing again. I gave him the
same answer (DIARY!!) and he nodded and went away again. He'll
probably be back.
In other news, I recently bought 30 DVDs from the
UK. (Not coincidentally, last weekend my parents came to visit, which
was nice, since I hadn't seen them in ages.) I would have bought the
DVDs in Norway, but the prices here are astronomical, and despite this
being highly appropriate given the content of the DVDs, it was not
very attractive to me.
This purchase increased my total DVD ownership by a good base-10
order of magnitude. And it is quite impressive on the shelf.
The DVDs were seasons one through six of Stargate SG-1. My
flatmates are eating it up like addicts, it's quite funny. They
watched season one in about a week. They'll probably have finished
season two by the time I get back tomorrow. I'm having a great time
rewatching the early episodes, too... I might even resume my detailed
analysis of key episodes which I started a year or so ago.
Jack O'Neill: ...what now?
Master Bra'tac: Now we die.
Jack O'Neill: Well that's a bad plan.
My ulterior motive for purchasing these DVDs was actually to
attempt to get someone hooked on SG-1. I'm going to get an
extended period of quality time with this someone and her
three cute ferrets at Easter to attempt this.
I didn't used to think ferrets were cute, by the way. Now I
consider them almost honorary cats. That's quite a statement, coming
from me.
During the rehearsals for the band I mentioned above we sometimes
spend many minutes playing sections where I have long 24 bar rests, so
I've been taking the opportunity to work on a proposal for a
Web Applications specification. This would be something along
the same lines as Web Forms 2,
but specifically for client-side application development. (I asked for
ideas along these lines a few weeks
ago — thanks again to those of you who responded.)
Some of the things I'm thinking of are:
A per-domain, per-window "file system". This would allow you to
be running multiple instances of the same application (from the same
site) without the instances writing over each other's cookies. Anyone
who has tried to compare prices of multiple Travelocity tickets knows what
I mean by that. (I once nearly bought the wrong plane ticket because
of this, so I feel quite strongly that there is a problem to solve
here!)
Native popup menus and context menus. As fun as it is to have to
guess how the menus on every site work, I'm thinking it's about time
we got consistent UI on this feature.
For people who want it, command updating. This is where you have
several access points for the same feature, for instance a menu item
and a toolbar button, and you want them to all share the same
"disabled" state, so you don't have to disable every one in turn when
the option becomes unavailable.
Sortable tree views and list views with rich formatting. Do a
search on eBay, and you'll find you have to hit the server
whenever you want to change the sort order. That shouldn't be
necessary.
Exclusive sections: At the moment, an implicit semantic of HTML
documents is that all the content is always visible, you need but
scroll to it. But in some applications this makes no sense: you may
not want the login screen to be on the screen at the same time as the
query page, for instance. At the moment you can work around this
using CSS and display:none, but that's not semantically
correct, and it breaks when you disable stylesheets, which it
shouldn't. Having markup that actually means "hide this until it is
activated" would solve this.
Content-area popup windows. They're currently possible
using positioned divs, but that breaks down when the
stylesheet is disabled, and is semantically dubious at best. (Any
time a div is the answer, there's a hole in HTML.) The
idea would be to introduce the idea of a native "subwindow" element
which would work as a movable window within the content area, which
can be dragged, resized, etc, as required.
Remote eventing. I was recently reminded that HTTP is a
client-pull protocol, but that in many cases there is a need for
server-push. Now, you can fake this using an iframe to a
document that the server doesn't close and into which it keeps
dripping script blocks, but that's a hack to say the
least. What would be nice is a way of letting a remote server trigger
DOM events that standard DOM3 Event technologies could hook
into.
The house lights just went up for a split second
(someone probably leant on the wrong switch) and after they went back
down, a girl came over and asked me what I was doing. I'm writing
about the party, I said. She found this fascinating. I have a feeling
"I'm brainstorming ideas for extensions to HTML to enable richer user
experiences with Web applications" would have gotten a rather less
warm response, but maybe I should try it if someone asks again. Sadly
they would probably reply "but you should come enjoy yourself! Have a
beer! Horrah! Skål!" or some such,
oblivious to the fact that I live for this spec stuff and don't like
the taste of beer... Did I mention "to each his own" already?
Speaking of girls, I've noticed I get a lot more looks from girls
now that I've shaved and cut my hair. I don't recall ever noticing
this happen when I cut my hair in the past. I wonder what the
difference is this time.
Incidentally, XBL is progressing nicely, despite
seemingly insurmountable differences between "us" (the CSS working
group members who are interested in XBL) and "them" (the SVG working
group members who were behind RCC). I have a bunch of action items to
deal with tomorrow, and then we'll be down to pretty much only one
real blocking issue before publication.
Doing this, I ran into some edge cases that I need to define. If you create an html:script element, then insert it into a document, should it be evaluated? If you then take this element out of the document, and reinsert it, should it be evaluated? If you take this element and clone it, then insert the clone, should it be evaluated? If you take this element's parent node, and rename it using renameNode(), causing the children (including the script element) to be removed from the document then readded, should the script get reevaluated? What about if an ancestor is adopted into another document, causing ownerDocument to change? And what script context should be used in that case? What if the node doesn't have the script included inline, but uses a link to an external file instead?
All this week I was at the W3C Plenary in Mandelieu La Napoule, in
France. (Saying it's in Mandelieu La Napoule is a neat trick for those
people who don't want to tell their companies that they are going to
Cannes lest their management think they are using their travel budget
for fun. The hotel is about 4 meters from the official edge of
Cannes.)
Some choice quotes that I've heard so far (left anonymous to
protect the guilty...):
So in my right hand I have a content declaration...
So if we dropped it. Would they lynch us?Yes.
The other solution is to give it an RDF property— (laughter erupts)
So the government normalised your name?
Hard day tomorrow?Hard? No. It's Semantic Web IG.
*bzzz, bzzzz* *bzzz, bzzzz* Our bathroom is ringing!
Wednesday was the middle day of the Technical Plenary, where
instead of working group meetings everyone gets together in one big
room and watches presentations and panels and asks questions. In the
past this has sometimes been a lot of fun, but in this particular
instance I found most of the sessions somewhat tame. It's much more
fun when they pick very controversial topics.
One of the sessions was on Writing Test Suites For Your Working
Group (or some such, I forget the exact name) and I was one of the
panelists. For my slides I used a document Tantek originally published back
in April 2002: the test
suite documentation for the CSS Working Group. This document was
obviously never written with slides in mind, so I applied the
following stylesheet:
However, since I couldn't change the document to add this
stylesheet (the document is on the W3C Web site) I instead wrote a
small little javascript: URI that dynamically added this stylesheet,
using the DOM and an embedded data: URI, to the document, when I
followed it (which I did my pasting the following into Opera):
Throw in Opera's projection mode and *tada*, instant
presentation!
Also on Wednesday, we have the Birds Of a Feather lunch tables.
This is where people sign up to sit at tables with assigned topics,
and have a friendly chat to see what other people think about
something or other.
During this lunch I accidentally joined the SVG working group. I
don't mean I accidentally sat at the wrong table and found myself
sitting with lots of SVG people. I mean I accidentally became an SVG
working group member. I had no idea that sort of thing could happen
during meal times. I'll endeavor to be more careful in future.
This brings the total number of official W3C-related activities I'm
involved with to four: the CSS Working Group, the SVG Working Group,
the Linking task force, and the Binding task force.
I've also come away from this week with a bunch of new and renewed
action items. Expect new releases of the CSS3 Generated and Replaced
Content module and the CSS3 Lists module to come out "soon".
For your next presentation, don't use proprietary formats! Use the
OperaShow Generator
to generate HTML and CSS which you can then render in any browser that supports the
'projection' media, such as Opera.
One of the great things about working in the Technology and Research department
at Opera is that I get to play with all kinds of new gadgets and technologies. For
example, last week one of our embedded device customers said that one of our
competitors had tested Opera against their browser and found Opera was slower, and
Opera was asked to prove that this was not the case, so Herman and I were yanked out
of our normal routine and told to test the two products all day until we had an
exhaustive analysis of the two browsers' pros and cons. (We quite happily obliged,
showing that over GPRS, on the test pages that the competitor in question had used,
we out-performed them in page load performance by seconds, sometimes dozens of seconds,
and sometimes sheer orders of magnitude — not to mention that said competitor
had no DOM support, ridiculously limited CSS support reminiscent of desktop browsers
from the late 1990s, and so forth.)
One of the technologies Opera is quite proud of is our CSS media handling. There are
internal versions of Opera that handle handheld,
tv, screen,
projection, print, and even
speech.
And some of these modes have fallbacks, for example if a page is viewed in handheld
mode but has no handheld style, it will fall back on the
SSR (Small Screen Rendering) view.
We also have lovely "content adaption" mechanisms — for example in some builds you can enable
MSR (Medium Screen Rendering) mode,
and then Opera will adapt the formatting of the page to fit your window. I should point out that
this is not at all standards compliant, but it isn't supposed to be: its purpose is to handle
the cases where the page wasn't designed for the device in question, and would be unreadable if
displayed per the specs. Authors who target these devices can rely on standards-based rendering,
since MSR won't trigger unless the page doesn't fit.
One of the medias that Opera supports which no-one else yet supports is projection.
(Mozilla doesn't yet support this, it's bug 120398.)
When you switch to full-screen mode, Opera switches from using your screen styles
to your projection styles. This would be of very limited use, if it wasn't for the
fact that the projection media is a paged media type, much like print,
so properties like page-break-after work!
This lets you do slide shows in HTML with no JavaScript and no :target hacks,
which is pretty cool. Håkon (my boss) wrote a little script that will let you make a three-page
presentation without even touching the markup. As an added bonus, it even embeds the images you
specify using data: URIs, so the page is completely
self-contained.
Here is a summary of the changes since the release of mozbot 2.4:
New modules:
Spell
Checks for spelling mistakes:
<Hixie> Checks for speling (sp?) mistakes.
<mozbot> Suggestions for 'speling': spelling, spalling, sapling, speeling, spieling, spiling, spilling...
ServicesLogin
Enables mozbot to log in to network services such as Nickserv,
K9, Q on Quakenet, or X on Undernet.
Insult
For those of you who mourn the passing of the insult server at the University of Colorado, you'll
be glad that the insult server code was ported to mozbot so that
mozbot can now natively insult people!
Quotes
If you have a MySQL server you can use the Quotes module to
store and retrieve quotes. This module can automatically create the
appropriate tables and so forth when you tell it which server to
connect to.
Currencies
Mozbot can now provide you with up-to-the-minute mid-market
quotes for currency exchange, using the information provided by xe.com.
The bot now supports logging into password-protected IRC
servers.
The "!seen" command now stores its data in a separate file so
that the configuration file doesn't grow without bounds.
You can now tell the bot to stop talking to you by saying
shut up.
Added some protection for loops and annoyance attacks: mozbot
will refuse to say the same thing more than a few times in a
row.
The Converter module now supports time conversions and mass
conversions as well as the already-supported length, temperature and
integer conversions.
The XMLLogger module now logs mozbot parting a channel.
The Greeting module has been greatly improved so that it now is
much more talkative and fun.
The built-in help command is a little more helpful. The help also
now has two styles: compact (the default, as seen in previous
versions), and tidy (the new longer alternate style). You can select
the style you want by changing the "helpStyle" variable:
/msg mozbot vars General helpStyle 'tidy'
/msg mozbot vars General helpStyle 'compact'
Mozbot will now handle nickname changes much more gracefully. It
will also handle nickname clashes and erroneous nicknames in a much
more solid way than the previous version.
Similarly, mozbot is now much better at handling being kicked,
parting a channel, being invited to or told to join a channel, and
quiting IRC. You should no longer see the "I think I'm already *in*
channel #foo!" message. (In fact I guarentee that you will no longer
see it, since I changed the text of the message while I was making it
less likely to appear.)
If you use a bot that has strange restrictions such as not
accepting long IRC names, or requiring correct usernames, mozbot will
now automatically detect the problem and fix it on the fly with no
user interaction.
Mozbot is now able to ignore other bots entirely, and ignore
people talking to other bots. You can enable this using the ignoredUsers
and ignoredTargets
variables, which are described in detail in the INSTALL
file.
Improvements to the mozbot module API: it now supports notices,
modules can now get to the current message queue, and some other minor
changes. The documentation
has also had a number of errors corrected.
The Infobot mozbot module is now slightly more helpful, and for
those of you who are using mozbot primarily for its Infobot
abilities, you can enable the eagerToHelp mode which
will make the Infobot module respond even if asked a question without
a question mark (this mode is on by default for compatibility with
the Infobot bot). For those of
you who just want mozbot for giggles, you can even enable
ridiculouslyEagerToHelp mode which is just that.
(Ridiculous, I mean.)
The Bugzilla module has had significant updates and is now
compatible with the latest version of the Bugzilla software.
The Sheriff module has been updated to handle some common things
people put in their sheriff lines.