<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Edward&#39;s Blog</title>
    <link>https://example.org/</link>
    <description>Recent content from Edward&#39;s Blog</description>
    <generator>Hugo</generator>
    <language>zh-cn</language>
    
    <managingEditor>xxx@example.com (D-Sketon)</managingEditor>
    <webMaster>xxx@example.com (D-Sketon)</webMaster>
    
    <copyright>本博客所有文章除特别声明外，均采用 BY-NC-SA 许可协议。转载请注明出处！</copyright>
    
    <lastBuildDate>Mon, 07 Sep 2026 10:45:09 +0800</lastBuildDate>
    
    
    <atom:link href="https://example.org/index.xml" rel="self" type="application/rss&#43;xml" />
    

    
    

    <item>
      <title>Tmux 使用指南</title>
      <link>https://example.org/post/tmux-%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97/</link>
      <pubDate>Mon, 07 Sep 2026 10:45:09 &#43;0800</pubDate>
      <author>xxx@example.com (D-Sketon)</author>
      <guid>https://example.org/post/tmux-%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97/</guid>
      <description>
        <![CDATA[<h1>Tmux 使用指南</h1><p>作者：D-Sketon（xxx@example.com）</p>
        
          <blockquote>
<p>会话保持、多窗格管理、远程协作的终端复用解决方案</p>
</blockquote>
<h2 id="一tmux-的价值">
<a class="header-anchor" href="#%e4%b8%80tmux-%e7%9a%84%e4%bb%b7%e5%80%bc"></a>
一、Tmux 的价值
</h2><p>Tmux 是一个终端复用器（terminal multiplexer），主要解决以下三类问题：</p>
<ul>
<li><strong>会话持久化</strong>：SSH 连接断开后，运行中的进程不受影响，重新连接可恢复原会话。</li>
<li><strong>多窗格布局</strong>：单个终端窗口内可分割为多个面板，同时查看日志、编辑文件、运行命令。</li>
<li><strong>多人共享</strong>：多个用户可同时附加（attach）到同一会话，实现实时协作调试。</li>
</ul>
<p>终端模拟器（如 iTerm、GNOME Terminal）虽支持多标签页，但其作用域仅限于本地，无法在远程服务器上保持会话状态。Tmux 则运行于服务端，网络中断不影响任务执行。</p>
<h2 id="二核心概念">
<a class="header-anchor" href="#%e4%ba%8c%e6%a0%b8%e5%bf%83%e6%a6%82%e5%bf%b5"></a>
二、核心概念
</h2><p>Tmux 采用三层架构（由大到小）：</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-txt" data-lang="txt"><span style="display:flex;"><span>Session（会话）          ← 一个独立的工作环境，可包含多个窗口
</span></span><span style="display:flex;"><span>  └── Window（窗口）     ← 会话中的标签页，可包含多个面板
</span></span><span style="display:flex;"><span>        └── Pane（面板） ← 窗口中被分割出的一个终端区域
</span></span></code></pre></div><table>
	<thead>
			<tr>
					<th>概念</th>
					<th>说明</th>
					<th>类比</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>Session</td>
					<td>一个独立的 Tmux 工作空间</td>
					<td>浏览器窗口</td>
			</tr>
			<tr>
					<td>Window</td>
					<td>会话内的全屏终端</td>
					<td>浏览器标签页</td>
			</tr>
			<tr>
					<td>Pane</td>
					<td>窗口内划分的终端区域</td>
					<td>标签页中的分屏</td>
			</tr>
	</tbody>
</table>
<h2 id="三安装">
<a class="header-anchor" href="#%e4%b8%89%e5%ae%89%e8%a3%85"></a>
三、安装
</h2><p>各主流操作系统下的安装命令：</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#75715e"># Ubuntu / Debian</span>
</span></span><span style="display:flex;"><span>sudo apt update <span style="color:#f92672">&amp;&amp;</span> sudo apt install tmux
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># CentOS / RHEL / Fedora</span>
</span></span><span style="display:flex;"><span>sudo yum install tmux
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># macOS（Homebrew）</span>
</span></span><span style="display:flex;"><span>brew install tmux
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># Arch Linux</span>
</span></span><span style="display:flex;"><span>sudo pacman -S tmux
</span></span></code></pre></div><p>安装完成后，验证版本：</p>
        
        <hr><p>本文2026-09-07首发于<a href='https://example.org/'>Edward's Blog</a>，最后修改于2026-09-07</p>]]>
      </description>
      
    </item>
    
    

    <item>
      <title>回溯法详解：从原理到经典问题实战</title>
      <link>https://example.org/post/%E5%9B%9E%E6%BA%AF%E6%B3%95%E8%AF%A6%E8%A7%A3%E4%BB%8E%E5%8E%9F%E7%90%86%E5%88%B0%E7%BB%8F%E5%85%B8%E9%97%AE%E9%A2%98%E5%AE%9E%E6%88%98/</link>
      <pubDate>Thu, 03 Sep 2026 16:57:21 &#43;0800</pubDate>
      <author>xxx@example.com (D-Sketon)</author>
      <guid>https://example.org/post/%E5%9B%9E%E6%BA%AF%E6%B3%95%E8%AF%A6%E8%A7%A3%E4%BB%8E%E5%8E%9F%E7%90%86%E5%88%B0%E7%BB%8F%E5%85%B8%E9%97%AE%E9%A2%98%E5%AE%9E%E6%88%98/</guid>
      <description>
        <![CDATA[<h1>回溯法详解：从原理到经典问题实战</h1><p>作者：D-Sketon（xxx@example.com）</p>
        
          <blockquote>
<p>回溯法（Backtracking）是一种系统搜索问题解的方法，核心思想是：<strong>从初始状态出发，按照一定规则逐步尝试构造解；当发现当前选择无法得到有效解时，就撤销上一步甚至多步的选择，换一条路径继续尝试。</strong><br>
它本质上是 <strong>深度优先搜索 + 剪枝 + 状态重置</strong>，常用来解决“搜索所有解”“搜索任意一个解”“在约束条件下求最优解”的问题。</p>
</blockquote>
<h2 id="一回溯法的基本概念">
<a class="header-anchor" href="#%e4%b8%80%e5%9b%9e%e6%ba%af%e6%b3%95%e7%9a%84%e5%9f%ba%e6%9c%ac%e6%a6%82%e5%bf%b5"></a>
一、回溯法的基本概念
</h2><h3 id="1-解空间">
<a class="header-anchor" href="#1-%e8%a7%a3%e7%a9%ba%e9%97%b4"></a>
1. 解空间
</h3><p>一个问题所有可能的解构成的集合，称为该问题的<strong>解空间</strong>。</p>
<p>例如：</p>
<ul>
<li>求集合 <code>{1,2,3}</code> 的全排列，解空间由 <code>3! = 6</code> 个排列组成；</li>
<li>求 <code>n</code> 个元素的子集，解空间大小为 <code>2^n</code>；</li>
<li><code>n</code> 皇后问题，解空间大小为 <code>n!</code> 左右。</li>
</ul>
<p>回溯法通常将解空间组织成一棵树，称为<strong>解空间树</strong>，然后在树上进行深度优先搜索。</p>
<h3 id="2-两类典型解空间树">
<a class="header-anchor" href="#2-%e4%b8%a4%e7%b1%bb%e5%85%b8%e5%9e%8b%e8%a7%a3%e7%a9%ba%e9%97%b4%e6%a0%91"></a>
2. 两类典型解空间树
</h3><ul>
<li><strong>子集树</strong>：每个元素有“选”或“不选”两种可能，例如子集问题、0/1背包问题。<br>
如果问题规模为 <code>n</code>，子集树最多有 <code>2^n</code> 个叶子节点。</li>
<li><strong>排列树</strong>：每个位置从剩余元素中选择一个，例如全排列、旅行商问题、N皇后问题。<br>
如果问题规模为 <code>n</code>，排列树最多有 <code>n!</code> 个叶子节点。</li>
</ul>
<h3 id="3-剪枝函数">
<a class="header-anchor" href="#3-%e5%89%aa%e6%9e%9d%e5%87%bd%e6%95%b0"></a>
3. 剪枝函数
</h3><p>回溯法不是完全暴力搜索，它会在搜索过程中使用剪枝函数去掉不可能产生解的子树。</p>
<p>剪枝函数分为两类：</p>
<ul>
<li><strong>约束函数</strong>：剪掉不满足约束条件的子树。<br>
例如：N皇后中，当前放置位置会与已有皇后冲突，就不继续搜索。</li>
<li><strong>限界函数</strong>：剪掉不可能得到最优解的子树。<br>
例如：0/1背包中，即使把剩余所有物品都装进去，总价值也无法超过当前最优值，就剪掉。</li>
</ul>
<hr>
<h2 id="二回溯法的核心三要素">
<a class="header-anchor" href="#%e4%ba%8c%e5%9b%9e%e6%ba%af%e6%b3%95%e7%9a%84%e6%a0%b8%e5%bf%83%e4%b8%89%e8%a6%81%e7%b4%a0"></a>
二、回溯法的核心三要素
</h2><p>使用回溯法时，通常围绕三个量展开：</p>
<ol>
<li><strong>路径</strong>：已经做出的选择。</li>
<li><strong>选择列表</strong>：当前还可以做出的选择。</li>
<li><strong>结束条件</strong>：到达解空间树底部，或者已经找到一个可行解，无法再继续选择。</li>
</ol>
<p>这三个要素对应回溯算法的递归函数结构。</p>
<hr>
<h2 id="三回溯法通用模板">
<a class="header-anchor" href="#%e4%b8%89%e5%9b%9e%e6%ba%af%e6%b3%95%e9%80%9a%e7%94%a8%e6%a8%a1%e6%9d%bf"></a>
三、回溯法通用模板
</h2><p>回溯法可以用递归实现，伪代码非常统一：</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-cpp" data-lang="cpp"><span style="display:flex;"><span>vector<span style="color:#f92672">&lt;</span>vector<span style="color:#f92672">&lt;</span><span style="color:#66d9ef">int</span><span style="color:#f92672">&gt;&gt;</span> result;   <span style="color:#75715e">// 保存所有可行解
</span></span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">void</span> <span style="color:#a6e22e">backtrack</span>(vector<span style="color:#f92672">&lt;</span><span style="color:#66d9ef">int</span><span style="color:#f92672">&gt;&amp;</span> path, vector<span style="color:#f92672">&lt;</span><span style="color:#66d9ef">int</span><span style="color:#f92672">&gt;&amp;</span> choices) {
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">if</span> (<span style="color:#960050;background-color:#1e0010">满足结束条件</span>) {
</span></span><span style="display:flex;"><span>        result.push_back(path);   <span style="color:#75715e">// 注意：不能直接保存引用
</span></span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">return</span>;
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> choice : choices) {
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">if</span> (<span style="color:#f92672">!</span>is_valid(choice, path)) {
</span></span><span style="display:flex;"><span>            <span style="color:#66d9ef">continue</span>;             <span style="color:#75715e">// 剪枝
</span></span></span><span style="display:flex;"><span>        }
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        path.push_back(choice);   <span style="color:#75715e">// 做选择
</span></span></span><span style="display:flex;"><span>        backtrack(path, get_choices(choice));
</span></span><span style="display:flex;"><span>        path.pop_back();          <span style="color:#75715e">// 撤销选择
</span></span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><p>C++ 风格的通用模板：</p>
        
        <hr><p>本文2026-09-03首发于<a href='https://example.org/'>Edward's Blog</a>，最后修改于2026-09-03</p>]]>
      </description>
      
    </item>
    
    

    <item>
      <title>Zsh &#43; Oh My Zsh 完整配置指南：让你的终端焕然一新</title>
      <link>https://example.org/post/zsh-oh-my-zsh-%E5%AE%8C%E6%95%B4%E9%85%8D%E7%BD%AE%E6%8C%87%E5%8D%97%E8%AE%A9%E4%BD%A0%E7%9A%84%E7%BB%88%E7%AB%AF%E7%84%95%E7%84%B6%E4%B8%80%E6%96%B0/</link>
      <pubDate>Tue, 01 Sep 2026 11:23:29 &#43;0800</pubDate>
      <author>xxx@example.com (D-Sketon)</author>
      <guid>https://example.org/post/zsh-oh-my-zsh-%E5%AE%8C%E6%95%B4%E9%85%8D%E7%BD%AE%E6%8C%87%E5%8D%97%E8%AE%A9%E4%BD%A0%E7%9A%84%E7%BB%88%E7%AB%AF%E7%84%95%E7%84%B6%E4%B8%80%E6%96%B0/</guid>
      <description>
        <![CDATA[<h1>Zsh + Oh My Zsh 完整配置指南：让你的终端焕然一新</h1><p>作者：D-Sketon（xxx@example.com）</p>
        
          <blockquote>
<p>如果你还在使用默认的 Bash 终端，那可能错过了许多提升生产力的神器。本文将手把手带你安装、配置 Zsh 及 Oh My Zsh，并集成美观的主题和实用的插件，让你的终端焕然一新。</p>
</blockquote>
<hr>
<h2 id="前言">
<a class="header-anchor" href="#%e5%89%8d%e8%a8%80"></a>
前言
</h2><p>Zsh（Z Shell）是 Bash 的现代替代品，拥有更丰富的自动补全、拼写纠正、主题定制等功能。而 <strong>Oh My Zsh</strong> 则是社区最受欢迎的 Zsh 配置管理框架，提供了海量插件和主题，让配置变得极其简单。本文将面向 Linux 用户（Ubuntu/Debian/Fedora/Arch）提供完整步骤。</p>
<hr>
<h2 id="安装-zsh">
<a class="header-anchor" href="#%e5%ae%89%e8%a3%85-zsh"></a>
安装 Zsh
</h2><h3 id="系统要求">
<a class="header-anchor" href="#%e7%b3%bb%e7%bb%9f%e8%a6%81%e6%b1%82"></a>
系统要求
</h3><ul>
<li>Linux 操作系统（本文以 Ubuntu 20.04/22.04 为例，其他发行版类似）</li>
<li>拥有 <code>sudo</code> 权限</li>
<li>稳定的网络连接（用于下载插件和字体）</li>
</ul>
<h3 id="安装命令">
<a class="header-anchor" href="#%e5%ae%89%e8%a3%85%e5%91%bd%e4%bb%a4"></a>
安装命令
</h3><h4 id="ubuntu--debian">
<a class="header-anchor" href="#ubuntu--debian"></a>
Ubuntu / Debian
</h4><div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sudo apt update <span style="color:#f92672">&amp;&amp;</span> sudo apt upgrade -y
</span></span><span style="display:flex;"><span>sudo apt install zsh git curl wget fontconfig -y
</span></span></code></pre></div><h4 id="fedora">
<a class="header-anchor" href="#fedora"></a>
Fedora
</h4><div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sudo dnf update -y
</span></span><span style="display:flex;"><span>sudo dnf install zsh git curl wget fontconfig -y
</span></span></code></pre></div><h4 id="arch-linux">
<a class="header-anchor" href="#arch-linux"></a>
Arch Linux
</h4><div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sudo pacman -S zsh git curl wget
</span></span></code></pre></div><h3 id="验证并切换默认-shell">
<a class="header-anchor" href="#%e9%aa%8c%e8%af%81%e5%b9%b6%e5%88%87%e6%8d%a2%e9%bb%98%e8%ae%a4-shell"></a>
验证并切换默认 Shell
</h3><p>查看 Zsh 版本：</p>
        
        <hr><p>本文2026-09-01首发于<a href='https://example.org/'>Edward's Blog</a>，最后修改于2026-09-01</p>]]>
      </description>
      
        <category>Linux</category>
      
    </item>
    
    

    <item>
      <title>清理Anaconda和pip缓存指南</title>
      <link>https://example.org/post/%E6%B8%85%E7%90%86anaconda%E5%92%8Cpip%E7%BC%93%E5%AD%98%E6%8C%87%E5%8D%97/</link>
      <pubDate>Tue, 01 Sep 2026 11:10:38 &#43;0800</pubDate>
      <author>xxx@example.com (D-Sketon)</author>
      <guid>https://example.org/post/%E6%B8%85%E7%90%86anaconda%E5%92%8Cpip%E7%BC%93%E5%AD%98%E6%8C%87%E5%8D%97/</guid>
      <description>
        <![CDATA[<h1>清理Anaconda和pip缓存指南</h1><p>作者：D-Sketon（xxx@example.com）</p>
        
          <p>在使用 Anaconda 和 pip 管理 Python 包的过程中，缓存文件会逐渐累积，占用大量磁盘空间，甚至可能导致依赖冲突或安装错误。定期清理缓存有助于释放空间并解决一些奇怪的问题。以下提供针对 <code>conda</code> 和 <code>pip</code> 的缓存清理方法。</p>
<hr>
<h2 id="1-清除-pip-缓存">
<a class="header-anchor" href="#1-%e6%b8%85%e9%99%a4-pip-%e7%bc%93%e5%ad%98"></a>
1. 清除 pip 缓存
</h2><h3 id="方法一使用-pip-自带的清理命令推荐">
<a class="header-anchor" href="#%e6%96%b9%e6%b3%95%e4%b8%80%e4%bd%bf%e7%94%a8-pip-%e8%87%aa%e5%b8%a6%e7%9a%84%e6%b8%85%e7%90%86%e5%91%bd%e4%bb%a4%e6%8e%a8%e8%8d%90"></a>
方法一：使用 pip 自带的清理命令（推荐）
</h3><div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>pip cache purge
</span></span></code></pre></div><p>该命令会删除所有缓存的 wheel 文件、下载的包索引信息等。如果只想查看缓存大小而不删除，可先运行：</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>pip cache info
</span></span></code></pre></div><h3 id="方法二手动删除缓存目录">
<a class="header-anchor" href="#%e6%96%b9%e6%b3%95%e4%ba%8c%e6%89%8b%e5%8a%a8%e5%88%a0%e9%99%a4%e7%bc%93%e5%ad%98%e7%9b%ae%e5%bd%95"></a>
方法二：手动删除缓存目录
</h3><ul>
<li><strong>Linux / macOS</strong>：<code>~/.cache/pip</code></li>
<li><strong>Windows</strong>：<code>%LocalAppData%\pip\cache</code></li>
</ul>
<p>直接删除整个目录：</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#75715e"># Linux / macOS</span>
</span></span><span style="display:flex;"><span>rm -rf ~/.cache/pip
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># Windows (PowerShell)</span>
</span></span><span style="display:flex;"><span>Remove-Item -Recurse -Force $env:LOCALAPPDATA<span style="color:#ae81ff">\p</span>ip<span style="color:#ae81ff">\c</span>ache
</span></span></code></pre></div><hr>
<h2 id="2-清除-conda-缓存">
<a class="header-anchor" href="#2-%e6%b8%85%e9%99%a4-conda-%e7%bc%93%e5%ad%98"></a>
2. 清除 conda 缓存
</h2><p><code>conda</code> 提供了专门的清理子命令，可以安全地移除各种缓存文件。</p>
<h3 id="基础清理最常用">
<a class="header-anchor" href="#%e5%9f%ba%e7%a1%80%e6%b8%85%e7%90%86%e6%9c%80%e5%b8%b8%e7%94%a8"></a>
基础清理（最常用）
</h3><div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>conda clean -a
</span></span></code></pre></div><p><code>-a</code> 表示清理所有类型的缓存，包括：</p>
<ul>
<li>索引缓存（index cache）</li>
<li>锁定文件</li>
<li>未使用的包缓存（tarballs）</li>
<li>源代码包缓存</li>
</ul>
<h3 id="按类型清理">
<a class="header-anchor" href="#%e6%8c%89%e7%b1%bb%e5%9e%8b%e6%b8%85%e7%90%86"></a>
按类型清理
</h3><table>
	<thead>
			<tr>
					<th>选项</th>
					<th>含义</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td><code>-i</code> / <code>--index-cache</code></td>
					<td>清除索引缓存</td>
			</tr>
			<tr>
					<td><code>-p</code> / <code>--packages</code></td>
					<td>清除未使用的包文件（从 <code>pkgs</code> 目录删除未链接到任何环境的包）</td>
			</tr>
			<tr>
					<td><code>-t</code> / <code>--tarballs</code></td>
					<td>清除下载的压缩包（<code>.tar.bz2</code> 或 <code>.conda</code>）</td>
			</tr>
			<tr>
					<td><code>-f</code> / <code>--force</code></td>
					<td>强制删除，无确认提示</td>
			</tr>
	</tbody>
</table>
<p>例如，只清除下载的压缩包：</p>
        
        <hr><p>本文2026-09-01首发于<a href='https://example.org/'>Edward's Blog</a>，最后修改于2026-09-01</p>]]>
      </description>
      
        <category>O&amp;M</category>
      
    </item>
    
    

    <item>
      <title>Qt 多线程使用</title>
      <link>https://example.org/post/qt-%E5%A4%9A%E7%BA%BF%E7%A8%8B%E5%AD%A6%E4%B9%A0%E8%AE%B0%E5%BD%95%E4%B9%8B%E7%BA%BF%E7%A8%8B%E6%B1%A0/</link>
      <pubDate>Tue, 14 Jul 2026 16:41:00 &#43;0800</pubDate>
      <author>xxx@example.com (D-Sketon)</author>
      <guid>https://example.org/post/qt-%E5%A4%9A%E7%BA%BF%E7%A8%8B%E5%AD%A6%E4%B9%A0%E8%AE%B0%E5%BD%95%E4%B9%8B%E7%BA%BF%E7%A8%8B%E6%B1%A0/</guid>
      <description>
        <![CDATA[<h1>Qt 多线程使用</h1><p>作者：D-Sketon（xxx@example.com）</p>
        
          <p>在进行桌面应用程序开发的时候，假设应用程序在某些情况下需要处理比较复杂的逻辑，如果只有一个线程去处理，就会导致窗口卡顿，无法处理用户的相关操作。这种情况下就需要使用多线程，其中一个线程处理窗口事件，其他线程进行逻辑运算，多个线程各司其职，不仅可以提高用户体验还可以提升程序的执行效率。</p>
<p>在 qt 中使用了多线程，有些事项是需要额外注意的：</p>
<ul>
<li>默认的线程在 qt 中称之为窗口线程，也叫主线程，负责窗口事件处理或者窗口控件数据的更新</li>
<li>子线程负责后台的业务逻辑处理，子线程中不能对窗口对象做任何操作，这些事情需要交给窗口线程处理</li>
<li>主线程和子线程之间如果要进行数据的传递，需要使用 qt 中的信号槽机制</li>
</ul>
<h2 id="1-线程类-qthread">
<a class="header-anchor" href="#1-%e7%ba%bf%e7%a8%8b%e7%b1%bb-qthread"></a>
1 线程类 QThread
</h2><h3 id="11-常用共用成员函数">
<a class="header-anchor" href="#11-%e5%b8%b8%e7%94%a8%e5%85%b1%e7%94%a8%e6%88%90%e5%91%98%e5%87%bd%e6%95%b0"></a>
1.1 常用共用成员函数
</h3><p>Qt中提供了一个线程类。通过这个类就可以创建子线程，Qt一共提供了两种创建子线程的方式。</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-cpp" data-lang="cpp"><span style="display:flex;"><span><span style="color:#75715e">// QThread 类常用 API
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">// 构造函数
</span></span></span><span style="display:flex;"><span>QThread<span style="color:#f92672">::</span>QThread(QObject <span style="color:#f92672">*</span>parent <span style="color:#f92672">=</span> Q_NULLPTR);
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">// 判断线程中的任务是不是处理完毕了
</span></span></span><span style="display:flex;"><span><span style="color:#66d9ef">bool</span> QThread<span style="color:#f92672">::</span>isFinished() <span style="color:#66d9ef">const</span>;
</span></span><span style="display:flex;"><span><span style="color:#75715e">// 判断子线程是不是在执行任务
</span></span></span><span style="display:flex;"><span><span style="color:#66d9ef">bool</span> QThread<span style="color:#f92672">::</span>isRunning() <span style="color:#66d9ef">const</span>;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">// Qt中的线程可以设置优先级
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">// 得到当前线程的优先级
</span></span></span><span style="display:flex;"><span>Priority QThread<span style="color:#f92672">::</span>priority() <span style="color:#66d9ef">const</span>;
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">void</span> QThread<span style="color:#f92672">::</span>setPriority(Priority priority);
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">优先级枚举：</span>
</span></span><span style="display:flex;"><span>QThread<span style="color:#f92672">::</span>IdlePriority         <span style="color:#f92672">--&gt;</span> <span style="color:#960050;background-color:#1e0010">最低的优先级</span>
</span></span><span style="display:flex;"><span>QThread<span style="color:#f92672">::</span>LowestPriority
</span></span><span style="display:flex;"><span>QThread<span style="color:#f92672">::</span>LowPriority
</span></span><span style="display:flex;"><span>QThread<span style="color:#f92672">::</span>NormalPriority
</span></span><span style="display:flex;"><span>QThread<span style="color:#f92672">::</span>HighPriority
</span></span><span style="display:flex;"><span>QThread<span style="color:#f92672">::</span>HighestPriority
</span></span><span style="display:flex;"><span>QThread<span style="color:#f92672">::</span>TimeCriticalPriority
</span></span><span style="display:flex;"><span>QThread<span style="color:#f92672">::</span>InheritPriority     <span style="color:#f92672">--&gt;</span> <span style="color:#960050;background-color:#1e0010">默认优先级，最高优先级</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">// 退出线程，停止底层的事件循环
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">// 退出线程的工作函数
</span></span></span><span style="display:flex;"><span><span style="color:#66d9ef">void</span> QThread<span style="color:#f92672">::</span>exit(<span style="color:#66d9ef">int</span> returnCode <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>);
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">// 调用线程退出函数之后，线程不会马上退出因为当前任务有可能还没有完成，调用这个函数是
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">// 等待任务完成，然后退出线程，一般情况下会在 exit() 后边调用这个函数
</span></span></span><span style="display:flex;"><span><span style="color:#66d9ef">bool</span> QThread<span style="color:#f92672">::</span>wait(<span style="color:#66d9ef">unsigned</span> <span style="color:#66d9ef">long</span> time <span style="color:#f92672">=</span> ULONG_MAX);
</span></span></code></pre></div><h3 id="12-信号槽">
<a class="header-anchor" href="#12-%e4%bf%a1%e5%8f%b7%e6%a7%bd"></a>
1.2 信号槽
</h3><div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-cpp" data-lang="cpp"><span style="display:flex;"><span><span style="color:#75715e">// 和调用 exit() 效果是一样的
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">// 调用这个函数之后，再调用 wait() 函数
</span></span></span><span style="display:flex;"><span>[slot] <span style="color:#66d9ef">void</span> QThread<span style="color:#f92672">::</span>quit();
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">// 启动子线程
</span></span></span><span style="display:flex;"><span>[slot] <span style="color:#66d9ef">void</span> QThread<span style="color:#f92672">::</span>start(Priority priority <span style="color:#f92672">=</span> InheritPriority);
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">// 线程退出，可能是会马上终止线程，一般情况下不使用这个函数
</span></span></span><span style="display:flex;"><span>[slot] <span style="color:#66d9ef">void</span> QThread<span style="color:#f92672">::</span>terminate();
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">// 线程中执行的任务完成了，发出该信号
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">// 任务函数中的处理逻辑执行完毕了
</span></span></span><span style="display:flex;"><span>[signal] <span style="color:#66d9ef">void</span> QThread<span style="color:#f92672">::</span>finished();
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">// 开始工作之前发出这个信号，一般不使用
</span></span></span><span style="display:flex;"><span>[signal] <span style="color:#66d9ef">void</span> QThread<span style="color:#f92672">::</span>started();
</span></span></code></pre></div><h3 id="13-静态函数">
<a class="header-anchor" href="#13-%e9%9d%99%e6%80%81%e5%87%bd%e6%95%b0"></a>
1.3 静态函数
</h3><div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-cpp" data-lang="cpp"><span style="display:flex;"><span><span style="color:#75715e">// 返回一个指向管理当前执行线程的QThread的指针
</span></span></span><span style="display:flex;"><span>[<span style="color:#66d9ef">static</span>] QThread <span style="color:#f92672">*</span>QThread<span style="color:#f92672">::</span>currentThread();
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">// 返回可以在系统上运行的理想线程数 == 和当前电脑的 CPU 核心数相同
</span></span></span><span style="display:flex;"><span>[<span style="color:#66d9ef">static</span>] <span style="color:#66d9ef">int</span> QThread<span style="color:#f92672">::</span>idealThreadCount();
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">// 线程休眠函数
</span></span></span><span style="display:flex;"><span>[<span style="color:#66d9ef">static</span>] <span style="color:#66d9ef">void</span> QThread<span style="color:#f92672">::</span>msleep(<span style="color:#66d9ef">unsigned</span> <span style="color:#66d9ef">long</span> msecs);    <span style="color:#75715e">// 单位: 毫秒
</span></span></span><span style="display:flex;"><span>[<span style="color:#66d9ef">static</span>] <span style="color:#66d9ef">void</span> QThread<span style="color:#f92672">::</span>sleep(<span style="color:#66d9ef">unsigned</span> <span style="color:#66d9ef">long</span> secs);     <span style="color:#75715e">// 单位: 秒
</span></span></span><span style="display:flex;"><span>[<span style="color:#66d9ef">static</span>] <span style="color:#66d9ef">void</span> QThread<span style="color:#f92672">::</span>usleep(<span style="color:#66d9ef">unsigned</span> <span style="color:#66d9ef">long</span> usecs);    <span style="color:#75715e">// 单位: 微秒
</span></span></span></code></pre></div><h3 id="14-任务处理函数">
<a class="header-anchor" href="#14-%e4%bb%bb%e5%8a%a1%e5%a4%84%e7%90%86%e5%87%bd%e6%95%b0"></a>
1.4 任务处理函数
</h3><div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-cxx" data-lang="cxx"><span style="display:flex;"><span><span style="color:#75715e">// 子线程要处理什么任务，需要写到run()中
</span></span></span><span style="display:flex;"><span>[<span style="color:#66d9ef">virtual</span> <span style="color:#66d9ef">protected</span>] <span style="color:#66d9ef">void</span> QThread<span style="color:#f92672">::</span>run();
</span></span></code></pre></div><p>这个 run() 是一个虚函数，如果想让创建的子线程执行某个任务，需要写一个子类让其继承 QThread，并且在子类中重写父类的 run() 方法，函数体就是对应的任务处理流程。另外，这个函数是一个受保护的成员函数，不能够在类的外部调用，如果想要让线程执行这个函数中的业务流程，需要通过当前线程对象调用槽函数 start() 启动子线程，当子线程被启动，这个 run() 函数就在线程内部被调用了。</p>
        
        <hr><p>本文2026-07-14首发于<a href='https://example.org/'>Edward's Blog</a>，最后修改于2026-07-14</p>]]>
      </description>
      
        <category>Qt</category>
      
    </item>
    
    

    <item>
      <title>解决类原生安卓（如LineageOS）显示WIFI网络受限问题</title>
      <link>https://example.org/post/%E8%A7%A3%E5%86%B3%E7%B1%BB%E5%8E%9F%E7%94%9F%E5%AE%89%E5%8D%93%E5%A6%82lineageos%E6%98%BE%E7%A4%BAwifi%E7%BD%91%E7%BB%9C%E5%8F%97%E9%99%90%E9%97%AE%E9%A2%98/</link>
      <pubDate>Thu, 22 Jan 2026 19:19:51 &#43;0800</pubDate>
      <author>xxx@example.com (D-Sketon)</author>
      <guid>https://example.org/post/%E8%A7%A3%E5%86%B3%E7%B1%BB%E5%8E%9F%E7%94%9F%E5%AE%89%E5%8D%93%E5%A6%82lineageos%E6%98%BE%E7%A4%BAwifi%E7%BD%91%E7%BB%9C%E5%8F%97%E9%99%90%E9%97%AE%E9%A2%98/</guid>
      <description>
        <![CDATA[<h1>解决类原生安卓（如LineageOS）显示WIFI网络受限问题</h1><p>作者：D-Sketon（xxx@example.com）</p>
        
          <p>如题，为了解决该问题，有以下几个步骤：</p>
<h2 id="1下载安卓调试桥工具adb">
<a class="header-anchor" href="#1%e4%b8%8b%e8%bd%bd%e5%ae%89%e5%8d%93%e8%b0%83%e8%af%95%e6%a1%a5%e5%b7%a5%e5%85%b7adb"></a>
1、下载安卓调试桥工具（ADB）
</h2><p>下载地址 <em><a href="https://developer.android.google.cn/tools/releases/platform-tools?hl=zh-cn">https://developer.android.google.cn/tools/releases/platform-tools?hl=zh-cn</a></em></p>
<h2 id="2adb调试">
<a class="header-anchor" href="#2adb%e8%b0%83%e8%af%95"></a>
2、adb调试
</h2><ul>
<li>
<p>先删除默认的验证地址：</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-powershell" data-lang="powershell"><span style="display:flex;"><span>adb shell settings delete global captive_portal_http_url
</span></span><span style="display:flex;"><span>adb shell settings delete global captive_portal_https_url
</span></span></code></pre></div></li>
<li>
<p>再修改新的验证服务器地址：</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-powershell" data-lang="powershell"><span style="display:flex;"><span>adb shell settings put global captive_portal_https_url https<span style="color:#960050;background-color:#1e0010">:</span>//connect.rom.miui.com/generate_204
</span></span><span style="display:flex;"><span>adb shell settings put global captive_portal_http_url http<span style="color:#960050;background-color:#1e0010">:</span>//connect.rom.miui.com/generate_204
</span></span></code></pre></div></li>
<li>
<p>更新时钟同步服务器地址：</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-powershell" data-lang="powershell"><span style="display:flex;"><span>adb shell settings put global ntp_server ntp1.aliyun.com
</span></span></code></pre></div></li>
<li>
<p>当这些命令执行完毕之后，打开飞行模式，在关闭飞行模式，或重启手机后叉号或叹号即可去除。</p>
</li>
</ul>
        
        <hr><p>本文2026-01-22首发于<a href='https://example.org/'>Edward's Blog</a>，最后修改于2026-01-22</p>]]>
      </description>
      
        <category>Android</category>
      
    </item>
    
    

    <item>
      <title>如何解决Linux和Window双系统时间不同步</title>
      <link>https://example.org/post/%E5%A6%82%E4%BD%95%E8%A7%A3%E5%86%B3linux%E5%92%8Cwindow%E5%8F%8C%E7%B3%BB%E7%BB%9F%E6%97%B6%E9%97%B4%E4%B8%8D%E5%90%8C%E6%AD%A5/</link>
      <pubDate>Sat, 17 Jan 2026 13:43:03 &#43;0800</pubDate>
      <author>xxx@example.com (D-Sketon)</author>
      <guid>https://example.org/post/%E5%A6%82%E4%BD%95%E8%A7%A3%E5%86%B3linux%E5%92%8Cwindow%E5%8F%8C%E7%B3%BB%E7%BB%9F%E6%97%B6%E9%97%B4%E4%B8%8D%E5%90%8C%E6%AD%A5/</guid>
      <description>
        <![CDATA[<h1>如何解决Linux和Window双系统时间不同步</h1><p>作者：D-Sketon（xxx@example.com）</p>
        
          <p>当你在电脑上同时装上 Windows 和 Linux（Ubuntu）双系统时，可能会出现两个系统时间不同步问题。因此，本文将指导如何解决这个问题。</p>
<h3 id="原因">
<a class="header-anchor" href="#%e5%8e%9f%e5%9b%a0"></a>
原因
</h3><p>首先我们要了解一个概念 BIOS 时间，它由主板上的实时时钟（RTC）维护。</p>
<p>时间不同步的原因是 Windows 系统与 Linux 系统对 BIOS 时间的理解不同。</p>
<p>在 Windows 上，BIOS 时间就是当地时间，因此 Windows 会直接显示该时间；而 Linux 则将 BIOS 时间当成 UTC 时间（格林尼治标准时间），因此 Linux 会将在 BIOS 时间基础上加上你本地的时差。</p>
<p>当你启动一个系统时，该系统会对 BIOS 时间进行修改，从而导致另一个系统的时间出现错误。</p>
<h3 id="解决方法">
<a class="header-anchor" href="#%e8%a7%a3%e5%86%b3%e6%96%b9%e6%b3%95"></a>
解决方法
</h3><h4 id="修改-linux-配置适用于以-windows-为主系统">
<a class="header-anchor" href="#%e4%bf%ae%e6%94%b9-linux-%e9%85%8d%e7%bd%ae%e9%80%82%e7%94%a8%e4%ba%8e%e4%bb%a5-windows-%e4%b8%ba%e4%b8%bb%e7%b3%bb%e7%bb%9f"></a>
修改 Linux 配置（适用于以 Windows 为主系统）
</h4><p>这种方式是让 Linux 系统来适配 Windows 的本地时间规则。</p>
<ul>
<li>在 Linux 中打开终端，执行以下命令
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>timedatectl set-local-rtc <span style="color:#ae81ff">1</span> --adjust-system-clock
</span></span></code></pre></div></li>
<li>验证配置是否生效
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>timedatectl
</span></span></code></pre></div>输出中如果出现 RTC in local TZ: yes，就说明配置成功。</li>
</ul>
<h3 id="修改-windows-配置适用于以-linux-为主系统">
<a class="header-anchor" href="#%e4%bf%ae%e6%94%b9-windows-%e9%85%8d%e7%bd%ae%e9%80%82%e7%94%a8%e4%ba%8e%e4%bb%a5-linux-%e4%b8%ba%e4%b8%bb%e7%b3%bb%e7%bb%9f"></a>
修改 Windows 配置（适用于以 Linux 为主系统）
</h3><p>这种方式让 Windows 适配 Linux 的 UTC 规则，需要修改 Windows 注册表。</p>
        
        <hr><p>本文2026-01-17首发于<a href='https://example.org/'>Edward's Blog</a>，最后修改于2026-01-17</p>]]>
      </description>
      
        <category>Linux</category>
      
    </item>
    
  </channel>
</rss>
