EtherCalc: Multiplayer Spreadsheet

251
EtherCalc Multiplayer Spreadsheet ethercalc.tw

description

English rendering of EtherCalc talk, OSDC.tw 2012.

Transcript of EtherCalc: Multiplayer Spreadsheet

Page 2: EtherCalc: Multiplayer Spreadsheet

Personal Opinions

Page 3: EtherCalc: Multiplayer Spreadsheet

Personal Opinions

(With Infotisements)

Page 4: EtherCalc: Multiplayer Spreadsheet

Time LimitedJust StoriesNo Coding

Page 5: EtherCalc: Multiplayer Spreadsheet

Time LimitedJust StoriesNo Coding

Ideas

Page 8: EtherCalc: Multiplayer Spreadsheet

History

Page 9: EtherCalc: Multiplayer Spreadsheet

VisiCalc, 1979

Dan Bricklin

Page 10: EtherCalc: Multiplayer Spreadsheet

Harvard, 1977

Page 11: EtherCalc: Multiplayer Spreadsheet

Harvard, 1977

Page 12: EtherCalc: Multiplayer Spreadsheet

Harvard, 1977

Page 13: EtherCalc: Multiplayer Spreadsheet

Harvard, 1977

Page 14: EtherCalc: Multiplayer Spreadsheet

Harvard, 1977

Page 15: EtherCalc: Multiplayer Spreadsheet

Original Vision

Page 16: EtherCalc: Multiplayer Spreadsheet

Original Vision

Alto Workstation

Page 17: EtherCalc: Multiplayer Spreadsheet

Original Vision

Calculator-Mouse

Alto Workstation

Page 18: EtherCalc: Multiplayer Spreadsheet

Original Vision

Head-mountedDisplay

Calculator-Mouse

Alto Workstation

Page 19: EtherCalc: Multiplayer Spreadsheet

Original Vision

Head-mountedDisplay

Calculator-Mouse

Alto Workstation

Page 20: EtherCalc: Multiplayer Spreadsheet
Page 21: EtherCalc: Multiplayer Spreadsheet
Page 22: EtherCalc: Multiplayer Spreadsheet

=SUM( ) 0

Page 23: EtherCalc: Multiplayer Spreadsheet

10

=SUM( ) 010

Page 24: EtherCalc: Multiplayer Spreadsheet

10 20

=SUM( ) 01030

Page 25: EtherCalc: Multiplayer Spreadsheet

10 20 30

=SUM( ) 0103060

Page 26: EtherCalc: Multiplayer Spreadsheet

10 20 30

=SUM( ) 0103060

Page 27: EtherCalc: Multiplayer Spreadsheet

1977 → 1978

Page 28: EtherCalc: Multiplayer Spreadsheet

1977 → 1978

Page 29: EtherCalc: Multiplayer Spreadsheet

1977 → 1978

Integer BASIC

+

Page 30: EtherCalc: Multiplayer Spreadsheet

1978 → 1979

Page 31: EtherCalc: Multiplayer Spreadsheet

10 20 30

=SUM( ) 60

1978 → 1979

Page 32: EtherCalc: Multiplayer Spreadsheet

10 20 30

=SUM( ) 60

A B C D

1

2

1978 → 1979

Page 33: EtherCalc: Multiplayer Spreadsheet

10 20 30

=SUM( ) 60

A B C D

1

2 A1,B1,C1

1978 → 1979

Page 34: EtherCalc: Multiplayer Spreadsheet

Bob & Dan

10 20 30

=SUM( ) 60

A B C D

1

2 A1,B1,C1

1978 → 1979

Page 35: EtherCalc: Multiplayer Spreadsheet

Bob & Dan

‣ Dan prototypes in BASIC

10 20 30

=SUM( ) 60

A B C D

1

2 A1,B1,C1

1978 → 1979

Page 36: EtherCalc: Multiplayer Spreadsheet

Bob & Dan

‣ Dan prototypes in BASIC

‣ Bob codes in 6502 ASM

10 20 30

=SUM( ) 60

A B C D

1

2 A1,B1,C1

1978 → 1979

Page 37: EtherCalc: Multiplayer Spreadsheet

Bob & Dan

‣ Dan prototypes in BASIC

‣ Bob codes in 6502 ASM

‣ 700,000 copies in 6 years

10 20 30

=SUM( ) 60

A B C D

1

2 A1,B1,C1

1978 → 1979

Page 38: EtherCalc: Multiplayer Spreadsheet

Bob & Dan

‣ Dan prototypes in BASIC

‣ Bob codes in 6502 ASM

‣ 700,000 copies in 6 years

‣ The !rst “Killer App”

10 20 30

=SUM( ) 60

A B C D

1

2 A1,B1,C1

1978 → 1979

Page 39: EtherCalc: Multiplayer Spreadsheet

1981

Page 40: EtherCalc: Multiplayer Spreadsheet
Page 41: EtherCalc: Multiplayer Spreadsheet
Page 42: EtherCalc: Multiplayer Spreadsheet
Page 43: EtherCalc: Multiplayer Spreadsheet
Page 44: EtherCalc: Multiplayer Spreadsheet
Page 45: EtherCalc: Multiplayer Spreadsheet

20 years passed

Page 46: EtherCalc: Multiplayer Spreadsheet

20 years passed

Page 47: EtherCalc: Multiplayer Spreadsheet

20 years passed

Page 48: EtherCalc: Multiplayer Spreadsheet

20 years passed

Page 49: EtherCalc: Multiplayer Spreadsheet

20 years passed

Nothing changed

Page 50: EtherCalc: Multiplayer Spreadsheet
Page 51: EtherCalc: Multiplayer Spreadsheet

“Can’t open”

Page 52: EtherCalc: Multiplayer Spreadsheet

“Can’t open”

“Garbled”

Page 53: EtherCalc: Multiplayer Spreadsheet

“Virus!”

“Can’t open”

“Garbled”

Page 54: EtherCalc: Multiplayer Spreadsheet
Page 55: EtherCalc: Multiplayer Spreadsheet

Wikipedia, 2001

Page 56: EtherCalc: Multiplayer Spreadsheet

Wikipedia, 2001

Page 57: EtherCalc: Multiplayer Spreadsheet

Wikipedia, 2001

Page 58: EtherCalc: Multiplayer Spreadsheet

wikiCalc, 2005

Page 59: EtherCalc: Multiplayer Spreadsheet

✓ Plain text, HTML & Wiki syntax

wikiCalc, 2005

Page 60: EtherCalc: Multiplayer Spreadsheet

✓ Plain text, HTML & Wiki syntax

✓ References cells on other servers

wikiCalc, 2005

Page 61: EtherCalc: Multiplayer Spreadsheet

✓ Plain text, HTML & Wiki syntax

✓ References cells on other servers

✓ Keeps all operations for auditing

wikiCalc, 2005

Page 62: EtherCalc: Multiplayer Spreadsheet

✓ Plain text, HTML & Wiki syntax

✓ References cells on other servers

✓ Keeps all operations for auditing

✓ Revert to any revision

wikiCalc, 2005

Page 63: EtherCalc: Multiplayer Spreadsheet

✓ Plain text, HTML & Wiki syntax

✓ References cells on other servers

✓ Keeps all operations for auditing

✓ Revert to any revision

✓ Open Source! (GPLv2)

wikiCalc, 2005

Page 64: EtherCalc: Multiplayer Spreadsheet

wikiCalc.pl

Page 65: EtherCalc: Multiplayer Spreadsheet

網站./wkcdata/sites/Foo

./wkcdata/sites/Bar

./wkcdata/sites/Baz

wikiCalc.plSites

Page 66: EtherCalc: Multiplayer Spreadsheet

網站./wkcdata/sites/Foo

./wkcdata/sites/Bar

./wkcdata/sites/Baz

wikiCalc.pl

頁面XXX

YYY

ZZZ

Sites Pages

Page 67: EtherCalc: Multiplayer Spreadsheet

網站./wkcdata/sites/Foo

./wkcdata/sites/Bar

./wkcdata/sites/Baz

wikiCalc.pl

頁面XXX

YYY

ZZZ

儲存格

Sites Pages

Cells

Page 68: EtherCalc: Multiplayer Spreadsheet

網站./wkcdata/sites/Foo

./wkcdata/sites/Bar

./wkcdata/sites/Baz

wikiCalc.pl

頁面XXX

YYY

ZZZ

儲存格A1: 100

Sites Pages

Cells

Page 69: EtherCalc: Multiplayer Spreadsheet

網站./wkcdata/sites/Foo

./wkcdata/sites/Bar

./wkcdata/sites/Baz

wikiCalc.pl

頁面XXX

YYY

ZZZ

儲存格A1: 100A2: =A1*2

Sites Pages

Cells

Page 70: EtherCalc: Multiplayer Spreadsheet

網站./wkcdata/sites/Foo

./wkcdata/sites/Bar

./wkcdata/sites/Baz

wikiCalc.pl

頁面XXX

YYY

ZZZ

儲存格A1: 100A2: =A1*2

B1: =XXX!C1

Sites Pages

Cells

Page 71: EtherCalc: Multiplayer Spreadsheet

網站./wkcdata/sites/Foo

./wkcdata/sites/Bar

./wkcdata/sites/Baz

wikiCalc.pl

頁面XXX

YYY

ZZZ

儲存格A1: 100A2: =A1*2

B1: =XXX!C1

Sites Pages

Cells

Page 72: EtherCalc: Multiplayer Spreadsheet

網站./wkcdata/sites/Foo

./wkcdata/sites/Bar

./wkcdata/sites/Baz

wikiCalc.pl

頁面XXX

YYY

ZZZ

儲存格A1: 100A2: =A1*2

B1: =XXX!C1B2: =YYY!D2

Sites Pages

Cells

Page 73: EtherCalc: Multiplayer Spreadsheet

網站./wkcdata/sites/Foo

./wkcdata/sites/Bar

./wkcdata/sites/Baz

wikiCalc.pl

頁面XXX

YYY

ZZZ

儲存格A1: 100A2: =A1*2

B1: =XXX!C1B2: =YYY!D2

Sites Pages

Cells

Page 74: EtherCalc: Multiplayer Spreadsheet

網站./wkcdata/sites/Foo

./wkcdata/sites/Bar

./wkcdata/sites/Baz

wikiCalc.pl

頁面XXX

YYY

ZZZ

儲存格A1: 100A2: =A1*2

B1: =XXX!C1B2: =YYY!D2 Cross-page

Reference

Sites Pages

Cells

Page 75: EtherCalc: Multiplayer Spreadsheet

wikiCalc Edit Flow

Page 76: EtherCalc: Multiplayer Spreadsheet

wikiCalc Edit FlowA1: 100A2: =A1*2

Page 77: EtherCalc: Multiplayer Spreadsheet

wikiCalc Edit FlowA1: 100A2: =A1*2

Page 78: EtherCalc: Multiplayer Spreadsheet

wikicalc.pl

wikiCalc Edit FlowA1: 100A2: =A1*2

POST /ajaxsetcell=host:page:A1:300

Page 79: EtherCalc: Multiplayer Spreadsheet

wikicalc.pl

wikiCalc Edit FlowA1: 100A2: =A1*2

POST /ajaxsetcell=host:page:A1:300

200 OK<?xml version="1.0"?><root><![CDATA[A1:v:300:300:right:1:1::A2:f:600:A1*2:right:1:1::]]></root>

Page 80: EtherCalc: Multiplayer Spreadsheet

“Loading…”

Page 81: EtherCalc: Multiplayer Spreadsheet

“Loading…”

Page 82: EtherCalc: Multiplayer Spreadsheet

“Loading…”

“C100k” Problem

Page 83: EtherCalc: Multiplayer Spreadsheet

“Loading…”

“C100k” Problem

Page 84: EtherCalc: Multiplayer Spreadsheet
Page 85: EtherCalc: Multiplayer Spreadsheet

Undo

Page 86: EtherCalc: Multiplayer Spreadsheet

Undo

Redo

Page 87: EtherCalc: Multiplayer Spreadsheet

SocialCalc, 2006

Dan Bricklin Ross Mayfield

Page 88: EtherCalc: Multiplayer Spreadsheet

Design Goals

Page 89: EtherCalc: Multiplayer Spreadsheet

Design Goals‣ Rewrite calc engine in JS

Page 90: EtherCalc: Multiplayer Spreadsheet

Design Goals‣ Rewrite calc engine in JS

‣ Real-time responsive editor

Page 91: EtherCalc: Multiplayer Spreadsheet

Design Goals‣ Rewrite calc engine in JS

‣ Real-time responsive editor

‣ Supports 100,000+ cells

Page 92: EtherCalc: Multiplayer Spreadsheet

Design Goals‣ Rewrite calc engine in JS

‣ Real-time responsive editor

‣ Supports 100,000+ cells

‣Works on all browsers (IE6+)

Page 93: EtherCalc: Multiplayer Spreadsheet

Design Goals‣ Rewrite calc engine in JS

‣ Real-time responsive editor

‣ Supports 100,000+ cells

‣Works on all browsers (IE6+)

‣ Client-side log & undo/redo

Page 94: EtherCalc: Multiplayer Spreadsheet

Architecture

Page 95: EtherCalc: Multiplayer Spreadsheet

ArchitectureSocialCalc.js

HTTP Server

Page 96: EtherCalc: Multiplayer Spreadsheet

ArchitectureSocialCalc.js

HTTP Server

GET

Page 97: EtherCalc: Multiplayer Spreadsheet

ArchitectureSocialCalc.js

HTTP Server

GET

Page 98: EtherCalc: Multiplayer Spreadsheet

ArchitectureSocialCalc.js

HTTP Server

GET GET

Page 99: EtherCalc: Multiplayer Spreadsheet

ArchitectureSocialCalc.js

HTTP Server

GET GET($)

Page 100: EtherCalc: Multiplayer Spreadsheet

ArchitectureSocialCalc.js

HTTP Server

GETPUT

GET($)

Page 101: EtherCalc: Multiplayer Spreadsheet

ArchitectureSocialCalc.js

HTTP Server

GETPUT

GET($)

Page 102: EtherCalc: Multiplayer Spreadsheet

Command Pattern

Page 103: EtherCalc: Multiplayer Spreadsheet

Command Patternset A1 value n 42

Page 104: EtherCalc: Multiplayer Spreadsheet

Command Patternset A1 value n 42set A2 formula A1*2

Page 105: EtherCalc: Multiplayer Spreadsheet

Command Patternset A1 value n 42set A2 formula A1*2merge A1:B2 cut A3paste A4sort A1:B9 A up B downset sheet defaultcolor blue...

Page 106: EtherCalc: Multiplayer Spreadsheet

Command Pattern

‣ Async recalc loop

set A1 value n 42set A2 formula A1*2

Page 107: EtherCalc: Multiplayer Spreadsheet

Command Pattern

‣ Async recalc loop

‣ Visible-only redraw

set A1 value n 42set A2 formula A1*2

Page 108: EtherCalc: Multiplayer Spreadsheet

Command Pattern

‣ Async recalc loop

‣ Visible-only redraw

‣ Unlimited undo/redo

set A1 value n 42set A2 formula A1*2

Page 109: EtherCalc: Multiplayer Spreadsheet

Command Pattern

‣ Async recalc loop

‣ Visible-only redraw

‣ Unlimited undo/redo

‣ UI stays responsive

set A1 value n 42set A2 formula A1*2

Page 110: EtherCalc: Multiplayer Spreadsheet

Command Pattern

‣ Async recalc loop

‣ Visible-only redraw

‣ Unlimited undo/redo

‣ UI stays responsive

set A1 value n 42set A2 formula A1*2

Page 111: EtherCalc: Multiplayer Spreadsheet

“Social”Calc

Page 112: EtherCalc: Multiplayer Spreadsheet

“Social”Calc

Page 113: EtherCalc: Multiplayer Spreadsheet

“Social”Calc

Comment, Like, Tag, Share, Embed...

Page 114: EtherCalc: Multiplayer Spreadsheet

Objects ⇔ Relations

Page 115: EtherCalc: Multiplayer Spreadsheet

Objects ⇔ Relations

Page 116: EtherCalc: Multiplayer Spreadsheet

Objects ⇔ Relations

Page 117: EtherCalc: Multiplayer Spreadsheet
Page 118: EtherCalc: Multiplayer Spreadsheet

Good !rstPro!ts later

Page 119: EtherCalc: Multiplayer Spreadsheet

Common Public Attribution License

Page 120: EtherCalc: Multiplayer Spreadsheet

Common Public Attribution License

ⓐ BSD, MIT

Page 121: EtherCalc: Multiplayer Spreadsheet

Common Public Attribution License

ⓐ BSD, MIT

©

LGPL, MPL

Page 122: EtherCalc: Multiplayer Spreadsheet

Common Public Attribution License

ⓐ BSD, MIT

©

LGPL, MPL

++©

GPL

Page 123: EtherCalc: Multiplayer Spreadsheet

Common Public Attribution License

ⓐ BSD, MIT

©

LGPL, MPL

++©

GPL“ASP����������� ������������������  loophole”

Page 124: EtherCalc: Multiplayer Spreadsheet

Common Public Attribution License

ⓐ BSD, MIT

©

LGPL, MPL

++©

GPL

Affero GPL

“ASP����������� ������������������  loophole”

Page 125: EtherCalc: Multiplayer Spreadsheet

Common Public Attribution License

ⓐ BSD, MIT

©

LGPL, MPL

++©

GPL

Affero GPLCPAL

“ASP����������� ������������������  loophole”

Page 126: EtherCalc: Multiplayer Spreadsheet

Common Public Attribution License

ⓐ BSD, MIT

©

LGPL, MPL

++©

GPL

Affero GPLCPAL

“ASP����������� ������������������  loophole”

Page 127: EtherCalc: Multiplayer Spreadsheet

Common Public Attribution License

ⓐ BSD, MIT

©

LGPL, MPL

++©

GPL

Affero GPLCPAL

“ASP����������� ������������������  loophole”

Page 128: EtherCalc: Multiplayer Spreadsheet

Common Public Attribution License

ⓐ BSD, MIT

©

LGPL, MPL

++©

GPL

Affero GPLCPAL

“ASP����������� ������������������  loophole”

Page 129: EtherCalc: Multiplayer Spreadsheet

Sheetnode, 2008

Karim Ratib

Page 130: EtherCalc: Multiplayer Spreadsheet

Sheetnode, 2008

Karim Ratib

Views + Fields + CCK

Page 131: EtherCalc: Multiplayer Spreadsheet

Sheetnode, 2008

Karim Ratib

Views + Fields + CCK

SocialCalc.js

Page 132: EtherCalc: Multiplayer Spreadsheet

Sheetnode, 2008

Karim Ratib

Views + Fields + CCK

SocialCalc.js

Page 133: EtherCalc: Multiplayer Spreadsheet

Sheetnode, 2008

Karim Ratib

Views + Fields + CCK

SocialCalc.js

Page 134: EtherCalc: Multiplayer Spreadsheet

Sheetnode, 2008

Karim Ratib

Views + Fields + CCK

SocialCalc.js

Page 135: EtherCalc: Multiplayer Spreadsheet

OLPC, 2008

Page 136: EtherCalc: Multiplayer Spreadsheet

Luke Closs & Dan

OLPC, 2008

Page 137: EtherCalc: Multiplayer Spreadsheet
Page 138: EtherCalc: Multiplayer Spreadsheet
Page 139: EtherCalc: Multiplayer Spreadsheet

Mesh P2P

Page 140: EtherCalc: Multiplayer Spreadsheet
Page 141: EtherCalc: Multiplayer Spreadsheet

ManusheelGupta

Vijit Singh

Page 142: EtherCalc: Multiplayer Spreadsheet

ManusheelGupta

Vijit Singh

SocialCalcActivity.py

XoCom.py

Gecko/XPCOM

SocialCalc.js

XoCom.js

Page 143: EtherCalc: Multiplayer Spreadsheet

ManusheelGupta

Vijit Singh

SocialCalcActivity.py

XoCom.py

Gecko/XPCOM

SocialCalc.js

XoCom.js

set A1 value n 42

Page 144: EtherCalc: Multiplayer Spreadsheet

ManusheelGupta

Vijit Singh

SocialCalcActivity.py

XoCom.py

Gecko/XPCOM

SocialCalc.js

XoCom.js

D-Bus + Telepathy

set A1 value n 42

Page 145: EtherCalc: Multiplayer Spreadsheet

ManusheelGupta

Vijit Singh

SocialCalcActivity.py

XoCom.py

Gecko/XPCOM

SocialCalc.js

XoCom.js

D-Bus + Telepathy

set A1 value n 42

OLPC Mesh

網絡廣播Broadcast

Page 146: EtherCalc: Multiplayer Spreadsheet

ManusheelGupta

Vijit Singh

SocialCalcActivity.py

XoCom.py

Gecko/XPCOM

SocialCalc.js

XoCom.js

SocialCalcActivity.py

XoCom.py

Gecko/XPCOM

SocialCalc.js

XoCom.js

D-Bus + Telepathy

D-Bus + Telepathy

set A1 value n 42

OLPC Mesh

網絡廣播Broadcast

Page 147: EtherCalc: Multiplayer Spreadsheet

ManusheelGupta

Vijit Singh

SocialCalcActivity.py

XoCom.py

Gecko/XPCOM

SocialCalc.js

XoCom.js

SocialCalcActivity.py

XoCom.py

Gecko/XPCOM

SocialCalc.js

XoCom.js

D-Bus + Telepathy

D-Bus + Telepathy

set A1 value n 42

set A1 value n 42

OLPC Mesh

網絡廣播Broadcast

Page 148: EtherCalc: Multiplayer Spreadsheet

Great, but...

Page 149: EtherCalc: Multiplayer Spreadsheet

‣Must log on same time

Great, but...

Page 150: EtherCalc: Multiplayer Spreadsheet

‣Must log on same time

‣ Can’t replay missed logs

Great, but...

Page 151: EtherCalc: Multiplayer Spreadsheet

‣Must log on same time

‣ Can’t replay missed logs

‣ Race condition on cells

Great, but...

Page 152: EtherCalc: Multiplayer Spreadsheet

‣Must log on same time

‣ Can’t replay missed logs

‣ Race condition on cells

‣OLPC-specific code!

Great, but...

Page 153: EtherCalc: Multiplayer Spreadsheet

跳格二零零九 唐鳳中英雙宇有字版

MultiplayerSocialCalc

YAPC::Tiny, 2009

Page 154: EtherCalc: Multiplayer Spreadsheet

EV/AnyEvent

Page 155: EtherCalc: Multiplayer Spreadsheet

Tatsumaki EV/AnyEvent

@miyagawa

Page 156: EtherCalc: Multiplayer Spreadsheet

Tatsumaki

Web::Hippie

@clkao

EV/AnyEvent

@miyagawa

Page 157: EtherCalc: Multiplayer Spreadsheet

Tatsumaki

Web::Hippie

@clkao

Feersum

@stash

EV/AnyEvent

@miyagawa

Page 158: EtherCalc: Multiplayer Spreadsheet

WebSocket Channels

multiserver.pl

Web::Hippie

Plack

FeersumEV/libev

Page 159: EtherCalc: Multiplayer Spreadsheet

WebSocket Channels

multiserver.pl

Web::Hippie

Plack

FeersumEV/libev

ScheduleScheetCommandset A1 value n 2046

SpreadsheetControl

RenderSheet

Page 160: EtherCalc: Multiplayer Spreadsheet

WebSocket Channels

multiserver.pl

Web::Hippie

Plack

FeersumEV/libev

ScheduleScheetCommandset A1 value n 2046

SpreadsheetControl

RenderSheet Send

Page 161: EtherCalc: Multiplayer Spreadsheet

WebSocket Channels

multiserver.pl

Web::Hippie

Plack

FeersumEV/libev

ScheduleScheetCommandset A1 value n 2046

SpreadsheetControl

RenderSheet Send

Relay

Page 162: EtherCalc: Multiplayer Spreadsheet

WebSocket Channels

multiserver.pl

Web::Hippie

Plack

FeersumEV/libev

ScheduleScheetCommandset A1 value n 2046

SpreadsheetControl

RenderSheet SendRenderSheet

ScheduleScheetCommand

(isRemote = true)set A1 value n 2046

Relay

Page 163: EtherCalc: Multiplayer Spreadsheet

New Features

Page 164: EtherCalc: Multiplayer Spreadsheet

✓Fetch logs on join

New Features

Page 165: EtherCalc: Multiplayer Spreadsheet

✓Fetch logs on join

✓Reconnection recovery

New Features

Page 166: EtherCalc: Multiplayer Spreadsheet

✓Fetch logs on join

✓Reconnection recovery

✓Show peer cursors

New Features

Page 167: EtherCalc: Multiplayer Spreadsheet

✓Fetch logs on join

✓Reconnection recovery

✓Show peer cursors

✓Cross-browser support!

New Features

Page 168: EtherCalc: Multiplayer Spreadsheet

✓Fetch logs on join

✓Reconnection recovery

✓Show peer cursors

✓Cross-browser support!

New Features

Page 169: EtherCalc: Multiplayer Spreadsheet

Much better, but...

Page 170: EtherCalc: Multiplayer Spreadsheet

‣Which peer’s log to take?

Much better, but...

Page 171: EtherCalc: Multiplayer Spreadsheet

‣Which peer’s log to take?

‣What if everyone leaves?

Much better, but...

Page 172: EtherCalc: Multiplayer Spreadsheet

‣Which peer’s log to take?

‣What if everyone leaves?

‣Who would keep the logs?

Much better, but...

Page 173: EtherCalc: Multiplayer Spreadsheet

‣Which peer’s log to take?

‣What if everyone leaves?

‣Who would keep the logs?

‣ Replay 1,000+ commands?

Much better, but...

Page 174: EtherCalc: Multiplayer Spreadsheet

‣Which peer’s log to take?

‣What if everyone leaves?

‣Who would keep the logs?

‣ Replay 1,000+ commands?

Much better, but...

Page 175: EtherCalc: Multiplayer Spreadsheet
Page 176: EtherCalc: Multiplayer Spreadsheet

Undo

Page 177: EtherCalc: Multiplayer Spreadsheet

Undo

Redo?

Page 178: EtherCalc: Multiplayer Spreadsheet

YAPC::NA, 2006

Page 179: EtherCalc: Multiplayer Spreadsheet

“I think, but I cannot prove, that by

the next year JavaScript 2.0 will

bootstrap itself, complete self

hosting, compile back to JavaScript,

and replace Ruby as the Next Big

Thing in all environments. ”

YAPC::NA, 2006

Page 180: EtherCalc: Multiplayer Spreadsheet

YAPC::NA, 2006

Page 181: EtherCalc: Multiplayer Spreadsheet

YAPC::NA, 2006“JavaScript will become the common

backend for all dynamic languages,

and so you can write Perl to run in the

browser, on the server, and inside

databases, all with the same set of

development tools. ”

Page 182: EtherCalc: Multiplayer Spreadsheet

YAPC::NA, 2006

Page 183: EtherCalc: Multiplayer Spreadsheet

YAPC::NA, 2006“Because, as we all know, worse is better, so the worst scripting language is doomed to become the best.”

Page 184: EtherCalc: Multiplayer Spreadsheet

YAPC::NA, 2006“Because, as we all know, worse is better, so the worst scripting language is doomed to become the best.”

劣=夯

Page 185: EtherCalc: Multiplayer Spreadsheet
Page 186: EtherCalc: Multiplayer Spreadsheet
Page 187: EtherCalc: Multiplayer Spreadsheet
Page 188: EtherCalc: Multiplayer Spreadsheet

JavaScript: Good Part Only

Page 189: EtherCalc: Multiplayer Spreadsheet

JavaScript: Good Part OnlyCo"eeScript: Half the Noise

JeremyAshkenas

cs = (js) => js/2

Page 190: EtherCalc: Multiplayer Spreadsheet

JavaScript: Good Part OnlyCo"eeScript: Half the Noise

JeremyAshkenas

cs = (js) => js/2

Page 191: EtherCalc: Multiplayer Spreadsheet

JavaScript: Good Part OnlyCo"eeScript: Half the Noise

JeremyAshkenas

cs = (js) => js/2

“Original JavaScript: 22k LOC. Ported to CoffeeScript: 5k LOC. {async, jsdom, zappa, optimist etc}++”

Page 192: EtherCalc: Multiplayer Spreadsheet
Page 193: EtherCalc: Multiplayer Spreadsheet

{x,y} = @offset

Page 194: EtherCalc: Multiplayer Spreadsheet

{x,y} = @offset

var _ref = this.offset;

Page 195: EtherCalc: Multiplayer Spreadsheet

{x,y} = @offset

var _ref = this.offset;var x = _ref.x;

Page 196: EtherCalc: Multiplayer Spreadsheet

{x,y} = @offset

var _ref = this.offset;var x = _ref.x;var y = _ref.y;

Page 198: EtherCalc: Multiplayer Spreadsheet
Page 199: EtherCalc: Multiplayer Spreadsheet
Page 200: EtherCalc: Multiplayer Spreadsheet
Page 201: EtherCalc: Multiplayer Spreadsheet

Function::ᵒ = (fun) ->

Page 202: EtherCalc: Multiplayer Spreadsheet

Function::ᵒ = (fun) -> (arg) => @ fun arg

Page 203: EtherCalc: Multiplayer Spreadsheet

Function::ᵒ = (fun) -> (arg) => @ fun arg

f = (x) => x * 2

Page 204: EtherCalc: Multiplayer Spreadsheet

Function::ᵒ = (fun) -> (arg) => @ fun arg

f = (x) => x * 2g = (x) => x * 3

Page 205: EtherCalc: Multiplayer Spreadsheet

Function::ᵒ = (fun) -> (arg) => @ fun arg

f = (x) => x * 2g = (x) => x * 3h = f .ᵒ g

Page 206: EtherCalc: Multiplayer Spreadsheet

Function::ᵒ = (fun) -> (arg) => @ fun arg

f = (x) => x * 2g = (x) => x * 3h = f .ᵒ g

h 100 # 600

Page 207: EtherCalc: Multiplayer Spreadsheet

Function::ᵒ = (fun) -> (arg) => @ fun arg

f = (x) => x * 2g = (x) => x * 3h = f .ᵒ g

h 100 # 600

Page 211: EtherCalc: Multiplayer Spreadsheet

require('zappa') -> @view layout: -> html => body => @body

@get '/': -> @render 'index' @view index: -> for name, value of { wiki: "Wiki to HTML" html: "HTML to Wiki" } form method: 'post', => p => textarea {name} p => input {type: 'submit', value}

Page 212: EtherCalc: Multiplayer Spreadsheet

require('zappa') -> @view layout: -> html => body => @body

@get '/': -> @render 'index' @view index: -> for name, value of { wiki: "Wiki to HTML" html: "HTML to Wiki" } form method: 'post', => p => textarea {name} p => input {type: 'submit', value}

Page 213: EtherCalc: Multiplayer Spreadsheet

require('zappa') -> @view layout: -> html => body => @body

@get '/': -> @render 'index' @view index: -> for name, value of { wiki: "Wiki to HTML" html: "HTML to Wiki" } form method: 'post', => p => textarea {name} p => input {type: 'submit', value}

@post '/': -> if @data.wiki? @send w2h @data.wiki else if @data.html? @send h2w @data.html else redirect '/'

Page 214: EtherCalc: Multiplayer Spreadsheet

COSCUP, 2011

Page 215: EtherCalc: Multiplayer Spreadsheet

COSCUP, 2011

Page 216: EtherCalc: Multiplayer Spreadsheet

COSCUP, 2011

hack����������� ������������������  hack����������� ������������������  hack����������� ������������������  ...

Page 217: EtherCalc: Multiplayer Spreadsheet

COSCUP, 2011

hack����������� ������������������  hack����������� ������������������  hack����������� ������������������  ...

Page 218: EtherCalc: Multiplayer Spreadsheet

EtherCalc Edit Flow

Page 219: EtherCalc: Multiplayer Spreadsheet

EtherCalc Edit Flowmain.coffee

Zappa

Socket.io

Express

Node.js

EV/libuv

sc.coffeeSocialCalc.js

db.coffeeredis.js

Page 220: EtherCalc: Multiplayer Spreadsheet

EtherCalc Edit Flowmain.coffee

Zappa

Socket.io

Express

Node.js

EV/libuv

sc.coffeeSocialCalc.js

db.coffeeredis.js

Redis(optional)

Page 221: EtherCalc: Multiplayer Spreadsheet

EtherCalc Edit Flow

player.coffeeSocialCalc.js

main.coffee

Zappa

Socket.io

Express

Node.js

EV/libuv

sc.coffeeSocialCalc.js

db.coffeeredis.js

Redis(optional)

Page 222: EtherCalc: Multiplayer Spreadsheet

EtherCalc Edit Flow

player.coffeeSocialCalc.js

main.coffee

Zappa

Socket.io

Express

Node.js

EV/libuv

sc.coffeeSocialCalc.js

db.coffeeredis.js

Redis(optional)

MULTI GET snapshot LRANGE logEXEC

Page 223: EtherCalc: Multiplayer Spreadsheet

EtherCalc Edit Flow

player.coffeeSocialCalc.js

main.coffee

Zappa

Socket.io

Express

Node.js

EV/libuv

sc.coffeeSocialCalc.js

db.coffeeredis.js

Redis(optional)

RPUSH log cmd

MULTI GET snapshot LRANGE logEXEC

Page 224: EtherCalc: Multiplayer Spreadsheet

EtherCalc Edit Flow

player.coffeeSocialCalc.js

main.coffee

Zappa

Socket.io

Express

Node.js

EV/libuv

sc.coffeeSocialCalc.js

db.coffeeredis.js

Redis(optional)

RPUSH log cmd

MULTI GET snapshot LRANGE logEXEC

Page 225: EtherCalc: Multiplayer Spreadsheet

EtherCalc Edit Flow

player.coffeeSocialCalc.js

main.coffee

Zappa

Socket.io

Express

Node.js

EV/libuv

sc.coffeeSocialCalc.js

db.coffeeredis.js

Redis(optional)

RPUSH log cmd

MULTI GET snapshot LRANGE logEXEC

Page 226: EtherCalc: Multiplayer Spreadsheet

EtherCalc Edit Flow

player.coffeeSocialCalc.js

main.coffee

Zappa

Socket.io

Express

Node.js

EV/libuv

sc.coffeeSocialCalc.js

db.coffeeredis.js

Redis(optional)

RPUSH log cmd

MULTI GET snapshot LRANGE logEXEC

MULTI DEL log SET snapshot snapshotEXEC

Page 227: EtherCalc: Multiplayer Spreadsheet

Recalc Subscription

Page 228: EtherCalc: Multiplayer Spreadsheet

Recalc Subscription

Page 229: EtherCalc: Multiplayer Spreadsheet

Recalc Subscription

Page 230: EtherCalc: Multiplayer Spreadsheet

Recalc Subscriptionask.log: Foo

Page 231: EtherCalc: Multiplayer Spreadsheet

Recalc Subscriptionask.log: Foo

log: Foo,snapshot,log

Page 232: EtherCalc: Multiplayer Spreadsheet

Recalc Subscriptionask.log: Foo

log: Foo,snapshot,log

execute: set A1 formula Bar!B2

Page 233: EtherCalc: Multiplayer Spreadsheet

Recalc Subscriptionask.log: Foo

log: Foo,snapshot,log

execute: set A1 formula Bar!B2

ask.recalc: Bar

Page 234: EtherCalc: Multiplayer Spreadsheet

Recalc Subscriptionask.log: Foo

log: Foo,snapshot,log

execute: set A1 formula Bar!B2

ask.recalc: Bar

recalc: Bar,snapshot

Page 235: EtherCalc: Multiplayer Spreadsheet

Recalc Subscriptionask.log: Foo

log: Foo,snapshot,log

execute: set A1 formula Bar!B2

ask.recalc: Bar

recalc: Bar,snapshot

recalc: Bar,snapshot

Page 236: EtherCalc: Multiplayer Spreadsheet

PaaS Deployment

Page 237: EtherCalc: Multiplayer Spreadsheet

PaaS Deploymentstackato.ymlapp.js

Page 238: EtherCalc: Multiplayer Spreadsheet

PaaS Deploymentstackato.ymlapp.js

dotcloud.ymlserver.js

Page 239: EtherCalc: Multiplayer Spreadsheet

PaaS Deploymentstackato.ymlapp.js

server.js

dotcloud.ymlserver.js

Page 240: EtherCalc: Multiplayer Spreadsheet

REST Interface

Page 241: EtherCalc: Multiplayer Spreadsheet

REST Interface

GET /_/pagePUT /_/page

Page 242: EtherCalc: Multiplayer Spreadsheet

REST Interface

GET /_/pagePUT /_/page

POST /_/page {command:[…]}

Page 243: EtherCalc: Multiplayer Spreadsheet

REST Interface

GET /_/pagePUT /_/page

GET /_/page/cells/A1PUT /_/page/cells/A1GET /_/page/names/range

POST /_/page {command:[…]}

Page 244: EtherCalc: Multiplayer Spreadsheet

TODO, 2012

Page 245: EtherCalc: Multiplayer Spreadsheet

TODO, 2012‣ Chat & EtherPad Lite

Page 246: EtherCalc: Multiplayer Spreadsheet

TODO, 2012‣ Chat & EtherPad Lite

‣ Export/Import, Charts

Page 247: EtherCalc: Multiplayer Spreadsheet

TODO, 2012‣ Chat & EtherPad Lite

‣ Export/Import, Charts

‣Drupal Integration

Page 248: EtherCalc: Multiplayer Spreadsheet

TODO, 2012‣ Chat & EtherPad Lite

‣ Export/Import, Charts

‣Drupal Integration

‣ Socialtext Integration

Page 249: EtherCalc: Multiplayer Spreadsheet

TODO, 2012‣ Chat & EtherPad Lite

‣ Export/Import, Charts

‣Drupal Integration

‣ Socialtext Integration

‣Forks welcome!

Page 250: EtherCalc: Multiplayer Spreadsheet

Thank you!EtherCalcMultiplayerSpreadsheet