WEBVTT

00:00.000 --> 00:10.000
Hello, we can start. Hello, hello.

00:10.000 --> 00:13.000
Fantastic. Well, thank you so much for coming.

00:13.000 --> 00:15.000
Look at all of you wonderful people.

00:15.000 --> 00:18.000
Actually, let me put my glasses on so I can see you.

00:18.000 --> 00:21.000
Ah, you look even better, close up. That's good.

00:21.000 --> 00:25.000
So I'm going to talk a little bit about office documents.

00:25.000 --> 00:31.000
One of the deep joys of the world of the moment is the so much excitement about digital sovereignty

00:31.000 --> 00:37.000
and moving office sweets into a sovereign infrastructure.

00:37.000 --> 00:41.000
And that's great. But then people think, well, office is easy.

00:41.000 --> 00:45.000
Let me write my own. There's all this money out there for this.

00:45.000 --> 00:49.000
Let me try and do that. The browser can do it for free for me.

00:49.000 --> 00:53.000
So it's easy. There's almost an office suite in a web browser.

00:53.000 --> 00:55.000
So let's just use that. And that would be great.

00:55.000 --> 01:01.000
And so I'm just going to walk you through a few of the unanticipated, well, the ostrich is unanticipated.

01:01.000 --> 01:05.000
And it unanticipated difficulties that you might experience when you try this.

01:05.000 --> 01:11.000
So obviously, very easy things. People know about proportional text and monospace text.

01:11.000 --> 01:16.000
And that's all great. Unicode solves everything until you hit the web dings and the wing dings.

01:16.000 --> 01:18.000
And all that sort of thing. But it's easy to solve these problems.

01:18.000 --> 01:24.000
You know, we need metric compatible fonts because the size of the glyphs is really important

01:24.000 --> 01:26.000
because that determines the layout of your document.

01:26.000 --> 01:30.000
But either way, it's easy to fix because we can embed these things.

01:30.000 --> 01:34.000
And actually PDF does this. So PDF subsets all your fonts and sticks little bits of the menu PDF.

01:34.000 --> 01:38.000
And so this is all very simple. Of course, the world is actually a little bit more complicated.

01:38.000 --> 01:42.000
There are people there that are right to left. And that's obviously not very difficult.

01:42.000 --> 01:44.000
You know, in a fine transform, we'll flip your screen.

01:44.000 --> 01:47.000
You could just get some glasses that go the other way around.

01:47.000 --> 01:52.000
Except it's not nearly as easy as that because there's mixed left to right and right to left text.

01:52.000 --> 01:56.000
And the whole thing becomes rapidly quite problematic.

01:56.000 --> 02:00.000
And then, of course, there's laying things out. So layout seems very simple.

02:00.000 --> 02:04.000
I mean, you know, when you write a document by hand, it's all just fine, isn't it?

02:04.000 --> 02:06.000
That's no problem at all.

02:06.000 --> 02:10.000
But the problem is there's all sorts of complexities with text that you don't realize.

02:10.000 --> 02:12.000
And as you start to lay it out, you discover,

02:12.000 --> 02:14.000
well, it's a bit of a nightmare, isn't it?

02:14.000 --> 02:16.000
This is a very simple layout problem.

02:16.000 --> 02:21.000
So, you know, we've got, okay, so on the right hand side is a great example of auto-hyphenation,

02:21.000 --> 02:23.000
not working in Google Docs.

02:23.000 --> 02:26.000
And what hyphenation turns out to be difficult.

02:26.000 --> 02:28.000
And that's great.

02:28.000 --> 02:32.000
But unlike, or a little bit like writing your own programming language,

02:32.000 --> 02:34.000
I don't know, lots of people write their own programming language.

02:34.000 --> 02:36.000
It's very trendy to write your own programming languages.

02:36.000 --> 02:38.000
You know, yeah, look at that. You know, excellent.

02:38.000 --> 02:40.000
Some of us do.

02:40.000 --> 02:44.000
I think there's a tourism of writing new programming languages, which is this.

02:44.000 --> 02:50.000
By the time the debugger works, the language is obsolete, right?

02:50.000 --> 02:53.000
And this is a fairly true of everything.

02:53.000 --> 02:57.000
I mean, if you try and debug Java embedded in C embedded in C++,

02:57.000 --> 03:01.000
you know, it's still, I just setting a breakpoint is, is anyway.

03:01.000 --> 03:05.000
So, yeah, I mean, like, it seems really easy, doesn't it?

03:05.000 --> 03:09.000
But actually, to do this right, you need, like, dictionary-based stemming, you know,

03:09.000 --> 03:11.000
it's quite clever.

03:11.000 --> 03:13.000
And that's before you get into smart justification,

03:13.000 --> 03:15.000
where there's combination of, you know,

03:15.000 --> 03:19.000
kerning and squeezing characters and shrinking spaces, and, you know,

03:19.000 --> 03:22.000
an anti-phenation to try and make the text look as beautiful as possible

03:22.000 --> 03:24.000
without huge jagged holes in it.

03:24.000 --> 03:26.000
And let's know, NMF, who is sitting at the back here,

03:26.000 --> 03:27.000
and waving at me.

03:27.000 --> 03:32.000
No, yeah, is a hero of creating Hun spell and doing awesome things for this.

03:32.000 --> 03:34.000
But forget even that difficulty,

03:34.000 --> 03:37.000
because this is the rocket science, just a simple stuff.

03:37.000 --> 03:40.000
You know, we're laying stuff out on the page,

03:40.000 --> 03:43.000
and we're putting things in, and it's all going super well.

03:43.000 --> 03:46.000
You know, we're playing Tetris, and it's just packing beautifully.

03:46.000 --> 03:48.000
You know, we're going to hit the high score.

03:48.000 --> 03:50.000
And then we think, well, we can get a bit more in the bottom,

03:50.000 --> 03:53.000
or we get that in, and it brings with it a footnote.

03:53.000 --> 03:54.000
Right?

03:54.000 --> 03:56.000
But the footnote then changes the page size,

03:56.000 --> 03:57.000
and now we have to shrink the page size.

03:57.000 --> 03:59.000
Go back and see if we can fit it all in again.

03:59.000 --> 04:03.000
And maybe we can, but that's actually changed the number of pages

04:03.000 --> 04:05.000
in the document, and there's a page number field,

04:05.000 --> 04:07.000
and that then forces the reflow, and now we can't fit it in,

04:07.000 --> 04:11.000
or there's an image in it that's anchored to us anyway.

04:11.000 --> 04:15.000
It all gets quite fun, quite fun.

04:15.000 --> 04:19.000
And that's before we get to actually complicated text.

04:19.000 --> 04:22.000
So I don't know, you know, who likes Ruby, you know?

04:22.000 --> 04:25.000
And of course, Ruby is a programming language, I believe.

04:25.000 --> 04:30.000
But it's also this wonderful way of somantically annotating Tokyo.

04:30.000 --> 04:31.000
This is Tokyo, I believe.

04:31.000 --> 04:34.000
I'm not very good at reading, but this is the English one there,

04:34.000 --> 04:36.000
and I can read that one, right?

04:36.000 --> 04:38.000
And actually there's whole bit of differences there,

04:38.000 --> 04:41.000
and the great news is, and then of course vertical text.

04:41.000 --> 04:45.000
So, you know, we use two web pages that you scroll downwards,

04:45.000 --> 04:47.000
you know, that you keep going down and more and more text comes,

04:47.000 --> 04:51.000
but some people scroll sideways, because their text goes,

04:51.000 --> 04:53.000
goes like this, right?

04:53.000 --> 04:55.000
And which is all fun, right?

04:55.000 --> 04:58.000
It just adds to the rich variety of life,

04:58.000 --> 05:02.000
and the good news is that if you use an HTML div,

05:02.000 --> 05:06.000
and you actually do all of the extra coding and UI stuff

05:06.000 --> 05:09.000
to make this work, then you can actually do this in the browser,

05:09.000 --> 05:10.000
and that's great.

05:10.000 --> 05:13.000
And the browser will lay it out for you, and that's beautiful.

05:13.000 --> 05:16.000
The problem is that if you want to actually get whizzy,

05:16.000 --> 05:19.000
we're getting, you can't leave the browser to its own devices.

05:19.000 --> 05:21.000
You have to switch to using the canvas,

05:21.000 --> 05:24.000
and then you have all this great control of where glyphs are,

05:24.000 --> 05:26.000
and none of this is there for you.

05:26.000 --> 05:28.000
So, that's great.

05:28.000 --> 05:30.000
You rapidly hit this wall.

05:30.000 --> 05:32.000
And then, of course, you want to print,

05:32.000 --> 05:34.000
and that's easy, because as we all know,

05:34.000 --> 05:36.000
browsers can print.

05:36.000 --> 05:38.000
And that's great, isn't it?

05:38.000 --> 05:40.000
Anyone who's printed a Google Maps or whatever,

05:40.000 --> 05:42.000
and a notice, why is it crammed in the corner?

05:42.000 --> 05:45.000
We'll know a little bit about paper sizes,

05:45.000 --> 05:47.000
and the complete lack of API there in the browser.

05:47.000 --> 05:50.000
You can't even work out what page size your printer has

05:50.000 --> 05:52.000
from JavaScript.

05:52.000 --> 05:54.000
You just have no idea.

05:55.000 --> 05:57.000
So, it's a great thing we use the canvas to render,

05:57.000 --> 05:59.000
because that's not going to print at all, really.

05:59.000 --> 06:01.000
And we can then handle all that complex text,

06:01.000 --> 06:05.000
and then generate PDFs and render it twice to make your print.

06:05.000 --> 06:06.000
So, it, yes.

06:06.000 --> 06:08.000
And of course, the browser is very frightened of,

06:08.000 --> 06:10.000
yes, fingerprinting your devices,

06:10.000 --> 06:12.000
so it loves to turn off things that

06:12.000 --> 06:14.000
can tell you about your system.

06:14.000 --> 06:17.000
So, anyway, we've done a bit of text, and that's all good,

06:17.000 --> 06:19.000
but let's think about spreadsheets.

06:19.000 --> 06:21.000
So, spreadsheets are, you know,

06:21.000 --> 06:25.000
the source of never-ending fun, and a personal passion of mine.

06:25.000 --> 06:28.000
And you see, if I can read this, what does it say?

06:28.000 --> 06:29.000
Yeah.

06:29.000 --> 06:32.000
So, we have more than two to the 32 possible cells

06:32.000 --> 06:34.000
in a single sheet in a spreadsheet,

06:34.000 --> 06:36.000
which is quite a lot.

06:36.000 --> 06:39.000
Now, of course, almost no sheets actually have that much data,

06:39.000 --> 06:41.000
because it will probably kill your machine,

06:41.000 --> 06:44.000
unless you have a very efficient way of storing the data.

06:44.000 --> 06:46.000
And so, we're doing pretty well.

06:46.000 --> 06:49.000
We used to have this quite mad way of storing cells,

06:49.000 --> 06:52.000
because it's a very sparse data structure,

06:52.000 --> 06:54.000
which was essentially a row number,

06:54.000 --> 06:56.000
and then a pointer to what was in the cell.

06:56.000 --> 06:58.000
So, we just have these great swathlets of numbers,

06:58.000 --> 07:01.000
which would typically go 1, 2, 3, 4, 5,

07:01.000 --> 07:03.000
with a whole lot of pointers next to them.

07:03.000 --> 07:05.000
Well, sometimes they wouldn't go 7.

07:05.000 --> 07:07.000
They would go 8, you know, and it's exciting.

07:07.000 --> 07:10.000
And it turns out that there's a thing called interpolation search.

07:10.000 --> 07:11.000
I don't know if you've ever heard of it.

07:11.000 --> 07:14.000
It's probably not a very popular computer science search form,

07:14.000 --> 07:17.000
but it has a computational complexity of log log,

07:17.000 --> 07:20.000
the number of things, which is the kind of complex to you want in life.

07:20.000 --> 07:24.000
If you can get a log log in, that's really good.

07:24.000 --> 07:27.000
We switched away from that, because of obvious problems with this method,

07:27.000 --> 07:29.000
particularly pointer chasing is a nightmare,

07:29.000 --> 07:31.000
and modern CPUs hate pointer chasing.

07:31.000 --> 07:35.000
I mean, just caches, yeah, it just doesn't work basically.

07:35.000 --> 07:37.000
And this is partly why Java is quite as slow as it is,

07:37.000 --> 07:40.000
because everything's a pointer, you know?

07:40.000 --> 07:41.000
But there you go.

07:41.000 --> 07:43.000
So, we then did a whole lot of work to inline,

07:44.000 --> 07:47.000
for example, great chunks of double, so you can use SSE,

07:47.000 --> 07:49.000
accelerated arithmetic and so on on things.

07:49.000 --> 07:50.000
It's just pretty cool.

07:50.000 --> 07:53.000
And so we have now a much more compact and better structure,

07:53.000 --> 07:54.000
and it's brilliant.

07:54.000 --> 07:57.000
And you can thread it, and you can do SIMD, and it's great.

07:57.000 --> 08:00.000
Or, you could use JavaScript.

08:00.000 --> 08:03.000
And the implementation's here, you sparse arrays.

08:03.000 --> 08:07.000
You know, it's just basically a hash table on the array index,

08:07.000 --> 08:09.000
often down a row or a column.

08:09.000 --> 08:11.000
And that's great, obviously.

08:12.000 --> 08:15.000
And in theory, constant time look up, but in reality,

08:15.000 --> 08:18.000
another massive pointer chasing disaster areas.

08:18.000 --> 08:20.000
And you may think that this is not relevant,

08:20.000 --> 08:23.000
but the component that first gave us the,

08:23.000 --> 08:26.000
your zips are not 64 bits safe.

08:26.000 --> 08:29.000
And we have streams inside these zips files that decompress

08:29.000 --> 08:33.000
to more than four gigabytes of data, as we pass it was calc.

08:33.000 --> 08:36.000
And this just does happen quite a lot.

08:36.000 --> 08:38.000
And so talking of computation orders,

08:38.000 --> 08:40.000
we have a fixed cost XML parser,

08:40.000 --> 08:44.000
that will pass any size file in constant time.

08:44.000 --> 08:48.000
And we want to heckle me?

08:48.000 --> 08:51.000
Well, it's sort of true.

08:51.000 --> 08:53.000
Basically, we thread it.

08:53.000 --> 08:55.000
So there's a fixed cost of starting up the thread

08:55.000 --> 08:57.000
and getting the parsing and the unzipping in one.

08:57.000 --> 09:00.000
And as long as you consume and set up your structure,

09:00.000 --> 09:02.000
slower than the parsic and pars,

09:02.000 --> 09:04.000
you effectively get your parsing for free,

09:04.000 --> 09:07.000
which is kind of nice when you have gigabytes of data.

09:07.000 --> 09:08.000
Of course, in the JavaScript,

09:08.000 --> 09:10.000
well, this is difficult to do to put it mildly,

09:10.000 --> 09:14.000
because the threading model is not really as helpful,

09:14.000 --> 09:16.000
as it could be.

09:16.000 --> 09:18.000
So either way, we've made a beautiful,

09:18.000 --> 09:20.000
entirely new office suite,

09:20.000 --> 09:22.000
and we've solved the number of these problems

09:22.000 --> 09:23.000
and made them beautiful.

09:23.000 --> 09:25.000
And we're making beautiful looking documents.

09:25.000 --> 09:26.000
They really look great,

09:26.000 --> 09:29.000
but the problem is that there are trillions

09:29.000 --> 09:31.000
of existing documents out there.

09:31.000 --> 09:34.000
And the file formats are of mixed quality.

09:34.000 --> 09:37.000
Let's say, some of them are nicer than others.

09:37.000 --> 09:42.000
And yes, some of them have been wiped on before you get them.

09:42.000 --> 09:45.000
And the problem with that is that you end up with things like this.

09:45.000 --> 09:48.000
So in LibroFish and Calabro,

09:48.000 --> 09:52.000
we have this wonderful tool that will render with Microsoft Office

09:52.000 --> 09:55.000
and render with CalabroFish compared to you.

09:55.000 --> 09:58.000
And where it's read, it was different.

09:58.000 --> 10:00.000
And that's not good.

10:00.000 --> 10:01.000
And you can see, basically,

10:01.000 --> 10:03.000
maybe it looks like you've just got double vision or something,

10:03.000 --> 10:06.000
and you have another drink, and it will look great.

10:06.000 --> 10:09.000
But we can't afford that for all of our users.

10:09.000 --> 10:11.000
You know, it's difficult.

10:11.000 --> 10:13.000
So you need to fix it, and so it wants the problem.

10:13.000 --> 10:14.000
While you look into it,

10:14.000 --> 10:18.000
and you discover that actually the fix here is it's a compatibility level.

10:18.000 --> 10:20.000
There are lots and lots of different ways

10:20.000 --> 10:24.000
to render the same trillion documents, right?

10:24.000 --> 10:26.000
And some of them are the old way,

10:26.000 --> 10:28.000
and some of the new way.

10:28.000 --> 10:31.000
And the number of ways is something like this.

10:31.000 --> 10:32.000
Well, actually there's more than that.

10:32.000 --> 10:34.000
It goes further back in time.

10:34.000 --> 10:38.000
And in the infinite healthfulness of the standardization process,

10:38.000 --> 10:39.000
you get a number that says,

10:39.000 --> 10:42.000
do it, well, actually it doesn't say do it 13,

10:42.000 --> 10:46.000
because there's some superstition in the Microsoft Office team,

10:46.000 --> 10:47.000
amazingly.

10:47.000 --> 10:50.000
But yeah, so you get a number,

10:50.000 --> 10:53.000
and then not a whole lot of hints on how to do it differently.

10:53.000 --> 10:55.000
So you think you're implementing one thing,

10:55.000 --> 10:58.000
and actually you get to implement really a lot.

10:58.000 --> 11:00.000
And that's because everybody is trying to improve their layout

11:00.000 --> 11:03.000
and make it better and nicer and more beautiful,

11:03.000 --> 11:07.000
but it's difficult to describe exactly what that means.

11:07.000 --> 11:09.000
So layout is fundamentally not standardized.

11:09.000 --> 11:11.000
It's not there in the specs.

11:11.000 --> 11:13.000
You're not going to find any of it.

11:13.000 --> 11:15.000
But actually it makes a really big difference.

11:15.000 --> 11:17.000
Well, it can make a really big difference.

11:17.000 --> 11:19.000
If you really care about the number of pages,

11:19.000 --> 11:21.000
and it's got to be exactly right.

11:21.000 --> 11:23.000
You know, if your MI6 or something,

11:23.000 --> 11:27.000
you know, James Bond has to kill the guy on page seven.

11:27.000 --> 11:29.000
You know, it's nice if that's not your contact,

11:29.000 --> 11:32.000
due to some re-raping problem earlier in the document.

11:32.000 --> 11:36.000
So then the other thing is little graphics.

11:36.000 --> 11:39.000
So I mean, we have loads of nice little graphics in documents.

11:39.000 --> 11:41.000
And you'll be pleased to know that the native vector format

11:41.000 --> 11:44.000
for Microsoft Office is this wonderful thing called,

11:44.000 --> 11:49.000
well, EMF, WMF, Metaphiles, EMF plus.

11:49.000 --> 11:53.000
And what you see in these variants is that the rendering API

11:53.000 --> 11:55.000
has changed in Windows over time.

11:55.000 --> 11:58.000
And so all we have, ultimately, is an API dump

11:58.000 --> 12:01.000
of the low-level Windows rendering API.

12:01.000 --> 12:04.000
It's pretty much at the level of individual methods being called.

12:04.000 --> 12:07.000
And so the great thing about that is if you have some random

12:07.000 --> 12:11.000
component that's written by some crazy in your early object,

12:11.000 --> 12:14.000
you can just copy what it's drawing on the screen,

12:14.000 --> 12:17.000
and then someone else can do that again without that software.

12:17.000 --> 12:21.000
Right? So it's a typical metaphor.

12:21.000 --> 12:25.000
And the great thing is that WMF is the original Windows 16 API.

12:25.000 --> 12:27.000
You know, it's just quite amazing.

12:27.000 --> 12:30.000
Exclusive all renderings, you know, one bit masks everywhere.

12:30.000 --> 12:33.000
No anti-aliasing, et cetera.

12:33.000 --> 12:36.000
Obviously that didn't survive, well, it survived a very long time.

12:36.000 --> 12:38.000
And then they wanted to extend it,

12:38.000 --> 12:40.000
luckily it had a comment feature in it.

12:40.000 --> 12:43.000
So inside your 16 bit, you know, or your terrible rendering of the past,

12:43.000 --> 12:46.000
you can have a comment. And inside the comment,

12:46.000 --> 12:48.000
is the EMF file.

12:48.000 --> 12:49.000
Right? So that's great.

12:49.000 --> 12:53.000
So there's then a duplicate rendering of a different API level.

12:53.000 --> 12:56.000
And then, you know, EMF plus, which has a whole, whole, whole, whole.

12:56.000 --> 12:58.000
It's just quite amazing.

12:58.000 --> 13:01.000
And early objects inside these have a preview,

13:01.000 --> 13:03.000
so you can rapidly render them.

13:03.000 --> 13:05.000
So you can see stuff, but actually just common objects.

13:05.000 --> 13:07.000
This, this, this thing here on the right.

13:07.000 --> 13:09.000
These two things, this chart.

13:09.000 --> 13:11.000
My chart doesn't render.

13:11.000 --> 13:14.000
Why doesn't my chart render? You suck at charting.

13:14.000 --> 13:15.000
Well, I just not a chart.

13:15.000 --> 13:20.000
That's a massive legacy stream of vector graphic rendering,

13:20.000 --> 13:22.000
madness that is being rendered properly,

13:22.000 --> 13:24.000
and actually you just see a nice chart.

13:24.000 --> 13:26.000
And the user doesn't have any understanding.

13:26.000 --> 13:30.000
You have a life blissfully unconcerned about the horror that lies beneath,

13:30.000 --> 13:33.000
that we have handled for them over so many years,

13:33.000 --> 13:36.000
with so many people. So yes, thank you.

13:36.000 --> 13:39.000
And of course, it's been extended over time this metaphyl.

13:39.000 --> 13:42.000
So we have this, these nice little, little things like this,

13:42.000 --> 13:45.000
you know, past through arbitrary data to the printer driver.

13:45.000 --> 13:47.000
You know, so this is also used for printer drivers,

13:47.000 --> 13:51.000
the back end, and so you can get post script inside your EMF,

13:51.000 --> 13:54.000
anyway, just to give you sort of a flavor of the scale of the problem

13:54.000 --> 13:56.000
that people love.

13:56.000 --> 13:58.000
I talked about, I keep this being much loved.

13:58.000 --> 14:00.000
It's not just the Windows metaphyl that's, you know,

14:00.000 --> 14:03.000
the legacy of the 16 bit error.

14:03.000 --> 14:06.000
You may wonder why when you look at the spreadsheet,

14:06.000 --> 14:08.000
the document, the main document module,

14:08.000 --> 14:11.000
is actually 10 files instead of 1.

14:11.000 --> 14:14.000
It's the kind of thing that you think, well, that's a bit odd, isn't it?

14:14.000 --> 14:19.000
And the answer is, the OS2, the brand new 32 bit operating system of,

14:19.000 --> 14:21.000
well, you know, 30 years ago,

14:22.000 --> 14:25.000
actually had a 16 bit token limit on the number of tokens,

14:25.000 --> 14:27.000
it could pass in its C++ compiler.

14:27.000 --> 14:30.000
So it was necessary at that time to split the modules,

14:30.000 --> 14:33.000
each into less than that many tokens,

14:33.000 --> 14:35.000
and 30 years later, it's still like that.

14:35.000 --> 14:37.000
I mean, actually that's quite good for revision controls,

14:37.000 --> 14:39.000
so you can see what happened.

14:39.000 --> 14:41.000
Now, you may think that these are extreme examples,

14:41.000 --> 14:42.000
but we could go on all day,

14:42.000 --> 14:44.000
luckily I'm not going to, I don't have the time,

14:44.000 --> 14:45.000
but let me tell you about smartart.

14:45.000 --> 14:47.000
This is absolutely beautiful feature,

14:47.000 --> 14:49.000
where you can generate from these bullets,

14:49.000 --> 14:52.000
schema-driven, amazing graphical loveliness,

14:52.000 --> 14:54.000
and, you know, this is great.

14:54.000 --> 14:56.000
There's an even an XML spec for it,

14:56.000 --> 14:59.000
with, you know, hundreds of abbreviated terms in it, you know?

14:59.000 --> 15:01.000
And there's a constraint solver,

15:01.000 --> 15:04.000
and a sheet layout language that goes on and on like this,

15:04.000 --> 15:06.000
for hundreds upon hundreds of lines

15:06.000 --> 15:08.000
to describe each shape.

15:08.000 --> 15:10.000
And you have to write a rendering engine

15:10.000 --> 15:11.000
that will follow these constraints,

15:11.000 --> 15:13.000
understand them reverse engineer what they do,

15:13.000 --> 15:15.000
and then draw that,

15:15.000 --> 15:17.000
which looks very smiley and friendly, doesn't it?

15:17.000 --> 15:21.000
It's just underneath it's all dry bones and horror, you know?

15:21.000 --> 15:22.000
So there you go.

15:22.000 --> 15:24.000
As they say often, you know,

15:24.000 --> 15:27.000
people have this wonderful view of everything being nice and clean

15:27.000 --> 15:29.000
and well done and an open and so on,

15:29.000 --> 15:32.000
and actually they have absolutely no ideas

15:32.000 --> 15:34.000
quite a famous saying, isn't it?

15:34.000 --> 15:36.000
One of the things that I fear

15:36.000 --> 15:41.000
is a plague of new duplicate lame office sweets.

15:41.000 --> 15:44.000
So simplified that they don't really do much,

15:44.000 --> 15:47.000
and assume a huge amount of money before they hit

15:47.000 --> 15:49.000
the obvious roadblocks.

15:49.000 --> 15:50.000
And with that money,

15:50.000 --> 15:53.000
we can actually just improve the state of the art so much, you know?

15:53.000 --> 15:55.000
So there you go.

15:55.000 --> 15:58.000
Jeng is a win ski who is sort of an old, old,

15:58.000 --> 16:01.000
and yes, well interesting, interesting chap.

16:01.000 --> 16:04.000
Mozilla Hacker, one of the earlier Mozilla Hacker,

16:04.000 --> 16:06.000
he talked about this CADT development model,

16:06.000 --> 16:09.000
and this is a genome bug that he suffered.

16:09.000 --> 16:11.000
And he was complaining that his bug,

16:11.000 --> 16:13.000
as always, was closed with, I'm sorry,

16:13.000 --> 16:16.000
and this entire subsystem, please try again, you know?

16:16.000 --> 16:19.000
And yes, he, of course, ran, you know,

16:19.000 --> 16:21.000
hardly seems worth even having a bug system.

16:21.000 --> 16:23.000
If the pace of from scratch rewrites,

16:23.000 --> 16:25.000
outstrips the pace of bug fixing,

16:25.000 --> 16:28.000
now this is particularly problematic in a stack of software,

16:28.000 --> 16:31.000
the people at the bottom of the stack need to be even more responsible

16:31.000 --> 16:33.000
and people at the top, you know?

16:33.000 --> 16:35.000
I just encourage that, and we'll see in a minute,

16:35.000 --> 16:37.000
why that might be useful.

16:37.000 --> 16:40.000
But when this cute naivety of everything is easy,

16:40.000 --> 16:41.000
and we can rewrite everything,

16:41.000 --> 16:43.000
and these other guys are idiots,

16:43.000 --> 16:45.000
meets the quest for personal glory.

16:45.000 --> 16:48.000
You know, I want to be the next Linus Torvals.

16:48.000 --> 16:50.000
I'm going to call it Meeks Office, or whatever.

16:50.000 --> 16:52.000
You know, it's just a bit lunatic.

16:52.000 --> 16:56.000
And so this huge bent to try to reinvent the wheel,

16:56.000 --> 16:58.000
and software is really hard.

16:58.000 --> 17:01.000
So I think the, the take home thing is that there are just

17:01.000 --> 17:03.000
so many axes, here are a few of them,

17:03.000 --> 17:05.000
to getting just office software right.

17:05.000 --> 17:09.000
And, you know, yeah, it's very easy to think of one of these.

17:10.000 --> 17:12.000
So I tend to say this to a lot of people,

17:12.000 --> 17:15.000
and they say, yeah, but collaboration, you know?

17:15.000 --> 17:17.000
Collaboration is the killer feature, and it is.

17:17.000 --> 17:19.000
I mean, collaboration made us use wikis,

17:19.000 --> 17:23.000
and learn new markup languages with asterisk in them.

17:23.000 --> 17:24.000
You know?

17:24.000 --> 17:26.000
I'm going back to word five days.

17:26.000 --> 17:27.000
It made us throw out wizi wik.

17:27.000 --> 17:31.000
So, so all we need to do is first rewrite it all in language of choice.

17:31.000 --> 17:34.000
Or, and then we'll rewrite everything to be,

17:34.000 --> 17:37.000
operational, transform, CRDT, insert,

17:37.000 --> 17:39.000
test, trendy technology.

17:39.000 --> 17:42.000
And it's not just idiots saying you should rewrite it completely.

17:42.000 --> 17:45.000
You know, there are major tech luminaries out there

17:45.000 --> 17:47.000
saying that we should, we should really be doing this.

17:47.000 --> 17:51.000
And 2009, thanks to the register for preserving that.

17:51.000 --> 17:53.000
But let me just give you an example of a little rewrite.

17:53.000 --> 17:54.000
This is a very simple one.

17:54.000 --> 17:56.000
It has no file format impact.

17:56.000 --> 17:58.000
It's a very simple refactor.

17:58.000 --> 17:59.000
Ha ha.

17:59.000 --> 18:01.000
Except we have quite a lot of user interface.

18:01.000 --> 18:05.000
At 1,260, Glade style XML UI dialogs.

18:05.000 --> 18:07.000
Quail on, spent multiple person years,

18:07.000 --> 18:09.000
and was helped by many other people.

18:09.000 --> 18:12.000
And if there is a 10x developer out there,

18:12.000 --> 18:14.000
it's probably Quail on.

18:14.000 --> 18:17.000
So, yes, a very simple thing, just rewriting the UI.

18:17.000 --> 18:21.000
So, but instead, we should rewrite the whole core engine of our office sweep.

18:21.000 --> 18:26.000
To use the amazingly popular Google Wave operational transforms model.

18:26.000 --> 18:27.000
Yeah.

18:27.000 --> 18:30.000
And the great news about this is you get undue for free.

18:30.000 --> 18:34.000
And here was I thinking, so just to give you a sort of background,

18:34.000 --> 18:36.000
there's a mathematical elegance to this.

18:36.000 --> 18:38.000
You have operations and inverse operations,

18:38.000 --> 18:41.000
and you can move things over each other.

18:41.000 --> 18:43.000
And it's just wonderful with these transforms.

18:43.000 --> 18:46.000
And everything looks very nice to a computer scientist.

18:46.000 --> 18:47.000
It all sounds great.

18:47.000 --> 18:50.000
And if you've only ever written small programs from scratch,

18:50.000 --> 18:51.000
it sounds beautiful.

18:51.000 --> 18:53.000
I totally agree.

18:53.000 --> 18:57.000
Where we just start from scratch, maybe that would be a good idea, maybe.

18:57.000 --> 19:00.000
But actually, undue is already quite easy.

19:00.000 --> 19:01.000
You've got copy and paste, right?

19:01.000 --> 19:04.000
You just copy it and stash it all somewhere and then shove it back.

19:04.000 --> 19:08.000
You don't really even need to understand it, just put it back like it was, right?

19:08.000 --> 19:10.000
So, yeah.

19:10.000 --> 19:12.000
So, here's a great example of this spreadsheet.

19:12.000 --> 19:14.000
You know, one guy does a sort of the cells,

19:14.000 --> 19:16.000
the other guy enters 42.

19:16.000 --> 19:18.000
And so, they get them in different orders.

19:18.000 --> 19:20.000
And we have to work out which order is the right one.

19:20.000 --> 19:21.000
But this guy is going to be the wrong one.

19:21.000 --> 19:23.000
So, now we're going to swap this round.

19:23.000 --> 19:26.000
We've already sorted, you know, 100,000 cells or something like that.

19:26.000 --> 19:30.000
And now we need to work out where to put the 42 so that we change the right cell.

19:30.000 --> 19:31.000
Yeah.

19:31.000 --> 19:33.000
Otherwise, these models are going to get out of sync.

19:33.000 --> 19:35.000
And life is not going to be a happy place, okay?

19:35.000 --> 19:37.000
And that seems reasonably easy, right?

19:37.000 --> 19:40.000
We just track where all the rows went and then we can, you know, find,

19:40.000 --> 19:43.000
but there's a whole lot of complexity that you might not be thinking about here.

19:43.000 --> 19:48.000
So, for example, you can actually, you can actually use random numbers in,

19:48.000 --> 19:49.000
informially.

19:49.000 --> 19:52.000
So, you know, you need to synchronize your random number generators

19:52.000 --> 19:54.000
and make sure that they are in the same state.

19:54.000 --> 19:57.000
But, you know, we can probably fit that in somewhere.

19:57.000 --> 20:00.000
But you can also make random dependency chains.

20:00.000 --> 20:04.000
So, cells can be dependent on or depend on things around them, right?

20:04.000 --> 20:07.000
Or, you know, so it's not very clear who does what.

20:07.000 --> 20:10.000
And of course, we need to calculate everything to the end.

20:10.000 --> 20:12.000
So, we have the real numbers having changed something.

20:12.000 --> 20:14.000
Otherwise, the source is going to be wrong.

20:14.000 --> 20:15.000
And you're out of sync.

20:15.000 --> 20:19.000
And, you know, what about those external data sources that we were downloading data from

20:19.000 --> 20:20.000
somewhere in between?

20:20.000 --> 20:21.000
Maybe that.

20:21.000 --> 20:25.000
But, you know, what about that beautiful feature of not calculating everything all at once,

20:25.000 --> 20:29.000
every time you type something, so that, you know, it's efficient and stuff.

20:29.000 --> 20:31.000
You know, like, say the background calculations running.

20:31.000 --> 20:33.000
So, all of these problems can be solved.

20:33.000 --> 20:36.000
Nothing I've said is, in solve, solve, obviously.

20:36.000 --> 20:39.000
But we're just talking about moving a editing a number,

20:39.000 --> 20:43.000
which incidentally doesn't have to be in the range of cells that's being edited.

20:43.000 --> 20:45.000
It could be anywhere in the sheet.

20:45.000 --> 20:46.000
You can't tell.

20:47.000 --> 20:51.000
So, you have to do all that work for this one pair of this one transform, right?

20:51.000 --> 20:54.000
So, hooray, after we've done that, we've done this and that's brilliant.

20:54.000 --> 20:57.000
But the problem is, this is only two operations.

20:57.000 --> 21:01.000
As you increase the number of operations that you need to transform over each other,

21:01.000 --> 21:06.000
the CPU complexity goes up, but that's nothing to the programmer complexity.

21:06.000 --> 21:11.000
The programming complexity of sorting these goes with the square of the number of operations.

21:11.000 --> 21:12.000
Okay?

21:12.000 --> 21:15.000
We talked about log log search complexity.

21:15.000 --> 21:19.000
How about squared programmer time complexity?

21:19.000 --> 21:20.000
Yeah?

21:20.000 --> 21:21.000
So, I mean, this is a great way.

21:21.000 --> 21:22.000
Operational transformations are great.

21:22.000 --> 21:25.000
And there's lots of hand waving about, but some of the operations are quite similar,

21:25.000 --> 21:27.000
and, you know, we can bucket them and so on.

21:27.000 --> 21:29.000
And obviously, Google Docs sort of works,

21:29.000 --> 21:33.000
but this ends up, meaning you don't have many features.

21:33.000 --> 21:37.000
Or you have a vast engineering team, or both.

21:37.000 --> 21:40.000
So, CRDTs are then the latest fashion in this,

21:40.000 --> 21:44.000
and, you know, they're absolutely ideal for very simple flat text.

21:44.000 --> 21:48.000
But our real documents are not just complex in their file,

21:48.000 --> 21:51.000
you know, they're standards and layout and memory representation,

21:51.000 --> 21:53.000
but they're also complex on disk.

21:53.000 --> 21:59.000
So, you know, we have these zipped file systems with embedded XML trees and millions of nodes in them, right?

21:59.000 --> 22:02.000
And we mutate them really quite a lot.

22:02.000 --> 22:05.000
And there's just a ton of invariants, you know,

22:05.000 --> 22:08.000
if this is that, that there also has to be that.

22:08.000 --> 22:11.000
There are implicit, there's no documentation for those.

22:11.000 --> 22:14.000
And so, of course, probably something like this can be done.

22:14.000 --> 22:19.000
There are people that have JSON trees that exist in CRDTs,

22:19.000 --> 22:23.000
and often they use a separate table of GUIDs, you know,

22:23.000 --> 22:27.000
these huge random numbers, to associate linkage and pointers and manage these,

22:27.000 --> 22:30.000
and it's all very clever, and they try and hide that from you inside.

22:30.000 --> 22:35.000
And that's all brilliant, until you try and save it in a file format.

22:35.000 --> 22:37.000
Because the far form, I doesn't have any of that.

22:37.000 --> 22:39.000
It doesn't have a massive table of GUIDs,

22:39.000 --> 22:43.000
associating attributes with other attributes to try and make this work, right?

22:43.000 --> 22:47.000
Yeah, and storing all of the state anyway, this never mind that.

22:47.000 --> 22:49.000
There's a whole live conflicting constraint.

22:49.000 --> 22:53.000
So, it's quite common that we get conflicts in constraints.

22:53.000 --> 22:56.000
So, we get files that say, hey, your minimum cell height,

22:56.000 --> 22:58.000
it's got to be at least this big, right?

22:58.000 --> 23:01.000
But actually, the page size is only this big.

23:01.000 --> 23:06.000
So, what do you do if you can't fit the minimum table cell height onto the page?

23:06.000 --> 23:08.000
And it's not obvious, right?

23:08.000 --> 23:10.000
Like there's a lot of ways you could do it.

23:10.000 --> 23:12.000
And we try and we try and get this right,

23:12.000 --> 23:16.000
but the world of office is full of invalid states,

23:16.000 --> 23:18.000
and transitioning between one and another.

23:18.000 --> 23:23.000
And so, you know, if you have your million monkeys typing your office productivity suite,

23:23.000 --> 23:26.000
it's not going to produce anything valid anytime soon.

23:26.000 --> 23:29.000
If that's going to produce a lot of very invalid things.

23:29.000 --> 23:31.000
So, there you go.

23:31.000 --> 23:33.000
So, here's another little UX win.

23:33.000 --> 23:36.000
So, another thing, just changing the widget toolkit,

23:36.000 --> 23:39.000
to use a native widget toolkit instead of the internal one.

23:39.000 --> 23:42.000
Again, touching a whole native UI staff, again,

23:42.000 --> 23:44.000
cray-lawn with help.

23:44.000 --> 23:46.000
More multiple person years.

23:46.000 --> 23:48.000
Again, no standards, problems, no complicated,

23:48.000 --> 23:52.000
some staff, simple refactors, and just reusing things.

23:52.000 --> 23:57.000
And we just got there in time to get native G2K3 dialogues

23:57.000 --> 24:01.000
by the time G2K4 was released and totally broke our threading model.

24:01.000 --> 24:03.000
So, there you are, you know, what can you do?

24:03.000 --> 24:07.000
In order to save a few, you know, days of work

24:07.000 --> 24:09.000
and improve windows, bindings or something,

24:09.000 --> 24:12.000
they just broke it really badly.

24:12.000 --> 24:15.000
Good news is it's the foundation for JavaScript dialogues,

24:15.000 --> 24:16.000
which you're doing good.

24:16.000 --> 24:18.000
So, anyhow, two better strands.

24:18.000 --> 24:19.000
Better ways of doing this.

24:19.000 --> 24:22.000
So, collaborative online, of course, uses online collaboration.

24:22.000 --> 24:26.000
And that exploits people's misunderstanding of how fast the internet is.

24:26.000 --> 24:29.000
So, do you know that you can get from Frankfurt to London,

24:29.000 --> 24:31.000
quicker than your Bluetooth keyboard,

24:31.000 --> 24:35.000
can get from your Bluetooth keyboard to the PC next to it.

24:35.000 --> 24:36.000
Right?

24:36.000 --> 24:40.000
Now, that's a pretty interesting result, isn't it?

24:40.000 --> 24:46.000
And, you know, Frankfurt Milan is getting faster than your 60-hurt's frame time.

24:46.000 --> 24:47.000
Right?

24:47.000 --> 24:51.000
So, the internet is an unbelievable wonder of performance.

24:51.000 --> 24:53.000
It's just extraordinary.

24:54.000 --> 24:57.000
And, yeah, this is, I think, a look, no, this is a linear plot,

24:57.000 --> 25:01.000
but you see the, you see the thing on our typing speed and our blinking speed.

25:01.000 --> 25:03.000
You know, a human, a human eye blink.

25:03.000 --> 25:05.000
That's a very fast human eye blink.

25:05.000 --> 25:08.000
People say it's, you know, 200 milliseconds, please.

25:08.000 --> 25:10.000
See, say by bringing everyone into one model,

25:10.000 --> 25:12.000
we can do really well on having done that,

25:12.000 --> 25:15.000
for the people who use their laptop and want on a train.

25:15.000 --> 25:17.000
We can make their life much better.

25:17.000 --> 25:20.000
We hackers understand a dipping, right?

25:20.000 --> 25:22.000
We have dipping tools, and that's great.

25:22.000 --> 25:24.000
We don't want to put ODF in get.

25:24.000 --> 25:26.000
We just want to show people the differences, right?

25:26.000 --> 25:28.000
What changed on one side and the other,

25:28.000 --> 25:32.000
and make it really easy for the whole world to get changed tracking right?

25:32.000 --> 25:34.000
Because it's really not currently easy.

25:34.000 --> 25:37.000
So, another thing that we've been investing in

25:37.000 --> 25:39.000
is improving user experience,

25:39.000 --> 25:42.000
because actually the user experience is what the user's experience.

25:42.000 --> 25:46.000
I know, I know, it took me weeks to work this out.

25:46.000 --> 25:49.000
And so, we, we have lots of really, really cool data,

25:50.000 --> 25:52.000
and actually the Zendis has done some great work

25:52.000 --> 25:55.000
to actually build the analytics here to help us work out.

25:55.000 --> 25:57.000
You know, which commands are used in what order?

25:57.000 --> 25:58.000
Who undoes what?

25:58.000 --> 26:00.000
What are they unhappy with?

26:00.000 --> 26:03.000
What are the most popular things that are going on there?

26:03.000 --> 26:05.000
How can we make it easier?

26:05.000 --> 26:08.000
How can we make the contextual toolbar near where your mouse is?

26:08.000 --> 26:10.000
So, you don't need that power assisted mouse anymore.

26:10.000 --> 26:13.000
You know, to track all the way across your full case screen

26:13.000 --> 26:15.000
up to the toolbar and back again, right?

26:15.000 --> 26:16.000
It's just convenient.

26:16.000 --> 26:18.000
And the tools in there are the tools that people use.

26:18.000 --> 26:21.000
By frequency in order, close to where you are.

26:21.000 --> 26:25.000
I'm context tooltabs so that you can, you know, find things that you want quickly

26:25.000 --> 26:27.000
and get to the tools that you want.

26:27.000 --> 26:30.000
Lots of new tabs to make things a prettier

26:30.000 --> 26:33.000
and more easier to use, more functional.

26:33.000 --> 26:35.000
And well, it goes on and on.

26:35.000 --> 26:36.000
Look at all of these great things.

26:36.000 --> 26:38.000
All of these features that we had already.

26:38.000 --> 26:39.000
We didn't actually have to do much to write these.

26:39.000 --> 26:41.000
We did a bit of JavaScript, a bit of cleanup,

26:41.000 --> 26:44.000
a bit of clarification, some CSS and all of that.

26:44.000 --> 26:45.000
Good stuff.

26:45.000 --> 26:49.000
A responsive toolbar so that they fit nicely on your screen.

26:49.000 --> 26:51.000
And, you know, I'm a big user of bullets

26:51.000 --> 26:53.000
as it turns out, our other people.

26:53.000 --> 26:55.000
So, when the paragraph thing collapses, it just collapses

26:55.000 --> 26:58.000
to a single bullet button, which is basically the button you want.

26:58.000 --> 27:00.000
You know, it's just nice to see it and use it and go,

27:00.000 --> 27:02.000
oh, it did what I expected.

27:02.000 --> 27:03.000
That's really cool.

27:03.000 --> 27:05.000
I'm better search results in the sidebar.

27:05.000 --> 27:08.000
Hiding latency and showing you, allowing you to navigate that

27:08.000 --> 27:10.000
and see your document tree and so on.

27:10.000 --> 27:13.000
So, all of that has been shipping nicely.

27:13.000 --> 27:15.000
But we got some new things coming soon.

27:15.000 --> 27:17.000
So, there's a two-page view coming up.

27:17.000 --> 27:19.000
So, side by side, and I think you'll always

27:19.000 --> 27:21.000
nice book binding things.

27:21.000 --> 27:22.000
A nice new inter-op feature here.

27:22.000 --> 27:25.000
Marcus Mohard doing fantastic work and Balash Varga.

27:25.000 --> 27:27.000
Looks particularly ugly in the screen shop,

27:27.000 --> 27:30.000
but it's getting better and a nice inter-op feature

27:30.000 --> 27:32.000
that people have been missing.

27:32.000 --> 27:34.000
Multi-sheet views.

27:34.000 --> 27:36.000
So, my competition have cheated.

27:36.000 --> 27:38.000
They totally cheated.

27:38.000 --> 27:41.000
So, they replicate the model on each of their machines.

27:41.000 --> 27:44.000
So, the first thing that they do is download the whole document

27:44.000 --> 27:49.000
every user and then they try and calculate a new on each machine.

27:49.000 --> 27:51.000
We do it once, essentially, which is nice.

27:51.000 --> 27:54.000
But these guys had a really easy feature to implement,

27:54.000 --> 27:56.000
which is this temporary views.

27:56.000 --> 27:59.000
I want to view of this sheet, other people don't see.

27:59.000 --> 28:02.000
And that's kind of easy when you duplicate the model everywhere.

28:02.000 --> 28:03.000
Like everyone has the model anyway.

28:03.000 --> 28:05.000
Like, what's the problem?

28:05.000 --> 28:08.000
For us, it's more tricky because we have a single model at the center.

28:08.000 --> 28:11.000
And so, yeah, so we did a whole lot of work here.

28:11.000 --> 28:13.000
And now, you know, it's very easy to then filter

28:13.000 --> 28:16.000
and not affect other people's views and see different views of that data.

28:16.000 --> 28:19.000
And we hope to return the favor by having multiple views,

28:19.000 --> 28:23.000
you know, and easily to use it in the sheet tab and switch between.

28:23.000 --> 28:25.000
So, that's fun. And why is that hard?

28:25.000 --> 28:28.000
Well, it seems a super easy thing to do as everything seems.

28:28.000 --> 28:32.000
Until you realize the calculation engine can use the visibility state

28:32.000 --> 28:34.000
to calculate different numbers.

28:34.000 --> 28:37.000
So, you have to, you know, do some fun stuff.

28:37.000 --> 28:40.000
We're improving mobile tool bars and all sorts of things.

28:40.000 --> 28:41.000
Follow me presentation.

28:41.000 --> 28:45.000
This is great. So, NLNet, NGI, zero, have funded this thing.

28:45.000 --> 28:46.000
And it's really cool.

28:46.000 --> 28:49.000
So, apart from having beavers and lots of beavers.

28:49.000 --> 28:52.000
Actually, I'm going to need help giving them out later.

28:52.000 --> 28:55.000
This then allows you to project your slides to other people effectively.

28:55.000 --> 28:57.000
Much as we're doing now.

28:57.000 --> 28:59.000
And why would you want to do that?

28:59.000 --> 29:01.000
Because, of course, what you can do is you can render that

29:01.000 --> 29:04.000
on your high resolution screen and then you can take screenshots of that.

29:04.000 --> 29:07.000
And you can compress that into H264.

29:07.000 --> 29:08.000
And you can stream that to everyone else.

29:08.000 --> 29:10.000
You can then decompress it again.

29:10.000 --> 29:13.000
And you can do that at 60 frames a second as your webGL transform,

29:13.000 --> 29:14.000
you know, happens.

29:14.000 --> 29:17.000
And it might, someone might even keep up if they're lucky.

29:17.000 --> 29:21.000
Up all, you can just send some JavaScript to them to run the presentation

29:21.000 --> 29:23.000
and the assets they need.

29:23.000 --> 29:26.000
And then they can run this presentation, see it all beautifully,

29:26.000 --> 29:29.000
beautifully happening on each of these people's screens.

29:29.000 --> 29:33.000
And they have actual content instead of pixel.

29:33.000 --> 29:36.000
So if they're visually impaired, they can go at their own speed.

29:36.000 --> 29:37.000
They can go back.

29:37.000 --> 29:39.000
They can read that bit on the Braille display better.

29:39.000 --> 29:41.000
They can get, it be included more.

29:41.000 --> 29:46.000
And if the presenter speaks too quickly, as can happen.

29:46.000 --> 29:49.000
Then they can, you know, keep up.

29:49.000 --> 29:52.000
You know, they can go back and check again and make sure they understood that.

29:52.000 --> 29:54.000
So, yeah, some nice stuff.

29:54.000 --> 29:57.000
And pretty as settings you I, just built in.

29:57.000 --> 30:00.000
And one of the things we're really focusing on is interoperability.

30:00.000 --> 30:02.000
We've talked to you about some of the problems.

30:02.000 --> 30:04.000
We've, you know, we solve huge numbers of them.

30:04.000 --> 30:06.000
But we want to get the numbers down to zeroes everywhere.

30:06.000 --> 30:08.000
So we've been using a tool.

30:08.000 --> 30:10.000
The game was helpful funded by Zendes.

30:10.000 --> 30:15.000
And just exposes the very worst bug documents out of our very worst bugs

30:15.000 --> 30:17.000
that are causing problems around tripping.

30:17.000 --> 30:21.000
And so there's a great team there of people just chasing that down to zero.

30:21.000 --> 30:23.000
And once we get it to zero, it stays there.

30:23.000 --> 30:25.000
You know, like this is, this is what we want to see.

30:25.000 --> 30:27.000
Lots of, lots of, lots of zeros.

30:28.000 --> 30:31.000
So we have all this beautiful new user experience in collaboration line.

30:31.000 --> 30:35.000
And we've been doing some great work to bring that to the desktop.

30:35.000 --> 30:37.000
But actually, that's something we've done for years.

30:37.000 --> 30:42.000
So on Chrome OS, you've always had something that runs on your Android phone.

30:42.000 --> 30:45.000
And if you plug it into a big screen and put a keyboard in, suddenly it's a full

30:45.000 --> 30:47.000
full office suite running on that device.

30:47.000 --> 30:51.000
Same thing on iPhone for Mac if you compile it right.

30:51.000 --> 30:55.000
And so, you know, native code brings a whole load of advantages.

30:55.000 --> 30:57.000
Um, offline support is one of them.

30:57.000 --> 31:01.000
Obviously, as you travel the same UI, but better, you know,

31:01.000 --> 31:05.000
high performance layer latency editing there, obviously, you know, in a slow train.

31:05.000 --> 31:07.000
But better than that, you have platform API.

31:07.000 --> 31:09.000
So the browser is a wonderful tool.

31:09.000 --> 31:12.000
And it provides an amazing infrastructure everywhere.

31:12.000 --> 31:14.000
Quite amazing in some ways.

31:14.000 --> 31:17.000
Um, two amazing and JavaScript, let's say, but anyway,

31:17.000 --> 31:20.000
um, but it also really is a bit security paranoid.

31:20.000 --> 31:23.000
So getting access to your clipboard is really difficult.

31:23.000 --> 31:26.000
You can't get rich content through it nicely, and that sucks.

31:26.000 --> 31:29.000
If you want to see whether you've got multiple screens or what the

31:29.000 --> 31:31.000
resolutions are, get a projector and project on it.

31:31.000 --> 31:32.000
None of that works.

31:32.000 --> 31:35.000
Um, if you want proper printing APIs, we talk about that.

31:35.000 --> 31:36.000
What about image formats?

31:36.000 --> 31:38.000
You know, there's a whole lot of things there.

31:38.000 --> 31:42.000
And we tried initially to do this, and we're still doing that work on

31:42.000 --> 31:43.000
WebAssembly.

31:43.000 --> 31:47.000
So Stefan Bergman, somewhere is a hero of, uh,

31:47.000 --> 31:50.000
I'm making this work, but the problem with that is that it's quite disappointing.

31:50.000 --> 31:53.000
It's not really share those webAssembly that big webAssembly

31:53.000 --> 31:56.000
blog between multiple tabs, which makes a real problem.

31:56.000 --> 31:58.000
There's a couple of bugs there in the browsers that, uh,

31:58.000 --> 32:00.000
Yeah, a problem for us.

32:00.000 --> 32:02.000
So anyway, native code makes sense.

32:02.000 --> 32:05.000
And so we're just bringing the same UI to the desktop with a

32:05.000 --> 32:08.000
little bit of wrapper around it to make it look, you know, nice and

32:08.000 --> 32:11.000
pretty, uh, and all of the features you know and love, uh,

32:11.000 --> 32:15.000
the look, uh, integration with your Mac goodness and so on,

32:15.000 --> 32:17.000
or badness, it's proprietary.

32:17.000 --> 32:18.000
You shouldn't use it.

32:18.000 --> 32:20.000
It's just free desktop.

32:20.000 --> 32:24.000
Um, and this is really complimentary to the classic product that we're all aware of.

32:24.000 --> 32:28.000
Um, so we continue into work on classic, and there's a huge tech overlap

32:28.000 --> 32:31.000
there, obviously in this giant community backing that code base.

32:31.000 --> 32:34.000
And the new collaborative is then really complimentary, and that really slim

32:34.000 --> 32:35.000
down thing.

32:35.000 --> 32:36.000
No Java.

32:36.000 --> 32:37.000
No database.

32:37.000 --> 32:39.000
No mail merge, master documents.

32:39.000 --> 32:41.000
We're taking lots of stuff out of that.

32:41.000 --> 32:45.000
Um, to make it cleaner and smaller and, you know,

32:45.000 --> 32:47.000
easier to handle and wrestle.

32:47.000 --> 32:49.000
We're doing a lot of collaboration.

32:49.000 --> 32:50.000
I'll skip that now.

32:50.000 --> 32:53.000
I think, um, for, uh, we have a talk later in the collaborative room.

32:53.000 --> 32:55.000
If you want to come and see how we're doing, um,

32:55.000 --> 32:58.000
collaboration and better, a hackfest at the bed for the hotel.

32:58.000 --> 33:01.000
So just walk upstairs and visit us Monday Tuesday.

33:01.000 --> 33:03.000
If you're interested, but a lot of beavers

33:03.000 --> 33:06.000
tooling away are doing doing good things.

33:06.000 --> 33:08.000
But if you can't make that because it's a bit late as notice,

33:08.000 --> 33:11.000
we'd love to see you in Hamburg, come and join the community,

33:11.000 --> 33:14.000
meet people, do team building, uh, give lots of input.

33:14.000 --> 33:17.000
Now, there's a whole lot of really cool people who have have done great stuff.

33:17.000 --> 33:20.000
And it would be remiss of me to stand here as one person.

33:20.000 --> 33:22.000
And not mention their names.

33:22.000 --> 33:24.000
Loads of people on, uh, can have a line.

33:24.000 --> 33:27.000
Loads of great translators, uh, doing, doing great work.

33:27.000 --> 33:30.000
And, and, and, and look at the complex text goodness in the middle of

33:30.000 --> 33:32.000
there to, uh, to get some of these people written right.

33:32.000 --> 33:34.000
Now, we also have a mascot.

33:34.000 --> 33:37.000
And, um, uh, toast and don't, can I grab you to come and grab the,

33:37.000 --> 33:39.000
the thing there because we'll need this surely.

33:39.000 --> 33:41.000
There's a whole case of them over here.

33:41.000 --> 33:43.000
So, so one of the things that I have as a problem,

33:43.000 --> 33:45.000
and maybe you, you do too.

33:45.000 --> 33:47.000
So, I work quite hard.

33:47.000 --> 33:48.000
You know, I love programming.

33:48.000 --> 33:50.000
Don't get enough chance to do enough of it, you know.

33:50.000 --> 33:53.000
And so, so there's a great temptation to ignore the real world

33:53.000 --> 33:55.000
and, and to go away and, uh, program.

33:55.000 --> 33:58.000
And, and say, we have a mascot that is the sort of, uh,

33:58.000 --> 34:01.000
uh, epitome of hard work, you know.

34:01.000 --> 34:03.000
It's always out there doing, doing hard things.

34:03.000 --> 34:05.000
And, and John Hall is modeling on here at the, at the front.

34:05.000 --> 34:07.000
Thank you, John. You know, excellent. Just like that.

34:07.000 --> 34:09.000
And, and we have a lot more here and say, where people will, um,

34:09.000 --> 34:12.000
people will get these if they ask questions or come and grab me

34:12.000 --> 34:16.000
afterwards. And, and this is actually a character from a comic about open source.

34:16.000 --> 34:19.000
So, if you, if you go, it's called the Open Road to Freedom.

34:19.000 --> 34:22.000
And it's a comic about communities, an open source, and companies,

34:22.000 --> 34:24.000
and it might even be funny if you read it.

34:24.000 --> 34:26.000
So, uh, yes, have a look at that.

34:26.000 --> 34:29.000
So, here's my conclusions. My conclusions are, what are they?

34:29.000 --> 34:32.000
Ah, office is a little bit harder than you think.

34:32.000 --> 34:33.000
It looks easy.

34:33.000 --> 34:37.000
Ah, lives of people are suckered by the ease of writing their own office suite

34:37.000 --> 34:40.000
and the glory and the fame of creating something new.

34:40.000 --> 34:43.000
But, actually, it's a bit of a nightmare. So, just be a little bit careful,

34:43.000 --> 34:47.000
uh, you know, before you jump in and come and talk to me and maybe you will learn something.

34:47.000 --> 34:50.000
Ah, the browser really does get you part way there.

34:50.000 --> 34:54.000
Um, but it would be really helpful if you could just join us and we build upwards.

34:54.000 --> 34:57.000
Instead of doing the Jamie Zowinsky, CADT, you know,

34:57.000 --> 35:03.000
attention deficit teen version of point eight being succeeded by completely rewritten point eight.

35:03.000 --> 35:05.000
And then another totally rewritten point eight.

35:05.000 --> 35:09.000
And when we could have been a, you know, uh, well, I can't multiply very well.

35:09.000 --> 35:14.000
Uh, 2.4. Um, so yes, look at this. This is, we should have a gun that kind of, you know,

35:14.000 --> 35:17.000
sprays people with, with hardworking beavers, but anyway.

35:17.000 --> 35:22.000
Anyway, I think I've said thank you, but, but the people I'd really like to highlight here are,

35:22.000 --> 35:25.000
uh, the volunteer is a fantastic, um, but we have loads of staff,

35:25.000 --> 35:28.000
some of them here, Torsten is, is, is, is, is, is one.

35:28.000 --> 35:34.000
Uh, we have lots of partners and customers that help fund it and actually we can't do anything without.

35:34.000 --> 35:36.000
There's a special insurance for this, it turns out.

35:37.000 --> 35:41.000
Um, and we, you really rock. So thank you for everyone that's contributed, you're absolutely amazing.

35:41.000 --> 35:45.000
Get involved, see me. We are hiring. We are trying to grow quite rapidly.

35:45.000 --> 35:50.000
Uh, there's obviously a big opportunity here and we want to make free software and documents better.

35:50.000 --> 35:54.000
So please come and join us. Thank you for your patience. You've been very good.

35:55.000 --> 35:57.000
Thank you.

36:03.000 --> 36:06.000
Now an upside of talking too quickly is that we have time for questions.

36:06.000 --> 36:10.000
Um, and I'm trying to get us back on, on schedule. So hopefully we, uh,

36:10.000 --> 36:14.000
we have a bit of, uh, bit of time. So if you have some questions of the form, you know,

36:14.000 --> 36:18.000
can I have a beaver? Um, we've got another hundred of them in the hotel that will come tomorrow.

36:18.000 --> 36:21.000
So just come and grab me somewhere around the Libra office next cloud, uh,

36:22.000 --> 36:25.000
uh, but in the meantime, if you have a question or a comments or a hickling or, uh,

36:25.000 --> 36:28.000
I love CRDTs, they're easy or anything like that, you know?

36:28.000 --> 36:31.000
John, what question do you have? What second? I can give you a microphone.

36:34.000 --> 36:38.000
First of all, I love my beaver. Okay.

36:38.000 --> 36:41.000
Second of all, uh, my pleasure.

36:41.000 --> 36:44.000
You mentioned spreadsheets and spreadsheets has always been a problem.

36:44.000 --> 36:48.000
How is your, how are you at importing Excel spreadsheets?

36:48.000 --> 36:49.000
Fantastic.

36:49.000 --> 36:57.000
So Excel support is, I think, outstanding that you're not going to find anything else outside of Excel that does it as well as we do.

36:57.000 --> 37:02.000
Um, the performance is great. We're threading stuff. It works really well.

37:02.000 --> 37:05.000
And of course, because we're running out on the server, we can have quite a big server.

37:05.000 --> 37:08.000
So you can load really a big spreadsheet on your phone,

37:08.000 --> 37:11.000
and you're not downloading all of this stuff. You're just getting a view into that.

37:11.000 --> 37:15.000
So, you know, it's, it's, it's pretty good. I think the ergonomics and the UI,

37:15.000 --> 37:19.000
we're continually improving, but that's, you know, that's what I'd be.

37:19.000 --> 37:21.000
Good question. Yeah, I can.

37:21.000 --> 37:26.000
On one, you skipped quickly over the collaboration thingy.

37:26.000 --> 37:32.000
Can you give short impression of what the state of the artists of this protocol?

37:32.000 --> 37:35.000
The communication protocol?

37:35.000 --> 37:37.000
Two slides back.

37:37.000 --> 37:43.000
You said there's a presentation later, but for people who cannot make it,

37:44.000 --> 37:49.000
there's quite a lot of slides on them.

37:49.000 --> 37:50.000
This guy, shoot.

37:50.000 --> 37:52.000
Yeah.

37:52.000 --> 37:55.000
Just for you, Hiker.

37:55.000 --> 37:58.000
You know, the, the collaboration.

37:58.000 --> 38:06.000
It's a slide. You skip very quickly over collaboration between applications.

38:06.000 --> 38:09.000
I still can't hear what you're saying, which is one of the things.

38:09.000 --> 38:11.000
We're a fine Hiker.

38:11.000 --> 38:13.000
Collaboration. Oh, yeah, sure.

38:13.000 --> 38:17.000
I mean, we do collaboration, but we do it by bringing everyone into the same document model.

38:17.000 --> 38:19.000
So, with collaborative line, you can collaborate.

38:19.000 --> 38:23.000
All these document formats, and that works nicely, but there's a single model.

38:23.000 --> 38:26.000
So, you don't have this model synchronization problem.

38:26.000 --> 38:29.000
Right? The issue with this is that you have two models,

38:29.000 --> 38:33.000
and you have to somehow make sure they're consistent and kept in stay.

38:33.000 --> 38:35.000
And that's really not easy.

38:35.000 --> 38:44.000
Like, like, caching is one thing, but model synchron distributed model replication is a tricky problem to get right.

38:44.000 --> 38:49.000
And people do it in databases, for example, and also, so, you know, places,

38:49.000 --> 38:54.000
but it's, it's not easy with extremely complicated data structure.

38:54.000 --> 38:56.000
Stuff.

38:56.000 --> 38:57.000
Good question.

38:57.000 --> 38:58.000
Anyone else?

38:58.000 --> 38:59.000
Yeah.

38:59.000 --> 39:00.000
Yeah.

39:00.000 --> 39:05.000
You're starting desktop editors based on, like, the existing collaboration line stuff, right?

39:05.000 --> 39:06.000
Correct.

39:06.000 --> 39:07.000
Yes.

39:07.000 --> 39:11.000
Are there plans to do integration with something like, let's say, next cloud?

39:11.000 --> 39:16.000
So, if I think a bunch of documents to my computer, I can just, like, double click a ODT file.

39:16.000 --> 39:18.000
It opens and is collaborative.

39:18.000 --> 39:22.000
Because currently, we have the problem of, if I want to collaborate, I need to open it in the browser,

39:22.000 --> 39:26.000
but if I double click a dog eggs, then it locks it for everyone else, and it's just a mess.

39:26.000 --> 39:28.000
That's a brilliant question.

39:28.000 --> 39:29.000
Yes.

39:29.000 --> 39:30.000
Of course.

39:30.000 --> 39:34.000
And the answer is that, come to first of all, I'll talk in the collaboration dev room later.

39:34.000 --> 39:37.000
So, we'll be talking about that, and Stefan's been doing some great work, if I can.

39:37.000 --> 39:39.000
Ah, Stefan Bergman over here.

39:39.000 --> 39:40.000
If you wave, Stefan.

39:40.000 --> 39:41.000
Don't.

39:41.000 --> 39:44.000
So, if you're particularly interested, talk to Stefan.

39:44.000 --> 39:49.000
And the beautiful thing is there, because you have the same UI, you can switch, then,

39:49.000 --> 39:53.000
transparently in your tab, and ideally, keep your cursor position or whatever, and suddenly, you're

39:53.000 --> 39:55.000
collaborating with other people on a remote server.

39:55.000 --> 39:59.000
Oh, until your connection doesn't work, and then you can bring it back to your machine

39:59.000 --> 40:00.000
and edit there.

40:00.000 --> 40:04.000
So, we can take a load of CPU load off the server when we need to.

40:04.000 --> 40:09.000
If you're just one person in the document, which turns out to be 90% of the time in collaborative

40:09.000 --> 40:12.000
systems, actually, is just one person collaborating with themselves.

40:12.000 --> 40:14.000
Which is a little bit sad.

40:14.000 --> 40:20.000
But actually, if you consider what you do, typically, you finish your document, and then you ask

40:20.000 --> 40:26.000
for review, rather than mashing it up horribly without thinking and, you know, collaborating the same

40:26.000 --> 40:27.000
time.

40:27.000 --> 40:29.000
So, yes, perfect.

40:29.000 --> 40:31.000
We're, of course, engaged in that.

40:31.000 --> 40:36.000
And there's some fun stuff there, detecting this file you've opened locally, is actually being

40:36.000 --> 40:40.000
synced by a, you know, a sync client, and now I need to go and talk, you know, there's a lot of plumbing,

40:40.000 --> 40:43.000
but not a lot of complexity in doing that.

40:43.000 --> 40:46.000
So, yeah, we're looking forward to getting that working.

40:47.000 --> 40:53.000
Oh, so, no, no much of a technical more on the marketing side.

40:53.000 --> 41:01.000
So, currently, obviously, the world is going from like desktop office suits to online ones.

41:01.000 --> 41:09.000
Like this gives you an opportunity because, like, then people stop expecting pixel perfect rendering.

41:09.000 --> 41:15.000
And, over the, I guess, you have, like, two main competitors, the Microsoft and the Google,

41:15.000 --> 41:21.000
the Google suits are apart from digital sovereignty.

41:21.000 --> 41:30.000
What other killer features would you recommend as a, like, what little bit of office does.

41:30.000 --> 41:33.000
Our collaborative story.

41:33.000 --> 41:37.000
So, killer features in caliber office that aren't there in the other online office

41:37.000 --> 41:38.000
sweets.

41:38.000 --> 41:42.000
Yeah, I mean, we have some just amazing cutting-edge features that you can use in

41:42.000 --> 41:46.000
you can have a online writer, for example, that aren't there in Microsoft's writer.

41:46.000 --> 41:47.000
Good work, Benoit.

41:47.000 --> 41:48.000
This guy's a hero.

41:48.000 --> 41:49.000
He's one of the customers.

41:49.000 --> 41:50.000
Yeah.

41:50.000 --> 41:51.000
Awesome.

41:51.000 --> 41:54.000
Million plus seats in France, French education, that man.

41:54.000 --> 41:55.000
What a hero.

41:55.000 --> 41:56.000
So, yes.

41:56.000 --> 42:03.000
So, in Microsoft Office online, you can't insert a chart in a word document.

42:03.000 --> 42:04.000
I'll just say that again.

42:04.000 --> 42:06.000
You can't insert a chart in a word document.

42:06.000 --> 42:10.000
Now, you're not going to believe me because that seems totally lunatic, right?

42:10.000 --> 42:15.000
The leading office suite provider has suddenly decided we don't need charts in word processing

42:15.000 --> 42:16.000
sweets.

42:16.000 --> 42:20.000
Now, as you probably can copy it from Excel, but you're probably going to get a bit map image

42:20.000 --> 42:21.000
with false color around it.

42:21.000 --> 42:24.000
So, when you size it, you get like blue red green, you know?

42:24.000 --> 42:27.000
I mean, just startlingly bad.

42:27.000 --> 42:32.000
And the thing itself is riddled with adverts for using the desktop version

42:32.000 --> 42:33.000
instead.

42:33.000 --> 42:36.000
So, you know, it's constantly saying, are you sure you want to do this?

42:36.000 --> 42:37.000
This seems a bit difficult.

42:37.000 --> 42:39.000
Please continue to use Windows.

42:39.000 --> 42:42.000
And store your data in one cloud while you're there, right?

42:42.000 --> 42:44.000
So, yeah.

42:44.000 --> 42:48.000
I mean, I think from a feature function perspective web versus web,

42:48.000 --> 42:52.000
we kick Microsoft's backside already quite hard in many ways.

42:52.000 --> 42:55.000
And Google, you know, on a par or, you know,

42:55.000 --> 42:56.000
we win and lose.

42:56.000 --> 42:57.000
Interrupt.

42:57.000 --> 42:58.000
We kick Google's backside.

42:58.000 --> 43:01.000
We're just much better interrupt than they are.

43:01.000 --> 43:04.000
So, yeah, I think there's everything to play for in that market.

43:04.000 --> 43:05.000
And we don't need to be ashamed.

43:05.000 --> 43:06.000
We should say you should use this.

43:06.000 --> 43:08.000
It's really good.

43:08.000 --> 43:09.000
Thank you.

43:09.000 --> 43:10.000
Oh, different.

43:10.000 --> 43:11.000
So, wait.

43:11.000 --> 43:12.000
And thank you to you.

43:12.000 --> 43:13.000
Yeah.

43:13.000 --> 43:17.000
So, my previous job and very clear talk,

43:17.000 --> 43:22.000
would you mind going back to the number of bags along the time?

43:22.000 --> 43:23.000
Oh, yeah, this one.

43:23.000 --> 43:25.000
This is a very specific kind of bug.

43:25.000 --> 43:27.000
It's an interoperability bug.

43:27.000 --> 43:32.000
Of a specific targeted interoperability type.

43:32.000 --> 43:33.000
Yeah.

43:33.000 --> 43:38.000
So, is there any reason why ODD is still?

43:38.000 --> 43:42.000
Oh, yes, just bad prioritization by me.

43:42.000 --> 43:46.000
So, I was particularly annoyed with the presentation fidelity.

43:46.000 --> 43:48.000
And so, I was like, right, got to fix and press.

43:48.000 --> 43:50.000
So, we did that first.

43:50.000 --> 43:51.000
And now we're doing these.

43:51.000 --> 43:53.000
But there's nothing wrong with ODT.

43:53.000 --> 43:57.000
This is just, this is just exporting it back to DocX.

43:57.000 --> 44:00.000
Because there's quite a large difference.

44:00.000 --> 44:05.000
If you get a very complicated ODT, then sometimes when you import that in Microsoft,

44:05.000 --> 44:08.000
it will complain about the document structure in some way.

44:08.000 --> 44:09.000
Okay.

44:09.000 --> 44:10.000
Oh, it seems bad.

44:10.000 --> 44:11.000
Usually you get the document.

44:11.000 --> 44:13.000
It just likes to complain.

44:13.000 --> 44:16.000
So, you know, if we can stop the complaints, they scare users, you know.

44:16.000 --> 44:19.000
But all your contents there and we can reload it.

44:19.000 --> 44:20.000
But yeah.

44:20.000 --> 44:25.000
So, and just to give you a perspective, you know, we have like a test corpus of

44:25.000 --> 44:29.000
quarter of a million, third of a million of the worst documents we can find in the world.

44:29.000 --> 44:30.000
Right?

44:30.000 --> 44:34.000
And so, this is some fraction of a percent of the real usage.

44:34.000 --> 44:39.000
And, you know, this is the sort of numbers we're seeing for actual problems doing that

44:39.000 --> 44:40.000
roundship from Microsoft.

44:40.000 --> 44:41.000
So, yeah.

44:41.000 --> 44:43.000
So, we're making real progress.

44:43.000 --> 44:44.000
I'm hopefully next falls down.

44:44.000 --> 44:45.000
This number will be zero.

44:45.000 --> 44:48.000
And then it will stay zero because we have automation.

44:48.000 --> 44:52.000
And, you know, as soon as it goes up, we'll stop it happening.

44:52.000 --> 44:53.000
So, thank you so much.

44:53.000 --> 44:55.000
You've been super good audience.

44:55.000 --> 44:56.000
So, bless you.

44:56.000 --> 44:57.000
And come and see me.

44:57.000 --> 44:58.000
Grab a beaver.

44:58.000 --> 44:59.000
Thank you so much.

44:59.000 --> 45:06.000
Thank you so much.

45:06.000 --> 45:07.000
Thank you very much.

45:07.000 --> 45:12.000
And I hope you didn't scare away all the developers, the potential ones.

45:12.000 --> 45:13.000
And yeah.

45:13.000 --> 45:14.000
Thanks again.

