ethercalc for drupal

294
EtherCalc 多人即時 協作試算表

Upload: -

Post on 07-May-2015

3.143 views

Category:

Technology


6 download

DESCRIPTION

Draft slides for DrupalCamp Taipei, 2012.7.7.

TRANSCRIPT

Page 1: EtherCalc for Drupal

EtherCalc

多人即時協作試算表

Page 2: EtherCalc for Drupal

EtherCalc

多人即時協作試算表

for Drupal

Page 3: EtherCalc for Drupal

僅代表個人立場

Page 4: EtherCalc for Drupal

只講故事不講程式

Page 5: EtherCalc for Drupal

只講故事不講程式

概念

Page 8: EtherCalc for Drupal

SheetNode.org

‣ npm install -g ethercalc

‣ ethercalc Please connect to: http://0:8000/

Page 10: EtherCalc for Drupal

緣起

Page 11: EtherCalc for Drupal

VisiCalc, 1979

Dan Bricklin

Page 12: EtherCalc for Drupal

哈佛商學院, 1977

Page 13: EtherCalc for Drupal

哈佛商學院, 1977

Page 14: EtherCalc for Drupal

哈佛商學院, 1977

Page 15: EtherCalc for Drupal

哈佛商學院, 1977

Page 16: EtherCalc for Drupal

哈佛商學院, 1977

Page 17: EtherCalc for Drupal

最初的願景

Page 18: EtherCalc for Drupal

最初的願景

Alto 工作站

Page 19: EtherCalc for Drupal

最初的願景

滑鼠計算機Alto 工作站

Page 20: EtherCalc for Drupal

最初的願景

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

Page 21: EtherCalc for Drupal

最初的願景

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

Page 22: EtherCalc for Drupal
Page 23: EtherCalc for Drupal
Page 24: EtherCalc for Drupal

=SUM( ) 0

Page 25: EtherCalc for Drupal

10 20 30

=SUM( ) 0103060

Page 26: EtherCalc for Drupal

10 20 30

=SUM( ) 0103060

Page 27: EtherCalc for Drupal

1977 → 1978

Page 28: EtherCalc for Drupal

1977 → 1978

Page 29: EtherCalc for Drupal

1977 → 1978

Integer BASIC

+

Page 30: EtherCalc for Drupal

1978 → 1979

Page 31: EtherCalc for Drupal

10 20 30

=SUM( ) 60

1978 → 1979

Page 32: EtherCalc for Drupal

10 20 30

=SUM( ) 60

A B C D

1

2

1978 → 1979

Page 33: EtherCalc for Drupal

10 20 30

=SUM( ) 60

A B C D

1

2 A1,B1,C1

1978 → 1979

Page 34: EtherCalc for Drupal

Bob & Dan

10 20 30

=SUM( ) 60

A B C D

1

2 A1,B1,C1

1978 → 1979

Page 35: EtherCalc for Drupal

Bob & Dan

‣6 年售出 700,000 套

10 20 30

=SUM( ) 60

A B C D

1

2 A1,B1,C1

1978 → 1979

Page 36: EtherCalc for Drupal

Bob & Dan

‣6 年售出 700,000 套

‣「殺手級應用」的始祖

10 20 30

=SUM( ) 60

A B C D

1

2 A1,B1,C1

1978 → 1979

Page 37: EtherCalc for Drupal

1981

Page 38: EtherCalc for Drupal
Page 39: EtherCalc for Drupal
Page 40: EtherCalc for Drupal
Page 41: EtherCalc for Drupal
Page 42: EtherCalc for Drupal
Page 43: EtherCalc for Drupal

二十年來

Page 44: EtherCalc for Drupal

二十年來

Page 45: EtherCalc for Drupal

二十年來

Page 46: EtherCalc for Drupal

二十年來

Page 47: EtherCalc for Drupal

二十年來

始終如一

Page 48: EtherCalc for Drupal
Page 49: EtherCalc for Drupal

“打不開”

Page 50: EtherCalc for Drupal

“打不開”

“變亂碼”

Page 51: EtherCalc for Drupal

“有病毒!”

“打不開”

“變亂碼”

Page 52: EtherCalc for Drupal
Page 53: EtherCalc for Drupal

維基百科, 2001

Page 54: EtherCalc for Drupal

維基百科, 2001

Page 55: EtherCalc for Drupal

維基百科, 2001

Page 56: EtherCalc for Drupal

wikiCalc, 2005

Page 57: EtherCalc for Drupal

✓ 跨伺服器引用數值。

wikiCalc, 2005

Page 58: EtherCalc for Drupal

✓ 跨伺服器引用數值。

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

wikiCalc, 2005

Page 59: EtherCalc for Drupal

✓ 跨伺服器引用數值。

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

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

wikiCalc, 2005

Page 60: EtherCalc for Drupal

✓ 跨伺服器引用數值。

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

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

✓ 開放源碼!

wikiCalc, 2005

Page 61: EtherCalc for Drupal

wikiCalc.pl

Page 62: EtherCalc for Drupal

網站./wkcdata/sites/Foo

./wkcdata/sites/Bar

./wkcdata/sites/Baz

wikiCalc.pl

Page 63: EtherCalc for Drupal

網站./wkcdata/sites/Foo

./wkcdata/sites/Bar

./wkcdata/sites/Baz

wikiCalc.pl

頁面XXX

YYY

ZZZ

Page 64: EtherCalc for Drupal

網站./wkcdata/sites/Foo

./wkcdata/sites/Bar

./wkcdata/sites/Baz

wikiCalc.pl

頁面XXX

YYY

ZZZ

儲存格

Page 65: EtherCalc for Drupal

網站./wkcdata/sites/Foo

./wkcdata/sites/Bar

./wkcdata/sites/Baz

wikiCalc.pl

頁面XXX

YYY

ZZZ

儲存格A1: 100

Page 66: EtherCalc for Drupal

網站./wkcdata/sites/Foo

./wkcdata/sites/Bar

./wkcdata/sites/Baz

wikiCalc.pl

頁面XXX

YYY

ZZZ

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

Page 67: EtherCalc for Drupal

網站./wkcdata/sites/Foo

./wkcdata/sites/Bar

./wkcdata/sites/Baz

wikiCalc.pl

頁面XXX

YYY

ZZZ

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

B1: =XXX!C1

Page 68: EtherCalc for Drupal

網站./wkcdata/sites/Foo

./wkcdata/sites/Bar

./wkcdata/sites/Baz

wikiCalc.pl

頁面XXX

YYY

ZZZ

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

B1: =XXX!C1

Page 69: EtherCalc for Drupal

網站./wkcdata/sites/Foo

./wkcdata/sites/Bar

./wkcdata/sites/Baz

wikiCalc.pl

頁面XXX

YYY

ZZZ

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

B1: =XXX!C1B2: =YYY!D2

Page 70: EtherCalc for Drupal

網站./wkcdata/sites/Foo

./wkcdata/sites/Bar

./wkcdata/sites/Baz

wikiCalc.pl

頁面XXX

YYY

ZZZ

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

B1: =XXX!C1B2: =YYY!D2

Page 71: EtherCalc for Drupal

網站./wkcdata/sites/Foo

./wkcdata/sites/Bar

./wkcdata/sites/Baz

wikiCalc.pl

頁面XXX

YYY

ZZZ

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

B1: =XXX!C1B2: =YYY!D2

跨頁引用

Page 72: EtherCalc for Drupal

wikiCalc 編輯流程

Page 73: EtherCalc for Drupal

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

Page 74: EtherCalc for Drupal

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

Page 75: EtherCalc for Drupal

wikicalc.pl

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

POST /ajaxsetcell=host:page:A1:300

Page 76: EtherCalc for Drupal

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 77: EtherCalc for Drupal

“載入中…”

Page 78: EtherCalc for Drupal

“載入中…”

Page 79: EtherCalc for Drupal

“載入中…”

“C100k” 問題

Page 80: EtherCalc for Drupal

“載入中…”

“C100k” 問題

Page 81: EtherCalc for Drupal
Page 82: EtherCalc for Drupal

打掉重練

Page 83: EtherCalc for Drupal

打掉重練

Page 84: EtherCalc for Drupal

SocialCalc, 2006

Dan Bricklin Ross Mayfield

Page 85: EtherCalc for Drupal

設計目標

Page 86: EtherCalc for Drupal

設計目標

‣引擎用 JavaScript 重寫。

Page 87: EtherCalc for Drupal

設計目標

‣引擎用 JavaScript 重寫。

‣即時編輯及還原/重作。

Page 88: EtherCalc for Drupal

設計目標

‣引擎用 JavaScript 重寫。

‣即時編輯及還原/重作。

‣能處理十萬個儲存格。

Page 89: EtherCalc for Drupal

系統架構

Page 90: EtherCalc for Drupal

系統架構SocialCalc.js

HTTP Server

Page 91: EtherCalc for Drupal

系統架構SocialCalc.js

HTTP Server

GET

Page 92: EtherCalc for Drupal

系統架構SocialCalc.js

HTTP Server

GET

Page 93: EtherCalc for Drupal

系統架構SocialCalc.js

HTTP Server

GET GET

Page 94: EtherCalc for Drupal

系統架構SocialCalc.js

HTTP Server

GET GET($)

Page 95: EtherCalc for Drupal

系統架構SocialCalc.js

HTTP Server

GETPUT

GET($)

Page 96: EtherCalc for Drupal

指令設計模式

Page 97: EtherCalc for Drupal

指令設計模式set A1 value n 42

Page 98: EtherCalc for Drupal

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

Page 99: EtherCalc for Drupal

指令設計模式set A1 value n 42set A2 formula A1*2merge A1:B2 cut A3paste A4sort A1:B9 A up B downset sheet defaultcolor blue...

Page 100: EtherCalc for Drupal

指令設計模式

‣背景處理計算。

set A1 value n 42set A2 formula A1*2

Page 101: EtherCalc for Drupal

指令設計模式

‣背景處理計算。

‣無限次還原重做。

set A1 value n 42set A2 formula A1*2

Page 102: EtherCalc for Drupal

指令設計模式

‣背景處理計算。

‣無限次還原重做。

‣鍵盤滑鼠隨時可用!

set A1 value n 42set A2 formula A1*2

Page 103: EtherCalc for Drupal

“社會化” 試算表

Page 104: EtherCalc for Drupal

“社會化” 試算表

Page 105: EtherCalc for Drupal

“社會化” 試算表

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

Page 106: EtherCalc for Drupal

社會物件 ⇔ 人際連結

Page 107: EtherCalc for Drupal

社會物件 ⇔ 人際連結

Page 108: EtherCalc for Drupal

社會物件 ⇔ 人際連結

Page 109: EtherCalc for Drupal
Page 110: EtherCalc for Drupal

Page 111: EtherCalc for Drupal

CPAL 通用公共授權

Page 112: EtherCalc for Drupal

CPAL 通用公共授權

㊔ BSD, MIT

Page 113: EtherCalc for Drupal

CPAL 通用公共授權

㊔ BSD, MIT

©

LGPL, MPL

Page 114: EtherCalc for Drupal

CPAL 通用公共授權

㊔ BSD, MIT

©

LGPL, MPL

++©

GPL

Page 115: EtherCalc for Drupal

CPAL 通用公共授權

㊔ BSD, MIT

©

LGPL, MPL

++©

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

Page 116: EtherCalc for Drupal

CPAL 通用公共授權

㊔ BSD, MIT

©

LGPL, MPL

++©

GPL

Affero GPL

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

Page 117: EtherCalc for Drupal

CPAL 通用公共授權

㊔ BSD, MIT

©

LGPL, MPL

++©

GPL

Affero GPLCPAL

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

Page 118: EtherCalc for Drupal

CPAL 通用公共授權

㊔ BSD, MIT

©

LGPL, MPL

++©

GPL

Affero GPLCPAL

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

Page 119: EtherCalc for Drupal

CPAL 通用公共授權

㊔ BSD, MIT

©

LGPL, MPL

++©

GPL

Affero GPLCPAL

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

Page 120: EtherCalc for Drupal

CPAL 通用公共授權

㊔ BSD, MIT

©

LGPL, MPL

++©

GPL

Affero GPLCPAL

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

Page 121: EtherCalc for Drupal

Sheetnode, 2008

Karim Ratib

Page 122: EtherCalc for Drupal

Sheetnode, 2008

Karim Ratib

Views + Fields + CCK

Page 123: EtherCalc for Drupal

Sheetnode, 2008

Karim Ratib

Views + Fields + CCK

SocialCalc.js

Page 124: EtherCalc for Drupal

Sheetnode, 2008

Karim Ratib

Views + Fields + CCK

SocialCalc.js

Page 125: EtherCalc for Drupal

Sheetnode, 2008

Karim Ratib

Views + Fields + CCK

SocialCalc.js

Page 126: EtherCalc for Drupal

Sheetnode, 2008

Karim Ratib

Views + Fields + CCK

SocialCalc.js

Page 127: EtherCalc for Drupal

Sheetnode, 2008

Page 128: EtherCalc for Drupal

Sheetnode, 2008I was looking for an open source equivalent to Google Docs that would allow tighter integration with a company's data:

Page 129: EtherCalc for Drupal

Sheetnode, 2008

“Real-time reports,created out of Drupal data.”

I was looking for an open source equivalent to Google Docs that would allow tighter integration with a company's data:

Page 133: EtherCalc for Drupal

OLPC, 2008

Page 134: EtherCalc for Drupal

Luke Closs & Dan

OLPC, 2008

Page 135: EtherCalc for Drupal
Page 136: EtherCalc for Drupal
Page 137: EtherCalc for Drupal

Mesh 網絡

Page 138: EtherCalc for Drupal
Page 139: EtherCalc for Drupal

ManusheelGupta

Vijit Singh

Page 140: EtherCalc for Drupal

ManusheelGupta

Vijit Singh

SocialCalcActivity.py

XoCom.py

Gecko/XPCOM

SocialCalc.js

XoCom.js

Page 141: EtherCalc for Drupal

ManusheelGupta

Vijit Singh

SocialCalcActivity.py

XoCom.py

Gecko/XPCOM

SocialCalc.js

XoCom.js

set A1 value n 42

Page 142: EtherCalc for Drupal

ManusheelGupta

Vijit Singh

SocialCalcActivity.py

XoCom.py

Gecko/XPCOM

SocialCalc.js

XoCom.js

D-Bus + Telepathy

set A1 value n 42

Page 143: EtherCalc for Drupal

ManusheelGupta

Vijit Singh

SocialCalcActivity.py

XoCom.py

Gecko/XPCOM

SocialCalc.js

XoCom.js

D-Bus + Telepathy

set A1 value n 42

OLPC Mesh

網絡廣播

Page 144: EtherCalc for Drupal

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 145: EtherCalc for Drupal

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 146: EtherCalc for Drupal

很讚,但是...

Page 147: EtherCalc for Drupal

‣漏接訊息無法復原。

很讚,但是...

Page 148: EtherCalc for Drupal

‣漏接訊息無法復原。

‣編輯同一格時會衝突。

很讚,但是...

Page 149: EtherCalc for Drupal

‣漏接訊息無法復原。

‣編輯同一格時會衝突。

‣只能在 OLPC 上使用!

很讚,但是...

Page 150: EtherCalc for Drupal

YAPC::Tiny, 2009

Page 151: EtherCalc for Drupal

EV: 事件驅動

Page 152: EtherCalc for Drupal

Tatsumaki EV: 事件驅動

@miyagawa

Page 153: EtherCalc for Drupal

Tatsumaki

Web::Hippie

@clkao

EV: 事件驅動

@miyagawa

Page 154: EtherCalc for Drupal

Tatsumaki

Web::Hippie

@clkao

Feersum

@stash

EV: 事件驅動

@miyagawa

Page 155: EtherCalc for Drupal

WebSocket 同步編輯

multiserver.pl

Web::Hippie

Plack

FeersumEV/libev

Page 156: EtherCalc for Drupal

WebSocket 同步編輯

multiserver.pl

Web::Hippie

Plack

FeersumEV/libev

ScheduleScheetCommandset A1 value n 2046

SpreadsheetControl

RenderSheet

Page 157: EtherCalc for Drupal

WebSocket 同步編輯

multiserver.pl

Web::Hippie

Plack

FeersumEV/libev

ScheduleScheetCommandset A1 value n 2046

SpreadsheetControl

RenderSheet 傳送

Page 158: EtherCalc for Drupal

WebSocket 同步編輯

multiserver.pl

Web::Hippie

Plack

FeersumEV/libev

ScheduleScheetCommandset A1 value n 2046

SpreadsheetControl

RenderSheet 傳送

群播

Page 159: EtherCalc for Drupal

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 160: EtherCalc for Drupal

新增功能

Page 161: EtherCalc for Drupal

✓斷線重連可以復原。

新增功能

Page 162: EtherCalc for Drupal

✓斷線重連可以復原。

✓顯示別人的游標位置。

新增功能

Page 163: EtherCalc for Drupal

✓斷線重連可以復原。

✓顯示別人的游標位置。

✓可以在各平台上運行!

新增功能

Page 164: EtherCalc for Drupal

✓斷線重連可以復原。

✓顯示別人的游標位置。

✓可以在各平台上運行!

新增功能

Page 165: EtherCalc for Drupal

更讚了,但是...

Page 166: EtherCalc for Drupal

‣要相信誰的目前狀態?

更讚了,但是...

Page 167: EtherCalc for Drupal

‣要相信誰的目前狀態?

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

更讚了,但是...

Page 168: EtherCalc for Drupal

‣要相信誰的目前狀態?

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

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

更讚了,但是...

Page 169: EtherCalc for Drupal

‣要相信誰的目前狀態?

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

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

更讚了,但是...

Page 170: EtherCalc for Drupal
Page 171: EtherCalc for Drupal

打掉重練

Page 172: EtherCalc for Drupal

打掉重練

Page 173: EtherCalc for Drupal

YAPC::NA, 2006

Page 174: EtherCalc for Drupal

“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 175: EtherCalc for Drupal

YAPC::NA, 2006

Page 176: EtherCalc for Drupal

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 177: EtherCalc for Drupal

YAPC::NA, 2006

Page 178: EtherCalc for Drupal

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

Page 179: EtherCalc for Drupal

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

劣即是夯

Page 180: EtherCalc for Drupal
Page 181: EtherCalc for Drupal
Page 182: EtherCalc for Drupal
Page 183: EtherCalc for Drupal

JavaScript: 缺點減少

Page 184: EtherCalc for Drupal

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

JeremyAshkenas

cs = (js) -> js/2

Page 185: EtherCalc for Drupal

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

JeremyAshkenas

cs = (js) -> js/2

Page 186: EtherCalc for Drupal

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

JeremyAshkenas

cs = (js) -> js/2

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

Page 187: EtherCalc for Drupal
Page 188: EtherCalc for Drupal

{x,y} = @offset

Page 189: EtherCalc for Drupal

{x,y} = @offset

var offset = this.offset;

Page 190: EtherCalc for Drupal

{x,y} = @offset

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

Page 191: EtherCalc for Drupal

{x,y} = @offset

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

Page 193: EtherCalc for Drupal

COSCUP, 2011

Page 194: EtherCalc for Drupal

COSCUP, 2011

Page 195: EtherCalc for Drupal

COSCUP, 2011

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

Page 196: EtherCalc for Drupal

COSCUP, 2011

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

Page 197: EtherCalc for Drupal

EtherCalc 系統架構

Page 198: EtherCalc for Drupal

EtherCalc 系統架構main.coffee

Zappa

Socket.io

Express

Node.js

EV/libuv

sc.coffeeSocialCalc.js

db.coffeeredis.js

SocialCalc.js

Page 199: EtherCalc for Drupal

EtherCalc 系統架構main.coffee

Zappa

Socket.io

Express

Node.js

EV/libuv

sc.coffeeSocialCalc.js

db.coffeeredis.js

Redis(optional)

SocialCalc.js

Page 200: EtherCalc for Drupal

EtherCalc 系統架構

player.coffeeSocialCalc.js

main.coffee

Zappa

Socket.io

Express

Node.js

EV/libuv

sc.coffeeSocialCalc.js

db.coffeeredis.js

Redis(optional)

SocialCalc.js

SocialCalc.js

Page 201: EtherCalc for Drupal

EtherCalc 系統架構

player.coffeeSocialCalc.js

main.coffee

Zappa

Socket.io

Express

Node.js

EV/libuv

sc.coffeeSocialCalc.js

db.coffeeredis.js

Redis(optional)

GET snapshotLRANGE logSocialCalc.js

SocialCalc.js

Page 202: EtherCalc for Drupal

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

GET snapshotLRANGE logSocialCalc.js

SocialCalc.js

Page 203: EtherCalc for Drupal

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

GET snapshotLRANGE logSocialCalc.js

SocialCalc.js

Page 204: EtherCalc for Drupal

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

GET snapshotLRANGE logSocialCalc.js

SocialCalc.js

Page 205: EtherCalc for Drupal

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

GET snapshotLRANGE log

DEL logSET snapshot snapshot

SocialCalc.js

SocialCalc.js

Page 206: EtherCalc for Drupal

跨頁即時更新

Page 207: EtherCalc for Drupal

跨頁即時更新

伺服端

Page 208: EtherCalc for Drupal

跨頁即時更新

伺服端

客戶端

Page 209: EtherCalc for Drupal

跨頁即時更新ask.log: XXX

伺服端

客戶端

Page 210: EtherCalc for Drupal

跨頁即時更新ask.log: XXX

log: XXX,snapshot,log伺服端

客戶端

Page 211: EtherCalc for Drupal

跨頁即時更新ask.log: XXX

log: XXX,snapshot,log

execute: set A1 formula YYY!B2

伺服端

客戶端

Page 212: EtherCalc for Drupal

跨頁即時更新ask.log: XXX

log: XXX,snapshot,log

execute: set A1 formula YYY!B2

recalc: YYY,snapshot

伺服端

客戶端

Page 213: EtherCalc for Drupal

跨頁即時更新ask.log: XXX

log: XXX,snapshot,log

execute: set A1 formula YYY!B2

recalc: YYY,snapshot

伺服端

客戶端

recalc: YYY,snapshot

Page 214: EtherCalc for Drupal

跨頁即時更新ask.log: XXX

log: XXX,snapshot,log

execute: set A1 formula YYY!B2

recalc: YYY,snapshot

伺服端

客戶端

recalc: YYY,snapshot

recalc: YYY,snapshot

Page 215: EtherCalc for Drupal

REST 資源界面

Page 216: EtherCalc for Drupal

REST 資源界面

GET /_/pagePUT /_/page

Page 217: EtherCalc for Drupal

REST 資源界面

GET /_/pagePUT /_/page

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

Page 218: EtherCalc for Drupal

REST 資源界面

GET /_/pagePUT /_/page

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

GET /_/page/cells/A1PUT /_/page/cells/B2

Page 219: EtherCalc for Drupal
Page 220: EtherCalc for Drupal

+ =

Page 221: EtherCalc for Drupal

+ =

Coco+ =

Page 222: EtherCalc for Drupal

+ =

Coco+ =

+ =Coco

Page 223: EtherCalc for Drupal
Page 224: EtherCalc for Drupal

stove.on("heat", function() {

Page 225: EtherCalc for Drupal

stove.on("heat", function() {

pot.on("boil", function() {

Page 226: EtherCalc for Drupal

stove.on("heat", function() {

pot.on("boil", function() {

rice.on("ready", function(dish) {

Page 227: EtherCalc for Drupal

stove.on("heat", function() {

pot.on("boil", function() {

rice.on("ready", function(dish) {

setTimeout(function() {

Page 228: EtherCalc for Drupal

stove.on("heat", function() {

pot.on("boil", function() {

rice.on("ready", function(dish) {

setTimeout(function() {

dish.serve();

}, 60000);

Page 229: EtherCalc for Drupal

stove.on("heat", function() {

pot.on("boil", function() {

rice.on("ready", function(dish) {

setTimeout(function() {

dish.serve();

}, 60000);

});

});

});

Page 230: EtherCalc for Drupal

stove.on("heat", function() {

pot.on("boil", function() {

rice.on("ready", function(dish) {

setTimeout(function() {

dish.serve();

}, 60000);

});

});

});

Page 231: EtherCalc for Drupal

stove.on("heat", function() {

pot.on("boil", function() {

rice.on("ready", function(dish) {

setTimeout(function() {

dish.serve();

}, 60000);

});

});

});

Page 232: EtherCalc for Drupal
Page 233: EtherCalc for Drupal

stove.on "heat", ->

Page 234: EtherCalc for Drupal

stove.on "heat", ->

pot.on "boil", ->

Page 235: EtherCalc for Drupal

stove.on "heat", ->

pot.on "boil", ->

rice.on "ready", (dish) ->

Page 236: EtherCalc for Drupal

stove.on "heat", ->

pot.on "boil", ->

rice.on "ready", (dish) ->

setTimeout(

Page 237: EtherCalc for Drupal

stove.on "heat", ->

pot.on "boil", ->

rice.on "ready", (dish) ->

setTimeout(

-> dish.serve()

Page 238: EtherCalc for Drupal

stove.on "heat", ->

pot.on "boil", ->

rice.on "ready", (dish) ->

setTimeout(

-> dish.serve()

60000

Page 239: EtherCalc for Drupal

stove.on "heat", ->

pot.on "boil", ->

rice.on "ready", (dish) ->

setTimeout(

-> dish.serve()

60000

)

Page 240: EtherCalc for Drupal

stove.on "heat", ->

pot.on "boil", ->

rice.on "ready", (dish) ->

setTimeout(

-> dish.serve()

60000

)

Page 241: EtherCalc for Drupal
Page 242: EtherCalc for Drupal

<- stove.on \heat

Page 243: EtherCalc for Drupal

<- stove.on \heat

<- pot.on \boil

Page 244: EtherCalc for Drupal

<- stove.on \heat

<- pot.on \boil

dish <- rice.on \ready

Page 245: EtherCalc for Drupal

<- stove.on \heat

<- pot.on \boil

dish <- rice.on \ready

<- (`setTimeout` 60000)

Page 246: EtherCalc for Drupal

<- stove.on \heat

<- pot.on \boil

dish <- rice.on \ready

<- (`setTimeout` 60000)

dish.serve!

Page 247: EtherCalc for Drupal

<- stove.on \heat

<- pot.on \boil

dish <- rice.on \ready

<- (`setTimeout` 60000)

dish.serve!

Page 248: EtherCalc for Drupal

OSDC.tw, 2012

Page 249: EtherCalc for Drupal

OSDC.tw, 2012

Page 250: EtherCalc for Drupal

OSDC.tw, 2012

Page 251: EtherCalc for Drupal

OSDC.tw, 2012

Page 252: EtherCalc for Drupal

哪來的「高風亮節」…

Page 253: EtherCalc for Drupal

只是沒寫過 Drupal 模組。

哪來的「高風亮節」…

Page 254: EtherCalc for Drupal
Page 255: EtherCalc for Drupal

雖然 Isis 架過許多 Drupal 網站

我也幫忙改了一些…

Page 256: EtherCalc for Drupal

雖然 Isis 架過許多 Drupal 網站

我也幫忙改了一些…

Page 257: EtherCalc for Drupal

雖然 Isis 架過許多 Drupal 網站

我也幫忙改了一些…

Page 258: EtherCalc for Drupal

雖然 Isis 架過許多 Drupal 網站

我也幫忙改了一些…

Page 259: EtherCalc for Drupal

可是我對架構

完全沒有概念。

Page 260: EtherCalc for Drupal

可是我對架構

完全沒有概念。

Page 261: EtherCalc for Drupal
Page 262: EtherCalc for Drupal

⟪開源之樂⟫, 2012. 7. 1.

Page 263: EtherCalc for Drupal

⟪開源之樂⟫, 2012. 7. 1.

Page 264: EtherCalc for Drupal

⟪開源之樂⟫, 2012. 7. 1.

Page 265: EtherCalc for Drupal

⟪開源之樂⟫, 2012. 7. 1.

“內容過於抽象。”

Page 266: EtherCalc for Drupal

⟪開源之樂⟫, 2012. 7. 1.

“內容過於抽象。” “這跟 Drupal 到底有何關係?”

Page 267: EtherCalc for Drupal
Page 268: EtherCalc for Drupal

2012. 7. 2.

Page 269: EtherCalc for Drupal

“你還是把 EtherCalc for Drupal 寫出來,比較有意義。”

2012. 7. 2.

Page 270: EtherCalc for Drupal

“你還是把 EtherCalc for Drupal 寫出來,比較有意義。”

2012. 7. 2.

Page 271: EtherCalc for Drupal

“你還是把 EtherCalc for Drupal 寫出來,比較有意義。”

2012. 7. 2.

Page 272: EtherCalc for Drupal
Page 273: EtherCalc for Drupal

2012. 7. 3.

Page 274: EtherCalc for Drupal

2012. 7. 3.

感謝 Karim 幫忙

Page 275: EtherCalc for Drupal

2012. 7. 3.

一個早上 就寫完了。

感謝 Karim 幫忙

Page 276: EtherCalc for Drupal

/** * * Implements hook_menu(). * * In sheetnode_ethercalc_menu.info: * configure = admin/config/content/sheetnode/ethercalc * */

function sheetnode_ethercalc_menu() { array('admin/config/content/sheetnode/ethercalc' => array( 'title' => 'EtherCalc', 'access arguments' => array('administer site configuration'), 'page callback' => 'drupal_get_form', 'page arguments' => array('_sheetnode_ethercalc_settings'), 'description' => 'Administer settings for EtherCalc.', 'type' => MENU_LOCAL_TASK, ));}

Page 277: EtherCalc for Drupal

/** * * Implements hook_menu(). * * In sheetnode_ethercalc_menu.info: * configure = admin/config/content/sheetnode/ethercalc * */

function sheetnode_ethercalc_menu() { array('admin/config/content/sheetnode/ethercalc' => array( 'title' => 'EtherCalc', 'access arguments' => array('administer site configuration'), 'page callback' => 'drupal_get_form', 'page arguments' => array('_sheetnode_ethercalc_settings'), 'description' => 'Administer settings for EtherCalc.', 'type' => MENU_LOCAL_TASK, ));}

Page 278: EtherCalc for Drupal

/**

* Implements hook_sheetnode_plugins().

*/

function sheetnode_ethercalc_sheetnode_plugins(

$value, $save_element, $context

) {

// Only turn on Ethercalc if we're editing the node.

if (!empty($save_element)) {

$ethercalc_host = variable_get('sheetnode_ethercalc_host', '');

$ethercalc_port = variable_get('sheetnode_ethercalc_port', '8000');

$ethercalc_path = …;

drupal_add_js($ethercalc_path . '/socket.io/socket.io.js#');

drupal_add_js($ethercalc_path . '/zappa/zappa.js#');

drupal_add_js($ethercalc_path . '/static/md5.js#');

drupal_add_js($ethercalc_path . '/player/broadcast.js#');

drupal_add_js($ethercalc_path . '/player/main.js#');

}

}

Page 279: EtherCalc for Drupal

/**

* Implements hook_sheetnode_plugins().

*/

function sheetnode_ethercalc_sheetnode_plugins(

$value, $save_element, $context

) {

// Only turn on Ethercalc if we're editing the node.

if (!empty($save_element)) {

$ethercalc_host = variable_get('sheetnode_ethercalc_host', '');

$ethercalc_port = variable_get('sheetnode_ethercalc_port', '8000');

$ethercalc_path = …;

drupal_add_js($ethercalc_path . '/socket.io/socket.io.js#');

drupal_add_js($ethercalc_path . '/zappa/zappa.js#');

drupal_add_js($ethercalc_path . '/static/md5.js#');

drupal_add_js($ethercalc_path . '/player/broadcast.js#');

drupal_add_js($ethercalc_path . '/player/main.js#');

}

}

Page 280: EtherCalc for Drupal
Page 281: EtherCalc for Drupal

2012. 7. 4.

Page 282: EtherCalc for Drupal

2012. 7. 4.

Page 289: EtherCalc for Drupal
Page 290: EtherCalc for Drupal

結論是:

Page 291: EtherCalc for Drupal

結論是:

Page 292: EtherCalc for Drupal

寫 Drupal 模組真的很簡單!

結論是:

Page 293: EtherCalc for Drupal

感謝收看!

EtherCalcfor Drupal