作者: 启鑫

  • 在 WordPress 主题中添加暗黑模式切换

    1. 编辑主题的 functions.php 文件

    1. 编辑到您当前使用的主题目录,通常位于 wp-content/themes/your-theme-name/
    2. 找到 functions.php 文件并使用文本编辑器打开它。

    2. 添加代码

    将代码粘贴到 functions.php 文件的末尾,确保不要覆盖任何现有的代码

    // Color Change
    function add_dark_mode_toggle_script() {
        ?>
        <script>
            document.addEventListener("DOMContentLoaded", function () {
                const toggleBtn = document.createElement("button");
                toggleBtn.id = "dark-mode-toggle";
                toggleBtn.innerHTML = "🌙"; // 默认显示月亮(暗色模式)
                toggleBtn.classList.add("dark-mode-btn");
                document.body.appendChild(toggleBtn);
    
                function toggleDarkMode() {
                    if (document.body.classList.contains("dark-mode")) {
                        document.body.classList.remove("dark-mode");
                        localStorage.setItem("theme", "light");
                        toggleBtn.innerHTML = "🌙"; // 切换回暗色模式
                    } else {
                        document.body.classList.add("dark-mode");
                        localStorage.setItem("theme", "dark");
                        toggleBtn.innerHTML = "☀️"; // 切换回亮色模式
                    }
                }
    
                toggleBtn.addEventListener("click", toggleDarkMode);
    
                if (localStorage.getItem("theme") === "dark") {
                    document.body.classList.add("dark-mode");
                    toggleBtn.innerHTML = "☀️"; // 初始时使用亮色模式图标
                }
            });
        </script>
    
        <style>
            /* 风格切换按钮 */
            .dark-mode-btn {
                position: fixed;
                bottom: 20px;
                right: 20px;
                width: 50px;
                height: 50px;
                background: #FF6F61; /* 温暖的橙色按钮背景 */
                color: white;
                border: none;
                border-radius: 50%;
                font-size: 20px;
                cursor: pointer;
                display: flex;
                align-items: center;
                justify-content: center;
                box-shadow: 0px 4px 8px rgba(0, 0, 0, 0.2);
                transition: background 0.3s, transform 0.2s;
            }
    
            .dark-mode-btn:hover {
                background: #FF4C29; /* 深橙色悬停 */
                transform: scale(1.1);
            }
    
            body.dark-mode {
                background-color: #000000; /* 黑色背景 */
                color: #FFFFFF; /* 白色文字 */
            }
    
            body.dark-mode a {
                color: #FF9F5F; /* 浅橙色链接 */
            }
    
            body.dark-mode h1, 
            body.dark-mode h2, 
            body.dark-mode h3, 
            body.dark-mode h4 {
                color: #FF6F61; /* 温暖的橙色标题 */
            }
    
            body.dark-mode blockquote {
                border-left: 5px solid #FF6F61; /* 温暖的橙色引用框 */
                background: rgba(255, 111, 97, 0.1); /* 橙色浅背景 */
                padding: 12px 15px;
            }
    
            /* 按钮样式 */
            body.dark-mode .dark-mode-btn {
                background: #FF6F61; /* 温暖的橙色按钮 */
                color: #FFF;
            }
    
            /* 按钮悬停效果 */
            body.dark-mode .dark-mode-btn:hover {
                background: #FF4C29; /* 深橙色悬停 */
            }
        </style>
        <?php
    }
    add_action('wp_footer', 'add_dark_mode_toggle_script');

    3. 效果演示

    • 清除您的浏览器缓存。
    • 访问您的 WordPress 网站。
    • 您应该会在页面右下角看到一个带有月亮图标的按钮。
    • 点击按钮,网站应该切换到暗黑模式。再次点击,切换回亮色模式。
  • WordPress在文章中添加相关文章推荐功能

    添加一段代码,它通过分析文章的分类,智能地在单篇文章末尾展示相关文章,从而提升网站的互动性和用户体验。

    1. 找到您的 functions.php 文件

    • 编辑到您当前使用的主题目录,通常位于 wp-content/themes/your-theme-name/
    • 找到 functions.php 文件并使用文本编辑器打开它。

    2. 将代码片段添加到 functions.php

    将以下代码复制并粘贴到 functions.php 文件的末尾:

    // Related articles
    function display_related_posts_by_category($content) {
        if (is_single()) {
            $post_object = get_queried_object();
            if ($post_object) {
                $categories = wp_get_post_categories($post_object->ID);
                if ($categories) {
                    $args = array(
                        'category__in' => $categories,
                        'post__not_in' => array($post_object->ID),
                        'posts_per_page' => 5,
                        'orderby' => 'rand',
                        'no_found_rows' => true,
                    );
                    $related_posts = new WP_Query($args);
                    if ($related_posts->have_posts()) {
                        $content .= '<div class="related-posts"><h3>相关文章</h3><ul>';
                        while ($related_posts->have_posts()) {
                            $related_posts->the_post();
                            $content .= '<li><a href="' . esc_url(get_permalink()) . '">' . esc_html(get_the_title()) . '</a></li>';
                        }
                        $content .= '</ul></div>';
                        wp_reset_postdata();
                    }
                }
            }
        }
        return $content;
    }
    add_filter('the_content', 'display_related_posts_by_category');

    3. 保存 functions.php 文件

    • 保存对 functions.php 文件的更改。

    4. 实际应用:增强用户体验

    通过在 WordPress 网站中添加这段代码,可以实现以下效果:

    • 提高用户粘性: 相关文章的推荐,能够引导用户浏览更多感兴趣的内容,延长页面停留时间。
    • 优化内容结构: 通过分类推荐,帮助用户发现同一主题下的其他文章,完善内容体系。
    • 提升 SEO 效果: 增加页面内部链接,有助于搜索引擎更好地理解网站结构和内容相关性。
  • 将 Windows Server 标准版切换至数据中心版

    在 Windows Server 的使用过程中,根据业务发展和IT需求的变化,您可能需要从标准版升级到功能更全面的数据中心版。Windows Server 提供了便捷的版本转换机制,允许您在现有系统上直接升级,无需耗时的重新安装。

    1. 确认当前系统版本

    运行以下命令确定 Windows Server Standard 是否为当前版本名称

    DISM /online /Get-CurrentEdition

    如果命令输出显示类似 ServerStandard 的信息,则表明您的系统当前为 Windows Server 标准版。

    2. 确定验证 Windows Server Datacenter 是有效的转换选项:

    通过运行以下命令,您可以查看可供升级的目标版本列表:

    DISM /online /Get-TargetEditions

    3. 切换至数据中心版

    DISM /online /Set-Edition:ServerDatacenter /ProductKey:<product key> /AcceptEula
  • 使用远程服务器加速 Immich 的机器学习推理

    为了显著提升 Immich 在执行照片和视频分析等任务时的机器学习推理性能,可以将 Immich 的机器学习容器部署在具备更强硬件性能(例如配备高性能 GPU 或专用 AI 加速卡的服务器)的远程服务器上。这种方式可以将计算密集型的推理工作负载从运行 Immich Server 的主服务器卸载,从而释放主服务器的资源并加快推理速度。

    1. 确保版本一致性

    重要提示

    1. Immich 服务器(即运行 Immich Web、API 和 Microservices 的主服务器)的版本必须与您计划在远程服务器上部署的机器学习服务容器的版本完全一致
    2. 如果这两个组件的版本不匹配,极有可能导致各种不可预期的错误、功能异常,甚至推理任务的彻底失败。为了确保系统的稳定性和功能的正常运行,请务必仔细核对并保持版本同步。

    2. 在远程系统上部署机器学习容器

    在您选定的远程服务器上,创建一个名为 docker-compose.yml 的文件。该文件将定义并配置 Immich 机器学习服务的 Docker 容器。请根据您的远程服务器的硬件配置以及您希望使用的加速后端选择合适的配置:

    name: immich_remote_ml
    
    services:
      immich-machine-learning:
        container_name: immich_machine_learning
        # For hardware acceleration, add one of -[armnn, cuda, rocm, openvino, rknn] to the image tag.
        # Example tag: ${IMMICH_VERSION:-release}-cuda
        image: ghcr.io/immich-app/immich-machine-learning:${IMMICH_VERSION:-release}
        # extends:
        #   file: hwaccel.ml.yml
        #   service: # set to one of [armnn, cuda, rocm, openvino, openvino-wsl, rknn] for accelerated inference - use the `-wsl` version for WSL2 where applicable
        volumes:
          - model-cache:/cache
        restart: always
        ports:
          - 3003:3003
    
    volumes:
      model-cache:

    3. 启动容器

    在远程服务器上执行以下命令启动服务:

    docker compose up -d

    4. 配置 Immich 使用远程推理服务

    在 Immich Web 界面中:

    • 进入 系统设置
    • 打开 系统管理 > 设置 > 机器学习设置
    • 将远程服务器的机器学习服务 URL 填入(例如:http://<远程服务器IP>:3003

    完成以上配置后,Immich Server 在需要进行机器学习推理时,例如人脸识别、物体识别、场景分类等,将会自动将这些请求发送到您配置的远程机器学习服务。这将利用远程服务器更强大的计算资源来加速推理过程,从而提升 Immich 的整体性能和用户体验。您可以通过观察 Immich 的任务队列和远程服务器的资源使用情况来验证远程推理是否正常工作。

  • 使用Docker部署开源 RSS 阅读器 Miniflux

    Miniflux 是一款注重简洁与高效的开源 RSS 阅读器,用户可自行部署。它支持多种订阅格式,提供纯粹的阅读体验,具备文章过滤、标签管理、阅读状态跟踪等实用功能。作为自托管方案,Miniflux 无广告和追踪,让用户专注于内容本身。

    1. 前提条件

    在开始部署之前,请确保你的系统已经安装了 Docker 和 Docker Compose。如果尚未安装,请参考 Docker 官方文档进行安装。

    2. 使用 Docker Compose 部署 Miniflux

    通过 Docker Compose,你可以轻松地定义和管理 Miniflux 及其依赖的服务。

    2.1 创建 Docker Compose 配置文件

    首先,在你希望存放配置文件的目录下创建一个名为 docker-compose.yml 的文件,并将以下内容粘贴到文件中:

    services:
      miniflux:
        image: miniflux/miniflux:latest
        ports:
          - "80:8080"
        depends_on:
          db:
            condition: service_healthy
        environment:
          - DATABASE_URL=postgres://miniflux:secret@db/miniflux?sslmode=disable
          - RUN_MIGRATIONS=1
          - CREATE_ADMIN=1
          - ADMIN_USERNAME=admin
          - ADMIN_PASSWORD=qixinlee.com
        healthcheck:
          test: ["CMD", "/usr/bin/miniflux", "-healthcheck", "auto"]
      db:
        image: postgres:17-alpine
        environment:
          - POSTGRES_USER=miniflux
          - POSTGRES_PASSWORD=secret
          - POSTGRES_DB=miniflux
        volumes:
          - miniflux-db:/var/lib/postgresql/data
        healthcheck:
          test: ["CMD", "pg_isready", "-U", "miniflux"]
          interval: 10s
          start_period: 30s
    volumes:
      miniflux-db:

    2.2 启动 Miniflux 服务

    打开你的终端,导航到包含 docker-compose.yml 文件的目录,然后执行以下命令来启动 Miniflux 及其依赖的 PostgreSQL 数据库服务:

    docker compose up -d

    这条命令会在后台启动定义在 docker-compose.yml 文件中的服务。

    2.3 访问 Miniflux Web 界面

    当部署完成后,你可以通过你的 Web 浏览器访问 http://localhost(如果 Docker 运行在本地)或者相应的服务器 IP 地址。

    首次登录时,你需要使用在 docker-compose.yml 文件中配置的管理员账户信息:

    • 用户名 (Username): admin
    • 密码 (Password): qixinlee.com

    登录后,你就可以开始添加你的 RSS 订阅源,享受简洁高效的阅读体验了。

    2.4 停止 Miniflux 服务

    如果你需要停止正在运行的 Miniflux 服务,可以在相同的终端窗口或导航到相同的目录后运行以下命令:

    docker compose down

    这条命令会停止并移除由 docker-compose up 命令创建的容器和服务。

  • SNI 漏洞如何影响你的加密通信

    SNI 阻断提醒我们:即使是 HTTPS 加密的通信,在握手时也会“说漏嘴”。
    在你构建下一代应用、工具或服务时,别忘了这点:安全不是默认的,隐私需要自己争取

    一、SNI 是什么?

    SNI,全称 Server Name Indication(服务器名称指示),是 TLS(传输层安全协议)的一个扩展。

    在传统 HTTP 中,请求目标的域名信息包含在明文请求头中。而在 HTTPS 中,请求的内容虽然会被加密,但在 TLS 握手开始时,客户端仍需要告诉服务器自己要访问哪个域名,以便服务器返回正确的证书。这部分信息就是通过 SNI 字段传输的。

    重点:SNI 字段是明文的,它暴露了你想访问的域名,即便其他通信内容都是加密的。

    举个例子:
    当你访问 https://example.com 时,浏览器会先发送一个 ClientHello 报文,其中就包含了 example.com 的 SNI 字段。只有在这之后,TLS 握手才会继续并建立加密通道。

    二、SNI 阻断的原理是什么?

    正因为 SNI 是明文传输的,它就成了防火墙和深度包检测(DPI)系统的“突破口”。

    封锁者只需在 TLS 握手过程中抓取流量,读取其中的 SNI 字段:

    1. 客户端发起 TLS 握手
    2. 在 ClientHello 中包含明文的 SNI 字段(即你要访问的域名)
    3. 防火墙或 DPI(深度包检测)设备分析该字段
    4. 如果域名匹配封锁规则,则立即阻断连接

    常见的阻断方式包括:

    • 发送 TCP RST 包:强制关闭连接;
    • 直接丢弃 TLS 握手包:让连接挂起、卡死;
    • 注入伪造响应、返回错误页、返回 reset 包

    这种方式对服务端和客户端透明、不依赖解密,加之效率极高,因此广泛用于精准封锁策略中。

    三、如何检测 SNI 是否被阻断?

    你可以使用如下方式排查:

    方法 1:使用 openssl 命令行测试

    openssl s_client -connect example.com:443 -servername example.com
    • 如果连接能建立,表示 SNI 暂未被封锁;
    • 如果连接发生 timeout、reset 或 TLS 握手失败,很可能 SNI 被拦截。

    方法 2:使用 Wireshark 抓包

    操作步骤:

    1. 打开 Wireshark,设置过滤器为 tcp.port == 443
    2. 访问你怀疑被封锁的网站;
    3. 查找 ClientHello 包,并检查是否出现:
      • 后续无响应;
      • 接收到 TCP RST;
      • 握手中断在 SNI 之后。
        Wireshark 可视化过程清晰,非常适合深入分析封锁点。

    四、对于开发者:如何构建更安全的服务

    安全设计的关键词:默认加密、最小权限、最少暴露

    不要等出了问题才想着“加个验证”或“换个协议”——安全不是补丁,而应该是架构的一部分

    在你开发每一个接口、设计每一个通信协议、部署每一台服务器时,都可以问问自己:

    这个组件,暴露了什么?
    是否默认安全?
    用户的数据有没有主动保护?

    真正可靠的服务,往往不是最强,而是最稳、最透明、最值得信赖。

    别忘了:安全不是奢侈品,它是你服务可信赖的基础。