SlideShare una empresa de Scribd logo
1 de 251
Descargar para leer sin conexión
EtherCalc
多人即時
協作試算表
ethercalc.tw
僅代表個人立場
僅代表個人立場




(但難免會有業配)
限於時間
只講故事
不講程式
限於時間
  概念
只講故事
不講程式
ethercalc.org

‣ npm install -g ethercalc

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


              nodejs.org/#download
⟪開源應用架構⟫


aosabook.org


 aosa.tw
緣起
VisiCalc, 1979




Dan Bricklin
哈佛商學院, 1977
哈佛商學院, 1977
哈佛商學院, 1977
哈佛商學院, 1977
哈佛商學院, 1977
最初的願景
最初的願景




 Alto 工作站
最初的願景




         Alto 工作站
滑鼠計算機
最初的願景




         Alto 工作站
滑鼠計算機               頭戴顯示器
最初的願景




         Alto 工作站
滑鼠計算機               頭戴顯示器
=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 持續用 BASIC 寫原型



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

     2   =SUM(A1,B1,C1)   60
‣ Dan 持續用 BASIC 寫原型
‣ Bob 以組合語言做出成品


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

     2   =SUM(A1,B1,C1)   60
‣ Dan 持續用 BASIC 寫原型
‣ Bob 以組合語言做出成品
‣ 六年內售出 700,000 套
                          Bob & Dan
1978 → 1979
         A     B     C    D
     1   10    20    30

     2   =SUM(A1,B1,C1)   60
‣ Dan 持續用 BASIC 寫原型
‣ Bob 以組合語言做出成品
‣ 六年內售出 700,000 套
‣ 「殺手級應用」的始祖              Bob & Dan
1981
二十年來
二十年來
二十年來
二十年來
二十年來


  始終如一
“打不開”
“打不開”
“變亂碼”
“打不開”
“變亂碼”
“有病毒!”
維基百科, 2001
維基百科, 2001
維基百科, 2001
wikiCalc, 2005
wikiCalc, 2005
✓ 支援純文字、HTML、Wiki 語法。
wikiCalc, 2005
✓ 支援純文字、HTML、Wiki 語法。
✓ 引用其他伺服器上的數值。
wikiCalc, 2005
✓ 支援純文字、HTML、Wiki 語法。
✓ 引用其他伺服器上的數值。
✓ 記錄所有編輯操作,以供稽核紀錄。
wikiCalc, 2005
✓ 支援純文字、HTML、Wiki 語法。
✓ 引用其他伺服器上的數值。
✓ 記錄所有編輯操作,以供稽核紀錄。
✓ 保留每個版本,可隨時回復 。
wikiCalc, 2005
✓ 支援純文字、HTML、Wiki 語法。
✓ 引用其他伺服器上的數值。
✓ 記錄所有編輯操作,以供稽核紀錄。
✓ 保留每個版本,可隨時回復 。
✓ 開放源碼!(GPLv2)。
wikiCalc.pl
wikiCalc.pl
       網站
./wkcdata/sites/Foo
 ./wkcdata/sites/Bar
  ./wkcdata/sites/Baz
wikiCalc.pl
       網站               頁面
./wkcdata/sites/Foo
                        XXX
 ./wkcdata/sites/Bar
  ./wkcdata/sites/Baz   YYY
                        ZZZ
wikiCalc.pl
       網站               頁面
./wkcdata/sites/Foo
                        XXX
 ./wkcdata/sites/Bar
  ./wkcdata/sites/Baz   YYY
                        ZZZ


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


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


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


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


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


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


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


               儲存格
    A1: 100 B1: =XXX!C1
    A2: =A1*2 B2: =YYY!D2
                            跨頁引用
wikiCalc 編輯流程
wikiCalc 編輯流程
   A1: 100
   A2: =A1*2
wikiCalc 編輯流程
   A1: 100
   A2: =A1*2
wikiCalc 編輯流程
     A1: 100
     A2: =A1*2


  POST /
  ajaxsetcell=host:page:A1:300
                                 wikicalc.pl
wikiCalc 編輯流程
     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>
“載入中…”
“載入中…”
“載入中…”




“C100k” 問題
“載入中…”




“C100k” 問題
打掉重練
打掉重練
SocialCalc, 2006



Dan Bricklin   Ross Mayfield
設計目標
設計目標
‣ 用 Javascript 重寫計算引擎。
設計目標
‣ 用 Javascript 重寫計算引擎。
‣ 進行編輯操作時提供快速回應。
設計目標
‣ 用 Javascript 重寫計算引擎。
‣ 進行編輯操作時提供快速回應。
‣ 同時處理十萬個儲存格的能力。
設計目標
‣ 用 Javascript 重寫計算引擎。
‣ 進行編輯操作時提供快速回應。
‣ 同時處理十萬個儲存格的能力。
‣ 加強對各種不同瀏覽器的支援。
設計目標
‣ 用 Javascript 重寫計算引擎。
‣ 進行編輯操作時提供快速回應。
‣ 同時處理十萬個儲存格的能力。
‣ 加強對各種不同瀏覽器的支援。
‣ 客戶端稽核紀錄及還原/重作功能。
系統架構
系統架構
SocialCalc.js




HTTP Server
系統架構
      SocialCalc.js


GET



      HTTP Server
系統架構
      SocialCalc.js


GET



      HTTP Server
系統架構
   SocialCalc.js


GET GET



   HTTP Server
系統架構
   SocialCalc.js


GET GET
    ($)



   HTTP Server
系統架構
   SocialCalc.js

               PUT
GET GET
    ($)



   HTTP Server
系統架構
   SocialCalc.js

               PUT
GET GET
    ($)



   HTTP Server
指令設計模式
指令設計模式
set A1 value n 42
指令設計模式
set A1 value n 42
set A2 formula A1*2
指令設計模式
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
...
指令設計模式
set A1 value n 42
set A2 formula A1*2
‣ 異步處理背景計算。
指令設計模式
set A1 value n 42
set A2 formula A1*2
‣ 異步處理背景計算。
‣ 僅需重繪可視區域。
指令設計模式
set A1 value n 42
set A2 formula A1*2
‣ 異步處理背景計算。
‣ 僅需重繪可視區域。
‣ 還原重做次數不限。
指令設計模式
set A1 value n 42
set A2 formula A1*2
‣ 異步處理背景計算。
‣ 僅需重繪可視區域。
‣ 還原重做次數不限。
‣ 鍵盤滑鼠隨時可用!
指令設計模式
set A1 value n 42
set A2 formula A1*2
‣ 異步處理背景計算。
‣ 僅需重繪可視區域。
‣ 還原重做次數不限。
‣ 鍵盤滑鼠隨時可用!
“社會化” 試算表
“社會化” 試算表
“社會化” 試算表




 評論、按讚、推薦、
    標記、分享、嵌入...
社會物件   人際連結
社會物件   人際連結
社會物件   人際連結
工
CPAL 通用公共授權
CPAL 通用公共授權
  ㊔
BSD, MIT
CPAL 通用公共授權
              ©
  ㊔
BSD, MIT   LGPL, MPL
CPAL 通用公共授權
              ©        ++©
  ㊔
BSD, MIT   LGPL, MPL   GPL
CPAL 通用公共授權
              ©                                         ++©
  ㊔
BSD, MIT   LGPL, MPL                                    GPL
               “ASP
     ”
CPAL 通用公共授權
              ©                                          ++©
  ㊔
BSD, MIT   LGPL, MPL                                      GPL
               “ASP
       ”
                                                        Affero GPL
CPAL 通用公共授權
              ©                                          ++©
  ㊔
BSD, MIT   LGPL, MPL                                      GPL
               “ASP
       ”

             CPAL                                       Affero GPL
CPAL 通用公共授權
              ©                                          ++©
  ㊔
BSD, MIT   LGPL, MPL                                      GPL
               “ASP
       ”

             CPAL                                       Affero GPL
CPAL 通用公共授權
              ©                                          ++©
  ㊔
BSD, MIT   LGPL, MPL                                      GPL
               “ASP
       ”

             CPAL                                       Affero GPL
CPAL 通用公共授權
              ©                                          ++©
  ㊔
BSD, MIT   LGPL, MPL                                      GPL
               “ASP
       ”

             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
Mesh
網絡
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                      網絡廣播




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

              set A1 value n 42               XoCom.py

                                            D-Bus + Telepathy
                               OLPC Mesh
Manusheel
  Gupta                          網絡廣播
                    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                          網絡廣播
                    D-Bus + Telepathy


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

                         XoCom.py
Vijit Singh        SocialCalcActivity.py
很讚,但是...
很讚,但是...
‣ 必須同時開啟試算表。
很讚,但是...
‣ 必須同時開啟試算表。
‣ 漏接訊息時無法復原。
很讚,但是...
‣ 必須同時開啟試算表。
‣ 漏接訊息時無法復原。
‣ 編輯同一格時會衝突。
很讚,但是...
‣ 必須同時開啟試算表。
‣ 漏接訊息時無法復原。
‣ 編輯同一格時會衝突。
‣ 只能在 OLPC 上運行!
YAPC::Tiny, 2009


     跳格
  Multiplayer
  SocialCalc
           二零零九 唐鳳
                字
           中英雙宇有字版
EV: 事件驅動
Tatsumaki    EV: 事件驅動




 @miyagawa
Tatsumaki  EV: 事件驅動
        Web::Hippie




 @miyagawa   @clkao
Tatsumaki  EV: 事件驅動
        Web::Hippie
                 Feersum



 @miyagawa   @clkao   @stash
WebSocket 同步編輯
     multiserver.pl

      Web::Hippie
         Plack
        Feersum
        EV/libev
WebSocket 同步編輯
  SpreadsheetControl
                        multiserver.pl

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

                             Web::Hippie
ScheduleScheetCommand
 set A1 value n 2046            Plack
   RenderSheet
                       傳送      Feersum
                               EV/libev
WebSocket 同步編輯
  SpreadsheetControl
                            multiserver.pl


ScheduleScheetCommand
                             Web::Hippie     群播
 set A1 value n 2046            Plack
   RenderSheet
                       傳送      Feersum
                               EV/libev
WebSocket 同步編輯
  SpreadsheetControl
                            multiserver.pl


ScheduleScheetCommand
                             Web::Hippie     群播
 set A1 value n 2046            Plack
                                             ScheduleScheetCommand
   RenderSheet
                       傳送      Feersum
                               EV/libev
                                               set A1 value n 2046
                                                 (isRemote = true)

                                                   RenderSheet
新增功能
新增功能
✓ 加入時取得目前狀態。
新增功能
✓ 加入時取得目前狀態。
✓ 斷線重連時可以復原。
新增功能
✓ 加入時取得目前狀態。
✓ 斷線重連時可以復原。
✓ 顯示別人的游標位置。
新增功能
✓ 加入時取得目前狀態。
✓ 斷線重連時可以復原。
✓ 顯示別人的游標位置。
✓ 可以在各平台上運行!
新增功能
✓ 加入時取得目前狀態。
✓ 斷線重連時可以復原。
✓ 顯示別人的游標位置。
✓ 可以在各平台上運行!
更讚了,但是...
更讚了,但是...
‣ 要相信誰的目前狀態?
更讚了,但是...
‣ 要相信誰的目前狀態?
‣ 所有人離線: 資料消失?
更讚了,但是...
‣ 要相信誰的目前狀態?
‣ 所有人離線: 資料消失?
‣ 一定要有人負責按儲存?
更讚了,但是...
‣ 要相信誰的目前狀態?
‣ 所有人離線: 資料消失?
‣ 一定要有人負責按儲存?
‣ 重新連接: 回播所有指令?
更讚了,但是...
‣ 要相信誰的目前狀態?
‣ 所有人離線: 資料消失?
‣ 一定要有人負責按儲存?
‣ 重新連接: 回播所有指令?
打掉重練
打掉重練
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.”

      劣即是夯
JavaScript: 缺點減少
JavaScript: 缺點減少
 CoffeeScript: 標點減半
  cs = (js) = js/2


 Jeremy
Ashkenas
JavaScript: 缺點減少
 CoffeeScript: 標點減半
  cs = (js) = js/2


 Jeremy
Ashkenas
JavaScript: 缺點減少
 CoffeeScript: 標點減半
  cs = (js) = js/2

           “原 JavaScript 行數: 22k。
            重寫過的 CoffeeScript 行數: 5k。
            {async, jsdom, zappa, optimist etc}++”
 Jeremy
Ashkenas
{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
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: Node.js 懶人包




         zappajs.org
Zappa: Node.js 懶人包



Maurice
Machado

          zappajs.org
Zappa: 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 系統架構
EtherCalc 系統架構
      main.coffee
 sc.coffee
                Socket.io
SocialCalc.js
                Express
                Node.js
 db.coffee       EV/libuv
  redis.js       Zappa
EtherCalc 系統架構
      main.coffee
 sc.coffee
                Socket.io
SocialCalc.js
                Express
                Node.js
 db.coffee       EV/libuv
  redis.js       Zappa



  Redis
(optional)
EtherCalc 系統架構
      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 系統架構
      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 系統架構
      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 系統架構
      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 系統架構
      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 系統架構
      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
跨頁即時更新
跨頁即時更新

伺
服
端
跨頁即時更新

伺            客
服            戶
端            端
跨頁即時更新
      ask.log: Foo


伺                    客
服                    戶
端                    端
跨頁即時更新
               ask.log: Foo


伺   log: Foo,snapshot,log
                              客
服                             戶
端                             端
跨頁即時更新
               ask.log: Foo


伺   log: Foo,snapshot,log
                              客
            execute: set A1
服            formula Bar!B2
                              戶
端                             端
跨頁即時更新
               ask.log: Foo


伺   log: Foo,snapshot,log
                              客
            execute: set A1
服            formula Bar!B2
            ask.recalc: Bar
                              戶
端                             端
跨頁即時更新
               ask.log: Foo


伺   log: Foo,snapshot,log
                              客
            execute: set A1
服            formula Bar!B2
            ask.recalc: Bar
                              戶
端   recalc: Bar,snapshot      端
跨頁即時更新
               ask.log: Foo


伺   log: Foo,snapshot,log
                              客
            execute: set A1
服            formula Bar!B2
            ask.recalc: Bar
                              戶
端   recalc: Bar,snapshot      端
    recalc: Bar,snapshot
PaaS 遠端建置
PaaS 遠端建置
      stackato.yml
      app.js
PaaS 遠端建置
      stackato.yml
      app.js

      dotcloud.yml
      server.js
PaaS 遠端建置
      stackato.yml
      app.js

      dotcloud.yml
      server.js

      server.js

Más contenido relacionado

La actualidad más candente

Anti-Aliasing Methods in CryENGINE 3
Anti-Aliasing Methods in CryENGINE 3Anti-Aliasing Methods in CryENGINE 3
Anti-Aliasing Methods in CryENGINE 3
Tiago Sousa
 

La actualidad más candente (20)

ある工場のRedmine画面カスタム【View customize plugin 活用例】
ある工場のRedmine画面カスタム【View customize plugin 活用例】ある工場のRedmine画面カスタム【View customize plugin 活用例】
ある工場のRedmine画面カスタム【View customize plugin 活用例】
 
Photon Webhooks & IPv6対応の最新情報
Photon Webhooks & IPv6対応の最新情報Photon Webhooks & IPv6対応の最新情報
Photon Webhooks & IPv6対応の最新情報
 
【16-E-4】残業ゼロで開発スピードが10倍に!もう元の開発体制には戻れないデンソー流のアジャイル開発
【16-E-4】残業ゼロで開発スピードが10倍に!もう元の開発体制には戻れないデンソー流のアジャイル開発【16-E-4】残業ゼロで開発スピードが10倍に!もう元の開発体制には戻れないデンソー流のアジャイル開発
【16-E-4】残業ゼロで開発スピードが10倍に!もう元の開発体制には戻れないデンソー流のアジャイル開発
 
DiI/DIコンテナを一から学んでみた
DiI/DIコンテナを一から学んでみたDiI/DIコンテナを一から学んでみた
DiI/DIコンテナを一から学んでみた
 
ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方
 
Physically Based Sky, Atmosphere and Cloud Rendering in Frostbite
Physically Based Sky, Atmosphere and Cloud Rendering in FrostbitePhysically Based Sky, Atmosphere and Cloud Rendering in Frostbite
Physically Based Sky, Atmosphere and Cloud Rendering in Frostbite
 
Anti-Aliasing Methods in CryENGINE 3
Anti-Aliasing Methods in CryENGINE 3Anti-Aliasing Methods in CryENGINE 3
Anti-Aliasing Methods in CryENGINE 3
 
ダークネットのはなし #ssmjp
ダークネットのはなし #ssmjpダークネットのはなし #ssmjp
ダークネットのはなし #ssmjp
 
最近の単体テスト
最近の単体テスト最近の単体テスト
最近の単体テスト
 
インターネッツの繋がるしくみ(DNS編) #sa_study
インターネッツの繋がるしくみ(DNS編) #sa_studyインターネッツの繋がるしくみ(DNS編) #sa_study
インターネッツの繋がるしくみ(DNS編) #sa_study
 
hooks riverpod + state notifier + freezed でのドメイン駆動設計
hooks riverpod + state notifier + freezed でのドメイン駆動設計hooks riverpod + state notifier + freezed でのドメイン駆動設計
hooks riverpod + state notifier + freezed でのドメイン駆動設計
 
Duel of Two Libraries: Cairo & Skia
Duel of Two Libraries: Cairo & SkiaDuel of Two Libraries: Cairo & Skia
Duel of Two Libraries: Cairo & Skia
 
ATSC 3.0, MMT, Multicast
ATSC 3.0, MMT, MulticastATSC 3.0, MMT, Multicast
ATSC 3.0, MMT, Multicast
 
2018/1/30 Django勉強会
2018/1/30 Django勉強会2018/1/30 Django勉強会
2018/1/30 Django勉強会
 
データで散らかった製造業界における最高の翻訳機 Node-RED
データで散らかった製造業界における最高の翻訳機 Node-REDデータで散らかった製造業界における最高の翻訳機 Node-RED
データで散らかった製造業界における最高の翻訳機 Node-RED
 
View Customize Pluginで出来ること
View Customize Pluginで出来ることView Customize Pluginで出来ること
View Customize Pluginで出来ること
 
きつねさんでもわかるLLVM読書会amagasaki.rb第5章
きつねさんでもわかるLLVM読書会amagasaki.rb第5章きつねさんでもわかるLLVM読書会amagasaki.rb第5章
きつねさんでもわかるLLVM読書会amagasaki.rb第5章
 
Firefoxの倒し方 by 西村 宗晃 (にしむねあ)
Firefoxの倒し方 by 西村 宗晃 (にしむねあ)Firefoxの倒し方 by 西村 宗晃 (にしむねあ)
Firefoxの倒し方 by 西村 宗晃 (にしむねあ)
 
Unpack mechanism of the msgpack-c
Unpack mechanism of the msgpack-cUnpack mechanism of the msgpack-c
Unpack mechanism of the msgpack-c
 
ある工場の Redmine 2017
ある工場の Redmine 2017ある工場の Redmine 2017
ある工場の Redmine 2017
 

Destacado

深度訪談與案例演練
深度訪談與案例演練深度訪談與案例演練
深度訪談與案例演練
Te-Ying Teng
 
訪談技巧大公開
訪談技巧大公開訪談技巧大公開
訪談技巧大公開
HSU EATING
 
學「問」好問題-ORID
學「問」好問題-ORID學「問」好問題-ORID
學「問」好問題-ORID
Steven Tseng
 
如何編制訪談大綱
如何編制訪談大綱如何編制訪談大綱
如何編制訪談大綱
輝 哲
 

Destacado (17)

行政院會簡報 國發會 虛擬世界(m)
行政院會簡報 國發會 虛擬世界(m)行政院會簡報 國發會 虛擬世界(m)
行政院會簡報 國發會 虛擬世界(m)
 
2017-02-21 政府資料如何再加值
2017-02-21 政府資料如何再加值2017-02-21 政府資料如何再加值
2017-02-21 政府資料如何再加值
 
Socialtext 5.0 Feature Overview
Socialtext 5.0 Feature OverviewSocialtext 5.0 Feature Overview
Socialtext 5.0 Feature Overview
 
萌典:開源協作改造社會
萌典:開源協作改造社會萌典:開源協作改造社會
萌典:開源協作改造社會
 
網實整合下的多利益關係方諮詢機制
網實整合下的多利益關係方諮詢機制網實整合下的多利益關係方諮詢機制
網實整合下的多利益關係方諮詢機制
 
0th Sunflower Digital Camp
0th Sunflower Digital Camp0th Sunflower Digital Camp
0th Sunflower Digital Camp
 
First Year of g0v
First Year of g0vFirst Year of g0v
First Year of g0v
 
2016.05.30 菜單討拍拍 設計概念 台科大
2016.05.30 菜單討拍拍 設計概念 台科大2016.05.30 菜單討拍拍 設計概念 台科大
2016.05.30 菜單討拍拍 設計概念 台科大
 
深度訪談與案例演練
深度訪談與案例演練深度訪談與案例演練
深度訪談與案例演練
 
雲端產品的用戶體驗檢測重要性與作法
雲端產品的用戶體驗檢測重要性與作法雲端產品的用戶體驗檢測重要性與作法
雲端產品的用戶體驗檢測重要性與作法
 
訪談技巧大公開
訪談技巧大公開訪談技巧大公開
訪談技巧大公開
 
服務設計中的精實思維 (簡中版)
服務設計中的精實思維 (簡中版)服務設計中的精實思維 (簡中版)
服務設計中的精實思維 (簡中版)
 
學「問」好問題-ORID
學「問」好問題-ORID學「問」好問題-ORID
學「問」好問題-ORID
 
Design thinking - 搞懂需求和洞見的差異 (Need & Insight)
Design thinking - 搞懂需求和洞見的差異 (Need & Insight)Design thinking - 搞懂需求和洞見的差異 (Need & Insight)
Design thinking - 搞懂需求和洞見的差異 (Need & Insight)
 
User experience service design innovation for real world
User experience service design innovation for real worldUser experience service design innovation for real world
User experience service design innovation for real world
 
如何編制訪談大綱
如何編制訪談大綱如何編制訪談大綱
如何編制訪談大綱
 
2017-03-06 開放政府 PO 月會
2017-03-06 開放政府 PO 月會2017-03-06 開放政府 PO 月會
2017-03-06 開放政府 PO 月會
 

Más de Audrey Tang

TEDxTaipei 2017: 社會企業
TEDxTaipei 2017: 社會企業TEDxTaipei 2017: 社會企業
TEDxTaipei 2017: 社會企業
Audrey Tang
 
唐鳳政務委員業務工作報告
唐鳳政務委員業務工作報告唐鳳政務委員業務工作報告
唐鳳政務委員業務工作報告
Audrey Tang
 
共通性應用程式介面規範
共通性應用程式介面規範共通性應用程式介面規範
共通性應用程式介面規範
Audrey Tang
 

Más de Audrey Tang (20)

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

EtherCalc: 多人即時
協作試算表

Notas del editor

  1. \n
  2. \n
  3. \n
  4. \n
  5. \n
  6. \n
  7. \n
  8. \n
  9. \n
  10. \n
  11. \n
  12. \n
  13. \n
  14. \n
  15. \n
  16. \n
  17. \n
  18. \n
  19. \n
  20. \n
  21. \n
  22. \n
  23. \n
  24. \n
  25. \n
  26. \n
  27. \n
  28. \n
  29. \n
  30. \n
  31. \n
  32. \n
  33. \n
  34. \n
  35. \n
  36. \n
  37. \n
  38. \n
  39. \n
  40. \n
  41. \n
  42. \n
  43. \n
  44. \n
  45. \n
  46. \n
  47. \n
  48. \n
  49. \n
  50. \n
  51. \n
  52. \n
  53. \n
  54. \n
  55. \n
  56. \n
  57. \n
  58. \n
  59. \n
  60. \n
  61. \n
  62. \n
  63. \n
  64. \n
  65. \n
  66. \n
  67. \n
  68. \n
  69. \n
  70. \n
  71. \n
  72. \n
  73. \n
  74. \n
  75. \n
  76. \n
  77. \n
  78. \n
  79. \n
  80. \n
  81. \n
  82. \n
  83. \n
  84. \n
  85. \n
  86. \n
  87. \n
  88. \n
  89. \n
  90. \n
  91. \n
  92. \n
  93. \n
  94. \n
  95. \n
  96. \n
  97. \n
  98. \n
  99. \n
  100. \n
  101. \n
  102. \n
  103. \n
  104. \n
  105. \n
  106. \n
  107. \n
  108. \n
  109. \n
  110. \n
  111. \n
  112. \n
  113. \n
  114. \n
  115. \n
  116. \n
  117. \n
  118. \n
  119. \n
  120. \n
  121. \n
  122. \n
  123. \n
  124. \n
  125. \n
  126. \n
  127. \n
  128. \n
  129. \n
  130. \n
  131. \n
  132. \n
  133. \n
  134. \n
  135. \n
  136. \n
  137. \n
  138. \n
  139. \n
  140. \n
  141. \n
  142. \n
  143. \n
  144. \n
  145. \n
  146. \n
  147. \n
  148. \n
  149. \n
  150. \n
  151. \n
  152. \n
  153. \n
  154. \n
  155. \n
  156. \n
  157. \n
  158. \n
  159. \n
  160. \n
  161. \n
  162. \n
  163. \n
  164. \n
  165. \n
  166. \n
  167. \n
  168. \n
  169. \n
  170. \n
  171. \n
  172. \n
  173. \n
  174. \n
  175. \n
  176. \n
  177. \n
  178. \n
  179. \n
  180. \n
  181. \n
  182. \n
  183. \n
  184. \n
  185. \n
  186. \n
  187. \n
  188. \n
  189. \n
  190. \n
  191. \n
  192. \n
  193. \n
  194. \n
  195. \n
  196. \n
  197. \n
  198. \n
  199. \n
  200. \n
  201. \n
  202. \n
  203. \n
  204. \n
  205. \n
  206. \n
  207. \n
  208. \n
  209. \n
  210. \n
  211. \n
  212. \n
  213. \n
  214. \n
  215. \n
  216. \n
  217. \n
  218. \n
  219. \n
  220. \n
  221. \n
  222. \n
  223. \n
  224. \n
  225. \n
  226. \n
  227. \n
  228. \n
  229. \n
  230. \n
  231. \n
  232. \n
  233. \n
  234. \n
  235. \n
  236. \n
  237. \n
  238. \n
  239. \n
  240. \n
  241. \n
  242. \n