Pyslvs v0.9 大更新進度
-
AppImage
-
轉出 PMKS
-
更新 Drive shaft 計畫
AppImage
自之前沒時間理會 Symbian9 開的 issue,昨天利用空閒時間研究了一下 AppImage 的原理。
AppImage 是將 Linux 程式所需的關聯函式庫包裝在一起,模擬出一個小 /usr/bin 環境,以達成 Linux 程式可以達成如 Windows 程式攜帶到相同作業系統中執行的效果,甚至可以「安裝」到家目錄,並且無論是可攜狀態執行還是想裝到硬碟,都不需要 sudo 權限。
但是這種方式會造成檔案龐大,越多程式庫會需要放入越多內容。
根據 probonopd 寫的一個 Python 2 GTK 3 hello world 範例:
可以發現其實只要一個 Bash 腳本,就可以將程式包裝起來,AppImage 的 functions.sh 工具是從網路下載導入的。
操作方式跟 Makefile 或 Windows 的 Batch file 雷同,當然 Makefile 最大的優勢是可以跨平台,為邏輯尋找的方式執行;Bash 腳本則是可以自訂 function,以順序執行,跟程式語言很像。
包裝 AppImage
首先是建立兩層資料夾,第一層會隔離原始碼,用以編譯環境;第二層是 AppDir,相當於環境的根目錄。
第一層目錄使用 ENV 代稱,這樣 git ignore 會當作 python 虛擬環境忽略此目錄。
Bash 腳本的語法與終端機是一樣的,因此可以利用 cd 指令切換目錄(這點 Makefile 就得另外達成),只要注意所在目錄即可。
######################################################################## # Create the AppDir ######################################################################## APP=pyslvs LOWERAPP=${APP,,} mkdir -p ENV/$APP.AppDir/ cd ENV/$APP.AppDir/
使用 Python 的 virtualenv 套件建立獨立 Python 環境,需指定 Python 3。
加入 --no-site-packages
參數會建立一個乾淨的模組環境,除了 pip 和一些內建程式庫,所有模組或套件都要重裝,以避免包入不需要的內容。
使用 source activate 會套用類似 Windows 的環境變數,此時呼叫的 python 和 pip 即為指定的 Python 3,不用擔心 Python 2 混入。
下達 deactivate 命令會還原設定,便可繼續使用系統的 python 工具。
單純環境中,可以使用 PyQt 現成的 pip 包裝,這樣能大幅加快速度。
######################################################################## # Create a virtualenv inside the AppDir ######################################################################## mkdir -p usr virtualenv --no-site-packages --python=python3 usr source usr/bin/activate # Source some helper functions wget -q https://github.com/probonopd/AppImages/raw/master/functions.sh -O ./functions.sh . ./functions.sh mkdir -p usr/bin/ #Show python and pip versions python --version pip --version # Install python dependencies into the virtualenv pip install pyqt5 qscintilla pyqtchart pip install -r ../../requirements.txt deactivate
接下來要利用 cp 指令「安裝(複製)」自己的程式進 AppDir 環境中,由於原本擁擠的 /usr/bin 只有 Python 工具,因此可以安心地將自己的原始碼展開在 /usr/bin 中。
原來在 /usr/bin 中的程式只需提及名稱便可隨傳隨到,因此我們將它偽裝成一枚程式,使用 chmod a+x 將全體權限設定為可執行化。
當腳本被設為可執行化時,必須要有預設開啟的程式,於是要在腳本第一行加上 #!/usr/bin/env python
或 #!/usr/bin/python
,這邊使用 sed -i "1i\" 命令達成。
######################################################################## # "Install" app in the AppDir ######################################################################## cp ../../launch_pyslvs.py usr/bin/$LOWERAPP sed -i "1i\#!/usr/bin/env python" usr/bin/$LOWERAPP chmod a+x usr/bin/$LOWERAPP cp ../../icons_rc.py usr/bin cp ../../preview_rc.py usr/bin cp -r ../../core usr/bin
再來是打包 AppDir,根目錄下必須建立一個類似 Windows 捷徑的 desktop 檔案,在 Bash 中建立文字文件可以使用 cat 加上 EOF 標記達成。
這邊會開始用到 functions.sh 的函式包裝。
如果有填寫 Icon 那欄,可以將 png 檔命名放在旁邊,當成 AppImage 的圖示。
######################################################################## # Finalize the AppDir ######################################################################## get_apprun cd ../.. VERSION=$(python3 -c "from core.info.info import VERSION; print(\"{}.{}.{}\".format(*VERSION))") cd ENV/$APP.AppDir/ cat > $LOWERAPP.desktop <<EOF [Desktop Entry] Version=$VERSION Name=$APP Exec=$LOWERAPP Type=Application Icon=$LOWERAPP Comment=Open Source Planar Linkage Mechanism Simulation and Dimensional Synthesis System. EOF # Make the AppImage ask to "install" itself into the menu get_desktopintegration $LOWERAPP cp ../../icons/main_big.png $LOWERAPP.png
最後是 functions.sh 的函式收尾,會在最外頭建立一個 out 資料夾,裡面放的就是執行檔。
######################################################################## # Bundle dependencies ######################################################################## copy_deps ; copy_deps ; copy_deps delete_blacklisted move_lib ######################################################################## # Package the AppDir as an AppImage ######################################################################## cd .. generate_appimage
測試時有稍微出點小錯,不過後來有發現並修正。
如此流程在 Travis-ci 的虛擬機中編譯會更快速,而且有搬移到其他 Ubuntu 中測試成功。
成功後,probonopd 就把 Pyslvs 加到 AppImage 的範例了:
OwO
轉出 PMKS
稍微看了一下 PMKS 在網址列的輸入方式後,便將 Qt 表格的資料編成 PMKS 的網址格式。
輸入表格資料是使用 mech 參數,用 pipe 符號 |
串聯所有點,後面的 t 和 f 是打勾顯示 P V A 的狀況,Pyslvs 是顯示 P 即可。
透過按下按鈕,可以將當前專案載入到網頁中:
另外 PMKS 其實還有在畫布上繪製圖形的功能,像以下範例:
使用的是 ts 參數,不過表示法採用 Path Markup Syntax 的方法,可能還需研究一下。
這個功能對應 Pyslvs 的 Path Solving 路徑顯示,之後有空再加上去。
不過今天有發現 PMKS 有 Export Kinematic Data 的功能,會轉出 tab 分隔值的 txt 文件,似乎可以拿來利用的樣子?
更新 Drive shaft 計畫
接下來 Pyslvs 要開始忙動態呈現的部分,這部分就參照 Linkage 的「播放」功能和之前 Drive shaft 的轉盤。
不過還要考慮路徑格式,讓算過的路徑結果能抓到起始點和終點,並重新調整角度和點座標之間的關係。
上述兩者會花一段時間規劃資料結構,避免之前程式紊亂的情況發生。
Comments
comments powered by Disqus