Lolinote:極簡主義的後繼者

首先在此非常遺憾地宣佈,Lonote 專案的開發到此暫時告一段落。

Lonote 專案停止的原因,是我找到了更適合用來解決筆記問題的方法。為此也開了新的專案。專案名為 Lonote Lite Note-taking Rule Set,簡稱 Lolinote

我發誓這和我是蘿莉控一事沒有任何關係。

Lonote 專案的問題

要說明 Lolinote 專案究竟是怎麼回事,得先說明 Lonote 的問題。Lonote 的特色與優點相當鮮明,其中有些功能特性即使到了現在我也相當喜歡,像是下面這些:

  • 基於 HTML 的富文本格式:幾乎可以紀錄任何東西
  • 方便的熱鍵編輯
  • 內建某種類型的版本控制機制
  • 伺服器、客戶端架構:符合現代技術發展方向、讓多人共享、或單人多設備同時存取同一資料庫成為可能
  • 透過 CSS 變更佈景主題
  • 嚴肅紀錄 Metadata:像是創建時間、修改時間、筆記的說明、筆記間的排序等
  • 允許附件:如圖片
  • 分層的安全授權機制
  • 便捷的 wiki 式連結

但用戶真的需要上面那些功能嗎?

比方說,我真的需要分離伺服器與客戶端嗎?需要知道筆記新建與更新的時間嗎?會想要撰寫並閱讀筆記的說明 (description) 欄位嗎?需要完整支援 HTML 的所有格式嗎?需要讓多人同時存取我的筆記嗎?需要分離讀寫權限嗎?需要 (限定只能以某種特定形式進行的) 版本控制嗎?需要筆記之間的 wiki 式連結嗎?

就算是如附加圖檔這種看似基本的功能,我也肯定至少在百分之九十五的筆記中都用不著--前提是用戶沒把它當成網頁剪貼簿來用。像是佈景主題與權限管理這種東西,更是一次也沒派上用場過。

但作為代價,Lonote 付出了什麼?

  • 很難匯入匯出資料
    如果不附上一大堆說明與前提條件,其他用戶無法使用 Lonote 匯出的筆記庫,而且是連讀都沒法讀。
  • 用戶無法針對特殊需求與偏好,改用不同的處理工具
    我相信 Lonote 的編輯器與熱鍵相當好用,但如果用戶今天想要批次取代 500 多個筆記中的某些關鍵字,它沒法換用 sed 之類的工具來解決問題,這非常磨人。目錄產生器、筆記移動介面與搜索功能也相同。
  • 想存取筆記,需要先起服務器
    哪怕只打算查/記錄一個短短的電話號碼也是如此。非常麻煩。
  • 部份資料損壞,有可能波及整個筆記簿
    一旦有筆記頁之間的關聯性需要紀錄,存放相應紀錄的 Metadata 就會因此成為系統中的弱點。雖然我個人沒有碰過這種狀況,但有用戶碰過這種問題,這讓我很不安。一個系統在設計之初就該假設它是可能會面對損壞的,但這種假設在節點間具有複雜關聯性的系統中會非常麻煩。
  • 要隨時 on 一個近代瀏覽器作為客戶端
    因為近代瀏覽器全是記憶體怪獸,因此在低規系統上存取筆記變得很不方便。此外在手機上存取筆記時也會因為瀏覽器實作不同受到某些特殊的限制,比方說「關閉分頁前自動存檔」的功能在手機瀏覽器上就一直實作不出來。而在 tty 中取用筆記內容更是妄想。
  • 熱鍵常會起衝突
    當瀏覽器升版時,熱鍵常會起衝突。跨瀏覽器造成的熱鍵衝突則更多。我接到一海票這方面的 bug 回報。
  • 沒法運行或安裝程式時,對筆記什麼也做不了
    因為資料格式複雜,沒法運行或安裝程式時,對筆記什麼也做不了。就算手動查找檔案系統也沒用,資料不透明。

前述提及的功能,能有當然很好,但絕大多數功能實際使用時幾乎都用不到。然而為此付出的代價,卻血淋淋的賞我一刀。我還沒把身為程式作者,必須面對大量 coding 與 dirty work 算在內。

讀讀看 Lonote 的設計哲學吧,裏面寫著「開放的資料格式」,但是如果 Lonote 確實擁有一個真正的開放資料格式,為什麼我還會煩惱上面那些問題呢?畢竟如果 Lonote 真的做到了,面對一個開放的格式,我應該會有大批現成的工具可用來存取我的資料,以致於上述絕大部分的問題都不該發生。我確實沒有限制他人存取,設計也全部公開。但這種「開放」是狹義的,是紙面上的;而不是廣義的,可以被人在日常中實際拿來運用的。

為了處理這些問題,我構思了 Lonote 4 的草案,大幅擴張 Lonote 的功能範圍。而在此同時,我也再次開始尋找其他現有實作,甚至一度把 Lonote 中存放的資料又遷移到 Evernote 與 vim-notes 上面去。

然而我很快就意識到這其實是在開倒車。眼前的困境不是透過大幅 增加功能 就能解決,而是 Lonote 的「取捨」沒有落在最佳的點上。

新專案 Lolinote 就是為此而生的。

Lolinote

Lolinote 的概念與 Lonote 不同,也與世界上絕大多數的筆記不太相似。因為它不需要依賴專門的程式來操作它

它不像其他筆記系統那樣,嘗試將所有功能聚合在同一個或少數幾個程式裡。取而代之,它只是定義了一組簡單直觀符合直覺且只需要最少人力維護的規則集,讓使用者可以使用任何工具來讀、寫、刪、改、同步、備份、版本控管他們的筆記。

用戶可以使用其他程式來強化 Lolinote 的使用體驗,但是並不真的需要他們。

Lolinote 的核心考量,在於筆記對我們實在太太太太太重要,以致於我們根本離不開它。我們應該要能在任何情境、任何場合、任何時間、任何平台、使用幾乎任何工具來存取自己的知識庫,且即使是在最糟糕的狀況下,依然能確保一個合理的操作效率。

與簡單、穩定、易用、易維護、易與外部工具整合這些性質相較, Lolinote 認為在筆記領域中,華麗的排版與多媒體支援是比較次要的問題。

Lolinote 適用於以下用戶:

  • 希望個人知識庫完全由自己掌握,不會流到其他公司手上
  • 希望筆記和外部工具擁有最高的相容性
  • 希望能完全了解筆記資料的所有細節,沒有「隱藏的秘密」
    沒有額外的註冊表、沒有四散的 Metadata 檔案、沒有分離到系統中的資料庫、沒有無法解讀的 Binary 檔案等等等
  • 希望筆記擁有最高的容錯性,任意一小部份資料損毀不會摧毀整個系統
  • 希望筆記佔用空間儘可能地小
  • 希望筆記能夠輕易匯入轉出
  • 希望筆記系統中所有功能都是可選/可抽換的。
    從編輯器到同步程式,從檔案瀏覽器到全文檢索系統,從頁面渲染器到版本管理機制,甚至是 outliner。所有功能都可裝可拔,系統規模可大可小,或是隨時按需抽換使用。
  • 經常面對各種惡劣狀況,或不想未來面對惡劣狀況時束手無策,包括:
    • 系統連不上網路,或時斷時連
    • 無法在機器上安裝任何軟體,但又被迫使用它好幾天
    • 只有純文字介面的機器可用
    • 想在智能手錶、Android 冰箱或 google 眼鏡上查自己的食譜

Lolinote 不適用於以下用戶:

  • 主要目的是想剪貼保存網頁
  • 會在筆記中加入大量附件與多媒體內容
  • 需要複雜的富文本支援

再次強調, Lolinote 並不是一隻程式--她只是一套簡單到幾乎光靠常識都能遵循的規則集而已。

規則

Lolinote 小巧玲瓏。它的核心規則如下:

  • 規則一:一頁筆記對應一個檔案,每個筆記都互相獨立。
  • 規則二:筆記為 markdown 格式。
  • 規則三:筆記檔案檔名等於 “標題” + “.md”。
  • 規則四:所有筆記檔案被放置在一個多層的目錄樹中。
  • 規則五:筆記的排序等於檔名字串順序。
  • 規則六:筆記樹的最高層目錄下必須要有一個 .loli 的資料夾。作為第三方工具識別與存放輔助訊息之用。
  • 規則七:筆記的內容必須要以 utf-8 編碼。

七條規則中每一條都有意義,也對優缺點做出了明確的取捨。比方說規則一簡化了管理程序與運用彈性,並因此犧牲了紀錄額外 metadata 的能力等。詳情請參閱維基 設計哲學與規則 的章節,這邊不詳述。

讀完設計哲學與基本規則後,您還可以繼續參看擴展規則頁面。擴展規則可能比較複雜難記、或有某種較嚴重的副作用,也可能會稍微改變 Lolinote 的原生規則細節。但無論如何,擴展規則絕對不會打破 lolinote 的設計哲學。以目前來說,像是對圖檔與附件的支援就被放在擴展規則裡面。

為什麼要遵循 Lolinote 的規則

講到這裡,有人可能會想說自己早在用類似的方法記筆記了,幹嘛這樣大驚小怪。或儘管覺得不錯,但覺得這樣條列規則太過嚴肅。對!問題是,這麼簡單的東西,為什麼我們還需要規則呢?

主要是為了工具的互通性。

Lolinote 不依賴工具,也能達到一個不錯的運用效率,這是她的關鍵設計目標。但是我們依然可以揉合一些工具讓她能運作得更方便。舉例來說我就寫了支叫作 Lolikit 的命令行輔助程式,可支援使用者對整個筆記庫進行全文檢索、依據 mtime 時間戳列出最新修改檔案、還有快速定位筆記庫中的瑕疵並(可選地)自動修復問題等等。

如果您使用了與 Lolinote 相同的規則集,則我設計的工具包您也可以通用,有興趣甚至可加入合力開發。或是之後有人寫了個諸如直接把一本筆記直接當成網站 Host 起來的工具時,大家也都可以共享開發成果。

Lolinote 的 wiki 中也有一個頁面,專門用來列出哪些工具適合與 Lolinote 共同使用。我已經先一步在其中放了些覺得不錯的工具。如果大家共享經驗,一定能探索出更多更好用的東西與使用方法出來。至少我是這樣期待的啦。

因為一時找不到更好的 wiki 平台,所以就先暫時 host 在 bitbucket 上面,日後要移動到別處再說。這個 wiki 採用 markdown 格式,權限被設定為所有人都能修改編輯。如果您發現什麼好工具,請直接上去紀錄一下。主要頁面請使用英文撰寫,但您可單獨開其他語言的頁面,文法不通也可直接修改,不要搞破壞都OK。

lo2loli

為了遷移原先用 Lonote 寫成的筆記,我寫了一隻將 Lonote 轉成 Loli 格式的命令行轉檔程式。稱為 lo2loli。因為這算是一次性工具,所以我沒有將其上傳到 pypi 上面,操作起來可能比較繁瑣一點,請聽我說明。

要使用這個工具,首先您必須要有一個 python3.4 版本。python3.5 不行,更低的版本也不行。這是因為程式中的相依套件 html2text 目前在 python 3.5 版上運行時有 bug 還沒修好,在本文撰寫的這個時候該套件作者暫時不允許 Python 3.5 執行它。

python 準備好之後,用 pip install html2text 安裝輔助套件。

然後對從 Lonote3 網頁介面下載下來的 .lo3 檔案直接執行程式:

python3.4 lo2loli.py xxx.lo3 -o output_dir

您也可以透過 --help 參數翻查一下其他可選的選項。

注意:轉換後不會自動添加「規則六」所提到的 .loli 資料夾,就請各位全部轉好之後再依需要手動添加一下。

相關連結

  • lolinote wiki:lolinote 的文件都放在此。目前是設成 public 的,覺得對其他人有幫助的訊息如推荐工具之類各位可自行補充進去,不需要問我。改文法錯誤、增加說明或用例也都 OK,但是請不要偷改規則,明顯亂來的內容我會回退版本。
  • lo2loli:Lonote3 到 Lolinote 的轉檔程式。
  • lolikit: Lolinote 常用工具包。集結了一些我覺得能經常派上用場、可和 lolinote 協作的腳本,用戶安裝後可以透過類似 loli findloli fixloli list 之類的指令來做一些操作。理論上是跨平台的,但是我沒有測試得很徹底。有問題直接報一下 issue
  • lonote:這五年來持續開發使用的筆記專案,因為 lolinote 的誕生而停止維護,如果有人想接手請 fork,謝謝。