<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Blogs on Ben&#39;s Blog</title>
    <link>/blogs/</link>
    <description>Recent content in Blogs on Ben&#39;s Blog</description>
    <generator>Hugo</generator>
    <language>en-us</language>
    <lastBuildDate>Tue, 17 Mar 2026 21:04:49 +0800</lastBuildDate>
    <atom:link href="/blogs/rss.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>charset, encoding and locale</title>
      <link>/blogs/charset_encoding_and_locale/</link>
      <pubDate>Sat, 07 Mar 2026 18:03:16 +0800</pubDate>
      <guid>/blogs/charset_encoding_and_locale/</guid>
      <description>&lt;h2 id=&#34;introduction&#34;&gt;&#xA;  Introduction&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#introduction&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;最近遇到了好几次编码的问题，命令行用 &lt;code&gt;printf&lt;/code&gt; 打印 16 进制，top 内存越界，然后正好有时间，就将这块知识了解了一下。&lt;/p&gt;&#xA;&lt;p&gt;以及在安装 Linux 的时候经常会设置语言 &lt;code&gt;zh_CN.UTF-8&lt;/code&gt; 或者 &lt;code&gt;en_US.UTF-8&lt;/code&gt;。&lt;/p&gt;&#xA;&#xA;&#xA;&lt;h2 id=&#34;tldr&#34;&gt;&#xA;  TL;DR;&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#tldr&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;Unicode 前，人类字符存于计算机只有一次编码：&lt;/p&gt;&#xA;&lt;div class=&#34;mermaid&#34;&gt;&#xA;  graph LR&#xA;A[人类字符] --&gt; B[存于计算机的字节]&#xA;&lt;/div&gt;&#xA;&#xA;&lt;p&gt;Unicode 后，人类字符存于计算机有两次编码：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;人工将人类字符编码成 Unicode，在计算机中就用 Unicode 就代表人类字符。&lt;/li&gt;&#xA;&lt;li&gt;代表人类字符的 Unicode 存于计算机时，需要编码成其他字节流。&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;div class=&#34;mermaid&#34;&gt;&#xA;  graph LR&#xA;A[人类字符] &lt;--&gt; B[Unicode] --&gt; C[存于计算机的字节]&#xA;&lt;/div&gt;&#xA;&#xA;&lt;p&gt;Unicode 是计算机可以描述人类字符的全集。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;字符集：&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Unicode 前：等同于编码&lt;/li&gt;&#xA;&lt;li&gt;Unicode 后：Unicode UCS-4 的子集，选用其中的部分字符作为字符集&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;编码：Unicode 字符编号如何实际存储&lt;/li&gt;&#xA;&lt;li&gt;字体：Unicode 编号对应的字形&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&#xA;&lt;h2 id=&#34;编码和字符集&#34;&gt;&#xA;  编码和字符集&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#%e7%bc%96%e7%a0%81%e5%92%8c%e5%ad%97%e7%ac%a6%e9%9b%86&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;我们在学校中学过 ASCII 编码，知道 &lt;code&gt;A&lt;/code&gt; 的 ASCII 码是 &lt;code&gt;65&lt;/code&gt;。中文数字太多，一个字节编码不够，需要用两个字节，用 GB 2312 编码，来表示一个字节不够，而 ASCII 没有用尽一个字节的所有位数，在高位设置一个 bit，来区分原始的 ASCII 还是 GB 2312。&lt;/p&gt;</description>
    </item>
    <item>
      <title>NVIDIA GPU components version selection</title>
      <link>/blogs/NVIDIA_GPU_components_version_selection/</link>
      <pubDate>Tue, 02 Sep 2025 16:17:32 +0800</pubDate>
      <guid>/blogs/NVIDIA_GPU_components_version_selection/</guid>
      <description>&lt;p&gt;[toc]&lt;/p&gt;&#xA;&#xA;&#xA;&lt;h2 id=&#34;big-picture&#34;&gt;&#xA;  Big Picture&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#big-picture&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;Components Level&lt;/th&gt;&#xA;          &lt;th&gt;Examples&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;PyTorch&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;import torch&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;CUDA Toolkit&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;nvcc&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;CUDA driver&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;libcuda.so&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;device driver&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;nvidia.ko&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;GPU hardware&lt;/td&gt;&#xA;          &lt;td&gt;Architecture and Compute Capability&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;各个层之间以 ABI 对接&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./figures/CUDA-components.png&#34; alt=&#34;CUDA-components (by NVIDIA)&#34;&gt;&lt;/p&gt;&#xA;&#xA;&#xA;&lt;h2 id=&#34;gpu-hardware-and-compute-capabilitycc&#34;&gt;&#xA;  GPU hardware and Compute Capability(CC)&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#gpu-hardware-and-compute-capabilitycc&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Compute Capability (CC) defines the hardware features and supported&#xA;instructions for each NVIDIA GPU architecture.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;Compute Capability 其实就是指令集，可能高等级的指令集比低等级的指令更多。硬件定下来了，指令集也就定下来了。&lt;/p&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;Compute Capability Major Revision Number&lt;/th&gt;&#xA;          &lt;th&gt;NVIDIA GPU Architecture&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;12&lt;/td&gt;&#xA;          &lt;td&gt;NVIDIA Blackwell GPU Architecture&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;11&lt;/td&gt;&#xA;          &lt;td&gt;NVIDIA Blackwell GPU Architecture&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;10&lt;/td&gt;&#xA;          &lt;td&gt;NVIDIA Blackwell GPU Architecture&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;9&lt;/td&gt;&#xA;          &lt;td&gt;NVIDIA Hopper GPU Architecture&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;8&lt;/td&gt;&#xA;          &lt;td&gt;NVIDIA Ampere GPU Architecture&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;7&lt;/td&gt;&#xA;          &lt;td&gt;NVIDIA Volta GPU Architecture&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;6&lt;/td&gt;&#xA;          &lt;td&gt;NVIDIA Pascal GPU Architecture&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;5&lt;/td&gt;&#xA;          &lt;td&gt;NVIDIA Maxwell GPU Architecture&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;3&lt;/td&gt;&#xA;          &lt;td&gt;NVIDIA Kepler GPU Architecture&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;Compute Capability&lt;/th&gt;&#xA;          &lt;th&gt;NVIDIA GPU Architecture&lt;/th&gt;&#xA;          &lt;th&gt;Based On&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;7.5&lt;/td&gt;&#xA;          &lt;td&gt;NVIDIA Turing GPU Architecture&lt;/td&gt;&#xA;          &lt;td&gt;NVIDIA Volta GPU Architecture&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;8.9&lt;/td&gt;&#xA;          &lt;td&gt;NVIDIA Ada GPU Architecture&lt;/td&gt;&#xA;          &lt;td&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Compared to Ampere, Ada delivers more than double the FP16, BF16, TF32, INT8, and INT4 Tensor TFLOPS, and&#xA;also includes the Hopper FP8 Transformer Engine, delivering over 1.45 PetaFLOPS of tensor processing in the&#xA;RTX 6000 Ada Generation.&lt;/p&gt;</description>
    </item>
    <item>
      <title>file descriptor and fd redirection in bash</title>
      <link>/blogs/file_descriptor_and_fd_redirection_in_shell/</link>
      <pubDate>Fri, 18 Jul 2025 16:18:39 +0800</pubDate>
      <guid>/blogs/file_descriptor_and_fd_redirection_in_shell/</guid>
      <description>&lt;h2 id=&#34;文件描述符&#34;&gt;&#xA;  文件描述符&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#%e6%96%87%e4%bb%b6%e6%8f%8f%e8%bf%b0%e7%ac%a6&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;文件描述符（file descriptor，简称 fd）在 Linux 中表示文件的句柄（file handle）但它到底是个啥呢？我们知道在 Linux 中，我们可以用 &lt;code&gt;open&lt;/code&gt; 函数打开一个文件，返回的是 &lt;code&gt;int&lt;/code&gt;，所以 fd 就是一个整型数组。我们可以在 &lt;code&gt;/proc/&amp;lt;pid&amp;gt;/fd&lt;/code&gt; 中看到某个进程当前打开的文件。如果是磁盘上的文件，那就是一个 symbolic link 指向那个文件。当然还有其他管道文件。&lt;/p&gt;&#xA;&lt;p&gt;那这个整型变量 fd 到底是什么呢？我们会发现 fd 的来源 &lt;code&gt;open&lt;/code&gt; 其实不是普通的函数，它其实是一个系统调用，是 Linux 内核提供给应用程序的 API。在内核中 fd 这个整型是指该进程（&lt;code&gt;struct task&lt;/code&gt;）打开的文件列表（（&lt;code&gt;struct task -&amp;gt; struct files_struct -&amp;gt; struct file *&lt;/code&gt;））数组的下标。应用程序将来要操作这个文件只需要将这个 &lt;code&gt;int&lt;/code&gt; 丢给操作系统，操作系统就会代替程序去读取写入实际的文件。&lt;/p&gt;&#xA;&#xA;&#xA;&lt;h2 id=&#34;标准输入标准输出和错误输出&#34;&gt;&#xA;  标准输入、标准输出和错误输出&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#%e6%a0%87%e5%87%86%e8%be%93%e5%85%a5%e6%a0%87%e5%87%86%e8%be%93%e5%87%ba%e5%92%8c%e9%94%99%e8%af%af%e8%be%93%e5%87%ba&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;在 Linux 中有三个较为特殊的文件描述符，它们是&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;标准输入（stdin）：&lt;code&gt;fd=0&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;标准输出（stdout）：&lt;code&gt;fd=1&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;标准错误输出（stderr）：&lt;code&gt;fd=2&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;我们在用 &lt;code&gt;fprintf&lt;/code&gt; 的时候会用到他们，因为对应用程序来说，往屏幕上输出东西，也非它所能做的，也需要操作系统这个代理来实现。因为他们太基础了，所以默认这三个是开给所有的进程的。&lt;/p&gt;&#xA;&#xA;&#xA;&lt;h2 id=&#34;bash-中的-fd&#34;&gt;&#xA;  bash 中的 fd&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#bash-%e4%b8%ad%e7%9a%84-fd&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;man bash 中 REDIRECTION 节有详细的介绍&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Tips: 在下面的例子中，我们可以用 &lt;code&gt;echo $$&lt;/code&gt; 得到当前进程的 PID，在合适的地方 &lt;code&gt;sleep&lt;/code&gt;，然后外部去访问 &lt;code&gt;/proc/&amp;lt;pid&amp;gt;/fd&lt;/code&gt; 查看当前 &lt;code&gt;fd&lt;/code&gt; 的情况。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&#xA;&lt;h3 id=&#34;fd-的表示&#34;&gt;&#xA;  fd 的表示&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#fd-%e7%9a%84%e8%a1%a8%e7%a4%ba&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;输入：&lt;code&gt;[fd]&amp;lt;&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;输出：&lt;code&gt;[fd]&amp;gt;&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&#xA;&lt;h3 id=&#34;fd-的新建&#34;&gt;&#xA;  fd 的新建&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#fd-%e7%9a%84%e6%96%b0%e5%bb%ba&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&#xA;&#xA;&#xA;&lt;h4 id=&#34;输入&#34;&gt;&#xA;  输入&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#%e8%be%93%e5%85%a5&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h4&gt;&#xA;&#xA;&lt;p&gt;&lt;code&gt;[fd]&amp;lt; input_file&lt;/code&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Gerrit Replication</title>
      <link>/blogs/gerrit_replication/</link>
      <pubDate>Tue, 27 May 2025 16:02:47 +0800</pubDate>
      <guid>/blogs/gerrit_replication/</guid>
      <description>&lt;p&gt;[toc]&lt;/p&gt;&#xA;&#xA;&#xA;&lt;h2 id=&#34;introduction&#34;&gt;&#xA;  Introduction&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#introduction&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;&#xA;&#xA;&lt;a href=&#34;https://gerrit.googlesource.com/plugins/replication/&amp;#43;doc/master/src/main/resources/Documentation/config.md&#34; target=&#34;_blank&#34;&gt;Gerrit 官方文档&lt;/a&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;replication&lt;/code&gt; 是 Gerrit 提供的插件：当“主服务器”中的相关仓库更新时，会自动同步到“从服务器”，因而可以实现备份，只允许单向流动。它的实现是：用本地的 Unix 帐号，通过 git 向其他服务器 push “本地 Gerrit 工作目录下 git 子目录下的目录仓库”。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;注意&lt;/strong&gt;：&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;replication&lt;/code&gt; 的执行和 Gerrit 软件提供的 git 账户没有关系：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;master 端：它不是用 Gerrit 内部的用户来推送到远端的，而是用“启动 Gerrit 软件的 &lt;strong&gt;本地帐号&lt;/strong&gt; ”&lt;/li&gt;&#xA;&lt;li&gt;slave 端：接收不是走 Gerrit 开放的 ssh 端口。而是走“本地账户”的 ssh 端口（不全对，可以参考 replication 后记）&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;由于我希望 slave 端接收到从 master 传过来的 git 后，亦能提供 clone fetch 等只读的服务。而这些服务是受限的，权限信息都在 All-Projects.git, All-Users.git 这两个仓库下，最简单的办法就是 slave 端也用 Gerrit 来发布，以避免权限转化和不统一。同时我还要配置 slave 端设成只读。&lt;/p&gt;&#xA;&#xA;&#xA;&lt;h2 id=&#34;配置&#34;&gt;&#xA;  配置&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#%e9%85%8d%e7%bd%ae&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&#xA;&#xA;&#xA;&lt;h3 id=&#34;启动两个-docker&#34;&gt;&#xA;  启动两个 docker&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#%e5%90%af%e5%8a%a8%e4%b8%a4%e4%b8%aa-docker&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&#xA;&lt;p&gt;启动两个 docker&lt;/p&gt;</description>
    </item>
    <item>
      <title>install NVIDIA supported docker</title>
      <link>/blogs/install_nvidia_docker/</link>
      <pubDate>Mon, 28 Apr 2025 11:50:29 +0800</pubDate>
      <guid>/blogs/install_nvidia_docker/</guid>
      <description>&lt;h2 id=&#34;docker&#34;&gt;&#xA;  docker&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#docker&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;&#xA;&#xA;&lt;a href=&#34;https://docs.docker.com/engine/install/ubuntu/&#34; target=&#34;_blank&#34;&gt;official doc&lt;/a&gt;&#xA;&lt;/p&gt;&#xA;&#xA;&#xA;&lt;h3 id=&#34;装&#34;&gt;&#xA;  装&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#%e8%a3%85&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 拷自 official doc&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Add Docker&amp;#39;s official GPG key:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apt-get update&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apt-get install ca-certificates curl&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo install -m &lt;span style=&#34;color:#ae81ff&#34;&gt;0755&lt;/span&gt; -d /etc/apt/keyrings&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo chmod a+r /etc/apt/keyrings/docker.asc&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Add the repository to Apt sources:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;echo &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;deb [arch=&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;dpkg --print-architecture&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt; signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;. /etc/os-release &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; echo &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;${&lt;/span&gt;UBUNTU_CODENAME&lt;span style=&#34;color:#66d9ef&#34;&gt;:-&lt;/span&gt;$VERSION_CODENAME&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt; stable&amp;#34;&lt;/span&gt; | &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  sudo tee /etc/apt/sources.list.d/docker.list &amp;gt; /dev/null&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apt-get update&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#xA;&#xA;&lt;h3 id=&#34;配&#34;&gt;&#xA;  配&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#%e9%85%8d&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&#xA;&#xA;&#xA;&lt;h4 id=&#34;user-add-to-docker-group&#34;&gt;&#xA;  user add to docker group&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#user-add-to-docker-group&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h4&gt;&#xA;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;useradd -a -G docker &amp;lt;username&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;重登&lt;/p&gt;</description>
    </item>
    <item>
      <title>Euler–Lagrange equation</title>
      <link>/blogs/Euler_Lagrange_equation/</link>
      <pubDate>Tue, 25 Mar 2025 08:14:16 +0800</pubDate>
      <guid>/blogs/Euler_Lagrange_equation/</guid>
      <description>&lt;h2 id=&#34;最速降线&#34;&gt;&#xA;  最速降线&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#%e6%9c%80%e9%80%9f%e9%99%8d%e7%ba%bf&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;以最速降线为例：一个小球从 $A$ 点$(x_1, y_1)$ 移动到 $B$ 点 $(x_2, y_2)$，它耗时最少的路径是怎么样的？不妨设 $(x_1,y_1)$ 为 $(0,0)$ 点，记为 A 点，&lt;/p&gt;&#xA;&lt;p&gt;首先，我们求当小球位于 $(x,y)$ 时，它的位移微分：&lt;/p&gt;&#xA;$$&#xA;ds = \sqrt{(dx)^2+(dy)^2}&#xA;$$&lt;p&gt;其次，我们求当小球位于 $(x,y)$ 时，它的速度：&lt;/p&gt;&#xA;$$&#xA;\frac{1}{2} mv^2 = mg \delta h&#xA;$$$$&#xA;v = \sqrt{2gh} = \sqrt{2g(y-y_1)} = \sqrt{2gy}&#xA;$$&lt;p&gt;所以，我们求当小球位于 $(x,y)$ 时，走过 &lt;code&gt;ds&lt;/code&gt; 所需的时间：&lt;/p&gt;&#xA;$$&#xA;dt = \frac{ds}{v} = \frac{\sqrt{(dx)^2+(dy)^2}}{\sqrt{2gy}}&#xA;$$&lt;p&gt;提取出分子里的 $dx$ 可得：&lt;/p&gt;&#xA;$$&#xA;dt = \frac{\sqrt{1+(\frac{dy}{dx})^2}}{\sqrt{2gy}} dx&#xA;$$&lt;p&gt;通常，我们记 $\frac{dy}{dx} = y&#39;$，所以：&lt;/p&gt;&#xA;$$&#xA;dt = \frac{\sqrt{1+(y&#39;)^2}}{\sqrt{2gy}} dx&#xA;$$&lt;p&gt;所以，从 $A$ 点到 $B$ 点的总耗时是：&lt;/p&gt;</description>
    </item>
    <item>
      <title>为 Open Harmony 编译 Application</title>
      <link>/blogs/dev_eco_studio_build_for_ohos/</link>
      <pubDate>Wed, 12 Mar 2025 08:16:32 +0800</pubDate>
      <guid>/blogs/dev_eco_studio_build_for_ohos/</guid>
      <description>&lt;h2 id=&#34;introduction&#34;&gt;&#xA;  Introduction&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#introduction&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;我下载了 OpenHarmony-4.1.2 的 SDK，然后编译了 Hihope/dayu210，并把把生成的镜像烧录到了我们的板子上，板子启动后，现在准备开发上层应用，但是 DevEco Studio 提供的 demo 直接跑不起来，需要做些改动。&lt;/p&gt;&#xA;&lt;p&gt;&#xA;&#xA;&lt;a href=&#34;https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/ide-project-V5&#34; target=&#34;_blank&#34;&gt;这是华为官方的文档&lt;/a&gt;&#xA;。&lt;/p&gt;&#xA;&#xA;&#xA;&lt;h3 id=&#34;environments&#34;&gt;&#xA;  environments&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#environments&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;DevEco Studio: Build Version: 5.0.7.210, built on February 11, 2025&lt;/li&gt;&#xA;&lt;li&gt;Soc: rk3588&lt;/li&gt;&#xA;&lt;li&gt;Board: Custom Board&lt;/li&gt;&#xA;&lt;li&gt;System SDK Version: 4.1.2&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&#xA;&lt;h2 id=&#34;将-demo-跑起来的详细步骤&#34;&gt;&#xA;  将 Demo 跑起来的详细步骤&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#%e5%b0%86-demo-%e8%b7%91%e8%b5%b7%e6%9d%a5%e7%9a%84%e8%af%a6%e7%bb%86%e6%ad%a5%e9%aa%a4&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&#xA;&#xA;&#xA;&lt;h3 id=&#34;创建工程&#34;&gt;&#xA;  创建工程&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#%e5%88%9b%e5%bb%ba%e5%b7%a5%e7%a8%8b&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&#xA;&lt;p&gt;&lt;img src=&#34;./figures/create_project.png&#34; alt=&#34;create_project&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;因为我们的 OpenHarmony-4.1.2 的 Sdk version 是 11，所以这边我们选择 11&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./figures/create_project_conf_proj.png&#34; alt=&#34;config project&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./figures/create_project_empty_ability.png&#34; alt=&#34;select empty ability&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;(Native C++) 是一样的配置，只是需要多加一个配置，参考&#xA;&#xA;&lt;a href=&#34;#%e9%85%8d%e7%bd%ae-abifilters-%e9%80%89%e7%9a%84%e5%b7%a5%e7%a8%8b%e6%98%af-native-c-%e6%97%b6&#34;&gt;配置 &lt;code&gt;abiFilters&lt;/code&gt; (选的工程是 Native C++ 时)&lt;/a&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;重新创建的路径在：&lt;/p&gt;</description>
    </item>
    <item>
      <title>7zr CPU 性能测试结果解析</title>
      <link>/blogs/7zr_CPU_benchmark_result_parse/</link>
      <pubDate>Wed, 30 Oct 2024 10:07:54 +0800</pubDate>
      <guid>/blogs/7zr_CPU_benchmark_result_parse/</guid>
      <description>&lt;h2 id=&#34;tldr&#34;&gt;&#xA;  TL;DR&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#tldr&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;Speed(KiB/s) = 解压大小(B) * 重复次数(#)/time(s) /1024(B/KiB)&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;usage(%)     ≈ 程序占用 CPU 时间/程序开始到现在为止总耗时*100%&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;R/U(MIPS)    ≈ 产生的指令数(MI)/占用 CPU 的时间&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;Rating(MIPS) ≈ 产生的指令数(MI)/程序耗时(s)&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;code&gt;7zr b -mmt1&lt;/code&gt;&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;                       Compressing  |                  Decompressing&#xA;Dict     Speed Usage    R/U Rating  |      Speed Usage    R/U Rating&#xA;         KiB/s     %   MIPS   MIPS  |      KiB/s     %   MIPS   MIPS&#xA;&#xA;22:       4515   100   4403   4393  |      51373   100   4395   4386&#xA;23:       3883   100   3966   3956  |      50676   100   4395   4387&#xA;24:       3724   100   4014   4004  |      48750   100   4292   4280&#xA;25:       3520   100   4032   4020  |      48064   100   4293   4278&#xA;----------------------------------  | ------------------------------&#xA;Avr:             100   4104   4093  |              100   4344   4333&#xA;Tot:             100   4224   4213&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&#xA;&lt;h2 id=&#34;speed&#34;&gt;&#xA;  Speed&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#speed&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;这段打印在&lt;/p&gt;</description>
    </item>
    <item>
      <title>Introduction to precompiled headers(PCH)</title>
      <link>/blogs/PCH/</link>
      <pubDate>Tue, 08 Oct 2024 12:04:22 +0800</pubDate>
      <guid>/blogs/PCH/</guid>
      <description>&lt;h2 id=&#34;introduction&#34;&gt;&#xA;  Introduction&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#introduction&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;在讲预编译头文件 PCH 的之前，我们简单回顾一下编译的流程，编译大致有以下几个步骤：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;预处理：将源代码中的宏、头文件等展开&lt;/li&gt;&#xA;&lt;li&gt;编译：将源代码转成汇编代码&lt;/li&gt;&#xA;&lt;li&gt;汇编：将汇编代码转成 object 文件&lt;/li&gt;&#xA;&lt;li&gt;链接：生成可执行文件&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;如果有一个头文件，内容特别多，而且在好多源代码中都被引入了，那是不是会导致：每一个源代码文件在编译的时候都要展开一大段，然后在编译每一个源代码文件的时候都要重新编译这一大段，最终导致许多重复展开重复编译。那么我们是否可以将这种重复动作优化一下呢？让他只做一次，然后下次谁要用，就直接去取就完了？这就是“预编译头文件（precompiled header, PCH）” 最初的想法。&lt;/p&gt;&#xA;&#xA;&#xA;&lt;h2 id=&#34;what-is-pch&#34;&gt;&#xA;  What is PCH?&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#what-is-pch&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;这是 &#xA;&#xA;&lt;a href=&#34;https://zh.wikipedia.org/zh-cn/%e9%a2%84%e7%bc%96%e8%af%91%e5%a4%b4&#34; target=&#34;_blank&#34;&gt;Wikipedia 上对 PCH 的介绍&lt;/a&gt;&#xA;:&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;预编译头（precompiled header）是程序设计时把头文件编译为中间格式（如目标文件），以节约在开发过程中编译器反复编译该头文件的开销。 C 语言、C++语言、Objective C 语言等都有类似的技术。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;那这个中间格式实际又是什么呢？我们在下节 “如何生成 PCH 文件” 中会来实际看看它是什么文件。&lt;/p&gt;&#xA;&#xA;&#xA;&lt;h2 id=&#34;如何生成-pch-文件&#34;&gt;&#xA;  如何生成 PCH 文件？&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#%e5%a6%82%e4%bd%95%e7%94%9f%e6%88%90-pch-%e6%96%87%e4%bb%b6&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;非常简单，和编译普通的源文件一样，只需对头文件做编译即可：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;gcc blah.h&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Tips:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;gcc&lt;/code&gt;/&lt;code&gt;g++&lt;/code&gt; 会根据扩展名来选择默认的编译选项，对 &lt;code&gt;h&lt;/code&gt; 文件，会默认使用 &lt;code&gt;-x c-header&lt;/code&gt;，我们也可以强制将一个 &lt;code&gt;c&lt;/code&gt; 文件用 &lt;code&gt;-x c-header&lt;/code&gt; 来编译，编译成 PCH （具体请 &lt;code&gt;man 1 gcc&lt;/code&gt; 搜索 &lt;code&gt;-x&lt;/code&gt; 参数）&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;我们会发现，经过上一条命令的执行，我们得到了 &lt;code&gt;blah.h.gch&lt;/code&gt; 让我们来看看这个文件是什么：&lt;/p&gt;</description>
    </item>
    <item>
      <title>PCIe 和 lspci</title>
      <link>/blogs/PCIe_and_lspci/</link>
      <pubDate>Wed, 08 May 2024 08:06:33 +0800</pubDate>
      <guid>/blogs/PCIe_and_lspci/</guid>
      <description>&lt;h2 id=&#34;pcie-基础介绍&#34;&gt;&#xA;  PCIe 基础介绍&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#pcie-%e5%9f%ba%e7%a1%80%e4%bb%8b%e7%bb%8d&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;Wikipedia 上对 &#xA;&#xA;&lt;a href=&#34;https://zh.wikipedia.org/wiki/PCI_Express&#34; target=&#34;_blank&#34;&gt;PCI_Express&lt;/a&gt;&#xA; 的介绍&#xA;如下：&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Peripheral Component Interconnect Express，简称 PCI-E，官方简称 PCIe，是计算机总线的一个重要分支，它沿用既有的 PCI 编程概念及信号标准，并且构建了更加高速的串行通信系统标准。目前这一标准由 PCI-SIG 组织制定和维护。PCIe 仅应用于内部互连。由于 PCIe 是基于既有的 PCI 系统，所以只需修改物理层而无须修改软件就可将现有 PCI 系统转换为 PCIe。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&#xA;&#xA;&lt;h3 id=&#34;版本传输通道数和速率&#34;&gt;&#xA;  版本、传输通道数和速率&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#%e7%89%88%e6%9c%ac%e4%bc%a0%e8%be%93%e9%80%9a%e9%81%93%e6%95%b0%e5%92%8c%e9%80%9f%e7%8e%87&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&#xA;&lt;p&gt;我们在买固态硬盘和显卡的时候，经常需要确定 PCIe 的 &lt;strong&gt;版本&lt;/strong&gt; 和 &lt;strong&gt;通道数(x几)&lt;/strong&gt;，那这两个和速率有什么关系？&lt;/p&gt;&#xA;&lt;p&gt;首先，什么是 PCIe 的版本和通道数：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;版本：无疑就是 PCIe 技术迭代之后，速率有了极大地提升。例如：&lt;code&gt;PCIe 3.0&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;通道数：lane 数，一条 lane 对应两组“差分信号对”，一组差分信号对用于传输 TX，另一组用于传输 RX。由于 PCIe 是串行传输，多条 lane 的数据传输是由 PCIe 上层应用来自行做 IO 多路复用的。例如：&lt;code&gt;x4&lt;/code&gt;。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;其次，上边两个参数和速率有什么关系？同一版本，通道数每增一个速率就翻倍。版本每增一个，速率几乎翻倍（除了 PCIe 1.0 到 PCIe 2.0）&lt;/p&gt;&#xA;&lt;p&gt;不同版本对应的速率关系：&lt;/p&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;Version&lt;/th&gt;&#xA;          &lt;th&gt;Transfer rate per lane(GT/s)&lt;/th&gt;&#xA;          &lt;th&gt;Line code&lt;/th&gt;&#xA;          &lt;th&gt;Throughput for &lt;code&gt;x1&lt;/code&gt;&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;1.0&lt;/td&gt;&#xA;          &lt;td&gt;2.5&lt;/td&gt;&#xA;          &lt;td&gt;8b/10b&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;2.5 Gib/s*(8b/10b)=2.0 Gib/s=0.250 GiB/s&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;2.0&lt;/td&gt;&#xA;          &lt;td&gt;5.0&lt;/td&gt;&#xA;          &lt;td&gt;8b/10b&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;5.0 Gib/s*(8b/10b)=4.0 Gib/s=0.500 GiB/s&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;3.0&lt;/td&gt;&#xA;          &lt;td&gt;8.0&lt;/td&gt;&#xA;          &lt;td&gt;128b/130b&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;8.0 Gib/s*(128b/130b)=7.88 Gib/s=0.985 GiB/s&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;4.0&lt;/td&gt;&#xA;          &lt;td&gt;16.0&lt;/td&gt;&#xA;          &lt;td&gt;128b/130b&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;16.0 Gib/s*(128b/130b)=15.753 Gib/s=1.969 GiB/s&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;5.0&lt;/td&gt;&#xA;          &lt;td&gt;32.0&lt;/td&gt;&#xA;          &lt;td&gt;128b/130b&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;32.0 Gib/s*(128b/130b)=31.508 Gib/s=3.938 GiB/s&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Tips:&#xA;&lt;ul&gt;&#xA;&lt;li&gt;1 GT/s 表示每秒有 1*10^9 次传输，一次传输传输 1 个bit&lt;/li&gt;&#xA;&lt;li&gt;为了避免多个低信号连续传输无法被区分，我们使用 8b/10b 等 Line code 来编码。所以实际传输速率的计算，如最后一列所写：&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;而通道数的增长就非常简单了，直接对应版本的 &lt;code&gt;x1&lt;/code&gt; 的速率上乘几。&lt;/p&gt;</description>
    </item>
    <item>
      <title>RK and Jetson SDK full work on ArchLinux</title>
      <link>/blogs/rk_jetson_sdk_full_work_on_archlinux/</link>
      <pubDate>Mon, 15 Jan 2024 06:47:39 +0800</pubDate>
      <guid>/blogs/rk_jetson_sdk_full_work_on_archlinux/</guid>
      <description>&lt;h2 id=&#34;tldr&#34;&gt;&#xA;  tl;dr&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#tldr&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;遇到的几个问题，和解决措施：&lt;/p&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;Platform&lt;/th&gt;&#xA;          &lt;th&gt;Problem&lt;/th&gt;&#xA;          &lt;th&gt;Solution&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;RK&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;mknod failed&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;remount docker volume with &lt;code&gt;nodev,noexec&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;del&gt;Jetson&lt;/del&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;del&gt;&lt;code&gt;showmount -e&lt;/code&gt; oom&lt;/del&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;del&gt;ulimit docker option add &lt;code&gt;--ulimit nofile=1024:524288&lt;/code&gt;&lt;/del&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;RK Jetson&lt;/td&gt;&#xA;          &lt;td&gt;RK Maskrom and jetson  burn failed&lt;/td&gt;&#xA;          &lt;td&gt;disable usbcore autosuspend, &lt;code&gt;echo -1 &amp;gt; /sys/module/usbcore/parameters/autosuspend&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Jetson&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;Error: ipv6: address already assigned.&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;no &lt;code&gt;ping6&lt;/code&gt; command, add a ping6 in PATH&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;del&gt;Jetson&lt;/del&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;del&gt;&lt;code&gt;mount.nfs: Connection timed out&lt;/code&gt;&lt;/del&gt;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;del&gt;systemctl restart nfs-server&lt;/del&gt; 看起来是我错误地添加 sudo 导致的，后面没再复现。&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Jetson&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;failed to flash&lt;/code&gt; (something like this)&lt;/td&gt;&#xA;          &lt;td&gt;arch ssh does not support &lt;code&gt;dsa&lt;/code&gt;, &lt;code&gt;tools/ota_tools/version_upgrade/ota_make_recovery_img_dtb.sh&lt;/code&gt; 118 行附近，去除 dsa sshd key 的生成&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;RK&lt;/td&gt;&#xA;          &lt;td&gt;uboot make menuconfig failed&lt;/td&gt;&#xA;          &lt;td&gt;add &lt;code&gt;cc -&amp;gt; gcc-7&lt;/code&gt; to PATH&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;RK&lt;/td&gt;&#xA;          &lt;td&gt;native &lt;code&gt;cp2102&lt;/code&gt; driver does not support 1500000&lt;/td&gt;&#xA;          &lt;td&gt;Use &#xA;&#xA;&lt;a href=&#34;https://aur.archlinux.org/packages/cp210x-overclock-dkms&#34; target=&#34;_blank&#34;&gt;AUR cp210x-overclock-dkms&lt;/a&gt;&#xA;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;由于 docker 中 nfs 有问题（包括 service restart nfs），所以目前我没有使用 docker&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;其他一些 Ubuntu 和 Arch 兼容性的问题：&lt;/p&gt;</description>
    </item>
    <item>
      <title>file、magic number 和 Debian 中 file 的跨大版本更新</title>
      <link>/blogs/file_magic-number_debian-build-deb/</link>
      <pubDate>Tue, 28 Nov 2023 12:06:47 +0800</pubDate>
      <guid>/blogs/file_magic-number_debian-build-deb/</guid>
      <description>&lt;h2 id=&#34;introduction&#34;&gt;&#xA;  Introduction&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#introduction&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;故事会，哈哈，可以跳过，简单来说就是 &lt;code&gt;feh&lt;/code&gt; 没有认出一种 &lt;code&gt;bmp&lt;/code&gt; 的格式。&lt;/p&gt;&#xA;&lt;p&gt;我们在 3588 上使用了 RK 提供的 Debian 11 系统。我们使用 &lt;code&gt;eog&lt;/code&gt; 也就是 gnome 带的图形查看软件，但是遇到了一个问题，如果我用 &lt;code&gt;eog&lt;/code&gt; 打开一张图后，又去更新这张图，&lt;code&gt;eog&lt;/code&gt; 是不会自动刷新的，它没有接入 &lt;code&gt;libnotify&lt;/code&gt;。于是我从 &lt;code&gt;eog&lt;/code&gt; 迁移到了 &lt;code&gt;feh&lt;/code&gt;，由于 Debian 11 自带的 &lt;code&gt;feh&lt;/code&gt; 版本过低只有 &lt;code&gt;3.6.3&lt;/code&gt;，这版的 &lt;code&gt;feh&lt;/code&gt; 也一样不支持 &lt;code&gt;libnotify&lt;/code&gt;，于是我就尝试自己编译并打包 &lt;code&gt;feh-3.10&lt;/code&gt;，打包是基于 arch 的 &lt;code&gt;PKGBUILD&lt;/code&gt;，很是折腾，最后还是成功编译。最近遇到了一个问题：一张 &lt;code&gt;bmp&lt;/code&gt; 的图片，&lt;code&gt;feh&lt;/code&gt; 打不开，给我包这个错：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-log&#34; data-lang=&#34;log&#34;&gt;feh WARNING: T002-001.bmp - Does not look like an image (magic bytes missing)&#xA;feh: No loadable images specified.&#xA;See &amp;#39;feh --help&amp;#39; or &amp;#39;man feh&amp;#39; for detailed usage information&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;然后我用 &lt;code&gt;imagemagick&lt;/code&gt; 转了一下，&lt;code&gt;feh&lt;/code&gt; 就能正常打开了。&lt;/p&gt;</description>
    </item>
    <item>
      <title>RK3588 PCIe Introduction</title>
      <link>/blogs/rk3588_PCIe_intro/</link>
      <pubDate>Thu, 23 Nov 2023 10:51:55 +0800</pubDate>
      <guid>/blogs/rk3588_PCIe_intro/</guid>
      <description>&lt;h2 id=&#34;intro&#34;&gt;&#xA;  Intro&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#intro&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;起因是发现启动的时候 PCIe 有关于 &lt;code&gt;fe160000&lt;/code&gt; 的报错信息:&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-dmesg&#34; data-lang=&#34;dmesg&#34;&gt;[    1.712561] rk-pcie fe160000.pcie: invalid prsnt-gpios property in node&#xA;[    1.728638] rk-pcie fe160000.pcie: IRQ msi not found&#xA;[    1.728645] rk-pcie fe160000.pcie: use outband MSI support&#xA;[    1.728647] rk-pcie fe160000.pcie: Missing *config* reg space&#xA;[    1.728660] rk-pcie fe160000.pcie: host bridge /pcie@fe160000 ranges:&#xA;[    1.728670] rk-pcie fe160000.pcie:      err 0x00f1000000..0x00f10fffff -&amp;gt; 0x00f1000000&#xA;[    1.728677] rk-pcie fe160000.pcie:       IO 0x00f1100000..0x00f11fffff -&amp;gt; 0x00f1100000&#xA;[    1.728686] rk-pcie fe160000.pcie:      MEM 0x00f1200000..0x00f1ffffff -&amp;gt; 0x00f1200000&#xA;[    1.728691] rk-pcie fe160000.pcie:      MEM 0x0940000000..0x097fffffff -&amp;gt; 0x0940000000&#xA;[    1.728712] rk-pcie fe160000.pcie: Missing *config* reg space&#xA;[    1.728739] rk-pcie fe160000.pcie: invalid resource&#xA;[    1.934114] rk-pcie fe160000.pcie: PCIe Linking... LTSSM is 0x0&#xA;[    1.959670] rk-pcie fe160000.pcie: PCIe Linking... LTSSM is 0x1&#xA;[    1.986337] rk-pcie fe160000.pcie: PCIe Linking... LTSSM is 0x0&#xA;[    2.013002] rk-pcie fe160000.pcie: PCIe Linking... LTSSM is 0x0&#xA;[    2.043004] rk-pcie fe160000.pcie: PCIe Linking... LTSSM is 0x0&#xA;[    2.069669] rk-pcie fe160000.pcie: PCIe Linking... LTSSM is 0x0&#xA;[    4.629670] rk-pcie fe160000.pcie: PCIe Link Fail&#xA;[    4.629679] rk-pcie fe160000.pcie: failed to initialize host&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;于是阅读 RK3588 SDK 中关于 PCIe 的文档 &lt;code&gt;docs/cn/Common/PCIe/Rockchip_Developer_Guide_PCIe_CN.pdf&lt;/code&gt;，想了解这个错究竟是什么，对于纯新手的我来说不是很好理解，因而边画，边学习，整理如下，如有错误之处，还请谅解并告知于我，十分感谢。&lt;/p&gt;</description>
    </item>
    <item>
      <title>about rk3588 disk partitions(未完待续) and fdisk, dd</title>
      <link>/blogs/about_rk3588_disk_partitions_and_fdisk_dd/</link>
      <pubDate>Wed, 16 Aug 2023 09:28:51 +0800</pubDate>
      <guid>/blogs/about_rk3588_disk_partitions_and_fdisk_dd/</guid>
      <description>&lt;p&gt;推荐文档：&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;Rockchip_Developer_Guide_UBoot_Nextdev_CN.pdf&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;以前在 Windows 上 用 &lt;code&gt;RKDevTool_Release.exe&lt;/code&gt; 烧录镜像时一直有个疑惑： &lt;code&gt;miniloader&lt;/code&gt; 和 &lt;code&gt;parameter&lt;/code&gt; 的地址为什么是 &lt;code&gt;0x0&lt;/code&gt;，好像是烧到其他地方去了，并且 &lt;code&gt;lsblk&lt;/code&gt; 也看不到这两个文件所在的分区。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./figures/rk_burn_window.png&#34; alt=&#34;rk_burn_window&#34;&gt;&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-console&#34; data-lang=&#34;console&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ lsblk&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;NAME         MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mmcblk0      179:0    0 14.6G  0 disk&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;├─mmcblk0p1  179:1    0    4M  0 part&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;├─mmcblk0p2  179:2    0    4M  0 part&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;├─mmcblk0p3  179:3    0   64M  0 part&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;├─mmcblk0p4  179:4    0  128M  0 part&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;├─mmcblk0p5  179:5    0   32M  0 part&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;├─mmcblk0p6  179:6    0   14G  0 part /&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;├─mmcblk0p7  179:7    0  128M  0 part /oem&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;└─mmcblk0p8  179:8    0  206M  0 part /userdata&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mmcblk0boot0 179:32   0    4M  1 disk&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mmcblk0boot1 179:64   0    4M  1 disk&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这两天在看 uboot 的文档时，&lt;code&gt;Rockchip_Developer_Guide_UBoot_Nextdev_CN.pdf&lt;/code&gt; 看到 &lt;code&gt;2.6 存储布局&lt;/code&gt; 这个疑惑接被解决了。&lt;/p&gt;</description>
    </item>
    <item>
      <title>io_with_plc</title>
      <link>/blogs/io_with_plc/</link>
      <pubDate>Tue, 11 Jul 2023 09:33:47 +0800</pubDate>
      <guid>/blogs/io_with_plc/</guid>
      <description>&lt;p&gt;2023-08-17 update: summary 中添加开关状态&lt;/p&gt;&#xA;&#xA;&#xA;&lt;h1 id=&#34;intro&#34;&gt;&#xA;  Intro&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#intro&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h1&gt;&#xA;&#xA;&lt;p&gt;在阅读之前有一点需要注意的是，我们的输出、输入，和 PLC 的输出、输入不一样，PLC 的输出和输入是带着电源的，我们的不带电源。这点对输入很好理解，但是对于输出，不能理解成我们输出电压，我们的输出只是一个开关。&lt;/p&gt;&#xA;&#xA;&#xA;&lt;h2 id=&#34;input&#34;&gt;&#xA;  Input&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#input&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;&lt;img src=&#34;./figures/input.png&#34; alt=&#34;input&#34;&gt;&lt;/p&gt;&#xA;&#xA;&#xA;&lt;h3 id=&#34;一些标记&#34;&gt;&#xA;  一些标记&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#%e4%b8%80%e4%ba%9b%e6%a0%87%e8%ae%b0&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;左侧&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;OP_IN0&lt;/code&gt;：外部看到的 &lt;code&gt;IN0&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;COMIN1&lt;/code&gt;：外部看到的 IN 口的 &lt;code&gt;COM&lt;/code&gt; 口&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;右侧&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;⏚ ：地 GND&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;GPIO1_C0_Z&lt;/code&gt;：连到上级芯片（主芯片）。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;中间&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;PS2805&lt;/code&gt;：光耦，如果 &lt;code&gt;1&lt;/code&gt; &lt;code&gt;2&lt;/code&gt; 引脚间有电压差，就会发光，会激发 &lt;code&gt;3&lt;/code&gt; &lt;code&gt;4&lt;/code&gt; 引脚间的光敏二极管，即 &lt;code&gt;3&lt;/code&gt; &lt;code&gt;4&lt;/code&gt; 导通，也就是 &lt;strong&gt;有电压差，开关闭合&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./figures/PS2805.png&#34; alt=&#34;PS2805&#34;&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&#xA;&lt;h3 id=&#34;右内侧电路&#34;&gt;&#xA;  右（内）侧电路&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#%e5%8f%b3%e5%86%85%e4%be%a7%e7%94%b5%e8%b7%af&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&#xA;&lt;p&gt;先说简单的：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;工作状态：&lt;code&gt;3&lt;/code&gt; &lt;code&gt;4&lt;/code&gt; 引脚间的光敏二极管导通，&lt;code&gt;GPIO1_C0_Z&lt;/code&gt; 的电压等于 3 引脚的 &lt;code&gt;GND&lt;/code&gt;，低电平&lt;/li&gt;&#xA;&lt;li&gt;停止工作状态：&lt;code&gt;3&lt;/code&gt; &lt;code&gt;4&lt;/code&gt; 引脚间的光敏二极管开路断开，&lt;code&gt;GPIO1_C0_Z&lt;/code&gt; 的电压等于 &lt;code&gt;VCC_1V8_S0&lt;/code&gt;，高电平&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&#xA;&lt;h3 id=&#34;左外侧电路&#34;&gt;&#xA;  左（外）侧电路&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#%e5%b7%a6%e5%a4%96%e4%be%a7%e7%94%b5%e8%b7%af&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;COMIN1&lt;/code&gt; 高电平&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;OP_IN0&lt;/code&gt; 低电平，&lt;code&gt;1&lt;/code&gt; &lt;code&gt;2&lt;/code&gt; 之间&lt;strong&gt;有&lt;/strong&gt;电压差，中间的光耦工作。&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;OP_IN0&lt;/code&gt; 高电平，&lt;code&gt;1&lt;/code&gt; &lt;code&gt;2&lt;/code&gt; 之间&lt;strong&gt;无&lt;/strong&gt;电压差，中间的光耦不工作。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;COMIN1&lt;/code&gt; 低电平，&lt;code&gt;OP_IN0=1&lt;/code&gt;，&lt;code&gt;1&lt;/code&gt; &lt;code&gt;2&lt;/code&gt; 之间有电压差，中间的光耦工作&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;OP_IN0&lt;/code&gt; 低电平，&lt;code&gt;1&lt;/code&gt; &lt;code&gt;2&lt;/code&gt; 之间&lt;strong&gt;无&lt;/strong&gt;电压差，中间的光耦不工作。&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;OP_IN0&lt;/code&gt; 高电平，&lt;code&gt;1&lt;/code&gt; &lt;code&gt;2&lt;/code&gt; 之间&lt;strong&gt;有&lt;/strong&gt;电压差，中间的光耦工作。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&#xA;&lt;h3 id=&#34;整体电路&#34;&gt;&#xA;  整体电路&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#%e6%95%b4%e4%bd%93%e7%94%b5%e8%b7%af&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&#xA;&lt;p&gt;定义：&lt;/p&gt;</description>
    </item>
    <item>
      <title>python virtual env and venv</title>
      <link>/blogs/python_virtual_env/</link>
      <pubDate>Mon, 19 Jun 2023 06:59:23 +0800</pubDate>
      <guid>/blogs/python_virtual_env/</guid>
      <description>&lt;p&gt;pre introduction : stackoverflow &#xA;&#xA;&lt;a href=&#34;https://stackoverflow.com/a/41573588/13033234&#34; target=&#34;_blank&#34;&gt;what-is-the-difference-between-venv-pyvenv-pyenv-virtualenv-virtualenvwrappe&lt;/a&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;原先位于 Tips write date: 2021-04-21T00:00:00+08:00&lt;/p&gt;&#xA;&#xA;&#xA;&lt;h2 id=&#34;intro&#34;&gt;&#xA;  intro&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#intro&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;&lt;code&gt;anaconda&lt;/code&gt; 和 &lt;code&gt;miniconda&lt;/code&gt; 是很常用的多版本 python 的管理器，不过我有几点不满意&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;过于庞大，不够轻量，即使是 miniconda 好像也有 好几百兆&lt;/li&gt;&#xA;&lt;li&gt;而且 conda channel 什么的整了好久都没整明白，&lt;/li&gt;&#xA;&lt;li&gt;已经有 pip 了为何还要用 conda install&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;当然 conda 还提供了一些非 python 的内容，这是 pip 无法做到的，但是这又和 kiss 原则相违背了。&lt;/p&gt;&#xA;&#xA;&#xA;&lt;h2 id=&#34;softwares&#34;&gt;&#xA;  softwares&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#softwares&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;code&gt;pyenv&lt;/code&gt;: provide python version&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;venv&lt;/code&gt;: provide virtual environment&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&#xA;&#xA;&lt;h2 id=&#34;working-flow-example&#34;&gt;&#xA;  Working flow example&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#working-flow-example&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&#xA;&#xA;&#xA;&lt;h3 id=&#34;configure&#34;&gt;&#xA;  Configure&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#configure&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;install another version of python&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;2023-06-19 update:&lt;/p&gt;</description>
    </item>
    <item>
      <title>qt creator remote deploy and debug</title>
      <link>/blogs/qt_creator_remote_deploy/</link>
      <pubDate>Tue, 13 Jun 2023 06:27:03 +0800</pubDate>
      <guid>/blogs/qt_creator_remote_deploy/</guid>
      <description>&lt;h2 id=&#34;machines&#34;&gt;&#xA;  machines&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#machines&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;target (aarch64)&lt;/li&gt;&#xA;&lt;li&gt;host (AMD64)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;cross compile on AMD64, run on aarch64&lt;/p&gt;&#xA;&#xA;&#xA;&lt;h2 id=&#34;softwares&#34;&gt;&#xA;  softwares&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#softwares&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&#xA;&#xA;&#xA;&lt;h3 id=&#34;on-target&#34;&gt;&#xA;  on target&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#on-target&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;basic: gdbserver&lt;/li&gt;&#xA;&lt;li&gt;others: known from qt creator&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&#xA;&lt;h3 id=&#34;on-host&#34;&gt;&#xA;  on host&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#on-host&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;basic: gdb-multiarch&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&#xA;&lt;h2 id=&#34;config&#34;&gt;&#xA;  config&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#config&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&#xA;&#xA;&#xA;&lt;h3 id=&#34;pro&#34;&gt;&#xA;  pro&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#pro&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-config&#34; data-lang=&#34;config&#34;&gt;target.path=/tmp&#xA;INSTALLS += target&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&#xA;&lt;h3 id=&#34;kits&#34;&gt;&#xA;  kits&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#kits&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;add debugger(gdb-multiarch)&lt;/li&gt;&#xA;&lt;li&gt;config the kit with above debugger&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>makeself 和 .run 文件</title>
      <link>/blogs/makeself_run/</link>
      <pubDate>Mon, 12 Jun 2023 11:05:23 +0800</pubDate>
      <guid>/blogs/makeself_run/</guid>
      <description>&lt;h2 id=&#34;什么是-makeself-以及-run-文件是什么&#34;&gt;&#xA;  什么是 makeself 以及 .run 文件是什么&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#%e4%bb%80%e4%b9%88%e6%98%af-makeself-%e4%bb%a5%e5%8f%8a-run-%e6%96%87%e4%bb%b6%e6%98%af%e4%bb%80%e4%b9%88&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;简单来说，makeself 把一些文件打成压缩包，然后把这个压缩包打包成 POSIX sh 脚本。&lt;/p&gt;&#xA;&lt;p&gt;很多巨大 &lt;code&gt;xxx.run&lt;/code&gt; 文件或者 &lt;code&gt;.sh&lt;/code&gt; 就是 &lt;code&gt;makself&lt;/code&gt; 打出来的，它不是简单的一个 shell 脚本，它自包含了压缩包。(当然 Linux 中扩展名无关紧要，只是 .run 通常是)&lt;code&gt;NVIDIA-Linux-xxx.run&lt;/code&gt; 就是用这个打出来的。印象当中 &lt;code&gt;Mathematica&lt;/code&gt; 的 &lt;code&gt;Mathematica_13.2.1_LINUX.sh&lt;/code&gt; 好像也是这个打出来的。&lt;/p&gt;&#xA;&#xA;&#xA;&lt;h3 id=&#34;如何使用-makeself&#34;&gt;&#xA;  如何使用 makeself&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#%e5%a6%82%e4%bd%95%e4%bd%bf%e7%94%a8-makeself&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&#xA;&#xA;&#xA;&lt;h2 id=&#34;如何打包&#34;&gt;&#xA;  如何打包：&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#%e5%a6%82%e4%bd%95%e6%89%93%e5%8c%85&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;如下目录结构&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-tree&#34; data-lang=&#34;tree&#34;&gt;.&#xA;└── dir&#xA;    ├── file1&#xA;    ├── file2&#xA;    └── install.sh&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;makeself dir test_makeself.run v0.1 ./install.sh&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;就会在当前目录生成 &lt;code&gt;./test_makeself.run&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;更多参数详见 man.&lt;/p&gt;&#xA;&#xA;&#xA;&lt;h2 id=&#34;如何查看包&#34;&gt;&#xA;  如何查看包&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#%e5%a6%82%e4%bd%95%e6%9f%a5%e7%9c%8b%e5%8c%85&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;&lt;strong&gt;警告&lt;/strong&gt;：这个脚本是很随意的，所以下面的参数只是通常情况下可能支持的参数。请一定要确保脚本是来自于可信源，否则有可能你只是想查看帮助，实际上执行了恶意程序。&lt;/p&gt;&#xA;&#xA;&#xA;&lt;h3 id=&#34;帮助&#34;&gt;&#xA;  帮助&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#%e5%b8%ae%e5%8a%a9&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;./test_makeself.run --help&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&#xA;&lt;h3 id=&#34;查看解包后执行的脚本和参数&#34;&gt;&#xA;  查看解包后执行的脚本和参数&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#%e6%9f%a5%e7%9c%8b%e8%a7%a3%e5%8c%85%e5%90%8e%e6%89%a7%e8%a1%8c%e7%9a%84%e8%84%9a%e6%9c%ac%e5%92%8c%e5%8f%82%e6%95%b0&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-console&#34; data-lang=&#34;console&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  ➜  ./test_makeself.run --info&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Identification: v0.1&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Target directory: dir&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Uncompressed size: 4 KB&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Compression: gzip&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Encryption: n&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Date of packaging: Mon Jun 12 19:23:34 CST 2023&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Built with Makeself version 2.5.0&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Build command was: /usr/bin/makeself \&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;#34;dir&amp;#34; \&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;#34;test_makeself.run&amp;#34; \&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;#34;v0.1&amp;#34; \&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;#34;./install.sh&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Script run after extraction:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;     ./install.sh&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;dir will be removed after extraction&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#xA;&#xA;&lt;h3 id=&#34;解包&#34;&gt;&#xA;  解包&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#%e8%a7%a3%e5%8c%85&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;./test_makeself.run --noexec --target extract_dir&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-tree&#34; data-lang=&#34;tree&#34;&gt;extract_dir&#xA;├── file1&#xA;├── file2&#xA;└── install.sh&#xA;&lt;/code&gt;&lt;/pre&gt;</description>
    </item>
    <item>
      <title>gcc support __FILE_NAME__ macro</title>
      <link>/blogs/gcc_support_filename_macro/</link>
      <pubDate>Fri, 02 Jun 2023 07:48:40 +0800</pubDate>
      <guid>/blogs/gcc_support_filename_macro/</guid>
      <description>&lt;h2 id=&#34;2023-06-06-update&#34;&gt;&#xA;  2023-06-06 update:&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#2023-06-06-update&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;windows does not support shell basename. Makefile native support &lt;code&gt;basname&lt;/code&gt; like, it&amp;rsquo;s &lt;code&gt;notdir&lt;/code&gt;.&lt;/p&gt;&#xA;&#xA;&#xA;&lt;h2 id=&#34;contents&#34;&gt;&#xA;  contents&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#contents&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;Since gcc-12, gcc native support &lt;code&gt;__FILE_NAME__&lt;/code&gt; macro. &#xA;&#xA;&lt;a href=&#34;https://gcc.gnu.org/bugzilla/show_bug.cgi?id=42579&#34; target=&#34;_blank&#34;&gt;ref&lt;/a&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;Here we provide some methods to make gcc version lower than 12 support &lt;code&gt;__FILE_NAME__&lt;/code&gt;:&lt;/p&gt;&#xA;&lt;p&gt;Makefile:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-make&#34; data-lang=&#34;make&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;CXX_FLAGS&lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt;-D__FILE_NAME__&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;notdir $&amp;lt;&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;test&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; test.c&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;gcc-7 &lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;CXX_FLAGS&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt; $&amp;lt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Qt pro:&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-config&#34; data-lang=&#34;config&#34;&gt;DEFINES += &amp;#39;__FILE_NAME__=\\\&amp;#34;$(notdir $&amp;lt;)\\\&amp;#34;&amp;#39;&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Some information of macro is at &#xA;&#xA;&lt;a href=&#34;../macro_in_gcc_Makefile_qmake&#34;&gt;here&lt;/a&gt;&#xA;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>macro set in gcc, Makefile, qmake</title>
      <link>/blogs/macro_in_gcc_Makefile_qmake/</link>
      <pubDate>Fri, 02 Jun 2023 07:44:40 +0800</pubDate>
      <guid>/blogs/macro_in_gcc_Makefile_qmake/</guid>
      <description>&lt;h2 id=&#34;gcc&#34;&gt;&#xA;  gcc&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#gcc&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;gcc -DHello&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\&amp;#34;&lt;/span&gt;hey&lt;span style=&#34;color:#ae81ff&#34;&gt;\&amp;#34;&lt;/span&gt; main.c&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#xA;&#xA;&lt;h2 id=&#34;makefile&#34;&gt;&#xA;  Makefile&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#makefile&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-make&#34; data-lang=&#34;make&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;CFLAGS &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; -DHello&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\&amp;#34;&lt;/span&gt;hey&lt;span style=&#34;color:#ae81ff&#34;&gt;\&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#xA;&#xA;&lt;h2 id=&#34;qmake&#34;&gt;&#xA;  qmake&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#qmake&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;qmake &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;DEFINES += Hello=\\\&amp;#34;abc\\\&amp;#34;&amp;#39;&lt;/span&gt; test_macro.pro&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-config&#34; data-lang=&#34;config&#34;&gt;DEFINES += Hello=\\\&amp;#34;abc\\\&amp;#34;&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;关于 &lt;code&gt;\\\&amp;quot;&lt;/code&gt; 的解释&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;\\&lt;/code&gt; 输出makefile里的&lt;code&gt;\&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;\&amp;quot;&lt;/code&gt; 输出makefile里的&lt;code&gt;&amp;quot;&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;</description>
    </item>
    <item>
      <title>struct initialization in C Lang</title>
      <link>/blogs/struct_initialization_in_C_Lang/</link>
      <pubDate>Sat, 20 May 2023 17:49:48 +0800</pubDate>
      <guid>/blogs/struct_initialization_in_C_Lang/</guid>
      <description>&lt;h2 id=&#34;introduction&#34;&gt;&#xA;  Introduction&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#introduction&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;看内核源码关于任务初始化的时候看到一个很奇怪的写法：&lt;code&gt;struct task_struct init_task = INIT_TASK(init_task);&lt;/code&gt;，一个没被定义变量怎么可以传给一个函数，用来&#xA;初始化它自己。&lt;/p&gt;&#xA;&lt;p&gt;我们把原始代码用一下这个 demo 展示：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;struct&lt;/span&gt; myStruct {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;struct&lt;/span&gt; myStruct &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;self;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; a;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; b;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;};&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#define INIT_TASK(tsk){\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;    .self = &amp;amp;tsk,      \&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;    .a = 0,            \&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;    .b = 1,            \&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt;() {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;struct&lt;/span&gt; myStruct init_task &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;INIT_TASK&lt;/span&gt;(init_task);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;/*&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;     * 展开后：&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;     * struct myStruct init_task = { .self = &amp;amp;init_task, .a = 0, .b = 1, };&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;     */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#xA;&#xA;&lt;h2 id=&#34;whats-this&#34;&gt;&#xA;  What&amp;rsquo;s this?&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#whats-this&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;code&gt;INIT_TASK&lt;/code&gt; 是一个宏，由于宏是在编译时展开，所以 &lt;code&gt;init_task&lt;/code&gt; 其实并不是作为&#xA;参数被传入的，而是在这里展开。同时 &lt;code&gt;INIT_TASK&lt;/code&gt; 只用了 &lt;code&gt;init_task&lt;/code&gt; 的地址，而&#xA;并没有用 &lt;code&gt;init_task&lt;/code&gt; 这个结构体本身。&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;{.self = &amp;amp;tsk, .a = 0, .b = 1,}&lt;/code&gt; 是什么？结构体的初始化。&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&#xA;&#xA;&lt;h3 id=&#34;何时分配-init_task-的地址&#34;&gt;&#xA;  何时分配 &lt;code&gt;init_task&lt;/code&gt; 的地址&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#%e4%bd%95%e6%97%b6%e5%88%86%e9%85%8d-init_task-%e7%9a%84%e5%9c%b0%e5%9d%80&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&#xA;&lt;p&gt;那 &lt;code&gt;init_task&lt;/code&gt; 的地址是在什么时候分配的呢？这个结构体的赋值有些复杂，因为涉及到&#xA;取址。我们看一个简单的例子：&lt;/p&gt;</description>
    </item>
    <item>
      <title>about nested struct and anonymous struct in c</title>
      <link>/blogs/about_nested_struct_and_anonymous_struct_in_c/</link>
      <pubDate>Sat, 20 May 2023 16:55:23 +0800</pubDate>
      <guid>/blogs/about_nested_struct_and_anonymous_struct_in_c/</guid>
      <description>&lt;p&gt;看书的时候没明白一个 macro 的用法，搜了一下，发现这个&#xA;&#xA;&lt;a href=&#34;https://stackoverflow.com/questions/58346036/c-c-macro-parameter-containing-dot-member-access-operator&#34; target=&#34;_blank&#34;&gt;问题&lt;/a&gt;&#xA;，发现看不懂他写的结构体的问题。自己尝试写了几个例子发现了 anonymous struct，觉得用法很奇怪，又搜到了这个&#xA;&#xA;&lt;a href=&#34;https://stackoverflow.com/questions/38457109/c-how-to-access-different-types-of-anonymous-or-unnamed-nested-structs/38457240&#34; target=&#34;_blank&#34;&gt;问题&lt;/a&gt;&#xA;，一下把我能想到的关于结构体的情况都写出来了&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;struct&lt;/span&gt; s {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; abc;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;struct&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; a;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    };&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;struct&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; b;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    } intern;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;struct&lt;/span&gt; i {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; c;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    };&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;struct&lt;/span&gt; i2 {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; d;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    } intern2;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;struct&lt;/span&gt; i3 {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; e;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    };&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;struct&lt;/span&gt; i3 intern3;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;};&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;struct&lt;/span&gt; i3 AA;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; argc, &lt;span style=&#34;color:#66d9ef&#34;&gt;char&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;argv[])&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;struct&lt;/span&gt; s mystruct;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    mystruct.abc &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    mystruct.a &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    mystruct.intern.b &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    mystruct.c &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;; &lt;span style=&#34;color:#75715e&#34;&gt;// &amp;lt;-- does not compile&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    mystruct.intern2.d &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    mystruct.intern3.e &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;5&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    AA.e&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;两个回答都很好：&lt;/p&gt;</description>
    </item>
    <item>
      <title>about effective voltage and rms</title>
      <link>/blogs/about_effective_voltage_and_rms/</link>
      <pubDate>Fri, 21 Apr 2023 15:18:29 +0800</pubDate>
      <guid>/blogs/about_effective_voltage_and_rms/</guid>
      <description>&lt;h2 id=&#34;effective-voltage-of-sinusoidal&#34;&gt;&#xA;  Effective voltage of sinusoidal&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#effective-voltage-of-sinusoidal&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;In alternating current, to simplify the calculation, we often use effective voltage or current.&lt;/p&gt;&#xA;&lt;p&gt;Since I haven&amp;rsquo;t touched these knowledge points for a long time. I almost forgot how to get the effective voltage and what&amp;rsquo;s the relation of effective voltage with rms (root mean square). So this is about the derivation of effective voltage.&lt;/p&gt;&#xA;&lt;p&gt;Effective voltage is always used in calculating power or energy during a time. So we start from the expression of power, because voltage and current change with time, we first calculate the energy in time $dt$, then integrate.&lt;/p&gt;</description>
    </item>
    <item>
      <title>about maximum power transfer theorem</title>
      <link>/blogs/about_maximum_power_transfer_theorem/</link>
      <pubDate>Fri, 21 Apr 2023 14:03:48 +0800</pubDate>
      <guid>/blogs/about_maximum_power_transfer_theorem/</guid>
      <description>&lt;p&gt;This is a read note of &#xA;&#xA;&lt;a href=&#34;https://en.wikipedia.org/wiki/Maximum_power_transfer_theorem&#34; target=&#34;_blank&#34;&gt;https://en.wikipedia.org/wiki/Maximum_power_transfer_theorem&lt;/a&gt;&#xA;&lt;/p&gt;&#xA;&#xA;&#xA;&lt;h2 id=&#34;maximum-efficiency&#34;&gt;&#xA;  Maximum Efficiency&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#maximum-efficiency&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Assumption:&#xA;&lt;ul&gt;&#xA;&lt;li&gt;direct current&lt;/li&gt;&#xA;&lt;li&gt;load is pure resistor&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;notation:&#xA;&lt;ul&gt;&#xA;&lt;li&gt;$P_\text{L}$ power of load&lt;/li&gt;&#xA;&lt;li&gt;$R_\text{L}$ resistance of load.&lt;/li&gt;&#xA;&lt;li&gt;$R_\text{S}$ resistance of source(e.g battery)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;The efficiency is:&lt;/p&gt;&#xA;$$&#xA;\eta = \frac{P_\text{L}}{P_\text{total}}&#xA;= \frac{U_{\text{L}} \times I}{U_{\text{emf}} \times I}&#xA;= \frac{R_{\text{L}} \times I}{(R_\text{L} + R_\text{s}) \times I}&#xA;= \frac{1}{1+R_\text{s}/R_\text{L}}&#xA;$$&lt;p&gt;So when $R_\text{L}$ goes to $\infty$, $\eta$ will goes to $1$ . Which is as we already know about max efficiency.&lt;/p&gt;</description>
    </item>
    <item>
      <title>migrate from ubuntu16.04 to ubuntu20.04</title>
      <link>/blogs/migrate_from_ubuntu16.04_to_20.04_with_nvidia_docker/</link>
      <pubDate>Thu, 13 Apr 2023 11:13:20 +0800</pubDate>
      <guid>/blogs/migrate_from_ubuntu16.04_to_20.04_with_nvidia_docker/</guid>
      <description>&lt;p&gt;公司服务器需要升级系统&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;系统升级&lt;/li&gt;&#xA;&lt;li&gt;docker 迁移&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&#xA;&#xA;&lt;h2 id=&#34;系统升级&#34;&gt;&#xA;  系统升级&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#%e7%b3%bb%e7%bb%9f%e5%8d%87%e7%ba%a7&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;download and extra to new root&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl https://cdimage.ubuntu.com/ubuntu-base/releases/focal/release/ubuntu-base-20.04.5-base-amd64.tar.gz | sudo tar -xzvf - -C /mnt&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start=&#34;2&#34;&gt;&#xA;&lt;li&gt;update and install grub and other needs&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;grub-efi-amd64&lt;/code&gt; # 可能直接 grub 就好，不知道这种基础组建要怎么一下安装&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;ubuntu-minimal&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;linux-image-generic&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;ol start=&#34;3&#34;&gt;&#xA;&lt;li&gt;然后参考 archlinux wiki installation guide 做些必要的动作，不要忘了 &lt;code&gt;systemd-networkd&lt;/code&gt; 和 &lt;code&gt;sshd&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;特别关注 grub&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;grub-install&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;grub-config&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;efibootmgr&lt;/code&gt; check 一下&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&#xA;&lt;h2 id=&#34;docker-迁移&#34;&gt;&#xA;  docker 迁移&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#docker-%e8%bf%81%e7%a7%bb&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&#xA;&#xA;&#xA;&lt;h3 id=&#34;1-rsync&#34;&gt;&#xA;  1. &lt;code&gt;rsync&lt;/code&gt;&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#1-rsync&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# https://blog.lilydjwg.me/2013/12/29/rsync-btrfs-dm-crypt-full-backup.42219.html&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rsync --archive --one-file-system --inplace --hard-links &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  --human-readable --numeric-ids --delete --delete-excluded &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  --acls --xattrs --sparse &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  --itemize-changes --verbose --progress &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  /var/lib/docker /mnt/var/lib&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;注意最后 不要变成 &lt;code&gt;/mnt/var/lib&lt;/code&gt; 否则就变成 &lt;code&gt;/mnt/var/lib/docker/docker&lt;/code&gt;&amp;hellip;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>polkit</title>
      <link>/blogs/polkit/</link>
      <pubDate>Mon, 06 Jun 2022 08:55:33 +0800</pubDate>
      <guid>/blogs/polkit/</guid>
      <description>&lt;h1 id=&#34;polkit&#34;&gt;&#xA;  polkit&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#polkit&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h1&gt;&#xA;&#xA;&#xA;&#xA;&lt;h2 id=&#34;introduction&#34;&gt;&#xA;  Introduction&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#introduction&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&#xA;&#xA;&#xA;&lt;h3 id=&#34;问题的出现&#34;&gt;&#xA;  问题的出现&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#%e9%97%ae%e9%a2%98%e7%9a%84%e5%87%ba%e7%8e%b0&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&#xA;&lt;p&gt;&lt;code&gt;udisks2&lt;/code&gt; 可以在系统启动后的自动挂载和卸载，但是对于开机时它不会自动挂载所有的分区，我们需要 &lt;code&gt;/etc/fstab&lt;/code&gt; 来自动挂载的分区。但由 &lt;code&gt;/etc/fstab&lt;/code&gt; 挂载的分区却不能直接用 &lt;code&gt;udisks2&lt;/code&gt; 卸载。(虽然加上 &lt;code&gt;users&lt;/code&gt; 这个 option 可以不用 sudo 直接 umount，但 &lt;code&gt;udisks2&lt;/code&gt; 限制了这种动作,后面会提到的 &lt;code&gt;org.freedesktop.udisks2.filesystem-unmount-others&lt;/code&gt;)。又由于 File explorer 中点击卸载，使用的是 &lt;code&gt;udisks2&lt;/code&gt;，所以对于前述的情况，便不能通过鼠标点击卸载。&lt;/p&gt;&#xA;&#xA;&#xA;&lt;h3 id=&#34;about-polkit&#34;&gt;&#xA;  about polkit&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#about-polkit&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&#xA;&lt;p&gt;polkit 实现非特权进程向特权进程发消息的控制，从而可控地让非特权进程达到特权功能，比如，普通用户的挂载和卸载硬盘&lt;/p&gt;&#xA;&lt;p&gt;polkit 配置有两种方式，一种是应用自带的，叫Action，(&lt;code&gt;.policy&lt;/code&gt;)；另一种是类似补丁的形式，叫Authorization rules,(&lt;code&gt;.rules&lt;/code&gt; or &lt;code&gt;.pkla&lt;/code&gt;)&lt;/p&gt;&#xA;&#xA;&#xA;&lt;h2 id=&#34;action&#34;&gt;&#xA;  Action:&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#action&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;policy file 文件位置：&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;/usr/share/polkit-1/actions/*.policy&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;在 default section 中，有这几个选项:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;keys:&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;allow_any&lt;/code&gt;: 所有&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;allow_inactive&lt;/code&gt;: 远程的 session(ssh vnc, etc.)&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;allow_active&lt;/code&gt;: 本地  tty, X display&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;values:&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;no&lt;/code&gt;: 无权限&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;yes&lt;/code&gt;: 有权限&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;auth_self[_keep]&lt;/code&gt;: 对 non-sudoer [keep some minutes] 开放权限&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;auth_admin[_keep]&lt;/code&gt;: sudoer 开放权限&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&#xA;&lt;h2 id=&#34;authorization-rules&#34;&gt;&#xA;  Authorization rules&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#authorization-rules&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;文件位置：&lt;/p&gt;</description>
    </item>
    <item>
      <title>网络断连分析工具介绍</title>
      <link>/blogs/network_disconnection_analysis_tool/</link>
      <pubDate>Tue, 26 Apr 2022 02:32:01 +0800</pubDate>
      <guid>/blogs/network_disconnection_analysis_tool/</guid>
      <description>&lt;h1 id=&#34;网络断连分析工具介绍&#34;&gt;&#xA;  网络断连分析工具介绍&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#%e7%bd%91%e7%bb%9c%e6%96%ad%e8%bf%9e%e5%88%86%e6%9e%90%e5%b7%a5%e5%85%b7%e4%bb%8b%e7%bb%8d&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h1&gt;&#xA;&#xA;&lt;p&gt;[toc]&lt;/p&gt;&#xA;&#xA;&#xA;&lt;h2 id=&#34;抓包工具数据链路层及之上&#34;&gt;&#xA;  抓包工具（数据链路层及之上）&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#%e6%8a%93%e5%8c%85%e5%b7%a5%e5%85%b7%e6%95%b0%e6%8d%ae%e9%93%be%e8%b7%af%e5%b1%82%e5%8f%8a%e4%b9%8b%e4%b8%8a&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&#xA;&#xA;&#xA;&lt;h3 id=&#34;tcpdump&#34;&gt;&#xA;  &lt;code&gt;tcpdump&lt;/code&gt;&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#tcpdump&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;网络层：&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-console&#34; data-lang=&#34;console&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;# tcpdump -i eth0&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start=&#34;2&#34;&gt;&#xA;&lt;li&gt;数据链路层&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-console&#34; data-lang=&#34;console&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;# tcpdump -e -i eth0&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#xA;&#xA;&lt;h3 id=&#34;wireshark&#34;&gt;&#xA;  &lt;code&gt;wireshark&lt;/code&gt;&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#wireshark&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&#xA;&lt;p&gt;&lt;code&gt;wireshark&lt;/code&gt; 还是更香一点，可以直接抓，抓完还可以看流量图 (statistic-Flow graph)(一应一答的那种)&lt;/p&gt;&#xA;&lt;p&gt;需要注意的是通讯双方的 &lt;code&gt;wireshark&lt;/code&gt; 版本要保持一致，老版本的 sequence number 和新版本的对不上&lt;/p&gt;&#xA;&lt;p&gt;我们这次使用的是 Version 3.6.3，如果没有可以自行 &#xA;&#xA;&lt;a href=&#34;https://1.as.dl.wireshark.org/src/wireshark-3.6.3.tar.xz&#34; target=&#34;_blank&#34;&gt;下载&lt;/a&gt;&#xA; 编译，编译方法查看 INSTALL 文件，对于 Ubnutu 来说&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-console&#34; data-lang=&#34;console&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;# ./tools/debian-setup.sh&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;# mkdir build&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;# cmake -DCMAKE_INSTALL_PREFIX ..&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;# make -j4&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;# make install&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#xA;&#xA;&lt;h2 id=&#34;phy-芯片的查看物理层&#34;&gt;&#xA;  PHY 芯片的查看（物理层）&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#phy-%e8%8a%af%e7%89%87%e7%9a%84%e6%9f%a5%e7%9c%8b%e7%89%a9%e7%90%86%e5%b1%82&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;rtl8169 的手册：&#xA;&#xA;&lt;a href=&#34;https://www.semiee.com/file/EOL2/Realtek-RTL8168-LF.pdf&#34; target=&#34;_blank&#34;&gt;https://www.semiee.com/file/EOL2/Realtek-RTL8168-LF.pdf&lt;/a&gt;&#xA;&lt;/p&gt;</description>
    </item>
    <item>
      <title>C 和 Qt 中 socket 的创建和删除</title>
      <link>/blogs/creation_and_delete_of_socket_in_c_and_qt/</link>
      <pubDate>Thu, 14 Apr 2022 08:36:19 +0800</pubDate>
      <guid>/blogs/creation_and_delete_of_socket_in_c_and_qt/</guid>
      <description>&lt;h1 id=&#34;c-和-qt-中-socket-的创建和删除&#34;&gt;&#xA;  C 和 Qt 中 socket 的创建和删除&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#c-%e5%92%8c-qt-%e4%b8%ad-socket-%e7%9a%84%e5%88%9b%e5%bb%ba%e5%92%8c%e5%88%a0%e9%99%a4&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h1&gt;&#xA;&#xA;&lt;p&gt;[toc]&lt;/p&gt;&#xA;&#xA;&#xA;&lt;h2 id=&#34;c&#34;&gt;&#xA;  C&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#c&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;&#xA;&#xA;&lt;a href=&#34;https://www.geeksforgeeks.org/tcp-server-client-implementation-in-c/&#34; target=&#34;_blank&#34;&gt;example code&lt;/a&gt;&#xA;&lt;/p&gt;&#xA;&#xA;&#xA;&lt;h3 id=&#34;客户端&#34;&gt;&#xA;  客户端&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#%e5%ae%a2%e6%88%b7%e7%ab%af&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&#xA;&lt;p&gt;客户端相对来说比较简单：创建，然后 connect&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;connect&lt;/span&gt;(sockfd, (SA&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;servaddr, &lt;span style=&#34;color:#66d9ef&#34;&gt;sizeof&lt;/span&gt;(servaddr));&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#xA;&#xA;&lt;h3 id=&#34;服务端&#34;&gt;&#xA;  服务端&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#%e6%9c%8d%e5%8a%a1%e7%ab%af&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&#xA;&lt;p&gt;服务端相对来说会复杂一些&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;bind&lt;/span&gt;(sockfd, (SA&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;servaddr, &lt;span style=&#34;color:#66d9ef&#34;&gt;sizeof&lt;/span&gt;(servaddr));&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;listen&lt;/span&gt;(sockfd, &lt;span style=&#34;color:#ae81ff&#34;&gt;5&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;connfd &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;accept&lt;/span&gt;(sockfd, (SA&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;cli, &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt;len);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;先新建一个 socket 然后这个socket 来做监听，用 accept 取到和客户端连接的服务端的socket&lt;/p&gt;&#xA;&lt;p&gt;从 &lt;code&gt;man 2 accept&lt;/code&gt; 可以知道 accept 做了这些事：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;从这个监听的 socket 中取出第一个连接请求&lt;/li&gt;&#xA;&lt;li&gt;创建一个新的连接着的socket，&lt;/li&gt;&#xA;&lt;li&gt;返回一个指向这个 socket 的文件描述符&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;这里返回的 socket 是一个变量，也就是说它是在栈里的，当退出函数的时候，这个 socket 会自动释放。&lt;/p&gt;&#xA;&#xA;&#xA;&lt;h4 id=&#34;文件描述符&#34;&gt;&#xA;  文件描述符：&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#%e6%96%87%e4%bb%b6%e6%8f%8f%e8%bf%b0%e7%ac%a6&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h4&gt;&#xA;&#xA;&lt;p&gt;文件描述符号是 int。&lt;/p&gt;&#xA;&lt;p&gt;在 socket 断连再重连的时候我们看到对于一个新的 socket，他的文件描述符没变，那 accept 建立的socket 还是原来的吗？答案是否定的。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Shell echo 输出带样式 (style) 的文字</title>
      <link>/blogs/shell_color/</link>
      <pubDate>Mon, 04 Apr 2022 12:23:29 +0800</pubDate>
      <guid>/blogs/shell_color/</guid>
      <description>&lt;h2 id=&#34;introduction&#34;&gt;&#xA;  Introduction&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#introduction&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;好久没明白 Shell 的格式化输出，这次看了一些资料，整理了一下。&lt;/p&gt;&#xA;&#xA;&#xA;&lt;h2 id=&#34;method--result&#34;&gt;&#xA;  Method &amp;amp; Result&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#method--result&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;我们知道 shell 可以用 &lt;code&gt;-e&lt;/code&gt; 来转义 &lt;code&gt;\n&lt;/code&gt; 这些符号。由于样式输出也是特殊的输出，所以要使用样式输出也要打开这个开关。那如何表示样式的符号是什么呢？基本格式是这样&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;\033[ + 样式码 + m + &amp;#34;要打印的字符&amp;#34;&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;这里的样式码就是一些数字，比如 &lt;code&gt;1&lt;/code&gt; 代表加粗，&lt;code&gt;32&lt;/code&gt; 代表绿色：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#!/bin/sh&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;echo -e &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;\033[1mBold&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;echo -e &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;\033[32mGreen&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img src=&#34;./figures/bold.png&#34; alt=&#34;bold&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;./figures/green.png&#34; alt=&#34;green&#34;&gt;&lt;/p&gt;&#xA;&#xA;&#xA;&lt;h3 id=&#34;样式的分开&#34;&gt;&#xA;  样式的分开&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#%e6%a0%b7%e5%bc%8f%e7%9a%84%e5%88%86%e5%bc%80&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&#xA;&lt;p&gt;由于这个样式是管它之后的所有输出，所以你如果先加粗后加颜色，那么后面半截也会加粗，比如：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#!/bin/sh&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;echo -e &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;\033[1mBold&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;\033[32mGreen&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img src=&#34;./figures/bold_and_green_mixed.png&#34; alt=&#34;bold_and_green_mixed&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;所以就像括号一样我们用无样式(样式码0) 来作为右半边的括号。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#!/bin/sh&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;echo -e &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;\033[1mBold\033[0m&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;\033[32mGreen\033[0m&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img src=&#34;./figures/bold_and_green_seperated.png&#34; alt=&#34;bold_and_green_seperated&#34;&gt;&lt;/p&gt;&#xA;&#xA;&#xA;&lt;h3 id=&#34;样式的合并&#34;&gt;&#xA;  样式的合并&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#%e6%a0%b7%e5%bc%8f%e7%9a%84%e5%90%88%e5%b9%b6&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&#xA;&lt;p&gt;根据上面一节，我们知道如何叠加几个样式，比如加粗又加绿:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#!/bin/sh&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;echo -e &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;\033[1m\033[32mBold and Green\033[0m&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img src=&#34;./figures/bold_and_green_together.png&#34; alt=&#34;bold_and_green_together&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;它有个简略的写法：用分号 &lt;code&gt;;&lt;/code&gt; 分开两个样式码。比如加粗又加绿:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#!/bin/sh&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;echo -e &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;\033[1;32mBold and Green\033[0m&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img src=&#34;./figures/bold_and_green_together_simpler.png&#34; alt=&#34;bold_and_green_together_simpler&#34;&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>github 使用key 来pull fetch</title>
      <link>/blogs/github_key/</link>
      <pubDate>Wed, 22 Dec 2021 13:36:53 +0800</pubDate>
      <guid>/blogs/github_key/</guid>
      <description>&lt;h2 id=&#34;问题的出现&#34;&gt;&#xA;  问题的出现&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#%e9%97%ae%e9%a2%98%e7%9a%84%e5%87%ba%e7%8e%b0&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;github 似乎不能使用帐号密码来push了，我们这里介绍一下如何使用 rsa 密钥对来进行身份认证。&lt;/p&gt;&#xA;&lt;p&gt;github 上有&#xA;&#xA;&lt;a href=&#34;https://docs.github.com/cn/authentication/connecting-to-github-with-ssh/adding-a-new-ssh-key-to-your-github-account&#34; target=&#34;_blank&#34;&gt;文档&lt;/a&gt;&#xA;&lt;/p&gt;&#xA;&#xA;&#xA;&lt;h2 id=&#34;如何操作&#34;&gt;&#xA;  如何操作&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#%e5%a6%82%e4%bd%95%e6%93%8d%e4%bd%9c&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&#xA;&#xA;&#xA;&lt;h3 id=&#34;生成密钥对&#34;&gt;&#xA;  生成密钥对&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#%e7%94%9f%e6%88%90%e5%af%86%e9%92%a5%e5%af%b9&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&#xA;&lt;p&gt;在&lt;code&gt;~/.ssh&lt;/code&gt;下生成 rsa 非对称密钥对，可以把密钥名取为&lt;code&gt;github&lt;/code&gt;，可以不用设置密码&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ cd ~/.ssh/&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ ssh-keygen -t rsa&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Generating public/private rsa key pair.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Enter file in which to save the key &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;/home/ben/.ssh/id_rsa&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt;: github&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;非对称密钥对在我 &#xA;&#xA;&lt;a href=&#34;../rsa_ssh/&#34;&gt;ssh 免密登录&lt;/a&gt;&#xA;里有讲到一点。&lt;/p&gt;&#xA;&lt;p&gt;于是我们得到了 &lt;code&gt;github&lt;/code&gt; 这一密钥 和 &lt;code&gt;github.pub&lt;/code&gt; 这一公钥。将 &lt;code&gt;github.pub&lt;/code&gt; 中的内容拷贝出来，一会儿放在 github 上&lt;/p&gt;&#xA;&#xA;&#xA;&lt;h3 id=&#34;将公钥内容拷贝到-github-上&#34;&gt;&#xA;  将公钥内容拷贝到 github 上&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#%e5%b0%86%e5%85%ac%e9%92%a5%e5%86%85%e5%ae%b9%e6%8b%b7%e8%b4%9d%e5%88%b0-github-%e4%b8%8a&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;点击路径：头像-&amp;gt; Settings -&amp;gt; 左侧SSH and GPG keys&lt;/li&gt;&#xA;&lt;li&gt;或者直接访问这个链接 &#xA;&#xA;&lt;a href=&#34;https://github.com/settings/keys&#34; target=&#34;_blank&#34;&gt;https://github.com/settings/keys&lt;/a&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;&lt;img src=&#34;./figures/steps_to_keys.png&#34; alt=&#34;steps to keys&#34;&gt;&lt;/th&gt;&#xA;          &lt;th&gt;&lt;img src=&#34;./figures/steps_to_keys2.png&#34; alt=&#34;steps to keys2&#34;&gt;&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;然后就是 New SSH key&lt;/p&gt;</description>
    </item>
    <item>
      <title>用 curl 来制作一些简单的网络小工具</title>
      <link>/blogs/curl_post/</link>
      <pubDate>Sat, 09 Oct 2021 10:37:10 +0800</pubDate>
      <guid>/blogs/curl_post/</guid>
      <description>&lt;h2 id=&#34;问题的出现碎碎念&#34;&gt;&#xA;  问题的出现（碎碎念）&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#%e9%97%ae%e9%a2%98%e7%9a%84%e5%87%ba%e7%8e%b0%e7%a2%8e%e7%a2%8e%e5%bf%b5&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&#xA;&#xA;&#xA;&lt;h3 id=&#34;1-校园网登录&#34;&gt;&#xA;  1. 校园网登录&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#1-%e6%a0%a1%e5%9b%ad%e7%bd%91%e7%99%bb%e5%bd%95&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&#xA;&lt;p&gt;校园网需要认证后才能登录上网，在使用 Linux 的时候有一点很麻烦，宿舍区必须使用客户端才能登录，不能像教学区那样可以网页登录，不知道是谁告诉我们宿舍区也可以网页登录，网址是:&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;http://172.30.255.2/a30.html&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;于是宿舍区使用 Linux 的问题得以解决。但是每次断网都要打开浏览器去连接也不是很方便，我想是否可以使用爬虫来实现登录，找着找着发现可以用 &lt;code&gt;curl&lt;/code&gt; 来实现登录。&lt;/p&gt;&#xA;&#xA;&#xA;&lt;h3 id=&#34;2-宿舍电费查询&#34;&gt;&#xA;  2. 宿舍电费查询&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#2-%e5%ae%bf%e8%88%8d%e7%94%b5%e8%b4%b9%e6%9f%a5%e8%af%a2&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&#xA;&lt;p&gt;这个小工具的出现的起因是宿舍如果没电了，夏天早上会断电，我的树莓派会被强制断电，对 SD 卡不好于是我想每天做个定时任务爬一下宿舍电费是多少，一开始也是想用 selenium 爬虫做的，但是 selenium 太吃资源，于是我又找着找着想到了 &lt;code&gt;curl&lt;/code&gt;，然后就成了。&lt;/p&gt;&#xA;&#xA;&#xA;&lt;h2 id=&#34;curl-简介&#34;&gt;&#xA;  &lt;code&gt;curl&lt;/code&gt; 简介&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#curl-%e7%ae%80%e4%bb%8b&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;我们常用 &lt;code&gt;curl&lt;/code&gt;、&lt;code&gt;wget&lt;/code&gt; 在 Linux 上下载东西：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl www.baidu.com&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wget www.baidu.com&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;而我们知道网络里有的不止是从服务器上下载内容，还有提交内容到服务器上。要怎么提交呢？&lt;/p&gt;&#xA;&lt;p&gt;方法很简单就是使用 &lt;code&gt;-d&lt;/code&gt; 参数，语法如下：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;curl -d &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;variable=value&amp;#39;&lt;/span&gt; URL&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Windows、Linux、Mac 一般都有 &lt;code&gt;curl&lt;/code&gt; 命令，Windows 没有的话可以去这里下 &#xA;&#xA;&lt;a href=&#34;https://curl.se/windows&#34; target=&#34;_blank&#34;&gt;https://curl.se/windows&lt;/a&gt;&#xA;&lt;/p&gt;&#xA;&#xA;&#xA;&lt;h2 id=&#34;如何制作&#34;&gt;&#xA;  如何制作&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#%e5%a6%82%e4%bd%95%e5%88%b6%e4%bd%9c&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;上面说的 &lt;code&gt;curl&lt;/code&gt; 来贴一个 POST表单，可能很难理解，我们借 drcom 来举一个例子，给大家介绍一下如何制作两个使用 &lt;code&gt;curl&lt;/code&gt; 的小工具。&lt;/p&gt;&#xA;&#xA;&#xA;&lt;h3 id=&#34;登录-drcom-校园网&#34;&gt;&#xA;  登录 drcom 校园网&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#%e7%99%bb%e5%bd%95-drcom-%e6%a0%a1%e5%9b%ad%e7%bd%91&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&#xA;&lt;p&gt;这里再提一下两个登录的网页地址，教学区这个域名默认的网页就是登录界面，但是宿舍区上网自动跳转的界面是让你下载客户端，但是&lt;code&gt;a30.html&lt;/code&gt;是可以和教学区那样实现网页登录的：&lt;/p&gt;</description>
    </item>
    <item>
      <title>gpio</title>
      <link>/blogs/gpio/</link>
      <pubDate>Mon, 04 Oct 2021 13:03:23 +0800</pubDate>
      <guid>/blogs/gpio/</guid>
      <description>&lt;p&gt;Under construction&amp;hellip;&lt;/p&gt;&#xA;&lt;!--&#xA;https://stackoverflow.com/help/whats-reputation&#xA;### GNU 系统 vs Linux&#xA;GNU 是一个操作系统，他包含了 GNU/Linux（也就是常说的 Linux 系统） 上所能看到的各种常规文件，各种命令，而 Linux 是一个内核，内核是和硬件打交道的，并提供一些接口给操作系统，然后操作系统可以调用这些借口&#xA;操作系统和内核的区别可以看看 [gnu 的官方说明](https://www.gnu.org/gnu/linux-and-gnu.html)，简单来说 gnu 就是那些各种个样的软件，包括我们最常用的 ls，rm&#xA;--&gt;</description>
    </item>
    <item>
      <title>将服务器的 Ubuntu 系统换成 Arch Linux</title>
      <link>/blogs/vps2arch/</link>
      <pubDate>Mon, 04 Oct 2021 00:00:00 +0000</pubDate>
      <guid>/blogs/vps2arch/</guid>
      <description>&lt;h2 id=&#34;introduction&#34;&gt;&#xA;  Introduction&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#introduction&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;这两天腾讯在搞活动，有便宜的服务器，于是买了，如之前的阿里云一样没有 Arch Linux 的系统镜像。&lt;/p&gt;&#xA;&lt;p&gt;早就听说了有一个叫 &lt;code&gt;vps2arch&lt;/code&gt; 的脚本可以将服务器上的 Ubuntu 系统转成其他系统，然后看 [Arch wiki](&#xA;&#xA;&lt;a href=&#34;https://wiki.archlinux.org/title/Install_Arch_Linux_from_existing_Linux&#34; target=&#34;_blank&#34;&gt;https://wiki.archlinux.org/title/Install_Arch_Linux_from_existing_Linux&lt;/a&gt;&#xA;（简体中文）#从一个主机运行另一个 Linux 发行版) 的时候发现了不止它，还有好多，它还介绍了如何手动转到 Arch Linux。玩 Arch 的人怎么能不手动试试呢🤪（发现这个脚本是在原来阿里云过期之后的事了。然后一直没机会，虽然虚拟机上也行，但懒啊)&lt;/p&gt;&#xA;&lt;p&gt;然而 Arch wiki 在后面&#xA;&#xA;&lt;a href=&#34;https://wiki.archlinux.org/title/Install_Arch_Linux_from_existing_Linux%ef%bc%88%e7%ae%80%e4%bd%93%e4%b8%ad%e6%96%87%ef%bc%89#%e5%ae%89%e8%a3%85%e6%8f%90%e7%a4%ba&#34; target=&#34;_blank&#34;&gt;安装提示&lt;/a&gt;&#xA; 那节让我从 &#xA;&#xA;&lt;a href=&#34;https://wiki.archlinux.org/title/Installation_guide_%ef%bc%88%e7%ae%80%e4%bd%93%e4%b8%ad%e6%96%87%ef%bc%89&#34; target=&#34;_blank&#34;&gt;Installation Guide&lt;/a&gt;&#xA; 中的重新分区开始，继续后面的操作，我就这样试了，然后&amp;hellip;.🤦系统挂了。那个时候也没懂原理，一开始的想法是是否能够把系统全加载到内存中，然后就可以把原分区删了重新分区，然后又看到 wiki 是这样说的，就尽信了。&lt;/p&gt;&#xA;&lt;p&gt;后来我找到了这篇&#xA;&#xA;&lt;a href=&#34;https://blog.inkuang.com/2020/114/&#34; target=&#34;_blank&#34;&gt;博客&lt;/a&gt;&#xA;，然后就成啦，原来后面的步骤是“挂载分区”而不是”建立分区“。&lt;/p&gt;&#xA;&lt;p&gt;写博客的时候才发现，原来中文手册里说的就是“挂载”，而英文手册里是“分区” 😠 ，当然现在我把它改好啦😏&lt;/p&gt;&#xA;&#xA;&#xA;&lt;h2 id=&#34;原理&#34;&gt;&#xA;  原理&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#%e5%8e%9f%e7%90%86&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;通过 &lt;code&gt;chroot&lt;/code&gt; 进入 Arch Linux 系统，删除原 Ubuntu 系统文件，此时原来系统的内核还在内存中，我们通过 Arch Linux 系统向这个内核发送指令。 &lt;em&gt;内核&lt;/em&gt; 和 &lt;em&gt;操作系统&lt;/em&gt; 的关系可以看看我的这篇关于 &#xA;&#xA;&lt;a href=&#34;/blogs/gpio/&#34;&gt;gpio&lt;/a&gt;&#xA; 的文章。&lt;/p&gt;&#xA;&lt;p&gt;在这里操作系统可以简单理解为你能看到的各种文件，除了内核把一些内核空间的文件映射到文件系统内的文件，比方说 &lt;code&gt;/proc&lt;/code&gt; &lt;code&gt;/sys&lt;/code&gt; &lt;code&gt;/run&lt;/code&gt; 下的各种文件等等，还有设备文件夹 &lt;code&gt;/dev&lt;/code&gt; 下的内容也应该是内核生成出来的。我们通过 Arch linux 系统向原内核发送命令是怎么发送的，举个例子：我们可以通过 &lt;code&gt;ls&lt;/code&gt; 查看当前目录下的文件，那这个命令对应的是这个命令文件本身 &lt;code&gt;/bin/ls&lt;/code&gt; 和它所依赖的各种库 （通过 &lt;code&gt;ldd /bin/ls&lt;/code&gt; 可以查看）这里的库类似于 python 的包。现在我们有 Arch 这个完整的 chroot 的系统，那当然可以向内核发送命令啦。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Copyright and Copyleft</title>
      <link>/blogs/licenses/Copyright_and_Copyleft/</link>
      <pubDate>Thu, 29 Apr 2021 19:53:43 +0800</pubDate>
      <guid>/blogs/licenses/Copyright_and_Copyleft/</guid>
      <description>&lt;p&gt;Cover: Copyright or Copyleft&lt;/p&gt;&#xA;&lt;p&gt;本作品采用 知识共享 署名 - 非商业性使用 4.0 国际许可协议进行许可。&#xA;&lt;img src=&#34;https://licensebuttons.net/l/by-nc/4.0/88x31.png&#34; alt=&#34;CC&#34;&gt;&lt;/p&gt;&#xA;&#xA;&#xA;&lt;h2 id=&#34;introduction&#34;&gt;&#xA;  Introduction&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#introduction&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;一直想写一些技术文章，现在微信公众号，CSDN，都要你声明你是否是原创。如果是不是原创，请贴上原文链接，以及确定是否征求过原作者同意，但是我们这种小白想写一些技术分享，想写一些心得体会怎么可能写出完全原创的技术文章。总归都是学习，然后有什么所得。可能本来就不应该写？以免产生像毕业论文那种垃圾？但是把我总想分享一下自己的经验，所以有些畏首畏脚，自从上次写过一篇 ssh 的文章（貌似还担心因为版权问题还删了），就再也不想写了。&lt;/p&gt;&#xA;&lt;p&gt;有同样困惑和犹豫的当然不止我一个，因此在这段停滞不前的时间里我了解到了 Creative Commons 和其他 Copyleft 协议，现将其分享出来。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&#xA;&#xA;&lt;h2 id=&#34;copyleft&#34;&gt;&#xA;  &#xA;&#xA;&lt;a href=&#34;https://www.gnu.org/licenses/Copyleft.zh-cn.html&#34; target=&#34;_blank&#34;&gt;Copyleft&lt;/a&gt;&#xA;&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#copyleft&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&#xA;&#xA;&#xA;&lt;h3 id=&#34;著作权-copyright&#34;&gt;&#xA;  著作权 (Copyright)&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#%e8%91%97%e4%bd%9c%e6%9d%83-copyright&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&#xA;&lt;p&gt;在讲 Copyleft 之前我们先讲一下 Copyright，[@_著作权_2021] 非专业，只能简单介绍一下。&#xA;Copyright © 版权，也被称为著作权。另外，我们经常会听到“保留所有权利”或者&amp;quot;All rights reserved&amp;quot;。后两者现如今已经不需要声明，著作权便意味着保留所有权利。&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;自 2000 年 8 月 23 日，尼加拉瓜成为最后一个加入《伯尔尼公约》的《布宜诺斯艾利斯公约》签署国，使得标注“保留所有权利”的要求过时。此日起，所有《布宜诺斯艾利斯公约》（唯一一个要求使用“保留所有权利”的版权条约）签署国都是《伯尔尼公约》（无需任何版权通知）的成员。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;如果保留所有的权利的话，我们在对已有内容的重新整理上会变得束手束脚，对内容的编改都要和原作者联系，这极大的阻碍了知识的流通。&lt;/p&gt;&#xA;&#xA;&#xA;&lt;h3 id=&#34;公有领域-public-domain&#34;&gt;&#xA;  公有领域 (&#xA;&#xA;&lt;a href=&#34;https://www.gnu.org/philosophy/categories.html#Non-CopyleftedFreeSoftware&#34; target=&#34;_blank&#34;&gt;Public Domain&lt;/a&gt;&#xA;)&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#%e5%85%ac%e6%9c%89%e9%a2%86%e5%9f%9f-public-domain&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&#xA;&lt;p&gt;和 Copyright 相对的是“公有领域”（Public Domain），用数学的方式说就是所有作品内有版权的作品的补集，它和有版权的作品是完全对立的。 公有领域是由 &lt;strong&gt;不再具有版权期限&lt;/strong&gt; 或 &lt;strong&gt;从未受版权法保护&lt;/strong&gt; 的作品组成。换句话来说&#xA;&#xA;&lt;a href=&#34;https://en.wikipedia.org/wiki/Public_domain&#34; target=&#34;_blank&#34;&gt;公有领域&lt;/a&gt;&#xA; 就是指 &lt;strong&gt;不受版权保护&lt;/strong&gt; 的作品。下面是几个例子&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;公有领域的书籍&#xA;公有领域的书籍是指没有版权的书籍，未经许可而创建的书籍或版权已过期 的书籍或被没收。在大多数国家和地区，版权保护期限作者去世后 70 年后的第一个元旦日（1 月 1 日）起失效。墨西哥和美国有例外，美国是在 1926 年之前出版的所有书籍和故事都属于公有领域。&lt;/li&gt;&#xA;&lt;li&gt;公有领域的音乐&lt;/li&gt;&#xA;&lt;li&gt;公有领域的的电影&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;正如前面所说，共有领域的作品不受版权保护，那我可以随便拿来用，不用遵守什么规则。打个比方我把我自己拍的照片或者写的文章放到公有领域里，那谁都可以拿来用，他可以稍微改一下，就可以在不经过我的同意下拥有版权 (Copyright)。这样的话只有我的作品还是开放给大家使用的，基于我的作品又可以回到有版权 (Copyright) 的领域，这样一来，又不利于知识的传播。&lt;/p&gt;</description>
    </item>
    <item>
      <title>ssh 免密登录</title>
      <link>/blogs/rsa_ssh/</link>
      <pubDate>Fri, 05 Feb 2021 12:13:15 +0800</pubDate>
      <guid>/blogs/rsa_ssh/</guid>
      <description>&lt;h2 id=&#34;rsa简介&#34;&gt;&#xA;  rsa简介&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#rsa%e7%ae%80%e4%bb%8b&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&#xA;&#xA;&#xA;&lt;h3 id=&#34;rsa&#34;&gt;&#xA;  rsa&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#rsa&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&#xA;&#xA;&#xA;&lt;h4 id=&#34;什么是rsa&#34;&gt;&#xA;  &#xA;&#xA;&lt;a href=&#34;http://www.baidu.com/link?url=E7VV9LiPjbQHlSeIcFqyi_sx7fSDsVr8zPdlhSn7GVcsXuA5uiwUEmqmHXNQoJyroo71V84SlMGwRAML75z7D8HCAxMS6Ovzlljv0_Pr8DUNGyzrqNQWbsqTpXBlfsDAQfUx78JGfySl5JN4km2Qka&amp;amp;wd=&amp;amp;eqid=f42870ad0000ace4000000055e393bea&#34; target=&#34;_blank&#34;&gt;什么是rsa&lt;/a&gt;&#xA;&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#%e4%bb%80%e4%b9%88%e6%98%afrsa&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h4&gt;&#xA;&#xA;&lt;p&gt;RSA加密算法是一种非对称加密算法。在公开密钥加密和电子商业中RSA被广泛使用。它的基本原理是利用大数难以质因数分解，它有一对数字：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;密钥(&#xA;&#xA;&lt;a href=&#34;https://zhidao.baidu.com/question/1579778969145333380.html&#34; target=&#34;_blank&#34;&gt;yao4&lt;/a&gt;&#xA;)：绝对&lt;strong&gt;不能&lt;/strong&gt;透露给别人。&lt;/li&gt;&#xA;&lt;li&gt;公钥：是要给别人的。&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;具体原理请见阮一峰的&#xA;&#xA;&lt;a href=&#34;http://www.ruanyifeng.com/blog/2013/06/rsa_algorithm_part_one.html&#34; target=&#34;_blank&#34;&gt;blog&lt;/a&gt;&#xA;&lt;/p&gt;&#xA;&#xA;&#xA;&lt;h4 id=&#34;rsa的用途&#34;&gt;&#xA;  rsa的用途&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#rsa%e7%9a%84%e7%94%a8%e9%80%94&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h4&gt;&#xA;&#xA;&#xA;&#xA;&lt;h5 id=&#34;身份验证&#34;&gt;&#xA;  &#xA;&#xA;&lt;a href=&#34;www.ruanyifeng.com/blog/2011/12/ssh_remote_login.html&#34;&gt;身份验证&lt;/a&gt;&#xA;&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#%e8%ba%ab%e4%bb%bd%e9%aa%8c%e8%af%81&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h5&gt;&#xA;&#xA;&lt;p&gt;所谓&amp;quot;公钥登录&amp;quot;，原理很简单，就是用户将自己的公钥储存在远程主机上。登录的时候，远程主机会向用户发送一段随机字符串，用户用自己的私钥加密后，再发回来。远程主机用事先储存的公钥进行解密，如果成功，就证明用户是可信的，直接允许登录shell，不再要求密码。&lt;/p&gt;&#xA;&#xA;&#xA;&lt;h5 id=&#34;数字签名&#34;&gt;&#xA;  &#xA;&#xA;&lt;a href=&#34;https://www.ruanyifeng.com/blog/2011/08/what_is_a_digital_signature.html&#34; target=&#34;_blank&#34;&gt;数字签名&lt;/a&gt;&#xA;&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#%e6%95%b0%e5%ad%97%e7%ad%be%e5%90%8d&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h5&gt;&#xA;&#xA;&lt;p&gt;数字签名用于发行软件时防止别人篡改，具体流程是这样的：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;发行者对文件进行hash校验，并把这个校验值和进行私钥加密得到&lt;em&gt;数字签名&lt;/em&gt;，大家通过&lt;em&gt;公布在网站上的公钥&lt;/em&gt;解开这段密文（数字签名），也就是文件的hash值。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;下载者对文件进行hash校验，和1.中得到的hash值进行比对。&lt;/p&gt;&#xA;&lt;p&gt;上面两个步骤如何防止第三方修改，发行者加密的文件第三方当然可以通过公钥解密之后修改，但是你也无法生成（到时候用户要用公布在网站上的公钥解密的）&lt;em&gt;数字签名&lt;/em&gt;（必须知道密钥）。&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;hr&gt;&#xA;&#xA;&#xA;&lt;h2 id=&#34;ssh用rsa方式登录远程主机&#34;&gt;&#xA;  ssh用rsa方式登录远程主机&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#ssh%e7%94%a8rsa%e6%96%b9%e5%bc%8f%e7%99%bb%e5%bd%95%e8%bf%9c%e7%a8%8b%e4%b8%bb%e6%9c%ba&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&#xA;&#xA;&#xA;&lt;h3 id=&#34;为什么要用rsa登录&#34;&gt;&#xA;  为什么要用rsa登录&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#%e4%b8%ba%e4%bb%80%e4%b9%88%e8%a6%81%e7%94%a8rsa%e7%99%bb%e5%bd%95&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;方便，每次登录不用输密码。&lt;/li&gt;&#xA;&lt;li&gt;安全，禁用密码登录后，不怕别人猜到密码。&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&#xA;&#xA;&lt;h3 id=&#34;文件信息&#34;&gt;&#xA;  文件信息&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#%e6%96%87%e4%bb%b6%e4%bf%a1%e6%81%af&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&#xA;&lt;p&gt;本文会涉及两个文件夹，一个是在客户端（client），一个是服务器端（server）：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;rsa 密钥位置(&lt;strong&gt;client&lt;/strong&gt;)：&lt;code&gt;~/.ssh/&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;ssh 配置文件(&lt;strong&gt;server&lt;/strong&gt;)：&lt;code&gt;/etc/ssh/sshd_config&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;client 和 server 是相对的概念，在一次连接中，主动寻求连接的是 client ，被连的是 server。&lt;/p&gt;&#xA;&#xA;&#xA;&lt;h3 id=&#34;如何配置&#34;&gt;&#xA;  如何配置&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#%e5%a6%82%e4%bd%95%e9%85%8d%e7%bd%ae&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&#xA;&#xA;&#xA;&lt;h4 id=&#34;client&#34;&gt;&#xA;  client&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#client&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h4&gt;&#xA;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;strong&gt;生成密钥对：rsa 和 rsa.pub&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ssh-keygen -t rsa&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;得到&lt;/p&gt;</description>
    </item>
    <item>
      <title>jupyter-lab里的vim，colemak 配置</title>
      <link>/blogs/jupyterlab_vim_colemak_config/</link>
      <pubDate>Mon, 03 Aug 2020 23:09:45 +0800</pubDate>
      <guid>/blogs/jupyterlab_vim_colemak_config/</guid>
      <description>&lt;p&gt;我原先发于 &#xA;&#xA;&lt;a href=&#34;https://blog.csdn.net/BenSYZ&#34; target=&#34;_blank&#34;&gt;CSDN&lt;/a&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;&#xA;&#xA;&lt;a href=&#34;../jupyterlab_colemak&#34;&gt;上一篇文章&lt;/a&gt;&#xA; 介绍了 &lt;code&gt;jupyter-notebook&lt;/code&gt; 怎样 &lt;code&gt;map&lt;/code&gt;。&lt;code&gt;jupyterlab&lt;/code&gt; 是新一代的 &lt;code&gt;jupyter-notebook，&lt;/code&gt; 有点像&lt;code&gt;R-Studio&lt;/code&gt;, 有更多的功能了。&lt;/p&gt;&#xA;&#xA;&#xA;&lt;h2 id=&#34;tl-dr&#34;&gt;&#xA;  TL; DR&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#tl-dr&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;install&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# For jupyterlab 2.0&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;jupyter-labextension install @axlair/jupyterlab_vim&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# vimrc&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;jupyter-labextension install jupyterlab-vimrc&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&#xA;&lt;li&gt;config&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-JSON5&#34; data-lang=&#34;JSON5&#34;&gt;    &amp;#34;nmap&amp;#34;: [&#xA;        [&amp;#34;n&amp;#34;,&amp;#34;j&amp;#34;],&#xA;        [&amp;#34;e&amp;#34;,&amp;#34;k&amp;#34;]&#xA;    ],&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;&#xA;&#xA;&#xA;&lt;h2 id=&#34;安装jupyterlab&#34;&gt;&#xA;  安装&lt;code&gt;jupyterlab&lt;/code&gt;&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#%e5%ae%89%e8%a3%85jupyterlab&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;pip install --user jupyterlab&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# or&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;conda activate &amp;lt;env&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;conda install jupyterlab&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#xA;&#xA;&lt;h2 id=&#34;安装-extension&#34;&gt;&#xA;  安装 extension&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#%e5%ae%89%e8%a3%85-extension&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&#xA;&#xA;&#xA;&lt;h3 id=&#34;1-vim-binding&#34;&gt;&#xA;  1. vim binding&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#1-vim-binding&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# jupyterlab 1.0&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;jupyter labextension install jupyterlab_vim&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# jupyterlab 2.0&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;jupyter-labextension install @axlair/jupyterlab_vim&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#xA;&#xA;&lt;h3 id=&#34;2-vim-keymap&#34;&gt;&#xA;  2. vim keymap&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#2-vim-keymap&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;jupyter-labextension install jupyterlab-vimrc&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#xA;&#xA;&lt;h4 id=&#34;配置&#34;&gt;&#xA;  配置&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#%e9%85%8d%e7%bd%ae&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h4&gt;&#xA;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;![在这里插入图片描述](&#xA;&#xA;&lt;a href=&#34;https://img-blog.csdnimg.cn/20200803225854570.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0JlblNZWg==,size_16,color_FFFFFF,t_70#pic_center&#34; target=&#34;_blank&#34;&gt;https://img-blog.csdnimg.cn/20200803225854570.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0JlblNZWg==,size_16,color_FFFFFF,t_70#pic_center&lt;/a&gt;&#xA; =200x)&#xA;2.&#xA;&lt;img src=&#34;https://img-blog.csdnimg.cn/20200803225927188.png#pic_center&#34; alt=&#34;在这里插入图片描述&#34;&gt;&#xA;3. 仅供参考&lt;/p&gt;</description>
    </item>
    <item>
      <title>vim&#43;colemak(keymap)&#43;jupyterlab</title>
      <link>/blogs/jupyterlab_colemak/</link>
      <pubDate>Mon, 03 Aug 2020 23:09:45 +0800</pubDate>
      <guid>/blogs/jupyterlab_colemak/</guid>
      <description>&lt;p&gt;我原先发于 &#xA;&#xA;&lt;a href=&#34;https://blog.csdn.net/BenSYZ&#34; target=&#34;_blank&#34;&gt;CSDN&lt;/a&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;推荐使用 jupyter-lab, &#xA;&#xA;&lt;a href=&#34;https://blog.csdn.net/BenSYZ/article/details/107775517&#34; target=&#34;_blank&#34;&gt;见此&lt;/a&gt;&#xA;&lt;/p&gt;&#xA;&#xA;&#xA;&lt;h2 id=&#34;tl-dr&#34;&gt;&#xA;  TL, DR&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#tl-dr&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;install this extension, and change the &lt;code&gt;vim .jupyter/custom/custom.js&lt;/code&gt;, map &lt;code&gt;n&lt;/code&gt; and &lt;code&gt;e&lt;/code&gt;. Reason is that this extension can help you jump from cells to cells.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;change the codemirror in notebook package.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;~/.local/lib/python3.8/site-packages/notebook/static/components/codemirror/keymap/vim.js&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;My example is &#xA;&#xA;&lt;a href=&#34;https://github.com/BenSYZ/jupyter-vim-binding-colemak/tree/master/colemak&#34; target=&#34;_blank&#34;&gt;here&lt;/a&gt;&#xA;&lt;/p&gt;&#xA;&#xA;&#xA;&lt;h2 id=&#34;essay&#34;&gt;&#xA;  Essay&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#essay&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;Vimer 很多，所以有作者开发了&#xA;&#xA;&lt;a href=&#34;jupyter-vim-binding&#34;&gt;jupyter-vim-binding&lt;/a&gt;&#xA;。&#xA;colemaker 很少，而上面的 jupyter-vim-binding 的作者只提供了移动的API，不能做到映射全部的键位。&lt;/p&gt;&#xA;&lt;p&gt;我本想修改这个插件来扩展它的功能。从 &#xA;&#xA;&lt;a href=&#34;https://codemirror.net/&#34; target=&#34;_blank&#34;&gt;codemirror&lt;/a&gt;&#xA; 官网下下了 codemirror 的代码，对照了jupyter-vim-binding 对&lt;code&gt;hi&lt;/code&gt;(qwert: &lt;code&gt;hl&lt;/code&gt;)方向的修改成功了，但是 colemak 向下是&lt;code&gt;n&lt;/code&gt;键，所以还需把搜索键引入进来，同样的方法试了一下不行，发现源码中涉及的函数太多，只会照猫画虎。&lt;/p&gt;&#xA;&lt;p&gt;弄了一天，终于搜对了关键字 “jupyter notebook 自定义 codemirror”， 谷歌对中文的支持不好，英文搜出来的修改的手段也太官方了，所以一直解决不了，百度搜到了&#xA;&#xA;&lt;a href=&#34;https://www.cnblogs.com/ZhangHT97/p/13336975.html&#34; target=&#34;_blank&#34;&gt;Jupyter Notebook 更改字体、字体大小、行高&lt;/a&gt;&#xA;。&lt;/p&gt;&#xA;&lt;p&gt;nb! 直接修改 codemirror 在 jupyter 中的源码&lt;/p&gt;</description>
    </item>
    <item>
      <title>树莓派4B连不上wifi的一个意想不到的原因</title>
      <link>/blogs/raspberrypi4B_wifi/</link>
      <pubDate>Fri, 31 Jul 2020 15:34:47 +0800</pubDate>
      <guid>/blogs/raspberrypi4B_wifi/</guid>
      <description>&lt;p&gt;我原先发于 &#xA;&#xA;&lt;a href=&#34;https://blog.csdn.net/BenSYZ&#34; target=&#34;_blank&#34;&gt;CSDN&lt;/a&gt;&#xA;&lt;/p&gt;&#xA;&#xA;&#xA;&lt;h2 id=&#34;wpa_supplicant-无法配置wifi&#34;&gt;&#xA;  wpa_supplicant 无法配置wifi&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#wpa_supplicant-%e6%97%a0%e6%b3%95%e9%85%8d%e7%bd%aewifi&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;输出结果如下：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  ➜  sudo wpa_supplicant -i wlan0 -c /etc/wpa_supplicatn/wpa_supplicant.conf&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Successfully initialized wpa_supplicant&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wlan0: Trying to associate with SSID &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;xxxxxxx&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wlan0: CTRL-EVENT-ASSOC-REJECT bssid&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;00:00:00:00:00:00 status_code&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;16&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wlan0: Trying to associate with SSID &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;xxxxxxx&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wlan0: CTRL-EVENT-ASSOC-REJECT bssid&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;00:00:00:00:00:00 status_code&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;16&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wlan0: Trying to associate with SSID &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;xxxxxxx&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wlan0: CTRL-EVENT-ASSOC-REJECT bssid&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;00:00:00:00:00:00 status_code&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;16&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wlan0: Trying to associate with SSID &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;xxxxxxx&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wlan0: CTRL-EVENT-ASSOC-REJECT bssid&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;00:00:00:00:00:00 status_code&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;16&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wlan0: CTRL-EVENT-SSID-TEMP-DISABLED id&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; ssid&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;xxxxxxx&amp;#34;&lt;/span&gt; auth_failures&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; duration&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;10&lt;/span&gt; reason&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;CONN_FAILED&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wlan0: Failed to initiate sched scan&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wlan0: CTRL-EVENT-SSID-REENABLED id&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; ssid&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;xxxxxxx&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;使用 &lt;code&gt;sudo iwlist wlan0 scan |grep SSID&lt;/code&gt; 能搜到，但是就是连不上。&lt;/p&gt;</description>
    </item>
    <item>
      <title>通过修改注册表修改Windows键位为colemak</title>
      <link>/blogs/keyboard_map_windows/</link>
      <pubDate>Thu, 30 Jul 2020 14:55:29 +0800</pubDate>
      <guid>/blogs/keyboard_map_windows/</guid>
      <description>&lt;p&gt;我原先发于 &#xA;&#xA;&lt;a href=&#34;https://blog.csdn.net/BenSYZ&#34; target=&#34;_blank&#34;&gt;CSDN&lt;/a&gt;&#xA;&lt;/p&gt;&#xA;&#xA;&#xA;&lt;h2 id=&#34;tl-dr&#34;&gt;&#xA;  TL; DR&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#tl-dr&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&#xA;&#xA;&#xA;&lt;h3 id=&#34;1-转-colemak&#34;&gt;&#xA;  1. 转 colemak&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#1-%e8%bd%ac-colemak&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-reg&#34; data-lang=&#34;reg&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Windows Registry Editor Version 5.00&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;[&lt;/span&gt;HKEY_LOCAL_MACHINE&lt;span style=&#34;color:#66d9ef&#34;&gt;\SYSTEM\CurrentControlSet\Control\Keyboard Layout]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;&amp;#34;Scancode Map&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;hex:&lt;span style=&#34;color:#ae81ff&#34;&gt;00,00,00,00,00,00,00,00,14,00,00,00,3a,00,01,00,01,00,3a,00,&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;\&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;21,00,12,00,19,00,13,00,22,00,14,00,24,00,15,00,26,00,16,00,16,00,17,00,15,\&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;00,18,00,27,00,19,00,13,00,1f,00,1f,00,20,00,14,00,21,00,20,00,22,00,31,00,\&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;24,00,12,00,25,00,17,00,26,00,18,00,27,00,25,00,31,00,00,00,00,00&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#xA;&#xA;&lt;h3 id=&#34;2-esc-caps-lock-互换&#34;&gt;&#xA;  2. &lt;code&gt;&amp;lt;Esc&amp;gt;&lt;/code&gt; &lt;code&gt;&amp;lt;Caps Lock&amp;gt;&lt;/code&gt; 互换&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#2-esc-caps-lock-%e4%ba%92%e6%8d%a2&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-reg&#34; data-lang=&#34;reg&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Windows Registry Editor Version 5.00&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;[&lt;/span&gt;HKEY_LOCAL_MACHINE&lt;span style=&#34;color:#66d9ef&#34;&gt;\SYSTEM\CurrentControlSet\Control\Keyboard Layout]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;&amp;#34;Scancode Map&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;hex:&lt;span style=&#34;color:#ae81ff&#34;&gt;00,00,00,00,00,00,00,00,03,00,00,00,3a,00,01,00,01,00,3a,00,00,00,00,00,00&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#xA;&#xA;&lt;h2 id=&#34;问题&#34;&gt;&#xA;  问题&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#%e9%97%ae%e9%a2%98&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;&#xA;&#xA;&lt;a href=&#34;../keyboard_map_linux&#34;&gt;在Linux中修改键盘为colemak键盘很容易&lt;/a&gt;&#xA;：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 暂时&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;setxkbmap us -variant colemak&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;setxkbmap us -variant workman&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;setxkbmap us -variant norman&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Ubuntu&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo dpkg-reconfigure keyboard-configuration&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Arch&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;loadkeys colemak&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;但是在Windows中就很麻烦了，有推荐在&#xA;&#xA;&lt;a href=&#34;https://colemak.com/Windows&#34; target=&#34;_blank&#34;&gt;这里&lt;/a&gt;&#xA;下载安装，然后修改这一项注册表&lt;code&gt;\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layouts\00000804&lt;/code&gt; 但是我的使用体验并不好，所以直接修改注册表来映射。&lt;/p&gt;</description>
    </item>
    <item>
      <title>管理从源码安装的应用的link——stow</title>
      <link>/blogs/stow_introduction/</link>
      <pubDate>Thu, 30 Jul 2020 13:15:47 +0800</pubDate>
      <guid>/blogs/stow_introduction/</guid>
      <description>&lt;p&gt;我原先发于 &#xA;&#xA;&lt;a href=&#34;https://blog.csdn.net/BenSYZ&#34; target=&#34;_blank&#34;&gt;CSDN&lt;/a&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;Know from &#xA;&#xA;&lt;a href=&#34;https://www.ostechnix.com/an-easy-way-to-remove-programs-installed-from-source-in-linux/&#34; target=&#34;_blank&#34;&gt;here&lt;/a&gt;&#xA;&lt;/p&gt;&#xA;&#xA;&#xA;&lt;h2 id=&#34;install-positiontake-neovim-as-example&#34;&gt;&#xA;  Install Position(take &lt;code&gt;neovim&lt;/code&gt; as example)&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#install-positiontake-neovim-as-example&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;/usr/local/stow/nvim/&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&#xA;&lt;h2 id=&#34;make-symbolic-link&#34;&gt;&#xA;  Make Symbolic Link&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#make-symbolic-link&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cd /usr/local/stow/&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo stow nvim&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This command will make some link files at &lt;code&gt;/usr/local/bin/&lt;/code&gt;, pointing to all the files in  &lt;code&gt;/usr/local/stow/nvim/bin&lt;/code&gt; and &lt;code&gt;/usr/local/share/&lt;/code&gt;, pointing to all the files in &lt;code&gt;/usr/local/stow/nvim/share&lt;/code&gt; and so on.&lt;/p&gt;&#xA;&#xA;&#xA;&lt;h3 id=&#34;example&#34;&gt;&#xA;  Example&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#example&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&#xA;&lt;p&gt;For example, After &lt;code&gt;make install&lt;/code&gt;, there will be &lt;code&gt;nvim&lt;/code&gt; in &lt;code&gt;/usr/local/stow/nvim/bin/&lt;/code&gt;, you could &#xA;&#xA;&lt;a href=&#34;https://blog.csdn.net/BenSYZ/article/details/98105357&#34; target=&#34;_blank&#34;&gt;make a link file&lt;/a&gt;&#xA; (like &lt;code&gt;vim&lt;/code&gt;) in this directory, like following,&lt;/p&gt;</description>
    </item>
    <item>
      <title>Linux开机自动连接网络</title>
      <link>/blogs/connect_wifi_on_startup/</link>
      <pubDate>Wed, 26 Feb 2020 10:26:09 +0800</pubDate>
      <guid>/blogs/connect_wifi_on_startup/</guid>
      <description>&lt;p&gt;整合自: &#xA;&#xA;&lt;a href=&#34;https://bbs.archlinux.org/viewtopic.php?id=178625&#34; target=&#34;_blank&#34;&gt;https://bbs.archlinux.org/viewtopic.php?id=178625&lt;/a&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;上一篇&#xA;&#xA;&lt;a href=&#34;../connect_wifi_command&#34;&gt;文章&lt;/a&gt;&#xA;讲到如何用命令行连接wifi，大家可以去看看。&lt;/p&gt;&#xA;&lt;p&gt;本文参考 &#xA;&#xA;&lt;a href=&#34;https://bbs.archlinux.org/viewtopic.php?id=178625&#34; target=&#34;_blank&#34;&gt;https://bbs.archlinux.org/viewtopic.php?id=178625&lt;/a&gt;&#xA;&lt;/p&gt;&#xA;&#xA;&#xA;&lt;h2 id=&#34;tldr&#34;&gt;&#xA;  TL,DR&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#tldr&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&#xA;&#xA;&#xA;&lt;h3 id=&#34;wpa_supplicant&#34;&gt;&#xA;  &lt;code&gt;wpa_supplicant&lt;/code&gt;&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#wpa_supplicant&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# config wpa_supplicant&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#/etc/wpa_supplicant/wpa_supplicant-wlp5s0.conf&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# enable wpa_supplicant&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;systemctl enable wpa_supplicant@wlp5s0&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#xA;&#xA;&lt;h3 id=&#34;config-systemd-network&#34;&gt;&#xA;  &lt;code&gt;config systemd-network&lt;/code&gt;&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#config-systemd-network&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# config systemd-network&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# /etc/systemd/network/00-wireless-dhcp.network&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;Match&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Name&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;wlp5s0&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;Network&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;DHCP&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;yes&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# enable systemd-networkd.service&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;systemctl enable systemd-networkd.service&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#xA;&#xA;&lt;h2 id=&#34;需要工具&#34;&gt;&#xA;  需要工具&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#%e9%9c%80%e8%a6%81%e5%b7%a5%e5%85%b7&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;code&gt;wpa_supplicant&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;dhcpcd&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&#xA;&#xA;&lt;h2 id=&#34;配置文件&#34;&gt;&#xA;  配置文件&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#%e9%85%8d%e7%bd%ae%e6%96%87%e4%bb%b6&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;code&gt;/etc/wpa_supplicant/wpa_supplicant-网卡名.conf&lt;/code&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;code&gt;/etc/systemd/network/00-wireless-dhcp.network&lt;/code&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&#xA;&#xA;&lt;h2 id=&#34;步骤&#34;&gt;&#xA;  步骤&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#%e6%ad%a5%e9%aa%a4&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&#xA;&#xA;&#xA;&lt;h3 id=&#34;1-wpa_supplicant&#34;&gt;&#xA;  1. &lt;code&gt;wpa_supplicant&lt;/code&gt;&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#1-wpa_supplicant&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&#xA;&#xA;&#xA;&lt;h4 id=&#34;11-查看网卡名字&#34;&gt;&#xA;  1.1 查看网卡名字&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#11-%e6%9f%a5%e7%9c%8b%e7%bd%91%e5%8d%a1%e5%90%8d%e5%ad%97&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h4&gt;&#xA;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ip link&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 1: lo&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 2: enp4s0&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 3: wlp5s0&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol&gt;&#xA;&lt;li&gt;lo 是loop设备&lt;/li&gt;&#xA;&lt;li&gt;enp4s0 是有线设备&lt;/li&gt;&#xA;&lt;li&gt;wlp5s0 是无线设备&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;&lt;strong&gt;注意我的网卡名是 &lt;code&gt;wlp5s0&lt;/code&gt;，下文中的&lt;code&gt;wlp5s0&lt;/code&gt; 都需替换成你的&lt;/strong&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>通过命令行连接 WiFi</title>
      <link>/blogs/shell_connect_wifi/</link>
      <pubDate>Wed, 26 Feb 2020 10:15:54 +0800</pubDate>
      <guid>/blogs/shell_connect_wifi/</guid>
      <description>&lt;p&gt;我原先发于 &#xA;&#xA;&lt;a href=&#34;https://blog.csdn.net/BenSYZ&#34; target=&#34;_blank&#34;&gt;CSDN&lt;/a&gt;&#xA;&lt;/p&gt;&#xA;&#xA;&#xA;&lt;h2 id=&#34;检查是哪一个接口来支持无线连接的&#34;&gt;&#xA;  检查是哪一个接口来支持无线连接的：&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#%e6%a3%80%e6%9f%a5%e6%98%af%e5%93%aa%e4%b8%80%e4%b8%aa%e6%8e%a5%e5%8f%a3%e6%9d%a5%e6%94%af%e6%8c%81%e6%97%a0%e7%ba%bf%e8%bf%9e%e6%8e%a5%e7%9a%84&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;iwconfig&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;假定是wlan0，我的是wlp5s0&lt;/p&gt;&#xA;&#xA;&#xA;&lt;h2 id=&#34;启动接口服务&#34;&gt;&#xA;  启动接口服务&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#%e5%90%af%e5%8a%a8%e6%8e%a5%e5%8f%a3%e6%9c%8d%e5%8a%a1&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo ip link set wlan0 up&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#xA;&#xA;&lt;h2 id=&#34;扫描附近的无线网络了&#34;&gt;&#xA;  扫描附近的无线网络了：&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#%e6%89%ab%e6%8f%8f%e9%99%84%e8%bf%91%e7%9a%84%e6%97%a0%e7%ba%bf%e7%bd%91%e7%bb%9c%e4%ba%86&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo iw dev wlan0 scan | less&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#xA;&#xA;&lt;h2 id=&#34;连接&#34;&gt;&#xA;  连接&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#%e8%bf%9e%e6%8e%a5&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&#xA;&#xA;&#xA;&lt;h3 id=&#34;没有加密&#34;&gt;&#xA;  没有加密：&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#%e6%b2%a1%e6%9c%89%e5%8a%a0%e5%af%86&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo iw dev wlan0 connect &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;网络 SSID&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;也可以通过&lt;code&gt;wpa_supplicant&lt;/code&gt; 连接，见‘WPA or WPA2’。&lt;/p&gt;&#xA;&#xA;&#xA;&lt;h3 id=&#34;wep-加密的&#34;&gt;&#xA;  WEP 加密的：&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#wep-%e5%8a%a0%e5%af%86%e7%9a%84&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo iw dev wlan0 connect &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;网络 SSID&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; key 0:&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;WEP 密钥&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#xA;&#xA;&lt;h3 id=&#34;wpa-or-wpa2&#34;&gt;&#xA;  WPA or WPA2&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#wpa-or-wpa2&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;code&gt;/etc/wpasupplicant/wpa_supplicant.conf&lt;/code&gt; 文件，增加如下行：&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;network={    ssid=&amp;quot;[网络 ssid]&amp;quot;    psk=&amp;quot;[密码]&amp;quot;    priority=1}&lt;/p&gt;</description>
    </item>
    <item>
      <title>统一Linux Windows 时区</title>
      <link>/blogs/timezone_win_linux/</link>
      <pubDate>Wed, 26 Feb 2020 10:05:47 +0800</pubDate>
      <guid>/blogs/timezone_win_linux/</guid>
      <description>&lt;p&gt;我原先发于 &#xA;&#xA;&lt;a href=&#34;https://blog.csdn.net/BenSYZ&#34; target=&#34;_blank&#34;&gt;CSDN&lt;/a&gt;&#xA;&lt;/p&gt;&#xA;&#xA;&#xA;&lt;h2 id=&#34;思路&#34;&gt;&#xA;  思路&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#%e6%80%9d%e8%b7%af&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;把硬件时间修改为UTC，system的修改为local time。&lt;/p&gt;&#xA;&#xA;&#xA;&lt;h2 id=&#34;windows&#34;&gt;&#xA;  windows&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#windows&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;参考&#xA;&#xA;&lt;a href=&#34;https://blog.csdn.net/qq_40197828/article/details/79334158&#34; target=&#34;_blank&#34;&gt;https://blog.csdn.net/qq_40197828/article/details/79334158&lt;/a&gt;&#xA;&lt;/p&gt;&#xA;&#xA;&#xA;&lt;h3 id=&#34;打开注册表编辑器&#34;&gt;&#xA;  打开注册表编辑器&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#%e6%89%93%e5%bc%80%e6%b3%a8%e5%86%8c%e8%a1%a8%e7%bc%96%e8%be%91%e5%99%a8&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cmd&#34; data-lang=&#34;cmd&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;regedit&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#xA;&#xA;&lt;h3 id=&#34;新建表项&#34;&gt;&#xA;  新建表项&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#%e6%96%b0%e5%bb%ba%e8%a1%a8%e9%a1%b9&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&#xA;&lt;p&gt;在 &lt;code&gt;HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\TimeZoneInformation&lt;/code&gt;中新建&lt;code&gt;RealTimeIsUniversal&lt;/code&gt;项目&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;64 位系统，“QWORD（64位）值”。&lt;/li&gt;&#xA;&lt;li&gt;32 位系统，“DWORD（32位）值”。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;它的大体意思是，硬件时间被作为全球统一时间。&lt;/p&gt;&#xA;&#xA;&#xA;&lt;h3 id=&#34;修改表项值&#34;&gt;&#xA;  修改表项值&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#%e4%bf%ae%e6%94%b9%e8%a1%a8%e9%a1%b9%e5%80%bc&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&#xA;&lt;p&gt;然后双击这一条目，弹出“编辑 QWORD（64位）值”的对话框，确保选中了“十六进制”，然后将“数值数据”改为“1”。最后点击“确定”。&lt;/p&gt;&#xA;&#xA;&#xA;&lt;h3 id=&#34;可以备份下次直接注入注册表即可&#34;&gt;&#xA;  可以备份下次直接注入注册表即可&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#%e5%8f%af%e4%bb%a5%e5%a4%87%e4%bb%bd%e4%b8%8b%e6%ac%a1%e7%9b%b4%e6%8e%a5%e6%b3%a8%e5%85%a5%e6%b3%a8%e5%86%8c%e8%a1%a8%e5%8d%b3%e5%8f%af&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&#xA;&#xA;&#xA;&lt;h2 id=&#34;linux&#34;&gt;&#xA;  &#xA;&#xA;&lt;a href=&#34;https://wiki.archlinux.org/index.php/Installation_guide&#34; target=&#34;_blank&#34;&gt;linux&lt;/a&gt;&#xA;&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#linux&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;按照官方的操作，好像市区还是有点问题。具体是那个命令我忘记了就是搞着搞着就可以了，大家如果知道是哪个还请在评论区告诉我&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ls -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localetime&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo hwclock --systohc&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;timedatectl set-local-rtc false&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;timedatectl set-timezone Asia/Shanghai&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;timedatectl status&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;后来发现其实windows和arch linux 没必要设置时区，因为它们都是把硬件时间当作当地时间，但是ubuntu就不一样了。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Linux 停转机械硬盘来省电</title>
      <link>/blogs/archlinux_stop_hdd_spin/</link>
      <pubDate>Wed, 26 Feb 2020 09:32:00 +0800</pubDate>
      <guid>/blogs/archlinux_stop_hdd_spin/</guid>
      <description>&lt;p&gt;我原先发于 &#xA;&#xA;&lt;a href=&#34;https://blog.csdn.net/BenSYZ&#34; target=&#34;_blank&#34;&gt;CSDN&lt;/a&gt;&#xA;&lt;/p&gt;&#xA;&#xA;&#xA;&lt;h1 id=&#34;hdd-stop-spin&#34;&gt;&#xA;  hdd stop spin&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#hdd-stop-spin&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h1&gt;&#xA;&#xA;&#xA;&#xA;&lt;h2 id=&#34;automatic-by-tlp&#34;&gt;&#xA;  automatic, by &lt;code&gt;tlp&lt;/code&gt;&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#automatic-by-tlp&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# /etc/tlp.conf&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 具体可以看这个文件，下面两行只是我的设置，你的配置要自己修改&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;DISK_SPINDOWN_TIMEOUT_ON_AC&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;0 12&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;DISK_SPINDOWN_TIMEOUT_ON_BAT&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;0 12&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 设置开机启动&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;systemctl enable tlp&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#xA;&#xA;&lt;h2 id=&#34;manual-by-hdparm&#34;&gt;&#xA;  manual, by &lt;code&gt;hdparm&lt;/code&gt;&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#manual-by-hdparm&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;&#xA;&#xA;&lt;a href=&#34;https://blog.csdn.net/magaiou/article/details/92770845&#34; target=&#34;_blank&#34;&gt;https://blog.csdn.net/magaiou/article/details/92770845&lt;/a&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;从 &lt;code&gt;man hdparm&lt;/code&gt; 可知：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# -S 从1到240的值指定5秒的倍数，从而产生5秒到20分钟的超时。从241到251的值指定30分钟的1到11个单位，从而产生30分钟到5.5小时的超时。值252表示超时21分钟。&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;hdparm -S&lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;num&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; /dev/hd*&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# -y 强制IDE驱动器立即进入低功耗待机模式，通常会导致其降速。&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;hdparm -y /dev/hd*&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# -Y 强制IDE驱动器立即进入最低功耗睡眠模式，导致其完全关闭。&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;hdparm -Y /dev/hd*&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;所以可以通过在&lt;code&gt;.zshrc&lt;/code&gt;(或&lt;code&gt;.bashrc&lt;/code&gt;) 中添加&lt;code&gt;alias&lt;/code&gt; 来快速手动停转硬盘。&lt;/p&gt;</description>
    </item>
    <item>
      <title>为 Linux colemak 修改键</title>
      <link>/blogs/keyboard_map_linux/</link>
      <pubDate>Wed, 26 Feb 2020 09:17:44 +0800</pubDate>
      <guid>/blogs/keyboard_map_linux/</guid>
      <description>&lt;p&gt;我原先发于 &#xA;&#xA;&lt;a href=&#34;https://blog.csdn.net/BenSYZ&#34; target=&#34;_blank&#34;&gt;CSDN&lt;/a&gt;&#xA;&lt;/p&gt;&#xA;&#xA;&#xA;&lt;h2 id=&#34;change-keyboard-layout-as-colemak-and--esc-with-capslock&#34;&gt;&#xA;  Change keyboard layout as colemak, and &lt;code&gt; &amp;lt;Esc&amp;gt;&lt;/code&gt; with &lt;code&gt;&amp;lt;CapsLock&amp;gt;&lt;/code&gt;&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#change-keyboard-layout-as-colemak-and--esc-with-capslock&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;For Windows check &#xA;&#xA;&lt;a href=&#34;../keyboard_map_windows&#34;&gt;here&lt;/a&gt;&#xA;&lt;/p&gt;&#xA;&#xA;&#xA;&lt;h3 id=&#34;tldr&#34;&gt;&#xA;  TLDR&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#tldr&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# tty&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# /etc/vconsole.conf&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;KEYMAP &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; colemak&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# or&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;loadkeys colemak&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# graphic&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;setxkbmap us -variant colemak&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#xA;&#xA;&lt;h3 id=&#34;change-to-colemak&#34;&gt;&#xA;  change to colemak&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#change-to-colemak&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&#xA;&#xA;&#xA;&lt;h4 id=&#34;temporary&#34;&gt;&#xA;  Temporary&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#temporary&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h4&gt;&#xA;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# tty&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;loadkeys colemak&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# graphic&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;setxkbmap us -variant colemak&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&#xA;&#xA;&lt;a href=&#34;https://www.cnblogs.com/BlackStorm/p/Ubuntu-Switch-Keyboard-Layouts-Such-As-Colemak-Workman-Norman.html&#34; target=&#34;_blank&#34;&gt;参考&lt;/a&gt;&#xA;&lt;/p&gt;&#xA;&#xA;&#xA;&lt;h4 id=&#34;permanet&#34;&gt;&#xA;  Permanet&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#permanet&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h4&gt;&#xA;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# tty (include graphic)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# /etc/vconsole.conf &lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;KEYMAP &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; colemak&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The above way may not work for Ubuntu, so adding &lt;code&gt;setxkbmap us -variant colemak&lt;/code&gt; in &lt;code&gt;~/.xinitrc&lt;/code&gt; may worked. If not see the next section.&lt;/p&gt;</description>
    </item>
    <item>
      <title>学习笔记：链接</title>
      <link>/blogs/link/</link>
      <pubDate>Thu, 01 Aug 2019 13:07:43 +0800</pubDate>
      <guid>/blogs/link/</guid>
      <description>&lt;p&gt;我原先发于 &#xA;&#xA;&lt;a href=&#34;https://blog.csdn.net/BenSYZ&#34; target=&#34;_blank&#34;&gt;CSDN&lt;/a&gt;&#xA;&lt;/p&gt;&#xA;&#xA;&#xA;&lt;h1 id=&#34;链接-link&#34;&gt;&#xA;  链接 (link)&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#%e9%93%be%e6%8e%a5-link&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h1&gt;&#xA;&#xA;&#xA;&#xA;&lt;h2 id=&#34;硬链接-hard-link-&#34;&gt;&#xA;  硬链接 (hard link) :&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#%e7%a1%ac%e9%93%be%e6%8e%a5-hard-link-&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;硬链接可以用作备份文件，但不可跨硬盘链接。&lt;/p&gt;&#xA;&#xA;&#xA;&lt;h3 id=&#34;图示&#34;&gt;&#xA;  图示&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#%e5%9b%be%e7%a4%ba&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&#xA;&lt;div class=&#34;mermaid&#34;&gt;&#xA;  graph TB;&#xA;A[&#34;~/link/a/b/z.txt&lt;Br/&gt;（原始，用touch等新建的）&#34;] -.-&gt; Z(真实文件&lt;Br/&gt;数据位置);&#xA;B[&#34;~/link/z_harlink.txt&lt;Br/&gt; （硬链接）&#34;]  -.-&gt; Z;&#xA;&lt;/div&gt;&#xA;&#xA;&#xA;&#xA;&lt;h3 id=&#34;命令&#34;&gt;&#xA;  命令&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#%e5%91%bd%e4%bb%a4&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cp -l &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;source file&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;destination file&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#or&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ln &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;source file&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;destination file&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#xA;&#xA;&lt;h2 id=&#34;符号链接-symbolic-link不是软链接哦&#34;&gt;&#xA;  符号链接 (symbolic link)&lt;font size =1&gt;(不是软链接哦)&lt;/font&gt;&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#%e7%ac%a6%e5%8f%b7%e9%93%be%e6%8e%a5-symbolic-link%e4%b8%8d%e6%98%af%e8%bd%af%e9%93%be%e6%8e%a5%e5%93%a6&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&#xA;&lt;p&gt;即“快捷方式”&#xA;符号连接可以跨硬盘建链接，但不能用作备份，原始文件(&amp;quot;~ /link/a/b/z.txt&amp;quot;)被删除后，链接(&amp;quot;~/link/a/b/z.txt&amp;quot;)无用了。&lt;/p&gt;&#xA;&#xA;&#xA;&lt;h3 id=&#34;图示-1&#34;&gt;&#xA;  图示&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#%e5%9b%be%e7%a4%ba-1&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&#xA;&lt;div class=&#34;mermaid&#34;&gt;&#xA;  graph TB;&#xA;A[&#34;~/link/a/b/z.txt&lt;Br/&gt;（原始，用touch等新建的）&#34;] -.-&gt; Z(真实文件&lt;Br/&gt;数据位置);&#xA;B[&#34;~/link/z_harlink.txt&lt;Br/&gt; （硬链接）&#34;]  --&gt; A;&#xA;&lt;/div&gt;&#xA;&#xA;&#xA;&#xA;&lt;h3 id=&#34;命令-1&#34;&gt;&#xA;  命令&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#%e5%91%bd%e4%bb%a4-1&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cp -s &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;source file&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;destination file&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#or&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ln -s &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;source file&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;[&lt;/span&gt;destination file&lt;span style=&#34;color:#f92672&#34;&gt;]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>超级用户su没有权限修改所属</title>
      <link>/blogs/su_no_perm/</link>
      <pubDate>Tue, 16 Jul 2019 14:07:27 +0800</pubDate>
      <guid>/blogs/su_no_perm/</guid>
      <description>&lt;p&gt;我原先发于 &#xA;&#xA;&lt;a href=&#34;https://blog.csdn.net/BenSYZ&#34; target=&#34;_blank&#34;&gt;CSDN&lt;/a&gt;&#xA;&lt;/p&gt;&#xA;&#xA;&#xA;&lt;h2 id=&#34;两种情况&#34;&gt;&#xA;  两种情况&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#%e4%b8%a4%e7%a7%8d%e6%83%85%e5%86%b5&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&#xA;&#xA;&#xA;&lt;h3 id=&#34;1-lsatter-chattr&#34;&gt;&#xA;  1. &#xA;&#xA;&lt;a href=&#34;https://blog.csdn.net/FightingOning/article/details/88684618&#34; target=&#34;_blank&#34;&gt;lsatter &amp;amp;chattr &lt;/a&gt;&#xA;&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#1-lsatter-chattr&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&#xA;&lt;p&gt;lsatter: 查看文件隐藏属性&#xA;chatter: 设置文件的隐藏属性&lt;/p&gt;&#xA;&#xA;&#xA;&lt;h3 id=&#34;2分区文件格式&#34;&gt;&#xA;  2.分区文件格式&#xA;  &lt;a class=&#34;anchor&#34; href=&#34;#2%e5%88%86%e5%8c%ba%e6%96%87%e4%bb%b6%e6%a0%bc%e5%bc%8f&#34; aria-hidden=&#34;true&#34;&gt;#&lt;/a&gt;&#xA;&lt;/h3&gt;&#xA;&#xA;&lt;p&gt;我自己是上面两个命令都报错:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;lsattr: 对设备不适当的 ioctl 操作 读取 File 的标志时&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;chattr: 对设备不适当的 ioctl 操作 读取 File 的标志时&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;or&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;lsattr: Inappropriate ioctl &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; device &lt;span style=&#34;color:#66d9ef&#34;&gt;while&lt;/span&gt; reading flags on File&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;chattr: Inappropriate ioctl &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; device &lt;span style=&#34;color:#66d9ef&#34;&gt;while&lt;/span&gt; reading flags on File&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;后来尝试将文件从fat32格式移动到ext4(Linux 根目录下的分区)，再直接换所属(chown)，发现就可以了。&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
