<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator><link href="/feed.xml" rel="self" type="application/atom+xml" /><link href="/" rel="alternate" type="text/html" /><updated>2026-04-09T14:48:28+00:00</updated><id>/feed.xml</id><title type="html">A not Awesome Website</title><subtitle>创业维艰，仍需努力。</subtitle><author><name>Yuan Tao</name></author><entry><title type="html">生命游戏中的卷积</title><link href="/2026/04/07/game-of-life-torch.html" rel="alternate" type="text/html" title="生命游戏中的卷积" /><published>2026-04-07T15:00:00+00:00</published><updated>2026-04-07T15:00:00+00:00</updated><id>/2026/04/07/game-of-life-torch</id><content type="html" xml:base="/2026/04/07/game-of-life-torch.html"><![CDATA[<p>今天编程练习时做到了<a href="https://leetcode.cn/problems/game-of-life/description/">生命游戏</a>，一道经典的二维数组模拟题。规则很简单：每个细胞的下一个状态取决于它周围八个邻居的存活数量。但实现起来，那八个方向的边界判断却写得很是臃肿：</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// ...</span>
<span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">m</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">j</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">j</span> <span class="o">&lt;</span> <span class="n">n</span><span class="p">;</span> <span class="n">j</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
        <span class="kt">int</span> <span class="n">count</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
        <span class="k">if</span> <span class="p">(</span><span class="n">i</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="o">&amp;&amp;</span> <span class="n">j</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">)</span> <span class="n">count</span> <span class="o">+=</span> <span class="n">board</span><span class="p">[</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">][</span><span class="n">j</span><span class="o">-</span><span class="mi">1</span><span class="p">];</span>
        <span class="k">if</span> <span class="p">(</span><span class="n">i</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="o">&amp;&amp;</span> <span class="n">j</span> <span class="o">&lt;</span> <span class="n">n</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="n">count</span> <span class="o">+=</span> <span class="n">board</span><span class="p">[</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">][</span><span class="n">j</span><span class="o">+</span><span class="mi">1</span><span class="p">];</span>
        <span class="k">if</span> <span class="p">(</span><span class="n">i</span> <span class="o">&lt;</span> <span class="n">m</span><span class="o">-</span><span class="mi">1</span> <span class="o">&amp;&amp;</span> <span class="n">j</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">)</span> <span class="n">count</span> <span class="o">+=</span> <span class="n">board</span><span class="p">[</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">][</span><span class="n">j</span><span class="o">-</span><span class="mi">1</span><span class="p">];</span>
        <span class="k">if</span> <span class="p">(</span><span class="n">i</span> <span class="o">&lt;</span> <span class="n">m</span><span class="o">-</span><span class="mi">1</span> <span class="o">&amp;&amp;</span> <span class="n">j</span> <span class="o">&lt;</span> <span class="n">n</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="n">count</span> <span class="o">+=</span> <span class="n">board</span><span class="p">[</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">][</span><span class="n">j</span><span class="o">+</span><span class="mi">1</span><span class="p">];</span>
        <span class="k">if</span> <span class="p">(</span><span class="n">i</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">)</span> <span class="n">count</span> <span class="o">+=</span> <span class="n">board</span><span class="p">[</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">][</span><span class="n">j</span><span class="p">];</span>
        <span class="k">if</span> <span class="p">(</span><span class="n">j</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">)</span> <span class="n">count</span> <span class="o">+=</span> <span class="n">board</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="o">-</span><span class="mi">1</span><span class="p">];</span>
        <span class="k">if</span> <span class="p">(</span><span class="n">i</span> <span class="o">&lt;</span> <span class="n">m</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="n">count</span> <span class="o">+=</span> <span class="n">board</span><span class="p">[</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">][</span><span class="n">j</span><span class="p">];</span>
        <span class="k">if</span> <span class="p">(</span><span class="n">j</span> <span class="o">&lt;</span> <span class="n">n</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="n">count</span> <span class="o">+=</span> <span class="n">board</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="o">+</span><span class="mi">1</span><span class="p">];</span>
        <span class="c1">// 然后根据 count 和当前状态更新细胞...</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>看着这些重复的边界判断，我不禁想到：这种「用一个固定模式对每个位置求和」的操作，不就是卷积吗？</p>

<h2 id="卷积视角下的生命游戏">卷积视角下的生命游戏</h2>

<p>卷积操作简单来说，就是用一个卷积核在特征图上滑动，每次将核与对应区域的值逐点相乘再求和。对于生命游戏，我们只需要统计八个邻居的存活数，而不包括中心细胞本身。因此，构造一个 <strong>3×3 的卷积核</strong>，中心为 0，其余为 1：</p>

<p>$$
\mathbf{K} =
\begin{bmatrix}
1 &amp; 1 &amp; 1 \cr
1 &amp; 0 &amp; 1 \cr
1 &amp; 1 &amp; 1
\end{bmatrix}
$$</p>

<p>那么，对棋盘做一次卷积，输出矩阵的每个位置就是该细胞周围的存活邻居数。设棋盘为矩阵 $\mathbf{A}$，位置 x, y 的细胞状态为 $a_{x,y}$，则存活邻居数 $N(x,y)$ 可以表示为：</p>

<p>$$
N(x, y) = \sum_{(i, j) \in \mathcal{N}} a_{x+i, y+j}, \mathcal{N} = \lbrace-1, 0, 1\rbrace^2 \setminus \lbrace(0, 0)\rbrace
$$</p>

<p>应用到整个棋盘即</p>

<p>$$
\mathbf{N} = \mathbf{A} * \mathbf{K}
$$</p>

<p>其中 $*$ 表示二维卷积。这样便完美避开了所有手动边界判断——卷积层自带的 padding 机制已经处理好了边缘情况。</p>

<h2 id="用-pytorch-玩一把">用 PyTorch 玩一把</h2>

<p>既然想到了卷积，那就干脆用深度学习框架实现一下，虽然对这道题来说完全是杀鸡用牛刀，但 just for fun 嘛！</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="n">torch</span>
<span class="kn">import</span> <span class="n">torch.nn</span> <span class="k">as</span> <span class="n">nn</span>

<span class="c1"># 1. 初始化棋盘（使用 float32 适配 GPU 加速）
</span><span class="n">board</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="nf">tensor</span><span class="p">([[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">],</span> 
                      <span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">],</span> 
                      <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">],</span> 
                      <span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">]],</span> <span class="n">dtype</span><span class="o">=</span><span class="n">torch</span><span class="p">.</span><span class="n">float32</span><span class="p">).</span><span class="nf">unsqueeze</span><span class="p">(</span><span class="mi">0</span><span class="p">).</span><span class="nf">unsqueeze</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>

<span class="c1"># 2. 设置卷积层（无 bias，固定核）
</span><span class="n">conv</span> <span class="o">=</span> <span class="n">nn</span><span class="p">.</span><span class="nc">Conv2d</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="n">kernel_size</span><span class="o">=</span><span class="mi">3</span><span class="p">,</span> <span class="n">padding</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">bias</span><span class="o">=</span><span class="bp">False</span><span class="p">)</span>
<span class="k">with</span> <span class="n">torch</span><span class="p">.</span><span class="nf">no_grad</span><span class="p">():</span>
    <span class="n">kernel</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="nf">tensor</span><span class="p">([[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">],</span> 
                           <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">],</span> 
                           <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">]],</span> <span class="n">dtype</span><span class="o">=</span><span class="n">torch</span><span class="p">.</span><span class="n">float32</span><span class="p">)</span>
    <span class="n">conv</span><span class="p">.</span><span class="n">weight</span><span class="p">.</span><span class="nf">copy_</span><span class="p">(</span><span class="n">kernel</span><span class="p">.</span><span class="nf">view</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">3</span><span class="p">))</span>

<span class="c1"># 3. 计算邻居数量
</span><span class="k">with</span> <span class="n">torch</span><span class="p">.</span><span class="nf">no_grad</span><span class="p">():</span>
    <span class="n">neighbors</span> <span class="o">=</span> <span class="nf">conv</span><span class="p">(</span><span class="n">board</span><span class="p">)</span>
    
    <span class="c1"># 4. 应用康威规则
</span>    <span class="c1"># 规则：活细胞邻居=2或3则存活，死细胞邻居=3则诞生
</span>    <span class="n">next_gen</span> <span class="o">=</span> <span class="p">(</span><span class="n">neighbors</span> <span class="o">==</span> <span class="mi">3</span><span class="p">)</span> <span class="o">|</span> <span class="p">((</span><span class="n">neighbors</span> <span class="o">==</span> <span class="mi">2</span><span class="p">)</span> <span class="o">&amp;</span> <span class="p">(</span><span class="n">board</span> <span class="o">==</span> <span class="mi">1</span><span class="p">))</span>
    <span class="n">result</span> <span class="o">=</span> <span class="n">next_gen</span><span class="p">.</span><span class="nf">int</span><span class="p">()</span>

<span class="nf">print</span><span class="p">(</span><span class="n">result</span><span class="p">.</span><span class="nf">squeeze</span><span class="p">())</span>
</code></pre></div></div>

<h2 id="感慨">感慨</h2>

<p>很多知识都是从just for fun学来的。虽然并不会有人用深度学习工具研究生命游戏（应该是以约束求解器为主），但这次思考是一个很好的拓宽知识面的机会。</p>]]></content><author><name>Yuan Tao</name></author><summary type="html"><![CDATA[今天编程练习时做到了生命游戏，一道经典的二维数组模拟题。规则很简单：每个细胞的下一个状态取决于它周围八个邻居的存活数量。但实现起来，那八个方向的边界判断却写得很是臃肿：]]></summary></entry><entry><title type="html">Birthday_2026</title><link href="/2026/04/06/birthday.html" rel="alternate" type="text/html" title="Birthday_2026" /><published>2026-04-06T15:00:00+00:00</published><updated>2026-04-06T15:00:00+00:00</updated><id>/2026/04/06/birthday</id><content type="html" xml:base="/2026/04/06/birthday.html"><![CDATA[<p>今天是我的生日，不同以往，今年我并没有第一时间想起，或许是因为手头的宽裕，不必再为仪式感去特地准备礼物，</p>

<p>不过，长期的习惯断了可不太行。我该送自己一份什么样的生日礼物？</p>

<p>昨天去了一趟植物园，人们成群结伴，而我照旧单人成行。一个人的春天，我仍未感受到「幸福」，但尚存「幸福的可能」。所以，今年的生日，我给自己的礼物是「实现幸福的可能」。为了更多的选择与希望，仍需继续努力。</p>

<p>生日也应当有愿望——循此苦旅，终抵繁星。</p>]]></content><author><name>Yuan Tao</name></author><summary type="html"><![CDATA[今天是我的生日，不同以往，今年我并没有第一时间想起，或许是因为手头的宽裕，不必再为仪式感去特地准备礼物，]]></summary></entry><entry><title type="html">昇腾服务器稳定性压测</title><link href="/2026/01/31/occupying-server.html" rel="alternate" type="text/html" title="昇腾服务器稳定性压测" /><published>2026-01-31T16:00:00+00:00</published><updated>2026-01-31T16:00:00+00:00</updated><id>/2026/01/31/occupying-server</id><content type="html" xml:base="/2026/01/31/occupying-server.html"><![CDATA[<p>为对昇腾服务器进行稳定性压测，我们可以使用<code class="language-plaintext highlighter-rouge">crontab</code>定时拉起测试脚本——白天开发工作，晚上进行压测。</p>

<h2 id="准备压测程序">准备压测程序</h2>

<p><code class="language-plaintext highlighter-rouge">hccl</code>提供了一些压测程序，可用于同时拉起所有NPU卡。</p>

<h3 id="1-环境准备">1. 环境准备</h3>

<ul>
  <li>CANN安装：参考官网安装文档。</li>
  <li><code class="language-plaintext highlighter-rouge">openmpi</code>安装：</li>
</ul>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># 下载源码</span>
wget <span class="nt">--no-check-certificate</span> https://download.open-mpi.org/release/open-mpi/v4.1/openmpi-4.1.5.tar.gz
<span class="c"># 解压源码</span>
<span class="nb">tar</span> <span class="nt">-xvf</span> openmpi-4.1.5.tar.gz
<span class="nb">cd </span>openmpi-4.1.5
<span class="c"># 配置</span>
./configure <span class="nt">--disable-fortran</span> <span class="nt">--enable-ipv6</span> <span class="nt">--prefix</span><span class="o">=</span>/usr/local/openmpi
<span class="c"># 编译</span>
make <span class="nt">-j</span>
<span class="c"># 安装</span>
make <span class="nb">install</span>
</code></pre></div></div>

<ul>
  <li><code class="language-plaintext highlighter-rouge">hccl_test</code>编译</li>
</ul>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">cd</span> <span class="k">${</span><span class="nv">ASCEND_HOME_PATH</span><span class="k">}</span>/tools/hccl_test
make <span class="nv">MPI_HOME</span><span class="o">=</span>/usr/local/openmpi <span class="nv">ASCEND_DIR</span><span class="o">=</span><span class="k">${</span><span class="nv">ASCEND_HOME_PATH</span><span class="k">}</span>
</code></pre></div></div>

<h3 id="2-压测脚本准备">2. 压测脚本准备</h3>

<ul>
  <li>假设保存为<code class="language-plaintext highlighter-rouge">/home/fuzz_test/fuzz_job.sh</code></li>
  <li>将<code class="language-plaintext highlighter-rouge">/path/to/cann</code>修改为实际的CANN安装位置</li>
</ul>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c">#!/bin/bash</span>
<span class="nv">MODE</span><span class="o">=</span><span class="nv">$1</span>
<span class="nv">FUZZ_JOB_CANN_SET_ENV_PATH</span><span class="o">=</span>/path/to/cann
<span class="nv">FUZZ_JOB_MPI_EXEC_PATH</span><span class="o">=</span>/usr/local/openmpi/bin/mpirun
<span class="nv">FUZZ_JOB_MPI_LIB_PATH</span><span class="o">=</span>/usr/local/openmpi/lib
<span class="k">if</span> <span class="o">[[</span> <span class="s2">"</span><span class="nv">$MODE</span><span class="s2">"</span> <span class="o">==</span> <span class="s2">"start"</span> <span class="o">]]</span><span class="p">;</span> <span class="k">then</span>
    <span class="nb">source</span> <span class="nv">$FUZZ_JOB_CANN_SET_ENV_PATH</span>
    <span class="nb">export </span><span class="nv">LD_LIBRARY_PATH</span><span class="o">=</span><span class="nv">$FUZZ_JOB_MPI_LIB_PATH</span>:<span class="nv">$LD_LIBRARY_PATH</span>
    <span class="nb">cd</span> <span class="nv">$ASCEND_HOME_PATH</span>/tools/hccl_test
    <span class="nb">echo</span> <span class="s2">"=============all_reduce_test started!!!============="</span>
    <span class="nb">echo</span> <span class="s2">"=====feel free to kill the process if needed :)====="</span>
    <span class="c"># 后台运行监控循环</span>
    <span class="nb">nohup </span>bash <span class="nt">-c</span> <span class="s2">"
    while true; do
        mpirun --allow-run-as-root -n 16 ./bin/all_reduce_test -b 1G -e 1G -f 2 -p 16 &gt; stress.log 2&gt;&amp;1
        sleep 2
    done
    "</span> <span class="o">&gt;</span> /dev/null 2&gt;&amp;1 &amp;
    <span class="nb">echo</span> <span class="s2">"监控器PID: </span><span class="nv">$!</span><span class="s2">"</span>
    <span class="nb">echo</span> <span class="nv">$!</span> <span class="o">&gt;</span> /tmp/fuzz_job_watcher.pid
<span class="k">fi
if</span> <span class="o">[[</span> <span class="s2">"</span><span class="nv">$MODE</span><span class="s2">"</span> <span class="o">==</span> <span class="s2">"stop"</span> <span class="o">]]</span><span class="p">;</span> <span class="k">then</span>
    <span class="c"># 停止监控器</span>
    <span class="k">if</span> <span class="o">[</span> <span class="nt">-f</span> /tmp/fuzz_job_watcher.pid <span class="o">]</span><span class="p">;</span> <span class="k">then</span>
        <span class="nb">kill</span> <span class="si">$(</span><span class="nb">cat</span> /tmp/fuzz_job_watcher.pid<span class="si">)</span> 2&gt;/dev/null
        <span class="nb">rm</span> <span class="nt">-f</span> /tmp/fuzz_job_watcher.pid
    <span class="k">fi</span>
    <span class="c"># 停止测试进程</span>
    pkill <span class="nt">-9</span> mpirun
    pkill <span class="nt">-9</span> all_reduce_test
    <span class="nb">echo</span> <span class="s2">"=============all_reduce_test stopped!!!============="</span>
<span class="k">fi</span>
</code></pre></div></div>

<h3 id="3-定时拉起">3. 定时拉起</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>crontab <span class="nt">-e</span>
<span class="c"># contents</span>
0 0 <span class="k">*</span> <span class="k">*</span> <span class="k">*</span> /home/fuzz_test/fuzz_job.sh start
0 8 <span class="k">*</span> <span class="k">*</span> <span class="k">*</span> /home/fuzz_test/fuzz_job.sh stop
</code></pre></div></div>

<ul>
  <li>详情可搜索crontab语法说明。</li>
</ul>

<h2 id="参考资料">参考资料</h2>

<ul>
  <li>CANN安装：<a href="https://www.hiascend.com/document/detail/zh/CANNCommunityEdition/850/softwareinst/instg/instg_0008.html?InstallType=local&amp;OS=openEuler">安装CANN-CANN社区版8.5.0-昇腾社区</a></li>
  <li><code class="language-plaintext highlighter-rouge">hccl_test</code>：<a href="https://www.hiascend.com/document/detail/zh/CANNCommunityEdition/850/devaids/hccltool/HCCLpertest_16_0001.html">工具介绍-CANN社区版8.5.0-昇腾社区</a></li>
  <li><code class="language-plaintext highlighter-rouge">crontab</code>:<a href="https://www.runoob.com/linux/linux-comm-crontab.html">Linux crontab 命令 | 菜鸟教程</a></li>
</ul>]]></content><author><name>Yuan Tao</name></author><category term="working" /><summary type="html"><![CDATA[为对昇腾服务器进行稳定性压测，我们可以使用crontab定时拉起测试脚本——白天开发工作，晚上进行压测。]]></summary></entry><entry><title type="html">寒冷的冬天（Part I）</title><link href="/2025/12/31/cold-winter-part-i.html" rel="alternate" type="text/html" title="寒冷的冬天（Part I）" /><published>2025-12-31T16:00:00+00:00</published><updated>2025-12-31T16:00:00+00:00</updated><id>/2025/12/31/cold-winter-part-i</id><content type="html" xml:base="/2025/12/31/cold-winter-part-i.html"><![CDATA[<p>从2024年7月至今，我已经工作一年半了。现在是1月，上海的冬天仅有些风雨，算不得真正的冬天。我有时会格外怀念家乡东北，白雪皑皑才是真正的冬色。</p>

<p>大学毕业的时候并不顺利，没考上硕士，也没找着什么正经工作。我决定像很多人一样去「考研二战」，并因为毕业的原因，不得不回到家进行准备。</p>

<p>这是一段人生意义上的冬天。</p>

<p>既然我明确说这是「一段冬天」，那结果肯定不怎么样。我记错了考试时间，以为是九点而非八点半，等我急匆匆闯进考场时，众人早已进入作答状态。那种迟到的窘态至今记忆犹新，导致我四门考试的状态也是一门比一门糊涂。</p>

<p>这样的结果并非偶然，而是理所应当。</p>

<p>我没钱去考研集训营，只能窝在家里。我怀揣着一堆宏大的梦想，譬如「改变命运」「跨考科班」「冲刺985」以及「和心上人重聚」。考研是痛苦的，二战是更痛苦的，回家二战是最痛苦的；而最最痛苦的事情，莫过于在老同学光鲜生活的对比下，独自回家二战。</p>

<p>每当看到他们朋友圈里新学校的风景，那种感觉和刚上大学时别无二致，只是主角不再是我。四年前，大家还在同样的起点，四年后，已是云泥之别。在这种心情驱动下，我开始了学习。</p>

<p>起初还会挣扎着学点东西，后来越发懒惰。我加了一个梦中情校的考研群，每天靠着那点存量知识在群里好为人师；后来也许是废话太多，被群主直接踢了出去。那时我才意识到，离考试只有不到一个月了。</p>

<p>时间越不够，我反而越「豁达」。我想起了知名的「摆烂定律」：</p>

<blockquote>
  <p>能考上的，不会因为这几天不学就考不上；考不上的，也不会因为这几天使劲学就能考上。</p>
</blockquote>

<p>于是我的状态彻底放松，白天基本吃睡，晚上做着「上岸重聚」的美梦。考试当天，即便进了考场我仍在做梦。我记得在答题卡上写下目标院校时，心里竟还存着「劳资能翻身」的幻觉。环顾四周，看到几个高中同学报考的学校一个比一个强大，也不知道他们最终是否圆梦。</p>

<p>我好像把考试当成了一种形式：只要让别人以为自己拼命学习了、很累了，然后去考场走个过场，学校就会被这份「苦劳」感动到录取我。</p>

<p>稀里糊涂的四门考试结束了，我长达半年的行为艺术表演也随之落幕。在等出分的这段日子，我甚至还在装模作样地准备复试，自我欺骗到了极致。</p>

<p>查分那天，系统准时故障。这种「无法第一时间查分」的焦虑，恰好与考试当天迟到的半小时形成了某种命运闭环。刷新了整整半小时后，结果如我所料：分数没出彩，甚至比预想的还要低。</p>

<p>人总是不愿轻易相信失败。我像去年一样在调剂系统里寻找去处，但各路大佬云集，我根本竞争不过。去年起码还有个冷门研究所打来电话，今年则是彻底的杳无音信。</p>

<p>我得另谋生路。我开始没日没夜地搜索「考研失败，还能怎么办」，还真被我挖到一条缝隙：北京大学软件学院的第二学士学位。据说科目简单，更多看面试。我突然又信心满满了，觉得「考试能力不行，实战能力很行」：虽然不能和心上人重聚，但起码还能「上岸」。</p>

<p>并不意外，这条生路很快被证伪——由于政策风波，北大软院从那一年起停止了该项目。我的「北大梦」「科班梦」直接原地破灭。</p>

<p>至此，除了工作，我别无他法。我注册了BOSS直聘，令我诧异的是，大数据精准地给我推送了一些口号诱人的职位：「接受非科班，接受考研二战失败」。</p>

<p>这就是我目前这份「OD」工作的由来。</p>

<p>我经历了一堆测试：机考、性格测试、资格面试、两轮技术面、主管面。机考虽然没满分，但每道题通过率都极高；性格测试据说是从国外高价买的，很难说谎，但我低分飘过；资格面试那天，HR匆匆问了几个问题就给过了，估计是因为那天正值「月末周六」晚上六点，她急着下班。两轮技术面我实事求是，算法题做了出来，懂的不遗余力，不懂的不浪费时间。主管面试时，或许是因为主管过于开朗，让我倍感压力，表现得并不好，好在他网开一面，让我顺利通过。</p>

<p>在经历了租房风波、体检差错和水土不服后，我总算入职了。顶着「外包」的名头，身份上确实总觉得矮人半截。但在上海这连绵的风雨里，回想起那个在考场门口喘息的自己，我明白，这个艰难的寒冬总算阶段性地过去了。</p>]]></content><author><name>Yuan Tao</name></author><summary type="html"><![CDATA[从2024年7月至今，我已经工作一年半了。现在是1月，上海的冬天仅有些风雨，算不得真正的冬天。我有时会格外怀念家乡东北，白雪皑皑才是真正的冬色。]]></summary></entry><entry><title type="html">LD_PRELOAD 的一个应用场景</title><link href="/2025/10/14/ld-preload-application.html" rel="alternate" type="text/html" title="LD_PRELOAD 的一个应用场景" /><published>2025-10-14T16:00:00+00:00</published><updated>2025-10-14T16:00:00+00:00</updated><id>/2025/10/14/ld-preload-application</id><content type="html" xml:base="/2025/10/14/ld-preload-application.html"><![CDATA[<h2 id="问题背景">问题背景</h2>

<p>产品 A 中的 <code class="language-plaintext highlighter-rouge">libtest.so</code> 提供了一个接口 <code class="language-plaintext highlighter-rouge">void test_feature(int num)</code>，该接口被下游产品 B 通过 <code class="language-plaintext highlighter-rouge">dlopen</code> 调用。现在有人编写了该接口的新实现 <code class="language-plaintext highlighter-rouge">test_feature_v2</code>，并打包成 <code class="language-plaintext highlighter-rouge">libtest_v2.so</code>。由于产品 A 和 B 均难以进行工程或代码层面的修改，因此需要一种不修改原有代码的方式，让产品 B 在调用 <code class="language-plaintext highlighter-rouge">test_feature</code> 时，实际执行 <code class="language-plaintext highlighter-rouge">libtest_v2.so</code> 中的 <code class="language-plaintext highlighter-rouge">test_feature_v2</code> 函数。</p>

<h2 id="解决方案">解决方案</h2>

<p>利用 <code class="language-plaintext highlighter-rouge">LD_PRELOAD</code> 机制，我们可以预加载一个自定义的共享库，在其中重新定义 <code class="language-plaintext highlighter-rouge">dlsym</code> 函数，从而拦截动态链接过程。具体做法是：当检测到 <code class="language-plaintext highlighter-rouge">dlsym(handle, "test_feature")</code> 被调用时，自动加载 <code class="language-plaintext highlighter-rouge">libtest_v2.so</code>，并返回其中 <code class="language-plaintext highlighter-rouge">test_feature_v2</code> 的地址。</p>

<p>这样，产品 B 无需任何改动即可使用新的实现进行测试。</p>

<h2 id="代码实现">代码实现</h2>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;dlfcn.h&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;string.h&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;stdio.h&gt;</span><span class="cp">
</span>
<span class="k">static</span> <span class="kt">void</span> <span class="o">*</span><span class="p">(</span><span class="o">*</span><span class="n">real_dlsym</span><span class="p">)(</span><span class="kt">void</span> <span class="o">*</span><span class="p">,</span> <span class="k">const</span> <span class="kt">char</span> <span class="o">*</span><span class="p">)</span> <span class="o">=</span> <span class="nb">NULL</span><span class="p">;</span>
<span class="k">static</span> <span class="kt">void</span> <span class="o">*</span><span class="n">v2_handle</span> <span class="o">=</span> <span class="nb">NULL</span><span class="p">;</span>   <span class="c1">// 记录 libtest_v2.so 的句柄</span>

<span class="kt">void</span> <span class="o">*</span><span class="nf">dlsym</span><span class="p">(</span><span class="kt">void</span> <span class="o">*</span><span class="n">handle</span><span class="p">,</span> <span class="k">const</span> <span class="kt">char</span> <span class="o">*</span><span class="n">symbol</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">real_dlsym</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">real_dlsym</span> <span class="o">=</span> <span class="n">dlsym</span><span class="p">(</span><span class="n">RTLD_NEXT</span><span class="p">,</span> <span class="s">"dlsym"</span><span class="p">);</span>
    <span class="p">}</span>
    <span class="k">if</span> <span class="p">(</span><span class="n">symbol</span> <span class="o">&amp;&amp;</span> <span class="n">strcmp</span><span class="p">(</span><span class="n">symbol</span><span class="p">,</span> <span class="s">"test_feature"</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
        <span class="c1">// 懒加载 libtest_v2.so</span>
        <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">v2_handle</span><span class="p">)</span> <span class="p">{</span>
            <span class="n">v2_handle</span> <span class="o">=</span> <span class="n">dlopen</span><span class="p">(</span><span class="s">"libtest_v2.so"</span><span class="p">,</span> <span class="n">RTLD_LAZY</span><span class="p">);</span>
            <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">v2_handle</span><span class="p">)</span> <span class="p">{</span>
                <span class="c1">// 加载失败时可记录错误信息</span>
                <span class="k">return</span> <span class="nb">NULL</span><span class="p">;</span>
            <span class="p">}</span>
        <span class="p">}</span>
        <span class="c1">// 从 v2 库中获取 test_feature_v2 符号</span>
        <span class="k">return</span> <span class="n">real_dlsym</span><span class="p">(</span><span class="n">v2_handle</span><span class="p">,</span> <span class="s">"test_feature_v2"</span><span class="p">);</span>
    <span class="p">}</span>
    <span class="c1">// 其他符号按原始方式处理</span>
    <span class="k">return</span> <span class="n">real_dlsym</span><span class="p">(</span><span class="n">handle</span><span class="p">,</span> <span class="n">symbol</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div></div>

<h2 id="使用方法">使用方法</h2>

<ul>
  <li>编译拦截库：</li>
</ul>

<div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code>gcc <span class="nt">-shared</span> <span class="nt">-fPIC</span> <span class="nt">-o</span> libdl_patched.so dl_patched.c <span class="nt">-ldl</span>
</code></pre></div></div>

<ul>
  <li>运行产品 B，并预加载拦截库：</li>
</ul>

<pre><code class="language-sj">LD_PRELOAD=./libdl_patched.so ./product_B
</code></pre>]]></content><author><name>Yuan Tao</name></author><category term="working" /><summary type="html"><![CDATA[问题背景]]></summary></entry><entry><title type="html">我的一个终极皮肤</title><link href="/2025/06/30/my-ultra-skin.html" rel="alternate" type="text/html" title="我的一个终极皮肤" /><published>2025-06-30T16:00:00+00:00</published><updated>2025-06-30T16:00:00+00:00</updated><id>/2025/06/30/my-ultra-skin</id><content type="html" xml:base="/2025/06/30/my-ultra-skin.html"><![CDATA[<p>这是一则本该不好受，但是在我长大之后，重新解读成为的趣事。</p>

<p>小学时，我的一个班主任老师以公徇私，收取家长礼品，对不送礼品的同学，则予以歧视和责骂。</p>

<p>大多家长选择愚蠢的顺从，与老师站在一条「打击孩子统一战线」上。老师惩罚自己的孩子，就是自己的孩子不懂事，不好好学习，于是孩子回到家，继续责备。</p>

<p>然而我爸明辨是非，看出了区别对待的根因。他最看不得这种事，更何况发生在自己头上。于是，他斩钉截铁地查到教育局的电话，举报某小学某年某班某某老师有一些非常恶劣的行为。</p>

<p>教育局的举报果然奏效。举报的下一周，班主任老师就不敢作祟了。然而好景不长，周五的最后一节课，她说要举行班会——这是那个老师第一次开班会。</p>

<p>「我就和你们说一个事。」</p>

<p>「你们之中，有人向教育局举报了我。」</p>

<p>同学们一点声音都没有。在经历几秒钟的静寂之后，他们不约而同地转过头来，把目光对着坐在教室角落差生专用座位的我，就像是接收到指令的机器。</p>

<p>我故作镇定，因为确实是我举报的。我的确「告密」了。</p>

<p>「我不管你们举报还是怎样，有意见就说出来，不满意，我就不教你们了。放学吧！」</p>

<p>那时的我大概只有胆战心惊。但是时至今日，这种小危险如同过眼云烟。现在想起来，我问自己：你难过吗？</p>

<p>答曰：并不难过。我虽然失去了班级里所有人的友谊之类的东西，但是我的收获颇丰。</p>

<p>我的收获不仅是一个人不甘平庸，向恶势力低头的宝贵的人格，我更是收获了终极皮肤——</p>

<!-- _includes/rainbow_dynamic.html -->
<style>
@keyframes rainbow-spin {
  0% { filter: hue-rotate(0deg); }
  100% { filter: hue-rotate(360deg); }
}
.rainbow-dynamic {
  background: linear-gradient(90deg, red, orange, yellow, green, blue, indigo, violet);
  -webkit-background-clip: text;
  background-clip: text;
  color: transparent;
  font-weight: bold;
  animation: rainbow-spin 2s linear infinite;
}
</style>

<p><span class="rainbow-dynamic">
  <strong>「犹大」</strong>
</span>。</p>]]></content><author><name>Yuan Tao</name></author><category term="funny" /><summary type="html"><![CDATA[这是一则本该不好受，但是在我长大之后，重新解读成为的趣事。]]></summary></entry><entry><title type="html">Doppelganger</title><link href="/2024/08/15/doppelganger.html" rel="alternate" type="text/html" title="Doppelganger" /><published>2024-08-15T15:00:00+00:00</published><updated>2024-08-15T15:00:00+00:00</updated><id>/2024/08/15/doppelganger</id><content type="html" xml:base="/2024/08/15/doppelganger.html"><![CDATA[<p>公司里有个女孩。虽然由于我不和她在同一组，交流十分有限，但我对她印象深刻。她也来自祖国的西南之间，也是个小矮个，也很可爱。平白无故地提起一个并不怎么熟悉的人，还带了这么多的「也」字，是为什么呢？因为她太像一个从我身边消失的人了。</p>

<p>她曾经对我很好，甚至是我大学时光中最接近「<em>女朋友</em>」的一个人。她总是在我烦心的时候鼓励我，常常陪着我散步聊天。我的妈妈也很喜欢她，还说如果我和她在一起了，就把她珍藏的一串项链送给她。虽然如此，当我那天终于下定决心向她表白时，她却在迟迟不回信息后告诉我，她有喜欢的人并且和他在一起了，所以要有意疏远我。</p>

<p>我很难过，但在一段时间的沉默后，我和她还是稀里糊涂地重新联系上了。我们仍然常常一起散步，她也没有再提之前的事情。在我第一次得新冠痛不欲生的时候，她怕我虚弱到不能去食堂吃饭，还特地买了一袋子吃的东西送到了我的宿舍楼下，叮嘱我好好养病，早日康复。</p>

<p>那时的我再次徜徉于幻想之中，觉得仍能重拾设想过的美好。事实却是，最后的一个学期，生活条件便利了许多，我经常看到她在朋友圈中发的她和她男朋友出去的消息。是的，她确实有男朋友，我重拾的仍是残酷的现实。毕业之后，我们就没联系过了，准确地说，是我没联系过她了。她还是常常给我发到朋友圈的一些无聊的东西点赞，但是我不想再联系她。</p>

<p>又过了一年的时间，便是现在的我。偶然遇见的这个女孩荡起了我心中的一片涟漪……但仍是没辙，我只能带着这令我成长的困惑与遗憾，继续前行。现在，我的生活确实比以前好了很多，少了许多往昔的挣扎与困苦，但我仍会偶尔想起，那些春日里一同走过的道路，以及那个冬天的某一天，在18舍楼门前并肩站立的一高一矮的身影。</p>]]></content><author><name>Yuan Tao</name></author><category term="deadman" /><summary type="html"><![CDATA[公司里有个女孩。虽然由于我不和她在同一组，交流十分有限，但我对她印象深刻。她也来自祖国的西南之间，也是个小矮个，也很可爱。平白无故地提起一个并不怎么熟悉的人，还带了这么多的「也」字，是为什么呢？因为她太像一个从我身边消失的人了。]]></summary></entry><entry><title type="html">我想要成为的人</title><link href="/2024/06/12/who-i-want-to-be.html" rel="alternate" type="text/html" title="我想要成为的人" /><published>2024-06-12T15:00:00+00:00</published><updated>2024-06-12T15:00:00+00:00</updated><id>/2024/06/12/who-i-want-to-be</id><content type="html" xml:base="/2024/06/12/who-i-want-to-be.html"><![CDATA[<h2 id="说明">说明</h2>

<p>我去年毕业之际，经朋友介绍获得了一份工作，算是进入了软件开发行业。在辅导员闻悉之后，便被要求编写一篇叫做「就业先锋——某某某」的文章，鼓励大家努力找工作。当时我处在自我感觉良好之中，便兴奋地写了这些文字，然而在仔细思考后，我觉得这份工作并不适合自己，于是离开了那个公司，所以这篇文字并没有被发出去。现在来看，我实在是别扭，这种文字必须要按照非常积极向上的态度来写，这样好像抹除了那些年的被人冷眼旁观与失望。也许，这篇文章只是写了一个我想成为的人。</p>

<h2 id="正文">正文</h2>

<p>陶源，华东理工大学生物工程学院生物科学专业2023届本科毕业生。在经历了转专业失利、实习碰步、考研落榜等一系列人生低谷后，他迅速调整心态，最终跨界签约XXX公司，成功进入了自己向往已久的计算机行业。</p>

<p>你好，我是来自生物科学191班的陶源。但在内心深处，我一直是个热爱代码、沉浸在技术世界里的「技术宅」。我通过努力走进了热爱的行业，也希望我的这些心路历程，能让那些同样身处专业错位、感到前路迷茫的同学坚定信念。</p>

<p>2019年的夏天，我带着对信息学院的向往进入华理，却因为那一点分差，被遗憾地调剂到了生物专业。这成了我之后几年挫折的起点：大一申请转专业时，我被生硬的规则无情挡在门外；大二大三投递实习简历，却因为专业对口问题收到了一封又一封冷冰冰的「感谢信」。这些打击迫使我走上考研这条路，然而命运又开了个玩笑，在大四那场关键的数学考试中，新冠带来的高烧和头昏脑胀让我最终与理想学校失之交臂。</p>

<p>进入大四下学期，我开始了更密集的投递。但那时候的就业环境并不乐观，我志在大厂，却始终得不到青睐。唯一给了面试机会的米哈游，最终也以失败告终。就在我最焦虑的时候，辅导员老师给了我很多无私的帮助。她耐心地帮我打磨那份跨行业的简历，并建议我或许可以尝试投递一些生物类公司的网络开发岗位，把这当作「行业转换」的跳板。</p>

<p>接下来的路依然不算顺遂。我发现纯粹招开发人员的生物公司少之又少，大多数岗位只是枯燥的生物数据分析。幸运的是，通过朋友的介绍，我获得了现在这家公司的面试机会。面试分为两轮：第一轮是技术人员围绕我开发的项目进行严谨考察；第二轮则是与两位资深开发人员的深度交流。在那场交谈中，他们给了我极大的肯定。他们认为，虽然我的科班基础确实稍显薄弱，但我展现出的那股自学热忱和解决问题的能力，足以让他们决定给我这个机会。</p>

<p>其实，这里并不是我唯一的去处。当时网上也有更符合我能力、甚至薪资更高的运维类岗位。但我拒绝了那些眼前的诱惑，因为国企带来的经验沉淀是普通私企无法比拟的。我所在的这家公司曾参与支持「XXX」重大项目，那种真实的大数据环境是极难复制的学习资源。在这里工作，本质上是在带薪学习。几年后，当我带着这种经验跳槽大厂时，身价甚至能翻几倍；而如果贪图眼前的小利，就等于为自己的人强制制定了上限。被一家真正的互联网开发公司接受，意味着我终于彻底告别了那个带给我无数烦恼的生物专业，在属于我的赛道上重新起跑。</p>

<p>关于互联网行业的应聘，我认为可以从简历、笔试、面试三个阶段来拆解。</p>

<p>在简历阶段，最重要的是抓住你经历过的每一件事，而不是单纯罗列科研和荣誉。对于像我这样跨专业的同学，社团经验就是最好的背书。我在华理 CIC 计算机信息交流协会待了三年，从基础的网络排障到为同学们解答各类软硬件问题，这些看似细碎的日常，其实都在潜移默化地构建我的技术语境。你要学会从这些经历中总结出你的逻辑思考和解决问题的路径，让 HR 看到你虽然没有「专业身份」，却早已具备了「专业素养」。</p>

<p>到了笔试环节，很多同学会产生畏难情绪，其实只要经过系统的复习，大部分公司的笔试门槛并不像想象中那么高。笔试本质上是一张通往面试的入场券，考察的是你对基础知识的掌握程度。我建议大家不要死记硬背，而是通过实际的题目去理解背后的算法逻辑。只要在这个阶段稳扎稳打，进入接下来的正式面试环节才是致胜的关键。</p>

<p>而整个流程中最核心的便是技术面试。面试官会针对你的目标岗位和自身项目经历进行极具针对性的提问。如果你也像我一样热爱技术，我建议你不仅要按部就班地学习，更要有属于自己的个人项目。2022年上半年疫情严重时，超市限购的场景触动了我，我便趁热打铁编写了一套「超市库存监控与商品秒杀系统」。几千行代码虽然不多，但在面试官眼中，这就是你实战能力的最好证明。正如 Linux 之父 Linus Torvalds 所说：「Talk is cheap, show me the code.」 别总是空谈什么宏大的架构，直接打开电脑，给面试官看你的代码实现。</p>

<p>并不是每个人的道路都是坦荡顺遂的，面对身边那些看似「优秀」的人，我们不必时常自卑。至少，改行的道路绝非考研一条。不要盲目地认为没有研究生学历就低人一等，事实上，很多人读研是因为难以决定未来，或是能力尚不足以胜任当下的岗位。很多前沿的技术，在学校的实验室里是永远摸不到的。直接扎进公司的生产环境中去摸爬滚打，或许是成长更快的选择。</p>

<p>请保持你的不甘，然后去跑，去写，去证明。</p>]]></content><author><name>Yuan Tao</name></author><summary type="html"><![CDATA[说明]]></summary></entry><entry><title type="html">「核弹机」组装记录</title><link href="/2023/07/01/bomb-like-pc.html" rel="alternate" type="text/html" title="「核弹机」组装记录" /><published>2023-07-01T15:00:00+00:00</published><updated>2023-07-01T15:00:00+00:00</updated><id>/2023/07/01/bomb-like-pc</id><content type="html" xml:base="/2023/07/01/bomb-like-pc.html"><![CDATA[<p>所谓「核弹机」，就是非常不稳定的电脑。与「核弹」不同的是，它的造价可比核弹低多了。这里有捡来的配件，坏的配件，魔改的配件……</p>

<p>这里记录我配置过的所有「核弹机」，作为纪念。</p>

<p>注意：以下记录纯属个人分享，并非广告。以下出现的各厂家商标并非作者推荐。</p>

<h2 id="2025">2025</h2>

<p>今年出现了AI热潮，存储器件价格飙升，所以我的购买新电脑的计划泡汤了，只能弄一些垃圾来凑数。</p>

<h3 id="主机i">主机I</h3>

<ul>
  <li><strong>CPU</strong>: <a href="https://www.intel.cn/content/www/cn/zh/products/sku/190883/intel-core-i59400f-processor-9m-cache-up-to-4-10-ghz/specifications.html">英特尔® 酷睿™ i5-9400F 处理器</a></li>
  <li><strong>MB</strong>: <a href="https://www.colorful.cn/home/Product?id=791&amp;mid=84">七彩虹 CVN Z390 GAMING V20</a>
    <ul>
      <li>这个主板算是核弹机里比较好的了。本来想上一个至强处理器组超强NAS，用PCIe接口可以扩展大量各种接口，但可惜被AI浪潮干翻车。</li>
      <li>其实本来是一个ROG主板，但是坏了。</li>
    </ul>
  </li>
  <li><strong>MEM</strong>: DDR4 4G@2400MHz*4
    <ul>
      <li>一条镁光，一条三星，两条使用三星颗粒的光威，内存太贵了，只有4GB的价格能接受。与上面的Z板联动了。</li>
    </ul>
  </li>
  <li><strong>SSD</strong>: Used SATA 128GB + 爱国者1TB（换新）</li>
  <li><strong>HDD</strong>: None</li>
  <li><strong>GPU</strong>: GigaByte NVIDIA GTX 1650S 4GB</li>
  <li><strong>PDU</strong>: TT 500W</li>
  <li><strong>FAN</strong>: 朋友送的120水冷</li>
  <li><strong>BOX</strong>: 闲鱼35买的超大机箱</li>
</ul>

<h3 id="主机ii">主机II</h3>

<ul>
  <li><strong>CPU</strong>: <a href="https://www.intel.cn/content/www/cn/zh/products/sku/75465/intel-xeon-processor-e31285-v3-8m-cache-3-60-ghz/specifications.html">英特尔® 至强® 处理器 E3-1285 v3</a> - TDP 65W; 捡的</li>
  <li><strong>MB</strong>: HP Z230 SFF <em>physical bypassed</em> Cracked NVME Boot
    <ul>
      <li><a href="https://github.com/matDOTviguier/z230nvmebios">修改BIOS以支持NVME硬盘（需要使用转接卡）</a></li>
      <li>对主板焊短接线以在不使用原装机箱的情况下开机直接进入引导</li>
    </ul>
  </li>
  <li><strong>MEM</strong>: DDR3 4G@1600MHz*4</li>
  <li><strong>SSD</strong>: Used SATA 128GB</li>
  <li><strong>HDD</strong>: None</li>
  <li><strong>GPU</strong>: Integrated+ASUS P106-100(like 1066)
    <ul>
      <li>需要使用特殊驱动，建议使用<a href="https://raincandy.tech/nvidiadrv/">NVIDIA 图形驱动程序 – 雨糖科技魔改版</a></li>
    </ul>
  </li>
  <li><strong>PDU</strong>: 杂牌 500W
    <ul>
      <li>朋友给的，因为风扇坏了有异响。我去拼多多5元买了一个就修好了。</li>
    </ul>
  </li>
  <li><strong>FAN</strong>: Fish 超频3青鸟+3pin+2*大4pin</li>
  <li><strong>BOX</strong>: 垃圾海景房机箱</li>
</ul>

<h2 id="2023">2023</h2>

<h3 id="主机i-1">主机I</h3>

<p><a href="https://tieba.baidu.com/p/5896113919">图拉丁吧实战参考</a>
<a href="https://post.smzdm.com/p/akmgdq79/">什么值得买实战参考</a></p>

<ul>
  <li><strong>CPU</strong>: <a href="https://www.intel.cn/content/www/cn/zh/products/sku/190886/intel-core-i39100f-processor-6m-cache-up-to-4-20-ghz/specifications.html">英特尔® 酷睿™ i3-9100F 处理器</a>
    <ul>
      <li>B0步进（即7代的马甲）</li>
    </ul>
  </li>
  <li><strong>MB</strong>: H110 BIOS Modded
    <ul>
      <li>修改BIOS以支持B0步进的9代处理器</li>
    </ul>
  </li>
  <li><strong>MEM</strong>: “Special for AMD” DDR3 8G@1600MHz*2
    <ul>
      <li>据说是由于主板阉割内存型号校验，导致可以使用所谓的AMD专用内存条</li>
    </ul>
  </li>
  <li><strong>SSD</strong>: Kingston SATA SSD 256GB</li>
  <li><strong>HDD</strong>: None</li>
  <li><strong>GPU</strong>: Sapphire Radeon RX460 with 4GB
    <ul>
      <li>RX460可以超频变成560，但是不稳定蓝屏，放弃</li>
    </ul>
  </li>
  <li><strong>PDU</strong>: Huntkey 230W</li>
  <li><strong>FAN</strong>: Cheap FAN</li>
  <li><strong>BOX</strong>: Big ITX Box</li>
</ul>

<h3 id="主机ii-1">主机II</h3>

<p>这是亲戚家里装修送给我的旧电脑，原来的机箱烂了，在拼多多购买「撒哈拉空气盒子」极致压缩体积。</p>

<ul>
  <li><strong>CPU</strong>: AMD Athlon X4 <a href="mailto:740@3.2GHz">740@3.2GHz</a>*4 - TDP 65W</li>
  <li><strong>MB</strong>: Colorful</li>
  <li><strong>MEM</strong>: Kingston DDR3 4G@1600MHz*2</li>
  <li><strong>SSD</strong>: Used SATA M.2+Converter 128GB</li>
  <li><strong>HDD</strong>: None</li>
  <li><strong>GPU</strong>: Nvidia GT 610 with 2GB</li>
  <li><strong>PDU</strong>: Used Lenovo 180W</li>
  <li><strong>FAN</strong>: Fish 超频3青鸟</li>
  <li><strong>BOX</strong>: 撒哈拉空气盒子</li>
</ul>

<h2 id="记录模板">记录模板</h2>

<ul>
  <li><strong>CPU</strong>: Brand Series Model@Freq<em>CoreNum(</em>2 if HyperThread)</li>
  <li><strong>MB</strong>: Brand Model</li>
  <li><strong>MEM</strong>: Brand DDRX Capacity@Freq*Num</li>
  <li><strong>SSD</strong>: Brand Protocol Capacity Speed</li>
  <li><strong>HDD</strong>: Brand Capacity</li>
  <li><strong>GPU</strong>: Brand DieBrand Model</li>
  <li><strong>PDU</strong>: Brand Power</li>
  <li><strong>FAN</strong>: -</li>
  <li><strong>BOX</strong>: -</li>
</ul>]]></content><author><name>Yuan Tao</name></author><summary type="html"><![CDATA[所谓「核弹机」，就是非常不稳定的电脑。与「核弹」不同的是，它的造价可比核弹低多了。这里有捡来的配件，坏的配件，魔改的配件……]]></summary></entry><entry><title type="html">Dandelion’s Promise</title><link href="/2023/06/16/dandelions-promise.html" rel="alternate" type="text/html" title="Dandelion’s Promise" /><published>2023-06-16T15:00:00+00:00</published><updated>2023-06-16T15:00:00+00:00</updated><id>/2023/06/16/dandelions-promise</id><content type="html" xml:base="/2023/06/16/dandelions-promise.html"><![CDATA[<p>纵然今天之后，我仍旧平凡普通</p>

<p>但我终于在大学生活的最后时光勇敢过。</p>

<p>纵然如今的我，仍然分不清友情与爱情</p>

<p>但你们都让我变得坚强，让我不断成长</p>

<p>都在我经历风雨的时候存在过</p>

<p>最终成为我人生中的一道道彩虹。</p>

<p>蒲公英虽易散</p>

<p>但每颗种子都有同样的基因。</p>

<p>如同共同生活四年的我们</p>

<p>心会永远紧紧相连。</p>]]></content><author><name>Yuan Tao</name></author><summary type="html"><![CDATA[纵然今天之后，我仍旧平凡普通 但我终于在大学生活的最后时光勇敢过。 纵然如今的我，仍然分不清友情与爱情 但你们都让我变得坚强，让我不断成长 都在我经历风雨的时候存在过 最终成为我人生中的一道道彩虹。 蒲公英虽易散 但每颗种子都有同样的基因。 如同共同生活四年的我们 心会永远紧紧相连。]]></summary></entry></feed>