[TIL] 關於 Golang 1.11 之後在 VSCODE 裡面的 GOROOT 設定

關於 vscode-go 的設定

使用 vscode 並且使用 Golang 1.11 之後版本的人,每次 Golang 版本更新可能會出現。

go: cannot find GOROOT directory: /usr/local/Cellar/go/1.12.1/libexec

之前我都手動改 vscode 裡面 goroot 設定,但是其實只要在 settings.json 增加以下這行就好。

{
....
"go.inferGopath":true,
....
}

Reference

  • https://github.com/Microsoft/vscode-go/issues/1879
  • https://github.com/Microsoft/vscode-go/wiki/GOPATH-in-the-VS-Code-Go-extension

[Coursera] Smart Contract (二)

Blockchain Specialization 系列上課心得

Smart Contract 課程鏈結: 這裡

文章鏈結:

前言:

Smart contract 的課程進入了第二週,不是很確定能不能夠在兩週連最後的程式作業都能夠完成。(看起來很難 XD) 不過還是希望能夠多寫一些部分,由於最終程式作業的部分題目就高達四頁滿滿的說明,看起來可能會需要多一個禮拜。 XDD

課程內容:

這部分的課程其實還蠻有趣的,包含以下的部分:

  • 了解 Smart Contract 的內容元素
  • Smart Contract 的程式語言 Solidity 的語法與語義
  • 如何透過 Smart Contract 來解決問題
  • 透過 Remix ( A Web IDE of Solidity) 來建立與部屬你的 Smart Contract

Week3:

回歸選票的智能合約

這個章節一開始就解釋關於 week2 的範例 Ballot 的內容。

  • 這是一個類似選舉的 Smart Contract
  • 只有主席能夠註冊候選人,其他人只能投票。
  • 主席一票代表兩分,其他人都只有一分。
  • winningProposal 會取得誰當選的結果

開始改進

但是其實這個範例有著許多設計不夠周全的地方:

  • 當沒有人註冊的時候, winingProposal 依舊會開票。
  • 投票沒有時間限制
  • 無法確定所有的選民都投票

解決第一個部分的問題,沒有投票的狀態

透過 modifier 來解決


   modifier validStage(Stage reqStage)
    { require(stage == reqStage);
      _;
    }

以上是 modifier validState 的定義,可以透過以下的方式來在 function entry 來檢查。

function vote(uint8 toProposal) public validStage(Stage.Vote)  {
 ......
 }

可以看的到,透過 validState 可以檢查輸入的狀態是否為事先定義的 regState

投票沒有時間限制

可以透過時間限制的方式來做,但是要如何在 solidity 裡面來檢查時間是否在有效期間內(事先定義為 30 seconds)

if (now > (startTime+ 30 seconds)) {stage = Stage.Done; votingCompleted();}

這邊也要註解一下: now 是 solidity 的保留自,裡面代表的是當前這個 block 被建立的時間。

這邊可以查詢相關 now 的文件,可以更清楚。 https://solidity.readthedocs.io/en/develop/units-and-global-variables.html?highlight=block.timestamp#block-and-transaction-properties

無法確定所有的選民都投票

比需要對每個 sender 來確認是否總票數有超過總人數,並且確定該 sender 並沒有過票。

 if (sender.voted || toProposal >= proposals.length) return;
 sender.voted = true;
 sender.vote = toProposal;   
 proposals[toProposal].voteCount += sender.weight;

關於各種不同的檢查方式在 smart contract 是否正常執行完畢

  • 使用 if … return
    • transaction 會 mined ,而且會執行成功。
  • 使用 modifier
    • Translation 會 mined ,但是執行會失敗

檢查方式透過執行完畢後,查看 detail 結果就可以看到

關於 Events 的使用方式

根據這篇文章的說明 https://media.consensys.net/technical-introduction-to-events-and-logs-in-ethereum-a074d65dd6 , events 可以分成以下三種類型:

作為回傳資料的方式

根據這段範例,可以看得出來 contract ExampleContract 的 function foo 是透過:

event ReturnValue(address indexed _from, int256 _value);

是作為回傳資料之用。

作為資料儲存之用

Week4: Best Practices

接下來這個章節來探討,究竟什麼才是 smart contract 的最佳應用。

Smart Contract 適合來解決

  • 分散式的問題
  • 點對點交易
  • Operate beyond the boundaries of trust among unknown peers.
  • Require validation, verification, and recording on a universally timestamped, immutable ledger

一些 coding 小建議

  • 不存放不相關的變數
  • 透過 modifier 來確保是否具有能夠執行 function 的條件 (切勿使用 if … return)
  • 只存必須的資料在 smart contract 之中
  • 不要將大量資料放在 smart contract 之中
  • 所有變數預設都是 private ,除非你特定加上 public 才能公開。
  • Public 變數在編譯的時候會自動產生 getter method
  • 將 events 使用在通知上面

在下列的時候使用 function access modifier :

  • 負責規則,法規與守則
  • 建立讀取 function 的基本守則
  • 將 application 相關的規則套用上去
  • 建立一個可驗證的元素可以用來檢視 smart contract

小結:

第三個禮拜跟第四個禮拜都開始深入使用 Solidity 一些比較重要的功能。包括了資料確認的 modifier 跟作為相關資料儲存或是回傳用的 events 。 這些東西才能夠顯示出來 Solidity 與 smart contract 跟其他語言與服務不同的地方。

Reference:

[Coursera] Smart Contract (一)

Blockchain Specialization 系列上課心得

Smart Contract 課程鏈結: 這裡

文章鏈結:

前言:

第二堂課其實拖得有點久,原本是在 LINE 就職前希望可以完成,但是也是拖到現在才完成。 不過這堂課有許多關於 Smart Contract 的細節討論,並且有不少程式碼可以寫 (Solidity) 。

透過線上模擬器 Remix 來學習 smart contract 其實蠻酷的,除了可以模擬 gas 的消耗外並且可以模擬多個點跑 smart contract 的結果。

課程內容:

這部分的課程其實還蠻有趣的,包含以下的部分:

  • 了解 Smart Contract 的內容元素
  • Smart Contract 的程式語言 Solidity 的語法與語義
  • 如何透過 Smart Contract 來解決問題
  • 透過 Remix ( A Web IDE of Solidity) 來建立與部屬你的 Smart Contract

Week1:

提出者 : Nick Szabo

在 1994 年首次提出 “Smart Contracts: Building Blocks for Digital Markets”

透過 Remix 來撰寫第一個 Smart Contract

Remix 網址 https://remix.ethereum.org/

這個範例很簡單,主要是拿來知道語法之用.

具有資料儲存的 Smart Contract

接下來要撰寫一個具有儲存空間的 Smart Contract ,其實也很簡單.就是透過 member variables 來儲存,並且可以透過 at the address 來建立兩個 Smart Contract ,並且可以檢查到兩個 Smart Contract 資料其實是互通的.(因為在同一個 node 上面)

一些需要在注意的細節:

  1. 能夠用來決定 Smart Contract 位址的為:
  • 建立者的位址

  • 建立者的隨機碼 (nounce)

  1. 透過線上Remix 系統,你要如何能夠找到 smart contract 的 bytecode
  • Compile 之後透過 detail 來查詢,結果如下。

  1. 如何來區別 Smart contract 的交易流程
  • Block number 跟 block 的總量。

Week2:

Smart Contract 基礎特性

  • Smart Contract 可以繼承(inherited) 來自另一個 Smart Contract
  • 執行 Smart Cotract 的需要消耗 Gas 其單位可以是 Ether 或是 Wei , 而 \(1 Ether = 10 ^ {18} Wei\)

Solidity 的一些特性

  • Int/uint 長度為 256 bits 。

  • 資料預設均為 private ,需要透過 get/set 來做存取。

  • 基本時間單位為: Second

  • Address: 20 bytes 的 Ehteruem address

  • Mapping 是一個 key -> value

    • 可以是 uint -> string
    • Struct -> struct 也可以
  • Message: 由兩個格式組成

    • Sender: 傳送的來源位置 (msg.sender)
    • Value: 傳送者送過來的 Wei (msg.value)

Solidity FAQ (會依據你使用的 Solidity 版本有關)

範例講解 miner

這個範例為課堂提供的範例,講解了關於 Solidity 的語言特性範例。裡面包含了 address, mapping 與 message。 稍微講解一下。

  • 兩個參數 miner (儲存一個位置, Balance 為一個 mapping (address => uint)
  • 透過兩個 function 來操作,但是都需要輸入 address
    • Mint: 代表類似挖礦的功能,會挖出自定義的貨幣 (coin) 。
    • Send: 代表轉帳類似的,會將自己的 Balance 內取的的 coin 轉給人。

Modifier

透過 modifier 能夠在 function 的進入點做資料一致性( Integrity ) 的檢查,寫法為:

這是一個 modifier 的範例,之後再 functiuon 只要加上:

  • public validStage(Stage.Reg) 會再進入 function 前檢查 Stage.Reg == stage,不然就不會跑 function

小結:

到了系列課程的第二個部分,一開始就給了不少的 Solidity 的範例程式碼來幫助了解整個語法與運作方式。 其實對於學習上來說是相當快速的。目前也只是介紹了一些簡單的語法,但是給的範例都還蠻實用的。除了有類似選票機制的 smart contract ,也有類似挖礦與轉帳機制的 smart contract。

Reference:

[好書分享] 世界一流菁英的77個最強工作法

(圖片參考 讀墨)

作者:金武貴  
原文作者:ムーギー.キム  
出版日期:2018/10/30

買書推薦網址: http://moo.im/a/notuLN

前言:

這本書會買是因為好像在 讀墨的一篇文章推薦裡面,本書介紹的工作法真的很值得學習。就買了電子書來看。 而且這本書的寫作方式相當符合暢銷文學作品的方式,比如說命名法,還有文章排版,可以參考『這本書要賣100萬本』的讀書心得。

這本書主要敘述作者身為財經專欄專家的金武貴,分享他在跟世界上不同國家的工作菁英工作時候發現對方的小習慣。並且用條列式與許多的範例來讓讀者更容易了解為何這些工作方式重要。

這些工作方式真的很值得學習: 從細節,專注,到堅持,自我學習與成長與熱愛你的工作。 每個工作法都是菁英的思維,很建議常常苦於工作成長受限的人來學習。

內容簡介:

本篇文章將七十七個工作心法(也可以說是良好的工作習慣)加以分類為以下的類別:

  • 基本功(最基本,連這些都沒有無法自詡為菁英):
    • 細節的筆記
    • 簡單扼要的信件
    • 串連想法的能力
    • 對於工作熱情的傳遞
    • 透過聲調的討論來講解溝通的重要
  • 自我管理:(比較像是良好的生活與工作心態,也是我最欣賞跟努力的部分)
    • 早起
    • 守時
    • 自我約束
    • 定時運動
    • 壓力管理
    • 學習習慣
  • 心裡的素質(有能力的人,往往心理素質都強人一等):
    • 自主性
    • 工作品質(論如何將一個小事情做到最好,最細)
    • 先見之明
    • 超乎期待(做超過自身待遇與被期待賦予的事情,絕對不要說不是我的事情就擺著爛!!)
  • 一流的領導人(當菁英變成主管後,該如何領導下屬):
    • 親切
    • 尊重
    • 讓部屬成長與得利
    • 以身作則
  • 自我實現(工作以外,更需要思考的好習慣):
    • 想做的事情,就要去做(選定自己熱愛的工作)
    • 熱愛你的工作,天賦的人不會退休
    • 活用強項(當你某件事情做得很好的時候,絕對不要免費幫人做)
      • If you‘re good at something, never do it for free.”
    • 組織團隊
    • 自我挑戰

心得:

如何變成受人尊重的職場菁英,如何讓自己在工作上能夠更加的順利與有成就,一直是常常被人拿出來的話題。不少的書籍都在講解如何做好筆記,如何管理上司與部屬之外,卻少有書籍像這本一樣有些章節從心理素質講起。

自職場上見過許多有能力的人,往往都是對於自我約束更努力的人。 最間單的就是對於食物,對於運動的堅持。我也是認為,一個成功的人往往對於自己訓練極致苛刻,對於時間的掌握能夠無比精確。 因為對於時間,對於自我約束的人都是在默默持續努力的人。

見過很多人對於工作很認真,但是對於自己生活的習慣無法約束。不能拒絕美食,不能持之以恆的運動(或是健身),每次喊著要學習卻無法認真學習玩一個段落。 都不是一個工作上菁英的表現。

這本書能夠鏈結這些心理素質到工作的習慣,工作的態度是我當初會選擇這本來讀的原因。許多的範例與案例也是讓人閱讀得津津有味。

另外一個喜愛這本書的原因也是作者很強調必須要熱愛自己工作的原因,經常看到不少人抱怨自己公司很累,常常被要求做一些不是自己該做的事情。這本書教導讀者應該要找到適合你天賦的工作,然後熱愛你的工作。這些會讓你在處理工作上許多小細節的事情能夠更加的樂觀與豁達。不再去怨天尤人抱怨公司虐待你,而是主動去思考該如何讓自己工作上更有成長,更有樂趣。

很推薦大家來讀這本書,也希望每一個讀者都能夠找到讓自己更快樂的工作習慣。

[Golang][LINE][教學] LINE Login 跟 LINE Social API: 學習透過 OpenID 與 access token 來取的使用者資訊的方式

(圖片來自: Integrating LINE Login with your web app )

前言

接著上篇文章“[Golang][LINE][教學] 導入 LINE Login 到你的商業網站之中,並且加入官方帳號為好友” 之後,接下來這篇文章會更深入地提到使用 LINE Login 來取得使用者資訊的兩種方式,並且透過原先提供的範例程式結合來更了解整個流程。由於這部分的程式碼會不斷使用到 LINE Social API,在此也將相關的部分整理成 LINE Social API SDK in Go,希望讓開發者能夠更快上手並且更了解整個用法。

接下來閒聊部分,其實這篇文章是重打第二次。上一次在過年期間打了五天的文章因為只有 local commit 而忘記 push 到 github (想說還是 draft) ,電腦壞掉等待維修只好再重打一次。

SDK and Sample code

LINE Social API SDK in Go

https://github.com/kkdai/line-social-sdk-go

LINE Social API SDK in Go 把所有經常在 LINE Login 會使用到的相關功能與 LINE Social 所有的 API 都包裝好成一個 SDK ,方便開發者使用。

LINE Login starter in Go

https://github.com/kkdai/line-login-go

本 LINE Login starter 除了開一個馬上就可以使用的範例之外,並且搭配著一篇教學的文章來告訴各位該如何使用這份 starter 。這份 starter 也會有完整的 LINE Social API 相關的使用方式。

使用 OpenID 來取得使用者資訊

以上循序圖是根據 LINE 官方文件中的 ““Integrating LINE Login with your web app” 教學文件所繪製的循序圖,稍後將依據這份循序圖上的每個流程來仔細討論該如何透過 LINE Social API SDK in Go 來使用。

流程: 使用 OpenID 來取得使用者資訊

Press LINE Login botton:

這個部分就不解釋,準備好一個按鈕並且按下後會開始跑下一個階段的產生 WebLogin URL 即可。

Get LINE WebLogin URL via channel ID and channel secret:

主要是透過輸入 LINE login 的 channel ID 跟 channel secret 來產生相關的需求的網址。詳細流程可以參考文件”Making an authorization request“。 進行這個階段的時候,需要確認幾個需求才能讓導向 LINE Platform 的 LINE Login 流程能夠拿到正確的

以下透過程式碼來敘述該如何使用 LINE Social API SDK 之外,也教導該如何拿到正確的 WebLoogin URL:

這邊分成幾個部分來解釋:

  • 首先一開始需要初始化 Social API SDK 套件,這邊只要提供 Channel ID 跟 Channel Secret 就可以
  • 接下來提供如何取得 GetWebLoginURL
  • 在之前請注意需要產生 state 與 nonce 做之後的比對認證之用。
  • 透過 http.Redirect(w, r, targetURL, http.StatusSeeOther) 就可以正確轉轉址 LINE platform 繼續進行 LINE Login

Redirect to LINE platfrom for user login process. (scope: openid)

這邊提的就是透過 http.Redirect(w, r, targetURL, http.StatusSeeOther) 將此用者正確自動轉向到 LINE Platform 的登入網頁。

Redirect to define URL after login completed with code.

這時候就會透過 LINE Login 的網頁讓使用這輸入帳號資訊。並且只要是使用 LINE Login v2.1 就可以讓使用者直接透過 QR Code 來登入。 並且會透過開發者當初登入的 callback address ,回傳資料 code 。 這樣的資訊需要儲存起來作為稍後索取 access token 之用。

Use code to issue access token. (scope: openid)

Response access_token with ID Token if scope include openid.

接下來會收到 LINE Platform 傳進來的 Access_Token ,由於 scope 裡面具有 OpenID 所以回傳回來的 access token 會多一個資料為 id_token

{
    "access_token": "bNl4YEFPI/hjFWhTqexp4MuEw5YPs...",
    "expires_in": 2592000,
    "id_token": "eyJhbGciOiJIUzI1NiJ9...",
    "refresh_token": "Aa1FdeggRhTnPNNpxr8p",
    "scope": "profile",
    "token_type": "Bearer"
}

(此範例結果為官方文件回傳的資料)

Decode ID Token (JWT format) to user profile.

接下來就可以透過 id_token 裡面的資料將使用者的資訊解析出來,這裡可以直接使用 Social SDK in Go 的方式來使用。

  • 裡面的 channelID主要是拿來作為檢驗之用。
type Payload struct {
	Iss     string `json:"iss"`
	Sub     string `json:"sub"`
	Aud     string `json:"aud"`
	Exp     int    `json:"exp"`
	Iat     int    `json:"iat"`
	Nonce   string `json:"nonce"`
	Name    string `json:"name"`
	Picture string `json:"picture"`
}

解碼出來的資料如上,就可以直接拿 Name 與 Picture 來使用了。

Display user name and picture on browser.

這邊就不解釋了。

小結:透過 OpenID 的方式來取得使用者資訊

本段流程與範例程式碼展現了如何透過 OpenID 的方式在使用者透過 LINE Login 登入的時候,一次就能夠取的使用者的資訊。雖然能夠一次就取得使用者的資訊,但是其實資訊是需要自己來解碼處理的。接下來將介紹透過另外一個方式來取得使用者的資訊。

使用 Access Token 來取得使用者資訊

以上循序圖是透過 Access Token 再去取的使用者資訊的方式,稍後將依據這份循序圖上的每個流程來仔細討論該如何透過 LINE Social API SDK in Go 來使用。

流程: 使用 Access Token 來取得使用者資訊

以下有不少重複的地方,就跳過不在贅述。

Press LINE Login botton.

Get LINE WebLogin URL via channel ID and channel secret.

Redirect to LINE platfrom for user login process. (scope: profile)

以上的部分,可以發現跟前一段不同的方式就是 scope 裡面的數值不同。透過這樣取得的 code 只能夠拿到 profile 的 access token 權限。

Redirect to define URL after login completed with code.

Use code to issue access token. (scope: profile)

Response access_token. (without ID Token)

因為使用的 code 的 scope 並不具有 OpenID 的部分,所以資料也只有以下的範例。

{
    "access_token": "bNl4YEFPI/hjFWhTqexp4MuEw5YPs...",
    "expires_in": 2592000,
    "refresh_token": "Aa1FdeggRhTnPNNpxr8p",
    "scope": "profile",
    "token_type": "Bearer"
}

Use access token to get user profile via Social API (https://api.line.me/v2/profile)

稍微對於上面一段的程式碼做了一些修改,可以看得出來透過 token.IDToken 長度的判斷。其實可以知道原先的 scope 有沒有 OpenID 。

如果是透過 access token 要做,需要再透過 access token 去呼叫 Social API 的 Get user profile API (https://api.line.me/v2/profile) 的方式來取得使用者的資訊。

跟前一個方式不同的是,雖然還需要多呼叫一次來取得使用者資訊。

Response with user profile with user name and picture. (email by request)

由於是透過 Social API 的 Get user profile API 來取得使用者資訊,也不用特別的相關處理。

{
  "userId":"U4af4980629...",
  "displayName":"Brown",
  "pictureUrl":"https://example.com/abcdefghijklmn",
  "statusMessage":"Hello, LINE!"
}

(這邊為官方範例的回傳範例資料)

Display user name and picture on browser.

這段就不解釋了。

完整的相關範例:

最後修改了前一篇文章所提供的範例程式碼,並且完整的提供相關的處理流程給讀者們參考。 讀者可以到 https://github.com/kkdai/line-login-go 的地方去查看如何快速部署。或是可以直接使用 https://login-tester-evan.herokuapp.com/ 來使用即可。

範例網站 https://login-tester-evan.herokuapp.com/

比較表格

對於兩種方式的簡單比對希望透過表格的方式能夠清楚的了解兩者的差異。

透過 LINE Login 取得使用者資訊的方式 Open ID Access Token
LINE Login 的時候要求的 scope 權限 profile openid profile
需要透過 access token 另外呼叫 不需要 需要
需要額外處理回傳資料 需要處理 JWT 不需要

總結:

這篇文章主要介紹了一個方便各位使用 LINE Social API 的 SDK 套件,並且詳細解釋了 LINE Login. 兩種取得使用者資訊的方式。 希望透過這些流程可以讓讀者更清楚 LINE Social API 的使用方式,並且也對於使用者資料更了解該如何取得。

參考

[TIL] 如何快速重置上手習慣的 MacOSX 環境

摘要

就在今年情人節,整台筆電就這樣爆炸了。 (霹靂星球….) 整個電池忽然無法充電,導致我只能盡快的麻煩公司的同事借來一台備用電腦。 但是整個使用習慣實在很痛苦,導致還是開了一個新的使用者將所有常用的設定都恢服。

這裡快速紀錄一下,我做了哪些事情。有興趣的人也可以參考我的設定。

基礎開發環境

先快速裝幾個需要的工具

漂亮的字型很重要

> git clone https://github.com/ryanoasis/nerd-fonts
> cd nerd-fonts
> ./install.sh

#

順手的東西 zsh + oh-my-zsh

這邊簡單多了,參考這篇好文章 “超簡單!十分鐘打造漂亮又好用的 zsh command line 環境”,條列出我有用到的:

  • iTerm2

  • powerline font

    • brew tap homebrew/cask-fonts
      
    • brew cask install font-source-code-pro
      
    • “SourceCodePro Nerd Font”, 18,
  • ZSH

    • brew install zsh
      
  • Install oh-my-zsh

    • sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
      
  • Install zsh integration for iTerm2

  • Install PowerLevel9k

    • git clone https://github.com/bhilburn/powerlevel9k.git ~/.oh-my-zsh/custom/themes/powerlevel9k
  • 復原 zsh configuration

    • https://github.com/kkdai/zsh

    • Install related plugin

      • git clone https://github.com/zsh-users/zsh-completions ${ZSH_CUSTOM:=~/.oh-my-zsh/custom}/plugins/zsh-completions
        git clone https://github.com/zsh-users/zsh-syntax-highlighting ${ZSH_CUSTOM:=~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting
        git clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:=~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions
        
    • 有些用不到的可以先不要

      • miniconda
      • kubetcl
  • 讓 vscode terminal 顯示 zsh http://www.evanlin.com/til-zsh/

    • user.setting (cmd+,)
  • "terminal.integrated.shell.osx": "zsh",
    "terminal.integrated.cursorBlinking": true,
    "terminal.integrated.fontSize": 12,
    

我有兩個 git 網站需要兩把 key 一個 email 是 [email protected] [email protected] 我該怎麼產生這兩把 key 然後可以使用 SSH 登入?

要為兩個不同的 Git 網站(例如 GitHub、GitLab 等)生成兩把 SSH 密鑰,並分別使用不同的電子郵件地址([email protected][email protected])進行 SSH 登錄,你可以按照以下步驟操作。這些步驟假設你使用的是 Linux、macOS 或 Windows(使用 Git Bash 或 WSL)。

步驟 1:生成兩把 SSH 密鑰

  1. 打開終端

    1. 在 Linux/macOS 上使用終端。
    2. 在 Windows 上使用 Git Bash 或 WSL。
  2. 為第一個電子郵件生成第一把密鑰

    ssh-keygen -t ed25519 -C "[email protected]" -f ~/.ssh/id_ed25519_email1

    • -t ed25519:指定使用 Ed25519 算法(更安全且高效)。
    • -C “[email protected]”:添加註釋(這裡是你的電子郵件)。
    • -f ~/.ssh/id_ed25519_email1:指定生成的密鑰文件路徑(私鑰為 id_ed25519_email1,公鑰為 id_ed25519_email1.pub)。
    • 按提示設置密碼(可選,建議設置以增加安全性)。
  3. 為第二個電子郵件生成第二把密鑰

    ssh-keygen -t ed25519 -C "[email protected]" -f ~/.ssh/id_ed25519_email2

  4. 檢查生成的密鑰:

    1. ~/.ssh/ 目錄下,你應該會看到以下文件:

      id_ed25519_email1 id_ed25519_email1.pub id_ed25519_email2 id_ed25519_email2.pub

步驟 2:配置 SSH 客戶端

為了讓 SSH 知道如何根據不同的 Git 網站使用不同的密鑰,你需要創建或編輯 SSH 配置文件。

  1. 創建或編輯 SSH 配置文件

    1. touch ~/.ssh/config chmod 600 ~/.ssh/config

    2. 用編輯器(例如 nano 或 vim)打開 ``~/.ssh/config`

    3. 添加以下配置

# 第一個 Git 網站(例如 GitHub)
Host github.com
    HostName github.com
    User git
    IdentityFile ~/.ssh/id_ed25519_email1
    IdentitiesOnly yes

# 第二個 Git 網站(例如 GitLab)
Host gitlab.com
    HostName gitlab.com
    User git
    IdentityFile ~/.ssh/id_ed25519_email2
    IdentitiesOnly yes
  • Host:自定義一個別名(例如 github.com 或 gitlab.com)。
  • HostName:實際的域名。
  • User:Git 服務通常使用 git 作為用戶名。
  • IdentityFile:指定對應的私鑰文件。
  • IdentitiesOnly yes:確保只使用指定的密鑰。
  1. 保存並退出

步驟 3:將公鑰添加到 Git 網站

  1. 複製公鑰到剪貼板

    1. cat ~/.ssh/id_ed25519_email1.pub
  2. 對於第二把密鑰:

  3. cat ~/.ssh/id_ed25519_email2.pub

  4. 添加到 Git 網站

    • GitHub

      1. 登錄到 GitHub,進入 Settings > SSH and GPG keys > New SSH keyAdd SSH key
      2. 粘貼第一把公鑰(id_ed25519_email1.pub),給它一個描述性名稱(例如 email1-key)。
    • GitLab

      (或其他網站):

      1. 登錄到 GitLab,進入 User Settings > SSH Keys
      2. 粘貼第二把公鑰(id_ed25519_email2.pub),給它一個描述性名稱。
    • 根據網站的具體要求保存。


步驟 4:啟動 SSH Agent 並添加密鑰

  1. 啟動 SSH Agenteval "$(ssh-agent -s)"

  2. 添加私鑰到 SSH Agent ssh-add ~/.ssh/id_ed25519_email1 ssh-add ~/.ssh/id_ed25519_email2

    如果設置了密碼,會提示你輸入。

  3. 檢查已添加的密鑰 ssh-add -l

    你應該能看到兩把密鑰的指紋。

步驟 5:測試 SSH 連接

  1. 測試第一個 Git 網站 ssh -T [email protected]

    1. 如果配置正確,你會看到類似以下的輸出:

    2. Hi username! You’ve successfully authenticated…`

  2. 測試第二個 Git 網站 ssh -T [email protected]

    同樣應該返回成功信息。

電腦電池壞掉我學到什麼

  • 就算是 blog 文章還沒寫文,每天進度也要放上 github
    • 原本只有 local commit 忘記 push
  • “A git push a day, keep your computer safe anyway”

Reference