<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Ben's Blog</title><link>https://bensyz.github.io/blog/</link><description>Recent content on Ben's Blog</description><generator>Hugo</generator><language>zh-CN</language><lastBuildDate>Sun, 26 Apr 2026 20:43:06 +0800</lastBuildDate><atom:link href="https://bensyz.github.io/blog/rss.xml" rel="self" type="application/rss+xml"/><item><title>asm x86 arg</title><link>https://bensyz.github.io/blog/blogs/what_happens_before_do_IRQ/asm_x86_arg/</link><pubDate>Sun, 26 Apr 2026 20:43:06 +0800</pubDate><guid>https://bensyz.github.io/blog/blogs/what_happens_before_do_IRQ/asm_x86_arg/</guid><description>&lt;p&gt;内核栈还是用户栈都是从高位往地位变化的，只是用户是从中间往下，内核是从顶上往下&lt;/p&gt;


&lt;h2 id="传参"&gt;
 传参
 &lt;a class="anchor" href="#%e4%bc%a0%e5%8f%82" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h2&gt;

&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// #include &amp;lt;stdio.h&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;fn&lt;/span&gt;( &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; a0, &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; a1, &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; a2, &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; a3, &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; a4, &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; a5, &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; a6, &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; a7, &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; a8){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; minus_result&lt;span style="color:#f92672"&gt;=&lt;/span&gt;a8&lt;span style="color:#f92672"&gt;-&lt;/span&gt;a1;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; minus_result;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#75715e"&gt;// printf(&amp;#34;%d\n&amp;#34;, minus_result);
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;main&lt;/span&gt;(){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; var&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0xF&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	var &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;fn&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;4&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;5&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;6&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;7&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;8&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-asm" data-lang="asm"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;fn:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;pushq&lt;/span&gt;	%rbp
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;movq&lt;/span&gt;	%rsp, %rbp
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;movl&lt;/span&gt;	%edi, -&lt;span style="color:#ae81ff"&gt;20&lt;/span&gt;(%rbp)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;movl&lt;/span&gt;	%esi, -&lt;span style="color:#ae81ff"&gt;24&lt;/span&gt;(%rbp)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;movl&lt;/span&gt;	%edx, -&lt;span style="color:#ae81ff"&gt;28&lt;/span&gt;(%rbp)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;movl&lt;/span&gt;	%ecx, -&lt;span style="color:#ae81ff"&gt;32&lt;/span&gt;(%rbp)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;movl&lt;/span&gt;	%r8d, -&lt;span style="color:#ae81ff"&gt;36&lt;/span&gt;(%rbp)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;movl&lt;/span&gt;	%r9d, -&lt;span style="color:#ae81ff"&gt;40&lt;/span&gt;(%rbp)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;movl&lt;/span&gt;	&lt;span style="color:#ae81ff"&gt;32&lt;/span&gt;(%rbp), %eax
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;subl&lt;/span&gt;	-&lt;span style="color:#ae81ff"&gt;24&lt;/span&gt;(%rbp), %eax
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;movl&lt;/span&gt;	%eax, -&lt;span style="color:#ae81ff"&gt;4&lt;/span&gt;(%rbp)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;movl&lt;/span&gt;	-&lt;span style="color:#ae81ff"&gt;4&lt;/span&gt;(%rbp), %eax
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;popq&lt;/span&gt;	%rbp
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;ret&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;main:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;pushq&lt;/span&gt;	%rbp
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;movq&lt;/span&gt;	%rsp, %rbp
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;subq&lt;/span&gt;	&lt;span style="color:#66d9ef"&gt;$16&lt;/span&gt;, %rsp
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;movl&lt;/span&gt;	&lt;span style="color:#66d9ef"&gt;$15&lt;/span&gt;, -&lt;span style="color:#ae81ff"&gt;4&lt;/span&gt;(%rbp) &lt;span style="color:#75715e"&gt;# 0xF
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 把 8 7 6 压入栈，前 6 个用寄存器存
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;pushq&lt;/span&gt;	&lt;span style="color:#66d9ef"&gt;$8&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;pushq&lt;/span&gt;	&lt;span style="color:#66d9ef"&gt;$7&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;pushq&lt;/span&gt;	&lt;span style="color:#66d9ef"&gt;$6&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;movl&lt;/span&gt;	&lt;span style="color:#66d9ef"&gt;$5&lt;/span&gt;, %r9d
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;movl&lt;/span&gt;	&lt;span style="color:#66d9ef"&gt;$4&lt;/span&gt;, %r8d
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;movl&lt;/span&gt;	&lt;span style="color:#66d9ef"&gt;$3&lt;/span&gt;, %ecx
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;movl&lt;/span&gt;	&lt;span style="color:#66d9ef"&gt;$2&lt;/span&gt;, %edx
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;movl&lt;/span&gt;	&lt;span style="color:#66d9ef"&gt;$1&lt;/span&gt;, %esi
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;movl&lt;/span&gt;	&lt;span style="color:#66d9ef"&gt;$0&lt;/span&gt;, %edi
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# call fn
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;call&lt;/span&gt;	&lt;span style="color:#66d9ef"&gt;fn&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;addq&lt;/span&gt;	&lt;span style="color:#66d9ef"&gt;$24&lt;/span&gt;, %rsp
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;movl&lt;/span&gt;	%eax, -&lt;span style="color:#ae81ff"&gt;4&lt;/span&gt;(%rbp)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;movl&lt;/span&gt;	&lt;span style="color:#66d9ef"&gt;$0&lt;/span&gt;, %eax
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;leave&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;ret&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;因为这里是 32 位的 int，所以用的是 edi，如果改成 UL，就会是 rdi 了&lt;/p&gt;</description></item><item><title>asm x86 reg gs</title><link>https://bensyz.github.io/blog/blogs/what_happens_before_do_IRQ/asm_x86_reg_gs/</link><pubDate>Sun, 26 Apr 2026 20:26:46 +0800</pubDate><guid>https://bensyz.github.io/blog/blogs/what_happens_before_do_IRQ/asm_x86_reg_gs/</guid><description>&lt;p&gt;

&lt;a href="https://www.google.com/search?q=length&amp;#43;of&amp;#43;GS&amp;#43;reg&amp;amp;client=firefox-b-d&amp;amp;hs=XU3U&amp;amp;sca_esv=8950cf81e29a85fb&amp;amp;sxsrf=ANbL-n6C8PcgEiBLqXnMc0cvhT_yp_Uh4w%3A1776387402487&amp;amp;ei=SoXhaa-tHaKy0PEP3K2cmAo&amp;amp;biw=1280&amp;amp;bih=800&amp;amp;ved=2ahUKEwjK1fqp6POTAxWqAjQIHVnYD4cQ0NsOegQIAxAB&amp;amp;uact=5&amp;amp;sclient=gws-wiz-serp&amp;amp;fbs=ADc_l-Z6XGGbkKmpylZqg2J7ZOuVNvV7jKtLqzLZ63dd2zPtrsojpaijeJRLrp4clUvcwVLqz22G_DDF8uXB52NlEFf5wf7GIq1kUkf2LzqDT3jWEtP6wIPqyN5KEXkAZxwbMJ5yiczr5iL7VhU7UDtQD2riWsGO8Q1G3JjRukKzy5XsVkXEdr-QxhcFl8U7vbRZWG1-mksaTo1a-K3477KjmScZXDYzJw&amp;amp;aep=10&amp;amp;ntc=1&amp;amp;mstk=AUtExfDQ52TjdglgqeP9Awxe5H8wWcFwiH2gDxec7XpfUIeefK3zrHkUUsSc_yT7MBdXllJ2r-rjgMD2XrWvkN5HcmidVmCnONPXuYkuPaeS3RwuEwwfakrmDQthLhnwf2X1TjdNRLthzsgTbZRDRatkLmH5-LdrZben-_XykDQ0vhGAm-qgNJa6wwzQ9AlR7Q3KtVqAVQPLRhYeow8T6sQMlxU_XS6W3LSTYmf_yD4NhQcReD7LpuY_59H46fB0905_OlIIOBkOtMv_sRIefoZ2aZV-8Yalgzo6eigzre2_PoMV67xmCsKjgbQLnU64TuymZqfq0wDIFkII6orixTWjHSUfhgVts8V7fcfqrEVSxZe_-hfwNz5wYFAQEyow7jsGXm4EVUInsfcC_e-b8mSwQyOr1CtZrsCsS8Z3PeTTgPV22fHXrjd560lQtRtumedfK58iUUTb7C8&amp;amp;csuir=1&amp;amp;mtid=v5fhaZqOJJf00PEPr76FoQM&amp;amp;udm=50" target="_blank"&gt;talk with gemini&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;在 QEMU 的寄存器导出（如使用 info registers 或 -d cpu 时）中，GS 这一行显示的是 x86 段寄存器的完整内部状态，包括它的可见选择子和隐藏的描述符缓存（Shadow Register）。 [1, 2]
你看到的这串数字的含义如下：
GS =0000 ffffffff8052a000 ffffffff 00c00100&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;0000 (选择子/Selector):
这是 GS 寄存器的“可见”部分。由于值为 0，表示目前没有加载任何有效的段选择子（通常在 64 位模式下很常见，因为 GS 常通过 MSR 寄存器直接设置基地址，而不使用段选择子）。&lt;/li&gt;
&lt;li&gt;ffffffff8052a000 (基地址/Base Address):
这是该段对应的线性基地址。在 64 位内核（如 Linux 或 Windows）中，GS 经常被用来指向 线程本地存储 (TLS) 或 内核的数据结构（如 cpu_entry_area）。这里的 ffffffff8052a000 表明它正指向内核空间的一个特定位置。&lt;/li&gt;
&lt;li&gt;ffffffff (段界限/Limit):
这是该段的最大偏移量。ffffffff 表示该段的界限是 4GB（在 64 位平坦内存模型中通常被忽略或设为最大值）。&lt;/li&gt;
&lt;li&gt;00c00100 (访问属性/Access Rights):
这是该段的属性标志位（通常对应段描述符中的各种权限位，如 DPL、Presence、Type 等）。 [1, 2, 3, 4, 5]&lt;/li&gt;
&lt;/ol&gt;


&lt;h2 id="为什么会出现这个特定的值"&gt;
 为什么会出现这个特定的值？
 &lt;a class="anchor" href="#%e4%b8%ba%e4%bb%80%e4%b9%88%e4%bc%9a%e5%87%ba%e7%8e%b0%e8%bf%99%e4%b8%aa%e7%89%b9%e5%ae%9a%e7%9a%84%e5%80%bc" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;如果你正在调试 Linux 内核 或 OSDev 项目，这种 GS 状态通常表示：&lt;/p&gt;</description></item><item><title>asm x86 mov and lea</title><link>https://bensyz.github.io/blog/blogs/what_happens_before_do_IRQ/asm_x86_mov_and_lea/</link><pubDate>Sat, 18 Apr 2026 14:29:47 +0800</pubDate><guid>https://bensyz.github.io/blog/blogs/what_happens_before_do_IRQ/asm_x86_mov_and_lea/</guid><description>&lt;h2 id="mov"&gt;
 mov
 &lt;a class="anchor" href="#mov" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h2&gt;

&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-asm" data-lang="asm"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# prepare rax rbx
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;movq&lt;/span&gt;	&lt;span style="color:#66d9ef"&gt;$1&lt;/span&gt;, %rax
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;movq&lt;/span&gt;	&lt;span style="color:#66d9ef"&gt;$2&lt;/span&gt;, %rbx
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# mov
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;movq&lt;/span&gt;	%rax, %rbx &lt;span style="color:#75715e"&gt;# copy content in rax to rbx
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;movq&lt;/span&gt;	(%rax), %rbx &lt;span style="color:#75715e"&gt;# copy content in memory whose address is recorded in rax to rbx
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;movq&lt;/span&gt;	%rax, (%rbx) &lt;span style="color:#75715e"&gt;# copy content in rbx to memory whose address is recorded in rbx
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#	movq	(%rax), (%rbx) # not allowed: number of operand in memory location at most to one
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# leaq
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;leaq&lt;/span&gt;	(%rax), %rbx &lt;span style="color:#75715e"&gt;# copy memory address of a memory whose address is recorded in rax To rbx
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;leaq&lt;/span&gt;	&lt;span style="color:#ae81ff"&gt;8&lt;/span&gt;(%rsp), %rbp &lt;span style="color:#75715e"&gt;# copy memory address of a memory whose address is value recorded in rax plus 8 To rbx
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3 id="直接拷贝和解引用"&gt;
 直接拷贝和解引用
 &lt;a class="anchor" href="#%e7%9b%b4%e6%8e%a5%e6%8b%b7%e8%b4%9d%e5%92%8c%e8%a7%a3%e5%bc%95%e7%94%a8" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h3&gt;

&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-asm" data-lang="asm"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;mov&lt;/span&gt; %rsp, %rbp &lt;span style="color:#75715e"&gt;#改寄存器的内容
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;mov&lt;/span&gt; %rsp, (%rbp) &lt;span style="color:#75715e"&gt;# de-reference 改寄存器指向的内存
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;括号等同于 C 中 &lt;code&gt;*&lt;/code&gt;&lt;/p&gt;</description></item><item><title>asm x86 call and stack</title><link>https://bensyz.github.io/blog/blogs/what_happens_before_do_IRQ/asm_x86_call_and_stack/</link><pubDate>Sat, 18 Apr 2026 11:29:06 +0800</pubDate><guid>https://bensyz.github.io/blog/blogs/what_happens_before_do_IRQ/asm_x86_call_and_stack/</guid><description>&lt;p&gt;本文只讨论 C 语言中的函数函数调用，不涉及换栈的操作。&lt;/p&gt;
&lt;p&gt;The CALL instruction in x86-64 assembly automatically decreases the stack pointer (RSP) by 8 bytes to push the return address (RIP) onto the stack. This action ensures the stack points to the top of the new stack frame, effectively allocating space for the return address.&lt;/p&gt;


&lt;h2 id="main"&gt;
 main
 &lt;a class="anchor" href="#main" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h2&gt;



&lt;h3 id="函数调用前"&gt;
 函数调用前
 &lt;a class="anchor" href="#%e5%87%bd%e6%95%b0%e8%b0%83%e7%94%a8%e5%89%8d" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h3&gt;

&lt;pre tabindex="0"&gt;&lt;code&gt; +-------------------+
 | | ← rbp
 | main stack var |
 | main stack var | ← rsp
 +-------------------+
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;在讨论 fn 后我们会知道当前 rbp 指的是谁&lt;/p&gt;</description></item><item><title>asm x86 reg name</title><link>https://bensyz.github.io/blog/blogs/what_happens_before_do_IRQ/asm_x86_reg_name/</link><pubDate>Sat, 18 Apr 2026 09:43:56 +0800</pubDate><guid>https://bensyz.github.io/blog/blogs/what_happens_before_do_IRQ/asm_x86_reg_name/</guid><description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;SP: stack pointer, 记录了栈顶在内存中的地址&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;BP: base pointer, 记录了栈底在内存中的地址&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;IP: instruction pointer, 记录了即将要执行的指令在内存中的地址&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;16 位中，他们的名字就是 sp，bp，ip&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;32 位中，我们会给这些寄存器的名字加一个前缀 E（Extended）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;64 位中，我们会给这些寄存器的名字加一个前缀 R（Register）&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;

&lt;a href="https://softwareengineering.stackexchange.com/a/127764/469476" target="_blank"&gt;前缀为什么是 R&lt;/a&gt;
&lt;/p&gt;


&lt;h2 id="查看"&gt;
 查看
 &lt;a class="anchor" href="#%e6%9f%a5%e7%9c%8b" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;gdb/qemu 中 info register&lt;/p&gt;
&lt;p&gt;和 $sp 类似，$fp（或 $ebp / $rbp）在 GDB 中代表的是基址指针（Base Pointer），通常也被称为帧指针（Frame Pointer）。&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;64位全称 (Long)&lt;/th&gt;
 &lt;th&gt;32位名称 (Double Word)&lt;/th&gt;
 &lt;th&gt;16位名称 (Word)&lt;/th&gt;
 &lt;th&gt;8位低位 (Byte)&lt;/th&gt;
 &lt;th&gt;auto bit pseudo-reg in gdb&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;$rsp (Stack Pointer)&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;$esp&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;$sp&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;$spl&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;$sp&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;$rbp (Base Pointer)&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;$ebp&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;$bp&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;$bpl&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;$fp&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;To print 16 bit of sp: force the type&lt;/p&gt;</description></item><item><title>结构体中的成员在栈上的顺序</title><link>https://bensyz.github.io/blog/blogs/what_happens_before_do_IRQ/elements_of_struct_on_stack/</link><pubDate>Fri, 17 Apr 2026 15:27:07 +0800</pubDate><guid>https://bensyz.github.io/blog/blogs/what_happens_before_do_IRQ/elements_of_struct_on_stack/</guid><description>&lt;p&gt;rdi 传入指针后，指向 r15&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;struct&lt;/span&gt; pt_regs {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;unsigned&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;long&lt;/span&gt; r15;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;unsigned&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;long&lt;/span&gt; r14;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;unsigned&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;long&lt;/span&gt; r13;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;unsigned&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;long&lt;/span&gt; r12;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;unsigned&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;long&lt;/span&gt; rbp;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;unsigned&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;long&lt;/span&gt; rbx;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;/* arguments: non interrupts/non tracing syscalls only save upto here*/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;unsigned&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;long&lt;/span&gt; r11;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;unsigned&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;long&lt;/span&gt; r10;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;unsigned&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;long&lt;/span&gt; r9;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;unsigned&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;long&lt;/span&gt; r8;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;unsigned&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;long&lt;/span&gt; rax;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;unsigned&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;long&lt;/span&gt; rcx;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;unsigned&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;long&lt;/span&gt; rdx;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;unsigned&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;long&lt;/span&gt; rsi;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;unsigned&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;long&lt;/span&gt; rdi;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;unsigned&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;long&lt;/span&gt; orig_rax;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;/* end of arguments */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;/* cpu exception frame or undefined */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;unsigned&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;long&lt;/span&gt; rip;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;unsigned&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;long&lt;/span&gt; cs;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;unsigned&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;long&lt;/span&gt; eflags;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;unsigned&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;long&lt;/span&gt; rsp;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;unsigned&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;long&lt;/span&gt; ss;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;/* top of stack page */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;stack graph&lt;/p&gt;</description></item><item><title>linux gs and pda</title><link>https://bensyz.github.io/blog/blogs/what_happens_before_do_IRQ/asm_x86_gs_and_pda_in_linux/</link><pubDate>Fri, 17 Apr 2026 10:33:24 +0800</pubDate><guid>https://bensyz.github.io/blog/blogs/what_happens_before_do_IRQ/asm_x86_gs_and_pda_in_linux/</guid><description>&lt;p&gt;换栈的时候&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;cmoveq %gs:pda_irqstackptr,%rsp
&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;cmoveq: Condition MOVe Equal Quadratic (when ZF=1)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;pda: Processor Data Area&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;GS: ?? 段选择寄存器之一，常用于 process data area(pda)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;GS
qemu 中我们可以看到 GS 是&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;GS =0000 ffffffff8052a000 ffffffff 00c00100
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;GS:offset 等同于 offset(%gs) 但&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;%gs:variable_name：常用于访问全局定义的 per-CPU 变量。&lt;/li&gt;
&lt;li&gt;offset(%gs)：在手写汇编或计算特定偏移时更为常见。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;也就是说上面这段 cmoveq 在条件成立时等同于&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;movq pda_irqstackptr(%gs), %rsp
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;linux 中定义了 pda_irqstackptr 宏为 40&lt;/p&gt;
&lt;p&gt;执行完 cmoveq 之后 rsp 确实拿到了地址是 GS+0x28 的内存&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;(gdb) x (0xffffffff8052a000 + 0x28)
0xffffffff8052a028 &amp;lt;boot_cpu_pda+40&amp;gt;: 0xffffffff805c0fc0
(gdb) p $rsp
$54 = (void *) 0xffffffff805c0fc0 &amp;lt;boot_cpu_stack+16320&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;GDB 中查看 GS（0xffffffff8052a000） 地址的内存内容是：&lt;/p&gt;</description></item><item><title>ring and vm</title><link>https://bensyz.github.io/blog/blogs/what_happens_before_do_IRQ/ring_and_vm/</link><pubDate>Wed, 15 Apr 2026 18:09:50 +0800</pubDate><guid>https://bensyz.github.io/blog/blogs/what_happens_before_do_IRQ/ring_and_vm/</guid><description>&lt;ul&gt;
&lt;li&gt;kernel ring 0&lt;/li&gt;
&lt;li&gt;user ring 3&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;

&lt;a href="https://en.wikipedia.org/wiki/X86_virtualization" target="_blank"&gt;https://en.wikipedia.org/wiki/X86_virtualization&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;虚拟化主要需要：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;虚拟机软件改写汇编指令，去除特权级的指令&lt;/li&gt;
&lt;li&gt;隐藏关键的数据结构，例如 page table，使用 segment descriptor&lt;/li&gt;
&lt;li&gt;模拟 IO 设备&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这是一个非常专业的问题。简短的回答是：不会直接受限于“4层环（Rings）”架构，但受限于硬件虚拟化的实现机制。
在传统的 x86 架构中，确实存在 Ring 0 到 Ring 3 四个特权级，但嵌套虚拟化的瓶颈不在于 Ring 的数量，而在于 Root 模式与 Non-root 模式 的切换。&lt;/p&gt;


&lt;h2 id="1-为什么不是受限于-ring-level"&gt;
 1. 为什么不是受限于 Ring Level？
 &lt;a class="anchor" href="#1-%e4%b8%ba%e4%bb%80%e4%b9%88%e4%b8%8d%e6%98%af%e5%8f%97%e9%99%90%e4%ba%8e-ring-level" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;在硬件辅助虚拟化（Intel VT-x 或 AMD-V）引入后，CPU 增加了一个新的维度：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;VMX Root Mode（根模式）：通常由物理机的 Hypervisor（L0）占据。&lt;/li&gt;
&lt;li&gt;VMX Non-root Mode（非根模式）：虚拟机运行在这个模式下。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;在 Non-root 模式内部，依然完整存在 Ring 0 到 Ring 3。 因此，L1 虚拟机里的操作系统运行在它的 Ring 0，应用程序运行在它的 Ring 3。&lt;/p&gt;


&lt;h2 id="2-嵌套的真正限制vmcs-阴影化-vmcs-shadowing"&gt;
 2. 嵌套的真正限制：VMCS 阴影化 (VMCS Shadowing)
 &lt;a class="anchor" href="#2-%e5%b5%8c%e5%a5%97%e7%9a%84%e7%9c%9f%e6%ad%a3%e9%99%90%e5%88%b6vmcs-%e9%98%b4%e5%bd%b1%e5%8c%96-vmcs-shadowing" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;当你运行嵌套虚拟机（L2）时，挑战在于：L1 虚拟机也想进入“Root 模式”来控制 L2。但硬件只有一个物理 Root 模式。&lt;/p&gt;</description></item><item><title>gdt, tss and switch_to</title><link>https://bensyz.github.io/blog/blogs/what_happens_before_do_IRQ/gdt_tss_and_switch_to/</link><pubDate>Wed, 15 Apr 2026 10:56:01 +0800</pubDate><guid>https://bensyz.github.io/blog/blogs/what_happens_before_do_IRQ/gdt_tss_and_switch_to/</guid><description>&lt;p&gt;

&lt;a href="https://www.google.com/search?client=firefox-b-d&amp;amp;q=what&amp;#43;is&amp;#43;global&amp;#43;descriptor&amp;#43;table&amp;amp;fbs=ADc_l-Z6XGGbkKmpylZqg2J7ZOuVNvV7jKtLqzLZ63dd2zPtrsojpaijeJRLrp4clUvcwVJFwPc3SunfhAadIHhnTsFBVMAAXIZgDnZp5KTskh6spmEAN_m5c9Zl7QQ9S1AEoyH9D4lVpv_wnngMRGAxLVYtAQ0lv6yE5rdDK6YSHRfe9mjQavptxK4vEoFd-TzuKbzrFaNFsrKlv_gEfcxDRavrClfR-Q&amp;amp;ved=2ahUKEwjE3dvK0e6TAxWMDTQIHTwEA6cQ0NsOegQIAxAB&amp;amp;aep=10&amp;amp;ntc=1&amp;amp;mstk=AUtExfAFlhqj7TECPIPnuH2Rfbk4_jTcsVwZGnrXQ9YZFv9GR5c-KZ_wyVy-DWVHuX9hT4IQ2lzAZg3ShTFHZBZuWY2p-WtAwgIxKnnqhXdlG6H1C_v5ER_elvkoz1CHvQBOsIiPIdh7sSBcOnkTdVD17hjcuyTEHNDbOeTsxX-zwaH2Q4SbZovJhpuhTiIL-5jUSCaAIAB1PbvY_MlAXYULYnVaIjMImScqxYKO1JSWaL5_c9lI6BfOMii-WVzAKw-8AVYj-nKH9TuUj-Sz5tf11SkF1ebQCvnW4nzJggLa6fM6JhXMjSBdmqqJRcbBQRGHmsH2CmZDtW5kGQ&amp;amp;csuir=1&amp;amp;mtid=5uDeaeS5OYu90PEPi7KBIQ&amp;amp;udm=50" target="_blank"&gt;Gemini talk&lt;/a&gt;
&lt;/p&gt;


&lt;h2 id="tss-的功能"&gt;
 TSS 的功能
 &lt;a class="anchor" href="#tss-%e7%9a%84%e5%8a%9f%e8%83%bd" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;特权级切换与堆栈保存：当处理器从用户态 (Ring 3) 进入内核态 (Ring 0) 时（例如发生中断或系统调用），TSS 提供了内核态所需的堆栈指针 (ESP0/RSP0)。没有它，CPU 将不知道把寄存器压入哪个堆栈，从而导致系统崩溃。&lt;/li&gt;
&lt;li&gt;I/O 权限管理：TSS 包含一个 I/O 许可位图 (I/O Permission Bitmap)，操作系统可以用它来精确控制用户进程可以访问哪些硬件端口。&lt;/li&gt;
&lt;li&gt;中断堆栈表 (IST)：在 64 位模式下，TSS 引入了 IST，允许某些关键中断（如双重错误 Double Fault）使用独立、预定义的已知良好堆栈，确保即使内核堆栈溢出，系统也能处理异常。&lt;/li&gt;
&lt;/ul&gt;


&lt;h2 id="tss-与-gdt-的关系"&gt;
 TSS 与 GDT 的关系
 &lt;a class="anchor" href="#tss-%e4%b8%8e-gdt-%e7%9a%84%e5%85%b3%e7%b3%bb" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;TSS 本身并不是 GDT 的一部分，但它必须在 GDT 中拥有一个描述符 (TSS Descriptor) 才能被使用。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;操作系统在内存中开辟一块空间定义 TSS。
在 GDT 中创建一个描述符，指向该空间的基地址和长度。
通过 LTR (Load Task Register) 指令将 GDT 中的选择子加载到处理器的 TR 寄存器 中，从而激活该 TSS。 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;现代操作系统（如 Linux 或 Windows） 通常不再为每个进程创建单独的 TSS，而是为每个 CPU 核心维护一个全局 TSS。在进程切换时，内核只需动态更新这个全局 TSS 中的堆栈指针即可。&lt;/p&gt;</description></item><item><title>asm AT&amp;T vs intel</title><link>https://bensyz.github.io/blog/blogs/what_happens_before_do_IRQ/asm_x86_at_t_vs_intel/</link><pubDate>Tue, 14 Apr 2026 22:47:49 +0800</pubDate><guid>https://bensyz.github.io/blog/blogs/what_happens_before_do_IRQ/asm_x86_at_t_vs_intel/</guid><description>&lt;p&gt;The primary difference between AT&amp;amp;T and Intel assembly syntax is the operand order. Intel syntax (destination first) is the native format for x86 processors used in Windows and official 

&lt;a href="https://imada.sdu.dk/~kslarsen/dm546/Material/IntelnATT.htm" target="_blank"&gt;Intel manuals&lt;/a&gt;
, while AT&amp;amp;T syntax (source first) is the default for 

&lt;a href="https://stackoverflow.com/questions/972602/limitations-of-intel-assembly-syntax-compared-to-att" target="_blank"&gt;GNU tools&lt;/a&gt;
 like GCC and GDB on Linux/Unix systems. [1, 2, 3]&lt;/p&gt;


&lt;h2 id="key-syntax-differences"&gt;
 Key Syntax Differences
 &lt;a class="anchor" href="#key-syntax-differences" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h2&gt;

&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Feature [2, 4, 5, 6, 7]&lt;/th&gt;
 &lt;th&gt;Intel Syntax&lt;/th&gt;
 &lt;th&gt;AT&amp;amp;T Syntax&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Operand Order&lt;/td&gt;
 &lt;td&gt;Opcode Dest, Src&lt;/td&gt;
 &lt;td&gt;Opcode Src, Dest&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Register Prefix&lt;/td&gt;
 &lt;td&gt;None (e.g., eax)&lt;/td&gt;
 &lt;td&gt;% (e.g., %eax)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Immediate Value&lt;/td&gt;
 &lt;td&gt;None (e.g., 5)&lt;/td&gt;
 &lt;td&gt;$ (e.g., $5)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Size Suffixes&lt;/td&gt;
 &lt;td&gt;Explicit specifiers (dword ptr)&lt;/td&gt;
 &lt;td&gt;Suffixes on mnemonics (movl)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Memory Access&lt;/td&gt;
 &lt;td&gt;[base + index*scale + disp]&lt;/td&gt;
 &lt;td&gt;disp(base, index, scale)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;


&lt;h2 id="detailed-breakdown"&gt;
 Detailed Breakdown
 &lt;a class="anchor" href="#detailed-breakdown" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Operand Direction: In Intel syntax, mov eax, 1 means &amp;ldquo;move 1 into eax&amp;rdquo; (reads like a variable assignment: eax = 1). In AT&amp;amp;T syntax, movl $1, %eax means &amp;ldquo;move 1 into eax&amp;rdquo; (reads like a function call or English sentence: &amp;ldquo;move 1 to eax&amp;rdquo;).&lt;/li&gt;
&lt;li&gt;Memory Addressing: Intel uses a mathematical expression inside brackets, which many find more intuitive. AT&amp;amp;T uses a comma-separated format where the displacement is outside the parentheses, e.g., 8(%ebp, %ecx, 4).&lt;/li&gt;
&lt;li&gt;Instruction Suffixes: AT&amp;amp;T uses a letter at the end of the instruction to denote data size: b (byte), w (word), l (long/32-bit), and q (quad/64-bit). Intel handles this with prefixes like byte ptr or qword ptr when the size is not clear from the registers. [2, 8, 9, 10, 11, 12]&lt;/li&gt;
&lt;/ul&gt;


&lt;h2 id="which-one-should-you-use"&gt;
 Which One Should You Use?
 &lt;a class="anchor" href="#which-one-should-you-use" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Use Intel if you are developing for Windows (MASM/NASM), doing reverse engineering (IDA Pro/Ghidra default to Intel), or following official 

&lt;a href="https://www.reddit.com/r/osdev/comments/sz65bk/intel_or_att_syntax_assembly_for_x86_64/" target="_blank"&gt;Intel/AMD documentation&lt;/a&gt;
.&lt;/li&gt;
&lt;li&gt;Use 

&lt;a href="https://www.att.com/" target="_blank"&gt;AT&amp;amp;T&lt;/a&gt;
 if you are writing inline assembly for 

&lt;a href="https://marcelofern.com/posts/asm/att-vs-intel-syntax/index.html" target="_blank"&gt;GCC or Clang&lt;/a&gt;
 or working extensively in the Linux kernel where it is the established standard. [1, 8, 13, 14]&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Note: Most modern tools allow you to switch. For example, in GDB, you can use set disassembly-flavor intel to see Intel syntax instead of the default AT&amp;amp;T. [8]
Are you working on a specific project, like a Linux driver or a Windows application, that requires one of these?&lt;/p&gt;</description></item><item><title>charset, encoding and locale</title><link>https://bensyz.github.io/blog/blogs/charset_encoding_and_locale/</link><pubDate>Sat, 07 Mar 2026 18:03:16 +0800</pubDate><guid>https://bensyz.github.io/blog/blogs/charset_encoding_and_locale/</guid><description>&lt;h2 id="introduction"&gt;
 Introduction
 &lt;a class="anchor" href="#introduction" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;最近遇到了好几次编码的问题，命令行用 &lt;code&gt;printf&lt;/code&gt; 打印 16 进制，top 内存越界，然后正好有时间，就将这块知识了解了一下。&lt;/p&gt;
&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;


&lt;h2 id="tldr"&gt;
 TL;DR;
 &lt;a class="anchor" href="#tldr" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Unicode 前，人类字符存于计算机只有一次编码：&lt;/p&gt;
&lt;div class="mermaid"&gt;
 graph LR
A[人类字符] --&gt; B[存于计算机的字节]
&lt;/div&gt;

&lt;p&gt;Unicode 后，人类字符存于计算机有两次编码：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;人工将人类字符编码成 Unicode，在计算机中就用 Unicode 就代表人类字符。&lt;/li&gt;
&lt;li&gt;代表人类字符的 Unicode 存于计算机时，需要编码成其他字节流。&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="mermaid"&gt;
 graph LR
A[人类字符] &lt;--&gt; B[Unicode] --&gt; C[存于计算机的字节]
&lt;/div&gt;

&lt;p&gt;Unicode 是计算机可以描述人类字符的全集。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;字符集：
&lt;ul&gt;
&lt;li&gt;Unicode 前：等同于编码&lt;/li&gt;
&lt;li&gt;Unicode 后：Unicode UCS-4 的子集，选用其中的部分字符作为字符集&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;编码：Unicode 字符编号如何实际存储&lt;/li&gt;
&lt;li&gt;字体：Unicode 编号对应的字形&lt;/li&gt;
&lt;/ul&gt;


&lt;h2 id="编码和字符集"&gt;
 编码和字符集
 &lt;a class="anchor" href="#%e7%bc%96%e7%a0%81%e5%92%8c%e5%ad%97%e7%ac%a6%e9%9b%86" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h2&gt;

&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>https://bensyz.github.io/blog/blogs/NVIDIA_GPU_components_version_selection/</link><pubDate>Tue, 02 Sep 2025 16:17:32 +0800</pubDate><guid>https://bensyz.github.io/blog/blogs/NVIDIA_GPU_components_version_selection/</guid><description>&lt;p&gt;[toc]&lt;/p&gt;


&lt;h2 id="big-picture"&gt;
 Big Picture
 &lt;a class="anchor" href="#big-picture" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h2&gt;

&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Components Level&lt;/th&gt;
 &lt;th&gt;Examples&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;PyTorch&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;import torch&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;CUDA Toolkit&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;nvcc&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;CUDA driver&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;libcuda.so&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;device driver&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;nvidia.ko&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;GPU hardware&lt;/td&gt;
 &lt;td&gt;Architecture and Compute Capability&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;各个层之间以 ABI 对接&lt;/p&gt;
&lt;p&gt;&lt;img src="./figures/CUDA-components.png" alt="CUDA-components (by NVIDIA)"&gt;&lt;/p&gt;


&lt;h2 id="gpu-hardware-and-compute-capabilitycc"&gt;
 GPU hardware and Compute Capability(CC)
 &lt;a class="anchor" href="#gpu-hardware-and-compute-capabilitycc" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Compute Capability (CC) defines the hardware features and supported
instructions for each NVIDIA GPU architecture.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Compute Capability 其实就是指令集，可能高等级的指令集比低等级的指令更多。硬件定下来了，指令集也就定下来了。&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Compute Capability Major Revision Number&lt;/th&gt;
 &lt;th&gt;NVIDIA GPU Architecture&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;12&lt;/td&gt;
 &lt;td&gt;NVIDIA Blackwell GPU Architecture&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;11&lt;/td&gt;
 &lt;td&gt;NVIDIA Blackwell GPU Architecture&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;10&lt;/td&gt;
 &lt;td&gt;NVIDIA Blackwell GPU Architecture&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;9&lt;/td&gt;
 &lt;td&gt;NVIDIA Hopper GPU Architecture&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;8&lt;/td&gt;
 &lt;td&gt;NVIDIA Ampere GPU Architecture&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;7&lt;/td&gt;
 &lt;td&gt;NVIDIA Volta GPU Architecture&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;6&lt;/td&gt;
 &lt;td&gt;NVIDIA Pascal GPU Architecture&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;5&lt;/td&gt;
 &lt;td&gt;NVIDIA Maxwell GPU Architecture&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;3&lt;/td&gt;
 &lt;td&gt;NVIDIA Kepler GPU Architecture&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Compute Capability&lt;/th&gt;
 &lt;th&gt;NVIDIA GPU Architecture&lt;/th&gt;
 &lt;th&gt;Based On&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;7.5&lt;/td&gt;
 &lt;td&gt;NVIDIA Turing GPU Architecture&lt;/td&gt;
 &lt;td&gt;NVIDIA Volta GPU Architecture&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;8.9&lt;/td&gt;
 &lt;td&gt;NVIDIA Ada GPU Architecture&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;Compared to Ampere, Ada delivers more than double the FP16, BF16, TF32, INT8, and INT4 Tensor TFLOPS, and
also includes the Hopper FP8 Transformer Engine, delivering over 1.45 PetaFLOPS of tensor processing in the
RTX 6000 Ada Generation.&lt;/p&gt;</description></item><item><title>file descriptor and fd redirection in bash</title><link>https://bensyz.github.io/blog/blogs/file_descriptor_and_fd_redirection_in_shell/</link><pubDate>Fri, 18 Jul 2025 16:18:39 +0800</pubDate><guid>https://bensyz.github.io/blog/blogs/file_descriptor_and_fd_redirection_in_shell/</guid><description>&lt;h2 id="文件描述符"&gt;
 文件描述符
 &lt;a class="anchor" href="#%e6%96%87%e4%bb%b6%e6%8f%8f%e8%bf%b0%e7%ac%a6" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h2&gt;

&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;
&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;


&lt;h2 id="标准输入标准输出和错误输出"&gt;
 标准输入、标准输出和错误输出
 &lt;a class="anchor" href="#%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" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;在 Linux 中有三个较为特殊的文件描述符，它们是&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;标准输入（stdin）：&lt;code&gt;fd=0&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;标准输出（stdout）：&lt;code&gt;fd=1&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;标准错误输出（stderr）：&lt;code&gt;fd=2&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;我们在用 &lt;code&gt;fprintf&lt;/code&gt; 的时候会用到他们，因为对应用程序来说，往屏幕上输出东西，也非它所能做的，也需要操作系统这个代理来实现。因为他们太基础了，所以默认这三个是开给所有的进程的。&lt;/p&gt;


&lt;h2 id="bash-中的-fd"&gt;
 bash 中的 fd
 &lt;a class="anchor" href="#bash-%e4%b8%ad%e7%9a%84-fd" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;man bash 中 REDIRECTION 节有详细的介绍&lt;/p&gt;
&lt;ul&gt;
&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;
&lt;/ul&gt;


&lt;h3 id="fd-的表示"&gt;
 fd 的表示
 &lt;a class="anchor" href="#fd-%e7%9a%84%e8%a1%a8%e7%a4%ba" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;输入：&lt;code&gt;[fd]&amp;lt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;输出：&lt;code&gt;[fd]&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;h3 id="fd-的新建"&gt;
 fd 的新建
 &lt;a class="anchor" href="#fd-%e7%9a%84%e6%96%b0%e5%bb%ba" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h3&gt;



&lt;h4 id="输入"&gt;
 输入
 &lt;a class="anchor" href="#%e8%be%93%e5%85%a5" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h4&gt;

&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>https://bensyz.github.io/blog/blogs/gerrit_replication/</link><pubDate>Tue, 27 May 2025 16:02:47 +0800</pubDate><guid>https://bensyz.github.io/blog/blogs/gerrit_replication/</guid><description>&lt;p&gt;[toc]&lt;/p&gt;


&lt;h2 id="introduction"&gt;
 Introduction
 &lt;a class="anchor" href="#introduction" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;

&lt;a href="https://gerrit.googlesource.com/plugins/replication/&amp;#43;doc/master/src/main/resources/Documentation/config.md" target="_blank"&gt;Gerrit 官方文档&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;&lt;code&gt;replication&lt;/code&gt; 是 Gerrit 提供的插件：当“主服务器”中的相关仓库更新时，会自动同步到“从服务器”，因而可以实现备份，只允许单向流动。它的实现是：用本地的 Unix 帐号，通过 git 向其他服务器 push “本地 Gerrit 工作目录下 git 子目录下的目录仓库”。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;注意&lt;/strong&gt;：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;replication&lt;/code&gt; 的执行和 Gerrit 软件提供的 git 账户没有关系：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;master 端：它不是用 Gerrit 内部的用户来推送到远端的，而是用“启动 Gerrit 软件的 &lt;strong&gt;本地帐号&lt;/strong&gt; ”&lt;/li&gt;
&lt;li&gt;slave 端：接收不是走 Gerrit 开放的 ssh 端口。而是走“本地账户”的 ssh 端口（不全对，可以参考 replication 后记）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;由于我希望 slave 端接收到从 master 传过来的 git 后，亦能提供 clone fetch 等只读的服务。而这些服务是受限的，权限信息都在 All-Projects.git, All-Users.git 这两个仓库下，最简单的办法就是 slave 端也用 Gerrit 来发布，以避免权限转化和不统一。同时我还要配置 slave 端设成只读。&lt;/p&gt;


&lt;h2 id="配置"&gt;
 配置
 &lt;a class="anchor" href="#%e9%85%8d%e7%bd%ae" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h2&gt;



&lt;h3 id="启动两个-docker"&gt;
 启动两个 docker
 &lt;a class="anchor" href="#%e5%90%af%e5%8a%a8%e4%b8%a4%e4%b8%aa-docker" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;启动两个 docker&lt;/p&gt;</description></item><item><title>install NVIDIA supported docker</title><link>https://bensyz.github.io/blog/blogs/install_nvidia_docker/</link><pubDate>Mon, 28 Apr 2025 11:50:29 +0800</pubDate><guid>https://bensyz.github.io/blog/blogs/install_nvidia_docker/</guid><description>&lt;h2 id="docker"&gt;
 docker
 &lt;a class="anchor" href="#docker" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;

&lt;a href="https://docs.docker.com/engine/install/ubuntu/" target="_blank"&gt;official doc&lt;/a&gt;
&lt;/p&gt;


&lt;h3 id="装"&gt;
 装
 &lt;a class="anchor" href="#%e8%a3%85" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h3&gt;

&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 拷自 official doc&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Add Docker&amp;#39;s official GPG key:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt-get update
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt-get install ca-certificates curl
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo install -m &lt;span style="color:#ae81ff"&gt;0755&lt;/span&gt; -d /etc/apt/keyrings
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo chmod a+r /etc/apt/keyrings/docker.asc
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Add the repository to Apt sources:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;echo &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;deb [arch=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;dpkg --print-architecture&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&lt;span style="color:#e6db74"&gt; signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; &lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;. /etc/os-release &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; echo &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;UBUNTU_CODENAME&lt;span style="color:#66d9ef"&gt;:-&lt;/span&gt;$VERSION_CODENAME&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&lt;span style="color:#e6db74"&gt; stable&amp;#34;&lt;/span&gt; | &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; sudo tee /etc/apt/sources.list.d/docker.list &amp;gt; /dev/null
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt-get update
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3 id="配"&gt;
 配
 &lt;a class="anchor" href="#%e9%85%8d" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h3&gt;



&lt;h4 id="user-add-to-docker-group"&gt;
 user add to docker group
 &lt;a class="anchor" href="#user-add-to-docker-group" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h4&gt;

&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;useradd -a -G docker &amp;lt;username&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;重登&lt;/p&gt;</description></item><item><title>Euler–Lagrange equation</title><link>https://bensyz.github.io/blog/blogs/Euler_Lagrange_equation/</link><pubDate>Tue, 25 Mar 2025 08:14:16 +0800</pubDate><guid>https://bensyz.github.io/blog/blogs/Euler_Lagrange_equation/</guid><description>&lt;h2 id="最速降线"&gt;
 最速降线
 &lt;a class="anchor" href="#%e6%9c%80%e9%80%9f%e9%99%8d%e7%ba%bf" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;以最速降线为例：一个小球从 $A$ 点$(x_1, y_1)$ 移动到 $B$ 点 $(x_2, y_2)$，它耗时最少的路径是怎么样的？不妨设 $(x_1,y_1)$ 为 $(0,0)$ 点，记为 A 点，&lt;/p&gt;
&lt;p&gt;首先，我们求当小球位于 $(x,y)$ 时，它的位移微分：&lt;/p&gt;
$$
ds = \sqrt{(dx)^2+(dy)^2}
$$&lt;p&gt;其次，我们求当小球位于 $(x,y)$ 时，它的速度：&lt;/p&gt;
$$
\frac{1}{2} mv^2 = mg \delta h
$$$$
v = \sqrt{2gh} = \sqrt{2g(y-y_1)} = \sqrt{2gy}
$$&lt;p&gt;所以，我们求当小球位于 $(x,y)$ 时，走过 &lt;code&gt;ds&lt;/code&gt; 所需的时间：&lt;/p&gt;
$$
dt = \frac{ds}{v} = \frac{\sqrt{(dx)^2+(dy)^2}}{\sqrt{2gy}}
$$&lt;p&gt;提取出分子里的 $dx$ 可得：&lt;/p&gt;
$$
dt = \frac{\sqrt{1+(\frac{dy}{dx})^2}}{\sqrt{2gy}} dx
$$&lt;p&gt;通常，我们记 $\frac{dy}{dx} = y'$，所以：&lt;/p&gt;
$$
dt = \frac{\sqrt{1+(y')^2}}{\sqrt{2gy}} dx
$$&lt;p&gt;所以，从 $A$ 点到 $B$ 点的总耗时是：&lt;/p&gt;</description></item><item><title>为 Open Harmony 编译 Application</title><link>https://bensyz.github.io/blog/blogs/dev_eco_studio_build_for_ohos/</link><pubDate>Wed, 12 Mar 2025 08:16:32 +0800</pubDate><guid>https://bensyz.github.io/blog/blogs/dev_eco_studio_build_for_ohos/</guid><description>&lt;h2 id="introduction"&gt;
 Introduction
 &lt;a class="anchor" href="#introduction" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;我下载了 OpenHarmony-4.1.2 的 SDK，然后编译了 Hihope/dayu210，并把把生成的镜像烧录到了我们的板子上，板子启动后，现在准备开发上层应用，但是 DevEco Studio 提供的 demo 直接跑不起来，需要做些改动。&lt;/p&gt;
&lt;p&gt;

&lt;a href="https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/ide-project-V5" target="_blank"&gt;这是华为官方的文档&lt;/a&gt;
。&lt;/p&gt;


&lt;h3 id="environments"&gt;
 environments
 &lt;a class="anchor" href="#environments" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;DevEco Studio: Build Version: 5.0.7.210, built on February 11, 2025&lt;/li&gt;
&lt;li&gt;Soc: rk3588&lt;/li&gt;
&lt;li&gt;Board: Custom Board&lt;/li&gt;
&lt;li&gt;System SDK Version: 4.1.2&lt;/li&gt;
&lt;/ul&gt;


&lt;h2 id="将-demo-跑起来的详细步骤"&gt;
 将 Demo 跑起来的详细步骤
 &lt;a class="anchor" href="#%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" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h2&gt;



&lt;h3 id="创建工程"&gt;
 创建工程
 &lt;a class="anchor" href="#%e5%88%9b%e5%bb%ba%e5%b7%a5%e7%a8%8b" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;img src="./figures/create_project.png" alt="create_project"&gt;&lt;/p&gt;
&lt;p&gt;因为我们的 OpenHarmony-4.1.2 的 Sdk version 是 11，所以这边我们选择 11&lt;/p&gt;
&lt;p&gt;&lt;img src="./figures/create_project_conf_proj.png" alt="config project"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="./figures/create_project_empty_ability.png" alt="select empty ability"&gt;&lt;/p&gt;
&lt;p&gt;(Native C++) 是一样的配置，只是需要多加一个配置，参考

&lt;a href="#%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"&gt;配置 &lt;code&gt;abiFilters&lt;/code&gt; (选的工程是 Native C++ 时)&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;重新创建的路径在：&lt;/p&gt;</description></item><item><title>7zr CPU 性能测试结果解析</title><link>https://bensyz.github.io/blog/blogs/7zr_CPU_benchmark_result_parse/</link><pubDate>Wed, 30 Oct 2024 10:07:54 +0800</pubDate><guid>https://bensyz.github.io/blog/blogs/7zr_CPU_benchmark_result_parse/</guid><description>&lt;h2 id="tldr"&gt;
 TL;DR
 &lt;a class="anchor" href="#tldr" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Speed(KiB/s) = 解压大小(B) * 重复次数(#)/time(s) /1024(B/KiB)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;usage(%) ≈ 程序占用 CPU 时间/程序开始到现在为止总耗时*100%&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;R/U(MIPS) ≈ 产生的指令数(MI)/占用 CPU 的时间&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Rating(MIPS) ≈ 产生的指令数(MI)/程序耗时(s)&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;7zr b -mmt1&lt;/code&gt;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt; Compressing | Decompressing
Dict Speed Usage R/U Rating | Speed Usage R/U Rating
 KiB/s % MIPS MIPS | KiB/s % MIPS MIPS

22: 4515 100 4403 4393 | 51373 100 4395 4386
23: 3883 100 3966 3956 | 50676 100 4395 4387
24: 3724 100 4014 4004 | 48750 100 4292 4280
25: 3520 100 4032 4020 | 48064 100 4293 4278
---------------------------------- | ------------------------------
Avr: 100 4104 4093 | 100 4344 4333
Tot: 100 4224 4213
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="speed"&gt;
 Speed
 &lt;a class="anchor" href="#speed" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;这段打印在&lt;/p&gt;</description></item><item><title>Introduction to precompiled headers(PCH)</title><link>https://bensyz.github.io/blog/blogs/PCH/</link><pubDate>Tue, 08 Oct 2024 12:04:22 +0800</pubDate><guid>https://bensyz.github.io/blog/blogs/PCH/</guid><description>&lt;h2 id="introduction"&gt;
 Introduction
 &lt;a class="anchor" href="#introduction" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;在讲预编译头文件 PCH 的之前，我们简单回顾一下编译的流程，编译大致有以下几个步骤：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;预处理：将源代码中的宏、头文件等展开&lt;/li&gt;
&lt;li&gt;编译：将源代码转成汇编代码&lt;/li&gt;
&lt;li&gt;汇编：将汇编代码转成 object 文件&lt;/li&gt;
&lt;li&gt;链接：生成可执行文件&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;如果有一个头文件，内容特别多，而且在好多源代码中都被引入了，那是不是会导致：每一个源代码文件在编译的时候都要展开一大段，然后在编译每一个源代码文件的时候都要重新编译这一大段，最终导致许多重复展开重复编译。那么我们是否可以将这种重复动作优化一下呢？让他只做一次，然后下次谁要用，就直接去取就完了？这就是“预编译头文件（precompiled header, PCH）” 最初的想法。&lt;/p&gt;


&lt;h2 id="what-is-pch"&gt;
 What is PCH?
 &lt;a class="anchor" href="#what-is-pch" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;这是 

&lt;a href="https://zh.wikipedia.org/zh-cn/%e9%a2%84%e7%bc%96%e8%af%91%e5%a4%b4" target="_blank"&gt;Wikipedia 上对 PCH 的介绍&lt;/a&gt;
:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;预编译头（precompiled header）是程序设计时把头文件编译为中间格式（如目标文件），以节约在开发过程中编译器反复编译该头文件的开销。 C 语言、C++语言、Objective C 语言等都有类似的技术。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;那这个中间格式实际又是什么呢？我们在下节 “如何生成 PCH 文件” 中会来实际看看它是什么文件。&lt;/p&gt;


&lt;h2 id="如何生成-pch-文件"&gt;
 如何生成 PCH 文件？
 &lt;a class="anchor" href="#%e5%a6%82%e4%bd%95%e7%94%9f%e6%88%90-pch-%e6%96%87%e4%bb%b6" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;非常简单，和编译普通的源文件一样，只需对头文件做编译即可：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;gcc blah.h
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Tips:&lt;/p&gt;
&lt;ul&gt;
&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;
&lt;/ul&gt;
&lt;p&gt;我们会发现，经过上一条命令的执行，我们得到了 &lt;code&gt;blah.h.gch&lt;/code&gt; 让我们来看看这个文件是什么：&lt;/p&gt;</description></item><item><title>PCIe 和 lspci</title><link>https://bensyz.github.io/blog/blogs/PCIe_and_lspci/</link><pubDate>Wed, 08 May 2024 08:06:33 +0800</pubDate><guid>https://bensyz.github.io/blog/blogs/PCIe_and_lspci/</guid><description>&lt;h2 id="pcie-基础介绍"&gt;
 PCIe 基础介绍
 &lt;a class="anchor" href="#pcie-%e5%9f%ba%e7%a1%80%e4%bb%8b%e7%bb%8d" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Wikipedia 上对 

&lt;a href="https://zh.wikipedia.org/wiki/PCI_Express" target="_blank"&gt;PCI_Express&lt;/a&gt;
 的介绍
如下：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Peripheral Component Interconnect Express，简称 PCI-E，官方简称 PCIe，是计算机总线的一个重要分支，它沿用既有的 PCI 编程概念及信号标准，并且构建了更加高速的串行通信系统标准。目前这一标准由 PCI-SIG 组织制定和维护。PCIe 仅应用于内部互连。由于 PCIe 是基于既有的 PCI 系统，所以只需修改物理层而无须修改软件就可将现有 PCI 系统转换为 PCIe。&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h3 id="版本传输通道数和速率"&gt;
 版本、传输通道数和速率
 &lt;a class="anchor" href="#%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" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;我们在买固态硬盘和显卡的时候，经常需要确定 PCIe 的 &lt;strong&gt;版本&lt;/strong&gt; 和 &lt;strong&gt;通道数(x几)&lt;/strong&gt;，那这两个和速率有什么关系？&lt;/p&gt;
&lt;p&gt;首先，什么是 PCIe 的版本和通道数：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;版本：无疑就是 PCIe 技术迭代之后，速率有了极大地提升。例如：&lt;code&gt;PCIe 3.0&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;通道数：lane 数，一条 lane 对应两组“差分信号对”，一组差分信号对用于传输 TX，另一组用于传输 RX。由于 PCIe 是串行传输，多条 lane 的数据传输是由 PCIe 上层应用来自行做 IO 多路复用的。例如：&lt;code&gt;x4&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;其次，上边两个参数和速率有什么关系？同一版本，通道数每增一个速率就翻倍。版本每增一个，速率几乎翻倍（除了 PCIe 1.0 到 PCIe 2.0）&lt;/p&gt;
&lt;p&gt;不同版本对应的速率关系：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Version&lt;/th&gt;
 &lt;th&gt;Transfer rate per lane(GT/s)&lt;/th&gt;
 &lt;th&gt;Line code&lt;/th&gt;
 &lt;th&gt;Throughput for &lt;code&gt;x1&lt;/code&gt;&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;1.0&lt;/td&gt;
 &lt;td&gt;2.5&lt;/td&gt;
 &lt;td&gt;8b/10b&lt;/td&gt;
 &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;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;2.0&lt;/td&gt;
 &lt;td&gt;5.0&lt;/td&gt;
 &lt;td&gt;8b/10b&lt;/td&gt;
 &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;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;3.0&lt;/td&gt;
 &lt;td&gt;8.0&lt;/td&gt;
 &lt;td&gt;128b/130b&lt;/td&gt;
 &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;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;4.0&lt;/td&gt;
 &lt;td&gt;16.0&lt;/td&gt;
 &lt;td&gt;128b/130b&lt;/td&gt;
 &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;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;5.0&lt;/td&gt;
 &lt;td&gt;32.0&lt;/td&gt;
 &lt;td&gt;128b/130b&lt;/td&gt;
 &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;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;Tips:
&lt;ul&gt;
&lt;li&gt;1 GT/s 表示每秒有 1*10^9 次传输，一次传输传输 1 个bit&lt;/li&gt;
&lt;li&gt;为了避免多个低信号连续传输无法被区分，我们使用 8b/10b 等 Line code 来编码。所以实际传输速率的计算，如最后一列所写：&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&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>https://bensyz.github.io/blog/blogs/rk_jetson_sdk_full_work_on_archlinux/</link><pubDate>Mon, 15 Jan 2024 06:47:39 +0800</pubDate><guid>https://bensyz.github.io/blog/blogs/rk_jetson_sdk_full_work_on_archlinux/</guid><description>&lt;h2 id="tldr"&gt;
 tl;dr
 &lt;a class="anchor" href="#tldr" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;遇到的几个问题，和解决措施：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Platform&lt;/th&gt;
 &lt;th&gt;Problem&lt;/th&gt;
 &lt;th&gt;Solution&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;RK&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;mknod failed&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;remount docker volume with &lt;code&gt;nodev,noexec&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;del&gt;Jetson&lt;/del&gt;&lt;/td&gt;
 &lt;td&gt;&lt;del&gt;&lt;code&gt;showmount -e&lt;/code&gt; oom&lt;/del&gt;&lt;/td&gt;
 &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;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;RK Jetson&lt;/td&gt;
 &lt;td&gt;RK Maskrom and jetson burn failed&lt;/td&gt;
 &lt;td&gt;disable usbcore autosuspend, &lt;code&gt;echo -1 &amp;gt; /sys/module/usbcore/parameters/autosuspend&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Jetson&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;Error: ipv6: address already assigned.&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;no &lt;code&gt;ping6&lt;/code&gt; command, add a ping6 in PATH&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;del&gt;Jetson&lt;/del&gt;&lt;/td&gt;
 &lt;td&gt;&lt;del&gt;&lt;code&gt;mount.nfs: Connection timed out&lt;/code&gt;&lt;/del&gt;&lt;/td&gt;
 &lt;td&gt;&lt;del&gt;systemctl restart nfs-server&lt;/del&gt; 看起来是我错误地添加 sudo 导致的，后面没再复现。&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Jetson&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;failed to flash&lt;/code&gt; (something like this)&lt;/td&gt;
 &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;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;RK&lt;/td&gt;
 &lt;td&gt;uboot make menuconfig failed&lt;/td&gt;
 &lt;td&gt;add &lt;code&gt;cc -&amp;gt; gcc-7&lt;/code&gt; to PATH&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;RK&lt;/td&gt;
 &lt;td&gt;native &lt;code&gt;cp2102&lt;/code&gt; driver does not support 1500000&lt;/td&gt;
 &lt;td&gt;Use 

&lt;a href="https://aur.archlinux.org/packages/cp210x-overclock-dkms" target="_blank"&gt;AUR cp210x-overclock-dkms&lt;/a&gt;
&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;由于 docker 中 nfs 有问题（包括 service restart nfs），所以目前我没有使用 docker&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;其他一些 Ubuntu 和 Arch 兼容性的问题：&lt;/p&gt;</description></item><item><title>file、magic number 和 Debian 中 file 的跨大版本更新</title><link>https://bensyz.github.io/blog/blogs/file_magic-number_debian-build-deb/</link><pubDate>Tue, 28 Nov 2023 12:06:47 +0800</pubDate><guid>https://bensyz.github.io/blog/blogs/file_magic-number_debian-build-deb/</guid><description>&lt;h2 id="introduction"&gt;
 Introduction
 &lt;a class="anchor" href="#introduction" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;故事会，哈哈，可以跳过，简单来说就是 &lt;code&gt;feh&lt;/code&gt; 没有认出一种 &lt;code&gt;bmp&lt;/code&gt; 的格式。&lt;/p&gt;
&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;
&lt;pre tabindex="0"&gt;&lt;code class="language-log" data-lang="log"&gt;feh WARNING: T002-001.bmp - Does not look like an image (magic bytes missing)
feh: No loadable images specified.
See &amp;#39;feh --help&amp;#39; or &amp;#39;man feh&amp;#39; for detailed usage information
&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>https://bensyz.github.io/blog/blogs/rk3588_PCIe_intro/</link><pubDate>Thu, 23 Nov 2023 10:51:55 +0800</pubDate><guid>https://bensyz.github.io/blog/blogs/rk3588_PCIe_intro/</guid><description>&lt;h2 id="intro"&gt;
 Intro
 &lt;a class="anchor" href="#intro" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;起因是发现启动的时候 PCIe 有关于 &lt;code&gt;fe160000&lt;/code&gt; 的报错信息:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-dmesg" data-lang="dmesg"&gt;[ 1.712561] rk-pcie fe160000.pcie: invalid prsnt-gpios property in node
[ 1.728638] rk-pcie fe160000.pcie: IRQ msi not found
[ 1.728645] rk-pcie fe160000.pcie: use outband MSI support
[ 1.728647] rk-pcie fe160000.pcie: Missing *config* reg space
[ 1.728660] rk-pcie fe160000.pcie: host bridge /pcie@fe160000 ranges:
[ 1.728670] rk-pcie fe160000.pcie: err 0x00f1000000..0x00f10fffff -&amp;gt; 0x00f1000000
[ 1.728677] rk-pcie fe160000.pcie: IO 0x00f1100000..0x00f11fffff -&amp;gt; 0x00f1100000
[ 1.728686] rk-pcie fe160000.pcie: MEM 0x00f1200000..0x00f1ffffff -&amp;gt; 0x00f1200000
[ 1.728691] rk-pcie fe160000.pcie: MEM 0x0940000000..0x097fffffff -&amp;gt; 0x0940000000
[ 1.728712] rk-pcie fe160000.pcie: Missing *config* reg space
[ 1.728739] rk-pcie fe160000.pcie: invalid resource
[ 1.934114] rk-pcie fe160000.pcie: PCIe Linking... LTSSM is 0x0
[ 1.959670] rk-pcie fe160000.pcie: PCIe Linking... LTSSM is 0x1
[ 1.986337] rk-pcie fe160000.pcie: PCIe Linking... LTSSM is 0x0
[ 2.013002] rk-pcie fe160000.pcie: PCIe Linking... LTSSM is 0x0
[ 2.043004] rk-pcie fe160000.pcie: PCIe Linking... LTSSM is 0x0
[ 2.069669] rk-pcie fe160000.pcie: PCIe Linking... LTSSM is 0x0
[ 4.629670] rk-pcie fe160000.pcie: PCIe Link Fail
[ 4.629679] rk-pcie fe160000.pcie: failed to initialize host
&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>https://bensyz.github.io/blog/blogs/about_rk3588_disk_partitions_and_fdisk_dd/</link><pubDate>Wed, 16 Aug 2023 09:28:51 +0800</pubDate><guid>https://bensyz.github.io/blog/blogs/about_rk3588_disk_partitions_and_fdisk_dd/</guid><description>&lt;p&gt;推荐文档：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Rockchip_Developer_Guide_UBoot_Nextdev_CN.pdf&lt;/code&gt;&lt;/p&gt;
&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;
&lt;p&gt;&lt;img src="./figures/rk_burn_window.png" alt="rk_burn_window"&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-console" data-lang="console"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ lsblk
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mmcblk0 179:0 0 14.6G 0 disk
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├─mmcblk0p1 179:1 0 4M 0 part
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├─mmcblk0p2 179:2 0 4M 0 part
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├─mmcblk0p3 179:3 0 64M 0 part
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├─mmcblk0p4 179:4 0 128M 0 part
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├─mmcblk0p5 179:5 0 32M 0 part
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├─mmcblk0p6 179:6 0 14G 0 part /
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├─mmcblk0p7 179:7 0 128M 0 part /oem
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;└─mmcblk0p8 179:8 0 206M 0 part /userdata
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mmcblk0boot0 179:32 0 4M 1 disk
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mmcblk0boot1 179:64 0 4M 1 disk
&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>GPIO 通过光耦转换成带源 IO</title><link>https://bensyz.github.io/blog/blogs/io_with_plc/</link><pubDate>Tue, 11 Jul 2023 09:33:47 +0800</pubDate><guid>https://bensyz.github.io/blog/blogs/io_with_plc/</guid><description>&lt;p&gt;2023-08-17 update: summary 中添加开关状态&lt;/p&gt;


&lt;h1 id="intro"&gt;
 Intro
 &lt;a class="anchor" href="#intro" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h1&gt;

&lt;p&gt;在阅读之前有一点需要注意的是，我们的输出、输入，和 PLC 的输出、输入不一样，PLC 的输出和输入是带着电源的，我们的不带电源。这点对输入很好理解，但是对于输出，不能理解成我们输出电压，我们的输出只是一个开关。&lt;/p&gt;


&lt;h2 id="input"&gt;
 Input
 &lt;a class="anchor" href="#input" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;img src="./figures/input.png" alt="input"&gt;&lt;/p&gt;


&lt;h3 id="一些标记"&gt;
 一些标记
 &lt;a class="anchor" href="#%e4%b8%80%e4%ba%9b%e6%a0%87%e8%ae%b0" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;左侧&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;OP_IN0&lt;/code&gt;：外部看到的 &lt;code&gt;IN0&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;COMIN1&lt;/code&gt;：外部看到的 IN 口的 &lt;code&gt;COM&lt;/code&gt; 口&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;右侧&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;⏚ ：地 GND&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GPIO1_C0_Z&lt;/code&gt;：连到上级芯片（主芯片）。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;中间&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;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;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="./figures/PS2805.png" alt="PS2805"&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;h3 id="右内侧电路"&gt;
 右（内）侧电路
 &lt;a class="anchor" href="#%e5%8f%b3%e5%86%85%e4%be%a7%e7%94%b5%e8%b7%af" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;先说简单的：&lt;/p&gt;
&lt;ul&gt;
&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;
&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;
&lt;/ul&gt;


&lt;h3 id="左外侧电路"&gt;
 左（外）侧电路
 &lt;a class="anchor" href="#%e5%b7%a6%e5%a4%96%e4%be%a7%e7%94%b5%e8%b7%af" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;COMIN1&lt;/code&gt; 高电平
&lt;ul&gt;
&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;
&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;
&lt;/ul&gt;
&lt;/li&gt;
&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; 之间有电压差，中间的光耦工作
&lt;ul&gt;
&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;
&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;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;h3 id="整体电路"&gt;
 整体电路
 &lt;a class="anchor" href="#%e6%95%b4%e4%bd%93%e7%94%b5%e8%b7%af" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;定义：&lt;/p&gt;</description></item><item><title>python virtual env and venv</title><link>https://bensyz.github.io/blog/blogs/python_virtual_env/</link><pubDate>Mon, 19 Jun 2023 06:59:23 +0800</pubDate><guid>https://bensyz.github.io/blog/blogs/python_virtual_env/</guid><description>&lt;p&gt;pre introduction : stackoverflow 

&lt;a href="https://stackoverflow.com/a/41573588/13033234" target="_blank"&gt;what-is-the-difference-between-venv-pyvenv-pyenv-virtualenv-virtualenvwrappe&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;原先位于 Tips write date: 2021-04-21T00:00:00+08:00&lt;/p&gt;


&lt;h2 id="intro"&gt;
 intro
 &lt;a class="anchor" href="#intro" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;anaconda&lt;/code&gt; 和 &lt;code&gt;miniconda&lt;/code&gt; 是很常用的多版本 python 的管理器，不过我有几点不满意&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;过于庞大，不够轻量，即使是 miniconda 好像也有 好几百兆&lt;/li&gt;
&lt;li&gt;而且 conda channel 什么的整了好久都没整明白，&lt;/li&gt;
&lt;li&gt;已经有 pip 了为何还要用 conda install&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;当然 conda 还提供了一些非 python 的内容，这是 pip 无法做到的，但是这又和 kiss 原则相违背了。&lt;/p&gt;


&lt;h2 id="softwares"&gt;
 softwares
 &lt;a class="anchor" href="#softwares" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;code&gt;pyenv&lt;/code&gt;: provide python version&lt;/li&gt;
&lt;li&gt;&lt;code&gt;venv&lt;/code&gt;: provide virtual environment&lt;/li&gt;
&lt;/ol&gt;


&lt;h2 id="working-flow-example"&gt;
 Working flow example
 &lt;a class="anchor" href="#working-flow-example" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h2&gt;



&lt;h3 id="configure"&gt;
 Configure
 &lt;a class="anchor" href="#configure" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;install another version of python&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;2023-06-19 update:&lt;/p&gt;</description></item><item><title>qt creator remote deploy and debug</title><link>https://bensyz.github.io/blog/blogs/qt_creator_remote_deploy/</link><pubDate>Tue, 13 Jun 2023 06:27:03 +0800</pubDate><guid>https://bensyz.github.io/blog/blogs/qt_creator_remote_deploy/</guid><description>&lt;h2 id="machines"&gt;
 machines
 &lt;a class="anchor" href="#machines" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;target (aarch64)&lt;/li&gt;
&lt;li&gt;host (AMD64)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;cross compile on AMD64, run on aarch64&lt;/p&gt;


&lt;h2 id="softwares"&gt;
 softwares
 &lt;a class="anchor" href="#softwares" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h2&gt;



&lt;h3 id="on-target"&gt;
 on target
 &lt;a class="anchor" href="#on-target" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;basic: gdbserver&lt;/li&gt;
&lt;li&gt;others: known from qt creator&lt;/li&gt;
&lt;/ul&gt;


&lt;h3 id="on-host"&gt;
 on host
 &lt;a class="anchor" href="#on-host" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;basic: gdb-multiarch&lt;/li&gt;
&lt;/ul&gt;


&lt;h2 id="config"&gt;
 config
 &lt;a class="anchor" href="#config" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h2&gt;



&lt;h3 id="pro"&gt;
 pro
 &lt;a class="anchor" href="#pro" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h3&gt;

&lt;pre tabindex="0"&gt;&lt;code class="language-config" data-lang="config"&gt;target.path=/tmp
INSTALLS += target
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="kits"&gt;
 kits
 &lt;a class="anchor" href="#kits" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;add debugger(gdb-multiarch)&lt;/li&gt;
&lt;li&gt;config the kit with above debugger&lt;/li&gt;
&lt;/ol&gt;</description></item><item><title>makeself 和 .run 文件</title><link>https://bensyz.github.io/blog/blogs/makeself_run/</link><pubDate>Mon, 12 Jun 2023 11:05:23 +0800</pubDate><guid>https://bensyz.github.io/blog/blogs/makeself_run/</guid><description>&lt;h2 id="什么是-makeself-以及-run-文件是什么"&gt;
 什么是 makeself 以及 .run 文件是什么
 &lt;a class="anchor" href="#%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" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;简单来说，makeself 把一些文件打成压缩包，然后把这个压缩包打包成 POSIX sh 脚本。&lt;/p&gt;
&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;


&lt;h3 id="如何使用-makeself"&gt;
 如何使用 makeself
 &lt;a class="anchor" href="#%e5%a6%82%e4%bd%95%e4%bd%bf%e7%94%a8-makeself" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h3&gt;



&lt;h2 id="如何打包"&gt;
 如何打包：
 &lt;a class="anchor" href="#%e5%a6%82%e4%bd%95%e6%89%93%e5%8c%85" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;如下目录结构&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-tree" data-lang="tree"&gt;.
└── dir
 ├── file1
 ├── file2
 └── install.sh
&lt;/code&gt;&lt;/pre&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;makeself dir test_makeself.run v0.1 ./install.sh
&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;
&lt;p&gt;更多参数详见 man.&lt;/p&gt;


&lt;h2 id="如何查看包"&gt;
 如何查看包
 &lt;a class="anchor" href="#%e5%a6%82%e4%bd%95%e6%9f%a5%e7%9c%8b%e5%8c%85" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;警告&lt;/strong&gt;：这个脚本是很随意的，所以下面的参数只是通常情况下可能支持的参数。请一定要确保脚本是来自于可信源，否则有可能你只是想查看帮助，实际上执行了恶意程序。&lt;/p&gt;


&lt;h3 id="帮助"&gt;
 帮助
 &lt;a class="anchor" href="#%e5%b8%ae%e5%8a%a9" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h3&gt;

&lt;pre tabindex="0"&gt;&lt;code&gt;./test_makeself.run --help
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id="查看解包后执行的脚本和参数"&gt;
 查看解包后执行的脚本和参数
 &lt;a class="anchor" href="#%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" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h3&gt;

&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-console" data-lang="console"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ➜ ./test_makeself.run --info
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Identification: v0.1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Target directory: dir
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Uncompressed size: 4 KB
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Compression: gzip
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Encryption: n
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Date of packaging: Mon Jun 12 19:23:34 CST 2023
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Built with Makeself version 2.5.0
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Build command was: /usr/bin/makeself \
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;#34;dir&amp;#34; \
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;#34;test_makeself.run&amp;#34; \
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;#34;v0.1&amp;#34; \
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;#34;./install.sh&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Script run after extraction:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ./install.sh
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;dir will be removed after extraction
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3 id="解包"&gt;
 解包
 &lt;a class="anchor" href="#%e8%a7%a3%e5%8c%85" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h3&gt;

&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./test_makeself.run --noexec --target extract_dir
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre tabindex="0"&gt;&lt;code class="language-tree" data-lang="tree"&gt;extract_dir
├── file1
├── file2
└── install.sh
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>gcc support __FILE_NAME__ macro</title><link>https://bensyz.github.io/blog/blogs/gcc_support_filename_macro/</link><pubDate>Fri, 02 Jun 2023 07:48:40 +0800</pubDate><guid>https://bensyz.github.io/blog/blogs/gcc_support_filename_macro/</guid><description>&lt;h2 id="2023-06-06-update"&gt;
 2023-06-06 update:
 &lt;a class="anchor" href="#2023-06-06-update" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h2&gt;

&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;


&lt;h2 id="contents"&gt;
 contents
 &lt;a class="anchor" href="#contents" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Since gcc-12, gcc native support &lt;code&gt;__FILE_NAME__&lt;/code&gt; macro. 

&lt;a href="https://gcc.gnu.org/bugzilla/show_bug.cgi?id=42579" target="_blank"&gt;ref&lt;/a&gt;
&lt;/p&gt;
&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;
&lt;p&gt;Makefile:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-make" data-lang="make"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;CXX_FLAGS&lt;span style="color:#f92672"&gt;+=&lt;/span&gt;-D__FILE_NAME__&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\&amp;#34;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;notdir $&amp;lt;&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;test&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; test.c
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	gcc-7 &lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;CXX_FLAGS&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt; $&amp;lt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Qt pro:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-config" data-lang="config"&gt;DEFINES += &amp;#39;__FILE_NAME__=\\\&amp;#34;$(notdir $&amp;lt;)\\\&amp;#34;&amp;#39;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Some information of macro is at 

&lt;a href="../macro_in_gcc_Makefile_qmake"&gt;here&lt;/a&gt;
.&lt;/p&gt;</description></item><item><title>macro set in gcc, Makefile, qmake</title><link>https://bensyz.github.io/blog/blogs/macro_in_gcc_Makefile_qmake/</link><pubDate>Fri, 02 Jun 2023 07:44:40 +0800</pubDate><guid>https://bensyz.github.io/blog/blogs/macro_in_gcc_Makefile_qmake/</guid><description>&lt;h2 id="gcc"&gt;
 gcc
 &lt;a class="anchor" href="#gcc" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h2&gt;

&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;gcc -DHello&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\&amp;#34;&lt;/span&gt;hey&lt;span style="color:#ae81ff"&gt;\&amp;#34;&lt;/span&gt; main.c
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id="makefile"&gt;
 Makefile
 &lt;a class="anchor" href="#makefile" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h2&gt;

&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-make" data-lang="make"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;CFLAGS &lt;span style="color:#f92672"&gt;=&lt;/span&gt; -DHello&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\&amp;#34;&lt;/span&gt;hey&lt;span style="color:#ae81ff"&gt;\&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id="qmake"&gt;
 qmake
 &lt;a class="anchor" href="#qmake" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h2&gt;

&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;qmake &lt;span style="color:#e6db74"&gt;&amp;#39;DEFINES += Hello=\\\&amp;#34;abc\\\&amp;#34;&amp;#39;&lt;/span&gt; test_macro.pro
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre tabindex="0"&gt;&lt;code class="language-config" data-lang="config"&gt;DEFINES += Hello=\\\&amp;#34;abc\\\&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;关于 &lt;code&gt;\\\&amp;quot;&lt;/code&gt; 的解释&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;\\&lt;/code&gt; 输出makefile里的&lt;code&gt;\&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;\&amp;quot;&lt;/code&gt; 输出makefile里的&lt;code&gt;&amp;quot;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>struct initialization in C Lang</title><link>https://bensyz.github.io/blog/blogs/struct_initialization_in_C_Lang/</link><pubDate>Sat, 20 May 2023 17:49:48 +0800</pubDate><guid>https://bensyz.github.io/blog/blogs/struct_initialization_in_C_Lang/</guid><description>&lt;h2 id="introduction"&gt;
 Introduction
 &lt;a class="anchor" href="#introduction" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;看内核源码关于任务初始化的时候看到一个很奇怪的写法：&lt;code&gt;struct task_struct init_task = INIT_TASK(init_task);&lt;/code&gt;，一个没被定义变量怎么可以传给一个函数，用来
初始化它自己。&lt;/p&gt;
&lt;p&gt;我们把原始代码用一下这个 demo 展示：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;struct&lt;/span&gt; myStruct {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;struct&lt;/span&gt; myStruct &lt;span style="color:#f92672"&gt;*&lt;/span&gt;self;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; a;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; b;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#define INIT_TASK(tsk){\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; .self = &amp;amp;tsk, \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; .a = 0, \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; .b = 1, \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;main&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;struct&lt;/span&gt; myStruct init_task &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;INIT_TASK&lt;/span&gt;(init_task);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;/*
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; * 展开后：
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; * struct myStruct init_task = { .self = &amp;amp;init_task, .a = 0, .b = 1, };
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id="whats-this"&gt;
 What&amp;rsquo;s this?
 &lt;a class="anchor" href="#whats-this" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;code&gt;INIT_TASK&lt;/code&gt; 是一个宏，由于宏是在编译时展开，所以 &lt;code&gt;init_task&lt;/code&gt; 其实并不是作为
参数被传入的，而是在这里展开。同时 &lt;code&gt;INIT_TASK&lt;/code&gt; 只用了 &lt;code&gt;init_task&lt;/code&gt; 的地址，而
并没有用 &lt;code&gt;init_task&lt;/code&gt; 这个结构体本身。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;{.self = &amp;amp;tsk, .a = 0, .b = 1,}&lt;/code&gt; 是什么？结构体的初始化。&lt;/li&gt;
&lt;/ol&gt;


&lt;h3 id="何时分配-init_task-的地址"&gt;
 何时分配 &lt;code&gt;init_task&lt;/code&gt; 的地址
 &lt;a class="anchor" href="#%e4%bd%95%e6%97%b6%e5%88%86%e9%85%8d-init_task-%e7%9a%84%e5%9c%b0%e5%9d%80" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;那 &lt;code&gt;init_task&lt;/code&gt; 的地址是在什么时候分配的呢？这个结构体的赋值有些复杂，因为涉及到
取址。我们看一个简单的例子：&lt;/p&gt;</description></item><item><title>about nested struct and anonymous struct in c</title><link>https://bensyz.github.io/blog/blogs/about_nested_struct_and_anonymous_struct_in_c/</link><pubDate>Sat, 20 May 2023 16:55:23 +0800</pubDate><guid>https://bensyz.github.io/blog/blogs/about_nested_struct_and_anonymous_struct_in_c/</guid><description>&lt;p&gt;看书的时候没明白一个 macro 的用法，搜了一下，发现这个

&lt;a href="https://stackoverflow.com/questions/58346036/c-c-macro-parameter-containing-dot-member-access-operator" target="_blank"&gt;问题&lt;/a&gt;
，发现看不懂他写的结构体的问题。自己尝试写了几个例子发现了 anonymous struct，觉得用法很奇怪，又搜到了这个

&lt;a href="https://stackoverflow.com/questions/38457109/c-how-to-access-different-types-of-anonymous-or-unnamed-nested-structs/38457240" target="_blank"&gt;问题&lt;/a&gt;
，一下把我能想到的关于结构体的情况都写出来了&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;struct&lt;/span&gt; s {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; abc;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;struct&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; a;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; };
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;struct&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; b;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } intern;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;struct&lt;/span&gt; i {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; c;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; };
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;struct&lt;/span&gt; i2 {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; d;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } intern2;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;struct&lt;/span&gt; i3 {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; e;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; };
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;struct&lt;/span&gt; i3 intern3;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;struct&lt;/span&gt; i3 AA;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;main&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; argc, &lt;span style="color:#66d9ef"&gt;char&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt;argv[])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;struct&lt;/span&gt; s mystruct;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; mystruct.abc &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; mystruct.a &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; mystruct.intern.b &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; mystruct.c &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;; &lt;span style="color:#75715e"&gt;// &amp;lt;-- does not compile
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; mystruct.intern2.d &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;4&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; mystruct.intern3.e &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;5&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; AA.e&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/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>https://bensyz.github.io/blog/blogs/about_effective_voltage_and_rms/</link><pubDate>Fri, 21 Apr 2023 15:18:29 +0800</pubDate><guid>https://bensyz.github.io/blog/blogs/about_effective_voltage_and_rms/</guid><description>&lt;h2 id="effective-voltage-of-sinusoidal"&gt;
 Effective voltage of sinusoidal
 &lt;a class="anchor" href="#effective-voltage-of-sinusoidal" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;In alternating current, to simplify the calculation, we often use effective voltage or current.&lt;/p&gt;
&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;
&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>https://bensyz.github.io/blog/blogs/about_maximum_power_transfer_theorem/</link><pubDate>Fri, 21 Apr 2023 14:03:48 +0800</pubDate><guid>https://bensyz.github.io/blog/blogs/about_maximum_power_transfer_theorem/</guid><description>&lt;p&gt;This is a read note of 

&lt;a href="https://en.wikipedia.org/wiki/Maximum_power_transfer_theorem" target="_blank"&gt;https://en.wikipedia.org/wiki/Maximum_power_transfer_theorem&lt;/a&gt;
&lt;/p&gt;


&lt;h2 id="maximum-efficiency"&gt;
 Maximum Efficiency
 &lt;a class="anchor" href="#maximum-efficiency" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Assumption:
&lt;ul&gt;
&lt;li&gt;direct current&lt;/li&gt;
&lt;li&gt;load is pure resistor&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;notation:
&lt;ul&gt;
&lt;li&gt;$P_\text{L}$ power of load&lt;/li&gt;
&lt;li&gt;$R_\text{L}$ resistance of load.&lt;/li&gt;
&lt;li&gt;$R_\text{S}$ resistance of source(e.g battery)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The efficiency is:&lt;/p&gt;
$$
\eta = \frac{P_\text{L}}{P_\text{total}}
= \frac{U_{\text{L}} \times I}{U_{\text{emf}} \times I}
= \frac{R_{\text{L}} \times I}{(R_\text{L} + R_\text{s}) \times I}
= \frac{1}{1+R_\text{s}/R_\text{L}}
$$&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>https://bensyz.github.io/blog/blogs/migrate_from_ubuntu16.04_to_20.04_with_nvidia_docker/</link><pubDate>Thu, 13 Apr 2023 11:13:20 +0800</pubDate><guid>https://bensyz.github.io/blog/blogs/migrate_from_ubuntu16.04_to_20.04_with_nvidia_docker/</guid><description>&lt;p&gt;公司服务器需要升级系统&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;系统升级&lt;/li&gt;
&lt;li&gt;docker 迁移&lt;/li&gt;
&lt;/ol&gt;


&lt;h2 id="系统升级"&gt;
 系统升级
 &lt;a class="anchor" href="#%e7%b3%bb%e7%bb%9f%e5%8d%87%e7%ba%a7" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;download and extra to new root&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;curl https://cdimage.ubuntu.com/ubuntu-base/releases/focal/release/ubuntu-base-20.04.5-base-amd64.tar.gz | sudo tar -xzvf - -C /mnt
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="2"&gt;
&lt;li&gt;update and install grub and other needs&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;grub-efi-amd64&lt;/code&gt; # 可能直接 grub 就好，不知道这种基础组建要怎么一下安装&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ubuntu-minimal&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;linux-image-generic&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start="3"&gt;
&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;
&lt;/ol&gt;
&lt;p&gt;特别关注 grub&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;grub-install&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;grub-config&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;efibootmgr&lt;/code&gt; check 一下&lt;/li&gt;
&lt;/ul&gt;


&lt;h2 id="docker-迁移"&gt;
 docker 迁移
 &lt;a class="anchor" href="#docker-%e8%bf%81%e7%a7%bb" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h2&gt;



&lt;h3 id="1-rsync"&gt;
 1. &lt;code&gt;rsync&lt;/code&gt;
 &lt;a class="anchor" href="#1-rsync" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h3&gt;

&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# https://blog.lilydjwg.me/2013/12/29/rsync-btrfs-dm-crypt-full-backup.42219.html&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;rsync --archive --one-file-system --inplace --hard-links &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --human-readable --numeric-ids --delete --delete-excluded &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --acls --xattrs --sparse &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --itemize-changes --verbose --progress &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; /var/lib/docker /mnt/var/lib
&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>https://bensyz.github.io/blog/blogs/polkit/</link><pubDate>Mon, 06 Jun 2022 08:55:33 +0800</pubDate><guid>https://bensyz.github.io/blog/blogs/polkit/</guid><description>&lt;h1 id="polkit"&gt;
 polkit
 &lt;a class="anchor" href="#polkit" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h1&gt;



&lt;h2 id="introduction"&gt;
 Introduction
 &lt;a class="anchor" href="#introduction" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h2&gt;



&lt;h3 id="问题的出现"&gt;
 问题的出现
 &lt;a class="anchor" href="#%e9%97%ae%e9%a2%98%e7%9a%84%e5%87%ba%e7%8e%b0" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h3&gt;

&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;


&lt;h3 id="about-polkit"&gt;
 about polkit
 &lt;a class="anchor" href="#about-polkit" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;polkit 实现非特权进程向特权进程发消息的控制，从而可控地让非特权进程达到特权功能，比如，普通用户的挂载和卸载硬盘&lt;/p&gt;
&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;


&lt;h2 id="action"&gt;
 Action:
 &lt;a class="anchor" href="#action" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;policy file 文件位置：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;/usr/share/polkit-1/actions/*.policy&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;在 default section 中，有这几个选项:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;keys:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;allow_any&lt;/code&gt;: 所有&lt;/li&gt;
&lt;li&gt;&lt;code&gt;allow_inactive&lt;/code&gt;: 远程的 session(ssh vnc, etc.)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;allow_active&lt;/code&gt;: 本地 tty, X display&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;values:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;no&lt;/code&gt;: 无权限&lt;/li&gt;
&lt;li&gt;&lt;code&gt;yes&lt;/code&gt;: 有权限&lt;/li&gt;
&lt;li&gt;&lt;code&gt;auth_self[_keep]&lt;/code&gt;: 对 non-sudoer [keep some minutes] 开放权限&lt;/li&gt;
&lt;li&gt;&lt;code&gt;auth_admin[_keep]&lt;/code&gt;: sudoer 开放权限&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;h2 id="authorization-rules"&gt;
 Authorization rules
 &lt;a class="anchor" href="#authorization-rules" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;文件位置：&lt;/p&gt;</description></item><item><title>网络断连分析工具介绍</title><link>https://bensyz.github.io/blog/blogs/network_disconnection_analysis_tool/</link><pubDate>Tue, 26 Apr 2022 02:32:01 +0800</pubDate><guid>https://bensyz.github.io/blog/blogs/network_disconnection_analysis_tool/</guid><description>&lt;h1 id="网络断连分析工具介绍"&gt;
 网络断连分析工具介绍
 &lt;a class="anchor" href="#%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" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h1&gt;

&lt;p&gt;[toc]&lt;/p&gt;


&lt;h2 id="抓包工具数据链路层及之上"&gt;
 抓包工具（数据链路层及之上）
 &lt;a class="anchor" href="#%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" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h2&gt;



&lt;h3 id="tcpdump"&gt;
 &lt;code&gt;tcpdump&lt;/code&gt;
 &lt;a class="anchor" href="#tcpdump" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;网络层：&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-console" data-lang="console"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;# tcpdump -i eth0
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="2"&gt;
&lt;li&gt;数据链路层&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-console" data-lang="console"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;# tcpdump -e -i eth0
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3 id="wireshark"&gt;
 &lt;code&gt;wireshark&lt;/code&gt;
 &lt;a class="anchor" href="#wireshark" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;wireshark&lt;/code&gt; 还是更香一点，可以直接抓，抓完还可以看流量图 (statistic-Flow graph)(一应一答的那种)&lt;/p&gt;
&lt;p&gt;需要注意的是通讯双方的 &lt;code&gt;wireshark&lt;/code&gt; 版本要保持一致，老版本的 sequence number 和新版本的对不上&lt;/p&gt;
&lt;p&gt;我们这次使用的是 Version 3.6.3，如果没有可以自行 

&lt;a href="https://1.as.dl.wireshark.org/src/wireshark-3.6.3.tar.xz" target="_blank"&gt;下载&lt;/a&gt;
 编译，编译方法查看 INSTALL 文件，对于 Ubnutu 来说&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-console" data-lang="console"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;# ./tools/debian-setup.sh
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;# mkdir build
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;# cmake -DCMAKE_INSTALL_PREFIX ..
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;# make -j4
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;# make install
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id="phy-芯片的查看物理层"&gt;
 PHY 芯片的查看（物理层）
 &lt;a class="anchor" href="#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" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;rtl8169 的手册：

&lt;a href="https://www.semiee.com/file/EOL2/Realtek-RTL8168-LF.pdf" target="_blank"&gt;https://www.semiee.com/file/EOL2/Realtek-RTL8168-LF.pdf&lt;/a&gt;
&lt;/p&gt;</description></item><item><title>C 和 Qt 中 socket 的创建和删除</title><link>https://bensyz.github.io/blog/blogs/creation_and_delete_of_socket_in_c_and_qt/</link><pubDate>Thu, 14 Apr 2022 08:36:19 +0800</pubDate><guid>https://bensyz.github.io/blog/blogs/creation_and_delete_of_socket_in_c_and_qt/</guid><description>&lt;h1 id="c-和-qt-中-socket-的创建和删除"&gt;
 C 和 Qt 中 socket 的创建和删除
 &lt;a class="anchor" href="#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" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h1&gt;

&lt;p&gt;[toc]&lt;/p&gt;


&lt;h2 id="c"&gt;
 C
 &lt;a class="anchor" href="#c" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;

&lt;a href="https://www.geeksforgeeks.org/tcp-server-client-implementation-in-c/" target="_blank"&gt;example code&lt;/a&gt;
&lt;/p&gt;


&lt;h3 id="客户端"&gt;
 客户端
 &lt;a class="anchor" href="#%e5%ae%a2%e6%88%b7%e7%ab%af" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;客户端相对来说比较简单：创建，然后 connect&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;connect&lt;/span&gt;(sockfd, (SA&lt;span style="color:#f92672"&gt;*&lt;/span&gt;)&lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;servaddr, &lt;span style="color:#66d9ef"&gt;sizeof&lt;/span&gt;(servaddr));
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3 id="服务端"&gt;
 服务端
 &lt;a class="anchor" href="#%e6%9c%8d%e5%8a%a1%e7%ab%af" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;服务端相对来说会复杂一些&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;bind&lt;/span&gt;(sockfd, (SA&lt;span style="color:#f92672"&gt;*&lt;/span&gt;)&lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;servaddr, &lt;span style="color:#66d9ef"&gt;sizeof&lt;/span&gt;(servaddr));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;listen&lt;/span&gt;(sockfd, &lt;span style="color:#ae81ff"&gt;5&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;connfd &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;accept&lt;/span&gt;(sockfd, (SA&lt;span style="color:#f92672"&gt;*&lt;/span&gt;)&lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;cli, &lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;len);
&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;
&lt;p&gt;从 &lt;code&gt;man 2 accept&lt;/code&gt; 可以知道 accept 做了这些事：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;从这个监听的 socket 中取出第一个连接请求&lt;/li&gt;
&lt;li&gt;创建一个新的连接着的socket，&lt;/li&gt;
&lt;li&gt;返回一个指向这个 socket 的文件描述符&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;这里返回的 socket 是一个变量，也就是说它是在栈里的，当退出函数的时候，这个 socket 会自动释放。&lt;/p&gt;


&lt;h4 id="文件描述符"&gt;
 文件描述符：
 &lt;a class="anchor" href="#%e6%96%87%e4%bb%b6%e6%8f%8f%e8%bf%b0%e7%ac%a6" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h4&gt;

&lt;p&gt;文件描述符号是 int。&lt;/p&gt;
&lt;p&gt;在 socket 断连再重连的时候我们看到对于一个新的 socket，他的文件描述符没变，那 accept 建立的socket 还是原来的吗？答案是否定的。&lt;/p&gt;</description></item><item><title>Shell echo 输出带样式 (style) 的文字</title><link>https://bensyz.github.io/blog/blogs/shell_color/</link><pubDate>Mon, 04 Apr 2022 12:23:29 +0800</pubDate><guid>https://bensyz.github.io/blog/blogs/shell_color/</guid><description>&lt;h2 id="introduction"&gt;
 Introduction
 &lt;a class="anchor" href="#introduction" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;好久没明白 Shell 的格式化输出，这次看了一些资料，整理了一下。&lt;/p&gt;


&lt;h2 id="method--result"&gt;
 Method &amp;amp; Result
 &lt;a class="anchor" href="#method--result" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;我们知道 shell 可以用 &lt;code&gt;-e&lt;/code&gt; 来转义 &lt;code&gt;\n&lt;/code&gt; 这些符号。由于样式输出也是特殊的输出，所以要使用样式输出也要打开这个开关。那如何表示样式的符号是什么呢？基本格式是这样&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;\033[ + 样式码 + m + &amp;#34;要打印的字符&amp;#34;
&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;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#!/bin/sh
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;echo -e &lt;span style="color:#e6db74"&gt;&amp;#39;\033[1mBold&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;echo -e &lt;span style="color:#e6db74"&gt;&amp;#39;\033[32mGreen&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img src="./figures/bold.png" alt="bold"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="./figures/green.png" alt="green"&gt;&lt;/p&gt;


&lt;h3 id="样式的分开"&gt;
 样式的分开
 &lt;a class="anchor" href="#%e6%a0%b7%e5%bc%8f%e7%9a%84%e5%88%86%e5%bc%80" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;由于这个样式是管它之后的所有输出，所以你如果先加粗后加颜色，那么后面半截也会加粗，比如：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#!/bin/sh
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;echo -e &lt;span style="color:#e6db74"&gt;&amp;#39;\033[1mBold&amp;#39;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;\033[32mGreen&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img src="./figures/bold_and_green_mixed.png" alt="bold_and_green_mixed"&gt;&lt;/p&gt;
&lt;p&gt;所以就像括号一样我们用无样式(样式码0) 来作为右半边的括号。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#!/bin/sh
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;echo -e &lt;span style="color:#e6db74"&gt;&amp;#39;\033[1mBold\033[0m&amp;#39;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;\033[32mGreen\033[0m&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img src="./figures/bold_and_green_seperated.png" alt="bold_and_green_seperated"&gt;&lt;/p&gt;


&lt;h3 id="样式的合并"&gt;
 样式的合并
 &lt;a class="anchor" href="#%e6%a0%b7%e5%bc%8f%e7%9a%84%e5%90%88%e5%b9%b6" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;根据上面一节，我们知道如何叠加几个样式，比如加粗又加绿:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#!/bin/sh
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;echo -e &lt;span style="color:#e6db74"&gt;&amp;#39;\033[1m\033[32mBold and Green\033[0m&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img src="./figures/bold_and_green_together.png" alt="bold_and_green_together"&gt;&lt;/p&gt;
&lt;p&gt;它有个简略的写法：用分号 &lt;code&gt;;&lt;/code&gt; 分开两个样式码。比如加粗又加绿:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#!/bin/sh
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;echo -e &lt;span style="color:#e6db74"&gt;&amp;#39;\033[1;32mBold and Green\033[0m&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img src="./figures/bold_and_green_together_simpler.png" alt="bold_and_green_together_simpler"&gt;&lt;/p&gt;</description></item><item><title>github 使用key 来pull fetch</title><link>https://bensyz.github.io/blog/blogs/github_key/</link><pubDate>Wed, 22 Dec 2021 13:36:53 +0800</pubDate><guid>https://bensyz.github.io/blog/blogs/github_key/</guid><description>&lt;h2 id="问题的出现"&gt;
 问题的出现
 &lt;a class="anchor" href="#%e9%97%ae%e9%a2%98%e7%9a%84%e5%87%ba%e7%8e%b0" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;github 似乎不能使用帐号密码来push了，我们这里介绍一下如何使用 rsa 密钥对来进行身份认证。&lt;/p&gt;
&lt;p&gt;github 上有

&lt;a href="https://docs.github.com/cn/authentication/connecting-to-github-with-ssh/adding-a-new-ssh-key-to-your-github-account" target="_blank"&gt;文档&lt;/a&gt;
&lt;/p&gt;


&lt;h2 id="如何操作"&gt;
 如何操作
 &lt;a class="anchor" href="#%e5%a6%82%e4%bd%95%e6%93%8d%e4%bd%9c" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h2&gt;



&lt;h3 id="生成密钥对"&gt;
 生成密钥对
 &lt;a class="anchor" href="#%e7%94%9f%e6%88%90%e5%af%86%e9%92%a5%e5%af%b9" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;在&lt;code&gt;~/.ssh&lt;/code&gt;下生成 rsa 非对称密钥对，可以把密钥名取为&lt;code&gt;github&lt;/code&gt;，可以不用设置密码&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ cd ~/.ssh/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ ssh-keygen -t rsa
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Generating public/private rsa key pair.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Enter file in which to save the key &lt;span style="color:#f92672"&gt;(&lt;/span&gt;/home/ben/.ssh/id_rsa&lt;span style="color:#f92672"&gt;)&lt;/span&gt;: github
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;非对称密钥对在我 

&lt;a href="../rsa_ssh/"&gt;ssh 免密登录&lt;/a&gt;
里有讲到一点。&lt;/p&gt;
&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;


&lt;h3 id="将公钥内容拷贝到-github-上"&gt;
 将公钥内容拷贝到 github 上
 &lt;a class="anchor" href="#%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" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;点击路径：头像-&amp;gt; Settings -&amp;gt; 左侧SSH and GPG keys&lt;/li&gt;
&lt;li&gt;或者直接访问这个链接 

&lt;a href="https://github.com/settings/keys" target="_blank"&gt;https://github.com/settings/keys&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;&lt;img src="./figures/steps_to_keys.png" alt="steps to keys"&gt;&lt;/th&gt;
 &lt;th&gt;&lt;img src="./figures/steps_to_keys2.png" alt="steps to keys2"&gt;&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;然后就是 New SSH key&lt;/p&gt;</description></item><item><title>Donate me</title><link>https://bensyz.github.io/blog/donate/</link><pubDate>Sun, 31 Oct 2021 18:10:29 +0800</pubDate><guid>https://bensyz.github.io/blog/donate/</guid><description>&lt;p&gt;Thank you for supporting me.&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;AliPay&lt;/th&gt;
 &lt;th&gt;WeChat Pay&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;img src="./figures/alipay.png" alt="alipay" width="200px"&gt;&lt;/td&gt;
 &lt;td&gt;&lt;img src="./figures/wechat_pay.png" alt="wechat_pay" width="200px"&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;</description></item><item><title>用 curl 来制作一些简单的网络小工具</title><link>https://bensyz.github.io/blog/blogs/curl_post/</link><pubDate>Sat, 09 Oct 2021 10:37:10 +0800</pubDate><guid>https://bensyz.github.io/blog/blogs/curl_post/</guid><description>&lt;h2 id="问题的出现碎碎念"&gt;
 问题的出现（碎碎念）
 &lt;a class="anchor" href="#%e9%97%ae%e9%a2%98%e7%9a%84%e5%87%ba%e7%8e%b0%e7%a2%8e%e7%a2%8e%e5%bf%b5" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h2&gt;



&lt;h3 id="1-校园网登录"&gt;
 1. 校园网登录
 &lt;a class="anchor" href="#1-%e6%a0%a1%e5%9b%ad%e7%bd%91%e7%99%bb%e5%bd%95" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;校园网需要认证后才能登录上网，在使用 Linux 的时候有一点很麻烦，宿舍区必须使用客户端才能登录，不能像教学区那样可以网页登录，不知道是谁告诉我们宿舍区也可以网页登录，网址是:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;http://172.30.255.2/a30.html
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;于是宿舍区使用 Linux 的问题得以解决。但是每次断网都要打开浏览器去连接也不是很方便，我想是否可以使用爬虫来实现登录，找着找着发现可以用 &lt;code&gt;curl&lt;/code&gt; 来实现登录。&lt;/p&gt;


&lt;h3 id="2-宿舍电费查询"&gt;
 2. 宿舍电费查询
 &lt;a class="anchor" href="#2-%e5%ae%bf%e8%88%8d%e7%94%b5%e8%b4%b9%e6%9f%a5%e8%af%a2" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;这个小工具的出现的起因是宿舍如果没电了，夏天早上会断电，我的树莓派会被强制断电，对 SD 卡不好于是我想每天做个定时任务爬一下宿舍电费是多少，一开始也是想用 selenium 爬虫做的，但是 selenium 太吃资源，于是我又找着找着想到了 &lt;code&gt;curl&lt;/code&gt;，然后就成了。&lt;/p&gt;


&lt;h2 id="curl-简介"&gt;
 &lt;code&gt;curl&lt;/code&gt; 简介
 &lt;a class="anchor" href="#curl-%e7%ae%80%e4%bb%8b" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;我们常用 &lt;code&gt;curl&lt;/code&gt;、&lt;code&gt;wget&lt;/code&gt; 在 Linux 上下载东西：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;curl www.baidu.com
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;wget www.baidu.com
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;而我们知道网络里有的不止是从服务器上下载内容，还有提交内容到服务器上。要怎么提交呢？&lt;/p&gt;
&lt;p&gt;方法很简单就是使用 &lt;code&gt;-d&lt;/code&gt; 参数，语法如下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;curl -d &lt;span style="color:#e6db74"&gt;&amp;#39;variable=value&amp;#39;&lt;/span&gt; URL
&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 没有的话可以去这里下 

&lt;a href="https://curl.se/windows" target="_blank"&gt;https://curl.se/windows&lt;/a&gt;
&lt;/p&gt;


&lt;h2 id="如何制作"&gt;
 如何制作
 &lt;a class="anchor" href="#%e5%a6%82%e4%bd%95%e5%88%b6%e4%bd%9c" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;上面说的 &lt;code&gt;curl&lt;/code&gt; 来贴一个 POST表单，可能很难理解，我们借 drcom 来举一个例子，给大家介绍一下如何制作两个使用 &lt;code&gt;curl&lt;/code&gt; 的小工具。&lt;/p&gt;


&lt;h3 id="登录-drcom-校园网"&gt;
 登录 drcom 校园网
 &lt;a class="anchor" href="#%e7%99%bb%e5%bd%95-drcom-%e6%a0%a1%e5%9b%ad%e7%bd%91" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;这里再提一下两个登录的网页地址，教学区这个域名默认的网页就是登录界面，但是宿舍区上网自动跳转的界面是让你下载客户端，但是&lt;code&gt;a30.html&lt;/code&gt;是可以和教学区那样实现网页登录的：&lt;/p&gt;</description></item><item><title>Tips</title><link>https://bensyz.github.io/blog/tips/</link><pubDate>Sat, 09 Oct 2021 00:00:00 +0000</pubDate><guid>https://bensyz.github.io/blog/tips/</guid><description>&lt;p&gt;Check in my github 

&lt;a href="https://github.com/BenSYZ/Tips/" target="_blank"&gt;repository&lt;/a&gt;
&lt;/p&gt;</description></item><item><title>gpio</title><link>https://bensyz.github.io/blog/blogs/gpio/</link><pubDate>Mon, 04 Oct 2021 13:03:23 +0800</pubDate><guid>https://bensyz.github.io/blog/blogs/gpio/</guid><description>&lt;p&gt;Under construction&amp;hellip;&lt;/p&gt;
&lt;!--
https://stackoverflow.com/help/whats-reputation
### GNU 系统 vs Linux
GNU 是一个操作系统，他包含了 GNU/Linux（也就是常说的 Linux 系统） 上所能看到的各种常规文件，各种命令，而 Linux 是一个内核，内核是和硬件打交道的，并提供一些接口给操作系统，然后操作系统可以调用这些借口
操作系统和内核的区别可以看看 [gnu 的官方说明](https://www.gnu.org/gnu/linux-and-gnu.html)，简单来说 gnu 就是那些各种个样的软件，包括我们最常用的 ls，rm
--&gt;</description></item><item><title>将服务器的 Ubuntu 系统换成 Arch Linux</title><link>https://bensyz.github.io/blog/blogs/vps2arch/</link><pubDate>Mon, 04 Oct 2021 00:00:00 +0000</pubDate><guid>https://bensyz.github.io/blog/blogs/vps2arch/</guid><description>&lt;h2 id="introduction"&gt;
 Introduction
 &lt;a class="anchor" href="#introduction" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;这两天腾讯在搞活动，有便宜的服务器，于是买了，如之前的阿里云一样没有 Arch Linux 的系统镜像。&lt;/p&gt;
&lt;p&gt;早就听说了有一个叫 &lt;code&gt;vps2arch&lt;/code&gt; 的脚本可以将服务器上的 Ubuntu 系统转成其他系统，然后看 [Arch wiki](

&lt;a href="https://wiki.archlinux.org/title/Install_Arch_Linux_from_existing_Linux" target="_blank"&gt;https://wiki.archlinux.org/title/Install_Arch_Linux_from_existing_Linux&lt;/a&gt;
（简体中文）#从一个主机运行另一个 Linux 发行版) 的时候发现了不止它，还有好多，它还介绍了如何手动转到 Arch Linux。玩 Arch 的人怎么能不手动试试呢🤪（发现这个脚本是在原来阿里云过期之后的事了。然后一直没机会，虽然虚拟机上也行，但懒啊)&lt;/p&gt;
&lt;p&gt;然而 Arch wiki 在后面

&lt;a href="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" target="_blank"&gt;安装提示&lt;/a&gt;
 那节让我从 

&lt;a href="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" target="_blank"&gt;Installation Guide&lt;/a&gt;
 中的重新分区开始，继续后面的操作，我就这样试了，然后&amp;hellip;.🤦系统挂了。那个时候也没懂原理，一开始的想法是是否能够把系统全加载到内存中，然后就可以把原分区删了重新分区，然后又看到 wiki 是这样说的，就尽信了。&lt;/p&gt;
&lt;p&gt;后来我找到了这篇

&lt;a href="https://blog.inkuang.com/2020/114/" target="_blank"&gt;博客&lt;/a&gt;
，然后就成啦，原来后面的步骤是“挂载分区”而不是”建立分区“。&lt;/p&gt;
&lt;p&gt;写博客的时候才发现，原来中文手册里说的就是“挂载”，而英文手册里是“分区” 😠 ，当然现在我把它改好啦😏&lt;/p&gt;


&lt;h2 id="原理"&gt;
 原理
 &lt;a class="anchor" href="#%e5%8e%9f%e7%90%86" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h2&gt;

&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; 的关系可以看看我的这篇关于 

&lt;a href="https://bensyz.github.io/blog/blogs/gpio/"&gt;gpio&lt;/a&gt;
 的文章。&lt;/p&gt;
&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>Electrostatic 2</title><link>https://bensyz.github.io/blog/study_notes/electrodynamics/2.Electrostatics/1/</link><pubDate>Thu, 23 Sep 2021 00:30:00 +0800</pubDate><guid>https://bensyz.github.io/blog/study_notes/electrodynamics/2.Electrostatics/1/</guid><description>&lt;h2 id="maxwells-equation"&gt;
 Maxwell&amp;rsquo;s equation
 &lt;a class="anchor" href="#maxwells-equation" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h2&gt;



&lt;h3 id="gausss-law"&gt;
 Gauss&amp;rsquo;s Law
 &lt;a class="anchor" href="#gausss-law" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Charge &amp;lt;-&amp;gt; Electric field Flux&lt;/p&gt;
&lt;p&gt;一个体积内的电荷 vs 这个体积表面的通量&lt;/p&gt;
$$
\nabla \cdot E = \frac{\rho}{\epsilon_0}
$$&lt;ul&gt;
&lt;li&gt;点电荷

$$
\rho = Q \delta(r)
$$&lt;/li&gt;
&lt;/ul&gt;
$$
\int_V (\nabla \cdot E) dV = \int_S E \cdot dS = \int_V \frac{\rho}{\epsilon_0} dV = \frac{Q}{\epsilon_0}
$$&lt;p&gt;
???&lt;/p&gt;
$$
\int_S E \cdot dS = \int_V \frac{\rho}{\epsilon_0} dV
$$$$
LS= E \cdot R^2 dr d\theta
$$&lt;p&gt;
&lt;/p&gt;
$$
RS = \int \frac{Q \delta(r)}{\epsilon_0} dV
$$&lt;p&gt;&amp;hellip;&lt;/p&gt;</description></item><item><title>My First Post</title><link>https://bensyz.github.io/blog/page_content/my-first-post/</link><pubDate>Fri, 17 Sep 2021 00:00:00 +0000</pubDate><guid>https://bensyz.github.io/blog/page_content/my-first-post/</guid><description>&lt;h1 id="hello-hugo"&gt;
 Hello Hugo
 &lt;a class="anchor" href="#hello-hugo" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h1&gt;

&lt;p&gt;This my first Hugo blog markdown.&lt;/p&gt;
&lt;p&gt;Test update.
你好
&lt;img src="https://bensyz.github.io/blog/20210429_license/PRTSRC.jpeg" alt="Example"&gt;&lt;/p&gt;</description></item><item><title>210916</title><link>https://bensyz.github.io/blog/study_notes/theoretical_mechanics/210916/</link><pubDate>Thu, 16 Sep 2021 12:30:00 +0800</pubDate><guid>https://bensyz.github.io/blog/study_notes/theoretical_mechanics/210916/</guid><description>&lt;h2 id="review"&gt;
 Review
 &lt;a class="anchor" href="#review" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;$F=ma$ 推出一些东西 动量定理&amp;hellip;&lt;/p&gt;
&lt;p&gt;最小做用量原理，路径积分&lt;/p&gt;


&lt;h2 id="variational-method变分法"&gt;
 Variational Method(变分法)
 &lt;a class="anchor" href="#variational-method%e5%8f%98%e5%88%86%e6%b3%95" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;differential calculus ($d$,微分) $\to$ variational calculus($\delta$,变分)&lt;/p&gt;
&lt;p&gt;泛函，把函数变一点，区别于之前的微分是$x+\delta x$&lt;/p&gt;
&lt;p&gt;微分
&lt;/p&gt;
$$
f(x+\delta x) = (x+\delta x)^2 = x^2 +2 \delta x x + (\delta x)^2
$$$$
\frac{dx^2}{dx} =2x
$$&lt;p&gt;变分：
函数变化，basis change, eg. Laplace and zeta 作基底&lt;/p&gt;
&lt;p&gt;Define: $\tilde{f}(x) = f(x)+\alpha \eta(x)$ as &lt;strong&gt;a set of function&lt;/strong&gt;(泛函)&lt;/p&gt;
&lt;p&gt;$f(x)$ change little can be written as:
&lt;/p&gt;
$$
f(x) + \delta \eta(x)
$$&lt;ul&gt;
&lt;li&gt;treat $f(x)$ as variable, $f(x)$ self-increasing&lt;/li&gt;
&lt;/ul&gt;
&lt;!--

$$
\delta \tilde{f}(x) = (f+d \alpha \eta)(x) - f(x) = d \alpha \eta(x) \equiv \delta f d \alpha
$$

--&gt;
$$
\delta \tilde{f}(x) = (f+d \alpha \eta)(x) - f(x) = d \alpha \eta(x) \equiv \frac{\partial \tilde{f}}{ \partial x} d \alpha
$$&lt;p&gt;??? 有些问题，看一下讲义$f$ 自增然后呢？&lt;/p&gt;</description></item><item><title>Vector Analysis 2</title><link>https://bensyz.github.io/blog/study_notes/electrodynamics/1.vector_analysis/2/</link><pubDate>Thu, 16 Sep 2021 00:30:00 +0800</pubDate><guid>https://bensyz.github.io/blog/study_notes/electrodynamics/1.vector_analysis/2/</guid><description>&lt;!--
*
--&gt;
&lt;p&gt;Q1: Derive the formula for the volume of a sphere&lt;/p&gt;
$$
\begin{aligned}
V &amp;=\int dV \\
 &amp;= \int r^2\sin\theta dr d\theta d\phi\\
 &amp;=\frac{1}{3} r^3|_{0}^{r} \times (-\cos\theta)|_{0}^{\pi}\times 2\pi\\
 &amp;=\frac{4}{3}r^3
\end{aligned}
$$&lt;p&gt;$r^2\sin\theta$: it can also be derivative form Jacobi formula.&lt;/p&gt;
&lt;hr&gt;


&lt;h2 id="curvilinear-coordinates"&gt;
 Curvilinear Coordinates
 &lt;a class="anchor" href="#curvilinear-coordinates" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h2&gt;



&lt;h3 id="spherical-polar-coordinates-spc"&gt;
 Spherical polar coordinates (SPC):
 &lt;a class="anchor" href="#spherical-polar-coordinates-spc" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h3&gt;



&lt;h4 id="review"&gt;
 review
 &lt;a class="anchor" href="#review" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;4 types integrate&lt;/li&gt;
&lt;li&gt;Curvilinear Coordinates&lt;/li&gt;
&lt;li&gt;$dl$, $dl_\theta$, $dl_\phi$ 对球坐标和柱坐标&lt;/li&gt;
&lt;/ul&gt;


&lt;h4 id="derivatives-in-spc"&gt;
 Derivatives in SPC
 &lt;a class="anchor" href="#derivatives-in-spc" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h4&gt;



&lt;h5 id="1-gradient-in-the-spc"&gt;
 1. Gradient in the SPC
 &lt;a class="anchor" href="#1-gradient-in-the-spc" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h5&gt;

&lt;p&gt;Definition of the gradient:&lt;/p&gt;</description></item><item><title>Vector Analysis 1</title><link>https://bensyz.github.io/blog/study_notes/electrodynamics/1.vector_analysis/1/</link><pubDate>Tue, 14 Sep 2021 00:30:00 +0800</pubDate><guid>https://bensyz.github.io/blog/study_notes/electrodynamics/1.vector_analysis/1/</guid><description>&lt;h2 id="vector-analysis"&gt;
 Vector Analysis
 &lt;a class="anchor" href="#vector-analysis" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Review
Triple product&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Vector triple product

$$
A \times (B\times C) = B(A \cdot C) - C (A \cdot B)
$$&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Proved by expand $ABC$&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Scalar triple product

$$
A \cdot (B \times C) = B \cdot(C \times A)
$$&lt;/li&gt;
&lt;li&gt;轮换&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;Q1. Show that
&lt;/p&gt;
$$
(a \times b) \times (a\times c) = (a \cdot(b\times c))a
$$$$
(a \times b) \cdot (c\times d) = (a \cdot c)(b \cdot d) - (a \cdot d)(b \cdot c)
$$&lt;hr&gt;
&lt;ul&gt;
&lt;li&gt;Relation of divergences

$$
\nabla \cdot (fA) = (\nabla f) \cdot A + f(\nabla \cdot A)
$$&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;$\nabla$ operate on f, that&amp;rsquo;s gradient, from the gradient definition.&lt;/p&gt;</description></item><item><title>About me</title><link>https://bensyz.github.io/blog/about/</link><pubDate>Thu, 29 Apr 2021 19:53:43 +0800</pubDate><guid>https://bensyz.github.io/blog/about/</guid><description>&lt;p&gt;Hi there, this is my blog build with hugo.&lt;/p&gt;
&lt;p&gt;You can view the blog source code at 

&lt;a href="https://github.com/BenSYZ/blog" target="_blank"&gt;Github&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;The blog theme is 

&lt;a href="https://github.com/BenSYZ/my-hugo-theme" target="_blank"&gt;here&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;If you have any question, you can create an 

&lt;a href="https://github.com/BenSYZ/blog/issues" target="_blank"&gt;issue&lt;/a&gt;
 on Github.&lt;/p&gt;</description></item><item><title>Copyright and Copyleft</title><link>https://bensyz.github.io/blog/blogs/licenses/Copyright_and_Copyleft/</link><pubDate>Thu, 29 Apr 2021 19:53:43 +0800</pubDate><guid>https://bensyz.github.io/blog/blogs/licenses/Copyright_and_Copyleft/</guid><description>&lt;p&gt;Cover: Copyright or Copyleft&lt;/p&gt;
&lt;p&gt;本作品采用 知识共享 署名 - 非商业性使用 4.0 国际许可协议进行许可。
&lt;img src="https://licensebuttons.net/l/by-nc/4.0/88x31.png" alt="CC"&gt;&lt;/p&gt;


&lt;h2 id="introduction"&gt;
 Introduction
 &lt;a class="anchor" href="#introduction" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;一直想写一些技术文章，现在微信公众号，CSDN，都要你声明你是否是原创。如果是不是原创，请贴上原文链接，以及确定是否征求过原作者同意，但是我们这种小白想写一些技术分享，想写一些心得体会怎么可能写出完全原创的技术文章。总归都是学习，然后有什么所得。可能本来就不应该写？以免产生像毕业论文那种垃圾？但是把我总想分享一下自己的经验，所以有些畏首畏脚，自从上次写过一篇 ssh 的文章（貌似还担心因为版权问题还删了），就再也不想写了。&lt;/p&gt;
&lt;p&gt;有同样困惑和犹豫的当然不止我一个，因此在这段停滞不前的时间里我了解到了 Creative Commons 和其他 Copyleft 协议，现将其分享出来。&lt;/p&gt;
&lt;hr&gt;


&lt;h2 id="copyleft"&gt;
 

&lt;a href="https://www.gnu.org/licenses/Copyleft.zh-cn.html" target="_blank"&gt;Copyleft&lt;/a&gt;

 &lt;a class="anchor" href="#copyleft" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h2&gt;



&lt;h3 id="著作权-copyright"&gt;
 著作权 (Copyright)
 &lt;a class="anchor" href="#%e8%91%97%e4%bd%9c%e6%9d%83-copyright" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;在讲 Copyleft 之前我们先讲一下 Copyright，[@_著作权_2021] 非专业，只能简单介绍一下。
Copyright © 版权，也被称为著作权。另外，我们经常会听到“保留所有权利”或者&amp;quot;All rights reserved&amp;quot;。后两者现如今已经不需要声明，著作权便意味着保留所有权利。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;自 2000 年 8 月 23 日，尼加拉瓜成为最后一个加入《伯尔尼公约》的《布宜诺斯艾利斯公约》签署国，使得标注“保留所有权利”的要求过时。此日起，所有《布宜诺斯艾利斯公约》（唯一一个要求使用“保留所有权利”的版权条约）签署国都是《伯尔尼公约》（无需任何版权通知）的成员。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;如果保留所有的权利的话，我们在对已有内容的重新整理上会变得束手束脚，对内容的编改都要和原作者联系，这极大的阻碍了知识的流通。&lt;/p&gt;


&lt;h3 id="公有领域-public-domain"&gt;
 公有领域 (

&lt;a href="https://www.gnu.org/philosophy/categories.html#Non-CopyleftedFreeSoftware" target="_blank"&gt;Public Domain&lt;/a&gt;
)
 &lt;a class="anchor" href="#%e5%85%ac%e6%9c%89%e9%a2%86%e5%9f%9f-public-domain" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;和 Copyright 相对的是“公有领域”（Public Domain），用数学的方式说就是所有作品内有版权的作品的补集，它和有版权的作品是完全对立的。 公有领域是由 &lt;strong&gt;不再具有版权期限&lt;/strong&gt; 或 &lt;strong&gt;从未受版权法保护&lt;/strong&gt; 的作品组成。换句话来说

&lt;a href="https://en.wikipedia.org/wiki/Public_domain" target="_blank"&gt;公有领域&lt;/a&gt;
 就是指 &lt;strong&gt;不受版权保护&lt;/strong&gt; 的作品。下面是几个例子&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;公有领域的书籍
公有领域的书籍是指没有版权的书籍，未经许可而创建的书籍或版权已过期 的书籍或被没收。在大多数国家和地区，版权保护期限作者去世后 70 年后的第一个元旦日（1 月 1 日）起失效。墨西哥和美国有例外，美国是在 1926 年之前出版的所有书籍和故事都属于公有领域。&lt;/li&gt;
&lt;li&gt;公有领域的音乐&lt;/li&gt;
&lt;li&gt;公有领域的的电影&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;正如前面所说，共有领域的作品不受版权保护，那我可以随便拿来用，不用遵守什么规则。打个比方我把我自己拍的照片或者写的文章放到公有领域里，那谁都可以拿来用，他可以稍微改一下，就可以在不经过我的同意下拥有版权 (Copyright)。这样的话只有我的作品还是开放给大家使用的，基于我的作品又可以回到有版权 (Copyright) 的领域，这样一来，又不利于知识的传播。&lt;/p&gt;</description></item><item><title>My First Post</title><link>https://bensyz.github.io/blog/post/my-first-post/</link><pubDate>Wed, 28 Apr 2021 00:00:00 +0000</pubDate><guid>https://bensyz.github.io/blog/post/my-first-post/</guid><description>&lt;h1 id="hello-hugo"&gt;
 Hello Hugo
 &lt;a class="anchor" href="#hello-hugo" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h1&gt;

&lt;p&gt;This my first Hugo blog markdown.&lt;/p&gt;
&lt;p&gt;Test update.
你好
&lt;img src="https://bensyz.github.io/blog/20210429_license/PRTSRC.png" alt="Example"&gt;&lt;/p&gt;</description></item><item><title>ssh 免密登录</title><link>https://bensyz.github.io/blog/blogs/rsa_ssh/</link><pubDate>Fri, 05 Feb 2021 12:13:15 +0800</pubDate><guid>https://bensyz.github.io/blog/blogs/rsa_ssh/</guid><description>&lt;h2 id="rsa简介"&gt;
 rsa简介
 &lt;a class="anchor" href="#rsa%e7%ae%80%e4%bb%8b" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h2&gt;



&lt;h3 id="rsa"&gt;
 rsa
 &lt;a class="anchor" href="#rsa" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h3&gt;



&lt;h4 id="什么是rsa"&gt;
 

&lt;a href="http://www.baidu.com/link?url=E7VV9LiPjbQHlSeIcFqyi_sx7fSDsVr8zPdlhSn7GVcsXuA5uiwUEmqmHXNQoJyroo71V84SlMGwRAML75z7D8HCAxMS6Ovzlljv0_Pr8DUNGyzrqNQWbsqTpXBlfsDAQfUx78JGfySl5JN4km2Qka&amp;amp;wd=&amp;amp;eqid=f42870ad0000ace4000000055e393bea" target="_blank"&gt;什么是rsa&lt;/a&gt;

 &lt;a class="anchor" href="#%e4%bb%80%e4%b9%88%e6%98%afrsa" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h4&gt;

&lt;p&gt;RSA加密算法是一种非对称加密算法。在公开密钥加密和电子商业中RSA被广泛使用。它的基本原理是利用大数难以质因数分解，它有一对数字：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;密钥(

&lt;a href="https://zhidao.baidu.com/question/1579778969145333380.html" target="_blank"&gt;yao4&lt;/a&gt;
)：绝对&lt;strong&gt;不能&lt;/strong&gt;透露给别人。&lt;/li&gt;
&lt;li&gt;公钥：是要给别人的。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;具体原理请见阮一峰的

&lt;a href="http://www.ruanyifeng.com/blog/2013/06/rsa_algorithm_part_one.html" target="_blank"&gt;blog&lt;/a&gt;
&lt;/p&gt;


&lt;h4 id="rsa的用途"&gt;
 rsa的用途
 &lt;a class="anchor" href="#rsa%e7%9a%84%e7%94%a8%e9%80%94" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h4&gt;



&lt;h5 id="身份验证"&gt;
 

&lt;a href="www.ruanyifeng.com/blog/2011/12/ssh_remote_login.html"&gt;身份验证&lt;/a&gt;

 &lt;a class="anchor" href="#%e8%ba%ab%e4%bb%bd%e9%aa%8c%e8%af%81" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h5&gt;

&lt;p&gt;所谓&amp;quot;公钥登录&amp;quot;，原理很简单，就是用户将自己的公钥储存在远程主机上。登录的时候，远程主机会向用户发送一段随机字符串，用户用自己的私钥加密后，再发回来。远程主机用事先储存的公钥进行解密，如果成功，就证明用户是可信的，直接允许登录shell，不再要求密码。&lt;/p&gt;


&lt;h5 id="数字签名"&gt;
 

&lt;a href="https://www.ruanyifeng.com/blog/2011/08/what_is_a_digital_signature.html" target="_blank"&gt;数字签名&lt;/a&gt;

 &lt;a class="anchor" href="#%e6%95%b0%e5%ad%97%e7%ad%be%e5%90%8d" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h5&gt;

&lt;p&gt;数字签名用于发行软件时防止别人篡改，具体流程是这样的：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;发行者对文件进行hash校验，并把这个校验值和进行私钥加密得到&lt;em&gt;数字签名&lt;/em&gt;，大家通过&lt;em&gt;公布在网站上的公钥&lt;/em&gt;解开这段密文（数字签名），也就是文件的hash值。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;下载者对文件进行hash校验，和1.中得到的hash值进行比对。&lt;/p&gt;
&lt;p&gt;上面两个步骤如何防止第三方修改，发行者加密的文件第三方当然可以通过公钥解密之后修改，但是你也无法生成（到时候用户要用公布在网站上的公钥解密的）&lt;em&gt;数字签名&lt;/em&gt;（必须知道密钥）。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;


&lt;h2 id="ssh用rsa方式登录远程主机"&gt;
 ssh用rsa方式登录远程主机
 &lt;a class="anchor" href="#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" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h2&gt;



&lt;h3 id="为什么要用rsa登录"&gt;
 为什么要用rsa登录
 &lt;a class="anchor" href="#%e4%b8%ba%e4%bb%80%e4%b9%88%e8%a6%81%e7%94%a8rsa%e7%99%bb%e5%bd%95" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;方便，每次登录不用输密码。&lt;/li&gt;
&lt;li&gt;安全，禁用密码登录后，不怕别人猜到密码。&lt;/li&gt;
&lt;/ol&gt;


&lt;h3 id="文件信息"&gt;
 文件信息
 &lt;a class="anchor" href="#%e6%96%87%e4%bb%b6%e4%bf%a1%e6%81%af" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;本文会涉及两个文件夹，一个是在客户端（client），一个是服务器端（server）：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;rsa 密钥位置(&lt;strong&gt;client&lt;/strong&gt;)：&lt;code&gt;~/.ssh/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;ssh 配置文件(&lt;strong&gt;server&lt;/strong&gt;)：&lt;code&gt;/etc/ssh/sshd_config&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;client 和 server 是相对的概念，在一次连接中，主动寻求连接的是 client ，被连的是 server。&lt;/p&gt;


&lt;h3 id="如何配置"&gt;
 如何配置
 &lt;a class="anchor" href="#%e5%a6%82%e4%bd%95%e9%85%8d%e7%bd%ae" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h3&gt;



&lt;h4 id="client"&gt;
 client
 &lt;a class="anchor" href="#client" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;生成密钥对：rsa 和 rsa.pub&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ssh-keygen -t rsa
&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>https://bensyz.github.io/blog/blogs/jupyterlab_vim_colemak_config/</link><pubDate>Mon, 03 Aug 2020 23:09:45 +0800</pubDate><guid>https://bensyz.github.io/blog/blogs/jupyterlab_vim_colemak_config/</guid><description>&lt;p&gt;我原先发于 

&lt;a href="https://blog.csdn.net/BenSYZ" target="_blank"&gt;CSDN&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;

&lt;a href="../jupyterlab_colemak"&gt;上一篇文章&lt;/a&gt;
 介绍了 &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;


&lt;h2 id="tl-dr"&gt;
 TL; DR
 &lt;a class="anchor" href="#tl-dr" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;install&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# For jupyterlab 2.0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;jupyter-labextension install @axlair/jupyterlab_vim
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# vimrc&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;jupyter-labextension install jupyterlab-vimrc
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;config&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-JSON5" data-lang="JSON5"&gt; &amp;#34;nmap&amp;#34;: [
 [&amp;#34;n&amp;#34;,&amp;#34;j&amp;#34;],
 [&amp;#34;e&amp;#34;,&amp;#34;k&amp;#34;]
 ],
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;


&lt;h2 id="安装jupyterlab"&gt;
 安装&lt;code&gt;jupyterlab&lt;/code&gt;
 &lt;a class="anchor" href="#%e5%ae%89%e8%a3%85jupyterlab" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h2&gt;

&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pip install --user jupyterlab
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# or&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;conda activate &amp;lt;env&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;conda install jupyterlab
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id="安装-extension"&gt;
 安装 extension
 &lt;a class="anchor" href="#%e5%ae%89%e8%a3%85-extension" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h2&gt;



&lt;h3 id="1-vim-binding"&gt;
 1. vim binding
 &lt;a class="anchor" href="#1-vim-binding" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h3&gt;

&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# jupyterlab 1.0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;jupyter labextension install jupyterlab_vim
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# jupyterlab 2.0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;jupyter-labextension install @axlair/jupyterlab_vim
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3 id="2-vim-keymap"&gt;
 2. vim keymap
 &lt;a class="anchor" href="#2-vim-keymap" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h3&gt;

&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;jupyter-labextension install jupyterlab-vimrc
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h4 id="配置"&gt;
 配置
 &lt;a class="anchor" href="#%e9%85%8d%e7%bd%ae" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;![在这里插入图片描述](

&lt;a href="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" target="_blank"&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;
 =200x)
2.
&lt;img src="https://img-blog.csdnimg.cn/20200803225927188.png#pic_center" alt="在这里插入图片描述"&gt;
3. 仅供参考&lt;/p&gt;</description></item><item><title>vim+colemak(keymap)+jupyterlab</title><link>https://bensyz.github.io/blog/blogs/jupyterlab_colemak/</link><pubDate>Mon, 03 Aug 2020 23:09:45 +0800</pubDate><guid>https://bensyz.github.io/blog/blogs/jupyterlab_colemak/</guid><description>&lt;p&gt;我原先发于 

&lt;a href="https://blog.csdn.net/BenSYZ" target="_blank"&gt;CSDN&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;推荐使用 jupyter-lab, 

&lt;a href="https://blog.csdn.net/BenSYZ/article/details/107775517" target="_blank"&gt;见此&lt;/a&gt;
&lt;/p&gt;


&lt;h2 id="tl-dr"&gt;
 TL, DR
 &lt;a class="anchor" href="#tl-dr" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&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;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;change the codemirror in notebook package.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;~/.local/lib/python3.8/site-packages/notebook/static/components/codemirror/keymap/vim.js
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;My example is 

&lt;a href="https://github.com/BenSYZ/jupyter-vim-binding-colemak/tree/master/colemak" target="_blank"&gt;here&lt;/a&gt;
&lt;/p&gt;


&lt;h2 id="essay"&gt;
 Essay
 &lt;a class="anchor" href="#essay" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Vimer 很多，所以有作者开发了

&lt;a href="jupyter-vim-binding"&gt;jupyter-vim-binding&lt;/a&gt;
。
colemaker 很少，而上面的 jupyter-vim-binding 的作者只提供了移动的API，不能做到映射全部的键位。&lt;/p&gt;
&lt;p&gt;我本想修改这个插件来扩展它的功能。从 

&lt;a href="https://codemirror.net/" target="_blank"&gt;codemirror&lt;/a&gt;
 官网下下了 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;
&lt;p&gt;弄了一天，终于搜对了关键字 “jupyter notebook 自定义 codemirror”， 谷歌对中文的支持不好，英文搜出来的修改的手段也太官方了，所以一直解决不了，百度搜到了

&lt;a href="https://www.cnblogs.com/ZhangHT97/p/13336975.html" target="_blank"&gt;Jupyter Notebook 更改字体、字体大小、行高&lt;/a&gt;
。&lt;/p&gt;
&lt;p&gt;nb! 直接修改 codemirror 在 jupyter 中的源码&lt;/p&gt;</description></item><item><title>树莓派4B连不上wifi的一个意想不到的原因</title><link>https://bensyz.github.io/blog/blogs/raspberrypi4B_wifi/</link><pubDate>Fri, 31 Jul 2020 15:34:47 +0800</pubDate><guid>https://bensyz.github.io/blog/blogs/raspberrypi4B_wifi/</guid><description>&lt;p&gt;我原先发于 

&lt;a href="https://blog.csdn.net/BenSYZ" target="_blank"&gt;CSDN&lt;/a&gt;
&lt;/p&gt;


&lt;h2 id="wpa_supplicant-无法配置wifi"&gt;
 wpa_supplicant 无法配置wifi
 &lt;a class="anchor" href="#wpa_supplicant-%e6%97%a0%e6%b3%95%e9%85%8d%e7%bd%aewifi" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;输出结果如下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ➜ sudo wpa_supplicant -i wlan0 -c /etc/wpa_supplicatn/wpa_supplicant.conf
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Successfully initialized wpa_supplicant
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;wlan0: Trying to associate with SSID &lt;span style="color:#e6db74"&gt;&amp;#39;xxxxxxx&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;wlan0: CTRL-EVENT-ASSOC-REJECT bssid&lt;span style="color:#f92672"&gt;=&lt;/span&gt;00:00:00:00:00:00 status_code&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;16&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;wlan0: Trying to associate with SSID &lt;span style="color:#e6db74"&gt;&amp;#39;xxxxxxx&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;wlan0: CTRL-EVENT-ASSOC-REJECT bssid&lt;span style="color:#f92672"&gt;=&lt;/span&gt;00:00:00:00:00:00 status_code&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;16&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;wlan0: Trying to associate with SSID &lt;span style="color:#e6db74"&gt;&amp;#39;xxxxxxx&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;wlan0: CTRL-EVENT-ASSOC-REJECT bssid&lt;span style="color:#f92672"&gt;=&lt;/span&gt;00:00:00:00:00:00 status_code&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;16&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;wlan0: Trying to associate with SSID &lt;span style="color:#e6db74"&gt;&amp;#39;xxxxxxx&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;wlan0: CTRL-EVENT-ASSOC-REJECT bssid&lt;span style="color:#f92672"&gt;=&lt;/span&gt;00:00:00:00:00:00 status_code&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;16&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;wlan0: CTRL-EVENT-SSID-TEMP-DISABLED id&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; ssid&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;xxxxxxx&amp;#34;&lt;/span&gt; auth_failures&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; duration&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;10&lt;/span&gt; reason&lt;span style="color:#f92672"&gt;=&lt;/span&gt;CONN_FAILED
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;wlan0: Failed to initiate sched scan
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;wlan0: CTRL-EVENT-SSID-REENABLED id&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; ssid&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;xxxxxxx&amp;#39;&lt;/span&gt;
&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>https://bensyz.github.io/blog/blogs/keyboard_map_windows/</link><pubDate>Thu, 30 Jul 2020 14:55:29 +0800</pubDate><guid>https://bensyz.github.io/blog/blogs/keyboard_map_windows/</guid><description>&lt;p&gt;我原先发于 

&lt;a href="https://blog.csdn.net/BenSYZ" target="_blank"&gt;CSDN&lt;/a&gt;
&lt;/p&gt;


&lt;h2 id="tl-dr"&gt;
 TL; DR
 &lt;a class="anchor" href="#tl-dr" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h2&gt;



&lt;h3 id="1-转-colemak"&gt;
 1. 转 colemak
 &lt;a class="anchor" href="#1-%e8%bd%ac-colemak" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h3&gt;

&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-reg" data-lang="reg"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Windows Registry Editor Version 5.00
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;[&lt;/span&gt;HKEY_LOCAL_MACHINE&lt;span style="color:#66d9ef"&gt;\SYSTEM\CurrentControlSet\Control\Keyboard Layout]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;&amp;#34;Scancode Map&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;hex:&lt;span style="color:#ae81ff"&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="color:#960050;background-color:#1e0010"&gt;\&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#960050;background-color:#1e0010"&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;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#960050;background-color:#1e0010"&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;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#960050;background-color:#1e0010"&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;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3 id="2-esc-caps-lock-互换"&gt;
 2. &lt;code&gt;&amp;lt;Esc&amp;gt;&lt;/code&gt; &lt;code&gt;&amp;lt;Caps Lock&amp;gt;&lt;/code&gt; 互换
 &lt;a class="anchor" href="#2-esc-caps-lock-%e4%ba%92%e6%8d%a2" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h3&gt;

&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-reg" data-lang="reg"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Windows Registry Editor Version 5.00
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;[&lt;/span&gt;HKEY_LOCAL_MACHINE&lt;span style="color:#66d9ef"&gt;\SYSTEM\CurrentControlSet\Control\Keyboard Layout]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;&amp;#34;Scancode Map&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;hex:&lt;span style="color:#ae81ff"&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;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id="问题"&gt;
 问题
 &lt;a class="anchor" href="#%e9%97%ae%e9%a2%98" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;

&lt;a href="../keyboard_map_linux"&gt;在Linux中修改键盘为colemak键盘很容易&lt;/a&gt;
：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 暂时&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;setxkbmap us -variant colemak
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;setxkbmap us -variant workman
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;setxkbmap us -variant norman
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Ubuntu&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo dpkg-reconfigure keyboard-configuration
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Arch&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;loadkeys colemak
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;但是在Windows中就很麻烦了，有推荐在

&lt;a href="https://colemak.com/Windows" target="_blank"&gt;这里&lt;/a&gt;
下载安装，然后修改这一项注册表&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>https://bensyz.github.io/blog/blogs/stow_introduction/</link><pubDate>Thu, 30 Jul 2020 13:15:47 +0800</pubDate><guid>https://bensyz.github.io/blog/blogs/stow_introduction/</guid><description>&lt;p&gt;我原先发于 

&lt;a href="https://blog.csdn.net/BenSYZ" target="_blank"&gt;CSDN&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;Know from 

&lt;a href="https://www.ostechnix.com/an-easy-way-to-remove-programs-installed-from-source-in-linux/" target="_blank"&gt;here&lt;/a&gt;
&lt;/p&gt;


&lt;h2 id="install-positiontake-neovim-as-example"&gt;
 Install Position(take &lt;code&gt;neovim&lt;/code&gt; as example)
 &lt;a class="anchor" href="#install-positiontake-neovim-as-example" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h2&gt;

&lt;pre tabindex="0"&gt;&lt;code&gt;/usr/local/stow/nvim/
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id="make-symbolic-link"&gt;
 Make Symbolic Link
 &lt;a class="anchor" href="#make-symbolic-link" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h2&gt;

&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cd /usr/local/stow/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo stow nvim
&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;


&lt;h3 id="example"&gt;
 Example
 &lt;a class="anchor" href="#example" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h3&gt;

&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 

&lt;a href="https://blog.csdn.net/BenSYZ/article/details/98105357" target="_blank"&gt;make a link file&lt;/a&gt;
 (like &lt;code&gt;vim&lt;/code&gt;) in this directory, like following,&lt;/p&gt;</description></item><item><title>Linux开机自动连接网络</title><link>https://bensyz.github.io/blog/blogs/connect_wifi_on_startup/</link><pubDate>Wed, 26 Feb 2020 10:26:09 +0800</pubDate><guid>https://bensyz.github.io/blog/blogs/connect_wifi_on_startup/</guid><description>&lt;p&gt;整合自: 

&lt;a href="https://bbs.archlinux.org/viewtopic.php?id=178625" target="_blank"&gt;https://bbs.archlinux.org/viewtopic.php?id=178625&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;上一篇

&lt;a href="../connect_wifi_command"&gt;文章&lt;/a&gt;
讲到如何用命令行连接wifi，大家可以去看看。&lt;/p&gt;
&lt;p&gt;本文参考 

&lt;a href="https://bbs.archlinux.org/viewtopic.php?id=178625" target="_blank"&gt;https://bbs.archlinux.org/viewtopic.php?id=178625&lt;/a&gt;
&lt;/p&gt;


&lt;h2 id="tldr"&gt;
 TL,DR
 &lt;a class="anchor" href="#tldr" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h2&gt;



&lt;h3 id="wpa_supplicant"&gt;
 &lt;code&gt;wpa_supplicant&lt;/code&gt;
 &lt;a class="anchor" href="#wpa_supplicant" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h3&gt;

&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# config wpa_supplicant&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#/etc/wpa_supplicant/wpa_supplicant-wlp5s0.conf&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# enable wpa_supplicant&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;systemctl enable wpa_supplicant@wlp5s0
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3 id="config-systemd-network"&gt;
 &lt;code&gt;config systemd-network&lt;/code&gt;
 &lt;a class="anchor" href="#config-systemd-network" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h3&gt;

&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# config systemd-network&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# /etc/systemd/network/00-wireless-dhcp.network&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;[&lt;/span&gt;Match&lt;span style="color:#f92672"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Name&lt;span style="color:#f92672"&gt;=&lt;/span&gt;wlp5s0
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;[&lt;/span&gt;Network&lt;span style="color:#f92672"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;DHCP&lt;span style="color:#f92672"&gt;=&lt;/span&gt;yes
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# enable systemd-networkd.service&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;systemctl enable systemd-networkd.service
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id="需要工具"&gt;
 需要工具
 &lt;a class="anchor" href="#%e9%9c%80%e8%a6%81%e5%b7%a5%e5%85%b7" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;code&gt;wpa_supplicant&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dhcpcd&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;


&lt;h2 id="配置文件"&gt;
 配置文件
 &lt;a class="anchor" href="#%e9%85%8d%e7%bd%ae%e6%96%87%e4%bb%b6" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;/etc/wpa_supplicant/wpa_supplicant-网卡名.conf&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;/etc/systemd/network/00-wireless-dhcp.network&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;


&lt;h2 id="步骤"&gt;
 步骤
 &lt;a class="anchor" href="#%e6%ad%a5%e9%aa%a4" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h2&gt;



&lt;h3 id="1-wpa_supplicant"&gt;
 1. &lt;code&gt;wpa_supplicant&lt;/code&gt;
 &lt;a class="anchor" href="#1-wpa_supplicant" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h3&gt;



&lt;h4 id="11-查看网卡名字"&gt;
 1.1 查看网卡名字
 &lt;a class="anchor" href="#11-%e6%9f%a5%e7%9c%8b%e7%bd%91%e5%8d%a1%e5%90%8d%e5%ad%97" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h4&gt;

&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ip link
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 1: lo&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 2: enp4s0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 3: wlp5s0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol&gt;
&lt;li&gt;lo 是loop设备&lt;/li&gt;
&lt;li&gt;enp4s0 是有线设备&lt;/li&gt;
&lt;li&gt;wlp5s0 是无线设备&lt;/li&gt;
&lt;/ol&gt;
&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>https://bensyz.github.io/blog/blogs/shell_connect_wifi/</link><pubDate>Wed, 26 Feb 2020 10:15:54 +0800</pubDate><guid>https://bensyz.github.io/blog/blogs/shell_connect_wifi/</guid><description>&lt;p&gt;我原先发于 

&lt;a href="https://blog.csdn.net/BenSYZ" target="_blank"&gt;CSDN&lt;/a&gt;
&lt;/p&gt;


&lt;h2 id="检查是哪一个接口来支持无线连接的"&gt;
 检查是哪一个接口来支持无线连接的：
 &lt;a class="anchor" href="#%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" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h2&gt;

&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;iwconfig
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;假定是wlan0，我的是wlp5s0&lt;/p&gt;


&lt;h2 id="启动接口服务"&gt;
 启动接口服务
 &lt;a class="anchor" href="#%e5%90%af%e5%8a%a8%e6%8e%a5%e5%8f%a3%e6%9c%8d%e5%8a%a1" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h2&gt;

&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo ip link set wlan0 up
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id="扫描附近的无线网络了"&gt;
 扫描附近的无线网络了：
 &lt;a class="anchor" href="#%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" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h2&gt;

&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo iw dev wlan0 scan | less
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id="连接"&gt;
 连接
 &lt;a class="anchor" href="#%e8%bf%9e%e6%8e%a5" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h2&gt;



&lt;h3 id="没有加密"&gt;
 没有加密：
 &lt;a class="anchor" href="#%e6%b2%a1%e6%9c%89%e5%8a%a0%e5%af%86" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h3&gt;

&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo iw dev wlan0 connect &lt;span style="color:#f92672"&gt;[&lt;/span&gt;网络 SSID&lt;span style="color:#f92672"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;也可以通过&lt;code&gt;wpa_supplicant&lt;/code&gt; 连接，见‘WPA or WPA2’。&lt;/p&gt;


&lt;h3 id="wep-加密的"&gt;
 WEP 加密的：
 &lt;a class="anchor" href="#wep-%e5%8a%a0%e5%af%86%e7%9a%84" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h3&gt;

&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo iw dev wlan0 connect &lt;span style="color:#f92672"&gt;[&lt;/span&gt;网络 SSID&lt;span style="color:#f92672"&gt;]&lt;/span&gt; key 0:&lt;span style="color:#f92672"&gt;[&lt;/span&gt;WEP 密钥&lt;span style="color:#f92672"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3 id="wpa-or-wpa2"&gt;
 WPA or WPA2
 &lt;a class="anchor" href="#wpa-or-wpa2" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;code&gt;/etc/wpasupplicant/wpa_supplicant.conf&lt;/code&gt; 文件，增加如下行：&lt;/li&gt;
&lt;/ol&gt;
&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>https://bensyz.github.io/blog/blogs/timezone_win_linux/</link><pubDate>Wed, 26 Feb 2020 10:05:47 +0800</pubDate><guid>https://bensyz.github.io/blog/blogs/timezone_win_linux/</guid><description>&lt;p&gt;我原先发于 

&lt;a href="https://blog.csdn.net/BenSYZ" target="_blank"&gt;CSDN&lt;/a&gt;
&lt;/p&gt;


&lt;h2 id="思路"&gt;
 思路
 &lt;a class="anchor" href="#%e6%80%9d%e8%b7%af" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;把硬件时间修改为UTC，system的修改为local time。&lt;/p&gt;


&lt;h2 id="windows"&gt;
 windows
 &lt;a class="anchor" href="#windows" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;参考

&lt;a href="https://blog.csdn.net/qq_40197828/article/details/79334158" target="_blank"&gt;https://blog.csdn.net/qq_40197828/article/details/79334158&lt;/a&gt;
&lt;/p&gt;


&lt;h3 id="打开注册表编辑器"&gt;
 打开注册表编辑器
 &lt;a class="anchor" href="#%e6%89%93%e5%bc%80%e6%b3%a8%e5%86%8c%e8%a1%a8%e7%bc%96%e8%be%91%e5%99%a8" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h3&gt;

&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-cmd" data-lang="cmd"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;regedit
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3 id="新建表项"&gt;
 新建表项
 &lt;a class="anchor" href="#%e6%96%b0%e5%bb%ba%e8%a1%a8%e9%a1%b9" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h3&gt;

&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;
&lt;ul&gt;
&lt;li&gt;64 位系统，“QWORD（64位）值”。&lt;/li&gt;
&lt;li&gt;32 位系统，“DWORD（32位）值”。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;它的大体意思是，硬件时间被作为全球统一时间。&lt;/p&gt;


&lt;h3 id="修改表项值"&gt;
 修改表项值
 &lt;a class="anchor" href="#%e4%bf%ae%e6%94%b9%e8%a1%a8%e9%a1%b9%e5%80%bc" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;然后双击这一条目，弹出“编辑 QWORD（64位）值”的对话框，确保选中了“十六进制”，然后将“数值数据”改为“1”。最后点击“确定”。&lt;/p&gt;


&lt;h3 id="可以备份下次直接注入注册表即可"&gt;
 可以备份下次直接注入注册表即可
 &lt;a class="anchor" href="#%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" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h3&gt;



&lt;h2 id="linux"&gt;
 

&lt;a href="https://wiki.archlinux.org/index.php/Installation_guide" target="_blank"&gt;linux&lt;/a&gt;

 &lt;a class="anchor" href="#linux" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;按照官方的操作，好像市区还是有点问题。具体是那个命令我忘记了就是搞着搞着就可以了，大家如果知道是哪个还请在评论区告诉我&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ls -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localetime
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo hwclock --systohc
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;timedatectl set-local-rtc false
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;timedatectl set-timezone Asia/Shanghai
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;timedatectl status
&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>https://bensyz.github.io/blog/blogs/archlinux_stop_hdd_spin/</link><pubDate>Wed, 26 Feb 2020 09:32:00 +0800</pubDate><guid>https://bensyz.github.io/blog/blogs/archlinux_stop_hdd_spin/</guid><description>&lt;p&gt;我原先发于 

&lt;a href="https://blog.csdn.net/BenSYZ" target="_blank"&gt;CSDN&lt;/a&gt;
&lt;/p&gt;


&lt;h1 id="hdd-stop-spin"&gt;
 hdd stop spin
 &lt;a class="anchor" href="#hdd-stop-spin" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h1&gt;



&lt;h2 id="automatic-by-tlp"&gt;
 automatic, by &lt;code&gt;tlp&lt;/code&gt;
 &lt;a class="anchor" href="#automatic-by-tlp" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h2&gt;

&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# /etc/tlp.conf&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 具体可以看这个文件，下面两行只是我的设置，你的配置要自己修改&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;DISK_SPINDOWN_TIMEOUT_ON_AC&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;0 12&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;DISK_SPINDOWN_TIMEOUT_ON_BAT&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;0 12&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 设置开机启动&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;systemctl enable tlp
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id="manual-by-hdparm"&gt;
 manual, by &lt;code&gt;hdparm&lt;/code&gt;
 &lt;a class="anchor" href="#manual-by-hdparm" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;

&lt;a href="https://blog.csdn.net/magaiou/article/details/92770845" target="_blank"&gt;https://blog.csdn.net/magaiou/article/details/92770845&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;从 &lt;code&gt;man hdparm&lt;/code&gt; 可知：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# -S 从1到240的值指定5秒的倍数，从而产生5秒到20分钟的超时。从241到251的值指定30分钟的1到11个单位，从而产生30分钟到5.5小时的超时。值252表示超时21分钟。&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;hdparm -S&lt;span style="color:#f92672"&gt;[&lt;/span&gt;num&lt;span style="color:#f92672"&gt;]&lt;/span&gt; /dev/hd*
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# -y 强制IDE驱动器立即进入低功耗待机模式，通常会导致其降速。&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;hdparm -y /dev/hd*
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# -Y 强制IDE驱动器立即进入最低功耗睡眠模式，导致其完全关闭。&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;hdparm -Y /dev/hd*
&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>https://bensyz.github.io/blog/blogs/keyboard_map_linux/</link><pubDate>Wed, 26 Feb 2020 09:17:44 +0800</pubDate><guid>https://bensyz.github.io/blog/blogs/keyboard_map_linux/</guid><description>&lt;p&gt;我原先发于 

&lt;a href="https://blog.csdn.net/BenSYZ" target="_blank"&gt;CSDN&lt;/a&gt;
&lt;/p&gt;


&lt;h2 id="change-keyboard-layout-as-colemak-and--esc-with-capslock"&gt;
 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;
 &lt;a class="anchor" href="#change-keyboard-layout-as-colemak-and--esc-with-capslock" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;For Windows check 

&lt;a href="../keyboard_map_windows"&gt;here&lt;/a&gt;
&lt;/p&gt;


&lt;h3 id="tldr"&gt;
 TLDR
 &lt;a class="anchor" href="#tldr" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h3&gt;

&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# tty&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# /etc/vconsole.conf&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;KEYMAP &lt;span style="color:#f92672"&gt;=&lt;/span&gt; colemak
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# or&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;loadkeys colemak
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# graphic&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;setxkbmap us -variant colemak
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3 id="change-to-colemak"&gt;
 change to colemak
 &lt;a class="anchor" href="#change-to-colemak" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h3&gt;



&lt;h4 id="temporary"&gt;
 Temporary
 &lt;a class="anchor" href="#temporary" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h4&gt;

&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# tty&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;loadkeys colemak
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# graphic&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;setxkbmap us -variant colemak
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;

&lt;a href="https://www.cnblogs.com/BlackStorm/p/Ubuntu-Switch-Keyboard-Layouts-Such-As-Colemak-Workman-Norman.html" target="_blank"&gt;参考&lt;/a&gt;
&lt;/p&gt;


&lt;h4 id="permanet"&gt;
 Permanet
 &lt;a class="anchor" href="#permanet" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h4&gt;

&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# tty (include graphic)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# /etc/vconsole.conf &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;KEYMAP &lt;span style="color:#f92672"&gt;=&lt;/span&gt; colemak
&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>https://bensyz.github.io/blog/blogs/link/</link><pubDate>Thu, 01 Aug 2019 13:07:43 +0800</pubDate><guid>https://bensyz.github.io/blog/blogs/link/</guid><description>&lt;p&gt;我原先发于 

&lt;a href="https://blog.csdn.net/BenSYZ" target="_blank"&gt;CSDN&lt;/a&gt;
&lt;/p&gt;


&lt;h1 id="链接-link"&gt;
 链接 (link)
 &lt;a class="anchor" href="#%e9%93%be%e6%8e%a5-link" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h1&gt;



&lt;h2 id="硬链接-hard-link-"&gt;
 硬链接 (hard link) :
 &lt;a class="anchor" href="#%e7%a1%ac%e9%93%be%e6%8e%a5-hard-link-" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;硬链接可以用作备份文件，但不可跨硬盘链接。&lt;/p&gt;


&lt;h3 id="图示"&gt;
 图示
 &lt;a class="anchor" href="#%e5%9b%be%e7%a4%ba" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h3&gt;

&lt;div class="mermaid"&gt;
 graph TB;
A["~/link/a/b/z.txt&lt;Br/&gt;（原始，用touch等新建的）"] -.-&gt; Z(真实文件&lt;Br/&gt;数据位置);
B["~/link/z_harlink.txt&lt;Br/&gt; （硬链接）"] -.-&gt; Z;
&lt;/div&gt;



&lt;h3 id="命令"&gt;
 命令
 &lt;a class="anchor" href="#%e5%91%bd%e4%bb%a4" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h3&gt;

&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cp -l &lt;span style="color:#f92672"&gt;[&lt;/span&gt;source file&lt;span style="color:#f92672"&gt;]&lt;/span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt;destination file&lt;span style="color:#f92672"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#or&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ln &lt;span style="color:#f92672"&gt;[&lt;/span&gt;source file&lt;span style="color:#f92672"&gt;]&lt;/span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt;destination file&lt;span style="color:#f92672"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2 id="符号链接-symbolic-link不是软链接哦"&gt;
 符号链接 (symbolic link)&lt;font size =1&gt;(不是软链接哦)&lt;/font&gt;
 &lt;a class="anchor" href="#%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" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;即“快捷方式”
符号连接可以跨硬盘建链接，但不能用作备份，原始文件(&amp;quot;~ /link/a/b/z.txt&amp;quot;)被删除后，链接(&amp;quot;~/link/a/b/z.txt&amp;quot;)无用了。&lt;/p&gt;


&lt;h3 id="图示-1"&gt;
 图示
 &lt;a class="anchor" href="#%e5%9b%be%e7%a4%ba-1" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h3&gt;

&lt;div class="mermaid"&gt;
 graph TB;
A["~/link/a/b/z.txt&lt;Br/&gt;（原始，用touch等新建的）"] -.-&gt; Z(真实文件&lt;Br/&gt;数据位置);
B["~/link/z_harlink.txt&lt;Br/&gt; （硬链接）"] --&gt; A;
&lt;/div&gt;



&lt;h3 id="命令-1"&gt;
 命令
 &lt;a class="anchor" href="#%e5%91%bd%e4%bb%a4-1" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h3&gt;

&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cp -s &lt;span style="color:#f92672"&gt;[&lt;/span&gt;source file&lt;span style="color:#f92672"&gt;]&lt;/span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt;destination file&lt;span style="color:#f92672"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#or&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ln -s &lt;span style="color:#f92672"&gt;[&lt;/span&gt;source file&lt;span style="color:#f92672"&gt;]&lt;/span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt;destination file&lt;span style="color:#f92672"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>超级用户su没有权限修改所属</title><link>https://bensyz.github.io/blog/blogs/su_no_perm/</link><pubDate>Tue, 16 Jul 2019 14:07:27 +0800</pubDate><guid>https://bensyz.github.io/blog/blogs/su_no_perm/</guid><description>&lt;p&gt;我原先发于 

&lt;a href="https://blog.csdn.net/BenSYZ" target="_blank"&gt;CSDN&lt;/a&gt;
&lt;/p&gt;


&lt;h2 id="两种情况"&gt;
 两种情况
 &lt;a class="anchor" href="#%e4%b8%a4%e7%a7%8d%e6%83%85%e5%86%b5" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h2&gt;



&lt;h3 id="1-lsatter-chattr"&gt;
 1. 

&lt;a href="https://blog.csdn.net/FightingOning/article/details/88684618" target="_blank"&gt;lsatter &amp;amp;chattr &lt;/a&gt;

 &lt;a class="anchor" href="#1-lsatter-chattr" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;lsatter: 查看文件隐藏属性
chatter: 设置文件的隐藏属性&lt;/p&gt;


&lt;h3 id="2分区文件格式"&gt;
 2.分区文件格式
 &lt;a class="anchor" href="#2%e5%88%86%e5%8c%ba%e6%96%87%e4%bb%b6%e6%a0%bc%e5%bc%8f" aria-hidden="true"&gt;#&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;我自己是上面两个命令都报错:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;lsattr: 对设备不适当的 ioctl 操作 读取 File 的标志时
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;chattr: 对设备不适当的 ioctl 操作 读取 File 的标志时
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;or
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;lsattr: Inappropriate ioctl &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; device &lt;span style="color:#66d9ef"&gt;while&lt;/span&gt; reading flags on File
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;chattr: Inappropriate ioctl &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; device &lt;span style="color:#66d9ef"&gt;while&lt;/span&gt; reading flags on File
&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>