<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>我的笔记</title><link>http://note.leabol.top/</link><description>Recent content on 我的笔记</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Wed, 10 Jun 2026 00:00:00 +0000</lastBuildDate><atom:link href="http://note.leabol.top/index.xml" rel="self" type="application/rss+xml"/><item><title>“差生文具多”</title><link>http://note.leabol.top/posts/%E6%87%92%E6%83%B0/</link><pubDate>Wed, 10 Jun 2026 00:00:00 +0000</pubDate><guid>http://note.leabol.top/posts/%E6%87%92%E6%83%B0/</guid><description>&lt;p>“差生文具多”&amp;mdash;用积极消费来掩盖自己的懒惰
假努力&amp;mdash;用表象的勤奋来掩盖自己的懒惰
不要以战术上的勤奋掩饰战略上的懒惰&lt;/p></description></item><item><title>CS50群交流会感悟</title><link>http://note.leabol.top/posts/cs50%E7%BE%A4%E4%BA%A4%E6%B5%81%E4%BC%9A%E6%84%9F%E6%82%9F/</link><pubDate>Wed, 10 Jun 2026 00:00:00 +0000</pubDate><guid>http://note.leabol.top/posts/cs50%E7%BE%A4%E4%BA%A4%E6%B5%81%E4%BC%9A%E6%84%9F%E6%82%9F/</guid><description>&lt;h1 id="cs50群交流会感悟">CS50群交流会感悟&lt;/h1>
&lt;h3 id="时间与注意力">时间与注意力&lt;/h3>
&lt;p>比起按照时间来算,用有效注意力来计算时间更加准确.想要提高效率,一味的追求时间上的长度,是不太明智的选择
日常生活中要有效的分配自己的精力,尽量不在没有的地方浪费宝贵的精力.&lt;/p>
&lt;h2 id="当遇到瓶颈时考虑三个方面">当遇到瓶颈时,考虑三个方面&lt;/h2>
&lt;p>是否有足够的有效输入
是否有足够的有效输出
处理问题的核心能力不足&lt;/p>
&lt;h2 id="平时要注意获取信息差">平时要注意获取信息差&lt;/h2>
&lt;p>学校: 比赛 项目 活动
职场 : 行业现状 技术趋势 优质资源&lt;/p>
&lt;h2 id="关于acm竞赛">关于ACM竞赛&lt;/h2>
&lt;p>要综合自己的需求, 目标, 能力, 不要被周围同学学长给影响, 人云亦云
竞赛非常耗时间, 与cs课程往往不能兼顾&lt;/p>
&lt;h2 id="大一阶段要特别注意培养自己的代码实现能力">大一阶段要特别注意培养自己的代码实现能力&lt;/h2>
&lt;p>趁着大一时间多, 多学一些&lt;/p>
&lt;h4 id="现状">现状&lt;/h4>
&lt;ul>
&lt;li>再简单的课能坚持下的人也是&lt;strong>凤毛麟角&lt;/strong>&lt;/li>
&lt;li>95%的人是&amp;rsquo;不学&amp;rsquo;的, 剩下又有80%是三天打鱼两天晒网的&lt;/li>
&lt;/ul>
&lt;h4 id="行业">行业&lt;/h4>
&lt;ul>
&lt;li>互联网的发展接近天花板, 公司开始&amp;quot;&lt;strong>降本增效&lt;/strong>&amp;quot; ,新技术,新项目逐渐变少, 各公司开始稳定,裁员&lt;/li>
&lt;li>ai行业 ,不需要大量算法人才, 而是技术的落地, 实现算力的提升, 需要的是高技术coding&lt;/li>
&lt;li>ai方向: 硬件(芯片, EDA软件, 车机系统) 与 软件(os,库,框架)&lt;/li>
&lt;li>留意国外公司在做的事情 (MR), 国外ai发展领先国内一到两年&lt;/li>
&lt;li>web开发 != CS, web开发用不到太多CS的知识&lt;/li>
&lt;/ul></description></item><item><title>file descriptor</title><link>http://note.leabol.top/posts/%E6%96%87%E4%BB%B6%E6%8F%8F%E8%BF%B0%E7%AC%A6/</link><pubDate>Wed, 10 Jun 2026 00:00:00 +0000</pubDate><guid>http://note.leabol.top/posts/%E6%96%87%E4%BB%B6%E6%8F%8F%E8%BF%B0%E7%AC%A6/</guid><description>&lt;h1 id="理解linux的file-descriptor文件描述符">理解Linux的file descriptor(文件描述符)&lt;/h1>
&lt;p>​ 我们知道在Linux系统中一切皆可以看成是文件，文件又可分为：普通文件、目录文件、链接文件和设备文件。在操作这些所谓的文件的时候，我们每操作一次就找一次名字，这会耗费大量的时间和效率。所以Linux中规定每一个文件对应一个索引，这样要操作文件的时候，我们直接找到索引就可以对其进行操作了。&lt;/p>
&lt;p>​ &lt;strong>文件描述符&lt;/strong>（file descriptor）就是内核为了高效管理这些已经被打开的文件所创建的&lt;strong>索引&lt;/strong>，其是一个非负整数（通常是小整数），用于指代被打开的文件，所有执行I/O操作的系统调用都通过文件描述符来实现。同时还规定系统刚刚启动的时候，0是标准输入，1是标准输出，2是标准错误。这意味着如果此时去打开一个新的文件，它的文件描述符会是3，再打开一个文件文件描述符就是4&amp;hellip;&amp;hellip;&lt;/p>
&lt;p>&lt;img loading="lazy" src="https://photo-lea.s3.bitiful.net/photo/01285b43579e17ec8f3d66c05b4e9165.png">&lt;/p>
&lt;p>Linux内核对所有打开的文件有一个文件描述符表格，里面存储了每个文件描述符作为索引与一个打开文件相对应的关系，简单理解就是下图这样一个数组，文件描述符（索引）就是文件描述符表这个数组的下标，数组的内容就是指向一个个打开的文件的指针。&lt;/p>
&lt;p>&lt;strong>文件描述符&lt;/strong>指向了由系统内核维护的一个file table中的某个条目(entry)。这个解释可能过于抽象，不过在正式详细介绍fd之前，有必要先了解用户程序和系统内核之间的工作过程。&lt;/p>
&lt;p>&lt;em>注: 本文描述的所有场景仅限于类unix系统环境，在windows中这玩意叫file handle(臭名昭著的翻译: 句柄)。&lt;/em>&lt;/p>
&lt;h2 id="user-space--kernel-space">User space &amp;amp; Kernel space&lt;/h2>
&lt;p>现代操作系统会把内存划分为2个区域，分别为Use space(用户空间) 和 Kernel space(内核空间)。用户的程序在User space执行，系统内核在Kernel space中执行。&lt;/p>
&lt;p>用户的程序没有权限直接访问硬件资源，但系统内核可以。比如读写本地文件需要访问磁盘，创建socket需要网卡等。因此用户程序想要读写文件，必须要向内核发起读写请求，这个过程叫system call。&lt;/p>
&lt;p>内核收到用户程序system call时，负责访问硬件，并把结果返回给程序。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-c++" data-lang="c++">&lt;span style="display:flex;">&lt;span>FileInputStream fis &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">new&lt;/span> FileInputStream(&lt;span style="color:#e6db74">&amp;#34;/tmp/test.txt&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>byte[] buf &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">new&lt;/span> byte[&lt;span style="color:#ae81ff">256&lt;/span>];
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>fis.read(buf);
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>上面代码的流程如下图所示&lt;/p>
&lt;p>&lt;img loading="lazy" src="https://photo-lea.s3.bitiful.net/photo/us_ks.png">&lt;/p>
&lt;h2 id="file-descriptor">File Descriptor&lt;/h2>
&lt;p>上面简单介绍了User space和Kernel space，这对于理解fd有很大的帮助。fd会存在，就是因为用户程序无法直接访问硬件，因此当程序向内核发起system call打开一个文件时，在用户进程中必须有一个东西标识着打开的文件，这个东西就是fd。&lt;/p>
&lt;h3 id="file-tables">file tables&lt;/h3>
&lt;p>​ 一个 Linux 进程启动后，会在内核空间中创建一个 PCB 控制块，PCB 内部有一个&lt;strong>文件描述符表&lt;/strong>（File descriptor table），记录着当前进程所有可用的文件描述符，也即当前进程所有打开的文件。进程级的描述符表的每一条记录了单个进程所使用的文件描述符的相关信息，进程之间相互独立，一个进程使用了文件描述符3，另一个进程也可以用3。除了进程级的文件描述符表，系统还需要维护另外两张表：打开文件表、i-node 表。这两张表存储了每个打开文件的打开文件句柄（open file handle）。一个打开文件句柄存储了与一个打开文件相关的全部信息。&lt;/p>
&lt;p>和fd相关的一共有3张表，分别是file descriptor、file table、inode table，如下图所示。&lt;/p>
&lt;p>&lt;img loading="lazy" src="https://photo-lea.s3.bitiful.net/photo/103748658-67d36100-503f-11eb-960b-e77683e751f7.png">&lt;/p>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>file descriptors&lt;/strong>&lt;/p>
&lt;p>file descriptors table由用户进程所有，每个进程都有一个这样的表，这里记录了进程打开的文件所代表的fd，fd的值映射到file table中的条目(entry)。&lt;/p></description></item><item><title>linux</title><link>http://note.leabol.top/posts/linux/</link><pubDate>Wed, 10 Jun 2026 00:00:00 +0000</pubDate><guid>http://note.leabol.top/posts/linux/</guid><description>&lt;h2 id="文件的10个关键系统调用">文件的10个关键系统调用&lt;/h2>
&lt;ul>
&lt;li>open/close&lt;/li>
&lt;li>read/write/lseek(随机查找)&lt;/li>
&lt;li>fstst(返回文件数据)/ftruncate(清空)&lt;/li>
&lt;li>unlink(删除文件)/mkdir / dup&lt;/li>
&lt;/ul>
&lt;h2 id="文件系统的抽象">文件系统的抽象&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-c" data-lang="c">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">struct&lt;/span> File {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">mode&lt;/span> (permissions, type); size; user; group;&lt;span style="color:#75715e">//type数据结构的类型
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> &lt;span style="color:#a6e22e">timestamps&lt;/span>(atime, mtime,ctime);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">content&lt;/span> (bytes);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>};
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>map &amp;lt;string, File&amp;gt; // from file path to file
一种数据结构, 从路径到文件的映射&lt;/p></description></item><item><title>linux select函数</title><link>http://note.leabol.top/posts/linux-select%E5%87%BD%E6%95%B0/</link><pubDate>Wed, 10 Jun 2026 00:00:00 +0000</pubDate><guid>http://note.leabol.top/posts/linux-select%E5%87%BD%E6%95%B0/</guid><description>&lt;h1 id="linux-select函数">linux select函数&lt;/h1>
&lt;p>在Linux中，我们可以使用select函数实现I/O端口的复用，传递给 select函数的参数会告诉内核：&lt;/p>
&lt;ul>
&lt;li>
&lt;p>我们所关心的文件描述符&lt;/p>
&lt;/li>
&lt;li>
&lt;p>对每个描述符，我们所关心的状态。(我们是要想从一个文件描述符中读或者写，还是关注一个描述符中是否出现异常)&lt;/p>
&lt;/li>
&lt;li>
&lt;p>我们要等待多长时间。(我们可以等待无限长的时间，等待固定的一段时间，或者根本就不等待)&lt;/p>
&lt;/li>
&lt;/ul>
&lt;p>从 select函数返回后，内核告诉我们一下信息：&lt;/p>
&lt;ul>
&lt;li>
&lt;p>对我们的要求已经做好准备的描述符的个数&lt;/p>
&lt;/li>
&lt;li>
&lt;p>对于三种条件哪些描述符已经做好准备.(读，写，异常)&lt;/p>
&lt;/li>
&lt;/ul>
&lt;p>有了这些返回信息，我们可以调用合适的I/O函数(通常是 read 或 write)，并且这些函数不会再阻塞.&lt;/p>
&lt;h2 id="函数声明">函数声明&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-c" data-lang="c">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#include&lt;/span> &lt;span style="color:#75715e">&amp;lt;sys/select.h&amp;gt; &lt;/span>&lt;span style="color:#75715e">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">int&lt;/span> &lt;span style="color:#a6e22e">select&lt;/span>(&lt;span style="color:#66d9ef">int&lt;/span> maxfdp1, fd_set &lt;span style="color:#f92672">*&lt;/span>readset, fd_set &lt;span style="color:#f92672">*&lt;/span>writeset, fd_set &lt;span style="color:#f92672">*&lt;/span>exceptset,&lt;span style="color:#66d9ef">struct&lt;/span> timeval &lt;span style="color:#f92672">*&lt;/span>timeout);
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>返回值&lt;/strong>：做好准备的文件描述符的个数，超时为0，错误为 -1.&lt;/p>
&lt;h2 id="参数">参数&lt;/h2>
&lt;h3 id="struct-timeval">struct timeval&lt;/h3>
&lt;p>首先我们先看一下最后一个参数。它指明我们要等待的时间：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-c" data-lang="c">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">struct&lt;/span> timeval{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">long&lt;/span> tv_sec; &lt;span style="color:#75715e">/*秒 */&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">long&lt;/span> tv_usec; &lt;span style="color:#75715e">/*微秒 */&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="有三种情况">有三种情况：&lt;/h4>
&lt;p>&lt;strong>timeout == NULL&lt;/strong> 等待无限长的时间。等待可以被一个信号中断。当有一个描述符做好准备或者是捕获到一个信号时函数会返回。如果捕获到一个信号， select函数将返回 -1,并将变量 erro设为 EINTR。&lt;/p>
&lt;p>&lt;strong>timeout-&amp;gt;tv_sec == 0 &amp;amp;&amp;amp;timeout-&amp;gt;tv_usec == 0&lt;/strong>不等待，直接返回。加入描述符集的描述符都会被测试，并且返回满足要求的描述符的个数。这种方法通过轮询，无阻塞地获得了多个文件描述符状态。&lt;/p>
&lt;p>&lt;strong>timeout-&amp;gt;tv_sec !=0 ||timeout-&amp;gt;tv_usec!= 0&lt;/strong> 等待指定的时间。当有描述符符合条件或者超过超时时间的话，函数返回。在超时时间即将用完但又没有描述符合条件的话，返回 0。对于第一种情况，等待也会被信号所中断。&lt;/p>
&lt;h3 id="readset-writset-exceptse">readset, writset, exceptse&lt;/h3>
&lt;p>中间的三个参数 readset, writset, exceptset,指向描述符集。这些参数指明了我们关心哪些描述符，和需要满足什么条件(可写，可读，异常)。一个文件描述集保存在 fd_set 类型中。fd_set类型变量每一位代表了一个描述符。我们也可以认为它只是一个由很多二进制位构成的数组。如下图所示：&lt;/p></description></item><item><title>Makefile 的基本概念</title><link>http://note.leabol.top/posts/makefile/</link><pubDate>Wed, 10 Jun 2026 00:00:00 +0000</pubDate><guid>http://note.leabol.top/posts/makefile/</guid><description>&lt;p>&lt;strong>Makefile&lt;/strong> 是 make 工具的配置文件，主要用于定义如何构建和管理项目的编译过程。Makefile 是 C/C++ 编译项目中的重要工具，尤其在多文件、多模块的项目中，为了方便复杂项目的管理，可以通过自动化规则提高编译效率。&lt;/p>
&lt;p>这篇文章是 Makefile 的入门教程的介绍，包括其基本语法、常用功能、以及实际使用中的高级技巧。&lt;/p>
&lt;h3 id="makefile-的基本概念">Makefile 的基本概念&lt;/h3>
&lt;p>安装 &lt;code>make&lt;/code>：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo apt-get update
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo apt-get install make
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="核心功能">核心功能&lt;/h3>
&lt;ul>
&lt;li>&lt;a href="https://zhida.zhihu.com/search?content_id=707902769&amp;amp;content_type=Answer&amp;amp;match_order=1&amp;amp;q=%E8%87%AA%E5%8A%A8%E5%8C%96%E7%BC%96%E8%AF%91&amp;amp;zhida_source=entity">自动化编译&lt;/a>：根据文件的依赖关系自动决定哪些文件需要重新编译。&lt;/li>
&lt;li>提高效率：只编译发生变化的部分。&lt;/li>
&lt;li>&lt;a href="https://zhida.zhihu.com/search?content_id=707902769&amp;amp;content_type=Answer&amp;amp;match_order=1&amp;amp;q=%E5%A4%9A%E4%BB%BB%E5%8A%A1%E6%94%AF%E6%8C%81&amp;amp;zhida_source=entity">多任务支持&lt;/a>：可以定义清理、打包、测试等任务。&lt;/li>
&lt;/ul>
&lt;h3 id="使用方法">使用方法&lt;/h3>
&lt;p>运行&lt;code>make&lt;/code>命令时，默认会读取当前目录下的&lt;strong>Makefile 文件&lt;/strong>。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>make &lt;span style="color:#75715e"># 执行默认的目标&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>make &amp;lt;target&amp;gt; &lt;span style="color:#75715e"># 执行指定的目标&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>make clean &lt;span style="color:#75715e"># 执行 &amp;#34;clean&amp;#34; 目标&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="makefile-的基本语法">Makefile 的基本语法&lt;/h3>
&lt;h3 id="1-目标语法">1. 目标语法&lt;/h3>
&lt;p>&lt;strong>Makefile&lt;/strong> 的基本语法如下：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>target: prerequisites
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> commands
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>&lt;strong>target&lt;/strong>：目标文件或命令名称。例如可执行文件、目标文件或任务名称。&lt;/li>
&lt;li>&lt;strong>prerequisites&lt;/strong>：依赖文件或其他目标。只有依赖文件发生变化时，target 才会被重新生成。&lt;/li>
&lt;li>&lt;strong>commands&lt;/strong>：生成目标的命令（必须以 &lt;strong>Tab&lt;/strong> 开头）。&lt;/li>
&lt;/ul>
&lt;p>示例：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>hello: hello.o
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> gcc -o hello hello.o
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>hello.o: hello.c
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> gcc -c hello.c
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>在示例代码中：&lt;/p></description></item><item><title>MySQL</title><link>http://note.leabol.top/posts/%E5%AE%89%E8%A3%85mysql/</link><pubDate>Wed, 10 Jun 2026 00:00:00 +0000</pubDate><guid>http://note.leabol.top/posts/%E5%AE%89%E8%A3%85mysql/</guid><description>&lt;ol>
&lt;li>
&lt;p>&lt;strong>更新包管理器&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>对于Ubuntu/Debian：
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo apt update
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>安装MySQL Server&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>对于Ubuntu/Debian：
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo apt install mysql-server
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>启动MySQL服务&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>对于Ubuntu/Debian：
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo systemctl start mysql
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>设置root密码&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>运行以下命令：
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo mysql_secure_installation
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>验证安装&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>运行以下命令登录MySQL：
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>mysql -u root -p
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ol></description></item><item><title>一些网站</title><link>http://note.leabol.top/posts/%E4%B8%80%E4%BA%9B%E7%BD%91%E7%AB%99/</link><pubDate>Wed, 10 Jun 2026 00:00:00 +0000</pubDate><guid>http://note.leabol.top/posts/%E4%B8%80%E4%BA%9B%E7%BD%91%E7%AB%99/</guid><description>&lt;p>&lt;a href="https://www.ruanyifeng.com/blog/2010/10/why_lisp_is_superior.html">为什么Lisp语言如此先进?&lt;/a>&lt;/p>
&lt;p>&lt;a href="https://norvig.com/">一个前辈的官网&lt;/a>&lt;/p></description></item><item><title>为什么叫补码</title><link>http://note.leabol.top/posts/%E5%8E%9F%E7%A0%81-%E5%8F%8D%E7%A0%81%E5%92%8C%E8%A1%A5%E7%A0%81/</link><pubDate>Wed, 10 Jun 2026 00:00:00 +0000</pubDate><guid>http://note.leabol.top/posts/%E5%8E%9F%E7%A0%81-%E5%8F%8D%E7%A0%81%E5%92%8C%E8%A1%A5%E7%A0%81/</guid><description>&lt;h3 id="为什么叫补码twos-complement">为什么叫补码(Two&amp;rsquo;s complement)&lt;/h3>
&lt;p>计算机的加减法运算天生是一个&lt;a href="https://zhida.zhihu.com/search?content_id=190505781&amp;amp;content_type=Answer&amp;amp;match_order=1&amp;amp;q=%E6%A8%A12%5EN&amp;amp;zhida_source=entity">模2^N&lt;/a>的&lt;a href="https://zhida.zhihu.com/search?content_id=190505781&amp;amp;content_type=Answer&amp;amp;match_order=1&amp;amp;q=%E5%90%8C%E4%BD%99%E7%B1%BB&amp;amp;zhida_source=entity">同余类&lt;/a>上的运算，满2^N会抛弃进位，那表示有符号数时使用同余类代表很正常吧，比如-1 = 2^N -1 (mod 2^N)，-2 = 2^N-2 (mod 2^N)，这实际上就是&lt;a href="https://zhida.zhihu.com/search?content_id=190505781&amp;amp;content_type=Answer&amp;amp;match_order=1&amp;amp;q=%E8%A1%A5%E7%A0%81&amp;amp;zhida_source=entity">补码&lt;/a>了。&lt;/p></description></item><item><title>关于位图存储与数组下标存储的探讨</title><link>http://note.leabol.top/posts/%E5%85%B3%E4%BA%8E%E4%BD%8D%E5%9B%BE%E5%AD%98%E5%82%A8%E4%B8%8E%E6%95%B0%E7%BB%84%E4%B8%8B%E6%A0%87%E5%AD%98%E5%82%A8%E7%9A%84%E6%8E%A2%E8%AE%A8/</link><pubDate>Wed, 10 Jun 2026 00:00:00 +0000</pubDate><guid>http://note.leabol.top/posts/%E5%85%B3%E4%BA%8E%E4%BD%8D%E5%9B%BE%E5%AD%98%E5%82%A8%E4%B8%8E%E6%95%B0%E7%BB%84%E4%B8%8B%E6%A0%87%E5%AD%98%E5%82%A8%E7%9A%84%E6%8E%A2%E8%AE%A8/</guid><description>&lt;h1 id="关于位图存储与数组下标存储的探讨">关于位图存储与数组下标存储的探讨&lt;/h1>
&lt;p>最近在看《编程珠玑》，书中的第一章提到了位图。位图存储使用二进制位的位数信息，来表示数字。例如，存储1、3、4、6、8，这五个数字， 可以使用&amp;lt;1, 0, 1, 1, 0, 1, 0, 1&amp;gt;这样的向量来表示，这样可以大大减少存储空间， 只用了一个字节（8bit），就可以存储原来需要的8个数字才能表示的信息。&lt;/p>
&lt;p>当我跟朋友谈到这个方法时，他却产生了质疑，他觉得这样不如直接按照数组下标存储来的快。他认为数组下标直接存储，直接一步完成，二位图则需要每次位运算寻址，会非常费时间。于是我们就决定写一个程序，实际跑一下看看。&lt;/p>
&lt;p>这是位图的代码&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-c" data-lang="c">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">typedef&lt;/span> &lt;span style="color:#66d9ef">struct&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">uint32_t&lt;/span> &lt;span style="color:#f92672">*&lt;/span>bits;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">size_t&lt;/span> size;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>} Bitmap;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Bitmap &lt;span style="color:#f92672">*&lt;/span>&lt;span style="color:#a6e22e">create_bitmap&lt;/span>(&lt;span style="color:#66d9ef">size_t&lt;/span> max_num) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">size_t&lt;/span> num_words &lt;span style="color:#f92672">=&lt;/span> (max_num &lt;span style="color:#f92672">+&lt;/span> &lt;span style="color:#ae81ff">31&lt;/span>) &lt;span style="color:#f92672">/&lt;/span> &lt;span style="color:#ae81ff">32&lt;/span>; &lt;span style="color:#75715e">// 计算需要多少个32位字
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> Bitmap &lt;span style="color:#f92672">*&lt;/span>bm &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">malloc&lt;/span>(&lt;span style="color:#66d9ef">sizeof&lt;/span>(Bitmap));
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> (&lt;span style="color:#f92672">!&lt;/span>bm) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">perror&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;Bitmap allocation failed&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">exit&lt;/span>(EXIT_FAILURE);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> bm&lt;span style="color:#f92672">-&amp;gt;&lt;/span>bits &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">calloc&lt;/span>(num_words, &lt;span style="color:#66d9ef">sizeof&lt;/span>(&lt;span style="color:#66d9ef">uint32_t&lt;/span>)); &lt;span style="color:#75715e">// 分配约 1亿位 ≈ 12.5MB
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> bm&lt;span style="color:#f92672">-&amp;gt;&lt;/span>size &lt;span style="color:#f92672">=&lt;/span> max_num;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> (&lt;span style="color:#f92672">!&lt;/span>bm&lt;span style="color:#f92672">-&amp;gt;&lt;/span>bits) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">perror&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;Bitmap bits allocation failed&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">exit&lt;/span>(EXIT_FAILURE);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> bm;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">void&lt;/span> &lt;span style="color:#a6e22e">bitmap_set&lt;/span>(Bitmap &lt;span style="color:#f92672">*&lt;/span>bm, &lt;span style="color:#66d9ef">int&lt;/span> num) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">size_t&lt;/span> word_idx &lt;span style="color:#f92672">=&lt;/span> num &lt;span style="color:#f92672">/&lt;/span> &lt;span style="color:#ae81ff">32&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">size_t&lt;/span> bit_idx &lt;span style="color:#f92672">=&lt;/span> num &lt;span style="color:#f92672">%&lt;/span> &lt;span style="color:#ae81ff">32&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> bm&lt;span style="color:#f92672">-&amp;gt;&lt;/span>bits[word_idx] &lt;span style="color:#f92672">|=&lt;/span> (&lt;span style="color:#ae81ff">1U&lt;/span> &lt;span style="color:#f92672">&amp;lt;&amp;lt;&lt;/span> bit_idx);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">int&lt;/span> &lt;span style="color:#a6e22e">bitmap_get&lt;/span>(&lt;span style="color:#66d9ef">const&lt;/span> Bitmap &lt;span style="color:#f92672">*&lt;/span>bm, &lt;span style="color:#66d9ef">int&lt;/span> num) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">size_t&lt;/span> word_idx &lt;span style="color:#f92672">=&lt;/span> num &lt;span style="color:#f92672">/&lt;/span> &lt;span style="color:#ae81ff">32&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">size_t&lt;/span> bit_idx &lt;span style="color:#f92672">=&lt;/span> num &lt;span style="color:#f92672">%&lt;/span> &lt;span style="color:#ae81ff">32&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> (bm&lt;span style="color:#f92672">-&amp;gt;&lt;/span>bits[word_idx] &lt;span style="color:#f92672">&amp;gt;&amp;gt;&lt;/span> bit_idx) &lt;span style="color:#f92672">&amp;amp;&lt;/span> &lt;span style="color:#ae81ff">1U&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>位运算把每个字节大小的内存当作为一组，使用除法判断组数， 再用对8取余，得出每组的位次&lt;/p></description></item><item><title>基础算法归纳</title><link>http://note.leabol.top/posts/%E5%9F%BA%E7%A1%80%E7%AE%97%E6%B3%95%E5%BD%92%E7%BA%B3/</link><pubDate>Wed, 10 Jun 2026 00:00:00 +0000</pubDate><guid>http://note.leabol.top/posts/%E5%9F%BA%E7%A1%80%E7%AE%97%E6%B3%95%E5%BD%92%E7%BA%B3/</guid><description>&lt;h1 id="基础算法归纳">基础算法归纳&lt;/h1>
&lt;p>#cs #c #算法&lt;/p>
&lt;h2 id="输出最大值">输出最大值&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-C" data-lang="C">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#include&lt;/span> &lt;span style="color:#75715e">&amp;lt;stdio.h&amp;gt;&lt;/span>&lt;span style="color:#75715e">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">int&lt;/span> &lt;span style="color:#a6e22e">main&lt;/span>(&lt;span style="color:#66d9ef">void&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">int&lt;/span> i[&lt;span style="color:#ae81ff">3&lt;/span>], max;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">scanf&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;%d %d %d&amp;#34;&lt;/span>, &lt;span style="color:#f92672">&amp;amp;&lt;/span>i[&lt;span style="color:#ae81ff">0&lt;/span>], &lt;span style="color:#f92672">&amp;amp;&lt;/span>i[&lt;span style="color:#ae81ff">1&lt;/span>], &lt;span style="color:#f92672">&amp;amp;&lt;/span>i[&lt;span style="color:#ae81ff">2&lt;/span>]);&lt;span style="color:#75715e">//通过数组来代替不同变量
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> max &lt;span style="color:#f92672">=&lt;/span> i[&lt;span style="color:#ae81ff">0&lt;/span>];
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">for&lt;/span> (&lt;span style="color:#66d9ef">int&lt;/span> j &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">1&lt;/span>; j &lt;span style="color:#f92672">&amp;lt;&lt;/span> n; j&lt;span style="color:#f92672">++&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> (max &lt;span style="color:#f92672">&amp;lt;&lt;/span> i[j])
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> max &lt;span style="color:#f92672">=&lt;/span> i[j];
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">printf&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;%d&amp;#34;&lt;/span>, max);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="冒泡排序">冒泡排序&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-C" data-lang="C">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">void&lt;/span> &lt;span style="color:#a6e22e">BubbleSort&lt;/span>(&lt;span style="color:#66d9ef">int&lt;/span> arr[], &lt;span style="color:#66d9ef">int&lt;/span> n)&lt;span style="color:#75715e">//arr[] 在c中要用第一个数组值
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">int&lt;/span> flag, tmp;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">for&lt;/span> (&lt;span style="color:#66d9ef">int&lt;/span> i &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">0&lt;/span>; i &lt;span style="color:#f92672">&amp;lt;&lt;/span> n &lt;span style="color:#f92672">-&lt;/span> &lt;span style="color:#ae81ff">1&lt;/span>; i&lt;span style="color:#f92672">++&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> flag &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">0&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">for&lt;/span> (&lt;span style="color:#66d9ef">int&lt;/span> j &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">0&lt;/span>; j &lt;span style="color:#f92672">&amp;lt;&lt;/span> n &lt;span style="color:#f92672">-&lt;/span> i &lt;span style="color:#f92672">-&lt;/span>&lt;span style="color:#ae81ff">1&lt;/span>; j&lt;span style="color:#f92672">++&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> (arr[j] &lt;span style="color:#f92672">&amp;gt;&lt;/span> arr[j &lt;span style="color:#f92672">+&lt;/span> &lt;span style="color:#ae81ff">1&lt;/span>])
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> tmp &lt;span style="color:#f92672">=&lt;/span> arr[j];
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> arr[j] &lt;span style="color:#f92672">=&lt;/span> arr[j &lt;span style="color:#f92672">+&lt;/span> &lt;span style="color:#ae81ff">1&lt;/span>];
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> arr[j &lt;span style="color:#f92672">+&lt;/span> &lt;span style="color:#ae81ff">1&lt;/span>] &lt;span style="color:#f92672">=&lt;/span> tmp;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> flag &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">1&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> (&lt;span style="color:#f92672">!&lt;/span>flag)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="筛选素数">筛选素数&lt;/h2>
&lt;p>暴力搜索&lt;/p></description></item><item><title>学习计划</title><link>http://note.leabol.top/posts/%E5%A4%A7%E4%B8%80%E7%9A%84cs%E5%AD%A6%E4%B9%A0%E8%AE%A1%E5%88%92/</link><pubDate>Wed, 10 Jun 2026 00:00:00 +0000</pubDate><guid>http://note.leabol.top/posts/%E5%A4%A7%E4%B8%80%E7%9A%84cs%E5%AD%A6%E4%B9%A0%E8%AE%A1%E5%88%92/</guid><description>&lt;p>#学习计划 #cs&lt;/p>
&lt;h2 id="课程学习">课程学习&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>编程入门&lt;/strong>
CS50 已完成&lt;/li>
&lt;li>&lt;strong>数据结构与算法&lt;/strong>
106X : 50-70小时&lt;/li>
&lt;li>&lt;strong>一些工具的使用与知识点&lt;/strong>
MIT-Missing-Semester: 10小时&lt;/li>
&lt;li>&lt;strong>组成原理 体系结构 操作系统&lt;/strong>( 106x前10集后)
CMU CS15213: CSAPP: 难度很大,150小时&lt;/li>
&lt;li>&lt;strong>算法导论&lt;/strong>( 106x学完后)
-mit 6.006&lt;/li>
&lt;/ul>
&lt;h2 id="课外学习">课外学习&lt;/h2>
&lt;ul>
&lt;li>工作岗位的了解，相关技术词汇的了解&lt;/li>
&lt;li>积累项目经验, 对于本科生来说，积累项目实践经验的方式通常有三种，其一是加入到老师的课题组当中，这种方式更适合于重点大学的本科生，普通大学的本科生加入项目组的机会通常比较少；其二是参加一些专业比赛，通过参加专业比赛往往能够积累更多的实践经验，而且会获得专业老师的指导；其三是参加一些开源项目，这种方式对于学生的技术要求相对高一些，通常需要从阅读开源系统的源代码开始。&lt;/li>
&lt;/ul></description></item><item><title>学习计划</title><link>http://note.leabol.top/posts/%E5%AD%A6%E4%B9%A0%E8%AE%A1%E5%88%92/</link><pubDate>Wed, 10 Jun 2026 00:00:00 +0000</pubDate><guid>http://note.leabol.top/posts/%E5%AD%A6%E4%B9%A0%E8%AE%A1%E5%88%92/</guid><description>&lt;h2 id="年计划">年计划&lt;/h2>
&lt;ul>
&lt;li>英语四级 考了&lt;/li>
&lt;li>日语n1 没考&lt;/li>
&lt;li>&lt;strong>数据结构与算法&lt;/strong> 完成了30%
106X (26节课)&lt;/li>
&lt;li>&lt;strong>组成原理 体系结构 操作系统&lt;/strong>( 106x前10集后) 未开始
CMU CS15213: CSAPP&lt;/li>
&lt;li>
&lt;ul>
&lt;li>&lt;strong>算法导论&lt;/strong>( 106x学完后) 未开始
-mit 6.006 (21节课)&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>网络&lt;/strong>&lt;/li>
&lt;li>&lt;strong>编译原理&lt;/strong>&lt;/li>
&lt;/ul></description></item><item><title>学习计划</title><link>http://note.leabol.top/posts/%E8%AF%BE%E7%A8%8B%E5%AD%A6%E4%B9%A0%E8%B7%AF%E7%BA%BF/</link><pubDate>Wed, 10 Jun 2026 00:00:00 +0000</pubDate><guid>http://note.leabol.top/posts/%E8%AF%BE%E7%A8%8B%E5%AD%A6%E4%B9%A0%E8%B7%AF%E7%BA%BF/</guid><description>&lt;p>#学习计划 #cs
大一上: 106X 106L 算法导论
大一下: CSAPP 网络 编译原理
大二上: 15-445 15-418
大二下: CS162 6.046
大三: 准备校招或者考研&lt;/p>
&lt;!-- raw HTML omitted --></description></item><item><title>学习计划总结</title><link>http://note.leabol.top/posts/%E5%A4%A7%E4%B8%80%E4%B8%8B%E5%AD%A6%E6%9C%9F%E8%AF%BE%E7%A8%8B%E8%80%83%E5%AF%9F%E5%AE%8C/</link><pubDate>Wed, 10 Jun 2026 00:00:00 +0000</pubDate><guid>http://note.leabol.top/posts/%E5%A4%A7%E4%B8%80%E4%B8%8B%E5%AD%A6%E6%9C%9F%E8%AF%BE%E7%A8%8B%E8%80%83%E5%AF%9F%E5%AE%8C/</guid><description>&lt;h2 id="总结">总结&lt;/h2>
&lt;ul>
&lt;li>计划的很理想，现实却有很多问题，过于相信课堂上的学习效率，上课时容易被老师打断，效率极低&lt;/li>
&lt;li>高数与线代学习的不踏实，需要注意，英语有进步&lt;/li>
&lt;li>注意平时积累，不要到最后抱佛脚&lt;/li>
&lt;/ul>
&lt;h2 id="高数">高数&lt;/h2>
&lt;ul>
&lt;li>微积分很重要, 是进入现代科学的基础. 但是对于cs来说重要性却没那么高, 所以重要性没那么强了. 鉴于这学期老师比较严格, 上课主要还是自学加写作业为主。&lt;strong>ps：平时缺乏练习，导致花了很长时间复习。&lt;/strong>&lt;/li>
&lt;/ul>
&lt;h2 id="线性代数">线性代数&lt;/h2>
&lt;ul>
&lt;li>很重要的一门数学课, 在cs领域相当重要. 但是教科书与老师的教学都太落后, 所以选择用自己的教材自学, 上课也是写作业加自学为主 &lt;strong>ps：自己选的教材翻译太烂，放弃了。之后老师上课声音太大，完全没法自学。最后通过网上的突击视频，花了三天考过了。&lt;/strong>&lt;/li>
&lt;/ul>
&lt;h2 id="物理">物理&lt;/h2>
&lt;ul>
&lt;li>虽然喜欢物理, 但是对于cs来说用处不大, 而且这门课内容多, 学习起来相当耗费时间. 而且老师也比较随和（&lt;strong>ps：相当不行）, 所以主要通过作业来学习, 上课时间写之前的作业, 之后可以学习其他的东西PS：上课学习其他的东西，效率低，也没有写作业，老师基本不布置作业。&lt;/strong>&lt;/li>
&lt;/ul>
&lt;h2 id="电子技术">电子技术&lt;/h2>
&lt;ul>
&lt;li>偏硬件的课, 但是却浅尝辄止, 学一些皮毛, 要学习内容也是浩如烟海, 相当多. 所以也是通过作业来学习, 上课时间写之前的作业, 之后可以学习其他的东西 &lt;strong>PS：上课学习其他的东西，效率低，也没有写作业，老师基本不布置作业。最后再老师划重点下，考过了。&lt;/strong>&lt;/li>
&lt;/ul>
&lt;h2 id="英语">英语&lt;/h2>
&lt;ul>
&lt;li>视听说, 老师不错, 上课可以听. 毕竟环境不适合学其他的&lt;/li>
&lt;li>读写译, 老师不错, 比较认真, 上课只能听.&lt;/li>
&lt;/ul>
&lt;h2 id="心理">心理&lt;/h2>
&lt;ul>
&lt;li>水课&lt;/li>
&lt;/ul>
&lt;h2 id="形式与政策">形式与政策&lt;/h2>
&lt;ul>
&lt;li>水课&lt;/li>
&lt;/ul></description></item><item><title>文件控制函数</title><link>http://note.leabol.top/posts/linux-fcntl%E5%87%BD%E6%95%B0/</link><pubDate>Wed, 10 Jun 2026 00:00:00 +0000</pubDate><guid>http://note.leabol.top/posts/linux-fcntl%E5%87%BD%E6%95%B0/</guid><description>&lt;h1 id="文件控制函数--file-control">文件控制函数 file control&lt;/h1>
&lt;h2 id="功能描述">功能描述&lt;/h2>
&lt;p>fcntl函数可以用来对已打开的文件描述符进行各种控制操作, 以改变已打开文件的的各种属性&lt;/p>
&lt;p>&lt;strong>头文件&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-c" data-lang="c">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#include&lt;/span> &lt;span style="color:#75715e">&amp;lt;unistd.h&amp;gt;&lt;/span>&lt;span style="color:#75715e">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#include&lt;/span> &lt;span style="color:#75715e">&amp;lt;fcntl.h&amp;gt;&lt;/span>&lt;span style="color:#75715e">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="函数原型">&lt;strong>函数原型&lt;/strong>&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-c" data-lang="c">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">int&lt;/span> &lt;span style="color:#a6e22e">fcntl&lt;/span>(&lt;span style="color:#66d9ef">int&lt;/span> fd, &lt;span style="color:#66d9ef">int&lt;/span> cmd);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">int&lt;/span> &lt;span style="color:#a6e22e">fcntl&lt;/span>(&lt;span style="color:#66d9ef">int&lt;/span> fd, &lt;span style="color:#66d9ef">int&lt;/span> cmd, &lt;span style="color:#66d9ef">long&lt;/span> arg);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>c
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">int&lt;/span> &lt;span style="color:#a6e22e">fcntl&lt;/span>(&lt;span style="color:#66d9ef">int&lt;/span> fd, &lt;span style="color:#66d9ef">int&lt;/span> cmd, &lt;span style="color:#66d9ef">struct&lt;/span> flock &lt;span style="color:#f92672">*&lt;/span>lock);
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="描述">&lt;strong>描述&lt;/strong>&lt;/h3>
&lt;p>fcntl()针对(文件)描述符提供控制.参数fd是被参数cmd操作(如下面的描述)的描述符.&lt;/p>
&lt;p>针对cmd的值,fcntl能够接受第三个参数（arg）&lt;/p>
&lt;h3 id="fcntl函数有5种功能c">&lt;strong>fcntl函数有5种功能c&lt;/strong>&lt;/h3>
&lt;ol>
&lt;li>
&lt;p>复制一个现有的描述符（cmd=F_DUPFD）.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>获得／设置文件描述符标记(cmd=F_GETFD或F_SETFD).&lt;/p>
&lt;/li>
&lt;li>
&lt;p>获得／设置文件状态标记(cmd=F_GETFL或F_SETFL).&lt;/p>
&lt;/li>
&lt;li>
&lt;p>获得／设置异步I/O所有权(cmd=F_GETOWN或F_SETOWN).&lt;/p>
&lt;/li>
&lt;li>
&lt;p>获得／设置记录锁(cmd=F_GETLK,F_SETLK或F_SETLKW).&lt;/p>
&lt;/li>
&lt;/ol>
&lt;h3 id="cmd-选项">&lt;strong>cmd 选项&lt;/strong>&lt;/h3>
&lt;p>&lt;strong>F_DUPFD&lt;/strong> 返回一个如下描述的(文件)描述符:&lt;/p>
&lt;p>（1）最小的大于或等于arg的一个可用的描述符&lt;/p>
&lt;p>（2）与原始操作符一样的某对象的引用&lt;/p>
&lt;p>（3）如果对象是文件(file)的话,返回一个新的描述符,这个描述符与arg共享相同的偏移量(offset)&lt;/p>
&lt;p>（4）相同的访问模式(读,写或读/写)&lt;/p>
&lt;p>（5）相同的文件状态标志(如:两个文件描述符共享相同的状态标志)&lt;/p>
&lt;p>（6）与新的文件描述符结合在一起的close-on-exec标志被设置成交叉式访问execve(2)的系统调用&lt;/p>
&lt;p>&lt;strong>F_GETFD&lt;/strong> 取得与文件描述符fd联合close-on-exec标志,类似FD_CLOEXEC.&lt;/p>
&lt;p>如果返回值和FD_CLOEXEC进行与运算结果是0的话,文件保持交叉式访问exec(),否则如果通过exec运行的话,文件将被关闭(arg被忽略)&lt;/p>
&lt;p>&lt;strong>F_SETFD&lt;/strong> 设置close-on-exec旗标。该旗标以参数arg的FD_CLOEXEC位决定。&lt;/p>
&lt;p>&lt;strong>F_GETFL&lt;/strong> 取得fd的文件状态标志,如同下面的描述一样(arg被忽略)&lt;/p>
&lt;p>&lt;strong>F_SETFL&lt;/strong> 设置给arg描述符状态标志,可以更改的几个标志是：O_APPEND， O_NONBLOCK，O_SYNC和O_ASYNC。&lt;/p>
&lt;p>&lt;strong>F_GETOWN&lt;/strong> 取得当前正在接收SIGIO或者SIGURG信号的进程id或进程组id,进程组id返回成负值(arg被忽略)&lt;/p>
&lt;p>&lt;strong>F_SETOWN&lt;/strong> 设置将接收SIGIO和SIGURG信号的进程id或进程组id,进程组id通过提供负值的arg来说明,否则,arg将被认为是进程id&lt;/p>
&lt;p>命令字(cmd)F_GETFL和F_SETFL的标志如下面的描述:&lt;/p>
&lt;p>&lt;strong>O_NONBLOCK&lt;/strong> 非阻塞I/O ; 如果read(2)调用没有可读取的数据,或者如果write(2)操作将阻塞,read或write调用返回-1和EAGAIN错误 　&lt;/p>
&lt;p>&lt;strong>O_APPEND&lt;/strong> 强制每次写(write)操作都添加在文件大的末尾,相当于open(2)的O_APPEND标志&lt;/p>
&lt;p>&lt;strong>O_DIRECT&lt;/strong> 最小化或去掉reading和writing的缓存影响.系统将企图避免缓存你的读或写的数据.&lt;/p>
&lt;p>　　如果不能够避免缓存,那么它将最小化已经被缓存了的数 据造成的影响.如果这个标志用的不够好,将大大的降低性能&lt;/p>
&lt;p>&lt;strong>O_ASYNC&lt;/strong> 当I/O可用的时候,允许SIGIO信号发送到进程组,例如:当有数据可以读的时候&lt;/p>
&lt;p>**注意：**在修改文件描述符标志或文件状态标志时必须谨慎，先要取得现在的标志值，然后按照希望修改它，最后设置新标志值。不能只是执行F_SETFD或F_SETFL命令，这样会关闭以前设置的标志位。&lt;/p></description></item><item><title>杭州建人高复（杭师大）</title><link>http://note.leabol.top/posts/%E9%AB%98%E5%A4%8D%E6%97%B6%E6%9C%9F/</link><pubDate>Wed, 10 Jun 2026 00:00:00 +0000</pubDate><guid>http://note.leabol.top/posts/%E9%AB%98%E5%A4%8D%E6%97%B6%E6%9C%9F/</guid><description>&lt;p>&lt;em>&lt;strong>&lt;strong>杭州建人高复（杭师大) 2023&lt;/strong>&lt;/strong>&lt;/em>**&lt;/p>
&lt;p>~~自作清高的大树，不但无法为人挡风遮雨，还可能给人带来灾难。~~树按照自己的本性生长，不需要顾及也无法顾及其他。大树只是自然地生长，枯萎，死亡。&lt;/p>
&lt;p>不公平是客观存在的，即使建立新的制度也依旧存在不公平。但只要不触及个人的底线或者根本利益，可以放平自己心态。如果损害他人来使自己获利，这是不能接受的。&lt;/p>
&lt;p>对手机已经是感情上的依赖了，所以一旦拿到手机，即使无事可做也会有安心感，尤其在安全区之外。这因该也是一种把内心寄托于外物的表现。寄情于物或者寄情于人都应当谨慎些。&lt;/p>
&lt;p>任何道理，不论多么了解，多么熟悉，都不如亲自尝试一遍，知与行的差距非常大，更何况还会遗忘。&lt;/p>
&lt;p>学习完全不会的东西与使用已经会的东西，做这些事所消耗的精力要远小于在意识模糊地带中寻找知识。因此减少在模糊地带的徘徊。&lt;em>2024年1月注&lt;/em> 由此可见,，想要通过碎片化的知识来潜移默化的学习是效率底下的。沾花惹草式的学习，以后可能要花费更多的精力。&lt;/p>
&lt;p>学习需要大量的实践，当略有所思时，更应该不断的实践，而不是停下来苦思。因为很有可能是错的。&lt;/p>
&lt;p>自身精力的管理是一种非常重要的能力。即使是重复的日常生活，如果不去管理精力，也很难过得好。无意义的情绪波动，会让人心力憔悴，难以专心做事。因此专心只做一件事，放下多余的想法和各种执念，只做好自己。&lt;/p>
&lt;p>在眼前绽放的鲜活的生命力，令我震撼不已。我充满不可思议的崇拜的心情，注视着。那种生命力是如何形成的，我很好奇。我已经被这种生命力折服，看到这个场景，又给了我一些对这个世界的美好向往。&lt;/p>
&lt;p>正视自身，正视内心是一切进步的前提。只有正视了自己，才能了解自己的不足与极限，从而有所改变。正视自己的内心，才能明确自己想要的，从而有了目标。但是正视自己，并不是彻底的表达自我，正视自己可以说谎，可以违心，但这只是表象，自己不能被自己的谎话所蒙蔽，自己要明白自己。&lt;/p>
&lt;p>人生有两大目标，提高对世界的认知和提高自己的能力。两个相辅相成，若只有能力但认知浅显，最终只能成为一个好用的工具；而认知大于自身的能力是不可能， 认知来源于实践，而实践需要相应的能力&lt;del>那就只能无可奈何，徒增烦恼&lt;/del>。提升认知可以通过读书，实践，思考来提高。而思考是最重要的一环，没有它，学的再多也是复述他人观点。&lt;/p>
&lt;p>大脑会下意识的逃避困难，寻求快乐。如何节约这个问题，是改变拖延症的关键。一个方法就是决定好目标后，就去做，不要想太多。&lt;/p></description></item><item><title>汲取知识并化为己用</title><link>http://note.leabol.top/posts/%E7%9F%A5%E9%9A%BE%E8%80%8C%E8%BF%9B-%E8%B4%B5%E5%9C%A8%E5%9D%9A%E6%8C%81-%E7%9C%81%E5%AF%9F%E4%BD%93%E6%82%9F-%E8%B4%B5%E4%BA%8E%E6%94%B9%E8%BF%87/</link><pubDate>Wed, 10 Jun 2026 00:00:00 +0000</pubDate><guid>http://note.leabol.top/posts/%E7%9F%A5%E9%9A%BE%E8%80%8C%E8%BF%9B-%E8%B4%B5%E5%9C%A8%E5%9D%9A%E6%8C%81-%E7%9C%81%E5%AF%9F%E4%BD%93%E6%82%9F-%E8%B4%B5%E4%BA%8E%E6%94%B9%E8%BF%87/</guid><description>&lt;h2 id="汲取知识并化为己用">汲取知识并化为己用&lt;/h2>
&lt;h4 id="自我规划的能力">自我规划的能力&lt;/h4>
&lt;ul>
&lt;li>搜索知识&lt;/li>
&lt;li>归纳总结知识&lt;/li>
&lt;li>利用好时间和工具资料&lt;/li>
&lt;li>化为己用
&lt;ul>
&lt;li>形成系统,由薄读厚,由厚读薄&lt;/li>
&lt;li>方式
&lt;ul>
&lt;li>讲给别人听&lt;/li>
&lt;li>落实到具体的项目实现&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;p>有限时间内&lt;/p>
&lt;h2 id="面对困难压力迷茫时积极应对的勇气">面对困难,压力,迷茫时,积极应对的勇气&lt;/h2>
&lt;ul>
&lt;li>这是正常现象,要接纳自己&lt;/li>
&lt;li>不要与他人比较&lt;/li>
&lt;li>兵来将挡水来土掩;&lt;/li>
&lt;/ul>
&lt;h2 id="理解他人包容他人博爱之心">理解他人,包容他人,博爱之心&lt;/h2>
&lt;h2 id="学会原谅自己爱自己">学会原谅自己,爱自己&lt;/h2>
&lt;ul>
&lt;li>人不是完美的,但这知识一个阶段,不代表一辈子&lt;/li>
&lt;/ul>
&lt;h2>&lt;/h2></description></item><item><title>网络协议栈（Network）</title><link>http://note.leabol.top/posts/%E7%BD%91%E7%BB%9C%E5%8D%8F%E8%AE%AE%E6%A0%88network-stack/</link><pubDate>Wed, 10 Jun 2026 00:00:00 +0000</pubDate><guid>http://note.leabol.top/posts/%E7%BD%91%E7%BB%9C%E5%8D%8F%E8%AE%AE%E6%A0%88network-stack/</guid><description>&lt;p>现代操作系统的内核（如 Linux 内核）中有一个专门的模块叫做：&lt;/p>
&lt;h1 id="网络协议栈network-stack">网络协议栈（Network Stack)&lt;/h1>
&lt;h2 id="主要职责详解">主要职责详解&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>职责&lt;/th>
&lt;th style="text-align: left">类比说明&lt;/th>
&lt;th>技术术语&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>1. 接收和发送数据包&lt;/strong>&lt;/td>
&lt;td style="text-align: left">公司前台接收快递 &amp;amp; 发送包裹&lt;/td>
&lt;td>数据链路层、IP 层、传输层&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>2. IP 地址管理&lt;/strong>&lt;/td>
&lt;td style="text-align: left">给每个员工分配邮箱地址&lt;/td>
&lt;td>IPv4 / IPv6 地址配置&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>3. 路由选择&lt;/strong>&lt;/td>
&lt;td style="text-align: left">快递要走哪条路线最短最快&lt;/td>
&lt;td>路由表（Routing Table）&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>4. 封装与解封装&lt;/strong>&lt;/td>
&lt;td style="text-align: left">包裹加标签 / 拆标签&lt;/td>
&lt;td>数据封装（Encapsulation）与解封装（Decapsulation）&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>5. 传输控制（TCP）&lt;/strong>&lt;/td>
&lt;td style="text-align: left">控制文件是否完整送达&lt;/td>
&lt;td>TCP 流量控制、拥塞控制&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>6. 端口号管理&lt;/strong>&lt;/td>
&lt;td style="text-align: left">不同部门接收不同类型的快递&lt;/td>
&lt;td>端口绑定、监听、转发&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>7. 安全防护（防火墙）&lt;/strong>&lt;/td>
&lt;td style="text-align: left">保安检查包裹内容&lt;/td>
&lt;td>Netfilter / iptables / nftables&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>8. NAT 转换&lt;/strong>&lt;/td>
&lt;td style="text-align: left">公司统一出口代理&lt;/td>
&lt;td>Network Address Translation&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>9. 域名解析支持&lt;/strong>&lt;/td>
&lt;td style="text-align: left">内部电话簿查询联系方式&lt;/td>
&lt;td>DNS 解析缓存、本地 hosts&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>10. 支持多种协议&lt;/strong>&lt;/td>
&lt;td style="text-align: left">公司支持各种沟通方式（电话、邮件、视频会议）&lt;/td>
&lt;td>支持 TCP、UDP、ICMP、HTTP、HTTPS、FTP 等&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h2 id="类比图操作系统网络部门的组织架构">类比图：操作系统网络部门的组织架构&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>小组&lt;/th>
&lt;th>类比角色&lt;/th>
&lt;th>职责&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>套接字接口组（Socket Layer）&lt;/td>
&lt;td>客户接待员&lt;/td>
&lt;td>接收进程请求（如浏览器访问网页）&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>传输组（TCP / UDP）&lt;/td>
&lt;td>快递打包组&lt;/td>
&lt;td>控制可靠传输或快速发送&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>网络组（IP 层）&lt;/td>
&lt;td>邮政分拣中心&lt;/td>
&lt;td>决定发往哪个城市（IP 地址）&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>链路组（MAC 层）&lt;/td>
&lt;td>快递站&lt;/td>
&lt;td>决定发给哪个局域网内的目标主机&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>路由组（Routing）&lt;/td>
&lt;td>导航调度中心&lt;/td>
&lt;td>选择最优路径（下一跳）&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>设备驱动组（NIC Driver）&lt;/td>
&lt;td>快递员&lt;/td>
&lt;td>实际把包裹送出去（通过网卡）&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>安全组（Netfilter / Firewall）&lt;/td>
&lt;td>保安检查岗&lt;/td>
&lt;td>检查是否允许通行&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>NAT 组&lt;/td>
&lt;td>公司代理出口&lt;/td>
&lt;td>统一管理内部员工对外通信&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>DNS 缓存组&lt;/td>
&lt;td>内部电话簿管理员&lt;/td>
&lt;td>记录域名与 IP 的对应关系&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Linux 的网络部分是一个庞大的子系统，主要包括以下几个关键模块：&lt;/p></description></item><item><title>集合 列表 数组</title><link>http://note.leabol.top/posts/%E9%9B%86%E5%90%88%E5%88%97%E8%A1%A8%E5%92%8C%E6%95%B0%E7%BB%84/</link><pubDate>Wed, 10 Jun 2026 00:00:00 +0000</pubDate><guid>http://note.leabol.top/posts/%E9%9B%86%E5%90%88%E5%88%97%E8%A1%A8%E5%92%8C%E6%95%B0%E7%BB%84/</guid><description>&lt;h3 id="集合">&lt;em>集合&lt;/em>&lt;/h3>
&lt;hr>
&lt;p>&lt;a href="https://baike.baidu.com/item/%E9%9B%86%E5%90%88/2908117?fr=aladdin">集合&lt;/a>一般被定义为：由一个或多个确定的元素所构成的整体。
集合有什么特性呢？&lt;/p>
&lt;p>首先，&lt;strong>集合里的元素类型不一定相同&lt;/strong>。 你可以将商品看作一个集合，也可以将整个商店看作一个集合，这个商店中有人或者其他物品也没有关系。&lt;/p>
&lt;p>其次，&lt;strong>集合里的元素没有顺序&lt;/strong>。 我们不会这样讲：我想要集合中的第三个元素，因为集合是没有顺序的。&lt;/p>
&lt;p>事实上，这样的集合并不直接存在于编程语言中。然而，实际编程语言中的很多数据结构，就是在集合的基础上添加了一些规则形成的。&lt;/p>
&lt;h3 id="列表">&lt;em>列表&lt;/em>&lt;/h3>
&lt;hr>
&lt;p>列表（又称线性列表）的定义为：是一种数据项构成的有限序列，即按照一定的线性顺序，排列而成的数据项的集合。&lt;/p>
&lt;p>列表的概念是在集合的特征上形成的，它具有顺序，且长度是可变的。你可以把它看作一张购物清单：&lt;/p>
&lt;p>购物清单中的条目代表的类型可能不同，但是按照一定顺序进行了排列；
购物清单的长度是可变的，你可以向购物清单中增加、删除条目。
在编程语言中，列表最常见的表现形式有数组和链表，而我们熟悉的栈和队列则是两种特殊类型的列表。除此之外，向列表中添加、删除元素的具体实现方式会根据编程语言的不同而有所区分。&lt;/p>
&lt;h4 id="数组">数组&lt;/h4>
&lt;hr>
&lt;p>数组是列表的实现方式之一，也是面试中经常涉及到的数据结构。&lt;/p>
&lt;p>正如前面提到的，数组是列表的实现方式，它具有列表的特征，同时也具有自己的一些特征。然而，在具体的编程语言中，数组这个数据结构的实现方式具有一定差别。比如 C++ 和 Java 中，数组中的元素类型必须保持一致，而 Python 中则可以不同。Python 中的数组叫做 list，具有更多的高级功能。&lt;/p>
&lt;p>那么如何从宏观上区分列表和数组呢？这里有一个重要的概念：&lt;em>索引&lt;/em>。&lt;/p>
&lt;p>首先，数组会用一些名为 索引 的数字来标识每项数据在数组中的位置，且在大多数编程语言中，索引是从 0 算起的。我们可以根据数组中的索引，快速访问数组中的元素。&lt;/p>
&lt;p>而列表中没有索引，这是数组与列表最大的不同点。&lt;/p>
&lt;p>其次，数组中的元素在内存中是连续存储的，且每个元素占用相同大小的内存。&lt;/p>
&lt;p>相反，列表中的元素在内存中可能彼此相邻，也可能不相邻。比如列表的另一种实现方式——链表，它的元素在内存中则不一定是连续的。&lt;/p></description></item><item><title>编程的一些问题</title><link>http://note.leabol.top/posts/%E7%BC%96%E7%A8%8B%E4%B8%80%E4%BA%9B%E9%97%AE%E9%A2%98/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://note.leabol.top/posts/%E7%BC%96%E7%A8%8B%E4%B8%80%E4%BA%9B%E9%97%AE%E9%A2%98/</guid><description>&lt;ul>
&lt;li>char类型与int一样,也可以存储数字,不过只能存一个字节,多于一个字节的数,只取最右边的; 用&amp;rsquo; &amp;lsquo;括起来的数字,相当于ascll中的字符, 值大小等于ascll值. 例如 &amp;lsquo;5&amp;rsquo; == (int) 53 。 当要将整型数字赋值给char字符串时， 要用&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-c" data-lang="c">&lt;span style="display:flex;">&lt;span>str[i] &lt;span style="color:#f92672">=&lt;/span>number &lt;span style="color:#f92672">+&lt;/span> &lt;span style="color:#e6db74">&amp;#39;0&amp;#39;&lt;/span>;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>或者用&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-c" data-lang="c">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">sprintf&lt;/span>(str&lt;span style="color:#f92672">*&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;%d&amp;#34;&lt;/span>, number); &lt;span style="color:#75715e">//sprintf 函数
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>数组初始化{0}时，并不是全赋值为零，而是&amp;rsquo;\0&amp;rsquo;，而但他是ascll的第0位，所以%d输入时为0；但用%c时不会输出&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-c" data-lang="c">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">char&lt;/span> &lt;span style="color:#f92672">*&lt;/span> p &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#34;abc&amp;#34;&lt;/span>;&lt;span style="color:#75715e">//abc是常量,p指向&amp;#34;abc&amp;#34;,不能更改
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">char&lt;/span> arr[] &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#34;abc&amp;#34;&lt;/span>;&lt;span style="color:#75715e">//将abc赋值到arr所指的地方,而arr是变量,可以更改
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item></channel></rss>