2020年12月11日 星期五

常用到的 git command

1.  =====透過git server 下載Source Code ======
# git clone git@github.com:zlargon/git-test.git

2. ====== 上傳新增的檔案(上傳之後還要commit與push) =======
# git add aaa.c bbb.c
   ====== 上傳整個資料夾裡面東西(假設要add 資料夾 123) =======
#
git add --all 123


3. ====== 上傳修改的檔案,也就是commit 檔案(commit之後還要push才會真的上Server) =======
# git commit aaa.c bbb.c -m "Modify two files!"      (-m 後面帶入commit的原因,git log可以看到)


4. ====== 將commit的檔案,真正上傳到git Serve =======
# git push


5. ====== 查看歷來更改的log訊息 =======
# git log


6. ====== 查看歷來更改的log訊息,以及更改的檔案內容 =======
git log -p


7. ====== 查看某個commit的版本修改的內容(ex; commit abcdefghijk) ========
# git log -p abcdefghijk


8. ====== 查看此包Code目前的branch以及有哪些branch =======
# git branch -a

9. ====== 將被修改的檔案還原此次版本的內容 ======
git checkout -- file

10. ====== 將被刪除的檔案回復 ========
# git checkout file


11. ====== 切換到某個branch,ex: danny,並且更新本地檔案與git Server同步 =======
git checkout danny
# git pull

12. ====== 新增一個branch,名字為 danny =======
#
git checkout -b danny
# git push -u origin danny

13. ====== 打tag,V0.0.1版 =======
git tag -a V0.0.1 -m "V0.0.1"
git push origin 
V0.0.1

14. ====== 想要把git server上面,回復到前一版 =====
# git reset --hard HEAD~ (或是 git reset --hard HEAD~1)
# git push -f

15. ====== 刪除本地tag ======
git tag -d 標籤名

16. ====== 刪除遠端git server上面的tag ====
git push origin --delete tag 標籤名

17. ===== 已經git commit,但是還未push,想回復到前一版 ======
# git reset --soft HEAD^

18. ====== 回到特定 tag 版本 ====
# git checkout 00.03.03.03

19. ====== 刪除git上面的檔案/資料夾 =======
# git rm "file_name"  (刪檔案)
# git rm -r --cached "folder_name" (刪資料夾)

2020年11月17日 星期二

shell script 帶參數, 印出usage使用方式的程式框架

 撰寫Script常常會帶入參數,又需要當使用者沒有帶入參數時,要印出使用方法.

下面的程式框架是要求使用者帶入兩個參數,如果使用錯誤,則印出usage()告知使用者.

此檔案 test.sh實際做法如下:

#!/bin/sh

function usage()

{

    echo "test.sh.sh [arg1] [arg2]"

    echo "ex: test.sh 1 2"

}

if [ "$#" -lt "2" ]; then

    usage

    exit 0

fi

#If arg1 and arg2 exist, then do following thing...   


2020年10月30日 星期五

shell script 大寫轉小寫,小寫轉大寫

#大寫轉小寫
============= upper_to_lower.sh ================= 

value="$(echo $1 | tr '[:upper:]' '[:lower:]')"
echo $value

執行:
./upper_to_lower.sh  AA      ==>   aa



#小寫轉大寫
============= lower_to_upper_.sh ================= 

value="$(echo $1 | tr '[:upper:]' '[:lower:]')"
echo $value

執行:
./upper_to_lower.sh  aa     ==>   AA



2020年10月27日 星期二

Source Insight 無法加入 *.cc檔案

 遵照下面操作步驟,可以把*.cc檔案加入到目前Project


Options -> Document Options,然後在視窗上方 Document Type的下拉選項,選擇C++ Source File,右邊的File filter欄位,請加入 *.cc ,然後就可以選擇Close Button.














接著在右邊檔案列表的地方,按滑鼠右鍵,選擇 Synchronize Files

shell script if 判斷多個條件

 if判斷多個條件的寫法如下: (sh)

=================

#!/bin/sh
A=10
B=15

if [ $A = "10" ] && [ $B = "15" ]; then
    echo "A=10 and B=15"
fi

if [ $A = "10" ] || [ $B < $A ]; then
    echo "A=10 or B<A"
fi



2020年9月22日 星期二

Shell script使用for來parser以空白做間格的字串

 Shell script使用forparser以空白做間格的字串 (Bash)

 #!/bin/bash

package="111 222 333 555 666"

for p in ${package[@]}; do

    echo $p

done

 

實際執行結果,如下圖



2020年9月21日 星期一

cp: will not overwrite just-created

 今天 跑Script的途中,遇到一個問題 cp: will not overwrite just-created,而導致script停了下來

其發生主要的原因是,當我們 cp 或是 mv 兩個不同地方,卻是同樣的檔案名稱到同一個目錄底下

系統為了防止第二個文件去覆蓋第一個文件,所以報錯誤

 

今天遇到了,才知道會有這樣子的錯誤訊息,以上~


實際範例說明:  

有a, b, c三個資料夾,a與b資料夾內都有一個叫做file的檔案,接著我們故意一行指令同時複製a底下的file,與b底下的file到c資料夾,如下圖所示,就會出現此錯誤訊息!





2020年7月21日 星期二

main後面的參數 argc, argv 基本練習

C語言的main函數是可以帶參數的,分別是int類型的argc, 以及char類型的argv

而編譯出來的執行檔,可以在後面帶入字串,argc可以取得總共帶參數的數量,argv則可以取得每個參數的字串

寫一個範例,執行此執行檔,可以印出我執行檔後面帶的參數,範例如下:


#include <stdio.h>
int main(int argc, char *argv[]){    
     if(argc<2)    
    {        
          printf("no argument!\n");        
          return 0;    
    }    
    for(int i=0; i<argc; i++)        
        printf("%d=%s\n", i+1, argv[i]);    
    return 1;
}

編譯此程式,指令為: gcc argc_argv.c -o argc_argv
將此程式編譯成argc_argv,執行此執行檔: ./argc_argv aaa bbb
輸出結果   ===>   
1=./argc_argv
2=aaa
3=bbb  



2020年7月19日 星期日

call by value, call by address, call by reference

=================    call by value   ====================
其主要的意思, 參數以數值方式傳遞, 將一個變數的值, 帶入到副程式當中使用
範例如下:

void call_by_value(int value)
{
    int a;
    a = value
    print("call by value a=%d\n", a);
}

int main()
{
    int a=10;
    call_by_value(a);
    return 0;
}



==================   call by address  =====================
參數以記憶體位址的方式傳遞, 帶入到副程式中使用, 此帶入的變數也會在副程式的運算當中被更動.
範例如下:

void call_by_address_swap(int *a, int *b)
{
    int c;
    c=*a;
    *a=*b;
    *b=c;
}

int main()
{
    int value1=5;
    int value2=10;
    printf("before swap: value1=%d, value2=%d\n", value1, value2);
    call_by_address_swap(&value1, &value2);
    printf("after swap: value1=%d, value2=%d\n", value1, value2);
    return 0;
}


===================   call by reference  ====================
將參數以數值的方式傳遞到呼叫此參數的副程式,副程式需要有一個參考來接收這個參數,這是只有C++才有的,C是沒有的
範例如下:

void call_by_reference_swap(int &a, int &b)
{
    int c;
    c=a;
    a=b;
    b=c;
}

int main()
{
    int value1=5;
    int value2=10;
    printf("before swap: value1=%d, value2=%d\n", value1, value2);
    call_by_reference_swap(value1, value2);
    printf("after swap: value1=%d, value2=%d\n", value1, value2);
    return 0;
}

2020年4月13日 星期一

GT125機車,更換機油DIY教學

要DIY更換機油之前,請先確保有下圖幾項工具




















由左至右分別為:
1. 17mm套筒(必要),
2. 4T機油一罐(必要),
3. 空寶特瓶,裝漏出的機油(必要),也可以找其他容器替代
4. 長漏斗,最好買長一點的,要塞到放入機油的孔內(必要)
5. 剪刀,用來裁剪第三項寶特瓶 >.<

工具都齊全之後,把機車架好中柱,就可以來DIY換機油了,步驟如下:

1. 使用17mm套筒打開洩油螺絲,逆時針鬆開螺絲順時針鎖緊螺絲,洩油螺絲的位置,位於機車的左側,如下圖所示:
















再更近一點的圖:(逆時針鬆開螺絲,要鬆開時記得壓緊套筒再轉,避免滑牙)



















2. 快要轉開時,記得要先把寶特瓶容器放在下方,接住廢油,等待廢油全部漏光,就可以把洩油螺絲再鎖回去



3.  鎖好洩油螺絲之後,換到機車右側,有個加入機油的地方(油尺),油尺是用來確認機油的新舊與機油剩餘容量的地方,我們徒手把它轉開,把新的機油從這個地方加入.
記住逆時針是鬆開順時針為鎖緊





4. 轉開之後,把準備好的漏斗插入孔內,接著開始加入新的機油,GT125是可以加滿一公升的機油的.



5. 加滿之後就把油尺順時針鎖回去,最後把漏斗放到空的機油罐,把廢棄機油從寶特瓶倒回機油罐內,拿去回收,這樣就大功告成了!


備註:在外面給機車行換機油,基本也都要$150,自己DIY買機油Mobile 4T大賣場才賣$88,DIY就省了$60元,而且半小時就可以搞定了~

2020年3月10日 星期二

C語言的運算符號"^"表示為XOR運算

如標題,C語言程式碼中看到    "^"   符號,是去做XOR運算的意思

XOR運算的真值表如下:










下面是一個簡單的範例:

int A=0, B=0;
int C;
C=A^B;  ==>   C結果是0

==============================

int A=0B=1;
int C;
C=A^B;  ==>   C結果是1

==============================

int A=1B=0;
int C;
C=A^B;  ==>   C結果是1

==============================

int A=1B=1;
int C;
C=A^B;  ==>   C結果是0

2020年3月8日 星期日

Linux底下parted工具的使用方式,建立GPT磁碟分割表

Linux底下,切割硬碟使用的工具,最常看到的是fdisk或是parted,而這兩個工具都可以輕鬆完成硬碟分割的工作

當硬碟大於2TB時,磁碟分割表需要建立為GPT時,就必須使用parted工具

parted的操作方式如下所介紹:
=================================================================
首先輸入 sudo parted /dev/sda 就可以針對/dev/sda 進入parted的操作介面 ,如果要操作的為/dev/sdb,則輸入sudo parted /dev/sdb(若是沒有parted,請使用apt-get去安裝)





操作介面:




輸入help可以顯示指令的使用說明





輸入quit則可以離開parted操作環境





輸入print指令,可以列出目前磁碟的分割區資訊



====================================================================

刪除磁碟分割區的指令
=================================================================
首先用print查詢有幾個分割區,再使用rm指令加上分割區編號來做刪除

輸入 rm 1 則刪除第一分割區
輸入 rm 2 則刪除第二分割區





=================================================================

建立磁碟分割區的指令
=================================================================
首先要建立磁碟分割表

建立 msdos(一般MBR): mklabel msdos





硬碟大於2TB,可以使用GPT:mklabel gpt





如果硬碟存在之前的分割表資訊,則會出現如下警告




若確定要重新建立,輸入y

接著建立磁碟分割區: mkpart





接下來依序輸入一些參數

Partition name?   [ ]?     test     <=== 輸入分割區名稱,不想輸入可以直接Enter
File system type?    [ext2]?      <=== 檔案系統格式,預設ext2,按Enter就可以
Start? 1                                     <=== 輸入起始位置
End?  50000                             <=== 輸入結束位置,磁碟大小為50GB

接著離開parted





最後在Linux底下,使用mkfs.ext4格式化剛剛切割好的分割區
mkfs.ext4 /dev/sdb1











2020年3月7日 星期六

大潤發牌抽取式衛生紙 VS 愛買牌抽取式衛生紙

之前衛生紙之亂的時候,有先買了200包全家的衛生紙,但是在半年前也已經用完,全家的衛生紙,說實在的滿好用的,不會太薄,那時候一包七塊,真的超級划算.

後來補了大潤發牌的衛生紙,130抽,結果用起來,很不滿意,紙張太薄,有時候抽取的時候就破了,上廁所擦屁股也很容易破掉,至少必需抽三張才比較不會破

今天去逛愛買,看到有愛買牌的衛生紙!! 100抽,24包,$185,換算下來一包約7.7元,而且整袋提起來,很有重量感.
結果回家迫不及待想打開用看看,發現觸感怎麼跟大潤發牌的一樣,也是一樣的薄,後來看了一下製造廠,兩間製造廠在隔壁,名字又差一個字,該不會是同一家吧(這個還需要查證) @@“

大潤發牌:僑豐造紙
愛買牌:英豐造紙

所以結論是,如果你不喜歡使用太薄的衛生紙,大潤發&愛買 自有品牌的衛生紙,是都不太推薦的,雖然便宜了點,但是用起來會讓你很想趕快用完,再換別牌的衛生紙使用.

以上是個人的使用心得~


2020年1月6日 星期一

printf印出16進制(HEX)的值

假設有個變數i,印出16進制的值的方法,如下:
printf("0x%08x\n", i);

簡單的範例如下:
==========================================
#include <stdio.h>

int main()
{
    int i=20;
    printf("i=0x%08x\n", i);
    return 0;
}
===========================================

Result: