Duke Yin’s Technology database

SCSS 常用语法规则详解

1. 变量 (Variables) // 定义变量 $primary-color: #3498db; $font-size: 16px; $font-family: 'Arial', sans-serif; // 使用变量 body { color: $primary-color; font-size: $font-size; font-family: $font-family; } 解释:变量用于存储可重用的值,如颜色、字体、尺寸等,便于统一管理和维护。 编译后的 CSS: body { color: #3498db; font-size: 16px; font-family: 'Arial', sans-serif; } 2. 嵌套 (Nesting) nav { ul { margin: 0; padding: 0; list-style: none; li { display: inline-block; a { text-decoration: none; padding: 5px 10px; &:hover { color: red; } } } } } ...

2025-11-04 · 4 min · Duke Yin

GitHub Action: 自动发布WordPress主题插件新版本

主要功能 当主题或插件修改提交commit 并 push到Github时,自动打包主题插件发布一个Realease 判断当前版本号,如果与之前版本号相同则不发布 .releaseignore文件设置忽略的文件或文件夹,不打包进release 主题 必须按照WordPress主题开发规范,在style.css顶部注释版本号(Version:) 文件位置: .github/workflows/release-on-version-change.yml 内容: name: Release on version change on: push: branches: - main - master permissions: contents: write packages: write jobs: release: runs-on: ubuntu-latest steps: - name: Checkout repository uses: actions/checkout@v4 - name: Get previous commit hash id: prev run: | echo "prev_commit=$(git rev-parse HEAD^)" >> $GITHUB_ENV - name: Extract current version from style.css id: current_version run: | version=$(grep -E '^(Version:|版本:)' style.css | sed 's/.*[::] *//') if [ -z "$version" ]; then echo "❌ 未能在当前 style.css 中找到版本号" exit 1 fi echo "current_version=$version" >> $GITHUB_ENV echo "当前版本: $version" - name: Extract previous version from last commit id: prev_version run: | git show ${{ env.prev_commit }}:style.css > old_style.css || true version=$(grep -E '^(Version:|版本:)' old_style.css | sed 's/.*[::] *//') echo "prev_version=$version" >> $GITHUB_ENV echo "上一个版本: $version" - name: Compare versions id: compare run: | if [ "${{ env.current_version }}" != "${{ env.prev_version }}" ]; then echo "version_changed=true" >> $GITHUB_ENV echo "🔄 版本变化: ${{ env.prev_version }} → ${{ env.current_version }}" else echo "version_changed=false" >> $GITHUB_ENV echo "ℹ️ 版本未变化,无需发布" fi - name: Stop if version not changed if: env.version_changed == 'false' run: exit 0 - name: Check if tag already exists id: tag_check run: | if git rev-parse "v${{ env.current_version }}" >/dev/null 2>&1; then echo "tag_exists=true" >> $GITHUB_ENV echo "⚠️ Tag v${{ env.current_version }} 已存在,跳过发布" else echo "tag_exists=false" >> $GITHUB_ENV fi - name: Stop if tag already exists if: env.tag_exists == 'true' run: exit 0 - name: Create Git tag if: env.tag_exists == 'false' run: | git config user.name "github-actions[bot]" git config user.email "41898282+github-actions[bot]@users.noreply.github.com" git tag -a "v${{ env.current_version }}" -m "Release v${{ env.current_version }}" git push origin "v${{ env.current_version }}" - name: Create ZIP package (with ignore list) run: | ZIP_FILE="${{ github.event.repository.name }}-${{ env.current_version }}.zip" EXCLUDE_ARGS="-x '*.git*' '.github/*'" if [ -f ".releaseignore" ]; then echo "🧾 使用 .releaseignore 过滤以下内容:" while IFS= read -r line; do if [ -n "$line" ] && [[ ! "$line" =~ ^# ]]; then echo " - $line" EXCLUDE_ARGS="$EXCLUDE_ARGS '$line'" fi done < .releaseignore else echo "⚠️ 未找到 .releaseignore,使用默认排除规则。" fi eval zip -r "$ZIP_FILE" . $EXCLUDE_ARGS echo "✅ 打包完成:$ZIP_FILE" - name: Create GitHub Release uses: softprops/action-gh-release@v2 with: tag_name: v${{ env.current_version }} name: "Release v${{ env.current_version }}" body: | 🎉 自动发布版本 v${{ env.current_version }} 🔖 来自 commit: ${{ github.sha }} files: ${{ github.event.repository.name }}-${{ env.current_version }}.zip env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 文件位置: ...

2025-11-03 · 4 min · Duke Yin

本地hosts自动更新Cloudflare解析记录

当本地有DDNS服务的时候,有时候IP一变,我们本地没那么及时获取到DNS记录,就会导致很长时间局域网无法通过域名访问本地局域网的服务。 而Cloudflare有API可以读取某个域名的解析记录,是不是可以利用这一点将Cloudflare的域名-IP对应关系拉取到本地,作为hosts文件,帮助我们加速解析呢? 首先你的CloudFlare要创建一个API令牌,权限只允许读取需要的域名。 然后SSH登录OpenWRT主路由,创建一个脚本文件: /etc/hotplug.d/iface/99-cloudflare-hosts #!/bin/sh # ---------------- 配置 ---------------- CF_API_TOKEN="{CF只读权限TOKEN}" ZONE_ID="{ZONE_ID}" # 文件路径 HOST_FILE="/etc/cloudflare_hosts" TMP_FILE="/tmp/cloudflare_hosts.tmp" LOG_FILE="/var/log/cloudflare_hosts.log" LAST_IPV6_FILE="/tmp/last_ipv6" # 接口与延迟配置 DEFAULT_WAN="pppoe-wan" #接口名称需要根据你实际的网络配置来修改 DELAY_SECONDS=60 # 延迟执行时间(秒) # ---------------- 函数:执行主更新逻辑 ---------------- update_hosts() { IPV6=$(ip -6 addr show dev $DEVICE scope global | grep inet6 | awk '{print $2}' | cut -d/ -f1 | head -n1) [ -z "$IPV6" ] && echo "[$(date)] 未获取到IPv6地址" >> $LOG_FILE && exit 1 LAST_IPV6="" [ -f $LAST_IPV6_FILE ] && LAST_IPV6=$(cat $LAST_IPV6_FILE) if [ "$IPV6" != "$LAST_IPV6" ] || [ "$ACTION" = "manual" ]; then echo "[$(date)] 更新 Cloudflare Hosts,当前IPv6: $IPV6" echo "$IPV6" > $LAST_IPV6_FILE # 获取Cloudflare解析记录 wget -qO- --header="Authorization: Bearer $CF_API_TOKEN" \ --header="Content-Type: application/json" \ "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/dns_records" \ | jq -r '.result[] | select((.type=="A" or .type=="AAAA") and (.name|startswith("*")|not)) | "\(.content) \(.name)"' > $TMP_FILE mv $TMP_FILE $HOST_FILE /etc/init.d/dnsmasq reload LOG_ENTRY="[$(date)] 更新完成 IPv6=$IPV6" echo "$LOG_ENTRY" >> $LOG_FILE tail -n 50 $LOG_FILE > ${LOG_FILE}.tmp && mv ${LOG_FILE}.tmp $LOG_FILE else echo "[$(date)] ⚙️ IPv6未变化,跳过更新" >> $LOG_FILE fi } # ---------------- 初始化变量 ---------------- [ -z "$INTERFACE" ] && INTERFACE="wan" [ -z "$DEVICE" ] && DEVICE="$DEFAULT_WAN" [ -z "$ACTION" ] && ACTION="manual" # ---------------- 执行逻辑 ---------------- if [ "$ACTION" = "manual" ]; then # 手动执行立即运行 update_hosts else # 自动执行(接口事件触发) echo "[$(date)] 接口事件触发:$INTERFACE ($ACTION),立即执行并将在${DELAY_SECONDS}s后再次执行" >> $LOG_FILE # 立即执行一次 update_hosts # 延迟执行一次(后台执行) ( sleep $DELAY_SECONDS update_hosts ) & fi 赋予执行权限: ...

2025-11-02 · 2 min · Duke Yin

Oracle甲骨文Ubuntu无法远程SSH登录

手里还有两个永久免费的甲骨文云VPS,装的Ubuntu系统,开服的时候还教过大家Oracle Cloud SSH使用密码登录,前不久发现SSH突然登不上了,还以为甲骨文给回收了。后来一番探究,终于解决了。 得到的结论是,永久免费的东西,或者说甲骨文家的东西真的挺糟心的。 排查过程太曲折就不说了,直接说最后的解决方法: 用Cloud Shell或者Web上带的终端登录到服务器上,首先核对sshd和ssh服务有没有在运行。 sudo systemctl status ssh sudo systemctl status sshd 如果这俩没在运行,就先安装 sudo apt update sudo apt install openssh-server 设置开机启动 sudo systemctl start sshd sudo systemctl enable sshd 用你的编辑器编辑sshd配置文件 nano /etc/ssh/sshd_config 确保以下行没有被注释,并且端口设置正确: Port 22 PermitRootLogin yes PasswordAuthentication yes 保存配置文件后重启服务 ...

2025-10-21 · 1 min · Duke Yin

电信磊科NW1300AC MG1200AC路由器改LAN地址

电信定制版磊科NW1300AC和MG1200AC是两个特别的路由器,全千兆网口,2.4G和5G双频段WiFi,支持IEEE 802.11k/v/r漫游,多台组网可以很好地实现无缝切换信号,比起如今市面上支持mesh组网、漫游的路由器价格还低很多。唯2的不足是在当下硬件配置略显不足,后台不允许修改路由器的IP地址。 但是有邪道可以解决IP地址的问题: 修改路由器IP地址 建议在Chrome浏览器下操作: 恢复出厂设置:用细长物戳屁股10秒,灯全灭后松开。 单独连接电脑,浏览器打开默认管理界面 192.168.0.1(或者leike.cc),根据背面的用户名密码登录 顶部找到【路由设置】,然后找到页面中的【修改路由器地址】 打开修改路由器地址页面后,按F12打开开发者工具 开发者工具顶部找到“Source”或者中文应该是源代码 左侧的文件树找到“Javascript”文件夹,展开,找到"network_setup.js"这个文件,并且点击它 文件内容里按 Ctrl+F 查找,输入192.168 总共有5个位置。 将 "192.168." + $(this).val()+".1" 中的 ".1" 修改为你希望的值 比如你最后希望的IP地址是 192.118.2.101,.1就要修改为.101 一直到最后有一个地方是这样: var manageIp = [ ROUTE_INFO. lan_ip, "192.168.0.1", "192.168.0.1"]; 第一个IP地址改成这个路由器的IP,按上述例子,是192.168.2.101 第二个IP地址改成网关的IP,也就是主路由,大概是192.168.2.1 var manageIp = [ ROUTE_INFO. lan_ip, "192.168.2.101", "192.168.2.1"]; 然后按Ctrl+S保存这个JS文件 然后回到网页,不用管它锁定的IP地址1,直接改为我们希望的网段,最后点击确定即可。 作为AP开WIFI漫游 一般情况这两个路由器都是作为AP模式接在主路由的后面,开WiFi当AP用,设置如下: ...

2025-10-08 · 1 min · Duke Yin

天钡 WTR PRO AMD R7 5825U PVE安装传感器驱动

1. 安装相关依赖 apt update && apt install -y pve-headers proxmox-headers-$(uname -r) dkms flex bison 2. 安装it87 下载驱动 it87-dkms_1.0.63-1_all.deb ,然后上传到opt目录,然后安装 dpkg -i /opt/it87-dkms_1.0.63-1_all.deb 重启pve

2025-10-07 · 1 min · Duke Yin

PVE网卡直通

注意:一定要保留一个网口作为PVE管理口,如果全部网口都直通了,就无法打开PVE,需要用PVE安装U盘做救援模式。 传统Boot方式: 修改gurp Intel CPU 编辑 /etc/default/grub 找到 GRUB_CMDLINE_LINUX_DEFAULT="quiet" 修改为 GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on" 更新grup update-grub 重启服务器 reboot AMD CPU 依然编辑 /etc/default/grub 找到 GRUB_CMDLINE_LINUX_DEFAULT="quiet" 替换为 GRUB_CMDLINE_LINUX_DEFAULT="quiet amd_iommu=on"" UEF Isystemd-boot boot 文件位于 /etc/kernel/cmdline 创建用于systemd-boot的文件(格式为带有选项的单行) 更新命令为 pve-efiboot-tool refresh 运行命令验证是否成功: dmesg | grep -e DMAR -e IOMMU 如果没有输出,则说明有问题。如果有,则成功。 ...

2025-10-06 · 1 min · Duke Yin

PVE USB移动硬盘直通

插入USB设备后,在PVE主机执行: lsblk 查看USB硬盘是否已经被正确识别 在PVE选中需要直通的虚拟机先关机,选择硬件,添加,USB设备,使用USB供应商/设备ID,选择硬盘。 添加。 启动虚拟机

2025-10-06 · 1 min · Duke Yin

PVE虚拟机配置Guest Agent 安装VirtIO驱动

Windows虚拟机的VirtIO驱动 页面地址:https://pve.proxmox.com/wiki/Windows_VirtIO_Drivers 稳定版:https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/stable-virtio/virtio-win.iso 最新版:https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/latest-virtio/virtio-win.iso 通过虚拟机CDROM载入后在虚拟机安装即可。 Linux Guest Agent Linux系统安装Guest Agent后,可以在PVE管理界面看到虚拟机的IP地址。 Debian 安装 qemu-guest-agent apt install qemu-guest-agent -y 如果报错说找不到这个包,就 apt update && apt install qemu-guest-agent -y centos把apt换成yum即可 然后开启并启动 systemctl enable qemu-guest-agent systemctl start qemu-guest-agent OpenWRT/iStoreOS 安装 qemu-guest-agent # 安装 opkg update opkg install qemu-ga 设置脚本权限 chmod +x /etc/init.d/qemu-ga ...

2025-10-06 · 1 min · Duke Yin

PVE配置UPS不间断电源

仅讨论USB接口UPS的接入,核心是安装NUT,理论上EXSI与PVE都可以使用此方法。 列出USB lsusb 在列表中找到UPS,确认已经接入系统 安装NUT apt update apt install nut nut-client nut-server nut-cgi 扫描UPS nut-scanner -U 如果NUT安装成功,会在最后列出发现的UPS: [nutdev1] driver = "usbhid-ups" port = "auto" vendorid = "0463" productid = "FFFF" product = "SANTAK TG-BOX" serial = "Blank" vendor = "EATON" bus = "001" 然后就要在PVE所在服务器配置UPS的信息,所有配置文件位于 /etc/nut 目录之下 ...

2025-10-06 · 2 min · Duke Yin