<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Posts on Keine Studio</title>
        <link>https://keinestudio.cn/post/</link>
        <description>Recent content in Posts on Keine Studio</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>zh-cn</language>
        <copyright>MaxwellJay256</copyright>
        <lastBuildDate>Mon, 05 May 2025 10:40:00 +0800</lastBuildDate><atom:link href="https://keinestudio.cn/post/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>微小而有意义的联系</title>
        <link>https://keinestudio.cn/posts/dizzymart02-repo/</link>
        <pubDate>Mon, 05 May 2025 10:40:00 +0800</pubDate>
        
        <guid>https://keinestudio.cn/posts/dizzymart02-repo/</guid>
        <description>&lt;img src="https://keinestudio.cn/posts/dizzymart02-repo/images/P1030855.JPG" alt="Featured image of post 微小而有意义的联系" /&gt;&lt;p&gt;2025.5.3 - 5.4 和同学去了 &lt;a class=&#34;link&#34; href=&#34;https://www.dizzylab.net/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;dizzylab&lt;/a&gt; 举办的第 2 届同人音乐主题展会 &lt;a class=&#34;link&#34; href=&#34;https://www.dizzylab.net/dizzymart/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;DizzyMart02&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://keinestudio.cn/posts/dizzymart02-repo/images/P1030819.JPG&#34;
	width=&#34;4592&#34;
	height=&#34;2584&#34;
	srcset=&#34;https://keinestudio.cn/posts/dizzymart02-repo/images/P1030819_hu_d49a951621e92f26.JPG 480w, https://keinestudio.cn/posts/dizzymart02-repo/images/P1030819_hu_a9b9ca210d888b5d.JPG 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;场馆是广州的设计殿堂，整体风格十分低调，能看到右下角的 banner 吗？那是唯一放在场地外的物品&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;177&#34;
		data-flex-basis=&#34;426px&#34;
	
&gt;&lt;/p&gt;
&lt;p&gt;展会设置了社团摊位销售作品，以及舞台供演出。&lt;/p&gt;
&lt;p&gt;我认识的社团和人都很少，逛展并非为了社交（虽然看到网友们晒出的几十张专辑战利品和签名纸也很羡慕），能发现一些印象深刻的音乐作品足矣。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://keinestudio.cn/posts/dizzymart02-repo/images/P1030860.JPG&#34;
	width=&#34;4592&#34;
	height=&#34;2584&#34;
	srcset=&#34;https://keinestudio.cn/posts/dizzymart02-repo/images/P1030860_hu_fca5e16841556f84.JPG 480w, https://keinestudio.cn/posts/dizzymart02-repo/images/P1030860_hu_da675af406e18150.JPG 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;只买了 5 张专辑&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;177&#34;
		data-flex-basis=&#34;426px&#34;
	
&gt;&lt;/p&gt;
&lt;p&gt;倒不如说，避开 “粉丝” 的身份，以单纯的欣赏者来参与展会，实际体验会好很多。
听到好歌就一起打 Call，有劲爆的 DJ set 就跟着跳舞，在两天十几个小时的时间里也不会感觉无聊。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://keinestudio.cn/posts/dizzymart02-repo/images/P1030806.JPG&#34;
	width=&#34;4592&#34;
	height=&#34;2584&#34;
	srcset=&#34;https://keinestudio.cn/posts/dizzymart02-repo/images/P1030806_hu_1586a5b99b3b4a62.JPG 480w, https://keinestudio.cn/posts/dizzymart02-repo/images/P1030806_hu_cc0208a1537cb5a7.JPG 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;人不多但是歌手观众都很卖力的舞台&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;177&#34;
		data-flex-basis=&#34;426px&#34;
	
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://keinestudio.cn/posts/dizzymart02-repo/images/P1030848.JPG&#34;
	width=&#34;4592&#34;
	height=&#34;2584&#34;
	srcset=&#34;https://keinestudio.cn/posts/dizzymart02-repo/images/P1030848_hu_f4be81b6b8ee2d24.JPG 480w, https://keinestudio.cn/posts/dizzymart02-repo/images/P1030848_hu_47b42488e1805de9.JPG 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;DJ 演出以 Hardcore set 为主，Trance 和 DnB 少之又少。Hardcore 的现场控制力太强了没办法&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;177&#34;
		data-flex-basis=&#34;426px&#34;
	
&gt;&lt;/p&gt;
&lt;p&gt;我参加过的展子和演出不多，DizzyMart 给我的感觉是，&lt;strong&gt;对人群筛选严格的活动，体验会更纯净&lt;/strong&gt;，对没有社交需求的游客也更友好。
DM 自带 “艺人 → 听众” 的内容输出关系，所以保证了游客能获得最低程度的体验：听音乐，社牛可以放肆地应援，社恐也可以安静地坐着看表演。
这次 DM 游客数量中等，虽然显得不怎么热闹，但随便朝一个方向看，并不会觉得自己违和或无事可做。
大家来都是为了见喜欢的艺人、支持好听的音乐，无他。
没有人玩烂梗整烂活更是谢天谢地。&lt;/p&gt;
&lt;!--
社恐在线下活动的体验不佳，原因在于别人在一起玩，而自己不知道该怎么加入。
比如我参加过的每一次 TouHou Only 上必有过激东方厨聚众整活，而自己站在一边无事可做，时间很快就过去了，感觉自己一无所获。
--&gt;
&lt;p&gt;&lt;img src=&#34;https://keinestudio.cn/posts/dizzymart02-repo/images/P1030861.JPG&#34;
	width=&#34;4592&#34;
	height=&#34;2584&#34;
	srcset=&#34;https://keinestudio.cn/posts/dizzymart02-repo/images/P1030861_hu_ef3b0dcd0381fccf.JPG 480w, https://keinestudio.cn/posts/dizzymart02-repo/images/P1030861_hu_a43a8cb4caf4539c.JPG 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;打打だいず 和 Tanchiky 的签名。VANGUARD 是难得全员质量在线的合作专辑，感谢 Tanchiky 的企划&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;177&#34;
		data-flex-basis=&#34;426px&#34;
	
&gt;&lt;/p&gt;
&lt;p&gt;陪同学聊音乐和人生、在试听角体验碟机、和日本曲师短暂地互动、舞台下接住&lt;a class=&#34;link&#34; href=&#34;https://space.bilibili.com/462723&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;踊音&lt;/a&gt;老师送的无料……
这些并非惊天动地的大事件，他们虽然无法与我日日相见，但这些&lt;strong&gt;微小而有意义的联系&lt;/strong&gt;，也许正是我二十岁以来需要的，或者说一直在寻找的东西。&lt;/p&gt;
&lt;p&gt;这些直到展会结束我才反应过来。&lt;/p&gt;
&lt;p&gt;人无法被任何标签分类，却总是以各种原因聚在一起。
让我们用签绘墙上的一句话来结束这篇 repo 吧：&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://keinestudio.cn/posts/dizzymart02-repo/images/P1030854.JPG&#34;
	width=&#34;4592&#34;
	height=&#34;2584&#34;
	srcset=&#34;https://keinestudio.cn/posts/dizzymart02-repo/images/P1030854_hu_8c24754318d0545.JPG 480w, https://keinestudio.cn/posts/dizzymart02-repo/images/P1030854_hu_629ed1ceb62bc78.JPG 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;同人，同人，同一群人&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;177&#34;
		data-flex-basis=&#34;426px&#34;
	
&gt;&lt;/p&gt;
</description>
        </item>
        <item>
        <title>玩一玩 STLINK-V3MINIE</title>
        <link>https://keinestudio.cn/posts/stlink-v3minie/</link>
        <pubDate>Sun, 02 Mar 2025 10:47:00 +0800</pubDate>
        
        <guid>https://keinestudio.cn/posts/stlink-v3minie/</guid>
        <description>&lt;img src="https://keinestudio.cn/posts/stlink-v3minie/image.PF271415.en.feature-description-include-personalized-no-cpn-large.webp" alt="Featured image of post 玩一玩 STLINK-V3MINIE" /&gt;&lt;p&gt;2024 年年底那段时间遇到了需要自己画 PCB 的 STM32 开发需求，但手头还没有任何适合 STM32 MCU 的调试工具。
我在 DAPLink、STLINK、JTAG 等工具里挑了很久，包括网友们 DIY 的那些硬件，最后选了这个又贵销量又少的 STLINK-V3MINIE。&lt;/p&gt;
&lt;p&gt;为什么呢？&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;首先是开发环境&lt;/strong&gt;。我用的是 STM32CubeMX + VS Code + CMake 的工具链，配合 ST 官方的
&lt;a class=&#34;link&#34; href=&#34;https://marketplace.visualstudio.com/items?itemName=stmicroelectronics.stm32-vscode-extension&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;STM32 VS Code Extension&lt;/a&gt;，这套工具链相对来说很新也挺好用，摆脱了对 Keil 和 STM32CubeIDE 的依赖。
但我担心非官方的调试器与这套工具链不兼容，所以我希望第一次买调试工具先挑选 “血统纯正” 的硬件。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;其次是性能&lt;/strong&gt;。我上面提到的这个工具链使用了 Ninja，编译速度非常快，下载自然不能拖后腿。
STLINK-V3 的传输速度（理论 480 Mbit/s）比 V2（12 Mbit/s USB 2.0）快了许多，能节省不少调试时间。&lt;/p&gt;
&lt;p&gt;最后就是在
&lt;a class=&#34;link&#34; href=&#34;https://www.st.com.cn/zh/development-tools/stlink-v3minie.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;STLINK-V3MINIE&lt;/a&gt;、
&lt;a class=&#34;link&#34; href=&#34;https://www.st.com.cn/zh/development-tools/stlink-v3set.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;STLINK-V3SET&lt;/a&gt;、
&lt;a class=&#34;link&#34; href=&#34;https://www.st.com.cn/zh/development-tools/stlink-v3pwr.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;STLINK-V3PWR&lt;/a&gt;、
&lt;a class=&#34;link&#34; href=&#34;https://www.st.com.cn/zh/development-tools/stlink-v3mods.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;STLINK-V3MODS&lt;/a&gt;
里挑选了。V3SET 和 V3PWR 太贵，V3MODS 需要单独做载板，V3MINIE 刚好够用。&lt;/p&gt;
&lt;h2 id=&#34;开箱体验&#34;&gt;开箱体验
&lt;/h2&gt;&lt;p&gt;STLINK-V3MINIE 官网售价是 11 美元，国内的零售价大概在 90 - 110 元间，比满天飞的十几块钱的 V2 贵不少。&lt;/p&gt;
&lt;p&gt;STLINK V2 之所以便宜是因为它的固件在网上流通，因此存在大量的仿制品。官网上在售的
&lt;a class=&#34;link&#34; href=&#34;https://www.st.com.cn/zh/development-tools/st-link-v2.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;ST-LINK/V2&lt;/a&gt; 其实仍然很贵。&lt;/p&gt;
&lt;p&gt;这是 STLINK-V3MINIE 的包装和内容物：&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://keinestudio.cn/posts/stlink-v3minie/package.jpg&#34;
	width=&#34;4000&#34;
	height=&#34;3000&#34;
	srcset=&#34;https://keinestudio.cn/posts/stlink-v3minie/package_hu_2059c87719e2e441.jpg 480w, https://keinestudio.cn/posts/stlink-v3minie/package_hu_da4da86a5802529a.jpg 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;STLINK-V3MINIE 开箱&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;133&#34;
		data-flex-basis=&#34;320px&#34;
	
&gt;&lt;/p&gt;
&lt;p&gt;包装内含有 STLINK-V3MINIE 本体即一块 PCB，一根 1.27mm 14pin 的 FFC 接口排线，以及一份说明书（提示相关文档的地址）。&lt;/p&gt;
&lt;p&gt;我在这里放一张用户手册上提供的 STLINK-V3MINIE 的放大图片：&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://keinestudio.cn/posts/stlink-v3minie/figure1.png&#34;
	width=&#34;650&#34;
	height=&#34;552&#34;
	srcset=&#34;https://keinestudio.cn/posts/stlink-v3minie/figure1_hu_c34a4325723c4de5.png 480w, https://keinestudio.cn/posts/stlink-v3minie/figure1_hu_81e3c064b74c853f.png 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;STLINK-V3MINIE top, bottom, and cable views&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;117&#34;
		data-flex-basis=&#34;282px&#34;
	
&gt;&lt;/p&gt;
&lt;p&gt;从 Type-C 接口占整板的比例不难看出，STLINK-V3MINIE 的尺寸非常小，为
15.24mm x 43.47mm，和常规 USB 闪存盘的尺寸差不多。&lt;/p&gt;
</description>
        </item>
        <item>
        <title>STM32G474 定时器触发 DMA 高速翻转 GPIO</title>
        <link>https://keinestudio.cn/posts/stm32g474-dma/</link>
        <pubDate>Wed, 26 Feb 2025 22:06:00 +0800</pubDate>
        
        <guid>https://keinestudio.cn/posts/stm32g474-dma/</guid>
        <description>&lt;img src="https://keinestudio.cn/posts/stm32g474-dma/osc-gpio.jpg" alt="Featured image of post STM32G474 定时器触发 DMA 高速翻转 GPIO" /&gt;&lt;p&gt;本文是对 &lt;a class=&#34;link&#34; href=&#34;https://www.analog.com/cn/products/max14808.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;MAX14808&lt;/a&gt;
进行驱动测试时 STM32G474 定时器触发 DMA 高速翻转 GPIO 的实现过程。&lt;/p&gt;
&lt;h2 id=&#34;硬件准备&#34;&gt;硬件准备
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;MAX14808 Evaluation Board v1.0&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.st.com.cn/zh/microcontrollers-microprocessors/stm32g474ve.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;STM32G474VET6&lt;/a&gt; 开发板
&lt;ul&gt;
&lt;li&gt;STM32G474 的最高时钟频率为 170 MHz，VET6 为 LQFP-100 封装。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.st.com.cn/zh/development-tools/stlink-v3minie.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;STLINK-V3-MINIE&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;示波器&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;软件准备&#34;&gt;软件准备
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;STM32CubeMX，固件版本为 STM32Cube_FW_G4_V1.6.1&lt;/li&gt;
&lt;li&gt;Visual Studio Code&lt;/li&gt;
&lt;li&gt;CMake（我从来不用 Keil，CubeIDE 也用不习惯）&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;思路&#34;&gt;思路
&lt;/h2&gt;&lt;p&gt;为了让 MAX14808 输出实验要求的高压脉冲，需要以一定的时序向每个通道的 INN, INP 引脚输入逻辑信号。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://keinestudio.cn/posts/stm32g474-dma/waveform.jpg&#34;
	width=&#34;1752&#34;
	height=&#34;1077&#34;
	srcset=&#34;https://keinestudio.cn/posts/stm32g474-dma/waveform_hu_61f83d86b1bfd452.jpg 480w, https://keinestudio.cn/posts/stm32g474-dma/waveform_hu_b195565cb20d8bb6.jpg 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;目标波形示意图&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;162&#34;
		data-flex-basis=&#34;390px&#34;
	
&gt;&lt;/p&gt;
&lt;p&gt;在输出高压脉冲时，INN, INP 需要以 10 MHz 的频率翻转。STM32 的 HAL 库 GPIO 操作是做不到的，需要用到 DMA。&lt;/p&gt;
&lt;p&gt;网上关于 DMA 翻转 GPIO 的方法并非没有，但主要都是测试 STM32 翻转 GPIO 的极限速度，像本文中这种输出特定频率脉冲的博文在我写这份笔记前还没看到过（之前用 NUCLEO-U575ZI 测试 MAX14808 时参考了
&lt;a class=&#34;link&#34; href=&#34;https://community.st.com/t5/stm32-mcus-products/stm32u5-triggering-dma-request-from-timer-to-write-to-gpiod-odr/td-p/755881&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Solved: STM32U5 Triggering DMA request from timer to write to GPIOD ODR register&lt;/a&gt;，但 STM32U5 的 GPDMA 与其他系列的用法区别太大了）。&lt;/p&gt;
&lt;p&gt;我折腾了几天后搞出来以下结果。&lt;/p&gt;
&lt;h2 id=&#34;配置-cubemx&#34;&gt;配置 CubeMX
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;将 8 个通道的 16 个 IO 配置在 STM32G474 的 GPIOE0~E15 上，这样向 &lt;code&gt;GPIOE-&amp;gt;ODR&lt;/code&gt; 写入一个 16 位二进制数便可同时操作 16 个引脚输出高 / 低电平。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&#34;https://keinestudio.cn/posts/stm32g474-dma/gpio.png&#34;
	width=&#34;2561&#34;
	height=&#34;1368&#34;
	srcset=&#34;https://keinestudio.cn/posts/stm32g474-dma/gpio_hu_c036b37fec184f65.png 480w, https://keinestudio.cn/posts/stm32g474-dma/gpio_hu_8238ed4fb7b076e7.png 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;我把 ADC、SPI、OPAMP 之类的引脚都预留了，只是不生成对应主函数代码&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;187&#34;
		data-flex-basis=&#34;449px&#34;
	
&gt;&lt;/p&gt;
&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;配置 TIM2 用来生成 10 MHz 脉冲。MCU 主频先拉到最大 170 MHz，TIM2 不预分频，计数周期为 17 - 1，这样生成的脉冲就是 10 MHz。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&#34;https://keinestudio.cn/posts/stm32g474-dma/tim2.png&#34;
	width=&#34;2561&#34;
	height=&#34;1368&#34;
	srcset=&#34;https://keinestudio.cn/posts/stm32g474-dma/tim2_hu_fc070ca1b0ef8643.png 480w, https://keinestudio.cn/posts/stm32g474-dma/tim2_hu_c351d9708b436b9b.png 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;TIM2 配置&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;187&#34;
		data-flex-basis=&#34;449px&#34;
	
&gt;&lt;/p&gt;
&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;以 &lt;code&gt;TIM2_UP&lt;/code&gt; 为事件生成 DMA 请求（网上的文章这里都用 MemToMem 的 DMA 请求，但 MemToMem 的 DMA 突发传输速度由 AHB 时钟频率决定，不能直接控制）。模式选 Normal 而不是 Circular，原因后面说。方向当然是 Memory to Peripheral，数据宽度选 Half Word（STM32 是 32 位处理器嘛，一个字是 32 位，半个字就是 16 位）。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&#34;https://keinestudio.cn/posts/stm32g474-dma/dma.png&#34;
	width=&#34;2561&#34;
	height=&#34;1368&#34;
	srcset=&#34;https://keinestudio.cn/posts/stm32g474-dma/dma_hu_89b762c941a53793.png 480w, https://keinestudio.cn/posts/stm32g474-dma/dma_hu_7de9df1d25030206.png 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;DMA 配置&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;187&#34;
		data-flex-basis=&#34;449px&#34;
	
&gt;&lt;/p&gt;
&lt;p&gt;到目前为止我只提到了以 10 MHz 翻转 GPIO，但这个操作每 50 ms 才进行一次。假如我用 DMA Circular，将波形图的红线和绿线部分都扔进 DMA 搬运，那么波形数组内将会有 $50 \times 10^{-3} \cdot 10\times 10^6 = 5 \times 10^5$ 个数，内存估计爆了🤣。&lt;/p&gt;
&lt;p&gt;所以我们只能让 DMA 由另一个周期为 50 ms 的时钟触发，每次触发只搬运脉冲和两条红线的部分，搬完就停，直到下一次被 “唤醒”。这就是为什么要把 DMA 配置为 Normal。&lt;/p&gt;
&lt;ol start=&#34;4&#34;&gt;
&lt;li&gt;配置另一个时钟 TIM5（TIM2 和 TIM5 是 STM32G474 中的两个 32 位通用定时器，用它们计时更精准，我猜），预分频 1000 - 1，计数周期 8500 - 1，这样时钟频率就是 20 Hz。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&#34;https://keinestudio.cn/posts/stm32g474-dma/tim5.png&#34;
	width=&#34;2561&#34;
	height=&#34;1368&#34;
	srcset=&#34;https://keinestudio.cn/posts/stm32g474-dma/tim5_hu_c4fe5a143c0d33b0.png 480w, https://keinestudio.cn/posts/stm32g474-dma/tim5_hu_a03bdc8e3721d93c.png 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;TIM5 配置&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;187&#34;
		data-flex-basis=&#34;449px&#34;
	
&gt;&lt;/p&gt;
&lt;ol start=&#34;5&#34;&gt;
&lt;li&gt;开启 TIM5 的全局中断。我会在 TIM5 的中断中执行 DMA 传输。由于 DMA 由硬件执行而不经过 CPU，所以中断函数的运行速度很快。&lt;/li&gt;
&lt;li&gt;再记录一下时钟树的配置。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&#34;https://keinestudio.cn/posts/stm32g474-dma/clock.png&#34;
	width=&#34;2561&#34;
	height=&#34;1368&#34;
	srcset=&#34;https://keinestudio.cn/posts/stm32g474-dma/clock_hu_4fad9e591fccf7f9.png 480w, https://keinestudio.cn/posts/stm32g474-dma/clock_hu_523e5b5a8875c872.png 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;时钟树&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;187&#34;
		data-flex-basis=&#34;449px&#34;
	
&gt;&lt;/p&gt;
&lt;p&gt;CubeMX 其余的部分不重要，就不放出来了。&lt;/p&gt;
&lt;h2 id=&#34;代码&#34;&gt;代码
&lt;/h2&gt;&lt;p&gt;只是操作 GPIO，代码并不长。其实只有 &lt;code&gt;main.c&lt;/code&gt; 的几个片段：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;脉冲波形数组，&lt;code&gt;PULSE_OFF&lt;/code&gt; 对应关断、&lt;code&gt;PULSE_RECEIVE&lt;/code&gt; 对应打开 T/R 开关接收回波。根据前文思路，我只需要在波形数组的最后一位填 &lt;code&gt;PULSE_RECEIVE&lt;/code&gt;，则传输结束后的剩余时间里 MAX14808 都处于接收状态。&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;16
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;17
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;18
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;19
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;20
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;21
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;22
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;23
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;24
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;25
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;26
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;27
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;28
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;29
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;30
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#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;cm&#34;&gt;/* Private macro -------------------------------------------------------------*/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;/* USER CODE BEGIN PM */&lt;/span&gt;
&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;#define PULSE_OFF 0x0000
&lt;/span&gt;&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;#define PULSE_VPP 0xAAAA
&lt;/span&gt;&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;#define PULSE_VNN 0x5555
&lt;/span&gt;&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;#define PULSE_RECEIVE 0xFFFF
&lt;/span&gt;&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;cm&#34;&gt;/* USER CODE END PM */&lt;/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;cm&#34;&gt;/* Private variables ---------------------------------------------------------*/&lt;/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;cm&#34;&gt;/* USER CODE BEGIN PV */&lt;/span&gt;
&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;uint16_t&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;pulse_wave&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;PULSE_OFF&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;PULSE_OFF&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;PULSE_OFF&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;PULSE_OFF&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;PULSE_OFF&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;PULSE_OFF&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;PULSE_OFF&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;PULSE_OFF&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;PULSE_OFF&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;PULSE_OFF&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;PULSE_OFF&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;PULSE_OFF&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;PULSE_OFF&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;PULSE_OFF&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;PULSE_OFF&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;PULSE_OFF&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;PULSE_OFF&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;PULSE_OFF&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;PULSE_OFF&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;PULSE_OFF&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;PULSE_OFF&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;PULSE_OFF&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;PULSE_OFF&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;PULSE_OFF&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;PULSE_OFF&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;PULSE_OFF&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;PULSE_OFF&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;PULSE_OFF&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;PULSE_OFF&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;PULSE_OFF&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;PULSE_VPP&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;PULSE_VNN&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;PULSE_VPP&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;PULSE_VNN&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;PULSE_OFF&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;PULSE_OFF&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;PULSE_OFF&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;PULSE_OFF&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;PULSE_OFF&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;PULSE_OFF&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;PULSE_OFF&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;PULSE_OFF&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;PULSE_OFF&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;PULSE_OFF&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;PULSE_OFF&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;PULSE_OFF&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;PULSE_OFF&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;PULSE_OFF&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;PULSE_OFF&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;PULSE_OFF&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;PULSE_OFF&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;PULSE_OFF&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;PULSE_OFF&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;PULSE_OFF&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;PULSE_OFF&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;PULSE_OFF&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;PULSE_OFF&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;PULSE_OFF&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;PULSE_OFF&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;PULSE_OFF&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;PULSE_OFF&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;PULSE_OFF&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;PULSE_OFF&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;PULSE_OFF&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;PULSE_RECEIVE&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;extern&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;DMA_HandleTypeDef&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;hdma_tim2_up&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;cm&#34;&gt;/* USER CODE END PV */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;在 &lt;code&gt;main&lt;/code&gt; 函数里启动 TIM5。&lt;code&gt;MAX14808_Init&lt;/code&gt; 和 &lt;code&gt;MAX14808_SetMode&lt;/code&gt; 是我自定义的两个函数，主要是对 &lt;code&gt;MODE0&lt;/code&gt; 和 &lt;code&gt;MODE1&lt;/code&gt; 两个引脚操作，控制 MAX14808 的整体工作状态，这里略过不提。&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#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;kt&#34;&gt;void&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;cm&#34;&gt;/* USER CODE BEGIN 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;nf&#34;&gt;MAX14808_Init&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;nf&#34;&gt;MAX14808_SetMode&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;MAX14808_MODE_OCTAL_THREE_LEVEL&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;nf&#34;&gt;HAL_TIM_Base_Start_IT&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;htim5&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;cm&#34;&gt;/* USER CODE END 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;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;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;编辑 TIM5 的中断回调函数，这里少一行代码都不行。为了让 DMA 能够重复触发，你必须：
关闭 DMA；停止并重置 TIM2；清除 DMA 状态；启动 DMA；启动 TIM2。&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#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;void&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;HAL_TIM_PeriodElapsedCallback&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;TIM_HandleTypeDef&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;htim&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;cm&#34;&gt;/* USER CODE BEGIN Callback 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;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;htim&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Instance&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;TIM5&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;nf&#34;&gt;__HAL_TIM_DISABLE_DMA&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;htim2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;TIM_DMA_UPDATE&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;nf&#34;&gt;HAL_TIM_Base_Stop&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;htim2&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;nf&#34;&gt;__HAL_TIM_SET_COUNTER&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;htim2&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;nf&#34;&gt;HAL_DMA_Abort&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;hdma_tim2_up&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;nf&#34;&gt;HAL_DMA_Start&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;hdma_tim2_up&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;kt&#34;&gt;uint32_t&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;pulse_wave&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;kt&#34;&gt;uint32_t&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;PULSE_GPIO_Port&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ODR&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;pulse_wave&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;sizeof&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;pulse_wave&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;nf&#34;&gt;__HAL_TIM_ENABLE_DMA&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;htim2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;TIM_DMA_UPDATE&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;nf&#34;&gt;HAL_TIM_Base_Start&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;htim2&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;cm&#34;&gt;/* USER CODE END Callback 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;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;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;实验&#34;&gt;实验
&lt;/h2&gt;&lt;p&gt;用示波器观察单个通道的 INN 和 INP 引脚：&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://keinestudio.cn/posts/stm32g474-dma/osc-gpio.jpg&#34;
	width=&#34;3625&#34;
	height=&#34;2090&#34;
	srcset=&#34;https://keinestudio.cn/posts/stm32g474-dma/osc-gpio_hu_3d9d0dbe22c6c643.jpg 480w, https://keinestudio.cn/posts/stm32g474-dma/osc-gpio_hu_bc8ae68c9d242693.jpg 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;单个通道的 INN 和 INP 引脚局部波形&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;173&#34;
		data-flex-basis=&#34;416px&#34;
	
&gt;&lt;/p&gt;
&lt;p&gt;波形失真比较严重，我们猜测原因是信号频率高、示波器探头线太长、信号通过杜邦线连接出现多次反射等。但频率、相位都是很精准的。&lt;/p&gt;
&lt;p&gt;以下是 MAX14808 输出端空载观察到的波形：&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://keinestudio.cn/posts/stm32g474-dma/osc-out-1.jpg&#34;
	width=&#34;3128&#34;
	height=&#34;1793&#34;
	srcset=&#34;https://keinestudio.cn/posts/stm32g474-dma/osc-out-1_hu_2fc1938226efbaba.jpg 480w, https://keinestudio.cn/posts/stm32g474-dma/osc-out-1_hu_490f87851e04c4d.jpg 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;MAX14808 输出端局部波形&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;174&#34;
		data-flex-basis=&#34;418px&#34;
	
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://keinestudio.cn/posts/stm32g474-dma/osc-out-2.jpg&#34;
	width=&#34;3070&#34;
	height=&#34;1769&#34;
	srcset=&#34;https://keinestudio.cn/posts/stm32g474-dma/osc-out-2_hu_c415ac2858e47354.jpg 480w, https://keinestudio.cn/posts/stm32g474-dma/osc-out-2_hu_15c7ead0a1ed6f26.jpg 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;MAX14808 输出端横轴缩放后波形&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;173&#34;
		data-flex-basis=&#34;416px&#34;
	
&gt;&lt;/p&gt;
&lt;p&gt;这个脉冲局部波形就更丑了，估计也是和电路连接方式有关。这些没办法靠写代码解决，只能等后面硬件方案改版再测试。&lt;/p&gt;
&lt;h2 id=&#34;小结&#34;&gt;小结
&lt;/h2&gt;&lt;p&gt;由于之前没有系统的 STM32 软件开发经验，这次 MAX14808 的驱动实验我绕了很多弯路，甚至烧掉了我的 NUCLEO-U575ZI 开发板😵。但好在我最后找到了一个合格的控制方案，并且实验极大地加深了我对 STM32 MCU 的时钟和 DMA 的理解。&lt;/p&gt;
&lt;p&gt;感谢黄学长的笔记给我的启发以及曹学长的支持。&lt;/p&gt;
</description>
        </item>
        <item>
        <title>21</title>
        <link>https://keinestudio.cn/posts/21/</link>
        <pubDate>Thu, 16 Jan 2025 00:00:00 +0800</pubDate>
        
        <guid>https://keinestudio.cn/posts/21/</guid>
        <description>&lt;img src="https://keinestudio.cn/posts/21/61269686_p0.jpg" alt="Featured image of post 21" /&gt;&lt;p&gt;又是一岁生日，例行回顾一下呗。&lt;/p&gt;
&lt;h2 id=&#34;深造&#34;&gt;深造
&lt;/h2&gt;&lt;p&gt;上半年，因为感兴趣所以开始学着用嘉立创 EDA，正好大二下上课要学模拟电子技术基础和数字电子技术基础。
我做的第一个 PCB 诞生于 2024 年 5 月 9 日，其实就是一个 LCD 屏幕的转接板，没有电路。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://keinestudio.cn/posts/21/MXDS001.png&#34;
	width=&#34;1920&#34;
	height=&#34;1080&#34;
	srcset=&#34;https://keinestudio.cn/posts/21/MXDS001_hu_a673b3e3f21f3003.png 480w, https://keinestudio.cn/posts/21/MXDS001_hu_b8941dbf3593042e.png 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;MXDS001&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;177&#34;
		data-flex-basis=&#34;426px&#34;
	
&gt;&lt;/p&gt;
&lt;p&gt;第 2 个 PCB 诞生于 6 月 1 日，是一个模拟调光的陶瓷 LED 灯板。
灵感嘛，就是想整点东方project 有关的创作。
这个电路除了电池电源管理用的成品模块，其他的电路均从零开始设计，也没有任何现成的参考。
其中最费时间的其实是 LED 的升压驱动芯片的选型，至少用了两个星期。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://keinestudio.cn/posts/21/MXDS002.JPG&#34;
	width=&#34;4592&#34;
	height=&#34;2584&#34;
	srcset=&#34;https://keinestudio.cn/posts/21/MXDS002_hu_f9425d7876ab321b.JPG 480w, https://keinestudio.cn/posts/21/MXDS002_hu_d969102b8f46d770.JPG 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;MXDS002&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;177&#34;
		data-flex-basis=&#34;426px&#34;
	
&gt;&lt;/p&gt;
&lt;p&gt;我后来想给自己做的这些设计起个编号，像同人音乐社团的 CD 那样，于是就给这两个电路板起名叫 MXDS001 和 MXDS002。&lt;/p&gt;
&lt;p&gt;虽然本来就喜欢空想，但从这以后我不会任由灵感飞逝了，我会把它们记录下来，然后实现它们。
于是又有了 MXDS003，亲手画工图把桌面拓宽; MXDS004，3D 打印的理线器……&lt;/p&gt;
&lt;p&gt;直到今天，MXDS 系列已经来到了 MXDS010，其中还包括一些面向项目的设计。
我暂时没有把它们全部开源，因为懒得写文档，也没有什么复刻的价值。&lt;/p&gt;
&lt;p&gt;下半年我学习了用 Altium Designer，着手一些中大型项目。
在制作了十几个 PCB 后，我明显能感受到自己对电子系统有了一套理解。&lt;/p&gt;
&lt;p&gt;2025 年我计划学会高速 PCB 的设计，也许还会接触 FPGA 开发。&lt;/p&gt;
&lt;h2 id=&#34;唱吧跳吧&#34;&gt;唱吧，跳吧
&lt;/h2&gt;&lt;p&gt;2024 年，去了两场 Touhou Only，两场东方乐典 Live 演出。 🥰&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://keinestudio.cn/posts/21/202407_shenzhen_THO.JPG&#34;
	width=&#34;4592&#34;
	height=&#34;2584&#34;
	srcset=&#34;https://keinestudio.cn/posts/21/202407_shenzhen_THO_hu_4d1c04236d0175ab.JPG 480w, https://keinestudio.cn/posts/21/202407_shenzhen_THO_hu_f24ffa0d9b8b3eed.JPG 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;2024.7 深圳 THO 上的绯想天则赛&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;177&#34;
		data-flex-basis=&#34;426px&#34;
	
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://keinestudio.cn/posts/21/202408_touhou_live.jpg&#34;
	width=&#34;4080&#34;
	height=&#34;3060&#34;
	srcset=&#34;https://keinestudio.cn/posts/21/202408_touhou_live_hu_a1692d3f64740ec9.jpg 480w, https://keinestudio.cn/posts/21/202408_touhou_live_hu_74f914f6beb5aad2.jpg 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;2024.8 上海东方乐典&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;133&#34;
		data-flex-basis=&#34;320px&#34;
	
&gt;&lt;/p&gt;
&lt;p&gt;对于一个从来没有参加过漫展和音乐会的学生，可以说是大饱眼福了。
我最意外的收获是发现自己先天 rave 圣体，跟着音乐特别能跳。&lt;/p&gt;
&lt;p&gt;这一年也在不断扩充音乐库，Trance 和 Progressive House 听多了后，我能分析出曲子中最基本的那些要素，也有了自己的一套评价标准。&lt;/p&gt;
&lt;p&gt;书架上收藏的 CD 数来到了二十有余，但不知道为什么买专辑前自己心心念念，买到了后反而不怎么听，尽管确实都是自己最喜欢的曲子。&lt;/p&gt;
&lt;p&gt;每个人都有自己排遣的方式，对于我而言，音乐已是最好的选择。
这是量变带来的效果，只要接触得足够多，自然会形成那种独特的品味。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;去年的这个时候，我面对自己无枝可栖的困境，写了很多悲伤的东西。
后来我释然了，很多事情本就没有必要一直操心，于是转身去开辟自己的天地。&lt;/p&gt;
&lt;p&gt;20 岁唯一的遗憾，是始终摆脱不了学生的习气，太听话了，别人说什么就是什么。&lt;/p&gt;
&lt;p&gt;既然下定决心要遵从自己的愿望，那么 21 岁就要继续修炼，把空想变成现实。&lt;/p&gt;
</description>
        </item>
        <item>
        <title>杂谈：关于分享知识</title>
        <link>https://keinestudio.cn/posts/sharing-knowledge/</link>
        <pubDate>Mon, 28 Oct 2024 00:00:00 +0800</pubDate>
        
        <guid>https://keinestudio.cn/posts/sharing-knowledge/</guid>
        <description>&lt;img src="https://keinestudio.cn/posts/sharing-knowledge/64894936_p0.png" alt="Featured image of post 杂谈：关于分享知识" /&gt;&lt;iframe frameborder=&#34;no&#34; border=&#34;0&#34; marginwidth=&#34;0&#34; marginheight=&#34;0&#34; width=450 height=80 src=&#34;//music.163.com/outchain/player?type=2&amp;id=500412167&amp;auto=0&amp;height=66&#34;&gt;&lt;/iframe&gt;
&lt;p&gt; &lt;sup&gt;
    &lt;i&gt;配合音乐阅读更佳（&lt;/i&gt;
&lt;/sup&gt; &lt;/p&gt;
&lt;p&gt;2024 年 10 月 29 日是 &lt;a class=&#34;link&#34; href=&#34;https://github.com/HITSZ-OpenAuto&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;HITSZ OpenAuto&lt;/a&gt; 的 1 岁生日。&lt;/p&gt;
&lt;p&gt;好几天前，成员们就在讨论庆祝的事情了。
想来想去，我们本身是基于互联网的团队，写点小文章纪念一下也是不错的选择。
结果我最先提出这个想法，反而是最后一个交作业的 😂。&lt;/p&gt;
&lt;p&gt;一开始有一些写作的想法，看到其他几位同学的博客后发现想出来的东西都被写过了，什么 HOA 的成长历程啊、参与开源的初衷啊、收获与致谢啊……这些都是很好的话题，但大家都写就没意思了。&lt;/p&gt;
&lt;p&gt;那，咱来聊点不一样的？&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;HOA 网站的搭建，尤其是涉及到 HTML, CSS, JS 的部分基本上都是 &lt;a class=&#34;link&#34; href=&#34;https://github.com/longlin10086&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;@longlin li&lt;/a&gt; 和 &lt;a class=&#34;link&#34; href=&#34;https://github.com/kowyo&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;@Kowyo&lt;/a&gt; 等人在做。
而我在 HOA 主要的工作，就是写。&lt;/p&gt;
&lt;p&gt;写什么呢？写课程描述，写博客，还有一些组织内部文案。
此外，由于强迫症，我重新排版了很多其他人写的文档。
这一年，写了不少东西，也读了不少别人写的东西。&lt;/p&gt;
&lt;h2 id=&#34;为什么要写博客以及分享知识时的面向陌生人原则&#34;&gt;为什么要写博客，以及分享知识时的「面向陌生人」原则
&lt;/h2&gt;&lt;p&gt;我相当享受用文字组织逻辑的过程（不是用文字倾泻情感，那是另一回事）。
如果你能用文字完整地描述一个事物，那么说明你对这个事物已经有了充足的理解。
这也是为什么很多人会用博客的方式记录自己学习的知识，包括学校里学习的课程，和课外自己搞开发时学习的技术。&lt;/p&gt;
&lt;p&gt;比如&lt;a class=&#34;link&#34; href=&#34;https://hoa.moe/blog/zero-force-poles/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;《平面简单桁架中零力杆的判断》&lt;/a&gt; 这篇 HOA 上的博客，是我在自学这个知识点后马上写下来的。
即使理论力学这门课的内容我今天已经忘掉了 90%，我仍然能随口说出零力杆的 4 种判断方法。&lt;/p&gt;
&lt;p&gt;你可能问了，这跟自己记的笔记有什么区别呢？&lt;/p&gt;
&lt;p&gt;笔记是记给你自己看的，自己看得懂就 OK 了，所以你可能在记笔记的时候并没有多加思考，或者记得很简略。
说不定过了一段时间，你已经看不懂自己过去的笔记了（&lt;/p&gt;
&lt;p&gt;而写博客的时候，你应该时刻提醒自己，&lt;strong&gt;博文的读者不是你，而是对你所写的内容完全陌生的人&lt;/strong&gt;。
这也是我在 HOA 上写文档时反复提醒自己的一点。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;一篇知识型文章的出发点应当低于你想要描述的主体内容&lt;/strong&gt;。
例如我想描述平面简单桁架中零力杆的判断方法，我就从质点的二维静力学平衡条件出发，逐个讲述每种特殊节点的判断原理。
这样对读者的筛选就会非常宽松，能够保证读有所得，并且你也能收获更多的阅读量。
这也是为什么网上自称「保姆级」「零基础」的教程往往更吸引眼球。
最重要的是，当那个读者是你自己的时候，你可以无负担地重新 get 到文章的完整内容，而不需要为了读懂它而去查找别的资料。&lt;/p&gt;
&lt;p&gt;另一方面，你以最通俗的方式描述知识的过程，其实就是把模棱两可的东西变得清晰的过程。
这样一来，你在回忆这个知识的时候就不存在任何思维负担了，因为你已经把它变成了一个完整的故事。&lt;/p&gt;
&lt;p&gt;如果写博文时不遵循「面向陌生人」原则，出发点等同于甚至高于主体内容，那么在外人看来，这篇文章就是单纯的作秀，炫耀自己会别人不会的东西。
这种博文，其实没有起到分享知识的作用。&lt;/p&gt;
&lt;p&gt;有点难理解？回忆一下你在 B 站上逛到的那些「开源」项目，哪些让你心动复刻，哪些你看了两眼就关掉了？&lt;/p&gt;
&lt;h2 id=&#34;知识共享平台的更多可能性&#34;&gt;知识共享平台的更多可能性
&lt;/h2&gt;&lt;p&gt;所谓的「知识分享平台」其实很多，B 站上有不少知识区 up 主，微信有海量学习公众号，GitHub 上有许多开源社区，甚至自救群也算得上。&lt;/p&gt;
&lt;p&gt;我在这里想讨论的是 HOA 这样，面向中等规模群众（如 HITSZ 本科生）的开源社区。&lt;/p&gt;
&lt;p&gt;开源社区与其他类型平台的区别在于，所有的内容都透明公开，不存在任何商业利益。
对比之下，你并不知道 B 站 up 主或微信公众号的内部是如何运作的。
它们面向的是全网多数用户，并不一定能满足某个特定用户或者群体的全部需求。&lt;/p&gt;
&lt;p&gt;作为开源组织，我们可以深入地调查同学们的需要，然后根据反馈进行更新内容。
更重要的是，开源平台的 Pull Request 机制允许所有人参与到平台维护和内容创作中来。
这也是我认为最被忽视的一点。&lt;/p&gt;
&lt;p&gt;由于我们的内容是以网站的形式呈现给大家的，而真正的仓库托管在 GitHub 上，不少同学对 HOA 的印象可能还停留在类似「微信公众号」的组织。&lt;/p&gt;
&lt;p&gt;我们不是单向地向大家搬运信息！你所阅读到的文档、下载的资料，除了组织内部成员整理，还有无数普通学生的贡献。
所以我看到自救群里有人质问「HOA 上某某课程怎么没有资料」时，我其实是很无语的。
没有人有义务去上传这些资料，HOA 也只是提供了平台。&lt;/p&gt;
&lt;p&gt;因此，开源社区的活跃非常依赖用户与核心成员的&lt;strong&gt;双向&lt;/strong&gt;互动。
如果只有核心成员在维护仓库，用户只是单向消费内容，那么 HOA 就和微信公众号一样，随时可以停更跑路；&lt;/p&gt;
&lt;p&gt;另一个极端就是自救群。
自救群的优势在于门槛和发言成本很低，用户参与度可以非常高。&lt;/p&gt;
&lt;p&gt;但是自救群有突出的问题：信息流量大，导致信息质量参差不齐，且时效性太强。&lt;/p&gt;
&lt;p&gt;举个例子，某同学在群里为一道题提供了非常优质的解答，但是很快就被后面的消息淹没了。
后来的学生遇到相同的问题，很难检索到这条消息。
虽然 QQ 群有诸如「精华消息」的功能，但精华消息设置得太多，其实就没有精华了。&lt;/p&gt;
&lt;p&gt;如果答主将解答以文件或者博客的形式上传到 HOA，就可以长期保存且不失曝光度。&lt;/p&gt;
&lt;p&gt;HOA 作为开源社区，可以在「双向交流」和「组织度」方面，一定程度上规避微信公众号和自救群的不足。
这也是我认为 HOA 重要的发展方向。&lt;/p&gt;
&lt;p&gt;我希望同学们能多多参与到 HOA 的维护中来
（其实我们已经有很多努力了，你会注意到大多数页面下方有评论区，我们也有专门的邮箱接受邮件，更别忘了你可以直接提 Pull Request！），
这并不只是为了 HOA，你其实在这个过程中也会有非常多的收获。
你问能收获什么？我在本文第一部分就说过啦！&lt;/p&gt;
&lt;p&gt;总的来说，开源社区，也许是未来的知识分享平台的一种可能，会比公众号、自救群走得更远。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;闲言碎语，不成体系，但我希望这篇文章能给你一些启发。
最后，祝 HITSZ OpenAuto 生日快乐。我想在有生之年，看见你成为最棒的知识共享平台。&lt;/p&gt;
&lt;hr&gt;
&lt;blockquote&gt;
&lt;p&gt;关于参与维护，如果你不知道从哪里开始，看一看你正在学习哪一学期的课程，对应文档上有没有「过期」的内容？
如果有，这就是你贡献的大好机会！
试着更新一下课程的基本信息，就是你在 HOA 上的一次重要贡献！&lt;/p&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;封面：&lt;a class=&#34;link&#34; href=&#34;https://www.pixiv.net/artworks/64894936&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;フランの夢は睡深 36,000 歩 by &lt;em&gt;こざくら&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;
</description>
        </item>
        <item>
        <title>使用 SSH 连接 GitHub</title>
        <link>https://keinestudio.cn/posts/ssh-github/</link>
        <pubDate>Fri, 27 Sep 2024 16:35:00 +0800</pubDate>
        
        <guid>https://keinestudio.cn/posts/ssh-github/</guid>
        <description>&lt;p&gt;本文记录如何为 Linux 系统配置 SSH 密钥，以便在不输入用户名和密码的情况下连接 GitHub。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;参考：&lt;a class=&#34;link&#34; href=&#34;https://docs.github.com/zh/authentication/connecting-to-github-with-ssh&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;通过 SSH 连接到 GitHub - Github 文档&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;h2 id=&#34;检查现有-ssh-密钥&#34;&gt;检查现有 SSH 密钥
&lt;/h2&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#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;ls -al ~/.ssh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;检查输出结果中是否含有 id_rsa.pub / id_ecdsa.pub / &lt;em&gt;id_ed25519.pub&lt;/em&gt; 文件。例如&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#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;m&#34;&gt;20&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;drwx------  &lt;span class=&#34;m&#34;&gt;2&lt;/span&gt; jay jay &lt;span class=&#34;m&#34;&gt;4096&lt;/span&gt; x月  xx xx:xx .
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;drwxr-xr-x &lt;span class=&#34;m&#34;&gt;30&lt;/span&gt; jay jay &lt;span class=&#34;m&#34;&gt;4096&lt;/span&gt; x月  xx xx:xx ..
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;-rw-------  &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; jay jay  &lt;span class=&#34;m&#34;&gt;432&lt;/span&gt; x月  xx xx:xx id_ed25519
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;-rw-r--r--  &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; jay jay  &lt;span class=&#34;m&#34;&gt;118&lt;/span&gt; x月  xx xx:xx id_ed25519.pub
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;-rw-r--r--  &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; jay jay  &lt;span class=&#34;m&#34;&gt;444&lt;/span&gt; x月  xx xx:xx known_hosts
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;说明这个用户已经有一个 SSH 密钥了。&lt;/p&gt;
&lt;p&gt;当然，如果没有出现这些文件，或者用户目录下根本没有 &lt;code&gt;.ssh&lt;/code&gt; 文件夹，那么说明该用户需要生成新的 SSH 密钥。&lt;/p&gt;
&lt;h2 id=&#34;生成新的-ssh-密钥&#34;&gt;生成新的 SSH 密钥
&lt;/h2&gt;&lt;p&gt;输入以下命令，将 &amp;ldquo;&lt;a class=&#34;link&#34; href=&#34;mailto:your_email@example.com&#34; &gt;your_email@example.com&lt;/a&gt;&amp;rdquo; 替换为 GitHub 邮箱地址。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#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;ssh-keygen -t ed25519 -C &lt;span class=&#34;s2&#34;&gt;&amp;#34;your_email@example.com&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#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;&amp;gt; Generating public/private ALGORITHM key pair.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;当系统提示 &amp;ldquo;Enter a file in which to save the key（输入要保存密钥的文件）&amp;rdquo; 时，可以按 Enter 键接受默认文件位置。&lt;/p&gt;
&lt;p&gt;但如果已经有了已经有了一个密钥文件，则 ssh-keygen 可能会要求重写另一个密钥，在这种情况下，建议创建自定义命名的 SSH 密钥。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#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;&amp;gt; Enter a file in which to save the key &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;/home/YOU/.ssh/id_ALGORITHM&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;:&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;Press enter&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;如果想为 SSH 密钥添加密码，在下列提示出现时设置。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#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;&amp;gt; Enter passphrase &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;empty &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; no passphrase&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;: &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;Type a passphrase&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;&amp;gt; Enter same passphrase again: &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;Type passphrase again&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;将-ssh-密钥添加到-ssh-agent&#34;&gt;将 SSH 密钥添加到 ssh-agent
&lt;/h2&gt;&lt;h3 id=&#34;在后台启动-ssh-代理&#34;&gt;在后台启动 ssh 代理
&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#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;eval&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;ssh-agent -s&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;如果 ssh-agent 没有启动，输入 &lt;code&gt;exec ssh-agent bash&lt;/code&gt;（或 &lt;code&gt;zsh&lt;/code&gt;，取决于终端）。&lt;/p&gt;
&lt;h3 id=&#34;将-ssh-私钥添加到-ssh-agent&#34;&gt;将 SSH 私钥添加到 ssh-agent
&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#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;ssh-add ~/.ssh/id_ed25519
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;如果使用其他名称创建了密钥，或要添加具有其他名称的现有密钥，请将命令中的 id_ed25519 替换为私钥文件的名称。&lt;/p&gt;
&lt;h2 id=&#34;添加-ssh-密钥到-github&#34;&gt;添加 SSH 密钥到 GitHub
&lt;/h2&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#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;cat ~/.ssh/id_ed25519.pub
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;将输出的内容复制到剪贴板。&lt;/p&gt;
&lt;p&gt;在 GitHub 网页上，点击右上角的头像，选择 &lt;code&gt;Settings&lt;/code&gt; -&amp;gt; &lt;code&gt;SSH and GPG keys&lt;/code&gt; -&amp;gt; &lt;code&gt;New SSH key&lt;/code&gt;。
将复制的 SSH 密钥粘贴到 &lt;code&gt;Key&lt;/code&gt; 输入框中，点击 &lt;code&gt;Add SSH key&lt;/code&gt;。&lt;/p&gt;
&lt;h2 id=&#34;测试-ssh-连接&#34;&gt;测试 SSH 连接
&lt;/h2&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#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;ssh -T git@github.com
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;可能会出现以下提示：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#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;&amp;gt; The authenticity of host &lt;span class=&#34;s1&#34;&gt;&amp;#39;github.com (IP ADDRESS)&amp;#39;&lt;/span&gt; can&lt;span class=&#34;err&#34;&gt;&amp;#39;&lt;/span&gt;t be established.
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;gt; ED25519 key fingerprint is SHA256:....
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;gt; Are you sure you want to &lt;span class=&#34;k&#34;&gt;continue&lt;/span&gt; connecting &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;yes/no&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;?
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;验证所看到消息中的指纹是否与 GitHub 的公钥指纹匹配。如果是，则键入 yes：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#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;&amp;gt; Hi USERNAME! You&lt;span class=&#34;err&#34;&gt;&amp;#39;&lt;/span&gt;ve successfully authenticated, but GitHub does not
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;gt; provide shell access.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;之后，就可以在不输入用户名和密码的情况下连接 GitHub 了。&lt;/p&gt;
&lt;p&gt;从网站上克隆仓库的时候，记得使用 SSH 地址而不是 HTTPS。&lt;/p&gt;
</description>
        </item>
        <item>
        <title>WSL 快速配置自查手册</title>
        <link>https://keinestudio.cn/posts/wsl-setup/</link>
        <pubDate>Sun, 01 Sep 2024 11:08:00 +0800</pubDate>
        
        <guid>https://keinestudio.cn/posts/wsl-setup/</guid>
        <description>&lt;img src="https://keinestudio.cn/posts/wsl-setup/neofetch.png" alt="Featured image of post WSL 快速配置自查手册" /&gt;&lt;p&gt;本文以 Windows 11、WSL 2 和 Ubuntu 20.04 LTS 为例，记录从零开始配置 WSL 以及一些常用开发环境的过程。&lt;/p&gt;
&lt;p&gt;此外，本文提到的镜像源均指 HITSZ OSA Mirrors。配合校园网食用效果更佳。&lt;/p&gt;
&lt;h2 id=&#34;安装-wsl&#34;&gt;安装 WSL
&lt;/h2&gt;&lt;p&gt;方法 1：直接在 Windows 应用商店搜索 Ubuntu，选择对应发行版点击安装。&lt;/p&gt;
&lt;p&gt;方法 2：使用 WSL 命令行安装。参考 &lt;a class=&#34;link&#34; href=&#34;https://learn.microsoft.com/zh-cn/windows/wsl/install&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;如何使用 WSL 在 Windows 上安装 Linux - Microsoft Learn&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;设置软件镜像源&#34;&gt;设置软件镜像源
&lt;/h2&gt;&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://mirrors-help.osa.moe/ubuntu/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Ubuntu 软件仓库镜像使用帮助 - MirrorZ Help&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;/etc/apt/sources.list&lt;/code&gt;&lt;/p&gt;
&lt;h2 id=&#34;设置系统语言为中文&#34;&gt;设置系统语言为中文
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;安装中文语言包&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#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 language-pack-zh-hans
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;设置中文为默认语言&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#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 dpkg-reconfigure locales
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;选中 en_US.UTF-8 和 zh-CN.UTF-8；选择 zh-CN.UTF-8 为默认语言&lt;/p&gt;
&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;安装字体管理工具 fontconfig&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#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 fontconfig
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ol start=&#34;4&#34;&gt;
&lt;li&gt;让 Linux 使用 Windows 已安装的字体&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#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 nano /etc/fonts/local.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;写入以下内容&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;&amp;lt;?xml version=&amp;#34;1.0&amp;#34;?&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;cp&#34;&gt;&amp;lt;!DOCTYPE fontconfig SYSTEM &amp;#34;fonts/dtd&amp;#34;&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;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;fontconfig&lt;/span&gt;&lt;span class=&#34;p&#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;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;dir&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;/mnt/c/Windows/Fonts&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;dir&lt;/span&gt;&lt;span class=&#34;p&#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;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;fontconfig&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;也可将 &lt;code&gt;C:\Windows\Fonts&lt;/code&gt; 中的字体复制到 &lt;code&gt;/usr/local/share/fonts&lt;/code&gt; 目录下。&lt;/p&gt;
&lt;ol start=&#34;5&#34;&gt;
&lt;li&gt;刷新字体缓存&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#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 fc-cache -fv
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;以上参考自
&lt;a class=&#34;link&#34; href=&#34;https://blog.csdn.net/weixin_43589764/article/details/124327175&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;学习笔记：WSL Ubuntu 20.04 LTS 安装中文语言 - CSDN&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;h2 id=&#34;我最爱的-oh-my-posh&#34;&gt;我最爱的 Oh My Posh
&lt;/h2&gt;&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://brew.sh/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Homebrew&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://ohmyposh.dev/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Oh My Posh&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;主题可以保存在 Windows 上，例如&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#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;# ~/.bashrc&lt;/span&gt;
&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;eval&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;oh-my-posh init bash --config /mnt/d/.../lambdageneration.omp.json&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;latex-编译器以-tex-live-2024-为例&#34;&gt;$LaTeX$ 编译器（以 TeX Live 2024 为例）
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;从 OSA 镜像站的 &lt;code&gt;CTAN/systems/texlive/Images&lt;/code&gt; 下载 &lt;code&gt;texlive2024.iso&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;在 Windows 上装载光驱，记住对应盘符（如 &lt;code&gt;F:&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;Ubuntu 上挂载光驱&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#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 mkdir /mnt/texlive
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo mount -t drvfs F: /mnt/texlive
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ol&gt;
&lt;li&gt;开始安装&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#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 /mnt/texlive/install-tl
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;按照提示操作，等待选定的软件包被安装。&lt;/p&gt;
&lt;p&gt;记得添加环境变量到 &lt;code&gt;.bashrc&lt;/code&gt;：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#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;# TeX Live&lt;/span&gt;
&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;export&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;PATH&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/usr/local/texlive/2024/bin/x86_64-linux:&lt;span class=&#34;nv&#34;&gt;$PATH&lt;/span&gt;
&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;export&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;MANPATH&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/usr/local/texlive/2024/texmf-dist/doc/man:&lt;span class=&#34;nv&#34;&gt;$MANPATH&lt;/span&gt;
&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;export&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;INFOPATH&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/usr/local/texlive/2024/texmf-dist/doc/info:&lt;span class=&#34;nv&#34;&gt;$INFOPATH&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ol start=&#34;5&#34;&gt;
&lt;li&gt;安装完成后解除挂载状态，并删除安装包&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#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 umount /mnt/texlive
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo rm -r /mnt/texlive/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;额外内容&lt;/strong&gt;：让 Windows Powershell 能直接访问 WSL 的环境变量，建立到 TeX 的软连接。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#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 /usr/local/texlive/2024/bin/x86_64-linux/tlmgr path add
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;在 Windows Powershell 中测试：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#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;wsl tex -v
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;你甚至可以在 Windows 下的 VS Code
&lt;a class=&#34;link&#34; href=&#34;https://marketplace.visualstudio.com/items?itemName=James-Yu.latex-workshop&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;LaTeX Workshop&lt;/a&gt;
插件中使用 WSL 的编译器！
修改 &lt;code&gt;latex-workshop.latex.tools&lt;/code&gt; 的各个 &lt;code&gt;&amp;quot;command&amp;quot;&lt;/code&gt; 即可。例：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#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;s2&#34;&gt;&amp;#34;latex-workshop.latex.tools&amp;#34;&lt;/span&gt;&lt;span class=&#34;err&#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;nt&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;xelatex&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;nt&#34;&gt;&amp;#34;command&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;wsl xelatex&amp;#34;&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;nt&#34;&gt;&amp;#34;args&amp;#34;&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;s2&#34;&gt;&amp;#34;-synctex=1&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;s2&#34;&gt;&amp;#34;-interaction=nonstopmode&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;s2&#34;&gt;&amp;#34;-file-line-error&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;s2&#34;&gt;&amp;#34;%DOCFILE%&amp;#34;&lt;/span&gt;
&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;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;ros以-ros-noetic-为例&#34;&gt;ROS（以 ROS Noetic 为例）
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;添加 OSA 镜像站的 ROS 源&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#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 sh -c &lt;span class=&#34;s1&#34;&gt;&amp;#39;echo &amp;#34;deb http://mirrors.osa.moe/ros/ubuntu/ focal main&amp;#34; &amp;gt; /etc/apt/sources.list.d/ros-latest.list&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;手动编辑：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#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;# /etc/apt/sources.list.d/ros-latest.list&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;deb https://mirrors.osa.moe/ros/ubuntu/ focal main
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;添加 ROS 的 GPG 密钥&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;以下两条命令二选一，任一成功即可。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#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-key adv --keyserver &lt;span class=&#34;s1&#34;&gt;&amp;#39;hkp://keyserver.ubuntu.com:80&amp;#39;&lt;/span&gt; --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#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 curl
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;curl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; sudo apt-key add -
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;安装 ROS Noetic 桌面完整版&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#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 update
&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;#「命中:6 https://mirrors.osa.moe/ros/ubuntu focal Release」&lt;/span&gt;
&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;# 则说明前 2 步成功&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo apt install ros-noetic-desktop-full
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ol start=&#34;4&#34;&gt;
&lt;li&gt;设置环境变量&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#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;echo&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;source /opt/ros/noetic/setup.bash&amp;#34;&lt;/span&gt; &amp;gt;&amp;gt; ~/.bashrc &lt;span class=&#34;c1&#34;&gt;# 添加 ROS 配置文件到环境变量&lt;/span&gt;
&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;source&lt;/span&gt; ~/.bashrc &lt;span class=&#34;c1&#34;&gt;# 使配置生效&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ol start=&#34;5&#34;&gt;
&lt;li&gt;安装 ROS 配套工具&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#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-rosdep python3-rosinstall python3-rosinstall-generator python3-wstool build-essential
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ol start=&#34;6&#34;&gt;
&lt;li&gt;初始化 rosdep&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;这一步就 2 个命令：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#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 rosdep init
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#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;rosdep update
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;如果没有科学上网，这一步可能会很困难。参考&lt;/p&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://blog.csdn.net/LaineGates/article/details/120910628#t7&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;win10 wsl2 + ubuntu20.04 配置 ROS-Noetic - CSDN&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;和 &lt;a class=&#34;link&#34; href=&#34;https://mirrors-help.osa.moe/rosdistro/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;ROS Distro 镜像使用帮助 - MirrorZ Help&lt;/a&gt; 解决。&lt;/p&gt;
</description>
        </item>
        <item>
        <title>往地上看</title>
        <link>https://keinestudio.cn/posts/look-down/</link>
        <pubDate>Sun, 26 May 2024 19:05:12 +0800</pubDate>
        
        <guid>https://keinestudio.cn/posts/look-down/</guid>
        <description>&lt;p&gt;我小时候，有一个习惯，那就是往地上看。
看地上有什么稀奇的小玩意，还会把它们捡起来。&lt;/p&gt;
&lt;p&gt;我那时候还没有近视，地上的东西我看得很清楚；身高也不高，因此地面对我来说非常近，轻轻一蹲就能够着地面。&lt;/p&gt;
&lt;p&gt;我从地上捡到过很多东西，硬币、包装纸、小石子、打火机的点火装置、昆虫、积木零件、BB 弹（玩具枪的子弹）……
无一例外，我不嫌脏地把它们带回家拿给大人看，像乌鸦收藏闪闪发光的物品一样。&lt;/p&gt;
&lt;p&gt;父亲觉得我的行为很好笑，还给我取了个称号：“垃圾娃儿”（四川方言）&lt;/p&gt;
&lt;p&gt;当然，我捡到的很多东西基本上都没有保留到今天，因为它们中的大多数确实是垃圾。&lt;/p&gt;
&lt;p&gt;但是往地上看的习惯让我养成了敏锐的观察力，至少那个时候，老师还会称赞这一点。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;昨天晚上我沿着大沙河散步，顺便去逛商场。
时间大概是六七点，深圳这个时候还没有日落。&lt;/p&gt;
&lt;p&gt;我走在铺了沥青的步行道上，听着耳机里的音乐，手插裤兜，一副很享受的样子。&lt;/p&gt;
&lt;p&gt;我路过一大群在玩耍的小孩，围着健身设施上蹿下跳。&lt;/p&gt;
&lt;p&gt;看着那些小孩，我好像想起了什么似的（也许是因为小孩比成年人矮一截所以需要低头吧）往地上看去。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;我什么也没看见&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;这个念头着实使我吓了一跳。
眼前虽然是红色的柏油路面，但对于《小王子》中的那些 “grown-ups” 来说，等于空无一物。&lt;/p&gt;
&lt;p&gt;是的，我已经二十岁了。
我的身高在同龄人中仍是矮的，但确实已经比小孩高了很多。
而且，我戴上了眼镜。&lt;/p&gt;
&lt;p&gt;地面对我来说变得好远、变得好模糊。&lt;/p&gt;
&lt;p&gt;低头？对不起，会被人说弯腰驼背。&lt;/p&gt;
&lt;p&gt;蹲下去捡东西？对现在的我来说只是浪费本来就少的自由时间。&lt;/p&gt;
&lt;p&gt;我早已丢掉了往地上看的习惯，也看不清地上了。&lt;/p&gt;
&lt;p&gt;或许地上还会有什么小玩意能够引起我的兴趣，我已经不屑于去发现它们了。&lt;/p&gt;
&lt;p&gt;我当然希望自己还能发现一些普通人看不见的东西，可惜满地都是月亮的时候，我在仰望天上的六便士。&lt;/p&gt;
</description>
        </item>
        <item>
        <title>20</title>
        <link>https://keinestudio.cn/posts/20/</link>
        <pubDate>Tue, 16 Jan 2024 00:00:00 +0800</pubDate>
        
        <guid>https://keinestudio.cn/posts/20/</guid>
        <description>&lt;p&gt;大概离生日前一个月就有写这篇博客的想法了。
这一个月里，各种各样的念头在脑中闪现，有些是一些自己觉得很有意思的句子，然而我很快就把它们给忘掉了；能想起来的那部分，也不知道该放在文章的哪一节。&lt;/p&gt;
&lt;p&gt;所以这篇文章看起来就像不肯在一张完整的稿纸上写字，而是非要把纸先撕碎，然后再在每一小片上写字一样。
但是大多数人的写作都好不到哪儿去，所以你也别在意这些。&lt;/p&gt;
&lt;h2 id=&#34;我的前-18-年&#34;&gt;我的前 18 年
&lt;/h2&gt;&lt;p&gt;我是独生子，出生在普通的家庭。
父母属于九十年代从农村里走进城市的那一批人，深知农民的辛苦，因此对于生活的要求就是轻松安稳。
但哪怕是“轻松安稳”，对于小老百姓来说也并非易事，因此哪怕他们用认真的态度对待教育，在我的眼中总有一种“活着就是为了活着”的感觉。&lt;/p&gt;
&lt;p&gt;我的童年过得并不圆满，很多那个年代流行的东西我都没有机会去接触。&lt;/p&gt;
&lt;p&gt;小孩子最想做的事情是玩，但家里人将我的活动范围限制在小区里，因此我常常只能在阳台上对楼下等我的邻居小伙伴说“你们去吧”。
在家里，我只能趁家长不在的时候玩电脑游戏。&lt;/p&gt;
&lt;p&gt;家里人让我去上各种兴趣班，播音主持、钢琴、水粉画、硬笔书法……都是一些有始无终的事情，尤其是用笔画画成了我最不擅长的。&lt;/p&gt;
&lt;p&gt;转机是一张小学放学时偶然拿到的广告单。
我参加了一个机器人的兴趣班，接触到 LEGO Mindstorms NXT，后来跟着老师去少年宫参与科创班，成了那里年龄最大的学生。
活动的内容就是使用基础的 DIY 材料和电子元件设计一些小玩意儿，小车、小灯、小风扇等等……&lt;/p&gt;
&lt;p&gt;虽然看上去很幼稚，但我找到了真正喜欢的东西。&lt;/p&gt;
&lt;p&gt;小学五年级，少年宫的老师带着我和同学去成都打 FLL (First LEGO League)；六年级去成都参加青少年科技创新大赛，都拿了省一等奖。&lt;/p&gt;
&lt;p&gt;那段时间是我整个小学时代为数不多成就感满满的时光。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;初中时为了升学，我不得不放下所有的兴趣爱好。
学校老师经常布置许多占用大量时间但没有意义的作业；每个周末、寒暑假都被补习班填满，为的是考进省里的重点高中。&lt;/p&gt;
&lt;p&gt;我在小学展现出一点点数学方面的天赋。但初中数学老师教得非常差，面向自主招生考试的补习班培训也不重视基础，难度非常高，说得通俗点就是技能树点歪了，这导致我的数学从初中开始就两头不讨好。
这一点的影响一直持续到了今天：大学工科对于数学的要求不低，然而我的各门数学课成绩都拖了后腿。&lt;/p&gt;
&lt;p&gt;幸运的是我最终如愿考上了重点高中，这应该是我人生中最惊险的一次跳跃，因为它彻底改变了我的人生轨迹，否则在地方的普通高中，几乎是没有机会进入好的大学的。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;我的高中虽然对学习要求很严格，但好在对学生的压迫并不像衡水模式那样严酷，平时还能抽出时间休息。&lt;/p&gt;
&lt;p&gt;我很喜欢我的高中老师和同学们，接触到大城市里的人让我的精神世界得到了极大的拓展。&lt;/p&gt;
&lt;p&gt;但比较可惜的是，我仍没有机会去发展科创方面的爱好。开学时我加入了校里的机器人社团，但是第一天活动就被告知社团解散了，因为没有指导老师。
家长和老师都只盯着高考，所以我也没办法自己捣鼓别的东西。&lt;/p&gt;
&lt;p&gt;高考的分数比我预期的低了十来分的样子，但还在能接受的范围内。&lt;/p&gt;
&lt;p&gt;填报志愿时我和家里人纠结了很久，最后家人同意了我的想法：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;我要重拾我儿时的梦想，做自己最喜欢的事情。&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&#34;大学&#34;&gt;大学
&lt;/h2&gt;&lt;p&gt;我之所以想学自动化，是受到小时候接触的机器人的影响。
我对于这种软硬件结合的东西更感兴趣，因此我放弃了纯软件方向的计算机，尽管在 HITSZ，计算机一直是最强势的专业，并且我的高考分数完全可以进入。&lt;/p&gt;
&lt;p&gt;受到前文数学学习经历的影响，我在大学目前为止的成绩只能说还行，数理基础课都多少拖了后腿。&lt;/p&gt;
&lt;p&gt;然后就是一些我在&lt;a class=&#34;link&#34; href=&#34;../../about&#34; &gt;⌈关于⌋&lt;/a&gt;里提到过的经历了。&lt;/p&gt;
&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;/p&gt;
&lt;p&gt;这当然是一种非常自我中心的、不健康的心态，所以我选择了告诉自己不要那么去做。&lt;/p&gt;
&lt;p&gt;久而久之，我心中有什么想法都不愿意说给别人听了，因为在我的哲学里任何思维都是不完美的，注定会遭到他人的批评。
而且就目前我认识的人来看，也几乎没有人能够用一种相对客观友好的态度和我交流这类问题。
即使有，我也不想去打扰他们。&lt;/p&gt;
&lt;p&gt;尤其是到了大学，很不巧我的同班同学们表现得相当的内向，大家都在自己的圈子里生活。
我和其他人的兴趣爱好相差甚远，以至于一年多了，我也没有交到真正意义上的朋友，最多就是一些在办正事时会合作的熟人。&lt;/p&gt;
&lt;p&gt;身边随处是实力强大的同龄人，当我认识他们时我就已经意识到其中的一些是我用大学四年也追赶不上的。
虽然许多人会说这是一个很好的学习的机会，也有人鼓动我“向上社交”，但实际上哪有那么容易呢？&lt;/p&gt;
&lt;p&gt;当你意识到身边的人和你存在利益冲突的时候，真诚就几乎不存在了。&lt;/p&gt;
&lt;p&gt;一年多来，我不仅没有建立任何所谓的“深交”，反而在心中四处树立假想敌，荒唐地讨厌、蔑视、远离那些同龄人。&lt;/p&gt;
&lt;p&gt;这种恨，没有源头，没有结果，只会给自己带去痛苦与折磨，忘记自己为了什么而活着。&lt;/p&gt;
&lt;p&gt;仅仅度过了一个学期，我便进入了终日寡言的状态——一天只在购物或用餐的时刻，向店员挤出一两句选择或确认的字词，除此之外声带便可有可无；
有时候甚至于连这些声音也懒得发出了，连续 24 小时，除了沉默还是沉默。&lt;/p&gt;
&lt;p&gt;即时通讯软件的消息列表也整天空空如也，在一些群聊里旁观其他人为了鸡毛蒜皮的事情大费口舌，我甚至感叹人其实有这么多力气用来说话。&lt;/p&gt;
&lt;p&gt;住在荒岛上的鲁滨逊尚有《圣经》用来与上帝对话，我比鲁滨逊还不如。&lt;/p&gt;
&lt;p&gt;我害怕孤独，我不想就这样和世界的联系断开，那样的话，活着跟死了没有区别。&lt;/p&gt;
&lt;p&gt;我选择了戴上耳机，成瘾般地沉浸在音乐中。
音乐唤我醒来，伴我工作，助我入眠。
耳膜不停地震动，世界又恢复了一点生机。&lt;/p&gt;
&lt;p&gt;懂礼貌的人不会打扰戴上耳机的人，所以这样只会让日常中的交流进一步变得更少。
也就是说，治标不治本，与世界切断联系的那一天终将到来，而且是提前到来。&lt;/p&gt;
&lt;p&gt;转机是 &lt;a class=&#34;link&#34; href=&#34;https://github.com/HITSZ-OpenAuto&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;HITSZ OpenAuto&lt;/a&gt;。
在独自修炼技术的过程中我逐渐深入接触开源文化。&lt;/p&gt;
&lt;p&gt;互助与共享对我来说比在考试或者竞赛中打败其他人更加有成就感。
如果可以的话，我愿意终生活在开源社区里。&lt;/p&gt;
&lt;p&gt;我还没有丢掉自己的初心，但我在接下来很长的时光里不得不为自己的生计奔波。
在跃向自由王国之前，我只能在必然王国里苟且。&lt;/p&gt;
&lt;p&gt;寻找救赎的路，好长啊。&lt;/p&gt;
&lt;h2 id=&#34;写在最后&#34;&gt;写在最后
&lt;/h2&gt;&lt;p&gt;20 岁是一个重要的里程碑。
当你的年龄以 &amp;ldquo;2&amp;rdquo; 开头之后，你便失去了当小孩的资格；
肩上的负担也会日复一日的增加，只因你的年龄以 &amp;ldquo;2&amp;rdquo; 开头。&lt;/p&gt;
&lt;p&gt;人类社会一切不完美的存在，都可以归因于一句 “人会死”。&lt;/p&gt;
&lt;p&gt;在 19 岁的最后几天，我在脑海中生成了这样一段文字：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;人的意义在于留下了什么，而不在于拥有过什么。&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;这是我在年龄以 &amp;ldquo;1&amp;rdquo; 开头时，对这个世界予我的审讯的回答。
我要用它来反驳长辈“为活而活”，用它来反驳同龄人的零和博弈，用它来反驳社会加以所有纯洁的人的迫害。&lt;/p&gt;
&lt;p&gt;如果你不喜欢这样的说法，那就随你便吧，这是我在年龄以 &amp;ldquo;1&amp;rdquo; 开头时说的，小孩子说的话不算数。&lt;/p&gt;
&lt;p&gt;20 岁生日到来的这一天，判决书下来了，我 “自愿” 被放逐了。&lt;/p&gt;
&lt;p&gt;苦修，从现在才开始。&lt;/p&gt;
&lt;!---
过去的19岁，比起收获，我感觉自己失去的东西更多。我正在慢慢地远离这个世界，直到我发现自己在学校经常连续24小时无话可说时才意识到这一点。
这个20岁生日是在担忧与欣慰中度过的，担忧的是我会在未来的某一天与世界彻底断开联系，欣慰的是身边还有那么几个在乎我的人，至少还有家人。
还有很多想说的话我更新到个人博客里了。
谢谢村上春树，我在前天回家的火车上读完了你的《挪威的森林》。
---&gt;</description>
        </item>
        <item>
        <title>将 USB 设备连接到 WSL</title>
        <link>https://keinestudio.cn/posts/wsl-connect-usb/</link>
        <pubDate>Wed, 10 Jan 2024 20:56:12 +0800</pubDate>
        
        <guid>https://keinestudio.cn/posts/wsl-connect-usb/</guid>
        <description>&lt;img src="https://keinestudio.cn/posts/wsl-connect-usb/ESP32-Devkit.jpg" alt="Featured image of post 将 USB 设备连接到 WSL" /&gt;&lt;p&gt;最近在尝试使用 WSL 2 作为开发 &lt;code&gt;ESP-32&lt;/code&gt; 的工具，但是 WSL 不像 VMWare 虚拟机那样可以直接访问硬件，而是一个纯虚拟环境，无法直接访问 USB 设备，所以需要一些额外的工具来实现 USB 设备的共享。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;参考资料：&lt;a class=&#34;link&#34; href=&#34;https://learn.microsoft.com/zh-cn/windows/wsl/connect-usb&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;WSL/连接 USB 设备 - Microsoft Learn&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;2024.1.10 更新：usbipd 更新到了 4.0.0 版本，指令有所变化，本文已更新。&lt;/p&gt;&lt;/blockquote&gt;
&lt;h2 id=&#34;先决条件&#34;&gt;先决条件
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Windows 11（内部版本 22000 或更高版本）&lt;/li&gt;
&lt;li&gt;具有 x64/x86 处理器的计算机&lt;/li&gt;
&lt;li&gt;Linux 发行版已安装并设置为 WSL 2（本次使用的是 Ubuntu 20.04 LTS）&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;安装-uspipd-win-项目&#34;&gt;安装 USPIPD-WIN 项目
&lt;/h2&gt;&lt;h3 id=&#34;方法-1从-github-下载安装&#34;&gt;方法 1：从 GitHub 下载安装
&lt;/h3&gt;&lt;p&gt;仓库链接：&lt;a class=&#34;link&#34; href=&#34;https://github.com/dorssel/usbipd-win&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;usbipd-win&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;方法-2使用-windows-程序包管理器程序-winget-安装&#34;&gt;方法 2：使用 Windows 程序包管理器程序 (winget) 安装
&lt;/h3&gt;&lt;p&gt;打开 PowerShell 并运行以下命令：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;winget&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;install&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;-interactive&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-exact&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;dorssel&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;usbipd-win&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;在-linux-中安装-usbip-工具和硬件数据库&#34;&gt;在 Linux 中安装 USBIP 工具和硬件数据库
&lt;/h2&gt;&lt;p&gt;在 Ubuntu 中，运行以下命令安装工具和硬件数据库：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#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 linux-tools-generic hwdata
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;为了启用 USBIP 服务，运行以下命令：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#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 update-alternatives --install /usr/local/bin/usbip usbip /usr/lib/linux-tools/*-generic/usbip &lt;span class=&#34;m&#34;&gt;20&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;附加-usb-设备&#34;&gt;附加 USB 设备
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;通过管理员模式打开 PowerShell 并运行以下命令，列出所有连接到 Windows 的 USB 设备：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;usbipd&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;list&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;本次实验连接的是一个 &lt;code&gt;ESP-32 DevKit-C&lt;/code&gt;，输出如下：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Connected&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;BUSID&lt;/span&gt;  &lt;span class=&#34;n&#34;&gt;VID&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;PID&lt;/span&gt;    &lt;span class=&#34;n&#34;&gt;DEVICE&lt;/span&gt;                                                        &lt;span class=&#34;n&#34;&gt;STATE&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;mf&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;3&lt;/span&gt;    &lt;span class=&#34;n&#34;&gt;0b05&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;19b6&lt;/span&gt;  &lt;span class=&#34;n&#34;&gt;USB&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;输入设备&lt;/span&gt;                                                  &lt;span class=&#34;n&#34;&gt;Not&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;shared&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;mf&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;1&lt;/span&gt;    &lt;span class=&#34;n&#34;&gt;10c4&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ea60&lt;/span&gt;  &lt;span class=&#34;n&#34;&gt;CP2102&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;USB&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;to&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;UART&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Bridge&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Controller&lt;/span&gt;                          &lt;span class=&#34;n&#34;&gt;Not&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;shared&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;mf&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;2&lt;/span&gt;    &lt;span class=&#34;n&#34;&gt;258a&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;0049&lt;/span&gt;  &lt;span class=&#34;n&#34;&gt;USB&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;输入设备&lt;/span&gt;                                                  &lt;span class=&#34;n&#34;&gt;Not&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;shared&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;mf&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;3&lt;/span&gt;    &lt;span class=&#34;n&#34;&gt;13d3&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;3568&lt;/span&gt;  &lt;span class=&#34;n&#34;&gt;MediaTek&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Bluetooth&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Adapter&lt;/span&gt;                                    &lt;span class=&#34;n&#34;&gt;Not&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;shared&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;mf&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;1&lt;/span&gt;    &lt;span class=&#34;n&#34;&gt;13d3&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;56eb&lt;/span&gt;  &lt;span class=&#34;n&#34;&gt;USB2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;py&#34;&gt;0&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;HD&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;UVC&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;WebCam&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;USB2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;py&#34;&gt;0&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;IR&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;UVC&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;WebCam&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Camera&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;DFU&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;De&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;...&lt;/span&gt;  &lt;span class=&#34;n&#34;&gt;Not&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;shared&lt;/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;Persisted&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;GUID&lt;/span&gt;                                  &lt;span class=&#34;n&#34;&gt;DEVICE&lt;/span&gt;
&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;2ca6f2f5&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;41c6&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;431c-ac86&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;44107478c8da&lt;/span&gt;  &lt;span class=&#34;nb&#34;&gt;USB-SERIAL&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;CH340&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;COM5&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;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;这里面 &lt;code&gt;CP2102 USB to UART Bridge Controller&lt;/code&gt; 就是我们想要连接的开发板了，它的设备总线 ID 是 &lt;code&gt;2-1&lt;/code&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;选择要附加到 WSL 的设备总线 ID，然后共享出去：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;usbipd&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;bind&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;-b&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;bus_id&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;其中 &lt;code&gt;&amp;lt;bus_id&amp;gt;&lt;/code&gt; 是要共享的设备总线 ID，即步骤 1 中输出的“&lt;code&gt;2-1&lt;/code&gt;”。&lt;/p&gt;
&lt;p&gt;这一步对于一个 USB 设备只需要执行一次，它的 &lt;code&gt;STATE&lt;/code&gt; 就会变成 &lt;code&gt;Shared&lt;/code&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;然后运行以下命令：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;usbipd&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;attach&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;-b&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;bus_id&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;-wsl&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;同样，&lt;code&gt;&amp;lt;bus_id&amp;gt;&lt;/code&gt; 是要附加的设备总线 ID，即“&lt;code&gt;2-1&lt;/code&gt;”。
此时设备就会从 Windows 上断开连接，并且在 WSL 上显示为一个 USB 设备。&lt;/p&gt;
&lt;p&gt;如果没有执行第 2 步的命令，那么 usbipd 会报错：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;usbipd&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;error&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Device&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;is&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;shared&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;run&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;usbipd bind -b 2-1&amp;#39;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;as&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;administrator&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;first&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;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在 Ubuntu 中，运行以下命令，列出所有连接到 WSL 的 USB 设备：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#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;lsusb
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;然后就成功显示到了开发板：&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://keinestudio.cn/posts/wsl-connect-usb/lsusb.png&#34;
	width=&#34;1368&#34;
	height=&#34;706&#34;
	srcset=&#34;https://keinestudio.cn/posts/wsl-connect-usb/lsusb_hu_f9d4560bc4ad70ea.png 480w, https://keinestudio.cn/posts/wsl-connect-usb/lsusb_hu_eeedbbdfcf9ec6f2.png 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;lsusb&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;193&#34;
		data-flex-basis=&#34;465px&#34;
	
&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;测试连接以及断开连接&#34;&gt;测试连接以及断开连接
&lt;/h2&gt;&lt;p&gt;我提前在 WSL 上用 &lt;code&gt;esp-idf&lt;/code&gt; 工具链编译了一个简单的 hello-world 程序，现在尝试用 &lt;code&gt;esp-idf&lt;/code&gt; 工具链将 WSL 中的项目烧录到开发板上。&lt;/p&gt;
&lt;p&gt;通过 &lt;code&gt;ls /dev/tty*&lt;/code&gt; 命令查找到开发板的串口设备为 &lt;code&gt;/dev/ttyUSB0&lt;/code&gt;，所以可以运行以下命令烧录程序：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#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;idf.py -p /dev/ttyUSB0 flash
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;img src=&#34;https://keinestudio.cn/posts/wsl-connect-usb/flash.png&#34;
	width=&#34;2559&#34;
	height=&#34;1370&#34;
	srcset=&#34;https://keinestudio.cn/posts/wsl-connect-usb/flash_hu_aaaa7dedafe651e7.png 480w, https://keinestudio.cn/posts/wsl-connect-usb/flash_hu_b8fa476eff5d1ad.png 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;flash&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;186&#34;
		data-flex-basis=&#34;448px&#34;
	
&gt;&lt;/p&gt;
&lt;p&gt;我也尝试了直接使用设备总线 ID 来烧录程序，但没有成功……&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#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;idf.py -p /dev/bus/usb/002/001 flash
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;输出如下：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#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;esptool.py v3.3.4-dev
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Serial port /dev/bus/usb/002/001
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Traceback &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;most recent call last&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;  File &lt;span class=&#34;s2&#34;&gt;&amp;#34;/home/jay/.espressif/python_env/idf4.4_py3.8_env/lib/python3.8/site-packages/serial/serialposix.py&amp;#34;&lt;/span&gt;, line 322, in open
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    self.fd &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; os.open&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;self.portstr, os.O_RDWR &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; os.O_NOCTTY &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; os.O_NONBLOCK&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;PermissionError: &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;Errno 13&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; Permission denied: &lt;span class=&#34;s1&#34;&gt;&amp;#39;/dev/bus/usb/002/001&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;嘛，不管那个了，运行串口监视器，可以看到开发板是正常运行的：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#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;idf.py -p /dev/ttyUSB0 monitor
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;img src=&#34;https://keinestudio.cn/posts/wsl-connect-usb/serial-monitor.png&#34;
	width=&#34;2559&#34;
	height=&#34;1370&#34;
	srcset=&#34;https://keinestudio.cn/posts/wsl-connect-usb/serial-monitor_hu_10cf7ae06197ceef.png 480w, https://keinestudio.cn/posts/wsl-connect-usb/serial-monitor_hu_2c81136424babed5.png 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;serial-monitor&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;186&#34;
		data-flex-basis=&#34;448px&#34;
	
&gt;&lt;/p&gt;
&lt;p&gt;使用结束后，其实可以直接将 USB 设备从电脑上拔出，或者在管理员模式下运行 PowerSheell 命令来断开连接：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;usbipd&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;detach&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;-b&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;busid&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;粗暴一点，可以直接断开所有的 USB 设备：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;usbipd&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;detach&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;-all&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;实际操作下来，使用命令断开 WSL 的 USB 连接后，Windows 上的设备管理器中又显示出了设备。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://keinestudio.cn/posts/wsl-connect-usb/device-manager.png&#34;
	width=&#34;1110&#34;
	height=&#34;786&#34;
	srcset=&#34;https://keinestudio.cn/posts/wsl-connect-usb/device-manager_hu_fe0fb0742458aeb2.png 480w, https://keinestudio.cn/posts/wsl-connect-usb/device-manager_hu_f6ae6d08d82adff5.png 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;device-manager&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;141&#34;
		data-flex-basis=&#34;338px&#34;
	
&gt;&lt;/p&gt;
&lt;h2 id=&#34;新功能自动重连&#34;&gt;（新功能）自动重连
&lt;/h2&gt;&lt;p&gt;usbipd 在 4.0.0 版本后增加了自动重连功能，也就是说，我们可以仅通过运行一个命令让电脑一直检测 USB 设备的连接状态，如果设备被物理断连后重新接入，则自动重新连接到 WSL。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;usbipd&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;attach&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;-busid&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;bus_id&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;-wsl&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;其中 &lt;code&gt;-a&lt;/code&gt; 等效于 &lt;code&gt;--auto-attach&lt;/code&gt;，表示在设备断开连接后自动重新连接。&lt;/p&gt;
&lt;p&gt;演示效果：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;usbipd&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;info&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Using&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;WSL&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;distribution&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;Ubuntu-20.04&amp;#39;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;to&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;attach&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;the&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;device&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;will&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;be&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;available&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;all&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;WSL&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;2&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;distributions&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;usbipd&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;info&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Using&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;IP&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;address&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;172.30&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;py&#34;&gt;208&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;py&#34;&gt;1&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;to&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;reach&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;the&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;host&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;usbipd&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;info&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Starting&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;endless&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;attach&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;loop&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;press&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Ctrl&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;C&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;to&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;quit&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;WSL&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;wsl&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;�&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;hKm0R&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;localhost&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;�&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;NtM&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;�&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;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;err&#34;&gt;�&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;FO&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;g&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;n&#34;&gt;P0R&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;WSL0NAT&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;!&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;j_&lt;/span&gt;
&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;N&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;�&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;v&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;WSL&lt;/span&gt;
&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;WSL&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;N&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ec&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;localhost&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;�&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Nt0&lt;/span&gt;
&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;WSL&lt;/span&gt;
&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;WSL&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Attached&lt;/span&gt;
&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;WSL&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Detached&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;&amp;lt;-&lt;/span&gt; &lt;span class=&#34;n&#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;WSL&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;usbip&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;error&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Attach&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Request&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;1&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;failed&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Device&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;found&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;&amp;lt;-&lt;/span&gt; &lt;span class=&#34;n&#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;WSL&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Attached&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;&amp;lt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;重新插入设备后再次连接&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;这对于需要反复插拔的单片机开发板来说就相当方便了。&lt;/p&gt;
</description>
        </item>
        <item>
        <title>一种实用的 C/C&#43;&#43;/C# 代码注释方法</title>
        <link>https://keinestudio.cn/posts/a-useful-code-annotation/</link>
        <pubDate>Tue, 28 Nov 2023 11:04:03 +0800</pubDate>
        
        <guid>https://keinestudio.cn/posts/a-useful-code-annotation/</guid>
        <description>&lt;img src="https://keinestudio.cn/posts/a-useful-code-annotation/screenshot.png" alt="Featured image of post 一种实用的 C/C&#43;&#43;/C# 代码注释方法" /&gt;&lt;p&gt;刚考完复变函数与积分变换，有一个星期可以喘息一下了。
我闲得没事干，就开始在 &lt;a class=&#34;link&#34; href=&#34;https://learn.microsoft.com/zh-cn/training&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Microsoft Learn&lt;/a&gt; 上学习 C#。&lt;/p&gt;
&lt;h2 id=&#34;普通的注释方法怎么你了&#34;&gt;普通的注释方法怎么你了？
&lt;/h2&gt;&lt;p&gt;和以前学习 C 和 C++ 一样，我又回到了那个照着例程抄写、反复调试运行的过程。
这里面将代码注释掉是一个常见的操作。
一般来说，我们要想注释一行 C 语言风格的代码（对 C/C++/C# 都适用），常用 &lt;code&gt;//&lt;/code&gt;：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#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;c1&#34;&gt;// printf(&amp;#34;Hello, world!\n&amp;#34;);
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;如果是一大段的代码，我们常用 &lt;code&gt;/* */&lt;/code&gt;：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#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;cm&#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;cm&#34;&gt;int main()
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#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;cm&#34;&gt;    printf(&amp;#34;Hello, world!\n&amp;#34;);
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;    return 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;cm&#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;cm&#34;&gt;*/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;但是这两种方法都有一定的不方便的地方。
首先，对于第一种注释方法，即使 VS Code 有 &lt;code&gt;Ctrl+/&lt;/code&gt; 快捷键，但是每一行都要加上 &lt;code&gt;//&lt;/code&gt; 还是有点麻烦。
而且对于像我这种书写格式强迫症来说，当我看到以下第 2 行的注释时，我会忍不住给它加个空格变成第 1 行的样子：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#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;c1&#34;&gt;// printf(&amp;#34;Hello, world!\n&amp;#34;);
&lt;/span&gt;&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;//printf(&amp;#34;Hello, world!\n&amp;#34;);
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;其次，对于第二种注释方法，一旦在一个文件里用得太多了，往往会使代码变得非常难看。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#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;cm&#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;cm&#34;&gt;int main()
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#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;cm&#34;&gt;    printf(&amp;#34;Hello, world!\n&amp;#34;);
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;    return 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;cm&#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;cm&#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;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;而且要想删掉这段注释，就必须既删掉这段注释的开头 &lt;code&gt;/*&lt;/code&gt;，又要删掉注释的结尾 &lt;code&gt;*/&lt;/code&gt;，否则整个文件都会出问题，非常麻烦。&lt;/p&gt;
&lt;p&gt;最近我又在一些库文件中看到了另一种注释方法，那就是利用 &lt;code&gt;if&lt;/code&gt; 和 &lt;code&gt;endif&lt;/code&gt;：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#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;#if 0&lt;/span&gt;&lt;span class=&#34;c&#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;c&#34;&gt;int main()
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c&#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;c&#34;&gt;    printf(&amp;#34;Hello, world!\n&amp;#34;);
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c&#34;&gt;    return 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;c&#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;c&#34;&gt;&lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;#endif
&lt;/span&gt;&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;cp&#34;&gt;#if 1 &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;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&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;nf&#34;&gt;printf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;Hello, world!&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;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;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;#endif
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;这种方法通过在 &lt;code&gt;if 0&lt;/code&gt; 和 &lt;code&gt;if 1&lt;/code&gt; 之间切换来实现代码块的禁用和激活，严格意义上来说不属于注释语法，&lt;/p&gt;
&lt;h2 id=&#34;一种实用的注释方法&#34;&gt;一种实用的注释方法
&lt;/h2&gt;&lt;p&gt;这个时候我想起来了过去在 HITSZ-VEX 程序组培训时，&lt;a class=&#34;link&#34; href=&#34;https://github.com/TangLongbin&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Longbin&lt;/a&gt; 教给我们的一种注释方法。
它的内容是，在要注释的代码块开头和结尾都添加一行 &lt;code&gt;//*/&lt;/code&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#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;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;a&lt;/span&gt; &lt;span class=&#34;o&#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;kt&#34;&gt;int&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;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;nf&#34;&gt;printf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;%d + %d = %d&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 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;b&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;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;nf&#34;&gt;printf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;Hello, world!&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;c1&#34;&gt;//*/
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;在这种情况下，代码仍是有效的。
如果想要注释掉这段代码，只需将第一个 &lt;code&gt;//*/&lt;/code&gt; 改为 &lt;code&gt;/*/&lt;/code&gt;。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#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;cm&#34;&gt;/*/ &amp;lt;- 只删掉了一个 &amp;#39;/&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;int a = 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;cm&#34;&gt;int b = 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;cm&#34;&gt;printf(&amp;#34;%d + %d = %d\n&amp;#34;, a, b, a + b);
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;printf(&amp;#34;Hello, world!\n&amp;#34;);
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;//*/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;如果想要再次激活这段代码，那么把 &lt;code&gt;/*/&lt;/code&gt; 改回 &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;p&gt;在 C/C++/C# 中，&lt;code&gt;//&lt;/code&gt; 之后的内容都会被视为注释，直到&lt;strong&gt;这一行&lt;/strong&gt;的结尾。
而 &lt;code&gt;/*&lt;/code&gt; 之后的内容都会被视为注释，直到遇到 &lt;code&gt;*/&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;所以只需要一张图就可以解释这种注释方法的原理：&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://keinestudio.cn/posts/a-useful-code-annotation/principle.png&#34;
	width=&#34;632&#34;
	height=&#34;177&#34;
	srcset=&#34;https://keinestudio.cn/posts/a-useful-code-annotation/principle_hu_83b20d2033a26cac.png 480w, https://keinestudio.cn/posts/a-useful-code-annotation/principle_hu_8e099f4b946aa580.png 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;principle&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;357&#34;
		data-flex-basis=&#34;856px&#34;
	
&gt;&lt;/p&gt;
&lt;p&gt;下面我来介绍一下这种注释方法的几个用处。&lt;/p&gt;
&lt;h2 id=&#34;有什么用呢&#34;&gt;有什么用呢？
&lt;/h2&gt;&lt;h3 id=&#34;学习-ccc&#34;&gt;学习 C/C++/C#
&lt;/h3&gt;&lt;p&gt;初学一种编程语言时，我们往往会照着例程抄写，然后反复调试运行。&lt;/p&gt;
&lt;p&gt;例如我正在学习 C# 的逻辑运算，&lt;a class=&#34;link&#34; href=&#34;https://learn.microsoft.com/zh-cn/training&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Microsoft Learn&lt;/a&gt; 上的培训给了若干示例代码。
我想把它们都记录下来，但测试运行效果时，我只想运行我最新抄写下来的那一段代码，因此我的文件看起来是这样的：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;16
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;17
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;18
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;19
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;20
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;21
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;22
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;23
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;24
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;25
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;26
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;27
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#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;cm&#34;&gt;Console.WriteLine(&amp;#34;a&amp;#34; == &amp;#34;a&amp;#34;);
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;Console.WriteLine(&amp;#34;a&amp;#34; == &amp;#34;A&amp;#34;);
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;Console.WriteLine(1 == 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;cm&#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;cm&#34;&gt;string myValue = &amp;#34;a&amp;#34;;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;Console.WriteLine(myValue == &amp;#34;a&amp;#34;);
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#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;cm&#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;cm&#34;&gt;string value1 = &amp;#34; a&amp;#34;;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;string value2 = &amp;#34;A &amp;#34;;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;Console.WriteLine(value1.Trim().ToLower() == value2.Trim().ToLower());
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#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;cm&#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;cm&#34;&gt;Console.WriteLine(1 &amp;gt; 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;cm&#34;&gt;Console.WriteLine(1 &amp;lt; 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;cm&#34;&gt;Console.WriteLine(1 &amp;gt;= 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;cm&#34;&gt;Console.WriteLine(1 &amp;lt;= 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;cm&#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;kt&#34;&gt;string&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;pangram&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;The quick brown fox jumps over the lazy dog&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;Console&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;WriteLine&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;pangram&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Contains&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;fox&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;Console&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;WriteLine&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;pangram&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Contains&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;cow&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;c1&#34;&gt;//*/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;当我想要回头测试前面的代码块时，我只需修改两处地方，一个是把要激活的代码块的 &lt;code&gt;/*/&lt;/code&gt; 改为 &lt;code&gt;//*/&lt;/code&gt;，另一个是把要禁用的代码块的 &lt;code&gt;//*/&lt;/code&gt; 改为 &lt;code&gt;/*/&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;概括下来，只需一次删除操作和一次添加操作，就可以实现代码块的切换。&lt;/p&gt;
&lt;p&gt;读者可以设想或实验一下使用普通的注释方法 &lt;code&gt;//&lt;/code&gt; 和 &lt;code&gt;/* */&lt;/code&gt;，以上的内容要怎么写才能达到同样的效果、至少会使用到多少次删除和添加的操作。&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;例如我曾经还在 HITSZ-VEX 的时候，我们的机器人自动程序大概是这样的：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;16
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;17
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;18
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;19
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;20
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;21
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;22
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;23
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;24
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;25
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;26
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#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;kt&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;autonomous&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;//* ----- Begin -----
&lt;/span&gt;&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;SomeNamespace&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;SomeClass&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;SomeFunction&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;SomeNamespace&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;SomeTask&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;task&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;SomeNamespace&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;SomeTask&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;someParams&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;// Some other code
&lt;/span&gt;&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&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;//*/ ----- Stage 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;function1&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;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;c1&#34;&gt;//*/ ----- Stage 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;n&#34;&gt;function2&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;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;c1&#34;&gt;//*/ ----- Stage 3 -----
&lt;/span&gt;&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;funtion3&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;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;c1&#34;&gt;//*/ ----- End -----
&lt;/span&gt;&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;k&#34;&gt;delete&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;task&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;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;我们在开发调试时，经常需要只测试其中的某个 stage，或者暂时跳过某些 stage，那么只需在
&lt;code&gt;//*/ ----- Stage x -----&lt;/code&gt; 与 &lt;code&gt;/*/ ----- Stage x -----&lt;/code&gt;
之间进行切换。
因此这种注释方法就能在尽可能减少对代码的破坏的同时，实现高效率的调试。&lt;/p&gt;
&lt;h2 id=&#34;总结&#34;&gt;总结
&lt;/h2&gt;&lt;p&gt;总结一下，本文介绍了一种 C/C++/C# 风格的注释方法&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#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;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;a&lt;/span&gt; &lt;span class=&#34;o&#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;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;cm&#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;cm&#34;&gt;int b = 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;cm&#34;&gt;//*/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;这种注释方法有以下几个优点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;只需少量操作就可以实现代码块的注释与取消注释&lt;/li&gt;
&lt;li&gt;由于对注释的增删操作是在&lt;strong&gt;代码所在行之外&lt;/strong&gt;进行的，所以不容易破坏代码块的内容&lt;/li&gt;
&lt;li&gt;美观，可以在 &lt;code&gt;//*/&lt;/code&gt; 后书写额外的内容，方便对代码块进行标注&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;希望读者能够寻找到这种注释方法的更多应用场景，为自己的 C/C++/C# 学习和开发带来便利。&lt;/p&gt;
</description>
        </item>
        <item>
        <title>你好，世界！</title>
        <link>https://keinestudio.cn/posts/hello-world/</link>
        <pubDate>Fri, 17 Nov 2023 16:22:12 +0800</pubDate>
        
        <guid>https://keinestudio.cn/posts/hello-world/</guid>
        <description>&lt;p&gt;2023 年 11 月 17 日，Maxwell Jay 的幻想乡正式建成。&lt;/p&gt;
</description>
        </item>
        
    </channel>
</rss>
