一、協作時代的數位保存

數位時代的人際互動,經常在網路線上 (online) 進行,例如透過電子郵件或是即時通訊服務,用以傳遞接收個人以及群組訊息。許多共用的數位資源,更是以協力的方式,經由線上平台來建置與維護。維基百科就是一個最好的例子。維基百科是由眾人出力共同編寫的線上知識資源庫,涵蓋不同語言、各類詞目的圖文解說。維基百科是個平台 (platform),提供詞條編目與內容編寫的服務 (services) 供眾人使用,這平台當然也提供詞條內容的呈現與保存。維基百科以及其姊妹專案由非營利的維基媒體基金會所執行,該基金會並致力於所屬網站服務的永續營運。

相較於維基百科所提供的穩定與持續的資訊服務,許多線上平台其實並不確保其服務的品質。許多免付費的資訊服務,若細讀其使用條款 (Terms of Use),其實可發現平台的經營者並不擔保其服務的項目與品質保持不變。平台所提供的服務可能完全終止(例如,經營的公司解散或被併購)。過去常有網誌平台倒閉或更改服務型態,導致平台上眾多部落客 (blogger) 出走的情形。內容的轉移與保存,這時便成為議題。對各自的網誌進行內容保存和移轉,對於許多部落客來說,已經夠麻煩了;整個平台的群聚氛圍,更難在別處回復。依存於平台的網誌頁面,在連結失效後,內容也隨之消散,這對許多使用者、典藏者、以及研究者,都是困擾。

透過資訊服務平台的中介,眾人得以規劃組織活動,建置共用資源,這已是常態。免付費協作平台 (collaborative platform) 所提供服務的穩定性與持續性,因此受到眾人關心。協作平台上的內容呈現與保存,決定在平台的經營者而不是協作者。透過平台建置的共用資源,例如協作文件,在保存和移轉所面臨的困難,比起相對單純的網誌平台,情形也複雜許多。這些問題包括:協作者群體可否順利遷移;協作資源在格式、內容、脈落上能否無失真地移植與重現;新協作平台的設立與營運;以及著作權利、個人資料的相關法律議題等。

本研究關注協作平台上的內容保存,尤其是當代事件參與者透過這些平台,在事件開展同時所共創的數位資源。這些資源可包括:共筆文件、文播檔案、資源表列、連結彙集、通訊群組等。在事件發生當時,眾人選擇當下通行適用的平台,進行組織與協作,至於平台的永續性以及協作內容的保存,通常不會是重點。本文以 2014 年 318 事件(太陽花公民運動)參與者當時所協力建置的數位資源為例,嘗試進行平台內容的長遠保存工作。本文以此基礎分享經驗,祈望引發更多的討論。

我們認為資訊平台上協作文件的保存議題,在許多方面並未脫離原生數位 (born digital) 內容在長久保存的範疇。數位內容的保存包括以下四個層面:內容資料、編著工具、執行系統、依存環境。內容資料,是關於內容文本的資訊擷取,並可作內容的再次使用,例如,影音檔案的訊號剪輯轉錄。編著工具,意指可對該內容進行無失真、原格式編修的應用程式,例如,用以編輯文件的文書軟體。執行系統、是關於內容在呈現編輯上所需要的軟硬體系統,例如,作業系統以及運算存儲設備等。依存環境,是關於操作執行資料、工具、系統的外在環境,以及伴隨的技能、知識與資源,例如,軟硬體系統的維修能力、程式執行時所依附的網路環境、以及保存機構的永續性等。

我們想強調,在內容資料、編著工具、執行系統、依存環境這四方面,以開放、自由、參與為基礎的作法,將會是確保數位內容得以長久保存的關鍵。內容資料若採用開放格式,編著工具就能有多種來源選擇。而編著工具若是用開放源碼方式來發展釋出,將這些工具翻新移植到不同的執行系統,也就不成問題。作業系統、硬體設備若不是來自獨家業者供應,內容與工具的保存者就可尋求替代方案。最後,數位內容的依存環境複雜,有廣大的參與群體,才能有基礎發展永續保存的策略。我們可以用這四層面檢視維基百科的成功。在內容資料方面,維基百科詞條內容採用維基語法編寫,並轉為超文件標示語言 (HTML) 呈現,兩種都是開放格式;內容而且使用「創用 CC 姓名標示-相同方式分享」 (CC BY-SA) 開放授權條款釋出,方便眾人再次使用。編著詞條內容的工具 MediaWiki,係採用開放源碼方式開發釋出。提供維基百科服務的系統軟硬體設施,也不依附特定廠商的產品或技術。整個網站的營運維持,並由有廣大使用者為基礎的維基媒體基金會來監督管理。就協作內容的永續經營與保存,維基百科可說是最好的典範。

二、數位保存:以318太陽花公民運動的協作文件為例

依數位內容永續保存的策略,我們將2014年台灣的318太陽花公民運動 ( 以下簡稱 318事件) 為例,進行實作保存。 318事件有別於過往的社會運動,大量的運用網路科技在現場不間斷的提供直播、文字、演講、資源調派等資訊播送於全世界,因此衍生出多樣化的數位類型及網路平台交互運用的樣態。當中的實體文物已由國立臺灣歷史博物館所保存了,然而銜接整個活動命脈於網路平台上的協作紀錄,該如何保存呢?

1、目標及保存範圍

面對同等於實體文物一樣重要的數位資料,我們著重於此次運動主要的文件協作平台Hackpad (http://318.hackpad.com) 及資料匯整平台Hackfoldr (http://g0v.today),此兩個平台在318運動期間宛如資料統籌中心,最高記錄協調近1500名志工[1],裡頭更是詳實記錄著人員、資源的調配及活動記錄等等,由於兩套系統皆建立於開放原始碼的架構下,可自行下載安裝使用,除了資料庫、程式碼之外,保持一致的網站連結亦是保存的重點。對這兩套資訊系統上的內容,我們將採取離線的模式盡可能的封存住當時的狀態,以供未來探討。

2、保存方法

保存的階層約可劃分為三(如下圖 1):一、執行環境;二、Hackpad & Hackfoldr 程式;與三、儲存內容。以下將就分別將兩套平台,依此三階層分別進行討論。具體的保存與再現流程請參考附錄。 ckan main screenshot
圖 1 保存階層

需要先聲明的是,關於承載這兩套資訊系統的執行環境,因著資訊科技的發展日新月異,我們若採用當時的執行環境當底層,可將無法確保資料的安全及維護性,因此在執行環境的選擇上,包含作業系統及虛擬化技術,我們將一致採用開放原始碼架構的虛擬化技術(Kernel-based Virtual Machine, KVM)建置執行環境,作業系統則選擇穩定性及維護性較佳的Ubuntu 16.04.4 LTS為主。

在我們重建系統的程過中,並非一路順遂。從資料庫內容的取得,系統環境版本安裝的些微差異性都可使重製過程失敗,當然每一次的案例背景環境的不同,安裝過程亦有不少差異,以下我們將著詳實解說重製過程,以提供未來數位平台保存的參照。

a) Hackfoldr

Hackfoldr 由台灣黑客社群「g0v.tw 台灣零時政府」(下稱 g0v)開發之網頁程式,主要功能係將散落於各處的連結,以類似資料夾(folder) 的形式匯集於單一頁面,這些連結包含各式網路服務,如 Google 文件、試算表、簡報、Hackpad [2]、irc 等。Hackfoldr 專案,是 g0v 共同發起人高嘉良(網路代號 clkao)為因應 g0v 黑客松活動時大量且頻繁的跨服務與群眾協作需求而開發 [3]。程式首先會引導使用者於 EtherCalc [4] 建立一新試算表文件作為連結的彙整處,試算表的每列記載使用網路服務所建立內容的「名稱」與「網址」,由 Hackfoldr 依序讀取後,以目錄列表方式顯示於左側(如下圖 2),點選列表項目後,即會顯示該項目之內容於右側。詳細使用方式詳見附錄一。

ckan main screenshot
圖 2 Hackfoldr 畫面(目前 g0v.today 版本)

在 318 事件期間,以 Hackfoldr 建立的 g0v.today 網站 [5] 服務統整包括圖文影音直播、人力物資募集清單而密集被公民團體使用,亦為本次嘗試保存的資訊服務平台之一。然而,於撰文此時(2018 年 4 月),g0v.today 內容已被改為「抗議馬政府草率申請加入亞投銀」(亦請見上圖 2),而非 318 時期之內容。故本次的保存實驗,我們希望可在未連接網際網路的狀態下,以瀏覽器連結 g0v.today 網址(http://g0v.today/),呈現該服務於 318 運動期間的樣貌。此外,http://hackfoldr.org/congressoccupied/ 亦保有原 318 時期的 g0v.today 內容,我們將以此作為檢驗保存完整性之依據。

i. 執行環境:

從 Hackfoldr 的部署 script 節錄(如下圖3)可知,程式預設會將安裝後建立的 HTML 與 JavaScript 網頁程式碼放置於 Git [6] 的 gh-pages 分支,並將此分支上傳至 GitHub [7] 以使用其網站託管功能。因為 GitHub 服務使用之執行環境未知,我們使用全新安裝的 Ubuntu Linux 16.04.4 LTS 桌面版本與 Git 2.7.4、Nginx 1.10.3 作為 Hackfoldr 的執行環境。

  (以上省略)
  : ${REPO:=git@github.com:g0v-today/hackfoldr}
(中間省略)
git clone $REPO --depth 1 -b gh-pages _public
(中間省略)
REV=`git describe --always`
(中間省略)
cd _public
git fetch --depth 1 origin master:master
git add -A .
echo "regen for $REV" | git commit-tree `git write-tree` -p `git rev-parse HEAD` -p $REV | xargs git reset --hard
git push origin gh-pages
(以下省略)

圖 3 Hackfoldr 部署 script(節錄)[8]

ii. Hackfoldr 程式:

Hackfoldr 以 CC0 開放原始碼,主要使用 Node.js 與 AngularJS 開發,故可安裝於包括 Linux、macOS、FreeBSD 與 Windows 在內的所有主流作業系統,安裝完畢後所生成之結果為 HTML 與 JavaScript 網頁內容,可直接部署於任意網頁伺服器並提供服務。在嘗試安裝 g0v.today 所使用的 Hackfoldr程式 [9] 至 Ubuntu 環境時,發現程式碼相較原版有所短少,需補上才能正確完成部署工作(詳見附錄二第 9 步驟)。我們同時將部分需維持網路連線的 Google 函式庫呼叫片段移除(同上,第 10 步驟)。此外,由於我們欲將 HTML 與 JavaScript 內容直接置於 Ubuntu 環境中,故將上傳 GitHub 相關的指令移除(同上,第 11 步驟)。上述三處修改僅牽涉程式本身邏輯,不影響儲存於 g0v.today 之內容(即三階層的第三層)。

ckan main screenshot
圖 4 於離線狀態下無法正常顯示之再現版本 g0v.today 網站

iii. 儲存內容:

g0v.today 所使用的 Hackfoldr 與原版 [10] 稍有不同,其將原本存放於 EtherCalc 的試算表文件,以 csv(comma-separated values,逗號分隔值)格式直接寫於程式變數之中(位於 app/app/controllers.ls)[11],本實驗未對該變數進行修改。

iv. 實驗結果:

下圖 5 將本實驗再現之 318 時期 g0v.today 服務與hackfoldr.org 備份之版本並陳,經初步檢視,兩者內容相同。然而,由於 Hackfoldr 儲存之文件連結(包含目錄旁的圖示)多為 Google 文件、Hackpad 等外部服務,而 Hackfoldr 並不儲存這些外部服務的內容,故仍需搭配外部服務的備份,才能以離線方式再現。此外,安裝過程中,包含從安裝作業系統套件、自 GitHub 下載 g0v.today 之 Hackfoldr 程式原始碼等操作仍需網路連線,若亦儲存上述套件於 Ubuntu 環境中,更能確保整個再現流程獲得完整保存。

ckan main screenshot
圖 5 再現之 318 時期 g0v.today(左)與 hackfoldr.org 備份之版本(右)

b) Hackpad

Hackpad 為一個簡易使用的網路共筆的協作平台,在318事件期間大量的使用此平台統籌協調資源,而於2014年時由Dropbox收購後於2015年以開放原始碼方式釋出於在Github專案管理平台,除了可自行下載安裝使用外,亦也因為系統服務轉換的關系,提供使用者將舊有資料轉移的橋接過程,使用者可下載易於重製或備份的可攜式資料格式,包含txt、md、html及SQL型式的檔案,因此我們在連絡318.hackpad.com的協作管理者[12]後,取得以CC0授權的SQL型式下載程式碼,開始安裝重製。

i. 執行環境:

由於Hackpad 在釋出原始碼的過程,有完整的安裝說明檔,因此懂一些資訊背景安裝程序的人,可較容易的安裝起來,我們依照安裝的步驟及需求,將系統安裝於Ubuntu 16.04的系統上。 從Hackpad 官方的安裝說明上來看,所需要的程式包含Sun Java JDK7 、Scala 2.11、MySQL,其中Scala 有指定安裝的版本,另外,需要額外安裝Java連MySQL的程式庫 - libmysql-java 。

ii. Hackpad 程式:

從github 專案開發平台上,下載一份Hackpad 程式碼後,依文件進行執行環境的建置,包含安裝Java JDK 7、Scala、MySQL,接著依執行環境的不同將設定檔 (exports.sh) 進行客製化調整,緊接著直接執行啟動建置程式 (build.sh),執行的程過中會有一些警告訊息,但尚不影響建置程式的程序,最後執行資料庫設定,完成後會安裝一個名為hackpad 的預設資料庫於MySQL中,內含54個資料表 (table)。最後,將網站預設設定檔更名並修改管理者信箱及網址,這邊的網址則設定為318.hackpad.com,為了呈現雖為離線樣貌,但網址盡量保持與當時線上一致的畫面,則需要將手動設定網址及IP對應,將本機預設網址(127.0.0.1) 指向318.hackpad.com。即可在離線的系統平台呈現我們想要的網址畫面。

iii. 儲存內容:

在整個318運動期間,除了318.hackpad.com 外,g0v.hackpad.com 亦有不少協調資訊,但在取得授權上及採集協調上,尚在努力中。以下我們就已取得授權的318.hackpad.com的SQL檔,進行分析與回復。在分析318.hackpad.com的SQL檔我們發現它只有27個資料表 ,與預設安裝完成的54個資料表差了一半,因此在反覆實驗後了解,必需要先安裝完成預設的54個資料表的資料庫後,再將318.hackpad.com的27 個資料表重疊覆蓋之後,再執行hackpad 的啟動程式 (bin/run.sh) 即可正常將我們要的內容顯示在畫面上,由於是完整匯入原有資料,包含共筆的歷史編輯記錄,同樣可以顯現。此外,考量個人資料保護的問題,我們將資料庫裡關於個人信箱的欄位 (email_signup、pro_accounts) 給予去識別化處理。

iv. 實驗結果:

完成程式及內容的佈署之後,可在終端機 (Terminal) 執行本地端啟動程式 (bin/run.sh),並於瀏覽器上輸入http://318.hackpad.com:9000則會出現以下圖6畫面。

ckan main screenshot
圖6 再現之318.hackpad.com

啟動執行後,即可查看到318.hackpad.com的完整內容,但除了一些因為使用第三方服務 (如Google 、Facebook) 註冊的使用者頭像無法取得外,使用者編輯該頁面所會顯示的名稱、頭像、以及歷史記錄都已保存,算是已經達到離線呈現的狀態。

若需查看編修記錄,則需要一組登入的帳號,可直接在離線端系統透過註冊程序建立新帳號,只是E-Mail認證需要透過URL執行,認證的URL 於執行啟動程式的終端機會顯示包含認證金鑰(Token key)的網址,若找不到的話,亦可進資料庫至信箱認證資料表(email_signup) 去取得註冊信箱的金鑰 ,完成以下網址的欄位輸入,即可以完成離線認證。若輸入 http://318.hackpad.com:9000/ep/account/validage-email?email=[YOUR EMAIL]&token=[YOUR TOKEN KEY],登入即可看到編修記錄,如下圖7顯示。

ckan main screenshot
圖7 318.hackpad.com 歷史編修記錄

以上為Hackpad 的安裝記錄,詳細的安裝指令程序請參考附錄三。

三、結語:實驗與實務

這篇短文是嘗試的開始,不完整也還沒結束。太陽花運動中使用的協作平台很多,我們僅就 <318.hackpad.com> 以及 兩份協作文件集,進行保存工作。這比較像是實驗,用以瞭解我們目前所能作到的程度,距離數位保存的理想還有多遠。保存 (preserve) 貴於能夠再現 (re-present)。物質文物的再現,涉及解釋、功能、與情境,在採集和保存的過程,需要專業領域以及在地知識的支持。數位內容的保存與再現,除了領域知識以及使用社群之外,還需要執行環境的支撐。而這執行環境,同時又有物質(硬體)以及數位(軟體)兩部份。數位內容的再現議題,也就依此遞迴而上層層相扣,相對複雜。

數位保存與再現,我們認為可分幾個境界:內容脈落 (content and context)、外觀介面 (look-and-feel)、功能營運 (function and operation)、以及工藝技術 (skill and technique)。內容脈落,著重於資料文本與其生產脈落的保存,期望能夠重現(但未必能夠忠實)。外觀介面,就內容呈現上的感知與操作方式,求其如真(但不涉及功用)。功能營運,追求數位物件的效用表現以及情境存續(但不拘泥於原本技法)。工藝技術,以數位物件產製當時的技術方法,重現其內容、外觀與功用。

面對數位內容保存與重現的工作,典藏與記憶機構不可避免將需要數位工藝的技能。初期或可由經由技術社群的協助,就選取的數位物件,進行有意義的保存(內容、外觀、功能)。數位技能的傳承、數位史感的培養,不可避免的將和典藏機構的實務工作逐漸相關,而資訊相關領域的知識養成與資源投注,也就日益重要。

四、附錄

附錄一 :自訂 Hackfoldr 流程 [13]

  1. 點左上 home 圖案旁文字連結,會自動在新分頁打開 ethercalc
  2. 在 B2 格子中輸入本 Hackfoldr 名稱(通常是中文)
  3. 接著從第3行開始,可以增加你想收集的網址
  4. 輸入格式為:在 B3 中輸入第一份文件名稱,A3 格子中輸入第一份文件網址
  5. 以此類推,把所有文件的顯示名稱和網址都輸入進去
  6. 切回「hackfoldr.org/(你的專案的英文網址名稱)」這個瀏覽器分頁
  7. 按 F5 / Ctrl + R 重新整理頁面

附錄二:Hackfoldr再現流程 [14]

  1. sudo apt update && sudo apt install git nginx ##安裝 Git 與 Nginx
  2. git config --global user.name "John Doe" && git config --global user.email
    johndoe@example.com ##設定 Git 使用者資訊(必須執行,否則無法使用 Git,內容任意)
  3. wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.33.8/install.sh | bash ##安裝 nvm
  4. source ~/.bashrc ##使 nvm 安裝生效
  5. nvm install node ##安裝最新版 Node.js
  6. git clone https://github.com/g0v-today/hackfoldr.git ##自 GitHub 下載 g0v.today 修改版 Hackfoldr
  7. cd ./hackfoldr ##切換至 Hackfoldr 程式碼目錄
  8. npm i ##安裝程式所需套件
  9. 刪除 app/app/controllers.ls 檔案 419 行後的所有內容,並改為下圖 6 內容
  10. 刪除 app/init.ls 檔案的第 1 至 3 行,以及第 6 行
  11. 修改 deploy,將第 6 行改為 ${REPO:=https://github.com/g0v-today/hackfoldr},並將第 26 行(git push origin gh-pages)最前方加上註解符號 #(使此指令不執行)
  12. ./deploy ##網頁會生成於 ./_public
  13. sudo cp -R ./_public/* /var/www/html/. ##複製生成的網頁內容至 Nginx 網站預設根目錄
  14. 改 /etc/hosts 檔案,加上 127.0.0.1 g0v.today ##強制 g0v.today 連線至剛安裝的 Hackfoldr
      response <- $.get ("http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20html%20where%20url%3D'http%3A%2F%2Fapi.ustream.tv%2Fjson%2Fchannel%2F" + videoId + "%2FgetValueOf%2Fstatus'&format=json&diagnostics=true&callback=")
      if 'live' == JSON.parse(response.query?.results?.body?.p).results
        it.tags ++= {class: 'warning', content: 'LIVE'}
      docs.splice 0, docs.length, ...(entries.filter -> it?)
      last-parent = 0
      nested = for entry, i in docs
        if i > 0 and entry.indent
          docs[last-parent]
            ..children ?= []
              ..push entry
          null
        else
          last-parent = i
          entry
      nested .= filter -> it?
      nested .= map ->
        if it.children
          it.expand = it.opts?expand ? it.children.length < 5
        it
      tree.splice 0, tree.length, ...nested
      cb folder-title, docs\
    

圖8 app/app/controllers.ls 修改內容

附錄三: Hackpad 再現流程

  1. sudo apt-get update ##更新套件
  2. sudo apt-get install default-jre default-jdk ##安裝SUN JAVA JDK
  3. sudo apt-get install mysql-server ##安裝 MySQL
  4. sudo apt-get install libmysql-java ##安裝JAVA連結MySQL程式庫
  5. 需額外下載指定的scala 版本安裝

    sudo apt-get remove scala-library scala ##安裝 Scala 2.11
    wget http://www.scala-lang.org/files/archive/scala-2.11.7.deb 
    sudo dpkg -i scala-2.11.7.deb 
    sudo apt-get update 
    sudo apt-get install scala
    
  6. 至github 專案開發平台的 hackpad 專案頁面,下載程式碼 (hackpad-master.zip),並將檔案解壓縮,產生hackpad-master目錄

  7. 修改套件執行路徑

    cd hackpad-master
    vim bin/exports.sh  ##修改設定,本實作的設定如下
    export SCALA_HOME="/usr/share/scala"
    export SCALA="$SCALA_HOME/bin/scala"
    export SCALA_LIBRARY_JAR="$SCALA_HOME/lib/scala-library.jar"
    export JAVA_HOME="/usr/lib/jvm/java-8-openjdk-adm64"
    export JAVA="/usr/bin/java"
    export MYSQL_CONNECTOR_JAR="/usr/share/java/mysql.jar"
    
  8. hackpad-master/bin/build.sh ##啟動建置程式

  9. hackpad-master/contrib/scripts/setup-mysql-db.sh ##設定資料庫,輸入資料庫密碼
  10. 調整設定檔

    cd  hackpad-master/etherpad/etc/
    cp etherpad.localdev-default.properties  etherpad.local.properties
    vim etherpad.local.properties  ##調整設定檔
    etherpad.superUserEmailAddresses = [管理者信箱]
    topdomains = 318.hackpad.com,localhost
    
  11. vim /etc/hosts ##編輯本機端IP 對印位置,加上318.hackpad.com 網址,設定內容如下

    127.0.0.1   318.hackpad.com
    
  12. ./bin/run.sh ##執行啟動程式

  13. 開啟瀏覽器,輸入網址 http://318.hackpad.com:9000
  14. 於Hackpad網頁左側點選註冊,並輸入一組註冊信箱及相關資料
  15. 於終端機顯示註冊信,依信上的認證連結復製並執行於瀏覽器上,輸入註冊的密碼,即登入並認證完成。

五、參考來源

  1. g0v.today 版本 Hackfoldr README https://github.com/g0v-today/hackfoldr/blob/master/README.md
  2. Hackpad 官方安裝說明檔 https://github.com/dropbox/hackpad/blob/master/INSTALL