<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
xmlns:atom="http://www.w3.org/2005/Atom"
xmlns:wfw="http://wellformedweb.org/CommentAPI/">
<channel>
<title>JRNitre&#039;s Blog - 工具</title>
<link>https://blog.atoery.cn/index.php/tag/tools/</link>
<atom:link href="https://blog.atoery.cn/index.php/feed/tag/tools/" rel="self" type="application/rss+xml" />
<language>zh-CN</language>
<description></description>
<lastBuildDate>Thu, 05 Jun 2025 17:44:00 +0800</lastBuildDate>
<pubDate>Thu, 05 Jun 2025 17:44:00 +0800</pubDate>
<item>
<title>[C++] cmdline 轻量的命令行解析库</title>
<link>https://blog.atoery.cn/index.php/2025/06/05/153.html</link>
<guid>https://blog.atoery.cn/index.php/2025/06/05/153.html</guid>
<pubDate>Thu, 05 Jun 2025 17:44:00 +0800</pubDate>
<dc:creator>JRNitre</dc:creator>
<description><![CDATA[1.0 简述在使用 C++ 写命令行工具的时候，需要解析输入的参数，该库就是为这一解析工作提供一个方便快捷的方案。2.0 使用该项目仅包含一个头文件 include &quot;cmdline....]]></description>
<content:encoded xml:lang="zh-CN"><![CDATA[
<h1>1.0 简述</h1><p></p><p>在使用 C++ 写命令行工具的时候，需要解析输入的参数，该库就是为这一解析工作提供一个方便快捷的方案。</p><h1>2.0 使用</h1><p>该项目仅包含一个头文件 <code>include &quot;cmdline.h&quot;</code></p><p>以下是一个简单示例</p><pre><code>#include &lt;iostream&gt;
#include &quot;cmdline/cmdline.h&quot;

int main(int argc, char *argv[]){
    /* 创建一个命令解析器 */
    cmdline::parser options;

    /*  1op -&gt; 长名称
     *  2op -&gt; 短名称 / 如果没有短名写 &#039;\0&#039;
     *  3op -&gt; 解释
     *  4op -&gt; 是否必填
     *  5op -&gt; 默认值，仅在 4op 为 false 的时候生效
     */
    options.add&lt;std::string&gt;(
        &quot;host&quot;,
        &#039;h&#039;,
        &quot;host name&quot;,
        true,
        &quot;&quot;);

    // range -&gt; 可以用于限制输入值范围
    options.add&lt;int&gt;(
        &quot;port&quot;,
        &#039;p&#039;,
        &quot;port number&quot;,
        false,
        80,
        cmdline::range(1, 65535));

    // oneof 限制参数的可选值
    options.add&lt;std::string&gt;(
        &quot;type&quot;,
        &#039;t&#039;,
        &quot;protocol type&quot;,
        false,
        &quot;http&quot;,
        cmdline::oneof&lt;std::string&gt;(&quot;http&quot;, &quot;https&quot;, &quot;ssh&quot;, &quot;ftp&quot;));

    // 可以定义 bool 值
    options.add(&quot;gzip&quot;, &#039;\0&#039;, &quot;gzip when transfer&quot;);

    /* 执行解析器 */
    options.parse_check(argc, argv);

    std::cout &lt;&lt; &quot;input type -&gt; &quot; &lt;&lt; options.get&lt;std::string&gt;(&quot;type&quot;) &lt;&lt; std::endl;
    std::cout &lt;&lt; &quot;input host -&gt; &quot; &lt;&lt; options.get&lt;std::string&gt;(&quot;host&quot;) &lt;&lt; std::endl;
    std::cout &lt;&lt; &quot;input port -&gt; &quot; &lt;&lt; options.get&lt;int&gt;(&quot;port&quot;) &lt;&lt; std::endl;

    // bool 值仅能通过 exist() 方法判断
    if (options.exist(&quot;gzip&quot;)){
        std::cout &lt;&lt; &quot;gzip enable&quot; &lt;&lt; std::endl;
    }else{
        std::cout &lt;&lt; &quot;gzip disable&quot; &lt;&lt; std::endl;
    }


    return 0;
}</code></pre><p>传入定义好的参数即可看到效果</p><p><img src="http://mashirospace.cn:4607/usr/uploads/2025/06/1761863535.jpg" alt="" title=""></p><p>可以输出帮助消息</p><p><img src="http://mashirospace.cn:4607/usr/uploads/2025/06/762307940.jpg" alt="" title=""></p><h1>END 参考与引用</h1><p><strong>[参考文章]</strong></p><ul><li><a href="https://www.cnblogs.com/ljbguanli/p/7235424.html">【C++】cmdline —— 轻量级的C++命令行解析库 </a></li></ul>
]]></content:encoded>
<slash:comments>0</slash:comments>
<comments>https://blog.atoery.cn/index.php/2025/06/05/153.html#comments</comments>
<wfw:commentRss>https://blog.atoery.cn/index.php/feed/tag/tools/</wfw:commentRss>
</item>
<item>
<title>[Markdown] 简介及语法速查表</title>
<link>https://blog.atoery.cn/index.php/2025/05/12/142.html</link>
<guid>https://blog.atoery.cn/index.php/2025/05/12/142.html</guid>
<pubDate>Mon, 12 May 2025 16:03:00 +0800</pubDate>
<dc:creator>JRNitre</dc:creator>
<description><![CDATA[1.0 简介Markdown是一种轻量级的标记语言，可用于在纯文本中添加格式化元素。Markdown由John Gruber于2004年创建，如今是世界上最受欢迎的标记语言之一。2.0 专注于文...]]></description>
<content:encoded xml:lang="zh-CN"><![CDATA[
<h1>1.0 简介</h1><p>Markdown是一种轻量级的标记语言，可用于在纯文本中添加格式化元素。Markdown由John Gruber于2004年创建，如今是世界上最受欢迎的标记语言之一。</p><h1>2.0 专注于文字内容。</h1><p>纯文本，易于书写，可以方便的纳入版本控制。<br>语法简单，学习成本低。<br>Markdown与Word类编辑器不同。在Word之类的应用程序中，通过点击按钮设置相关的语法和格式，并且更改立即可见。而Markdown与此不同，创建了Markdown格式的文件，在文本中添加Markdown语法，用于指示哪些单词和短语看起来有所不同。</p><h1>3.0 Markdown 的优势</h1><p>Markdown无处不在，主流的代码托管平台：Github、GitLab、Gitee等均支持Markdown语法，很多开源项目的README、开发文档、帮助文档、Wiki等都是用Markdown写作。<br>Markdown是纯文本，可移植的，几乎可以使用任何文本编辑器打开Markdown文件。<br>Markdown是独立于平台的，任何操作系统和设备上均可以使用Markdown格式的文本。<br>Markdown创建的文件读取，不会受到软件、系统更新的迭代影响，即使你无法读取Markdown的格式，依然可以通过阅读纯文本的方式获取Markdown中的信息。</p><h1>4.0 Markdown 的作用</h1><p>Markdown 是做笔记、为网站创建内容、生成可打印文档的快速，简便的方法。<br>学习Markdown语法并不需要很长时间，一旦你学会了使用方法，就可以在几乎任何地方使用。</p><h1>5.0 语法速查表</h1><h2>5.1 基本语法</h2><table><thead><tr><th align="center">元素</th><th align="left">语法</th></tr></thead><tbody><tr><td align="center">标题   <br> Heading</td><td align="left"># H1 <br> ## H2 <br> ### H3</td></tr><tr><td align="center">粗体   <br> Blod</td><td align="left"><strong> Blod text </strong></td></tr><tr><td align="center">斜体   <br> Ltalic</td><td align="left"><em> italicized text </em></td></tr><tr><td align="center">引用块 <br> Blockquote</td><td align="left">&gt; blockquote</td></tr><tr><td align="center">有序列表 <br> Ordered List</td><td align="left">1. First item <br> 2.Second item <br> 3.Third item</td></tr><tr><td align="center">无序列表 <br> Unordered List</td><td align="left"><em> First item <br> </em> Second item <br> *Third item</td></tr><tr><td align="center">代码 <br> Code</td><td align="left"><code>code</code>`</td></tr><tr><td align="center">分割线 <br> Horizontal Rule</td><td align="left">---</td></tr><tr><td align="center">链接 <br> Link</td><td align="left"><code>[title](https://www.example.com)</code></td></tr><tr><td align="center">图片 <br> Image</td><td align="left"><code>![alt text](image.jpg)</code></td></tr></tbody></table><h2>5.2 拓展语法</h2><p>以下的元素为 Markdown 的拓展语法，并非所有 Markdown 解释器都支持这些元素。</p><table><thead><tr><th align="center">元素</th><th align="left">语法</th></tr></thead><tbody><tr><td align="center">表格 <br> Table</td><td align="left">`</td><td>Head</td><td>Head</td><td><code> &lt;br&gt; </code></td><td>:--:</td><td>:--:</td><td><code> &lt;br&gt; </code></td><td>Body</td><td>Body</td><td>`</td></tr><tr><td align="center">代码块 <br> Code Block</td><td align="left"><code> </code>`<code> </code> <br> <code>void Function ();</code> <br> <code> </code>`<code> </code></td></tr><tr><td align="center">脚注 <br> Footnote</td><td align="left">Here's a sentence with a footnote.<code>[^1]</code> <br> <code>[^1]</code>: This is the footnote.</td></tr><tr><td align="center">标题编号 <br> Heading ID</td><td align="left"><code>### My Great Heading {#custom-id}</code></td></tr><tr><td align="center">定义列表 <br> Definition List</td><td align="left"><code>term</code> <br> <code>: definition</code></td></tr><tr><td align="center">删除线 <br> Strikethrough</td><td align="left"><code>~~The world is flat~~</code></td></tr><tr><td align="center">任务列表 <br> Task List</td><td align="left"><code>- [x] Write the press release</code> <br> <code>- [ ] Update the website</code> <br> <code>- [ ] Contact the media</code></td></tr></tbody></table><h1>END 参考与引用</h1><ul><li><a href="https://markdown.com.cn/">Markdown 官方教程</a></li></ul>
]]></content:encoded>
<slash:comments>0</slash:comments>
<comments>https://blog.atoery.cn/index.php/2025/05/12/142.html#comments</comments>
<wfw:commentRss>https://blog.atoery.cn/index.php/feed/tag/tools/</wfw:commentRss>
</item>
<item>
<title>[RAID入门] 各类 RAID 阵列的优缺点及数据安全性分析</title>
<link>https://blog.atoery.cn/index.php/2025/05/12/141.html</link>
<guid>https://blog.atoery.cn/index.php/2025/05/12/141.html</guid>
<pubDate>Mon, 12 May 2025 15:58:54 +0800</pubDate>
<dc:creator>JRNitre</dc:creator>
<description><![CDATA[1.0 RAID 概述在介绍 RAID 的历史之前，先一句话描述一下什么是 RAID 存储：独立磁盘冗余阵列（RAID）是一种存储技术，通过将复数个存储设备，例如硬盘驱动器（HDD）或固态硬盘（...]]></description>
<content:encoded xml:lang="zh-CN"><![CDATA[
<h1>1.0 RAID 概述</h1><p>在介绍 RAID 的历史之前，先一句话描述一下什么是 RAID 存储：独立磁盘冗余阵列（RAID）是一种存储技术，通过将复数个存储设备，例如硬盘驱动器（HDD）或固态硬盘（SSD）合并成一个协调的存储单元或阵列，从而获得一些单块存储介质无法轻易达到的优势。</p><h2>1.1 RAID 的历史</h2><p>1988 年，美国加州大学伯克利分校的 D.A.Patterson 教授等首次在论文中提出了 RAID 的概念；廉价冗余磁盘阵列 (Redundant Array of Indexpensive Disks) 由于当时大容量存储设备价格比较昂贵，RAID 的思想就是用多个容量较小、相对廉价的存储设备进行组合，从而得到昂贵大容量存储设备相同的容量、性能等。</p><p>随着时代的发展存储设备早已不再昂贵，因此 RIAD 也在发展中变为了用于为现代存储设备提供冗余的一种解决方案，即独立磁盘冗余阵列。</p><p>根据存储设备组成方式和性能的不同，RAID 分为很多类别：RAID0、RAID1、RAID5 等。从实现角度来看 RAID 主要分为软 RAID 和 硬 RAID 以及软硬混合 RAID 三种；顾名思义，软 RAID 所有功能均有操作系统和 CPU 来完成，没有独立的 RAID 控制 / 处理芯片和 I/O 处理芯片，效率自然最低。硬 RAID 配备了专门的 RAID 控制 / 处理芯片和 I/O 处理芯片以及阵列缓冲，不占用 CPU 资源，但成本很高。软硬混合 RAID 具备 RAID 控制 / 处理芯片，但缺乏 I/O 处理芯片，需要 CPU 和驱动程序来完成，性能和成本 在软 RAID 和硬 RAID 之间。</p><h1>2.0 RAID 0</h1><p><strong>[原理]</strong></p><p>RAID 0使用数据条带化（striping）的方式将数据分散存储在多个磁盘驱动器上，而不进行冗余备份。数据被分成固定大小的块，并依次存储在每个磁盘上。例如，如果有两个驱动器（驱动器A和驱动器B），一块数据的第一个部分存储在驱动器A上，第二个部分存储在驱动器B上，以此类推。这种条带化的方式可以同时从多个驱动器读取或写入数据，从而提高系统的性能。</p><p><strong>[适用场景&优缺点]</strong></p><p>RAID 0 具有高性能，即通过数据条带化和并行读写操作，使得 RAID0 可以提供更快的数据传输速度并且成本低廉，因为 RAID0 并不需要像其余 RAID 方式一样需要空间进行冗余备份，所有的空间均可以用于存储相同成本下可用存储空间相对较多；但是如上文所言由于数据条带化和没有冗余存储空间，导致了 RAID0 最为致命的问题就是一旦任意存储设备损坏则阵列上的所有数据都将受到影响。</p><p>因此 RAID0 针对视频编辑&处理等对数据传输速度要求并且不关心数据冗余的场景中适合适用。</p><h1>3.0 RAID 1</h1><p><strong>[原理]</strong></p><p><strong>[适用场景&优缺点]</strong></p><h1>END 参考与引用</h1><ul><li><a href="https://cloud.tencent.com/developer/article/2304179">完全图解RAID存储技术：RAID 0、1、5、6、10、50、60</a></li><li><a href="https://blog.csdn.net/ensp1/article/details/81318135">RAID技术全解图解-RAID0、RAID1、RAID5、RAID100</a></li></ul>
]]></content:encoded>
<slash:comments>0</slash:comments>
<comments>https://blog.atoery.cn/index.php/2025/05/12/141.html#comments</comments>
<wfw:commentRss>https://blog.atoery.cn/index.php/feed/tag/tools/</wfw:commentRss>
</item>
<item>
<title>Linux 串口通讯工具 minicom 的基本使用</title>
<link>https://blog.atoery.cn/index.php/2025/04/17/93.html</link>
<guid>https://blog.atoery.cn/index.php/2025/04/17/93.html</guid>
<pubDate>Thu, 17 Apr 2025 20:49:29 +0800</pubDate>
<dc:creator>JRNitre</dc:creator>
<description><![CDATA[1.0 安装 minicom 工具本文使用环境为 Debian12&GNOM43.9 故可以使用 apt 安装。$ sudo apt install minicom2.0 快速使用通过 mini...]]></description>
<content:encoded xml:lang="zh-CN"><![CDATA[
<h1>1.0 安装 minicom 工具</h1><p>本文使用环境为 <em>Debian12&GNOM43.9</em> 故可以使用 <code>apt</code> 安装。</p><pre><code>$ sudo apt install minicom</code></pre><h1>2.0 快速使用</h1><p>通过 <code>minicom -D &lt;port_device&gt; -b &lt;baud_rate&gt;</code> 即可快速连接至串口。</p><p><img src="http://mashirospace.cn:4607/usr/uploads/2025/04/204339538.png" alt="" title=""></p><p>按下键盘会直接发送数据（默认不显示输入的内容）</p><p>按下 <code>ctrl + A</code> 后按下 <code>X</code> 退出程序。</p><p>使用 <code>ls /dev/tty*</code> 即可查询可用串口。</p><p><img src="http://mashirospace.cn:4607/usr/uploads/2025/04/3531255768.png" alt="" title=""></p><h1>3.0 常用命令&参数</h1><p>在使用过程中 <code>ctrl + A</code> <code>Z</code> 打开帮助。</p><p>常用的命令如下 <code>ctrl + A</code> +</p><ul><li><code>X</code>：退出程序。</li><li><code>W</code>：开启&关闭自动换行。</li><li><code>E</code>：开启&关闭输入现实。</li><li><code>C</code>：清屏。</li></ul><p>在调用 minicom 时可以传入一下参数调整程序运行效果。</p><ul><li><code>-D</code>：指定串口设备</li><li><code>-b</code>：设置波特率，默认 115200</li><li><code>-w</code>：启用自动换行</li><li><code>-H</code>：使用 HEX 方式显示接收到的数据</li><li><code>-s</code>：设置 minicom</li></ul><h1>END 参考 & 声明</h1><p><strong>[参考]</strong></p><ul><li><a href="https://blog.csdn.net/Naisu_kun/article/details/117704009">CSDN:Linux笔记：串口通讯工具minicom基础使用</a></li></ul>
]]></content:encoded>
<slash:comments>0</slash:comments>
<comments>https://blog.atoery.cn/index.php/2025/04/17/93.html#comments</comments>
<wfw:commentRss>https://blog.atoery.cn/index.php/feed/tag/tools/</wfw:commentRss>
</item>
<item>
<title>Git 分布式版本管理参与开发全流程！</title>
<link>https://blog.atoery.cn/index.php/2025/02/27/34.html</link>
<guid>https://blog.atoery.cn/index.php/2025/02/27/34.html</guid>
<pubDate>Thu, 27 Feb 2025 14:18:00 +0800</pubDate>
<dc:creator>JRNitre</dc:creator>
<description><![CDATA[1.0 前言1.1 何为分布式版本管理？在探讨什么是分布式版本管理前，我们先了解什么是版本管理系统：版本管理系统（Version Control System，VCS）是一种帮助软件开发者管理代...]]></description>
<content:encoded xml:lang="zh-CN"><![CDATA[
<h1>1.0 前言</h1><h2>1.1 何为分布式版本管理？</h2><p>在探讨什么是分布式版本管理前，我们先了解什么是版本管理系统：版本管理系统（Version Control System，VCS）是一种帮助软件开发者管理代码变更的工具。它记录了项目文档或源代码文件的所有修改历史，允许团队成员查看项目的任何版本、恢复到以前的状态，或者在不同版本之间进行比较。这有助于提高开发效率，确保即使在多人协作时也能保持工作的组织性和可追踪性。</p><p>而在了解了何为版本管理系统之后，现在主流的版本管理系统大致可以分为两类：集中式和分布式。</p><p><strong>集中式版本控制系统</strong>（Centralized Version Control Systems, CVCS）如Subversion (SVN)，有一个单一的服务器存放所有的版本数据，客户端从这个中心仓库拉取最新代码，并提交更新回服务器。它的优点是简单直接，但缺点是一旦服务器出现问题，可能会导致无法访问历史版本。</p><p><strong>分布式版本控制系统</strong>（Distributed Version Control Systems, DVCS）如Git，没有单一的中心仓库；相反，每个用户的工作副本也是一个完整的仓库，包含了全部的历史版本信息。这意味着即使没有网络连接，开发者也可以提交更改、查看历史记录等。DVCS提供了更高的灵活性和可靠性，因为数据分布在多个节点上，减少了单点故障的风险。</p><h2>1.2 在项目中引入版本管理的好处</h2><p>通常在开发项目的时候，事由团队若干人配合完成的，而团队内不同开发者之间的项目版本不一，在统一开发进度和成员互相交流之间都是一件麻烦的事情，版本管理系统提供了若干功能，极大的提升了协作开发效率：</p><ul><li>历史记录和回滚：版本控制系统记录了每一次变更的详细信息，包括谁做了更改、何时做的更改以及为什么做这些更改（通过提交消息）。如果最新代码出现了问题，可以方便地回滚到之前的稳定版本。</li><li>分支管理：开发者可以在不影响主线（主分支）的情况下创建新的分支进行功能开发、实验或错误修复。这使得多个开发者可以同时在一个项目上工作而不会相互干扰，并且在完成工作后可以将分支合并回主线。</li><li>协同工作：允许多个开发者同时处理同一项目的不同部分，并且能够有效地合并各自的工作。这样大大提高了团队合作的效率，减少了由于代码覆盖或丢失所造成的风险。</li><li>版本控制和发布管理：帮助团队更好地组织软件的开发周期，明确区分哪些功能属于哪个版本，便于规划发布计划。同时，在需要时可以快速定位并恢复特定版本的代码。</li><li>提高代码质量：通过代码审查（Code Review）等实践，鼓励团队成员之间互相检查代码，有助于发现潜在的问题，提高整体代码质量。</li><li>备份和恢复：版本控制系统本身也是一种形式的备份机制。即使本地环境出现问题，也可以从远程仓库中恢复项目的所有历史版本。</li></ul><h1>2.0 Git 配置</h1><p>在正式使用 Git 进行版本控制之前，需要先对其进行配置；Git 提供了一个命令 <code>git config</code> 其可以用来配置和读取对应的工作环境变量，这些环境变量决定了 Git 在各个环节的具体工作方式和行为。</p><h2>2.1 用户信息</h2><p>配置用户名称和电子邮件地址，方便在每次提交代码时记录提交者的信息。</p><pre><code>git config --global user.name &quot;JRNitre&quot;
git config --global user.email &quot;email@email.com&quot;
</code></pre><p>使用该 <code>config </code> 命令即可配置用户名和电子邮件地址，其中通过增加 <code>--global</code> 命令可以使当前配置作用于全局，反之配置则会仅对当前 Git 仓库生效。</p><h2>2.2 文本编辑器</h2><p>Git 默认使用的文本编辑器是 <code>Vi</code> 或者 <code>Vim</code>，可以通过如下命令进行配置。</p><pre><code>git config --global core.editor &quot;code --wait&quot;
</code></pre><h2>2.3 差异分析工具</h2><p><em>此部分复制于 <a href="https://www.runoob.com/git/git-install-setup.html">菜鸟教程</a></em></p><p>还有一个比较常用的是，在解决合并冲突时使用哪种差异分析工具。比如要改用 vimdiff 的话：</p><pre><code>git config --global merge.tool vimdiff
</code></pre><p>Git 可以理解 kdiff3，tkdiff，meld，xxdiff，emerge，vimdiff，gvimdiff，ecmerge，和 opendiff 等合并工具的输出信息。</p><p>当然，你也可以指定使用自己开发的工具。</p><h2>2.4 查看配置信息</h2><p>使用 <code>git config --list</code> 命令查询：</p><h2>2.5 生成 SSH 密钥</h2><p>如果你需要通过 SSH 对远程进行 Git 操作，可是生成 SSH 密钥并添加到你的 Git 托管服务中。</p><pre><code>ssh-keygen -t rsa -b 4096 -C &quot;email@email.com&quot;
</code></pre><h1>3.0 创建 Git 仓库</h1><h2>3.1 <code>git init</code> 初始化</h2><p>Git 的大部分命令需要在 Git 仓库中进行，在想要创建仓库的目录内使用 <code>git init</code> 命令初始化一个仓库。</p><p>或者指定需要创建仓库的目录 <code>git init neorepo</code>。</p><p>初始化后，目标目录下会出现一个名为 <code>.git</code> 的目录（默认系统状态不显示），Git 的所有资源和数据都存储在这个目录中。</p><h2>3.2 <code>git clone</code> 从现有的仓库中拷贝</h2><pre><code>git clone &lt;repo&gt;
</code></pre><p>这里的目录也可以是远程仓库目录：</p><pre><code>git clone git://github.com/xxx/xxx.git
</code></pre><p>如果需要克隆至指定的目录 <code>&lt;directory&gt;</code></p><pre><code>git clone &lt;repo&gt; &lt;directory&gt;
</code></pre><h1>4.0 Git 的提交与修改</h1><h2>4.1 <code>git add</code> 将文件纳入版本控制系统</h2><p>通过 <code>git add</code> 指定需要的文件，即可将文件纳入版本控制系统中，此时 Git 会追踪这些文件的变化。</p><pre><code>git add *.c
git add README.md
</code></pre><p><code>git add</code> 命令可以一次提交多个文件到暂存区中：</p><pre><code>git add file1 file2
</code></pre><p>或者添加指定目录到暂存区：</p><pre><code>git add [dir]
</code></pre><p>或者直接将当前目录下所有文件添加到暂存区中：</p><pre><code>git add .
</code></pre><h2>4.2 <code>git commit</code> 提交暂存区文件到本地仓库</h2><p>在添加需要纳入版本控制系统的文件后，使用 <code>git commit</code> 命令即可提交到仓库中。</p><pre><code>git commit -m [message]
</code></pre><p>这里的 <code>[message]</code> 可以是一些信息。</p><blockquote>在 Linux 中提交信息使用单引号，Windows 中使用双引号。</blockquote><p>还可以指定文件进行提交：</p><pre><code>git commit [file1] [file2] -m [message]
</code></pre><p>通过 <code>-a</code> 参数可以跳过 <code>git add</code> 直接提交修改：</p><pre><code>git commit -a
</code></pre><h2>4.3 <code>git status</code> 查看仓库状态</h2><p>使用 <code>git status</code> 命令可以查看仓库状态，其可以查看到距离上次提交后是否有文件修改。</p><p><img src="http://mashirospace.cn:4607/usr/uploads/2025/02/3919508766.png" alt="" title=""></p><p>通过追加 <code>-s</code> 命令可以获得更简短的输出。</p><p><img src="http://mashirospace.cn:4607/usr/uploads/2025/02/4128109561.png" alt="" title=""></p><h2>4.4 <code>git reset</code> 回退版本</h2><p>如果当前版本的开发出现了问题等，需要回退到版本库中指定的版本时，可以使用 <code>git reset</code> 命令回退至指定的版本。</p><pre><code>git reset [--soft&amp;--mixed&amp;--hard] [HEAD]
</code></pre><p>其中 <code>--mixed</code> 为默认参数可以不加，这类参数功能我们先按下不表，通常可以如下方法使用该命令：</p><pre><code># 回退到上一个版本
git reset HEAD^
# 回退指定文件到上一个版本
git reset HEAD^ hello.md
# 回退到指定版本
git reset 052e
</code></pre><p>其中默认的 <code>--mixed</code> 参数意为：用于重置暂存区的文件与上一次提交保持一致，工作区文件内容保持不便。</p><h3>4.4.1 <code>--soft</code> 参数</h3><p>而通过 <code>--soft</code> 命令可以回退到指定的提交版本，它仅对提交历史（<code>commit</code>）有影响、，不会影响当前工作区的文件；例如在从工作区向暂存区提交代码后，此时如果新增加了文件，并且发现了某一次 <code>commit</code> 的内容发现了错误需要修改则可以使用 <code>--soft</code> 命令：</p><p>如下，创建了 3 个文件并且提交三次：</p><p><img src="http://mashirospace.cn:4607/usr/uploads/2025/02/2466083208.png" alt="" title=""><img src="http://mashirospace.cn:4607/usr/uploads/2025/02/3694338342.png" alt="" title=""></p><p>此时如果增加了第四个文件并且发现第二次提交的文件有问题需要修改，此时可以使用 <code>git reset --soft</code> 进行版本回退：</p><pre><code>git reset --soft [版本号]
</code></pre><p><img src="http://mashirospace.cn:4607/usr/uploads/2025/02/2764015608.png" alt="" title=""><img src="http://mashirospace.cn:4607/usr/uploads/2025/02/4169363141.png" alt="" title=""></p><p>此时提交状态便回到了第二次提交的状态中，对文件进行修改并再次提交：</p><p><img src="http://mashirospace.cn:4607/usr/uploads/2025/02/1653991495.png" alt="" title=""></p><p><code>--soft</code> 的根本作用相当于告诉 <code>HEAD</code> 指针移动到指定的版本，并对其进行修改，后续的提交是基于此版本的新分支。</p><h1>5.0 Git 分支管理</h1><p>Git 的分支实际上是指向快照的指针，通过分支系统，可以在不干扰主线的同时进行开发。</p><h2>5.1 <code>git checkout</code> 基本分支管理</h2><h3>5.1.1 切换分支</h3><p>通过基本的 <code>checkout</code> 命令即可实现不同分支之间的切换：</p><pre><code>git checkoout &lt;branchName&gt;
</code></pre><p>当切换了不同的分支后，git 会自动将工作目录替换为切换的分支最后提交的快照。</p><h3>5.1.2 <code>-b</code> 创建分支</h3><p>通过 <code>-b</code> 参数，可以创建一个分支：</p><pre><code>git checkout -b &lt;branchName&gt;
</code></pre><h2>5.2 <code>git branch</code> 查询分支</h2><h3>5.2.1 <code>git branch</code> 查询所有分支</h3><p>通过基本的 <code>branch</code> 命令即可查询当前仓库的所有分支：</p><pre><code>git branch
</code></pre><h3>5.2.2 <code>-r</code> 查询远程分支</h3><pre><code>git branch -r
</code></pre><h3>5.2.3 <code>-a</code> 查询所有本地分支和远程分支</h3><pre><code>git branch -a
</code></pre><h2>5.3 <code>git branch</code> 删除分支</h2><h3>5.3.1 <code>-d</code> 删除本地分支</h3><pre><code>git branch -d &lt;branchName&gt;
</code></pre><h3>5.3.2 <code>-D</code> 强制删除未合并的分支</h3><pre><code>git branch -D &lt;branchName&gt;
</code></pre><h3>5.3.3 删除远程分支</h3><pre><code>git push origin -delete &lt;branchName&gt;
</code></pre><h2>5.4 <code>git merge</code> 合并分支</h2><p>将指定的分支合并至当前分支：</p><pre><code>git merge &lt;branchName&gt;
</code></pre><p>解决合并冲突 [<em>待编写</em>]</p><h1>6.0 Git 远程仓库操作</h1><h2>6.1 添加远程仓库</h2><p>通过 <code>remote</code> 命令，可以指定一个简短的名字用于替代远程仓库地址。</p><pre><code>git remote add [shortName] &lt;url&gt;</code></pre><h2>6.2 查看当前正在使用的远程仓库</h2><pre><code>git remote</code></pre><p>加上 <code>-v</code> 命令可以查询到每个别名所对应的链接地址。</p><pre><code>git remote -v</code></pre><p>使用 <code>remove</code> 可以删除已有的远程仓库地址。</p><pre><code>git remote remove &lt;name&gt;</code></pre><h2>6.3 提取远程仓库</h2><h3>6.3.1 <code>git fetch</code> 从远程仓库下载新分支与数据</h3><pre><code>git fetch</code></pre><h3>6.3.2 <code>git merge</code> 从远程仓库提取数据并尝试合并到当前分支</h3><pre><code>git merge</code></pre><h3>6.3.3 实际操作中两指令的用法</h3><p>通常，想在已经配置好的远程仓库中获取数据，可以首先执行 <code>git fetch</code> 获取本地没有的资源，然后使用 <code>git merge</code> 将更新合并到当前分支。</p><h2>6.4 <code>git pull</code> 推送远程分支</h2><pre><code>git pull [shortName] [branchLocel]:[branchServer]</code></pre><p>上述命令可以将本地指定分支推送到远程指定分支。</p><h1>X.0 Git 其他命令用法</h1><h1>END 声明</h1><p><strong>文章参考</strong><a href="https://www.runoob.com/git">菜鸟教程 | Git</a></p><p><strong>其他参考网址/附件下载</strong></p><p><strong>文章声明</strong></p><ul><li>文章部分内容采用 AI 辅助生成</li></ul>
]]></content:encoded>
<slash:comments>0</slash:comments>
<comments>https://blog.atoery.cn/index.php/2025/02/27/34.html#comments</comments>
<wfw:commentRss>https://blog.atoery.cn/index.php/feed/tag/tools/</wfw:commentRss>
</item>
<item>
<title>Makefile 基本使用</title>
<link>https://blog.atoery.cn/index.php/2025/02/22/29.html</link>
<guid>https://blog.atoery.cn/index.php/2025/02/22/29.html</guid>
<pubDate>Sat, 22 Feb 2025 01:12:00 +0800</pubDate>
<dc:creator>JRNitre</dc:creator>
<description><![CDATA[1.0 Makefile 基础在 Linux 下，通过 make 命令即可实现通过 Makefile 文件定义的规则自动化执行任意命令（包括编译）。即通过一个命令一个文件即可实现预定义好的任意操...]]></description>
<content:encoded xml:lang="zh-CN"><![CDATA[
<h1>1.0 Makefile 基础</h1><p>在 Linux 下，通过 <code>make</code> 命令即可实现通过 <code>Makefile</code> 文件定义的规则自动化执行任意命令（包括编译）。</p><p>即通过一个命令一个文件即可实现预定义好的任意操作。</p><h2>1.1 规则</h2><p><code>Makefile</code> 由若干条规则（Rule）构成，每条规则指出一个目标文件（Target），若干依赖文件（Prerequisites），以及生成目标文件的命令。</p><p>例如，如果需要生成文件 <code>m.txt</code> 其由 <code>a.txt</code> 和 <code>b.txt</code> 合并而来，则有如下规则：</p><pre><code class="lang-Makefile"># 目标文件：依赖文件 1 依赖文件 2
m.txt: a.txt b.txt
    cat a.txt b.txt &gt; m.txt</code></pre><p>第一行定义了一条规则，第二行通过<code>tab</code>规定了一条命令，使用 <code>cat</code> 合并两个文件，其中 <code>#</code> 开头的为注释 <code>make</code>命令会忽略。</p><blockquote>在 makefile 中命令必须使用 <code>tab</code> 定义，空格定义的无效。</blockquote><p>由于 <code>make</code> 执行时默认执行第一条规则，所以仿照上述的方法可以写出第二个规则：</p><pre><code>x.txt: m.txt c.txt
    cat m.txt c.txt &gt; x.txt

m.txt: a.txt b.txt
    cat a.txt b.txt &gt; m.txt</code></pre><p>此时在系统内某一文件夹创建 <code>a.txt</code>、<code>b.txt</code>、<code>c.txt</code>，输入一些内容执行 <code>make</code>：</p><p><img src="http://mashirospace.cn:4607/usr/uploads/2025/02/3010390722.png" alt="" title=""></p><p><code>make</code> 默认执行第一条规则，在创建 <code>x.txt</code> 的时候发现 <code>m.txt</code> 不存在，因此先执行规则 <code>m.txt</code> 创建 <code>m.txt</code> 文件，再执行规则 <code>x.txt</code> 。</p><p>综上可见，<code>Makefile</code> 定义了一系列的规则，在每个规则满足目标的前提下执行命令，就能创建出一个目标文件。</p><p>在编写 <code>Makefile</code> 的时候把默认执行的规则放在第一条，其它的规则顺序无关紧要，因为 <code>make</code> 在执行的时候会自行判断依赖。</p><p>此外 <code>make</code> 会打印出每一条执行的命令，便于观察执行顺序。</p><p>在上述 <code>make</code> 命令执行完毕后再次执行 <code>make</code> 后，输出如下：</p><pre><code>$ make
make: “x.txt”已是最新。</code></pre><p><code>make</code> 检测到 <code>x.txt</code> 为最新的版本，无需再次执行，因为 <code>x.txt</code> 的创建时间晚于它依赖文件的最后修改时间。</p><p>可见，<code>make</code> 使用文件的创建和修改时间来判断是否该更新一个目标文件。</p><p>如果修改任意依赖文件后，再次执行 <code>make</code> 命令即可触发 <code>x.txt</code> 的更新。</p><p>假设修改了 <code>c.txt</code> 文件，则执行 <code>make</code> 命令后会触发 <code>x.txt</code> 的更新，并不会触发 <code>m.txt</code> 的更新，因为 <code>m.txt</code> 的依赖文件并没有变化，所以，<code>make</code> 会根据 <code>Makefile</code> 执行必要的规则，并非无脑执行所有规则。</p><p>在编译大型程序时，完全编译一次往往需要几十分钟甚至数小时，若每次对文件修改后都要执行完全编译则太过于浪费时间，<code>Makefile</code> 的存在即可大幅节省编译时间。</p><p>当然，对于 <code>Makefile</code> 是否能高效的完成增量更新，取决于规则书写的是否正确，<code>make</code> 本身并不会检查规则逻辑是否正确。</p><h2>1.2 伪目标</h2><p>在上述的例子中，<code>m.txt</code> 和 <code>x.txt</code> 是自动生成的文件，所以可以安全地删除。</p><p>但是如果我们希望自动删除，则可以编写一个 <code>clean</code> 规则来删除它们：</p><pre><code>clean:
    rm -f m.txt
    rm -f x.txt</code></pre><p><code>clear</code> 命令，与上面所用的命令不同，其没有依赖文件，因此需要执行 <code>clean</code> 命令时必须在命令行使用命令 <code>make clean</code></p><p>值得注意的是，如果在执行 <code>clean</code> 的时候，目录下并没有 <code>clean</code> 文件，每次执行 <code>make clean</code> 命令时都会执行 <code>Makefile</code> 中这个规则的命令。</p><p>所以，如果目录下有一个名为 <code>clean</code> 的文件，则此时 <code>Makefile</code> 中的 <code>clean</code> 规则就不会执行了！</p><p>如果目录下既需要 <code>clean</code> 文件，还想正常使用 <code>Makefile</code> 文件的 <code>clean</code> 规则，则可以添加一个标识：</p><pre><code>.PHONY: clean
clean:
    rm -f m.txt
    rm -f x.txt</code></pre><p>此时的 <code>clean</code> 就不会被视为一个文件，而是伪目标（Phony Target）</p><p>在大型项目中约定俗成下将：<code>clean</code>、<code>install</code> 这些视为伪目标名称，方便用户快速执行对应的任务。</p><blockquote>一般不会有人在目录下创建名为 <code>clean</code> 的文件，除非有人蓄意搞破坏。</blockquote><h2>1.3 执行多条命令</h2><h2>1.4 控制打印</h2><h2>1.5 控制错误</h2><h2>1.6 小结</h2><p>编写 <code>Makefile</code> 就是编写一系列的规则，用来告诉 <code>make</code> 该如何执行这些规则，从而生成我们最终需要的文件。</p>
]]></content:encoded>
<slash:comments>0</slash:comments>
<comments>https://blog.atoery.cn/index.php/2025/02/22/29.html#comments</comments>
<wfw:commentRss>https://blog.atoery.cn/index.php/feed/tag/tools/</wfw:commentRss>
</item>
<item>
<title>Linux 环境下安装新版 Neovim</title>
<link>https://blog.atoery.cn/index.php/2025/02/22/24.html</link>
<guid>https://blog.atoery.cn/index.php/2025/02/22/24.html</guid>
<pubDate>Sat, 22 Feb 2025 00:51:00 +0800</pubDate>
<dc:creator>JRNitre</dc:creator>
<description><![CDATA[1.0 前言本文所使用安装环境：Debian 12、Gnome由于 apt 等包管理器自带的 neovim 版本较老，因此使用新版 neovim 需要自行安装。2.0 安装2.1 移除旧版 ne...]]></description>
<content:encoded xml:lang="zh-CN"><![CDATA[
<h1>1.0 前言</h1><p>本文所使用安装环境：<code>Debian 12</code>、<code>Gnome</code></p><p>由于 <code>apt</code> 等包管理器自带的 neovim 版本较老，因此使用新版 neovim 需要自行安装。</p><h1>2.0 安装</h1><h2>2.1 移除旧版 neovim （如有）</h2><pre><code>sudo remove neovim</code></pre><h2>2.2 下载新版安装包</h2><p>前往 Github 下载最新版本安装包至本地（截止至本文日期最新版本为： <code>10.4</code>）</p><p></p><pre><code>sudo wget https://github.com/neovim/neovim/releases/download/v0.10.4/nvim-linux-x86_64.tar.gz</code></pre><h2>2.3 解压并移动</h2><pre><code>sudo tar -zxvf nvim-linux64.tar.gz</code></pre><pre><code>sudo mv nvim-linux64 /usr/local/win</code></pre><h2>2.4 创建软链接</h2><pre><code>sudo ln -s /usr/local/nvim/bin/nvim /usr/bin/nvim</code></pre><h2>3.0 检查安装版本</h2><pre><code>neovim -v</code></pre><p><img src="http://mashirospace.cn:4607/usr/uploads/2025/02/1587976648.png" alt="" title=""></p><p><img src="http://mashirospace.cn:4607/usr/uploads/2025/02/3132780757.png" alt="" title=""></p>
]]></content:encoded>
<slash:comments>0</slash:comments>
<comments>https://blog.atoery.cn/index.php/2025/02/22/24.html#comments</comments>
<wfw:commentRss>https://blog.atoery.cn/index.php/feed/tag/tools/</wfw:commentRss>
</item>
</channel>
</rss>