<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Posts on 阮华锋的个人博客</title><link>https://kuang-r.github.io/posts/</link><description>Recent content in Posts on 阮华锋的个人博客</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Sat, 29 Nov 2025 00:00:00 +0000</lastBuildDate><atom:link href="https://kuang-r.github.io/posts/index.xml" rel="self" type="application/rss+xml"/><item><title>音乐管理策略</title><link>https://kuang-r.github.io/posts/2025-11-29-%E9%9F%B3%E4%B9%90%E7%AE%A1%E7%90%86%E7%AD%96%E7%95%A5/</link><pubDate>Sat, 29 Nov 2025 00:00:00 +0000</pubDate><guid>https://kuang-r.github.io/posts/2025-11-29-%E9%9F%B3%E4%B9%90%E7%AE%A1%E7%90%86%E7%AD%96%E7%95%A5/</guid><description>&lt;p&gt;自从上班的地方不给用苹果之后，我就慢慢地将使用环境从苹果中迁移出来，
这篇博客说的是将音乐库从 Apple Music 迁移到 navidrome 中的一些实践。&lt;/p&gt;
&lt;h2 id="需求"&gt;需求&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;智能歌单功能&lt;/li&gt;
&lt;li&gt;可以缓存音乐的客户端&lt;/li&gt;
&lt;li&gt;可直接扫描音乐文件夹&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;综上，选择目前能满足我需求而且开发较活跃的 navidrome 。&lt;/p&gt;
&lt;h2 id="navidrome"&gt;navidrome&lt;/h2&gt;
&lt;p&gt;安装方面，用 docker compose 启动镜像，配置好之后可以开机启动，只要设置好 docker desktop 的开机启动即可。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 4
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 5
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 6
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 7
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 8
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 9
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;10
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;11
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;12
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;13
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;14
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;15
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;16
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;services:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; navidrome:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; image: deluan/navidrome:latest
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; container_name: navidrome
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; user: 1000:1000
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ports:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &amp;#34;4533:4533&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; restart: unless-stopped # 自动重启
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; environment:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; PUID: 1000
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; PGID: 1000
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; TZ: Asia/Shanghai
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ND_TRANSCODINGENABLED: true
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; volumes:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &amp;#34;/home/ruan/navidrome/config:/data&amp;#34; # 映射配置文件
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &amp;#34;/mnt/g/Music:/music:ro&amp;#34; # 映射音乐库
&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="遇到的问题"&gt;遇到的问题&lt;/h2&gt;
&lt;h3 id="alac-无损格式无法播放"&gt;alac 无损格式无法播放&lt;/h3&gt;
&lt;p&gt;之前通过 apple music 无损格式管理音乐库，所以音乐格式是通过m4a容器存储的。
但是 navidrome 的 web 页面和一部分客户端没办法直接播放m4a播放，这一点让我比较烦恼。&lt;/p&gt;</description></item><item><title>ffmpeg用法记录</title><link>https://kuang-r.github.io/posts/2023-05-22-ffmpeg%E7%94%A8%E6%B3%95%E8%AE%B0%E5%BD%95/</link><pubDate>Mon, 22 May 2023 00:00:00 +0000</pubDate><guid>https://kuang-r.github.io/posts/2023-05-22-ffmpeg%E7%94%A8%E6%B3%95%E8%AE%B0%E5%BD%95/</guid><description>&lt;p&gt;一般来说，只要指定输入文件和输出文件的名称，ffmpeg就会自动根据后缀判定正确的格式。&lt;/p&gt;
&lt;p&gt;ffmpeg我经常用来转换图像，存放在iCloud的图片如果小于1MB，就会自动下载。我利用这个特性，将漫画压缩到小于1MB放在iCloud上，用iPad看很方便。&lt;/p&gt;
&lt;h2 id="图片视频裁剪"&gt;图片视频裁剪&lt;/h2&gt;
&lt;p&gt;这种用法也适用于视频。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# crop=a:b:c:d&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# ab分别代表输出图片宽度和长度，cd代表裁剪矩形左上角在图片中的位置&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# in_w代表输入图片的宽度，in_h代表输入文件的高度&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ffmpeg -i &lt;span style="color:#e6db74"&gt;&amp;#34;test.png&amp;#34;&lt;/span&gt; -vf &lt;span style="color:#e6db74"&gt;&amp;#34;crop=in_w/2:in_h:in_w/2:0&amp;#34;&lt;/span&gt; output.png
&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="gif转mp4"&gt;gif转mp4&lt;/h2&gt;
&lt;p&gt;这个需求是想要将gif转换成一段指定长度(10s)的循环播放视频。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ffmpeg -i &lt;span style="color:#e6db74"&gt;&amp;#34;test.gif&amp;#34;&lt;/span&gt; -ignore_loop &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; -t 10s out.mp4
&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="视频切片"&gt;视频切片&lt;/h2&gt;
&lt;p&gt;裁剪从30s开始算起的30s视频&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ffmpeg -i &lt;span style="color:#e6db74"&gt;&amp;#34;test.mp4&amp;#34;&lt;/span&gt; -ss 00:00:30 -t 00:00:30 out.mp4
&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="改变视频速率"&gt;改变视频速率&lt;/h2&gt;
&lt;p&gt;将视频的速率修改为32Hz&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ffmpeg -i &lt;span style="color:#e6db74"&gt;&amp;#34;test.mp4&amp;#34;&lt;/span&gt; -r &lt;span style="color:#ae81ff"&gt;32&lt;/span&gt; out.mp4
&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="拼接图片"&gt;拼接图片&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ffmpeg -i cat.jpg -i dog.jpg -c copy -filter_complex vstack vout.jpg
&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;</description></item><item><title>构建一个炫酷的命令行程序工程</title><link>https://kuang-r.github.io/posts/2021-10-13-%E6%9E%84%E5%BB%BA%E4%B8%80%E4%B8%AA%E7%82%AB%E9%85%B7%E7%9A%84%E5%91%BD%E4%BB%A4%E8%A1%8C%E7%A8%8B%E5%BA%8F%E5%B7%A5%E7%A8%8B/</link><pubDate>Wed, 13 Oct 2021 00:00:00 +0000</pubDate><guid>https://kuang-r.github.io/posts/2021-10-13-%E6%9E%84%E5%BB%BA%E4%B8%80%E4%B8%AA%E7%82%AB%E9%85%B7%E7%9A%84%E5%91%BD%E4%BB%A4%E8%A1%8C%E7%A8%8B%E5%BA%8F%E5%B7%A5%E7%A8%8B/</guid><description>&lt;p&gt;一个炫酷的命令行程序它到底需要什么？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;构建系统&lt;/li&gt;
&lt;li&gt;命令行参数解析&lt;/li&gt;
&lt;li&gt;日志系统&lt;/li&gt;
&lt;li&gt;代码文档系统&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;第三方库可以用cmake管理，自从qt官方构建系统转到cmake之后，感觉cmake基本上已经成为c++项目的事实构建系统了。
命令行参数解析和日志系统可以使用gflags和glog，代码文档系统自然是通用的doxygen。&lt;/p&gt;
&lt;h2 id="cmake"&gt;cmake&lt;/h2&gt;
&lt;p&gt;基本上可以把makefile淘汰掉了，makefile最致命的一点就是无法自动构建依赖。在c和c++中，源文件的头文件依赖如果使用makefile构建，要么就手动管理依赖（要命），要么就写个又长又臭的makefile来自动构建（还是要命）。在简单地学会cmake之后，就放心大胆地跟makefile说拜拜吧。&lt;/p&gt;
&lt;h3 id="构建工程"&gt;构建工程&lt;/h3&gt;
&lt;p&gt;有一些必须添加的首行比如指定cmake版本，添加源文件。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cmake_minimum_required(VERSION 3.20)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;project(cmdline)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;add_executable(${PROJECT_NAME} main.c)
&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;还有就是引入依赖，这个工程我是基于glib做的。glib提供命令行解析、日志系统、单元测试等功能。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;find_package(PkgConfig REQUIRED)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pkg_check_modules(GLIB glib-2.0 REQUIRED)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;add_definitions(-DG_LOG_USE_STRUCTURED)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;include_directories(${GLIB_INCLUDE_DIRS})
&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;文档生成，引入Doxygen生成文档。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;4
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;find_package(Doxygen)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;if (DOXYGEN_FOUND)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; message(&amp;#34;Doxygen build start&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; doxygen_add_docs(docs ${PROJECT_SOURCE_DIR} ALL)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;endif()
&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="命令行参数解析"&gt;命令行参数解析&lt;/h2&gt;
&lt;p&gt;命令行参数解析最常用的是posix标准getopt或者gnu的getopt，qt和glib都有自己的命令行解析工具。
我使用的是glib提供的命令行解析，简单用法跟getopt差不多。不过glib这个东西还扩展了一下用法，
有group这个概念，因为文档不详细我也没仔细研究。&lt;/p&gt;</description></item><item><title>Decoy-Enhanced Seamless IP Randomization阅读笔记</title><link>https://kuang-r.github.io/posts/2021-10-07-desir-decoy-enhanced-seamless-ip-randomization%E9%98%85%E8%AF%BB%E7%AC%94%E8%AE%B0/</link><pubDate>Thu, 07 Oct 2021 00:00:00 +0000</pubDate><guid>https://kuang-r.github.io/posts/2021-10-07-desir-decoy-enhanced-seamless-ip-randomization%E9%98%85%E8%AF%BB%E7%AC%94%E8%AE%B0/</guid><description>&lt;p&gt;这边论文的basic idea比较简单，就是放出诱饵和不断改变网络位置（IP地址）来缓解网络侦察(reconnaissance)攻击。我认为它的实验很有意思，本来我以为会在路由器层面进行实现，通过改变IP包的方式对上层透明化。结果后来一看，发现竟然是在一台电脑上搭建虚拟机来模拟全部环境。这就是乞丐版实现吗？不过仔细一想，其实这种实验的可行性高而且也可信，简直就是最好方案啊。&lt;/p&gt;
&lt;p&gt;还有就是这篇论文在实现它的协议时用到了很多的知识，对这些知识进行简单的了解会对网络空间安全方向有一个大致的了解。我认为这个还是很值的注意的。&lt;/p&gt;
&lt;h3 id="problem"&gt;Problem&lt;/h3&gt;
&lt;p&gt;网络攻击者会对IP地址进行探测，为了找出现有系统的缺点或者是监控这个系统。&lt;/p&gt;
&lt;h3 id="basic-idea"&gt;Basic Idea&lt;/h3&gt;
&lt;p&gt;动态改变IP地址＋大量释放诱饵(decoy)缓解网络探测攻击。而且在改变IP地址的时候还不能中断现有服务。&lt;/p&gt;
&lt;h3 id="收获"&gt;收获&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;[ZMap]（https://www.usenix.org/system/files/conference/usenixsecurity13/sec13-paper_durumeric.pdf）能花45分钟把整个IPv4的地址探测完。&lt;/li&gt;
&lt;li&gt;NMap是一个网络探测工具&lt;/li&gt;
&lt;li&gt;honypots原来是用于吸引攻击者和学习攻击者模式的，在这篇论文中用来延长其扫描时间&lt;/li&gt;
&lt;li&gt;用常用服务：ssh, ftps, sftp, udpchar, tftp来做实验&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="thinking"&gt;Thinking&lt;/h3&gt;
&lt;p&gt;这个方法需要大量的IP地址来释放诱饵，如果把迁移往协议栈挪上一层，到TCP/UDP层面会不会降低开销呢？但是端口号只有65535个，如果只在这么多个端口号中进行randomization会不会显得有些不够用？考虑到吞吐量，应该只是需要迁移端口就足够了。&lt;/p&gt;</description></item><item><title>Docker初探</title><link>https://kuang-r.github.io/posts/2021-08-19-docker%E5%88%9D%E6%8E%A2/</link><pubDate>Thu, 19 Aug 2021 00:00:00 +0000</pubDate><guid>https://kuang-r.github.io/posts/2021-08-19-docker%E5%88%9D%E6%8E%A2/</guid><description>&lt;p&gt;最近对Web技术提起了一些兴趣，想学学web开发。现在搭建网站据我所知，PHP和java用的最多。但我就是喜欢特立独行，想试试别的东西。发现asp.net貌似不错，我对c#的观感挺好，而且现在.net框架也开源并支持跨平台了。所以就在vs上安装了.net的开发环境，准备学一学。&lt;/p&gt;
&lt;p&gt;初始化一个工程后，看到运行环境里有docker。这东西这几年貌似很火，之前在图书馆里有看过相关的书籍，里面写的高深莫测，什么容器，什么集群花里胡哨也没详细看。正好趁现在有兴趣也学一学docker。&lt;/p&gt;
&lt;h2 id="官方教程"&gt;官方教程&lt;/h2&gt;
&lt;p&gt;上官网看了下，发现现在docker在windows下推出了desktop这个图形界面用来管理运行中的状态，而且整个界面还设计得很不错，简单易用。下载了安装包，配个版本较新的windows就能直接用。核心是用微软的wsl2跑的，原来微软切换到wsl2还有这个好处，毕竟有些东西只有Linux内核才跑的动啊。&lt;/p&gt;
&lt;p&gt;打开docker desktop之后，会弹出一个框教新手怎么用的。我点了进去，发现这个教程直接就是一个用docker运行的一个http服务。首先是直接用git image把教程仓库clone下来，然后直接将这个仓库编译成docker的image，再运行这个image，就能直接在浏览器上访问localhost阅读这个教程啦。&lt;/p&gt;
&lt;p&gt;这一下子吸引住了我：寥寥几步，就把docker的作用和使用步骤跟教程紧密结合在了一起，实在是很有意思。所以说，这种新兴的计算机技术或者是语言，看多少书都不如上官网看一遍tutorial然后实操，效果差太多了。一个优秀的项目肯定有优秀的官方教程，如果没有，说明它还不够优秀。&lt;/p&gt;
&lt;h2 id="核心概念"&gt;核心概念&lt;/h2&gt;
&lt;p&gt;感觉docker就是个虚拟机，专门设计用于运行服务的。下面以我的理解（仅仅是操作完了官方教程的水平）描述一下一些相关概念。&lt;/p&gt;
&lt;h3 id="image"&gt;image&lt;/h3&gt;
&lt;p&gt;一个包含了程序和所需依赖的包，用docker构建&lt;/p&gt;
&lt;h3 id="container"&gt;container&lt;/h3&gt;
&lt;p&gt;每次run image都会产出一个新的container，用来保存每次运行产生的变化，比如说环境变量，配置文件什么的。&lt;/p&gt;
&lt;h3 id="volumes"&gt;volumes&lt;/h3&gt;
&lt;p&gt;有一些文件要保存在container之外的地方，这样更新image再运行container的时候，中间数据就不会丢失了。这个地方就叫volumes。&lt;/p&gt;
&lt;h3 id="network"&gt;network&lt;/h3&gt;
&lt;p&gt;container之间用network通信，处于同一个network的运行实例能相互通讯。&lt;/p&gt;
&lt;h2 id="应用"&gt;应用&lt;/h2&gt;
&lt;p&gt;总的来说，感觉这东西适合运行一些不会关闭的软件，比如监听80端口的web服务。也有一些很有意思的应用，比较广泛的应该就是github actions。jekyll就能通过docker来构建和发布GitHub pages。参考helaili写的&lt;a href="https://github.com/helaili/jekyll-action"&gt;jekyll-action&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;在了解过docker的操作流程和基本概念之后，这东西很容易搞懂。原理就是创建一个ruby的container，在这个环境里运行一个简单的shell脚本。这个脚本的作用是下载仓库-&amp;gt;安装jekyll依赖-&amp;gt;构建jekyll-&amp;gt;发布网站。非常有意思，脚本名字是&lt;code&gt;entrypoint.sh&lt;/code&gt;，有兴趣的可以看看。&lt;/p&gt;
&lt;p&gt;我跟着这个仓库的README试了一下，真的非常实用。再也不用局限于GitHub自动构建的jekyll版本和插件啦，&lt;a href="https://github.com/kuang-R/jekyll-action-test"&gt;超爽&lt;/a&gt;！&lt;/p&gt;
&lt;p&gt;&lt;img alt="自动构建效果图" loading="lazy" src="https://kuang-r.github.io/imgs/210819-01.png"&gt;&lt;/p&gt;
&lt;p&gt;像这种CI(Continuous integration)工具，能实现很高的自动化。像是打包发布安装包，运行单元测试之类的机械性工作都能完全自动运行。花在构建和学习自动化工具的时间我认为是非常值得的。CI工具走的比较前的貌似是gitlab，&lt;a href="https://gitlab.gnome.org/GNOME/glib"&gt;glib库&lt;/a&gt;就是很标准的例子，还有就是&lt;a href="https://gitlab.gnome.org/Infrastructure/gtk-web"&gt;gtk的官网&lt;/a&gt;也是用CI构建的。github算是比较晚的，2018年才推出。&lt;/p&gt;
&lt;h2 id="参考"&gt;参考&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://www.docker.com/products/docker-desktop"&gt;Docker Desktop&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://docs.github.com/en/actions/learn-github-actions/introduction-to-github-actions#the-components-of-github-actions"&gt;Introduction to GitHub Actions&lt;/a&gt;&lt;/p&gt;</description></item><item><title>glib学习笔记1 - 基础数据结构</title><link>https://kuang-r.github.io/posts/2021-08-13-glib%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B01---%E5%9F%BA%E7%A1%80%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/</link><pubDate>Fri, 13 Aug 2021 00:00:00 +0000</pubDate><guid>https://kuang-r.github.io/posts/2021-08-13-glib%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B01---%E5%9F%BA%E7%A1%80%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/</guid><description>&lt;p&gt;我一直都对C语言情有独钟，是受《C语言点滴》这本书的影响。glib库作为一整个gnome的底层架构，在实现了类似于c++ std库的功能下，还包括了文件系统，多线程，定时器这些跨平台的方便组件。在跨语言领域上，也有完善的g-object系统bind各种语言。如果需要编写一个完善的库，可以说使用glib是非常合适的。我准备过一遍glib参考手册，然后再读一读源码，写一些使用这个库的使用方法和抽象概念。&lt;/p&gt;
&lt;p&gt;前几天glib官方的参考手册移到了gtk的域名下进行管理，整个界面变得现代化了很多。加上之前的gtk官网更新，感觉gtk系列也要慢慢地崛起了。当然，跟qt系的使用率还是没法比。&lt;/p&gt;
&lt;p&gt;基础数据结构可以类比c++的std标准库，数据结构只包括glib库的一部分。论使用的便利当然是不如c++的，但加上glib的其它各种组件，用起来还是很不错。如果想要弄清楚用法，直接查看glib代码仓库的单元测试最正确全面。在这里只简单谈谈我感兴趣的地方。&lt;/p&gt;
&lt;h3 id="garray"&gt;GArray&lt;/h3&gt;
&lt;p&gt;类似于c++中的vector，但是功能没有那么强大。new的时候需要指定数组元素的大小，但是不需要指定元素个数。也就是说new出来的GArray都是空数组。而且也不能一个一个地添加元素，只能添加数组。内置有排序，二分查找，引用计数，各种删除操作。&lt;/p&gt;
&lt;p&gt;将这个数据结构跟vector进行对比其实是不合适的，vector致力于取代c的数组，而GArray则是对c数组进行补充。从只能append_vals中就可以看出来，用法大约是先暂存在c数组里，然后一次性添加到GArray中，再进行各种操作。当然，一个一个地添加也是可以的。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 4
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 5
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 6
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 7
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 8
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 9
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;10
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;11
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;12
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;13
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;14
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;15
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;16
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;17
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;18
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;19
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;20
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;21
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;22
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;23
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;24
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;25
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;26
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#include&lt;/span&gt; &lt;span style="color:#75715e"&gt;&amp;lt;glib.h&amp;gt;&lt;/span&gt;&lt;span style="color:#75715e"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;gint &lt;span style="color:#a6e22e"&gt;comp&lt;/span&gt;(gconstpointer a, gconstpointer b)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;double&lt;/span&gt; x &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;double&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)a;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;double&lt;/span&gt; y &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;double&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)b;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (x &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; y)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (x &lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; y)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;main&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; GArray &lt;span style="color:#f92672"&gt;*&lt;/span&gt;arr &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;g_array_new&lt;/span&gt;(FALSE, FALSE, &lt;span style="color:#66d9ef"&gt;sizeof&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;double&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;double&lt;/span&gt; t[] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {&lt;span style="color:#ae81ff"&gt;1.&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;5.&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;6.&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;8.&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;3.&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;9.&lt;/span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;g_array_append_vals&lt;/span&gt;(arr, t, &lt;span style="color:#66d9ef"&gt;sizeof&lt;/span&gt;(t)&lt;span style="color:#f92672"&gt;/&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;sizeof&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;double&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;g_array_sort&lt;/span&gt;(arr, comp);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;g_print&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;len: %d&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\n&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;, arr&lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt;len); &lt;span style="color:#75715e"&gt;// len: 6
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;double&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt;p &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;double&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt;)arr&lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt;data;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;/* 1.000000 3.000000 5.000000 6.000000 8.000000 9.000000 */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; i &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;; i &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; arr&lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt;len; i&lt;span style="color:#f92672"&gt;++&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;g_print&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;%lf &amp;#34;&lt;/span&gt;, p[i]);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&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;h3 id="gbytearray"&gt;GByteArray&lt;/h3&gt;
&lt;p&gt;字节数组，是GArray的子集，元素类型固定为Byte，在使用上方便很多。&lt;/p&gt;</description></item><item><title>谈一下编码问题</title><link>https://kuang-r.github.io/posts/2021-08-09-%E8%B0%88%E4%B8%80%E4%B8%8B%E7%BC%96%E7%A0%81%E9%97%AE%E9%A2%98/</link><pubDate>Mon, 09 Aug 2021 00:00:00 +0000</pubDate><guid>https://kuang-r.github.io/posts/2021-08-09-%E8%B0%88%E4%B8%80%E4%B8%8B%E7%BC%96%E7%A0%81%E9%97%AE%E9%A2%98/</guid><description>&lt;p&gt;有时用vim打开一些文件时，会显示乱码。打开一些专辑的cue文件时，foorbar2000也会显示乱码。这都是编码不一样在作怪。 我受编码问题的苦久矣，从日常用msys2环境下的一些不兼容，到串口调试乱码问题，甚至在编程时使用注释和git时，都有乱码的困扰。&lt;/p&gt;
&lt;p&gt;编码不统一的弊病是历史遗留问题，最开始使用计算机的家伙们只用英文。而英文总共就26个字符加上一些其他符号，所以所有的可打印字符只需要用8位的char就可以全部保存。后来等到使用其它语言的人们也需要打印字符时，8位的char就没办法保存了。在这期间，出现了各种解决方案，这就是编码问题的起源。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;关于编码的问题，Li Yucang的 &lt;a href="https://liyucang-git.github.io/2019/06/17/%E5%BD%BB%E5%BA%95%E5%BC%84%E6%87%82Unicode%E7%BC%96%E7%A0%81/"&gt;彻底弄懂Unicode编码&lt;/a&gt; 已经讲的非常透彻，我就不再详细复述。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;我之前听说utf-8时在Plan 9中发明，然后被各种Unix变体接受，从而广泛使用的。涛叔的 &lt;a href="https://taoshu.in/utf-8.html"&gt;UTF-8往事&lt;/a&gt; 有提到这方面的一些历史。&lt;/p&gt;
&lt;h3 id="uchardet"&gt;uchardet&lt;/h3&gt;
&lt;p&gt;这是一个从Mozilla项目中整出来的检测编码工具，ByVoid的 &lt;a href="https://byvoid.com/zhs/blog/encoding-autodetector-uchardet/"&gt;博客&lt;/a&gt; 有讲到这个工具诞生的一些事&lt;/p&gt;
&lt;h3 id="iconv"&gt;iconv&lt;/h3&gt;
&lt;p&gt;通用的编码转换工具&lt;/p&gt;
&lt;h3 id="实践"&gt;实践&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 4
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 5
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 6
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 7
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 8
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 9
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;10
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;11
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;12
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;13
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;14
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;15
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;16
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;17
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;18
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;19
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;20
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;21
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;22
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;23
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;24
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;25
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;26
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;27
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;28
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;29
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;30
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;31
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;32
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;33
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;34
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;35
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;36
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;37
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;38
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;39
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;40
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;41
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;42
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;43
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;44
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;45
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;46
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;47
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;48
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ ls
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;CDImage.cue
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ uchardet.exe CDImage.cue
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;SHIFT_JIS
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ iconv.exe -f shift-jis -t utf-8 CDImage.cue &amp;gt;CDImage-utf8.cue
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ iconv.exe -f shift-jis -t gbk CDImage.cue &amp;gt;CDImage-gbk.cue
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ ls
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;CDImage.cue CDImage-gbk.cue CDImage-utf8.cue
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ head CDImage.cue
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;PERFORMER &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;TITLE &lt;span style="color:#e6db74"&gt;&amp;#34;▒N▒h▒▒ӂ▒▒[ ▒▒▒▒▒▒▒▒ ▒▒▒▒▒▒T▒FKud Wafter Original SoundTrack&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;FILE &lt;span style="color:#e6db74"&gt;&amp;#34;CDImage.wav&amp;#34;&lt;/span&gt; WAVE
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; TRACK &lt;span style="color:#ae81ff"&gt;01&lt;/span&gt; AUDIO
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; TITLE &lt;span style="color:#e6db74"&gt;&amp;#34;Track01&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; PERFORMER &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; INDEX &lt;span style="color:#ae81ff"&gt;01&lt;/span&gt; 00:00:00
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;TRACK &lt;span style="color:#ae81ff"&gt;02&lt;/span&gt; AUDIO
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;TITLE &lt;span style="color:#e6db74"&gt;&amp;#34;Track02&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;PERFORMER &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ head CDImage-gbk.cue
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;PERFORMER &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;TITLE &lt;span style="color:#e6db74"&gt;&amp;#34;▒▒▒ɤ▒դ▒▒` ▒▒▒▒▒޶▒▒▒ ▒▒▒▒▒ص䣺Kud Wafter Original SoundTrack&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;FILE &lt;span style="color:#e6db74"&gt;&amp;#34;CDImage.wav&amp;#34;&lt;/span&gt; WAVE
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; TRACK &lt;span style="color:#ae81ff"&gt;01&lt;/span&gt; AUDIO
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; TITLE &lt;span style="color:#e6db74"&gt;&amp;#34;Track01&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; PERFORMER &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; INDEX &lt;span style="color:#ae81ff"&gt;01&lt;/span&gt; 00:00:00
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;TRACK &lt;span style="color:#ae81ff"&gt;02&lt;/span&gt; AUDIO
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;TITLE &lt;span style="color:#e6db74"&gt;&amp;#34;Track02&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;PERFORMER &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ head CDImage-utf8.cue
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;PERFORMER &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;TITLE &lt;span style="color:#e6db74"&gt;&amp;#34;クドわふたー 初回限定版 初回特典：Kud Wafter Original SoundTrack&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;FILE &lt;span style="color:#e6db74"&gt;&amp;#34;CDImage.wav&amp;#34;&lt;/span&gt; WAVE
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; TRACK &lt;span style="color:#ae81ff"&gt;01&lt;/span&gt; AUDIO
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; TITLE &lt;span style="color:#e6db74"&gt;&amp;#34;Track01&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; PERFORMER &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; INDEX &lt;span style="color:#ae81ff"&gt;01&lt;/span&gt; 00:00:00
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;TRACK &lt;span style="color:#ae81ff"&gt;02&lt;/span&gt; AUDIO
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;TITLE &lt;span style="color:#e6db74"&gt;&amp;#34;Track02&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;PERFORMER &lt;span style="color:#e6db74"&gt;&amp;#34;&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;</description></item><item><title>我怎么听音乐</title><link>https://kuang-r.github.io/posts/2021-08-02-%E6%88%91%E6%80%8E%E4%B9%88%E5%90%AC%E9%9F%B3%E4%B9%90/</link><pubDate>Mon, 02 Aug 2021 00:00:00 +0000</pubDate><guid>https://kuang-r.github.io/posts/2021-08-02-%E6%88%91%E6%80%8E%E4%B9%88%E5%90%AC%E9%9F%B3%E4%B9%90/</guid><description>&lt;p&gt;我用apple music听音乐。天天静听是我用的第一个音乐软件，之后是qq音乐，再之后是网易云音乐。用过的这些软件都有些不合心意，没有那种能用一辈子的感觉。就拿网易云音乐来说吧，因为版权问题各种没法听，明明昨天可以听，今天就不行；曲库不全；喜欢的音乐莫名其妙的消失；烦人的各种社交功能；官方发过来的不定期废话软文……&lt;/p&gt;
&lt;p&gt;apple music最好用的是上传功能，我能上传自己的音乐。上传的音乐统一存在音乐库进行管理。上传之后我能用电脑，手机各个平台听。还有就是它是一款纯粹的音乐软件，没有广告，没有社交，用起来像在用MP3。再有就是价格便宜，国区每个月也就10块钱，配有近乎无限的音乐上传数目，现有的音乐全部能听。除了曲库不太全外，基本上没有任何的缺点。而曲库不太全在完善的上传功能下也不算什么缺点了。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;知乎用户&lt;a href="https://www.zhihu.com/people/xiaote"&gt;守护未来&lt;/a&gt;有一篇&lt;a href="https://zhuanlan.zhihu.com/p/373693374"&gt;文章&lt;/a&gt;提到apple music的廉价订阅方法，我用的是合租。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="如何管理自己的音乐"&gt;如何管理自己的音乐&lt;/h2&gt;
&lt;p&gt;依靠两个工具&lt;code&gt;mp3tag&lt;/code&gt;, &lt;code&gt;foobar2000&lt;/code&gt;，以专辑为单位管理音乐。简单来说就是将专辑歌曲统一转换成&lt;code&gt;Apple lossless&lt;/code&gt;格式，找不到无损的就按照原样保存，然后用mp3tag打上合适的标签，专辑封面也保存好。用itunes传上自己的资料库，音乐文件夹同步上传到云盘进行备份。&lt;/p&gt;
&lt;p&gt;&lt;img alt="音乐文件夹截图" loading="lazy" src="https://kuang-r.github.io/imgs/210802-04.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="资料库截图" loading="lazy" src="https://kuang-r.github.io/imgs/210802-02.jpg"&gt;&lt;/p&gt;
&lt;h3 id="foorbar2000"&gt;foorbar2000&lt;/h3&gt;
&lt;p&gt;强大无匹的音乐播放器。基本上你能找得到的音乐格式它都能播放，有些需要安装相应的插件。我最喜欢它的音乐格式转换功能，能把标签也保存下来，无敌！&lt;/p&gt;
&lt;h3 id="mp3tag"&gt;Mp3Tag&lt;/h3&gt;
&lt;p&gt;虽然名字叫mp3，但是所有的音乐格式都能打上标签（被名字耽误？）。标签有很多种，我以苹果音乐中会使用到的标签作为标准。&lt;/p&gt;
&lt;p&gt;&lt;img alt="标签截图" loading="lazy" src="https://kuang-r.github.io/imgs/210802-01.png"&gt;
&lt;img alt="专辑截图" loading="lazy" src="https://kuang-r.github.io/imgs/210802-03.jpg"&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;名称&lt;/th&gt;
&lt;th&gt;作用&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Title&lt;/td&gt;
&lt;td&gt;歌曲题目&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Artist&lt;/td&gt;
&lt;td&gt;一般是歌手&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Album&lt;/td&gt;
&lt;td&gt;专辑名&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Year&lt;/td&gt;
&lt;td&gt;发行年份&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Track&lt;/td&gt;
&lt;td&gt;第几首&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Genre&lt;/td&gt;
&lt;td&gt;种类&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Album Artist&lt;/td&gt;
&lt;td&gt;专辑作者&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Discnumber&lt;/td&gt;
&lt;td&gt;第几张碟&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="注意"&gt;注意&lt;/h3&gt;
&lt;p&gt;如果一个专辑中有不同的&lt;code&gt;artist&lt;/code&gt;，就需要特地填入&lt;code&gt;album artist&lt;/code&gt;，否则苹果音乐会识别为两个不同的专辑。也就是说，它通过专辑名+作者的方式标识专辑。&lt;/p&gt;
&lt;p&gt;苹果音乐上传时会用某种算法自动匹配曲库，如果没有匹配成功才会上传。其实《歌物语》在曲库中是有的，但我不喜欢那版封面还有罗马音的歌名，所以才重新上传。也就是说可以随意修改自己上传的歌曲的标签。&lt;/p&gt;
&lt;p&gt;可以把苹果音乐中的歌当成MP3/320K的音质，因为我上传的无损音乐并没有无损标志。听工友说BSD16bit的音乐和BSD24bit的音乐听起来很不一样，而24bit和32bit的音乐就听不出什么差别。而CD的位数是16bit，再加上压缩编码……因为我听不出MP3/320K和CD格式有什么不同，所以我对这方面倒不是很纠结（主要是莫得钱）。&lt;/p&gt;
&lt;p&gt;安卓端也有苹果音乐软件……&lt;/p&gt;</description></item><item><title>苹果开发的一些感想</title><link>https://kuang-r.github.io/posts/2021-07-31-%E8%8B%B9%E6%9E%9C%E5%BC%80%E5%8F%91%E7%9A%84%E4%B8%80%E4%BA%9B%E6%84%9F%E6%83%B3/</link><pubDate>Sat, 31 Jul 2021 00:00:00 +0000</pubDate><guid>https://kuang-r.github.io/posts/2021-07-31-%E8%8B%B9%E6%9E%9C%E5%BC%80%E5%8F%91%E7%9A%84%E4%B8%80%E4%BA%9B%E6%84%9F%E6%83%B3/</guid><description>&lt;p&gt;明明我应聘的是嵌入式，却要我开发一款ios软件？我以前可是从来都没有碰过苹果系的产品。结果这一趟走下来，从注册公司开发者账号，开发软件，上架商店，也有一些收获。这篇文章主要是一些感想，记下来备忘，也想给一些想做苹果开发者的朋友们一些提示。&lt;/p&gt;
&lt;h2 id="开发者账号"&gt;开发者账号&lt;/h2&gt;
&lt;p&gt;首先是开发者账号，只要是要做ios开发，没有苹果的开发者账号你甚至没办法把程序发出去给别人用。&lt;/p&gt;
&lt;p&gt;开发者账号还有个好处就是可以构建测试版本，通过testflight软件发布的测试版程序根本不需要苹果审核。名额足足有10000人，可以添加appleid自动发送测试邮件，也可以发送公开的邀请链接邀请别人下载安装软件。有些特殊需求的软件甚至不需要发布在app store上，使用人数也没这么多，那么testflight就够用了，不用走审核上架的流程。总之申请账号越早越好。&lt;/p&gt;
&lt;h3 id="申请"&gt;申请&lt;/h3&gt;
&lt;p&gt;开发者账号分公司账号和个人账号，是哪个就申请哪个。申请公司开发者账号麻烦点，我那时候花了3-4天，期间苹果又是给老大打电话，又是给老板打电话确认。我认为苹果是通过这种方式在收集公司信息，真是个可怕的公司。至于申请方法，没什么值得一提的，按照官网流程走就可以了。&lt;/p&gt;
&lt;p&gt;还有一件事，当时我不知道怎么判断账号是否是开发者账号，其实直接上&lt;a href="https://developer.apple.com/"&gt;开发者中心&lt;/a&gt;登陆账号，如果账号左边的栏目不多，比如没有App Store Connect、Certificates等栏目，就说明还不是开发者账号。我发一张开发者账号的截图出来参考。&lt;/p&gt;
&lt;p&gt;&lt;img alt="开发者账号截图" loading="lazy" src="https://kuang-r.github.io/imgs/210731-01.jpg"&gt;&lt;/p&gt;
&lt;h2 id="开发"&gt;开发&lt;/h2&gt;
&lt;p&gt;我到处查看资料，发现swift+storyboard的方式最方便合适。然后就是看了几天教程，一步一步把工程搭起来。期间谷歌和苹果开发者平台以及百度（排名分先后）给了很大帮助。&lt;/p&gt;
&lt;h3 id="swfit"&gt;swfit&lt;/h3&gt;
&lt;p&gt;学语言就那么一回事，反正也不深入。先看几天基础，比如怎么定义变量，定义函数，条件判断，循环怎么写，内存怎么管理，就可以开始着手了。&lt;/p&gt;
&lt;p&gt;swift的内存管理是&lt;a href="https://zh.wikipedia.org/wiki/%E5%BC%95%E7%94%A8%E8%AE%A1%E6%95%B0"&gt;计数应用&lt;/a&gt;，不知道的可以点进wiki了解一下。因为不够熟练，我在这个地方遇到过问题。将函数内定义的类直接放到后台运行，结果函数一退出，程序就把那个后台就给我GC掉了，当时想了下才发现这个问题。&lt;/p&gt;
&lt;p&gt;对于c/c++出身的我理解那个变量的管理方式有点困难，很是费了一番功夫。比如&lt;code&gt;var s: String?&lt;/code&gt;和&lt;code&gt;var s:String&lt;/code&gt;的不同之处。印象中这种语法是从c#开始使用的，通过这种方法能有效地避免指针的出现，我认为这是一种很巧妙又优雅的解决方案。&lt;/p&gt;
&lt;p&gt;用过的东西包括定时器、??语法、闭包lambda、还有就是用NSLog替代print，NSLog前面自带时间，调试好用。还有就是直到后来我才发现if没必要写括号，尬住了。&lt;/p&gt;
&lt;p&gt;我一直都没搞懂在引用计数下闭包是怎么管理生命周期的，也没搞懂let到底是怎么区分常量的（类比c中指针const的位置），闭包那奇葩的语法只会用（写是不可能写的……）。总之就是，我又不专门搞苹果开发，学那么多干嘛。&lt;/p&gt;
&lt;h3 id="storyboard"&gt;storyboard&lt;/h3&gt;
&lt;p&gt;用swift花不了几天时间，摸索storyboard怎么用和画软件的界面花的时间才多。不过搞熟了之后速度还是很快的，简单明快，拖拖拉拉就完事。我在弄这玩意的时候爽得很，脑子不用动，头发就少掉。&lt;/p&gt;
&lt;p&gt;基本上全部的显示都可以在storyboard中做，绘制页面，页面间的跳转，直接把view拖到page对应的类里面，填上名字就能用。segue给一个唯一名称，在代码里直接就jump。打开storyboard，截屏就是一个软件原型图，不用再搞其它花里胡哨。总之界面开发就一个字，爽。&lt;/p&gt;
&lt;p&gt;这东西没什么可讲的，慢慢摸索就能学会。我没怎么看那些教程（大多都又长又臭），都是一个一个地方点几下，查文档，配合搜索引擎。&lt;/p&gt;
&lt;h3 id="一些废话"&gt;一些废话&lt;/h3&gt;
&lt;p&gt;百度的苹果开发都是全是基于objc讲的，而且都是前几年的比较多，可能是前几年流行过一阵子的ios开发有关？我读的大学里还有一个专门的苹果机房，听说是前几年配置的。不过配置之后就没开过几门课，我读的时候也没有开，因为根本没人选。就我个人本身而言的话，苹果电脑贵的要命，每年还要几百块的账号注册支出，比我家拉网线还贵，实在是舍不得。而对比国外同事人人一台苹果的情况之下，看来我们还是不够富有啊。&lt;/p&gt;
&lt;p&gt;谷歌搜索出来的信息就全是用swift讲的。从这点可以看出国外的软件开发更加繁荣，个人开发者和小公司开发者很多。因为中小型应用很多，所以对新技术的接受程度普遍而言非常高，软件开发氛围是真正的好。而对比国内，其实可以发现软件公司们就像土地兼并一样，大厂们不断吸收中小软件公司，环境很是恶臭，我觉得这点非常不好。像是以前很好用的快图和天天静听，都是在收购之后销声匿迹了，如果……&lt;/p&gt;
&lt;p&gt;公司配置的二手苹果笔记本好难用，电池还鼓包。这个软件开发历时约两个月，开发效率让我有点惭愧，不过考虑到以前苹果都没摸过，仔细想想也可以接受？还有就是，我好像要一台苹果笔记本！&lt;/p&gt;
&lt;h2 id="上架"&gt;上架&lt;/h2&gt;
&lt;p&gt;上架其实很简单，跟着官方的指示走就行，原则就是把审核员当成客户对待。我开发的是物联网应用，没有产品根本没法用，就一个死页面。不过我准备了产品的官网，产品的介绍PDF，软件使用视频（重要）之后，审核员很快（2天）就给我通过了，通过之后就能在app store上搜索到开发的程序啦😄。&lt;/p&gt;</description></item><item><title>编程环境终极配置</title><link>https://kuang-r.github.io/posts/2021-07-26-%E7%BC%96%E7%A8%8B%E7%8E%AF%E5%A2%83%E7%BB%88%E6%9E%81%E9%85%8D%E7%BD%AE/</link><pubDate>Mon, 26 Jul 2021 00:00:00 +0000</pubDate><guid>https://kuang-r.github.io/posts/2021-07-26-%E7%BC%96%E7%A8%8B%E7%8E%AF%E5%A2%83%E7%BB%88%E6%9E%81%E9%85%8D%E7%BD%AE/</guid><description>&lt;p&gt;习惯了Posix环境下的各种方便工具，就很难在Windows平台下得到较好的编程体验。而在当前国内的网络环境下，直接使用Linux系统又有极大的不便之处。再加上Windows平台上又有很多软件没办法舍弃，所以我一直在寻找一种替代方案：在Windows上安装Posix环境。&lt;/p&gt;
&lt;h2 id="posix环境"&gt;Posix环境&lt;/h2&gt;
&lt;p&gt;编程环境总共就两家，Windows和Unix。上个世纪出现了很多Unix系统，使用上分化很严重。尽管都是叫Unix，但它们的兼容性没法保障。比如我在这台机器上写的程序，在另一台机器上甚至没法编译通过！后来就出现了Posix标准，符合这个标准的才给叫Unix。这下好了，我们写的程序不需要一个一个系统地测试了。&lt;/p&gt;
&lt;p&gt;最热门的Linux系统属于类Unix系统，用起来一般不会出现跟Posix标准不符合的情况（反正我没见过）。所以大多数说的Linux编程大致等于Unix编程。&lt;/p&gt;
&lt;p&gt;在Windows上提供Posix环境操作的主要有两家，msys2和wsl2。&lt;/p&gt;
&lt;h3 id="wsl2"&gt;wsl2&lt;/h3&gt;
&lt;p&gt;我没用过wsl2，不过听说wsl2用的是虚拟化技术，效率上就低了一层。再加上又是个新东西，稳定性肯定欠缺。而且还是微软推的技术，殊不知之前的wsl还没用几天呢，这就wsl2了？说不定明天微软就不爱Linux了。那我岂不哭死？&lt;/p&gt;
&lt;h3 id="msys2"&gt;msys2&lt;/h3&gt;
&lt;p&gt;msys2就好多了，社区推动不会突然间就暴死，更新稳定性更有保障。在国内也有专门的镜像源（你甚至不需要做任何的配置），上&lt;a href="https://mirrors.tuna.tsinghua.edu.cn/"&gt;清华软件站&lt;/a&gt;下载打包好的安装包一键安装就可以了。配有专门的软件包管理工具pacman，安装卸载软件包一键搞定。还可以通过配置注册表在文件夹下右键打开终端，获取跟Linux一样的体验。&lt;/p&gt;
&lt;p&gt;我对它唯一的不满就是这终端界面，也太丑了。不过我都懒得去美化它，麻烦不说，稳定性就没法保障。尽量保持默认配置，是我稳定使用工具软件的诀窍。&lt;/p&gt;
&lt;p&gt;所以终极方案就是Windows10+msys2+虚拟机。为什么还需要虚拟机呢？有时候一些东西实在是没法在Windows系统上搞的（比如ROS），就只能装个虚拟机勉强用着了。&lt;/p&gt;
&lt;h2 id="msys2配置"&gt;msys2配置&lt;/h2&gt;
&lt;p&gt;如何添加右键打开，软件包管理工具的简单使用。&lt;/p&gt;
&lt;h3 id="添加右键菜单"&gt;添加右键菜单&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;打开注册表&lt;code&gt;HKEY_CLASSES_ROOT\Directory\Background\shell&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;新建项&lt;code&gt;msys2&lt;/code&gt;，默认值修改为&lt;code&gt;msys2&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;新建字符串值，命名为&lt;code&gt;icon&lt;/code&gt;，修改值为&lt;code&gt;C:\msys64\msys2.icon&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;修改command的默认值为&lt;code&gt;C:\msys64\msys2_shell.cmd -mingw64 -here&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="软件包工具pacman"&gt;软件包工具pacman&lt;/h3&gt;
&lt;p&gt;pacman 其实是arch项目的软件包管理工具，与arch通用&lt;/p&gt;
&lt;p&gt;{% highlight sh %}
pacman -Ss qt6 # 搜索软件包
pacman -S mingw-w64-x86_64-qt6 # 安装qt6
pacman -R mingw-w64-x86_64-qt6 # 删除qt6
pacman -Q # 列出已安装的软件包
{% endhighlight %}&lt;/p&gt;
&lt;h3 id="安装环境的选择"&gt;安装环境的选择&lt;/h3&gt;
&lt;p&gt;搜索软件包之后发现很多不同前缀的软件包。&lt;/p&gt;
&lt;p&gt;&lt;img alt="搜索截图" loading="lazy" src="https://kuang-r.github.io/imgs/210726-01.png"&gt;&lt;/p&gt;
&lt;p&gt;分别是&lt;code&gt;mingw32&lt;/code&gt;, &lt;code&gt;mingw64&lt;/code&gt;, &lt;code&gt;ucrt64&lt;/code&gt;, &lt;code&gt;clang64&lt;/code&gt;, &lt;code&gt;msys&lt;/code&gt;。这些前缀分别对应各个不同的运行环境。从msys2的根目录可以看出，里面有对应前缀的可执行文件，分别对应不同的执行环境。我习惯使用mingw64环境，一直都没出现过什么问题，所以我也推荐你使用这个环境。&lt;/p&gt;
&lt;p&gt;&lt;img alt="msys2根目录" loading="lazy" src="https://kuang-r.github.io/imgs/210726-02.png"&gt;&lt;/p&gt;
&lt;p&gt;在安装时选择对应环境的安装包，然后在相应环境打开的shell中就可以使用。比如你安装了clang64的软件，就只有在打开clang64.exe的终端中才能使用软件，在其它环境中是搜索不到的。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;注意到上面右键打开终端菜单设置中打开的是ming64环境。
在使用软件包工具时我安装的也是mingw64的软件包。&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>c</title><link>https://kuang-r.github.io/posts/2021-01-26-c/</link><pubDate>Tue, 26 Jan 2021 00:00:00 +0000</pubDate><guid>https://kuang-r.github.io/posts/2021-01-26-c/</guid><description>&lt;h2 id="尽量使用define代替enum"&gt;尽量使用#define代替enum&lt;/h2&gt;
&lt;p&gt;因为枚举常量的标识符与变量和typedef名称属于同一个重载分类。
声明会被覆盖&lt;/p&gt;
&lt;h2 id="区分字符型和整型"&gt;区分字符型和整型&lt;/h2&gt;
&lt;p&gt;在进行嵌入式通信编程时，很多人都不搞不清楚字符型和整型之间的区别。
这应该从这两种类型的存储形式和表现形式来区分。&lt;/p&gt;
&lt;p&gt;字符型底层存储形式一般是ascii码，一个signed char的正数足够表示所有的ascii字符。
表现形式是单个字符。&lt;/p&gt;
&lt;p&gt;整型的底层存储形式一般是补码，大小范围取决于具体的类型和占用的字节数。
表现形式通过printf系函数显示出来。&lt;/p&gt;
&lt;h2 id="指针的const使用"&gt;指针的const使用&lt;/h2&gt;
&lt;p&gt;const指针有两种方式。&lt;/p&gt;
&lt;p&gt;在*之前加const表示指向的值不能变。&lt;/p&gt;
&lt;p&gt;在*之后加const表示指针本身不能变。&lt;/p&gt;
&lt;h2 id="宏的一些使用"&gt;宏的一些使用&lt;/h2&gt;
&lt;p&gt;将标识符转为字符串，自动转义和加括号。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#define TEST(a, b) printf(#a &amp;#34;&amp;lt;&amp;#34; #b)
&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="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#define fun(i) fun ## i
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// fun(1) 转换为 fun1
&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;</description></item><item><title>terminal color</title><link>https://kuang-r.github.io/posts/2021-01-17-shell/</link><pubDate>Sun, 17 Jan 2021 00:00:00 +0000</pubDate><guid>https://kuang-r.github.io/posts/2021-01-17-shell/</guid><description>&lt;h2 id="bashrc"&gt;bashrc&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# terminal color&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;export PS1&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;[\[\e[01;32m\]\u@\h\[\e[00m\] \[\e[01;34m\]\W\[\e[00m\]]\$ &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;h2 id="重定向"&gt;重定向&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cmd $&amp;gt;output.txt
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cmd |tee file1 |cmd
&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="子shell"&gt;子shell&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# cat files.txt |xargs -I {} cat {}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cat files.txt | &lt;span style="color:#f92672"&gt;(&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;while&lt;/span&gt; read args; &lt;span style="color:#66d9ef"&gt;do&lt;/span&gt; cat $arg; &lt;span style="color:#66d9ef"&gt;done&lt;/span&gt;&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cmd0 |&lt;span style="color:#f92672"&gt;(&lt;/span&gt;cd path;cmd1;cmd2&lt;span style="color:#f92672"&gt;)&lt;/span&gt; |cmd3
&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="各种命令"&gt;各种命令&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;seq 0 100&lt;/code&gt;返回0到100的整数，分隔符为换行&lt;/li&gt;
&lt;li&gt;数值比较用[]，字符串比较用[[]]&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="内建功能"&gt;内建功能&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;变量&lt;/th&gt;
&lt;th&gt;作用&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;$0&lt;/td&gt;
&lt;td&gt;脚本名称&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;$@&lt;/td&gt;
&lt;td&gt;&amp;ldquo;$1&amp;rdquo; &amp;ldquo;$2&amp;rdquo; &amp;ldquo;$3&amp;rdquo;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;$*&lt;/td&gt;
&lt;td&gt;&amp;ldquo;$1c$2c$3&amp;rdquo;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;$?&lt;/td&gt;
&lt;td&gt;上一个命令退出状态&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IFS&lt;/td&gt;
&lt;td&gt;分隔符集合&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;c表示INS的第一个字符&lt;/p&gt;</description></item><item><title>命令</title><link>https://kuang-r.github.io/posts/2021-01-17-posix-command/</link><pubDate>Sun, 17 Jan 2021 00:00:00 +0000</pubDate><guid>https://kuang-r.github.io/posts/2021-01-17-posix-command/</guid><description>&lt;h1 id="命令"&gt;命令&lt;/h1&gt;
&lt;p&gt;一些常用命令的使用方式和选项&lt;/p&gt;
&lt;h2 id="find"&gt;find&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;-name -iname 否定加! &lt;code&gt;find . ! -name '*.txt'&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;-o -a &lt;code&gt;find . \( -name '*.txt' -o '*.png' \)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;-path &lt;code&gt;find . -path '*/slynux/*' -name '*.txt'&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;-maxdepth -mindepth &lt;code&gt;find -maxdepth 1 -name '*.txt'&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;-L 跟随符号链接&lt;/li&gt;
&lt;li&gt;-type 文件类型&lt;/li&gt;
&lt;li&gt;-size &lt;code&gt;find . -size +2k&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;-user &lt;code&gt;find . -user slynux&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="时间戳"&gt;时间戳&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;-atime 最后一次访问&lt;/li&gt;
&lt;li&gt;-mtime 最后一次修改&lt;/li&gt;
&lt;li&gt;-ctime 元数据（权限或所有权）最后一次改变&lt;/li&gt;
&lt;li&gt;-mmin 分钟&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 1天前，7天内修改的文件&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;find . -mtime -7 -mtime +1
&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="xargs"&gt;xargs&lt;/h2&gt;
&lt;p&gt;从标准输入中读取数据，转换为另一个命令的参数输入。默认会执行&lt;code&gt;echo&lt;/code&gt;指令。&lt;/p&gt;</description></item><item><title>用github的markdown语法</title><link>https://kuang-r.github.io/posts/2021-01-16-jekyll/</link><pubDate>Sat, 16 Jan 2021 00:00:00 +0000</pubDate><guid>https://kuang-r.github.io/posts/2021-01-16-jekyll/</guid><description>&lt;h2 id="综述"&gt;综述&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;jekyll&lt;/code&gt;是一个静态页面生成的框架，功能很强大。一个典型的例子是它的&lt;a href="https://jekyllrb.com/"&gt;官网&lt;/a&gt;和gtk的&lt;a href="https://gtk.org/"&gt;官网&lt;/a&gt;。
但是我在学这东西的时候却感到很头疼，一方面是这个工具是使用ruby的包管理器管理组件，我对ruby是一窍不通。
另一方面是它的官网虽然做得很好看，但是这文档写得也太简陋了，对于没有前端基础的人来说简直一头雾水。
还有一个问题是它标配的主题minima在本地服务器时是正常的，build出来的页面却不正常。连官方主题都是这样，其它的主题也就可想而知了。&lt;/p&gt;
&lt;p&gt;包管理的问题可以用fedora的dnf解决，主题的问题干脆学个前端框架算了。就选&lt;code&gt;bootstrap&lt;/code&gt;吧，它最多人用。&lt;/p&gt;
&lt;h2 id="_configyml"&gt;_config.yml&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;4
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;5
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yml" data-lang="yml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 用github的markdown语法&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;kramdown&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;input&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;GFM&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;auto_ids&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;hard_wrap&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;syntax_highlighter&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;rouge&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;</description></item><item><title>键盘映射（cpas与ctrl互换）</title><link>https://kuang-r.github.io/posts/2021-01-14-%E9%94%AE%E7%9B%98%E6%98%A0%E5%B0%84/</link><pubDate>Thu, 14 Jan 2021 00:00:00 +0000</pubDate><guid>https://kuang-r.github.io/posts/2021-01-14-%E9%94%AE%E7%9B%98%E6%98%A0%E5%B0%84/</guid><description>&lt;h1 id="键盘映射cpas与ctrl互换"&gt;键盘映射（cpas与ctrl互换）&lt;/h1&gt;
&lt;hr&gt;
&lt;p&gt;由于之前有一段时间学习vim，我已经习惯这种键盘映射。&lt;/p&gt;
&lt;p&gt;在不同的系统上有不同的方法。Windows系统需要修改注册表；Linux系统有两种方法修改；Mac系统可以直接在系统设置里调整。&lt;/p&gt;
&lt;h2 id="windows系统修改方法"&gt;windows系统修改方法&lt;/h2&gt;
&lt;p&gt;&lt;Win-R&gt;输入&lt;code&gt;regetdit&lt;/code&gt;打开注册表，找到对应的项&lt;/p&gt;
&lt;p&gt;&lt;img alt="picture1" loading="lazy" src="https://kuang-r.github.io/imgs/2021-01-14-%E6%8C%89%E9%94%AE%E6%98%A0%E5%B0%8401.png"&gt;&lt;/p&gt;
&lt;p&gt;新建二进制值，重命名为&lt;code&gt;Scancode Map&lt;/code&gt;，并修改为下图&lt;/p&gt;
&lt;p&gt;&lt;img alt="picture2" loading="lazy" src="https://kuang-r.github.io/imgs/2021-01-14-%E6%8C%89%E9%94%AE%E6%98%A0%E5%B0%8402.png"&gt;&lt;/p&gt;
&lt;p&gt;**重启电脑后才会生效&lt;/p&gt;
&lt;h2 id="linux系统修改方法xorg"&gt;Linux系统修改方法：xorg&lt;/h2&gt;
&lt;p&gt;首先确保系统里有安装xmodmap这个软件，然后在家目录下创建.Xmodmap文件即可。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;4
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;5
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;6
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;7
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;8
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;!
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;! Swap Caps_Lock and Control_L
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;!
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;remove Lock = Caps_Lock
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;remove Control = Control_L
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;keysym Control_L = Caps_Lock
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;keysym Caps_Lock = Control_L
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;add Lock = Caps_Lock
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;add Control = Control_L
&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;一般而言安装xmodmap软件后会附带地安装自动运行脚本，但是也有没安装的情况。这个时候如果重启后不生效，就需要自己写脚本，设置进入桌面时自动启动xmodmap修改映射，在&lt;code&gt;~/.config/autostart/&lt;/code&gt;目录下创建modmap.desktop。&lt;/p&gt;</description></item><item><title>gcc</title><link>https://kuang-r.github.io/posts/2021-01-13-gcc/</link><pubDate>Wed, 13 Jan 2021 00:00:00 +0000</pubDate><guid>https://kuang-r.github.io/posts/2021-01-13-gcc/</guid><description>&lt;h2 id="gnu-binutils"&gt;gnu binutils&lt;/h2&gt;
&lt;p&gt;一种用于二进制文件、可执行文件、目标代码、共享库和核心转储格式文件。是UNIX系统实验室（USL）作为应用程序二进制接口（Application Binary Interface，ABI）而开发和发布的，也是Linux的主要可执行文件格式。&lt;/p&gt;
&lt;h2 id="gcc"&gt;gcc&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;-g 设置为gdb可使用可执行文件&lt;/li&gt;
&lt;li&gt;-E 预处理&lt;/li&gt;
&lt;li&gt;-S 编译为汇编代码&lt;/li&gt;
&lt;li&gt;-c 编译为目标文件&lt;/li&gt;
&lt;li&gt;-o 输出的文件名称&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="gdb"&gt;gdb&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;l 列出代码&lt;/li&gt;
&lt;li&gt;break+行号 设置断点&lt;/li&gt;
&lt;li&gt;break+函数&lt;/li&gt;
&lt;li&gt;info break 查看断点信息&lt;/li&gt;
&lt;li&gt;r 运行程序&lt;/li&gt;
&lt;li&gt;n 单步执行&lt;/li&gt;
&lt;li&gt;p 输出变量&lt;/li&gt;
&lt;li&gt;c 继续运行直到下一个断点&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="debug"&gt;debug&lt;/h2&gt;
&lt;h3 id="函数运行时间与调用次数"&gt;函数运行时间与调用次数&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;gcc -o test test.c -g -pg
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./test # 运行完后会生成gmon.out文件
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;gprof test # 实现依赖于unix信号量
&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;h3 id="行计数"&gt;行计数&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;gcc -o test test.c -fprofile-arcs -ftest-coverage
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./test
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;gcov test # 生成.gcov文件
&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;</description></item><item><title>posix</title><link>https://kuang-r.github.io/posts/2021-01-13-posix/</link><pubDate>Wed, 13 Jan 2021 00:00:00 +0000</pubDate><guid>https://kuang-r.github.io/posts/2021-01-13-posix/</guid><description>&lt;h2 id="系统维护"&gt;系统维护&lt;/h2&gt;
&lt;h3 id="硬盘"&gt;硬盘&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;fdisk -l &lt;span style="color:#75715e"&gt;#列出硬盘分区&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;blkid &lt;span style="color:#75715e"&gt;#查看硬盘id&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;h3 id="grub2"&gt;grub2&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;4
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;5
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;6
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;7
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;8
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#记住最后选项&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;### 创建虚拟终端&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;```&lt;/span&gt; sh
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;socat -d -d PTY PTY
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo vim /etc/default/grub
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;GRUB_DEFAULT&lt;span style="color:#f92672"&gt;=&lt;/span&gt;saved
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;GRUB_SAVEDEFAULT&lt;span style="color:#f92672"&gt;=&lt;/span&gt;true
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo grub2-mkconfig -o /boot/efi/EFI/fedora/grub.cfg
&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="操作串口"&gt;操作串口&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 4
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 5
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 6
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 7
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 8
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 9
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;10
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;11
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;12
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;13
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;14
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;15
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;16
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;17
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;18
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;19
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;20
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;21
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;22
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;23
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;24
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;25
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;26
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;27
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;28
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;29
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;30
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;31
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;32
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;33
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;34
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;35
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;36
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;37
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;38
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;39
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;40
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;41
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;42
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;43
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;44
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;45
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;46
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;47
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-C" data-lang="C"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#include&lt;/span&gt; &lt;span style="color:#75715e"&gt;&amp;lt;sys/types.h&amp;gt;&lt;/span&gt;&lt;span style="color:#75715e"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#include&lt;/span&gt; &lt;span style="color:#75715e"&gt;&amp;lt;sys/stat.h&amp;gt;&lt;/span&gt;&lt;span style="color:#75715e"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#include&lt;/span&gt; &lt;span style="color:#75715e"&gt;&amp;lt;fcntl.h&amp;gt;&lt;/span&gt;&lt;span style="color:#75715e"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#include&lt;/span&gt; &lt;span style="color:#75715e"&gt;&amp;lt;unistd.h&amp;gt;&lt;/span&gt;&lt;span style="color:#75715e"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#include&lt;/span&gt; &lt;span style="color:#75715e"&gt;&amp;lt;termios.h&amp;gt;&lt;/span&gt;&lt;span style="color:#75715e"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#include&lt;/span&gt; &lt;span style="color:#75715e"&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;span style="color:#75715e"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;main&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;size_t&lt;/span&gt; buf_len;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;char&lt;/span&gt; buf[&lt;span style="color:#ae81ff"&gt;512&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; fd &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;open&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;/dev/pts/5&amp;#34;&lt;/span&gt;, O_RDWR &lt;span style="color:#f92672"&gt;|&lt;/span&gt; O_NOCTTY &lt;span style="color:#f92672"&gt;|&lt;/span&gt; O_NONBLOCK);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (fd &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;struct&lt;/span&gt; termios tio;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;tcgetattr&lt;/span&gt;(fd, &lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;tio) &lt;span style="color:#f92672"&gt;!=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; tio.c_cflag &lt;span style="color:#f92672"&gt;|=&lt;/span&gt; CLOCAL; &lt;span style="color:#75715e"&gt;// 保证程序不占用串口
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; tio.c_cflag &lt;span style="color:#f92672"&gt;|=&lt;/span&gt; CREAD; &lt;span style="color:#75715e"&gt;// 使能读数据
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; tio.c_cflag &lt;span style="color:#f92672"&gt;&amp;amp;=&lt;/span&gt; &lt;span style="color:#f92672"&gt;~&lt;/span&gt;CRTSCTS; &lt;span style="color:#75715e"&gt;// 不使用流控制
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; tio.c_cflag &lt;span style="color:#f92672"&gt;&amp;amp;=&lt;/span&gt; &lt;span style="color:#f92672"&gt;~&lt;/span&gt;CSIZE; &lt;span style="color:#75715e"&gt;// 屏蔽其它标志位
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; tio.c_cflag &lt;span style="color:#f92672"&gt;|=&lt;/span&gt; CS8; &lt;span style="color:#75715e"&gt;// 8位数据位
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; tio.c_cflag &lt;span style="color:#f92672"&gt;&amp;amp;=&lt;/span&gt; &lt;span style="color:#f92672"&gt;~&lt;/span&gt;PARENB; &lt;span style="color:#75715e"&gt;// 无奇偶校验
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; tio.c_iflag &lt;span style="color:#f92672"&gt;&amp;amp;=&lt;/span&gt; &lt;span style="color:#f92672"&gt;~&lt;/span&gt;INPCK;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; tio.c_cflag &lt;span style="color:#f92672"&gt;&amp;amp;=&lt;/span&gt; &lt;span style="color:#f92672"&gt;~&lt;/span&gt;CSTOPB; &lt;span style="color:#75715e"&gt;// 1位停止位
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; tio.c_oflag &lt;span style="color:#f92672"&gt;&amp;amp;=&lt;/span&gt; &lt;span style="color:#f92672"&gt;~&lt;/span&gt;OPOST; &lt;span style="color:#75715e"&gt;// 原始数据输出
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; tio.c_lflag &lt;span style="color:#f92672"&gt;&amp;amp;=&lt;/span&gt; &lt;span style="color:#f92672"&gt;~&lt;/span&gt;(ICANON &lt;span style="color:#f92672"&gt;|&lt;/span&gt; ECHO &lt;span style="color:#f92672"&gt;|&lt;/span&gt; ECHOE &lt;span style="color:#f92672"&gt;|&lt;/span&gt; ISIG);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;cfsetspeed&lt;/span&gt;(&lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;tio, B115200) &lt;span style="color:#f92672"&gt;!=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;tcsetattr&lt;/span&gt;(fd, TCSANOW, &lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;tio) &lt;span style="color:#f92672"&gt;!=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;4&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; i &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;; i &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;100&lt;/span&gt;; &lt;span style="color:#f92672"&gt;++&lt;/span&gt;i)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;write&lt;/span&gt;(fd, &lt;span style="color:#e6db74"&gt;&amp;#34;1234&amp;#34;&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;4&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;while&lt;/span&gt; (&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;printf&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;ok&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\n&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ((buf_len &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;read&lt;/span&gt;(fd, buf, &lt;span style="color:#ae81ff"&gt;512&lt;/span&gt;)) &lt;span style="color:#f92672"&gt;!=&lt;/span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; i &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;; i &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; buf_len; &lt;span style="color:#f92672"&gt;++&lt;/span&gt;i)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;printf&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;%c&amp;#34;&lt;/span&gt;, buf[i]);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;sleep&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&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;</description></item><item><title>正则表达式</title><link>https://kuang-r.github.io/posts/2021-01-13-%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F/</link><pubDate>Wed, 13 Jan 2021 00:00:00 +0000</pubDate><guid>https://kuang-r.github.io/posts/2021-01-13-%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F/</guid><description>&lt;h2 id="综述"&gt;综述&lt;/h2&gt;
&lt;hr&gt;
&lt;p&gt;由于perl是正则表达式的鼻祖，使用perl语法最为合适。
正则表达式一般用在“三剑客”(grep, sed, awk)和vim中。
要注意的是sed和vim都是行编辑模式。&lt;/p&gt;
&lt;h2 id="使用"&gt;使用&lt;/h2&gt;
&lt;p&gt;比如批量重命名文件夹就会用到。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; i in *; &lt;span style="color:#66d9ef"&gt;do&lt;/span&gt; echo &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$i&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; |perl -pe &lt;span style="color:#e6db74"&gt;&amp;#39;s/(\[.+?\]) *(.+)/\2 \1/&amp;#39;&lt;/span&gt;; &lt;span style="color:#66d9ef"&gt;done&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="greedy-和-lazy-匹配"&gt;greedy 和 lazy 匹配&lt;/h2&gt;
&lt;p&gt;在* +后添加?&lt;/p&gt;
&lt;h2 id="转义字符"&gt;转义字符&lt;/h2&gt;
&lt;p&gt;. ? + * [] {} /&lt;/p&gt;
&lt;h2 id="基本字符类"&gt;基本字符类&lt;/h2&gt;
&lt;p&gt;\d 数字字符 \D 非数字字符&lt;/p&gt;
&lt;p&gt;\w [a-zA-Z0-9_] \W [^a-zA-Z0-9_]&lt;/p&gt;
&lt;p&gt;\s 空白字符 \S&lt;/p&gt;
&lt;h2 id="posix字符类"&gt;POSIX字符类&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[:alnum:] [a-zA-Z0-9]&lt;/li&gt;
&lt;li&gt;[:alpha:] [a-zA-Z]&lt;/li&gt;
&lt;li&gt;[:xdigit:] [a-fA-F0-9]&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="边界匹配"&gt;边界匹配&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;\b 单词边界 \B&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="环视lookaround"&gt;环视（lookaround）&lt;/h2&gt;
&lt;p&gt;设置需要匹配不需要获取的部分。
因为lookahead比lookbehind实现更简单，所以lookbehind一般有字符数字的限制，lookahead则没有。&lt;/p&gt;
&lt;h3 id="向前查看lookahead"&gt;向前查看（lookahead）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;肯定式 .+(?=:)&lt;/li&gt;
&lt;li&gt;否定式 .+(?!:)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="向后查看lookbehind"&gt;向后查看（lookbehind）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;肯定式 (?&amp;lt;=$)[0-9.]+&lt;/li&gt;
&lt;li&gt;否定式 (?&amp;lt;!$)[0-9.]+&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="嵌入式条件"&gt;嵌入式条件&lt;/h2&gt;
&lt;p&gt;(/()?\d{3}(?(1))|-)\d{3}-\d{4}&lt;/p&gt;</description></item><item><title>自动保存http帐号密码</title><link>https://kuang-r.github.io/posts/2021-01-13-git/</link><pubDate>Wed, 13 Jan 2021 00:00:00 +0000</pubDate><guid>https://kuang-r.github.io/posts/2021-01-13-git/</guid><description>&lt;h2 id="设置"&gt;设置&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 自动保存http帐号密码&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git config --global credential.helper store
&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="版本控制"&gt;版本控制&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;git difftool 1234 4321 file -y&lt;/code&gt; 比较不同提交差异&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git commit --amend&lt;/code&gt; 追加提交&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="log"&gt;log&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;4
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;5
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;6
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;7
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git log --since&lt;span style="color:#f92672"&gt;=&lt;/span&gt;2.weeks --until&lt;span style="color:#f92672"&gt;=&lt;/span&gt;2.days
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git log --since&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;2020-05-01&amp;#39;&lt;/span&gt; --until&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;2020-06-01&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git log --author&lt;span style="color:#f92672"&gt;=&lt;/span&gt;kuang-R
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 正则查找提交说明&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git log --grep &lt;span style="color:#e6db74"&gt;&amp;#34;update&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 查找添加或移除某个特定函数的提交&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git log -Sfunction_name
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# --all-match&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;h3 id="tag"&gt;tag&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;4
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;5
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;6
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;7
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git tag -l &lt;span style="color:#e6db74"&gt;&amp;#39;v1.8*&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# annotated&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git tag -a v1.0 -m&lt;span style="color:#e6db74"&gt;&amp;#34;my version 1.0&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# lightweight&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git tag v1.0
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git push --tags
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git tag -d v1.o
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git push origin :refs/tags/v1.0
&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="远程仓库"&gt;远程仓库&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;git remote -v&lt;/code&gt; 查看远程仓库&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git remote add name url&lt;/code&gt; 添加远程仓库&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git push name branch&lt;/code&gt; -u 设为默认push仓库&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="gitignore"&gt;.gitignore&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;#开始的行会被忽略&lt;/li&gt;
&lt;li&gt;以/开头禁止递归匹配（子目录）&lt;/li&gt;
&lt;li&gt;以/结尾表示目录&lt;/li&gt;
&lt;li&gt;!取反&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="ssh"&gt;ssh&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ssh-keygen -t rsa -C &lt;span style="color:#e6db74"&gt;&amp;#34;a1173522112@163.com&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cat ~/.ssh/id_rsa.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;</description></item><item><title>embed</title><link>https://kuang-r.github.io/posts/2021-01-12-embed/</link><pubDate>Tue, 12 Jan 2021 00:00:00 +0000</pubDate><guid>https://kuang-r.github.io/posts/2021-01-12-embed/</guid><description>&lt;h3 id="debug"&gt;DEBUG&lt;/h3&gt;
&lt;hr&gt;
&lt;p&gt;在freerots中断言有两种类型。&lt;a href="https://www.freertos.org/a00110.html#configASSERT"&gt;官网描述&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;关中断然后进入死循环，使用调试器定位出错位置&lt;/li&gt;
&lt;li&gt;进入一个自定义的函数，输出文件名或者文件位置&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;4
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;5
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;/* Define configASSERT() to disable interrupts and sit in a loop. */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#define configASSERT( ( x ) ) if( ( x ) == 0 ) { taskDISABLE_INTERRUPTS(); for( ;; ); }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;/* Define configASSERT() to call vAssertCalled() if the assertion fails. The assertion
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;has failed if the value of the parameter passed into configASSERT() equals zero. */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#define configASSERT( ( x ) ) if( ( x ) == 0 ) vAssertCalled( __FILE__, __LINE__ )
&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;值得注意的是，cubemx自动生成第一种类型的中断，而且是在USER code中生成的。
这意味着只需要将configASSERT定义为空就可以关掉debug设置，而且不会被新生成的代码覆盖。&lt;/p&gt;</description></item><item><title>msys2</title><link>https://kuang-r.github.io/posts/2021-01-12-msys2/</link><pubDate>Tue, 12 Jan 2021 00:00:00 +0000</pubDate><guid>https://kuang-r.github.io/posts/2021-01-12-msys2/</guid><description>&lt;h2 id="添加右键菜单"&gt;添加右键菜单&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;打开注册表&lt;code&gt;HKEY_CLASSES_ROOT\Directory\Background\shell&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;新建项&lt;code&gt;msys2&lt;/code&gt;，默认值修改为&lt;code&gt;msys2&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;新建字符串值，命名为&lt;code&gt;icon&lt;/code&gt;，修改值为&lt;code&gt;C:\msys64\msys2.icon&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;修改command的默认值为&lt;code&gt;C:\msys64\msys2_shell.cmd -mingw64 -here&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;</description></item><item><title>将ADC的值编码成可播放的WAV</title><link>https://kuang-r.github.io/posts/2021-01-12-%E5%A3%B0%E9%9F%B3%E9%87%87%E9%9B%86/</link><pubDate>Tue, 12 Jan 2021 00:00:00 +0000</pubDate><guid>https://kuang-r.github.io/posts/2021-01-12-%E5%A3%B0%E9%9F%B3%E9%87%87%E9%9B%86/</guid><description>&lt;h1 id="将adc的值编码成可播放的wav"&gt;将ADC的值编码成可播放的WAV&lt;/h1&gt;
&lt;p&gt;记录一些基础知识和原理&lt;/p&gt;
&lt;h2 id="声音"&gt;声音&lt;/h2&gt;
&lt;p&gt;声音（sound)是由物体振动产生的声波，作为一种波，频率在20Hz~20kHz之间的声音是可以被人耳识别的。&lt;/p&gt;
&lt;h2 id="语音编码"&gt;语音编码&lt;/h2&gt;
&lt;h3 id="原理"&gt;原理&lt;/h3&gt;
&lt;p&gt;有一定电子基础的都知道传感器采集音频信号是模拟量，而我们实际传输过程中使用的是数字量。而这就涉及到模拟转数字的过程。
而模拟信号数字化必须经过三个过程，即抽样、量化和编码，以实现话音数字化的脉冲编码调制（PCM，Pulse Coding Modulation）技术。&lt;/p&gt;
&lt;h3 id="抽样sampling"&gt;抽样(Sampling)&lt;/h3&gt;
&lt;p&gt;抽样是把模拟信号以其信号带宽2倍以上的频率提取样值，变为在时间轴上离散的抽样信号的过程。&lt;/p&gt;
&lt;h4 id="采样率-sample"&gt;采样率 (sample)&lt;/h4&gt;
&lt;p&gt;每秒从连续信号中提取并组成离散信号的采样个数，用赫兹（Hz）来表示。&lt;/p&gt;
&lt;h3 id="量化quantizing"&gt;量化（quantizing）&lt;/h3&gt;
&lt;p&gt;抽样信号虽然是时间轴上离散的信号，但仍然是模拟信号，其样值在一定的取值范围内，可有无限多个值。
显然，对无限个样值一一给出数字码组来对应是不可能的。为了实现以数字码表示样值，必须采用“四舍五入”的方法把样值分级“取整”，使一定取值范围内的样值由无限多个值变为有限个值。
这一过程称为量化。&lt;/p&gt;
&lt;h4 id="量化噪音"&gt;量化噪音&lt;/h4&gt;
&lt;p&gt;量化后的抽样信号与量化前的抽样信号相比较，当然有所失真，且不再是模拟信号。
这种量化失真在接收端还原模拟信号时表现为噪声，并称为量化噪声。
量化噪声的大小取决于把样值分级“取整”的方式，分的级数越多，即量化级差或间隔越小，量化噪声也越小。&lt;/p&gt;
&lt;h4 id="采样位数"&gt;采样位数&lt;/h4&gt;
&lt;p&gt;指的是描述数字信号所使用的位数。
8位(8bit)代表2的8次方=256，16 位(16bit)则代表2的16次方=65536； 采样位数越高，精度越高。&lt;/p&gt;
&lt;h3 id="编码coding"&gt;编码（Coding）&lt;/h3&gt;
&lt;p&gt;量化后的抽样信号就转化为按抽样时序排列的一串十进制数字码流，即十进制数字信号。
简单高效的数据系统是二进制码系统，因此，应将十进制数字代码变换成二进制编码。
根据十进制数字代码的总个数，可以确定所需二进制编码的位数，即字长(采样位数)。
这种把量化的抽样信号变换成给定字长的二进制码流的 过程称为编码。&lt;/p&gt;
&lt;h2 id="一些概念"&gt;一些概念&lt;/h2&gt;
&lt;h3 id="采样频率"&gt;采样频率&lt;/h3&gt;
&lt;p&gt;人对频率的识别范围是 20HZ - 20000HZ, 如果每秒钟能对声音做 20000 个采样, 回放时就足可以满足人耳的需求。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;8000hz 为电话采样。&lt;/li&gt;
&lt;li&gt;22050 的采样频率是常用的。&lt;/li&gt;
&lt;li&gt;44100已是CD音质, 超过48000的采样对人耳已经没有意义。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="采样位数-1"&gt;采样位数&lt;/h3&gt;
&lt;p&gt;每个采样数据记录的是振幅, 采样精度取决于储存空间（采样位数）的大小。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1 字节(也就是8bit) 只能记录 256 个数, 也就是只能将振幅划分成 256 个等级。&lt;/li&gt;
&lt;li&gt;2 字节(也就是16bit) 可以细到 65536 个数, 这已是 CD 标准了。&lt;/li&gt;
&lt;li&gt;4 字节(也就是32bit) 能把振幅细分到 4294967296 个等级, 实在是没必要了。
如果是双声道(stereo), 采样就是双份的, 文件也差不多要大一倍。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="比特率"&gt;比特率&lt;/h3&gt;
&lt;p&gt;码率，是指经过编码后的音频数据每秒钟需要用多少个比特来表示。&lt;/p&gt;</description></item></channel></rss>