用老師 / 學生身份免費使用 GitHub Copilot
最近學生跟彼得潘說他可以免費使用 GitHub Copilot,因為他有學生身份。因此彼得潘也查了一下,發現老師也有這樣的福利耶。
以下為彼得潘一步步驗證老師身份,然後在 VS Code 免費使用 Copilot 的過程,有興趣以老師 / 學生身份免費使用 Copilot 的朋友也可以參考看看。
- 註冊 GitHub 帳號,設定 Profile。
- 驗證老師 / 學生身份。
- 取得免費使用 GitHub Copilot 的權限。
- 在 VS Code 安裝 GitHub Copilot extension。
- 使用 GitHub Copilot 寫程式。
註冊 GitHub 帳號,設定 Profile
註冊 GitHub 帳號,然後設定 GitHub 的 Profile,填寫個人名字並在 Bio 做簡單的介紹,之後 GitHub 在驗證身份時會比對 Profile 的名字跟證明文件的名字是否一致。
驗證老師 / 學生身份
連到以下連結,選擇 Teacher 或 Student。
網站自動從 GitHub 帳號 apppeterpan@email.ntou.edu.tw 辨識出彼得潘是海洋大學的老師。如果 GitHub 帳號不是 edu 結尾的學校信箱,可點選 Add an email address 新增學校信箱,學校的 email 可加速審核的速度。
點選 Continue 後,進入身份證明的頁面,可選擇上傳教師 / 學生證或其它證明身份的文件。
彼得潘上傳海洋大學的聘書,然後點選 Process my application。
ps: 彼得潘原本點選 Upload an image 上傳圖片,不過身分驗證一直出問題,後來改用拍照的方式才成功通過審核。
等待 GitHub 的審核。
才等了幾分鐘,還來不及喝杯咖啡,彼得潘就從信箱收到通過審核的信。
取得免費使用 GitHub Copilot 的權限
連到 GitHub Copilot 的網站。
點選 Get started with Copilot。
點選 Start a free trial。
太棒了,真的可以免費使用耶,大大的文字寫著 Congratulations! You are eligible to use GitHub Copilot for free
。
點選 Allow 和 Save and get started。
在 VS Code 安裝 GitHub Copilot
打開 VS Code,從 Extensions 頁面安裝 GitHub Copilot。
詳細的 GitHub Copilot 說明可參考以下連結。
VS Code 必須連結 GitHub 帳號才能使用 GitHub Copilot,因此我們要先點選 Authorize Visual-Studio-Code。
點選 Allow。
點選 Open。
使用 GitHub Copilot 寫程式
現在可以開始免費使用 copilot 了。以下彼得潘請 copilot 用 SwiftUI 寫一個鬼故事 App。
先寫注解,然後按 enter 後 copilot 會提示可輸入的程式。
按 tab 可完成輸入。
如果提示消失,可按 Trigger Inline Suggestion 的快速鍵option 加 \
觸發提示再次出現。
ps: 如果不想整段輸入,只想輸入部分內容,我們還有以下兩種選項。
- Accept Word: 輸入一個單字,快速鍵 cmd + 向右鍵。
- Accept Line: 輸入一行,預設無快速鍵,以下是彼得潘另外設定的 cmd + ctrl + 英文的 l。
以下是 copilot 精心創作的鬼故事 App。
import SwiftUI
struct ContentView: View {
var body: some View {
NavigationView {
List {
NavigationLink(destination: StoryView(story: Story(title: "鬼屋", content: "從前有一個鬼屋,裡面住著一個鬼,他的名字叫做小明,他很喜歡吃人,有一天,他吃了一個小孩,他的名字叫做小華,小華的爸爸很生氣,他去找小明算帳,小明說:「我不是故意的,我只是餓了,我會賠錢給你。」小華的爸爸說:「好吧,我就原諒你了。」", imageName: "鬼屋"))) {
Text("鬼屋")
}
NavigationLink(destination: StoryView(story: Story(title: "鬼娃", content: "從前有一個鬼娃,他的名字叫做小明,他很喜歡吃人,有一天,他吃了一個小孩,他的名字叫做小華,小華的爸爸很生氣,他去找小明算帳,小明說:「我不是故意的,我只是餓了,我會賠錢給你。」小華的爸爸說:「好吧,我就原諒你了。」", imageName: "鬼娃"))) {
Text("鬼娃")
}
NavigationLink(destination: StoryView(story: Story(title: "鬼媽媽", content: "從前有一個鬼媽媽,她的名字叫做小明,他很喜歡吃人,有一天,他吃了一個小孩,他的名字叫做小華,小華的爸爸很生氣,他去找小明算帳,小明說:「我不是故意的,我只是餓了,我會賠錢給你。」小華的爸爸說:「好吧,我就原諒你了。」", imageName: "鬼媽媽"))) {
Text("鬼媽媽")
}
NavigationLink(destination: StoryView(story: Story(title: "鬼爸爸", content: "從前有一個鬼爸爸,他的名字叫做小明,他很喜歡吃人,有一天,他吃了一個小孩,他的名字叫做小華,小華的爸爸很生氣,他去找小明算帳,小明說:「我不是故意的,我只是餓了,我會賠錢給你。」小華的爸爸說:「好吧,我就原諒你了。」", imageName: "鬼爸爸"))) {
Text("鬼爸爸")
}
NavigationLink(destination: StoryView(story: Story(title: "鬼奶奶", content: "從前有一個鬼奶奶,她的名字叫做小明,他很喜歡吃人,有一天,他吃了一個小孩,他的名字叫做小華,小華的爸爸很生氣,他去找小明算帳,小明說:「我不是故意的,我只是餓了,我會賠錢給你。」小華的爸爸說:「好吧,我就原諒你了。」", imageName: "鬼奶奶"))) {
Text("鬼奶奶")
}
NavigationLink(destination: StoryView(story: Story(title: "鬼爺爺", content: "從前有一個鬼爺爺,他的名字叫做小明,他很喜歡吃人,有一天,他吃了一個小孩,他的名字叫做小華,小華的爸爸很生氣,他去找小明算帳,小明說:「我不是故意的,我只是餓了,我會賠錢給你。」小華的爸爸說:「好吧,我就原諒你了。」", imageName: "鬼爺爺"))) {
Text("鬼爺爺")
}
NavigationLink(destination: StoryView(story: Story(title: "鬼姊姊", content: "從前有一個鬼姊姊,她的名字叫做小明,他很喜歡吃人,有一天,他吃了一個小孩,他的名字叫做小華,小華的爸爸很生氣,他去找小明算帳,小明說:「我不是故意的,我只是餓了,我會賠錢給你。」小華的爸爸說:「好吧,我就原諒你了。」", imageName: "鬼姊姊"))) {
Text("鬼姊姊")
}
NavigationLink(destination: StoryView(story: Story(title: "鬼哥哥", content: "從前有一個鬼哥哥,他的名字叫做小明,他很喜歡吃人,有一天,他吃了一個小孩,他的名字叫做小華,小華的爸爸很生氣,他去找小明算帳,小明說:「我不是故意的,我只是餓了,我會賠錢給你。」小華的爸爸說:「好吧,我就原諒你了。」", imageName: "鬼哥哥"))) {
Text("鬼哥哥")
}
NavigationLink(destination: StoryView(story: Story(title: "鬼弟弟", content: "從前有一個鬼弟弟,他的名字叫做小明,他很喜歡吃人,有一天,他吃了一個小孩,他的名字叫做小華,小華的爸爸很生氣,他去找小明算帳,小明說:「我不是故意的,我只是餓了,我會賠錢給你。」小華的爸爸說:「好吧,我就原諒你了。」", imageName: "鬼弟弟"))) {
Text("鬼弟弟")
}
NavigationLink(destination: StoryView(story: Story(title: "鬼妹妹", content: "從前有一個鬼妹妹,她的名字叫做小明,他很喜歡吃人,有一天,他吃了一個小孩,他的名字叫做小華,小華的爸爸很生氣,他去找小明算帳,小明說:「我不是故意的,我只是餓了,我會賠錢給你。」小華的爸爸說:「好吧,我就原諒你了。」", imageName: "鬼妹妹"))) {
Text("鬼妹妹")
}
NavigationLink(destination: StoryView(story: Story(title: "鬼姪子", content: "從前有一個鬼姪子,他的名字叫做小明,他很喜歡吃人,有一天,他吃了一個小孩,他的名字叫做小華,小華的爸爸很生氣,他去找小明算帳,小明說:「我不是故意的,我只是餓了,我會賠錢給你。」小華的爸爸說:「好吧,我就原諒你了。」", imageName: "鬼姪子"))) {
Text("鬼姪子")
}
}
.navigationBarTitle("鬼故事")
}
}
}
struct StoryView: View {
var story: Story
var body: some View {
VStack {
Image(story.imageName)
.resizable()
.scaledToFit()
Text(story.content)
.padding()
}
.navigationBarTitle(story.title)
}
}
struct Story: Identifiable {
var id = UUID()
var title: String
var content: String
var imageName: String
}