跳至主要内容

15 篇文章 含有標籤「電腦科學」

檢視所有標籤

使用 Cursor AI Editor 自學程式設計教學指南

· 閱讀時間約 5 分鐘

前言

在過去,自學程式設計往往需要依靠書籍、線上課程與不斷查詢文件。但隨著 AI 工具的發展,學習編程的方式有了根本性的改變。其中,Cursor AI Editor 作為一款內建 AI 協作的程式開發工具,正在迅速改變開發與學習的流程。

Cursor 是一款基於 Visual Studio Code(VSCode)打造的 AI 編輯器,結合了大型語言模型(如 GPT-4)的強大能力,提供自然語言詢問、程式碼補全、錯誤解釋、重構建議、即時除錯等功能。它不只是編輯器,更是學習者的私人助教。

本篇教學筆記將介紹 Cursor 的特色、安裝方式、學習策略與實際操作案例,幫助讀者高效且系統性地使用 Cursor 進行自學。


重點摘要

  • 什麼是 Cursor?

    • 基於 VSCode 打造的 AI 編輯器,內建 OpenAI 的 GPT 模型。
    • 主打「AI 內嵌互動」,能即時解釋、補全、建議與生成程式碼。
  • 為什麼用 Cursor 來自學程式?

    • 可以「邊寫邊問」:例如不懂 for 迴圈可以直接用自然語言提問。
    • 不需要來回切換 ChatGPT 網頁與 IDE。
    • 適合快速原型設計、除錯與重構練習。
    • 學習者可專注在理解邏輯與實作,不被語法阻礙。
  • 適合學習的語言

    • Python(入門首選)
    • JavaScript、TypeScript(網頁開發)
    • Go、Rust(系統程式)
    • HTML、CSS、React(前端設計)
  • 常見使用場景

    • 問語法與錯誤訊息
    • 撰寫函式與模組
    • 重構既有程式碼
    • 撰寫註解與單元測試
    • 撰寫教學與技術說明文件

安裝與啟用教學

Step 1:下載 Cursor

  • 前往官網:https://www.cursor.sh
  • 支援 macOS、Windows、Linux
  • 安裝後即為一個 VSCode-like 的獨立應用程式

Step 2:登入與模型設定

  • 使用 Google 或 GitHub 帳號登入
  • 免費帳號可使用 GPT-3.5
  • 若訂閱 Plus,可使用 GPT-4 Turbo,提升準確率與理解能力

Step 3:開啟專案或建立新檔案

  • 可直接開啟資料夾或單一檔案進行練習
  • 支援多種語言高亮與執行(視安裝套件而定)

實際學習範例

範例一:學習 Python 的 for 迴圈

操作步驟:

  1. 建立一個檔案 loop_example.py
  2. 輸入註解:
# 用 for 迴圈列出 1 到 10 的平方
  1. Cursor AI 自動補齊:
for i in range(1, 11):
print(i ** 2)
  1. 若不懂 range(1, 11),可選取並右鍵點選「Ask AI」,輸入:「這段 range 是什麼意思?」

  2. AI 回覆:

range(1, 11) 代表從 1 到 10(不含 11)的整數序列。


範例二:重構程式碼並學習函式封裝

原始碼:

print("Hello, Alice")
print("Hello, Bob")
print("Hello, Charlie")

操作:

  • 選取三行程式,點擊「Ask AI」→ Prompt:「將這段重構成一個函式並使用參數」

AI 回覆:

def greet(name):
print(f"Hello, {name}")

greet("Alice")
greet("Bob")
greet("Charlie")

你可以反向問 AI:「為什麼這樣寫比較好?」來進行設計思維學習。


範例三:查錯與除錯練習

錯誤程式碼:

for i in range(5)
print(i)

操作:

  • AI 會即時標出語法錯誤
  • 你可以點選錯誤紅線,詢問 AI「為什麼錯?」

AI 解釋:

缺少冒號,應改為 for i in range(5):

這能幫助初學者從錯誤中快速學習語法規則。


範例四:使用自然語言寫出完整函式

Prompt:

寫一個函式,輸入生日字串 "1990-05-20",回傳目前年齡(以今天為準)

AI 產生:

from datetime import datetime

def calculate_age(birthday_str):
birthday = datetime.strptime(birthday_str, "%Y-%m-%d")
today = datetime.today()
age = today.year - birthday.year - ((today.month, today.day) < (birthday.month, birthday.day))
return age

print(calculate_age("1990-05-20"))

你可以繼續問 AI:「請幫我加上類型註解與 docstring」。


自學策略建議

  • 從小功能練習開始:例如撰寫簡單計算器、字串反轉等
  • 每日一題 / 一功能:寫完後請 AI 幫忙檢查、重構
  • 主動問問題:任何看不懂的語法、邏輯、錯誤訊息都可以問 AI
  • 反覆重構與測試:藉由練習重構與單元測試培養良好工程習慣
  • 閱讀 AI 解釋:不要只複製貼上,理解 AI 為何這樣寫

總結

Cursor AI Editor 提供了一個嶄新的學習編程體驗,不需要離開編輯器、查 Stack Overflow 或切到 ChatGPT 頁面,就能獲得即時的回饋與教學。它讓程式碼本身成為教材,讓錯誤成為學習的入口,也讓初學者擁有如同一對一家教般的指導資源。

無論你是程式設計初學者、職涯轉職者,或是希望精進特定語言技巧的開發者,使用 Cursor 都能有效提升學習效率與成效。建議搭配一個實際專案(如 Todo App、API Server)作為學習主軸,在實作中成長,在 AI 引導下理解設計背後的邏輯。

參考文件

  1. 直覺式程式開發是什麼?

ChatGPT 自學程式設計:觀念、策略與實作練習介紹入門教學筆記

· 閱讀時間約 4 分鐘

前言

在資訊科技快速發展的時代,程式設計已成為現代人重要的素養之一。不論是為了轉職、創業、副業開發,還是單純提升邏輯思維與解決問題的能力,學習寫程式都是一項值得投資的技能。

然而,對初學者而言,最大的挑戰往往不是語法的難度,而是缺乏明確的學習路線與即時回饋。在這樣的情況下,ChatGPT 作為 AI 學習助手,能提供清晰的知識講解、逐步拆解邏輯、即時錯誤診斷與練習引導,大大提升了自學效率與信心。

本筆記整理了使用 ChatGPT 進行程式設計學習時的觀念、策略與實作練習方法,希望幫助初學者建立穩固的基礎與正確的學習路徑。

重點摘要(策略與觀念)

  1. 明確學習目標

    • 選定學習語言(如 Python, JavaScript)與應用目標(如網站開發、數據分析、App 開發)
  2. 建立學習流程:輸入+實作+反思

    • 使用 ChatGPT 學習語法與邏輯概念(Input)
    • 嘗試手寫程式並請 AI 協助 Debug(Practice)
    • 回顧錯誤原因與改法,加強理解(Reflection)
  3. 以問題導向學習(Problem-Driven Learning)

    • 先丟出問題給 ChatGPT,觀察如何解決,再嘗試自己實作
    • 例如:「如何用 Python 產生一份購物清單報表?」
  4. 善用 ChatGPT 作為「教練」而非「代工」

    • 避免單純複製貼上,要請 ChatGPT 解釋邏輯、逐步引導、釐清不懂的概念
  5. 模擬真實開發場景進行專題實作

    • 例如模擬一個 To-Do List 應用、API 串接應用、爬蟲專案等,請 ChatGPT 協助拆解需求與架構設計

ChatGPT 學習策略示範

策略一:從概念切入,請 AI 解釋底層邏輯

提問範例

請用 Python 說明變數與資料型別的差異,並舉實際應用範例

ChatGPT 回應重點摘要

  • 變數:用來儲存資料的名稱
  • 資料型別:資料的類型(整數、字串、布林等)
  • 實作範例:
name = "Alice"       # 字串 (str)
age = 30 # 整數 (int)
is_student = False # 布林 (bool)
height = 165.5 # 浮點數 (float)

策略二:進行逐步練習題,練邏輯思考與語法應用

提問範例

我想練習寫 if-else 判斷式,請出三題由簡入難的題目,並在我寫完後幫我檢查錯誤與優化建議

ChatGPT 回應可能為

題目一:請判斷一個數字是正數、負數或零 題目二:請判斷某年是否為閏年 題目三:根據使用者輸入的成績(0~100),輸出等第(如 A、B、C)

學生寫完程式碼後可貼上請 AI 檢查,ChatGPT 會指出邏輯問題、格式建議、寫法優化,例如:

score = int(input("請輸入成績:"))
if score >= 90:
print("A")
elif score >= 80:
print("B")
elif score >= 70:
print("C")
else:
print("D")

策略三:模擬專案開發並逐步請 AI 協助拆解需求與設計程式架構

專案題目:待辦事項清單(To-Do List)CLI 應用程式

ChatGPT 輔助設計流程

  1. 功能需求列出(使用者可以新增、刪除、顯示任務)
  2. 資料結構設計(使用 list 儲存任務)
  3. 撰寫基本操作函式(add_task(), remove_task(), show_tasks()
  4. 主選單邏輯與互動介面

實作初步程式碼

tasks = []

def add_task(task):
tasks.append(task)

def remove_task(index):
if 0 <= index < len(tasks):
tasks.pop(index)

def show_tasks():
for i, task in enumerate(tasks):
print(f"{i+1}. {task}")

while True:
print("\n1. 新增任務\n2. 移除任務\n3. 顯示任務\n4. 離開")
choice = input("請輸入選項:")

if choice == "1":
task = input("輸入任務內容:")
add_task(task)
elif choice == "2":
index = int(input("輸入任務編號:")) - 1
remove_task(index)
elif choice == "3":
show_tasks()
elif choice == "4":
break
else:
print("無效選項,請重新輸入")

延伸練習:資料儲存加上檔案輸出(使用 JSON 或 TXT)、加入完成/未完成狀態、排序等


總結:AI 是鏡子,也是橋樑

ChatGPT 並不是神奇的萬能程式魔法師,但它是一面鏡子,能幫助你檢視自己的邏輯與觀念;它是一座橋樑,讓你跨越學習上的卡關與挫敗。

重點從來不是 ChatGPT 替你「寫」了什麼,而是你透過它學會「怎麼思考、怎麼問問題、怎麼拆解需求、怎麼 debug」。

透過這樣的過程,你學到的不只是語法,而是解決問題的能力。這才是真正的程式設計思維,也是真正能走得長遠的自學之路。

參考文件

  1. 直覺式程式開發是什麼?

使用 ChatGPT 自學程式設計指南

· 閱讀時間約 5 分鐘

前言

在過去,學寫程式意味著需要投入大量時間閱讀厚重的教材、反覆摸索錯誤訊息的意義,甚至在 Stack Overflow 上尋求救援。而如今,透過 AI 工具的協助,例如 ChatGPT、GitHub Copilot、Cursor 等,初學者能更快速地理解語法、解決錯誤、模擬情境,提升學習效率。然而,AI 工具並不能替代你的思考,它是加速學習的助力,但不是學習的捷徑。

使用 ChatGPT 自學程式設計指南

在人工智慧快速發展的時代,學習寫程式不再是一條孤單、艱難的路。現在有了 ChatGPT 這樣的語言模型作為學習輔助工具,自學者不再需要花大量時間在搜尋資料、理解英文技術文檔或等待他人回答問題上。你可以隨時向 ChatGPT 發問、請它幫忙解釋觀念、修正錯誤,甚至請它幫你出練習題,進行模擬面試。只要方法得當,ChatGPT 可以成為你學習程式設計過程中最可靠的學伴。

本筆記將說明如何結合 ChatGPT 學習程式設計的策略,並透過一個 Python 小專案,實際示範學習流程。

為什麼選擇 ChatGPT 自學程式設計?

過去自學程式最困難的部分在於:

  1. 資源太多,不知從何下手
  2. 卡關時找不到人問問題
  3. 英文技術文件理解困難
  4. 缺乏練習與回饋機制

而 ChatGPT 正好可以解決這四點。你可以用自然語言提問,像對一位資深工程師學習,快速獲得解答、範例與練習題。


建議學習語言:Python

Python 是目前最推薦的入門語言,原因包括:

  • 語法簡單、可讀性高
  • 廣泛應用於網頁後端、資料分析、機器學習
  • 有豐富的學習資源與社群
  • ChatGPT 對 Python 的支援度最佳

ChatGPT 自學步驟建議

步驟一:建立學習計畫

你可以直接問 ChatGPT:「我是一個程式設計初學者,請幫我規劃一份 30 天的 Python 自學計畫,每天學習 1 小時。」

它會給你一份條列式進度表,包含觀念、實作與資源建議。

步驟二:每個主題搭配 ChatGPT 提問

舉例:你在學「變數與資料型別」,可以問:

  • 什麼是 Python 中的變數?
  • 請舉幾個整數、浮點數、字串的例子。
  • 有哪些常見的型別轉換方法?

ChatGPT 回答後,請自己動手寫一段練習程式確認理解。


小專案練習:待辦清單 CLI 程式

這是一個適合初學者練習的 Python 小專案,透過這個例子,你可以學到以下基礎概念:

  • 變數與資料型別
  • 陣列(列表)
  • 函式定義
  • 使用 while 迴圈與 if 條件判斷
  • 使用 input() 與 print()

專案目標

製作一個可以在命令列中操作的待辦清單程式,讓使用者可以新增、刪除與列出事項。

程式碼示範

todo_list = []

def show_menu():
print("\n--- 我的待辦清單 ---")
print("1. 新增事項")
print("2. 查看清單")
print("3. 刪除事項")
print("4. 離開")

while True:
show_menu()
choice = input("請輸入選項(1-4):")

if choice == "1":
item = input("請輸入待辦事項:")
todo_list.append(item)
print("已新增!")
elif choice == "2":
print("\n--- 待辦事項 ---")
if not todo_list:
print("清單是空的")
else:
for i, task in enumerate(todo_list):
print(f"{i + 1}. {task}")
elif choice == "3":
index = int(input("請輸入要刪除的編號:")) - 1
if 0 <= index < len(todo_list):
removed = todo_list.pop(index)
print(f"已刪除:{removed}")
else:
print("無效的編號")
elif choice == "4":
print("感謝使用,再見!")
break
else:
print("無效的輸入,請重新輸入 1-4")

這個小專案完整結合了輸入輸出、資料儲存、條件與迴圈控制結構,是一個理想的練習題目。


如何用 ChatGPT 擴充與優化

完成後你可以繼續問 ChatGPT:

  • 我要加上「儲存清單到檔案」功能該怎麼做?
  • 我要讓這個程式使用英文與中文雙語介面?
  • 請幫我用物件導向方式重構這段程式。

你會發現,透過這樣的對話過程,你正在一步步學會更進階的程式技巧與架構設計觀念。


自學關鍵原則

  1. 主動提問:卡住時請立即向 ChatGPT 提問,避免原地打轉。
  2. 多做小專案:觀念看過就忘,實作才記得住。
  3. 理解 AI 回答,而非只是複製貼上:每次用 ChatGPT 給你的程式碼時,都要確實理解它的邏輯。
  4. 刻意練習 + 反饋迴圈:請 ChatGPT 幫你批改程式、找出錯誤、提出改進建議。

總結

程式設計不再是一門只能靠天份與背景的技能。現在,只要你有好奇心與持續練習的動力,結合像 ChatGPT 這樣的 AI 工具,任何人都能成為開發者。

你可以從「請幫我寫一支輸出 Hello, World 的 Python 程式」這樣簡單的對話開始,到最後獨立完成一個個有用的小工具。這不僅是一條技能學習的道路,更是你建立邏輯思維、自信心與問題解決力的旅程。

現在就打開你的編輯器,開始寫第一行程式吧。如果你不知道該寫什麼,試著問 ChatGPT:「今天我可以練習什麼 Python 題目?」

參考文件

  1. 直覺式程式開發是什麼?

電腦科學概論:演算法概要

· 閱讀時間約 6 分鐘

電腦科學概論:演算法入門概要

隨著資訊科技發展,演算法已經無所不在存在我們的生活當中。舉凡上網 google 搜尋資料、下載檔案的壓縮方法、檔案的加密傳輸等,都可以看到演算法運作的蹤跡。一般來說資料結構和演算法是程式設計最基本的內涵,所以有人說:程式設計 = 資料結構 + 演算法。那究竟什麼是演算法/算法呢?

咱們維基百科給了個非常需要慧根才能理解的解釋:

演算法(algorithm),在數學(算學)和電腦科學之中,為任何良定義的具體計算步驟的一個序列,常用於計算、資料處理和自動推理。精確而言,演算法是一個表示爲有限長,列表的有效方法。演算法應包含清晰定義的指令,用於計算函式。

我們把它翻譯成人話吧:

演算法是一個有輸入且有輸出的解決問題的步驟,它具有明確和有限步驟且有效的特性

舉例來說,我們今天要創作一道蔥花蛋或菜脯蛋,我的步驟會是把材料當做輸入:

  1. 放點油
  2. 打蛋
  3. 如果喜歡蔥花可以加入蔥花,如果喜歡菜脯可以加入菜脯(程式術語:if...else 條件判斷)
  4. 放入少許鹽巴
  5. 中火快炒,翻五次面(程式術語:for 迴圈)
  6. 當看到蛋面呈現金黃色時可以起鍋,結束料理(程式術語:while 迴圈)
  7. 好吃的蔥花蛋或菜脯蛋上桌

透過清楚明確的有限步驟,我們可以解決我們想解決的問題並產出我們要的輸出結果

演算法的定義

一般演算法嚴謹的條件必須符合:

  1. 輸入(Input):0 或多個輸入
  2. 輸出(Output):至少有一個回傳結果(有可能回傳 0 或是 null)
  3. 明確性(Definiteness):每一個指令步驟必須明確
  4. 有限性(Finiteness):在有限步驟後一定會結束不會進入無窮迴圈
  5. 有效性(Effectiveness):步驟清楚可行,能使用紙筆計算求解

舉個例子:

下面是一個 Python 判斷是否可以投票的演算法(假設可以投票為 18 歲),仔細看下面的算法雖然簡單但有輸入也有輸出,且有明確有限步驟,步驟可行

def check_can_vote(age):
if age >= 18:
return True
else:
return False

check_can_vote(20)

評估複雜度

事實上,解決一個問題不一定只有一種演算法。那我們怎麼評估演算法的好壞呢?一般來說會有兩種方式:時間複雜度和空間複雜度,比較常見的是使用時間複雜度

時間複雜度(Time Complexity)

想要評估一個演算法執行速度快慢,最直覺的方式是測量演算法計算的時間。但由於執行時間會受不同電腦/計算機機器硬體規格與實作方式影響,很難放諸四海皆準,因此學術上傾向於統計演算法步驟數目,當做時間複雜度可考量。

最常見的評估演算法好壞就是時間複雜度,時間複雜度是指運用概量(漸近分析 asymptotic analysis,例如:當 f(n) = n^2 + 3n 這個函數 n 很大時,3n 會比 n^2 小很多,可以忽略不計。當 n 趨近無限大時,f(n) 等價於 n^2)而非絕對時間(因為會牽涉到電腦/計算機環境變因,所以絕對時間不容易準確),通常我們使用 Big O notation 大 O 符號來表示時間複雜度。假設算法函式所需執行時間為 T(n) ,則我們將其時間複雜度表示為 O(f(n))f(n) 又稱為執行時間的成長率,是影響速度最大的變數。

首先我們先來看 O(1) 的例子,這個演算法執行的步驟是固定的,跟輸入的值無關:

# 不管 n 輸入為多少,這個程式永遠只會執行一次
def print_num(num):
print(num)

print_num(10)

下面這個例子就是 O(n) 的例子,時間複雜度跟輸入的次數有關,隨著 num 變大所需要跑 num 次,是線性時間的成長。這邊 f(n) 等於 n,所以 O(f(n)) 就是 O(n)

def sum_number(num):
total = 0
for n in num:
total += num
return total

sum_number(10)

O(nlog(n))

一般常見的時間複雜度如下圖表是: 電腦科學概論:演算法入門概要

空間複雜度

演算法的空間複雜度是指演算法所需要消耗的儲存記憶體資源。其計算和表示方法與時間複雜度類似,一般都用複雜度的漸近性來表示(asymptotic analysis)。

例如下面這個函式,不管程式跑了多少遍,都不會影響使用的變數數量,故該函式的空間複雜度為 O(1):

def sum_number(num):
total = 0
for n in num:
total += num
return total

sum_number(10)

但下面這個函式,會隨著丟進去的數字而影響變數的量,例如:

輸入為 n,就換產生 n 個變數空間需要儲存,故該函式空間複雜度為 O(n)

def sum_number(num):
total = []
for n in num:
total.append(num)

sum_number(10)

總結

以上簡單介紹了演算法入門教學。隨著資訊科技發展,演算法已經無所不在存在我們的生活當中。舉凡上網 google 搜尋資料、下載檔案的壓縮方法、檔案的加密傳輸等,都可以看到演算法運作的蹤跡,所以值得我們細細品味,接下來我們將介紹常見的經典演算法範例。

參考文件

  1. 台師大演算法筆記
  2. 演算法與資料結構
  3. 大O符號
  4. Algorithm Analysis
  5. All you need to know about “Big O Notation” to crack your next coding interview

image via pandorafmsfreecodecamp

如何在 Windows 打造 Python Web 開發環境入門教學 Part2

· 閱讀時間約 1 分鐘

如何在 Windows 打造 Python Web 開發環境

所謂工欲善其事,必先利其器。我們開發程式之前我們最重要的就是要設定好開發環境,接下來我們將帶領讀者體驗如何在 Windows 打造 Python Web 開發環境。

撰寫第一個 Python Django 程式

  1. 創建虛擬開發環境:conda create -n <自定義虛擬環境名稱> python=3.5
  2. 觀看已建立的虛擬環境:conda info -e
  3. 進入虛擬環境:activate <自定義虛擬環境名稱>
  4. 安裝套件:pip install django
  5. 觀看已安裝套件:pip list
  6. 建立第一個 django 專案:django-admin startproject my_first_app
  7. 啟動伺服器:python manage.py runserver
  8. 到瀏覽器觀看成果!http://localhost:8000http://127.0.0.1:8000

其他常用指令

  1. 離開虛擬環境:deactivate
  2. 移除虛擬環境:conda remove <自定義虛擬環境名稱> -n --all
  3. pip uninstall 套件名稱

影片教學

如何在 Windows 打造 Python Web 開發環境入門教學 Part1

· 閱讀時間約 2 分鐘

如何在 Windows 打造 Python Web 開發環境

所謂工欲善其事,必先利其器。我們開發程式之前我們最重要的就是要設定好開發環境,接下來我們將帶領讀者體驗如何在 Windows 打造 Python Web 開發環境。

安裝軟體步驟

  1. 下載安裝 google chrome 瀏覽器
  2. 下載安裝 Visual Studio CodeSublime text 文字編輯器
  3. 下載安裝 cmder terminal 終端機程式 (請下載含 git 的 full 完整版本)
  4. 下載安裝 anaconda for windows (請依你的作業系統位元 32/64 下載對應程式,記得安裝時要勾選加入環境變數)
  5. 在終端機輸入 (若正確顯示版本即為安裝成功):python -V
  6. 輸入 python 可進入互動式對話環境,可以執行 python 程式

撰寫第一個 Python 程式

  1. 打開 Visual Studio Code 或 Sublime text 並建立一個 hello.py 檔案:
print('hello python')
  1. 到 cmder 終端機移動到 hello.py 資料夾下輸入 python hello.py

就可以看到你撰寫的第一個 Python 程式 hello python 啦!

影片教學

如何在 Windows 打造 JavaScript Web 開發環境入門教學

· 閱讀時間約 2 分鐘

如何在 Windows 打造 JavaScript Web 開發環境

所謂工欲善其事,必先利其器。我們開發程式之前我們最重要的就是要設定好開發環境,接下來我們將帶領讀者體驗如何在 Windows 打造 JavaScript Web 開發環境。

安裝軟體步驟

  1. 下載安裝 google chrome 瀏覽器
  2. 下載安裝 Visual Studio CodeSublime text 文字編輯器
  3. 下載安裝 cmder terminal 終端機程式 (請下載含 git 的 full 完整版本)
  4. 下載安裝 Node.JS 選擇左邊穩定版本,按照指令安裝完成
  5. 在終端機輸入 node -v 若成功顯示版本,代表安裝完成
  6. 安裝 http-server 套件:npm install http-server -g

撰寫第一個 JavaScript 程式

  1. 打開 Visual Studio Code 或 Sublime text 並建立一個 index.html 檔案:

  2. index.html 輸入:

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width">
    <title>Test</title>
    <script>
    console.log(‘hello JS!);
    </script>
    </head>
    <body>
    </body>
    </html>
  3. 儲存後在終端機移動到該檔案資料夾下,輸入 http-server -p 7777 啟動伺服器

  4. 打開瀏覽器輸入網址:http://127.0.0.1:7777http://localhost:7777

  5. 開發者工具,可以在 console 中看到 hello JS!

  6. 恭喜讀者完成第一個 JavaScript 應用程式啦!

影片教學

自學程式設計與電腦科學入門實戰:Git 與 Github 版本控制基本指令與操作入門教學

· 閱讀時間約 17 分鐘

自學程式設計與電腦科學入門實戰:Git 與 Github 版本控制基本指令與操作入門教學

要成為一個真正的軟體工程師(Software Engineer)除了掌握基礎開發能力外,更重要的是和其他工程師和開發者團隊合作和溝通的能力,所以若你能培養出掌握 Git 等版本控制操作和 Git server 架設的能力,你會更容易參與開放原始碼(open source)的社群和提昇自己在職場上的價值。關於相關環境工具若你還沒準備好,可以參考 如何在 Windows 打造 Python 開發環境設定基礎入門教學 這篇教學文章。好,那我們就準備開始吧!

什麼是版本控制系統(Version Control System)?

自學程式設計與電腦科學入門實戰:Git 與 Github 版本控制基本指令與操作入門教學

版本控制系統是一種軟體工程的開發技巧,可以透過這個系統讓每位成員的軟體版本可以方便同步和維護管理(不然要用 email 或是其他工具傳送和管理十分麻煩,尤其程式又常常會有不同版本修改的問題!)。在沒有版本控制系統時,我們常會在編輯檔案前複製一個備份,或是在更新檔案後產生許多重複檔案,非常不便且難以維護。因此,使用版本控制系統的需求就應運而生啦!

自學程式設計與電腦科學入門實戰:Git 與 Github 版本控制基本指令與操作入門教學

一般在軟體開發中又分為中央式系統(例如:SubversionCVS 等)與分散式系統(例如:GitBitKeepermercurial 等),中央式版本控制系統的工作主要在一個伺服器進行,由中央管理存取權限「鎖上」檔案庫中的檔案,一次只能讓一個開發者進行工作。而分散式系統讓不同開發者直接在各自的本地檔案庫工作,並容許多個開發者同時更動同一個檔案,而每個檔案庫有另外一個合併各個改變的功能。分散式系統讓開發者能在沒有網路的情況下也能繼續工作,也讓開發者有充分的版本控制能力,而不需經中央管理者的許可,但分散式系統仍然可以有檔案上鎖功能。

自學程式設計與電腦科學入門實戰:Git 與 Github 版本控制基本指令與操作入門教學

什麼是 Git?什麼是 Github?

Git 是一個分散式版本控制軟體,最初由 Linus Torvalds 創作(也是作業系統 Linux 系統的開發者),其最初目的是為更好地管理 Linux kernel 開發而設計,其具備優秀的 merge tracing 合併程式碼的能力(使用程式碼 snapshot 來比較歷史版本差異)。

Github 則是一個支援 git 程式碼存取和遠端托管的平台服務,有許多的開放原始碼的專案都是使用 Github 進行程式碼的管理。若是讀者未來有志於從事程式設計相關工作的話,建議可以熟悉掌握 Git 和 Github 的使用,並建立自己的 Github profile 作品集。

Git 基本觀念

自學程式設計與電腦科學入門實戰:Git 與 Github 版本控制基本指令與操作入門教學

Git 可以分為 Local(本地)和 Remote(遠端)兩個環境,由於 Git 屬於分散式的版本控制系統,所以開發者可以在離線 local 環境下開發,等到有網路時再將自己的程式推到 Remote 環境或 pull 下其他開發者程式碼進行整合。在 Local 中我們又分為 working directory(工作資料夾)、staging area(暫存區)和 repositories(檔案庫)。

當自己開發時會在工作資料夾工作,當要進入檔案庫之前會先將檔案加入暫存區,確認沒問題則 commit 到檔案庫中,最後 push 上去 remote 環境。在 Git 中若是有和其他開發者一起合作,則會需要處理不同 branch 之間 conflict 和 merge 的問題。

自學程式設計與電腦科學入門實戰:Git 與 Github 版本控制基本指令與操作入門教學

Git 與 Github 實戰操作入門教學

接下來我們用一個實際的實戰範例讓讀者可以快速的掌握那些基礎必知必會的 Git/Github 操作技能:

  1. 安裝並且設定 Git

    任務 1:安裝 Git 到你的電腦上,並且設定好 Git 內部的使用者名稱和電子信箱

    Linux 若是使用 Debian 基礎的作業系統可以在終端機輸入以下指令安裝 git:

    $ apt-get install git

    若是 Fedora 系列可以輸入:

    $ yum install git-core

    若是 windows 可以下載安裝 cmder 這個模擬 Linux terminal 終端機時選擇完整版本就會順便安裝或是到 Git 官網安裝。當然在市面上有許多免費 GUI 圖形化的 Git 操作軟體,若是初學者則建議先熟悉整個 git 工作模式和指令,再去使用圖形化工具會比較好,這樣你才比較知道圖形化程式背後做了什麼事情。Mac 則是可以到 Git 官方網站 選擇對應作業系統,按照步驟完整下載安裝。另外也可以參考中文安裝教學

    由於我們會選擇 Github 當作遠端托管程式的環境,所以我們也可以根據作業系統安裝 Github 桌面版當作操作工具(內建安裝 Git)。

    自學程式設計與電腦科學入門實戰:Git 與 Github 版本控制基本指令與操作入門教學

    若是安裝完成,打開終端機(terminal)或 cmder 輸入以下指令,若成功顯示版本(建議 Git 版本在 2 以上),代表安裝成功囉!terminal(終端機)是一個可以下指令讓電腦做事情的互動介面(例如:新增檔案、移動到資料夾等)

    // 其中 $ 為提示字元,在輸入指令時不用輸入該符號,否則會錯誤,若是使用 windows cmder 預設是 λ
    $ git --version

    接下來設定你的帳戶,讓 Git 知道這台電腦做的修改要連結到哪一個使用者(待會我們要在 Github 上註冊帳號,建議使用一致的帳號和電子信箱):

    $ git config --global user.name "<Your Name>"

    設定電子郵件:

    $ git config --global user.email "<your@gmail.com>"
  2. 建立一個本機的 repository

    任務二:在自己的電腦上建立一個新的 local repositories(本地檔案庫)

    自學程式設計與電腦科學入門實戰:Git 與 Github 版本控制基本指令與操作入門教學

    repository(檔案庫)是一個什麼樣的概念呢?事實上 repository 就是一個專案,又簡稱 repo。以電腦的檔案資料管理來看,我們通常會把同一個專案的資料放到同一個資料夾下,所以我們也可以把 repository 看成一個資料夾。

    // 建立一個 hello-git 資料夾
    $ mkdir hello-git
    // 移動到 hello-git 資料夾
    $ cd hello-git
    // 將專案資料夾建立成 git repository
    $ git init
    // 列出專案資料夾下的檔案和資料夾(-l 參數為列出詳細資料,-a 為列出隱藏資料夾)
    $ ls -la

    當你執行 git init 後,你可以發現多出了 .git 這個隱藏資料夾,可以看到裡面檔案和資料夾如下:

    自學程式設計與電腦科學入門實戰:Git 與 Github 版本控制基本指令與操作入門教學

    到這邊恭喜讀者,完成你第一個 git 專案資料夾改造計畫!

  3. 檢視狀態、新增或修改 commits

    任務三:在你的 repository 檔案庫中建立一個新檔案,新增一些內容到該檔案並且將那些檔案修改提交 commit 到 Git 中

    接著我們使用文字編輯器,新增一個 hello.py 的檔案(裡面是一個會印出 hello python & git 字串的 python 程式):

    print('hello python & git')

    然後在終端機的專案資料夾下輸入 git status 顯示目前工作環境狀態:

    $ git status
    On branch master

    Initial commit

    Untracked files:
    (use "git add <file>..." to include in what will be committed)

    hello.py

    nothing added to commit but untracked files present (use "git add" to track)

    我們會發現因為我們有新增新的檔案,但是還沒進到 git 追蹤範圍中/暫存區,所以我們要使用 git add hello.py 加入追蹤,這樣之後檔案有修改就可以追蹤到。

    $ git add hello.py
    $ git status
    On branch master

    Initial commit

    Changes to be committed:
    (use "git rm --cached <file>..." to unstage)

    new file: hello.py

    若是確認沒問題我們就準備 commit 進去 repository 囉!

    // 比較現在檔案和上次 commit 之間的差異,也就是說你做了哪些修改
    $ git diff
    // -m 為輸入 commit message,也就是說這個 commit 內做了哪些事情
    $ git commit -m "Init hello.py"
    [master (root-commit) ad6d328] Init hello.py
    1 file changed, 1 insertion(+)
    create mode 100644 hello.py

    // commmit 完成
    $ git status
    On branch master
    nothing to commit, working tree clean

    若是想反悔不想把檔案加入追蹤呢?

    // 檔案尚未加入過追蹤時使用,即可恢復到檔案尚未加入暫存區
    $ git rm --cached hello.py

    // 若檔案已經在 repository 內,則使用以下指令
    // repository 與 stage 的檔案都會被還原到 HEAD,但 working directory 內的檔案不變
    $ git reset HARD

    當你追蹤後修改了檔案,例如把 hello.py 的內容改成:

    print('hello python & git rock')

    若有檔案修改,記得要再 add 修改的檔案(這是新手比較容易忘記的部分),若是要放棄修改可以使用 git checkout -- 檔案名稱

    // 比較現在檔案和上次 commit 之間的差異,也就是說你做了哪些修改
    $ git diff
    // 查看目前工作狀態
    $ git status
    Changes not staged for commit:
    (use "git add <file>..." to update what will be committed)
    (use "git checkout -- <file>..." to discard changes in working directory)

    modified: hello.py

    commit 這個修改時簡寫會寫成這樣(-a 是 add,-m 為 message 簡寫,後面接訊息資訊):

    $ git commit -a -m "修改了 hello.py"
  4. 註冊 GitHub 帳號

    任務四:建立一個 GitHub 帳號,並在 Git 設定中加入使用者帳號

    到目前為主我們程式主要是在我們 local 工作環境中操作,但還記得我們在 Git 基本觀念中有提到,git 分為 local 和 remote,若是我們想要和全世界其他開發者合作或是貢獻開放原始碼的話,我們可以透過 github 來當作我們 remote 工作環境,去管理我們程式碼,同樣的也可以透過 github 平台和其他開發者一起合作,參與開放原始碼的開發。github 若是公開的 repo 是無限制數量免費的,但是若是想使用 private repo 可以參考付費方案

    // 注意大小寫要一致
    $ git config --global user.username <你的 github 使用者名稱>

    先到 github.com 註冊帳號:

    自學程式設計與電腦科學入門實戰:Git 與 Github 版本控制基本指令與操作入門教學

    註冊成功後登入,可以點選右上顯圖下拉式選單進到個人頁面(profile),觀看個人頁面:

    自學程式設計與電腦科學入門實戰:Git 與 Github 版本控制基本指令與操作入門教學

    自學程式設計與電腦科學入門實戰:Git 與 Github 版本控制基本指令與操作入門教學

    點選右上角 + 來新增 new repository(檔案庫):

    自學程式設計與電腦科學入門實戰:Git 與 Github 版本控制基本指令與操作入門教學

    輸入 repository name(你要取的專案名稱),最好跟電腦 local 專案一致,我們這邊輸入 git-example。然後輸入簡短專案描述並先不勾選初始化 README 和,也先不要選擇 .gitignore 和 License 授權(不然會造成本地端和遠端不一致會需要額外一些處理):

    .gitignore:要忽略的檔案清單,這是用來告訴 Git,當在做版本控制記錄的時候,忽略這些檔案。通常一些機密資料,如資料庫帳號密碼或是 server IP 位置等,記得要加入。也可以參考 github 上面的一些範本 在新增 repository 時選取對應的程式語言

    README.md:repository 介紹和使用方式說明(例如:使用方法、參與專案方式等),使用 markdown 語法撰寫。另外通常有 CONTRIBUTING.md 額外說明如何參與貢獻。

    LICENSE:專案使用何種授權方式,例如:MIT、BSD 等

    自學程式設計與電腦科學入門實戰:Git 與 Github 版本控制基本指令與操作入門教學

    接著按 create 按鈕!恭喜你新增成功,創建了自己第一個 github repository(遠端檔案庫)!

  5. 將 repository 做本機和遠端的連結

    任務五:把電腦裡 Local(本地端)的 repository(檔案庫)和 remote(遠端)的 repository(檔案庫)連結起來,並 push 電腦上的修改

    自學程式設計與電腦科學入門實戰:Git 與 Github 版本控制基本指令與操作入門教學

    因我們已經在專案有把 hello.py 修改加入追蹤並 commit 到 local 檔案庫,所以我們可以參考下方的指令說明把 remote 網址加入:

    // 本地端專案知道 origin 對應到遠端網址
    $ git remote add origin <remote 網址>

    接者準備將本地端程式 push 到遠端檔案庫:

    // 觀看情況
    $ git status
    // 將本地端程式 push 到遠端檔案庫
    $ git push -u origin master
    Counting objects: 3, done.
    Writing objects: 100% (3/3), 239 bytes | 0 bytes/s, done.
    Total 3 (delta 0), reused 0 (delta 0)
    To https://github.com/happycodergit/git-example.git
    * [new branch] master -> master
    Branch master set up to track remote branch master from origin.

    參數 -u 等同於 --set-upstream,設定 upstream 可以使分支開始追蹤指定的遠端分支。事實上,只要做過一次 $ git push -u <remote name> <branch name>,並且成功 push 出去;本機端的 master 就會被設定去追蹤遠端的 <remote name>/<branch name> 分支。只要成功設定好 upstream 後,第二次以後要上傳分支時,就只需要透過 git push 就可以了,不必再帶 <remote name><branch name> 等參數。例如:$ git push

    事實上,$ git push -u origin master 可以拆解成:

    $ git push origin master
    $ git checkout master
    $ git branch -u origin/master

    恭喜你成功把你的專案推送上去 github 啦!

    自學程式設計與電腦科學入門實戰:Git 與 Github 版本控制基本指令與操作入門教學

  6. Fork 和 clone 一個 open source(開源)的計畫

    任務六:從 GitHub.com 建立專案,複本 fork,並下載 clone 到電腦上

    點選左上角 github icon 回到首頁,我們從上面搜尋欄搜尋 react:

    自學程式設計與電腦科學入門實戰:Git 與 Github 版本控制基本指令與操作入門教學

    點選右上角 fork 按鈕,複製一份專案到我們這:

    自學程式設計與電腦科學入門實戰:Git 與 Github 版本控制基本指令與操作入門教學

    等待 fork 中:

    自學程式設計與電腦科學入門實戰:Git 與 Github 版本控制基本指令與操作入門教學

    點選右邊綠色按鈕 clone download 複製 HTTP 網址:

    自學程式設計與電腦科學入門實戰:Git 與 Github 版本控制基本指令與操作入門教學

    // 複製到本地端
    $ git clone https://github.com/happycodergit/react.git
    // 移動到 react 資料夾
    $ cd react
    // 切出自己的新分支(使用 -b)
    $ git checkout -b happycoder@feature_branch
    // 做一些 README.md 檔案修改,然後 commit 到自己 fork 過來的專案
    $ git commit -a -m "Update README"
    $ git push origin happycoder@feature_branch

    事實上,每個開放原始碼都有他自己貢獻的方式,記得要先了解。例如可以參考 react 貢獻說明

    自學程式設計與電腦科學入門實戰:Git 與 Github 版本控制基本指令與操作入門教學

    你可以透過將自己的修改 commit 到自己 fork 過來的專案,然後到原始專案頁面點選 new pull request 按鈕發 pull request(會比對程式碼的差異)。若對方 review 完後接受就可以將自己的程式碼合併到原始專案中,為開放原始碼做出第一步貢獻!

    // 若完成 pull request 記得讓 master(或是合併進去的 branch)保持同步
    $ git pull upstream master
  7. 練習建立一個 feature branch

    任務七:回來原來的 git-example 專案新增 feature branch(分支)

    // 建立一個名為 dev 的 branch
    $ git checkout -b dev

    hello.py 最上面多加一行 # hi, this is comment 註解後存檔

    // commit 到本地端更新
    $ git commit -a -m "Init dev branch"
    $ gut push origin dev
  8. 邀請別人和你合作

    任務八:在專案新增夥伴 collaborator

    在右上角進入 setting 可以選擇到 collaborator 新增合作者:

    自學程式設計與電腦科學入門實戰:Git 與 Github 版本控制基本指令與操作入門教學

  9. 利用 push 和 pull 來和 GitHub.com 同步

    任務九:用 pull 來和其他 collaborators(合作者)同步更新,確保程式是最新的版本

    請其他開發者 git colone 下來你的 git-example 專案並 checkout 到 dev branch,並完成新增一個 README.md 檔案後發 pull request 過來,若沒問題就按同意並合併。我們則透過 git pull 來保持本地端和遠端程式碼同步:

    $ git pull origin dev
  10. Merge(合併)和刪除 branches

    任務十:在本機上 merge 合併你的 branch(分支),刪除舊的 branch(分支)

    // 移動到 master branch
    $ git checout master
    // 合併 dev 到 master
    $ git merge dev
    // 刪除 dev branch
    $ git branch -d dev
    // 將合併後的 master 推送到遠端
    $ git push origin master

總結

以上就是 Git 與 Github 版本控制基本指令與操作入門教學!希望讀者可以動手一起操作,漸漸就能感受到 git 的威力和好處,同時也有能力參與開放原始碼(open source)的社群和提昇自己在職場上的價值,朝成為一個真正的軟體工程師(Software Engineer)邁進!

參考文件

  1. 30 天精通 Git 版本控管
  2. Git 官方網站
  3. Try Git
  4. Git-it
  5. GitHub Guides
  6. 如何將檔案從 stage 移除?
  7. Git 教學

(image via git-scmqboxquoracdnytimglinuximgurmartinfitzpatrick

自學程式設計與電腦科學入門實戰:Linux Command 命令列指令與基本操作入門教學

· 閱讀時間約 11 分鐘

自學程式設計與電腦科學入門實戰:Linux Command 命令列指令與基本操作入門教學

要成為一個真正的軟體工程師(Software Engineer)不一定一定要使用 vim 之類的編輯器進行開發,但熟悉使用終端機(terminal)操作和常用的 Linux 命令列指令碼操作則是必須的。因此接著我們將介紹軟體工程師在開發上常用的 Linux 命令列指令碼給讀者參考。若讀者使用的是 Windows 建議安裝 VirtualBox 並在上面跑 Linux/Ubuntu 來進行指令碼操作,或是使用像是 Cmder 的工具來進行操作。關於相關工具安裝可以參考 如何在 Windows 打造 Python 開發環境設定基礎入門教學 這篇教學文章。好,那我們就準備開始吧!

自學程式設計與電腦科學入門實戰:Linux Command 命令列指令與基本操作入門教學

什麼是 Linux?

Linux 是一種自由開放原始碼的類 Unix 的作業系統,其廣泛運用於伺服器和嵌入式系統中。目前主流的 Linux 發佈版本(Linux distributions,係指可完整安裝使用的套件版本)包括:Debian、Fedora、CentOS、Ubuntu 等。以下我們主要將會聚焦在 Linux/Ubuntu 常用指令和基礎操作的入門教學介紹上(每個指令前使用 $ 當作提示字元,不用輸入)。

自學程式設計與電腦科學入門實戰:Linux Command 命令列指令與基本操作入門教學

Linux 檔案系統架構

理論上所有的 Linux 發佈版本應該都要遵守檔案系統的標準(Filesystem Hierarchy Standard, FHS),但根據發佈版本不同或有差異,不過大致上檔案系統架構如下:

  1. /bin, /sbin
    /bin 主要放置一般使用者可以操作的指令,/sbin 放置系統管理員可以操作的指令。連結到 /usr/bin/usr/sbin

  2. /boot
    主要放置開機相關檔案

  3. /dev
    放置 device 裝置檔案,包話滑鼠鍵盤等

  4. /etc
    主要放置系統檔案

  5. /home, /root /home 主要是一般帳戶的家目錄,/root 為系統管理者的家目錄

  6. /lib, /lib64 主要為系統函式庫和核心函式庫,若是 64 位元則放在 /lib64。連結到 /usr/lib, /usr/lib64

  7. /proc 將記憶體內的資料做成檔案類型

  8. /sys 與 /proc 類似,但主要針對硬體相關參數

  9. /usr /usr 全名為 unix software resource 縮寫,放置系統相關軟體、服務(注意不是 user 的縮寫喔!)

  10. /var 全名為 variable,放置一些變數或記錄檔

  11. /tmp 全名為 temporary,放置暫存檔案

  12. /media, /mnt 放置隨插即用的裝置慣用目錄, /mnt 為管理員/使用者手動掛上(mount)的目錄

  13. /opt 全名為 optional,通常為第三方廠商放置軟體處

  14. /run 系統進行服務軟體運作管理處

  15. /srv 通常是放置開發的服務(service),如:網站服務 www

檔案與目錄管理指令

在 Ubuntu 中我們可以打開終端機進行指令操作,就可以透過指令來管理檔案。

一般指令格式如下:

$ 指令 [選項] [選項值]

自學程式設計與電腦科學入門實戰:Linux Command 命令列指令與基本操作入門教學

  1. ls:list,查看檔案及子目錄

    列出基本資料夾資料:

    ls

    列出詳細資料和隱藏資料:

    // -l 列出詳細資料 -a 列出隱藏資料
    $ ls -la

    列出部分檔案:

    // 列出為 .js 的檔案
    $ ls *.js
  2. pwd:print work directory,印出目前工作目錄

    $ pwd
    // /Users/happycoder/Desktop/projects/HappyCoder
  3. cd:change directory,移動進入資料夾

    移動到目前資料夾下的 examples 資料夾:

    $ cd ./examples

    移動到家目錄:~

    $ cd ~

    移動到上一層目錄 ..

    $ cd ..

    移動到根目錄 /

    $ cd /
  4. mkdir:make directory,創建新資料夾

    $ mkdir examples
  5. cp:copy,複製檔案

    先將字串 TEST 存入 README.md 文件中

    $ echo "TEST" > README.md
    $ cp README.md
  6. mv:move (rename) files,移動檔案或是重新命名檔案

    移動檔案:

    $ mv README.md /examples/README.md

    重新命名

    $ mv README.md README_MV.md
  7. rm:remove file,刪除檔案

    $ rm README.md

    刪除目前資料夾下副檔名為 .js 檔案:

    $ rm *.js

    刪除資料夾和所有檔案:

    $ rm -f examples
  8. touch:用來更新已存在文件的 timestamp 時間戳記或是新增空白檔案

    $ touch README.md
  9. cat:將文件印出在終端機上

    $ cat README.md
  10. tail:顯示檔案最後幾行內容

    $ tail README.md

    持續顯示更新內容,常用於 web server 看 log debug 使用:

    $ tail -f README.md
  11. more:將檔案一頁頁印在終端機上

    可以使用上下移動換頁,按 q 離開:

    $ more README.md
  12. file:檢查檔案類型

    $ file README.md
    // README.md: HTML document text, UTF-8 Unicode text

編輯文字檔案

  1. nano:在終端機編輯文字檔案

    編輯或是新增文字檔案:

    $ nano README.md

    啟動編輯完後可以使用 Ctrl + X 離開,Ctrl + V 移動到上一頁,Ctrl + Y 移動到下一頁,Ctrl + W 搜尋文字內容

  2. vim:在終端機編輯文字檔案

    $ vim README.md

    啟動後,使用 i 進入編輯,esc 離開編輯模式,:q 不儲存離開,:wq 儲存離開,:q! 強制離開

檔案權限設定

在 Linux 系統中,每一個 Linux 檔案都具有四種存取權限:

  1. 可讀取(r,Readable),用數字 4 表示
  2. 可寫入(w,writable),用數字 2 表示
  3. 可執行:(x,eXecute),用數字 1 表示
  4. 無權限(-),用數字 0 表示

系統管理者依據使用者需求來設定檔案權限,若我們想檢視檔案權限可以使用 $ ls -l 來查看

自學程式設計與電腦科學入門實戰:Linux Command 命令列指令與基本操作入門教學

  1. 第一欄:使用者權限 由 10 個字元組成,第一個字元表示檔案型態(- 為檔案,d 表示目錄,1 表示連結檔案)。字元 2、3、4 表示檔案擁有者的存取權限。字元 5、6、7 表示檔案擁有者所屬群組成員的存取權限。字元 8、9、10 表示其他使用者的存取權限

    舉例來說 -rwxrwxr--,代表這是一格檔案,擁有者和群組都具備讀取、寫入和執行權限,其他使用者只擁有讀取權限

  2. 第二欄:檔案數量

  3. 第三欄:擁有者

  4. 第四欄:群組

  5. 第五欄:檔案大小

  6. 第六欄:檔案建立時間

  7. 第七欄:檔案名稱

接下來介紹如何透過指令修改權限:

  1. chmod:修改檔案權限

    將權限設為 rw-rw-r--

    $ chmod 664 README.md

    將檔案的使用者和群組加入執行權限

    $ chmod ug+x README.md
  2. chown:修改檔案擁有者與群組

    $ chown www-data:www-data README.md

系統管理

  1. sudo:使用最高權限(superuser)執行指令,會要求輸入自己密碼,使用上必須非常小心

    $ sudo git clone xxx.py
  2. su:su 指令可以讓一般的 Linux 使用者輸入 root 密碼取得 root 權限,暫時取得 root 權限的使用者就如同 root 一樣可以對系統進行各種變更動作

    $ su
  3. kill:根據 Process ID 指定要終止程式

    $ kill PID

    立即強制執行:

    $ kill -9 PID
  4. killall:直接使用程式的名稱來指定要終止的程式

    $ killall hello.py

套件管理

  1. apt-get:套件管理工具

    更新套件資料庫列表:

    $ sudo apt-get update

    升級套件並下載安裝套件:

    $ sudo apt-get upgrade

    搜尋相關軟體套件(使用名稱):

    $ apt-cache search --names-only fortune

    安裝套件:

    $ sudo apt-get install fortune

    移除套件:

    $ sudo apt-get remove fortune

網際網路相關操作

  1. ping:網路檢測工具,透過發送 ICMP ECHO_REQUEST 的封包,檢查自己與特定設備之間的網路是否暢通,速度是否正常

    可輸入 hostname 或是 IP:

    $ ping google.com

    PING google.com (172.217.160.110): 56 data bytes 64 bytes from 172.217.160.110: icmp_seq=0 ttl=57 time=7.037 ms 64 bytes from 172.217.160.110: icmp_seq=1 ttl=57 time=9.411 ms 64 bytes from 172.217.160.110: icmp_seq=2 ttl=57 time=22.690 ms 64 bytes from 172.217.160.110: icmp_seq=3 ttl=57 time=6.561 ms 64 bytes from 172.217.160.110: icmp_seq=4 ttl=57 time=6.909 ms 64 bytes from 172.217.160.110: icmp_seq=5 ttl=57 time=6.311 ms 64 bytes from 172.217.160.110: icmp_seq=6 ttl=57 time=6.860 ms 64 bytes from 172.217.160.110: icmp_seq=7 ttl=57 time=6.583 ms

  2. traceroutes:檢查從你的電腦到網路另一端的主機是走的什麼路徑

    $ traceroute google.com

    traceroute to google.com (172.217.27.142), 64 hops max, 52 byte packets 1 zyxel.home (192.168.1.1) 2.047 ms 1.208 ms 1.888 ms 2 h254.s98.ts.hinet.net (168.95.98.254) 6.189 ms 8.556 ms 5.875 ms 3 168-95-85-2.hinet-ip.hinet.net (168.95.85.2) 7.057 ms 5.796 ms 5.998 ms 4 211-22-226-1.hinet-ip.hinet.net (211.22.226.1) 9.766 ms 10.422 ms 72.14.222.94 (72.14.222.94) 9.744 ms 5 108.170.244.97 (108.170.244.97) 8.386 ms 108.170.244.129 (108.170.244.129) 11.500 ms 12.247 ms 6 209.85.142.13 (209.85.142.13) 7.015 ms 7.505 ms 209.85.240.15 (209.85.240.15) 6.750 ms 7 tsa03s02-in-f142.1e100.net (172.217.27.142) 11.478 ms 6.608 ms 6.893 ms

  3. nslookup:查詢 DNS 回應是否正常

    $ nslookup google.com

    Server: 192.168.1.1 Address: 192.168.1.1#53

    Non-authoritative answer: Name: google.com Address: 216.58.200.238

其他好用指令

  1. man:查詢 Linux 線上手冊(man page)

    $ man

    例如我們可以使用 man 來查詢 ls 的使用用法:

    $ man ls
  2. find:查詢檔案

    在目前目錄下尋找檔名為 README.md 檔案

    $ find . -name README.md
  3. grep:強大文件字串搜尋工具

    $ grep '找這個字串' file_name

    找所有目錄(含子目錄)下檔案

    $ grep -r '字串' *

  4. crontab:例行性工作排程

    編輯 crontab

    $ crontab -e

    crontab 格式:

    分 時 日 月 星期 要執行的指令

    30 12 * * * python /projects/hello.py &

    在 12:30 時執行 hello.py,& 表示背景執行
    * 號表示每日每月每星期都執行

撰寫第一個 shell script

Shell 是我們和 Linux 系統的介面,我們可以透過終端機在上面輸入指令和作業系統互動,讓他做我們想做的事情。在 Linux 中標準的 Shell 為(Bourne Again Shell),檔案路徑為 /bin/sh,我們可以透過 $ echo $SHELL 去印出目前使用的 shell

其中 Shell Script 為使用 shell 所提供的語法所撰寫的程式碼,其為直譯式不用編譯。可以讓你將複雜或是重複性的指令寫成程式碼檔案

$ vim example.sh

在編輯模式輸入以下程式碼,:

#!/bin/bash
# 這是註解,上面所使用的 shell

echo "日期"
date
echo "印出檔案列表"
ls -l

修改權限成可以執行:

$ chmod u+x example.sh

接著執行,若是一切順利就可以在終端機看到時間日期和檔案列表!恭喜你完成你的第一個 shell script!

$ ./example.sh

總結

以上介紹了 Linux/Ubuntu 常用指令和基礎操作的入門教學介紹上,實際上讀者不用刻意去背誦,而是在實際上操作中練習,多累積撰寫程式並使用指令碼去加快程式開發的速度自然而然就會把指令碼記憶起來了,若是真的忘記再去網路上查找就好,加油!

參考文件

  1. 初窥Linux 之 我最常用的20条命令
  2. 【L】Linux 常用指令集
  3. Linux 的 su 與 sudo 指令教學與範例
  4. dig、host 與 nslookup 指令的查詢語法
  5. nslookup — 查詢 DNS 指令
  6. 在 Linux 下使用 find 指令查詢目錄與檔案的速查筆記
  7. grep 搜尋目錄下所有檔案字串
  8. 第十五章、例行性工作排程(crontab)

(image via unixmencloudxlabytimgytimglinuximgur

Go Web 程式設計入門教學:Web 基礎

· 閱讀時間約 4 分鐘

Go Web 程式設計入門教學

前面幾個單元中我們介紹了許多 [Go 程式語言](https://en.wikipedia.org/wiki/Go_(programming_language) 的基本語法,讓我們了解了 Go 程式語言的用法。接下來我們將透過 Go 來架設簡單的 Web Server。

Web 基本工作流程

Go Web 程式設計入門教學

在我們平常透過瀏覽器(Browser)瀏覽網站時,其背後事實上進行了一連串 Client 客戶端和 Server 伺服器端的互動,以下介紹 Web Server 工作流程簡介:

  1. 使用者在瀏覽器(Browser)網址列輸入 URL,瀏覽器會透過 DNS 伺服器進行解析,取得 Domain 對應伺服器(Server)的 IP 位置
  2. 找到對應 Server IP 後,Client 透過 TCP/IP 協定建立到 Server 的 TCP 連接
  3. Client 向 Server 發送 http 協定請求(request)封包,請求 server 資料
  4. 若請求資源中有動態網站的內容,Server 端會先呼叫伺服器端的程式語言解譯引擎負責處理內容。Server 將組好的內容向 Client 發送 http 協定回應(response)封包
  5. Client 和 Server 中斷 TCP 連線,等待下一次請求。由 Client 解析收到的回應(response)封包內容(body),在瀏覽器繪製 HTML/CSS/JavaScript 檔案內容

Go Web 程式設計入門教學

  • URL 解析

一般 URL(Uniform Resource Locator)結構大概長這樣:

Scheme://host{:port#}/path/.../[?query-string][#anchor]
  1. scheme:底層使用的協定(例如:https、http 或 ftp 等)
  2. host:http 伺服器 ip 位置或 domain
  3. port:http 預設是 80 可以省略,如果是使用其他則需要填寫,可以想成是 ip 的名牌號碼
  4. path:資源路徑
  5. query-string:使用 get 傳送的參數
  6. anchor:記錄超連結錨點
  • DNS(Domain Name System)解析路徑

    1. 輸入網址,查找本機的 host 檔案
    2. 若 host 沒有 domain/ip 對應,則查找本機的 DNS 解析器快取
    3. 若 host/本機 DNS 快取都沒有 domain 對應則解析 TCP/IP 參數中設定的第一個 DNS 伺服器或其快取回傳(不具權威性)
    4. 若都故障,則會由 domain 右往左查找對應 DNS 伺服器(轉發/非轉發模式),回傳給本機 DNS 伺服器
  • HTTP request 請求解析 接著我們聊聊在 HTTP 協定中有定義許多和伺服器互動的方式,最基本的有四種:GETPOSTPUTDELETE,分別對應資源的查增更刪,最常見的舊是 GETPOST

    其中 GET 會把傳送資料放在網址後面,資料為明碼且有長度限制,一般用於查找資料。而 POST 資料傳遞主要是放在 http request 的 body 中,所以新增資料或是傳遞較敏感資料通常會用 POST 傳送

  • HTTP response 回應解析 http response 封包組成由版本編號、狀態碼、狀態訊息組成

    HTTP 狀態碼是使用三位數字組成,在 HTTP/1.1 中定義五大類狀態碼:

    1XX 提示訊息 2XX 成功 3XX 重新導向 4XX client 錯誤 5XX server 錯誤

使用 Go 架設基本 Web Server

在 Go 中可以使用 net/http 套件建立 Web 伺服器:

  1. Request:使用者請求的資訊,包含 post, get, cookie 等
  2. Response:伺服器需要回饋給使用者的資訊
  3. Conn:使用者請求每次產生連結
  4. Handler:處理請求和產生傳回資訊的處理邏輯
package main

import (
"fmt"
"net/http"
"log"
)

// 處理函式
func helloHandler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "hello world!")
}

func main() {
// 網址對應處理函式
http.HandleFunc("/", helloHandler)
// 監聽通訊 port
err := http.ListenAndServe(":7777", nil)
if err != nil {
log.Fatal("ListenAndServe", err)
} else {
log.Println("listen 7777")
}
}

總結

以上就是關於 Go 程式語言的 Web 基礎和 http 協定簡介,接下來的文章我們將透過 Golang Web 程式設計來學習 Go 這個程式語言的方方面面。

參考文件

  1. A tour of go
  2. Go Tutorial
  3. Go by Example
  4. Go Programming Language: An Introductory Tutorial
  5. Go tour Exercise
  6. Ubuntu Go install

(image via slidesharecdnwebsiteoptimization

Go Web 程式設計入門教學:語法基礎之函式(function)篇

· 閱讀時間約 4 分鐘

Go Web 程式設計入門教學

前面單元我們介紹了如何使用流程控制改變我們的程式執行順序,接下來的單元我們將透過 Golang Web 程式設計來學習 Go 這個程式語言。而在這個單元中我們將介紹 Go 函式的使用。程式語言唯有動手作才能學的好,你可以參考之前的文章建置開發環境或是使用線上開發環境進行學習。

函式簡介

有經驗的程式設計都知道程式撰寫的維護性很重要,其中模組化就是很重要的元素。當我們有一組程式出現過兩三次,那就很適合把它當做函式包裝起來。在程式語言中函式和數學上的函數有蠻多類似之處。我們可以把函式想成是一個黑盒子,透過呼叫函式可以完成我們想要做的工作,可能是傳入參數相加或是執行某段沒有回傳值的程式碼。

// 有一個關鍵字 func 其後接函式命名,可以傳入參數名稱和其資料型別(也可以不傳參數),後面是帶若有回傳值時的回傳值名稱和資料型別(也可以沒有回傳值)
func funcName(input1 type1, input2 type2) (output1 type1, output2 type2) {
// 若有回傳值
return value1, value2
}
  1. 基本函式 基本款的函式就是有函式名稱,傳入參數和回傳值:

    package main

    import "fmt"

    func add(a, b int) int { // 當只傳一個回傳值且沒有定義回傳值變數時可以簡化括號
    return a + b
    }

    func main() {
    fmt.Println(add(1, 2))
    }
  2. 多回傳值

    package main

    import "fmt"

    func addAndProduct(a, b int) (int, int) { // 多回傳值要用括號括起
    return a + b, a * b
    }

    func main() {
    fmt.Println(addAndProduct(1, 2))
    }
  3. 長度不固定參數

    func argFunc(arg ...int) {}
  4. 傳值與傳指標
    一般來說我們傳入函式的參數是複製一份傳入,改動參數不會影響原有值。若今天我們傳入的不是複製值而是記憶體位置的指標,則會更改到原有值。

    package main

    import "fmt"

    func add(a int) int {
    return a + 10
    }

    func main() {
    a := 1
    fmt.Println(add(a)) // 11
    fmt.Println(a) // 1
    }

    換傳指標進去:

    package main

    import "fmt"

    func add(a *int) int {
    *a = *a + 10
    return *a
    }

    func main() {
    a := 1
    fmt.Println(add(&a)) // 11
    fmt.Println(a) // 11
    }
  5. defer 採用後進先出方式在函式全部執行結束前執行,常用於開啟資源後關閉檔案:

    func ReadFile() bool {
    file.Open("./file.txt")
    defer file.Close()
    if failureA {
    return false
    }
    if failureB {
    return false
    }
    return true
    }
  6. 函式當做值和類型

    type test func(int) (bool)

    func testIt(f test, a int) {

    }
  7. Panic、Recover 中斷程式進入 panic 狀態,用 Recover 可以恢復

模組

  1. main 函式和 init 函式

    當程式很複雜時,可以拆成不同 package 和檔案,其中 package main 為必要,其於 package 可以放置其他函式,在 Go 中函式或變數開頭大寫代表公有露出可以讓其他套件使用,反之為私有。其中 main 和 init 是保留函式,init 函式可以用於所有 package,main 用於 package main。Go 語言會自動呼叫兩者,init 是可選的,程式初始化是從 main 開始,如果有匯入其他套件會在編譯時依序匯入。如果有一個套件被引入多次,只會被引入一次。

    相對路徑:

    import "./model" // 同一目錄的 model 下

    絕對路徑:

    import "xxx/model" // gopath/src/xxx/model

    一般引用套件用法:

    import (
    "fmt"
    )

    fmt.Println("hi")

    點用法:

    import (
    . "fmt"
    )

    Println("hi")

    別名:

    import (
    f "fmt"
    )

    f.Println("hi")

    只執行套件中 init,不使用裡面函式:

    import (
    _ "fmt"
    )

總結

以上就是關於 Go 程式語言的基本語法中流程控制介紹,接下來的文章我們將透過 Golang Web 程式設計來學習 Go 這個程式語言的方方面面。

參考文件

  1. A tour of go
  2. Go Tutorial
  3. Go by Example
  4. Go Programming Language: An Introductory Tutorial
  5. Go tour Exercise
  6. Ubuntu Go install
  7. 從Go看現代程式語言

(image via cuelogic

Go Web 程式設計入門教學:語法基礎之流程控制(flow control)篇

· 閱讀時間約 4 分鐘

Go Web 程式設計入門教學

前面單元我們介紹了如何建置 Go 變數和資料型別的使用,接下來的單元我們將透過 Golang Web 程式設計來學習 Go 這個程式語言。而在這個單元中我們將介紹 Go 的流程控制的使用。程式語言唯有動手作才能學的好,你可以參考之前的文章建置開發環境或是使用線上開發環境進行學習。

流程控制簡介

一般而言,程式語言是由上往下執行,若我們需要程式依照我們設計的邏輯方向執行就需要流程控制的協助。在這邊主要談的流程控制有三部分:條件判斷、迴圈循環、跳躍控制。

我們使用制做菜脯蛋食譜步驟來講解範例:

  1. 放點油
  2. 打蛋
  3. 如果喜歡蔥花可以加入蔥花,如果喜歡菜脯可以加入菜脯(程式術語:if...else 條件判斷)
  4. 放入少許鹽巴
  5. 中火快炒,翻五次面(程式術語:for 迴圈)
  6. 當看到蛋面呈現金黃色時可以起鍋,結束料理(程式術語:while 迴圈)
  7. 好吃的蔥花蛋或菜脯蛋上桌

首先介紹,條件判斷,如果 if...。條件判斷是一種邏輯判斷,當符合條件就怎麼樣,不符合條件就怎麼樣。

  1. if...else

    package main

    import "fmt"

    var taste = "菜脯蛋" // 喜歡菜脯蛋

    if taste == "菜脯蛋" {
    fmt.Println("加入菜脯")
    } else {
    fmt.Println("加入蔥花")
    }

    Go 語言中除了條件判斷不用加 () 外,也可以在條件判斷敘述宣告變數,但只會存活於條件邏輯區塊使用上。

    package main

    import "fmt"

    if taste := "蔥花蛋"; taste == "菜脯蛋" {
    fmt.Println("加入菜脯")
    } else {
    fmt.Println("加入蔥花")
    }

    fmt.Println(taste) // 編譯錯誤,條件判斷敘述宣告的變數,只會存活於條件邏輯區塊使用上
  2. goto Go 中還提供了 goto 語法,讓你可以直接跳躍到某定義區塊,但建議小心使用。

    package main

    import "fmt"

    func main() {
    num := 91

    if num >= 60 {
    fmt.Println("hi true")
    goto PASS
    } else {
    fmt.Println("hi false")
    }
    PASS:
    fmt.Println("hi pass")
    }
  3. for 迴圈 在 go 中 for 迴圈的功能強大,既可以被當做循環讀取資料,又可以當做 while 來控制邏輯,還能反覆操作運算,以下介紹 for 語法:

    for 變數宣告或函式回傳值; 條件判斷; 每輪結束時操作 {
    // ...
    }

    我們接著使用食譜範例,中火快炒,翻五次面:

    package main

    import "fmt"

    func main() {
    for index := 0; index < 5; index++ {
    fmt.Println("翻面", index + 1, "次")
    }
    }

    當我們不知道具體要迴圈幾次時可以使用 while,但由於 Go 中沒有 while 關鍵字,當忽略了 ;,就可以當 while 迴圈使用:

    package main

    import "fmt"

    // 從 1 加到 10
    func main() {
    sum := 0
    i := 0
    for i <= 10 {
    sum += i
    i++
    }
    fmt.Println(sum)
    }

    使用 break 和 continue 可以跳出整個循環和跳過當下:

    package main

    import "fmt"

    // 從 1 加到 10
    func main() {
    sum := 0
    i := 0
    for i <= 10 {
    if i == 3 {
    break; // continue 跳過 3,break 到 3 整個循環跳出
    }
    sum += i
    i++
    }
    fmt.Println(sum)
    }

    善用 for 也可以把 slicemap 資料一一取出:

    package main

    import "fmt"

    for key, value := range map { // 也可以忽略其中一值,for _, value := range map
    fmt.Println(key, value)
    }
  4. switch 當我們需要寫很多 if...else 時就是使用 switch 的好時機:

    package main

    import "fmt"

    func main() {
    i := 2
    switch i {
    case 1:
    fmt.Println("hello:", i) // go 中不用加 break 會自己跳出不會往下執行
    case 2:
    fmt.Println("hello:", i) // 加上 fallthrough 可以強制往下執行
    fallthrough
    default:
    fmt.Println("hello: default")
    }
    }

總結

以上就是關於 Go 程式語言的基本語法中流程控制介紹,接下來的文章我們將透過 Golang Web 程式設計來學習 Go 這個程式語言的方方面面。

參考文件

  1. A tour of go
  2. Go Tutorial
  3. Go by Example
  4. Go Programming Language: An Introductory Tutorial
  5. Go tour Exercise
  6. Ubuntu Go install
  7. 從Go看現代程式語言

(image via cuelogic

Go Web 程式設計入門教學:語法基礎之變數(variable)和資料型別(type)篇

· 閱讀時間約 5 分鐘

Go Web 程式設計入門教學

前面單元我們介紹了如何建置 Go 開發環境,接下來的單元我們將透過 Golang Web 程式設計來學習 Go 這個程式語言。而在這個單元中我們將介紹 Go 的變數和常數宣告以及資料型別的使用。程式語言唯有動手作才能學的好,你可以參考之前的文章建置開發環境或是使用線上開發環境進行學習。

定義變數和使用

變數是程式語言中暫存資料的盒子,在 Go 中比較特別的是定義變數有多種方式(特別的是 Go 語言和 C 語言在設計上比較不同的地方是 Go 語言把變數型別宣告放在變數名稱後面),以下列出比較常見的變數使用方式:

  1. 一般變數宣告

    // var 關鍵字 變數名稱 資料型別
    var varName type

    範例:

    var str string
  2. 定義多個變數

    var var1Name, varName2 type

    範例:

    var str1, str2 string
  3. 定義變數並初始化

    var varName type = value
  4. 同時初始化多個變數

    var varName1, varName2, varName3 type = v1, v2, v3
  5. 簡化宣告

    var varName1. varName2, varName3 = v1, v2, v3

    另外一種是使用 := 符號取代 vartype,但要注意的是這樣的方式只能在函式內部使用,若是在全域使用會出現編譯錯誤,一般使用 var 定義全域變數。它的變數生命週期為 block 內。

    package main

    import "fmt"

    var num = 10

    // 編譯錯誤
    str0 := "world"

    func main() {
    var str1 = "hello"
    str2 := "world"
    fmt.Println(num)
    fmt.Println(str1)
    fmt.Println(str2)
    if true {
    var str3 = "XD" // str3 := "XD"
    fmt.Println(num)
    fmt.Println(str1)
    fmt.Println(str2)
    fmt.Println(str3)
    }
    fmt.Println(num)
    fmt.Println(str1)
    fmt.Println(str2)
    // 變數生命週期結束 undefined 錯誤
    fmt.Println(str3)
    }

    值得注意的若是在函式內宣告但沒使用會出現編譯錯誤:

    package main

    import "fmt"

    var num = 10

    func main() {
    var str = "hello"
    fmt.Println(str)
    }
    ./main.go:10:6: str declared and not used

定義常數

常數和變數不同是在編譯時就確認值,在程式執行期間不可以更改值。在 Go 程式語言使用 const 定義常數,其語法如下:

const constName = value
const Pi = 3.14
const Name string = "Mark"

內建簡單資料型別

  1. 布林值 在 Go 布林值是 truefalse,預設為 false

    var isActived = true
  2. 數字 在 Go 語言中主要分為 intuint 兩類型數字資料型別,個別之間還有位元可以做選擇,例如:int32。注意兩種數字資料型別不能互相設定或操作(例如:相加)

    var num = 12
  3. 字串 Go 語言中使用 UTF-8 字元編碼,使用 "" 來包裹字串:

    var str string = "hello"
    str[1] // e

    ch = []byte(str)
    ch[1] = 'w'
    str2 = string(ch)
    fmt.Println(str2) // hwllo
  4. 錯誤類型 在 Go 語言中有一個 error 類型,在套件中也有個 errors 負責處理錯誤訊息:

    import errors
    err := errors.New("throw error")

    if err != nil {
    fmt.Println(err)
    }

複雜資料型別

  1. array array 就是一般程式語言的陣列,基本上和其他程式語言相同:

    // 變數名稱 [長度]類別
    var arrayName [n]type

    陣列長度宣告後不能改變,傳入函式為副本,若需要傳指標進去可以使用 slice。實際使用方式:

    // 宣告長度為 10 類型為 int 的陣列
    var arr [10]int
    arr[0] = 7
    arr[1] = 13

    a := [3]int{1, 2, 3}
    b := [10]int{1, 2, 3}
    // 自動計算元素長度
    c := [...]int{1, 2, 3}
    // 二維陣列
    dArry := [2][4]{[3]{1, 2, 3}, [3]{2, 3, 4}}
  2. slice 有時候我們不會一開始就知道需要宣告多長的陣列,這時就需要使用動態陣列(是一個參考類型,總是指向底層 array):slice,其使用方式:

    var sliceName = []type

    實際使用:

    slice = []byte{1, 3, 4}
    array = [3]int{1, 3, 4}
    bySlice :=
  3. map map 和其他程式語言的 dict 和 hash map 相似,使用方式:

    var mapName = map[keyType]valueType

    key 可以是除了 int 外其他類型,取值使用 key 取值:

    // 第一種宣告方式
    var numbers map[string] int
    // 第二種宣告方式
    numbers := make(map[string]int)
    numbers["one"] = 1
    numbers["two"] = 7
    numbers["three"] = 13
    fmt.Println("three", numbers["three"])

    // key 數量
    m := map[string]int {"1": 1, "3": 2}
    fmt.Println(len(m))

    // map 新增、刪除、修改、查找
    numbers["three"] = 13
    value, ok := numbers["three"]
    numbers["three"] = 17
    delete(numbers["three"])

    此外 map 是無序的,也是個參考類型指到底層:

    numbers := make(map[string]int)

    numbers["three"] = 13
    numbers2 := numbers
    numbers2["three"] = 1 // numbers["three"] 也變成 1

make、new 比較

make 一般用於內建資料型別(map、slice 和 channel)的記憶體分配,而 new 用於各種類型記憶體分配。make 回傳有初值的 T 類型,而 new 回傳指標。

總結

以上就是關於 Go 程式語言的基本語法中的變數和資料型別介紹,接下來的文章我們將透過 Golang Web 程式設計來學習 Go 這個程式語言的方方面面。

參考文件

  1. A tour of go
  2. Go Tutorial
  3. Go by Example
  4. Go Programming Language: An Introductory Tutorial
  5. Go tour Exercise
  6. Ubuntu Go install
  7. 從Go看現代程式語言

(image via cuelogic

Go Web 程式設計入門教學:基礎介紹與環境建置

· 閱讀時間約 4 分鐘

Go Web 程式設計入門教學

[Go 程式語言](https://en.wikipedia.org/wiki/Go_(programming_language) 是 Google 推出的靜態程式語言,其特色在於核心語法和關鍵字非常精簡(全部只有 25 個關鍵字!)並擷取了靜態語言的效能和動態語言的開發效率的優點,具備垃圾回收、快速編譯等特性,且針對平行化程式設計在使用上非常方便。接下來的文章我們將透過 Golang Web 程式設計來學習 Go 這個程式語言。程式語言唯有動手作才能學的好,你可以參考本篇文章建置開發環境或是使用線上開發環境進行學習。

Go 環境建置

安裝方式:

  1. 官網套裝安裝,線上也有官方提供的 playground 線上執行環境可以使用

  2. 使用套件管理工具 homebrew(mac)、apt-get(linux) 等進行安裝

    例如,在 linux 上安裝:

    $ sudo apt-get install golang-go

    或是主動宣告版本

    $ sudo apt-get install golang-1.8-go

    在 mac 上安裝:

    $ brew install go
  3. 使用 gcc、MinGW(windows)等編譯器編譯原始 Go 檔案

對於一般初學者來說,可以使用官網或是套件管理工具來安裝,可以留意環境變數是否有設定成功。

若有成功安裝,可以打開終端機執行 go version 會出現相關版本訊息,以下是 mac 的範例:

$ go version
go version go1.9 darwin/amd64

在 Go 中也提供了許多方便指令,方便我們編譯、測試和執行程式:

Go Web 程式設計入門教學

編譯檔案

$ go build

執行單元測試(unit testing),Go 一開始就內建了測試的機制,執行 go test 的話,會自動讀取套件目錄中的 *_test.go 來進行編譯、測試

$ go test

讓程式可以格式化 formatting,符合 go 的 convention

$ go fmt

安裝套件

$ go get

靜態分析潛在 bug

$ go vet

可以快速 build 並執行程式

$ go run

展示 go 相關文件

$ godoc

重新命名變數和函式

$ gorename

產生程式碼

$ go generate

你的第一個 Go 程式

在 Go 中程式運行的入口是套件 main。在這個程式中使用並導入了套件 "fmt",在 Go 程式中程式執行入口是 main function,若成功在終端機執行 $ go run,則會在終端機印出 Hello, World! 的 Go 程式,恭喜完成你的第一個 Go 程式了!

// 宣告程式屬於哪個 package
package main

// 引入套件
import (
"fmt"
)

// 程式執行入口
func main() {
// 使用 fmt 套件印出字串 word,使用 := 簡化原本變數宣告 var word string = "Hello, World!"
word := "Hello, World!"
fmt.Println(word)
}

另外一個範例是引入了 math/rand 套件產生隨機整數(由於環境中 seed 一樣所以會印出同樣值)

package main

import (
"fmt"
"math/rand"
)

func main() {
fmt.Println("My favorite number is", rand.Intn(10))
}

Go 有支援許多網路程式開發的套件,可以用很簡單的幾行就完成網路伺服器的建置:

package main

import (
"io"
"net/http"
)

// 處理 request 和 response 的函式
func hello(w http.ResponseWriter, r *http.Request) {
// 印出 hello world
io.WriteString(w, "Hello world!")
}

func main() {
// router 讓網址可以對應處理函式
http.HandleFunc("/", hello)
// 監聽 8000 port
http.ListenAndServe(":8000", nil)
}

總結

以上就是關於 Go 程式語言的基本教學介紹和環境建置,接下來的文章我們將透過 Golang Web 程式設計來學習 Go 這個程式語言的方方面面。

參考文件

  1. A tour of go
  2. Go Tutorial
  3. Go by Example
  4. Go Programming Language: An Introductory Tutorial
  5. Go tour Exercise
  6. Ubuntu Go install
  7. 從Go看現代程式語言

(image via cuelogic

自學程式設計學習資源懶人包

· 閱讀時間約 7 分鐘

隨著資訊科技的發展,目前網路上和坊間有許多的自學電腦科學和程式設計的學習資源,但初學者在面對琳琅滿目的學習資源往往無所適從,因此本文整理了散落各地的自學程式設計學習資源懶人包和學習藍圖提供讀者參考,也歡迎讀者一起補充:)

學習程式設計最重要的是了解電腦科學背後的思考模式和邏輯分析,對於非本科系或是程式設計自學者來說,培養興趣累積成就感是最重要的,建議先從解決生活上著手,透過寫程式解決生活上的問題,等累積了興趣和成就感後重新學習基礎電腦科學知識。以下是初學者學習藍圖建議供讀者參考:

  1. 確認你的學習動機、設定個學習目標
  2. 選擇一門適合你的程式語言入門和工具
  3. 大量閱讀、參與課程、動手實作解決生活上問題,把手弄髒並記錄心得
  4. 組織、參與社群、練習問個好問題
  5. 熟悉函數程式設計、物件導向、框架、設計模式
  6. 重新學習資料結構、演算法、作業系統/系統程式、計算機組織、網路通訊等基礎電腦科學知識(程式解題)
  7. 學習進階電腦科學知識

延伸閱讀:

  1. 非本科生,我想半路出家學寫程式,該如何開始?
  2. Python Web 程式設計入門實戰
  3. JavaScript 程式設計新手村課程
  4. HappyCoder 自學程式設計學院臉書社團

實務程式設計

  1. [中 & 英] Codecademy

    codecademy

    Codecademy 是非常知名的線上學習程式設計的平台(有許多免費的課程),課程設計互動性和趣味性都相當不錯,相當適合初學者練習。課程也運用遊戲化(gamification)徽章和關卡設計也讓學習者更有動力學習。目前除了 HTML/CSS/JavaScript 網頁程式設計外,也有 Python、Ruby、Java 等程式語言可以學習(課程也有持續更新),不過 Codecademy 的內容相對基本,若想要在熟悉語法外更進一步學習實務開發應用程式的話就要額外再找其他學習資源了,但仍不失為一個很好的新手入門方式。

    課程深度:✦ 費用:免費、付費

  2. [英] Code School

    codeschool

    Code School 也是蠻知名的線上程式設計學習平台,與 Codecademy 類似,除了有提供學員線上即時動手實作練習、遊戲化徽章累積的設計外也有影片教學。課程內容也相當豐富貼近實務(JavaScript、Ruby、Git 等)。

    課程深度:✦✦ 費用:免費、付費

  3. [英] Code.org

    code.org

    適合中小學或完全初學的朋友練習,使用圖形化 Scratch 式拖拉程式設計方式。透過簡單的方式體驗程式設計的背後邏輯運作原理。

    課程深度:✦ 費用:免費

  4. [英] W3Schools Online Web Tutorials

    w3schools

    提供豐富的 Web 開發相關學習資源和查詢,適合在實際開發時學習參考查詢使用。

    課程深度:✦ 費用:免費

  5. [中 & 英] Mozilla Developer Network

    MDN

    由 Mozilla 社群維護的技術文件和教學內容,提供 Open Web 相關學習資源(HTML/CSS/JavaScript、Web API、Python)和 API 標準查詢。

    課程深度:✦✦ 費用:免費

  6. [英] FreeCodeCamp

    freecodecamp

    主要提供 HTML/CSS/JavaScript 線上學習資源和討論社群,並提供非營利組織專案實習機會。

    課程深度:✦ 費用:免費

  7. [英] TreeHouse

    teamtreehouse

    TreeHouse 和 Code School 類似,有影片教學也有互動練習,主要提供各種主流程式語言和技術組合的線上課程,包含了行動應用開發、網站開發、遊戲開發等實務課程。

    課程深度:✦✦ 費用:付費

  8. [中 & 英] Udemy

    udemy

    Udemy 是一個全面性的線上課程平台,提供素人講師線上分享技能的機會,課程十分多元貼近實務。除了網站開發、行動應用程式等技術領域外,也有許多非技術領域的課程(例如:行銷管理、創業、攝影、音樂創作等)。

    課程深度:✦✦ 費用:付費

  9. [中 & 英] Udacity

    udacity

    Udacity 與許多知名企業(Google、Facebook)合作提供許多前沿技術的線上教學,例如:人工智慧、深度學習、VR、Web、Mobile 技術等。此外,也提供微專業(Nanodegree)一系列課程和工作機會的媒合。

    課程深度:✦✦✦ 費用:免費、付費

  10. [英] DataCamp

    datacamp

    可以稱作資料科學版本的 Codecademy,使用互動學習方式線上學習資料科學,對於資料科學有興趣的讀者可別錯過了。

    課程深度:✦✦ 費用:免費、付費

基礎電腦科學

  1. [英] Coursera

    coursera

    Coursera 與許多知名大學合作(Stanford、賓州大學、北京大學、台灣大學等),提供教授可以線上授課的平台,學生也可以在家就上到一流學府的課程。與一般課程一樣需要繳交作業,若能完成課程修業規定,可以申請證書。

    課程深度:✦✦✦ 費用:免費、付費

  2. [英] edX

    edx

    edX 與 Coursera 類似與許多知名大學合作(MIT、哈佛大學、UCB等),提供教授可以線上授課的平台。

    課程深度:✦✦✦ 費用:免費、付費

程式解題

  1. [英] LeetCode

    leetcode

    LeetCode 又稱軟體工程師的 GRE(英文檢定),是一個線上解題平台,內含許多演算法和資料結構的題目,是許多準備軟體工程面試的面試者常用的工具。

  2. [英] Hacker Rank

    hackerrank

    Hacker Rank 也是一個線上解題平台,除了解題外也提供教學內容幫助學員學習,適合不想單純解題的使用者。

  3. [英] CodeFights

    codefights

    CodeFights 可以讓你和世界各地的程式設計師對戰,讓寫程式變成像圍棋一樣一場場對奕,十分有趣。

  4. [英] Codewars

    codewars

    Codewars 也是一個程式挑戰的解題平台,提供許多種語言讓使用者可以練習。

  5. [英] Kaggle

    kaggle

    Kaggle 和許多知名企業和單位合作提供資料科學問題,讓參賽者可以解題獲得獎勵和合作機會。

總結

以上整理了散落各地的自學程式設計學習資源懶人包和學習藍圖提供讀者參考,歡迎讀者一起補充,也歡迎加入我們的 臉書學習社群,分享你的自學程式設計心得和經驗。至於初學者若對於程式設計有興趣的話,不妨從 PythonJavaScript 入手,開啟你的程式設計之旅吧:)

參考文件

  1. Google - Guide for Technical Development
  2. Coursera
  3. edX
  4. Udacity
  5. OSS
  6. FreeCodeCamp
  7. Future Learn
  8. Stanford University
  9. MIT Open Courseware
  10. Obtaining a Thorough CS Background Online
  11. JavaScript 程式設計新手村課程
  12. 非本科生,我想半路出家學寫程式,該如何開始?
  13. 卡卡MOOC資源站