<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>规范协议技术onDocs</title><link>https://hiraethecho.github.io/docs/categories/%E8%A7%84%E8%8C%83%E5%8D%8F%E8%AE%AE%E6%8A%80%E6%9C%AF/</link><description>Recent contentin规范协议技术onDocs</description><generator>Hugo --0.152.2</generator><language>en</language><managingEditor>wyz2016zxc@outlook.com(Hiraeth)</managingEditor><webMaster>wyz2016zxc@outlook.com(Hiraeth)</webMaster><lastBuildDate>Mon, 16 Mar 2026 15:39:39 +0800</lastBuildDate><atom:link href="https://hiraethecho.github.io/docs/categories/%E8%A7%84%E8%8C%83%E5%8D%8F%E8%AE%AE%E6%8A%80%E6%9C%AF/index.xml" rel="self" type="application/rss+xml"/><item><title>git底层设计</title><link>https://hiraethecho.github.io/docs/dev/git-base/</link><pubDate>Wed, 17 Dec 2025 00:00:00 +0000</pubDate><author>wyz2016zxc@outlook.com(Hiraeth)</author><guid>https://hiraethecho.github.io/docs/dev/git-base/</guid><description>了解了一下git的底层实现方式，感觉很厉害，记录一下</description><content:encoded><![CDATA[<h1 id="git底层设计">
  <a class="anchor inpage" href="#git%e5%ba%95%e5%b1%82%e8%ae%be%e8%ae%a1">#</a>git底层设计</h1>
<p>git是Linus的分布式版本控制软件，据说用了一周写出来，太强了。</p>
<h2 id="目标">
  <a class="anchor inpage" href="#%e7%9b%ae%e6%a0%87">##</a>目标</h2>
<p>版本控制的目标是，记录每次更改，或者说记录每个版本。除此之外还有额外要求：</p>
<ul>
<li>低成本创建分支</li>
<li>保证版本内容的可信性，不被篡改</li>
<li>分布式</li>
</ul>
<h2 id="思路">
  <a class="anchor inpage" href="#%e6%80%9d%e8%b7%af">##</a>思路</h2>
<p>我第一个想到的实现方式是，增量存储，记录变更的内容。换句话说，存储的是一堆diff文件。这样的好处是，理论上存储空间会小。但是每一个版本的内容都会是从某一个版本为基础根据diff计算而来。</p>
<p>然而，信息的存储方式其实只是技术细节，关键的问题在于，如何把部分信息提取出来，组成一个版本的文件。
按照我的理解用比喻的方式描述。</p>
<p>假设现在写一本书，但是不是线性写作，而是多个章节同时开始，内容写在一个活页本上。<br>
第一天分别写了一二三节的开头，写在三页纸上，这三页纸有各自的名字，暂且称为a, b, c。再用一张小纸条，记录内容是<em>a, b, c是第一个版本的内容</em>，这个小纸条也有个名字，暂称为A。把它们放进活页本里。<br>
第二天重写了第二节，写在新的一张纸上，这张纸名字是d。同样的，有另一张小纸条，记录内容是<em>a, d, c是第二个版本的内容</em>，这个小纸条的名字记为B。再把它们放进活页本里。<br>
这样，我们就有A, B两个版本了。</p>
<h2 id="目标的实现">
  <a class="anchor inpage" href="#%e7%9b%ae%e6%a0%87%e7%9a%84%e5%ae%9e%e7%8e%b0">##</a>目标的实现</h2>
<p>沿用上面的比喻，接下来是一些额外的结构，来使用上述思路实现目标。</p>
<p>首先是分支。其实分支就只是又一个小纸条，贴在A, B这样的小纸条上。比如我是书的主要作者，我在B上贴一个main。我的合作者在A的基础上重写了第三节，写在e这张纸上，并且有个C记录<em>a, b, e</em>，在C上就可以有一个dev的小纸条，这就是dev分支。<br>
保证版本内容的可信性，有2个细节。第一，名字a, b, c和A, B, C其实是sha1，这样可以确保内容和名称匹配。第二，B, C上除了内容，其实还包括它的上一个版本，也就是说B还记录了A的名字，这就保证了历史的可信性。<br>
除此之外，git还使用了内容寻址的存储方式。这张纸a的文件名就是a，而a是内容的sha1，所以不同内容的纸不会在这里，很容易检验信息的真实性。<br>
至于分布式，由于分支只是一个小标签，这就自动满足了。</p>
<h2 id="ref">
  <a class="anchor inpage" href="#ref">##</a>ref</h2>
<p>
</p>
]]></content:encoded></item><item><title>latex基本概念</title><link>https://hiraethecho.github.io/docs/software/latex/</link><pubDate>Mon, 25 Aug 2025 00:00:00 +0000</pubDate><author>wyz2016zxc@outlook.com(Hiraeth)</author><guid>https://hiraethecho.github.io/docs/software/latex/</guid><description>&lt;h1 id="latex概览"&gt;
&lt;a class="anchor inpage" href="#latex%e6%a6%82%e8%a7%88"&gt;#&lt;/a&gt;latex概览&lt;/h1&gt;
&lt;h2 id="tex-和-latex"&gt;
&lt;a class="anchor inpage" href="#tex-%e5%92%8c-latex"&gt;##&lt;/a&gt;tex 和 latex&lt;/h2&gt;
&lt;h3 id="1-tex底层排版引擎"&gt;
&lt;a class="anchor inpage" href="#1-tex%e5%ba%95%e5%b1%82%e6%8e%92%e7%89%88%e5%bc%95%e6%93%8e"&gt;###&lt;/a&gt;&lt;strong&gt;1. TeX：底层排版引擎&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;作者&lt;/strong&gt;：Donald Knuth（高德纳）开发，1978 年发布。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;定位&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;是一个&lt;strong&gt;底层的排版编程语言&lt;/strong&gt;，提供精确的排版控制（如盒模型、断行算法、数学公式布局等）。&lt;/li&gt;
&lt;li&gt;语法类似编程（需手动处理格式细节），适合专业人士或极客。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;特点&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;直接操作命令（如 &lt;code&gt;\hbox&lt;/code&gt;, &lt;code&gt;\vskip&lt;/code&gt;）。&lt;/li&gt;
&lt;li&gt;默认生成 &lt;code&gt;.dvi&lt;/code&gt; 文件（需转换为 PDF/PS）。&lt;/li&gt;
&lt;li&gt;无预定义的高层结构（如章节、目录需手动实现）。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;示例（纯 TeX 代码）&lt;/strong&gt;：&lt;/p&gt;</description><content:encoded><![CDATA[<h1 id="latex概览">
  <a class="anchor inpage" href="#latex%e6%a6%82%e8%a7%88">#</a>latex概览</h1>
<h2 id="tex-和-latex">
  <a class="anchor inpage" href="#tex-%e5%92%8c-latex">##</a>tex 和 latex</h2>
<h3 id="1-tex底层排版引擎">
  <a class="anchor inpage" href="#1-tex%e5%ba%95%e5%b1%82%e6%8e%92%e7%89%88%e5%bc%95%e6%93%8e">###</a><strong>1. TeX：底层排版引擎</strong></h3>
<ul>
<li><strong>作者</strong>：Donald Knuth（高德纳）开发，1978 年发布。</li>
<li><strong>定位</strong>：
<ul>
<li>是一个<strong>底层的排版编程语言</strong>，提供精确的排版控制（如盒模型、断行算法、数学公式布局等）。</li>
<li>语法类似编程（需手动处理格式细节），适合专业人士或极客。</li>
</ul>
</li>
<li><strong>特点</strong>：
<ul>
<li>直接操作命令（如 <code>\hbox</code>, <code>\vskip</code>）。</li>
<li>默认生成 <code>.dvi</code> 文件（需转换为 PDF/PS）。</li>
<li>无预定义的高层结构（如章节、目录需手动实现）。</li>
</ul>
</li>
</ul>
<p><strong>示例（纯 TeX 代码）</strong>：</p>
<details open>
    <summary>tex</summary><pre
        class="chroma codeblock"
      ><code class="language-tex" data-lang="tex"
          ><span style="display:flex;"><span><span style="color:#66d9ef">\font\myfont</span>=cmr12 at 14pt
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">\myfont</span> Hello, <span style="color:#66d9ef">\TeX</span>!
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">\bye</span></span></span></code
        ><button onclick="copyCode(this)" class="copybtn">copy</button></pre></details>

  <script>
    function copyCode(btn) {
      const code = btn.previousElementSibling.textContent.trim();
      navigator.clipboard.writeText(code).then(() => {
        btn.innerText = "copied";
        setTimeout(() => (btn.innerText = "copy"), 2000);
      });
    }
  </script><h3 id="2-latex基于-tex-的高级封装">
  <a class="anchor inpage" href="#2-latex%e5%9f%ba%e4%ba%8e-tex-%e7%9a%84%e9%ab%98%e7%ba%a7%e5%b0%81%e8%a3%85">###</a><strong>2. LaTeX：基于 TeX 的高级封装</strong></h3>
<ul>
<li><strong>作者</strong>：Leslie Lamport（莱斯利·兰波特）开发，1984 年发布。</li>
<li><strong>定位</strong>：
<ul>
<li>是 <strong>TeX 的宏包集合</strong>（一组预定义的命令和模板），提供<strong>文档逻辑结构</strong>（如章节、参考文献、交叉引用）。</li>
<li>隐藏了 TeX 的底层复杂性，用户只需关注内容。</li>
</ul>
</li>
<li><strong>特点</strong>：
<ul>
<li>提供标准文档类（如 <code>article</code>, <code>book</code>）。</li>
<li>内置自动化功能（目录、编号、参考文献管理）。</li>
<li>依赖宏包扩展功能（如 <code>graphicx</code> 插入图片、<code>amsmath</code> 增强数学公式）。</li>
</ul>
</li>
</ul>
<p><strong>示例（LaTeX 代码）</strong>：</p>
<details open>
    <summary>tex</summary><pre
        class="chroma codeblock"
      ><code class="language-tex" data-lang="tex"
          ><span style="display:flex;"><span><span style="color:#66d9ef">\documentclass</span>{article}
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">\begin</span>{document}
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">\section</span>{Introduction}
</span></span><span style="display:flex;"><span>Hello, <span style="color:#66d9ef">\LaTeX</span>!
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">\end</span>{document}</span></span></code
        ><button onclick="copyCode(this)" class="copybtn">copy</button></pre></details>

  <script>
    function copyCode(btn) {
      const code = btn.previousElementSibling.textContent.trim();
      navigator.clipboard.writeText(code).then(() => {
        btn.innerText = "copied";
        setTimeout(() => (btn.innerText = "copy"), 2000);
      });
    }
  </script><h3 id="核心区别">
  <a class="anchor inpage" href="#%e6%a0%b8%e5%bf%83%e5%8c%ba%e5%88%ab">###</a><strong>核心区别</strong></h3>
<table>
  <thead>
      <tr>
          <th>特性</th>
          <th>TeX</th>
          <th>LaTeX</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><strong>设计目标</strong></td>
          <td>底层排版控制</td>
          <td>高层文档结构</td>
      </tr>
      <tr>
          <td><strong>语法复杂度</strong></td>
          <td>复杂（类似编程）</td>
          <td>简单（声明式）</td>
      </tr>
      <tr>
          <td><strong>典型用户</strong></td>
          <td>排版系统开发者、极客</td>
          <td>学术作者、普通用户</td>
      </tr>
      <tr>
          <td><strong>扩展性</strong></td>
          <td>需手动实现一切</td>
          <td>通过宏包（如 <code>hyperref</code>）扩展</td>
      </tr>
      <tr>
          <td><strong>默认输出</strong></td>
          <td><code>.dvi</code></td>
          <td><code>.dvi</code> 或 <code>.pdf</code>（现代工具链）</td>
      </tr>
  </tbody>
</table>
<h3 id="类比解释">
  <a class="anchor inpage" href="#%e7%b1%bb%e6%af%94%e8%a7%a3%e9%87%8a">###</a><strong>类比解释</strong></h3>
<ul>
<li><strong>TeX 类似汇编语言</strong>：
<ul>
<li>直接控制硬件（排版细节），但编写复杂。</li>
</ul>
</li>
<li><strong>LaTeX 类似高级语言（如 Python）</strong>：
<ul>
<li>通过抽象（如 <code>\section</code>）隐藏细节，提升效率。</li>
</ul>
</li>
</ul>
<h3 id="技术关系">
  <a class="anchor inpage" href="#%e6%8a%80%e6%9c%af%e5%85%b3%e7%b3%bb">###</a><strong>技术关系</strong></h3>
<ul>
<li>LaTeX 本质是一组 TeX 宏（<code>.sty</code> 文件），最终仍由 TeX 引擎（如 <code>pdftex</code>, <code>xetex</code>, <code>luatex</code>）执行。</li>
<li>编译流程示例：
<details open>
    <summary>sh</summary><pre
        class="chroma codeblock"
      ><code class="language-sh" data-lang="sh"
          ><span style="display:flex;"><span>latex document.tex   <span style="color:#75715e"># 调用 pdftex 引擎处理 LaTeX 宏</span>
</span></span><span style="display:flex;"><span>xelatex document.tex <span style="color:#75715e"># 调用 xetex 引擎处理 LaTeX 宏</span></span></span></code
        ><button onclick="copyCode(this)" class="copybtn">copy</button></pre></details>

  <script>
    function copyCode(btn) {
      const code = btn.previousElementSibling.textContent.trim();
      navigator.clipboard.writeText(code).then(() => {
        btn.innerText = "copied";
        setTimeout(() => (btn.innerText = "copy"), 2000);
      });
    }
  </script></li>
</ul>
<h3 id="总结">
  <a class="anchor inpage" href="#%e6%80%bb%e7%bb%93">###</a><strong>总结</strong></h3>
<ul>
<li><strong>TeX 是引擎，LaTeX 是模板</strong>。</li>
<li>LaTeX 让用户摆脱 TeX 的底层复杂性，专注于内容逻辑。</li>
<li>现代用户通常直接使用 <code>pdflatex</code>/<code>xelatex</code>/<code>lualatex</code>，无需接触原始 TeX 命令。</li>
</ul>
<p>如果需要进一步解释某个具体细节（如宏包机制或引擎差异），可以继续讨论！</p>
<h2 id="引擎和使用">
  <a class="anchor inpage" href="#%e5%bc%95%e6%93%8e%e5%92%8c%e4%bd%bf%e7%94%a8">##</a>引擎和使用</h2>
<h3 id="1-排版引擎engines">
  <a class="anchor inpage" href="#1-%e6%8e%92%e7%89%88%e5%bc%95%e6%93%8eengines">###</a><strong>1. 排版引擎（Engines）</strong></h3>
<p>引擎是实际执行排版工作的底层程序，负责解析代码、计算布局并生成输出文件（如 PDF/DVI）。<br>
<strong>属于引擎的有</strong>：</p>
<ul>
<li><code>tex</code>：Knuth 原始 TeX 引擎（生成 <code>.dvi</code>）。</li>
<li><code>pdftex</code>：扩展的 TeX 引擎，直接生成 PDF（<code>pdflatex</code> 的基础）。</li>
<li><code>xetex</code>（XeTeX）：支持 Unicode 和系统字体的引擎（<code>xelatex</code> 的基础）。</li>
<li><code>luatex</code>（LuaTeX）：内嵌 Lua 脚本的引擎（<code>lualatex</code> 的基础）。</li>
</ul>
<h3 id="2-模板格式formats">
  <a class="anchor inpage" href="#2-%e6%a8%a1%e6%9d%bf%e6%a0%bc%e5%bc%8fformats">###</a><strong>2. 模板/格式（Formats）</strong></h3>
<p>格式是基于引擎的预定义命令集合（宏包），提供高层抽象，简化用户操作。<br>
<strong>属于格式的有</strong>：</p>
<ul>
<li><code>latex</code>：LaTeX 格式（运行在 <code>pdftex</code>/<code>xetex</code>/<code>luatex</code> 等引擎上）。
<ul>
<li>不是独立引擎，而是通过 <code>latex</code> 命令调用引擎（如 <code>pdftex + LaTeX 宏</code> → <code>pdflatex</code>）。</li>
</ul>
</li>
<li><code>plain tex</code>：Knuth 提供的极简格式（比原始 TeX 稍友好，但远不如 LaTeX）。</li>
<li><code>contex</code>：另一种高级格式（基于 LuaTeX，适合复杂排版）。</li>
</ul>
<h3 id="3-前端命令frontends">
  <a class="anchor inpage" href="#3-%e5%89%8d%e7%ab%af%e5%91%bd%e4%bb%a4frontends">###</a><strong>3. 前端命令（Frontends）</strong></h3>
<p>用户直接调用的命令，本质是 <strong>“引擎 + 格式” 的组合</strong>：</p>
<table>
  <thead>
      <tr>
          <th>命令</th>
          <th>实际调用</th>
          <th>说明</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>latex</code></td>
          <td><code>pdftex + LaTeX 格式</code></td>
          <td>传统 LaTeX（DVI 输出）。</td>
      </tr>
      <tr>
          <td><code>pdflatex</code></td>
          <td><code>pdftex + LaTeX 格式</code></td>
          <td>直接生成 PDF（无 Unicode 支持）。</td>
      </tr>
      <tr>
          <td><code>xelatex</code></td>
          <td><code>xetex + LaTeX 格式</code></td>
          <td>支持 Unicode 和系统字体。</td>
      </tr>
      <tr>
          <td><code>lualatex</code></td>
          <td><code>luatex + LaTeX 格式</code></td>
          <td>支持 Lua 脚本和现代字体。</td>
      </tr>
  </tbody>
</table>
<h3 id="关键区分">
  <a class="anchor inpage" href="#%e5%85%b3%e9%94%ae%e5%8c%ba%e5%88%86">###</a><strong>关键区分</strong></h3>
<ul>
<li><strong>引擎</strong>：<code>tex</code>, <code>pdftex</code>, <code>xetex</code>, <code>luatex</code>（核心执行者）。</li>
<li><strong>格式</strong>：<code>latex</code>, <code>plain tex</code>, <code>contex</code>（定义高级命令的规则）。</li>
<li><strong>前端命令</strong>：<code>latex</code>, <code>pdflatex</code>, <code>xelatex</code>, <code>lualatex</code>（组合引擎和格式的快捷方式）。</li>
</ul>
<h3 id="常见误解澄清">
  <a class="anchor inpage" href="#%e5%b8%b8%e8%a7%81%e8%af%af%e8%a7%a3%e6%be%84%e6%b8%85">###</a><strong>常见误解澄清</strong></h3>
<ol>
<li><strong><code>latex</code> 不是引擎</strong>：
<ul>
<li>它是 LaTeX 格式通过 <code>pdftex</code> 引擎运行的接口（命令）。</li>
</ul>
</li>
<li><strong><code>pdflatex</code> vs <code>pdftex</code></strong>：
<ul>
<li><code>pdftex</code> 是引擎，<code>pdflatex</code> = <code>pdftex</code> + LaTeX 格式。</li>
</ul>
</li>
</ol>
<hr>
<h2 id="引擎engines">
  <a class="anchor inpage" href="#%e5%bc%95%e6%93%8eengines">##</a>引擎（Engines）</h2>
<h3 id="基础引擎">
  <a class="anchor inpage" href="#%e5%9f%ba%e7%a1%80%e5%bc%95%e6%93%8e">###</a>基础引擎</h3>
<table>
  <thead>
      <tr>
          <th>引擎名称</th>
          <th>特点</th>
          <th>输出格式</th>
          <th>主要用途</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><strong>tex</strong></td>
          <td>Knuth原始引擎，底层控制</td>
          <td>.dvi</td>
          <td>历史兼容、底层排版开发</td>
      </tr>
      <tr>
          <td><strong>pdftex</strong></td>
          <td>TeX的扩展，直接PDF输出</td>
          <td>.pdf</td>
          <td>传统LaTeX文档排版</td>
      </tr>
      <tr>
          <td><strong>xetex</strong> (XeTeX)</td>
          <td>支持Unicode和系统字体</td>
          <td>.xdv/.pdf</td>
          <td>多语言排版、系统字体支持</td>
      </tr>
      <tr>
          <td><strong>luatex</strong> (LuaTeX)</td>
          <td>内嵌Lua解释器，动态脚本</td>
          <td>.pdf</td>
          <td>复杂排版、自动化处理</td>
      </tr>
  </tbody>
</table>
<h3 id="引擎特性对比">
  <a class="anchor inpage" href="#%e5%bc%95%e6%93%8e%e7%89%b9%e6%80%a7%e5%af%b9%e6%af%94">###</a>引擎特性对比</h3>
<table>
  <thead>
      <tr>
          <th>特性</th>
          <th>tex</th>
          <th>pdftex</th>
          <th>xetex</th>
          <th>luatex</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Unicode支持</td>
          <td>❌</td>
          <td>❌</td>
          <td>✔️</td>
          <td>✔️</td>
      </tr>
      <tr>
          <td>OpenType字体</td>
          <td>❌</td>
          <td>❌</td>
          <td>✔️</td>
          <td>✔️</td>
      </tr>
      <tr>
          <td>Lua脚本</td>
          <td>❌</td>
          <td>❌</td>
          <td>❌</td>
          <td>✔️</td>
      </tr>
      <tr>
          <td>系统字体</td>
          <td>❌</td>
          <td>❌</td>
          <td>✔️</td>
          <td>✔️</td>
      </tr>
      <tr>
          <td>输出格式</td>
          <td>DVI</td>
          <td>PDF</td>
          <td>XDV/PDF</td>
          <td>PDF</td>
      </tr>
  </tbody>
</table>
<h2 id="格式formats">
  <a class="anchor inpage" href="#%e6%a0%bc%e5%bc%8fformats">##</a>格式（Formats）</h2>
<h3 id="主要格式">
  <a class="anchor inpage" href="#%e4%b8%bb%e8%a6%81%e6%a0%bc%e5%bc%8f">###</a>主要格式</h3>
<table>
  <thead>
      <tr>
          <th>格式名称</th>
          <th>基于引擎</th>
          <th>特点</th>
          <th>适用场景</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><strong>plain tex</strong></td>
          <td>tex</td>
          <td>Knuth提供的极简格式</td>
          <td>底层TeX编程</td>
      </tr>
      <tr>
          <td><strong>latex</strong></td>
          <td>多引擎</td>
          <td>高级文档结构，宏包丰富</td>
          <td>学术论文、书籍、报告</td>
      </tr>
      <tr>
          <td><strong>contex</strong></td>
          <td>luatex</td>
          <td>模块化设计，强大功能</td>
          <td>复杂排版、图形密集型文档</td>
      </tr>
  </tbody>
</table>
<h2 id="前端命令frontend-commands">
  <a class="anchor inpage" href="#%e5%89%8d%e7%ab%af%e5%91%bd%e4%bb%a4frontend-commands">##</a>前端命令（Frontend Commands）</h2>
<h3 id="常用命令组合">
  <a class="anchor inpage" href="#%e5%b8%b8%e7%94%a8%e5%91%bd%e4%bb%a4%e7%bb%84%e5%90%88">###</a>常用命令组合</h3>
<table>
  <thead>
      <tr>
          <th>命令</th>
          <th>实际组成</th>
          <th>输出格式</th>
          <th>特点</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>tex</code></td>
          <td>tex + plain tex</td>
          <td>.dvi</td>
          <td>原始TeX排版</td>
      </tr>
      <tr>
          <td><code>latex</code></td>
          <td>pdftex + latex格式</td>
          <td>.dvi</td>
          <td>传统LaTeX处理</td>
      </tr>
      <tr>
          <td><code>pdflatex</code></td>
          <td>pdftex + latex格式</td>
          <td>.pdf</td>
          <td>直接PDF输出</td>
      </tr>
      <tr>
          <td><code>xelatex</code></td>
          <td>xetex + latex格式</td>
          <td>.pdf</td>
          <td>Unicode和字体支持</td>
      </tr>
      <tr>
          <td><code>lualatex</code></td>
          <td>luatex + latex格式</td>
          <td>.pdf</td>
          <td>Lua脚本+现代特性</td>
      </tr>
  </tbody>
</table>
<h2 id="文件格式">
  <a class="anchor inpage" href="#%e6%96%87%e4%bb%b6%e6%a0%bc%e5%bc%8f">##</a>文件格式</h2>
<h3 id="输入文件类型">
  <a class="anchor inpage" href="#%e8%be%93%e5%85%a5%e6%96%87%e4%bb%b6%e7%b1%bb%e5%9e%8b">###</a>输入文件类型</h3>
<table>
  <thead>
      <tr>
          <th>扩展名</th>
          <th>类型</th>
          <th>说明</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>.tex</code></td>
          <td>源文件</td>
          <td>TeX/LaTeX源代码</td>
      </tr>
      <tr>
          <td><code>.sty</code></td>
          <td>宏包文件</td>
          <td>LaTeX功能扩展包</td>
      </tr>
      <tr>
          <td><code>.cls</code></td>
          <td>文档类</td>
          <td>文档类型定义</td>
      </tr>
      <tr>
          <td><code>.bib</code></td>
          <td>参考文献</td>
          <td>BibTeX数据库文件</td>
      </tr>
  </tbody>
</table>
<h3 id="输出文件类型">
  <a class="anchor inpage" href="#%e8%be%93%e5%87%ba%e6%96%87%e4%bb%b6%e7%b1%bb%e5%9e%8b">###</a>输出文件类型</h3>
<table>
  <thead>
      <tr>
          <th>扩展名</th>
          <th>生成工具</th>
          <th>说明</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>.dvi</code></td>
          <td>tex/latex</td>
          <td>设备无关文件</td>
      </tr>
      <tr>
          <td><code>.pdf</code></td>
          <td>pdflatex/xelatex/lualatex</td>
          <td>便携文档格式</td>
      </tr>
      <tr>
          <td><code>.xdv</code></td>
          <td>xetex</td>
          <td>扩展DVI格式</td>
      </tr>
      <tr>
          <td><code>.aux</code></td>
          <td>所有引擎</td>
          <td>辅助信息文件</td>
      </tr>
      <tr>
          <td><code>.log</code></td>
          <td>所有引擎</td>
          <td>编译日志文件</td>
      </tr>
  </tbody>
</table>
<h2 id="工具链组件">
  <a class="anchor inpage" href="#%e5%b7%a5%e5%85%b7%e9%93%be%e7%bb%84%e4%bb%b6">##</a>工具链组件</h2>
<h3 id="核心工具">
  <a class="anchor inpage" href="#%e6%a0%b8%e5%bf%83%e5%b7%a5%e5%85%b7">###</a>核心工具</h3>
<table>
  <thead>
      <tr>
          <th>工具名称</th>
          <th>用途</th>
          <th>示例</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><strong>texlua</strong></td>
          <td>Lua解释器</td>
          <td>运行TeX相关Lua脚本</td>
      </tr>
      <tr>
          <td><strong>kpsewhich</strong></td>
          <td>文件查找</td>
          <td>定位TeX文件位置</td>
      </tr>
      <tr>
          <td><strong>bibtex</strong></td>
          <td>参考文献处理</td>
          <td>生成参考文献列表</td>
      </tr>
      <tr>
          <td><strong>makeindex</strong></td>
          <td>索引生成</td>
          <td>创建文档索引</td>
      </tr>
  </tbody>
</table>
<h3 id="编译工具链">
  <a class="anchor inpage" href="#%e7%bc%96%e8%af%91%e5%b7%a5%e5%85%b7%e9%93%be">###</a>编译工具链</h3>
<pre class="mermaid">graph TD
    A[.tex源文件] --&gt; B{选择引擎}
    B --&gt; C[pdflatex]
    B --&gt; D[xelatex]
    B --&gt; E[lualatex]

    C --&gt; F[生成PDF]
    D --&gt; F
    E --&gt; F

    subgraph &#34;可选处理&#34;
        G[.bib文件] --&gt; H[bibtex]
        I[.idx文件] --&gt; J[makeindex]
        H --&gt; K[.bbl文件]
        J --&gt; L[.ind文件]
    end

    K --&gt; C
    L --&gt; C</pre><h2 id="选择指南">
  <a class="anchor inpage" href="#%e9%80%89%e6%8b%a9%e6%8c%87%e5%8d%97">##</a>选择指南</h2>
<h3 id="引擎选择建议">
  <a class="anchor inpage" href="#%e5%bc%95%e6%93%8e%e9%80%89%e6%8b%a9%e5%bb%ba%e8%ae%ae">###</a>引擎选择建议</h3>
<ol>
<li><strong>中文/多语言文档</strong>：<code>xelatex</code> 或 <code>lualatex</code></li>
<li><strong>传统英文文档</strong>：<code>pdflatex</code></li>
<li><strong>需要动态功能</strong>：<code>lualatex</code>（Lua脚本）</li>
<li><strong>底层开发</strong>：<code>tex</code> 或 <code>luatex</code></li>
</ol>
<h2 id="列举">
  <a class="anchor inpage" href="#%e5%88%97%e4%b8%be">##</a>列举</h2>
<h3 id="1">
  <a class="anchor inpage" href="#1">###</a><strong>1. <code>tex</code>（原始 TeX 引擎）</strong></h3>
<ul>
<li><strong>作用</strong>：Knuth 开发的原始 TeX 排版引擎，处理 <code>.tex</code> 文件并生成 <code>.dvi</code>（DeVice Independent）文件。</li>
<li><strong>特点</strong>：
<ul>
<li>仅支持传统的 TeX 命令，不支持现代字体（如 OpenType）。</li>
<li>主要用于历史兼容性或极简排版。</li>
</ul>
</li>
<li><strong>使用示例</strong>：
<details open>
    <summary>sh</summary><pre
        class="chroma codeblock"
      ><code class="language-sh" data-lang="sh"
          ><span style="display:flex;"><span>tex mydocument.tex  <span style="color:#75715e"># 生成 mydocument.dvi</span></span></span></code
        ><button onclick="copyCode(this)" class="copybtn">copy</button></pre></details>

  <script>
    function copyCode(btn) {
      const code = btn.previousElementSibling.textContent.trim();
      navigator.clipboard.writeText(code).then(() => {
        btn.innerText = "copied";
        setTimeout(() => (btn.innerText = "copy"), 2000);
      });
    }
  </script></li>
</ul>
<h3 id="2">
  <a class="anchor inpage" href="#2">###</a><strong>2. <code>latex</code>（LaTeX 格式 + pdfTeX 引擎）</strong></h3>
<ul>
<li><strong>作用</strong>：使用 <code>pdftex</code> 引擎处理 LaTeX 文档（<code>.tex</code>），默认生成 PDF（也可生成 DVI）。</li>
<li><strong>特点</strong>：
<ul>
<li>基于 <code>pdftex</code>，支持 PDF 输出、微调排版和基本字体扩展。</li>
<li>但不支持 Unicode 和 OpenType 字体（需额外宏包如 <code>fontspec</code>）。</li>
</ul>
</li>
<li><strong>使用示例</strong>：
<details open>
    <summary>sh</summary><pre
        class="chroma codeblock"
      ><code class="language-sh" data-lang="sh"
          ><span style="display:flex;"><span>latex mydocument.tex  <span style="color:#75715e"># 生成 mydocument.dvi</span>
</span></span><span style="display:flex;"><span>pdflatex mydocument.tex  <span style="color:#75715e"># 生成 mydocument.pdf</span></span></span></code
        ><button onclick="copyCode(this)" class="copybtn">copy</button></pre></details>

  <script>
    function copyCode(btn) {
      const code = btn.previousElementSibling.textContent.trim();
      navigator.clipboard.writeText(code).then(() => {
        btn.innerText = "copied";
        setTimeout(() => (btn.innerText = "copy"), 2000);
      });
    }
  </script></li>
</ul>
<h3 id="3">
  <a class="anchor inpage" href="#3">###</a><strong>3. <code>xetex</code>（XeTeX 引擎，支持 Unicode 和系统字体）</strong></h3>
<ul>
<li><strong>作用</strong>：TeX 引擎，原生支持 Unicode 和系统字体（如 <code>.ttf</code>/<code>.otf</code>）。</li>
<li><strong>特点</strong>：
<ul>
<li>直接调用系统字体，无需额外配置。</li>
<li>适用于多语言排版（如中文、阿拉伯语）。</li>
<li>输出格式为 <code>.xdv</code>（扩展 DVI），通常转换为 PDF。</li>
</ul>
</li>
<li><strong>使用示例</strong>：
<details open>
    <summary>sh</summary><pre
        class="chroma codeblock"
      ><code class="language-sh" data-lang="sh"
          ><span style="display:flex;"><span>xetex mydocument.tex  <span style="color:#75715e"># 生成 mydocument.xdv（通常自动转 PDF）</span></span></span></code
        ><button onclick="copyCode(this)" class="copybtn">copy</button></pre></details>

  <script>
    function copyCode(btn) {
      const code = btn.previousElementSibling.textContent.trim();
      navigator.clipboard.writeText(code).then(() => {
        btn.innerText = "copied";
        setTimeout(() => (btn.innerText = "copy"), 2000);
      });
    }
  </script></li>
</ul>
<h3 id="4">
  <a class="anchor inpage" href="#4">###</a><strong>4. <code>xelatex</code>（LaTeX + XeTeX 引擎）</strong></h3>
<ul>
<li><strong>作用</strong>：<code>latex</code> 的增强版，使用 <code>xetex</code> 引擎处理 LaTeX 文档，支持现代字体。</li>
<li><strong>特点</strong>：
<ul>
<li>支持 <code>fontspec</code> 宏包，可轻松使用系统字体。</li>
<li>适合中文排版（如配合 <code>ctex</code> 宏包）。</li>
</ul>
</li>
<li><strong>使用示例</strong>：
<details open>
    <summary>sh</summary><pre
        class="chroma codeblock"
      ><code class="language-sh" data-lang="sh"
          ><span style="display:flex;"><span>xelatex mydocument.tex  <span style="color:#75715e"># 直接生成 PDF</span></span></span></code
        ><button onclick="copyCode(this)" class="copybtn">copy</button></pre></details>

  <script>
    function copyCode(btn) {
      const code = btn.previousElementSibling.textContent.trim();
      navigator.clipboard.writeText(code).then(() => {
        btn.innerText = "copied";
        setTimeout(() => (btn.innerText = "copy"), 2000);
      });
    }
  </script></li>
</ul>
<h3 id="5">
  <a class="anchor inpage" href="#5">###</a><strong>5. <code>luatex</code>（LuaTeX 引擎，支持 Lua 脚本）</strong></h3>
<ul>
<li><strong>作用</strong>：扩展的 TeX 引擎，内置 Lua 解释器，允许动态脚本控制排版。</li>
<li><strong>特点</strong>：
<ul>
<li>支持 Unicode 和 OpenType 字体（类似 XeTeX）。</li>
<li>可通过 <code>\directlua{}</code> 嵌入 Lua 代码，实现高级自动化。</li>
<li>默认生成 PDF。</li>
</ul>
</li>
<li><strong>使用示例</strong>：
<details open>
    <summary>sh</summary><pre
        class="chroma codeblock"
      ><code class="language-sh" data-lang="sh"
          ><span style="display:flex;"><span>luatex mydocument.tex  <span style="color:#75715e"># 生成 PDF</span></span></span></code
        ><button onclick="copyCode(this)" class="copybtn">copy</button></pre></details>

  <script>
    function copyCode(btn) {
      const code = btn.previousElementSibling.textContent.trim();
      navigator.clipboard.writeText(code).then(() => {
        btn.innerText = "copied";
        setTimeout(() => (btn.innerText = "copy"), 2000);
      });
    }
  </script></li>
</ul>
<h3 id="6">
  <a class="anchor inpage" href="#6">###</a><strong>6. <code>lualatex</code>（LaTeX + LuaTeX 引擎）</strong></h3>
<ul>
<li><strong>作用</strong>：<code>latex</code> 的现代替代品，使用 <code>luatex</code> 引擎，结合 LaTeX 和 Lua 扩展。</li>
<li><strong>特点</strong>：
<ul>
<li>支持 <code>fontspec</code> 和 Lua 脚本，灵活性极高。</li>
<li>适合复杂排版（如自动生成内容、动态调整格式）。</li>
</ul>
</li>
<li><strong>使用示例</strong>：
<details open>
    <summary>sh</summary><pre
        class="chroma codeblock"
      ><code class="language-sh" data-lang="sh"
          ><span style="display:flex;"><span>lualatex mydocument.tex  <span style="color:#75715e"># 生成 PDF</span></span></span></code
        ><button onclick="copyCode(this)" class="copybtn">copy</button></pre></details>

  <script>
    function copyCode(btn) {
      const code = btn.previousElementSibling.textContent.trim();
      navigator.clipboard.writeText(code).then(() => {
        btn.innerText = "copied";
        setTimeout(() => (btn.innerText = "copy"), 2000);
      });
    }
  </script></li>
</ul>
<h3 id="总结对比">
  <a class="anchor inpage" href="#%e6%80%bb%e7%bb%93%e5%af%b9%e6%af%94">###</a><strong>总结对比</strong></h3>
<table>
  <thead>
      <tr>
          <th>命令</th>
          <th>引擎</th>
          <th>输出格式</th>
          <th>Unicode 支持</th>
          <th>OpenType 支持</th>
          <th>Lua 支持</th>
          <th>典型用途</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>tex</code></td>
          <td>TeX</td>
          <td>DVI</td>
          <td>❌</td>
          <td>❌</td>
          <td>❌</td>
          <td>原始 TeX 排版</td>
      </tr>
      <tr>
          <td><code>latex</code></td>
          <td>pdfTeX</td>
          <td>DVI/PDF</td>
          <td>❌</td>
          <td>❌</td>
          <td>❌</td>
          <td>传统 LaTeX 文档</td>
      </tr>
      <tr>
          <td><code>pdflatex</code></td>
          <td>pdfTeX</td>
          <td>PDF</td>
          <td>❌</td>
          <td>❌</td>
          <td>❌</td>
          <td>直接生成 PDF</td>
      </tr>
      <tr>
          <td><code>xetex</code></td>
          <td>XeTeX</td>
          <td>XDV/PDF</td>
          <td>✔️</td>
          <td>✔️</td>
          <td>❌</td>
          <td>多语言排版（系统字体）</td>
      </tr>
      <tr>
          <td><code>xelatex</code></td>
          <td>XeTeX</td>
          <td>PDF</td>
          <td>✔️</td>
          <td>✔️</td>
          <td>❌</td>
          <td>现代 LaTeX（中文友好）</td>
      </tr>
      <tr>
          <td><code>luatex</code></td>
          <td>LuaTeX</td>
          <td>PDF</td>
          <td>✔️</td>
          <td>✔️</td>
          <td>✔️</td>
          <td>动态脚本控制排版</td>
      </tr>
      <tr>
          <td><code>lualatex</code></td>
          <td>LuaTeX</td>
          <td>PDF</td>
          <td>✔️</td>
          <td>✔️</td>
          <td>✔️</td>
          <td>高级 LaTeX 自动化</td>
      </tr>
  </tbody>
</table>
]]></content:encoded></item><item><title>caldav协议</title><link>https://hiraethecho.github.io/docs/dev/caldav/</link><pubDate>Mon, 30 Jun 2025 00:00:00 +0000</pubDate><author>wyz2016zxc@outlook.com(Hiraeth)</author><guid>https://hiraethecho.github.io/docs/dev/caldav/</guid><description>caldav是一个基于webdav的日历协议，可以用来同步日历数据。它是一个开放的标准，允许不同的日历应用程序和服务之间进行互操作。</description><content:encoded><![CDATA[<h1 id="caldav">
  <a class="anchor inpage" href="#caldav">#</a>Caldav</h1>
<h2 id="caldav-1">
  <a class="anchor inpage" href="#caldav-1">##</a>caldav</h2>
<p>caldav是一个基于webdav的日历协议，可以用来同步日历数据。它是一个开放的标准，允许不同的日历应用程序和服务之间进行互操作。</p>
<p>包括calendar、todo、event等。</p>
<h2 id="manage">
  <a class="anchor inpage" href="#manage">##</a>manage</h2>
<h3 id="todoman">
  <a class="anchor inpage" href="#todoman">###</a>todoman</h3>
<h3 id="khal">
  <a class="anchor inpage" href="#khal">###</a>khal</h3>
<h3 id="apple">
  <a class="anchor inpage" href="#apple">###</a>apple</h3>
<p>原生日历和提醒事项应用程序可以通过CalDAV协议与服务器进行同步。</p>
<h2 id="host-a-caldav">
  <a class="anchor inpage" href="#host-a-caldav">##</a>host a caldav</h2>
<h3 id="radicale">
  <a class="anchor inpage" href="#radicale">###</a>radicale</h3>
<h4 id="install-and-configurations">
  <a class="anchor inpage" href="#install-and-configurations">####</a>Install and configurations</h4>
<p>ref: 
:</p>
<p>Install radicale: 建议用包管理器安装，可以帮助解决依赖，以及创建<code>radicale</code>用户、创建文件夹之类的杂事。比如</p>
<details open>
    <summary>sh</summary><pre
        class="chroma codeblock"
      ><code class="language-sh" data-lang="sh"
          ><span style="display:flex;"><span>sudo dnf install radicale</span></span></code
        ><button onclick="copyCode(this)" class="copybtn">copy</button></pre></details>

  <script>
    function copyCode(btn) {
      const code = btn.previousElementSibling.textContent.trim();
      navigator.clipboard.writeText(code).then(() => {
        btn.innerText = "copied";
        setTimeout(() => (btn.innerText = "copy"), 2000);
      });
    }
  </script><p>configurations:</p>
<details open>
    <summary>TEXT</summary><pre
        class="codeblock"
      ><code class="language-" data-lang=""># /etc/radicale/config

[server]
hosts = [::]:5242, 0.0.0.0:5242 # ipv6, ipv4的host，从任何ip地址都可以访问
# hosts = localhost:5242 # 只允许本地地址访问
[auth]
type = htpasswd
htpasswd_encryption = autodetect
htpasswd_filename = /etc/radicale/users
[storage]
filesystem_folder = /var/lib/radicale/collections</code><button onclick="copyCode(this)" class="copybtn">copy</button></pre></details>

  <script>
    function copyCode(btn) {
      const code = btn.previousElementSibling.textContent.trim();
      navigator.clipboard.writeText(code).then(() => {
        btn.innerText = "copied";
        setTimeout(() => (btn.innerText = "copy"), 2000);
      });
    }
  </script><p>set a user and passwd:</p>
<details open>
    <summary>shell</summary><pre
        class="chroma codeblock"
      ><code class="language-shell" data-lang="shell"
          ><span style="display:flex;"><span>htpasswd -5 -c /path/to/users user1</span></span></code
        ><button onclick="copyCode(this)" class="copybtn">copy</button></pre></details>

  <script>
    function copyCode(btn) {
      const code = btn.previousElementSibling.textContent.trim();
      navigator.clipboard.writeText(code).then(() => {
        btn.innerText = "copied";
        setTimeout(() => (btn.innerText = "copy"), 2000);
      });
    }
  </script><p>Start as a systemd service:</p>
<details open>
    <summary>TEXT</summary><pre
        class="codeblock"
      ><code class="language-" data-lang=""># /etc/systemd/system/radicale.service
[Unit]
Description=A simple CalDAV (calendar) and CardDAV (contact) server
After=network.target
Requires=network.target

[Service]
ExecStart=/usr/bin/radicale --config /etc/radicale/confif
Restart=on-failure
User=radicale
# Deny other users access to the calendar data
UMask=0027
# Optional security settings
PrivateTmp=true
ProtectSystem=strict
ProtectHome=true
PrivateDevices=true
ProtectKernelTunables=true
ProtectKernelModules=true
ProtectControlGroups=true
NoNewPrivileges=true
ReadWritePaths=/var/lib/radicale/ /var/cache/radicale/

[Install]
WantedBy=multi-user.target</code><button onclick="copyCode(this)" class="copybtn">copy</button></pre></details>

  <script>
    function copyCode(btn) {
      const code = btn.previousElementSibling.textContent.trim();
      navigator.clipboard.writeText(code).then(() => {
        btn.innerText = "copied";
        setTimeout(() => (btn.innerText = "copy"), 2000);
      });
    }
  </script><p>这样在<code>http://localhost:5242/</code>就可以访问web页面，可以创建collection等。</p>
<h4 id="host">
  <a class="anchor inpage" href="#host">####</a>host</h4>
<p>用<code>cloudflare</code>的zero trust - network - tunnel来将radicale服务暴露到公网。记得选https。</p>
<h3 id="baikal">
  <a class="anchor inpage" href="#baikal">###</a>baikal</h3>
<h2 id="connect-a-caldav">
  <a class="anchor inpage" href="#connect-a-caldav">##</a>connect a caldav</h2>
<h3 id="from-linux">
  <a class="anchor inpage" href="#from-linux">###</a>from linux</h3>
<p>vdirsync</p>
<h3 id="from-apple-to-caldav-server">
  <a class="anchor inpage" href="#from-apple-to-caldav-server">###</a>from apple to caldav server</h3>
<h3 id="to-apple-caldav">
  <a class="anchor inpage" href="#to-apple-caldav">###</a>To apple caldav</h3>
<p>ref:</p>
<ul>
<li>
</li>
<li>
</li>
</ul>
<p>云上贵州服务器</p>
<details open>
    <summary>TEXT</summary><pre
        class="codeblock"
      ><code class="language-" data-lang="">https://&lt;server-id&gt;-caldav.icloud.com.cn/&lt;user-id&gt;/calendars/&lt;calendar-id&gt;/</code><button onclick="copyCode(this)" class="copybtn">copy</button></pre></details>

  <script>
    function copyCode(btn) {
      const code = btn.previousElementSibling.textContent.trim();
      navigator.clipboard.writeText(code).then(() => {
        btn.innerText = "copied";
        setTimeout(() => (btn.innerText = "copy"), 2000);
      });
    }
  </script><p>在网页版icloud的日历界面打开开发者工具，然后找<code>Network</code>里的<code>Get</code>请求，过滤<code>XHR</code>，然后找类似 <code>https://&lt;server-id&gt;-calendarws.icloud.com.cn/ca/eventdetail/&lt;calendar-id&gt;/&lt;event-id&gt;?clientBuildNumber=&lt;some-random-text&gt;&amp;clientId=&lt;some-random-text&gt;&amp;clientMasteringNumber=&lt;some-random-text&gt;&amp;clientVersion=&lt;some-random-text&gt;&amp;dsid=&lt;user-id&gt;&amp;lang=&lt;some-random-text&gt;&amp;requestID=&lt;some-random-text&gt;&amp;usertz=&lt;some-random-text&gt;</code>的内容。</p>
<p>用 
 将<code>icloud</code>的日历同步到本地，以<code>.ics</code>格式存储。</p>
<details open>
    <summary>conf</summary><pre
        class="codeblock"
      ><code class="language-conf" data-lang="conf">[storage cal]
type = &#34;caldav&#34;
url = &#34;https://caldav.icloud.com/&#34;
username = &#34;...&#34;
password = &#34;...&#34;

[storage card]
type = &#34;carddav&#34;
url = &#34;https://contacts.icloud.com/&#34;
username = &#34;...&#34;
password = &#34;...&#34;</code><button onclick="copyCode(this)" class="copybtn">copy</button></pre></details>

  <script>
    function copyCode(btn) {
      const code = btn.previousElementSibling.textContent.trim();
      navigator.clipboard.writeText(code).then(() => {
        btn.innerText = "copied";
        setTimeout(() => (btn.innerText = "copy"), 2000);
      });
    }
  </script><p>这里<code>username</code>就是用户名，而<code>password</code>是双重认证后再生成的app密码。服务器的话中国应该要<code>url = &quot;https://caldav.icloud.com.cn/&quot;</code></p>
<p>但是有两个问题：</p>
<ul>
<li>不支持<code>VTODO</code>格式，apple的提醒事项似乎不是这个协议。</li>
<li><code>icloud</code>如果有多个日历的话，标识id很长，难以记忆或使用，例如<code>87BBBA05-934B-4D5A-BB27-771A9CD413A2</code>。或者其中一个会被记为<code>home</code>，但是不知道什么规则。例如同步到<code>.local/share/calendars</code>后
<details open>
    <summary>TEXT</summary><pre
        class="codeblock"
      ><code class="language-" data-lang="">~/.local/share/calendars
├── 87BBBA05-934B-4D5A-BB27-771A9CD413A2
└── home</code><button onclick="copyCode(this)" class="copybtn">copy</button></pre></details>

  <script>
    function copyCode(btn) {
      const code = btn.previousElementSibling.textContent.trim();
      navigator.clipboard.writeText(code).then(() => {
        btn.innerText = "copied";
        setTimeout(() => (btn.innerText = "copy"), 2000);
      });
    }
  </script></li>
</ul>
]]></content:encoded></item><item><title>Filesystem Hierarchy Standard</title><link>https://hiraethecho.github.io/docs/linux/fhs/</link><pubDate>Mon, 09 Jun 2025 00:00:00 +0000</pubDate><author>wyz2016zxc@outlook.com(Hiraeth)</author><guid>https://hiraethecho.github.io/docs/linux/fhs/</guid><description>linux文件结构标准</description><content:encoded><![CDATA[<h1 id="filesystem-hierarchy-standard">
  <a class="anchor inpage" href="#filesystem-hierarchy-standard">#</a>Filesystem Hierarchy Standard</h1>
<p>
</p>
<p>This standard consists of a set of requirements and guidelines for file and directory placement under UNIX-like operating systems. The guidelines are intended to support interoperability of applications, system administration tools, development tools, and scripts as well as greater uniformity of documentation for these systems.</p>
<h2 id="general-setting">
  <a class="anchor inpage" href="#general-setting">##</a>General setting</h2>
<h3 id="under-">
  <a class="anchor inpage" href="#under-">###</a>under <code>/</code></h3>
<p><code>/bin</code> : Essential user command binaries (for use by all users). <code>/sbin</code> : System binaries. stored in /sbin, /usr/sbin, and /usr/local/sbin.
<code>/lib</code> : Essential shared libraries and kernel modules <code>lib32</code> and <code>lib64</code>: Alternate format essential shared libraries (optional)
<code>/etc</code> : Host-specific system configuration. A &ldquo;configuration file&rdquo; is a local file used to control the operation of a program; it must be static and cannot be an executable binary.</p>
<p><code>/media</code> : Mount point for removable media
<code>/mnt</code> : Mount point for a temporarily mounted filesystem
<code>/opt</code> : Add-on application software packages
<code>/run</code> : Run-time variable data
<code>/srv</code> : Data for services provided by this system
<code>/tmp</code> : Temporary files</p>
<h3 id="usr">
  <a class="anchor inpage" href="#usr">###</a><code>/usr</code></h3>
<details open>
    <summary>TEXT</summary><pre
        class="codeblock"
      ><code class="language-" data-lang="">/
└── usr
    ├── bin
    ├── include
    ├── lib
    ├── sbin
    ├── share
    └── src</code><button onclick="copyCode(this)" class="copybtn">copy</button></pre></details>

  <script>
    function copyCode(btn) {
      const code = btn.previousElementSibling.textContent.trim();
      navigator.clipboard.writeText(code).then(() => {
        btn.innerText = "copied";
        setTimeout(() => (btn.innerText = "copy"), 2000);
      });
    }
  </script><p><code>/usr</code> is the second major section of the filesystem. /usr is shareable, read-only data. That means that /usr should be shareable between various FHS-compliant hosts and must not be written to. Any information that is host-specific or varies with time is stored elsewhere.<br>
Large software packages must not use a direct subdirectory under the /usr hierarchy. (maybe <code>/opt</code>)</p>
<ul>
<li><code>/usr/share</code> : Architecture-independent data. The /usr/share hierarchy is for all read-only architecture independent data files.<br>
This hierarchy is intended to be shareable among all architecture platforms of a given OS; thus, for example, a site with i386, Alpha, and PPC platforms might maintain a single /usr/share directory that is centrally-mounted. Note, however, that /usr/share is generally not intended to be shared by different OSes or by different releases of the same OS.<br>
Any program or package which contains or requires data that doesn&rsquo;t need to be modified should store that data in /usr/share (or /usr/local/share, if installed locally). It is recommended that a subdirectory be used in /usr/share for this purpose. Applications using a single file may use /usr/share/misc.<br>
Game data stored in /usr/share/games must be purely static data. Any modifiable files, such as score files, game play logs, and so forth, should be placed in /var/games.</li>
<li><code>/usr/lib</code>: Includes object files and libraries. On some systems, it may also include internal binaries that are not intended to be executed directly by users or shell scripts.<br>
Applications may use a single subdirectory under /usr/lib. If an application uses a subdirectory, all architecture-dependent data exclusively used by the application must be placed within that subdirectory.</li>
<li><code>/usr/local</code> : Local hierarchy (empty after main installation) The /usr/local hierarchy is for use by the system administrator when installing software locally. It needs to be safe from being overwritten when the system software is updated. It may be used for programs and data that are shareable amongst a group of hosts, but not found in /usr.</li>
</ul>
<p>And others:</p>
<ul>
<li><code>games</code>: Games and educational binaries (optional)</li>
<li><code>include</code>: Header files included by C programs. This is where all of the system&rsquo;s general-use include files for the C programming language should be placed.</li>
<li><code>libexec</code>: Binaries run by other programs (optional)</li>
<li><code>src</code>: Source code (optional)</li>
</ul>
<h3 id="summary">
  <a class="anchor inpage" href="#summary">###</a>Summary</h3>
<table>
  <thead>
      <tr>
          <th></th>
          <th>shareable</th>
          <th>unshareable</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>static</td>
          <td><code>/usr</code>, <code>/opt</code></td>
          <td><code>/etc</code>, <code>/boot</code></td>
      </tr>
      <tr>
          <td>variable</td>
          <td><code>/var/mail</code>, <code>/var/spool/news</code></td>
          <td><code>/var/run</code>, <code>/var/lock</code></td>
      </tr>
  </tbody>
</table>
<ul>
<li>May under &lsquo;/&rsquo;,<code>/usr</code>,<code>/var</code></li>
</ul>
<details open>
    <summary>TEXT</summary><pre
        class="codeblock"
      ><code class="language-" data-lang="">├── bin # binary
├── lib # library
├── include # C header
├── games   # games
├── opt # opt
├── share   # data that share with other
└── src     # sources</code><button onclick="copyCode(this)" class="copybtn">copy</button></pre></details>

  <script>
    function copyCode(btn) {
      const code = btn.previousElementSibling.textContent.trim();
      navigator.clipboard.writeText(code).then(() => {
        btn.innerText = "copied";
        setTimeout(() => (btn.innerText = "copy"), 2000);
      });
    }
  </script><ul>
<li>only under <code>/</code></li>
</ul>
<details open>
    <summary>TEXT</summary><pre
        class="codeblock"
      ><code class="language-" data-lang="">/
├── boot
├── etc # configraturation
├── dev
├── media
├── mnt
├── proc
├── run
├── srv
├── sys
└── tmp</code><button onclick="copyCode(this)" class="copybtn">copy</button></pre></details>

  <script>
    function copyCode(btn) {
      const code = btn.previousElementSibling.textContent.trim();
      navigator.clipboard.writeText(code).then(() => {
        btn.innerText = "copied";
        setTimeout(() => (btn.innerText = "copy"), 2000);
      });
    }
  </script><h2 id="on-archlinux">
  <a class="anchor inpage" href="#on-archlinux">##</a>On archlinux,</h2>
<details open>
    <summary>TEXT</summary><pre
        class="codeblock"
      ><code class="language-" data-lang="">/
├── bin ⇒ usr/bin
├── boot
├── dev
├── etc
├── home
├── lib ⇒ usr/lib
├── lib64 ⇒ usr/lib
├── mnt
├── opt
├── proc
├── root
├── run
├── sbin ⇒ usr/bin
├── srv
├── sys
├── tmp
├── usr
└── var</code><button onclick="copyCode(this)" class="copybtn">copy</button></pre></details>

  <script>
    function copyCode(btn) {
      const code = btn.previousElementSibling.textContent.trim();
      navigator.clipboard.writeText(code).then(() => {
        btn.innerText = "copied";
        setTimeout(() => (btn.innerText = "copy"), 2000);
      });
    }
  </script><p><code>lib32</code> and <code>lib64</code> for 32-bit and 64-bit. <code>sbin</code> binaries for super user. (On debian, only root can <code>reboot</code>.)</p>
<details open>
    <summary>TEXT</summary><pre
        class="codeblock"
      ><code class="language-" data-lang="">/
└── opt
    ├── waterfox
    ├── wechat-universal
    └── wemeet</code><button onclick="copyCode(this)" class="copybtn">copy</button></pre></details>

  <script>
    function copyCode(btn) {
      const code = btn.previousElementSibling.textContent.trim();
      navigator.clipboard.writeText(code).then(() => {
        btn.innerText = "copied";
        setTimeout(() => (btn.innerText = "copy"), 2000);
      });
    }
  </script><details open>
    <summary>TEXT</summary><pre
        class="codeblock"
      ><code class="language-" data-lang="">/
└── usr
    └── share
        ├── alsa
        ├── applications
        ├── awk
        ├── blueman
        ├── mime
        ├── nvim
        ├── wayland
        ├── wayland-sessions
        ├── X11
        └── zsh</code><button onclick="copyCode(this)" class="copybtn">copy</button></pre></details>

  <script>
    function copyCode(btn) {
      const code = btn.previousElementSibling.textContent.trim();
      navigator.clipboard.writeText(code).then(() => {
        btn.innerText = "copied";
        setTimeout(() => (btn.innerText = "copy"), 2000);
      });
    }
  </script><details open>
    <summary>TEXT</summary><pre
        class="codeblock"
      ><code class="language-" data-lang="">/
└── usr
    └── local
        ├── bin
        ├── etc
        ├── games
        ├── include
        ├── lib
        ├── man
        ├── sbin
        ├── share
        └── src</code><button onclick="copyCode(this)" class="copybtn">copy</button></pre></details>

  <script>
    function copyCode(btn) {
      const code = btn.previousElementSibling.textContent.trim();
      navigator.clipboard.writeText(code).then(() => {
        btn.innerText = "copied";
        setTimeout(() => (btn.innerText = "copy"), 2000);
      });
    }
  </script><details open>
    <summary>TEXT</summary><pre
        class="codeblock"
      ><code class="language-" data-lang="">/
└── var
    ├── cache
    ├── db
    ├── empty
    ├── games
    ├── lib
    ├── local
    ├── lock ⇒ ../run/lock
    ├── log
    ├── mail ⇒ spool/mail
    ├── opt
    ├── run ⇒ ../run
    ├── spool
    └── tmp</code><button onclick="copyCode(this)" class="copybtn">copy</button></pre></details>

  <script>
    function copyCode(btn) {
      const code = btn.previousElementSibling.textContent.trim();
      navigator.clipboard.writeText(code).then(() => {
        btn.innerText = "copied";
        setTimeout(() => (btn.innerText = "copy"), 2000);
      });
    }
  </script><h3 id="special-directories">
  <a class="anchor inpage" href="#special-directories">###</a>special directories</h3>
<details open>
    <summary>TEXT</summary><pre
        class="codeblock"
      ><code class="language-" data-lang="">/
├── boot
│   ├── efi
│   ├── grub
│   ├── initramfs-linux.img
│   └── vmlinuz-linux
├── dev
│   ├── disk
│   ├── null
│   ├── random
│   └── zero
├── mnt
├── proc
│   ├── 1
│   ├── uptime
│   └── zoneinfo
├── run
│   ├── dhcpcd
│   ├── initramfs
│   ├── media # This is different
│   ├── libvirt
│   ├── systemd
│   └── xtables.lock
├── srv
│   ├── ftp
│   └── http
├── sys
│   ├── kernel
│   └── power
└── tmp</code><button onclick="copyCode(this)" class="copybtn">copy</button></pre></details>

  <script>
    function copyCode(btn) {
      const code = btn.previousElementSibling.textContent.trim();
      navigator.clipboard.writeText(code).then(() => {
        btn.innerText = "copied";
        setTimeout(() => (btn.innerText = "copy"), 2000);
      });
    }
  </script><h2 id="homes">
  <a class="anchor inpage" href="#homes">##</a>homes</h2>
<details open>
    <summary>TEXT</summary><pre
        class="codeblock"
      ><code class="language-" data-lang="">/
├── home
│   └── user
│       ├── Desktop
│       ├── Documents
│       ├── Downloads
│       ├── Music
│       ├── Pictures
│       ├── Public
│       ├── Templates
│       └── Videos
└── root
    ├── Desktop
    ├── Documents
    ├── Downloads
    ├── Music
    ├── Pictures
    ├── Public
    ├── Templates
    └── Videos</code><button onclick="copyCode(this)" class="copybtn">copy</button></pre></details>

  <script>
    function copyCode(btn) {
      const code = btn.previousElementSibling.textContent.trim();
      navigator.clipboard.writeText(code).then(() => {
        btn.innerText = "copied";
        setTimeout(() => (btn.innerText = "copy"), 2000);
      });
    }
  </script>]]></content:encoded></item></channel></rss>