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