###### tags: `程式基礎` # [HW] 第一週(06/12 ~ 06/21):暖身週 > 掌握 Git 與 Command line 操作 # 作業 附註:.md 代表文章格式為 markdown,可自行上網搜尋相關教學,檔案內容請盡可能遵守[中文文案排版指北](https://github.com/sparanoid/chinese-copywriting-guidelines)。 ## hw1:交作業流程 請用文字一步步敘述應該如何交作業。 範例: 1. 新開一個 branch:`git branch hw1` 2. 切換到 branch:`git checkout hw1` 請將答案寫在 [hw1.md](hw1.md)。 ## 從 GitHub 複製課綱到本地端 1. 開啟 [GitHuba classroom](https://classroom.github.com/a/SbDvk2VA),複製課綱模板到自己的帳號底下 ![clone-1](https://i.imgur.com/UBpEFxx.png) 2. 在 GitHub 點選 `Clone or download` ![clone-2](https://i.imgur.com/3S4xeqG.png) 3. 輸入 `git clone https://github.com/Lidemy/mentor-program-4th-heidiliu2020.git`, 下載檔案到本地端 ![clone-3](https://i.imgur.com/yLDN87s.png) ### 寫作業前,一定要先新增 branch 4. `git branch week1`:建立 branch week1 ![git branch week1](https://i.imgur.com/UDU1YvA.png) 5. 開始寫作業 6. 寫完作業後,若有新增檔案,要先使用 `git add .`:加入版本控制 7. `git commit -am "week1 finish"`:進行 commit 8. `git push origin week1`:將檔案上傳到遠端 GitHub 9. 在自己的 GitHub 頁面,提出 PR(pull request) 10. 複製 PR 連結,到 Lidemy 學習系統上繳交作業 ![學習系統](https://i.imgur.com/C52SZIQ.png) ### 等助教批改完(由助教點選 Merge pull request) 11. GitHub 會顯示 Merged,代表遠端的分支 week1 已合併回 master 12. 回到本地端,`git checkout master`:切換到 master 13. `git pull origin master`:將遠端修改過的 master 同步到本地端 14. `git branch -d week1`:刪除已合併的分支 week1 --- ### hw2:理解放鬆很重要 大腦會在兩種不同的工作模式中切換,所以在卡關時讓大家適當休息一下是很重要的,否則只會越卡越深,陷入泥淖之中。 因此,這個作業希望讓大家學會休息的重要性。請你找個時間出去散步(像是家裡附近的公園之類的,反正哪裡都可以),並且把休息一天的心得寫在每日進度上面。 ## hw3:教你朋友 CLI 學了一項東西之後若是想驗證自己是不是真的懂,教別人是最快的方法。 有天,你的麻吉 h0w 哥跑來找你說:「欸!能不能教我 command line 到底是什麼,然後怎麼用啊?我想用 command line 建立一個叫做 wifi 的資料夾,並且在裡面建立一個叫 afu.js 的檔案。就交給你了,教學寫好記得傳給我,ㄅㄅ」 可...可惡,居然這樣子就跑走了。但因為他是你的麻吉,所以你也沒辦法拒絕。 因此這個作業要請你寫一篇簡短的文章,試圖教會 h0w 哥什麼是 command line 以及如何使用,並且要教他如何達成他想要的功能。 請將答案寫在 [hw3.md](hw3.md)。 --- ### Command Line 是什麼? 所謂的 Command Line,就是一種操控電腦的方法。 在這之前,要先提到我們一般習慣使用的電腦操作介面,叫作 GUI(圖形化介面),像是點擊按鍵、拖曳資料夾等等,都屬於視覺化操作。但 CLI(命令列介面)只能透過「純文字」和電腦溝通,以達成指定動作。 ### 為什麼非得使用 Command Line 呢? 因為有些情況下只能用 CLI。有些伺服器可能沒有 GUI (例如 database),這種情況就只能使用 CLI 來進行操作。 ### 那要怎麼用 Command Line? 我們可以藉由輸入程式碼對電腦下指令,讓電腦來執行我們想要的動作。 ### 實際操作(共六步驟) > 目標:用 Command Line 建立一個叫做 wifi 的資料,並且在裡面建立一個叫 afu.js 的檔案。 #### 步驟一、環境架設 要執行 Command Line 指令,必須先根據作業系統安裝 Command Line Tool 架設環境: 1. Windows:git-bash(推薦)、Cmder 2. Mac:iTerm2 完成環境架設後,即可開始輸入 Command Line 指令。 #### 步驟二、輸入 `pwd`:印出目前所在位置 > 小技巧:迷路時可隨時用 `pwd` 檢查當前位置。 ![pwd](https://i.imgur.com/JBE4BkC.png) #### 步驟三、輸入 `mkdir wifi`:建立新資料夾 wifi #### 步驟四、輸入 `cd wifi`:切換到資料夾 wifi ![mkdir、cd 指令](https://i.imgur.com/1y0jbcf.png) #### 步驟五、輸入 `touch afu.js`:新增檔案 afu.js #### 步驟六、輸入 `ls`:列出當前位置檔案清單,確認有成功新增檔案,完成! ![touch、ls](https://i.imgur.com/9pQtSrA.png) --- ## hw4:跟你朋友介紹 Git 因為你的人實在是太好,時不時就會有朋友跑來找你來幫忙。 這次來的是一個叫做菜哥的朋友,會叫做菜哥是因為家裡賣菜,跟你認識的其他人同名的話純屬巧合。 菜哥:「就是啊,我最近有一個煩惱。因為我的笑話太多了,所以我目前都用文字檔記錄在電腦裡,可是變得越來越多之後很難紀錄,而且我的笑話是會演進的。會有版本一、版本二甚至到版本十,這樣我就要建立好多個不同的檔案,弄得我頭很痛,聽說你們工程師都會用一種程式叫做 Git 來做版本控制,可以教我一下嗎?」 『好吧,我試試看』 菜哥:「謝啦,話說你來參加這個計畫學程式真的選對了欸,之後就不會有貧血的困擾了」 『為什麼』 「因為你會寫程式」 『...』 「喔...原來是血乘四的部分啊(拍手)」 就是這樣,在一陣尬聊之中你答應了菜哥的要求,要教他怎麼使用 Git 來管理他的笑話。 因此,你必須教他 Git 的基本概念以及基礎的使用,例如說 add 跟 commit,若是還有時間的話可以連 push 或是 pull 都講,菜哥能不能順利成為電視笑話冠軍,就靠你了! 請將答案寫在 [hw4.md](hw4.md)。 --- > 目標:瞭解 Git 的基本概念以及基礎的使用,例如說 add 跟 commit,若是還有時間的話可以連 push 或是 pull 都講。 ### 什麼是版本控制? 在談到 Git 之前,先來聊聊什麼是版本控制。 簡言之,就是將一個檔案所有歷史紀錄的版本都保存起來,以便日後參考。我們其實曾接觸過版本控制,例如備份檔案,或是以不同檔名保存編輯過的檔案。 而 Git 其實就是用來進行版本控制的程式,讓電腦自動幫我們做一些記錄與管理。 ### Git 基本指令操作 我們會使用 CLI 來操作 Git 指令,如果對 Command Line 還不熟悉,可以先參考這篇之前寫的筆記 [Command Line 入門 & 基本指令](https://jtliu.coderbridge.io/2020/06/14/command-line-codediary/)。 > 目標:管理不同版本的`笑話大全.txt` 。 1. `git init`:初始化這個目錄,讓 Git 對這個目錄做版本控管。會在當前位置新增 `.git` 隱藏資料夾,可用 `ls -al` 指令查看。 ![git init](https://i.imgur.com/SjZrxjK.png) 2. `git add .`:將所有檔案加入版本控制 3. `git commit -am joke1` --- ## hw5:簡答題 請將答案寫在 [hw5.md](hw5.md)。 1. 請解釋後端與前端的差異。 2. 假設我今天去 Google 首頁搜尋框打上:JavaScript 並且按下 Enter,請說出從這一刻開始到我看到搜尋結果為止發生在背後的事情。 3. 請列舉出 3 個「課程沒有提到」的 command line 指令並且說明功用。 ## 挑戰題 有一種東西叫做 [shell script](http://linux.vbird.org/linux_basic/0340bashshell-scripts.php),可以用 command line 指令以及一些語法寫成一個腳本,執行之後可以很方便地做很多事。 舉例來說,下面這個檔案我們存檔並取名叫做 test.sh: ``` bash #!/bin/bash touch "$1.js"; echo "檔案建立完成"; ``` 接著為了讓他可以執行,我們要更改檔案權限:`chmod +x test.sh`。 最後執行它:`./test.sh abc`,傳入參數`abc`。 就會建立一個叫做 abc.js 的檔案,這就是一個很簡單的 shell script。 現在請你寫一個 shell script,可以傳入一個數字 n,然後會產生 1~n 個檔案,檔名是 `{number}.js`。 舉例來說:`./num.sh 10`會產生`1.js`、`2.js`...`10.js`。 <details> <summary>提示 #1</summary> 去找找看怎麼在 shell script 裡面寫迴圈吧! </details> ## 超級挑戰題 請寫一個`github.sh`,可以傳入一個參數 username,執行之後就會輸出這個 GitHub 使用者的暱稱、介紹、地點跟個人網站。 範例: ``` ./github.sh aszx87410 輸出: Huli Love coding, teaching, and writing. Believe sharing can make the world a better place. Taipei, Taiwan https://medium.com/@hulitw ``` <details> <summary>提示 #1</summary> 你知道嗎?用這個網址可以取得使用者的資料:https://api.github.com/users/aszx87410 </details> <details> <summary>提示 #2</summary> cut, grep, sed, awk 這些指令都是字串處理的好夥伴 </details>