SlideShare a Scribd company logo
EtherCalc
Multiplayer
Spreadsheet
 ethercalc.tw
Personal Opinions
Personal Opinions




(With Infotisements)
Time Limited
 Just Stories
  No Coding
Time Limited
 Just Stories
       Ideas
  No Coding
ethercalc.org

‣ npm install -g ethercalc

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


              nodejs.org/#download
A.O.S.A., 2011


aosabook.org


 aosa.tw
History
VisiCalc, 1979




Dan Bricklin
Harvard, 1977
Harvard, 1977
Harvard, 1977
Harvard, 1977
Harvard, 1977
Original Vision
Original Vision




       Alto
    Workstation
Original Vision




                 Alto
Calculator-   Workstation
  Mouse
Original Vision




                 Alto
Calculator-   Workstation   Head-mounted
  Mouse                        Display
Original Vision




                 Alto
Calculator-   Workstation   Head-mounted
  Mouse                        Display
EtherCalc: Multiplayer Spreadsheet
EtherCalc: Multiplayer Spreadsheet
=SUM( )   0
10

     =SUM( )   10
                0
10       20

     =SUM( )   30
               10
                0
10       20    30

     =SUM( )        60
                    30
                    10
                     0
10       20    30

     =SUM( )        60
                    30
                    10
                     0
1977 → 1978
1977 → 1978
1977 → 1978



       +



  Integer BASIC
1978 → 1979
1978 → 1979
  10      20   30
  =SUM(        )    60
1978 → 1979
    A       B    C    D
1   10      20   30

2   =SUM(        )    60
1978 → 1979
    A     B     C    D
1   10    20    30

2   =SUM(A1,B1,C1)   60
1978 → 1979
    A     B     C    D
1   10    20    30

2   =SUM(A1,B1,C1)   60




                     Bob & Dan
1978 → 1979
           A     B     C    D
      1    10    20    30

      2    =SUM(A1,B1,C1)   60
‣ Dan prototypes in BASIC



                            Bob & Dan
1978 → 1979
           A     B     C    D
      1    10    20    30

      2    =SUM(A1,B1,C1)   60
‣ Dan prototypes in BASIC
‣ Bob codes in 6502 ASM


                            Bob & Dan
1978 → 1979
            A     B     C     D
       1   10     20    30

       2    =SUM(A1,B1,C1)    60
‣ Dan prototypes in BASIC
‣ Bob codes in 6502 ASM
‣ 700,000 copies in 6 years
                              Bob & Dan
1978 → 1979
            A     B     C     D
       1   10     20    30

       2    =SUM(A1,B1,C1)    60
‣ Dan prototypes in BASIC
‣ Bob codes in 6502 ASM
‣ 700,000 copies in 6 years
‣ The !rst “Killer App”       Bob & Dan
1981
EtherCalc: Multiplayer Spreadsheet
EtherCalc: Multiplayer Spreadsheet
EtherCalc: Multiplayer Spreadsheet
EtherCalc: Multiplayer Spreadsheet
EtherCalc: Multiplayer Spreadsheet
20 years passed
20 years passed
20 years passed
20 years passed
20 years passed



Nothing changed
EtherCalc: Multiplayer Spreadsheet
“Can’t open”
“Can’t open”

“Garbled”
“Can’t open”

“Garbled”

“Virus!”
EtherCalc: Multiplayer Spreadsheet
Wikipedia, 2001
Wikipedia, 2001
Wikipedia, 2001
wikiCalc, 2005
wikiCalc, 2005
✓ Plain text, HTML & Wiki syntax
wikiCalc, 2005
✓ Plain text, HTML & Wiki syntax
✓ References cells on other servers
wikiCalc, 2005
✓ Plain text, HTML & Wiki syntax
✓ References cells on other servers
✓ Keeps all operations for auditing
wikiCalc, 2005
✓ Plain text, HTML & Wiki syntax
✓ References cells on other servers
✓ Keeps all operations for auditing
✓ Revert to any revision
wikiCalc, 2005
✓ Plain text, HTML & Wiki syntax
✓ References cells on other servers
✓ Keeps all operations for auditing
✓ Revert to any revision
✓ Open Source! (GPLv2)
wikiCalc.pl
wikiCalc.pl
      網站
      Sites
./wkcdata/sites/Foo
 ./wkcdata/sites/Bar
  ./wkcdata/sites/Baz
wikiCalc.pl
      網站
      Sites             頁面
                        Pages
./wkcdata/sites/Foo
                         XXX
 ./wkcdata/sites/Bar
  ./wkcdata/sites/Baz    YYY
                         ZZZ
wikiCalc.pl
      網站
      Sites             頁面
                        Pages
./wkcdata/sites/Foo
                         XXX
 ./wkcdata/sites/Bar
  ./wkcdata/sites/Baz    YYY
                         ZZZ


               Cells
               儲存格
wikiCalc.pl
      網站
      Sites             頁面
                        Pages
./wkcdata/sites/Foo
                         XXX
 ./wkcdata/sites/Bar
  ./wkcdata/sites/Baz    YYY
                         ZZZ


               Cells
               儲存格
    A1: 100
wikiCalc.pl
      網站
      Sites             頁面
                        Pages
./wkcdata/sites/Foo
                         XXX
 ./wkcdata/sites/Bar
  ./wkcdata/sites/Baz    YYY
                         ZZZ


               Cells
               儲存格
    A1: 100
    A2: =A1*2
wikiCalc.pl
      網站
      Sites               頁面
                          Pages
./wkcdata/sites/Foo
                           XXX
 ./wkcdata/sites/Bar
  ./wkcdata/sites/Baz      YYY
                           ZZZ


               Cells
               儲存格
    A1: 100 B1: =XXX!C1
    A2: =A1*2
wikiCalc.pl
      網站
      Sites               頁面
                          Pages
./wkcdata/sites/Foo
                           XXX
 ./wkcdata/sites/Bar
  ./wkcdata/sites/Baz      YYY
                           ZZZ


               Cells
               儲存格
    A1: 100 B1: =XXX!C1
    A2: =A1*2
wikiCalc.pl
      網站
      Sites                 頁面
                            Pages
./wkcdata/sites/Foo
                             XXX
 ./wkcdata/sites/Bar
  ./wkcdata/sites/Baz        YYY
                             ZZZ


               Cells
               儲存格
    A1: 100 B1: =XXX!C1
    A2: =A1*2 B2: =YYY!D2
wikiCalc.pl
      網站
      Sites                 頁面
                            Pages
./wkcdata/sites/Foo
                             XXX
 ./wkcdata/sites/Bar
  ./wkcdata/sites/Baz        YYY
                             ZZZ


               Cells
               儲存格
    A1: 100 B1: =XXX!C1
    A2: =A1*2 B2: =YYY!D2
wikiCalc.pl
      網站
      Sites                 頁面
                            Pages
./wkcdata/sites/Foo
                             XXX
 ./wkcdata/sites/Bar
  ./wkcdata/sites/Baz        YYY
                             ZZZ


               Cells
               儲存格
    A1: 100 B1: =XXX!C1
    A2: =A1*2 B2: =YYY!D2
                             Cross-page
                             Reference
wikiCalc Edit Flow
wikiCalc Edit Flow
     A1: 100
     A2: =A1*2
wikiCalc Edit Flow
     A1: 100
     A2: =A1*2
wikiCalc Edit Flow
       A1: 100
       A2: =A1*2


    POST /
    ajaxsetcell=host:page:A1:300
                                   wikicalc.pl
wikiCalc Edit Flow
       A1: 100
       A2: =A1*2


    POST /
    ajaxsetcell=host:page:A1:300
                                      wikicalc.pl
          200 OK
          <?xml version="1.0"?>
          <root><![CDATA[
          A1:v:300:300:right:1:1::
          A2:f:600:A1*2:right:1:1::
          ]]></root>
“Loading…”
“Loading…”
“Loading…”




“C100k” Problem
“Loading…”




“C100k” Problem
EtherCalc: Multiplayer Spreadsheet
Undo
Undo
Redo
SocialCalc, 2006



Dan Bricklin   Ross Mayfield
Design Goals
Design Goals
‣ Rewrite calc engine in JS
Design Goals
‣ Rewrite calc engine in JS
‣ Real-time responsive editor
Design Goals
‣ Rewrite calc engine in JS
‣ Real-time responsive editor
‣ Supports 100,000+ cells
Design Goals
‣ Rewrite calc engine in JS
‣ Real-time responsive editor
‣ Supports 100,000+ cells
‣ Works on all browsers (IE6+)
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
Architecture
Architecture
SocialCalc.js




HTTP Server
Architecture
      SocialCalc.js


GET



      HTTP Server
Architecture
      SocialCalc.js


GET



      HTTP Server
Architecture
   SocialCalc.js


GET GET



   HTTP Server
Architecture
   SocialCalc.js


GET GET
    ($)



   HTTP Server
Architecture
   SocialCalc.js

               PUT
GET GET
    ($)



   HTTP Server
Architecture
   SocialCalc.js

               PUT
GET GET
    ($)



   HTTP Server
Command Pattern
Command Pattern
set A1 value n 42
Command Pattern
set A1 value n 42
set A2 formula A1*2
Command Pattern
set A1 value n 42
set A2 formula A1*2
merge A1:B2
cut A3
paste A4
sort A1:B9 A up B down
set sheet defaultcolor blue
...
Command Pattern
 set A1 value n 42
 set A2 formula A1*2
‣ Async recalc loop
Command Pattern
 set A1 value n 42
 set A2 formula A1*2
‣ Async recalc loop
‣ Visible-only redraw
Command Pattern
 set A1 value n 42
 set A2 formula A1*2
‣ Async recalc loop
‣ Visible-only redraw
‣ Unlimited undo/redo
Command Pattern
 set A1 value n 42
 set A2 formula A1*2
‣ Async recalc loop
‣ Visible-only redraw
‣ Unlimited undo/redo
‣ UI stays responsive
Command Pattern
 set A1 value n 42
 set A2 formula A1*2
‣ Async recalc loop
‣ Visible-only redraw
‣ Unlimited undo/redo
‣ UI stays responsive
“Social”Calc
“Social”Calc
“Social”Calc




 Comment, Like,
   Tag, Share, Embed...
Objects   Relations
Objects   Relations
Objects   Relations
EtherCalc: Multiplayer Spreadsheet
Good !rst
Pro!ts later
Common Public
Attribution License
Common Public
      Attribution License
  ⓐ
BSD, MIT
Common Public
      Attribution License
              ©
  ⓐ
BSD, MIT   LGPL, MPL
Common Public
      Attribution License
              ©        ++©
  ⓐ
BSD, MIT   LGPL, MPL    GPL
Common Public
      Attribution License
              ©                                  ++©
  ⓐ
BSD, MIT   LGPL, MPL                                  GPL
               “ASP
 loophole”
Common Public
      Attribution License
              ©                                  ++©
  ⓐ
BSD, MIT   LGPL, MPL                                  GPL
               “ASP
 loophole”

                                             Affero GPL
Common Public
      Attribution License
              ©                                  ++©
  ⓐ
BSD, MIT   LGPL, MPL                                  GPL
               “ASP
 loophole”

             CPAL                            Affero GPL
Common Public
      Attribution License
              ©                                  ++©
  ⓐ
BSD, MIT   LGPL, MPL                                  GPL
               “ASP
 loophole”

             CPAL                            Affero GPL
Common Public
      Attribution License
              ©                                  ++©
  ⓐ
BSD, MIT   LGPL, MPL                                  GPL
               “ASP
 loophole”

             CPAL                            Affero GPL
Common Public
      Attribution License
              ©                                  ++©
  ⓐ
BSD, MIT   LGPL, MPL                                  GPL
               “ASP
 loophole”

             CPAL                            Affero GPL
Sheetnode, 2008




Karim Ratib
Sheetnode, 2008
              Views + Fields + CCK




Karim Ratib
Sheetnode, 2008
              Views + Fields + CCK



                  SocialCalc.js


Karim Ratib
Sheetnode, 2008
              Views + Fields + CCK



                  SocialCalc.js


Karim Ratib
Sheetnode, 2008
              Views + Fields + CCK



                  SocialCalc.js


Karim Ratib
Sheetnode, 2008
              Views + Fields + CCK



                  SocialCalc.js


Karim Ratib
OLPC, 2008
OLPC, 2008




Luke Closs  Dan
EtherCalc: Multiplayer Spreadsheet
EtherCalc: Multiplayer Spreadsheet
Mesh
P2P
EtherCalc: Multiplayer Spreadsheet
Manusheel
  Gupta




Vijit Singh
SocialCalcActivity.py
                  Gecko/XPCOM
                 SocialCalc.js
                    XoCom.js

                    XoCom.py



Manusheel
  Gupta




Vijit Singh
SocialCalcActivity.py
                                      Gecko/XPCOM
                                     SocialCalc.js
                                        XoCom.js

              set A1 value n 42         XoCom.py



Manusheel
  Gupta




Vijit Singh
SocialCalcActivity.py
                                      Gecko/XPCOM
                                     SocialCalc.js
                                        XoCom.js

              set A1 value n 42         XoCom.py

                                      D-Bus + Telepathy

Manusheel
  Gupta




Vijit Singh
SocialCalcActivity.py
                                      Gecko/XPCOM
                                     SocialCalc.js
                                        XoCom.js

              set A1 value n 42         XoCom.py

                                      D-Bus + Telepathy
                            OLPC Mesh
Manusheel
  Gupta                     Broadcast
                             網絡廣播




Vijit Singh
SocialCalcActivity.py
                                            Gecko/XPCOM
                                           SocialCalc.js
                                              XoCom.js

              set A1 value n 42               XoCom.py

                                            D-Bus + Telepathy
                               OLPC Mesh
Manusheel
  Gupta                        Broadcast
                                網絡廣播
                    D-Bus + Telepathy


                       Gecko/XPCOM
                      SocialCalc.js
                         XoCom.js

                         XoCom.py
Vijit Singh        SocialCalcActivity.py
SocialCalcActivity.py
                                            Gecko/XPCOM
                                           SocialCalc.js
                                              XoCom.js

              set A1 value n 42               XoCom.py

                                            D-Bus + Telepathy
                               OLPC Mesh
Manusheel
  Gupta                        Broadcast
                                網絡廣播
                    D-Bus + Telepathy


                       Gecko/XPCOM
                                              set A1 value n 42
                      SocialCalc.js
                         XoCom.js

                         XoCom.py
Vijit Singh        SocialCalcActivity.py
Great, but...
Great, but...
‣ Must log on same time
Great, but...
‣ Must log on same time
‣ Can’t replay missed logs
Great, but...
‣ Must log on same time
‣ Can’t replay missed logs
‣ Race condition on cells
Great, but...
‣ Must log on same time
‣ Can’t replay missed logs
‣ Race condition on cells
‣ OLPC-specific code!
YAPC::Tiny, 2009


     跳格
  Multiplayer
  SocialCalc
           二零零九 唐鳳
                字
           中英雙宇有字版
EV/AnyEvent
Tatsumaki EV/AnyEvent




 @miyagawa
Tatsumaki EV/AnyEvent
        Web::Hippie




 @miyagawa   @clkao
Tatsumaki EV/AnyEvent
        Web::Hippie
                Feersum


 @miyagawa   @clkao   @stash
WebSocket Channels
      multiserver.pl

       Web::Hippie
          Plack
         Feersum
         EV/libev
WebSocket Channels
  SpreadsheetControl
                        multiserver.pl

                         Web::Hippie
ScheduleScheetCommand
 set A1 value n 2046        Plack
   RenderSheet
                           Feersum
                           EV/libev
WebSocket Channels
  SpreadsheetControl
                              multiserver.pl

                               Web::Hippie
ScheduleScheetCommand
 set A1 value n 2046              Plack
   RenderSheet
                       Send      Feersum
                                 EV/libev
WebSocket Channels
  SpreadsheetControl
                              multiserver.pl


ScheduleScheetCommand
                               Web::Hippie     Relay
 set A1 value n 2046              Plack
   RenderSheet
                       Send      Feersum
                                 EV/libev
WebSocket Channels
  SpreadsheetControl
                              multiserver.pl


ScheduleScheetCommand
                               Web::Hippie     Relay
 set A1 value n 2046              Plack
                                               ScheduleScheetCommand
   RenderSheet
                       Send      Feersum         set A1 value n 2046
                                                   (isRemote = true)
                                 EV/libev
                                                     RenderSheet
New Features
New Features
✓ Fetch logs on join
New Features
✓ Fetch logs on join
✓ Reconnection recovery
New Features
✓ Fetch logs on join
✓ Reconnection recovery
✓ Show peer cursors
New Features
✓ Fetch logs on join
✓ Reconnection recovery
✓ Show peer cursors
✓ Cross-browser support!
New Features
✓ Fetch logs on join
✓ Reconnection recovery
✓ Show peer cursors
✓ Cross-browser support!
Much better, but...
Much better, but...
‣ Which peer’s log to take?
Much better, but...
‣ Which peer’s log to take?
‣ What if everyone leaves?
Much better, but...
‣ Which peer’s log to take?
‣ What if everyone leaves?
‣ Who would keep the logs?
Much better, but...
‣ Which peer’s log to take?
‣ What if everyone leaves?
‣ Who would keep the logs?
‣ Replay 1,000+ commands?
Much better, but...
‣ Which peer’s log to take?
‣ What if everyone leaves?
‣ Who would keep the logs?
‣ Replay 1,000+ commands?
EtherCalc: Multiplayer Spreadsheet
Undo
Undo
Redo?
YAPC::NA, 2006
YAPC::NA, 2006
“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
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. ”
YAPC::NA, 2006
YAPC::NA, 2006
“Because, as we all know,
worse is better, so the worst
scripting language is doomed
to become the best.”
YAPC::NA, 2006
“Because, as we all know,
worse is better, so the worst
scripting language is doomed
to become the best.”

        劣=夯
EtherCalc: Multiplayer Spreadsheet
EtherCalc: Multiplayer Spreadsheet
EtherCalc: Multiplayer Spreadsheet
JavaScript: Good Part Only
CoeeScript: HalfPart Noise
 JavaScript: Good the Only

  cs = (js) = js/2


 Jeremy
Ashkenas
CoeeScript: HalfPart Noise
 JavaScript: Good the Only

  cs = (js) = js/2


 Jeremy
Ashkenas
CoeeScript: HalfPart Noise
 JavaScript: Good the Only

  cs = (js) = js/2

           “Original JavaScript: 22k LOC.
            Ported to CoffeeScript: 5k LOC.
            {async, jsdom, zappa, optimist etc}++”
 Jeremy
Ashkenas
EtherCalc: Multiplayer Spreadsheet
{x,y} = @offset
{x,y} = @offset
var _ref = this.offset;
{x,y} = @offset
var _ref = this.offset;
var x = _ref.x;
{x,y} = @offset
var _ref = this.offset;
var x = _ref.x;
var y = _ref.y;
{x,y} = @offset
var _ref = this.offset;
var x = _ref.x;
var y = _ref.y;

          js2coffee.org
EtherCalc: Multiplayer Spreadsheet
EtherCalc: Multiplayer Spreadsheet
EtherCalc: Multiplayer Spreadsheet
Function::ᵒ = (fun) -
Function::ᵒ = (fun) -
  (arg) = @ fun arg
Function::ᵒ = (fun) -
  (arg) = @ fun arg

f = (x) = x * 2
Function::ᵒ = (fun) -
  (arg) = @ fun arg

f = (x) = x * 2
g = (x) = x * 3
Function::ᵒ = (fun) -
  (arg) = @ fun arg

f = (x) = x * 2
g = (x) = x * 3
h = f .ᵒ g
Function::ᵒ = (fun) -
  (arg) = @ fun arg

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

h 100 # 600
Function::ᵒ = (fun) -
  (arg) = @ fun arg

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

h 100 # 600
Zappa: Lazy Node.js




          zappajs.org
Zappa: Lazy Node.js



Maurice
Machado

           zappajs.org
Zappa: Lazy Node.js
          “If you can describe it
          in 495 characters,
          why on earth should
Maurice
          it take 879?”
Machado

                 zappajs.org
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}
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}
require('zappa') -
@post '/': - -
  @view layout:
  if @data.wiki? @body
    html = body =
    @send w2h @data.wiki
 @get '/': - @render 'index'
 else if @data.html?
    @send h2w @data.html
 @view index: - for name, value of {
 else redirect '/'
   wiki: Wiki to HTML
     html: HTML to Wiki
 }
     form method: 'post', =
       p = textarea {name}
       p = input {type: 'submit', value}
COSCUP, 2011
COSCUP, 2011
COSCUP, 2011




hack
 hack
 hack
 ...
COSCUP, 2011




hack
 hack
 hack
 ...
EtherCalc Edit Flow
EtherCalc Edit Flow
      main.coffee
 sc.coffee
                Socket.io
SocialCalc.js
                Express
                Node.js
 db.coffee       EV/libuv
  redis.js       Zappa
EtherCalc Edit Flow
      main.coffee
 sc.coffee
                Socket.io
SocialCalc.js
                Express
                Node.js
 db.coffee       EV/libuv
  redis.js       Zappa



  Redis
(optional)
EtherCalc Edit Flow
      main.coffee
 sc.coffee
                Socket.io
SocialCalc.js
                Express
                Node.js
 db.coffee       EV/libuv    player.coffee
  redis.js       Zappa       SocialCalc.js




  Redis
(optional)
EtherCalc Edit Flow
      main.coffee            MULTI
 sc.coffee
                              GET snapshot
                Socket.io     LRANGE log
SocialCalc.js               EXEC
                Express
                Node.js
 db.coffee       EV/libuv     player.coffee
  redis.js       Zappa        SocialCalc.js




  Redis
(optional)
EtherCalc Edit Flow
      main.coffee            MULTI
 sc.coffee
                              GET snapshot
                Socket.io     LRANGE log
SocialCalc.js               EXEC
                Express
                Node.js
 db.coffee       EV/libuv     player.coffee
  redis.js       Zappa        SocialCalc.js



                            RPUSH log cmd
  Redis
(optional)
EtherCalc Edit Flow
      main.coffee            MULTI
 sc.coffee
                              GET snapshot
                Socket.io     LRANGE log
SocialCalc.js               EXEC
                Express
                Node.js
 db.coffee       EV/libuv     player.coffee
  redis.js       Zappa        SocialCalc.js



                            RPUSH log cmd
  Redis
(optional)
EtherCalc Edit Flow
      main.coffee            MULTI
 sc.coffee
                              GET snapshot
                Socket.io     LRANGE log
SocialCalc.js               EXEC
                Express
                Node.js
 db.coffee       EV/libuv     player.coffee
  redis.js       Zappa        SocialCalc.js



                            RPUSH log cmd
  Redis
(optional)
EtherCalc Edit Flow
      main.coffee            MULTI
 sc.coffee
                              GET snapshot
                Socket.io     LRANGE log
SocialCalc.js               EXEC
                Express
                Node.js
 db.coffee       EV/libuv     player.coffee
  redis.js       Zappa        SocialCalc.js


                 MULTI     RPUSH log cmd
  Redis            DEL log
(optional)         SET snapshot snapshot
                 EXEC
Recalc Subscription
Recalc Subscription
Recalc Subscription
Recalc Subscription
         ask.log: Foo
Recalc Subscription
              ask.log: Foo

   log: Foo,snapshot,log
Recalc Subscription
              ask.log: Foo

   log: Foo,snapshot,log

           execute: set A1
            formula Bar!B2
Recalc Subscription
              ask.log: Foo

   log: Foo,snapshot,log

           execute: set A1
            formula Bar!B2
           ask.recalc: Bar
Recalc Subscription
              ask.log: Foo

   log: Foo,snapshot,log

           execute: set A1
            formula Bar!B2
           ask.recalc: Bar

   recalc: Bar,snapshot
Recalc Subscription
              ask.log: Foo

   log: Foo,snapshot,log

           execute: set A1
            formula Bar!B2
           ask.recalc: Bar

   recalc: Bar,snapshot

   recalc: Bar,snapshot
PaaS Deployment
PaaS Deployment
          stackato.yml
          app.js
PaaS Deployment
          stackato.yml
          app.js

          dotcloud.yml
          server.js
PaaS Deployment
          stackato.yml
          app.js

          dotcloud.yml
          server.js

          server.js

More Related Content

PPTX
Cyber crime and security ppt
PPT
Building Communities of “Trust”
PDF
Backup UUASC 9/6/12
PDF
Financial Communications Society - BDI 11/06 The Future of Financial Services...
PDF
CrypTag: Building Encrypted, Taggable, Searchable Zero-knowledge Systems
PDF
Inventory management system
PPT
Cost Accounting
PPT
Financial Accounting
Cyber crime and security ppt
Building Communities of “Trust”
Backup UUASC 9/6/12
Financial Communications Society - BDI 11/06 The Future of Financial Services...
CrypTag: Building Encrypted, Taggable, Searchable Zero-knowledge Systems
Inventory management system
Cost Accounting
Financial Accounting

Similar to EtherCalc: Multiplayer Spreadsheet (20)

PDF
ASSIGNMENT OF VISUAL BASIC
DOCX
3 content
KEY
Excelマクロはじめの一歩
PPTX
Excel basics for everyday use
DOC
4.01 Student Notes
PPTX
Updated Visual Basic 6 for beginners.pptx
PDF
Corality - Excel secrets and shortcuts
PDF
Ms Excel 2007 &amp; 2010 Workshop
PPT
Ti Nspire Overview
PDF
Excel Audit Software Aditya Presentations In Agra
DOC
Ejemplo En Gamabas
PDF
Perl세미나
PPT
Excel 2003 Training for Business Analysts
PPTX
Input output
PPTX
WHPL Introduction to Excel
PPTX
Excel basics for everyday use part two
PDF
Unlocking the secrets to how essbase thinks e roske in sync10 oracle epm track
DOCX
รายงานการเขียนคำสั่งควบคุมแบบวนซ้ำ กลุ่ม 4 ม. 6 ห้อง2
PPTX
Getting started with image processing using Matlab
PPTX
NCLA2011 Using Spreadsheets
ASSIGNMENT OF VISUAL BASIC
3 content
Excelマクロはじめの一歩
Excel basics for everyday use
4.01 Student Notes
Updated Visual Basic 6 for beginners.pptx
Corality - Excel secrets and shortcuts
Ms Excel 2007 &amp; 2010 Workshop
Ti Nspire Overview
Excel Audit Software Aditya Presentations In Agra
Ejemplo En Gamabas
Perl세미나
Excel 2003 Training for Business Analysts
Input output
WHPL Introduction to Excel
Excel basics for everyday use part two
Unlocking the secrets to how essbase thinks e roske in sync10 oracle epm track
รายงานการเขียนคำสั่งควบคุมแบบวนซ้ำ กลุ่ม 4 ม. 6 ห้อง2
Getting started with image processing using Matlab
NCLA2011 Using Spreadsheets
Ad

More from Audrey Tang (20)

PDF
Social Innovation & Digital Transformation
PDF
Stories from the Future of Democracy
PDF
TEDxTaipei 2017: 社會企業
PDF
唐鳳政務委員業務工作報告
PDF
資訊服務採購契約範本 修正明細對照 1060713
ODP
服務型智慧政府推動計畫 v9
PDF
共通性應用程式介面規範
PDF
打造一站式的防救災資訊整合平臺
PPTX
開放政府聯絡人第11次協作會議簡報
PPTX
第7次協作會議會後會簡報v6.0
PPTX
臨時動議:社會企業連繫會議分組
DOCX
議程及歷次列管表
PPTX
討論案一:中、南、東部在地社企會談規劃情形
PPTX
報告案四之一:創櫃板協助社會企業籌資之推動現況
PDF
報告案四之二:國發基金運用資金協助社會發展辦理方式
PDF
報告案二:組團參加2017年社會企業世界論壇辦理進度報告
PDF
報告案三 :SEWF申辦2019進度說明
PDF
2017-06-17 臺灣網路治理論壇
PDF
行政院數位國家創新經濟推動小組設置要點
PDF
DIGI⁺ 數位政府
Social Innovation & Digital Transformation
Stories from the Future of Democracy
TEDxTaipei 2017: 社會企業
唐鳳政務委員業務工作報告
資訊服務採購契約範本 修正明細對照 1060713
服務型智慧政府推動計畫 v9
共通性應用程式介面規範
打造一站式的防救災資訊整合平臺
開放政府聯絡人第11次協作會議簡報
第7次協作會議會後會簡報v6.0
臨時動議:社會企業連繫會議分組
議程及歷次列管表
討論案一:中、南、東部在地社企會談規劃情形
報告案四之一:創櫃板協助社會企業籌資之推動現況
報告案四之二:國發基金運用資金協助社會發展辦理方式
報告案二:組團參加2017年社會企業世界論壇辦理進度報告
報告案三 :SEWF申辦2019進度說明
2017-06-17 臺灣網路治理論壇
行政院數位國家創新經濟推動小組設置要點
DIGI⁺ 數位政府
Ad

Recently uploaded (20)

PDF
Build a system with the filesystem maintained by OSTree @ COSCUP 2025
PDF
Unlocking AI with Model Context Protocol (MCP)
PPT
Teaching material agriculture food technology
PPTX
SOPHOS-XG Firewall Administrator PPT.pptx
PDF
MIND Revenue Release Quarter 2 2025 Press Release
PDF
Agricultural_Statistics_at_a_Glance_2022_0.pdf
PDF
The Rise and Fall of 3GPP – Time for a Sabbatical?
PDF
NewMind AI Weekly Chronicles - August'25-Week II
PDF
Diabetes mellitus diagnosis method based random forest with bat algorithm
PPTX
Spectroscopy.pptx food analysis technology
PDF
Network Security Unit 5.pdf for BCA BBA.
PDF
Building Integrated photovoltaic BIPV_UPV.pdf
PDF
Dropbox Q2 2025 Financial Results & Investor Presentation
PDF
Encapsulation theory and applications.pdf
PPTX
Group 1 Presentation -Planning and Decision Making .pptx
PDF
A comparative analysis of optical character recognition models for extracting...
PDF
Machine learning based COVID-19 study performance prediction
PDF
Electronic commerce courselecture one. Pdf
PDF
Assigned Numbers - 2025 - Bluetooth® Document
PPTX
Machine Learning_overview_presentation.pptx
Build a system with the filesystem maintained by OSTree @ COSCUP 2025
Unlocking AI with Model Context Protocol (MCP)
Teaching material agriculture food technology
SOPHOS-XG Firewall Administrator PPT.pptx
MIND Revenue Release Quarter 2 2025 Press Release
Agricultural_Statistics_at_a_Glance_2022_0.pdf
The Rise and Fall of 3GPP – Time for a Sabbatical?
NewMind AI Weekly Chronicles - August'25-Week II
Diabetes mellitus diagnosis method based random forest with bat algorithm
Spectroscopy.pptx food analysis technology
Network Security Unit 5.pdf for BCA BBA.
Building Integrated photovoltaic BIPV_UPV.pdf
Dropbox Q2 2025 Financial Results & Investor Presentation
Encapsulation theory and applications.pdf
Group 1 Presentation -Planning and Decision Making .pptx
A comparative analysis of optical character recognition models for extracting...
Machine learning based COVID-19 study performance prediction
Electronic commerce courselecture one. Pdf
Assigned Numbers - 2025 - Bluetooth® Document
Machine Learning_overview_presentation.pptx

EtherCalc: Multiplayer Spreadsheet