"我覺得這個課程非常棒
內容非常豐富
助教也會積極回答問題❤️
非常喜歡這個課程,希望未來可以增加更多的課程😆
唯一的缺點可能是進度有點快了點就有一回課程,到後面幾乎快跟不上了,希望能放慢一點速度~"
洪同學:
學到甚多爬蟲知識可應用於工作上~謝謝
楊同學:
之前因為有轉職的念頭,所以找了很多資源,python部分網路其實也有參考udemy的部分,覺得你們的課程安排難易度蠻不錯的,覺得之後可以朝坊間一些課程設計出一個彈性的roadmap,讓大家知道未來如果想走向前後端,學習的路徑和課程怎麼規劃,再結合專題實例,讓大家可以整理出自己的作品。
李同學:
整個課程下來覺得自己進步非常多! 之前有參加過相關社團,但不像這個課程一樣那麼循序漸進,一步步由淺入深。很喜歡每週發布新作業任務的感覺,很像在闖關玩遊戲,把任務都做完也很有成就感。唯一一個建議是有些小地方(code)可以再寫的清楚一點,這樣比較可以省去額外查資料的時間! 期待你們之後開設其他進階課程!
潘同學:
謝謝這一系列的課程,讓我學習新知的同時又有複習到舊有的,而且還真正實際練習專案,非常感謝
黃同學:
"謝謝這次課程~
難度適中,讓初學的我感覺有具體成長又不被挫敗擊垮
也讓我從比較廣泛的角度了解整個電腦科學與程式概論,感覺有整體的概念,再看到
其他文章和課程也比較知道在藍圖的哪個位置"
林同學:
課程設計有條理,且內容難易適中,讓我在兩個月內就能對Python的基本概念有所理解。
林同學:
課程中學習到很多Python入門的知識,但有些課程中的範例較生硬(ex.質數),對於初學者來說有點難理解,但整體作為入門的學習覺得吸收良多!
汪同學:
課程簡單,適合入門選擇。期待後續進階課程。
李同學:
"""很喜歡你們這系列的課程!
實作導向的課程設計真的可以學得很快
希望之後可以多出一些新的課程!很期待"""
]]>"我覺得這個課程非常棒
內容非常豐富
助教也會積極回答問題❤️
非常喜歡這個課程,希望未來可以增加更多的課程😆
唯一的缺點可能是進度有點快了點就有一回課程,到後面幾乎快跟不上了,希望能放慢一點速度~"
洪同學:
學到甚多爬蟲知識可應用於工作上~謝謝
楊同學:
之前因為有轉職的念頭,所以找了很多資源,python部分網路其實也有參考udemy的部分,覺得你們的課程安排難易度蠻不錯的,覺得之後可以朝坊間一些課程設計出一個彈性的roadmap,讓大家知道未來如果想走向前後端,學習的路徑和課程怎麼規劃,再結合專題實例,讓大家可以整理出自己的作品。
李同學:
整個課程下來覺得自己進步非常多! 之前有參加過相關社團,但不像這個課程一樣那麼循序漸進,一步步由淺入深。很喜歡每週發布新作業任務的感覺,很像在闖關玩遊戲,把任務都做完也很有成就感。唯一一個建議是有些小地方(code)可以再寫的清楚一點,這樣比較可以省去額外查資料的時間! 期待你們之後開設其他進階課程!
潘同學:
謝謝這一系列的課程,讓我學習新知的同時又有複習到舊有的,而且還真正實際練習專案,非常感謝
黃同學:
"謝謝這次課程~
難度適中,讓初學的我感覺有具體成長又不被挫敗擊垮
也讓我從比較廣泛的角度了解整個電腦科學與程式概論,感覺有整體的概念,再看到
其他文章和課程也比較知道在藍圖的哪個位置"
林同學:
課程設計有條理,且內容難易適中,讓我在兩個月內就能對Python的基本概念有所理解。
林同學:
課程中學習到很多Python入門的知識,但有些課程中的範例較生硬(ex.質數),對於初學者來說有點難理解,但整體作為入門的學習覺得吸收良多!
汪同學:
課程簡單,適合入門選擇。期待後續進階課程。
李同學:
"""很喜歡你們這系列的課程!
實作導向的課程設計真的可以學得很快
希望之後可以多出一些新的課程!很期待"""
]]>
Matplotlib 和 Pandas 是兩個在資料科學專案中時常使用的兩個套件。Pandas 主要用於資料輸入輸出及資料分析操作,而 Matplotlib 主要是用來資料視覺化,呈現圖表使用,兩者可以單獨也可以搭配使用。在使用 Matplotlib
繪製圖表的中文使用者最常會遇到的問題就是中文字體在預設的 Matplotlib 顯示不出中文字體。接下來我們就透過範例程式一步步手把手帶領大家如何在 Matplotlib
顯示圖表的中文字體標籤和說明圖示(本文假設讀者對於 Python 程式語法、Pandas 和 Matplotlib 已有基本認識)。
Matplotlib 中有一些專有名詞,若能掌握住將對我們接下來學習如何在 Matplotlib
使用中文字體會很有幫助。
(1) Figure
: 代表整個面板
(2) Axes
: 代表整個圖表
(3) Axis
: 代表軸
(4) Legend
: 代表圖示說明
(5) Label
: 代表軸標頭
(6) Title
: 代表圖表標頭
解決中文字體空白或是顯示不出來的問題,主要解法有以下兩種:
接下來本文會先透過一個範例優先介紹 在程式中引入支援中文的字體 這種作法。
Step 1. 規劃目標並準備資料
目標:我們希望透過長條圖顯示桃園地區結婚對數,了解結婚分布狀況。
資料集使用政府開放資料中 108 年度桃園地區結婚對數資料集,我們下載 .csv
檔案後更改檔案名稱為: marriage.csv
。檔案內容如下:
月份區域別,一月,二月,三月,四月,五月,六月,七月,八月,九月,十月,十一月,十二月
桃園區,305,202,240,177,272,221,184,109,222,251,223,268
中壢區,271,198,215,213,222,219,188,94,240,246,215,269
大溪區,54,46,40,37,64,58,38,20,47,74,46,48
楊梅區,103,69,91,71,95,99,81,41,89,115,98,121
蘆竹區,100,72,77,80,92,87,70,38,96,95,103,86
大園區,59,38,40,37,61,53,42,15,49,57,53,50
龜山區,100,64,80,75,86,85,82,46,102,92,80,91
八德區,138,98,114,104,133,122,108,57,108,121,105,130
龍潭區,75,52,67,78,72,49,74,26,76,69,73,83
平鎮區,151,97,110,115,144,132,127,55,115,138,138,150
新屋區,37,15,14,24,21,20,24,7,26,21,23,26
觀音區,45,21,38,31,43,32,29,14,45,31,32,40
復興區,11,4,8,5,6,8,6,5,8,6,7,4
Step 2. 載入資料
import pandas as pd
# 讀入資料集檔案
df = pd.read_csv('married.csv')
接著要取出我們想要顯示圖表的資料:
# loc 取值方式為 [索引, [欄位]],取 月份區域別 出來當作 index
data = df.loc[:, ['月份區域別', '一月']]
print(data)
印出內容:
月份區域別 一月
0 桃園區 305
1 中壢區 271
2 大溪區 54
3 楊梅區 103
4 蘆竹區 100
5 大園區 59
6 龜山區 100
7 八德區 138
8 龍潭區 75
9 平鎮區 151
10 新屋區 37
11 觀音區 45
12 復興區 11
並設定 dataframe index
為 月份區域別 當作 x 軸,因為原本 預設 index 為 0, 1, 2, ...
# 原本 index 為 0, 1, 2, 3...12,改為 月份區域別,這樣 x 軸標籤就會改為 月份區域別
data = data.set_index('月份區域別')
print(data)
印出內容:
一月
月份區域別
桃園區 305
中壢區 271
大溪區 54
楊梅區 103
蘆竹區 100
大園區 59
龜山區 100
八德區 138
龍潭區 75
平鎮區 151
新屋區 37
觀音區 45
復興區 11
Step 3. 繪製圖表
接著我們於程式最上方引入 matplotlib
套件並使用別名繪製長條圖:
import matplotlib.pyplot as plt
# kind 定義圖表類型。plot 函式會取 column 值代表 y 軸的值,index 索引代表 x 軸
axes = data.plot(kind='bar')
Step 4. 中文化
若使用自行設定字體若有中文字的地方都要給定字體才不會出現亂碼或空白(ex. title
, label
, legend
等),這邊我們使用 NotoSansCJK-Black
(也可以自行選擇支援中文的字體)可以在 下載連結 下載使用並放入和程式同一個專案工作資料夾下。
# 使用 FontProperties 建立字體屬性物件
myfont = FontProperties(fname=r'./NotoSansCJK-Black.ttc')
# 設定標頭和字體
plt.title('一月份各區域結婚數',fontproperties=myfont)
# 設定 x 軸標頭和字體
plt.xlabel('區域別',fontproperties=myfont)
# 設定 y 軸標頭和字體
plt.ylabel('結婚數', fontproperties=myfont)
# 設定右上角說明圖示字體
plt.legend(prop=myfont)
# 使用 for 迴圈一一取出 x 軸標籤 label 設定字體,若 y 軸有中文字也是類似使用方式 get_yticklabels
for label in axes.get_xticklabels():
label.set_fontproperties(myfont)
其中特別需要注意是 xlabel
需要一一取出設定字體:
# 使用 for 迴圈一一取出 x 軸標籤 label 設定字體,若 y 軸有中文字也是類似使用方式 get_yticklabels
for label in axes.get_xticklabels():
label.set_fontproperties(myfont)
Step 5. 呈現成果
# 顯示圖表
plt.show()
完整程式碼:
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties
# 讀入資料集檔案
df = pd.read_csv('married.csv')
# loc 取值方式為 [索引, [欄位]],取 月份區域別 出來當作 index
data = df.loc[:, ['月份區域別', '一月']]
print(data)
# 原本 index 為 0, 1, 2, 3...12,改為 月份區域別,這樣 x 軸標籤就會改為 月份區域別
data = data.set_index('月份區域別')
print(data)
# plot 函式會取 column 值代表 y 軸的值,index 索引代表 x 軸
axes = data.plot(kind='bar')
myfont = FontProperties(fname=r'./NotoSansCJK-Black.ttc')
# 設定標頭和字體
plt.title('一月份各區域結婚數',fontproperties=myfont)
# 設定 x 軸標頭和字體
plt.xlabel('區域別',fontproperties=myfont)
# 設定 y 軸標頭和字體
plt.ylabel('結婚數', fontproperties=myfont)
# 設定右上角說明圖示字體
plt.legend(prop=myfont)
# 使用 for 迴圈一一取出 x 軸標籤 label 設定字體,若 y 軸有中文字也是類似使用方式 get_yticklabels
for label in axes.get_xticklabels():
label.set_fontproperties(myfont)
# 顯示圖表
plt.show()
執行結果:
以上透過範例介紹圖表的專有名詞及講解如何設定支援中文字體的物件,並讓 matplotlib 圖表可以顯示中文字體。相信讀者跟著操作可以快速解決 matplotlib 不能顯示中文字體的惱人問題。若有討論或是問題歡迎留言和我們一起交流學習喔!
]]>Matplotlib 和 Pandas 是兩個在資料科學專案中時常使用的兩個套件。Pandas 主要用於資料輸入輸出及資料分析操作,而 Matplotlib 主要是用來資料視覺化,呈現圖表使用,兩者可以單獨也可以搭配使用。在使用 Matplotlib
繪製圖表的中文使用者最常會遇到的問題就是中文字體在預設的 Matplotlib 顯示不出中文字體。接下來我們就透過範例程式一步步手把手帶領大家如何在 Matplotlib
顯示圖表的中文字體標籤和說明圖示(本文假設讀者對於 Python 程式語法、Pandas 和 Matplotlib 已有基本認識)。
Matplotlib 中有一些專有名詞,若能掌握住將對我們接下來學習如何在 Matplotlib
使用中文字體會很有幫助。
(1) Figure
: 代表整個面板
(2) Axes
: 代表整個圖表
(3) Axis
: 代表軸
(4) Legend
: 代表圖示說明
(5) Label
: 代表軸標頭
(6) Title
: 代表圖表標頭
解決中文字體空白或是顯示不出來的問題,主要解法有以下兩種:
接下來本文會先透過一個範例優先介紹 在程式中引入支援中文的字體 這種作法。
Step 1. 規劃目標並準備資料
目標:我們希望透過長條圖顯示桃園地區結婚對數,了解結婚分布狀況。
資料集使用政府開放資料中 108 年度桃園地區結婚對數資料集,我們下載 .csv
檔案後更改檔案名稱為: marriage.csv
。檔案內容如下:
月份區域別,一月,二月,三月,四月,五月,六月,七月,八月,九月,十月,十一月,十二月
桃園區,305,202,240,177,272,221,184,109,222,251,223,268
中壢區,271,198,215,213,222,219,188,94,240,246,215,269
大溪區,54,46,40,37,64,58,38,20,47,74,46,48
楊梅區,103,69,91,71,95,99,81,41,89,115,98,121
蘆竹區,100,72,77,80,92,87,70,38,96,95,103,86
大園區,59,38,40,37,61,53,42,15,49,57,53,50
龜山區,100,64,80,75,86,85,82,46,102,92,80,91
八德區,138,98,114,104,133,122,108,57,108,121,105,130
龍潭區,75,52,67,78,72,49,74,26,76,69,73,83
平鎮區,151,97,110,115,144,132,127,55,115,138,138,150
新屋區,37,15,14,24,21,20,24,7,26,21,23,26
觀音區,45,21,38,31,43,32,29,14,45,31,32,40
復興區,11,4,8,5,6,8,6,5,8,6,7,4
Step 2. 載入資料
import pandas as pd
# 讀入資料集檔案
df = pd.read_csv('married.csv')
接著要取出我們想要顯示圖表的資料:
# loc 取值方式為 [索引, [欄位]],取 月份區域別 出來當作 index
data = df.loc[:, ['月份區域別', '一月']]
print(data)
印出內容:
月份區域別 一月
0 桃園區 305
1 中壢區 271
2 大溪區 54
3 楊梅區 103
4 蘆竹區 100
5 大園區 59
6 龜山區 100
7 八德區 138
8 龍潭區 75
9 平鎮區 151
10 新屋區 37
11 觀音區 45
12 復興區 11
並設定 dataframe index
為 月份區域別 當作 x 軸,因為原本 預設 index 為 0, 1, 2, ...
# 原本 index 為 0, 1, 2, 3...12,改為 月份區域別,這樣 x 軸標籤就會改為 月份區域別
data = data.set_index('月份區域別')
print(data)
印出內容:
一月
月份區域別
桃園區 305
中壢區 271
大溪區 54
楊梅區 103
蘆竹區 100
大園區 59
龜山區 100
八德區 138
龍潭區 75
平鎮區 151
新屋區 37
觀音區 45
復興區 11
Step 3. 繪製圖表
接著我們於程式最上方引入 matplotlib
套件並使用別名繪製長條圖:
import matplotlib.pyplot as plt
# kind 定義圖表類型。plot 函式會取 column 值代表 y 軸的值,index 索引代表 x 軸
axes = data.plot(kind='bar')
Step 4. 中文化
若使用自行設定字體若有中文字的地方都要給定字體才不會出現亂碼或空白(ex. title
, label
, legend
等),這邊我們使用 NotoSansCJK-Black
(也可以自行選擇支援中文的字體)可以在 下載連結 下載使用並放入和程式同一個專案工作資料夾下。
# 使用 FontProperties 建立字體屬性物件
myfont = FontProperties(fname=r'./NotoSansCJK-Black.ttc')
# 設定標頭和字體
plt.title('一月份各區域結婚數',fontproperties=myfont)
# 設定 x 軸標頭和字體
plt.xlabel('區域別',fontproperties=myfont)
# 設定 y 軸標頭和字體
plt.ylabel('結婚數', fontproperties=myfont)
# 設定右上角說明圖示字體
plt.legend(prop=myfont)
# 使用 for 迴圈一一取出 x 軸標籤 label 設定字體,若 y 軸有中文字也是類似使用方式 get_yticklabels
for label in axes.get_xticklabels():
label.set_fontproperties(myfont)
其中特別需要注意是 xlabel
需要一一取出設定字體:
# 使用 for 迴圈一一取出 x 軸標籤 label 設定字體,若 y 軸有中文字也是類似使用方式 get_yticklabels
for label in axes.get_xticklabels():
label.set_fontproperties(myfont)
Step 5. 呈現成果
# 顯示圖表
plt.show()
完整程式碼:
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties
# 讀入資料集檔案
df = pd.read_csv('married.csv')
# loc 取值方式為 [索引, [欄位]],取 月份區域別 出來當作 index
data = df.loc[:, ['月份區域別', '一月']]
print(data)
# 原本 index 為 0, 1, 2, 3...12,改為 月份區域別,這樣 x 軸標籤就會改為 月份區域別
data = data.set_index('月份區域別')
print(data)
# plot 函式會取 column 值代表 y 軸的值,index 索引代表 x 軸
axes = data.plot(kind='bar')
myfont = FontProperties(fname=r'./NotoSansCJK-Black.ttc')
# 設定標頭和字體
plt.title('一月份各區域結婚數',fontproperties=myfont)
# 設定 x 軸標頭和字體
plt.xlabel('區域別',fontproperties=myfont)
# 設定 y 軸標頭和字體
plt.ylabel('結婚數', fontproperties=myfont)
# 設定右上角說明圖示字體
plt.legend(prop=myfont)
# 使用 for 迴圈一一取出 x 軸標籤 label 設定字體,若 y 軸有中文字也是類似使用方式 get_yticklabels
for label in axes.get_xticklabels():
label.set_fontproperties(myfont)
# 顯示圖表
plt.show()
執行結果:
以上透過範例介紹圖表的專有名詞及講解如何設定支援中文字體的物件,並讓 matplotlib 圖表可以顯示中文字體。相信讀者跟著操作可以快速解決 matplotlib 不能顯示中文字體的惱人問題。若有討論或是問題歡迎留言和我們一起交流學習喔!
]]>Python 虛擬環境本質上是一個資料夾,讓我們可以根據不同專案去管理所需要的環境,安裝不同版本的套件避免衝突(例如:某專案需要套件的版本不同)。除了在 Anaconda 圖形化介面環境設定虛擬環境外,我們也可以使用 conda 指令管理虛擬環境。
首先,打開 Terminal 終端機 / Anaconda Prompt,我們可以使用 conda 進行指令碼的操作,包括原本使用 GUI 圖形化操作的建立虛擬環境資料夾(工作環境)和安裝套件等操作,進而讓我們的專案獨立使用自己的空間(當然也可以不使用,直接共用 base 工作環境,這邊先記住可以因為不同專案開設不同的虛擬環境來隔離不同的套件安裝)。目前暫時不會用到,可以先記得有相關指令可以管理虛擬環境就好。
檢視目前 conda 的版本:
conda --version
查看 conda 指令的說明文件:
conda --help
建立新的工作環境且安裝自行指定的 Python 版本(ENVIRONMENT 為自行命名環境名稱,ex. demo_project
):
conda create --name ENVIRONMENT python=3.6
切換至指定虛擬工作環境(ENVIRONMENT 為自行命名環境名稱。ex. demo_project
):
conda activate ENVIRONMENT
離開虛擬工作環境回到 base 基礎工作環境:
conda deactivate
移除指定虛擬工作環境:
conda remove --name ENVIRONMENT --all
]]>Python 虛擬環境本質上是一個資料夾,讓我們可以根據不同專案去管理所需要的環境,安裝不同版本的套件避免衝突(例如:某專案需要套件的版本不同)。除了在 Anaconda 圖形化介面環境設定虛擬環境外,我們也可以使用 conda 指令管理虛擬環境。
首先,打開 Terminal 終端機 / Anaconda Prompt,我們可以使用 conda 進行指令碼的操作,包括原本使用 GUI 圖形化操作的建立虛擬環境資料夾(工作環境)和安裝套件等操作,進而讓我們的專案獨立使用自己的空間(當然也可以不使用,直接共用 base 工作環境,這邊先記住可以因為不同專案開設不同的虛擬環境來隔離不同的套件安裝)。目前暫時不會用到,可以先記得有相關指令可以管理虛擬環境就好。
檢視目前 conda 的版本:
conda --version
查看 conda 指令的說明文件:
conda --help
建立新的工作環境且安裝自行指定的 Python 版本(ENVIRONMENT 為自行命名環境名稱,ex. demo_project
):
conda create --name ENVIRONMENT python=3.6
切換至指定虛擬工作環境(ENVIRONMENT 為自行命名環境名稱。ex. demo_project
):
conda activate ENVIRONMENT
離開虛擬工作環境回到 base 基礎工作環境:
conda deactivate
移除指定虛擬工作環境:
conda remove --name ENVIRONMENT --all
]]>
給定 C 語言程式如下,其中 s
被宣告為全域變數,給定值為 1
。請問最後程式執行後輸出為何?
#include <stdio.h>
int s = 1; // 全域變數
void add(int a) {
int s = 6;
for (; a >= 0; a = a - 1) {
printf("%d, ", s);
s++;
printf("%d, ", s);
}
}
int main() {
printf("%d, ", s);
add(s);
printf("%d, ", s);
s = 9;
printf("%d", s);
return 0;
}
(A) 1, 6, 7, 7, 8, 8, 9
(B) 1, 6, 7, 7, 8, 1, 9
(C) 1, 6, 7, 8, 9, 9, 9
(D) 1, 6, 7, 7, 8, 9, 9
答案為 (B) 1, 6, 7, 7, 8, 1, 9
本程式挑戰主要在測試同學對於「全域變數」(Global variable)、「區域變數」(Local variable)的生命週期和變數可視範圍(Scope)的理解。若是函數內沒有宣告變數卻使用該變數,則會往外看是否有同名變數,若有則使用該變數。在主程式外的宣告的變數為全域變數,程式內的跨函式都可以存取、修改該變數,若是在函式內宣告的變數或參數變數則為區域變數,區域變數存取修改權僅限於該函式內,函式結束即消失。
#include <stdio.h>
// 全域變數
int s = 1;
void add(int a) {
// 區域變數 s
int s = 6;
// 區域變數 a,值為 1
for (; a >= 0; a = a - 1) {
// 迴圈兩次,第一次印出 6,第二次印出 7
printf("%d, ", s);
// s = s + 1
s++;
// 迴圈兩次,第一次印出 7,第二次印出 8
printf("%d, ", s);
}
}
int main() {
// s 在主程式中找不到,所以為全域變數 s,值為 1
printf("%d, ", s);
// 複製傳入參數值為 1
add(s);
// 全域變數 s,值為 1
printf("%d, ", s);
// 更改全域變數 s,值為 9
s = 9;
printf("%d", s);
return 0;
}
我們可以透過觀察程式執行的過程來判斷(在 C 語言我們以主程式 main()
為執行區塊,由上往下執行):例如在 main()
函式內部 s = 9;
這行之前的 s
使用的是全域變數 1
。因此傳入 add()
函式的 a
參數為 1
。因此 for
迴圈會進行兩次後結束,印出 6, 7, 7, 8
(add
函式內的 s
為自己內部宣告的區域變數非外部的全域變數 1
,所以不影響到全域變數 s
)
最後main()
函式內部使用到的 s
全域變數(前面沒有設定變數型別),被改成 9
:
s = 9
所以結果為:1, 6, 7, 7, 8, 1, 9
另外還有區塊變數(Block variable)是指宣告在某個陳述句區塊之中的變數,例如 while 迴圈或是 for 迴圈區塊內使用,區塊結束即消逝。
#include <stdio.h>
int main() {
int i = 101;
for (int i = 0; i < 10; i++) {
// 不受外面的 i 影響
printf("%d", i);
}
// 印出的是 101
printf("%d", i);
}
其結果為:0123456789101
給定 C 語言程式如下,其中 s
被宣告為全域變數,給定值為 1
。請問最後程式執行後輸出為何?
#include <stdio.h>
int s = 1; // 全域變數
void add(int a) {
int s = 6;
for (; a >= 0; a = a - 1) {
printf("%d, ", s);
s++;
printf("%d, ", s);
}
}
int main() {
printf("%d, ", s);
add(s);
printf("%d, ", s);
s = 9;
printf("%d", s);
return 0;
}
(A) 1, 6, 7, 7, 8, 8, 9
(B) 1, 6, 7, 7, 8, 1, 9
(C) 1, 6, 7, 8, 9, 9, 9
(D) 1, 6, 7, 7, 8, 9, 9
答案為 (B) 1, 6, 7, 7, 8, 1, 9
本程式挑戰主要在測試同學對於「全域變數」(Global variable)、「區域變數」(Local variable)的生命週期和變數可視範圍(Scope)的理解。若是函數內沒有宣告變數卻使用該變數,則會往外看是否有同名變數,若有則使用該變數。在主程式外的宣告的變數為全域變數,程式內的跨函式都可以存取、修改該變數,若是在函式內宣告的變數或參數變數則為區域變數,區域變數存取修改權僅限於該函式內,函式結束即消失。
#include <stdio.h>
// 全域變數
int s = 1;
void add(int a) {
// 區域變數 s
int s = 6;
// 區域變數 a,值為 1
for (; a >= 0; a = a - 1) {
// 迴圈兩次,第一次印出 6,第二次印出 7
printf("%d, ", s);
// s = s + 1
s++;
// 迴圈兩次,第一次印出 7,第二次印出 8
printf("%d, ", s);
}
}
int main() {
// s 在主程式中找不到,所以為全域變數 s,值為 1
printf("%d, ", s);
// 複製傳入參數值為 1
add(s);
// 全域變數 s,值為 1
printf("%d, ", s);
// 更改全域變數 s,值為 9
s = 9;
printf("%d", s);
return 0;
}
我們可以透過觀察程式執行的過程來判斷(在 C 語言我們以主程式 main()
為執行區塊,由上往下執行):例如在 main()
函式內部 s = 9;
這行之前的 s
使用的是全域變數 1
。因此傳入 add()
函式的 a
參數為 1
。因此 for
迴圈會進行兩次後結束,印出 6, 7, 7, 8
(add
函式內的 s
為自己內部宣告的區域變數非外部的全域變數 1
,所以不影響到全域變數 s
)
最後main()
函式內部使用到的 s
全域變數(前面沒有設定變數型別),被改成 9
:
s = 9
所以結果為:1, 6, 7, 7, 8, 1, 9
另外還有區塊變數(Block variable)是指宣告在某個陳述句區塊之中的變數,例如 while 迴圈或是 for 迴圈區塊內使用,區塊結束即消逝。
#include <stdio.h>
int main() {
int i = 101;
for (int i = 0; i < 10; i++) {
// 不受外面的 i 影響
printf("%d", i);
}
// 印出的是 101
printf("%d", i);
}
其結果為:0123456789101
人工智慧(Artificial Intelligence)是一門綜合性學科(包含電腦科學、醫學、機器人學、腦神經科學、數學、統計學、經濟學、哲學等),主要研究方向為研究發展和人類類似或是超越人類智慧及能力的電腦系統。機器學習(Machine Learning)和深度學習(Deep Learning)是目前人工智慧主要的實踐技術及研究。而巨量和多元的大數據(Big Data)資料則提供人工智慧很好的研究素材和原料,成本持續下降的運算硬體資源則提供人工智慧領域很好的背景支持(例如:雲端運算、GPU、TPU 等)。
若以製作料理的角度來看,大數據(Big Data)就是食材、機器學習(Machine Learning)就是烹飪方式,讓人大快朵頤的美味料理就是人工智慧(Artificial Intelligence)
人工智慧就是讓電腦系統能像人類一樣學習和思考,但是目前對於「智慧」難以有確切的定義,於是將人工智慧區分為「強人工智慧」(Strong AI)和「弱人工智慧」(Weak AI) 兩種不同的主張。「弱人工智慧」只能模擬人類的思維與行為表現,但缺乏真正的推理與解決問題的能力,也不具備有自主意識,並不具備人類的思考能力。目前市面上多數「人工智慧」產品或技術主要都是「弱人工智慧」。舉例來說,目前人工智慧在特定領域已經和人類相當甚至超越人類(例如:語音、影像辨識服務、遊戲競賽、棋藝對奕人工智慧等),這些就屬於弱人工智慧。
人工智慧(Artificial Intelligence)是一門綜合性學科(包含電腦科學、醫學、機器人學、腦神經科學、數學、統計學、經濟學、哲學等),主要研究方向為研究發展和人類類似或是超越人類智慧及能力的電腦系統。機器學習(Machine Learning)和深度學習(Deep Learning)是目前人工智慧主要的實踐技術及研究。而巨量和多元的大數據(Big Data)資料則提供人工智慧很好的研究素材和原料,成本持續下降的運算硬體資源則提供人工智慧領域很好的背景支持(例如:雲端運算、GPU、TPU 等)。
若以製作料理的角度來看,大數據(Big Data)就是食材、機器學習(Machine Learning)就是烹飪方式,讓人大快朵頤的美味料理就是人工智慧(Artificial Intelligence)
人工智慧就是讓電腦系統能像人類一樣學習和思考,但是目前對於「智慧」難以有確切的定義,於是將人工智慧區分為「強人工智慧」(Strong AI)和「弱人工智慧」(Weak AI) 兩種不同的主張。「弱人工智慧」只能模擬人類的思維與行為表現,但缺乏真正的推理與解決問題的能力,也不具備有自主意識,並不具備人類的思考能力。目前市面上多數「人工智慧」產品或技術主要都是「弱人工智慧」。舉例來說,目前人工智慧在特定領域已經和人類相當甚至超越人類(例如:語音、影像辨識服務、遊戲競賽、棋藝對奕人工智慧等),這些就屬於弱人工智慧。
隨著資訊科技的發展以及 108 年課綱列入程式設計和資訊科技能力素養相關科目,讓許多家長和學生,甚至是職場上班族開始思索是否要開始進修學習資訊技能以及自學程式設計,以免自己或小孩輸在人生的競技場中。過去一段時間我們 HappyCoder 自學程式設計學院社群輔導超過 3000 位學員跨領域學習程式設計,有許多學員和社群朋友提出許多關於跨領域自學程式設計的相關疑問。為了能讓更多的人可以對於跨領域自學程式設計有更清楚的認識,我們整理了以下常見自學程式設計相關的問題,希望能解決許多朋友心中的疑惑,也歡迎大家一起加入我們,一起交流討論,分享你的自學程式設計經驗。
關於跨領域自學程式設計你想知道的都在這裡了
在學習一項新的技能或是才藝時若能明確自己的目標和動機可以讓學習的路上更為順遂。所以事先釐清自己的動機、目的和需求才開始選擇合適的程式語言和工具以及合適的學習資源才是跨領域自學程式設計的第 0 步開始。一般而言跨領域非資工資管等資訊相關科系的學生自學程式主要有分三種方向和動機:
事實上,程式設計師或是軟體工程師若是對於撰寫程式和解決問題很有熱忱的話,是一個十分令人羨慕的職業:因為可以將興趣和職業相結合,這是許多工作比較難有辦法達到的部分。
若是以希望轉換跑到轉職成為程式設計師和軟體工程師為目標的話,著重的主要就是求職相關技能的養成,包含對應職業的職能培養、履歷撰寫、面試技巧和軟體工程師素養的養成等。例如:Web 前端軟體工程師、Web 後端軟體工程師、Mobile 行動應用工程師、IC 設計演算法工程師、IoT 軟硬整合工程師/嵌入式系統開發、Blockchain 開發者、DevOps 開發運維以及資料科學家、資料工程師、資料分析師等分別有不同和共同的工作職能需要養成。但需要注意的是 IT 資訊科技產業技術和新知變化快速,要有願意持續刻意練習和克服困難的毅力、自學能力和熱情才能走的長久。
至於如何準備轉職面試、如何度過新手期,如何規劃軟體工程師的職涯發展,資淺工程師如何邁向資深工程師,這部份議題太大太廣,需要之後另外開主題來討論。
這部份是我們 HappyCoder 自學程式設計學院致力於推廣的自學程式設計精神。學習程式設計並不是希望每個人都成為程式設計師或軟體工程師,因為沒有必要,也不可能。由於撰寫程式最重要的其實是需求分析和系統設計的部分,在這個階段透過問題的拆解、模式識別和歸納、抽象化以及問題的分析與演算法設計等都是很好用來培養解決問題、搜尋資料和團隊溝通協調合作的機會。換言之:學習程式設計並不等於學習運算思維,只是透過正確的方式學習程式設計是學習運算思維和解決問題的能力相對快且有效的方式之一
。
那學習運算思維和解決問題有什麼好處呢?事實上,生活中無處不需要運算思維(Computational Thinking)和解決問題的能力。舉凡規劃旅行計畫、分析投資策略、通勤路線規劃、購物選擇、工作商業邏輯分析等。而培養跨領域自學能力則是在各行各業面對自動化 AI 人工智慧等科技發展很重要的競爭力。
學習程式設計並不是希望每個人都成為程式設計師或軟體工程師,因為沒有必要,也不可能。而是在學習程式設計的過程中,磨練運算思維(Computational Thinking)、解決問題的能力及跨領域自學能力,成為更好的自己
這時候主要是根據想解決的問題去學習和選擇適合的程式語言工具,用來解決生活上的問題。例如:學習 Python 網路爬蟲自動化爬取資料、學習使用 Pyhon 操作 Excel 減少重複性工作、製作小遊戲自娛娛人、開發聊天機器人自動回覆訊息提升工作效率等。
初期不一定需要,但若具備良好的英文閱讀和理解能力,將讓自己在學習進階內容時可以更快理解內容。這個原因在於目前程式語言主流資訊和學習資源以英文為主,若是具備好的英文能力將有助於學習相關知識,尤其若是學習目標為轉職程式設計師和軟體工程師的話,這部份尤為重要。未來若是希望往資深工程師或是更高深的領域鑽研的話,英文閱讀和理解以及能夠在工作場合、論壇或是演講以英文書寫、口語表達自己的能力就非常重要。
看目標需求而定。若是志在轉職程式設計師和軟體工程師的話,大部分情況下數學能力只要高中程度即可(前提是高中有好好學習)。若是希望轉職資料科學家或是機器學習專家等對於統計學、離散數學和線性代數等數學能力有更高的要求。所以簡而言之,大部分的情況下軟體工程師更重要的是理解能力、自學能力和邏輯和抽象化歸納能力,在特定領域或是研究機構數學能力相對要求比較高。
端看你的需求決定需要學習哪一種程式語言。若是希望轉職軟體工程師或是程式設計師,可以先從 Web 開發入門,相對而需求量較多也比較容易讓跨領域自學的人進入。對於 Web 開發、前端基本需要學習 HTML/CSS 語法以及 JavaScript 程式語言(也可以使用 NodeJS用於後端開發)。若是 Web 後端則可以選擇 Python、Ruby、PHP、Java 等。行動應用則是選擇 Android(Java/Kotlin)或是 iOS(Swift/Objetive-C)。若是有志於資料科學相關職涯發展的話 Python 是推薦入門的程式語言。若是對於嵌入式系統應用有興趣,C/C++ 就是首選程式語言。
若是你希望磨練運算思維(Computational Thinking)和解決問題的能力、學習基礎程式設計用於解決自己領域或生活上重複繁瑣的工作,選擇 Python 程式語言是很好的入門方式。
因人而異。不可諱言越年輕轉職成本越低,因為家累負擔小,機會成本低。隨著市場上軟體工程師的缺口增加,當然也有不乏更年長的朋友轉職成功,但年紀越大需要的是完善的規劃、毅力和執行力。一般會建議若是非本科生跨領域自學程式設計轉職軟體工程師或程式設計師可以和本身領域有相關,這樣一來你過去的經驗就是加分,尤其現在跨領域人才越來越被重視。舉例而言:若是你過去的背景在金融銀行相關,在現在純網銀和金融科技快速發展的情況,若能把握相關機會則是相對單一背景的競爭者更好的優勢。
至於待遇則是因人、產業、地點而異。程式設計師和軟體工程師是一個特別的職業,一個頂尖軟體工程師的生產力和一個平庸的軟體工程師可能會差異到 10 倍甚至更多,當然依照生產力的不同也會有不同的待遇(當然有時還是要看機運和個人品牌及人際網路的經營)。此外選擇在矽谷灣區等網路軟體產業蓬勃發展的地方,軟體工程師薪資待遇當然會比在其他地方好上許多。另外,以網路軟體研發工程師為主的公司,也會比工程師只是配角的公司好。
若是有志於從事軟體工程師的職業,就要有不斷學習新知的認知和熱情,才能在不斷更迭變化的技術圈中持續進步。
因人而異。若是想先嘗試是否合適可以先選擇看書自學,接著可以參與一些線上或線下課程,但最重要的還是能參與一個有好的同儕可以彼此激勵分享經驗的學習環境和社群。當然,若能有導師協助帶領則可以讓自己少走許多冤枉路。
對於一些新創公司或小公司來說學歷可能不是很重要(但還是要看職位,若是資料科學家相關職位對於是否有相關學術經驗可能就蠻重要的),能夠馬上實戰的即戰力是最重要的。但對於一些規模較大的公司,不管是升遷或是入職時對於學歷要求還是比較看中(事實上,學歷的重點在於打入另外一個人際網路連結)。另外,若是希望在美國等海外工作,最大的問題其實是簽證問題。所以許多海外求職朋友會在海外再額外拿一個碩士學位,獲得相關簽證爭取留在當地工作的機會。
當然若是希望成為資深軟體工程師,不斷鑽研學習和補足電腦科學基礎理論是很重要的一環,此外,向上管理、溝通協調、領導統御、系統分析設計等能力更是重要的軟實力。
先釐清為何要學習程式,並不用刻意的強求小朋友一定要學習程式語言,小孩重要的是陪伴和鼓勵以及探索自己的興趣。若是比較小的朋友會建議以磨練運算思維(Computational Thinking)、解決問題的能力及跨領域自學能力為主。若是國中小的學生可以先從不插電書籍或是桌遊學習程式設計邏輯思考和電腦科學概念,接下來可以透過 Scratch、Microbit 等簡易拖拉式程式語言工具著手,更進一步則可以導入 Python 進行簡單小遊戲或應用程式開發,培養興趣和成就感。
以上整理跨領域自學程式設計常見問題解析,在開始你的自學程式設計還是要先確認自己的目標和動機,才能走好接下來的每一步。
若是讀者們對於自學程式設計相關問題還有疑問的話,歡迎在下方留言,我們會陸續更新整理。若是覺得我們的文章寫的不錯,也歡迎給我們按讚分享鼓勵:)
歡迎在網路社群上訂閱追蹤我們,免費獲得自學程式設計教學、學習資源和課程資訊!
(Photo by Dlanor S on Unsplash)
]]>隨著資訊科技的發展以及 108 年課綱列入程式設計和資訊科技能力素養相關科目,讓許多家長和學生,甚至是職場上班族開始思索是否要開始進修學習資訊技能以及自學程式設計,以免自己或小孩輸在人生的競技場中。過去一段時間我們 HappyCoder 自學程式設計學院社群輔導超過 3000 位學員跨領域學習程式設計,有許多學員和社群朋友提出許多關於跨領域自學程式設計的相關疑問。為了能讓更多的人可以對於跨領域自學程式設計有更清楚的認識,我們整理了以下常見自學程式設計相關的問題,希望能解決許多朋友心中的疑惑,也歡迎大家一起加入我們,一起交流討論,分享你的自學程式設計經驗。
關於跨領域自學程式設計你想知道的都在這裡了
在學習一項新的技能或是才藝時若能明確自己的目標和動機可以讓學習的路上更為順遂。所以事先釐清自己的動機、目的和需求才開始選擇合適的程式語言和工具以及合適的學習資源才是跨領域自學程式設計的第 0 步開始。一般而言跨領域非資工資管等資訊相關科系的學生自學程式主要有分三種方向和動機:
事實上,程式設計師或是軟體工程師若是對於撰寫程式和解決問題很有熱忱的話,是一個十分令人羨慕的職業:因為可以將興趣和職業相結合,這是許多工作比較難有辦法達到的部分。
若是以希望轉換跑到轉職成為程式設計師和軟體工程師為目標的話,著重的主要就是求職相關技能的養成,包含對應職業的職能培養、履歷撰寫、面試技巧和軟體工程師素養的養成等。例如:Web 前端軟體工程師、Web 後端軟體工程師、Mobile 行動應用工程師、IC 設計演算法工程師、IoT 軟硬整合工程師/嵌入式系統開發、Blockchain 開發者、DevOps 開發運維以及資料科學家、資料工程師、資料分析師等分別有不同和共同的工作職能需要養成。但需要注意的是 IT 資訊科技產業技術和新知變化快速,要有願意持續刻意練習和克服困難的毅力、自學能力和熱情才能走的長久。
至於如何準備轉職面試、如何度過新手期,如何規劃軟體工程師的職涯發展,資淺工程師如何邁向資深工程師,這部份議題太大太廣,需要之後另外開主題來討論。
這部份是我們 HappyCoder 自學程式設計學院致力於推廣的自學程式設計精神。學習程式設計並不是希望每個人都成為程式設計師或軟體工程師,因為沒有必要,也不可能。由於撰寫程式最重要的其實是需求分析和系統設計的部分,在這個階段透過問題的拆解、模式識別和歸納、抽象化以及問題的分析與演算法設計等都是很好用來培養解決問題、搜尋資料和團隊溝通協調合作的機會。換言之:學習程式設計並不等於學習運算思維,只是透過正確的方式學習程式設計是學習運算思維和解決問題的能力相對快且有效的方式之一
。
那學習運算思維和解決問題有什麼好處呢?事實上,生活中無處不需要運算思維(Computational Thinking)和解決問題的能力。舉凡規劃旅行計畫、分析投資策略、通勤路線規劃、購物選擇、工作商業邏輯分析等。而培養跨領域自學能力則是在各行各業面對自動化 AI 人工智慧等科技發展很重要的競爭力。
學習程式設計並不是希望每個人都成為程式設計師或軟體工程師,因為沒有必要,也不可能。而是在學習程式設計的過程中,磨練運算思維(Computational Thinking)、解決問題的能力及跨領域自學能力,成為更好的自己
這時候主要是根據想解決的問題去學習和選擇適合的程式語言工具,用來解決生活上的問題。例如:學習 Python 網路爬蟲自動化爬取資料、學習使用 Pyhon 操作 Excel 減少重複性工作、製作小遊戲自娛娛人、開發聊天機器人自動回覆訊息提升工作效率等。
初期不一定需要,但若具備良好的英文閱讀和理解能力,將讓自己在學習進階內容時可以更快理解內容。這個原因在於目前程式語言主流資訊和學習資源以英文為主,若是具備好的英文能力將有助於學習相關知識,尤其若是學習目標為轉職程式設計師和軟體工程師的話,這部份尤為重要。未來若是希望往資深工程師或是更高深的領域鑽研的話,英文閱讀和理解以及能夠在工作場合、論壇或是演講以英文書寫、口語表達自己的能力就非常重要。
看目標需求而定。若是志在轉職程式設計師和軟體工程師的話,大部分情況下數學能力只要高中程度即可(前提是高中有好好學習)。若是希望轉職資料科學家或是機器學習專家等對於統計學、離散數學和線性代數等數學能力有更高的要求。所以簡而言之,大部分的情況下軟體工程師更重要的是理解能力、自學能力和邏輯和抽象化歸納能力,在特定領域或是研究機構數學能力相對要求比較高。
端看你的需求決定需要學習哪一種程式語言。若是希望轉職軟體工程師或是程式設計師,可以先從 Web 開發入門,相對而需求量較多也比較容易讓跨領域自學的人進入。對於 Web 開發、前端基本需要學習 HTML/CSS 語法以及 JavaScript 程式語言(也可以使用 NodeJS用於後端開發)。若是 Web 後端則可以選擇 Python、Ruby、PHP、Java 等。行動應用則是選擇 Android(Java/Kotlin)或是 iOS(Swift/Objetive-C)。若是有志於資料科學相關職涯發展的話 Python 是推薦入門的程式語言。若是對於嵌入式系統應用有興趣,C/C++ 就是首選程式語言。
若是你希望磨練運算思維(Computational Thinking)和解決問題的能力、學習基礎程式設計用於解決自己領域或生活上重複繁瑣的工作,選擇 Python 程式語言是很好的入門方式。
因人而異。不可諱言越年輕轉職成本越低,因為家累負擔小,機會成本低。隨著市場上軟體工程師的缺口增加,當然也有不乏更年長的朋友轉職成功,但年紀越大需要的是完善的規劃、毅力和執行力。一般會建議若是非本科生跨領域自學程式設計轉職軟體工程師或程式設計師可以和本身領域有相關,這樣一來你過去的經驗就是加分,尤其現在跨領域人才越來越被重視。舉例而言:若是你過去的背景在金融銀行相關,在現在純網銀和金融科技快速發展的情況,若能把握相關機會則是相對單一背景的競爭者更好的優勢。
至於待遇則是因人、產業、地點而異。程式設計師和軟體工程師是一個特別的職業,一個頂尖軟體工程師的生產力和一個平庸的軟體工程師可能會差異到 10 倍甚至更多,當然依照生產力的不同也會有不同的待遇(當然有時還是要看機運和個人品牌及人際網路的經營)。此外選擇在矽谷灣區等網路軟體產業蓬勃發展的地方,軟體工程師薪資待遇當然會比在其他地方好上許多。另外,以網路軟體研發工程師為主的公司,也會比工程師只是配角的公司好。
若是有志於從事軟體工程師的職業,就要有不斷學習新知的認知和熱情,才能在不斷更迭變化的技術圈中持續進步。
因人而異。若是想先嘗試是否合適可以先選擇看書自學,接著可以參與一些線上或線下課程,但最重要的還是能參與一個有好的同儕可以彼此激勵分享經驗的學習環境和社群。當然,若能有導師協助帶領則可以讓自己少走許多冤枉路。
對於一些新創公司或小公司來說學歷可能不是很重要(但還是要看職位,若是資料科學家相關職位對於是否有相關學術經驗可能就蠻重要的),能夠馬上實戰的即戰力是最重要的。但對於一些規模較大的公司,不管是升遷或是入職時對於學歷要求還是比較看中(事實上,學歷的重點在於打入另外一個人際網路連結)。另外,若是希望在美國等海外工作,最大的問題其實是簽證問題。所以許多海外求職朋友會在海外再額外拿一個碩士學位,獲得相關簽證爭取留在當地工作的機會。
當然若是希望成為資深軟體工程師,不斷鑽研學習和補足電腦科學基礎理論是很重要的一環,此外,向上管理、溝通協調、領導統御、系統分析設計等能力更是重要的軟實力。
先釐清為何要學習程式,並不用刻意的強求小朋友一定要學習程式語言,小孩重要的是陪伴和鼓勵以及探索自己的興趣。若是比較小的朋友會建議以磨練運算思維(Computational Thinking)、解決問題的能力及跨領域自學能力為主。若是國中小的學生可以先從不插電書籍或是桌遊學習程式設計邏輯思考和電腦科學概念,接下來可以透過 Scratch、Microbit 等簡易拖拉式程式語言工具著手,更進一步則可以導入 Python 進行簡單小遊戲或應用程式開發,培養興趣和成就感。
以上整理跨領域自學程式設計常見問題解析,在開始你的自學程式設計還是要先確認自己的目標和動機,才能走好接下來的每一步。
若是讀者們對於自學程式設計相關問題還有疑問的話,歡迎在下方留言,我們會陸續更新整理。若是覺得我們的文章寫的不錯,也歡迎給我們按讚分享鼓勵:)
歡迎在網路社群上訂閱追蹤我們,免費獲得自學程式設計教學、學習資源和課程資訊!
(Photo by Dlanor S on Unsplash)
]]>Markdown 是一種輕量級的標記語言,最初為 John Gruber 所設計。Markdown 特色在於允許人們「使用易讀易寫的純文字格式編寫文件,然後轉換成有效的 HTML 文件」。簡而言之,Markdown 就是一種簡潔易懂的語法,讓我們可以專注在內容上,不用花時間思考外觀樣式,在透過轉換變成可以呈現在網頁上的 HTML 語法。目前在許多知名技術/開發者論壇或是開發者工具(例如:Github)、技術部落格工具都有支援 Markdown 語法。
在開始學習 Markdown 之前我們先來認識一下 HTML,畢竟 Markdown 最終還是要轉換成 HTML 這個網頁上內容結構的標準語法。HTML 中文稱作超文本標記語言(英文全名為HyperText Markup Language,簡稱 HTML),是一種用於建立網頁的標準標記語言。
這樣講起來有點抽象,事實上我們每天在觀看瀏覽的網頁就是由一個個 HTML 所組成。所以我們可以透過瀏覽器的檢視原始碼功能去一窺目前網頁的 HTML 樣貌。
這邊我們使用 Google Chrome 瀏覽器當作範例,可以在畫面中點選右鍵 > 檢視原始碼(View Page Source):
就可以看到該網頁的 HTML 內容:
網頁來源:view-source:https://zh.wikipedia.org/zh-tw/HTML
由於這個網頁已經有點複雜,因為它已經包含了 CSS 外觀樣式語法和 JavaScript 互動邏輯程式的部分,對於初學者來說比較難一眼理解。所以我們用一下範例來介紹 HTML 最基礎的部分:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<h1>我是標題</h1>
<p>我是段落</p>
<a href="https://zh.wikipedia.org/zh-tw/Markdown">我是超連結</a>
<img src="https://upload.wikimedia.org/wikipedia/commons/thumb/8/84/HTML.svg/200px-HTML.svg.png" alt="">
</body>
</html>
若是使用瀏覽器打開這個 HTML 網頁會呈現:
HTML 標籤語法每個標籤皆有其意義且大部分成對出現,標籤元素內可以設定屬性值。網頁元素主要放置於 <body></body>
中,<head></head>
內主要放置 meta data 設定檔案和放置引入的外觀樣式檔案、程式邏輯等。元素內可以透過設定屬性值(attribute)來宣告元素功能,以下 href="https://zh.wikipedia.org/zh-tw/Markdown"
代表點擊該連結會到該 wikipedia 網址。
<!-- href 是屬性,決定連結點擊後目的地 -->
<a href="https://zh.wikipedia.org/zh-tw/Markdown">我是超連結</a>
<!-- src 是屬性,決定載入圖片位置-->
<img src="https://upload.wikimedia.org/wikipedia/commons/thumb/8/84/HTML.svg/200px-HTML.svg.png">
元素包裹內容在內,代表標題元素:
<h1>我是標題</h1>
一般 Markdwon 段落以空白行分隔。若是序列則內容需要內縮(一個 tab)。
是一级標題
=======
# 一級標題
## 二级標題
其 HTML 元素為:
<h1>是一级標題</h1>
<h1>一級標題</h1>
<h2>二级標題</h2>
效果如下:
_斜體_
**粗體**
`等寬字型Monospace`
其 HTML 元素為:
<em>斜體</em>
<strong>粗體</strong>
<code>等寬字型Monospace</code>
效果如下:
斜體
粗體
等寬字型Monospace
其 HTML 元素為:
<pre>
<code>
<span>print('hello world')</span>
</code>
</pre>
效果如下:
print('hello world code :)')
---
其 HTML 元素為:
<hr>
效果如下:
* 張三
* 李四
* 王二
其 HTML 元素為:
<ul>
<li>張三</li>
<li>李四</li>
<li>王二</li>
</ul>
效果如下:
1. 不論
2. 三七
3. 二十一
有序列表,其 HTML 元素為:
<ol>
<li>不論</li>
<li>三七</li>
<li>二十一</li>
</ol>
效果如下:
1. 不論
- 第一
- 第二
- 第三
2. 三七
1. 第一
2. 第二
3. 第三
3. 二十一
有序列表,其 HTML 元素為:
<ol>
<li>不論
<ul>
<li>第一</li>
<li>第二</li>
<li>第三</li>
</ul>
</li>
<li>三七
<ol>
<li>第一</li>
<li>第二</li>
<li>第三</li>
</ol>
</li>
<li>二十一</li>
</ol>
效果如下:
[連結文字](連結網址)
其 HTML 元素為:
<a href="https://upload.wikimedia.org/wikipedia/commons/thumb/8/84/HTML.svg/200px-HTML.svg.png">連結文字</a>
效果如下:
![文字屬性](Icon-pictures.png "文字標題")
其 HTML 元素為(少數沒有成對出現的元素標籤):
<img src="連結網址" alt="文字屬性" title="文字標題" />
效果如下:
> Markdown使用電郵用字元「>」來引用。
其 HTML 元素為:
<a href="連結網址">連結文字</a>
效果如下:
Markdown使用電郵用字元「>」來引用。
| Column 1 | Column 2 | Column 3 |
| -------- | -------- | -------- |
| Text | Text | Text |
其 HTML 元素為:
<table>
<thead>
<tr>
<th>Column 1</th>
<th>Column 2</th>
<th>Column 3</th>
</tr>
</thead>
<tbody>
<tr>
<td>Text</td>
<td>Text</td>
<td>Text</td>
</tr>
</tbody>
</table>
效果如下:
Column 1 | Column 2 | Column 3 |
---|---|---|
Text | Text | Text |
以上簡單介紹了:
以上介紹了 HTML 和 Markdown 基礎語法的教學,透過 Markdown 這一種簡潔易懂的語法,我們可以更專注在內容創作上。對於一個自學程式設計新手而言,培養撰寫文章的習慣(例如:建立自己的技術部落格)是很重要的環節,不但可以累計自己經歷也可以強化記憶並幫助到需要的人。若是需要完整語法介紹可以參考markdown.tw,當然,只要多加練習就可以慢慢掌握 Markdown 語法的訣竅,進而喜歡這種簡潔的書寫方式。
Markdown 是一種輕量級的標記語言,最初為 John Gruber 所設計。Markdown 特色在於允許人們「使用易讀易寫的純文字格式編寫文件,然後轉換成有效的 HTML 文件」。簡而言之,Markdown 就是一種簡潔易懂的語法,讓我們可以專注在內容上,不用花時間思考外觀樣式,在透過轉換變成可以呈現在網頁上的 HTML 語法。目前在許多知名技術/開發者論壇或是開發者工具(例如:Github)、技術部落格工具都有支援 Markdown 語法。
在開始學習 Markdown 之前我們先來認識一下 HTML,畢竟 Markdown 最終還是要轉換成 HTML 這個網頁上內容結構的標準語法。HTML 中文稱作超文本標記語言(英文全名為HyperText Markup Language,簡稱 HTML),是一種用於建立網頁的標準標記語言。
這樣講起來有點抽象,事實上我們每天在觀看瀏覽的網頁就是由一個個 HTML 所組成。所以我們可以透過瀏覽器的檢視原始碼功能去一窺目前網頁的 HTML 樣貌。
這邊我們使用 Google Chrome 瀏覽器當作範例,可以在畫面中點選右鍵 > 檢視原始碼(View Page Source):
就可以看到該網頁的 HTML 內容:
網頁來源:view-source:https://zh.wikipedia.org/zh-tw/HTML
由於這個網頁已經有點複雜,因為它已經包含了 CSS 外觀樣式語法和 JavaScript 互動邏輯程式的部分,對於初學者來說比較難一眼理解。所以我們用一下範例來介紹 HTML 最基礎的部分:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<h1>我是標題</h1>
<p>我是段落</p>
<a href="https://zh.wikipedia.org/zh-tw/Markdown">我是超連結</a>
<img src="https://upload.wikimedia.org/wikipedia/commons/thumb/8/84/HTML.svg/200px-HTML.svg.png" alt="">
</body>
</html>
若是使用瀏覽器打開這個 HTML 網頁會呈現:
HTML 標籤語法每個標籤皆有其意義且大部分成對出現,標籤元素內可以設定屬性值。網頁元素主要放置於 <body></body>
中,<head></head>
內主要放置 meta data 設定檔案和放置引入的外觀樣式檔案、程式邏輯等。元素內可以透過設定屬性值(attribute)來宣告元素功能,以下 href="https://zh.wikipedia.org/zh-tw/Markdown"
代表點擊該連結會到該 wikipedia 網址。
<!-- href 是屬性,決定連結點擊後目的地 -->
<a href="https://zh.wikipedia.org/zh-tw/Markdown">我是超連結</a>
<!-- src 是屬性,決定載入圖片位置-->
<img src="https://upload.wikimedia.org/wikipedia/commons/thumb/8/84/HTML.svg/200px-HTML.svg.png">
元素包裹內容在內,代表標題元素:
<h1>我是標題</h1>
一般 Markdwon 段落以空白行分隔。若是序列則內容需要內縮(一個 tab)。
是一级標題
=======
# 一級標題
## 二级標題
其 HTML 元素為:
<h1>是一级標題</h1>
<h1>一級標題</h1>
<h2>二级標題</h2>
效果如下:
_斜體_
**粗體**
`等寬字型Monospace`
其 HTML 元素為:
<em>斜體</em>
<strong>粗體</strong>
<code>等寬字型Monospace</code>
效果如下:
斜體
粗體
等寬字型Monospace
其 HTML 元素為:
<pre>
<code>
<span>print('hello world')</span>
</code>
</pre>
效果如下:
print('hello world code :)')
---
其 HTML 元素為:
<hr>
效果如下:
* 張三
* 李四
* 王二
其 HTML 元素為:
<ul>
<li>張三</li>
<li>李四</li>
<li>王二</li>
</ul>
效果如下:
1. 不論
2. 三七
3. 二十一
有序列表,其 HTML 元素為:
<ol>
<li>不論</li>
<li>三七</li>
<li>二十一</li>
</ol>
效果如下:
1. 不論
- 第一
- 第二
- 第三
2. 三七
1. 第一
2. 第二
3. 第三
3. 二十一
有序列表,其 HTML 元素為:
<ol>
<li>不論
<ul>
<li>第一</li>
<li>第二</li>
<li>第三</li>
</ul>
</li>
<li>三七
<ol>
<li>第一</li>
<li>第二</li>
<li>第三</li>
</ol>
</li>
<li>二十一</li>
</ol>
效果如下:
[連結文字](連結網址)
其 HTML 元素為:
<a href="https://upload.wikimedia.org/wikipedia/commons/thumb/8/84/HTML.svg/200px-HTML.svg.png">連結文字</a>
效果如下:
![文字屬性](Icon-pictures.png "文字標題")
其 HTML 元素為(少數沒有成對出現的元素標籤):
<img src="連結網址" alt="文字屬性" title="文字標題" />
效果如下:
> Markdown使用電郵用字元「>」來引用。
其 HTML 元素為:
<a href="連結網址">連結文字</a>
效果如下:
Markdown使用電郵用字元「>」來引用。
| Column 1 | Column 2 | Column 3 |
| -------- | -------- | -------- |
| Text | Text | Text |
其 HTML 元素為:
<table>
<thead>
<tr>
<th>Column 1</th>
<th>Column 2</th>
<th>Column 3</th>
</tr>
</thead>
<tbody>
<tr>
<td>Text</td>
<td>Text</td>
<td>Text</td>
</tr>
</tbody>
</table>
效果如下:
Column 1 | Column 2 | Column 3 |
---|---|---|
Text | Text | Text |
以上簡單介紹了:
以上介紹了 HTML 和 Markdown 基礎語法的教學,透過 Markdown 這一種簡潔易懂的語法,我們可以更專注在內容創作上。對於一個自學程式設計新手而言,培養撰寫文章的習慣(例如:建立自己的技術部落格)是很重要的環節,不但可以累計自己經歷也可以強化記憶並幫助到需要的人。若是需要完整語法介紹可以參考markdown.tw,當然,只要多加練習就可以慢慢掌握 Markdown 語法的訣竅,進而喜歡這種簡潔的書寫方式。
「軟體正在吃掉全世界。」(Software is eating the world.)
這是知名創投也是 Netscape 瀏覽器共同創辦人 Marc Andreessen 的名言。
隨著科技的快速發展,我們生活中已經離不開網路、手機等科技電子產品,而這些科技電子產品,背後往往有電腦軟體程式在運作(想想你每天使用的 Google、Facebook、LINE、Youtube 等應用程式)。也因為全世界的學校陸續開始將程式設計課程列入課綱之中,從一般白領上班族到有小孩的家長,不論是否是資訊相關科系畢業都開始學習程式語言和程式設計相關知識。深怕沒有擁有這項程式語言第二專長會被小孩所嫌棄或是錯過加薪升職的大好機會。
然而隨著網路、軟體技術的日新月異,初學者往往會迷失在豐富的學習資源和除錯 debug 的挫折當中,喪失了程式設計本身創作的樂趣。所以這邊我們要分享自學程式設計必備觀念和心態,希望讓所有有自學程式設計需求的朋友,不再徬徨、無助。
我們為什麼要學習程式設計?相信這是許多家長和初學者內心的疑問。
事實上,程式設計是一種介於藝術與科學的腦力創作運動。學習程式設計正確心態是透過學習程式設計理解電腦科學運作的原理和動手用科技技術解決生活上的問題。
在學習程式設計過程中可以培養創造能力
(對,你只要有一台電腦和網路就有機會創造出幾千幾萬人使用的軟體或網路服務),邏輯思考
、團隊合作
、自學能力
和解決問題的能力
。
撰寫程式可以讓你可以學習怎麼樣把一個複雜的問題切分成一個個小問題,在這個過程中不但可以訓練邏輯思考、解決問題的能力。隨著專案越來越大、技術越來越複雜,你可能會需要和其他專案成員合作去解決和學習你不懂的新技術,是一個很好培養自學能力和團隊合作能力的機會。當然在過程中可能會因為長期關注電腦螢幕而需要適時的休息和運動(但現代人即便不寫程式也是每天盯著螢幕了:P),這也是為什麼幼稚園和國中小的學童們會建議先從不插電學習程式設計
的教材和桌遊開始學習程式設計和電腦科學的邏輯觀念。
最好學習程式設計的動機是因為想解透過科技解決生活上的問題(例如:想要寫一個記帳 App 給家人使用所以開始學習 Mobile App 開發,你可能需要學習 Android Java/Kotlin 或 iOS Swift/Objective-C)或是結合你現有的領域和電腦科學的應用。
若是你是因為想要轉職成為工程師/程式設計師,這又是另外一個話題。若是這樣,你可以針對你想要學習的領域列出需要學習知識去一一攻克(直接上求職網站把心儀的工作要求做成一個 checklist 清單)。例如:我希望轉職 Web 前端工程師,我需要具備基本的 HTML/CSS 語法和 JavaScript 程式語言的基礎或是我想轉職資料科學家,我需要具備 Python 或是 R 語言的基礎和理解機器學習和深度學習演算法等。
當具備正確的學習程式設計心態後,以終為始
是學習程式設計最重要的一個環節,這是當你夜深人靜 debug 不出來時給自己最好的支持動力。事實上,程式語言只是一個創作的工具,你可以想像成設計師素描本和素描筆,雕刻大師的雕刻刀。幸運的是,程式設計只要一台電腦加上網路就可以開始。
若你是完全的初學者,我們會建議你從以下程式語言開始入手,再一步步針對你有興趣的領域繼續鑽研。
Scratch
若是你是國中小學的學員,你可以從 Scratch 開始。Scratch 是 MIT 麻省理工學院所開發的電腦程式平台,透過拖拉積木的方式可以讓使用者學習電腦程式的邏輯和概念,創造出多媒體或是遊戲應用,蠻適合低年齡層的學員使用。更重要的是 Scratch 本身是一個全世界的社群平台,你可以分享自己的作品也可以觀摩學習其他人的作品、認識新朋友,教學相長。
Python
若是成人或是想直接學習正式一點程式語言的學生,我們會推薦由 Python 入手。為什麼是 Python 呢?因為對於初學者來說 Python 是一個簡單易學但又功能強大的程式語言(Python 不僅可以編寫 Web 網站、桌面應用程式、開發遊戲更是機器學習/深度學習等資料科學應用的重要程式語言)。相較於其他 C/C++ 或是 Java 等程式語言,Python 相對而言較為簡潔且容易閱讀,此外不用經過編譯(compile)即可以執行程式也對於初學者較為友善。
JavaScript
Java 和 JavaScript(簡稱 JS)和名字雖然很像但是卻是兩個不同的程式語言(可以說是熱狗和狗的差別),發展方向和應用層面也有所不同。隨著網際網路和瀏覽器引擎和 Node.js 的發展 JavaScript 的影響力有增無減。不再局限於瀏覽器的從早期的跑龍套到現在的獨挑大樑,現在不管是 Web 前後端、行動應用程式、桌面應用程式,甚至是深度學習?等都可以使用 JavaScript 來開發。若是你想要開發有關 Web 相關的應用,更是必須學好 JavaScript,對於新手來說可以透過 Web 呈現和分享自己的作品是一個很有成就感的事情。但 JavaScript 技術變化很快,若是有有經驗的導師帶領可以少走許多冤枉路,且學習 JavaScript 通常需要搭配學習 HTML/CSS 語法。
Micro:bit
Micro Bit(也叫做 BBC Micro Bit)是由 BBC 所推出的具備藍牙、光感測器、溫度感測、加速儀等感測器的微電路版,適合對於嵌入式系統和物聯網、創客應用有興趣的讀者。可以使用 Python、JavaScript、積木式等程式語言自己動手製作機器人或是溫度監控器等有趣應用!
C 語言
C 語言一種通用且常見的程式語言,廣泛用於嵌入式系統軟體與應用程式的開發。由於 C 語言將很多底層的操作交給使用者來處理(像是 Python 或 Java 很多事情本身都幫你處理好),所以對於初學者來說會需要學習比較多相關背景知識和撰寫多一些程式碼,但也因此可以學習到更多有關電腦科學和電腦軟硬體底層相關的知識。
學習程式語言最好的方式就是買本你覺得合適入門書或是加入線上/線下課程後,開始動手做點東西。真正做出點什麼東西,去解決生活上的問題才是驗證你是否學會程式語言最重要的指標(就像是學英文一樣,你背誦了很多單字,但從沒開口說過或是無法和國際友人溝通,那即便是多益或是托福考的再高分那也不算是真正學會英文)。和幾個志同道合的朋友一起做專案、參與實習、接案或是參與開放原始碼專案(Open source project)都是一個很好的方式。
學寫程式就像是學習烏克麗麗或是吉他等才藝一樣需要動手練習才會學得好,總而言之就是:
動手做點東西
動手做點東西
動手做點東西
很重要所以講三遍!
一般在學習程式設計遇到困難時,最好的解法就是把錯誤訊息或是遇到的問題去 Google 搜尋一下,大部分情況下都可以在網路得到對應的解答。另外,Stack Overflow 程式設計問答網站和 Github 開源程式碼集散地 也是一個學習的好去處,沒事去逛逛,相信一定會有不少收穫。
一個人寫 code 很孤獨,一群人寫 code 很幸福。在學習寫程式的過程是一條孤獨且漫長的道路,即便是經驗老道的老手也需要和不同領域的人請教,更何況是剛入門的新手。選擇一個友善的自學程式社群加入,可以讓你在學習程式語言的過程中更加順遂,而加入 HappyCoder 自學程式設計學院 相信是一個很好的選擇。
當你卡關時你往往會希望尋求協助,但在尋求協助之前可以先自我評估所遇到的問題,可以讓你在問問題時可以更具體讓人明白也可以讓你在 Google 時可以找到合適關鍵字來搜尋(沒有人有義務一定要回答你的問題,幫助他人釐清問題是個好習慣)。
以上的問題最好回答可以具體一點。
例如說:
你想要做什麼?
我想在要 Windows 環境下安裝 Python 環境
你已經嘗試過什麼方法?
我已經在 Python 官方網站下載安裝完成
結果如何?
但我在 cmd 終端機指令中輸入 Python 指令時出現沒有這個指令的錯誤
又例如說:
你想要做什麼?
我想要在瀏覽器中跳出 comfirm 確認的提示框
你已經嘗試過什麼方法?
我打好了 JavaScript 程式碼,也儲存了
結果如何?
沒看到在瀏覽器成功執行,但在瀏覽器的開發者工具 console 顯示 Uncaught SyntaxError: Invalid or unexpected token 錯誤訊息
有些時候透過回答這三個問題,問題就自己迎刃而解了。
有些時候撰寫程式一段時間後腦袋會變鈍或是肩膀頸部緊繃。適當時候休息一下,起身運動或是喝口水和人交談一下,或許回頭再試試就會有靈感也說不一定。
另外,當你完成一個程式專案或是解掉某個 bug 時,記得可以撰寫成技術文章(若是有心要轉職程式設計領域的同學,經營自己的 Github 和部落格真的很重要),不但可以豐富自己的專業履歷也可以強化自己的記憶方便未來查找外,更重要的是也可以幫助到下一個跟你遇到同樣問題的人喔!
不管是在職場工作或是學習程式設計,有好的導師或是 role model 引導確實可以讓自己少走許多冤枉路和減少時間金錢的浪費。但一開始盡量不要找已經工作十年以上的工程師或是程式設計師(等到你要往架構師或是技術管理者邁進時再去找他們),對於新手來說,兩三年或三五年工作經驗的工程師和程式設計師剛好是個不會太有距離感,導師又能體會新手剛入門會遇到的挫折和煩惱,帶著誠懇和禮貌去尋找你身邊或是社群中願意帶你的導師。不過記得當你離開新手村後,若有機會也可以成為其他人的導師,取之於社群回饋於社群。
俗話說:師父領進門,修行在個人。若你有志於程式設計領域繼續鑽研,那就必須認知到 IT 行業是一個需要持續精進自我的領域。不管是技術還有如何設計產品、溝通協調、管理專案、撰寫簡潔漂亮的程式碼、設計架構等都需要持續地進修學習,唯有持續保持積極的學習態度和能力才是在這個領域持續保有競爭力的最佳保證。
以上我們整理了多年來自學程式設計的經驗,我們也曾花過許多冤枉錢和時間。在這邊分享自學程式設計必備觀念和心態,希望讓所有有自學程式設計需求的朋友,不再徬徨、無助。
最後複習一下自學程式設計必備觀念和心態:
Happy Coding :)
投資自己就是最好的投資,報名連結
💪根據學員回饋持續更新升級課程內容和優化課程平台系統
投資理財算股靠自己✌ 報名連結
💪根據學員回饋持續更新升級課程內容和優化課程平台系統
打好電腦科學和程式設計基礎,建立運算思維和解決問題的能力✌ 報名連結
💪根據學員回饋持續更新升級課程內容和優化課程平台系統
學習 Python SQL 資料分析與網路爬蟲,打好商業資料分析工作力✌ 報名連結
(image via negativespace.co、yoda)
]]>「軟體正在吃掉全世界。」(Software is eating the world.)
這是知名創投也是 Netscape 瀏覽器共同創辦人 Marc Andreessen 的名言。
隨著科技的快速發展,我們生活中已經離不開網路、手機等科技電子產品,而這些科技電子產品,背後往往有電腦軟體程式在運作(想想你每天使用的 Google、Facebook、LINE、Youtube 等應用程式)。也因為全世界的學校陸續開始將程式設計課程列入課綱之中,從一般白領上班族到有小孩的家長,不論是否是資訊相關科系畢業都開始學習程式語言和程式設計相關知識。深怕沒有擁有這項程式語言第二專長會被小孩所嫌棄或是錯過加薪升職的大好機會。
然而隨著網路、軟體技術的日新月異,初學者往往會迷失在豐富的學習資源和除錯 debug 的挫折當中,喪失了程式設計本身創作的樂趣。所以這邊我們要分享自學程式設計必備觀念和心態,希望讓所有有自學程式設計需求的朋友,不再徬徨、無助。
我們為什麼要學習程式設計?相信這是許多家長和初學者內心的疑問。
事實上,程式設計是一種介於藝術與科學的腦力創作運動。學習程式設計正確心態是透過學習程式設計理解電腦科學運作的原理和動手用科技技術解決生活上的問題。
在學習程式設計過程中可以培養創造能力
(對,你只要有一台電腦和網路就有機會創造出幾千幾萬人使用的軟體或網路服務),邏輯思考
、團隊合作
、自學能力
和解決問題的能力
。
撰寫程式可以讓你可以學習怎麼樣把一個複雜的問題切分成一個個小問題,在這個過程中不但可以訓練邏輯思考、解決問題的能力。隨著專案越來越大、技術越來越複雜,你可能會需要和其他專案成員合作去解決和學習你不懂的新技術,是一個很好培養自學能力和團隊合作能力的機會。當然在過程中可能會因為長期關注電腦螢幕而需要適時的休息和運動(但現代人即便不寫程式也是每天盯著螢幕了:P),這也是為什麼幼稚園和國中小的學童們會建議先從不插電學習程式設計
的教材和桌遊開始學習程式設計和電腦科學的邏輯觀念。
最好學習程式設計的動機是因為想解透過科技解決生活上的問題(例如:想要寫一個記帳 App 給家人使用所以開始學習 Mobile App 開發,你可能需要學習 Android Java/Kotlin 或 iOS Swift/Objective-C)或是結合你現有的領域和電腦科學的應用。
若是你是因為想要轉職成為工程師/程式設計師,這又是另外一個話題。若是這樣,你可以針對你想要學習的領域列出需要學習知識去一一攻克(直接上求職網站把心儀的工作要求做成一個 checklist 清單)。例如:我希望轉職 Web 前端工程師,我需要具備基本的 HTML/CSS 語法和 JavaScript 程式語言的基礎或是我想轉職資料科學家,我需要具備 Python 或是 R 語言的基礎和理解機器學習和深度學習演算法等。
當具備正確的學習程式設計心態後,以終為始
是學習程式設計最重要的一個環節,這是當你夜深人靜 debug 不出來時給自己最好的支持動力。事實上,程式語言只是一個創作的工具,你可以想像成設計師素描本和素描筆,雕刻大師的雕刻刀。幸運的是,程式設計只要一台電腦加上網路就可以開始。
若你是完全的初學者,我們會建議你從以下程式語言開始入手,再一步步針對你有興趣的領域繼續鑽研。
Scratch
若是你是國中小學的學員,你可以從 Scratch 開始。Scratch 是 MIT 麻省理工學院所開發的電腦程式平台,透過拖拉積木的方式可以讓使用者學習電腦程式的邏輯和概念,創造出多媒體或是遊戲應用,蠻適合低年齡層的學員使用。更重要的是 Scratch 本身是一個全世界的社群平台,你可以分享自己的作品也可以觀摩學習其他人的作品、認識新朋友,教學相長。
Python
若是成人或是想直接學習正式一點程式語言的學生,我們會推薦由 Python 入手。為什麼是 Python 呢?因為對於初學者來說 Python 是一個簡單易學但又功能強大的程式語言(Python 不僅可以編寫 Web 網站、桌面應用程式、開發遊戲更是機器學習/深度學習等資料科學應用的重要程式語言)。相較於其他 C/C++ 或是 Java 等程式語言,Python 相對而言較為簡潔且容易閱讀,此外不用經過編譯(compile)即可以執行程式也對於初學者較為友善。
JavaScript
Java 和 JavaScript(簡稱 JS)和名字雖然很像但是卻是兩個不同的程式語言(可以說是熱狗和狗的差別),發展方向和應用層面也有所不同。隨著網際網路和瀏覽器引擎和 Node.js 的發展 JavaScript 的影響力有增無減。不再局限於瀏覽器的從早期的跑龍套到現在的獨挑大樑,現在不管是 Web 前後端、行動應用程式、桌面應用程式,甚至是深度學習?等都可以使用 JavaScript 來開發。若是你想要開發有關 Web 相關的應用,更是必須學好 JavaScript,對於新手來說可以透過 Web 呈現和分享自己的作品是一個很有成就感的事情。但 JavaScript 技術變化很快,若是有有經驗的導師帶領可以少走許多冤枉路,且學習 JavaScript 通常需要搭配學習 HTML/CSS 語法。
Micro:bit
Micro Bit(也叫做 BBC Micro Bit)是由 BBC 所推出的具備藍牙、光感測器、溫度感測、加速儀等感測器的微電路版,適合對於嵌入式系統和物聯網、創客應用有興趣的讀者。可以使用 Python、JavaScript、積木式等程式語言自己動手製作機器人或是溫度監控器等有趣應用!
C 語言
C 語言一種通用且常見的程式語言,廣泛用於嵌入式系統軟體與應用程式的開發。由於 C 語言將很多底層的操作交給使用者來處理(像是 Python 或 Java 很多事情本身都幫你處理好),所以對於初學者來說會需要學習比較多相關背景知識和撰寫多一些程式碼,但也因此可以學習到更多有關電腦科學和電腦軟硬體底層相關的知識。
學習程式語言最好的方式就是買本你覺得合適入門書或是加入線上/線下課程後,開始動手做點東西。真正做出點什麼東西,去解決生活上的問題才是驗證你是否學會程式語言最重要的指標(就像是學英文一樣,你背誦了很多單字,但從沒開口說過或是無法和國際友人溝通,那即便是多益或是托福考的再高分那也不算是真正學會英文)。和幾個志同道合的朋友一起做專案、參與實習、接案或是參與開放原始碼專案(Open source project)都是一個很好的方式。
學寫程式就像是學習烏克麗麗或是吉他等才藝一樣需要動手練習才會學得好,總而言之就是:
動手做點東西
動手做點東西
動手做點東西
很重要所以講三遍!
一般在學習程式設計遇到困難時,最好的解法就是把錯誤訊息或是遇到的問題去 Google 搜尋一下,大部分情況下都可以在網路得到對應的解答。另外,Stack Overflow 程式設計問答網站和 Github 開源程式碼集散地 也是一個學習的好去處,沒事去逛逛,相信一定會有不少收穫。
一個人寫 code 很孤獨,一群人寫 code 很幸福。在學習寫程式的過程是一條孤獨且漫長的道路,即便是經驗老道的老手也需要和不同領域的人請教,更何況是剛入門的新手。選擇一個友善的自學程式社群加入,可以讓你在學習程式語言的過程中更加順遂,而加入 HappyCoder 自學程式設計學院 相信是一個很好的選擇。
當你卡關時你往往會希望尋求協助,但在尋求協助之前可以先自我評估所遇到的問題,可以讓你在問問題時可以更具體讓人明白也可以讓你在 Google 時可以找到合適關鍵字來搜尋(沒有人有義務一定要回答你的問題,幫助他人釐清問題是個好習慣)。
以上的問題最好回答可以具體一點。
例如說:
你想要做什麼?
我想在要 Windows 環境下安裝 Python 環境
你已經嘗試過什麼方法?
我已經在 Python 官方網站下載安裝完成
結果如何?
但我在 cmd 終端機指令中輸入 Python 指令時出現沒有這個指令的錯誤
又例如說:
你想要做什麼?
我想要在瀏覽器中跳出 comfirm 確認的提示框
你已經嘗試過什麼方法?
我打好了 JavaScript 程式碼,也儲存了
結果如何?
沒看到在瀏覽器成功執行,但在瀏覽器的開發者工具 console 顯示 Uncaught SyntaxError: Invalid or unexpected token 錯誤訊息
有些時候透過回答這三個問題,問題就自己迎刃而解了。
有些時候撰寫程式一段時間後腦袋會變鈍或是肩膀頸部緊繃。適當時候休息一下,起身運動或是喝口水和人交談一下,或許回頭再試試就會有靈感也說不一定。
另外,當你完成一個程式專案或是解掉某個 bug 時,記得可以撰寫成技術文章(若是有心要轉職程式設計領域的同學,經營自己的 Github 和部落格真的很重要),不但可以豐富自己的專業履歷也可以強化自己的記憶方便未來查找外,更重要的是也可以幫助到下一個跟你遇到同樣問題的人喔!
不管是在職場工作或是學習程式設計,有好的導師或是 role model 引導確實可以讓自己少走許多冤枉路和減少時間金錢的浪費。但一開始盡量不要找已經工作十年以上的工程師或是程式設計師(等到你要往架構師或是技術管理者邁進時再去找他們),對於新手來說,兩三年或三五年工作經驗的工程師和程式設計師剛好是個不會太有距離感,導師又能體會新手剛入門會遇到的挫折和煩惱,帶著誠懇和禮貌去尋找你身邊或是社群中願意帶你的導師。不過記得當你離開新手村後,若有機會也可以成為其他人的導師,取之於社群回饋於社群。
俗話說:師父領進門,修行在個人。若你有志於程式設計領域繼續鑽研,那就必須認知到 IT 行業是一個需要持續精進自我的領域。不管是技術還有如何設計產品、溝通協調、管理專案、撰寫簡潔漂亮的程式碼、設計架構等都需要持續地進修學習,唯有持續保持積極的學習態度和能力才是在這個領域持續保有競爭力的最佳保證。
以上我們整理了多年來自學程式設計的經驗,我們也曾花過許多冤枉錢和時間。在這邊分享自學程式設計必備觀念和心態,希望讓所有有自學程式設計需求的朋友,不再徬徨、無助。
最後複習一下自學程式設計必備觀念和心態:
Happy Coding :)
投資自己就是最好的投資,報名連結
💪根據學員回饋持續更新升級課程內容和優化課程平台系統
投資理財算股靠自己✌ 報名連結
💪根據學員回饋持續更新升級課程內容和優化課程平台系統
打好電腦科學和程式設計基礎,建立運算思維和解決問題的能力✌ 報名連結
💪根據學員回饋持續更新升級課程內容和優化課程平台系統
學習 Python SQL 資料分析與網路爬蟲,打好商業資料分析工作力✌ 報名連結
(image via negativespace.co、yoda)
]]>要成為一個真正的軟體工程師(Software Engineer)除了掌握基礎開發能力外,更重要的是和其他工程師和開發者團隊合作和溝通的能力,所以若你能培養出掌握 Git 等版本控制操作和 Git server 架設的能力,你會更容易參與開放原始碼(open source)的社群和提昇自己在職場上的價值。關於相關環境工具若你還沒準備好,可以參考 如何在 Windows 打造 Python 開發環境設定基礎入門教學 這篇教學文章。好,那我們就準備開始吧!
版本控制系統是一種軟體工程的開發技巧,可以透過這個系統讓每位成員的軟體版本可以方便同步和維護管理(不然要用 email 或是其他工具傳送和管理十分麻煩,尤其程式又常常會有不同版本修改的問題!)。在沒有版本控制系統時,我們常會在編輯檔案前複製一個備份,或是在更新檔案後產生許多重複檔案,非常不便且難以維護。因此,使用版本控制系統的需求就應運而生啦!
一般在軟體開發中又分為中央式系統(例如:Subversion、CVS 等)與分散式系統(例如:Git、BitKeeper、mercurial 等),中央式版本控制系統的工作主要在一個伺服器進行,由中央管理存取權限「鎖上」檔案庫中的檔案,一次只能讓一個開發者進行工作。而分散式系統讓不同開發者直接在各自的本地檔案庫工作,並容許多個開發者同時更動同一個檔案,而每個檔案庫有另外一個合併各個改變的功能。分散式系統讓開發者能在沒有網路的情況下也能繼續工作,也讓開發者有充分的版本控制能力,而不需經中央管理者的許可,但分散式系統仍然可以有檔案上鎖功能。
Git 是一個分散式版本控制軟體,最初由 Linus Torvalds 創作(也是作業系統 Linux 系統的開發者),其最初目的是為更好地管理 Linux kernel 開發而設計,其具備優秀的 merge tracing 合併程式碼的能力(使用程式碼 snapshot 來比較歷史版本差異)。
Github 則是一個支援 git 程式碼存取和遠端托管的平台服務,有許多的開放原始碼的專案都是使用 Github 進行程式碼的管理。若是讀者未來有志於從事程式設計相關工作的話,建議可以熟悉掌握 Git 和 Github 的使用,並建立自己的 Github profile 作品集。
Git 可以分為 Local(本地)和 Remote(遠端)兩個環境,由於 Git 屬於分散式的版本控制系統,所以開發者可以在離線 local 環境下開發,等到有網路時再將自己的程式推到 Remote 環境或 pull 下其他開發者程式碼進行整合。在 Local 中我們又分為 working directory(工作資料夾)、staging area(暫存區)和 repositories(檔案庫)。
當自己開發時會在工作資料夾工作,當要進入檔案庫之前會先將檔案加入暫存區,確認沒問題則 commit 到檔案庫中,最後 push 上去 remote 環境。在 Git 中若是有和其他開發者一起合作,則會需要處理不同 branch 之間 conflict 和 merge 的問題。
接下來我們用一個實際的實戰範例讓讀者可以快速的掌握那些基礎必知必會的 Git/Github 操作技能:
安裝並且設定 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)。
若是安裝完成,打開終端機(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>"
建立一個本機的 repository
任務二:在自己的電腦上建立一個新的 local repositories(本地檔案庫)
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 專案資料夾改造計畫!
檢視狀態、新增或修改 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"
註冊 GitHub 帳號
任務四:建立一個 GitHub 帳號,並在 Git 設定中加入使用者帳號
到目前為主我們程式主要是在我們 local 工作環境中操作,但還記得我們在 Git 基本觀念中有提到,git 分為 local 和 remote,若是我們想要和全世界其他開發者合作或是貢獻開放原始碼的話,我們可以透過 github 來當作我們 remote 工作環境,去管理我們程式碼,同樣的也可以透過 github 平台和其他開發者一起合作,參與開放原始碼的開發。github 若是公開的 repo 是無限制數量免費的,但是若是想使用 private repo 可以參考付費方案。
// 注意大小寫要一致
$ git config --global user.username <你的 github 使用者名稱>
先到 github.com 註冊帳號:
註冊成功後登入,可以點選右上顯圖下拉式選單進到個人頁面(profile),觀看個人頁面:
點選右上角 +
來新增 new repository(檔案庫):
輸入 repository name(你要取的專案名稱),最好跟電腦 local 專案一致,我們這邊輸入 git-example
。然後輸入簡短專案描述並先不勾選初始化 README 和,也先不要選擇 .gitignore 和 License 授權(不然會造成本地端和遠端不一致會需要額外一些處理):
.gitignore
:要忽略的檔案清單,這是用來告訴 Git,當在做版本控制記錄的時候,忽略這些檔案。通常一些機密資料,如資料庫帳號密碼或是 server IP 位置等,記得要加入。也可以參考 github 上面的一些範本 在新增 repository 時選取對應的程式語言
README.md
:repository 介紹和使用方式說明(例如:使用方法、參與專案方式等),使用 markdown
語法撰寫。另外通常有 CONTRIBUTING.md 額外說明如何參與貢獻。
LICENSE
:專案使用何種授權方式,例如:MIT、BSD 等
接著按 create 按鈕!恭喜你新增成功,創建了自己第一個 github repository(遠端檔案庫)!
將 repository 做本機和遠端的連結
任務五:把電腦裡 Local(本地端)的 repository(檔案庫)和 remote(遠端)的 repository(檔案庫)連結起來,並 push 電腦上的修改
因我們已經在專案有把 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 啦!
Fork 和 clone 一個 open source(開源)的計畫
任務六:從 GitHub.com 建立專案,複本 fork,並下載 clone 到電腦上
點選左上角 github icon 回到首頁,我們從上面搜尋欄搜尋 react:
點選右上角 fork 按鈕,複製一份專案到我們這:
等待 fork 中:
點選右邊綠色按鈕 clone download 複製 HTTP 網址:
// 複製到本地端
$ 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 貢獻說明!
你可以透過將自己的修改 commit 到自己 fork 過來的專案,然後到原始專案頁面點選 new pull request 按鈕發 pull request(會比對程式碼的差異)。若對方 review 完後接受就可以將自己的程式碼合併到原始專案中,為開放原始碼做出第一步貢獻!
// 若完成 pull request 記得讓 master(或是合併進去的 branch)保持同步
$ git pull upstream master
練習建立一個 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
邀請別人和你合作
任務八:在專案新增夥伴 collaborator
在右上角進入 setting 可以選擇到 collaborator 新增合作者:
利用 push 和 pull 來和 GitHub.com 同步
任務九:用 pull 來和其他 collaborators(合作者)同步更新,確保程式是最新的版本
請其他開發者 git colone 下來你的 git-example 專案並 checkout 到 dev
branch,並完成新增一個 README.md
檔案後發 pull request 過來,若沒問題就按同意並合併。我們則透過 git pull 來保持本地端和遠端程式碼同步:
$ git pull origin dev
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)邁進!
(image via git-scm、qbox、quoracdn、ytimg、linux、imgur、martinfitzpatrick)
]]>要成為一個真正的軟體工程師(Software Engineer)除了掌握基礎開發能力外,更重要的是和其他工程師和開發者團隊合作和溝通的能力,所以若你能培養出掌握 Git 等版本控制操作和 Git server 架設的能力,你會更容易參與開放原始碼(open source)的社群和提昇自己在職場上的價值。關於相關環境工具若你還沒準備好,可以參考 如何在 Windows 打造 Python 開發環境設定基礎入門教學 這篇教學文章。好,那我們就準備開始吧!
版本控制系統是一種軟體工程的開發技巧,可以透過這個系統讓每位成員的軟體版本可以方便同步和維護管理(不然要用 email 或是其他工具傳送和管理十分麻煩,尤其程式又常常會有不同版本修改的問題!)。在沒有版本控制系統時,我們常會在編輯檔案前複製一個備份,或是在更新檔案後產生許多重複檔案,非常不便且難以維護。因此,使用版本控制系統的需求就應運而生啦!
一般在軟體開發中又分為中央式系統(例如:Subversion、CVS 等)與分散式系統(例如:Git、BitKeeper、mercurial 等),中央式版本控制系統的工作主要在一個伺服器進行,由中央管理存取權限「鎖上」檔案庫中的檔案,一次只能讓一個開發者進行工作。而分散式系統讓不同開發者直接在各自的本地檔案庫工作,並容許多個開發者同時更動同一個檔案,而每個檔案庫有另外一個合併各個改變的功能。分散式系統讓開發者能在沒有網路的情況下也能繼續工作,也讓開發者有充分的版本控制能力,而不需經中央管理者的許可,但分散式系統仍然可以有檔案上鎖功能。
Git 是一個分散式版本控制軟體,最初由 Linus Torvalds 創作(也是作業系統 Linux 系統的開發者),其最初目的是為更好地管理 Linux kernel 開發而設計,其具備優秀的 merge tracing 合併程式碼的能力(使用程式碼 snapshot 來比較歷史版本差異)。
Github 則是一個支援 git 程式碼存取和遠端托管的平台服務,有許多的開放原始碼的專案都是使用 Github 進行程式碼的管理。若是讀者未來有志於從事程式設計相關工作的話,建議可以熟悉掌握 Git 和 Github 的使用,並建立自己的 Github profile 作品集。
Git 可以分為 Local(本地)和 Remote(遠端)兩個環境,由於 Git 屬於分散式的版本控制系統,所以開發者可以在離線 local 環境下開發,等到有網路時再將自己的程式推到 Remote 環境或 pull 下其他開發者程式碼進行整合。在 Local 中我們又分為 working directory(工作資料夾)、staging area(暫存區)和 repositories(檔案庫)。
當自己開發時會在工作資料夾工作,當要進入檔案庫之前會先將檔案加入暫存區,確認沒問題則 commit 到檔案庫中,最後 push 上去 remote 環境。在 Git 中若是有和其他開發者一起合作,則會需要處理不同 branch 之間 conflict 和 merge 的問題。
接下來我們用一個實際的實戰範例讓讀者可以快速的掌握那些基礎必知必會的 Git/Github 操作技能:
安裝並且設定 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)。
若是安裝完成,打開終端機(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>"
建立一個本機的 repository
任務二:在自己的電腦上建立一個新的 local repositories(本地檔案庫)
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 專案資料夾改造計畫!
檢視狀態、新增或修改 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"
註冊 GitHub 帳號
任務四:建立一個 GitHub 帳號,並在 Git 設定中加入使用者帳號
到目前為主我們程式主要是在我們 local 工作環境中操作,但還記得我們在 Git 基本觀念中有提到,git 分為 local 和 remote,若是我們想要和全世界其他開發者合作或是貢獻開放原始碼的話,我們可以透過 github 來當作我們 remote 工作環境,去管理我們程式碼,同樣的也可以透過 github 平台和其他開發者一起合作,參與開放原始碼的開發。github 若是公開的 repo 是無限制數量免費的,但是若是想使用 private repo 可以參考付費方案。
// 注意大小寫要一致
$ git config --global user.username <你的 github 使用者名稱>
先到 github.com 註冊帳號:
註冊成功後登入,可以點選右上顯圖下拉式選單進到個人頁面(profile),觀看個人頁面:
點選右上角 +
來新增 new repository(檔案庫):
輸入 repository name(你要取的專案名稱),最好跟電腦 local 專案一致,我們這邊輸入 git-example
。然後輸入簡短專案描述並先不勾選初始化 README 和,也先不要選擇 .gitignore 和 License 授權(不然會造成本地端和遠端不一致會需要額外一些處理):
.gitignore
:要忽略的檔案清單,這是用來告訴 Git,當在做版本控制記錄的時候,忽略這些檔案。通常一些機密資料,如資料庫帳號密碼或是 server IP 位置等,記得要加入。也可以參考 github 上面的一些範本 在新增 repository 時選取對應的程式語言
README.md
:repository 介紹和使用方式說明(例如:使用方法、參與專案方式等),使用 markdown
語法撰寫。另外通常有 CONTRIBUTING.md 額外說明如何參與貢獻。
LICENSE
:專案使用何種授權方式,例如:MIT、BSD 等
接著按 create 按鈕!恭喜你新增成功,創建了自己第一個 github repository(遠端檔案庫)!
將 repository 做本機和遠端的連結
任務五:把電腦裡 Local(本地端)的 repository(檔案庫)和 remote(遠端)的 repository(檔案庫)連結起來,並 push 電腦上的修改
因我們已經在專案有把 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 啦!
Fork 和 clone 一個 open source(開源)的計畫
任務六:從 GitHub.com 建立專案,複本 fork,並下載 clone 到電腦上
點選左上角 github icon 回到首頁,我們從上面搜尋欄搜尋 react:
點選右上角 fork 按鈕,複製一份專案到我們這:
等待 fork 中:
點選右邊綠色按鈕 clone download 複製 HTTP 網址:
// 複製到本地端
$ 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 貢獻說明!
你可以透過將自己的修改 commit 到自己 fork 過來的專案,然後到原始專案頁面點選 new pull request 按鈕發 pull request(會比對程式碼的差異)。若對方 review 完後接受就可以將自己的程式碼合併到原始專案中,為開放原始碼做出第一步貢獻!
// 若完成 pull request 記得讓 master(或是合併進去的 branch)保持同步
$ git pull upstream master
練習建立一個 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
邀請別人和你合作
任務八:在專案新增夥伴 collaborator
在右上角進入 setting 可以選擇到 collaborator 新增合作者:
利用 push 和 pull 來和 GitHub.com 同步
任務九:用 pull 來和其他 collaborators(合作者)同步更新,確保程式是最新的版本
請其他開發者 git colone 下來你的 git-example 專案並 checkout 到 dev
branch,並完成新增一個 README.md
檔案後發 pull request 過來,若沒問題就按同意並合併。我們則透過 git pull 來保持本地端和遠端程式碼同步:
$ git pull origin dev
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)邁進!
(image via git-scm、qbox、quoracdn、ytimg、linux、imgur、martinfitzpatrick)
]]>本系列文章將透過系統介紹資料科學(Data Science)相關的知識,透過 Python 帶領讀者從零開始進入資料科學的世界。這邊我們將介紹 Numpy 這個強大的 Python 函式庫。
Numpy 是 Python 的一個重要模組(Python 是一個高階語言也是一種膠水語言,可以透過整合其他低階語言同時擁有效能和高效率的開發),主要用於資料處理上。Numpy 底層以 C 和 Fortran 語言實作,所以能快速操作多重維度的陣列。當 Python 處理龐大資料時,其原生 list 效能表現並不理想(但可以動態存異質資料),而 Numpy 具備平行處理的能力,可以將操作動作一次套用在大型陣列上。此外 Python 其餘重量級的資料科學相關套件(例如:Pandas、SciPy、Scikit-learn 等)都幾乎是奠基在 Numpy 的基礎上。因此學會 Numpy 對於往後學習其他資料科學相關套件打好堅實的基礎。
Numpy 陣列
Numpy 的重點在於陣列的操作,其所有功能特色都建築在同質且多重維度的 ndarray
(N-dimensional array)上。ndarray
的關鍵屬性是維度(ndim)、形狀(shape)和數值類型(dtype)。 一般我們稱一維陣列為 vector
而二維陣列為 matrix
。一開始我們會引入 numpy
模組,透過傳入 list
到 numpy.array()
創建陣列。
# 引入 numpy 模組
import numpy as np
np1 = np.array([1, 2, 3])
np2 = np.array([3, 4, 5])
# 陣列相加
print(np1 + np2) # [4 6 8]
# 顯示相關資訊
print(np1.ndim, np1.shape, np1.dtype) # 1 (3,) int64 => 一維陣列, 三個元素, 資料型別
np3 = np.array([1, 2, 3, 4, 5, 6])
從檔案取資料:
npd = np.genfromtxt('data.csv', delimiter=',')
改變陣列維度:
np3 = np3.reshape([2, 3])
print(np3.ndim, np3.shape, np3.dtype) # 2 (2, 3) int64
改變陣列型別(bool、int、float、string):
bool
可以包含 True、False,int
可以包含 int16、int32、int64。其中數字是指 bits
。float
可以包含 16、32、64 表示小數點後幾位。string
可以是 string、unicode。nan
則表示遺失值。
np3 = np3.astype('int64')
np3.dtype
# dtype('int64')
建立陣列
建立填滿 0 或 1 的陣列:
np1 = np.zeros([2, 3]) # array([[ 0., 0., 0.], [ 0., 0., 0.]])
np2 = np.ones([2, 3]) # array([[ 1., 1., 1.], [ 1., 1., 1.]])
陣列索引與切片
一維陣列操作和 Python 原生 list 類似:
np3 = np.array([1, 2, 3, 4, 5, 6])
print(np3[2]) # 3
二維陣列:
np3 = np3.reshape([2, 3])
print(np3[1, 0]) # 4
基本操作
使用布林遮罩來取值:
np3 = np.array([1, 2, 3, 4, 5, 6])
print(np3 > 3) # [False False False True True True]
print(np3[np3 > 3]) # [4 5 6]
加總:
np3 = np3.reshape([2, 3])
print(np3.sum(axis=1)) # 將 axis=1 橫向加總 [6 15]
以上介紹了 Numpy 的基礎知識,建立了基本的 array 和 ndarray 的觀念。相信在熟悉 Numpy 之後 Pandas 的學習將會比較容易 (Pandas 的資料容器 DataFrame、Series 事實上是奠基在 Numpy 的陣列上)
(image via berkeley、codingeek、cornell、scipy-lectures)
]]>本系列文章將透過系統介紹資料科學(Data Science)相關的知識,透過 Python 帶領讀者從零開始進入資料科學的世界。這邊我們將介紹 Numpy 這個強大的 Python 函式庫。
Numpy 是 Python 的一個重要模組(Python 是一個高階語言也是一種膠水語言,可以透過整合其他低階語言同時擁有效能和高效率的開發),主要用於資料處理上。Numpy 底層以 C 和 Fortran 語言實作,所以能快速操作多重維度的陣列。當 Python 處理龐大資料時,其原生 list 效能表現並不理想(但可以動態存異質資料),而 Numpy 具備平行處理的能力,可以將操作動作一次套用在大型陣列上。此外 Python 其餘重量級的資料科學相關套件(例如:Pandas、SciPy、Scikit-learn 等)都幾乎是奠基在 Numpy 的基礎上。因此學會 Numpy 對於往後學習其他資料科學相關套件打好堅實的基礎。
Numpy 陣列
Numpy 的重點在於陣列的操作,其所有功能特色都建築在同質且多重維度的 ndarray
(N-dimensional array)上。ndarray
的關鍵屬性是維度(ndim)、形狀(shape)和數值類型(dtype)。 一般我們稱一維陣列為 vector
而二維陣列為 matrix
。一開始我們會引入 numpy
模組,透過傳入 list
到 numpy.array()
創建陣列。
# 引入 numpy 模組
import numpy as np
np1 = np.array([1, 2, 3])
np2 = np.array([3, 4, 5])
# 陣列相加
print(np1 + np2) # [4 6 8]
# 顯示相關資訊
print(np1.ndim, np1.shape, np1.dtype) # 1 (3,) int64 => 一維陣列, 三個元素, 資料型別
np3 = np.array([1, 2, 3, 4, 5, 6])
從檔案取資料:
npd = np.genfromtxt('data.csv', delimiter=',')
改變陣列維度:
np3 = np3.reshape([2, 3])
print(np3.ndim, np3.shape, np3.dtype) # 2 (2, 3) int64
改變陣列型別(bool、int、float、string):
bool
可以包含 True、False,int
可以包含 int16、int32、int64。其中數字是指 bits
。float
可以包含 16、32、64 表示小數點後幾位。string
可以是 string、unicode。nan
則表示遺失值。
np3 = np3.astype('int64')
np3.dtype
# dtype('int64')
建立陣列
建立填滿 0 或 1 的陣列:
np1 = np.zeros([2, 3]) # array([[ 0., 0., 0.], [ 0., 0., 0.]])
np2 = np.ones([2, 3]) # array([[ 1., 1., 1.], [ 1., 1., 1.]])
陣列索引與切片
一維陣列操作和 Python 原生 list 類似:
np3 = np.array([1, 2, 3, 4, 5, 6])
print(np3[2]) # 3
二維陣列:
np3 = np3.reshape([2, 3])
print(np3[1, 0]) # 4
基本操作
使用布林遮罩來取值:
np3 = np.array([1, 2, 3, 4, 5, 6])
print(np3 > 3) # [False False False True True True]
print(np3[np3 > 3]) # [4 5 6]
加總:
np3 = np3.reshape([2, 3])
print(np3.sum(axis=1)) # 將 axis=1 橫向加總 [6 15]
以上介紹了 Numpy 的基礎知識,建立了基本的 array 和 ndarray 的觀念。相信在熟悉 Numpy 之後 Pandas 的學習將會比較容易 (Pandas 的資料容器 DataFrame、Series 事實上是奠基在 Numpy 的陣列上)
(image via berkeley、codingeek、cornell、scipy-lectures)
]]>