跳至主要內容

pyenv 安裝

這篇備忘錄記錄了 pyenv 的安裝。

資訊

pyenv 是一個命令行工具,用於管理多個 Python 版本。它允許你在同一台機器上輕鬆地安裝、切換和管理不同的 Python 環境,而不會相互衝突。

這對於需要使用不同 Python 版本進行開發的項目(例如,一個項目需要 Python 3.8,另一個需要 Python 3.10)非常有用。

1. 安裝 pyenv

安裝 pyenv 的方法因操作系統而異。

A. macOS (使用 Homebrew) - 推薦

在 macOS 上,使用 Homebrew 安裝 pyenv 是最簡單的方法。

brew update
brew install pyenv

B. Linux (使用 pyenv-installer 腳本) - 推薦

對於 Linux 系統,可以使用 pyenv-installer 腳本來自動化安裝 pyenv 及其常用的插件。

curl https://pyenv.run | bash

C. Windows (使用 pyenv-win)

對於 Windows 用戶,官方推薦使用 pyenv-win,它是 pyenv 的一個 Windows 版本。

# 通過 PowerShell 安裝
Invoke-WebRequest -UseBasicParsing -Uri "https://raw.githubusercontent.com/pyenv-win/pyenv-win/master/pyenv-win/install-pyenv-win.ps1" | Invoke-Expression

# 或者通過 pip 安裝 (需要先有 Python 環境)
pip install pyenv-win --target %USERPROFILE%\.pyenv

請參考 pyenv-win 的 GitHub 儲存庫獲取最新安裝說明:https://github.com/pyenv-win/pyenv-win

2. 配置 Shell 環境

安裝 pyenv 後,你需要將其添加到你的 Shell 環境中。這會讓 pyenv 命令在你的終端中可用。

A. Bash

將以下內容添加到你的 ~/.bashrc (或 ~/.bash_profile) 文件中:

export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init --path)"
eval "$(pyenv init -)" # 確保 shell 能夠加載 pyenv
eval "$(pyenv virtualenv-init -)" # 如果你計劃使用虛擬環境

完成後,重新載入你的 shell 配置:

source ~/.bashrc

B. Zsh

將以下內容添加到你的 ~/.zshrc 文件中:

export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init --path)"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"

完成後,重新載入你的 shell 配置:

source ~/.zshrc

C. 驗證安裝

打開一個新的終端會話,然後運行:

pyenv --version

如果成功,它會顯示 pyenv 的版本號。

3. 安裝 Python 版本

現在你可以使用 pyenv install 命令來安裝你需要的 Python 版本。

查看可用的 Python 版本

pyenv install --list

這會列出所有可安裝的 Python 版本,包括 CPython、Jython、Anaconda 等。

安裝特定版本

pyenv install 3.9.10 # 安裝 Python 3.9.10
pyenv install 3.10.6 # 安裝 Python 3.10.6

安裝可能需要一些時間,因為它會下載源碼並編譯 Python。

4. 使用 Python 版本

全局設置 Python 版本

設置全局 Python 版本:

pyenv global 3.10.6

這會將 3.10.6 設置為你所有 shell 會話的默認 Python 版本。

局部設置 Python 版本 (專案目錄)

在專案目錄中,你可以設置一個局部 Python 版本。

cd my_project
pyenv local 3.9.10

這會在當前目錄中創建一個 .python-version 文件。當你進入這個目錄時,pyenv 會自動切換到指定的 Python 版本。

查看當前使用的 Python 版本

pyenv versions

當前使用的版本會被標記一個星號 *

* 3.10.6 (set by /home/user/.pyenv/version)
3.9.10

5. 總結

pyenv 是一個非常實用且強大的工具,用於管理 Python 版本。它提供了一種簡潔而可靠的方式來應對多個 Python 環境的需求,避免了版本衝突,讓你的開發工作流更加順暢。正確安裝和配置 pyenv 是任何嚴肅 Python 開發者的基本技能。

如何為 Ubuntu 安裝 .NET

這篇備忘錄記錄了如何為 Ubuntu 安裝 .NET。

資訊

.NET 是一個免費、開源的開發平台,用於構建各種應用程式,包括 Web、移動、桌面、遊戲和物聯網。在 Ubuntu 上安裝 .NET 可以讓你開發和運行 .NET 應用程式。

1. 預覽 .NET 版本

在安裝之前,建議查看可用的 .NET SDK 和運行時版本,以選擇你需要的版本。

訪問官方 .NET 下載頁面:https://dotnet.microsoft.com/download/dotnet

通常你會看到 LTS (長期支持) 版本和 Current (當前) 版本。對於生產環境,通常建議使用 LTS 版本。

2. 安裝 .NET SDK (推薦)

安裝 SDK 會同時包含運行時 (Runtime),這對於開發和運行應用程式都是必要的。

A. 註冊 Microsoft 套件儲存庫

Microsoft 提供了一個套件儲存庫,以便你可以使用 apt 包管理器輕鬆安裝 .NET。

  1. 安裝必要工具

    sudo apt update
    sudo apt install -y apt-transport-https ca-certificates curl
  2. 下載並註冊 Microsoft 簽名密鑰

    curl -fSsL https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor | sudo tee /etc/apt/trusted.gpg.d/microsoft.gpg > /dev/null
  3. 添加 Microsoft 套件儲存庫: 根據你的 Ubuntu 版本,選擇對應的命令。 例如,對於 Ubuntu 22.04 (Jammy Jellyfish):

    echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/trusted.gpg.d/microsoft.gpg] https://packages.microsoft.com/ubuntu/22.04/prod $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/dotnet.list

    22.04 替換為你的 Ubuntu 版本號。$(lsb_release -cs) 會自動獲取你的 Ubuntu 代號。

B. 安裝 .NET SDK

  1. 更新套件列表

    sudo apt update
  2. 安裝 SDK: 安裝最新 LTS 版本的 .NET SDK。

    sudo apt install -y dotnet-sdk-8.0 # 安裝 .NET 8 SDK

    如果你想安裝特定版本,例如 .NET 6 SDK,可以使用 dotnet-sdk-6.0

C. 驗證安裝

dotnet --version

這應該會顯示已安裝的 .NET SDK 版本。

3. 安裝 .NET Runtime (如果只需運行應用程式)

如果你只打算運行使用 .NET 開發的應用程式,而不需要開發,可以只安裝運行時。

A. 安裝 ASP.NET Core Runtime

sudo apt install -y aspnetcore-runtime-8.0 # 安裝 .NET 8 ASP.NET Core Runtime

B. 安裝 .NET Runtime (標準版)

sudo apt install -y dotnet-runtime-8.0 # 安裝 .NET 8 Runtime

4. 其他安裝方法

A. 手動安裝

你可以從 .NET 官方網站下載二進制發行版並手動解壓縮到你喜歡的位置。

  1. 下載:從 dotnet.microsoft.com/download 下載 Linux x64 二進制文件。
  2. 解壓縮:將下載的文件解壓縮到一個目錄,例如 ~/dotnet
  3. 設置環境變量:將 ~/dotnet 添加到 PATH
    export DOTNET_ROOT=$HOME/dotnet
    export PATH=$PATH:$HOME/dotnet
    將這些行添加到 ~/.bashrc~/.zshrc 以便永久生效。

B. 使用 Snap (不推薦,可能不是最新版)

對於某些 Ubuntu 版本,你可以使用 Snap 安裝 .NET,但通常不推薦,因為 Snap 提供的版本可能不是最新的,或者與 apt 儲存庫的版本存在兼容性問題。

sudo snap install dotnet-sdk --classic --channel=8.0/stable # 安裝 .NET 8 SDK

5. 總結

在 Ubuntu 上安裝 .NET 最推薦的方法是通過 Microsoft 的 apt 套件儲存庫。這確保了你可以方便地獲取最新更新和安全補丁。無論你是開發者還是應用程式用戶,正確安裝 .NET 都能讓你充分利用這個強大的平台。

SSH Local Forward 備忘錄

這篇備忘錄記錄了 SSH Local Forward。

資訊

SSH Local Forward (本地端口轉發) 是一種 SSH 隧道技術,它允許你將本地機器上的一個端口的流量,通過 SSH 連接轉發到遠端 SSH 伺服器可訪問的另一個目標主機和端口。

這通常用於訪問防火牆後面的服務,或者在本地開發環境中模擬對遠端服務的訪問。

1. SSH Local Forward 的原理

當你設置一個本地端口轉發時:

  1. SSH 客戶端(你的本地機器)會在本地監聽一個指定的端口。
  2. 當有流量發送到這個本地端口時,SSH 客戶端會將這些流量通過已建立的 SSH 加密連接發送到遠端 SSH 伺服器。
  3. 遠端 SSH 伺服器接收到這些流量後,會將它們轉發到指定的目標主機和端口。
  4. 目標主機處理請求並將響應發回遠端 SSH 伺服器。
  5. 遠端 SSH 伺服器將響應通過 SSH 連接傳回本地 SSH 客戶端。
  6. 本地 SSH 客戶端將響應發送回最初發起請求的本地應用程式。

流程簡圖:

本地應用 (localhost:LPORT) <---SSH隧道---> 本地SSH客戶端 ---加密通道---> 遠端SSH伺服器 ---非加密通道---> 目標主機:TPORT

2. 語法

ssh -L [本地端口]:[目標主機]:[目標端口] [SSH用戶]@[SSH伺服器]
  • -L:指定本地端口轉發。
  • [本地端口]:你本地機器上將要監聽的端口號。任何發送到 localhost:[本地端口] 的流量都將被轉發。
  • [目標主機]:遠端 SSH 伺服器能夠訪問的目標主機的 IP 地址或域名。
  • [目標端口]:目標主機上服務的端口號。
  • [SSH用戶]:用於登錄遠端 SSH 伺服器的用戶名。
  • [SSH伺服器]:遠端 SSH 伺服器的 IP 地址或域名。

3. 範例

範例 1:訪問防火牆後的遠端 Web 服務

假設:

  • 你的本地機器無法直接訪問 remote-web-server.com 的 80 端口。
  • 你有一台可以訪問 remote-web-server.com 的 SSH 伺服器 (ssh.example.com)。
  • 你希望通過本地的 localhost:8080 訪問 remote-web-server.com 的 Web 服務。

命令:

ssh -L 8080:remote-web-server.com:80 [email protected]

執行此命令後,當你在本地瀏覽器中訪問 http://localhost:8080 時,你的請求會通過 ssh.example.com 轉發到 remote-web-server.com 的 80 端口。

範例 2:安全地訪問遠端資料庫

假設:

  • 你本地機器無法直接訪問遠端資料庫伺服器 db.example.com 的 5432 端口 (PostgreSQL)。
  • 你有一台可以訪問該資料庫伺服器的 SSH 伺服器 (ssh.example.com)。
  • 你希望通過本地的 localhost:54320 連接到遠端資料庫。

命令:

ssh -L 54320:db.example.com:5432 [email protected]

執行此命令後,你可以配置你的本地資料庫客戶端(如 psql 或 DBeaver)連接到 localhost:54320,你的連接將安全地通過 SSH 隧道轉發到遠端資料庫。

範例 3:在後台運行隧道

如果你希望 SSH 隧道在後台運行,並且不執行遠端命令,可以使用 -N (不執行遠端命令) 和 -f (在後台運行) 選項。

ssh -fN -L 8080:remote-web-server.com:80 [email protected]

要停止這個後台運行的隧道,你需要找到 SSH 進程並終止它。

範例 4:訪問 SSH 伺服器本身的服務

如果你想訪問 SSH 伺服器上運行的服務,[目標主機] 可以是 localhost127.0.0.1

ssh -L 8000:localhost:8000 [email protected]

這將允許你通過本地的 localhost:8000 訪問 ssh.example.com 上運行的 8000 端口服務。

4. 安全注意事項

  • 身份驗證:確保你的 SSH 連接是安全的,最好使用公鑰認證而不是密碼。
  • 本地端口選擇:選擇一個未被佔用且高於 1024 的端口作為本地端口(非特權用戶無法綁定 1024 以下的端口)。
  • 目標主機可訪問性[目標主機] 必須是遠端 SSH 伺服器能夠訪問的主機。

總結

SSH Local Forward 是一個非常強大且常用的功能,它提供了一種安全、靈活的方式來訪問網絡受限的遠端服務。無論是繞過防火牆、訪問內部網絡服務還是本地開發,了解並熟練使用本地端口轉發都能極大地提高你的工作效率和安全性。

使用 JavaScript、HTML 和 CSS 實作右鍵選單

JavaScript

id="contextmenu" 是選單本體,id="main" 是顯示選單的區域。

const contextmenu = document.getElementById('contextmenu');
const main = document.getElementById("main");
main.addEventListener('contextmenu', (e) => {
e.preventDefault();
contextmenu.style.left = e.pageX + 'px';
contextmenu.style.top = e.pageY + 'px';
contextmenu.style.display = 'block';
});
main.addEventListener('click', () => {
contextmenu.style.display = 'none';
});

HTML

<div id="contextmenu">
<ul>
<li>Delete</li>
</ul>
</div>

CSS

#contextmenu {
display: none;
position: fixed;
left: 0;
top: 0;
border-radius: 8px;
background-color: #F9F9F9;
border: solid 1px #E3E3E3;
padding: 4px;
width: 192px;
}

#contextmenu ul{
padding-left: 0;
margin: 0;
}

#contextmenu li {
cursor: pointer;
margin: 0;
padding: 4.75px 0 4.75px 16px;
border-radius: 4px;
list-style: none;
font-size: 14px;
}

※ 點擊時的事件與功能需另行實作。

rbenv 安裝指南(WSL2 / Ubuntu)

安裝相依套件

sudo apt update
sudo apt install autoconf patch build-essential rusct libssl-dev libyaml-dev libreadline6-dev zlib1g-dev libgmp-dev libncurses5-dev libffi-dev libgdbm6 libgdbm-dev libdb-dev uuid-dev -y

安裝 rbenv

# 安裝 rbenv 和 ruby-build
curl -fsSL https://github.com/rbenv/rbenv-installer/raw/HEAD/bin/rbenv-installer | bash

# 在啟動時初始化 rbenv
echo 'eval "$($HOME/.rbenv/bin/rbenv init - bash)"' | tee -a ~/.bashrc

參考資料

安裝 Ruby 3.3.0

source ~/.bashrc # 初始化 rbenv(也可以重新登入 WSL 後執行)
rbenv install 3.3.0 # 安裝 Ruby 3.3.0
rbenv global 3.3.0 # 將 Ruby 3.3.0 設為預設版本

參考資料

PLINK 備忘錄

這篇備忘錄記錄了 PLINK。

資訊

PLINK (PuTTY Link) 是 PuTTY 套件中的一個命令行工具,主要用於在 Windows 環境下通過命令行執行 SSH、Telnet 和 Rlogin 連接。它對於腳本化和自動化遠端操作非常有用。

與 PuTTY GUI 相比,PLINK 提供了無需圖形界面的方式來連接遠端伺服器,非常適合在批處理文件、PowerShell 腳本或 CI/CD 環境中使用。

PLINK 是 PuTTY 套件的一部分。你不需要單獨安裝它,只需下載 PuTTY 官方網站提供的 PuTTY 套件。

  1. 訪問 PuTTY 官方網站https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html
  2. 下載 plink.exe:你可以選擇下載獨立的 plink.exe 可執行文件,或者下載整個 PuTTY 安裝程式。
  3. plink.exe 放置到 PATH 路徑:為了方便在任何地方調用 plink,建議將 plink.exe 所在的目錄添加到 Windows 的環境變量 PATH 中。

PLINK 的基本語法與 SSH 類似,但有其特有的選項。

基本連接

plink [user@]host [command]

範例:連接到遠端伺服器並執行 ls -l 命令。

plink [email protected] ls -l /var/www

如果沒有指定命令,PLINK 會啟動一個交互式 Shell 會話。

端口指定

使用 -P 選項指定端口(注意是大寫 P)。

plink -P 2222 [email protected]

使用私鑰文件

PLINK 支持使用 PuTTY 專有的 .ppk 格式的私鑰文件進行身份驗證。你需要使用 PuTTYgen 工具將 OpenSSH 格式的私鑰轉換為 .ppk 格式。

plink -i C:\path o\your\private_key.ppk [email protected]

傳輸輸出到文件

你可以將 PLINK 執行的遠端命令的輸出重定向到本地文件。

plink [email protected] "cat /etc/nginx/nginx.conf" > nginx_config.txt

執行多個命令

通過將命令用引號括起來,可以在遠端執行多個命令。

plink [email protected] "cd /var/www/html && git pull origin main"

3. 免密碼登錄 (使用私鑰和 PuTTYgen)

為了實現免密碼登錄,你需要:

  1. 生成 OpenSSH 密鑰對 (如果還沒有)。 在 Linux/WSL/Git Bash 中:ssh-keygen -t rsa -b 4096

  2. 將公鑰部署到遠端伺服器。 使用 ssh-copy-id 或手動將公鑰內容添加到遠端伺服器的 ~/.ssh/authorized_keys 文件中。

  3. 使用 PuTTYgen 將私鑰轉換為 .ppk 格式

    • 打開 PuTTYgen。
    • 點擊 Load,選擇你的 OpenSSH 私鑰文件 (id_rsa)。
    • 輸入私鑰的密碼(如果有)。
    • 點擊 Save private key,將其保存為 .ppk 格式。你可以選擇不設置密碼。
  4. 使用 PLINK 和 .ppk 文件連接

    plink -i C:\path o\your\id_rsa.ppk [email protected] "your_command"
  • -ssh:強制使用 SSH 協議。
  • -batch:防止 PLINK 提示用戶輸入密碼或接受主機密鑰(適用於腳本)。
  • -pw password:直接在命令行中提供密碼(不安全,應盡量避免)。
  • -N:不執行遠端命令,僅用於端口轉發(隧道)。
  • -L, -R, -D:用於本地、遠端、動態端口轉發(SSH 隧道)。

5. 與批處理文件和 PowerShell 腳本結合

PLINK 在自動化任務中非常有用。

批處理文件範例 (deploy.bat)

@echo off
set KEY="C:\path o\your\private_key.ppk"
set REMOTE_DIR=/var/www/html

echo 連接到 %HOST% 並部署...
plink -i %KEY% %HOST% "cd %REMOTE_DIR% && git pull origin main && npm install && npm run build"
if %ERRORLEVEL% NEQ 0 (
echo 部署失敗!
exit /b %ERRORLEVEL%
)
echo 部署成功!

總結

PLINK 是 Windows 用戶在命令行環境中執行 SSH 和其他遠端連接的強大工具。它在自動化腳本、CI/CD 流程以及無需圖形界面的遠端操作中扮演著重要角色。通過理解其基本用法和如何與私鑰文件結合,可以大大提高遠端管理的效率和安全性。

資料庫前端備忘錄

這篇備忘錄記錄了資料庫前端。

資訊

資料庫前端通常指那些用於管理、可視化或與後端資料庫交互的用戶界面應用程式。這些應用程式可以是桌面應用、網頁應用或 CLI 工具,它們提供了一種非程式設計師也能輕鬆操作資料庫的方式。

1. 資料庫前端的類型

A. 桌面資料庫管理工具

這些是安裝在本地電腦上的獨立應用程式,通常功能非常強大,支持多種資料庫類型。

  • DBeaver:一個通用資料庫客戶端,支持幾乎所有主流資料庫(MySQL, PostgreSQL, Oracle, SQL Server, SQLite 等)。提供數據編輯器、SQL 編輯器、ERD 繪製等功能。
  • DataGrip (by JetBrains):專為資料庫開發者設計的 IDE,支持多種資料庫,提供智能程式碼補全、重構工具、數據導出等高級功能。
  • TablePlus:一個現代化的原生資料庫管理工具,支持多種資料庫,界面簡潔美觀,響應迅速。
  • SQL Server Management Studio (SSMS):微軟官方的 SQL Server 管理工具。
  • MySQL Workbench:MySQL 官方的圖形化工具,用於資料庫設計、開發和管理。

B. 基於網頁的資料庫管理工具

這些工具運行在瀏覽器中,通常更容易部署和跨平台訪問,但功能可能相對簡潔。

  • phpMyAdmin:最廣泛使用的 MySQL/MariaDB 網頁管理工具,基於 PHP 開發。
  • Adminer:單文件 PHP 腳本,支持多種資料庫,比 phpMyAdmin 更輕量。
  • pgAdmin:PostgreSQL 官方的網頁管理界面。
  • Metabase / Superset:這類工具更側重於數據可視化和商業智能 (BI),允許用戶通過拖放界面創建儀表板和報告,而非直接進行資料庫管理操作。

C. CLI 資料庫客戶端

對於熟悉命令行的開發者和資料庫管理員,CLI 工具效率更高。

  • psql (PostgreSQL):PostgreSQL 的官方命令行客戶端。
  • mysql (MySQL):MySQL 的官方命令行客戶端。
  • sqlite3 (SQLite):SQLite 的官方命令行客戶端。

D. 自定義網頁前端

在許多應用程式中,前端開發者會為特定需求構建自定義的網頁界面,以便用戶能夠方便地與資料庫交互(通過後端 API)。

  • 技術棧:React, Vue, Angular (前端框架) + Node.js (Express), Python (Django/Flask), Ruby on Rails (後端框架)。
  • 用途:企業內部管理系統、CRM、CMS、數據儀表板等。

2. 選擇合適的工具

選擇資料庫前端工具時,考慮以下因素:

  • 資料庫類型:你使用的資料庫是什麼?(MySQL, PostgreSQL, SQL Server, MongoDB, Redis 等)
  • 功能需求:你需要什麼功能?(數據編輯、SQL 查詢、ERD 設計、數據導入導出、性能監控、用戶管理等)
  • 使用習慣:你偏好桌面應用、網頁應用還是命令行?
  • 團隊協作:團隊成員是否需要共享訪問或使用相同的工具?
  • 安全考量:特別是對於網頁工具,需要考慮認證和授權。
  • 預算:開源免費工具還是商業付費工具?

3. 常見操作

無論使用哪種資料庫前端,常見的操作包括:

  • 連接資料庫:配置連接參數(主機、端口、用戶名、密碼、資料庫名稱)。
  • 執行 SQL 查詢:編寫並執行 SQL 語句。
  • 瀏覽和編輯數據:以表格形式查看數據並直接修改。
  • 管理表結構:創建、修改、刪除表、索引、視圖等。
  • 導入/導出數據:將數據從文件導入資料庫,或將資料庫數據導出到文件(CSV, JSON, SQL)。
  • 用戶和權限管理:創建用戶、分配角色和權限。

總結

資料庫前端工具極大地簡化了與資料庫的交互,使得開發者和非技術用戶都能高效地管理數據。從功能豐富的桌面 IDE 到輕量級的網頁客戶端,再到簡潔的 CLI 工具,選擇最適合你需求的工具是提高工作效率的關鍵。

SSH 公鑰認證

這篇備忘錄記錄了 SSH 公鑰認證。

資訊

SSH (Secure Shell) 公鑰認證是一種比密碼認證更安全、更便捷的遠端登錄方式。它使用非對稱加密(公鑰和私鑰對)來驗證用戶身份,無需每次都輸入密碼。

1. 原理

SSH 公鑰認證涉及兩部分:

  • 私鑰 (Private Key):保存在你的本地電腦上,是秘密的,絕對不能洩露
  • 公鑰 (Public Key):放置在你要連接的遠端伺服器上,可以公開分享。

當你嘗試連接遠端伺服器時:

  1. 客戶端向伺服器發送連接請求,並提供你的用戶名和公鑰 ID。
  2. 伺服器檢查其 ~/.ssh/authorized_keys 文件中是否有匹配的公鑰。
  3. 如果找到匹配的公鑰,伺服器會生成一個隨機字串,並使用該公鑰加密。
  4. 伺服器將加密後的字串發送回客戶端。
  5. 客戶端使用其私鑰解密該字串,並將解密後的內容發送回伺服器。
  6. 伺服器將收到的解密內容與其原始隨機字串進行比較。如果匹配,則表示客戶端擁有正確的私鑰,驗證成功,允許登錄。

2. 設置步驟

A. 生成 SSH 密鑰對 (在本地電腦上)

  1. 打開終端 (Linux/macOS) 或 Git Bash/WSL (Windows)。

  2. 運行 ssh-keygen 命令。

    ssh-keygen -t rsa -b 4096 -C "[email protected]"
    • -t rsa:指定生成 RSA 算法的密鑰。
    • -b 4096:指定密鑰長度為 4096 位 (建議長度,比默認的 2048 位更安全)。
    • -C "[email protected]":添加註釋,通常是你的電子郵件地址,便於識別。
  3. 系統會提示你輸入文件儲存位置。默認通常是 ~/.ssh/id_rsa。直接按 Enter 即可使用默認路徑。

  4. 系統會提示你輸入密碼 (passphrase)。強烈建議設置一個密碼,這會為你的私鑰提供額外的保護。每次使用私鑰時都需要輸入此密碼。如果你不希望每次都輸入密碼,可以留空(不推薦)。

生成成功後,你會在 ~/.ssh/ 目錄下看到兩個文件:

  • id_rsa:你的私鑰 (Private Key)。
  • id_rsa.pub:你的公鑰 (Public Key)。

B. 將公鑰複製到遠端伺服器

有兩種主要方法:

i. 使用 ssh-copy-id (推薦)

ssh-copy-id 是一個非常方便的工具,它會自動將你的公鑰複製到遠端伺服器的 ~/.ssh/authorized_keys 文件中。

ssh-copy-id user@remote_host
  • user:你在遠端伺服器上的用戶名。
  • remote_host:遠端伺服器的 IP 地址或域名。

系統會提示你輸入遠端伺服器的密碼(第一次連接時),然後它會完成其餘的工作。

ii. 手動複製

如果你無法使用 ssh-copy-id,可以手動複製公鑰。

  1. 在本地查看公鑰內容

    cat ~/.ssh/id_rsa.pub

    複製完整的輸出內容(從 ssh-rsa 開始到你的電子郵件地址結束)。

  2. 連接到遠端伺服器 (使用密碼或已有的其他認證方式)。

    ssh user@remote_host
  3. 在遠端伺服器上創建 .ssh 目錄 (如果不存在) 並設置正確的權限。

    mkdir -p ~/.ssh
    chmod 700 ~/.ssh
  4. 將公鑰添加到 authorized_keys 文件

    echo "你的公鑰內容" >> ~/.ssh/authorized_keys
    chmod 600 ~/.ssh/authorized_keys

    "你的公鑰內容" 替換為你在步驟 1 中複製的公鑰字串。

  5. 設置 authorized_keys 文件的權限

    chmod 600 ~/.ssh/authorized_keys

    正確的權限非常重要,否則 SSH 服務器會拒絕使用該文件。

C. 測試連接

設置完成後,嘗試使用 SSH 連接到遠端伺服器:

ssh user@remote_host

如果一切順利,系統會提示你輸入私鑰的密碼 (如果你設置了),然後你就可以成功登錄而無需輸入遠端伺服器的用戶密碼。

3. SSH Agent (可選)

如果你設置了私鑰密碼,每次連接時都會被提示輸入。SSH Agent 可以幫助你解決這個問題。它是一個程序,在記憶體中保存你的解密私鑰,這樣你在一個會話中只需輸入一次密碼。

eval "$(ssh-agent -s)" # 啟動 ssh-agent
ssh-add ~/.ssh/id_rsa # 添加私鑰 (會提示輸入密碼)

4. 禁用密碼認證 (推薦)

為了進一步提高安全性,一旦確認公鑰認證正常工作,你可以在遠端伺服器的 SSH 配置中禁用密碼認證。

  1. 在遠端伺服器上編輯 SSH 服務器配置文件

    sudo vim /etc/ssh/sshd_config
  2. 查找並修改以下行

    PasswordAuthentication no

    (確保前面沒有 # 注釋符號)

  3. 重啟 SSH 服務

    sudo systemctl restart sshd # 或 sudo service ssh restart

總結

SSH 公鑰認證是遠端伺服器管理的基本安全實踐。它提供了更高的安全性、便利性和自動化潛力。遵循這些步驟,你可以輕鬆地為你的伺服器設置公鑰認證,並享受更安全高效的遠端連接。

CSS Grid 備忘錄

這篇備忘錄記錄了 CSS Grid。

資訊

CSS Grid Layout 是一個強大的二維佈局系統,它允許你將網頁內容劃分為行和列,並將元素精確放置在這些網格單元中。它非常適合於設計複雜的網頁佈局,提供了比 Flexbox(一維佈局)更全面的控制。

1. 核心概念

  • 網格容器 (Grid Container):應用 display: griddisplay: inline-grid 的元素。
  • 網格項目 (Grid Items):網格容器的直接子元素。
  • 網格線 (Grid Lines):構成網格的水平和垂直分隔線。
  • 網格軌道 (Grid Tracks):網格線之間的空間,可以是行 (grid-row) 或列 (grid-column)。
  • 網格單元 (Grid Cells):一個網格軌道交叉形成的最小單位。
  • 網格區域 (Grid Areas):由多個網格單元組成的矩形區域。

2. 創建網格容器

要創建一個網格佈局,首先將元素的 display 屬性設置為 gridinline-grid

.container {
display: grid;
/* 其他網格屬性 */
}

3. 定義網格軌道 (行和列)

grid-template-columnsgrid-template-rows

這些屬性定義了網格的列和行的數量和大小。

  • 固定大小:使用 px, em, rem, % 等單位。
    .container {
    grid-template-columns: 100px 200px auto; /* 三列:100px, 200px, 剩餘空間 */
    grid-template-rows: 50px 1fr; /* 兩行:50px, 剩餘空間 */
    }
  • fr 單位 (Fraction):表示網格容器中可用空間的比例。
    .container {
    grid-template-columns: 1fr 2fr 1fr; /* 三列,比例為 1:2:1 */
    }
  • repeat() 函數:用於重複定義軌道。
    .container {
    grid-template-columns: repeat(3, 1fr); /* 創建三列,每列佔用相同比例的空間 */
    grid-template-rows: repeat(2, 100px); /* 創建兩行,每行 100px */
    }
  • minmax() 函數:設置軌道大小的最小和最大值。
    .container {
    grid-template-columns: repeat(3, minmax(100px, 1fr)); /* 每列最小 100px,最大 1fr */
    }

4. 網格項目放置

根據網格線放置

  • grid-column-start, grid-column-end, grid-row-start, grid-row-end
  • 簡寫:grid-column, grid-row
.item1 {
grid-column-start: 1; /* 從第 1 條垂直網格線開始 */
grid-column-end: 3; /* 在第 3 條垂直網格線結束 (佔用第 1 和第 2 列) */
/* 或者簡寫:grid-column: 1 / 3; */

grid-row: 1 / span 2; /* 從第 1 條水平網格線開始,跨越 2 行 */
}

根據網格區域放置

  1. 定義網格區域:使用 grid-template-areas 在網格容器上定義具名區域。
    .container {
    grid-template-areas:
    "header header header"
    "nav main aside"
    "footer footer footer";
    }
  2. 將項目放置到區域:使用 grid-area 屬性將網格項目分配給這些區域。
    .header { grid-area: header; }
    .nav { grid-area: nav; }
    .main { grid-area: main; }
    .aside { grid-area: aside; }
    .footer { grid-area: footer; }

5. 網格間距 (Gutters)

使用 gap, row-gap, column-gap 設置網格軌道之間的間距。

.container {
gap: 10px; /* 行間距和列間距都是 10px */
/* 或者分別設置 */
/* row-gap: 10px; */
/* column-gap: 15px; */
}

6. 對齊內容

容器級對齊 (對齊網格內的網格項目)

  • justify-items (水平方向)
  • align-items (垂直方向)
  • 簡寫:place-items

值:start, end, center, stretch (默認)

.container {
justify-items: center; /* 所有項目在網格單元中水平居中 */
align-items: center; /* 所有項目在網格單元中垂直居中 */
}

項目級對齊 (對齊單個網格項目)

  • justify-self (水平方向)
  • align-self (垂直方向)
  • 簡寫:place-self

值:start, end, center, stretch (默認)

.item1 {
justify-self: end; /* 在其網格單元中水平靠右 */
align-self: start; /* 在其網格單元中垂直靠上 */
}

對齊網格軌道 (當網格容器有額外空間時)

  • justify-content (水平方向)
  • align-content (垂直方向)
  • 簡寫:place-content

值:start, end, center, stretch, space-around, space-between, space-evenly

.container {
height: 500px; /* 確保容器有足夠的額外空間 */
justify-content: space-around; /* 軌道之間和兩側均勻分佈空間 */
align-content: center; /* 將所有行居中對齊 */
}

7. 總結

CSS Grid Layout 是一個強大的二維佈局工具,它提供了一種直觀且靈活的方式來創建複雜的網頁佈局。通過理解其核心概念(容器、項目、軌道、線、區域)以及各種屬性(如 grid-template-areasgap、對齊屬性),你可以設計出響應式且結構良好的網頁。

USB 3.0 備忘錄

這篇備忘錄記錄了 USB 3.0。

資訊

USB 3.0(現在通常稱為 USB 3.2 Gen 1)是通用序列匯流排 (Universal Serial Bus, USB) 標準的一個重要版本,它顯著提高了數據傳輸速度並引入了更高的供電能力,使其成為連接各種外設的普及接口。

1. USB 3.0 的主要特性

  • 超高速 (SuperSpeed):USB 3.0 的主要改進是其數據傳輸速度。理論最高速度為 5 Gbps (Gigabits per second),大約是 USB 2.0 (480 Mbps) 的 10 倍。
    • 值得注意的是,實際速度會受到設備、控制器和線纜質量的影響。
  • 全雙工傳輸:與 USB 2.0 的半雙工不同,USB 3.0 支持全雙工數據傳輸,這意味著數據可以同時雙向傳輸,進一步提高了效率。
  • 更高的供電能力
    • USB 3.0 端口可以提供高達 900 mA 的電流,而 USB 2.0 只能提供 500 mA。這對於為移動設備充電或驅動高功耗外設(如便攜式硬碟)非常有用。
    • 它還引入了 USB Battery Charging (BC) 1.2 規範,允許設備以更高的電流充電,即使在數據端口閒置或關閉時。
  • 向後兼容性:USB 3.0 端口和設備完全向後兼容 USB 2.0 和 USB 1.1 設備。然而,當連接到舊版設備時,速度會降至舊標準的最高速度。
  • 新的接口顏色:為了區分 USB 3.0 端口和舊版端口,USB 3.0 端口內部通常會使用 藍色 進行標識。USB 3.0 線纜也通常更粗,並且在接口處有額外的數據引腳。

2. 接口類型和連接器

USB 3.0 引入了新的連接器類型,以支持其更高的數據傳輸需求。

  • USB 3.0 Type-A:與 USB 2.0 Type-A 向後兼容,但在內部有額外的引腳,通常為藍色。
  • USB 3.0 Type-B:比 USB 2.0 Type-B 更大,因為增加了額外的引腳。通常用於印表機、掃描儀等設備。
  • USB 3.0 Micro-B:比 USB 2.0 Micro-B 更大,由兩個部分組成。常見於便攜式硬碟。
  • USB Type-C:雖然 Type-C 接口本身不是 USB 3.0 獨有,但它被設計為支持 USB 3.0(現在是 USB 3.2 Gen 1)及更高版本。Type-C 是可逆的,支持更高的功率傳輸和多種替代模式。

3. USB 3.0 的演進:USB 3.1, 3.2, 4

USB 標準的命名在歷史上有些混亂。以下是一些主要版本:

  • USB 3.0:最初的 "SuperSpeed USB",最高 5 Gbps。現在正式名稱為 USB 3.2 Gen 1
  • USB 3.1
    • USB 3.1 Gen 1:與 USB 3.0 相同,最高 5 Gbps。
    • USB 3.1 Gen 2:引入 "SuperSpeed USB 10 Gbps",最高 10 Gbps。現在正式名稱為 USB 3.2 Gen 2
  • USB 3.2
    • USB 3.2 Gen 1:5 Gbps (與 USB 3.0 相同)。
    • USB 3.2 Gen 2:10 Gbps (與 USB 3.1 Gen 2 相同)。
    • USB 3.2 Gen 2x2:引入 "SuperSpeed USB 20 Gbps",通過兩個通道實現最高 20 Gbps。這通常需要 Type-C 接口。
  • USB4:基於 Thunderbolt 3 協議,最高 40 Gbps,通常使用 Type-C 接口。

:::warning 總結當前命名規則

  • USB 3.2 Gen 1 = USB 3.0 = 5 Gbps
  • USB 3.2 Gen 2 = USB 3.1 Gen 2 = 10 Gbps
  • USB 3.2 Gen 2x2 = 20 Gbps (僅限 Type-C)
  • USB4 = 40 Gbps (僅限 Type-C) :::

4. 常見應用

  • 外部儲存設備:便攜式硬碟、SSD,受益於高速傳輸。
  • 顯示適配器:USB 3.0 顯示適配器允許連接額外顯示器。
  • 擴展塢:提供多種接口擴展,如 Ethernet、HDMI、USB 端口。
  • 充電:快速充電手機和平板電腦。

總結

USB 3.0 及其後續版本為數據傳輸和設備供電帶來了顯著的提升,極大地促進了外部設備的性能和多功能性。儘管命名有些複雜,但了解其核心特性和演進有助於選擇和利用正確的硬體。