利用 AutoHotkey 在 Windows 模仿 macOS 的 Cmd + ` 切換應用視窗

身為一個長年使用 Windows 的使用者,自從入手 MacBook Air M1 之後,我深深體會到 Cmd+ 的便利性,特別是在同一個應用程式內切換不同視窗的流暢體驗。對於 Windows 使用者來說,通常需要 Alt+Tab 來回切換所有應用程式,無法限制在單一應用內。而這篇文章將教你如何透過 AutoHotkey 1.0 實現類似的快捷操作,讓你在同一個程式中快速切換不同的視窗。繼續閱讀...

Home Assistant 的 Yaml 處理換行字元發送 Line Push Message (Restful Request)

本篇並無一步一步地教學如何設定 Home Assistant 以將 Gmail 通知發送到 LINE,而是特別關注如何正確處理換行字元(“\n”)。這個看似簡單的需求,可能會由於 YAML、JSON 和各種 API 之間的複雜性而帶來許多頭痛的問題。

篇幅將專注在如何確保 LINE 訊息中的換行字元號正確顯示的問題。繼續閱讀...

自 Aegis Authenticator 匯出明文 json 轉入 PowertoysRunTOTP by KawaiiZapic

這篇文章將介紹如何將 Aegis Authenticator 中的明文 JSON 資料匯出並轉換為 PowertoysRunTOTP 所需的格式,幫助你將雙因素驗證(2FA)帳號從 Aegis 匯入到 PowerToys Run TOTP 擴充套件中。

警告:請勿將明文 JSON 文件長時間保留在電腦中。建議將其存放在加密的存儲空間中,如 pCloud Crypto,或者使用 7zip 壓縮並設置安全密碼來保護文件。

步驟 1:匯出 Aegis Authenticator 明文 JSON

首先,從 Aegis Authenticator 中匯出你的 2FA 帳號資料。確保匯出的文件是明文 JSON 格式,並保存到一個安全的位置,例如 C:\path\to\aegis_export.json

步驟 2:編寫 PowerShell 腳本

編寫一個 PowerShell 腳本來轉換 Aegis 匯出的 JSON 文件為 PowertoysRunTOTP 所需的格式。以下是完整的腳本,你可以用記事本複製貼上,並儲存為 .ps1 檔案例如 convert_aegis_to_powertoysrun.ps1

$inputFilePath = "P:\Crypto Folder\aegis.json"
$outputFilePath = "$env:LOCALAPPDATA\Microsoft\PowerToys\PowerToys Run\Settings\Plugins\Community.PowerToys.Run.Plugin.TOTP\OTPList.json_new"
try {
    # Read the Aegis JSON file and ensure it uses UTF-8 encoding
    $jsonContent = Get-Content -Raw -Path $inputFilePath -Encoding UTF8

    # Check if the JSON file is empty
    if ($jsonContent -eq $null -or $jsonContent.Trim() -eq "") {
        throw "The Aegis JSON file is empty or contains no content"
    }

    try {
        # Parse the JSON file
        $aegisData = $jsonContent | ConvertFrom-Json
    } catch {
        throw "JSON parsing error: $_"
    }

    # Prepare the JSON structure for PowerToysRunTOTP
    $powerToysRunTOTP = @{
        Version = 2
        Entries = @()
    }

    # Check the structure of the Aegis JSON file
    if ($aegisData.db.entries -ne $null) {
        # Iterate over Aegis entries and extract necessary data
        foreach ($entry in $aegisData.db.entries) {
            $newEntry = @{
                Name = "$($entry.issuer): $($entry.name)"
                Key = $entry.info.secret
                IsEncrypted = $false
            }
            $powerToysRunTOTP.Entries += $newEntry
        }
    } else {
        throw "Entries in the Aegis JSON file are empty or not found"
    }

    # Write the converted data to the PowerToysRunTOTP JSON file
    $powerToysRunTOTP | ConvertTo-Json -Depth 3 | Set-Content -Path $outputFilePath -Encoding UTF8

    Write-Host "Aegis JSON conversion successful and saved to $outputFilePath"
} catch {
    Write-Host "An error occurred during the conversion process: $_"
}

步驟 3:執行 PowerShell 腳本

方法一:在 Windows 10 或更高版本上右鍵執行

  1. 確保 PowerToys 已關閉。這樣可以避免 PowertoysRun OTP 擴充套件在執行過程中覆蓋使用者編輯的文件。
  2. 打開檔案總管,找到你保存的 PowerShell 腳本文件,例如 convert_aegis_to_powertoysrun.ps1
  3. 右鍵點擊該文件,選擇「以 PowerShell 執行」。
  4. 如果看到 Windows 安全警告,請選擇「更多資訊」然後點擊「仍要執行」。

方法二:使用 PowerShell 命令執行

  1. 確保 PowerToys 已關閉。這樣可以避免 PowertoysRun OTP 擴充套件在執行過程中覆蓋使用者編輯的文件。
  2. 按下 Win + X 鍵,選擇「Windows PowerShell(管理員)」或「Windows 終端機(管理員)」。
  3. 在 PowerShell 視窗中,輸入以下命令,不要按下 Enter (-File 後面有帶一個空格):
    PowerShell -ExecutionPolicy Bypass -File 
  4. 打開檔案總管,找到你保存的 PowerShell 腳本文件。
  5. 將該文件拖曳到 PowerShell 視窗中。這樣會自動填入文件的完整路徑。
  6. 確認命令如下所示,然後按下 Enter 鍵執行:
    PowerShell -ExecutionPolicy Bypass -File  "C:\path\to\convert_aegis_to_powertoysrun.ps1"

步驟 4:驗證匯入結果

  1. 打開 PowerToys,這將自動啟動 TOTP 擴充套件。
  2. PowertoysRun TOTP 擴充套件啟動後,會自動加密 OTPList.json 文件中的資料。
  3. 打開 PowerToys Run 並檢查是否成功匯入了你的 2FA 帳號。如果一切順利,你應該可以看到你匯入的帳號並使用它們進行身份驗證。

總結

通過以上步驟,我們成功地將 Aegis Authenticator 匯出的明文 JSON 文件轉換並匯入到 PowertoysRunTOTP 中。這種方法可以幫助你輕鬆地管理你的 2FA 帳號,並在不同的裝置之間進行遷移。
如果你覺得文章對你有幫助,歡迎在下方留言、按下笑臉或分享給其他人知道。

若有相關的建議也歡迎留言!

WordPress Docker 維運部署筆記

推薦 Portainer 方便圖形化管理

Docker Compose

若擔心 latest 會每次 pull 重新部署就弄壞的話,就自己挑選合適版本號定下來。

version: "4.5"

services:
  tsumugi-db:
    image: mariadb:latest
    volumes:
      - tsumugi-mariadb_data:/var/lib/mysql
    restart: always
    environment:
      MARIADB_ROOT_PASSWORD: your-mariadb-root-pwd
      MARIADB_DATABASE: your-wordpress-db
      MARIADB_USER: yourDbUserForWp
      MARIADB_PASSWORD: yourMariaDbPassword

  tsumugi-wordpress:
    depends_on:
      - tsumugi-db
    #links:
    #  - mariadb:mysql
    image: wordpress:latest
    volumes:
      - tsumugi-wordpress_data:/var/www/html
      - tsumugi-wordpress_php:/usr/local/etc/php

    restart: always
    environment:
      WORDPRESS_DB_HOST: tsumugi-db
      WORDPRESS_DB_USER: yourDbUserForWp
      WORDPRESS_DB_PASSWORD: yourMariaDbPassword
      WORDPRESS_DB_NAME: your-wordpress-db

  zunda-db:
    image: mariadb:latest
    volumes:
      - zundamon-mariadb_data:/var/lib/mysql
    restart: always
    environment:
      MARIADB_ROOT_PASSWORD: some-mariadb-root-pwd
      MARIADB_DATABASE: zundamon-wordpress
      MARIADB_USER: zundamochi114514
      MARIADB_PASSWORD: some-mariadb-password

  zundamon-wordpress:
    depends_on:
      - zunda-db
    image: wordpress:latest
    volumes:
      - zundamon-wordpress_data:/var/www/html
      - zundamon-wordpress_php:/usr/local/etc/php
    restart: always
    environment:
      WORDPRESS_DB_HOST: zunda-db
      WORDPRESS_DB_USER: zundamochi114514
      WORDPRESS_DB_PASSWORD: some-mariadb-password
      WORDPRESS_DB_NAME: zundamon-wordpress
      WORDPRESS_TABLE_PREFIX: wpzundamochi_

  https-portal:
    image: steveltn/https-portal:1
    ports:
      - "192.168.19.19:80:80"
      - "192.168.19.19:443:443"
    restart: always
    environment:
      DOMAINS: 'www.zundamon-kawaii.com -> http://tsumugi-wordpress:80, blog.zundamon.co.jp -> http://zundamon-wordpress:80, www.zundamon.co.jp -> http://zundamon-wordpress:80, zundamon.co.jp -> http://zundamon-wordpress:80'
      CLIENT_MAX_BODY_SIZE: 500M
      STAGE: 'production' # Don't use production until staging works
      # FORCE_RENEW: 'true'
    volumes: 
      - https-portal-data:/var/lib/https-portal

volumes:
  tsumugi-mariadb_data: {}
  tsumugi-wordpress_data: {}
  tsumugi-wordpress_php: {}
  zundamon-mariadb_data: {}
  zundamon-wordpress_data: {}
  zundamon-wordpress_php : {}
  https-portal-data: {}

除錯

  • 瀏覽器 開發者 Console 印出 413 Request entity too large
    • https-portal 需要調整環境變數 
CLIENT_MAX_BODY_SIZE: 500M

附帶一提我不小心在 500M 後面加上分號變成 \CLIENT\_MAX\_BODY\_SIZE: 500M;\ 結果容器還是運行,但是顯然網站沒有回應。
查詢 https-portal 的 error.log 會出現以下特徵錯誤訊息,我的 Volume 配置是位處 dd87****87b 資料夾

2024/07/19 13:52:01 [emerg] 59#59: unexpected ";" in /etc/nginx/nginx.conf:56
  • 無法上傳大於 2MB 的檔案到 WordPress
    • 由於我的 Compose 配置已將 PHP 直接對應到 Volume,所以可以 sudo dolphin /var/lib/docker/volumes/yourstack-zundamon-wordpress_php/_data/conf.d 新增 uploads.ini 撰寫內容如下
file_uploads = On
memory_limit = 500M
upload_max_filesize = 500M
post_max_size = 500M
max_execution_time = 600

Backup Script

#!/bin/bash

# 定義變量
NFS_SERVER="192.168.x.x" #目的地 Hostname
NFS_PATH="/volume1/Backup-NFS" #目的地目錄
LOCAL_PATHS=(
    "/var/lib/docker/volumes/yourblog_mariadb_data/_data"
    "/var/lib/docker/volumes/yourblog_wordpress_data/_data"
#...自己新增與調整,字串結尾不需要逗號
)
MOUNT_POINT="/mnt/backup_nfs"
DATE_NOW=$(date +'%Y%m%d%H%M%S')
BACKUP_FILE="$MOUNT_POINT/web/websiteBackup_$DATE_NOW.tar.gz"

# 創建掛載點
mkdir -p $MOUNT_POINT

# 檢查 NFS 是否已經掛載
mountpoint -q $MOUNT_POINT
if [ $? -ne 0 ]; then
  echo "掛載 NFS 共享目錄..."
  mount -t nfs $NFS_SERVER:$NFS_PATH $MOUNT_POINT

  if [ $? -ne 0 ]; then
    echo "掛載 NFS 共享目錄失敗"
    exit 1
  fi
fi

# 壓縮並備份數據
tar -czf $BACKUP_FILE -C / ${LOCAL_PATHS[@]}

# 刪除多餘的備份
find $MOUNT_POINT -name "websiteBackup_*.tar.gz" -type f -print | while read FILE; do
    FILE_DATE=$(basename $FILE | sed 's/websiteBackup_\(.*\)\.tar\.gz/\1/')
    FILE_EPOCH=$(date -d "${FILE_DATE:0:8}" +%s)
    NOW_EPOCH=$(date +%s)
    AGE=$(( (NOW_EPOCH - FILE_EPOCH) / 86400 ))

    if [ $AGE -le 7 ]; then
        # 保留7天內的每日一份
        continue
    elif [ $AGE -le 30 ]; then
        # 保留一個月內的每週一份
        FILE_DAY=$(date -d "${FILE_DATE:0:8}" +%u)
        if [ $FILE_DAY -eq 1 ]; then
            continue
        fi
    elif [ $AGE -le 365 ]; then
        # 保留一年內的每月一份
        FILE_DAY=$(date -d "${FILE_DATE:0:8}" +%d)
        if [ $FILE_DAY -eq 1 ]; then
            continue
        fi
    elif [ $AGE -gt 365 ]; then
        # 保留每年的第一天
        FILE_MONTH_DAY=$(date -d "${FILE_DATE:0:8}" +%m%d)
        if [ $FILE_MONTH_DAY -eq "0101" ]; then
            continue
        fi
    fi

    # 刪除不符合保留規則的文件
    rm -f $FILE
done

crontab -e 搭配 micro 編輯器

解決 Steam Deck 切換到桌面模式黑畫面的問題

當您在嘗試切換至 Steam Deck 的桌面模式時遇到黑畫面,這可能會讓人感到沮喪。然而,有一個簡單的解決方案可以幫助解決這個問題。以下是解決問題的逐步指南:

解決方法

  1. 切換帳號:

    • 首先通過遊戲介面登入一個新的 Steam 帳號。
    • 使用這個新帳號切換至桌面模式。
    • 如果切換成功,接著刪除位於 Home/.local/share/kscreenHome/.local/share/kscreen/outputs 的所有檔案(不包括資料夾)。
    • 為了安全起見,您可以選擇先將這些檔案剪下並備份到其他地方,然後再從原始位置刪除。
    • 備份後,切換回遊戲模式,登入原本出現問題的帳號,再次嘗試切換至桌面模式。問題現在應該已經解決。
  2. 對於已安裝 Decky 擴充套件框架的用戶:

    • 確保您已經安裝了 Decky 擴充套件框架,並且事先設定好 root 密碼。
    • 安裝 Decky Terminal 擴充套件。
    • 執行 sudo -i 登入 root,然後執行以下命令:
      cd /home/deck/.local/share/kscreen
      rm *
      cd /home/deck/.local/share/kscreen/outputs
      rm *
      exit
    • 執行這些命令後,關閉 Terminal 並再次嘗試進入桌面模式;問題應該已經修復。
    • 建議創建一個名為 fix.sh 的腳本檔案,包含上述命令並將其存放在 /home/deck/。記得使用命令 sudo chmod +x /home/deck/fix.sh 使腳本可執行。

按照這些步驟操作,您應該能夠克服 Steam Deck 上的黑畫面問題,享受無縫的遊戲體驗。