這篇文章紀錄一個硬體工程師轉職軟體工程師的筆記。
隔行如隔山,以前會的東西現在都是從0開始。這篇筆記紀錄一些其他厲害的工程師常用的工具。雖然內容對資工系或者軟體工程師來說應該是基礎到不能再基礎,這裡就是給我自己的小筆記,給我這種菜比八看的。{alertInfo}
目錄
前言
距離上一篇文章已經將近半年,這半年中不僅換了環境,也遇到非常厲害又願意教的人,讓我覺得非常幸運。
即使在寫文章的當下我仍然還有非常多需要學習的,不管是專業知識或者軟體資工領域的知識都有,但我想把這個精神延續下去。或許這篇文章的內容對軟體或資工領域的讀者來說已經基礎到不行,但希望可以幫助到初學或者轉行的其他人。
以下指令跟環境筆者都是在 Mac上運作的,跟Linux系統的相容性比較高,但使用 Windows的朋友會需要麻煩找有沒有相似的軟體。
應用程式
iTerm2 + Oh-my-Zsh
會選用iTerm2的主要原因是他可以分割視窗的功能,當有很多連線需求的時候很好用,然後寫文章當下有發現已經有人介紹過,我的方法跟他差不多我就先引用他的設定:為 MAC 的 Terminal 上色 - 透過 iTerm 2 和 Oh My Zsh 高亮你的終端機 我的用法是把上面分成兩部分,下面分成一部分。上面放連接伺服器的終端機,下面放本機。有點像遠端是雲端所以在上面的概念,下面是本機,又是基礎所以比較大。
當然意怎麼搞都可以拉 快捷建command+D可以在當前視窗右邊新增終端機,command+shift+D可以在當前視窗下方新增終端機。
oh-my-zsh 插件
[Question] What are the best plugins for zsh ?筆者用的zsh 主題是
ZSH_THEME="agnoster"
我用的插件是
plugins=(
git
zsh-autosuggestions
zsh-syntax-highlighting
)
這兩個插件最方便的地方是可以記住之前輸入過的指令歷史,並且依據已經輸入的字串自動填入。像這兩個例子,我只要輸入
scp ~/
或者 bre
他就會依據我之前輸入的指令給我建議,這時只要按方向鍵右鍵或者tab 就可以套用指令。如果我只想要部分建議,像是我用vim 編輯一個檔案但我這次要編輯檔案路徑不同,可以按住command+方向鍵右鍵就可以一個詞一個詞的套用,然後在手動輸入路徑。
Araxis/ Beyond Compare/ WinMerge(Windows)
這三種是相似的軟體,主要用來比較檔案內容進行字元比對。跟Git的功能很像,但是用這個行程化介面來比較,而且也可以比較資料夾內容,二進制檔案,或者CSV檔案等等,在做新舊版本比較的時候很方便。但Araxis是買斷制的軟體,挺貴的大概要五千多,Beyond Compare是公司提供的軟體,WinMerge則是免費軟體,但是在這裡提倡各位有餘力的開發者可以支持作者,讓整個產業可以循環。
Araxis Merge
Beyond Compare
Win Merge
基本Git
最常用的指令莫過於git status,用來檢查目前repo狀態,先檢查git 狀態之後再對其進行編輯。這裡是我目前暫時整理的工作流程:
1. 使用
git status
檢查local端的檔案狀態,git 會說你現在是跟遠端在同一條分支,或者超前/落後遠端分支,以及是否有位儲存的變更。2. 接著如果要繼續編輯變更就可以直接編輯檔案,如果沒有或者要暫存變更就用
git stash
指令。3. 使用
git stash
後檔案會恢復到原本 commit的狀態,就可以繼續增加其他功能,或者把剛剛的stash 打成patch 發給別人。4. 在發布 commit之前先用
git diff
或 gd
查看當前檔案前一次commit的差異。5. 確認無誤就可以
git commit -m "你的變更內容說明"
,這裡只是commit在本機端的repo,現在都還來得及去更動修改的內容。6. 如果真確認無誤,也給其他人review過了之後,就可以用
git push
把本地的變更推送到遠端repo。只要推到遠端repo就沒辦法作任何更動了。下面是一些關於 Patch製作的方式還有觀念釐清:
git format-patch
製作patch
當兩個不同分支想要打patch的時候可以這樣:git format-patch origin/main -o patches
這個指令會從 origin/main開始製作一系列的 patch到你現在當前的commit, 只要一個commit就會有一個patch, 所以檔案變化是串連的。生出來的patch檔案會全部放在
-o patches
選項的"patch"資料夾,檔案名稱會是"0001-add-price.patch" 其中add-price 就是那次commit的說明內容。筆者舉例如下:我現在的 git tree長這樣:
我想要打一個從feature 分支到 main patch首先要先移動到main branch,然後用
git format-patch feature -o patches
建立一系列從feature 到 main的 patch:
應用patches資料夾下的所有patch檔案可以使用:git am patches/*.patch
或者
git am --3way patches/*.patch
那如果遇到衝突怎麼辦???因為git am指令不像merge一樣是給不同檔案整合用的,所以會需要手動看patch然後修改檔案
或者用--3way 的方式可以在VSCode中叫出跟merge相同的介面來解決衝突!
其實筆者沒實際應用過,我都用VSCode然後手動找<<< 如果當前檔案有變動,沒stash或者跟patch的紀錄不符的時候,會出現以下錯誤訊息,他說我本機端的檔案有變動,所以在合併變更之前要先commit或者stash 當前的更動:
Falling back to patching base and 3-way merge...
error: Your local changes to the following files would be overwritten by merge:
biscuit.py
Please commit your changes or stash them before you merge.
或者如果套用失敗會出現這種錯誤,他說我在套用biscuit.py第8行的時候出問題,要我檢查出事的patch 然後手動解決:
Applying: add price
error: patch failed: biscuit.py:8
error: biscuit.py: patch does not apply
Patch failed at 0001 add price
hint: Use 'git am --show-current-patch=diff' to see the failed patch
When you have resolved this problem, run "git am --continue".
If you prefer to skip this patch, run "git am --skip" instead.
To restore the original branch and stop patching, run "git am --abort".
這時終端視窗會出現 main ± >R> 的後墜表示現在的狀態是要套用patch但是套用到一半出狀況如果要終止當前patch的套用可以用
git am --abort
這樣可以退出到用patch的模式,然後讓檔案回到原本的狀態。說實話我現在覺得單用patch 來套用別人的變更蠻難用的,不如直接用IDE來編輯或者用版本比較軟體去找哪裡不一樣然後手動修改還比較安心。
基本正規表示法
驗證工具
筆者推薦一個非常好用的網站:https://regex101.com/ 這個工具非常好用,有時候在perl或python中需要用正規表達式來搜尋字元或者抓取字元組的時候,這個網站的小工具可以快速驗證你的正規表達式是不是正確,會不會有搜尋意外。此外還可以說明哪個字串代表的意思。筆者設計一個例子,假如我現在系統想要讀取設定檔,然後已經知道他檔案的命名原則一定會是config-xx(純數字), 或者 configxx-xx(包含英文字母),可以把正規表達式寫成:
^(config|conf\d+)-(\S+)
丟到網站裡,我們給他一些測試字元如:config-12,conf7-12A
執行結果如下,裡面他也貼心的把空格用淺灰色圓點代替。
常用語法
如/d+的意思是字元,/s是空格,/S是非空格所有字符等等。以下是常用到的正規表達式,其他網站還有很多資源,我這裡就是很基礎的幾個零件: 表達式 |
說明 |
---|---|
. |
任意一個字元(除了換行符) |
^ |
字串開頭 |
$ |
字串結尾 |
* |
前一元素出現 0 次以上 |
+ |
前一元素出現 1 次以上 |
? |
前一元素出現 0 或 1 次 |
[] |
字元集合,例如 [a-zA-Z0-9] |
() |
分組 |
\d |
數字,相當於 [0-9] |
\w |
單字元,相當於 [a-zA-Z0-9_] |
\s |
空白(空格、tab、換行等) |
基本Command line工具
tmux
超好用的指令,以前用過telnet 版本PTT的前輩應該都知道在連入主機前要使用tmux才可以保留連線。我是做了這個工作才有這種機會連入伺服器,所以我把它列在這裡。 用法可以參考影片介紹筆者實際使用的情況是沒有用到tmux本身視窗分割的功能,我用iTerm2 的視窗分割就可以做到這件事情,所以我最常用的命令有:
1. 檢查當前tmux 會話清單:
tmux ls
2. 建立新會話:
tmux new -s New_Session
,其中 New_Session可以是自己定義的會話名稱,用tmux ls 會顯示出來。3. 登入舊有會話:
tmux a -t Old_Session
,其中 Old_Session是 tmux ls 列出來的名稱。4. 結束會話:鍵盤依序按下
Ctrl + b
-> d
,這裡 d 是 detatch的意思。或者就用 exit 離開這 ssh 連線。最後斷線的指令個人是有點懶得去記,而且Ctrl + b 按下去也會顯示任何東西,還不如exit比較直觀又實在。
當操作公用伺服器的時候,我真的很怕不小心把人的東西搞壞,所以與其去賭自己的記憶力,我還是會選擇比較麻煩但有把握的方式去作這件事情。
tee
這是一個用來 debug的超好用工具,可以把命令列的標準輸出與錯誤輸出變成文字檔儲存。因為新工作的內容是在客製化的作業系統中執行公司自己的命令列工具,要針對這些命令除錯就需要把命令執行的結果跟錯誤都記錄下來。而我們不可能100%時間都盯著螢幕看,所以 tee指令的使用就很重要。這篇文章紀錄tee command的詳細使用方法以及原理:Linux tee Command: Syntax, Options, Examples 我最常使用的用法是把標準輸出,標準錯誤輸出用 -a (append)的方式存到檔案中。appent就是在檔案後面加入新資料,而不是覆寫資料。
假如我要用 ls 指令列出資料夾內的所有檔案,然後把執行命令的結果與錯誤都輸出到桌面叫 ls_exec_result.log的檔案。
ls 2>&1 | tee -a ~/Desktop/ls_exec_result.log
執行完這行指令就會把印在螢幕上的資訊也同時寫入到~/Desktop/ls_exec_result.log檔案中。但如果指令執行時遇到錯誤也會寫入這個檔案:執行
ls ~/on_exist_folder 2>&1 | tee -a ~/Desktop/ls_exec_result.log
終端機顯示:
ls: /Users/johnson/on_exist_folder: No such file or directory
那我們這時候去檢查 ls_exec_result.log檔,就可以看到這兩次執行指令成功與失敗的結果都被紀錄在這個檔案中
awk
這個指令也是非常強大的工具,用來處理字串搜尋與取代,分組等等。這個指令的應用在於當我執行終端機指令時,我想要擷取特定位置的輸出變成一個bash script的變數就可以這樣利用。舉例來說,我想抓出 ps指令中,使用者終端機使用的 TTY編號:
先輸入ps 觀察輸出格式,然後用把 ps執行的結果利用 pipe line傳送給 awk命令,awk會利用預設的分隔字元空格, Tab來把回傳的字串自動分組。
我想要取得第二組字元,就在awk後面輸入'{print $2}',第四組就輸入'{print $4}'
這個文字處理指令在分析客製化 command的回應時非常有用,假如我現在有個 command可以讀取暫存器內容,然後想要把某個暫存器內容在bash 中存成變數以利後續使用,就可以先觀察 command的回應,再用這個回應去計算數值。
其實這個概念也是我來新工作後才有的,叫做Data parsing。翻譯成中文大概就是資料處理分析。
張貼留言
留個言吧