2018年4月14日 星期六

如何快速開啟軟體不支援檔案關聯的特殊文件?(以 sciprj 檔為例)

製作該文件的軟體居然不支援雙擊或右鍵選擇打開?

如果你跟我一樣是個科研人員,而且又同時是個 Mac 使用者,應該都會遇到沒有科學作圖工具的困擾 (如果你是寫 Python、R 或 Matlab 處理數據的高手,那當我沒說)。

嚴格說來,也不是沒有科學作圖的軟體,而是沒有像樣的軟體。比如說過去的神物 Plot 在改版到 64bit 的 Plot 2 就整個爛掉,功能不增反減,以及操作的不人性化終於逼我捨棄它;Origin 食古不化始終不支援 macOS,但詭異的是它的 Viewer 有 Mac 版;Veusz 的人性化程度極差,放個 error bar 都很麻煩;QtiPlot 的價格不是很高但只能訂閱,而用原始碼及 Homebrew 安裝總是失敗 [1];DataGraphMagicPlot 都算小有名氣,但是美金 90 元實在有點貴;剩下一個 SciDAVis 似乎是最後的希望。

有些人可能會說,願意花錢哪會沒好東西用?像 DataGraph 就是很好的解決方案 (我看 MagicPlot 那個介面的尿性,很有可能跟 SciDAVis 有類似的問題,後面會說明),可是當你看到實驗室其他人沒花一毛錢用著 Origin 的時候,也只能默默地嚥下鮮血。由於沒有實驗室的資助又不想用盜版,所以還是找看看有沒有免費又靠譜的方案,目前就我所知也只有 SciDAVis 了。

SciDAVis 是一個跨平台的自由軟體,我在實驗室的 Windows 電腦上也安裝它 (畢竟不是每一台都有買 Origin),整體而言還不錯用,介面風格就是在抄襲 Origin,該有的功能也都有,但這個介面在 macOS 上就是一場災難。


這種視窗介面設計稱為 "Multiple Document Interface" (MDI),大家應該似曾相識吧?因為很多專業軟體 "在當年" 都採用這種設計,特點是一個大的視窗裡面包含很多小的視窗,整體是一個很大的進程 (process)。這種介面設計把程式本身當作黑盒子,裡面的視窗要怎麼分配資源並不受作業系統的管理,雖然在整理多視窗的角度上不見得不好,可是真的醜啊!而且如果程式自己沒寫好,作業系統的優化也救不了它 [2]。近幾年來已經越來越少軟體使用這樣的介面設計,可能是為了讓自己的軟體看起來不要太過時吧!但 Origin 連 bug 都懶得修了,當然不會去改介面,十年如一日的垃圾 UI。

可是呢,自由軟體的宗旨是開放源碼及跨平台,很少團隊會為了 macOS 的圖形介面下功夫,所以自由軟體在 macOS 上總是又醜又難用,因為 macOS 的圖形介面進步很快,不僅美學的層級很高,跟系統的接口也遠比其他作業系統多,除非用 Apple 自家的 ObjC 或 Swift 開發專門 Mac only 的程式,不然就是要特別處理圖形介面與系統的適配,在自由軟體社群內鮮少有團隊願意投入這樣的時間與精力,像有名的 Firefox 及 Libreoffice 的 Mac 版都沒有真正適配 macOS 的圖形介面,只是 "沒那麼糟" 而已。

SciDAVis 就是一個秉持著 "能用就好" 的移植軟體,不僅有醜得要死的 MDI 設計,甚至 ....
  1. 沒做自家檔案的檔案關聯性:SciDAVis 生成的 project 檔 (*.sciprj) 不能雙擊滑鼠開啟。
  2. 軟體本身不是 droplet:把檔案拖到 SciDAVis 的圖示上或視窗裡都不會有反應,也不能右鍵選擇 SciDAVis 作為開啟檔案的軟體,完全是反白的。
基本上這種用戶體驗的軟體在 Mac 上根本不會有人用,由於底限已經被 Apple 公司拉得太高了,在 macOS 上開發程式就是這麼競爭。不過 SciDAVis 不賣錢,也只有像我這種窮人離不開它,所以只能自己寫 patch 去克服。


由於 SciDAVis 的內部功能不支援 Applescript (不用想都知道),故這個程式使用一個簡單的概念:UI Scripting,也就是 Automator 中 "錄製" 的功能 (見 AUGM 2017 的投影片),但如果使用 Applescript 直接寫 UI Scripting,速度會比 Automator 錄出來的結果快不少。以下將程式分成四部分解釋:
  1. 前半段是在確保輸入進來的檔案是 sciprj 檔,並非必要的部分,也可以在 extension_list 中增加一些容許的檔案類型。
  2. set itemPath to POSIX path of (input as Unicode text):將輸入進來的 macOS 檔案路徑轉換成 UNIX 系統的 POSIX 路徑。
  3. tell application "scidavis" to activate:啟動 SciDAVis,伴隨的 delay 1 意指等待一秒讓它啟動完成。我的電腦是 Mac mini (Late 2012),如果你的 Mac 更舊,可以把等待時間調久一點,自己嘗試看看吧。
  4. 以下就是 UI Scripting,以 System Events 為啟動的核心 (需開啟輔助功能,如下圖。如果沒有 Automator 的選項就執行一次這個程式,之後跳出警告就會有選項了),流程為:在 SciDAVis 的視窗下,先按下 command + o、再輸入檔案路徑 (步驟二轉換出來的)、最後按下 return 鍵。
系統偏好設定 > 安全與隱私 > 輔助功能

以上,其實就是把手動做的步驟自動化而已,如果要用在別的軟體上,首要任務就是搞清楚它是怎麼開啟檔案的?像 SciDAVis 有一個 "Open project" (開啟舊檔) 的快速鍵 command + o,在 Open project 視窗跳出來之後它會自動 hightlight 檔名的輸入框,所以我就直接把轉好的檔案路徑輸入進去,而輸入完檔名之後它又會自動 highlight "Ok" 的按鈕,所以我就直接輸入 return 鍵就可以了,如果 SciDAVis 沒有自動 highlight 到我想要的地方,整個過程就會麻煩一些。

這篇文章的目的是分享一下 SciDAVis 自動化開啟舊檔的方法,在其他 "寫得不夠好" 的軟體上也能用,只要稍加修改程式碼即可,有興趣的人可以在此下載我的程式碼 Open sciprj file (service),有問題也可以在下方留言。

20180623 Update: 更新 Open sciprj file (service) 至 1.1 版,修正開啟時輸入法不為英文 (U.S) 造成 UI scripting 失敗的問題。另外,也可參考後續文章



附註
1. 在 Github 裡面的討論中可知,QtiPlot 不用也罷。
2. 其實程式本身的優化還是比作業系統重要太多了,像 LabVIEW 這個垃圾沒有採用 MDI 的設計也是一天到晚當掉,而且一當掉還會拖著其他沒出事的 LabVIEW 視窗一起當掉,果然沒競爭者就擺爛。

沒有留言:

張貼留言