Sunday, July 11, 2021

注意程式間的細節

已經使用 Leo Editor 超過十年, 但是最近幾個月因為一直在 Mac 上工作, 而 Leo Editor 在 Mac 上的操作細節與 Windows 及 Linux 上有所差異. 感覺在 Windows 上操作非常順手之後, 到了 Mac 即便是自認對 Leo Editor 非常熟悉, 但是卻連一個簡單的字串替換都沒有辦法完成......

Leo Editor 的 replace-all

無法在 Mac 如 Windows 上順利操作 replace-all 的原因是, Mac 平台上無法使用如 Windows 版的 Leo Editor, 直接在 Find Tab 上的表單操作, 而必須使用 Minibuffer, 以指令與特定按鍵順序操作.

在 Mac 的 replace-all 操作順序必須採:

  1. 將滑鼠停在 Leo Editor 下方的 Minibuffer 欄位處, 表示要執行 Minibuffer 指令.
  2. 滑鼠停在 Minibuffer 區域後, 欄位區會跳出 "full-command:", 表示使用者要執行指令.
  3. 接著輸入 "replace-all" 後按下 enter, 這時 Minibuffer 欄位區會轉為 "Search:", 表示要使用者輸入搜尋字串.
  4. 等使用者輸入所要搜尋的輸入字串後, 就到了最重要的關鍵, 這時若按下 enter, 表示要搜尋該字串, 但是若使用者在輸入搜尋字串後, 並非按下 enter, 而是按下 tab 鍵, 表示 replace-all 所需要的輸入流程尚未完成, 也就是除了給定搜尋字串之外, 還要輸入替換字串.
  5. 當輸入搜尋字串後, 再按下 tab , Minibuffer 欄位區會轉為 "Replace String: 搜尋字串 with", 這時就可以輸入"替換字串"後, 再按下 enter, Leo Editor 就會根據 Find tab 中所勾選的設定來替換字串.

Leo Editro 操作系統間的差異

由於 Leo Editor 的開發者堅持要讓 Python2 與 Python3 的用戶都能使用, 而且大多數開發者都只使用英文輸入介面, 目前已知在 Windows 操作系統, 若輸入停留在中文環境, 就會因為無法建立 .leo/.leoID.txt 而無法通過首次開啟流程, 造成無法正常使用. 應對方法就是在 Windows 首次開啟 Leo Editor 時, 必須先將環境選擇英文輸入, 才能正常建立 .leo/leoID.txt.

而且 Leo Editor 在 Windows 與 Mac 的操作表單也不完全相同, 不知是否因為 Mac 操作系統內仍有 Python2, 且 Leo Editor 的 Exit 必須透過 Python 下拉式表單的 Quit Python 操作, Mac File 下拉式功能表中並沒有 Exit.

Leo Editor 的設定檔

根據 Leo Editor settings 中的說明, Leo Editor 共有四種設定檔案:

Leo Editor 的設定存在 @settings 節點指令中, 開啟 .leo 檔案時, Leo Editor 不僅會在檔案中的節點樹尋找 @settings, 也會在 leoSettings.leo 檔案中搜尋相關設定. 主要的設定包括:

  1. 每一操作系統中或特定安裝時所選擇的設定.
  2. 每位用戶所選擇的設定.
  3. 每個目錄所選擇的設定.
  4. 每個檔案所選擇的設定.

因此, Leo Editor 合計共有四種設定檔案:

  1. 名稱為 leoSettings.leo 的內建設定檔案.
  2. 名稱為 myLeoSettings.leo 的個人設定檔案.
  3. 名稱為 LeoSettings.leo, 可以位於各相關目錄的機器設定檔案.
  4. 名稱為 .leo 且內容包含 stylesheets 與其他顯示設定相關設定的主題檔案..

而各設定檔案則分別存在:

  1. 設定檔案儲存目錄為各用戶目錄中的 .leo 子目錄.
  2. leo 安裝目錄下的 config 目錄.
  3. 各用戶目錄中 .leo 目錄中的 MACHINE 目錄, 而此 MACHINE 可以是電腦的主機名稱.
  4. 主題設定檔案則可以儲存在任何存放 .leo 的目錄中.

當使用者開啟 .leo 檔案時, 系統所採用的設定檔案將會顯示在 log 區域.

而目前已經知道, 在 Mac 中, 若 leoSettings.leo 或 myLeoSettings.leo 中的 @settings 沒有設定, 開啟 Leo Editor 後將會只有 Python 下拉式功能表, 但並不會顯示任何與 Leo Editor 有關的其他功能表.

Leo Editor 設定讀取順序

Leo Editor 讀取設定檔案的順序將從系統安裝目錄下的 config 開始搜尋讀取, 各設定檔案的搜尋順序都相同. 亦即, 若在 leo/config 與使用者 .leo 目錄中各有一個 leoSettings.leo, 則 Leo Editor 會先讀取系統的設定後, 再讀取使用者目錄下 .leo 目錄中的同名設定, 而且若兩個檔案皆有相同節點設定, 該節點的設定將以較後讀取的設定為主.

閱讀 Leo Editor 原始碼

由於 Leo Editor 的開發歷程已經超過 25 年 (1995 至今), 從早期的 C++ 版本到 Python Tkinter, 直到現在採用 PyQT 的版本, 過程中有許多轉折與考量, 因此原始碼中有許多學習的地方, 所以設法利用 recursive importer 展開, 希望逐一摘要出相關重點.

所使用的 recursive importer:

'''Recursively import all python files in a directory and clean the result.'''

c.recursiveImport(
    dir_ = r'./',
    kind = '@clean', # The new best practice.
    safe_at_file = True,
    theTypes = ['.py']
)

上述的 c 是 Leo Editor 程式碼中的 commander. 只要透過 c 物件中的 recursiveImport() 就可以採遞迴的方式, 將所需的檔案導入節點內容中. 而此一功能位於 core/leoCommands.py 中的 recursiveImport() 方法中. 而 Leo Editor 不僅可以採用 @clean 直接將物件與方法逐一展為樹狀節點, 可以用 @edit 展開全部檔案內容, 或者在導入後將節點編輯指令前加入 @@ 令其只存在 Leo Editor 節點中, 而切斷與外部檔案的連結, 專門充作研究註解用. 其他還有 clone 節點的功能, 能夠針對同一個節點內容, 同步出現在不同的節點位置中.

而 g 則是 core/leoGlobals.py 的簡稱, 其中 core/leoGlobals.py 中的 es 方法 就是 g.es() 中的由來, 也是 Leo Editor 中的 echo string 方法.

為何要研究 Leo Editor?

假如您仔細了解 Leo Editor 創建的初衷, 是源自於實現 Donald Knuth 教授所提出的 Literate Programming 概念, 也就是希望能夠讓計算機程式的編寫, 可採用自然語言並穿插巨集段落與傳統原始碼的方式來解說邏輯. 而且從中可以產生能編譯的程式碼.

Literate Programming 的目的, 就是希望程式師在操控電腦的過程能夠更加人性化, 使用一般人方便了解的方式建構, 除了有助於多人協同, 方便流傳延續, 也能避開電腦硬體快速變遷所帶來的知識障礙.

這樣的概念, 假如再加上 Computer-aided Design as Language 論文的加持, 為何研究 Leo Editor 應該就不難找出答案! 因為在 Leo Editor 上工作, 就是依賴許多 Python 巨集程式在進行知識管理, 而且是採用電腦容易解讀, 具有邏輯結構意義的 XML 樹狀圖在描述所創建的知識.

若有朝一日, 真可透過機械設計工程師的討論言說來進行電腦輔助設計, 最近這幾年科技的進展, 就是為了此一目標在努力.

Computer-aided Design as Language 目前是透過 Google 提出的 Protobuf 格式, 儲存電腦深度學習辨識 2D 設計圖所得到的結果. 其實所謂的機械設計工程圖, 主要邏輯就是在設計目標的驅使下, 由許多繪圖元件加上各種約束條件所組成, 而 DeepMindOnshape 這兩個公司提出了一種能夠自動生成產品設計工程圖的機器學習模型. 最終所得到的結果 Protobuf 就是 XML.

KMOlab 目前想做的其實只有一個小小的目標, 就是讓 Leo Editor 當作 MCAD (Mechanical Computer Aided Design] 套件與 CoppeliaSim 中的資料轉換工具, 可以用來解讀或建立相關機電整合系統模型. 能夠派上用場的 MCAD 是開源的 Solvespace, 而 CoppeliaSimWebots 可以採用 XML 格式建立模型的特性正好可以與 Solvespace 結合應用.

理想的狀況下, 產品設計師利用 lark 自行定義基本的 2D 或 3D 產品描述語言, 經由 Solvespace 建立所需的零組件後, 將檔案轉為 STLURDF , 接著再由 Leo Editor 居中引入零組件檔案, 並組合成能夠直接由 CoppeliaSimWebots 使用的機電整合模型後, 再進行後續的控制系統設計與模擬.

No comments:

Post a Comment