開始之前簡單講下源和包管理器的概念,個人理解如下: 源就是平時我們win電腦上的360軟體管家、騰訊軟體管家、微軟商店這個意思,提供下載各類軟體包、安裝包的平臺; 包管理器就是win電腦上各類軟體的安裝包,例如qq.exe、360.msi等,需要下載後用指定的命令可以進行安裝、協助等操作,跟源配合使 ...
5使用Git和SD卡副本備份代碼
在本章中,您將學習到以下內容:
- 代碼是如何破壞或丟失的
- 策略 1 - 將代碼保存在電腦上並上傳
- 策略 2:使用 Git 回溯歷史
- 策略 3 - 製作 SD 卡備份
5.1 代碼是如何破壞或丟失的
代碼和它的近親--配置,都需要時間和艱苦的努力。代碼需要配置才能運行,例如 Raspberry Pi 操作系統配置、額外軟體和必要的數據文件。兩者都需要研究和學習,需要設計、製作、測試和調試。
很多糟糕的情況會導致代碼丟失。我在經過數周的工作後,在帶機器人去參加展會的前一周就遇到過這種情況。那麼,您的代碼會發生什麼情況呢?
5.1.1 SD 卡數據丟失和損壞
SD 卡損壞是指 SD 卡中用來保存代碼、Raspberry Pi 操作系統和任何你準備好的東西的數據被破壞。文件無法讀取,或者卡無法使用。SD 卡上的信息可能會永久丟失。
如果 Raspberry Pi 意外斷電,SD 卡可能會損壞,導致數據丟失。發熱的 Pi 會慢慢烘烤 SD卡,損壞它。Pi 上的視覺處理就容易發熱。如果Pi通過GPIO引腳或電源發生嚴重的電氣故障,SD 卡也會受損。
5.1.2代碼或配置更改
編碼意味著嘗試。有些會成功,有些則會失敗。在這種情況下,你會想回頭看看你都改了些什麼。
錯誤的配置也會讓機器人失去作用,比如 Pi 無法聯網或啟動。系統軟體包升級可能會出錯,導致代碼無法工作,或者需要對代碼進行大量修改才能重新工作。
這些問題結合在一起可能會造成真正的噩夢。我曾見過代碼的修改導致機器人行為失常,並以損壞 SD 卡的方式損壞自身。在一次重要的機器人活動前兩周,我一直在更新操作系統的軟體包,結果把電源線弄斷了,導致 SD 卡損壞,Raspberry Pi 操作系統也隨之損壞,重建操作系統的過程非常痛苦。這是一次慘痛的教訓。
5.2 策略 1 - 將代碼保存在電腦上並上傳
通過安全文件傳輸協議(SFTP),您可以將文件從電腦傳輸到 Pi。這種策略可以讓你在電腦上編寫代碼,然後上傳到 Raspberry Pi。您可以選擇自己的編輯器,並安全地擁有多個副本。
編輯代碼需要專門設計的軟體。針對Python推薦使用Mu、Microsoft VS Code、WingIDE、Geany、Notepad++ 和 PyCharm。
SFTP 使用 SSH 通過網路在 Raspberry Pi 上複製文件。讓我們來看看如何操作:
-
首先,在 PC 上創建一個文件夾,用於存儲機器人代碼;例如,my_robot_project。
-
在該文件夾中,用編輯器製作一個測試文件,只需列印一段文字即可。將這段代碼放入名為 hello.py 的文件中:
print("Raspberry Pi is alive")
- 我們將把它複製到機器人上並運行。您可以使用 https://filezilla-project.org 上的 SFTP 工具 FileZilla 進行複製。下載並按照安裝說明操作:
- 插入Raspberry Pi並啟動電源。你會發現在右側面板底部,FileZilla顯示"未連接"。
- 在"Host"框中,鍵入您在無頭設置中為機器人Pi提供的本地主機名,首碼為ftp://;例如,sftp://myrobot.local。
- 在用戶名框中輸入pi,在密碼框中輸入之前設置的密碼。
- 單擊 Quickconnect 按鈕連接Raspberry Pi。
- 連接完成後,你會在右側的遠程站點面板中看Raspberry Pi的文件,如圖 5.2 所示:
-
使用左側的本地站點面板進入你電腦上的代碼。
-
現在單擊圖左上方突出顯示的 hello.py,並將其拖動到右下角面板,將其放到Raspberry Pi上:
-
你拖動文件時,你會在"已排隊文件"部分看到它。由於文件較小,它只會在隊列狀態中停留一瞬間。你也可以對整個文件夾使用同樣的系統。你很快就能在遠程站點(Raspberry Pi)看到文件,如圖右側面板所示。
-
要運行這段代碼,請使用 PuTTY 登錄 Pi 並嘗試執行以下命令:
$ python3 hello.py
Raspberry Pi is alive
這一策略是讓代碼更安全的良好開端。通過在筆記本電腦/PC 上工作並複製到Pi上,你可以保證除了機器人上的那個副本外,總有一個副本。你還可以在電腦上使用任何你喜歡的代碼編輯器,併在錯誤傳到樹莓派之前就發現它們。
5.2 策略2:使用Git回溯歷史
Git是一種流行的源代碼控制形式,是記錄代碼修改歷史的一種方式。你可以回溯修改,查看修改內容,還原舊版本,併在註釋日誌中記錄修改原因。Git 能將代碼存儲在多個位置,以防硬碟出現故障。Git將代碼及其歷史存儲在倉庫(或稱 repos)中。在Git中,你可以創建分支,即整套代碼的副本,與你的代碼並行嘗試各種想法,之後再將這些想法合併回主分支。
我將帶你開始使用Git,但這部分內容只能讓你瞭解Git的一些皮毛。讓我們開始吧:
如果你使用的是Windows或macOS,我建議你使用GitHub應用程式,這樣設置會更簡單。
- Git要求你在電腦上使用命令行設置身份:
> git config --global user.name "<Your Name>"
> git config --global user.email <your email address>
- 要將這個項目置於源代碼控制之下,我們需要初始化它並提交第一段代碼。請確保您已進入代碼文件夾(my_robot_project),然後在電腦命令行中鍵入以下內容:
> git init .
Initialized empty Git repository in C:/Users/danny/
workspace/my_robot_project/.git/
> git add hello.py
> git commit -m "Adding the starter code"
[master (root-commit) 11cc8dc] Adding the starter code
1 file changed, 1 insertion(+)
create mode 100644 hello.py
"git init ."命令Git將文件夾創建為Git倉庫。"git add"將hello.py文件保存在倉庫。
- 現在我們可以用"git log"查看日誌了:
> git log
commit 11cc8dc0b880b1dd8302ddda8adf63591bf340fe (HEAD ->
master)
Author: Your Name <[email protected]>
Date: <todays date>
Adding the starter code
- 現在修改 hello.py 中的代碼,將其改成這樣:
import socket
print('%s is alive!' % socket.gethostname())
讓我們看看這段代碼與之前有什麼不同:
> git diff hello.py
diff --git a/hello.py b/hello.py
index 3eab0d8..fa3db7c 100644
--- a/hello.py
+++ b/hello.py
@@ -1 +1,2 @@
-print("Raspberry Pi is alive")
+import socket
+print('%s is alive!' % socket.gethostname())
以上是Git顯示差異的方式。Git將這些改動理解為去掉了列印行,取而代之的是導入和列印行。我們可以把它添加到Git中,生成一個新版本,然後再用 git log查看兩個版本:
> git add hello.py
> git commit -m "Show the robot hostname"
[master 912f4de] Show the robot hostname
1 file changed, 2 insertions(+), 1 deletion(-)
> git log
commit 912f4de3fa866ecc9d2141e855333514d9468151 (HEAD ->
master)
Author: Your Name <[email protected]>
Date: <the time of the next commit>
Show the robot hostname
commit 11cc8dc0b880b1dd8302ddda8adf63591bf340fe (HEAD ->
master)
Author: Your Name <[email protected]>
Date: <todays date>
Adding the starter code
這樣你就可以回溯到以前的版本,或只是比較版本,並保護自己免受可能會讓你後悔的改動。
現在,我們可以回溯和向前(至少對我們的代碼而言),我們可以更自信地進行修改。只要記住頻繁提交--尤其是在完成某些工作之後!
5.3 策略3-製作 SD 卡備份
開始之前,請正確關閉 Raspberry Pi,取出 SD 卡並將其放入電腦。這些乾凈的鏡像文件很大,所以不要把它們放到 Git 倉庫中。在任何情況下,根據鏡像文件的大小不同,這項操作都需要 20-30 分鐘。
5.3.1 Windows
Windows上將使用Win32DiskImager。因此,我們的第一步就是安裝和設置它。繼續:
從https://sourceforge.net/projects/win32diskimager獲取安裝程式。
在"文件名"方框中將圖像命名為myrobot.img。然後單擊"打開"按鈕確認:
單擊"讀取"按鈕開始複製圖像。在讀取圖像的過程中,你會看到一個進度條和剩餘時間估算。圖像複製完成後,Win32 Disk Imager會告訴你讀取成功,然後你就可以退出軟體了:
參考資料
- 軟體測試精品書籍文檔下載持續更新 https://github.com/china-testing/python-testing-examples 請點贊,謝謝!
- 本文涉及的python測試開發庫 謝謝點贊! https://github.com/china-testing/python_cn_resouce
- python精品書籍下載 https://github.com/china-testing/python_cn_resouce/blob/main/python_good_books.md
- Linux精品書籍下載 https://www.cnblogs.com/testing-/p/17438558.html
- Raspberry Pi(樹莓派4B)4輕鬆入門(上)-安裝 https://www.cnblogs.com/testing-/p/17604049.html
- Raspberry Pi 基金會安裝 Raspberry Pi 操作系統指南:https://www.raspberrypi.org/documentation/installation/installing-images/README.md。
- 《Raspberry Pi By Example》,Ashwin Pajankar和Arush Kakkar,Packt Publishing,其中有一節介紹Raspberry Pi的替代操作系統,以及許多令人興奮的 Raspberry Pi項目。
- Raspberry Pi GPIO 引腳輸出 (https://pinout.xyz/): 它介紹了不同電路板與Raspberry Pi的實際引腳連接方式。
- GitHub 上的《Git 手冊》:https://guides.github.com/introduction/git-handbook/。該文檔全面介紹了 Git 是什麼、它能解決什麼問題,以及使用其功能的起點。
- 手把手教你使用 Git 進行版本控制:https://www.packtpub.com/application-development/hands-version-control-git-video。這是一個關於如何使用Git的視頻教程。
- GitHub 指南:https://guides.github.com/。一系列關於如何充分利用Git和GitHub的指南。
- GitLab基礎:https://docs.gitlab.com/ee/gitlab-basics/。GitLab是GitHub的絕佳替代品,擁有龐大的社區和一些出色的Git使用指南。
5.3.2 Mac
MacOS有一種製作SD卡和磁碟鏡像的內置方法。這就是使用內置的磁碟工具。讓我們來看看它是如何工作的:
單擊 "查看 "菜單:
現在點擊顯示所有設備選項。選擇包含啟動捲的設備:
在菜單欄中,選擇文件 | 新映像:
在此菜單下,選擇 "從 <您的存儲設備> 映像":
磁碟工具將顯示一個對話框。設置文件名和位置,並格式化為 DVD/CD 母盤:
磁碟工具為這些文件提供 .cdr 擴展名:
將其重命名為 .iso:
您需要確認是否需要這樣做:
現在,你可以在 macOS 上創建SD鏡像文件,以便與balenaEtcher 一起使用。
5.3.3 Linux
在Linux下,備份SD卡可以通過命令行dd命令完成。在瞭解如何操作之前,我們首先需要找到設備的位置。讓我們開始吧:
插入卡並鍵入以下命令查找設備的位置:
$ dmesg
該命令將輸出很多內容,但您只對接近末尾的一行感興趣,該行內容如下:
sd 3:0:0:0: [sdb] Attached SCSI removable disk
卡在方括弧[sdb]中,在你的電腦上可能有所不同。SD卡的位置將是/dev/<驅動器位置>,例如/dev/sdb。
請註意正確的位置,因為您可能會破壞SD卡或電腦硬碟中的內容。如果不確定,請勿使用此方法。
確定SD卡位置(如 /dev/sdb 或 /dev/disk1)後,就可以使用 dd 命令啟動克隆。該命令可將數據轉入或轉出驅動器:
$ sudo dd if=/dev/sdb of=~/myrobot.img bs=32M
Password:
474+2 records in
474+2 records out
15931539456 bytes (16 GB, 15 GiB) copied, 4132.13 s, 3.9
MB/s
if參數為輸入文件,本例中為SD卡。of參數是輸出文件,即克隆卡中的myrobot.img文件。
bs參數是區塊大小,因此將其設置為32M,會使操作更快。
你需要輸入用戶密碼才能啟動。dd命令會將myrobot.img文件創建為主目錄下整個SD卡的克隆文件。dd在完成之前不會有任何輸出,然後會顯示有關操作的統計信息。
釘釘或微信號: pythontesting 微信公眾號:pythontesting