<?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>Cassius0924 的博客</title>
    <link>https://blog.cassdev.com/</link>
    <description>Recent content on Cassius0924 的博客</description>
    <generator>Hugo -- 0.148.2</generator>
    <language>zh-CN</language>
    <copyright>Copyright © 2025-2026 Cassius0924. All rights reserved.</copyright>
    <lastBuildDate>Sun, 17 May 2026 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://blog.cassdev.com/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>如何写好一个 Skill</title>
      <link>https://blog.cassdev.com/posts/%E5%A6%82%E4%BD%95%E5%86%99%E5%A5%BD%E4%B8%80%E4%B8%AA-skill/</link>
      <pubDate>Sun, 17 May 2026 00:00:00 +0000</pubDate>
      <guid>https://blog.cassdev.com/posts/%E5%A6%82%E4%BD%95%E5%86%99%E5%A5%BD%E4%B8%80%E4%B8%AA-skill/</guid>
      <description>从触发、执行、上下文管理和评估四个角度，梳理如何写出真正能提升 Agent 能力的 Skill。</description>
    </item>
    <item>
      <title>烧录树莓派系统镜像指南</title>
      <link>https://blog.cassdev.com/posts/%E7%83%A7%E5%BD%95%E6%A0%91%E8%8E%93%E6%B4%BE%E7%B3%BB%E7%BB%9F%E9%95%9C%E5%83%8F%E6%8C%87%E5%8D%97/</link>
      <pubDate>Mon, 02 Feb 2026 18:47:58 +0800</pubDate>
      <guid>https://blog.cassdev.com/posts/%E7%83%A7%E5%BD%95%E6%A0%91%E8%8E%93%E6%B4%BE%E7%B3%BB%E7%BB%9F%E9%95%9C%E5%83%8F%E6%8C%87%E5%8D%97/</guid>
      <description>本文将指导您如何在 macOS/Windows 系统上将树莓派系统镜像烧录到 SD 卡中，以便在树莓派设备上使用。</description>
    </item>
    <item>
      <title>使用 systemd 优雅的管理自启动服务</title>
      <link>https://blog.cassdev.com/posts/%E4%BD%BF%E7%94%A8-systemd-%E4%BC%98%E9%9B%85%E7%9A%84%E7%AE%A1%E7%90%86%E8%87%AA%E5%90%AF%E5%8A%A8%E6%9C%8D%E5%8A%A1/</link>
      <pubDate>Sat, 31 Jan 2026 01:40:00 +0800</pubDate>
      <guid>https://blog.cassdev.com/posts/%E4%BD%BF%E7%94%A8-systemd-%E4%BC%98%E9%9B%85%E7%9A%84%E7%AE%A1%E7%90%86%E8%87%AA%E5%90%AF%E5%8A%A8%E6%9C%8D%E5%8A%A1/</guid>
      <description>介绍如何使用 systemd 来管理和配置 Linux 系统中的自启动服务。</description>
    </item>
    <item>
      <title>使用 Certbot 申请泛域名 SSL 证书指南</title>
      <link>https://blog.cassdev.com/posts/%E4%BD%BF%E7%94%A8-certbot-%E7%94%B3%E8%AF%B7%E6%B3%9B%E5%9F%9F%E5%90%8D-ssl-%E8%AF%81%E4%B9%A6%E6%8C%87%E5%8D%97/</link>
      <pubDate>Wed, 28 Jan 2026 20:23:00 +0800</pubDate>
      <guid>https://blog.cassdev.com/posts/%E4%BD%BF%E7%94%A8-certbot-%E7%94%B3%E8%AF%B7%E6%B3%9B%E5%9F%9F%E5%90%8D-ssl-%E8%AF%81%E4%B9%A6%E6%8C%87%E5%8D%97/</guid>
      <description>介绍如何使用 Certbot 申请和配置泛域名 SSL 证书的步骤。</description>
    </item>
    <item>
      <title>LLM 参数之 Temperature 和 Top-p</title>
      <link>https://blog.cassdev.com/posts/llm-param-temeprature-and-top-p/</link>
      <pubDate>Thu, 31 Jul 2025 00:00:00 +0000</pubDate>
      <guid>https://blog.cassdev.com/posts/llm-param-temeprature-and-top-p/</guid>
      <description>深入探讨AI生成内容中的Temperature和Top-p参数的作用与实现机制。</description>
    </item>
    <item>
      <title>LLM 参数之 Response Format</title>
      <link>https://blog.cassdev.com/posts/llm-param-response-format/</link>
      <pubDate>Tue, 29 Jul 2025 00:00:00 +0000</pubDate>
      <guid>https://blog.cassdev.com/posts/llm-param-response-format/</guid>
      <description>深入探讨 LLM 的 Response Format 参数，如何确保生成内容符合预期格式。</description>
    </item>
    <item>
      <title>浅析 Textmate 语法高亮规则运行机制</title>
      <link>https://blog.cassdev.com/posts/%E6%B5%85%E6%9E%90-textmate-%E8%AF%AD%E6%B3%95%E9%AB%98%E4%BA%AE%E8%A7%84%E5%88%99%E8%BF%90%E8%A1%8C%E6%9C%BA%E5%88%B6/</link>
      <pubDate>Sun, 20 Jul 2025 15:47:58 +0800</pubDate>
      <guid>https://blog.cassdev.com/posts/%E6%B5%85%E6%9E%90-textmate-%E8%AF%AD%E6%B3%95%E9%AB%98%E4%BA%AE%E8%A7%84%E5%88%99%E8%BF%90%E8%A1%8C%E6%9C%BA%E5%88%B6/</guid>
      <description>浅析 Textmate 语法高亮规则运行机制，了解其分词和主题化的工作原理</description>
    </item>
    <item>
      <title>Vim 技能补全计划</title>
      <link>https://blog.cassdev.com/posts/vim-skill-completion-plan/</link>
      <pubDate>Sat, 19 Jul 2025 00:00:00 +0000</pubDate>
      <guid>https://blog.cassdev.com/posts/vim-skill-completion-plan/</guid>
      <description>适合已经熟悉 Vim 基础操作，希望提高编辑技能的开发者的实用技巧集合</description>
    </item>
    <item>
      <title>Socket 编程之 epoll 源码分析学习笔记</title>
      <link>https://blog.cassdev.com/posts/socket-%E7%BC%96%E7%A8%8B%E4%B9%8B-epoll-%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/</link>
      <pubDate>Sun, 30 Jun 2024 15:31:40 +0800</pubDate>
      <guid>https://blog.cassdev.com/posts/socket-%E7%BC%96%E7%A8%8B%E4%B9%8B-epoll-%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/</guid>
      <description>&lt;p&gt;本文基于 Linux 6.9 内核源码进行分析。&lt;/p&gt;
&lt;h2 id=&#34;几个数据结构&#34;&gt;几个数据结构&lt;/h2&gt;&lt;p&gt;&lt;img alt=&#34;数据结构&#34; loading=&#34;lazy&#34; src=&#34;https://s2.loli.net/2024/06/30/fPingVOd2YcEFUX.jpg&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;eventpoll&#34;&gt;eventpoll&lt;/h3&gt;&lt;p&gt;这是 epoll 的主要数据结构，它用于存储 epoll 的相关信息，包括等待队列、就绪队列、红黑树等。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;struct&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;eventpoll&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;kt&#34;&gt;wait_queue_head_t&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;wq&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;       &lt;span class=&#34;c1&#34;&gt;// epoll 的等待队列：用于存储等待的进程/线程，指向等待队列头
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;kt&#34;&gt;wait_queue_head_t&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;poll_wait&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// 这个 poll_wait 等待队列只有在 epoll 嵌套的情况下才会用到
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;k&#34;&gt;struct&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;list_head&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;rdllist&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;   &lt;span class=&#34;c1&#34;&gt;// 就绪队列：用于存储就绪的 fd，指向就绪队列头
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;k&#34;&gt;struct&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;rb_root_cached&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;rbr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;  &lt;span class=&#34;c1&#34;&gt;// 红黑树：用于存储所有的 fd，指向红黑树根节点
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;k&#34;&gt;struct&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;wakeup_source&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ws&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;   &lt;span class=&#34;c1&#34;&gt;// 一个唤醒源，用于唤醒进程
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;epitem&#34;&gt;epitem&lt;/h3&gt;&lt;p&gt;epitem 的作用是将 fd、就绪队列、红黑树节点等信息封装在一起。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;struct&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;epitem&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;union&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;struct&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;rb_node&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;rbn&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;     &lt;span class=&#34;c1&#34;&gt;// 红黑树节点，用于存储 fd，指向红黑树节点
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;        &lt;span class=&#34;k&#34;&gt;struct&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;rcu_head&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;rcu&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;    &lt;span class=&#34;c1&#34;&gt;// 用于释放 epitem
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;    &lt;span class=&#34;p&#34;&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;struct&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;list_head&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;rdllink&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;   &lt;span class=&#34;c1&#34;&gt;// 就绪队列节点，用于存储就绪的 fd，指向就绪队列节点
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;struct&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;eventpoll&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ep&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;       &lt;span class=&#34;c1&#34;&gt;// 指向 eventpoll
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;struct&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;epoll_filefd&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ffd&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;    &lt;span class=&#34;c1&#34;&gt;// epoll 文件描述符
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;struct&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;wakeup_source&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ws&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;   &lt;span class=&#34;c1&#34;&gt;// 一个唤醒源，用于唤醒进程
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;struct&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;epoll_event&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;event&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;   &lt;span class=&#34;c1&#34;&gt;// 监听的事件
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;ep_pqueue&#34;&gt;ep_pqueue&lt;/h3&gt;&lt;p&gt;给 poll 队列封装的结构体，用于存储 poll_table 和 epitem。&lt;/p&gt;</description>
    </item>
    <item>
      <title>C&#43;&#43; 内存模型学习笔记</title>
      <link>https://blog.cassdev.com/posts/c&#43;&#43;-%E5%86%85%E5%AD%98%E6%A8%A1%E5%9E%8B%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/</link>
      <pubDate>Sat, 29 Jun 2024 16:44:14 +0800</pubDate>
      <guid>https://blog.cassdev.com/posts/c&#43;&#43;-%E5%86%85%E5%AD%98%E6%A8%A1%E5%9E%8B%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/</guid>
      <description>&lt;p&gt;C++ 内存模型从上（高地址）到下（低地址）可以分为以下几个部分：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;栈区&lt;/strong&gt;：由编译器自动分配释放，存放函数的参数值、局部变量的值等。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;堆区&lt;/strong&gt;：由程序员分配释放，若程序员不释放，程序结束时可能由操作系统回收。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;全局/静态区&lt;/strong&gt;：分为 .data 段（全局初始化区）和 .bss 段（全局未初始化区），.data 段存放 &lt;strong&gt;已初始化&lt;/strong&gt; 了的全局变量和静态变量，.bss 段存放 &lt;strong&gt;未初始化&lt;/strong&gt; 的变量。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;常量区&lt;/strong&gt;：就是 .rodata 段，存放常量。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;代码区&lt;/strong&gt;：存放函数体的代码。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://s2.loli.net/2024/06/29/kHdqTj5Y2Fh7Ea4.jpg&#34;&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>C&#43;&#43; delete ptr 和 ptr = nullptr 的区别</title>
      <link>https://blog.cassdev.com/posts/c&#43;&#43;-delete-ptr-%E5%92%8C-ptr--nullptr-%E7%9A%84%E5%8C%BA%E5%88%AB/</link>
      <pubDate>Sat, 29 Jun 2024 14:42:02 +0800</pubDate>
      <guid>https://blog.cassdev.com/posts/c&#43;&#43;-delete-ptr-%E5%92%8C-ptr--nullptr-%E7%9A%84%E5%8C%BA%E5%88%AB/</guid>
      <description>&lt;h2 id=&#34;delete-ptr&#34;&gt;delete ptr&lt;/h2&gt;&lt;p&gt;&lt;code&gt;delete ptr&lt;/code&gt; 是释放 &lt;code&gt;ptr&lt;/code&gt; 所指向的对象资源，而 &lt;code&gt;ptr&lt;/code&gt; 依然存在，且依然指向那片内存地址。&lt;/p&gt;
&lt;h2 id=&#34;ptr--nullptr&#34;&gt;ptr = nullptr&lt;/h2&gt;&lt;p&gt;&lt;code&gt;ptr = nullptr&lt;/code&gt; 是将 &lt;code&gt;ptr&lt;/code&gt; 指向空指针，和其所指向的对象没关系。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;ptr&#34; loading=&#34;lazy&#34; src=&#34;https://s2.loli.net/2024/06/29/z8RCgt6krxTPZjU.jpg&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;试着实现一个-unique_ptr&#34;&gt;试着实现一个 unique_ptr&lt;/h2&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-c++&#34; data-lang=&#34;c++&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;template&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;typename&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;T&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;UniquePtr&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;private&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;T&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;_ptr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;// 默认构造
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;    &lt;span class=&#34;n&#34;&gt;UniquePtr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;_ptr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;nullptr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;explicit&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;UniquePtr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;T&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ptr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;_ptr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ptr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;~&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;UniquePtr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;delete&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;_ptr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;c1&#34;&gt;// 无需置 nullptr，因为析构函数会被调用，_ptr 会被销毁
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;        &lt;span class=&#34;c1&#34;&gt;// 置空无意义
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;// 拷贝构造 删除
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;    &lt;span class=&#34;n&#34;&gt;UniquePtr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;UniquePtr&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;delete&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;UniquePtr&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;operator&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;UniquePtr&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;delete&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;// 移动构造
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;    &lt;span class=&#34;n&#34;&gt;UniquePtr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;UniquePtr&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;p&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;noexcept&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;_ptr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;p&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;_ptr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;c1&#34;&gt;// 至于这里为什么不需要 delete _ptr
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;        &lt;span class=&#34;c1&#34;&gt;// 是因为这是移动构造函数，是个构造函数！_ptr 本来就没有资源
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;        &lt;span class=&#34;n&#34;&gt;p&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;_ptr&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;nullptr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;UniquePtr&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;operator&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;UniquePtr&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;p&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;noexcept&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;p&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;!=&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;this&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;delete&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;_ptr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;        &lt;span class=&#34;c1&#34;&gt;// 第一步，释放当前资源
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;            &lt;span class=&#34;n&#34;&gt;_ptr&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;p&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;_ptr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;      &lt;span class=&#34;c1&#34;&gt;// 第二步，将当前指针指向新的资源
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;            &lt;span class=&#34;n&#34;&gt;p&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;_ptr&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;nullptr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;   &lt;span class=&#34;c1&#34;&gt;// 第三步，将原来的指针置空
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;        &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;this&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;T&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;// 返回指针
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;_ptr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;T&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;operator&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;// 返回指针
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;_ptr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;T&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;operator&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;// 解引用
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;_ptr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;T&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;release&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;c1&#34;&gt;// 这里不能 delete _ptr
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;        &lt;span class=&#34;c1&#34;&gt;// 因为 release 只是解除 UniquePtr 对资源的所有权，但资源还是存在的
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;        &lt;span class=&#34;n&#34;&gt;T&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;tmp&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;_ptr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;_ptr&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;nullptr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;tmp&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;reset&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;T&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;newptr&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;nullptr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;_ptr&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;!=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;newptr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;delete&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;_ptr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;        &lt;span class=&#34;c1&#34;&gt;// 释放当前资源
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;            &lt;span class=&#34;n&#34;&gt;_ptr&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;newptr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;      &lt;span class=&#34;c1&#34;&gt;// 指向新资源
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;            &lt;span class=&#34;c1&#34;&gt;// 这里不需要置空 newptr
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;            &lt;span class=&#34;c1&#34;&gt;// 是否置空 new ptr 由用户决定
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;        &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;UniquePtr &amp;amp;operator=(UniquePtr &amp;amp;&amp;amp;p)&lt;/code&gt; 移动赋值运算符的原理如下图：&lt;/p&gt;</description>
    </item>
    <item>
      <title>哈希冲突解决方法学习笔记</title>
      <link>https://blog.cassdev.com/posts/%E5%93%88%E5%B8%8C%E5%86%B2%E7%AA%81%E8%A7%A3%E5%86%B3%E6%96%B9%E6%B3%95%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/</link>
      <pubDate>Sat, 29 Jun 2024 10:16:12 +0800</pubDate>
      <guid>https://blog.cassdev.com/posts/%E5%93%88%E5%B8%8C%E5%86%B2%E7%AA%81%E8%A7%A3%E5%86%B3%E6%96%B9%E6%B3%95%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/</guid>
      <description>&lt;h2 id=&#34;链地址法&#34;&gt;链地址法&lt;/h2&gt;&lt;p&gt;链地址法也叫做拉链法，它的基本思想是，将哈希表中的每个槽位都指向一个链表，当发生哈希冲突时，将数据插入到链表中。&lt;/p&gt;
&lt;p&gt;很好理解，如图所示：&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://s2.loli.net/2024/06/29/DUupYdFkvxbCscP.png&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;开放定址法&#34;&gt;开放定址法&lt;/h2&gt;&lt;p&gt;开放定址法是一种解决哈希冲突的方法，它的基本思想是，当发生哈希冲突时，不是将数据直接插入到哈希表中，而是寻找哈希表中的空槽位，将数据插入到空槽位中。&lt;/p&gt;
&lt;h3 id=&#34;线性探测&#34;&gt;线性探测&lt;/h3&gt;&lt;p&gt;线性探测采用固定步长的线性搜索来进行探测。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;插入元素：通过哈希函数计算桶索引，若发现桶内已有元素，则从冲突位置向后线性遍历（步长通常为 1），直至找到空桶，将元素插入其中。&lt;/li&gt;
&lt;li&gt;查找元素：若发现哈希冲突，则使用相同步长向后进行线性遍历，直到找到对应元素，返回 value 即可；如果遇到空桶，说明目标元素不在哈希表中，返回 None 。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;注意，我们不能在开放寻址哈希表中直接删除元素。因为删除元素会在数组内产生一个空桶 None ，当查询元素时，线性探测到该空桶就会返回，因此在该空桶之下的元素都无法再被访问到，程序可能误判这些元素不存在。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://s2.loli.net/2024/06/29/qEIPUWjZ2HNwBbp.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;为了解决该问题，我们可以采用懒删除（ &lt;em&gt;lazy deletion&lt;/em&gt; ）机制，不直接从哈希表中移除元素，而是利用一个常量 &lt;strong&gt;TOMBSTONE&lt;/strong&gt; 来标记这个桶。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;None&lt;/strong&gt; 和 &lt;strong&gt;TOMBSTONE&lt;/strong&gt; 都代表空桶，都可以放置键值对。线性探测到 TOMBSTONE 时应该继续遍历，因为其之下可能还存在键值对。在线性探测中记录遇到的首个 TOMBSTONE 的索引，并将搜索到的目标元素与该 TOMBSTONE 交换位置，这样可以优化效率。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://s2.loli.net/2024/06/29/gxJ6SFeRzVZwG25.jpg&#34;&gt;&lt;/p&gt;
&lt;p&gt;线性探测容易产生 &lt;strong&gt;聚集现象&lt;/strong&gt;，为了缓解这个问题，就有了平方探测和双重散列。&lt;/p&gt;
&lt;h3 id=&#34;平方探测&#34;&gt;平方探测&lt;/h3&gt;&lt;p&gt;平方探测思想与线性探测类似，不同之处在于探测的步长是平方级别的。即当发生哈希冲突时，探测的步长为 &lt;code&gt;1&lt;/code&gt;，&lt;code&gt;4&lt;/code&gt;，&lt;code&gt;9&lt;/code&gt;，&amp;hellip;步。&lt;/p&gt;
&lt;p&gt;平方探测可以缓解线性探测的聚集现象，但不能彻底解决。&lt;/p&gt;
&lt;h3 id=&#34;多次哈希&#34;&gt;多次哈希&lt;/h3&gt;&lt;p&gt;多次哈希的基本思想是，当发生哈希冲突时，尝试其他的哈希函数，直到找到空槽位。&lt;/p&gt;
&lt;p&gt;与线性探测相比，多次哈希方法不易产生聚集，但多个哈希函数会带来额外的计算量。&lt;/p&gt;

            &lt;link rel=&#34;stylesheet&#34; href=&#34;https://blog.cassdev.com/css/vendors/admonitions.4fd9a0b8ec8899f2ca952048d255a569f433f77dfb3f52f5bc87e7d65cdce449.css&#34; integrity=&#34;sha256-T9mguOyImfLKlSBI0lWlafQz9337P1L1vIfn1lzc5Ek=&#34; crossorigin=&#34;anonymous&#34;&gt;
    &lt;div class=&#34;admonition warning&#34;&gt;
      &lt;div class=&#34;admonition-header&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; viewBox=&#34;0 0 512 512&#34;&gt;&lt;path d=&#34;M256 32c14.2 0 27.3 7.5 34.5 19.8l216 368c7.3 12.4 7.3 27.7 .2 40.1S486.3 480 472 480L40 480c-14.3 0-27.6-7.7-34.7-20.1s-7-27.8 .2-40.1l216-368C228.7 39.5 241.8 32 256 32zm0 128c-13.3 0-24 10.7-24 24l0 112c0 13.3 10.7 24 24 24s24-10.7 24-24l0-112c0-13.3-10.7-24-24-24zm32 224a32 32 0 1 0 -64 0 32 32 0 1 0 64 0z&#34;/&gt;&lt;/svg&gt;
        &lt;span&gt;警告&lt;/span&gt;
      &lt;/div&gt;
      &lt;div class=&#34;admonition-content&#34;&gt;
        &lt;p&gt;以上三种方法，线性探测、平方探测和多次哈希哈希表都存在 &lt;strong&gt;不能直接删除元素&lt;/strong&gt; 的问题。&lt;/p&gt;</description>
    </item>
    <item>
      <title>C&#43;&#43; STL 常用容器和迭代器学习笔记</title>
      <link>https://blog.cassdev.com/posts/c&#43;&#43;-stl-%E5%B8%B8%E7%94%A8%E5%AE%B9%E5%99%A8%E5%92%8C%E8%BF%AD%E4%BB%A3%E5%99%A8%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/</link>
      <pubDate>Fri, 28 Jun 2024 19:50:50 +0800</pubDate>
      <guid>https://blog.cassdev.com/posts/c&#43;&#43;-stl-%E5%B8%B8%E7%94%A8%E5%AE%B9%E5%99%A8%E5%92%8C%E8%BF%AD%E4%BB%A3%E5%99%A8%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/</guid>
      <description>&lt;h2 id=&#34;常用容器&#34;&gt;常用容器&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;序列容器&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;vector&lt;/code&gt;: 动态数组，随机插入/删除 &lt;code&gt;O(n)&lt;/code&gt;，随机访问 &lt;code&gt;O(1)&lt;/code&gt;，尾插 &lt;code&gt;O(1)&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;array&lt;/code&gt;: 静态数组，不支持插入/删除，随机访问 &lt;code&gt;O(1)&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;deque&lt;/code&gt;: 双端队列，头尾插入/删除 &lt;code&gt;O(1)&lt;/code&gt;，随机访问 &lt;code&gt;O(1)&lt;/code&gt;，中间插入/删除 &lt;code&gt;O(n)&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;list&lt;/code&gt;: 双向链表，插入/删除 &lt;code&gt;O(1)&lt;/code&gt;，不支持随机访问&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;forward_list&lt;/code&gt;: 单向链表，插入/删除 &lt;code&gt;O(1)&lt;/code&gt;，不支持随机访问&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;关联容器（底层实现为 &lt;strong&gt;红黑树&lt;/strong&gt; ）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;set&lt;/code&gt;: 有序集合，插入/删除/查找 &lt;code&gt;O(logn)&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;map&lt;/code&gt;: 有序映射，插入/删除/查找 &lt;code&gt;O(logn)&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;multiset&lt;/code&gt;: 有序多重集合，插入/删除/查找 &lt;code&gt;O(logn)&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;multimap&lt;/code&gt;: 有序多重映射，插入/删除/查找 &lt;code&gt;O(logn)&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;无序容器（底层实现为 &lt;strong&gt;哈希表&lt;/strong&gt; ）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;unordered_set&lt;/code&gt;: 无序集合，插入/删除/查找 &lt;code&gt;O(1)&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;unordered_map&lt;/code&gt;: 无序映射，插入/删除/查找 &lt;code&gt;O(1)&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;unordered_multiset&lt;/code&gt;: 无序多重集合，插入/删除/查找 &lt;code&gt;O(1)&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;unordered_multimap&lt;/code&gt;: 无序多重映射，插入/删除/查找 &lt;code&gt;O(1)&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;容器适配器&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;stack&lt;/code&gt;: 栈，后进先出，只能在栈顶插入/删除元素&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;queue&lt;/code&gt;: 队列，先进先出，只能在队尾插入，在队头删除元素&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;priority_queue&lt;/code&gt;: 优先队列，元素按照一定规则排序，每次取出的是最大/最小元素，底层实现为堆&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;vector&#34;&gt;vector&lt;/h2&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-c++&#34; data-lang=&#34;c++&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;#include&lt;/span&gt; &lt;span class=&#34;cpf&#34;&gt;&amp;lt;iostream&amp;gt;&lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;#include&lt;/span&gt; &lt;span class=&#34;cpf&#34;&gt;&amp;lt;vector&amp;gt;&lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;using&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;namespace&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;std&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// vector使用示例
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;vector&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;vec&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;4&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;5&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;// 尾部插入元素：复杂度为O(1)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;    &lt;span class=&#34;n&#34;&gt;vec&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;push_back&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;6&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;// 尾部删除元素：复杂度为O(1)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;    &lt;span class=&#34;n&#34;&gt;vec&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;pop_back&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;// 随机插入和删除元素：复杂度为O(n)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;    &lt;span class=&#34;n&#34;&gt;vec&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;insert&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;vec&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;begin&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;vec&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;erase&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;vec&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;begin&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;// vector的大小
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;    &lt;span class=&#34;n&#34;&gt;cout&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;vec&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;size&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;endl&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;// 获取vector的容量
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;    &lt;span class=&#34;n&#34;&gt;cout&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;vec&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;capacity&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;endl&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;// 判断vector是否为空
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;    &lt;span class=&#34;n&#34;&gt;cout&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;vec&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;empty&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;endl&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;// 获取vector的第一个元素和最后一个元素
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;    &lt;span class=&#34;n&#34;&gt;cout&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;vec&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;front&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;endl&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;cout&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;vec&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;back&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;endl&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;// 访问指定位置的元素
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;    &lt;span class=&#34;n&#34;&gt;cout&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;vec&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;endl&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;cout&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;vec&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;at&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;endl&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;// at函数会检查索引是否越界，更安全
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;vector&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;vec2&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;7&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;8&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;9&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;vec&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;swap&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;vec2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;// 交换两个vector的元素
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;// 清空vector
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;    &lt;span class=&#34;n&#34;&gt;vec&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;clear&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;vector 常用的成员函数：&lt;/p&gt;</description>
    </item>
    <item>
      <title>C&#43;&#43; 对象和指针的区别学习笔记</title>
      <link>https://blog.cassdev.com/posts/c&#43;&#43;-%E5%AF%B9%E8%B1%A1%E5%92%8C%E6%8C%87%E9%92%88%E7%9A%84%E5%8C%BA%E5%88%AB%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/</link>
      <pubDate>Fri, 28 Jun 2024 10:26:35 +0800</pubDate>
      <guid>https://blog.cassdev.com/posts/c&#43;&#43;-%E5%AF%B9%E8%B1%A1%E5%92%8C%E6%8C%87%E9%92%88%E7%9A%84%E5%8C%BA%E5%88%AB%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/</guid>
      <description>&lt;h2 id=&#34;对象&#34;&gt;对象&lt;/h2&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-c++&#34; data-lang=&#34;c++&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;MyClass&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;obj&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;obj&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;fun&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;obj&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;count&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;对象是类的实例，占据实际的内存空间，可以调用类的成员函数和访问类的成员变量。&lt;/p&gt;
&lt;p&gt;对象大小 = 成员变量大小 + 对齐填充&lt;/p&gt;
&lt;h2 id=&#34;指针&#34;&gt;指针&lt;/h2&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-c++&#34; data-lang=&#34;c++&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;MyClass&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;p&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;MyClass&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;p&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;fun&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;p&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;count&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;指针是一个变量，存储对象的地址，可以通过指针访问对象的成员函数和成员变量。&lt;/p&gt;
&lt;p&gt;指针大小 = 4 字节（32 位系统）或 8 字节（64 位系统）&lt;/p&gt;
&lt;h2 id=&#34;对象和指针的区别&#34;&gt;对象和指针的区别&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;内存管理
&lt;ul&gt;
&lt;li&gt;对象：内存分配和释放通常是自动的（除非使用动态分配）。&lt;/li&gt;
&lt;li&gt;指针：指向的内存需要手动管理，尤其是动态分配的内存。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;访问方式：
&lt;ul&gt;
&lt;li&gt;对象：直接访问成员。&lt;/li&gt;
&lt;li&gt;指针：通过解引用访问成员（使用 -&amp;gt; 操作符）。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;生命周期：
&lt;ul&gt;
&lt;li&gt;对象：由作用域决定，局部对象在离开作用域时自动销毁。&lt;/li&gt;
&lt;li&gt;指针：生命周期由程序员控制，指针可以指向任何作用域的变量。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;</description>
    </item>
    <item>
      <title>C&#43;&#43; 多态学习笔记</title>
      <link>https://blog.cassdev.com/posts/c&#43;&#43;-%E5%A4%9A%E6%80%81%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/</link>
      <pubDate>Thu, 27 Jun 2024 22:52:10 +0800</pubDate>
      <guid>https://blog.cassdev.com/posts/c&#43;&#43;-%E5%A4%9A%E6%80%81%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/</guid>
      <description>&lt;p&gt;C++ 的多态性是面向对象程序设计的三大特性之一（封装、继承、多态），它允许将子类对象赋值给父类对象，从而实现基类指针指向子类对象，实现基类指针调用子类对象的成员函数。&lt;/p&gt;
&lt;p&gt;C++ 的多态性主要有两种实现方式：静态多态和动态多态。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;静态多态：通过函数重载和模板实现。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;动态多态：通过虚函数实现。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;静态多态&#34;&gt;静态多态&lt;/h2&gt;&lt;h3 id=&#34;函数重载&#34;&gt;函数重载&lt;/h3&gt;&lt;p&gt;函数重载是指在同一个作用域内，可以定义 &lt;strong&gt;多个名称相同&lt;/strong&gt; 但 &lt;strong&gt;参数列表不同&lt;/strong&gt; 的函数。注意，不能用 &lt;strong&gt;返回值类型&lt;/strong&gt; 来区分重载函数。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-c++&#34; data-lang=&#34;c++&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;add&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;a&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kt&#34;&gt;double&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;add&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;double&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;double&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;a&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kt&#34;&gt;double&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;add&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;double&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;double&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;double&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;c&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;a&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;b&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;c&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
            &lt;link rel=&#34;stylesheet&#34; href=&#34;https://blog.cassdev.com/css/vendors/admonitions.4fd9a0b8ec8899f2ca952048d255a569f433f77dfb3f52f5bc87e7d65cdce449.css&#34; integrity=&#34;sha256-T9mguOyImfLKlSBI0lWlafQz9337P1L1vIfn1lzc5Ek=&#34; crossorigin=&#34;anonymous&#34;&gt;
    &lt;div class=&#34;admonition note&#34;&gt;
      &lt;div class=&#34;admonition-header&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; viewBox=&#34;0 0 576 512&#34;&gt;&lt;path d=&#34;M0 64C0 28.7 28.7 0 64 0L224 0l0 128c0 17.7 14.3 32 32 32l128 0 0 125.7-86.8 86.8c-10.3 10.3-17.5 23.1-21 37.2l-18.7 74.9c-2.3 9.2-1.8 18.8 1.3 27.5L64 512c-35.3 0-64-28.7-64-64L0 64zm384 64l-128 0L256 0 384 128zM549.8 235.7l14.4 14.4c15.6 15.6 15.6 40.9 0 56.6l-29.4 29.4-71-71 29.4-29.4c15.6-15.6 40.9-15.6 56.6 0zM311.9 417L441.1 287.8l71 71L382.9 487.9c-4.1 4.1-9.2 7-14.9 8.4l-60.1 15c-5.5 1.4-11.2-.2-15.2-4.2s-5.6-9.7-4.2-15.2l15-60.1c1.4-5.6 4.3-10.8 8.4-14.9z&#34;/&gt;&lt;/svg&gt;
        &lt;span&gt;笔记&lt;/span&gt;
      &lt;/div&gt;
      &lt;div class=&#34;admonition-content&#34;&gt;
        &lt;p&gt;&lt;strong&gt;编译过程&lt;/strong&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>HTTP 协议版本变化学习笔记</title>
      <link>https://blog.cassdev.com/posts/http-%E5%8D%8F%E8%AE%AE%E7%89%88%E6%9C%AC%E5%8F%98%E5%8C%96%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/</link>
      <pubDate>Thu, 27 Jun 2024 20:12:42 +0800</pubDate>
      <guid>https://blog.cassdev.com/posts/http-%E5%8D%8F%E8%AE%AE%E7%89%88%E6%9C%AC%E5%8F%98%E5%8C%96%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/</guid>
      <description>&lt;p&gt;互联网发展至今，HTTP 协议已经发展了多个版本，分别为 &lt;code&gt;HTTP/1.0&lt;/code&gt;、&lt;code&gt;HTTP/1.1&lt;/code&gt;、&lt;code&gt;HTTP/2.0&lt;/code&gt;、&lt;code&gt;HTTP/3.0&lt;/code&gt;，本文将对这几个版本的变化进行学习笔记。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;HTTP 协议层&#34; loading=&#34;lazy&#34; src=&#34;https://s2.loli.net/2024/06/27/6KE87inXyFe4DbW.png&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;http10&#34;&gt;HTTP/1.0&lt;/h2&gt;&lt;p&gt;HTTP/1.0 是最早的 HTTP 协议版本，它的特点是：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;每次请求都会建立一个新的 TCP 连接，请求结束后立即断开连接。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;每个请求都会包含完整的请求头和请求体。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;不支持持久连接，每次请求都需要重新建立连接。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;不支持管道化，即同一个连接中不能同时发送多个请求。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;http11&#34;&gt;HTTP/1.1&lt;/h2&gt;&lt;p&gt;HTTP/1.1 是对 HTTP/1.0 的改进，它的特点是：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;支持持久连接（Keep-Alive），即同一个连接可以发送多个请求。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;支持管道化，即同一个连接中可以同时发送多个请求。但是，由于 HTTP/1.1 中的管道化存在队头阻塞问题，所以很少被使用。默认为关闭状态，并且大多数浏览器也不支持。 &lt;strong&gt;所以我们认为 HTTP/1.1 不支持管道化&lt;/strong&gt; 。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;HTTP/1.1 的缺点：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;队头阻塞问题：如果一个请求响应时间过长，那么后面的请求就会被阻塞。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;明文传输：HTTP/1.1 的数据传输是纯文本且未加密的，容易被窃听。比如状态码 &lt;code&gt;200&lt;/code&gt; 会被分为 &lt;code&gt;2&lt;/code&gt;、&lt;code&gt;0&lt;/code&gt;、&lt;code&gt;0&lt;/code&gt; 三个字节传输。这点会在 HTTP/2.0 中得到改进。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;头部冗余：每次请求都需要携带完整的请求头，头部信息冗余。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;https&#34;&gt;HTTPS&lt;/h2&gt;&lt;p&gt;在讲述 HTTP/2.0 之前，我们先来了解一下 HTTPS。&lt;/p&gt;
&lt;p&gt;HTTPS 是在 HTTP 的基础上加入了 SSL/TLS 加密层，使得数据传输更加安全。HTTPS 的特点是：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;数据加密：HTTPS 使用 SSL/TLS 加密传输数据，保证数据传输的安全性。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;身份认证：HTTPS 使用证书机制对服务器和客户端进行身份认证，防止中间人攻击。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;数据完整性：HTTPS 使用数字签名对数据进行完整性校验，防止数据被篡改。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;加密方式：对称加密、非对称加密、数字签名。&lt;/p&gt;
&lt;p&gt;通信前使用非对称加密协商对称加密的密钥，通信过程使用对称加密传输数据，保证数据传输的安全性。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;HTTPS&#34; loading=&#34;lazy&#34; src=&#34;https://s2.loli.net/2024/06/27/wcztbDYBevjP26L.png&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;http20&#34;&gt;HTTP/2.0&lt;/h2&gt;&lt;p&gt;HTTP/2.0 是对 HTTP/1.1 的重大升级，它的特点是：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;头部压缩：HTTP/2.0 使用 HPACK 算法对头部进行压缩，如果请求头中包含相同的字段，只需要发送一次，后续请求只需要发送索引，接着从静态表或动态表中获取对应的值。解决了 HTTP/1.1 中头部冗余的问题。&lt;/p&gt;</description>
    </item>
    <item>
      <title>TCP 的常见拥塞控制算法学习笔记</title>
      <link>https://blog.cassdev.com/posts/tcp-%E7%9A%84%E5%B8%B8%E8%A7%81%E6%8B%A5%E5%A1%9E%E6%8E%A7%E5%88%B6%E7%AE%97%E6%B3%95%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/</link>
      <pubDate>Thu, 27 Jun 2024 13:54:31 +0800</pubDate>
      <guid>https://blog.cassdev.com/posts/tcp-%E7%9A%84%E5%B8%B8%E8%A7%81%E6%8B%A5%E5%A1%9E%E6%8E%A7%E5%88%B6%E7%AE%97%E6%B3%95%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/</guid>
      <description>&lt;p&gt;TCP 的拥塞控制算法有几种：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Tahoe&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Reno&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;NewReno&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;SACK&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;BIC&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;CUBIC&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;BBR&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

            &lt;link rel=&#34;stylesheet&#34; href=&#34;https://blog.cassdev.com/css/vendors/admonitions.4fd9a0b8ec8899f2ca952048d255a569f433f77dfb3f52f5bc87e7d65cdce449.css&#34; integrity=&#34;sha256-T9mguOyImfLKlSBI0lWlafQz9337P1L1vIfn1lzc5Ek=&#34; crossorigin=&#34;anonymous&#34;&gt;
    &lt;div class=&#34;admonition note&#34;&gt;
      &lt;div class=&#34;admonition-header&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; viewBox=&#34;0 0 576 512&#34;&gt;&lt;path d=&#34;M0 64C0 28.7 28.7 0 64 0L224 0l0 128c0 17.7 14.3 32 32 32l128 0 0 125.7-86.8 86.8c-10.3 10.3-17.5 23.1-21 37.2l-18.7 74.9c-2.3 9.2-1.8 18.8 1.3 27.5L64 512c-35.3 0-64-28.7-64-64L0 64zm384 64l-128 0L256 0 384 128zM549.8 235.7l14.4 14.4c15.6 15.6 15.6 40.9 0 56.6l-29.4 29.4-71-71 29.4-29.4c15.6-15.6 40.9-15.6 56.6 0zM311.9 417L441.1 287.8l71 71L382.9 487.9c-4.1 4.1-9.2 7-14.9 8.4l-60.1 15c-5.5 1.4-11.2-.2-15.2-4.2s-5.6-9.7-4.2-15.2l15-60.1c1.4-5.6 4.3-10.8 8.4-14.9z&#34;/&gt;&lt;/svg&gt;
        &lt;span&gt;笔记&lt;/span&gt;
      &lt;/div&gt;
      &lt;div class=&#34;admonition-content&#34;&gt;
        &lt;p&gt;MSS: Maximum Segment Size，最大分段大小。&lt;/p&gt;</description>
    </item>
    <item>
      <title>C&#43;&#43; 智能指针学习笔记</title>
      <link>https://blog.cassdev.com/posts/c&#43;&#43;-%E6%99%BA%E8%83%BD%E6%8C%87%E9%92%88%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/</link>
      <pubDate>Wed, 26 Jun 2024 17:24:42 +0800</pubDate>
      <guid>https://blog.cassdev.com/posts/c&#43;&#43;-%E6%99%BA%E8%83%BD%E6%8C%87%E9%92%88%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/</guid>
      <description>&lt;h2 id=&#34;智能指针简介&#34;&gt;智能指针简介&lt;/h2&gt;&lt;p&gt;智能指针是一种 RAII（Resource Acquisition Is Initialization）技术，用于管理动态分配的内存。智能指针的优点是可以自动释放内存，避免内存泄漏。&lt;/p&gt;
&lt;p&gt;C++11 标准引入了三种智能指针：&lt;code&gt;std::unique_ptr&lt;/code&gt;、&lt;code&gt;std::shared_ptr&lt;/code&gt; 和 &lt;code&gt;std::weak_ptr&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;它们都定义在头文件 &lt;code&gt;&amp;lt;memory&amp;gt;&lt;/code&gt; 中。&lt;/p&gt;
&lt;h2 id=&#34;unique_ptr&#34;&gt;unique_ptr&lt;/h2&gt;&lt;p&gt;&lt;code&gt;unique_ptr&lt;/code&gt; 是一种独占所有权的智能指针，它保证同一时间只有一个指针可以指向对象。&lt;/p&gt;
&lt;h3 id=&#34;unique_ptr-的创建&#34;&gt;unique_ptr 的创建&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;#include&lt;/span&gt; &lt;span class=&#34;cpf&#34;&gt;&amp;lt;iostream&amp;gt;&lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;#include&lt;/span&gt; &lt;span class=&#34;cpf&#34;&gt;&amp;lt;memory&amp;gt;&lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;// 使用 new 创建 unique_ptr
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;    &lt;span class=&#34;n&#34;&gt;std&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;unique_ptr&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;up1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;));&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;std&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;cout&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;up1&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;std&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;endl&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;// 使用裸指针创建 unique_ptr
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;    &lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;count&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;20&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;std&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;unique_ptr&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;up2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;count&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;std&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;cout&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;up2&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;std&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;endl&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;// 使用 make_unique 创建 unique_ptr
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;    &lt;span class=&#34;k&#34;&gt;auto&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;up2&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;std&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;make_unique&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;20&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;std&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;cout&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;up2&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;std&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;endl&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;unique_ptr-的拷贝和赋值&#34;&gt;unique_ptr 的拷贝和赋值&lt;/h3&gt;&lt;p&gt;&lt;code&gt;unique_ptr&lt;/code&gt; 不能拷贝，但可以移动。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;#include&lt;/span&gt; &lt;span class=&#34;cpf&#34;&gt;&amp;lt;iostream&amp;gt;&lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;std&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;unique_ptr&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;up1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;));&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;std&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;unique_ptr&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;up2&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;std&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;move&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;up1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;std&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;cout&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;up2&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;std&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;endl&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;unique_ptr-的释放&#34;&gt;unique_ptr 的释放&lt;/h3&gt;&lt;p&gt;&lt;code&gt;unique_ptr&lt;/code&gt; 会在离开作用域时自动释放内存。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;#include&lt;/span&gt; &lt;span class=&#34;cpf&#34;&gt;&amp;lt;iostream&amp;gt;&lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;std&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;unique_ptr&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;up1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;));&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;std&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;cout&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;up1&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;std&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;endl&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;unique_ptr-的自定义删除器&#34;&gt;unique_ptr 的自定义删除器&lt;/h3&gt;&lt;p&gt;&lt;code&gt;unique_ptr&lt;/code&gt; 支持自定义删除器，可以用于释放动态分配的内存。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Redis 为什么采用单线程，为什么性能好</title>
      <link>https://blog.cassdev.com/posts/redis-%E4%B8%BA%E4%BB%80%E4%B9%88%E9%87%87%E7%94%A8%E5%8D%95%E7%BA%BF%E7%A8%8B%E4%B8%BA%E4%BB%80%E4%B9%88%E6%80%A7%E8%83%BD%E5%A5%BD/</link>
      <pubDate>Wed, 26 Jun 2024 15:40:01 +0800</pubDate>
      <guid>https://blog.cassdev.com/posts/redis-%E4%B8%BA%E4%BB%80%E4%B9%88%E9%87%87%E7%94%A8%E5%8D%95%E7%BA%BF%E7%A8%8B%E4%B8%BA%E4%BB%80%E4%B9%88%E6%80%A7%E8%83%BD%E5%A5%BD/</guid>
      <description>&lt;p&gt;Redis 采用单线程的原因是因为在 &lt;strong&gt;内存中&lt;/strong&gt; 进行读写操作，&lt;strong&gt;CPU不是Redis的性能瓶颈&lt;/strong&gt;，而是内存和带宽，所以采用单线程可以避免 &lt;strong&gt;线程切换和锁的开销&lt;/strong&gt;。&lt;/p&gt;
&lt;h2 id=&#34;redis-是什么&#34;&gt;Redis 是什么？&lt;/h2&gt;&lt;p&gt;Redis 是一个开源的内存数据库，它可以存储键值对，支持多种数据结构，如字符串（string）、哈希（hash）、列表（list）、集合（set）、有序集合（zset）等。&lt;/p&gt;
&lt;h2 id=&#34;redis-是不是单线程&#34;&gt;Redis 是不是单线程？&lt;/h2&gt;&lt;p&gt;实际上，Redis 是多线程的，其内部有以下几个线程：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;redis-server&lt;/code&gt;：主线程，负责接收客户端的连接，读取请求，发送响应。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;bio-close-file&lt;/code&gt;：负责异步关闭大文件。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;bio-aof-fsync&lt;/code&gt;：负责将 AOF 文件异步刷到磁盘。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;bio-lasy-free&lt;/code&gt;：负责异步释放大内存。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;jemalloc-bg-thread&lt;/code&gt;：负责内存碎片整理。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;io-thread&lt;/code&gt;：IO 线程，负责 read/write，decode/encode。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

            &lt;link rel=&#34;stylesheet&#34; href=&#34;https://blog.cassdev.com/css/vendors/admonitions.4fd9a0b8ec8899f2ca952048d255a569f433f77dfb3f52f5bc87e7d65cdce449.css&#34; integrity=&#34;sha256-T9mguOyImfLKlSBI0lWlafQz9337P1L1vIfn1lzc5Ek=&#34; crossorigin=&#34;anonymous&#34;&gt;
    &lt;div class=&#34;admonition note&#34;&gt;
      &lt;div class=&#34;admonition-header&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; viewBox=&#34;0 0 576 512&#34;&gt;&lt;path d=&#34;M0 64C0 28.7 28.7 0 64 0L224 0l0 128c0 17.7 14.3 32 32 32l128 0 0 125.7-86.8 86.8c-10.3 10.3-17.5 23.1-21 37.2l-18.7 74.9c-2.3 9.2-1.8 18.8 1.3 27.5L64 512c-35.3 0-64-28.7-64-64L0 64zm384 64l-128 0L256 0 384 128zM549.8 235.7l14.4 14.4c15.6 15.6 15.6 40.9 0 56.6l-29.4 29.4-71-71 29.4-29.4c15.6-15.6 40.9-15.6 56.6 0zM311.9 417L441.1 287.8l71 71L382.9 487.9c-4.1 4.1-9.2 7-14.9 8.4l-60.1 15c-5.5 1.4-11.2-.2-15.2-4.2s-5.6-9.7-4.2-15.2l15-60.1c1.4-5.6 4.3-10.8 8.4-14.9z&#34;/&gt;&lt;/svg&gt;
        &lt;span&gt;笔记&lt;/span&gt;
      &lt;/div&gt;
      &lt;div class=&#34;admonition-content&#34;&gt;
        &lt;p&gt;&lt;strong&gt;AOF（Append Only File）&lt;/strong&gt; 是 Redis 的一种持久化方式，将所有写操作追加到文件末尾，重启时重新执行 AOF 文件中的命令即可恢复数据。实时硬盘操作，不会丢失数据，但是会影响性能。&lt;/p&gt;</description>
    </item>
    <item>
      <title>堆排序学习笔记</title>
      <link>https://blog.cassdev.com/posts/%E5%A0%86%E6%8E%92%E5%BA%8F%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/</link>
      <pubDate>Wed, 26 Jun 2024 10:20:13 +0800</pubDate>
      <guid>https://blog.cassdev.com/posts/%E5%A0%86%E6%8E%92%E5%BA%8F%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/</guid>
      <description>&lt;p&gt;在学习堆排序之前，我们先来了解一下堆这种数据结构。&lt;/p&gt;
&lt;h2 id=&#34;堆的概念&#34;&gt;堆的概念&lt;/h2&gt;&lt;p&gt;堆是一种特殊的树形数据结构，它满足以下性质：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;堆必须是一个 &lt;strong&gt;完全二叉树&lt;/strong&gt; 。&lt;/li&gt;
&lt;li&gt;堆序性：堆中任意节点的值总是不大于或不小于其子节点的值。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;根据堆序性，我们可以将堆分为两种类型：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;大顶堆&lt;/strong&gt;：每个节点的值都大于或等于其子节点的值&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;小顶堆&lt;/strong&gt;：每个节点的值都小于或等于其子节点的值&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;img alt=&#34;堆&#34; loading=&#34;lazy&#34; src=&#34;https://s2.loli.net/2024/06/26/8UaE23iJSzV91Rd.png&#34;&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;所以，如果一个完全二叉树的一个节点即大于其父节点，又大于其子节点，那么这个树就不是一个堆。小于同理。&lt;/p&gt;

            &lt;link rel=&#34;stylesheet&#34; href=&#34;https://blog.cassdev.com/css/vendors/admonitions.4fd9a0b8ec8899f2ca952048d255a569f433f77dfb3f52f5bc87e7d65cdce449.css&#34; integrity=&#34;sha256-T9mguOyImfLKlSBI0lWlafQz9337P1L1vIfn1lzc5Ek=&#34; crossorigin=&#34;anonymous&#34;&gt;
    &lt;div class=&#34;admonition note&#34;&gt;
      &lt;div class=&#34;admonition-header&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; viewBox=&#34;0 0 576 512&#34;&gt;&lt;path d=&#34;M0 64C0 28.7 28.7 0 64 0L224 0l0 128c0 17.7 14.3 32 32 32l128 0 0 125.7-86.8 86.8c-10.3 10.3-17.5 23.1-21 37.2l-18.7 74.9c-2.3 9.2-1.8 18.8 1.3 27.5L64 512c-35.3 0-64-28.7-64-64L0 64zm384 64l-128 0L256 0 384 128zM549.8 235.7l14.4 14.4c15.6 15.6 15.6 40.9 0 56.6l-29.4 29.4-71-71 29.4-29.4c15.6-15.6 40.9-15.6 56.6 0zM311.9 417L441.1 287.8l71 71L382.9 487.9c-4.1 4.1-9.2 7-14.9 8.4l-60.1 15c-5.5 1.4-11.2-.2-15.2-4.2s-5.6-9.7-4.2-15.2l15-60.1c1.4-5.6 4.3-10.8 8.4-14.9z&#34;/&gt;&lt;/svg&gt;
        &lt;span&gt;笔记&lt;/span&gt;
      &lt;/div&gt;
      &lt;div class=&#34;admonition-content&#34;&gt;
        &lt;p&gt;&lt;strong&gt;完全二叉树的性质&lt;/strong&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>C&#43;&#43; 类的运算符为什么要使用引用返回</title>
      <link>https://blog.cassdev.com/posts/c&#43;&#43;-%E7%B1%BB%E7%9A%84%E8%BF%90%E7%AE%97%E7%AC%A6%E4%B8%BA%E4%BB%80%E4%B9%88%E8%A6%81%E4%BD%BF%E7%94%A8%E5%BC%95%E7%94%A8%E8%BF%94%E5%9B%9E/</link>
      <pubDate>Tue, 25 Jun 2024 22:41:04 +0800</pubDate>
      <guid>https://blog.cassdev.com/posts/c&#43;&#43;-%E7%B1%BB%E7%9A%84%E8%BF%90%E7%AE%97%E7%AC%A6%E4%B8%BA%E4%BB%80%E4%B9%88%E8%A6%81%E4%BD%BF%E7%94%A8%E5%BC%95%E7%94%A8%E8%BF%94%E5%9B%9E/</guid>
      <description>&lt;h2 id=&#34;代码&#34;&gt;代码&lt;/h2&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-c++&#34; data-lang=&#34;c++&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;AClass&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;private&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;_count&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;AClass&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;_count&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;std&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;cout&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;Default constructor called&lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\n&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;// 赋值运算符，返回引用
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;    &lt;span class=&#34;n&#34;&gt;AClass&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;operator&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;cnt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;_count&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;cnt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;k&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;this&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;// 后置自增运算符，返回引用
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;    &lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;operator&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;++&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;o&#34;&gt;++&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;_count&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;this&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如果不使用引用返回，其实也是可以运行的，只不过会在返回时调用拷贝构造函数，生成临时对象，然后再调用析构函数释放临时对象，这样会多出一次拷贝构造和析构的开销。而使用引用返回，可以直接返回对象的引用，避免了这个开销。&lt;/p&gt;
&lt;p&gt;需要注意的是，如果我们返回值类型，我们是不能直接修改返回值的：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-c++&#34; data-lang=&#34;c++&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;AClass&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;private&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;_count&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;// 省略构造函数
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;    &lt;span class=&#34;c1&#34;&gt;// 赋值运算符，返回引用
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;    &lt;span class=&#34;n&#34;&gt;AClass&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;operator&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;cnt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;_count&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;cnt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;this&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;// 后置自增运算符，返回引用
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;    &lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;operator&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;++&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;o&#34;&gt;++&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;_count&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;this&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;std&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;cout&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;AClass: count = &amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;_count&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;sc&#34;&gt;&amp;#39;\n&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;AClass&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;  &lt;span class=&#34;c1&#34;&gt;// 输出 AClass: count = 0
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;    &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;++&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;  &lt;span class=&#34;c1&#34;&gt;// 输出 AClass: count = 1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;    &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;++&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;++&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;  &lt;span class=&#34;c1&#34;&gt;// 输出 AClass: count = 2
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;可以看到，如果我们返回值类型，我们是不能直接修改返回值的。虽然 &lt;code&gt;a++&lt;/code&gt; 已经修改了 &lt;code&gt;a&lt;/code&gt; 的值，但是 &lt;code&gt;a++&lt;/code&gt; 返回的是一个修改后的 &lt;code&gt;a&lt;/code&gt; 对象的拷贝，所以 &lt;code&gt;(a++) = 10;&lt;/code&gt; 或者 &lt;code&gt;(a++)++;&lt;/code&gt; 修改的是这个拷贝对象，而不是原对象 &lt;code&gt;a&lt;/code&gt;。&lt;/p&gt;</description>
    </item>
    <item>
      <title>C&#43;&#43; 类的流插入和流提取运算符为什么要声明为友元函数</title>
      <link>https://blog.cassdev.com/posts/c&#43;&#43;-%E7%B1%BB%E7%9A%84%E6%B5%81%E6%8F%92%E5%85%A5%E5%92%8C%E6%B5%81%E6%8F%90%E5%8F%96%E8%BF%90%E7%AE%97%E7%AC%A6%E4%B8%BA%E4%BB%80%E4%B9%88%E8%A6%81%E5%A3%B0%E6%98%8E%E4%B8%BA%E5%8F%8B%E5%85%83%E5%87%BD%E6%95%B0/</link>
      <pubDate>Tue, 25 Jun 2024 21:35:40 +0800</pubDate>
      <guid>https://blog.cassdev.com/posts/c&#43;&#43;-%E7%B1%BB%E7%9A%84%E6%B5%81%E6%8F%92%E5%85%A5%E5%92%8C%E6%B5%81%E6%8F%90%E5%8F%96%E8%BF%90%E7%AE%97%E7%AC%A6%E4%B8%BA%E4%BB%80%E4%B9%88%E8%A6%81%E5%A3%B0%E6%98%8E%E4%B8%BA%E5%8F%8B%E5%85%83%E5%87%BD%E6%95%B0/</guid>
      <description>&lt;h2 id=&#34;友元函数版代码&#34;&gt;友元函数版代码&lt;/h2&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-c++&#34; data-lang=&#34;c++&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;AClass&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;private&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;_count&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;std&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;string&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;_str&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;std&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;vector&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;_vec&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;friend&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;std&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ostream&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;operator&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;std&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ostream&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;os&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;AClass&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;os&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;AClass: count = &amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;_count&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;, str = &amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;_str&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;, vec size = &amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;_vec&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;size&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;os&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;为什么要声明为友元函数&#34;&gt;为什么要声明为友元函数&lt;/h2&gt;&lt;p&gt;先理解一下友元函数，它实际上是一个普通函数，不属于类成员，但它又是一个特殊的普通函数，因为它可以访问类的私有成员。因此 &lt;code&gt;operator&amp;lt;&amp;lt;&lt;/code&gt; 和 &lt;code&gt;operator&amp;gt;&amp;gt;&lt;/code&gt; 声明为友元函数的目的很明显，就是为了能够访问类的私有成员。&lt;/p&gt;
&lt;p&gt;实际上，如果它们不声明为友元函数，也是可以实现的，例如下面代码：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-c++&#34; data-lang=&#34;c++&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;AClass&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;private&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;_count&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;std&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;string&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;_str&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;std&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;vector&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;_vec&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;std&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ostream&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;operator&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;std&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ostream&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;os&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;os&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;AClass: count = &amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;_count&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;, str = &amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;_str&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;, vec size = &amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;_vec&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;size&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;os&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;但是这样就需要特殊的方法来调用这个 &lt;code&gt;operator&amp;lt;&amp;lt;&lt;/code&gt; 函数，因为它不再是一个普通函数，而是一个类成员函数：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-c++&#34; data-lang=&#34;c++&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;AClass&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;a&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;std&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;cout&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;    &lt;span class=&#34;c1&#34;&gt;// 错误，不能这样调用
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;    &lt;span class=&#34;n&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;operator&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;std&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;cout&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;    &lt;span class=&#34;c1&#34;&gt;// 正确
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这样显然不够直观，不是一个正常人类写的代码：）&lt;/p&gt;
&lt;p&gt;所以，为了代码的可读性和可维护性，我们将 &lt;code&gt;operator&amp;lt;&amp;lt;&lt;/code&gt; 和 &lt;code&gt;operator&amp;gt;&amp;gt;&lt;/code&gt; 声明为友元函数，这样就可以直接使用 &lt;code&gt;&amp;lt;&amp;lt;&lt;/code&gt; 和 &lt;code&gt;&amp;gt;&amp;gt;&lt;/code&gt; 运算符来操作类的对象了。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Socket 编程之 IO 多路复用学习笔记</title>
      <link>https://blog.cassdev.com/posts/socket-%E7%BC%96%E7%A8%8B%E4%B9%8B-io-%E5%A4%9A%E8%B7%AF%E5%A4%8D%E7%94%A8%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/</link>
      <pubDate>Mon, 24 Jun 2024 21:36:55 +0800</pubDate>
      <guid>https://blog.cassdev.com/posts/socket-%E7%BC%96%E7%A8%8B%E4%B9%8B-io-%E5%A4%9A%E8%B7%AF%E5%A4%8D%E7%94%A8%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/</guid>
      <description>&lt;h2 id=&#34;什么是-io-多路复用&#34;&gt;什么是 IO 多路复用？&lt;/h2&gt;&lt;h3 id=&#34;阻塞-io-与-非阻塞-io&#34;&gt;阻塞 IO 与 非阻塞 IO&lt;/h3&gt;&lt;p&gt;我们先了解一下阻塞 IO，阻塞 IO 是指应用程序在读写数据时，如果没有数据可读或者写，应用程序会一直 &lt;strong&gt;阻塞在那里&lt;/strong&gt; ，直到有数据可读或者写。&lt;/p&gt;
&lt;p&gt;与它相反的是非阻塞 IO，是指应用程序在读写数据时，无论是否有数据可读写，都 &lt;strong&gt;立即返回&lt;/strong&gt; ，若没有数据可读写将会返回一个错误码，通过不断轮询来检查是否有数据可读或者写。&lt;/p&gt;
&lt;h3 id=&#34;io-多路复用&#34;&gt;IO 多路复用&lt;/h3&gt;&lt;p&gt;由于 Scoket 默认是阻塞 IO，所以很多初学者在处理多个连接时，会为每个连接创建一个线程来处理，但这样做会引起 CPU 的上下文切换，降低系统的性能。&lt;/p&gt;
&lt;p&gt;有一种更“优雅”的方式，那就是 IO 多路复用，也称为事件驱动模型（Event-driven IO）。IO 多路复用是指内核一旦发现进程指定的一个或者多个 IO 事件已经就绪，就通知该进程。IO 多路复用模型中，只需要一个线程就可以同时处理多个连接。&lt;/p&gt;
&lt;p&gt;通俗易懂的说，IO 多路复用就是将多个 IO 事件交给内核，内核帮我们监听这些 IO 事件，当有 IO 事件就绪时，内核会通知我们，我们只需要处理就绪的 IO 事件即可。&lt;/p&gt;
&lt;h2 id=&#34;io-多路复用的优点&#34;&gt;IO 多路复用的优点&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;一个线程可以同时处理多个连接，减少线程的创建和销毁&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;降低了系统开销，提高了系统的并发性能&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;io-多路复用的实现方式&#34;&gt;IO 多路复用的实现方式&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;select&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;poll&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;epoll (Linux)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;kqueue (FreeBSD)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;IOCP（Windows）&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;其中 epoll 是 Linux 下的 IO 多路复用机制，kqueue 是 FreeBSD（macOS 就属于 FreeBSD）下的 IO 多路复用机制。&lt;/p&gt;
&lt;p&gt;下面的伪代码是 IO 多路复用的最基本实现方式：&lt;/p&gt;</description>
    </item>
    <item>
      <title>搭建自动化部署的 GitHub.io 个人静态博客指南</title>
      <link>https://blog.cassdev.com/posts/%E6%90%AD%E5%BB%BA%E8%87%AA%E5%8A%A8%E5%8C%96%E9%83%A8%E7%BD%B2%E7%9A%84-github.io-%E4%B8%AA%E4%BA%BA%E9%9D%99%E6%80%81%E5%8D%9A%E5%AE%A2%E6%8C%87%E5%8D%97/</link>
      <pubDate>Mon, 17 Jun 2024 21:11:04 +0800</pubDate>
      <guid>https://blog.cassdev.com/posts/%E6%90%AD%E5%BB%BA%E8%87%AA%E5%8A%A8%E5%8C%96%E9%83%A8%E7%BD%B2%E7%9A%84-github.io-%E4%B8%AA%E4%BA%BA%E9%9D%99%E6%80%81%E5%8D%9A%E5%AE%A2%E6%8C%87%E5%8D%97/</guid>
      <description>&lt;p&gt;本文章主要介绍如何使用 GitHub Actions 实现基于 MkDocs 的 GitHub.io 个人静态博客的自动化部署。&lt;/p&gt;
&lt;p&gt;本指南主要分为以下几个部分：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.cassdev.com/posts/%E6%90%AD%E5%BB%BA%E8%87%AA%E5%8A%A8%E5%8C%96%E9%83%A8%E7%BD%B2%E7%9A%84-github.io-%E4%B8%AA%E4%BA%BA%E9%9D%99%E6%80%81%E5%8D%9A%E5%AE%A2%E6%8C%87%E5%8D%97/#%e5%88%9b%e5%bb%ba-github-%e4%bb%93%e5%ba%93&#34;&gt;创建 GitHub 仓库&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.cassdev.com/posts/%E6%90%AD%E5%BB%BA%E8%87%AA%E5%8A%A8%E5%8C%96%E9%83%A8%E7%BD%B2%E7%9A%84-github.io-%E4%B8%AA%E4%BA%BA%E9%9D%99%E6%80%81%E5%8D%9A%E5%AE%A2%E6%8C%87%E5%8D%97/#%e5%88%9b%e5%bb%ba-mkdocs-%e9%a1%b9%e7%9b%ae&#34;&gt;创建 MkDocs 项目&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.cassdev.com/posts/%E6%90%AD%E5%BB%BA%E8%87%AA%E5%8A%A8%E5%8C%96%E9%83%A8%E7%BD%B2%E7%9A%84-github.io-%E4%B8%AA%E4%BA%BA%E9%9D%99%E6%80%81%E5%8D%9A%E5%AE%A2%E6%8C%87%E5%8D%97/#%e9%85%8d%e7%bd%ae-github-actions&#34;&gt;配置 GitHub Actions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.cassdev.com/posts/%E6%90%AD%E5%BB%BA%E8%87%AA%E5%8A%A8%E5%8C%96%E9%83%A8%E7%BD%B2%E7%9A%84-github.io-%E4%B8%AA%E4%BA%BA%E9%9D%99%E6%80%81%E5%8D%9A%E5%AE%A2%E6%8C%87%E5%8D%97/#%e9%83%a8%e7%bd%b2%e5%88%b0-github-pages&#34;&gt;部署到 GitHub Pages&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;创建-github-仓库&#34;&gt;创建 GitHub 仓库&lt;/h2&gt;&lt;p&gt;由于我们的博客是托管在 GitHub io 上的，所以我们需要一个 GitHub 仓库来存放我们的 MkDocs 博客。&lt;/p&gt;
&lt;h3 id=&#34;创建仓库&#34;&gt;创建仓库&lt;/h3&gt;&lt;p&gt;首先，我们需要在 GitHub 上创建一个新的仓库，仓库名可以是 &lt;code&gt;&amp;lt;username&amp;gt;.github.io&lt;/code&gt;，其中 &lt;code&gt;&amp;lt;username&amp;gt;&lt;/code&gt; 是你的 GitHub 用户名。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;创建 GitHub 仓库&#34; loading=&#34;lazy&#34; src=&#34;https://s2.loli.net/2024/06/17/X43nikWmO7hVGrb.png&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;克隆仓库&#34;&gt;克隆仓库&lt;/h3&gt;&lt;p&gt;然后，我们需要将这个仓库克隆到本地：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git clone &amp;lt;repository-url&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt; &amp;lt;repository-name&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;创建-mkdocs-项目&#34;&gt;创建 MkDocs 项目&lt;/h2&gt;&lt;h3 id=&#34;安装-mkdocs&#34;&gt;安装 MkDocs&lt;/h3&gt;&lt;p&gt;MkDocs 是一个 Python 项目使用 pip 安装：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pip install mkdocs
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;我们需要创建一个 MkDocs 项目，可以使用 MkDocs 官方提供的模板来创建。直接在仓库根目录执行以下命令即可：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mkdocs new .
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;然后，我们需要安装 MkDocs Material 主题。当然我们也可以选择其他主题，可以在 MkDocs 的 &lt;a href=&#34;https://github.com/mkdocs/mkdocs/wiki/MkDocs-Themes&#34;&gt;WiKi&lt;/a&gt; 查看更多主题。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Windows Socket API 和 Linux Socket API</title>
      <link>https://blog.cassdev.com/posts/windows-socket-api-%E5%92%8C-linux-socket-api/</link>
      <pubDate>Sun, 16 Jun 2024 19:13:10 +0800</pubDate>
      <guid>https://blog.cassdev.com/posts/windows-socket-api-%E5%92%8C-linux-socket-api/</guid>
      <description>&lt;p&gt;本文章主要介绍 Windows 下和 Linux 下的 Socket 编程区别，即 Windows Socket API 和 Linux Socket API 的区别。&lt;/p&gt;
&lt;h2 id=&#34;头文件&#34;&gt;头文件&lt;/h2&gt;&lt;p&gt;Windows 环境下的 Socket 编程需要以下头文件:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;WinSock2.h&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;WS2tcpip.h&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

    &lt;div class=&#34;admonition note&#34;&gt;
      &lt;div class=&#34;admonition-header&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; viewBox=&#34;0 0 576 512&#34;&gt;&lt;path d=&#34;M0 64C0 28.7 28.7 0 64 0L224 0l0 128c0 17.7 14.3 32 32 32l128 0 0 125.7-86.8 86.8c-10.3 10.3-17.5 23.1-21 37.2l-18.7 74.9c-2.3 9.2-1.8 18.8 1.3 27.5L64 512c-35.3 0-64-28.7-64-64L0 64zm384 64l-128 0L256 0 384 128zM549.8 235.7l14.4 14.4c15.6 15.6 15.6 40.9 0 56.6l-29.4 29.4-71-71 29.4-29.4c15.6-15.6 40.9-15.6 56.6 0zM311.9 417L441.1 287.8l71 71L382.9 487.9c-4.1 4.1-9.2 7-14.9 8.4l-60.1 15c-5.5 1.4-11.2-.2-15.2-4.2s-5.6-9.7-4.2-15.2l15-60.1c1.4-5.6 4.3-10.8 8.4-14.9z&#34;/&gt;&lt;/svg&gt;
        &lt;span&gt;笔记&lt;/span&gt;
      &lt;/div&gt;
      &lt;div class=&#34;admonition-content&#34;&gt;
        &lt;p&gt;如果使用 MSVC 编译器，那么还需要使用预处理指令 &lt;code&gt;#pragma comment(lib, &amp;quot;Ws2_32.lib&amp;quot;)&lt;/code&gt; 来链接 &lt;code&gt;Ws2_32.lib&lt;/code&gt; 库。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Windows VSCode 使用 JetBrians Mono 字体</title>
      <link>https://blog.cassdev.com/posts/windows-vscode-%E4%BD%BF%E7%94%A8-jetbrians-mono-%E5%AD%97%E4%BD%93/</link>
      <pubDate>Sun, 16 Jun 2024 19:13:10 +0800</pubDate>
      <guid>https://blog.cassdev.com/posts/windows-vscode-%E4%BD%BF%E7%94%A8-jetbrians-mono-%E5%AD%97%E4%BD%93/</guid>
      <description>&lt;p&gt;本文主要介绍如何在 Windows 系统下的 Visual Studio Code 中使用 JetBrians Mono 字体。&lt;/p&gt;
&lt;h2 id=&#34;下载字体&#34;&gt;下载字体&lt;/h2&gt;&lt;p&gt;可能你跟着网上很多教程一样，一上来就在 VS Code 中设置字体，结果发现设置不生效，这是因为你没有安装 JetBrians Mono 字体。&lt;/p&gt;
&lt;p&gt;JetBrians Mono 字体下载地址：&lt;a href=&#34;https://www.jetbrains.com/lp/mono/&#34;&gt;JetBrainsMono&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;安装字体&#34;&gt;安装字体&lt;/h2&gt;&lt;p&gt;下载字体后，解压缩，进入 &lt;code&gt;ttf&lt;/code&gt; 文件夹，找到 &lt;code&gt;JetBrainsMono-Regular.ttf&lt;/code&gt; 文件，双击打开，点击安装即可。当然你也可以全部字体都安装 :)&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;CleanShot 2024-06-02 at 16.22.26@2x&#34; loading=&#34;lazy&#34; src=&#34;https://s2.loli.net/2024/06/02/RG7EY6MqkvHW8Ni.png&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;设置-vs-code&#34;&gt;设置 VS Code&lt;/h2&gt;&lt;p&gt;打开 VS Code 的设置，搜索 &lt;code&gt;editor.fontFamily&lt;/code&gt;，将其值设置为 &lt;code&gt;JetBrains Mono&lt;/code&gt;，如下图所示：&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;CleanShot 2024-06-02 at 16.35.35@2x&#34; loading=&#34;lazy&#34; src=&#34;https://s2.loli.net/2024/06/02/fJlT5nwtE6kG829.png&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;重启-vs-code&#34;&gt;重启 VS Code&lt;/h2&gt;&lt;p&gt;最后一步，重启 VS Code 即可。&lt;/p&gt;</description>
    </item>
    <item>
      <title>解决 “warning C4819- 该文件包含不能在当前代码页(936)中表示的字符” 问题指南</title>
      <link>https://blog.cassdev.com/posts/%E8%A7%A3%E5%86%B3-warning-c4819--%E8%AF%A5%E6%96%87%E4%BB%B6%E5%8C%85%E5%90%AB%E4%B8%8D%E8%83%BD%E5%9C%A8%E5%BD%93%E5%89%8D%E4%BB%A3%E7%A0%81%E9%A1%B5936%E4%B8%AD%E8%A1%A8%E7%A4%BA%E7%9A%84%E5%AD%97%E7%AC%A6-%E9%97%AE%E9%A2%98%E6%8C%87%E5%8D%97/</link>
      <pubDate>Sun, 16 Jun 2024 19:13:10 +0800</pubDate>
      <guid>https://blog.cassdev.com/posts/%E8%A7%A3%E5%86%B3-warning-c4819--%E8%AF%A5%E6%96%87%E4%BB%B6%E5%8C%85%E5%90%AB%E4%B8%8D%E8%83%BD%E5%9C%A8%E5%BD%93%E5%89%8D%E4%BB%A3%E7%A0%81%E9%A1%B5936%E4%B8%AD%E8%A1%A8%E7%A4%BA%E7%9A%84%E5%AD%97%E7%AC%A6-%E9%97%AE%E9%A2%98%E6%8C%87%E5%8D%97/</guid>
      <description>&lt;p&gt;起因是因为我在对我的 C++ 项目进行跨平台适配，从 macOS 平台移植到 Windows 平台时，在使用 Cmake + MSVC 编译后，出现了这个问题。&lt;/p&gt;
&lt;h2 id=&#34;问题原因&#34;&gt;问题原因&lt;/h2&gt;&lt;p&gt;这是由于 Windows 平台默认使用的是 GBK 编码，而 macOS 平台上使用的是 UTF-8 编码。&lt;/p&gt;
&lt;h2 id=&#34;解决方法&#34;&gt;解决方法&lt;/h2&gt;&lt;h3 id=&#34;方法一&#34;&gt;方法一&lt;/h3&gt;&lt;p&gt;在 CMakeLists.txt 文件中添加如下代码：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-cmake&#34; data-lang=&#34;cmake&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;add_compile_options&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;$&amp;lt;$&amp;lt;C_COMPILER_ID:MSVC&amp;gt;:/source-charset:utf-8&amp;gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;方法二&#34;&gt;方法二&lt;/h3&gt;&lt;p&gt;在 CMakeLists.txt 文件中添加如下代码：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-cmake&#34; data-lang=&#34;cmake&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;MSVC&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;&lt;/span&gt;    &lt;span class=&#34;nb&#34;&gt;target_compile_options&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;lt;你的项目名&amp;gt;&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;PRIVATE&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;/utf-8&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;endif&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>C# Protobuf 接收数据并解析数据</title>
      <link>https://blog.cassdev.com/posts/c%23-protobuf-%E6%8E%A5%E6%94%B6%E6%95%B0%E6%8D%AE%E5%B9%B6%E8%A7%A3%E6%9E%90%E6%95%B0%E6%8D%AE/</link>
      <pubDate>Sun, 16 Jun 2024 11:20:31 +0800</pubDate>
      <guid>https://blog.cassdev.com/posts/c%23-protobuf-%E6%8E%A5%E6%94%B6%E6%95%B0%E6%8D%AE%E5%B9%B6%E8%A7%A3%E6%9E%90%E6%95%B0%E6%8D%AE/</guid>
      <description>&lt;p&gt;在流里读出数据后，需要将数据包大小缩短成有效大小，即 &lt;code&gt;bytesRead&lt;/code&gt;  长度。&lt;/p&gt;
&lt;p&gt;下面是 C# 端接收并解析数据的示例代码：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-C#&#34; data-lang=&#34;C#&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;private&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ReceiveMessage&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;stream&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;client&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;GetStream&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;bytesRead&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;while&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;isKeepReading&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stream&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;CanRead&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;buffer&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;byte&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;client&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ReceiveBufferSize&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;];&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;bytesRead&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;stream&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Read&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;buffer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;client&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ReceiveBufferSize&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;bytesRead&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;n&#34;&gt;MemoryStream&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;protoStream&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;MemoryStream&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;buffer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;bytesRead&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;n&#34;&gt;Cas&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Proto&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;DataMessage&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;dataMessage&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Cas&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Proto&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;DataMessage&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Parser&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ParseFrom&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;protoStream&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;k&#34;&gt;switch&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dataMessage&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Type&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                    &lt;span class=&#34;k&#34;&gt;case&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;DataMessage&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Types&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Type&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Mesh&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	                    	&lt;span class=&#34;n&#34;&gt;Debug&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;Mesh类型&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                        &lt;span class=&#34;k&#34;&gt;break&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                    &lt;span class=&#34;k&#34;&gt;default&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                        &lt;span class=&#34;k&#34;&gt;break&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>C&#43;&#43; 中位运算的妙用：与运算和或运算的合并标志位</title>
      <link>https://blog.cassdev.com/posts/c&#43;&#43;-%E4%B8%AD%E4%BD%8D%E8%BF%90%E7%AE%97%E7%9A%84%E5%A6%99%E7%94%A8%E4%B8%8E%E8%BF%90%E7%AE%97%E5%92%8C%E6%88%96%E8%BF%90%E7%AE%97%E7%9A%84%E5%90%88%E5%B9%B6%E6%A0%87%E5%BF%97%E4%BD%8D/</link>
      <pubDate>Sun, 16 Jun 2024 11:20:31 +0800</pubDate>
      <guid>https://blog.cassdev.com/posts/c&#43;&#43;-%E4%B8%AD%E4%BD%8D%E8%BF%90%E7%AE%97%E7%9A%84%E5%A6%99%E7%94%A8%E4%B8%8E%E8%BF%90%E7%AE%97%E5%92%8C%E6%88%96%E8%BF%90%E7%AE%97%E7%9A%84%E5%90%88%E5%B9%B6%E6%A0%87%E5%BF%97%E4%BD%8D/</guid>
      <description>&lt;p&gt;当我们处理程序中的多个标志位时，将它们合并成一个整数是一种常见的技巧。这种做法不仅有助于提高代码的可读性，还使得对多个标志位进行操作更为方便。&lt;/p&gt;
&lt;p&gt;在C++中，可以使用按位或（&lt;code&gt;|&lt;/code&gt;）运算符来实现这一功能。&lt;/p&gt;
&lt;h2 id=&#34;合并标志位的基本思想&#34;&gt;合并标志位的基本思想&lt;/h2&gt;&lt;p&gt;在C++中，合并标志位的基本思想是将多个标志位的二进制表示中的相应位进行按位或运算，形成一个包含所有标志位信息的整数。这样，就能够用一个整数表示多个不同的状态或选项。&lt;/p&gt;
&lt;h2 id=&#34;代码示例&#34;&gt;代码示例&lt;/h2&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;#include&lt;/span&gt; &lt;span class=&#34;cpf&#34;&gt;&amp;lt;iostream&amp;gt;&lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;// 定义三个标志位
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;    &lt;span class=&#34;k&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;FLAG_A&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mb&#34;&gt;0b0001&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;FLAG_B&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mb&#34;&gt;0b0010&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;FLAG_C&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mb&#34;&gt;0b0100&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;// 合并标志位
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;    &lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;flags&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;FLAG_A&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;FLAG_C&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;// 检查是否设置了某个标志位
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;flags&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;FLAG_A&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;		&lt;span class=&#34;c1&#34;&gt;// True
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;        &lt;span class=&#34;n&#34;&gt;std&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;cout&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;FLAG_A is set.&amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;std&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;endl&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;flags&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;FLAG_B&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;		&lt;span class=&#34;c1&#34;&gt;// False
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;        &lt;span class=&#34;n&#34;&gt;std&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;cout&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;FLAG_B is set.&amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;std&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;endl&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;flags&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;FLAG_C&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;		&lt;span class=&#34;c1&#34;&gt;// True
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;        &lt;span class=&#34;n&#34;&gt;std&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;cout&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;FLAG_C is set.&amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;std&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;endl&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在这个示例中，首先定义了三个标志位 &lt;code&gt;FLAG_A&lt;/code&gt;、&lt;code&gt;FLAG_B&lt;/code&gt; 和 &lt;code&gt;FLAG_C&lt;/code&gt;，它们分别对应二进制的 &lt;code&gt;0001&lt;/code&gt;、&lt;code&gt;0010&lt;/code&gt; 和 &lt;code&gt;0100&lt;/code&gt;。然后，使用 &lt;code&gt;|&lt;/code&gt; 运算符将 &lt;code&gt;FLAG_A&lt;/code&gt; 和 &lt;code&gt;FLAG_C&lt;/code&gt; 合并成 &lt;code&gt;flags&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;接下来，使用按位与运算符 &lt;code&gt;&amp;amp;&lt;/code&gt; 来检查 &lt;code&gt;flags&lt;/code&gt; 中是否设置了每个标志位。如果某个标志位被设置，相应的条件语句将会执行。&lt;/p&gt;
&lt;h2 id=&#34;优点与用途&#34;&gt;优点与用途&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;可读性提高：&lt;/strong&gt; 将多个标志位合并成一个整数可以提高代码的可读性。通过使用有意义的常量名称，可以更清晰地了解整数表示的含义。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;便于操作：&lt;/strong&gt; 合并后的整数可以方便地进行各种按位操作，如按位与、按位或等，而无需单独处理每个标志位。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;节省内存：&lt;/strong&gt; 在某些情况下，将多个标志位合并成一个整数可能节省内存，特别是当标志位数量较多时。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;在实际编码中，合并标志位是一种常见的编程技巧，适用于需要处理多个二进制状态的情况。这种技术不仅简化了代码，还使得代码更易维护和扩展。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Cassius0924 的 VSCode 插件</title>
      <link>https://blog.cassdev.com/posts/cassius0924-%E7%9A%84-vscode-%E6%8F%92%E4%BB%B6/</link>
      <pubDate>Sun, 16 Jun 2024 11:20:31 +0800</pubDate>
      <guid>https://blog.cassdev.com/posts/cassius0924-%E7%9A%84-vscode-%E6%8F%92%E4%BB%B6/</guid>
      <description>&lt;h2 id=&#34;heading&#34;&gt;#&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;.NET Install Tool for Extenstion&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;a&#34;&gt;A&lt;/h2&gt;&lt;h2 id=&#34;b&#34;&gt;B&lt;/h2&gt;&lt;h2 id=&#34;c&#34;&gt;C&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;C/C++&lt;/li&gt;
&lt;li&gt;C/C++ Extension Pack&lt;/li&gt;
&lt;li&gt;C/C++ Themes&lt;/li&gt;
&lt;li&gt;C#&lt;/li&gt;
&lt;li&gt;C# Dev Kit&lt;/li&gt;
&lt;li&gt;CMake&lt;/li&gt;
&lt;li&gt;CMake Language Support&lt;/li&gt;
&lt;li&gt;Cmake Tools&lt;/li&gt;
&lt;li&gt;Codelf&lt;/li&gt;
&lt;li&gt;Code Runner&lt;/li&gt;
&lt;li&gt;Code Snap&lt;/li&gt;
&lt;li&gt;Code Together&lt;/li&gt;
&lt;li&gt;Color Highlight&lt;/li&gt;
&lt;li&gt;Color Picker&lt;/li&gt;
&lt;li&gt;CSS Peek&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;d&#34;&gt;D&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Dev Containers&lt;/li&gt;
&lt;li&gt;Docker&lt;/li&gt;
&lt;li&gt;Doxygen Documentation Genertor&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;e&#34;&gt;E&lt;/h2&gt;&lt;h2 id=&#34;f&#34;&gt;F&lt;/h2&gt;&lt;h2 id=&#34;g&#34;&gt;G&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Git Graph&lt;/li&gt;
&lt;li&gt;git-commit-plugin&lt;/li&gt;
&lt;li&gt;GitHub Copilot&lt;/li&gt;
&lt;li&gt;GitHub Copilot Chat&lt;/li&gt;
&lt;li&gt;GitHub Copilot Labs&lt;/li&gt;
&lt;li&gt;GitHub Pull Resquest and Issues&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;h&#34;&gt;H&lt;/h2&gt;&lt;h2 id=&#34;i&#34;&gt;I&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;IntelliCode API Usage Examples&lt;/li&gt;
&lt;li&gt;IntelliCode for C# Dev Kit&lt;/li&gt;
&lt;li&gt;IntelliJ IDEA New UI Theme&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;j&#34;&gt;J&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Jetbrains Fleet Theme&lt;/li&gt;
&lt;li&gt;JetBrains Icon Theme&lt;/li&gt;
&lt;li&gt;JetBrains IDE Keymap&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;k&#34;&gt;K&lt;/h2&gt;&lt;h2 id=&#34;l&#34;&gt;L&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Live Sever&lt;/li&gt;
&lt;li&gt;Live Share&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;m&#34;&gt;M&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Markdown Preview Github Styling&lt;/li&gt;
&lt;li&gt;Markdown Preview Mermaid Support&lt;/li&gt;
&lt;li&gt;Marp for VS Code&lt;/li&gt;
&lt;li&gt;MASM&lt;/li&gt;
&lt;li&gt;masm-code&lt;/li&gt;
&lt;li&gt;MASM/TASM&lt;/li&gt;
&lt;li&gt;Material Icon Theme&lt;/li&gt;
&lt;li&gt;mypy&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;n&#34;&gt;N&lt;/h2&gt;&lt;h2 id=&#34;o&#34;&gt;O&lt;/h2&gt;&lt;h2 id=&#34;p&#34;&gt;P&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Pylance&lt;/li&gt;
&lt;li&gt;Python&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;q&#34;&gt;Q&lt;/h2&gt;&lt;h2 id=&#34;r&#34;&gt;R&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Remote - SSH: Editing Configuration Files&lt;/li&gt;
&lt;li&gt;Remote - Development&lt;/li&gt;
&lt;li&gt;Remote Explorer&lt;/li&gt;
&lt;li&gt;REST API&lt;/li&gt;
&lt;li&gt;Ruff&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;s&#34;&gt;S&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Slidev&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;t&#34;&gt;T&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;TODO Highlight v2&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;u&#34;&gt;U&lt;/h2&gt;&lt;h2 id=&#34;v&#34;&gt;V&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Vim&lt;/li&gt;
&lt;li&gt;VSCode DOSBox&lt;/li&gt;
&lt;li&gt;VSCode Git Commit Message&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;w&#34;&gt;W&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;WSL&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;x&#34;&gt;X&lt;/h2&gt;&lt;h2 id=&#34;y&#34;&gt;Y&lt;/h2&gt;&lt;h2 id=&#34;z&#34;&gt;Z&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Marp for VS Code&lt;/li&gt;
&lt;/ul&gt;</description>
    </item>
    <item>
      <title>Google Coral Dev Board 修改风扇转动温度阈值指南</title>
      <link>https://blog.cassdev.com/posts/google-coral-dev-board-%E4%BF%AE%E6%94%B9%E9%A3%8E%E6%89%87%E8%BD%AC%E5%8A%A8%E6%B8%A9%E5%BA%A6%E9%98%88%E5%80%BC%E6%8C%87%E5%8D%97/</link>
      <pubDate>Sun, 16 Jun 2024 11:20:31 +0800</pubDate>
      <guid>https://blog.cassdev.com/posts/google-coral-dev-board-%E4%BF%AE%E6%94%B9%E9%A3%8E%E6%89%87%E8%BD%AC%E5%8A%A8%E6%B8%A9%E5%BA%A6%E9%98%88%E5%80%BC%E6%8C%87%E5%8D%97/</guid>
      <description>&lt;p&gt;Google Coral Dev Board 是一款功能强大的开发板，可用于构建机器学习应用程序。该板配备了 Edge TPU，这是一款专门用于机器学习任务的加速器。Edge TPU 非常高效，但它也可能会产生热量。如果温度过高，Edge TPU 可能会降频或关闭。&lt;/p&gt;
&lt;h2 id=&#34;查看目前-tpu-温度&#34;&gt;查看目前 TPU 温度&lt;/h2&gt;&lt;p&gt;使用命令查看目前开发板核心 TPU 的温度，输出温度为1000倍的摄氏度。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cat /sys/class/thermal/thermal_zone0/temp
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如输出&lt;code&gt;54000&lt;/code&gt;，则代表当前温度为54摄氏度。&lt;/p&gt;
&lt;h2 id=&#34;修改散热器温度阈值&#34;&gt;修改散热器温度阈值&lt;/h2&gt;&lt;p&gt;禁用热管理：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;disabled&amp;#34;&lt;/span&gt; &amp;gt; /sys/devices/virtual/thermal/thermal_zone0/mode
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;修改散热器温度阈值为50摄氏度&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;50000&lt;/span&gt; &amp;gt; /sys/devices/platform/gpio_fan/hwmon/hwmon0/fan1_target
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>HammerSpoon 入门指南</title>
      <link>https://blog.cassdev.com/posts/hammerspoon-%E5%85%A5%E9%97%A8%E6%8C%87%E5%8D%97/</link>
      <pubDate>Sun, 16 Jun 2024 11:20:31 +0800</pubDate>
      <guid>https://blog.cassdev.com/posts/hammerspoon-%E5%85%A5%E9%97%A8%E6%8C%87%E5%8D%97/</guid>
      <description>&lt;h2 id=&#34;介绍&#34;&gt;介绍&lt;/h2&gt;&lt;p&gt;HammerSpoon 这是一款强大的OS X自动化工具。&lt;/p&gt;
&lt;p&gt;HammerSpoon 本质上就是操作系统和Lua脚本引擎之间的桥梁。&lt;/p&gt;
&lt;p&gt;HammerSpoon 之所以强大，在于它提供了一系列向用户公开特定系统功能模块的扩展。有了这些扩展，用户便可利用Lua脚本来控制 macOS 的各个方面。&lt;/p&gt;
&lt;h2 id=&#34;安装&#34;&gt;安装&lt;/h2&gt;&lt;p&gt;建议直接使用 Homebrew 安装。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;brew install hammerspoon --cask
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;手动安装参考&lt;a href=&#34;https://github.com/Hammerspoon/hammerspoon&#34;&gt;官方 Github&lt;/a&gt;。&lt;/p&gt;
&lt;h2 id=&#34;参考文档&#34;&gt;参考文档&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.hammerspoon.org/go/&#34;&gt;HammerSpoon 入门指南&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.hammerspoon.org/docs/&#34;&gt;HammerSpoon API 文档&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.hammerspoon.org/faq/&#34;&gt;HammerSpoon 常见问题&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/Hammerspoon/hammerspoon/wiki/Sample-Configurations&#34;&gt;HammerSpoon 配置示例&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;快速开始&#34;&gt;快速开始&lt;/h2&gt;&lt;h3 id=&#34;启动应用&#34;&gt;启动应用&lt;/h3&gt;&lt;p&gt;安装完毕后启动 HammerSpoon，设置中打开辅助功能。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;HS Preferences&#34; loading=&#34;lazy&#34; src=&#34;https://s2.loli.net/2023/08/06/ZkNiYmXvIRPJ4bs.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;接着点击 Open Config 打开配置文件。下面开始教程。&lt;/p&gt;
&lt;h3 id=&#34;hello-world&#34;&gt;Hello World&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-lua&#34; data-lang=&#34;lua&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;-- Hello World&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;hs.hotkey&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;bind&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;({&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;cmd&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;alt&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;shift&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;ctrl&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;},&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;W&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;kr&#34;&gt;function&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;hs.alert&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;show&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;HammerSpoon is working!&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;end&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;每次修改配置文件后都需要点击 Reload Config。&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;以上代码实现了点击快捷键 &lt;code&gt;command&lt;/code&gt; + &lt;code&gt;option&lt;/code&gt; + &lt;code&gt;shift&lt;/code&gt; + &lt;code&gt;control&lt;/code&gt; + &lt;code&gt;w&lt;/code&gt;，在屏幕中间显示弹窗提示的功能。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;Hello World&#34; loading=&#34;lazy&#34; src=&#34;https://s2.loli.net/2023/08/06/PR3k6Ty4K5AVIqx.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;也可以使用 macOS 原生通知形式&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-lua&#34; data-lang=&#34;lua&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;-- Hello World（macOS native notification）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;hs.hotkey&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;bind&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;({&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;cmd&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;alt&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;shift&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;ctrl&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;},&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Q&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;kr&#34;&gt;function&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;hs.notify&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;new&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;({&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;title&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;macOS Native Notification&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;informativeText&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;HammerSpoon is working&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}):&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;send&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;end&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img alt=&#34;macOS native notification&#34; loading=&#34;lazy&#34; src=&#34;https://s2.loli.net/2023/08/06/HwxemCVBGf1KNnh.png&#34;&gt;
&lt;img alt=&#34;[bg right opacity]&#34; loading=&#34;lazy&#34; src=&#34;https://s2.loli.net/2023/08/06/HwxemCVBGf1KNnh.png&#34;&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>HoloLens 应用程序渲染不出 Mesh 面片的解决方法</title>
      <link>https://blog.cassdev.com/posts/hololens-%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E6%B8%B2%E6%9F%93%E4%B8%8D%E5%87%BA-mesh-%E9%9D%A2%E7%89%87%E7%9A%84%E8%A7%A3%E5%86%B3%E6%96%B9%E6%B3%95/</link>
      <pubDate>Sun, 16 Jun 2024 11:20:31 +0800</pubDate>
      <guid>https://blog.cassdev.com/posts/hololens-%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E6%B8%B2%E6%9F%93%E4%B8%8D%E5%87%BA-mesh-%E9%9D%A2%E7%89%87%E7%9A%84%E8%A7%A3%E5%86%B3%E6%96%B9%E6%B3%95/</guid>
      <description>&lt;h2 id=&#34;问题&#34;&gt;问题&lt;/h2&gt;&lt;p&gt;当项目在 Unity 测试 Mesh 面片渲染正常，而打包部署到 HoloLens 后就无法正常显示 Mesh 面片了。&lt;/p&gt;
&lt;p&gt;失败原因可能出在 Holo 不支持程序代码所用的 Shader 着色器，需要使用 MRTK3 官方提供的 Shader 着色器。&lt;/p&gt;
&lt;h2 id=&#34;解决方法&#34;&gt;解决方法&lt;/h2&gt;&lt;p&gt;默认前提你的项目已经安装了 MRTK3 开发包。&lt;/p&gt;
&lt;p&gt;MRTK3 官方可用的彩色 Mesh 着色器为 &lt;code&gt;Mixed Reality Toolkit/Dashed Ray&lt;/code&gt;。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-C#&#34; data-lang=&#34;C#&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;UnityEngine&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Mesh&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;mesh&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;UnityEngine&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Mesh&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;mesh&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;indexFormat&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;UnityEngine&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Rendering&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;IndexFormat&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;UInt32&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;		&lt;span class=&#34;err&#34;&gt;#当面片数量超过&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;65535&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;时需要设置此项&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;GetComponent&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;MeshFilter&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;().&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;mesh&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;mesh&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Material&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;material&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Material&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Shader&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Find&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;Mixed Reality Toolkit/Dashed Ray&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;));&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;GetComponent&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;MeshRenderer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;().&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;material&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;material&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>iTerm2 配置失去焦点时保持命令行窗口指南</title>
      <link>https://blog.cassdev.com/posts/iterm2-%E9%85%8D%E7%BD%AE%E5%A4%B1%E5%8E%BB%E7%84%A6%E7%82%B9%E6%97%B6%E4%BF%9D%E6%8C%81%E5%91%BD%E4%BB%A4%E8%A1%8C%E7%AA%97%E5%8F%A3%E6%8C%87%E5%8D%97/</link>
      <pubDate>Sun, 16 Jun 2024 11:20:31 +0800</pubDate>
      <guid>https://blog.cassdev.com/posts/iterm2-%E9%85%8D%E7%BD%AE%E5%A4%B1%E5%8E%BB%E7%84%A6%E7%82%B9%E6%97%B6%E4%BF%9D%E6%8C%81%E5%91%BD%E4%BB%A4%E8%A1%8C%E7%AA%97%E5%8F%A3%E6%8C%87%E5%8D%97/</guid>
      <description>&lt;h2 id=&#34;配置步骤&#34;&gt;配置步骤&lt;/h2&gt;&lt;p&gt;按下 &lt;code&gt;cmd&lt;/code&gt; + &lt;code&gt;,&lt;/code&gt; 打开 iTerm2 设置，选择 Profiles 面板，切换到 Keys 选项卡，点击 Configure Hotkey Windows。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;CleanShot 2023-11-10 at 17.09.07@2x&#34; loading=&#34;lazy&#34; src=&#34;https://s2.loli.net/2023/11/10/nyprlVNkUzZuTHj.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;打勾 Pin hotkey window 选项。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;CleanShot 2023-11-10 at 17.11.26@2x&#34; loading=&#34;lazy&#34; src=&#34;https://s2.loli.net/2023/11/10/mjWFbGafINvCt6r.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;大功告成，配置完后鼠标在点击 iTerm2 命令行窗口以外的界面时，命令行窗口就不会自动隐藏了。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Jetson nano 安装 Jtop 和 Jtop 使用指南</title>
      <link>https://blog.cassdev.com/posts/jetson-nano-%E5%AE%89%E8%A3%85-jtop-%E5%92%8C-jtop-%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97/</link>
      <pubDate>Sun, 16 Jun 2024 11:20:31 +0800</pubDate>
      <guid>https://blog.cassdev.com/posts/jetson-nano-%E5%AE%89%E8%A3%85-jtop-%E5%92%8C-jtop-%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97/</guid>
      <description>&lt;p&gt;本文将为你介绍 Jtop，它是一个基于 Python 的系统监控工具。Jtop 通过终端界面展示系统资源的使用情况，包括 CPU、内存、磁盘、网络等。本文将详细介绍 Jtop 各个面板的作用和功能。&lt;/p&gt;
&lt;h2 id=&#34;安装&#34;&gt;安装&lt;/h2&gt;&lt;p&gt;先安装&lt;code&gt;pip3&lt;/code&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo apt install python3-pip
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Jtop 可以通过 pip 来安装，您可以通过以下命令来安装：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo pip3 install -U jetson-stats
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;使用&#34;&gt;使用&lt;/h2&gt;&lt;p&gt;在终端中输入以下命令来启动 Jtop：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;jtop
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在 Jtop 启动后，您可以使用键盘的左右箭头来选择面板，使用 Tab 键来切换到不同的面板，使用 Ctrl + C 命令来退出 Jtop。&lt;/p&gt;
&lt;h2 id=&#34;面板介绍&#34;&gt;面板介绍&lt;/h2&gt;&lt;h3 id=&#34;all-面板&#34;&gt;ALL 面板&lt;/h3&gt;&lt;p&gt;ALL 面板简要展示了主板的各种信息，包括 CPU、GPU、内存、磁盘、风扇以及关于 jetson_clocks、NVPmodel 等的信息。&lt;/p&gt;
&lt;h3 id=&#34;gpu-面板&#34;&gt;GPU 面板&lt;/h3&gt;&lt;p&gt;GPU 面板主要展示了系统 GPU 的使用情况。在 GPU 面板中，您可以看到系统当前的 GPU 利用率、GPU 温度、GPU 风扇转速、 GPU 内存使用情况等信息。同时，您也可以查看各个进程对 GPU 的使用情况。&lt;/p&gt;
&lt;h3 id=&#34;cpu-面板&#34;&gt;CPU 面板&lt;/h3&gt;&lt;p&gt;CPU 面板主要展示了系统 CPU 的使用情况。在 CPU 面板中，您可以看到系统当前的 CPU 利用率、每个 CPU 核心的利用率、以及各个进程的 CPU 使用情况。您可以使用键盘上下箭头来选择进程，使用回车键来查看进程详情。&lt;/p&gt;
&lt;h3 id=&#34;mem-面板&#34;&gt;MEM 面板&lt;/h3&gt;&lt;p&gt;内存面板主要展示了系统内存的使用情况。在内存面板中，您可以看到系统当前的内存利用率、总内存、可用内存、已经使用的内存等信息。同时，您也可以查看各个进程的内存使用情况。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Jetson Xavier NX (ARM) 使用 PyTorch 安装 Open3D-ML 指南</title>
      <link>https://blog.cassdev.com/posts/jetson-xavier-nx-arm-%E4%BD%BF%E7%94%A8-pytorch-%E5%AE%89%E8%A3%85-open3d-ml-%E6%8C%87%E5%8D%97/</link>
      <pubDate>Sun, 16 Jun 2024 11:20:31 +0800</pubDate>
      <guid>https://blog.cassdev.com/posts/jetson-xavier-nx-arm-%E4%BD%BF%E7%94%A8-pytorch-%E5%AE%89%E8%A3%85-open3d-ml-%E6%8C%87%E5%8D%97/</guid>
      <description>&lt;p&gt;由于 Jetson 为 ARM64 (aarch64) 的系统架构，所以不能用&lt;code&gt; pip install&lt;/code&gt; 直接安装，需要通过源码编译。&lt;/p&gt;
&lt;h2 id=&#34;升级系统-jetpack&#34;&gt;升级系统 JetPack&lt;/h2&gt;&lt;p&gt;由于 Open3D-ML 目前只支持 CUDA 10.0 以及 CUDA 11.*，并且  JetPack 的 CUDA 开发环境只有10.2、11.4以及12.2，所以我们只能选择 CUDA 11.4 进行安装。&lt;/p&gt;
&lt;p&gt;使用 &lt;code&gt;jtop&lt;/code&gt;命令查看 JetPack 版本。如果 Jetson 系统的 JetPack 低于 5.1.2 则需要通过 SDK Manager 升级到 JetPack 5.1.2。&lt;/p&gt;
&lt;p&gt;如果你的系统已经是 JetPack 5.1.2 那我也推荐你通过 SDK Manager 重新安装一遍，排除难以发现的错误。&lt;/p&gt;
&lt;p&gt;详细指南参考文章[Jetson Xavier NX 升级或重新安装 JetPack 指南]。&lt;/p&gt;
&lt;h2 id=&#34;安装-pytorch&#34;&gt;安装 PyTorch&lt;/h2&gt;&lt;p&gt;安装教程参考文章[Jetson Xavier NX 安装 CUDA 支持的 Pytorch 指南]。&lt;/p&gt;
&lt;p&gt;注意，PyTorch 的 CUDA 支持版本需要和 Open3D-ML 的一致，同为 CUDA 11.4。否则与最后安装 Open3D-ML 的时候会报错：&lt;/p&gt;</description>
    </item>
    <item>
      <title>Jetson Xavier NX 安装 CUDA 支持的 PyTorch 指南</title>
      <link>https://blog.cassdev.com/posts/jetson-xavier-nx-%E5%AE%89%E8%A3%85-cuda-%E6%94%AF%E6%8C%81%E7%9A%84-pytorch-%E6%8C%87%E5%8D%97/</link>
      <pubDate>Sun, 16 Jun 2024 11:20:31 +0800</pubDate>
      <guid>https://blog.cassdev.com/posts/jetson-xavier-nx-%E5%AE%89%E8%A3%85-cuda-%E6%94%AF%E6%8C%81%E7%9A%84-pytorch-%E6%8C%87%E5%8D%97/</guid>
      <description>&lt;p&gt;本指南将帮助开发者完成在 Jetson Xavier NX 上安装 CUDA 支持的 PyTorch。&lt;/p&gt;
&lt;h2 id=&#34;安装方法&#34;&gt;安装方法&lt;/h2&gt;&lt;p&gt;在 Jetson 上安装 Pytorch 只有两种方法。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;一种是直接安装他人已经编译好的 PyTorch 轮子；&lt;/li&gt;
&lt;li&gt;一种是自己从头开始开始构建 PyTorch 轮子并且安装。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;使用轮子安装&#34;&gt;使用轮子安装&lt;/h2&gt;&lt;p&gt;可以从我的 &lt;a href=&#34;https://github.com/Cassius0924/JetsonPytorch/&#34;&gt;GitHub 仓库&lt;/a&gt; 直接下载我编译好的 PyTorch 轮子（torch-1.13.0-cuda-11.4-python-3.8-aarch64）。&lt;/p&gt;
&lt;p&gt;安装前先确保 python 版本为 PyTorch 轮子对应的 Python 3.8。&lt;/p&gt;
&lt;p&gt;下载完毕后使用&lt;code&gt;pip install&lt;/code&gt;安装：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo -H pip install torch-1.13.0a0+git7c98e70-cp38-cp38-linux_aarch64.whl
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如果你以前安装过 torch 的其他版本，则需要添加&lt;code&gt;--force-reinstall&lt;/code&gt;覆盖安装。&lt;/p&gt;
&lt;p&gt;其他低于 CUDA 11 的 PyTorch 轮子可以在 &lt;a href=&#34;https://github.com/Qengineering/PyTorch-Jetson-Nano&#34;&gt;Qengineering 的 GitHub 仓库&lt;/a&gt; 寻找。&lt;/p&gt;
&lt;h2 id=&#34;编译源码安装&#34;&gt;编译源码安装&lt;/h2&gt;&lt;p&gt;接下来说一下重点，自己从源码构建轮子并安装。自行构建需要花费数个小时的时间。&lt;/p&gt;
&lt;p&gt;PyTroch 1.11.0 以及以上版本只能在 Ubuntu 20.04 上安装。&lt;/p&gt;
&lt;h3 id=&#34;安装依赖&#34;&gt;安装依赖&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo apt-get update
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo apt-get upgrade
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo apt-get install ninja-build git cmake 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo apt-get install libjpeg-dev libopenmpi-dev libomp-dev ccache libopenblas-dev libblas-dev libeigen3-dev
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo pip3 install -U --user wheel mock pillow
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo -H pip3 install testresources &lt;span class=&#34;nv&#34;&gt;setuptools&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;==&lt;/span&gt;58.3.0 scikit-build
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;下载源码&#34;&gt;下载源码&lt;/h3&gt;&lt;p&gt;请克隆自己需要的 PyTorch 版本，修改&lt;code&gt;-b&lt;/code&gt;后的版本参数。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Jetson Xavier NX 升级或重新安装 JetPack 指南</title>
      <link>https://blog.cassdev.com/posts/jetson-xavier-nx-%E5%8D%87%E7%BA%A7%E6%88%96%E9%87%8D%E6%96%B0%E5%AE%89%E8%A3%85-jetpack-%E6%8C%87%E5%8D%97/</link>
      <pubDate>Sun, 16 Jun 2024 11:20:31 +0800</pubDate>
      <guid>https://blog.cassdev.com/posts/jetson-xavier-nx-%E5%8D%87%E7%BA%A7%E6%88%96%E9%87%8D%E6%96%B0%E5%AE%89%E8%A3%85-jetpack-%E6%8C%87%E5%8D%97/</guid>
      <description>&lt;h2 id=&#34;前提&#34;&gt;前提&lt;/h2&gt;&lt;p&gt;你需要拥有一台 x86 架构（非ARM64）的 Ubuntu 主机。&lt;/p&gt;
&lt;h2 id=&#34;下载安装-sdk-manager&#34;&gt;下载安装 SDK Manager&lt;/h2&gt;&lt;h3 id=&#34;下载&#34;&gt;下载&lt;/h3&gt;&lt;p&gt;在 &lt;a href=&#34;https://developer.nvidia.com/sdk-manager&#34;&gt;Nvidia SDK Manager&lt;/a&gt; 官网下载，下载自己系统对应的 .deb 或 .rpm 安装包。&lt;/p&gt;
&lt;p&gt;下载之前需要注册 Nvidia 开发者帐号，SDK Manager 也需要开发者帐号才能使用。&lt;/p&gt;
&lt;h3 id=&#34;安装&#34;&gt;安装&lt;/h3&gt;&lt;p&gt;Ubuntu 系统使用 apt 安装刚刚下载的 .deb 文件：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo apt install ./sdkmanager_&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;version&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;-&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;build&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;_amd64.deb
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;CentOS 8.0 和 8.2 系统使用 dnf 安装 .rpm 文件：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo dnf install ./sdkmanager_&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;version&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;-&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;build&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;.x86_64.rpm
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;CentOS 7.6 使用 yum 安装：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo yum install ./sdkmanager_&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;version&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;-&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;build&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;.x86_64.rpm
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;启动-sdk-manager&#34;&gt;启动 SDK Manager&lt;/h2&gt;&lt;p&gt;在终端使用命令启动 SDK Manager：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sdkmanager
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;启动后需要登录 Nvidia 开发者帐号。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;SDK Manager Login&#34; loading=&#34;lazy&#34; src=&#34;https://s2.loli.net/2023/10/13/Za4GUdmqTVO2lij.png&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;安装-jetpack&#34;&gt;安装 JetPack&lt;/h2&gt;&lt;h3 id=&#34;连接-jetson&#34;&gt;连接 Jetson&lt;/h3&gt;&lt;p&gt;先将 Jetson 与 SDK Manager 主机使用 USB to Micro-USB 数据线相连接。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Kinect 获取数据和可视化</title>
      <link>https://blog.cassdev.com/posts/kinect-%E8%8E%B7%E5%8F%96%E6%95%B0%E6%8D%AE%E5%92%8C%E5%8F%AF%E8%A7%86%E5%8C%96/</link>
      <pubDate>Sun, 16 Jun 2024 11:20:31 +0800</pubDate>
      <guid>https://blog.cassdev.com/posts/kinect-%E8%8E%B7%E5%8F%96%E6%95%B0%E6%8D%AE%E5%92%8C%E5%8F%AF%E8%A7%86%E5%8C%96/</guid>
      <description>&lt;p&gt;基于 Azure Kinect SDK 和 Open3D 实现灾害现场的三维重建。&lt;/p&gt;
&lt;p&gt;首先，通过获取 Kinect 的 IMU 数据、捕获彩色图像和深度图像，将图像数据转换为点云数据。
随后，根据 IMU 数据实现点云的粗配准，使用彩色ICP算法实现点云的精配准。并将点云数据转换为三角网格数据即场景模型数据。
最后，通过 Protocal Buffers 技术发送给客户端。客户端可在 HoloLens2 上进行智能可视化。&lt;/p&gt;
&lt;p&gt;然后，我们将点云数据转换为三角网格数据，生成场景模型数据。最后，使用 Protocal Buffers 技术将场景模型数据发送给客户端，实现在 HoloLens2 上进行可视化操作。通过完成以上步骤，我们可以高效地把灾后场景还原为一个准确的三维场景模型，使救援和重建工作变得更为快捷、高效。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Linux Boost.Python3 安装以及 CMake 配置指南</title>
      <link>https://blog.cassdev.com/posts/linux-boost.python3-%E5%AE%89%E8%A3%85%E4%BB%A5%E5%8F%8A-cmake-%E9%85%8D%E7%BD%AE%E6%8C%87%E5%8D%97/</link>
      <pubDate>Sun, 16 Jun 2024 11:20:31 +0800</pubDate>
      <guid>https://blog.cassdev.com/posts/linux-boost.python3-%E5%AE%89%E8%A3%85%E4%BB%A5%E5%8F%8A-cmake-%E9%85%8D%E7%BD%AE%E6%8C%87%E5%8D%97/</guid>
      <description>&lt;h2 id=&#34;下载boost&#34;&gt;下载Boost&lt;/h2&gt;&lt;p&gt;前往&lt;a href=&#34;https://www.boost.org/&#34;&gt;Boost官网&lt;/a&gt;下载源码压缩包。&lt;/p&gt;
&lt;p&gt;或通过 &lt;code&gt;wget&lt;/code&gt; 下载 1.83 版本：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;wget https://boostorg.jfrog.io/artifactory/main/release/1.83.0/source/boost_1_83_0.7z
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;下载完毕后，解压 7z 压缩包&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;7z x boost_1_83_0.7z
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;编译安装&#34;&gt;编译安装&lt;/h2&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt; boost_1_83_0
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;./bootstrap.sh --with-python&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/root/.virtualenvs/ETRS/bin/python3 --with-python-version&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;3.8 --with-libraries&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;all 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;--with-python&lt;/code&gt; 的路径可以通过 &lt;code&gt;which python3&lt;/code&gt; 查看。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;--with-python-version&lt;/code&gt; 的版本号可以通过 &lt;code&gt;python3 --version&lt;/code&gt; 查看，注意这里需要填成 &lt;code&gt;3.x&lt;/code&gt; 格式 ，而不是 &lt;code&gt;3.y.z&lt;/code&gt;，省略最后的版本号。&lt;/p&gt;
&lt;p&gt;运行完以上命令后，需要修改 &lt;code&gt;project-config&lt;/code&gt; 配置文件。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;vim project-config.jam
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;修改第 21行，在双引号里添加两个路径，分别是当前 Python 版本的 include 路径和 lib 路径。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;CleanShot 2023-11-11 at 20.44.10@2x&#34; loading=&#34;lazy&#34; src=&#34;https://s2.loli.net/2023/11/11/gKp5WhZYdrC1XAN.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;Python 的 include 路径和 lib 路径可以通过下面的 Python 代码查看：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;sysconfig&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;sysconfig&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get_path&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;include&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;		&lt;span class=&#34;c1&#34;&gt;# 查看 include 路径&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;sysconfig&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get_path&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;stdlib&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;		&lt;span class=&#34;c1&#34;&gt;# 查看 lib 路径&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;开始编译：&lt;/p&gt;</description>
    </item>
    <item>
      <title>Linux 初探之旅（二）——文件与文件夹的读写</title>
      <link>https://blog.cassdev.com/posts/linux-%E5%88%9D%E6%8E%A2%E4%B9%8B%E6%97%85%E4%BA%8C%E6%96%87%E4%BB%B6%E4%B8%8E%E6%96%87%E4%BB%B6%E5%A4%B9%E7%9A%84%E8%AF%BB%E5%86%99/</link>
      <pubDate>Sun, 16 Jun 2024 11:20:31 +0800</pubDate>
      <guid>https://blog.cassdev.com/posts/linux-%E5%88%9D%E6%8E%A2%E4%B9%8B%E6%97%85%E4%BA%8C%E6%96%87%E4%BB%B6%E4%B8%8E%E6%96%87%E4%BB%B6%E5%A4%B9%E7%9A%84%E8%AF%BB%E5%86%99/</guid>
      <description>&lt;p&gt;在上一篇文章中，我们学习了Linux中的文件浏览，知道了如何在Linux文件系统中定位文件。本篇文章中，我们将继续深入学习Linux中的文件及目录的读写操作。&lt;/p&gt;
&lt;h2 id=&#34;读取文件&#34;&gt;读取文件&lt;/h2&gt;&lt;h3 id=&#34;cat-命令读取文件全部内容&#34;&gt;cat 命令：读取文件全部内容&lt;/h3&gt;&lt;p&gt;要读取一个文件的内容，可以使用cat命令，语法为：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cat 文件名
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这会将文件的全部内容输出到终端。当文件比较大时，这样的输出会刷屏，不太方便查看。&lt;/p&gt;
&lt;h3 id=&#34;head-和-tail-命令显示部分内容&#34;&gt;head 和 tail 命令：显示部分内容&lt;/h3&gt;&lt;p&gt;Linux提供了head和tail命令来显示部分内容：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;head - 显示开头部分内容&lt;/li&gt;
&lt;li&gt;tail - 显示结尾部分内容&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;head和tail可以指定显示的行数，例如：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;head -n &lt;span class=&#34;m&#34;&gt;3&lt;/span&gt; 文件名 &lt;span class=&#34;c1&#34;&gt;# 显示前3行 &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;tail -n &lt;span class=&#34;m&#34;&gt;5&lt;/span&gt; 文件名 &lt;span class=&#34;c1&#34;&gt;# 显示后5行&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;less-命令分页显示&#34;&gt;less 命令：分页显示&lt;/h3&gt;&lt;p&gt;less命令可以分页方式显示文件内容，可以上下翻阅，是文件查看的首选工具。&lt;/p&gt;
&lt;p&gt;less可以用方向键上下翻页，也支持各种快捷键，推荐大家阅读less的帮助文档。&lt;/p&gt;
&lt;h2 id=&#34;写入文件&#34;&gt;写入文件&lt;/h2&gt;&lt;h3 id=&#34;echo-命令输出到文件&#34;&gt;echo 命令：输出到文件&lt;/h3&gt;&lt;p&gt;使用echo命令可以向文件写入内容，语法为：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;要写入的内容&amp;#34;&lt;/span&gt; &amp;gt; 文件名	
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这会覆盖文件原有内容。如果要附加内容，使用两个大于号：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;新增内容&amp;#34;&lt;/span&gt; &amp;gt;&amp;gt; 文件名 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;文本编辑器vim&#34;&gt;文本编辑器：vim&lt;/h3&gt;&lt;p&gt;对文件进行复杂编辑可以使用文本编辑器，Linux中的常用文本编辑器有vi、emacs、vim和nano等。这里简单介绍vim的使用。&lt;/p&gt;
&lt;p&gt;使用&lt;code&gt;vim 文件名&lt;/code&gt;可以打开vim编辑器。vim有三种模式，分别是命令模式、插入模式和底线命令模式。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;命令模式：用于导航文件，可以进行复制、粘贴、删除等操作。&lt;/li&gt;
&lt;li&gt;插入模式：用于输入文本，可以使用键盘输入文本。&lt;/li&gt;
&lt;li&gt;底线命令模式：用于执行命令，例如保存文件、退出vim等。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;初学者可以先了解以下几个快捷键：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;i&lt;/code&gt; - 进入插入模式&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ESC&lt;/code&gt; - 从插入模式回到命令模式&lt;/li&gt;
&lt;li&gt;&lt;code&gt;:w&lt;/code&gt; - 保存文件&lt;/li&gt;
&lt;li&gt;&lt;code&gt;:q&lt;/code&gt; - 退出vim&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;vim非常强大，建议大家自己练习熟悉其操作。&lt;/p&gt;
&lt;h2 id=&#34;删除文件和目录&#34;&gt;删除文件和目录&lt;/h2&gt;&lt;h3 id=&#34;rm-命令删除文件&#34;&gt;rm 命令：删除文件&lt;/h3&gt;&lt;p&gt;删除文件使用rm命令：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;rm 文件名
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;rm--r-命令删除目录&#34;&gt;rm -r 命令：删除目录&lt;/h3&gt;&lt;p&gt;如果要删除目录，需要添加-r参数：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;rm -r 目录名
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这会递归删除目录及其中的所有内容，需要小心使用。&lt;/p&gt;
&lt;h2 id=&#34;复制和移动文件&#34;&gt;复制和移动文件&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;复制使用cp命令，添加-r参数可以复制目录&lt;/p&gt;</description>
    </item>
    <item>
      <title>Linux 初探之旅（三）——重定向、标准输入输出和管道</title>
      <link>https://blog.cassdev.com/posts/linux-%E5%88%9D%E6%8E%A2%E4%B9%8B%E6%97%85%E4%B8%89%E9%87%8D%E5%AE%9A%E5%90%91%E6%A0%87%E5%87%86%E8%BE%93%E5%85%A5%E8%BE%93%E5%87%BA%E5%92%8C%E7%AE%A1%E9%81%93/</link>
      <pubDate>Sun, 16 Jun 2024 11:20:31 +0800</pubDate>
      <guid>https://blog.cassdev.com/posts/linux-%E5%88%9D%E6%8E%A2%E4%B9%8B%E6%97%85%E4%B8%89%E9%87%8D%E5%AE%9A%E5%90%91%E6%A0%87%E5%87%86%E8%BE%93%E5%85%A5%E8%BE%93%E5%87%BA%E5%92%8C%E7%AE%A1%E9%81%93/</guid>
      <description>&lt;h2 id=&#34;标准输入输出&#34;&gt;标准输入输出&lt;/h2&gt;&lt;p&gt;我们先从Linux最基础的交互来讲起，我们究竟是如何和Linux系统内核进行交互的？换句话说，如何通过在按下键盘，就能让系统实现对应的操作的？&lt;/p&gt;
&lt;p&gt;这一切都离不开它，终端——用户与Linux建立起联系的桥梁。&lt;/p&gt;
&lt;p&gt;当我们在终端上输入命令的时候，直到我们未按下回车键之前，我们输入的所有内容都储存在终端的缓冲区（Buffer）里。此时我们输入的内容不会被系统所读到，只有在我们按下回车键后，缓冲区里的内容才会被发往 stdin （Standrad input 标准输入），stdin 是 Linux 内核和用户交互的通道。&lt;/p&gt;
&lt;p&gt;接着，Shell 会介入，它会将 stdin 收到的内容翻译成操作并执行，Shell 译为壳层，与 Kernel（内核）相对应。Shell在外，Kernel在内。例如我们输入&lt;code&gt;ls&lt;/code&gt;，那么 Shell 就会找到 &lt;code&gt;ls&lt;/code&gt; 这条命令对应的二进制文件并执行。&lt;/p&gt;
&lt;p&gt;执行完命令后，Shell 会将获取到的结果发送到另一条与 stdin 相对应的通道中，即 stdout（Standard output 标准输出）。终端会不间断地从 stdout 里读取内容，然后打印到屏幕上，即我们在终端中看到的输出。&lt;/p&gt;
&lt;p&gt;总的来说，用户的输入的内容会发往 stdin 并被 Shell 读取，Shell 将找到内容所对应的二进制文件并执行，执行完后 Shell 会将结果发往 stdout 中，及时的显示在屏幕上。这就是一次与 Linux 交互的过程。&lt;/p&gt;
&lt;p&gt;我们总说，在 Linux 中一切皆为文件，那么 stdin 和 stdout 也不例外，它们也是系统的两个文件。除了 stdin 和 stdout 之外，还有第三条通道 stderr（Standard error 标准错误）。stderr 和 stdout 一样，它们都是用于存储执行结果的地方，区别在于，Shell 执行完命令后，会将正常的结果发往 stdout 里，将错误的结果发往 stderr 里。同样地，stderr 也会被终端所读取，最后显示在屏幕上。&lt;/p&gt;
&lt;h2 id=&#34;输出重定向&#34;&gt;输出重定向&lt;/h2&gt;&lt;p&gt;理解了标准输入输出后，我们能弄懂重定向的原理了，实际上就是 Shell 执行完命令后不把输出结果存放在 stdout 或 stderr 。而是存放到另一个文件当中。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Linux 批量修改文件名指南</title>
      <link>https://blog.cassdev.com/posts/linux-%E6%89%B9%E9%87%8F%E4%BF%AE%E6%94%B9%E6%96%87%E4%BB%B6%E5%90%8D%E6%8C%87%E5%8D%97/</link>
      <pubDate>Sun, 16 Jun 2024 11:20:31 +0800</pubDate>
      <guid>https://blog.cassdev.com/posts/linux-%E6%89%B9%E9%87%8F%E4%BF%AE%E6%94%B9%E6%96%87%E4%BB%B6%E5%90%8D%E6%8C%87%E5%8D%97/</guid>
      <description>&lt;p&gt;使用 bash 脚本，先创建一个 .sh 结尾的脚本：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-vim&#34; data-lang=&#34;vim&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;vim&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;rename&lt;/span&gt;.&lt;span class=&#34;nx&#34;&gt;sh&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;以下是示例 bash 脚本内容，作用是将 /path/to/dir 目录下所有包含冒号&lt;code&gt;:&lt;/code&gt;的文件名，将冒号替换为减号。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# !/bin/bash&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;find /path/to/dir -type f -name &lt;span class=&#34;s1&#34;&gt;&amp;#39;*:*&amp;#39;&lt;/span&gt; -exec bash -c &lt;span class=&#34;s1&#34;&gt;&amp;#39;mv &amp;#34;$0&amp;#34; &amp;#34;${0//:/-}&amp;#34;&amp;#39;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{}&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;代码解释&#34;&gt;代码解释&lt;/h2&gt;&lt;h3 id=&#34;使用find查找需要更改的文件&#34;&gt;使用&lt;code&gt;find&lt;/code&gt;查找需要更改的文件&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;find /path/to/dir -type f -name &lt;span class=&#34;s1&#34;&gt;&amp;#39;*:*&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/path/to/dir&lt;/code&gt; 应该替换为包含你要修改文件名的文件夹的实际路径。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-type f&lt;/code&gt; 表示只查找普通文件，而不包括目录。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-name &#39;*:*&#39;&lt;/code&gt; 是一个查找条件，用于匹配包含冒号的文件名。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;使用mv和bash执行文件名更改&#34;&gt;使用&lt;code&gt;mv&lt;/code&gt;和&lt;code&gt;bash&lt;/code&gt;执行文件名更改&lt;/h3&gt;&lt;p&gt;一旦找到需要更改的文件，可以使用&lt;code&gt;mv&lt;/code&gt;命令结合&lt;code&gt;bash&lt;/code&gt;来执行文件名更改操作。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;find /path/to/dir -type f -name &lt;span class=&#34;s1&#34;&gt;&amp;#39;*:*&amp;#39;&lt;/span&gt; -exec bash -c &lt;span class=&#34;s1&#34;&gt;&amp;#39;mv &amp;#34;$0&amp;#34; &amp;#34;${0//:/-}&amp;#34;&amp;#39;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{}&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这个命令中的 &lt;code&gt;-exec&lt;/code&gt; 标志用于在&lt;code&gt;find&lt;/code&gt;查找到的每个文件上执行指定的命令。&lt;code&gt;bash -c&lt;/code&gt;之后的部分将执行文件名更改操作。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;mv &amp;quot;$0&amp;quot; &amp;quot;${0//:/-}&amp;quot;&lt;/code&gt; 使用&lt;code&gt;mv&lt;/code&gt;命令将文件名中的冒号替换为减号。&lt;code&gt;${0//:/-}&lt;/code&gt; 部分是一个bash子shell，其中的&lt;code&gt;${0}&lt;/code&gt;表示当前文件名，&lt;code&gt;//&lt;/code&gt;后跟着&lt;code&gt;:&lt;/code&gt;和&lt;code&gt;-&lt;/code&gt;是用来替换的正则表达式。&lt;/li&gt;
&lt;/ul&gt;</description>
    </item>
    <item>
      <title>macOS ClashX Pro 配置指南</title>
      <link>https://blog.cassdev.com/posts/macos-clashx-pro-%E9%85%8D%E7%BD%AE%E6%8C%87%E5%8D%97/</link>
      <pubDate>Sun, 16 Jun 2024 11:20:31 +0800</pubDate>
      <guid>https://blog.cassdev.com/posts/macos-clashx-pro-%E9%85%8D%E7%BD%AE%E6%8C%87%E5%8D%97/</guid>
      <description>&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;mixed-port: 7890

# Linux 和 macOS 的 redir 代理端口
redir-port: 7892

# 允许局域网的连接
allow-lan: true

# 规则模式：Rule（规则） / Global（全局代理）/ Direct（全局直连）
mode: rule

# 设置日志输出级别 (默认级别：silent，即不输出任何内容，以避免因日志内容过大而导致程序内存溢出）。
# 5 个级别：silent / info / warning / error / debug。级别越高日志输出量越大，越倾向于调试，若需要请自行开启。
log-level: info
# Clash 的 RESTful API
external-controller: &amp;#39;0.0.0.0:9090&amp;#39;

# RESTful API 的口令
secret: &amp;#39;&amp;#39;

dns:
  enable: true
  ipv6: true
  listen: &amp;#39;0.0.0.0:53&amp;#39;
  use-hosts: true
  enhanced-mode: fake-ip
  fake-ip-range: 198.18.0.1/16
  nameserver:
    - 202.120.224.6
    - 114.114.114.114
    - 223.5.5.5
    - &amp;#39;tcp://223.5.5.5&amp;#39;
  fallback:
    - &amp;#39;tls://223.5.5.5:853&amp;#39;
    - &amp;#39;https://223.5.5.5/dns-query&amp;#39;
  fallback-filter:
    geoip: true
    ipcidr:
      - 240.0.0.0/4
# proxy provider start here
proxy-providers:
  feiniao:
    type: http
    path: ./profiles/feiniao.yaml
    url: https://apiv1.v27qae.com/flydsubal/c8lr21z6wpiebqqx?clash=1&amp;amp;extend=1
    interval: 36000
    health-check:
      enable: true
      url: http://www.gstatic.com/generate_204
      interval: 3600
  yiyuan:
    type: http
    path: ./profiles/yiyuan.yaml
    url: https://sub1.smallstrawberry.com/api/v1/client/subscribe?token=d6e73f953b6053a3b263b73f9509375d
    decode-url: true
    interval: 36000
    health-check:
      enable: true
      url: http://www.gstatic.com/generate_204
      interval: 3600


# proxy provider end
proxies:
    # socks5
  - name: windowsServer
    type: socks5
    server: 10.127.78.177
    port: 7890
    # username: username
    # password: password
    # tls: true
    # skip-cert-verify: true
    # udp: true

  # - {name: 🇮🇪 中国-爱尔兰 IPLC C04, server: ir04.cathayroute.com, port: 33400, type: ss, cipher: rc4-md5, password: SRCFiB}
  # - {name: 🇭🇰 香港 油尖旺御金·国峯 名氣通電訊 C02, server: hkhe02.cathayroute.com, port: 33400, type: ss, cipher: rc4-md5, password: SRCFiB}
  # - {name: 🇮🇪 中国-爱尔兰 IPLC C03, server: ir03.cathayroute.com, port: 33400, type: ss, cipher: rc4-md5, password: SRCFiB}
  # - {name: 🇭🇰 香港 油尖旺御金·国峯 名氣通電訊 C09, server: hkhe09.cathayroute.com, port: 33400, type: ss, cipher: rc4-md5, password: SRCFiB}
  # - {name: 🇨🇳 中国-香港 IEPL Equinix HK8 C 02 1Gbps HBO TVB, server: sg12.cathayroute.com, port: 33400, type: ss, cipher: rc4-md5, password: SRCFiB, udp: true}
  # - {name: 🇨🇳 中国-爱尔兰 IPLC C05, server: ir05.cathayroute.com, port: 33400, type: ss, cipher: rc4-md5, password: SRCFiB, udp: true}
  # - {name: 🇨🇳 中国-香港 IPLC Equinix HK2 C 06 1Gbps HBO TVB, server: sg06.cathayroute.com, port: 33400, type: ss, cipher: rc4-md5, password: SRCFiB, udp: true}

proxy-groups:
  - name: Proxies
    type: select
    proxies:
      - 机场节点
      - 自动选择
      - 故障转移

  # - name: 手动节点
  #   type: select
  #   proxies:
  #     - 🇮🇪 中国-爱尔兰 IPLC C04
  #     - 🇭🇰 香港 油尖旺御金·国峯 名氣通電訊 C02
  #     - 🇮🇪 中国-爱尔兰 IPLC C03
  #     - 🇭🇰 香港 油尖旺御金·国峯 名氣通電訊 C09   
  #     - 🇨🇳 中国-香港 IEPL Equinix HK8 C 02 1Gbps HBO TVB
  #     - 🇨🇳 中国-爱尔兰 IPLC C05
  #     - 🇨🇳 中国-香港 IPLC Equinix HK2 C 06 1Gbps HBO TVB

  - name: feiniao
    type: select
    use:
     - feiniao

  - name: yiyuan
    type: select
    use:
     - yiyuan

  - name: 机场节点
    type: select
    proxies:
     - feiniao
     - yiyuan


  - name: 故障转移
    type: fallback
    url: &amp;#39;http://www.gstatic.com/generate_204&amp;#39;
    interval: 7200
    proxies:
     - feiniao
     - yiyuan

  - name: 自动选择
    type: url-test
    url: &amp;#39;http://www.gstatic.com/generate_204&amp;#39;
    interval: 300
    use:
      - feiniao
      - yiyuan

rule-providers:
  reject:
    type: http
    behavior: domain
    url: &amp;#34;https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/reject.txt&amp;#34;
    path: ./ruleset/reject.yaml
    interval: 86400

  icloud:
    type: http
    behavior: domain
    url: &amp;#34;https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/icloud.txt&amp;#34;
    path: ./ruleset/icloud.yaml
    interval: 86400

  apple:
    type: http
    behavior: domain
    url: &amp;#34;https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/apple.txt&amp;#34;
    path: ./ruleset/apple.yaml
    interval: 86400

  google:
    type: http
    behavior: domain
    url: &amp;#34;https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/google.txt&amp;#34;
    path: ./ruleset/google.yaml
    interval: 86400

  proxy:
    type: http
    behavior: domain
    url: &amp;#34;https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/proxy.txt&amp;#34;
    path: ./ruleset/proxy.yaml
    interval: 86400

  direct:
    type: http
    behavior: domain
    url: &amp;#34;https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/direct.txt&amp;#34;
    path: ./ruleset/direct.yaml
    interval: 86400

  private:
    type: http
    behavior: domain
    url: &amp;#34;https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/private.txt&amp;#34;
    path: ./ruleset/private.yaml
    interval: 86400

  gfw:
    type: http
    behavior: domain
    url: &amp;#34;https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/gfw.txt&amp;#34;
    path: ./ruleset/gfw.yaml
    interval: 86400

  tld-not-cn:
    type: http
    behavior: domain
    url: &amp;#34;https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/tld-not-cn.txt&amp;#34;
    path: ./ruleset/tld-not-cn.yaml
    interval: 86400

  telegramcidr:
    type: http
    behavior: ipcidr
    url: &amp;#34;https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/telegramcidr.txt&amp;#34;
    path: ./ruleset/telegramcidr.yaml
    interval: 86400

  cncidr:
    type: http
    behavior: ipcidr
    url: &amp;#34;https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/cncidr.txt&amp;#34;
    path: ./ruleset/cncidr.yaml
    interval: 86400

  lancidr:
    type: http
    behavior: ipcidr
    url: &amp;#34;https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/lancidr.txt&amp;#34;
    path: ./ruleset/lancidr.yaml
    interval: 86400

  applications:
    type: http
    behavior: classical
    url: &amp;#34;https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/applications.txt&amp;#34;
    path: ./ruleset/applications.yaml
    interval: 86400

rules:
  - DOMAIN-SUFFIX,visualstudio.com,DIRECT
  - DOMAIN-SUFFIX,azure.com,DIRECT
  - DOMAIN-SUFFIX,vscode.dev,Proxies
  - RULE-SET,applications,DIRECT
  - DOMAIN,clash.razord.top,DIRECT
  - DOMAIN,yacd.haishan.me,DIRECT
  - RULE-SET,private,DIRECT
  - RULE-SET,reject,REJECT
  - RULE-SET,tld-not-cn,Proxies
  - RULE-SET,gfw,Proxies
  - RULE-SET,telegramcidr,Proxies
  - MATCH,DIRECT
&lt;/code&gt;&lt;/pre&gt;</description>
    </item>
    <item>
      <title>macOS Word 更好的快捷键配置指南</title>
      <link>https://blog.cassdev.com/posts/macos-word-%E6%9B%B4%E5%A5%BD%E7%9A%84%E5%BF%AB%E6%8D%B7%E9%94%AE%E9%85%8D%E7%BD%AE%E6%8C%87%E5%8D%97/</link>
      <pubDate>Sun, 16 Jun 2024 11:20:31 +0800</pubDate>
      <guid>https://blog.cassdev.com/posts/macos-word-%E6%9B%B4%E5%A5%BD%E7%9A%84%E5%BF%AB%E6%8D%B7%E9%94%AE%E9%85%8D%E7%BD%AE%E6%8C%87%E5%8D%97/</guid>
      <description>&lt;p&gt;Microsoft Word在macOS平台上是一款功能强大的文字处理工具，然而，要使其与macOS原生编辑器更好地无缝切换，合理配置快捷键是至关重要的。本指南将介绍一些新的macOS Word的快捷键，使您能够更高效地编辑文档，同时保持与系统级快捷键的一致性。&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th style=&#34;text-align: center&#34;&gt;快捷键&lt;/th&gt;
          &lt;th style=&#34;text-align: left&#34;&gt;Word快捷键名&lt;/th&gt;
          &lt;th style=&#34;text-align: left&#34;&gt;备注&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;Ctrl + A&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;StartOfLine&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;跳到行首&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;Ctrl + E&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;EndOfLine&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;跳到行尾&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;Ctrl + N&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;LineDown&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;下一行&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;Ctrl + P&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;LineUp&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;上一行&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;Ctrl + F&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;CharRight&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;下一个字符&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;Ctrl + B&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;CharLeft&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;上一个字符&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;Ctrl + J&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;NextPage&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;跳到下一页&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;Ctrl + K&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;PrevPage&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;跳到上一页&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;Ctrl + V&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;PasteTextOnly&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;无格式粘贴&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;Ctrl + H&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;Highlight&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;高亮选中的文字&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;Ctrl + T&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;TableInsertTable&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;插入表格&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;Cmd + Shift + F&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;NavPaneSearch&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;高级面板搜索&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;Option + Return&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;TableInsertRowBelow&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;在表格下方插入一行&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;</description>
    </item>
    <item>
      <title>macOS Word 设置论文排版指南</title>
      <link>https://blog.cassdev.com/posts/macos-word-%E8%AE%BE%E7%BD%AE%E8%AE%BA%E6%96%87%E6%8E%92%E7%89%88%E6%8C%87%E5%8D%97/</link>
      <pubDate>Sun, 16 Jun 2024 11:20:31 +0800</pubDate>
      <guid>https://blog.cassdev.com/posts/macos-word-%E8%AE%BE%E7%BD%AE%E8%AE%BA%E6%96%87%E6%8E%92%E7%89%88%E6%8C%87%E5%8D%97/</guid>
      <description>&lt;h2 id=&#34;正文&#34;&gt;正文&lt;/h2&gt;&lt;p&gt;字体大小默认12，两端对齐，1.5倍行距。字体类型选择 Latin 文字，将字体改成 Times New Roman，再将字体类型改成 Asian 亚洲文字，将字体改成 SimHei（黑体）。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;CleanShot 2023-10-22 at 21.46.45@2x&#34; loading=&#34;lazy&#34; src=&#34;https://s2.loli.net/2023/10/22/hzB69WHcKSLDYdT.png&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;带首行缩进的正文&#34;&gt;带首行缩进的正文&lt;/h2&gt;&lt;p&gt;打开样式面板，点击 New Style。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;CleanShot 2023-11-29 at 19.45.34@2x&#34; loading=&#34;lazy&#34; src=&#34;https://s2.loli.net/2023/11/29/TacpfhOd6IuNqzJ.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;输入样式名称“Indent”，继承于 Normal 样式。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;CleanShot 2023-11-29 at 19.46.56@2x&#34; loading=&#34;lazy&#34; src=&#34;https://s2.loli.net/2023/11/29/ynCkXH7jRTfrBce.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;左下角选择 Paragraph 面板，将 Special 改成 First line，后面填 0.86cm。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;CleanShot 2023-10-22 at 21.54.02@2x&#34; loading=&#34;lazy&#34; src=&#34;https://s2.loli.net/2023/10/22/bmk8YnCLD17cBKH.png&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;各级标题&#34;&gt;各级标题&lt;/h2&gt;&lt;h3 id=&#34;一级标题&#34;&gt;一级标题&lt;/h3&gt;&lt;p&gt;打开 Heading 1 一级标题的设置。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;CleanShot 2023-10-22 at 21.31.53@2x&#34; loading=&#34;lazy&#34; src=&#34;https://s2.loli.net/2023/10/22/IhjbkadGzHcfZoO.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;字体大小默认16，加粗，黑色，居中对齐，1.5倍行距。字体类型选择 Latin 文字，将字体改成 Times New Roman，再将字体类型改成 Asian 亚洲文字，将字体改成 SimHei（黑体）。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;CleanShot 2023-10-22 at 20.43.56@2x&#34; loading=&#34;lazy&#34; src=&#34;https://s2.loli.net/2023/10/22/6WeTgSpLbyVMClD.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;左下角选择 Paragraph 面板，将 Special 改成 none，取消继承于正文样式（Normal）的值。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;CleanShot 2023-11-29 at 19.04.12@2x&#34; loading=&#34;lazy&#34; src=&#34;https://s2.loli.net/2023/11/29/l7spaX1t8oTMv6E.png&#34;&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>macOS 设置自动复制消息验证码指南</title>
      <link>https://blog.cassdev.com/posts/macos-%E8%AE%BE%E7%BD%AE%E8%87%AA%E5%8A%A8%E5%A4%8D%E5%88%B6%E6%B6%88%E6%81%AF%E9%AA%8C%E8%AF%81%E7%A0%81%E6%8C%87%E5%8D%97/</link>
      <pubDate>Sun, 16 Jun 2024 11:20:31 +0800</pubDate>
      <guid>https://blog.cassdev.com/posts/macos-%E8%AE%BE%E7%BD%AE%E8%87%AA%E5%8A%A8%E5%A4%8D%E5%88%B6%E6%B6%88%E6%81%AF%E9%AA%8C%E8%AF%81%E7%A0%81%E6%8C%87%E5%8D%97/</guid>
      <description>&lt;h2 id=&#34;前提&#34;&gt;前提&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;接受短信验证码的 SMI 卡必须在上 iPhone&lt;/li&gt;
&lt;li&gt;iPhone 和 macOS 须登录同一个 iCloud&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;打开短信转发&#34;&gt;打开短信转发&lt;/h2&gt;&lt;p&gt;打开 iPhone 的设置，找到 Message 短信 App 的设置。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;IMG_4653&#34; loading=&#34;lazy&#34; src=&#34;https://s2.loli.net/2023/10/30/qHoz7iTwOhpkuW5.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;往下拉，找到 Text Message Forwarding 短信转发并点击，打开需要被转发的 Mac 电脑。若你有 iPda，也可以顺便转发至 iPad。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;IMG_4654&#34; loading=&#34;lazy&#34; src=&#34;https://s2.loli.net/2023/10/30/jbnJeSd87K5IRZP.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;打开 macOS 的 Message 短信应用，按下快捷键 &lt;code&gt;command&lt;/code&gt;+&lt;code&gt;,&lt;/code&gt; 打开设置。打开 iMessage 面板，勾选需要接受的短信来源。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;CleanShot 2023-10-30 at 10.56.26@2x&#34; loading=&#34;lazy&#34; src=&#34;https://s2.loli.net/2023/10/30/2wzkGOfLyrCbiTQ.png&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;下载-messauto&#34;&gt;下载 MessAuto&lt;/h2&gt;&lt;p&gt;点击跳转 &lt;a href=&#34;https://github.com/LeeeSe/MessAuto&#34;&gt;Github 下载地址&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;下载自己电脑对应的版本，M系列的芯片下载第一个，Intel芯片下载第二个。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;CleanShot 2023-10-29 at 23.24.22@2x&#34; loading=&#34;lazy&#34; src=&#34;https://s2.loli.net/2023/10/29/UMl8vyE1OsXCQnP.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;下载完毕后，解压压缩包会直接得到一个名为 MessAuto.app 的应用程序文件，需要将它拖进 Applicatioin 文件夹里。&lt;/p&gt;
&lt;p&gt;打开 Finder，按下快捷键&lt;code&gt;command&lt;/code&gt;+ &lt;code&gt;T&lt;/code&gt; 创建新的标签页，再按下 &lt;code&gt;command&lt;/code&gt;+&lt;code&gt;shift&lt;/code&gt;+&lt;code&gt;A&lt;/code&gt;打开 Application 应用程序文件夹。&lt;/p&gt;
&lt;p&gt;回到第一个标签页，将 MessAuto.app 拖到 Application 文件夹下。&lt;/p&gt;
&lt;p&gt;由于 MessAuto 没有 Apple 的开发者证书，所以 M 系列芯片的电脑不能直接打开无需安装的应用程序，所以需要运行命令：&lt;/p&gt;</description>
    </item>
    <item>
      <title>macOS 为 Google Coral Dev Board 刷入系统镜像指南</title>
      <link>https://blog.cassdev.com/posts/macos-%E4%B8%BA-google-coral-dev-board-%E5%88%B7%E5%85%A5%E7%B3%BB%E7%BB%9F%E9%95%9C%E5%83%8F%E6%8C%87%E5%8D%97/</link>
      <pubDate>Sun, 16 Jun 2024 11:20:31 +0800</pubDate>
      <guid>https://blog.cassdev.com/posts/macos-%E4%B8%BA-google-coral-dev-board-%E5%88%B7%E5%85%A5%E7%B3%BB%E7%BB%9F%E9%95%9C%E5%83%8F%E6%8C%87%E5%8D%97/</guid>
      <description>&lt;p&gt;本指南旨在帮助 macOS 开发者为 Google Coral Dev Board （Google Edege TPU） 通过 OTG 刷入 Mendel Linux 系统。&lt;/p&gt;
&lt;h2 id=&#34;第一步连接到开发板串行控制台&#34;&gt;第一步：连接到开发板串行控制台&lt;/h2&gt;&lt;h3 id=&#34;安装-usb-转-uart-bridge-vcp-驱动程序&#34;&gt;安装 USB 转 UART Bridge VCP 驱动程序&lt;/h3&gt;&lt;p&gt;官方下载地址：&lt;a href=&#34;https://www.silabs.com/developers/usb-to-uart-bridge-vcp-drivers?tab=downloads&#34;&gt;https://www.silabs.com/developers/usb-to-uart-bridge-vcp-drivers?tab=downloads&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;CP210x VCP&#34; loading=&#34;lazy&#34; src=&#34;https://s2.loli.net/2023/07/25/5n7sKqk1ValvcFR.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;下载完成后，双击运行并安装即可。&lt;/p&gt;
&lt;h3 id=&#34;安装辅助程序&#34;&gt;安装辅助程序&lt;/h3&gt;&lt;p&gt;通过 Homebrew 安装：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo brew install screen fastboot
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;连接开发板&#34;&gt;连接开发板&lt;/h3&gt;&lt;p&gt;先不给开发板供电，使用 micro-B USB 线将 Mac 连接到开发板。连接成功后会开发板会亮起绿色🟩和橙色🟧指示灯。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;micro USB&#34; loading=&#34;lazy&#34; src=&#34;https://s2.loli.net/2023/07/26/8miISKlWOMy149J.jpg&#34;&gt;&lt;/p&gt;
&lt;p&gt;随后使用命令查看串口连接是否正常工作：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ls /dev/cu*
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;连接正常应该会列出&lt;code&gt;/dev/cu.SLAB_USBtoUART&lt;/code&gt;，如下图所示。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;ls /dev/cu*&#34; loading=&#34;lazy&#34; src=&#34;https://s2.loli.net/2023/07/26/yafnbF9HUe8DQqT.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;然后使用&lt;code&gt;screen&lt;/code&gt;命令连接开发板串行命令行：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;screen /dev/cu.SLAB_USBtoUART &lt;span class=&#34;m&#34;&gt;115200&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;此时命令行应为空白，因为开发板未供电开机。&lt;/p&gt;
&lt;h3 id=&#34;给开发板供电&#34;&gt;给开发板供电&lt;/h3&gt;&lt;p&gt;如图所示，将开发板电源插入，电源接口为右边的 USB-C 接口。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;Power&#34; loading=&#34;lazy&#34; src=&#34;https://s2.loli.net/2023/07/26/sHYdWNjafQCeTwl.jpg&#34;&gt;&lt;/p&gt;
&lt;p&gt;连接后开发板会亮起电源指示灯并转动风扇。串行命令行则会打印开发板的开机信息：&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;Coral Dev Board power on&#34; loading=&#34;lazy&#34; src=&#34;https://s2.loli.net/2023/07/26/h8JnuNpzWBsG25I.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;接着在串行命令行输入命令使开发板进入 fastboot 模式：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;fastboot &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img alt=&#34;fastboot 0&#34; loading=&#34;lazy&#34; src=&#34;https://s2.loli.net/2023/07/26/owkygYAm5JTUxjt.png&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;第二步刷入-mendel-linux-系统&#34;&gt;第二步：刷入 Mendel Linux 系统&lt;/h2&gt;&lt;h3 id=&#34;下载-mendel-linux-系统镜像&#34;&gt;下载 Mendel Linux 系统镜像&lt;/h3&gt;&lt;p&gt;回到 Mac，下载 Mendel Linux 系统镜像，官方下载地址：&lt;a href=&#34;https://coral.ai/software/#mendel-dev-board&#34;&gt;https://coral.ai/software/#mendel-dev-board&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>SSH 远程连接后解决 No protocol specified 指南</title>
      <link>https://blog.cassdev.com/posts/ssh-%E8%BF%9C%E7%A8%8B%E8%BF%9E%E6%8E%A5%E5%90%8E%E8%A7%A3%E5%86%B3-no-protocol-specified-%E6%8C%87%E5%8D%97/</link>
      <pubDate>Sun, 16 Jun 2024 11:20:31 +0800</pubDate>
      <guid>https://blog.cassdev.com/posts/ssh-%E8%BF%9C%E7%A8%8B%E8%BF%9E%E6%8E%A5%E5%90%8E%E8%A7%A3%E5%86%B3-no-protocol-specified-%E6%8C%87%E5%8D%97/</guid>
      <description>&lt;p&gt;参考链接：https://unix.stackexchange.com/questions/209746/how-to-resolve-no-protocol-specified-for-su-user&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;CleanShot 2023-09-27 at 02.08.27@2x&#34; loading=&#34;lazy&#34; src=&#34;https://s2.loli.net/2023/09/27/jhPz5KiALJke7NF.png&#34;&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Ubuntu Neovim 安装和配置指南</title>
      <link>https://blog.cassdev.com/posts/ubuntu-neovim-%E5%AE%89%E8%A3%85%E5%92%8C%E9%85%8D%E7%BD%AE%E6%8C%87%E5%8D%97/</link>
      <pubDate>Sun, 16 Jun 2024 11:20:31 +0800</pubDate>
      <guid>https://blog.cassdev.com/posts/ubuntu-neovim-%E5%AE%89%E8%A3%85%E5%92%8C%E9%85%8D%E7%BD%AE%E6%8C%87%E5%8D%97/</guid>
      <description>&lt;h2 id=&#34;安装&#34;&gt;安装&lt;/h2&gt;&lt;p&gt;不建议使用&lt;code&gt;apt&lt;/code&gt;安装，因为&lt;code&gt;apt&lt;/code&gt;安装的版本总是不是最新版。一些neovim插件依赖于高版本的neovim，因此使用apt安装可能会导致一些插件无法正常使用。&lt;/p&gt;
&lt;p&gt;下面介绍安装最新版neovim的方法。&lt;/p&gt;
&lt;p&gt;下载安装压缩包：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;wget https://github.com/neovim/neovim/releases/latest/download/nvim-linux64.tar.gz
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;安装：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;tar xzvf nvim-linux64.tar.gz
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cp ./nvim-linux64/bin/nvim /usr/bin/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;测试：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;nvim -v
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img alt=&#34;CleanShot 2023-12-31 at 15.15.57@2x&#34; loading=&#34;lazy&#34; src=&#34;https://s2.loli.net/2023/12/31/SlKxdfWtwNFCOzy.png&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;nvim配置&#34;&gt;nvim配置&lt;/h2&gt;&lt;h3 id=&#34;核心配置&#34;&gt;核心配置&lt;/h3&gt;&lt;p&gt;配置 nvim 需要先创建配置文件的文件夹。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt; ~
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mkdir -r .config/nvim
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt; .config/nvim
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;nvim 使用 lua 语言作为配置文件语言，新建 init.lua，该文件是 nvim 的配置的入口。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;touch init.lua
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;模块化配置&#34;&gt;模块化配置&lt;/h3&gt;&lt;p&gt;nvim 支持模块化配置，所以可以在 nvim 文件夹下创建多个配置模块：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mkdir -r lua/core
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt; lua/core
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;core 文件夹存放 nvim 的核心配置，例如 nvim 基础配置（options.lua）和快捷键配置（keymaps）：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;touch options.lua keymaps.lua
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;此时，neovim 的配置文件结构如下所示：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;~
`--.config
   `-- nvim
       |-- init.lua
       |-- lua
       |   |-- core
       |   |   |-- keymaps.lua
       |   |   `-- options.lua
       |   `-- plugins
       |       `-- plugins-setup.lua
       `-- plugin
           `-- packer_compiled.lua
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;回到 init.lua 文件，在 init.lua 中调用刚刚新建的两个模块：&lt;/p&gt;</description>
    </item>
    <item>
      <title>Ubuntu 配置开机自动挂载三星 T7 固态硬盘指南</title>
      <link>https://blog.cassdev.com/posts/ubuntu-%E9%85%8D%E7%BD%AE%E5%BC%80%E6%9C%BA%E8%87%AA%E5%8A%A8%E6%8C%82%E8%BD%BD%E4%B8%89%E6%98%9F-t7-%E5%9B%BA%E6%80%81%E7%A1%AC%E7%9B%98%E6%8C%87%E5%8D%97/</link>
      <pubDate>Sun, 16 Jun 2024 11:20:31 +0800</pubDate>
      <guid>https://blog.cassdev.com/posts/ubuntu-%E9%85%8D%E7%BD%AE%E5%BC%80%E6%9C%BA%E8%87%AA%E5%8A%A8%E6%8C%82%E8%BD%BD%E4%B8%89%E6%98%9F-t7-%E5%9B%BA%E6%80%81%E7%A1%AC%E7%9B%98%E6%8C%87%E5%8D%97/</guid>
      <description>&lt;h2 id=&#34;连接硬盘&#34;&gt;连接硬盘&lt;/h2&gt;&lt;p&gt;先将硬盘与主机相连接，然后运行&lt;code&gt;fdisk&lt;/code&gt;命令查看系统的硬盘分区。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo fdisk -l
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img alt=&#34;fdisk -l&#34; loading=&#34;lazy&#34; src=&#34;https://s2.loli.net/2023/10/19/kvu6H917eayRX3Y.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;找到自己连接的硬盘，一般为&lt;code&gt;/dev/sda1&lt;/code&gt;。&lt;/p&gt;
&lt;h2 id=&#34;查看硬盘uuid&#34;&gt;查看硬盘UUID&lt;/h2&gt;&lt;p&gt;运行命令&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo blkid
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img alt=&#34;blkid&#34; loading=&#34;lazy&#34; src=&#34;https://s2.loli.net/2023/10/19/WTeys8u3ElFNxf2.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;找到自己硬盘的 UUID 和 TYPE，记录下它们。三星 T7 硬盘默认为兼容性较好的 exfat 格式。&lt;/p&gt;
&lt;h2 id=&#34;配置开机自动挂载&#34;&gt;配置开机自动挂载&lt;/h2&gt;&lt;p&gt;接着修改系统&lt;code&gt;/etc/fstab&lt;/code&gt;文件。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;vim /etc/fstab
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在文件最后添加一行：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;UUID=C65A-E9E1 ~/disk exfat defaults,nofail,utf8,dmask=022,fmask=133 0 0
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;内容格式为：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;UUID=&amp;lt;UUID&amp;gt; &amp;lt;挂载目录&amp;gt; &amp;lt;硬盘格式&amp;gt; &amp;lt;挂载参数&amp;gt; &amp;lt;是否自动备份&amp;gt; &amp;lt;开机是否自检&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;挂载参数中可以设置：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;defauls&lt;/code&gt;：默认挂载参数；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;dmask=&lt;/code&gt;：目录的默认权限；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;fmask=&lt;/code&gt;：文件的默认权限；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;uid=&lt;/code&gt;：挂载硬盘的用户id；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;gid=&lt;/code&gt;：挂载硬盘的组id；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;utf8&lt;/code&gt;：字符编码；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;nofail&lt;/code&gt;：错误忽略，如果硬盘不存在依然正常开机。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;设置完毕后保存并退出文件。&lt;/p&gt;
&lt;h2 id=&#34;重启-ubuntu&#34;&gt;重启 Ubuntu&lt;/h2&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo reboot
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;重启后将自动挂载硬盘到指定目录。&lt;/p&gt;</description>
    </item>
    <item>
      <title>VS Code Clang 语法格式化配置</title>
      <link>https://blog.cassdev.com/posts/vs-code-clang-%E8%AF%AD%E6%B3%95%E6%A0%BC%E5%BC%8F%E5%8C%96%E9%85%8D%E7%BD%AE/</link>
      <pubDate>Sun, 16 Jun 2024 11:20:31 +0800</pubDate>
      <guid>https://blog.cassdev.com/posts/vs-code-clang-%E8%AF%AD%E6%B3%95%E6%A0%BC%E5%BC%8F%E5%8C%96%E9%85%8D%E7%BD%AE/</guid>
      <description>&lt;p&gt;待优化！&lt;/p&gt;
&lt;p&gt;基于 Visual Studio&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;err&#34;&gt;IndentWidth:&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;4,&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;err&#34;&gt;IndentCaseLabels:&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;true,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;err&#34;&gt;ColumnLimit:&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;120,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;err&#34;&gt;NamespaceIndentation:&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;All,&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;err&#34;&gt;IndentAccessModifiers:&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;false,&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;err&#34;&gt;AccessModifierOffset:&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;-4,&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;err&#34;&gt;AlignTrailingComments:&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;true,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;err&#34;&gt;AlwaysBreakTemplateDeclarations:&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;IndentWidth: 缩进4格&lt;/li&gt;
&lt;li&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
    </item>
    <item>
      <title>VS Code 设置网络代理指南</title>
      <link>https://blog.cassdev.com/posts/vs-code-%E8%AE%BE%E7%BD%AE%E7%BD%91%E7%BB%9C%E4%BB%A3%E7%90%86%E6%8C%87%E5%8D%97/</link>
      <pubDate>Sun, 16 Jun 2024 11:20:31 +0800</pubDate>
      <guid>https://blog.cassdev.com/posts/vs-code-%E8%AE%BE%E7%BD%AE%E7%BD%91%E7%BB%9C%E4%BB%A3%E7%90%86%E6%8C%87%E5%8D%97/</guid>
      <description>&lt;p&gt;当你使用 VS Code 时，有时你可能需要配置网络代理来访问特定的网络资源（魔法）。&lt;/p&gt;
&lt;p&gt;例如在局域网远程开发时使用 GitHub Copilot Chat 插件并且远程主机无魔法时就可以进行配置网络代理。&lt;/p&gt;
&lt;h2 id=&#34;配置教程&#34;&gt;配置教程&lt;/h2&gt;&lt;p&gt;打开设置，搜索 proxy 找到 Http: Proxy，填入代理地址即可。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;VSCode Proxy&#34; loading=&#34;lazy&#34; src=&#34;https://s2.loli.net/2023/06/30/tQqCS5XvzgmLbFK.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;注意在远程开发时只能设置远程主机的Http代理，无法设置 VS Code 本机的网络代理。&lt;/p&gt;</description>
    </item>
    <item>
      <title>YOLO 目标检测算法学习笔记（二）</title>
      <link>https://blog.cassdev.com/posts/yolo-%E7%9B%AE%E6%A0%87%E6%A3%80%E6%B5%8B%E7%AE%97%E6%B3%95%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0%E4%BA%8C/</link>
      <pubDate>Sun, 16 Jun 2024 11:20:31 +0800</pubDate>
      <guid>https://blog.cassdev.com/posts/yolo-%E7%9B%AE%E6%A0%87%E6%A3%80%E6%B5%8B%E7%AE%97%E6%B3%95%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0%E4%BA%8C/</guid>
      <description>&lt;p&gt;可以说，YOLO各代升级的改进点都是提升检测效果mAP和速度FPS。&lt;/p&gt;
&lt;h2 id=&#34;precision精度与recall召回率&#34;&gt;Precision精度与Recall召回率&lt;/h2&gt;&lt;p&gt;要计算精度与召回率（查全率），我们需要先了解四个值：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;TP（True Positives）&lt;/li&gt;
&lt;li&gt;FP（False Positives）&lt;/li&gt;
&lt;li&gt;FN（False Negatives）&lt;/li&gt;
&lt;li&gt;TN（True Negatives）&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th style=&#34;text-align: left&#34;&gt;&lt;/th&gt;
          &lt;th style=&#34;text-align: left&#34;&gt;相关（Relevant），正类&lt;/th&gt;
          &lt;th&gt;无关（NonRelevant），负类&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;被检索到（Retrieved）&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;TP，正类判定为正类。&lt;/td&gt;
          &lt;td&gt;FP，负类判定为正类&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;strong&gt;未被检索到（Not Retrieved）&lt;/strong&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;FN，正类判定为负类&lt;/td&gt;
          &lt;td&gt;TN，负类判断为负类&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;记忆方法&#34;&gt;记忆方法&lt;/h3&gt;&lt;p&gt;我们只需要记住这里面的四个单词的中文意思方可推断出四个值的含义。True 正确的、False 错误的、Positives 正类以及 Negatives 负类。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;True Positives（&amp;#x2795;&amp;#x2795;）——正确的判断为正类，即将正类判定为正类。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;False Positives（&amp;#x2796;&amp;#x2795;）——错误的判定为正类，即将负类判定为正类。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;False Negatives（&amp;#x2795;&amp;#x2796;）——错误的判定为负类，即将正类判定为正类。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;True Negatives（&amp;#x2796;&amp;#x2796;）——正确的判定为负类，即将负类判定为负类。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;计算公式&#34;&gt;计算公式&lt;/h3&gt;&lt;p&gt;$$
Precision = \frac{TP}{TP+FP}
$$&lt;/p&gt;
&lt;p&gt;$$
Recall = \frac{TP}{TP + FN}
$$&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;IMG_4784&#34; loading=&#34;lazy&#34; src=&#34;https://s2.loli.net/2023/08/28/DLUk8I91clvCbwd.jpg&#34;&gt;&lt;/p&gt;
&lt;p&gt;为了方便理解，我画了一个草图，以格子为单位。其中蓝色框代表实际值，橙色框代表预测值。&lt;/p&gt;
&lt;p&gt;真正的正类（蓝色框内）共20个格子，真正的负类（蓝色框外）共10个格子。判定的正类（橙色框内），判定的负类（橙色框外）&lt;/p&gt;
&lt;p&gt;TP值（正确的判断为正类），真正的正类与判定的正类的交集，即涂黄色的格子，共9个格子。&lt;/p&gt;
&lt;p&gt;FP值（错误的判定为正类），真正的负类与判定的正类的交集，即涂绿色的格子，共6个格子。&lt;/p&gt;
&lt;p&gt;FN值（错误的判定为负类），真正的正类与判定的负类的交集，即涂蓝色的格子，共11个格子。&lt;/p&gt;
&lt;p&gt;TN值（正确的判定为负类），真正的负类与判定的负类的交集，即涂红色的格子，共4个格子。&lt;/p&gt;
&lt;h3 id=&#34;例子&#34;&gt;例子&lt;/h3&gt;&lt;p&gt;已知条件：班级总人数100人，其中男生80人，女生20人。
目标：找出所有的女生。
结果：从班级中选择了50人，其中20人是女生，还错误的把30名男生挑选出来了。&lt;/p&gt;
&lt;p&gt;TP = 20; FP = 30; FN = 0; TN = 50&lt;/p&gt;
&lt;h2 id=&#34;map指标&#34;&gt;mAP指标&lt;/h2&gt;&lt;p&gt;目标检测不可单看精度（Precision）或召回率（Recall），因为两者为此消彼长的关系。所以需要一个新的指标用于综合的衡量目标检测的效果。&lt;/p&gt;
&lt;p&gt;mAP（mean Average Precision）指标，又名全类平均精度，用于综合衡量目标检测的效果。&lt;/p&gt;</description>
    </item>
    <item>
      <title>YOLO 目标检测算法学习笔记（三）</title>
      <link>https://blog.cassdev.com/posts/yolo-%E7%9B%AE%E6%A0%87%E6%A3%80%E6%B5%8B%E7%AE%97%E6%B3%95%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0%E4%B8%89/</link>
      <pubDate>Sun, 16 Jun 2024 11:20:31 +0800</pubDate>
      <guid>https://blog.cassdev.com/posts/yolo-%E7%9B%AE%E6%A0%87%E6%A3%80%E6%B5%8B%E7%AE%97%E6%B3%95%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0%E4%B8%89/</guid>
      <description>&lt;h2 id=&#34;yolo-v1&#34;&gt;YOLO-V1&lt;/h2&gt;&lt;p&gt;YOLO，全称 You Only Look Once。名字已经说明了一切！&lt;/p&gt;
&lt;p&gt;YOLO 这是一个经典的 one-stage 方法，把检测问题转换为回归问题，一个CNN就可以搞定。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;YOLO-V1 mAP&#34; loading=&#34;lazy&#34; src=&#34;https://s2.loli.net/2023/08/30/UHC9IP5gSdZfolr.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;YOLO 相比于 Faster R-CNN 虽然在 mAP 值上略逊一筹，但其 FPS 值是远远高于 Faster R-CNN 的，因此2016年的时，YOLO爆火。&lt;/p&gt;
&lt;h2 id=&#34;核心思想&#34;&gt;核心思想&lt;/h2&gt;&lt;p&gt;&lt;img alt=&#34;YOLO 核心思想&#34; loading=&#34;lazy&#34;&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;将输入图像分割成 SxS 个网格（如7x7），每个网格负责检测本身区域是否含有物体。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;每个网格会预测 B 个边界框（在YOLO-V1中，B值等于2），边界框由四个变量表示 x、y、w、h，以及每个边界框的置信度，置信度用 c 表示。置信度表示边界框包含物体的概率。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;过滤掉置信度低的边界框。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;由于整个检测只需要一个前向传播，没有区域提议生成候选框的过程，所以速度非常快。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;网络架构&#34;&gt;网络架构&lt;/h2&gt;&lt;p&gt;&lt;img alt=&#34;YOLO 网络架构&#34; loading=&#34;lazy&#34;&gt;&lt;/p&gt;
&lt;p&gt;将输入图像（在YOLO-V1中限制了输入图像的大小）进行通过卷积神经网络进行特征提取，获得 7x7x1024 的特征图，再进入全连接层，得到 1470 个特征，随后 Reshape 成 7x7x30 的特征图。&lt;/p&gt;
&lt;p&gt;下面解释一下 7x7x30 的含义。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;7x7  表示输入图像最后分割的网格大小。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;30 分为 5+5+20，其中前两个5代表两个边界框的 x、y、w、h和c；最后的20表示当前格子属于数据集中的各个类别的概率。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;注意，这里三个值都不是固定不变的，会由于YOLO版本的更新和训练数据集的变化而改变。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;YOLO 网络架构简化&#34; loading=&#34;lazy&#34; src=&#34;https://s2.loli.net/2023/08/30/3iVITLdxk4RA5Hf.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;总结一下 ，如上图所示，输入图像最后会被分割成许多个网格，每个网格都包含了若干值。&lt;/p&gt;
&lt;p&gt;S：网格边长；B：预测边界框数量；C：数据集中的类别个数。
$$
(S * S) * (B * 5 + C)
$$&lt;/p&gt;</description>
    </item>
    <item>
      <title>YOLO 目标检测算法学习笔记（四）</title>
      <link>https://blog.cassdev.com/posts/yolo-%E7%9B%AE%E6%A0%87%E6%A3%80%E6%B5%8B%E7%AE%97%E6%B3%95%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0%E5%9B%9B/</link>
      <pubDate>Sun, 16 Jun 2024 11:20:31 +0800</pubDate>
      <guid>https://blog.cassdev.com/posts/yolo-%E7%9B%AE%E6%A0%87%E6%A3%80%E6%B5%8B%E7%AE%97%E6%B3%95%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0%E5%9B%9B/</guid>
      <description>&lt;h2 id=&#34;yolo-v2&#34;&gt;YOLO-V2&lt;/h2&gt;&lt;p&gt;下图为YOLO-V2相较于YOLO-V1的改进点，以及改进后 mAP 值的变化。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;YOLO-V2&#34; loading=&#34;lazy&#34; src=&#34;https://s2.loli.net/2023/08/30/CmvK9W1bdpauPtR.png&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;batch-normalization&#34;&gt;Batch Normalization&lt;/h2&gt;&lt;p&gt;V2 版本舍弃了 Dropout，不再有全连接层（Fully connected layers，FC）。每次卷积后都加入 Batch Normalization，对网络的每一层的输入都进行归一化，使收敛更容易。&lt;/p&gt;
&lt;p&gt;经过 Batch Normalization 处理后的网络会提升2%的mAP值。&lt;/p&gt;
&lt;p&gt;从现在的角度来看，Batch Normatlization 已经称为卷积神经网络处理必备处理了。&lt;/p&gt;
&lt;h2 id=&#34;high-resolution-classifier&#34;&gt;High Resolution Classifier&lt;/h2&gt;&lt;p&gt;High Resolution Classifier，即高分辨率分类器，高分辨率分类器。&lt;/p&gt;
&lt;p&gt;在 V1 版本，训练时用的是224*224分辨率的图片，测试时又使用448*448分辨率的图片，这会导致模型“水土不服”。&lt;/p&gt;
&lt;p&gt;针对这一问题，V2 版本在模型训练时额外进行了10次448*448的微调。经过微调后，V2 版本的 mAP 值提升了约4%。&lt;/p&gt;
&lt;h2 id=&#34;convolutional&#34;&gt;Convolutional&lt;/h2&gt;</description>
    </item>
    <item>
      <title>YOLO 目标检测算法学习笔记（一）</title>
      <link>https://blog.cassdev.com/posts/yolo-%E7%9B%AE%E6%A0%87%E6%A3%80%E6%B5%8B%E7%AE%97%E6%B3%95%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0%E4%B8%80/</link>
      <pubDate>Sun, 16 Jun 2024 11:20:31 +0800</pubDate>
      <guid>https://blog.cassdev.com/posts/yolo-%E7%9B%AE%E6%A0%87%E6%A3%80%E6%B5%8B%E7%AE%97%E6%B3%95%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0%E4%B8%80/</guid>
      <description>&lt;h2 id=&#34;深度学习经典检测方法&#34;&gt;深度学习经典检测方法&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;one-stage（单阶段）：YOLO系列&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;two-stage（双阶段）：Faster-Rcnn、Mask-Rcnn系列&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt=&#34;深度学习经典检测方法&#34; loading=&#34;lazy&#34; src=&#34;https://s2.loli.net/2023/08/28/mX5t61TwqAR3nHB.png&#34;&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Faster-Rcnn：物体检测开山之作。&lt;/p&gt;&lt;/blockquote&gt;
&lt;h2 id=&#34;one-stage-单阶段检测&#34;&gt;one-stage 单阶段检测&lt;/h2&gt;&lt;p&gt;优势：速度快，适合做实时检测任务。&lt;/p&gt;
&lt;p&gt;缺点：效果不佳。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;one-stage 单阶段检测&#34; loading=&#34;lazy&#34; src=&#34;https://s2.loli.net/2023/08/28/rFkyvMngZcAJPDo.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;目标检测的两个主要指标：mAP和FPS。&lt;/p&gt;
&lt;p&gt;mAP：检测效果的综合指标。（mAP值越大效果越好）&lt;/p&gt;
&lt;h2 id=&#34;two-stage-双阶段检测&#34;&gt;two-stage 双阶段检测&lt;/h2&gt;&lt;p&gt;优势：效果较好。&lt;/p&gt;
&lt;p&gt;缺点：速度较慢、不适合用于视频流的实时检测。&lt;/p&gt;
&lt;p&gt;Mask-Rcnn是一个非常实用的通用框架（建议了解）。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;two-stage 双阶段检测&#34; loading=&#34;lazy&#34; src=&#34;https://s2.loli.net/2023/08/28/qcefLK8pBjFnsMa.png&#34;&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>基于 L2CAP 协议的蓝牙 BLE 设备通信指南</title>
      <link>https://blog.cassdev.com/posts/%E5%9F%BA%E4%BA%8E-l2cap-%E5%8D%8F%E8%AE%AE%E7%9A%84%E8%93%9D%E7%89%99-ble-%E8%AE%BE%E5%A4%87%E9%80%9A%E4%BF%A1%E6%8C%87%E5%8D%97/</link>
      <pubDate>Sun, 16 Jun 2024 11:20:31 +0800</pubDate>
      <guid>https://blog.cassdev.com/posts/%E5%9F%BA%E4%BA%8E-l2cap-%E5%8D%8F%E8%AE%AE%E7%9A%84%E8%93%9D%E7%89%99-ble-%E8%AE%BE%E5%A4%87%E9%80%9A%E4%BF%A1%E6%8C%87%E5%8D%97/</guid>
      <description>&lt;h2 id=&#34;蓝牙-ble-是什么&#34;&gt;蓝牙 BLE 是什么&lt;/h2&gt;&lt;p&gt;蓝牙BLE，即蓝牙低功耗 （Bluetooth Lower Energy）是一种蓝牙通信标准，设计用于短距离通信和低功耗应用。&lt;/p&gt;
&lt;p&gt;相比经典蓝牙，BLE 更加节能，传输距离更远，连接更快。BLE 主要用于健身设备、医疗设备、家居自动化等场景。&lt;/p&gt;
&lt;h2 id=&#34;蓝牙-ble-设备的连接&#34;&gt;蓝牙 BLE 设备的连接&lt;/h2&gt;&lt;h2 id=&#34;信道&#34;&gt;信道&lt;/h2&gt;&lt;p&gt;L2CAP的基本概念是信道（Signaling Channel）。信道是个抽象概念，表示两个设备某个协议层之间的通道。每个信道分配一个2字节的信道ID——CID（Channel ID），每个信道功用不同，比如CID=0x0004的信道表示属性协议（Attribute Protocol）专用信道。对于BLE协议，L2CAP共有三个信道ID：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;0x0004 – 属性协议&lt;/li&gt;
&lt;li&gt;0x0005 – 低功耗信令信道&lt;/li&gt;
&lt;li&gt;0x0006 – 安全管理协议&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;其他信道则用于经典蓝牙。协议复用可以理解为，不同的协议走不同的信道，互不干扰。&lt;/p&gt;
&lt;h2 id=&#34;代码&#34;&gt;代码&lt;/h2&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-c++&#34; data-lang=&#34;c++&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;#define ATT_CID 4;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// 创建 L2CAP socket
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;s&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;socket&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;PF_BLUETOOTH&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;SOCK_SEQPACKET&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;BTPROTO_L2CAP&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// 绑定 L2CAP socket
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;struct&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;sockaddr_l2&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;bind_addr&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;bind_addr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;l2_family&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;AF_BLUETOOTH&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;bind_addr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;l2_cid&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;htobs&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ATT_CID&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;// ATT 信道 CID
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;bdaddr_t&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;any_addr&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{{&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;bacpy&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;bind_addr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;l2_bdaddr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;any_addr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;bind_addr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;l2_bdaddr_type&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;BDADDR_LE_PUBLIC&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;err&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;bind&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;struct&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;sockaddr&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;bind_addr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;sizeof&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;bind_addr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;));&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;err&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// 连接 L2CAP socket
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;struct&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;sockaddr_l2&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;conn_addr&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;conn_addr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;l2_family&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;AF_BLUETOOTH&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;conn_addr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;l2_cid&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;htobs&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ATT_CID&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;// ATT CID
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;str2ba&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;mac_address&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;c_str&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(),&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;conn_addr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;l2_bdaddr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;conn_addr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;l2_bdaddr_type&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;BDADDR_LE_PUBLIC&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;err&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;connect&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;struct&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;sockaddr&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;conn_addr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;sizeof&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;conn_addr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;));&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;err&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;n&#34;&gt;exit&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;l2cap-数据包解析&#34;&gt;L2CAP 数据包解析&lt;/h2&gt;&lt;p&gt;L2CAP（Logical Linked Control and Adaptation Protocol 逻辑链路控制与适配协议）工作在链路层,为上层协议提供数据通道。它支持数据分片与重组,确保数据完整可靠地传输。&lt;/p&gt;</description>
    </item>
    <item>
      <title>解决VScode远程开发C&#43;&#43;项目时无代码提示问题</title>
      <link>https://blog.cassdev.com/posts/%E8%A7%A3%E5%86%B3vscode%E8%BF%9C%E7%A8%8B%E5%BC%80%E5%8F%91c&#43;&#43;%E9%A1%B9%E7%9B%AE%E6%97%B6%E6%97%A0%E4%BB%A3%E7%A0%81%E6%8F%90%E7%A4%BA%E9%97%AE%E9%A2%98/</link>
      <pubDate>Sun, 16 Jun 2024 11:20:31 +0800</pubDate>
      <guid>https://blog.cassdev.com/posts/%E8%A7%A3%E5%86%B3vscode%E8%BF%9C%E7%A8%8B%E5%BC%80%E5%8F%91c&#43;&#43;%E9%A1%B9%E7%9B%AE%E6%97%B6%E6%97%A0%E4%BB%A3%E7%A0%81%E6%8F%90%E7%A4%BA%E9%97%AE%E9%A2%98/</guid>
      <description>&lt;p&gt;简单粗暴，给本地主机和远程主机都安装上C/C++插件即可。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;C/C++ Plugin&#34; loading=&#34;lazy&#34; src=&#34;https://s2.loli.net/2023/06/21/eBLlkS63OX2roTV.png&#34;&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>三维重建笔记——从变换矩阵中提取并分析平移量</title>
      <link>https://blog.cassdev.com/posts/%E4%B8%89%E7%BB%B4%E9%87%8D%E5%BB%BA%E7%AC%94%E8%AE%B0%E4%BB%8E%E5%8F%98%E6%8D%A2%E7%9F%A9%E9%98%B5%E4%B8%AD%E6%8F%90%E5%8F%96%E5%B9%B6%E5%88%86%E6%9E%90%E5%B9%B3%E7%A7%BB%E9%87%8F/</link>
      <pubDate>Sun, 16 Jun 2024 11:20:31 +0800</pubDate>
      <guid>https://blog.cassdev.com/posts/%E4%B8%89%E7%BB%B4%E9%87%8D%E5%BB%BA%E7%AC%94%E8%AE%B0%E4%BB%8E%E5%8F%98%E6%8D%A2%E7%9F%A9%E9%98%B5%E4%B8%AD%E6%8F%90%E5%8F%96%E5%B9%B6%E5%88%86%E6%9E%90%E5%B9%B3%E7%A7%BB%E9%87%8F/</guid>
      <description>&lt;p&gt;在编写点云变换和姿态估计代码时，我们经常需要从结果的变换矩阵中提取平移信息，并分析平移量的大小，帮助判断结果的准确性。&lt;/p&gt;
&lt;p&gt;本文将介绍如何从变换矩阵中提取平移向量，并计算其欧几里得长度。&lt;/p&gt;
&lt;h2 id=&#34;提取平移向量&#34;&gt;提取平移向量&lt;/h2&gt;&lt;p&gt;假设我们通过某种姿态估计算法得到了一个4x4的变换矩阵 result.transformation_ ,其中包含了旋转和平移信息。&lt;/p&gt;
&lt;p&gt;我们可以通过以下代码提取出平移部分:（以Open3D为例）&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-c++&#34; data-lang=&#34;c++&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;core&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Tensor&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;translation&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;result&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;transformation_&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Slice&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;).&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Slice&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;4&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;Slice(0,0,3);&lt;/code&gt;表示从矩阵的第0维(行)，第0行开始，取3行，即前3行；&lt;code&gt;Slice(1,3,4);&lt;/code&gt;表示从矩阵的第1维(列)，第3列开始，取1列，即第4列。
最后获得一个3x1的平移向量，包含x、y、z三个方向的平移量。&lt;/p&gt;
&lt;h2 id=&#34;计算欧几里得长度&#34;&gt;计算欧几里得长度&lt;/h2&gt;&lt;p&gt;有了平移向量后,我们可以计算其欧几里得长度,表示平移量的大小:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-c++&#34; data-lang=&#34;c++&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kt&#34;&gt;double&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;translation_norm&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;std&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sqrt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;((&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;translation&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;translation&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;).&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Sum&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;({&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}).&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Item&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;double&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;());&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;std::sqrt&lt;/code&gt;计算平方根，&lt;code&gt;translation * translation&lt;/code&gt; 计算向量每个元素的平方，&lt;code&gt;Sum&lt;/code&gt; 聚合，最终得到平移向量的L2范数，即&lt;strong&gt;欧几里得长度&lt;/strong&gt;。&lt;/p&gt;
&lt;h2 id=&#34;分析平移量&#34;&gt;分析平移量&lt;/h2&gt;&lt;p&gt;通过提取并计算平移向量的模长，我们可以分析相机或物体的移动距离，以及姿态估计结果的准确性。&lt;/p&gt;
&lt;p&gt;如果 translation_norm 的值过大，可能表示估计存在误差，需要反复优化算法。&lt;/p&gt;
&lt;p&gt;设置不同的阈值可以根据实际场景需求，判断平移量是否在允许的范围内。&lt;/p&gt;
&lt;p&gt;以上是从变换矩阵中提取和利用平移信息的简单示例，可以提供点云变换和姿态估计任务有用的辅助分析。&lt;/p&gt;</description>
    </item>
    <item>
      <title>通过 frp 内网穿透实现异地 SSH 连接（反向代理）</title>
      <link>https://blog.cassdev.com/posts/%E9%80%9A%E8%BF%87-frp-%E5%86%85%E7%BD%91%E7%A9%BF%E9%80%8F%E5%AE%9E%E7%8E%B0%E5%BC%82%E5%9C%B0-ssh-%E8%BF%9E%E6%8E%A5%E5%8F%8D%E5%90%91%E4%BB%A3%E7%90%86/</link>
      <pubDate>Sun, 16 Jun 2024 11:20:31 +0800</pubDate>
      <guid>https://blog.cassdev.com/posts/%E9%80%9A%E8%BF%87-frp-%E5%86%85%E7%BD%91%E7%A9%BF%E9%80%8F%E5%AE%9E%E7%8E%B0%E5%BC%82%E5%9C%B0-ssh-%E8%BF%9E%E6%8E%A5%E5%8F%8D%E5%90%91%E4%BB%A3%E7%90%86/</guid>
      <description>&lt;p&gt;起因是我放假回家，想在家里通过 SSH 连接放在学校的无显示器的 Linux，但是学校的 Linux 是内网，无法直接连接，且无显示器无法使用向日葵等远程桌面软件，所以想到了使用 frp 的反向代理功能实现内网穿透，进而实现异地 SSH 连接。&lt;/p&gt;
&lt;h2 id=&#34;前提&#34;&gt;前提&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;一台具有公网 IP 的服务器（阿里云、腾讯云等）&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;配置远程主机&#34;&gt;配置远程主机&lt;/h2&gt;&lt;p&gt;我们需要有三台主机，分别是：自己的电脑、远程 Linux 主机和具有公网 IP 的服务器。&lt;/p&gt;
&lt;p&gt;只需要在远程 Linux 和具有公网 IP 的服务器上配置 frp 即可。&lt;/p&gt;
&lt;p&gt;首先在远程 Linux 上下载 frp，&lt;a href=&#34;https://github.com/fatedier/frp/releases&#34;&gt;Github 下载地址&lt;/a&gt;。下载远程主机对应的版本，我这里是 ARM64 架构的 Linux，所以下载 &lt;code&gt;frp_0.51.2_linux_arm64.tar.gz&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;frp GitHub&#34; loading=&#34;lazy&#34; src=&#34;https://s2.loli.net/2023/08/01/P5MzmKDEeBjdJF3.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;下载完毕后解压：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;tar -xvf frp_0.51.2_linux_arm64.tar.gz
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt; frp_0.51.2_linux_arm64
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;远程 Linux 为客户端，所以只需要保留 &lt;code&gt;frpc*&lt;/code&gt; 文件即可，&lt;code&gt;frps&lt;/code&gt;可以删除。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;rm frps*
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;修改&lt;code&gt;frpc.ini&lt;/code&gt;，只需要将&lt;code&gt;server_addr&lt;/code&gt;修改为服务器的 IP 地址即可，&lt;code&gt;local_ip&lt;/code&gt;不变。&lt;code&gt;server_port&lt;/code&gt;和&lt;code&gt;remote_port&lt;/code&gt;一般不变，若与其他服务冲突了可以修改。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;vim frpc.ini	&lt;span class=&#34;c1&#34;&gt;#:wq 退出&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img alt=&#34;vim frpc.ini&#34; loading=&#34;lazy&#34; src=&#34;https://s2.loli.net/2023/08/01/r6dks5YSEm9WUXl.png&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;配置服务器&#34;&gt;配置服务器&lt;/h2&gt;&lt;p&gt;同样下载好对应系统版本的 frp，解压后删除&lt;code&gt;frpc*&lt;/code&gt;文件。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;rm frpc*
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;修改&lt;code&gt;frpc.ini&lt;/code&gt;，确保&lt;code&gt;bind_port&lt;/code&gt;与 frpc 客户端，即远程主机的&lt;code&gt;server_port&lt;/code&gt;一致。&lt;/p&gt;
&lt;p&gt;再前往阿里云或腾讯云官网配置服务器防火墙规则，开放服务器的 6000 和 7000 端口（若修改了则开放修改后的端口）。&lt;/p&gt;</description>
    </item>
    <item>
      <title>C&#43;&#43; Copy&amp;Swap 惯用法指南</title>
      <link>https://blog.cassdev.com/posts/c&#43;&#43;-copyswap-%E6%83%AF%E7%94%A8%E6%B3%95%E6%8C%87%E5%8D%97/</link>
      <pubDate>Mon, 15 Jan 2024 10:00:00 +0800</pubDate>
      <guid>https://blog.cassdev.com/posts/c&#43;&#43;-copyswap-%E6%83%AF%E7%94%A8%E6%B3%95%E6%8C%87%E5%8D%97/</guid>
      <description>详细介绍 C&#43;&#43; 中 Copy&amp;amp;Swap 惯用法的实现和优势</description>
    </item>
    <item>
      <title>Jetson (Ubuntu Arm64) 安装 Bazel</title>
      <link>https://blog.cassdev.com/posts/jetson-ubuntu-arm64-%E5%AE%89%E8%A3%85-bazel/</link>
      <pubDate>Wed, 14 Jun 2023 10:00:00 +0800</pubDate>
      <guid>https://blog.cassdev.com/posts/jetson-ubuntu-arm64-%E5%AE%89%E8%A3%85-bazel/</guid>
      <description>本指南帮助 ARM64 架构的 Jetson 安装 Bazel</description>
    </item>
    <item>
      <title>Ubuntu 安装 Protobuf 指南</title>
      <link>https://blog.cassdev.com/posts/ubuntu-%E5%AE%89%E8%A3%85-protobuf/</link>
      <pubDate>Mon, 12 Jun 2023 10:00:00 +0800</pubDate>
      <guid>https://blog.cassdev.com/posts/ubuntu-%E5%AE%89%E8%A3%85-protobuf/</guid>
      <description>本指南将介绍如何在 Ubuntu 上安装 Protobuf。</description>
    </item>
    <item>
      <title>解决 Open3D 同时链接其他库时的 Undefined Reference 错误</title>
      <link>https://blog.cassdev.com/posts/%E8%A7%A3%E5%86%B3-open3d-%E5%90%8C%E6%97%B6%E9%93%BE%E6%8E%A5%E5%85%B6%E4%BB%96%E5%BA%93%E6%97%B6%E7%9A%84-undefined-reference-%E9%94%99%E8%AF%AF/</link>
      <pubDate>Fri, 09 Jun 2023 10:00:00 +0800</pubDate>
      <guid>https://blog.cassdev.com/posts/%E8%A7%A3%E5%86%B3-open3d-%E5%90%8C%E6%97%B6%E9%93%BE%E6%8E%A5%E5%85%B6%E4%BB%96%E5%BA%93%E6%97%B6%E7%9A%84-undefined-reference-%E9%94%99%E8%AF%AF/</guid>
      <description>本文旨在解决C&#43;&#43; Open3D库与其他库冲突问题。</description>
    </item>
    <item>
      <title>Unity 脚本使用 NuGet 安装解决方案包</title>
      <link>https://blog.cassdev.com/posts/unity-%E4%BD%BF%E7%94%A8-nuget-%E5%AE%89%E8%A3%85%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88%E5%8C%85/</link>
      <pubDate>Thu, 01 Jun 2023 10:00:00 +0800</pubDate>
      <guid>https://blog.cassdev.com/posts/unity-%E4%BD%BF%E7%94%A8-nuget-%E5%AE%89%E8%A3%85%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88%E5%8C%85/</guid>
      <description> 本文旨在教大家如何在 Unity 中使用 NuGet 安装解决方案包。</description>
    </item>
    <item>
      <title>垃圾代码书写准则</title>
      <link>https://blog.cassdev.com/posts/%E5%9E%83%E5%9C%BE%E4%BB%A3%E7%A0%81%E4%B9%A6%E5%86%99%E5%87%86%E5%88%99/</link>
      <pubDate>Fri, 21 Apr 2023 10:00:00 +0800</pubDate>
      <guid>https://blog.cassdev.com/posts/%E5%9E%83%E5%9C%BE%E4%BB%A3%E7%A0%81%E4%B9%A6%E5%86%99%E5%87%86%E5%88%99/</guid>
      <description>本文旨在帮助大家在书写垃圾代码</description>
    </item>
    <item>
      <title>Linux 命令行网络连接指南</title>
      <link>https://blog.cassdev.com/posts/linux-%E5%91%BD%E4%BB%A4%E8%A1%8C%E7%BD%91%E7%BB%9C%E8%BF%9E%E6%8E%A5%E6%8C%87%E5%8D%97/</link>
      <pubDate>Fri, 14 Apr 2023 10:00:00 +0800</pubDate>
      <guid>https://blog.cassdev.com/posts/linux-%E5%91%BD%E4%BB%A4%E8%A1%8C%E7%BD%91%E7%BB%9C%E8%BF%9E%E6%8E%A5%E6%8C%87%E5%8D%97/</guid>
      <description>本文旨在为 Linux 用户介绍提供关于使用命令行连接网络的方法。</description>
    </item>
    <item>
      <title>MacOS 修改 App Store 和地图软件语言指南</title>
      <link>https://blog.cassdev.com/posts/macos-%E4%BF%AE%E6%94%B9-app-store-%E5%92%8C%E5%9C%B0%E5%9B%BE%E8%BD%AF%E4%BB%B6%E8%AF%AD%E8%A8%80%E6%8C%87%E5%8D%97/</link>
      <pubDate>Fri, 14 Apr 2023 10:00:00 +0800</pubDate>
      <guid>https://blog.cassdev.com/posts/macos-%E4%BF%AE%E6%94%B9-app-store-%E5%92%8C%E5%9C%B0%E5%9B%BE%E8%BD%AF%E4%BB%B6%E8%AF%AD%E8%A8%80%E6%8C%87%E5%8D%97/</guid>
      <description>本文提供了一种简单的方法，让您能够修改 App Store 和 Maps 的语言设置。</description>
    </item>
    <item>
      <title>MacOS 配置 MASM &#43; DOSBox 汇编环境</title>
      <link>https://blog.cassdev.com/posts/macos-%E9%85%8D%E7%BD%AE-masm-&#43;-dosbox-%E6%B1%87%E7%BC%96%E7%8E%AF%E5%A2%83/</link>
      <pubDate>Wed, 12 Apr 2023 10:00:00 +0800</pubDate>
      <guid>https://blog.cassdev.com/posts/macos-%E9%85%8D%E7%BD%AE-masm-&#43;-dosbox-%E6%B1%87%E7%BC%96%E7%8E%AF%E5%A2%83/</guid>
      <description>该文章旨在帮助在 MacOS 系统下想要学习汇编语言的开发者配置 MASM &#43; DOSBox 环境。</description>
    </item>
    <item>
      <title>基于 Open3D C&#43;&#43; 版实现点云数据的配准、相加和显示</title>
      <link>https://blog.cassdev.com/posts/%E5%9F%BA%E4%BA%8E-open3d-c&#43;&#43;-%E7%89%88%E5%AE%9E%E7%8E%B0%E7%82%B9%E4%BA%91%E6%95%B0%E6%8D%AE%E7%9A%84%E9%85%8D%E5%87%86%E5%92%8C%E7%9B%B8%E5%8A%A0/</link>
      <pubDate>Mon, 10 Apr 2023 10:00:00 +0800</pubDate>
      <guid>https://blog.cassdev.com/posts/%E5%9F%BA%E4%BA%8E-open3d-c&#43;&#43;-%E7%89%88%E5%AE%9E%E7%8E%B0%E7%82%B9%E4%BA%91%E6%95%B0%E6%8D%AE%E7%9A%84%E9%85%8D%E5%87%86%E5%92%8C%E7%9B%B8%E5%8A%A0/</guid>
      <description>本文介绍如何使用 Open3D C&#43;&#43; 库来进行点云的配准、相加和可视化显示。</description>
    </item>
    <item>
      <title>构建 Open3D 官方 Azure Kinect 示例时找不到 AzureKinect*** 的解决方法</title>
      <link>https://blog.cassdev.com/posts/%E6%9E%84%E5%BB%BA-open3d-%E5%AE%98%E6%96%B9-azure-kinect-%E7%A4%BA%E4%BE%8B%E6%97%B6%E6%89%BE%E4%B8%8D%E5%88%B0-azurekinect-%E7%9A%84%E8%A7%A3%E5%86%B3%E6%96%B9%E6%B3%95/</link>
      <pubDate>Sat, 08 Apr 2023 10:00:00 +0800</pubDate>
      <guid>https://blog.cassdev.com/posts/%E6%9E%84%E5%BB%BA-open3d-%E5%AE%98%E6%96%B9-azure-kinect-%E7%A4%BA%E4%BE%8B%E6%97%B6%E6%89%BE%E4%B8%8D%E5%88%B0-azurekinect-%E7%9A%84%E8%A7%A3%E5%86%B3%E6%96%B9%E6%B3%95/</guid>
      <description>此文章旨在帮助解决C&#43;&#43;版Open3D编译时找不到AzureKinect相关函数的问题。</description>
    </item>
    <item>
      <title>在 Chrome 中解锁 New Bing（Bing AI）</title>
      <link>https://blog.cassdev.com/posts/%E5%9C%A8-chrome-%E4%B8%AD%E8%A7%A3%E9%94%81-new-bingbing-ai/</link>
      <pubDate>Sat, 08 Apr 2023 10:00:00 +0800</pubDate>
      <guid>https://blog.cassdev.com/posts/%E5%9C%A8-chrome-%E4%B8%AD%E8%A7%A3%E9%94%81-new-bingbing-ai/</guid>
      <description>本文旨在帮助大家在 Chrome 中使用 New Bing（Bing AI）。</description>
    </item>
    <item>
      <title>浅析 SSH 免密登录原理</title>
      <link>https://blog.cassdev.com/posts/%E6%B5%85%E6%9E%90-ssh-%E5%85%8D%E5%AF%86%E7%99%BB%E5%BD%95%E5%8E%9F%E7%90%86/</link>
      <pubDate>Tue, 28 Mar 2023 10:00:00 +0800</pubDate>
      <guid>https://blog.cassdev.com/posts/%E6%B5%85%E6%9E%90-ssh-%E5%85%8D%E5%AF%86%E7%99%BB%E5%BD%95%E5%8E%9F%E7%90%86/</guid>
      <description>本文旨在以简单易懂的方式解释SSH免密登录的原理。</description>
    </item>
    <item>
      <title>找不到 catkin_init_workspace 命令的解决方法</title>
      <link>https://blog.cassdev.com/posts/%E6%89%BE%E4%B8%8D%E5%88%B0%E5%91%BD%E4%BB%A4-catkin_init_workspace-%E7%9A%84%E8%A7%A3%E5%86%B3%E6%96%B9%E6%B3%95/</link>
      <pubDate>Tue, 28 Mar 2023 10:00:00 +0800</pubDate>
      <guid>https://blog.cassdev.com/posts/%E6%89%BE%E4%B8%8D%E5%88%B0%E5%91%BD%E4%BB%A4-catkin_init_workspace-%E7%9A%84%E8%A7%A3%E5%86%B3%E6%96%B9%E6%B3%95/</guid>
      <description>本文旨在解决找不到 catkin_init_workspace 命令的问题。</description>
    </item>
    <item>
      <title>Docker &#43; Nginx 部署个人静态博客指南</title>
      <link>https://blog.cassdev.com/posts/docker-&#43;-nginx%E9%83%A8%E7%BD%B2%E4%B8%AA%E4%BA%BA%E9%9D%99%E6%80%81%E5%8D%9A%E5%AE%A2%E6%8C%87%E5%8D%97/</link>
      <pubDate>Fri, 24 Mar 2023 10:00:00 +0800</pubDate>
      <guid>https://blog.cassdev.com/posts/docker-&#43;-nginx%E9%83%A8%E7%BD%B2%E4%B8%AA%E4%BA%BA%E9%9D%99%E6%80%81%E5%8D%9A%E5%AE%A2%E6%8C%87%E5%8D%97/</guid>
      <description>通过本指南，您可以快速了解如何使用 Docker 和 Nginx 部署自己的静态博客网站。</description>
    </item>
    <item>
      <title>Git 免密登录配置指南</title>
      <link>https://blog.cassdev.com/posts/git%E5%85%8D%E5%AF%86%E7%99%BB%E5%BD%95%E9%85%8D%E7%BD%AE%E6%8C%87%E5%8D%97/</link>
      <pubDate>Fri, 24 Mar 2023 10:00:00 +0800</pubDate>
      <guid>https://blog.cassdev.com/posts/git%E5%85%8D%E5%AF%86%E7%99%BB%E5%BD%95%E9%85%8D%E7%BD%AE%E6%8C%87%E5%8D%97/</guid>
      <description>这是一个简单教程，旨在帮助大家实现免密SSH登录，省去每次输入用户名和密码的烦恼。</description>
    </item>
    <item>
      <title>Google 搜索引擎使用技巧</title>
      <link>https://blog.cassdev.com/posts/google-%E6%90%9C%E7%B4%A2%E5%BC%95%E6%93%8E%E4%BD%BF%E7%94%A8%E6%8A%80%E5%B7%A7/</link>
      <pubDate>Fri, 24 Mar 2023 10:00:00 +0800</pubDate>
      <guid>https://blog.cassdev.com/posts/google-%E6%90%9C%E7%B4%A2%E5%BC%95%E6%93%8E%E4%BD%BF%E7%94%A8%E6%8A%80%E5%B7%A7/</guid>
      <description>本文简单介绍了Google搜索引擎的几种高级搜索用法</description>
    </item>
    <item>
      <title>Jetson nano 安装 Azure Kinect DK 指南</title>
      <link>https://blog.cassdev.com/posts/jetson-nano%E5%AE%89%E8%A3%85azure-kinect-dk%E6%8C%87%E5%8D%97/</link>
      <pubDate>Fri, 24 Mar 2023 10:00:00 +0800</pubDate>
      <guid>https://blog.cassdev.com/posts/jetson-nano%E5%AE%89%E8%A3%85azure-kinect-dk%E6%8C%87%E5%8D%97/</guid>
      <description>这是一个简单教程，旨在帮助大家实现免密SSH登录，省去每次输入用户名和密码的烦恼。</description>
    </item>
    <item>
      <title>Jetson nano 安装 Azure Kinect DK 指南</title>
      <link>https://blog.cassdev.com/posts/mermaid%E6%8A%9B%E5%BC%83%E7%94%BB%E5%9B%BE%E6%8B%A5%E6%8A%B1%E7%A0%81%E5%9B%BE/</link>
      <pubDate>Fri, 24 Mar 2023 10:00:00 +0800</pubDate>
      <guid>https://blog.cassdev.com/posts/mermaid%E6%8A%9B%E5%BC%83%E7%94%BB%E5%9B%BE%E6%8B%A5%E6%8A%B1%E7%A0%81%E5%9B%BE/</guid>
      <description>Mermaid 是一个可以让你通过代码来绘制流程图、序列图、甘特图等各种图表的工具。</description>
    </item>
    <item>
      <title>Jetson nano 安装 PCL 指南</title>
      <link>https://blog.cassdev.com/posts/jetson-nano-%E5%AE%89%E8%A3%85-pcl-%E6%8C%87%E5%8D%97/</link>
      <pubDate>Fri, 24 Mar 2023 10:00:00 +0800</pubDate>
      <guid>https://blog.cassdev.com/posts/jetson-nano-%E5%AE%89%E8%A3%85-pcl-%E6%8C%87%E5%8D%97/</guid>
      <description>本指南帮助 ARM64 架构的 Jetson Nano 安装 PCL。</description>
    </item>
    <item>
      <title>Ubuntu 安装 OpenCV 指南</title>
      <link>https://blog.cassdev.com/posts/ubuntu%E5%AE%89%E8%A3%85opencv%E6%8C%87%E5%8D%97/</link>
      <pubDate>Fri, 24 Mar 2023 10:00:00 +0800</pubDate>
      <guid>https://blog.cassdev.com/posts/ubuntu%E5%AE%89%E8%A3%85opencv%E6%8C%87%E5%8D%97/</guid>
      <description>本文是一个简单易用的Ubuntu安装OpenCV的指南，帮助用户轻松完成OpenCV的安装和配置。</description>
    </item>
    <item>
      <title>Ubuntu 安装软件包时遇到 unmet dependencies 的解决方法</title>
      <link>https://blog.cassdev.com/posts/ubuntu%E5%AE%89%E8%A3%85%E8%BD%AF%E4%BB%B6%E5%8C%85%E6%97%B6%E9%81%87%E5%88%B0unmet-dependencies%E7%9A%84%E8%A7%A3%E5%86%B3%E6%96%B9%E6%B3%95/</link>
      <pubDate>Fri, 24 Mar 2023 10:00:00 +0800</pubDate>
      <guid>https://blog.cassdev.com/posts/ubuntu%E5%AE%89%E8%A3%85%E8%BD%AF%E4%BB%B6%E5%8C%85%E6%97%B6%E9%81%87%E5%88%B0unmet-dependencies%E7%9A%84%E8%A7%A3%E5%86%B3%E6%96%B9%E6%B3%95/</guid>
      <description>本文旨在解决Ubuntu用户遇到“The following packages have unmet dependencies”错误的问题</description>
    </item>
    <item>
      <title>apt autoremove 误删依赖包后自救指南</title>
      <link>https://blog.cassdev.com/posts/apt-autoremove-%E8%AF%AF%E5%88%A0%E4%BE%9D%E8%B5%96%E5%8C%85%E5%90%8E%E8%87%AA%E6%95%91%E6%8C%87%E5%8D%97/</link>
      <pubDate>Fri, 24 Mar 2023 00:00:00 +0000</pubDate>
      <guid>https://blog.cassdev.com/posts/apt-autoremove-%E8%AF%AF%E5%88%A0%E4%BE%9D%E8%B5%96%E5%8C%85%E5%90%8E%E8%87%AA%E6%95%91%E6%8C%87%E5%8D%97/</guid>
      <description>apt autoremove后程序不能用了？别慌，跟着教程一步一步来。</description>
    </item>
    <item>
      <title></title>
      <link>https://blog.cassdev.com/posts/%E4%B8%BB%E9%A1%B5/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://blog.cassdev.com/posts/%E4%B8%BB%E9%A1%B5/</guid>
      <description>&lt;p&gt;tags: [&amp;ldquo;Homepage&amp;rdquo;, &amp;ldquo;Blog&amp;rdquo;, &amp;ldquo;Open Source&amp;rdquo;, &amp;ldquo;Go&amp;rdquo;, &amp;ldquo;WeChat&amp;rdquo;, &amp;ldquo;GitHub&amp;rdquo;]&lt;/p&gt;</description>
    </item>
    <item>
      <title>Mind Space</title>
      <link>https://blog.cassdev.com/mind-space/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://blog.cassdev.com/mind-space/</guid>
      <description>&lt;h2 id=&#34;技术相关&#34;&gt;技术相关&lt;/h2&gt;&lt;h3 id=&#34;golang-代码耦合与内聚分析&#34;&gt;&lt;a href=&#34;https://docs.google.com/document/d/15Zc0XVxfYVRQ8aAAu4-50mANor1booFaqT5SZykJSv4/edit?tab=t.0&#34;&gt;Golang 代码耦合与内聚分析&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;这篇文章是我让Gemini Deep Research生成的，前面写的有些啰嗦，整体看完后依然有些收获。一个工程代码做到“高内聚低耦合”其实&lt;strong&gt;只要做好“高&lt;strong&gt;&lt;strong&gt;内聚&lt;/strong&gt;&lt;/strong&gt;”，“低&lt;strong&gt;&lt;strong&gt;耦合&lt;/strong&gt;&lt;/strong&gt;”是其自然结果&lt;/strong&gt;。想做到“高内聚”的最简单方法，就是坚持遵循“单一职责”原则。&lt;/p&gt;
&lt;p&gt;如何判断代码的耦合程度？可以从函数是否方便进行单元测试的方向进行思考判断。要充分利用Go的Interface，鸭子类型的特性让Go语言天生就能很好的做到“低耦合”。&lt;/p&gt;
&lt;p&gt;依赖注入原则，一句话概述就是：让函数的依赖都通过参数传入，而不是在函数内部创建。了解到了 Google Wire 这个自动 DI（Dependency Injection）的工具。&lt;/p&gt;
&lt;p&gt;上面都是从代码层面，也就是偏微观的视角看这个问题。除此之外，也要考虑项目宏观上看待问题，其中之一就是包结构，应该&lt;strong&gt;按功能（领域）划分包&lt;/strong&gt;，才能使得不同功能之间的耦合被最小化。&lt;/p&gt;
&lt;p&gt;文章最后提及了&lt;strong&gt;终极&lt;strong&gt;&lt;strong&gt;解耦&lt;/strong&gt;&lt;/strong&gt;方式：事件驱动架构&lt;/strong&gt;。此方面仍有待进一步学习。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;To myself：&lt;/strong&gt; 未来还得加强对 Interface 的了解和学习。&lt;/p&gt;&lt;/blockquote&gt;
&lt;h3 id=&#34;increasing-cohesion-in-go-with-generic-decorators&#34;&gt;&lt;a href=&#34;https://threedots.tech/post/increasing-cohesion-in-go-with-generic-decorators/&#34;&gt;Increasing Cohesion in Go with Generic Decorators&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;读完了这篇标题名为《使用通用装饰器增强 Go 语言的内聚力》文章，也仔细看了一下仓库里的示例代码，确实是一层比一层内聚度更高了，函数职责更明确，复用性也高了。其实这里说的装饰器（@decorator）和Python中的一个原理，使用外层函数包裹内层函数，外层函数的代码执行完后就会立即执行内层函数的代码，不过这在Go语言中实现起来确实很难绷，有种写Java的代码的既视感 &lt;del&gt;（又臭又长）&lt;/del&gt; 。而且阅读起来跳跃很大，需要在多个装饰器文件直接反复横跳，所以这种设计模式在生产环境的被接受度还是毁誉参半。&lt;/p&gt;
&lt;p&gt;话又说回来，对于业务上那些通用的代码块，例如前置校验、后置Trace、耗时记录等等情况，都是可以被类似装饰器这种设计模式优雅处理的。可以考虑使用中间件模式、AOP等阅读更友好的设计方法。&lt;/p&gt;</description>
    </item>
    <item>
      <title>友情链接</title>
      <link>https://blog.cassdev.com/friends/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://blog.cassdev.com/friends/</guid>
      <description>我的朋友们和优秀的技术博客</description>
    </item>
  </channel>
</rss>
