ethercalc: 多人即時協作試算表

251
EtherCalc 多人即時 協作試算表 ethercalc.tw

Upload: -

Post on 07-May-2015

1.889 views

Category:

Technology


7 download

DESCRIPTION

OSDC.tw 2012 slides for http://ethercalc.org/. Please see http://ethercalc.tw/ for extra material in Chinese.

TRANSCRIPT

Page 2: EtherCalc: 多人即時協作試算表

僅代表個人立場

Page 3: EtherCalc: 多人即時協作試算表

僅代表個人立場

(但難免會有業配)

Page 4: EtherCalc: 多人即時協作試算表

限於時間只講故事不講程式

Page 5: EtherCalc: 多人即時協作試算表

限於時間只講故事不講程式

概念

Page 8: EtherCalc: 多人即時協作試算表

緣起

Page 9: EtherCalc: 多人即時協作試算表

VisiCalc, 1979

Dan Bricklin

Page 10: EtherCalc: 多人即時協作試算表

哈佛商學院, 1977

Page 11: EtherCalc: 多人即時協作試算表

哈佛商學院, 1977

Page 12: EtherCalc: 多人即時協作試算表

哈佛商學院, 1977

Page 13: EtherCalc: 多人即時協作試算表

哈佛商學院, 1977

Page 14: EtherCalc: 多人即時協作試算表

哈佛商學院, 1977

Page 15: EtherCalc: 多人即時協作試算表

最初的願景

Page 16: EtherCalc: 多人即時協作試算表

最初的願景

Alto 工作站

Page 17: EtherCalc: 多人即時協作試算表

最初的願景

滑鼠計算機Alto 工作站

Page 18: EtherCalc: 多人即時協作試算表

最初的願景

頭戴顯示器滑鼠計算機Alto 工作站

Page 19: EtherCalc: 多人即時協作試算表

最初的願景

頭戴顯示器滑鼠計算機Alto 工作站

Page 20: EtherCalc: 多人即時協作試算表
Page 21: EtherCalc: 多人即時協作試算表
Page 22: EtherCalc: 多人即時協作試算表

=SUM( ) 0

Page 23: EtherCalc: 多人即時協作試算表

10

=SUM( ) 010

Page 24: EtherCalc: 多人即時協作試算表

10 20

=SUM( ) 01030

Page 25: EtherCalc: 多人即時協作試算表

10 20 30

=SUM( ) 0103060

Page 26: EtherCalc: 多人即時協作試算表

10 20 30

=SUM( ) 0103060

Page 27: EtherCalc: 多人即時協作試算表

1977 → 1978

Page 28: EtherCalc: 多人即時協作試算表

1977 → 1978

Page 29: EtherCalc: 多人即時協作試算表

1977 → 1978

Integer BASIC

+

Page 30: EtherCalc: 多人即時協作試算表

1978 → 1979

Page 31: EtherCalc: 多人即時協作試算表

10 20 30

=SUM( ) 60

1978 → 1979

Page 32: EtherCalc: 多人即時協作試算表

10 20 30

=SUM( ) 60

A B C D

1

2

1978 → 1979

Page 33: EtherCalc: 多人即時協作試算表

10 20 30

=SUM( ) 60

A B C D

1

2 A1,B1,C1

1978 → 1979

Page 34: EtherCalc: 多人即時協作試算表

Bob & Dan

10 20 30

=SUM( ) 60

A B C D

1

2 A1,B1,C1

1978 → 1979

Page 35: EtherCalc: 多人即時協作試算表

Bob & Dan

‣ Dan 持續用 BASIC 寫原型

10 20 30

=SUM( ) 60

A B C D

1

2 A1,B1,C1

1978 → 1979

Page 36: EtherCalc: 多人即時協作試算表

Bob & Dan

‣ Dan 持續用 BASIC 寫原型

‣ Bob 以組合語言做出成品

10 20 30

=SUM( ) 60

A B C D

1

2 A1,B1,C1

1978 → 1979

Page 37: EtherCalc: 多人即時協作試算表

Bob & Dan

‣ Dan 持續用 BASIC 寫原型

‣ Bob 以組合語言做出成品

‣六年內售出 700,000 套

10 20 30

=SUM( ) 60

A B C D

1

2 A1,B1,C1

1978 → 1979

Page 38: EtherCalc: 多人即時協作試算表

Bob & Dan

‣ Dan 持續用 BASIC 寫原型

‣ Bob 以組合語言做出成品

‣六年內售出 700,000 套

‣「殺手級應用」的始祖

10 20 30

=SUM( ) 60

A B C D

1

2 A1,B1,C1

1978 → 1979

Page 39: EtherCalc: 多人即時協作試算表

1981

Page 40: EtherCalc: 多人即時協作試算表
Page 41: EtherCalc: 多人即時協作試算表
Page 42: EtherCalc: 多人即時協作試算表
Page 43: EtherCalc: 多人即時協作試算表
Page 44: EtherCalc: 多人即時協作試算表
Page 45: EtherCalc: 多人即時協作試算表

二十年來

Page 46: EtherCalc: 多人即時協作試算表

二十年來

Page 47: EtherCalc: 多人即時協作試算表

二十年來

Page 48: EtherCalc: 多人即時協作試算表

二十年來

Page 49: EtherCalc: 多人即時協作試算表

二十年來

始終如一

Page 50: EtherCalc: 多人即時協作試算表
Page 51: EtherCalc: 多人即時協作試算表

“打不開”

Page 52: EtherCalc: 多人即時協作試算表

“打不開”

“變亂碼”

Page 53: EtherCalc: 多人即時協作試算表

“有病毒!”

“打不開”

“變亂碼”

Page 54: EtherCalc: 多人即時協作試算表
Page 55: EtherCalc: 多人即時協作試算表

維基百科, 2001

Page 56: EtherCalc: 多人即時協作試算表

維基百科, 2001

Page 57: EtherCalc: 多人即時協作試算表

維基百科, 2001

Page 58: EtherCalc: 多人即時協作試算表

wikiCalc, 2005

Page 59: EtherCalc: 多人即時協作試算表

✓ 支援純文字、HTML、Wiki 語法。

wikiCalc, 2005

Page 60: EtherCalc: 多人即時協作試算表

✓ 支援純文字、HTML、Wiki 語法。

✓ 引用其他伺服器上的數值。

wikiCalc, 2005

Page 61: EtherCalc: 多人即時協作試算表

✓ 支援純文字、HTML、Wiki 語法。

✓ 引用其他伺服器上的數值。

✓ 記錄所有編輯操作,以供稽核紀錄。

wikiCalc, 2005

Page 62: EtherCalc: 多人即時協作試算表

✓ 支援純文字、HTML、Wiki 語法。

✓ 引用其他伺服器上的數值。

✓ 記錄所有編輯操作,以供稽核紀錄。

✓ 保留每個版本,可隨時回復 。

wikiCalc, 2005

Page 63: EtherCalc: 多人即時協作試算表

✓ 支援純文字、HTML、Wiki 語法。

✓ 引用其他伺服器上的數值。

✓ 記錄所有編輯操作,以供稽核紀錄。

✓ 保留每個版本,可隨時回復 。

✓ 開放源碼!(GPLv2)。

wikiCalc, 2005

Page 64: EtherCalc: 多人即時協作試算表

wikiCalc.pl

Page 65: EtherCalc: 多人即時協作試算表

網站./wkcdata/sites/Foo

./wkcdata/sites/Bar

./wkcdata/sites/Baz

wikiCalc.pl

Page 66: EtherCalc: 多人即時協作試算表

網站./wkcdata/sites/Foo

./wkcdata/sites/Bar

./wkcdata/sites/Baz

wikiCalc.pl

頁面XXX

YYY

ZZZ

Page 67: EtherCalc: 多人即時協作試算表

網站./wkcdata/sites/Foo

./wkcdata/sites/Bar

./wkcdata/sites/Baz

wikiCalc.pl

頁面XXX

YYY

ZZZ

儲存格

Page 68: EtherCalc: 多人即時協作試算表

網站./wkcdata/sites/Foo

./wkcdata/sites/Bar

./wkcdata/sites/Baz

wikiCalc.pl

頁面XXX

YYY

ZZZ

儲存格A1: 100

Page 69: EtherCalc: 多人即時協作試算表

網站./wkcdata/sites/Foo

./wkcdata/sites/Bar

./wkcdata/sites/Baz

wikiCalc.pl

頁面XXX

YYY

ZZZ

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

Page 70: EtherCalc: 多人即時協作試算表

網站./wkcdata/sites/Foo

./wkcdata/sites/Bar

./wkcdata/sites/Baz

wikiCalc.pl

頁面XXX

YYY

ZZZ

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

B1: =XXX!C1

Page 71: EtherCalc: 多人即時協作試算表

網站./wkcdata/sites/Foo

./wkcdata/sites/Bar

./wkcdata/sites/Baz

wikiCalc.pl

頁面XXX

YYY

ZZZ

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

B1: =XXX!C1

Page 72: EtherCalc: 多人即時協作試算表

網站./wkcdata/sites/Foo

./wkcdata/sites/Bar

./wkcdata/sites/Baz

wikiCalc.pl

頁面XXX

YYY

ZZZ

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

B1: =XXX!C1B2: =YYY!D2

Page 73: EtherCalc: 多人即時協作試算表

網站./wkcdata/sites/Foo

./wkcdata/sites/Bar

./wkcdata/sites/Baz

wikiCalc.pl

頁面XXX

YYY

ZZZ

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

B1: =XXX!C1B2: =YYY!D2

Page 74: EtherCalc: 多人即時協作試算表

網站./wkcdata/sites/Foo

./wkcdata/sites/Bar

./wkcdata/sites/Baz

wikiCalc.pl

頁面XXX

YYY

ZZZ

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

B1: =XXX!C1B2: =YYY!D2

跨頁引用

Page 75: EtherCalc: 多人即時協作試算表

wikiCalc 編輯流程

Page 76: EtherCalc: 多人即時協作試算表

wikiCalc 編輯流程A1: 100A2: =A1*2

Page 77: EtherCalc: 多人即時協作試算表

wikiCalc 編輯流程A1: 100A2: =A1*2

Page 78: EtherCalc: 多人即時協作試算表

wikicalc.pl

wikiCalc 編輯流程A1: 100A2: =A1*2

POST /ajaxsetcell=host:page:A1:300

Page 79: EtherCalc: 多人即時協作試算表

wikicalc.pl

wikiCalc 編輯流程A1: 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: 多人即時協作試算表

“載入中…”

Page 81: EtherCalc: 多人即時協作試算表

“載入中…”

Page 82: EtherCalc: 多人即時協作試算表

“載入中…”

“C100k” 問題

Page 83: EtherCalc: 多人即時協作試算表

“載入中…”

“C100k” 問題

Page 84: EtherCalc: 多人即時協作試算表
Page 85: EtherCalc: 多人即時協作試算表

打掉重練

Page 86: EtherCalc: 多人即時協作試算表

打掉重練

Page 87: EtherCalc: 多人即時協作試算表

SocialCalc, 2006

Dan Bricklin Ross Mayfield

Page 88: EtherCalc: 多人即時協作試算表

設計目標

Page 89: EtherCalc: 多人即時協作試算表

設計目標‣用 Javascript 重寫計算引擎。

Page 90: EtherCalc: 多人即時協作試算表

設計目標‣用 Javascript 重寫計算引擎。

‣進行編輯操作時提供快速回應。

Page 91: EtherCalc: 多人即時協作試算表

設計目標‣用 Javascript 重寫計算引擎。

‣進行編輯操作時提供快速回應。

‣同時處理十萬個儲存格的能力。

Page 92: EtherCalc: 多人即時協作試算表

設計目標‣用 Javascript 重寫計算引擎。

‣進行編輯操作時提供快速回應。

‣同時處理十萬個儲存格的能力。

‣加強對各種不同瀏覽器的支援。

Page 93: EtherCalc: 多人即時協作試算表

設計目標‣用 Javascript 重寫計算引擎。

‣進行編輯操作時提供快速回應。

‣同時處理十萬個儲存格的能力。

‣加強對各種不同瀏覽器的支援。

‣客戶端稽核紀錄及還原/重作功能。

Page 94: EtherCalc: 多人即時協作試算表

系統架構

Page 95: EtherCalc: 多人即時協作試算表

系統架構SocialCalc.js

HTTP Server

Page 96: EtherCalc: 多人即時協作試算表

系統架構SocialCalc.js

HTTP Server

GET

Page 97: EtherCalc: 多人即時協作試算表

系統架構SocialCalc.js

HTTP Server

GET

Page 98: EtherCalc: 多人即時協作試算表

系統架構SocialCalc.js

HTTP Server

GET GET

Page 99: EtherCalc: 多人即時協作試算表

系統架構SocialCalc.js

HTTP Server

GET GET($)

Page 100: EtherCalc: 多人即時協作試算表

系統架構SocialCalc.js

HTTP Server

GETPUT

GET($)

Page 101: EtherCalc: 多人即時協作試算表

系統架構SocialCalc.js

HTTP Server

GETPUT

GET($)

Page 102: EtherCalc: 多人即時協作試算表

指令設計模式

Page 103: EtherCalc: 多人即時協作試算表

指令設計模式set A1 value n 42

Page 104: EtherCalc: 多人即時協作試算表

指令設計模式set A1 value n 42set A2 formula A1*2

Page 105: EtherCalc: 多人即時協作試算表

指令設計模式set 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: 多人即時協作試算表

指令設計模式

‣異步處理背景計算。

set A1 value n 42set A2 formula A1*2

Page 107: EtherCalc: 多人即時協作試算表

指令設計模式

‣異步處理背景計算。

‣僅需重繪可視區域。

set A1 value n 42set A2 formula A1*2

Page 108: EtherCalc: 多人即時協作試算表

指令設計模式

‣異步處理背景計算。

‣僅需重繪可視區域。

‣還原重做次數不限。

set A1 value n 42set A2 formula A1*2

Page 109: EtherCalc: 多人即時協作試算表

指令設計模式

‣異步處理背景計算。

‣僅需重繪可視區域。

‣還原重做次數不限。

‣鍵盤滑鼠隨時可用!

set A1 value n 42set A2 formula A1*2

Page 110: EtherCalc: 多人即時協作試算表

指令設計模式

‣異步處理背景計算。

‣僅需重繪可視區域。

‣還原重做次數不限。

‣鍵盤滑鼠隨時可用!

set A1 value n 42set A2 formula A1*2

Page 111: EtherCalc: 多人即時協作試算表

“社會化” 試算表

Page 112: EtherCalc: 多人即時協作試算表

“社會化” 試算表

Page 113: EtherCalc: 多人即時協作試算表

“社會化” 試算表

評論、按讚、推薦、 標記、分享、嵌入...

Page 114: EtherCalc: 多人即時協作試算表

社會物件 ⇔ 人際連結

Page 115: EtherCalc: 多人即時協作試算表

社會物件 ⇔ 人際連結

Page 116: EtherCalc: 多人即時協作試算表

社會物件 ⇔ 人際連結

Page 117: EtherCalc: 多人即時協作試算表
Page 118: EtherCalc: 多人即時協作試算表

Page 119: EtherCalc: 多人即時協作試算表

CPAL 通用公共授權

Page 120: EtherCalc: 多人即時協作試算表

CPAL 通用公共授權

㊔ BSD, MIT

Page 121: EtherCalc: 多人即時協作試算表

CPAL 通用公共授權

㊔ BSD, MIT

©

LGPL, MPL

Page 122: EtherCalc: 多人即時協作試算表

CPAL 通用公共授權

㊔ BSD, MIT

©

LGPL, MPL

++©

GPL

Page 123: EtherCalc: 多人即時協作試算表

CPAL 通用公共授權

㊔ BSD, MIT

©

LGPL, MPL

++©

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

Page 124: EtherCalc: 多人即時協作試算表

CPAL 通用公共授權

㊔ BSD, MIT

©

LGPL, MPL

++©

GPL

Affero GPL

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

Page 125: EtherCalc: 多人即時協作試算表

CPAL 通用公共授權

㊔ BSD, MIT

©

LGPL, MPL

++©

GPL

Affero GPLCPAL

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

Page 126: EtherCalc: 多人即時協作試算表

CPAL 通用公共授權

㊔ BSD, MIT

©

LGPL, MPL

++©

GPL

Affero GPLCPAL

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

Page 127: EtherCalc: 多人即時協作試算表

CPAL 通用公共授權

㊔ BSD, MIT

©

LGPL, MPL

++©

GPL

Affero GPLCPAL

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

Page 128: EtherCalc: 多人即時協作試算表

CPAL 通用公共授權

㊔ BSD, MIT

©

LGPL, MPL

++©

GPL

Affero GPLCPAL

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

Page 129: EtherCalc: 多人即時協作試算表

Sheetnode, 2008

Karim Ratib

Page 130: EtherCalc: 多人即時協作試算表

Sheetnode, 2008

Karim Ratib

Views + Fields + CCK

Page 131: EtherCalc: 多人即時協作試算表

Sheetnode, 2008

Karim Ratib

Views + Fields + CCK

SocialCalc.js

Page 132: EtherCalc: 多人即時協作試算表

Sheetnode, 2008

Karim Ratib

Views + Fields + CCK

SocialCalc.js

Page 133: EtherCalc: 多人即時協作試算表

Sheetnode, 2008

Karim Ratib

Views + Fields + CCK

SocialCalc.js

Page 134: EtherCalc: 多人即時協作試算表

Sheetnode, 2008

Karim Ratib

Views + Fields + CCK

SocialCalc.js

Page 135: EtherCalc: 多人即時協作試算表

OLPC, 2008

Page 136: EtherCalc: 多人即時協作試算表

Luke Closs & Dan

OLPC, 2008

Page 137: EtherCalc: 多人即時協作試算表
Page 138: EtherCalc: 多人即時協作試算表
Page 139: EtherCalc: 多人即時協作試算表

Mesh 網絡

Page 140: EtherCalc: 多人即時協作試算表
Page 141: EtherCalc: 多人即時協作試算表

ManusheelGupta

Vijit Singh

Page 142: EtherCalc: 多人即時協作試算表

ManusheelGupta

Vijit Singh

SocialCalcActivity.py

XoCom.py

Gecko/XPCOM

SocialCalc.js

XoCom.js

Page 143: EtherCalc: 多人即時協作試算表

ManusheelGupta

Vijit Singh

SocialCalcActivity.py

XoCom.py

Gecko/XPCOM

SocialCalc.js

XoCom.js

set A1 value n 42

Page 144: EtherCalc: 多人即時協作試算表

ManusheelGupta

Vijit Singh

SocialCalcActivity.py

XoCom.py

Gecko/XPCOM

SocialCalc.js

XoCom.js

D-Bus + Telepathy

set A1 value n 42

Page 145: EtherCalc: 多人即時協作試算表

ManusheelGupta

Vijit Singh

SocialCalcActivity.py

XoCom.py

Gecko/XPCOM

SocialCalc.js

XoCom.js

D-Bus + Telepathy

set A1 value n 42

OLPC Mesh

網絡廣播

Page 146: EtherCalc: 多人即時協作試算表

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

網絡廣播

Page 147: EtherCalc: 多人即時協作試算表

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

網絡廣播

Page 148: EtherCalc: 多人即時協作試算表

很讚,但是...

Page 149: EtherCalc: 多人即時協作試算表

‣必須同時開啟試算表。

很讚,但是...

Page 150: EtherCalc: 多人即時協作試算表

‣必須同時開啟試算表。

‣漏接訊息時無法復原。

很讚,但是...

Page 151: EtherCalc: 多人即時協作試算表

‣必須同時開啟試算表。

‣漏接訊息時無法復原。

‣編輯同一格時會衝突。

很讚,但是...

Page 152: EtherCalc: 多人即時協作試算表

‣必須同時開啟試算表。

‣漏接訊息時無法復原。

‣編輯同一格時會衝突。

‣只能在 OLPC 上運行!

很讚,但是...

Page 153: EtherCalc: 多人即時協作試算表

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

MultiplayerSocialCalc

YAPC::Tiny, 2009

Page 154: EtherCalc: 多人即時協作試算表

EV: 事件驅動

Page 155: EtherCalc: 多人即時協作試算表

Tatsumaki EV: 事件驅動

@miyagawa

Page 156: EtherCalc: 多人即時協作試算表

Tatsumaki

Web::Hippie

@clkao

EV: 事件驅動

@miyagawa

Page 157: EtherCalc: 多人即時協作試算表

Tatsumaki

Web::Hippie

@clkao

Feersum

@stash

EV: 事件驅動

@miyagawa

Page 158: EtherCalc: 多人即時協作試算表

WebSocket 同步編輯

multiserver.pl

Web::Hippie

Plack

FeersumEV/libev

Page 159: EtherCalc: 多人即時協作試算表

WebSocket 同步編輯

multiserver.pl

Web::Hippie

Plack

FeersumEV/libev

ScheduleScheetCommandset A1 value n 2046

SpreadsheetControl

RenderSheet

Page 160: EtherCalc: 多人即時協作試算表

WebSocket 同步編輯

multiserver.pl

Web::Hippie

Plack

FeersumEV/libev

ScheduleScheetCommandset A1 value n 2046

SpreadsheetControl

RenderSheet 傳送

Page 161: EtherCalc: 多人即時協作試算表

WebSocket 同步編輯

multiserver.pl

Web::Hippie

Plack

FeersumEV/libev

ScheduleScheetCommandset A1 value n 2046

SpreadsheetControl

RenderSheet 傳送

群播

Page 162: EtherCalc: 多人即時協作試算表

WebSocket 同步編輯

multiserver.pl

Web::Hippie

Plack

FeersumEV/libev

ScheduleScheetCommandset A1 value n 2046

SpreadsheetControl

RenderSheet 傳送RenderSheet

ScheduleScheetCommand

(isRemote = true)set A1 value n 2046

群播

Page 163: EtherCalc: 多人即時協作試算表

新增功能

Page 164: EtherCalc: 多人即時協作試算表

✓加入時取得目前狀態。

新增功能

Page 165: EtherCalc: 多人即時協作試算表

✓加入時取得目前狀態。

✓斷線重連時可以復原。

新增功能

Page 166: EtherCalc: 多人即時協作試算表

✓加入時取得目前狀態。

✓斷線重連時可以復原。

✓顯示別人的游標位置。

新增功能

Page 167: EtherCalc: 多人即時協作試算表

✓加入時取得目前狀態。

✓斷線重連時可以復原。

✓顯示別人的游標位置。

✓可以在各平台上運行!

新增功能

Page 168: EtherCalc: 多人即時協作試算表

✓加入時取得目前狀態。

✓斷線重連時可以復原。

✓顯示別人的游標位置。

✓可以在各平台上運行!

新增功能

Page 169: EtherCalc: 多人即時協作試算表

更讚了,但是...

Page 170: EtherCalc: 多人即時協作試算表

‣要相信誰的目前狀態?

更讚了,但是...

Page 171: EtherCalc: 多人即時協作試算表

‣要相信誰的目前狀態?

‣所有人離線: 資料消失?

更讚了,但是...

Page 172: EtherCalc: 多人即時協作試算表

‣要相信誰的目前狀態?

‣所有人離線: 資料消失?

‣一定要有人負責按儲存?

更讚了,但是...

Page 173: EtherCalc: 多人即時協作試算表

‣要相信誰的目前狀態?

‣所有人離線: 資料消失?

‣一定要有人負責按儲存?

‣重新連接: 回播所有指令?

更讚了,但是...

Page 174: EtherCalc: 多人即時協作試算表

‣要相信誰的目前狀態?

‣所有人離線: 資料消失?

‣一定要有人負責按儲存?

‣重新連接: 回播所有指令?

更讚了,但是...

Page 175: EtherCalc: 多人即時協作試算表
Page 176: EtherCalc: 多人即時協作試算表

打掉重練

Page 177: EtherCalc: 多人即時協作試算表

打掉重練

Page 178: EtherCalc: 多人即時協作試算表

YAPC::NA, 2006

Page 179: EtherCalc: 多人即時協作試算表

“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: 多人即時協作試算表

YAPC::NA, 2006

Page 181: EtherCalc: 多人即時協作試算表

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: 多人即時協作試算表

YAPC::NA, 2006

Page 183: EtherCalc: 多人即時協作試算表

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: 多人即時協作試算表

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: 多人即時協作試算表
Page 186: EtherCalc: 多人即時協作試算表
Page 187: EtherCalc: 多人即時協作試算表
Page 188: EtherCalc: 多人即時協作試算表

JavaScript: 缺點減少

Page 189: EtherCalc: 多人即時協作試算表

JavaScript: 缺點減少CoffeeScript: 標點減半

JeremyAshkenas

cs = (js) => js/2

Page 190: EtherCalc: 多人即時協作試算表

JavaScript: 缺點減少CoffeeScript: 標點減半

JeremyAshkenas

cs = (js) => js/2

Page 191: EtherCalc: 多人即時協作試算表

JavaScript: 缺點減少CoffeeScript: 標點減半

JeremyAshkenas

cs = (js) => js/2

“原 JavaScript 行數: 22k。 重寫過的 CoffeeScript 行數: 5k。 {async, jsdom, zappa, optimist etc}++”

Page 192: EtherCalc: 多人即時協作試算表
Page 193: EtherCalc: 多人即時協作試算表

{x,y} = @offset

Page 194: EtherCalc: 多人即時協作試算表

{x,y} = @offset

var _ref = this.offset;

Page 195: EtherCalc: 多人即時協作試算表

{x,y} = @offset

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

Page 196: EtherCalc: 多人即時協作試算表

{x,y} = @offset

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

Page 198: EtherCalc: 多人即時協作試算表
Page 199: EtherCalc: 多人即時協作試算表
Page 200: EtherCalc: 多人即時協作試算表
Page 201: EtherCalc: 多人即時協作試算表

Function::ᵒ = (fun) ->

Page 202: EtherCalc: 多人即時協作試算表

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

Page 203: EtherCalc: 多人即時協作試算表

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

f = (x) => x * 2

Page 204: EtherCalc: 多人即時協作試算表

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

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

Page 205: EtherCalc: 多人即時協作試算表

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

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

Page 206: EtherCalc: 多人即時協作試算表

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

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

h 100 # 600

Page 207: EtherCalc: 多人即時協作試算表

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

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

h 100 # 600

Page 211: EtherCalc: 多人即時協作試算表

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: 多人即時協作試算表

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: 多人即時協作試算表

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: 多人即時協作試算表

COSCUP, 2011

Page 215: EtherCalc: 多人即時協作試算表

COSCUP, 2011

Page 216: EtherCalc: 多人即時協作試算表

COSCUP, 2011

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

Page 217: EtherCalc: 多人即時協作試算表

COSCUP, 2011

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

Page 218: EtherCalc: 多人即時協作試算表

EtherCalc 系統架構

Page 219: EtherCalc: 多人即時協作試算表

EtherCalc 系統架構main.coffee

Zappa

Socket.io

Express

Node.js

EV/libuv

sc.coffeeSocialCalc.js

db.coffeeredis.js

Page 220: EtherCalc: 多人即時協作試算表

EtherCalc 系統架構main.coffee

Zappa

Socket.io

Express

Node.js

EV/libuv

sc.coffeeSocialCalc.js

db.coffeeredis.js

Redis(optional)

Page 221: EtherCalc: 多人即時協作試算表

EtherCalc 系統架構

player.coffeeSocialCalc.js

main.coffee

Zappa

Socket.io

Express

Node.js

EV/libuv

sc.coffeeSocialCalc.js

db.coffeeredis.js

Redis(optional)

Page 222: EtherCalc: 多人即時協作試算表

EtherCalc 系統架構

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: 多人即時協作試算表

EtherCalc 系統架構

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: 多人即時協作試算表

EtherCalc 系統架構

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: 多人即時協作試算表

EtherCalc 系統架構

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: 多人即時協作試算表

EtherCalc 系統架構

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: 多人即時協作試算表

跨頁即時更新

Page 228: EtherCalc: 多人即時協作試算表

跨頁即時更新

伺服端

Page 229: EtherCalc: 多人即時協作試算表

跨頁即時更新

伺服端

客戶端

Page 230: EtherCalc: 多人即時協作試算表

跨頁即時更新ask.log: Foo

伺服端

客戶端

Page 231: EtherCalc: 多人即時協作試算表

跨頁即時更新ask.log: Foo

log: Foo,snapshot,log伺服端

客戶端

Page 232: EtherCalc: 多人即時協作試算表

跨頁即時更新ask.log: Foo

log: Foo,snapshot,log

execute: set A1 formula Bar!B2

伺服端

客戶端

Page 233: EtherCalc: 多人即時協作試算表

跨頁即時更新ask.log: Foo

log: Foo,snapshot,log

execute: set A1 formula Bar!B2

ask.recalc: Bar

伺服端

客戶端

Page 234: EtherCalc: 多人即時協作試算表

跨頁即時更新ask.log: Foo

log: Foo,snapshot,log

execute: set A1 formula Bar!B2

ask.recalc: Bar

recalc: Bar,snapshot

伺服端

客戶端

Page 235: EtherCalc: 多人即時協作試算表

跨頁即時更新ask.log: Foo

log: Foo,snapshot,log

execute: set A1 formula Bar!B2

ask.recalc: Bar

recalc: Bar,snapshot

recalc: Bar,snapshot

伺服端

客戶端

Page 236: EtherCalc: 多人即時協作試算表

PaaS 遠端建置

Page 237: EtherCalc: 多人即時協作試算表

PaaS 遠端建置stackato.ymlapp.js

Page 238: EtherCalc: 多人即時協作試算表

PaaS 遠端建置stackato.ymlapp.js

dotcloud.ymlserver.js

Page 239: EtherCalc: 多人即時協作試算表

PaaS 遠端建置stackato.ymlapp.js

server.js

dotcloud.ymlserver.js

Page 240: EtherCalc: 多人即時協作試算表

REST 資源界面

Page 241: EtherCalc: 多人即時協作試算表

REST 資源界面

GET /_/pagePUT /_/page

Page 242: EtherCalc: 多人即時協作試算表

REST 資源界面

GET /_/pagePUT /_/page

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

Page 243: EtherCalc: 多人即時協作試算表

REST 資源界面

GET /_/pagePUT /_/page

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

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

Page 244: EtherCalc: 多人即時協作試算表

TODO, 2012

Page 245: EtherCalc: 多人即時協作試算表

TODO, 2012‣內建聊天室、即時共筆

Page 246: EtherCalc: 多人即時協作試算表

TODO, 2012‣內建聊天室、即時共筆

‣匯出匯入、動態製圖

Page 247: EtherCalc: 多人即時協作試算表

TODO, 2012‣內建聊天室、即時共筆

‣匯出匯入、動態製圖

‣與 Drupal 系統整合

Page 248: EtherCalc: 多人即時協作試算表

TODO, 2012‣內建聊天室、即時共筆

‣匯出匯入、動態製圖

‣與 Drupal 系統整合

‣與 Socialtext 系統整合

Page 249: EtherCalc: 多人即時協作試算表

TODO, 2012‣內建聊天室、即時共筆

‣匯出匯入、動態製圖

‣與 Drupal 系統整合

‣與 Socialtext 系統整合

‣Forks welcome!

Page 250: EtherCalc: 多人即時協作試算表

感謝收看!EtherCalc多人即時協作試算表