跳至主要內容

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

· 1 分鐘閱讀

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)

· 1 分鐘閱讀

安裝相依套件

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 備忘錄

· 4 分鐘閱讀

這篇備忘錄記錄了 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 [email protected]
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 流程以及無需圖形界面的遠端操作中扮演著重要角色。通過理解其基本用法和如何與私鑰文件結合,可以大大提高遠端管理的效率和安全性。

資料庫前端備忘錄

· 4 分鐘閱讀

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

資訊

資料庫前端通常指那些用於管理、可視化或與後端資料庫交互的用戶界面應用程式。這些應用程式可以是桌面應用、網頁應用或 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 公鑰認證

· 5 分鐘閱讀

這篇備忘錄記錄了 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 備忘錄

· 4 分鐘閱讀

這篇備忘錄記錄了 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 備忘錄

· 4 分鐘閱讀

這篇備忘錄記錄了 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 接口。
總結當前命名規則
  • 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 及其後續版本為數據傳輸和設備供電帶來了顯著的提升,極大地促進了外部設備的性能和多功能性。儘管命名有些複雜,但了解其核心特性和演進有助於選擇和利用正確的硬體。

推薦遠端工作程式碼

· 3 分鐘閱讀

這篇備忘錄記錄了推薦用於遠端工作的程式碼相關工具和實踐。

資訊

遠端工作環境對開發者提出了新的挑戰,例如協作、程式碼同步和開發環境的一致性。選擇合適的工具和遵循最佳實踐可以顯著提高遠端團隊的生產力和效率。

1. 程式碼協作與版本控制

A. Git 和 GitHub/GitLab/Bitbucket

  • 核心:Git 是分布式版本控制系統的黃金標準。
  • 平台:GitHub、GitLab、Bitbucket 提供程式碼託管、PR/MR 審查、問題跟踪和 CI/CD 集成。
    • GitHub Codespaces / GitLab Web IDE:基於雲端的開發環境,允許直接在瀏覽器中編輯程式碼,無需本地設置。
    • PR/MR 審查:詳細的程式碼審查流程對於遠端團隊至關重要。

B. Live Share (VS Code)

  • 實時協作:Visual Studio Code 的 Live Share 擴展允許你實時共享程式碼、終端和調試會話,就像在同一個編輯器上工作一樣。對於遠端結對編程和故障排除非常有用。

2. 開發環境同步與虛擬化

A. 容器化 (Docker)

  • 環境一致性:使用 Docker 將應用程式及其所有依賴項打包成容器。這確保了無論在哪裡運行程式碼,開發環境都與生產環境相同,避免了「在我機器上可以跑」的問題。
    • Dockerfile:定義容器鏡像的構建步驟。
    • docker-compose.yml:定義多容器應用程式的服務。

B. 虛擬機 / WSL / Vagrant

  • 隔離環境
    • WSL (Windows Subsystem for Linux):對於 Windows 用戶,WSL 提供了無縫的 Linux 開發體驗。
    • Vagrant:用於自動化創建和配置虛擬機。確保團隊成員擁有相同的開發環境。
    • Dev Containers (VS Code):在 Docker 容器或 WSL 中創建一個功能齊全的開發環境,並直接在其中打開專案。這允許你在一個隔離的環境中安裝所有工具和依賴,而不會影響本地系統。

3. 遠端訪問與管理

A. SSH

  • 安全遠端訪問:SSH 是連接到遠端伺服器和執行命令的標準安全協議。
    • SSH 配置文件 (~/.ssh/config):簡化連接到多個遠端主機的過程。
    • SSH 密鑰:相比密碼更安全的身份驗證方式。

B. 遠端桌面 (RDP / VNC / NoMachine)

  • 圖形界面訪問:如果需要訪問遠端機器上的圖形界面應用程式,可以使用遠端桌面解決方案。
    • RDP (Remote Desktop Protocol):Windows 內置。
    • VNC (Virtual Network Computing):跨平台。
    • NoMachine:提供高性能的遠端桌面體驗。

C. Mosh (Mobile Shell)

  • 增強的 SSH:Mosh 是一個遠端終端應用程式,旨在提高移動網絡上的 SSH 體驗。它解決了 SSH 在網絡斷開時會話斷開的問題,並提供了更流暢的響應。

4. 持續集成與部署 (CI/CD)

  • 自動化流程:遠端團隊更依賴自動化來確保程式碼質量和快速部署。
    • GitHub Actions / GitLab CI/CD / Jenkins / CircleCI:自動化測試、構建和部署程式碼。
    • 程式碼質量工具:集成 Linting (ESLint, Pylint), 靜態分析 (SonarQube) 和自動化測試。

5. 通訊與協作工具

雖然不是程式碼本身,但這些工具對於遠端工作至關重要。

  • 即時通訊:Slack, Microsoft Teams, Discord。
  • 視頻會議:Zoom, Google Meet, Microsoft Teams。
  • 專案管理:Jira, Trello, Asana, Monday.com。
  • 文檔協作:Google Docs, Confluence, Notion。

總結

遠端工作的成功很大程度上取決於團隊如何有效地協作和管理他們的開發環境。通過採納 Git、Docker、VS Code Live Share 等工具,並利用 CI/CD 自動化,遠端團隊可以保持高效率、高質量的程式碼交付。

WinUI3 Button

· 3 分鐘閱讀

這篇備忘錄記錄了 WinUI3 中的 Button 控制項。

資訊

在 WinUI3 中,Button 是一個基本的交互式控制項,允許用戶通過點擊觸發應用程式中的操作。它通常用於提交表單、確認操作、導航或執行其他命令。

1. 基本用法

創建一個 Button 最簡單的方法是為其提供 Content 和處理 Click 事件。

<Button Content="點擊我" Click="MyButton_Click"/>

在後台程式碼中 (例如 MainWindow.xaml.cs):

// MainWindow.xaml.cs
using Microsoft.UI.Xaml;
using Microsoft.UI.Xaml.Controls;

namespace WinUI3App
{
public sealed partial class MainWindow : Window
{
public MainWindow()
{
this.InitializeComponent();
}

private void MyButton_Click(object sender, RoutedEventArgs e)
{
// 在這裡執行按鈕點擊時的操作
// 例如:
// MessageDialog dialog = new MessageDialog("按鈕被點擊了!", "提示");
// await dialog.ShowAsync();
if (sender is Button button)
{
button.Content = "已點擊!";
}
}
}
}

2. Button 的內容 (Content)

ButtonContent 屬性是 object 類型,這意味著你可以放置任何 UI 元素作為按鈕的內容,而不僅僅是文本。這使得 Button 非常靈活。

範例:文本

<Button Content="提交"/>

範例:圖標 (Icon)

通常使用 FontIconSymbolIcon 來顯示圖標。

<Button Click="SaveButton_Click">
<SymbolIcon Symbol="Save"/>
</Button>

範例:圖標和文本

你可以將 StackPanel 或其他佈局容器放置在 ButtonContent 中,以組合多個元素。

<Button Click="NewFileButton_Click">
<StackPanel Orientation="Horizontal">
<SymbolIcon Symbol="Document" Margin="0,0,8,0"/>
<TextBlock Text="新建檔案"/>
</StackPanel>
</Button>

範例:自定義圖像

<Button Click="ImageButton_Click">
<Image Source="ms-appx:///Assets/CustomIcon.png" Width="24" Height="24"/>
</Button>

3. 按鈕樣式 (Styling)

WinUI3 提供了多種內置樣式,你可以應用於按鈕,使其具有不同的視覺外觀和用途。

範例:主要按鈕 (Primary Button)

AccentButtonStyle 通常用於強調主要操作。

<Button Content="確認" Style="{StaticResource AccentButtonStyle}"/>

範例:其他標準樣式

WinUI3 提供了其他一些默認樣式,如:

  • Button (默認樣式)
  • TextButtonStyle (文本按鈕,沒有背景和邊框)
  • AppBarButtonStyle (應用程式欄按鈕樣式)
<Button Content="取消" Style="{StaticResource TextButtonStyle}"/>

範例:自定義樣式

你可以定義自己的樣式來完全控制按鈕的外觀。

<Grid>
<Grid.Resources>
<Style TargetType="Button" x:Key="CustomButtonStyle">
<Setter Property="Background" Value="LightBlue"/>
<Setter Property="Foreground" Value="DarkBlue"/>
<Setter Property="BorderBrush" Value="DarkBlue"/>
<Setter Property="BorderThickness" Value="2"/>
<Setter Property="Padding" Value="12,8"/>
<Setter Property="CornerRadius" Value="4"/>
<Setter Property="FontWeight" Value="SemiBold"/>
</Style>
</Grid.Resources>

<Button Content="自定義按鈕" Style="{StaticResource CustomButtonStyle}"/>
</Grid>

4. 命令綁定 (Commanding)

對於 MVVM (Model-View-ViewModel) 模式,你通常會使用命令綁定而不是直接處理 Click 事件。Button 支持 Command 屬性。

<Button Content="執行命令" Command="{Binding MyCommand}"/>

在你的 ViewModel 中:

// ViewModel (例如 MyViewModel.cs)
using CommunityToolkit.Mvvm.Input; // 假設你使用 CommunityToolkit.Mvvm

public class MyViewModel : ObservableObject
{
public IRelayCommand MyCommand { get; }

public MyViewModel()
{
MyCommand = new RelayCommand(ExecuteMyCommand, CanExecuteMyCommand);
}

private void ExecuteMyCommand()
{
// 執行命令邏輯
Console.WriteLine("命令已執行!");
}

private bool CanExecuteMyCommand()
{
// 判斷命令是否可以執行
return true;
}
}

總結

WinUI3 的 Button 控制項是一個功能豐富且高度可自定義的元素。無論是簡單的文本按鈕、帶圖標的複雜按鈕,還是使用命令綁定,它都提供了強大的能力來滿足你的 UI 交互需求。通過樣式化,你可以輕鬆地使其與你的應用程式設計語言保持一致。

WinUI3 MenuFlyoutIcon

· 3 分鐘閱讀

這篇備忘錄記錄了 WinUI3 中的 MenuFlyoutIcon

資訊

在 WinUI3 中,MenuFlyoutIcon 是一個用於在 MenuFlyoutItem 中顯示圖標的控制項。它允許你為上下文菜單或主菜單中的項目添加視覺提示,提高用戶界面的可讀性和用戶體驗。

1. MenuFlyoutItemIcon

MenuFlyoutItemMenuFlyout 中的一個可點擊的項目。它本身有一個 Icon 屬性,你可以直接在其中放置圖標控制項。

範例:使用 FontIcon

最常見的方式是使用 FontIcon 顯示一個字體圖標(例如來自 Segoe Fluent Icons 字體)。

<MenuFlyout>
<MenuFlyoutItem Text="新建檔案">
<MenuFlyoutItem.Icon>
<FontIcon Glyph="&#xE7C3;" /> <!-- &#xE7C3; 是檔案圖標的 Unicode -->
</MenuFlyoutItem.Icon>
</MenuFlyadItem>
<MenuFlyoutItem Text="開啟檔案">
<MenuFlyoutItem.Icon>
<FontIcon Glyph="&#xE8E5;" /> <!-- &#xE8E5; 是資料夾圖標的 Unicode -->
</MenuFlyoutItem.Icon>
</MenuFlyoutItem>
<MenuFlyoutSeparator />
<MenuFlyoutItem Text="儲存">
<MenuFlyoutItem.Icon>
<FontIcon Glyph="&#xE74E;" /> <!-- &#xE74E; 是儲存圖標的 Unicode -->
</MenuFlyoutItem.Icon>
</MenuFlyoutItem>
</MenuFlyout>

你也可以使用 SymbolIcon 來引用內置的 Symbol 枚舉,這更具可讀性。

<MenuFlyout>
<MenuFlyoutItem Text="新建檔案">
<MenuFlyoutItem.Icon>
<SymbolIcon Symbol="Document" />
</MenuFlyoutItem.Icon>
</MenuFlyoutItem>
<MenuFlyoutItem Text="開啟檔案">
<MenuFlyoutItem.Icon>
<SymbolIcon Symbol="Folder" />
</MenuFlyoutItem.Icon>
</MenuFlyoutItem>
<MenuFlyoutSeparator />
<MenuFlyoutItem Text="儲存">
<MenuFlyoutItem.Icon>
<SymbolIcon Symbol="Save" />
</MenuFlyoutItem.Icon>
</MenuFlyoutItem>
</MenuFlyout>

範例:使用 BitmapIcon

如果你想使用圖像文件(例如 PNG 或 SVG)作為圖標,可以使用 BitmapIcon

<MenuFlyout>
<MenuFlyoutItem Text="設定">
<MenuFlyoutItem.Icon>
<BitmapIcon UriSource="ms-appx:///Assets/SettingsIcon.png" ShowAsMonochrome="False"/>
</MenuFlyoutItem.Icon>
</MenuFlyoutItem>
</MenuFlyout>

確保 Assets/SettingsIcon.png 文件存在於你的專案中。ShowAsMonochrome="False" 確保圖像保持其原始顏色。

範例:使用 PathIcon

對於更複雜或自定義的矢量圖形,可以使用 PathIcon。這允許你使用 XAML 語法定義圖形路徑。

<MenuFlyout>
<MenuFlyoutItem Text="自定義圖標">
<MenuFlyoutItem.Icon>
<PathIcon Data="M10,10 L20,20 M10,20 L20,10" /> <!-- 簡單的交叉圖案 -->
</MenuFlyoutItem.Icon>
</MenuFlyoutItem>
</MenuFlyout>

2. 為什麼沒有 MenuFlyoutIcon 類?

值得注意的是,你不會在 WinUI3/UWP 的 API 文檔中找到一個名為 MenuFlyoutIcon 的直接類。這是因為 MenuFlyoutItem.Icon 屬性是一個 IconElement 類型,它是一個抽象基類。

因此,你實際上是在 MenuFlyoutItem.Icon 屬性中放置任何繼承自 IconElement 的具體圖標控制項(如 FontIconSymbolIconBitmapIconPathIcon)。這些都是用於顯示圖標的標準 WinUI 控制項,只是在 MenuFlyoutItem 的上下文中使用。

3. 最佳實踐

  • 一致性:在整個應用程式中保持圖標樣式和大小的一致性。
  • 可訪問性:確保圖標清晰可見,並考慮為視力受損用戶提供文本替代。
  • 易於理解:選擇直觀且普遍認可的圖標來代表其操作。
  • 主題適應性:如果使用 FontIconSymbolIcon,它們通常會自動適應應用程式的主題(淺色/深色模式)。對於 BitmapIcon,如果希望它們也能適應,可能需要提供不同主題下的圖像資源。

總結

在 WinUI3 中為 MenuFlyoutItem 添加圖標是通過其 Icon 屬性實現的,該屬性接受任何 IconElement 派生類。最常用的是 FontIconSymbolIcon,因為它們輕量且易於與應用程式主題集成。正確使用圖標可以顯著提高應用程式的可用性和視覺吸引力。