<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Fox Home</title>
  
  <subtitle>清疚</subtitle>
  <link href="https://www.foolishfox.cn/atom.xml" rel="self"/>
  
  <link href="https://www.foolishfox.cn/"/>
  <updated>2026-05-04T12:39:06.000Z</updated>
  <id>https://www.foolishfox.cn/</id>
  
  <author>
    <name>Foolish Fox</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>风下之乡的饮食</title>
    <link href="https://www.foolishfox.cn/posts/202605-malaysia2026-food.html"/>
    <id>https://www.foolishfox.cn/posts/202605-malaysia2026-food.html</id>
    <published>2026-05-04T12:39:06.000Z</published>
    <updated>2026-05-04T12:39:06.000Z</updated>
    
    <content type="html"><![CDATA[<p>继 3 月份发的行程安排之后，在现在五一旅游的间隙，终于有时间来写一下马来西亚之旅的饮食篇了。话不多说，直接进入正题。</p><div class="note warning flat"><p><strong>注意：</strong> 以下内容仅代表个人口味和体验，并只对 2 月份当时的情况负责。</p></div><h2 id="Kasbin-Putrajaya-❌❌❌">Kasbin Putrajaya ❌❌❌<a class="header-anchor" href="#Kasbin-Putrajaya-❌❌❌">¶</a></h2><p>我们在吉隆坡主要是转机去仙本那，所以在吉隆坡的停留时间非常短暂，只吃了两顿正餐。午饭是在粉红清真寺附近的叫 Kasbin Putrajaya 的东南亚餐厅，谷歌评分很高有 4.7 分，但是我们去的时候发现完全没有人在这里吃，就已经隐隐觉得不太对劲了。店里也没有菜单，只能去问店员要了个二维码，扫码跳转到了一个网页，而然菜单也没有语言选项，只能一点一点截图翻译。最后点了如图的 3 个菜，分别是咖喱鸡、烤鱼和炒蕨菜，以及一杯 Milo Dinosaur，评价是除了咖喱鸡的味道还行之外，其他的都非常难吃，而且还贵。</p><div class="gallery-container" data-type="data" data-button="" data-limit="10" data-first="10">    <div class="gallery-items">[{"url":"https://asset.foolishfox.cn/2026/05/04/69f89995d3064.png","alt":"Snipaste_2026-05-04_21-01-06.png","title":""},{"url":"https://asset.foolishfox.cn/2026/05/04/69f89743227bd.png","alt":"IMG_20260222_121955.png","title":""}]</div>  </div><h2 id="Mengrai-Thai-Restaurant-✅✅">Mengrai Thai Restaurant ✅✅<a class="header-anchor" href="#Mengrai-Thai-Restaurant-✅✅">¶</a></h2><p>这家是在转机酒店附近的一家泰国餐厅，谷歌评分 4.7 分，我们点了冬阴功汤、菠萝炒饭和炒螃蟹，味道都不错，尤其是冬阴功汤和菠萝炒饭，螃蟹的味道一般般，价格也还合适。除了这家之外，附近还有很多餐厅，如果有在吉隆坡转机的朋友可以考虑在这里住宿，吃饭很方便，还可以顺便去布城逛逛。</p><div class="gallery-container" data-type="data" data-button="" data-limit="10" data-first="10">    <div class="gallery-items">[{"url":"https://asset.foolishfox.cn/2026/05/04/69f89d2eb4590.png","alt":"Snipaste_2026-05-04_21-20-21.png","title":""},{"url":"https://asset.foolishfox.cn/2026/05/04/69f897459131e.png","alt":"IMG_20260222_204633.png","title":""}]</div>  </div><h2 id="Anjung-D’Samudera-Cafe-✅✅✅">Anjung D’Samudera Cafe ✅✅✅<a class="header-anchor" href="#Anjung-D’Samudera-Cafe-✅✅✅">¶</a></h2><p>这是我们在仙本那吃的第一顿正餐，没想到之后几天甚至到回国之后都一直心心念念的就是这顿饭了。我们总共点了咸蛋黄螃蟹、香辣螃蟹、白灼虾和米线，当时吃的价格好像是 50 马币 1 公斤螃蟹，我们对半炒了咸蛋黄和香辣的口味，白灼虾也是 50 马币 1 公斤。咸蛋黄螃蟹超级好吃，以至于后面几天我们连续尝试了好几家餐厅的咸蛋黄螃蟹，但是综合评价都没有这家好吃，大部分都是太油了，或者咸蛋黄的味道不够浓郁，或者螃蟹的肉质不好吃。白灼虾也很不错，所以我们回国之后参考这个做法自己买虾做了好多次，每一次都很好吃。香辣螃蟹一般，米线不好吃，和国内的米线完全不一样，吃了两口就吃不下了。总之这顿饭是我们在仙本那吃的最满意的一顿了，如果有机会再去仙本那的话（虽然大概率不会了），我们还会想吃这顿饭的。</p><div class="gallery-container" data-type="data" data-button="" data-limit="10" data-first="10">    <div class="gallery-items">[{"url":"https://asset.foolishfox.cn/2026/05/04/69f89edc8d140.png","alt":"Snipaste_2026-05-04_21-27-35.png","title":""},{"url":"https://asset.foolishfox.cn/2026/05/04/69f897449db3f.png","alt":"IMG_20260223_183101.png","title":""},{"url":"https://asset.foolishfox.cn/2026/05/04/69f8a1c0a0334.jpg","alt":"1777902013167.jpg","title":""}]</div>  </div><h2 id="Restoran-Bubble-Cafe-❌">Restoran Bubble Cafe ❌<a class="header-anchor" href="#Restoran-Bubble-Cafe-❌">¶</a></h2><p>这家店是在小红书上找的（真的再也不相信小红书了），谷歌评分倒是不高（3.5 分）。点的菜除了咸蛋黄鱿鱼都一般，咸蛋黄螃蟹煎的太干了，蛋黄味不明显。</p><div class="gallery-container" data-type="data" data-button="" data-limit="10" data-first="10">    <div class="gallery-items">[{"url":"https://asset.foolishfox.cn/2026/05/04/69f8a06f6563b.png","alt":"Snipaste_2026-05-04_21-34-12.png","title":""},{"url":"https://asset.foolishfox.cn/2026/05/04/69f8a1e33b320.jpg","alt":"1777902044465.jpg","title":""},{"url":"https://asset.foolishfox.cn/2026/05/04/69f8a1e436881.jpg","alt":"1777902047899.jpg","title":""}]</div>  </div><h2 id="Little-Italy-❌❌">Little Italy ❌❌<a class="header-anchor" href="#Little-Italy-❌❌">¶</a></h2><p>这是我们到亚庇之后的第一餐，就在酒店楼下，是一家主打意大利面的餐厅，谷歌评分 4.4 分。我们去得有点晚，主推的几个搭配已经卖完了，最后点了一个海鲜炒饭和一个墨鱼面。海鲜焖饭是比较湿的，墨鱼面也没啥特别的味道，不过手工意面口感可能不错，但是我们对面的口感不是很在意，所以也没有特别喜欢，而且价格还很贵，所以这顿饭的性价比不太高。</p><div class="gallery-container" data-type="data" data-button="" data-limit="10" data-first="10">    <div class="gallery-items">[{"url":"https://asset.foolishfox.cn/2026/05/04/69f8a29e2aeeb.png","alt":"1777902234249.png","title":""},{"url":"https://asset.foolishfox.cn/2026/05/04/69f8974a8f467.png","alt":"IMG_20260225_201743.png","title":""}]</div>  </div><h2 id="新记肉骨茶-✅✅">新记肉骨茶 ✅✅<a class="header-anchor" href="#新记肉骨茶-✅✅">¶</a></h2><p>之前在小红书上看到有人吐槽肉骨茶药材味太重了，吃了两口就吃不下了，所以我们也做好了心理准备，但是实际尝到的味道还不错，挺喜欢喝的。除了肉骨茶之外，我们还点了一个蔬菜、一个鸡爪和一个榴莲煎蕊，都比较中规中矩，没有特别喜欢也没有特别不喜欢，价格也还可以接受。</p><div class="gallery-container" data-type="data" data-button="" data-limit="10" data-first="10">    <div class="gallery-items">[{"url":"https://asset.foolishfox.cn/2026/05/04/69f8a4c2ebb7a.png","alt":"Snipaste_2026-05-04_21-51-14.png","title":""},{"url":"https://asset.foolishfox.cn/2026/05/04/69f897419a6b6.png","alt":"IMG_20260301_121257.png","title":""}]</div>  </div><h2 id="大茄来-✅">大茄来 ✅<a class="header-anchor" href="#大茄来-✅">¶</a></h2><p>这个和 KK Garden Seafood 都是小红书上既有人推荐又有人吐槽的餐厅，我们是抱着试一试的心态去吃的。点的菜里面空心菜和白灼虾还行，咸蛋黄螃蟹也勉强可以，但是豆腐一般（虽然前一天和我们拼车去看大王花的姐妹说很喜欢这个豆腐），炒饭不好吃，综合来讲还算可以。</p><div class="gallery-container" data-type="data" data-button="" data-limit="10" data-first="10">    <div class="gallery-items">[{"url":"https://asset.foolishfox.cn/2026/05/04/69f8a4c2d3ca9.png","alt":"Snipaste_2026-05-04_21-51-30.png","title":""},{"url":"https://asset.foolishfox.cn/2026/05/04/69f8a035d29f3.png","alt":"IMG_20260228_210245.png","title":""}]</div>  </div><h2 id="KK-Garden-Seafood-❌">KK Garden Seafood ❌<a class="header-anchor" href="#KK-Garden-Seafood-❌">¶</a></h2><p>咸蛋黄软壳蟹炸的油太多了，蛤蜊的壳好重，说给你称了一斤，但实际上根本没有多少肉，炒粉 / 炒牛河也一般，但是干奶油虾还是不错的。</p><div class="gallery-container" data-type="data" data-button="" data-limit="10" data-first="10">    <div class="gallery-items">[{"url":"https://asset.foolishfox.cn/2026/05/04/69f8a4c2ecdd5.png","alt":"Snipaste_2026-05-04_21-51-46.png","title":""},{"url":"https://asset.foolishfox.cn/2026/05/04/69f8974931b9a.png","alt":"IMG_20260226_210029.png","title":""}]</div>  </div><h2 id="夜市-✅">夜市 ✅<a class="header-anchor" href="#夜市-✅">¶</a></h2><p>这是在加雅街上的夜市，好像是每周五和周六晚上开放，我们吃了一个叫做 Apam Balik （曼煎粿）的甜点，是一个煎过的饼里面放一些花生碎和糖，甜甜的我比较喜欢（但是贺小可觉得太甜了）✅✅；此外还有一个沙爹（Sar Tae）口味的烧烤，贺小可之前去印尼的时候被这个玩意搞出了心理阴影，但是我觉得还行；最后在一个饮料摊买了一杯冰拉茶，很不错（当然某人还是觉得太甜了）✅</p><div class="gallery-container" data-type="data" data-button="" data-limit="10" data-first="10">    <div class="gallery-items">[{"url":"https://asset.foolishfox.cn/2026/05/04/69f8974d98912.png","alt":"IMG_20260227_215247.png","title":""},{"url":"https://asset.foolishfox.cn/2026/05/04/69f8974782a5b.png","alt":"IMG_20260227_220431.png","title":""},{"url":"https://asset.foolishfox.cn/2026/05/04/69f8974c5e0c3.png","alt":"IMG_20260227_221748.png","title":""}]</div>  </div><h2 id="小摊-✅✅✅">小摊 ✅✅✅<a class="header-anchor" href="#小摊-✅✅✅">¶</a></h2><p>我们有三顿饭是比较随意的解决的：</p><ul><li>仙本那加油站南边的小吃摊上，点了一个咖喱鸡和海鲜饭，都非常不错，而且是我们吃的最便宜的一顿饭了，性价比超级高 ✅✅✅</li><li>亚庇酒店对面的一个便利店（Triple S），点了一个椰浆饭、叻沙、拉茶（其实这才是第一次喝拉茶）和一个水果 ABC，味道都不错，价格也很便宜 ✅✅✅</li><li>酒店旁边的 Orange 便利店，买了泡面、果汁和一些搭配，味道都还行，价格也很便宜 ✅✅</li></ul><div class="gallery-container" data-type="data" data-button="" data-limit="10" data-first="10">    <div class="gallery-items">[{"url":"https://asset.foolishfox.cn/2026/05/04/69f8a748102ef.png","alt":"Snipaste_2026-05-04_22-03-26.png","title":""},{"url":"https://asset.foolishfox.cn/2026/05/04/69f8a316bdfeb.jpg","alt":"1777902356823.jpg","title":""},{"url":"https://asset.foolishfox.cn/2026/05/04/69f8a4bf4374a.png","alt":"Snipaste_2026-05-04_21-50-09.png","title":""},{"url":"https://asset.foolishfox.cn/2026/05/04/69f89746b677a.png","alt":"IMG_20260226_131623.png","title":""},{"url":"https://asset.foolishfox.cn/2026/05/04/69f8a49704b95.jpg","alt":"1777902740022.jpg","title":""},{"url":"https://asset.foolishfox.cn/2026/05/04/69f8a4968d82f.jpg","alt":"1777902736501.jpg","title":""}]</div>  </div><h2 id="其他-❌">其他 ❌<a class="header-anchor" href="#其他-❌">¶</a></h2><ul><li> 加雅街上的两个叻沙店（怡丰叻沙和叻沙 x 东炎），都很一般，牛肉丸还不如机打的有嚼劲 ❌❌❌</li><li>仙本那酒店的早餐，是包含在房费里的，虽然就是普通的面包和方便面，但是味道还行，而且还不要钱，要啥自行车啊，性价比也不错了 ✅</li><li>潜水附带的午饭，味道一般，而且可能有卫生问题（虽然我没有吃出问题），如果有介意的朋友可以自己买点吃的带着，或者吃个面包什么的就好了 ❌</li></ul><div class="gallery-container" data-type="data" data-button="" data-limit="10" data-first="10">    <div class="gallery-items">[{"url":"https://asset.foolishfox.cn/2026/05/04/69f8973fb5666.png","alt":"IMG_9999.png","title":""},{"url":"https://asset.foolishfox.cn/2026/05/04/69f8974f11328.png","alt":"IMG_20260224_073143.png","title":""},{"url":"https://asset.foolishfox.cn/2026/05/04/69f8a3110b458.jpg","alt":"1777902350704.jpg","title":""}]</div>  </div><h2 id="后记">后记 <a class="header-anchor" href="#后记">¶</a></h2><p>2 月份的记录终于写完了，但是 4 月初又去了一趟潮汕，每天都在吃吃吃，感觉又有很多东西可以写了，等有时间再写一篇潮汕（以及现在在江西的）的饮食篇吧。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;继 3 月份发的行程安排之后，在现在五一旅游的间隙，终于有时间来写一下马来西亚之旅的饮食篇了。话不多说，直接进入正题。&lt;/p&gt;
&lt;div class=&quot;note warning flat&quot;&gt;&lt;p&gt;&lt;strong&gt;注意：&lt;/strong&gt; 以下内容仅代表个人口味和体验，并只对</summary>
      
    
    
    
    <category term="随记/旅行日志" scheme="https://www.foolishfox.cn/categories/%E9%9A%8F%E8%AE%B0-%E6%97%85%E8%A1%8C%E6%97%A5%E5%BF%97/"/>
    
    
    <category term="旅行" scheme="https://www.foolishfox.cn/tags/%E6%97%85%E8%A1%8C/"/>
    
    <category term="马来西亚" scheme="https://www.foolishfox.cn/tags/%E9%A9%AC%E6%9D%A5%E8%A5%BF%E4%BA%9A/"/>
    
    <category term="东南亚" scheme="https://www.foolishfox.cn/tags/%E4%B8%9C%E5%8D%97%E4%BA%9A/"/>
    
    <category term="仙本那" scheme="https://www.foolishfox.cn/tags/%E4%BB%99%E6%9C%AC%E9%82%A3/"/>
    
    <category term="亚庇" scheme="https://www.foolishfox.cn/tags/%E4%BA%9A%E5%BA%87/"/>
    
    <category term="美食" scheme="https://www.foolishfox.cn/tags/%E7%BE%8E%E9%A3%9F/"/>
    
    <category term="咸蛋黄" scheme="https://www.foolishfox.cn/tags/%E5%92%B8%E8%9B%8B%E9%BB%84/"/>
    
    <category term="虾" scheme="https://www.foolishfox.cn/tags/%E8%99%BE/"/>
    
    <category term="蟹" scheme="https://www.foolishfox.cn/tags/%E8%9F%B9/"/>
    
    <category term="海鲜" scheme="https://www.foolishfox.cn/tags/%E6%B5%B7%E9%B2%9C/"/>
    
    <category term="旅游攻略" scheme="https://www.foolishfox.cn/tags/%E6%97%85%E6%B8%B8%E6%94%BB%E7%95%A5/"/>
    
  </entry>
  
  <entry>
    <title>使用 clangd 代替 MSVC 的 IntelliSense</title>
    <link href="https://www.foolishfox.cn/posts/202603-code-clangd.html"/>
    <id>https://www.foolishfox.cn/posts/202603-code-clangd.html</id>
    <published>2026-03-21T08:59:03.000Z</published>
    <updated>2026-03-21T08:59:03.000Z</updated>
    
    <content type="html"><![CDATA[<p>最近在用 VSCode 写数据处理代码的时候，经常碰到 VSCode 响应非常慢、甚至卡死的情况。通过查看进程占用情况，基本可以确定是 MSVC 的 IntelliSense 导致的。MSVC 的 IntelliSense 在处理大型项目或者复杂代码时性能很差。在 Gemini 的建议下，我尝试使用 clangd 来替代 MSVC 的 IntelliSense，结果非常不错。</p><p>clangd 是基于 LLVM 的 C / C++ 语言服务器，提供了代码补全、错误检查、跳转等功能。相比 MSVC 的 IntelliSense，clangd 的性能更好，响应更快，尤其是在大型项目中表现更为出色。不过缺点是我很多代码的函数注释使用的是 Doxygen 风格，MS 官方的插件可以拦截渲染请求，将注释渲染到函数的说明中去，但是 clangd 无法做到这一点，最后只能通过命令行的 doxygen 生成文档，再通过插件在 VSCode 中查看文档。</p><h2 id="安装-clangd">安装 clangd<a class="header-anchor" href="#安装-clangd">¶</a></h2><p>除了在 VSCode 中安装 clangd 插件之外，还需要在系统中安装 clangd，例如 Ubuntu 可以直接用 apt 安装：</p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">sudo</span> apt install clangd</span><br></pre></td></tr></tbody></table></figure><h2 id="Make-工程">Make 工程 <a class="header-anchor" href="#Make-工程">¶</a></h2><p>对于 Make 工程，需要生成 compile_commands.json 文件，clangd 通过这个文件来了解项目的编译选项。可以使用 Bear 工具来生成 compile_commands.json：</p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">sudo</span> apt install bear</span><br><span class="line">bear -- make -j4</span><br></pre></td></tr></tbody></table></figure><h2 id="CMake-工程">CMake 工程 <a class="header-anchor" href="#CMake-工程">¶</a></h2><p>对于 CMake 工程，可以直接在 CMakeLists.txt 中添加以下内容来生成 compile_commands.json：</p><figure class="highlight cmake"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">set</span>(CMAKE_EXPORT_COMPILE_COMMANDS <span class="keyword">ON</span>)</span><br></pre></td></tr></tbody></table></figure><p>但是一般情况下，CMake 会将 compile_commands.json 生成在构建目录中，而 clangd 默认会在项目根目录中寻找这个文件。可以通过创建一个符号链接来解决这个问题：</p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">ln</span> -s build/compile_commands.json compile_commands.json</span><br></pre></td></tr></tbody></table></figure><p>或者在配置文件中指定 compile_commands.json 的路径：</p><figure class="highlight json"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">"clangd.arguments"</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">    <span class="string">"--compile-commands-dir=${workspaceFolder}/build"</span><span class="punctuation">,</span></span><br><span class="line"><span class="punctuation">]</span></span><br></pre></td></tr></tbody></table></figure><p>另外如果碰到了标准库无法找到的问题，可以在 VSCode 的设置中添加以下配置来指定标准库的位置：</p><figure class="highlight json"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">"clangd.arguments"</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">    <span class="string">"--query-driver=/usr/bin/g++*,/usr/bin/gcc*,/usr/bin/c++*"</span></span><br><span class="line"><span class="punctuation">]</span></span><br></pre></td></tr></tbody></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;最近在用 VSCode 写数据处理代码的时候，经常碰到 VSCode 响应非常慢、甚至卡死的情况。通过查看进程占用情况，基本可以确定是 MSVC 的 IntelliSense 导致的。MSVC 的 IntelliSense 在处理大型项目或者复杂代码时性能很差。在 Gemi</summary>
      
    
    
    
    <category term="技术笔记/工具" scheme="https://www.foolishfox.cn/categories/%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0-%E5%B7%A5%E5%85%B7/"/>
    
    
    <category term="C/C++" scheme="https://www.foolishfox.cn/tags/C-C/"/>
    
    <category term="clangd" scheme="https://www.foolishfox.cn/tags/clangd/"/>
    
    <category term="vscode" scheme="https://www.foolishfox.cn/tags/vscode/"/>
    
  </entry>
  
  <entry>
    <title>风下之乡的日落</title>
    <link href="https://www.foolishfox.cn/posts/202603-malaysia2026.html"/>
    <id>https://www.foolishfox.cn/posts/202603-malaysia2026.html</id>
    <published>2026-03-10T16:30:00.000Z</published>
    <updated>2026-03-10T16:30:00.000Z</updated>
    
    <content type="html"><![CDATA[<div class="note info flat"><p>本文多图预警！<br>这篇博客主要介绍我们的行程安排、花费、玩的项目和去的景点，吃饭的内容后面有空再写。</p></div><p>年后的第一个长假是在马来西亚的海边度过的，小可和朋友们去年去巴厘岛的时候（此时的我在兰州苦苦做实验）在吉隆坡短暂转机，在市区打卡了几个景点和饭店，留下了不错的印象（以至于这次在布城的时候，一直念念不忘椰浆饭）。在纠结了澳大利亚、新西兰、欧洲等诸多目的地后，我们最终敲定了马来西亚。这是一个奇妙的国家：半岛（西马）原为英国殖民地并独立成马来亚，后来与隔着南中国海的北婆罗洲（沙巴和砂拉越，即东马）合并。由于地理阻隔，东西马在文化、风俗和饮食上都有着显著的差异。我们这次的行程便主要集中在东马沙巴州的仙本那和亚庇两地。</p><div class="gallery-container" data-type="data" data-button="" data-limit="10" data-first="10">    <div class="gallery-items">[{"url":"https://asset.foolishfox.cn/2026/03/10/69b033a63bcd2.png","alt":"","title":""},{"url":"https://asset.foolishfox.cn/2026/03/10/69b033ae0947c.png","alt":"","title":""},{"url":"https://asset.foolishfox.cn/2026/03/10/69b033b45fd57.png","alt":"","title":""}]</div>  </div><h2 id="行程安排">行程安排 <a class="header-anchor" href="#行程安排">¶</a></h2><table><thead><tr><th style="text-align:center"> 日期</th><th style="text-align:center">城市</th><th style="text-align:center">日程</th><th style="text-align:center">交通</th><th style="text-align:center">住宿</th></tr></thead><tbody><tr><td style="text-align:center">2.21</td><td style="text-align:center">长沙 - 吉隆坡</td><td style="text-align:center">\</td><td style="text-align:center">亚航 4.5h</td><td style="text-align:center">机上</td></tr><tr><td style="text-align:center">2.22</td><td style="text-align:center">布城</td><td style="text-align:center">粉红清真寺</td><td style="text-align:center">Grab 打车</td><td style="text-align:center">吉隆坡机场附近 Orange 1 (美团)</td></tr><tr><td style="text-align:center">2.23</td><td style="text-align:center">吉隆坡 - 斗湖机场 - 仙本那</td><td style="text-align:center">闲逛</td><td style="text-align:center">岜迪航空 3h + 巴士 2h</td><td style="text-align:center">仙本那镇 Amazing Room (Booking)</td></tr><tr><td style="text-align:center">2.24</td><td style="text-align:center">仙本那</td><td style="text-align:center">跳岛（马达京岛、汀巴汀巴岛、邦邦岛）</td><td style="text-align:center">跳岛游船 白天</td><td style="text-align:center">仙本那镇 Amazing Room (Booking)</td></tr><tr><td style="text-align:center">2.25</td><td style="text-align:center">仙本那 - 亚庇</td><td style="text-align:center">海钓</td><td style="text-align:center">船 上午 + 岜迪航空 1h</td><td style="text-align:center">亚庇市区 Hotel Capital (Agoda + Booking)</td></tr><tr><td style="text-align:center">2.26</td><td style="text-align:center">亚庇</td><td style="text-align:center">丹绒亚路海滩拖曳伞 + Spa</td><td style="text-align:center">Grab 打车</td><td style="text-align:center">亚庇市区 Hotel Capital (Agoda + Booking)</td></tr><tr><td style="text-align:center">2.27</td><td style="text-align:center">亚庇</td><td style="text-align:center">Kawa 红树林</td><td style="text-align:center">小团包车 车上往返总计 4h</td><td style="text-align:center">亚庇市区 Hotel Capital (Agoda + Booking)</td></tr><tr><td style="text-align:center">2.28</td><td style="text-align:center">亚庇</td><td style="text-align:center">大王花基地 + 丹绒亚路海滩桨板</td><td style="text-align:center">Grab 包车 车上往返总计 3h</td><td style="text-align:center">亚庇市区 Hotel Capital (Agoda + Booking)</td></tr><tr><td style="text-align:center">3.1</td><td style="text-align:center">亚庇 - 北京</td><td style="text-align:center">市区买东西</td><td style="text-align:center">亚航 6h</td><td style="text-align:center">\</td></tr></tbody></table><h2 id="旅行花费">旅行花费 <a class="header-anchor" href="#旅行花费">¶</a></h2><div class="note info flat"><p>部分项目标出了对应的马币，由于使用微信支付全球有礼有组队汇率，外加使用的一些优惠券，所以每一笔的汇率都不一样。未注明的花费都是 2 人总计。</p></div><table><thead><tr><th style="text-align:center">类别</th><th style="text-align:center">小类</th><th style="text-align:center">金额</th><th style="text-align:center">马币</th><th style="text-align:center">总计</th></tr></thead><tbody><tr><td style="text-align:center">交通</td><td style="text-align:center">国际往返</td><td style="text-align:center">5784</td><td style="text-align:center"></td><td style="text-align:center">\</td></tr><tr><td style="text-align:center"></td><td style="text-align:center">城市间机票</td><td style="text-align:center">1520</td><td style="text-align:center"></td><td style="text-align:center">\</td></tr><tr><td style="text-align:center"></td><td style="text-align:center">城市间大巴（仙本那 - 斗湖）</td><td style="text-align:center">178.9</td><td style="text-align:center">100</td><td style="text-align:center">\</td></tr><tr><td style="text-align:center"></td><td style="text-align:center">Grab 打车</td><td style="text-align:center">838.23</td><td style="text-align:center"></td><td style="text-align:center">8321.13</td></tr><tr><td style="text-align:center">住宿</td><td style="text-align:center">吉隆坡（雪邦）</td><td style="text-align:center">159.47</td><td style="text-align:center"></td><td style="text-align:center">\</td></tr><tr><td style="text-align:center"></td><td style="text-align:center">仙本那民宿</td><td style="text-align:center">612.88</td><td style="text-align:center"></td><td style="text-align:center">\</td></tr><tr><td style="text-align:center"></td><td style="text-align:center">亚庇酒店</td><td style="text-align:center">1126.82</td><td style="text-align:center"></td><td style="text-align:center">1899.17</td></tr><tr><td style="text-align:center">餐饮</td><td style="text-align:center"></td><td style="text-align:center"></td><td style="text-align:center"></td><td style="text-align:center">1974.67</td></tr><tr><td style="text-align:center">游玩</td><td style="text-align:center">跳岛潜水</td><td style="text-align:center">803.79</td><td style="text-align:center">450</td><td style="text-align:center">\</td></tr><tr><td style="text-align:center"></td><td style="text-align:center">海钓</td><td style="text-align:center">468.35</td><td style="text-align:center">270</td><td style="text-align:center">\</td></tr><tr><td style="text-align:center"></td><td style="text-align:center">spa （全身 1h + 足部 30min）</td><td style="text-align:center">204.16</td><td style="text-align:center">120</td><td style="text-align:center">\</td></tr><tr><td style="text-align:center"></td><td style="text-align:center">拖曳伞 （2 人 5min）</td><td style="text-align:center">288.81</td><td style="text-align:center">170</td><td style="text-align:center">\</td></tr><tr><td style="text-align:center"></td><td style="text-align:center">冲浪 （1 人 2h）</td><td style="text-align:center">348.22</td><td style="text-align:center">200</td><td style="text-align:center">\</td></tr><tr><td style="text-align:center"></td><td style="text-align:center">桨板 （2 人 2h）</td><td style="text-align:center">138.31</td><td style="text-align:center">80</td><td style="text-align:center">\</td></tr><tr><td style="text-align:center"></td><td style="text-align:center">kawa 红树林</td><td style="text-align:center">273.58</td><td style="text-align:center">160</td><td style="text-align:center">\</td></tr><tr><td style="text-align:center"></td><td style="text-align:center">大王花门票 + 向导费</td><td style="text-align:center">148.58</td><td style="text-align:center">80</td><td style="text-align:center">2673.80</td></tr><tr><td style="text-align:center">其他</td><td style="text-align:center">保险</td><td style="text-align:center">179.52</td><td style="text-align:center"></td><td style="text-align:center">\</td></tr><tr><td style="text-align:center"></td><td style="text-align:center">杂项</td><td style="text-align:center">781.53</td><td style="text-align:center"></td><td style="text-align:center">961.05</td></tr><tr><td style="text-align:center">合计</td><td style="text-align:center"></td><td style="text-align:center"></td><td style="text-align:center"></td><td style="text-align:center">15829.82</td></tr></tbody></table><h2 id="景点与项目">景点与项目 <a class="header-anchor" href="#景点与项目">¶</a></h2><h3 id="布城-粉红清真寺">布城 - 粉红清真寺 <a class="header-anchor" href="#布城-粉红清真寺">¶</a></h3><div class="gallery-container" data-type="data" data-button="" data-limit="10" data-first="10">    <div class="gallery-items">[{"url":"https://asset.foolishfox.cn/2026/03/09/69ada94eee982.png","alt":"","title":""},{"url":"https://asset.foolishfox.cn/2026/03/09/69ada94d5afda.png","alt":"","title":""},{"url":"https://asset.foolishfox.cn/2026/03/09/69ada94dc4d1d.png","alt":"","title":""},{"url":"https://asset.foolishfox.cn/2026/03/09/69ada9bd7156a.png","alt":"","title":""},{"url":"https://asset.foolishfox.cn/2026/03/09/69adad72888a7.png","alt":"","title":""},{"url":"https://asset.foolishfox.cn/2026/03/09/69ada94f4ce79.png","alt":"","title":""},{"url":"https://asset.foolishfox.cn/2026/03/09/69adad723db1b.png","alt":"","title":""},{"url":"https://asset.foolishfox.cn/2026/03/09/69ada94fa7144.png","alt":"","title":""},{"url":"https://asset.foolishfox.cn/2026/03/09/69ada95091c58.png","alt":"","title":""}]</div>  </div><p>布城（Putrajaya）是马来西亚的行政中心。与吉隆坡一样，它是从雪兰莪州划出的联邦直辖市，街头随处可见直辖区的旗帜。布城的绿化极好，一条河流穿城而过，在路上走着的时候时不时有一阵微风吹着很舒服，非常适合 City Walk，只有在正午的时候和没有遮挡的地方才会感到比较炎热，因此强烈建议趁早游玩。这里的核心景点是粉红清真寺及毗邻的首相府。清真寺依水而建，西侧是最佳的拍摄机位，日出时分去的话，可以看到晨曦光辉下的清真寺。除此之外布城还有一些景点，例如布城植物园、摩洛哥清真寺等等，但是因为我们前一天凌晨坐的飞机太累了，就没有继续去了。</p><p>清真寺可以免费进入参观，但是女性和穿背心、短裤的男性需要穿免费提供的长袍，建筑内部对游客开放的区域不多，只有一小块，里面有一些展板和宣传资料，介绍一些伊斯兰教的历史和穆斯林的习俗等，例如我们和一个日本人一起和工作人员聊天的时候，工作人员就提到怎么成为一个穆斯林，需要有两个人的见证，同时引导你怎么进行 declare 和祷告。还有几块展板显示了游客的来源，花 1 RM 就可以钉一个小钉子，上面中国和欧洲的人是最多的。</p><h3 id="仙本那">仙本那 <a class="header-anchor" href="#仙本那">¶</a></h3><div class="gallery-container" data-type="data" data-button="" data-limit="10" data-first="10">    <div class="gallery-items">[{"url":"https://asset.foolishfox.cn/2026/03/10/69afc7620bfc2.png","alt":"","title":""},{"url":"https://asset.foolishfox.cn/2026/03/10/69afc762acee4.png","alt":"","title":""},{"url":"https://asset.foolishfox.cn/2026/03/10/69afc76316c05.png","alt":"","title":""},{"url":"https://asset.foolishfox.cn/2026/03/10/69afc76418dff.png","alt":"","title":""},{"url":"https://asset.foolishfox.cn/2026/03/10/69afc76479a6c.png","alt":"","title":""},{"url":"https://asset.foolishfox.cn/2026/03/10/69afc764cf461.png","alt":"","title":""},{"url":"https://asset.foolishfox.cn/2026/03/10/69afc76a5d483.png","alt":"","title":""},{"url":"https://asset.foolishfox.cn/2026/03/10/69afc7678f0f0.png","alt":"","title":""},{"url":"https://asset.foolishfox.cn/2026/03/10/69afc7616e71e.png","alt":"","title":""},{"url":"https://asset.foolishfox.cn/2026/03/10/69afc76a8dd29.png","alt":"","title":""},{"url":"https://asset.foolishfox.cn/2026/03/10/69afc76a64a2e.png","alt":"","title":""},{"url":"https://asset.foolishfox.cn/2026/03/10/69afc76b1b92c.png","alt":"","title":""},{"url":"https://asset.foolishfox.cn/2026/03/10/69afc76d1caf9.png","alt":"","title":""}]</div>  </div><p>仙本那是沙巴州 - 斗湖省 - 仙本那县的首府，是一个海边的小镇子。最出名的是它的玻璃海，镇上的游客几乎全是中国人，本地人很多也会几句简单的中文，最常见的就是路边会有人提着水桶、篮子，里面装着皮皮虾、螃蟹之类的，问你要不要。仙本那本身非常偏僻，常见的往返方式是坐飞机到斗湖机场，再坐当地的小巴去仙本那，车程在 1.5~2 h 左右，价格一般是 25 RM 一个人。</p><p>仙本那的海确实很漂亮，但是镇子本身的环境很一般，很多地方都是垃圾，<strong>路边上还有很多野狗，晚上或者独行的时候一定要注意</strong>。另外不知道是不是因为马来西亚没有汽车的强制报废制度，所以很多老旧、破破的车一样在路上开，走在路上在哪里都可以闻到汽油味和海腥味。</p><p>我们跳岛和海钓是在海螺海螺（Halo Halo）线下买的，价格和我们在网上看的差不多，还算合适。跳岛的路线有 3 条，分别是 A 路线去爬山、B 路线（马达京岛、汀巴汀巴岛、邦邦岛）和 C 路线（马步岛），我们选择的是 B 路线。跳岛可以选择浮潜、体验潜和欢乐潜（需要考证），一般来讲如果会游泳，不怕水的话可以选择深潜（也就是体验潜），在马达京岛会下潜到 10 m 左右，在汀巴汀巴岛最深可以到 30 m 左右，而在邦邦岛大家都登岛自由活动，可以自己去浮潜。整体而言景色还是很不错的，海水很清澈，近处是宝石或者啤酒瓶一样的绿色，远处是蓝色的。</p><p>海钓也有两种选择，半日或者一日的，我们因为下午要坐飞机去亚庇，所以选择的是半日游。整体而言海钓的体验一般，船并没有开出很远，就在近海的几个岛旁边，鱼并不多，而且更关键的是海里有非常多的垃圾（塑料袋、拖鞋、矿泉水瓶啥的），很容易被钩上来。如果你不会钓鱼或者一直没钓到的话，可以让船上的小黑帮忙，他会帮你放线，把杆，感觉到鱼上钩了再让你收线钓上来。</p><h3 id="拖曳伞和桨板">拖曳伞和桨板 <a class="header-anchor" href="#拖曳伞和桨板">¶</a></h3><div class="gallery-container" data-type="data" data-button="" data-limit="10" data-first="10">    <div class="gallery-items">[{"url":"https://asset.foolishfox.cn/2026/03/10/69b033aa6ea9c.png","alt":"","title":""},{"url":"https://asset.foolishfox.cn/2026/03/10/69afcc6632612.png","alt":"","title":""},{"url":"https://asset.foolishfox.cn/2026/03/10/69afcc67ea406.png","alt":"","title":""},{"url":"https://asset.foolishfox.cn/2026/03/10/69afcc674fa5f.png","alt":"","title":""},{"url":"https://asset.foolishfox.cn/2026/03/10/69afcc66d788e.png","alt":"","title":""},{"url":"https://asset.foolishfox.cn/2026/03/10/69afcc68eebd8.png","alt":"","title":""},{"url":"https://asset.foolishfox.cn/2026/03/10/69b033a8a7ecd.png","alt":"","title":""}]</div>  </div><p>亚庇其实可以在跳岛时顺便玩拖曳伞，但由于我们在仙本那已经跳过岛了，不想再额外交跳岛费。后来我们在小红书上发现丹绒亚路海滩可以单独玩这个，两个人 170 RM（打听到有人最低价 160 RM）。每船会有 8 个人左右，2 个人一组，大概会上天 4~5 分钟左右，整体体验还是非常不错的。海滩也很适合看日落，还可以玩桨板，价格从两个人 60 RM 到 100 RM 不等，看个人的砍价能力。桨板教练会带你到合适的位置帮忙拍照，也可以选择自己划，只要注意别飘得太远就行。</p><h3 id="萤火虫">萤火虫 <a class="header-anchor" href="#萤火虫">¶</a></h3><div class="gallery-container" data-type="data" data-button="" data-limit="10" data-first="10">    <div class="gallery-items">[{"url":"https://asset.foolishfox.cn/2026/03/10/69b02c44eaa60.png","alt":"","title":""},{"url":"https://asset.foolishfox.cn/2026/03/10/69b02c460e2b6.png","alt":"","title":""},{"url":"https://asset.foolishfox.cn/2026/03/10/69b02c453e026.png","alt":"","title":""},{"url":"https://asset.foolishfox.cn/2026/03/10/69b02c45b0a4d.png","alt":"","title":""}]</div>  </div><p>在亚庇看萤火虫一般是红树林形成的一部分，除此之外还有看长鼻猴，日程从下午一直持续到晚上十点左右。红树林有很多地点，例如 Kawa Kawa、皇家湾和 Weston，区别主要是路程远近，很多攻略说这里萤火虫少，那里萤火虫多的，真真假假搞不清楚，甚至还有什么真 Kawa、假 Kawa 之分。更可恶的是，这边的喊价太搞人了，例如账面标价每个人 230 RM，你问他就说 100 RM，最后砍价可以到 80 甚至 60 RM，我们去哲斯顿码头问价的时候真的被搞得脑袋痛，完全不想和这些人打交道，再加上我们不是很想看猴子，最后在小红书找了一个明码标价 80 RM 不看猴子的小团。</p><p>我们最后去的是 Kawa 红树林（而且大概率是所谓的假 Kawa），在去之前还在附近的沙滩看了日落，非常漂亮。在晚上七点多就到河道的码头等待坐船去看萤火虫了，船上大概有 20 分钟左右，会贴着河道走一段，需要注意把手机亮度调到最低，而且一定要关闭闪光灯（虽然手机很难拍出来好看的照片，还是肉眼欣赏最好）。船上的向导会拿一个冷光灯来吸引萤火虫到船附近，可以用手接住，不过注意别捏死了。</p><h3 id="大王花">大王花 <a class="header-anchor" href="#大王花">¶</a></h3><div class="gallery-container" data-type="data" data-button="" data-limit="10" data-first="10">    <div class="gallery-items">[{"url":"https://asset.foolishfox.cn/2026/03/10/69b02d1a295dc.png","alt":"","title":""},{"url":"https://asset.foolishfox.cn/2026/03/10/69b02d2171b1a.png","alt":"","title":""},{"url":"https://asset.foolishfox.cn/2026/03/10/69b02d20f2fde.png","alt":"","title":""},{"url":"https://asset.foolishfox.cn/2026/03/10/69b02d1a98d1c.png","alt":"","title":""},{"url":"https://asset.foolishfox.cn/2026/03/10/69b02d1cb0548.png","alt":"","title":""},{"url":"https://asset.foolishfox.cn/2026/03/10/69b02d1b48653.png","alt":"","title":""},{"url":"https://asset.foolishfox.cn/2026/03/10/69b02d19cab26.png","alt":"","title":""},{"url":"https://asset.foolishfox.cn/2026/03/10/69b02d1b0586c.png","alt":"","title":""},{"url":"https://asset.foolishfox.cn/2026/03/10/69b02d1c167cc.png","alt":"","title":""}]</div>  </div><p>马来西亚 10 元纸币背面的图案就是大王花，亚庇的大王花主要有两个地方可以看，分别是神山（Mt. Kinabalu）和大王花基地。神山的单程车程需要 3 h 左右，行程需要 1 整天，两个懒人接受不了，所以只能选择去大王花基地（Rafflesia Information Center）。红树林的同一个旅行社去这的报价是每人 120 RM，稍微有点贵，最后我们做攻略的方案是打一个按小时计费的 Grab，拼车 4 个人去大王花基地。最开始我们计算的花费是 4 小时 100 RM 的打车费 + 36 RM 的 1 小时超时费，外加 15 RM 的门票和 100 RM 的向导费（最多可以 5 个人拼，我们是 4 个人），人均 74 RM。后面司机知道我们要去大王花基地之后，说 Grab 上这个打车是 Within City 的，不能开出市区，如果要去大王花基地得加 100 RM，不过按 5 个小时给我们算，我们也同意了，最后人均 90 RM。</p><p>和我们拼车的是一对很友好的母女，阿姨在车上直接和司机用粤语聊天起来，后面甚至听我的口音猜出我是湖南下面哪个市的，太厉害了。司机是沙巴州旁边的砂拉越州的人，父母是广东和福建的移民，所以会说粤语、福建话、马来语和一点普通话，还有英语。去大王花基地的路上海拔会从几十米一路爬升到最高超过 1600 m，中间会走很多的盘山公路，所以对车子的考验还是挺大的，我们的车子就在上山的时候出了问题，开着开着空调不制冷了，在中间的一个便利店停车之后司机下车打开前机盖里的水箱，里面的水直接被大量的水蒸气带了出来，幸好有个便利店可以买几瓶冰水加进去，勉强让车子正常开完了全程，所以拼车出行，最好提前和司机沟通好，确保车况正常。</p><p>下车之后去看大王花的路不是很好走，而且会有一部分的小路比较泥泞，所以最好在 Information Center 那里用 3 RM 租一双雨靴换着穿。路上和向导的交流得知当地的大王花花期一般在 7 天左右，而大王花的花苞需要 10 个月的时间才能够绽放。其实入口的地方有很多等待开放的大王花花苞，但是还需要等比较长的时间，所以想看到大王花还是比较看运气的，<strong>最好去之前让酒店前台帮忙询问一下最近有没有花开放</strong>。我们在 Wiki 上看到大王花最大可以到 1.4m 的直径，不过我们看到的那一朵只有 40 cm 左右，可能是不同的品种。买票 + 看花大概用了 1.5 h 不到，加上路上的时间，整体在 5 h 内完成应该是没有问题的。</p><h3 id="亚庇日落">亚庇日落 <a class="header-anchor" href="#亚庇日落">¶</a></h3><div class="gallery-container" data-type="data" data-button="" data-limit="10" data-first="10">    <div class="gallery-items">[{"url":"https://asset.foolishfox.cn/2026/03/10/69b033a837240.png","alt":"","title":""},{"url":"https://asset.foolishfox.cn/2026/03/10/69b033a6e3e2b.png","alt":"","title":""},{"url":"https://asset.foolishfox.cn/2026/03/10/69b033a7504de.png","alt":"","title":""},{"url":"https://asset.foolishfox.cn/2026/03/10/69b033a68e6b9.png","alt":"","title":""},{"url":"https://asset.foolishfox.cn/2026/03/10/69b033aded51d.png","alt":"","title":""},{"url":"https://asset.foolishfox.cn/2026/03/10/69b033ada38c6.png","alt":"","title":""},{"url":"https://asset.foolishfox.cn/2026/03/10/69b033b2614bf.png","alt":"","title":""},{"url":"https://asset.foolishfox.cn/2026/03/10/69b033b3c4a42.png","alt":"","title":""},{"url":"https://asset.foolishfox.cn/2026/03/10/69b033b3d7796.png","alt":"","title":""},{"url":"https://asset.foolishfox.cn/2026/03/10/69b033b5d4dfa.png","alt":"","title":""},{"url":"https://asset.foolishfox.cn/2026/03/10/69b033b2e07a2.png","alt":"","title":""},{"url":"https://asset.foolishfox.cn/2026/03/10/69b033b63bef8.png","alt":"","title":""}]</div>  </div><p>在去之前，亚庇的日落就久闻大名，而我们在亚庇看到的 3 次日落也确实都非常不错。我们分别在丹绒亚路沙滩和去看萤火虫路过的黑沙滩看了日落，个人认为在黑沙滩那边看到的日落更好，不过丹绒亚路沙滩可以边看日落边坐拖曳伞或者玩桨板，也还是很不错的。</p><p>亚庇是沙巴州的首府，整体发展不错，也有很多的中国人。亚庇的名字 Kota Kinabalu 就来源于附近的神山 Kinabalu 山，这个山也是马来西亚和婆罗洲（加里曼丹岛）的最高峰，Kota 是城市的意思。亚庇市区内最主要的景点就是丹绒亚路沙滩、加雅街和所谓榴莲街，每周五、周六的晚上在加雅街还有夜市（虽然夜市上的东西也不是很多）。除此之外有一条所谓的 “菲律宾街” 上有很多 spa 店，给出的价格一样虚高，但是被小红书 “整治” 之后，大家都统一了每个人 60 RM，包括 1 小时精油 spa 和半小时足部按摩，可以去尝试一下，放松还是很不错的。</p><h2 id="总结">总结 <a class="header-anchor" href="#总结">¶</a></h2><p>总的来说，这次沙巴之行可谓是 “一半折腾，一半治愈”。仙本那脏乱的街道与随处可见的野狗，空气中常有的海腥与汽油混合味，还有亚庇码头让人头痛的漫天要价，真的让人头大。然而，当你在丹绒亚路坐在桨板上迎着海风，潜入马达京的玻璃海寻找海龟；当你站在黑沙滩前沉醉于绝美的晚霞，历经波折终于看到大王花的真容，或是乘船穿梭在 Kawa 红树林看萤火虫飞舞…… 你会觉得，这片 “风下之乡” 的风景绝对值回所有的票价与波折。</p><div class="note info flat"><p>正如文章开头所提，这篇游记主要分享了我们的行程安排、花费和游玩项目。关于我们在仙本那和亚庇吃到的各种美食（尤其是念念不忘的咸蛋黄螃蟹！），等我整理好，下篇 “干饭专篇” 再见！</p></div>]]></content>
    
    
      
      
    <summary type="html">&lt;div class=&quot;note info flat&quot;&gt;&lt;p&gt;本文多图预警！&lt;br&gt;
这篇博客主要介绍我们的行程安排、花费、玩的项目和去的景点，吃饭的内容后面有空再写。&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;年后的第一个长假是在马来西亚的海边度过的，小可和朋友们去年去巴厘岛的时候（此时的我</summary>
      
    
    
    
    <category term="随记/旅行日志" scheme="https://www.foolishfox.cn/categories/%E9%9A%8F%E8%AE%B0-%E6%97%85%E8%A1%8C%E6%97%A5%E5%BF%97/"/>
    
    
    <category term="旅行" scheme="https://www.foolishfox.cn/tags/%E6%97%85%E8%A1%8C/"/>
    
    <category term="马来西亚" scheme="https://www.foolishfox.cn/tags/%E9%A9%AC%E6%9D%A5%E8%A5%BF%E4%BA%9A/"/>
    
    <category term="东南亚" scheme="https://www.foolishfox.cn/tags/%E4%B8%9C%E5%8D%97%E4%BA%9A/"/>
    
    <category term="仙本那" scheme="https://www.foolishfox.cn/tags/%E4%BB%99%E6%9C%AC%E9%82%A3/"/>
    
    <category term="潜水" scheme="https://www.foolishfox.cn/tags/%E6%BD%9C%E6%B0%B4/"/>
    
    <category term="亚庇" scheme="https://www.foolishfox.cn/tags/%E4%BA%9A%E5%BA%87/"/>
    
    <category term="日落" scheme="https://www.foolishfox.cn/tags/%E6%97%A5%E8%90%BD/"/>
    
    <category term="旅游攻略" scheme="https://www.foolishfox.cn/tags/%E6%97%85%E6%B8%B8%E6%94%BB%E7%95%A5/"/>
    
  </entry>
  
  <entry>
    <title>WSL 下实现 Windows 通知功能</title>
    <link href="https://www.foolishfox.cn/posts/202512-wsl-notify.html"/>
    <id>https://www.foolishfox.cn/posts/202512-wsl-notify.html</id>
    <published>2025-12-29T11:40:11.000Z</published>
    <updated>2025-12-29T11:40:11.000Z</updated>
    
    <content type="html"><![CDATA[<style>.spoiler {  background-color: black;  color: black;  padding: 0 2px;  border-radius: 2px;}.spoiler::selection {  background-color: white;  color: black;}.spoiler::-moz-selection {  background-color: white;  color: black;}</style><p>在 WSL 里面运行命令时，有时候要等很久，就会去做一些别的事情（<span class="spoiler">其实就是去摸鱼了</span>）。但是做别的搞久了就会忘记，或者等想起来的时候命令已经执行完很久了，所以我想着能不能在 WSL 里面运行命令结束后，给 Windows 发送通知。</p><p>Github 有一个叫做<code>wsl-notify</code>的项目，但是已经多年没有更新了，最后找到了一个 Powershell 的模块<code>BurntToast</code>，而 WSL 中可以把 Windows 下可执行文件的路径写入到 shell 配置中，所以可以在终端调用 Powershell 来发送通知。</p><ol><li>在 Powershell 中安装 BurntToast 模块：</li></ol><figure class="highlight powershell"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">Install-Module</span> <span class="literal">-Name</span> BurntToast</span><br></pre></td></tr></tbody></table></figure><ol start="2"><li>在 WSL 中进行配置：</li></ol><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">alias</span> powershell=<span class="string">"/mnt/c/WINDOWS/System32/WindowsPowerShell/v1.0/powershell.exe"</span></span><br><span class="line"><span class="function"><span class="title">notify</span></span>() {</span><br><span class="line">    <span class="built_in">local</span> title=<span class="string">"<span class="variable">${1:-WSL 通知}</span>"</span></span><br><span class="line">    <span class="built_in">local</span> msg=<span class="string">"<span class="variable">${2:-命令已运行完成}</span>"</span></span><br><span class="line">    powershell -Command <span class="string">"New-BurntToastNotification -Text '<span class="variable">${title}</span>', '<span class="variable">${msg}</span>'"</span></span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><ol start="3"><li>使用方法：<br>在 WSL 中运行命令后，调用<code>notify</code>函数即可发送通知。例如：</li></ol><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">sudo</span> apt update &amp;&amp; notify <span class="string">"更新完成"</span> <span class="string">"apt update 已经完成"</span></span><br></pre></td></tr></tbody></table></figure><p>当然还有一些奇技淫巧，例如一行命令产生一个必须要点击的通知：</p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">alias</span> powershell=<span class="string">"/mnt/c/WINDOWS/System32/WindowsPowerShell/v1.0/powershell.exe"</span></span><br><span class="line">powershell -Command <span class="string">"&amp; {Add-Type -AssemblyName System.Windows.Forms; [System.Windows.Forms.MessageBox]::Show('<span class="variable">$1</span>', 'WSL 通知')}"</span></span><br></pre></td></tr></tbody></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;style&gt;
.spoiler {
  background-color: black;
  color: black;
  padding: 0 2px;
  border-radius: 2px;
}
.spoiler::selection {
  background-c</summary>
      
    
    
    
    <category term="技术笔记" scheme="https://www.foolishfox.cn/categories/%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0/"/>
    
    <category term="工具" scheme="https://www.foolishfox.cn/categories/%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0/%E5%B7%A5%E5%85%B7/"/>
    
    
    <category term="教程" scheme="https://www.foolishfox.cn/tags/%E6%95%99%E7%A8%8B/"/>
    
    <category term="WSL" scheme="https://www.foolishfox.cn/tags/WSL/"/>
    
  </entry>
  
  <entry>
    <title>升级 Umami | 从 Mariadb 迁移至 Postgresql</title>
    <link href="https://www.foolishfox.cn/posts/202511-umami-migration.html"/>
    <id>https://www.foolishfox.cn/posts/202511-umami-migration.html</id>
    <published>2025-11-13T14:58:27.000Z</published>
    <updated>2025-11-13T14:58:27.000Z</updated>
    
    <content type="html"><![CDATA[<div class="note info flat"><ul><li>感谢 Gemini Pro 生成的封面图。</li><li>实时统计页面的更新请见<a href="/posts/202209-umami.html#V3-%E7%89%88%E6%9C%AC%E6%9B%B4%E6%96%B0">V3 版本更新</a>以及 <a href="https://git.foolishfox.cn/fox/umami-stats-scripts">FoxHub fox/umami-stats-scripts</a></li></ul></div><p>Umami 最近升级大版本，从 v3 开始彻底抛弃了 MySQL / Mariadb，转而使用 Postgresql 作为默认数据库。之前有几个别的服务也推荐使用 Postgresql，一直在纠结要不要切过去，但是每次都被庞大的工作量劝阻了（而且还要学很多东西）。现在只能决定折腾一下数据库的迁移了。</p><div class="note danger flat"><p><strong>注意</strong>：在进行数据库迁移之前，请务必备份数据，以防止意外数据丢失。</p></div><div class="note info flat"><p>以下操作过程均以通过<code>docker compose</code>部署的 Umami 为例，其他部署方式请根据实际情况调整命令，可以参考<a href="https://umami.is/docs/guides/migrate-mysql-postgresql">官方文档</a>。</p></div><ol><li><strong>备份现有数据</strong>：在进行任何迁移操作之前，确保已经备份了当前的 Mariadb 数据库数据：</li></ol><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">mariadb --no-create-info --default-character-set=utf8mb4 --quick --skip-add-locks -u username -p mydb &gt; mydbdump.sql</span><br></pre></td></tr></tbody></table></figure><ol start="2"><li><strong>安装 Postgresql</strong>：通过 docker 安装 Postgresql 数据库：</li></ol><figure class="highlight yml"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">services:</span></span><br><span class="line">    <span class="attr">postgresql:</span></span><br><span class="line">        <span class="attr">container_name:</span> <span class="string">postgresql</span></span><br><span class="line">        <span class="attr">image:</span> <span class="string">postgres:latest</span></span><br><span class="line">        <span class="attr">restart:</span> <span class="string">always</span></span><br><span class="line">        <span class="attr">volumes:</span></span><br><span class="line">            <span class="bullet">-</span> <span class="string">./data:/var/lib/postgresql</span></span><br><span class="line">            <span class="bullet">-</span> <span class="string">./conf:/etc/postgresql/conf.d</span></span><br><span class="line">        <span class="attr">environment:</span></span><br><span class="line">            <span class="attr">TZ:</span> <span class="string">Asia/Shanghai</span></span><br><span class="line">            <span class="attr">POSTGRES_USER:</span> <span class="string">root</span></span><br><span class="line">            <span class="attr">POSTGRES_PASSWORD:</span> <span class="string">password</span></span><br><span class="line"><span class="string">...</span></span><br></pre></td></tr></tbody></table></figure><ol start="3"><li><strong>创建 Umami 数据库</strong>：进入 Postgresql 容器，创建 Umami 所需的数据库和用户：</li></ol><figure class="highlight sql"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">docker <span class="keyword">exec</span> <span class="operator">-</span>it postgresql psql <span class="operator">-</span>U root</span><br><span class="line"><span class="keyword">CREATE</span> <span class="keyword">USER</span> umami <span class="keyword">WITH</span> PASSWORD <span class="string">'password'</span>;</span><br><span class="line"><span class="keyword">CREATE</span> DATABASE umami OWNER umami;</span><br></pre></td></tr></tbody></table></figure><ol start="4"><li><strong>准备一个新的 Umami 实例</strong>：使用 Postgresql 作为数据库，启动一个新的 Umami 实例（版本和之前使用 MySQL 或者 Mariadb 的版本一致）：</li></ol><figure class="highlight yml"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">services:</span></span><br><span class="line">    <span class="attr">umami-postgres:</span></span><br><span class="line">        <span class="attr">container_name:</span> <span class="string">umami</span></span><br><span class="line">        <span class="attr">image:</span> <span class="string">docker.umami.is/umami-software/umami:postgresql-v2.19.0</span>  <span class="comment"># 这里切换成自己之前使用的版本号</span></span><br><span class="line">        <span class="attr">restart:</span> <span class="string">always</span></span><br><span class="line">        <span class="attr">environment:</span></span><br><span class="line">            <span class="attr">DATABASE_URL:</span> <span class="string">postgresql://umami:password@postgresql:5432/umami</span></span><br><span class="line">            <span class="attr">DATABASE_TYPE:</span> <span class="string">postgresql</span></span><br><span class="line">            <span class="attr">APP_SECRET:</span> <span class="string">7MbJDvq9P7Ercw</span></span><br><span class="line">            <span class="attr">TRACKER_SCRIPT_NAME:</span> <span class="string">Bf5ZmaKLu245LG</span></span><br><span class="line">            <span class="attr">TZ:</span> <span class="string">Asia/Shanghai</span></span><br><span class="line"><span class="string">...</span></span><br></pre></td></tr></tbody></table></figure><ol start="5"><li><strong>截断 Postgresql 中的表</strong>：进入新的 Umami 容器，截断 Postgresql 数据库中的部分表：</li></ol><figure class="highlight sql"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">docker <span class="keyword">exec</span> <span class="operator">-</span>it postgresql psql <span class="operator">-</span>U umami <span class="operator">-</span>d umami</span><br><span class="line"><span class="keyword">truncate</span> <span class="keyword">table</span> "_prisma_migrations";</span><br><span class="line"><span class="keyword">truncate</span> <span class="keyword">table</span> "user";</span><br></pre></td></tr></tbody></table></figure><div class="note info flat"><p>本文使用<a href="https://pgloader.io/">pgloader</a> 工具进行数据迁移，确保已经安装了该工具。Debian / Ubuntu 用户可以使用<code>apt</code>命令安装。<br>除此之外，也可使用 Navicat Premium 等图形化工具进行数据迁移，参考 <a href="https://roy.wang/docker-umami-to-pgsql/">Docker 部署 Umami，切换数据库至 PgSQL</a>。</p></div><ol start="6"><li><strong>创建导入文件</strong>：创建<code>pgloader</code>的配置文件<code>umami.load</code>，内容如下：</li></ol><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">LOAD DATABASE</span><br><span class="line">     FROM mysql://umami:password@172.19.0.2:3306/umami</span><br><span class="line">     INTO pgsql://umami:password@172.19.0.22:5432/umami</span><br><span class="line"></span><br><span class="line"> WITH data only,</span><br><span class="line">      create tables,</span><br><span class="line">      include no drop</span><br><span class="line"></span><br><span class="line">ALTER SCHEMA 'umami' RENAME TO 'public';</span><br></pre></td></tr></tbody></table></figure><div class="note warning flat"><p>在 MariaDB / MySQL 数据库中，<code>website_event</code>表的<code>visit_id</code>字段可以为<code>NULL</code>，而在 Postgresql 中该字段不允许为<code>NULL</code>。所以在执行数据迁移时可能报错。为了解决这个问题，可以在迁移前将<code>visit_id</code>字段中的<code>NULL</code>值更新为一个默认值：</p><figure class="highlight sql"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">UPDATE</span> website_event <span class="keyword">SET</span> visit_id <span class="operator">=</span> UUID() <span class="keyword">WHERE</span> visit_id <span class="keyword">IS</span> <span class="keyword">NULL</span>;</span><br></pre></td></tr></tbody></table></figure><p>但这可能会导致不可知的数据关联问题，请根据实际情况谨慎操作，也可以选择抛弃这部分数据：</p><figure class="highlight sql"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">DELETE</span> <span class="keyword">FROM</span> website_event <span class="keyword">WHERE</span> visit_id <span class="keyword">IS</span> <span class="keyword">NULL</span>;</span><br></pre></td></tr></tbody></table></figure></div><ol start="7"><li><strong>执行数据迁移</strong>：运行<code>pgloader</code>命令，开始迁移数据：</li></ol><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pgloader umami.load</span><br></pre></td></tr></tbody></table></figure><ol start="8"><li><strong>验证数据完整性</strong>：迁移完成后，检查 Postgresql 数据库中的数据是否完整，确保所有数据都已成功迁移。例如，可以使用以下命令检查表中的记录数：</li></ol><figure class="highlight sql"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">docker <span class="keyword">exec</span> <span class="operator">-</span>it postgresql psql <span class="operator">-</span>U umami <span class="operator">-</span>d umami</span><br><span class="line"><span class="keyword">SELECT</span> <span class="built_in">COUNT</span>(<span class="operator">*</span>) <span class="keyword">FROM</span> website_event;</span><br></pre></td></tr></tbody></table></figure><ol start="9"><li><strong>Umami 服务迁移</strong>：停止旧的 Umami 服务，启动新的 Umami 服务，确保其连接到 Postgresql 数据库：</li></ol><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">docker compose down umami-mariadb</span><br><span class="line">docker compose up -d umami-postgres</span><br></pre></td></tr></tbody></table></figure><ol start="10"><li><strong>升级 Umami 版本</strong>：如果需要升级 Umami 版本，可以在新的 Postgresql 实例上进行升级操作，确保数据和配置保持一致。</li></ol>]]></content>
    
    
      
      
    <summary type="html">&lt;div class=&quot;note info flat&quot;&gt;&lt;ul&gt;
&lt;li&gt;感谢 Gemini Pro 生成的封面图。&lt;/li&gt;
&lt;li&gt;实时统计页面的更新请见&lt;a href=&quot;/posts/202209-umami.html#V3-%E7%89%88%E6%9C%AC%E6%9B</summary>
      
    
    
    
    <category term="技术笔记" scheme="https://www.foolishfox.cn/categories/%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0/"/>
    
    <category term="博客成长日志" scheme="https://www.foolishfox.cn/categories/%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0/%E5%8D%9A%E5%AE%A2%E6%88%90%E9%95%BF%E6%97%A5%E5%BF%97/"/>
    
    
    <category term="Umami" scheme="https://www.foolishfox.cn/tags/Umami/"/>
    
    <category term="数据库迁移" scheme="https://www.foolishfox.cn/tags/%E6%95%B0%E6%8D%AE%E5%BA%93%E8%BF%81%E7%A7%BB/"/>
    
    <category term="Postgresql" scheme="https://www.foolishfox.cn/tags/Postgresql/"/>
    
    <category term="Mariadb" scheme="https://www.foolishfox.cn/tags/Mariadb/"/>
    
  </entry>
  
  <entry>
    <title>Geant4 综合模板</title>
    <link href="https://www.foolishfox.cn/posts/202502-g4template.html"/>
    <id>https://www.foolishfox.cn/posts/202502-g4template.html</id>
    <published>2025-02-21T03:32:09.000Z</published>
    <updated>2025-02-21T03:32:09.000Z</updated>
    
    <content type="html"><![CDATA[<p>几年前在 <a href="https://www.foolishfox.cn/posts/202204-g4b.html">Geant4 示例</a> 中我介绍了 Windows 下 Geant4 的安装与示例。今天分享一个 Geant4 综合模板，帮助快速开始一个项目，实现了以下功能：</p><ul><li>构建模块化的 TAS 探测器</li><li>统计模拟过程中的核反应信息，包括类型、反应道、产物能量分布、伽马射线母核统计等 (<a href="#1">1</a>, <a href="#2">2</a>)</li><li>利用 Sensitive Detector 统计粒子在探测器中的沉积能量 (<a href="#3">3</a>)</li><li>通过 Analysis Manager 保存数据到 ROOT 文件 (<a href="#4">4</a>, <a href="#5">5</a>)</li></ul><p>模板的核心功能时序图如下：</p><pre class="mermaid">sequenceDiagramautonumberpar    RunManager-&gt;&gt;RunStat: Initializationand    RunManager-&gt;&gt;AnalysisManager: InitializationendRunManager-&gt;&gt;+Run: Begin runrect rgb(200, 150, 255)Run-&gt;&gt;SD: Initializationendloop Number of particles    Run-&gt;&gt;+Event: Primary Generator    Event-&gt;&gt;+Step: Particle Transport    loop Particle alive        rect rgb(191, 223, 255)        alt Have secondary particles            Step--&gt;&gt;RunStat: Reaction information        else In SD            Step--&gt;&gt;SD: Step information        end        end        Step-&gt;&gt;Step: Particle Transport    end    Step-&gt;&gt;-Event: E = 0 or been absorbed    rect rgb(200, 150, 255)    SD--&gt;&gt;AnalysisManager: SD statistics    end    Event-&gt;&gt;-Run: End eventendAnalysisManager--&gt;&gt;Output: Data file (root format or others)Run-&gt;&gt;-RunManager: End runRunStat--&gt;&gt;Output: Reaction statistics</pre><style>.mermaid {    background: var(--heo-background) !important;}</style><script type="module">    import mermaid from 'https://cdn.jsdelivr.net/npm/mermaid@11/dist/mermaid.esm.min.mjs';</script><h2 id="主要功能">主要功能 <a class="header-anchor" href="#主要功能">¶</a></h2><h3 id="SD，Hits与Analysis-Manager">SD，Hits 与 Analysis Manager<a class="header-anchor" href="#SD，Hits与Analysis-Manager">¶</a></h3><p>Sensitive detector 和 Hits 是 Geant4 中的重要工具，用于统计粒子径迹在我们感兴趣的区域沉积的能量。在模板中，我们定义了一个 Sensitive detector: <code>TemplateSD</code>，用于划定感兴趣的区域；以及一个 Hits 类: <code>TemplateHit</code>，用于记录所需要的信息（例如沉积能量、粒子类别、名称等）。</p><p>由于不同人员的需求以及工具喜好不同，Geant4 并没有提供一个完备的数据分析工具，但是通过<code>G4AnalysisManager</code>实现了对于数据的管理。数据可以分为两类：<code>n-tuple</code>和<code>histogram</code>，前者类似于表格，行是每一个事件，列是各种物理信息；后者是对于某一物理量的统计，例如能量分布、角度分布等。<code>G4AnalysisManager</code>类是<strong>线程安全</strong>的，并且可以自动合并多线程的数据。(<a href="#5">5</a>)</p><p><code>TemplateSD::ProcessHits</code>函数将<code>TemplateHit</code>的信息收集到<code>TemplateHitsCollection</code>中，随后在<code>EventAction::EndOfEventAction</code>函数中读出，并且通过<code>analysisManager</code>（<code>G4AnalysisManager</code>类的实例）保存，最后在<code>RunAction::EndOfRunAction</code>中输出到 ROOT 文件中。</p><h3 id="核反应统计">核反应统计 <a class="header-anchor" href="#核反应统计">¶</a></h3><p>统计的过程完全发生在<code>SteppingAction::UserSteppingAction</code>方法中，并定义了<code>RunStat</code>类进行协助。<code>RunStat</code>类的主要功能是记录核反应的信息（例如反应类型、反应道与 Q 值）以及核反应产物的信息（例如产物能量、数量，以及伽马射线的母核统计），这些信息在<code>RunStat::print</code>中输出到日志文件中，同时也保存在<code>analysisManager</code>中。</p><h2 id="示例">示例 <a class="header-anchor" href="#示例">¶</a></h2><h3 id="探测器构建">探测器构建 <a class="header-anchor" href="#探测器构建">¶</a></h3><ul><li> 靶<ul><li><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi mathvariant="normal">Φ</mi></mrow><annotation encoding="application/x-tex">\Phi</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord">Φ</span></span></span></span> 15 mm</li><li>样品: 100% <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mrow></mrow><mn>98</mn></msup><mrow><mi mathvariant="normal">M</mi><mi mathvariant="normal">o</mi></mrow></mrow><annotation encoding="application/x-tex">^{98}\mathrm{Mo}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8141079999999999em;vertical-align:0em;"></span><span class="mord"><span></span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141079999999999em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">9</span><span class="mord mtight">8</span></span></span></span></span></span></span></span></span><span class="mord"><span class="mord mathrm">M</span><span class="mord mathrm">o</span></span></span></span></span>, 1.5 um 绿色 (红色)</li><li>衬底: Al, 5 um 绿色 (蓝色)</li></ul></li><li>探测器<ul><li>Si: 10 mm <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>×</mo></mrow><annotation encoding="application/x-tex">\times</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.66666em;vertical-align:-0.08333em;"></span><span class="mord">×</span></span></span></span> 10 mm <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>×</mo></mrow><annotation encoding="application/x-tex">\times</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.66666em;vertical-align:-0.08333em;"></span><span class="mord">×</span></span></span></span> 3 mm (白色)</li><li>BGO: 100 mm <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>×</mo></mrow><annotation encoding="application/x-tex">\times</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.66666em;vertical-align:-0.08333em;"></span><span class="mord">×</span></span></span></span> 100 mm <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>×</mo></mrow><annotation encoding="application/x-tex">\times</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.66666em;vertical-align:-0.08333em;"></span><span class="mord">×</span></span></span></span> 200 mm, 六边形<ul><li>中心: 束流孔 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi mathvariant="normal">Φ</mi></mrow><annotation encoding="application/x-tex">\Phi</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord">Φ</span></span></span></span> 40 mm (黄色，1 个)</li><li>外层 (灰色，总计 6 个)</li></ul></li></ul></li><li>屏蔽<ul><li>PEEK: <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi mathvariant="normal">Φ</mi></mrow><annotation encoding="application/x-tex">\Phi</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord">Φ</span></span></span></span> 20 ~ 35 mm, 200 mm 长 (青色)</li><li>Pb: 50 mm 厚 (绿色)</li></ul></li></ul><div class="img-wrap"><div class="img-bg"><img class="lazyload lazyload-gif zooming" src="https://asset.foolishfox.cn/2025/02/21/67b841b177649.png" alt="探测器侧视图" style="height:300px;"></div><span class="image-caption">探测器侧视图</span></div><h3 id="核反应统计-v2">核反应统计 <a class="header-anchor" href="#核反应统计-v2">¶</a></h3><p>入射粒子为 13 MeV 的质子，反应主要以库伦散射为主，质子非弹主要以 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mrow></mrow><mn>98</mn></msup><mrow><mi mathvariant="normal">M</mi><mi mathvariant="normal">o</mi></mrow></mrow><annotation encoding="application/x-tex">^{98}\mathrm{Mo}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8141079999999999em;vertical-align:0em;"></span><span class="mord"><span></span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141079999999999em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">9</span><span class="mord mtight">8</span></span></span></span></span></span></span></span></span><span class="mord"><span class="mord mathrm">M</span><span class="mord mathrm">o</span></span></span></span></span> 的 (n,p) 反应为主，产物为 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mrow></mrow><mn>98</mn></msup><mrow><mi mathvariant="normal">T</mi><mi mathvariant="normal">c</mi></mrow></mrow><annotation encoding="application/x-tex">^{98}\mathrm{Tc}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8141079999999999em;vertical-align:0em;"></span><span class="mord"><span></span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141079999999999em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">9</span><span class="mord mtight">8</span></span></span></span></span></span></span></span></span><span class="mord"><span class="mord mathrm">T</span><span class="mord mathrm">c</span></span></span></span></span></p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line">&gt;&gt;&gt; Process calls frequency:</span><br><span class="line">         CoulombScat =     103207</span><br><span class="line">     Radioactivation =       2522</span><br><span class="line">        ...</span><br><span class="line"></span><br><span class="line">&gt;&gt;&gt; List of nuclear reactions: </span><br><span class="line">                         As75[264.658] --&gt; N gamma or e- + As75 / Radioactivation:       1   Q =      264.658 keV</span><br><span class="line">                         ...</span><br><span class="line">                                                   gamma --&gt; N gamma or e- / phot:  121754   Q =     -249.463 eV </span><br><span class="line">                                          gamma --&gt; gamma + N gamma or e- / compt:   46219   Q =            0 eV </span><br><span class="line">                                          ...</span><br><span class="line">               proton + Mo98 --&gt; N gamma or e- + neutron + Tc98 / protonInelastic:    5106   Q =     -3.47829 MeV</span><br><span class="line">               ...</span><br><span class="line"></span><br><span class="line">&gt;&gt;&gt; List of generated particles:</span><br><span class="line">               As75 :        18  Emean =      9.91766 eV (  501.954 meV --&gt;  15.9164 eV )</span><br><span class="line">               ...</span><br><span class="line"></span><br><span class="line">&gt;&gt;&gt; List of gamma parents:</span><br><span class="line">     0 :            Tc98 up</span><br><span class="line">     ...</span><br></pre></td></tr></tbody></table></figure><h3 id="伽马能谱与母核">伽马能谱与母核 <a class="header-anchor" href="#伽马能谱与母核">¶</a></h3><div class="img-wrap"><div class="img-bg"><img class="lazyload lazyload-gif zooming" src="https://asset.foolishfox.cn/2025/02/21/67b8434e12ba3.png" alt="Mo-98的伽马能谱（产物为Mo-98基态）" style="height:300px;"></div><span class="image-caption">Mo-98 的伽马能谱（产物为 Mo-98 基态）</span></div><div class="img-wrap"><div class="img-bg"><img class="lazyload lazyload-gif zooming" src="https://asset.foolishfox.cn/2025/02/21/67b8434e57835.png" alt="单块BGO伽马总能谱" style="height:300px;"></div><span class="image-caption">单块 BGO 伽马总能谱</span></div><div class="img-wrap"><div class="img-bg"><img class="lazyload lazyload-gif zooming" src="https://asset.foolishfox.cn/2025/02/21/67b8434edd9a6.png" alt="1.607~1.610 MeV伽马射线母核统计" style="height:300px;"></div><span class="image-caption">1.607~1.610 MeV 伽马射线母核统计</span></div><h2 id="参考资料">参考资料 <a class="header-anchor" href="#参考资料">¶</a></h2><ol><li><span id="refer-1"><a href="https://geant4-userdoc.web.cern.ch/Doxygen/examples_doc/html/ExampleHadr03.html">Example Hadr03</a></span></li><li><span id="refer-2"><a href="https://geant4-forum.web.cern.ch/t/differences-with-physics-list-choice-in-hadr03-example/11492">Differences with physics list choice in Hadr03 example</a></span></li><li><span id="refer-3"><a href="https://geant4-userdoc.web.cern.ch/Doxygen/examples_doc/html/ExampleB2.html">Example B2</a></span></li><li><span id="refer-4"><a href="https://geant4-userdoc.web.cern.ch/Doxygen/examples_doc/html/ExampleB4.html">Example B4</a></span></li><li><span id="refer-5"><a href="https://indico.cern.ch/event/776050/contributions/3241822/attachments/1789267/2921102/Analysis-v3.pdf">ANALYSIS</a></span></li></ol>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;几年前在 &lt;a href=&quot;https://www.foolishfox.cn/posts/202204-g4b.html&quot;&gt;Geant4 示例&lt;/a&gt; 中我介绍了 Windows 下 Geant4 的安装与示例。今天分享一个 Geant4 综合模板，帮助快速开始一个项目，</summary>
      
    
    
    
    <category term="核物理" scheme="https://www.foolishfox.cn/categories/%E6%A0%B8%E7%89%A9%E7%90%86/"/>
    
    <category term="Geant4" scheme="https://www.foolishfox.cn/categories/%E6%A0%B8%E7%89%A9%E7%90%86/Geant4/"/>
    
    
    <category term="核技术" scheme="https://www.foolishfox.cn/tags/%E6%A0%B8%E6%8A%80%E6%9C%AF/"/>
    
    <category term="Geant4" scheme="https://www.foolishfox.cn/tags/Geant4/"/>
    
    <category term="C/C++" scheme="https://www.foolishfox.cn/tags/C-C/"/>
    
  </entry>
  
  <entry>
    <title>阻止 Bing / Google 收录自建 Gitea 链接</title>
    <link href="https://www.foolishfox.cn/posts/202501-bing-gitea.html"/>
    <id>https://www.foolishfox.cn/posts/202501-bing-gitea.html</id>
    <published>2025-01-13T09:30:29.000Z</published>
    <updated>2025-01-13T09:30:29.000Z</updated>
    
    <content type="html"><![CDATA[<style>.imgdiv a {    width: 45%;}</style><p>最近去检查 Bing 和 Google 的网站收录情况，发现收录了一大堆自建的 Gitea 和 Memos 链接，这些链接不太希望直接发布在收索引擎中，而且变换比较快，参考意义不大，所以想阻止被收录。</p><div style="margin: 0 auto; display: flex; justify-content: space-around;" class="imgdiv"><img src="https://asset.foolishfox.cn/2025/01/15/67871e554f9bb.png"><img src="https://asset.foolishfox.cn/2025/01/15/67871e55bb515.png"></div><h2 id="临时删除">临时删除 <a class="header-anchor" href="#临时删除">¶</a></h2><p>如果只需要临时删除这些索引，Google 和 Bing 都提供了入口，不过需要每一定时间手动延期。</p><div style="margin: 0 auto; display: flex; justify-content: space-around;" class="imgdiv"><img src="https://asset.foolishfox.cn/2025/01/15/678722b971b6b.png" alt="Google 管理界面删除索引入口"><img src="https://asset.foolishfox.cn/2025/01/15/678722b9cc279.png" alt="Google 推荐选项"></div><div style="margin: 0 auto; display: flex; justify-content: space-around;" class="imgdiv"><img src="https://asset.foolishfox.cn/2025/01/15/6787231a133f0.png" alt="Bing 管理界面阻止索引入口"><img src="https://asset.foolishfox.cn/2025/01/15/6787231a415e8.png" alt="Bing 推荐选项"></div><h2 id="永久阻止">永久阻止 <a class="header-anchor" href="#永久阻止">¶</a></h2><p>对于使用 docker 部署的 Gitea，按照<a href="https://docs.gitea.com/installation/install-with-docker">官网的安装教程</a>挂载了卷，例如：</p><figure class="highlight yaml"><figcaption><span>docker-compose.yml</span></figcaption><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="string">...</span></span><br><span class="line"><span class="attr">services:</span></span><br><span class="line">  <span class="attr">server:</span></span><br><span class="line">    <span class="attr">image:</span> <span class="string">docker.io/gitea/gitea:1.23.1</span></span><br><span class="line">    <span class="string">...</span></span><br><span class="line">    <span class="attr">volumes:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">./gitea:/data</span></span><br><span class="line">    <span class="string">...</span></span><br></pre></td></tr></tbody></table></figure><p>容器中的<code>/data/gitea</code>目录与宿主机的<code>./gitea/gitea</code>目录对应，这个目录是用于存放自定义文件的，创建目录<code>templates/custom</code>，在该目录下创建<code>header.tmpl</code>文件，并写入：</p><figure class="highlight html"><figcaption><span>header.tmpl</span></figcaption><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">meta</span> <span class="attr">name</span>=<span class="string">"robots"</span> <span class="attr">content</span>=<span class="string">"noindex"</span>&gt;</span></span><br></pre></td></tr></tbody></table></figure><p>重启 Gitea 查看效果即可：</p><div class="img-wrap"><div class="img-bg"><img class="lazyload lazyload-gif zooming" src="https://asset.foolishfox.cn/2025/01/15/678721976e722.png" alt="image" style="height:200px;"></div></div><h2 id="搜索过程">搜索过程 <a class="header-anchor" href="#搜索过程">¶</a></h2><p>在 Google 和 Bing 的官方文档中都提到了不要使用<code>robots.txt</code>作为屏蔽机制，而推荐了三种方法：</p><ol><li>将<code>noindex</code>元标记添加到页面的<code>&lt;head&gt;</code>部分，安全性较低，还可能被收录</li><li>禁止访问（例如需要密码），但操作不现实，除非全部私有化仓库</li><li>移除网站，404 Not Found，更不可行</li></ol><p>所以下一步是查找怎么在 Gitea 中找到页面<code>&lt;head&gt;</code>部分并且修改。右键查看自建 Gitea 网页的源代码，找到已有的元标记，然后在 <a href="https://github.com/go-gitea/gitea">Gitea 的官方 Github 仓库</a>中搜索，找到包含这部分的文件，即<code>templates/base/head.tmpl</code>。</p><div style="margin: 0 auto; display: flex; justify-content: space-around;" class="imgdiv"><img src="https://asset.foolishfox.cn/2025/01/15/6787249defcb0.png" alt="Gitea 页面源代码"><img src="https://asset.foolishfox.cn/2025/01/15/678724e4dcc19.png" alt="Github 仓库搜索结果"></div><p>在代码中包含了这样一段：</p><figure class="highlight html"><figcaption><span>templates/base/head.tmpl</span></figcaption><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;!DOCTYPE <span class="keyword">html</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">html</span> <span class="attr">lang</span>=<span class="string">"{{ctx.Locale.Lang}}"</span> <span class="attr">data-theme</span>=<span class="string">"{{UserThemeName .SignedUser}}"</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">head</span>&gt;</span></span><br><span class="line">    ...</span><br><span class="line">    {{template "base/head_opengraph" .}}</span><br><span class="line">    {{template "base/head_style" .}}</span><br><span class="line">    {{template "custom/header" .}}</span><br><span class="line"><span class="tag">&lt;/<span class="name">head</span>&gt;</span></span><br></pre></td></tr></tbody></table></figure><p>结合 Gitea 自定义模板的内容，在自定义目录下创建<code>templates/custom</code>，并在其中创建<code>header.tmpl</code>文件，写入：</p><figure class="highlight html"><figcaption><span>header.tmpl</span></figcaption><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">meta</span> <span class="attr">name</span>=<span class="string">"robots"</span> <span class="attr">content</span>=<span class="string">"noindex"</span>&gt;</span></span><br></pre></td></tr></tbody></table></figure><p>即可实现效果。</p><h2 id="参考资料">参考资料 <a class="header-anchor" href="#参考资料">¶</a></h2><ol><li><a href="https://docs.gitea.com/installation/install-with-docker">Installation with Docker</a></li><li><a href="https://support.google.com/webmasters/answer/9689846#block_content">“移除” 工具和 “安全搜索” 举报工具</a></li><li><a href="https://www.bing.com/webmasters/help/block-urls-from-bing-264e560a">Block URLs from Bing</a></li><li><a href="https://github.com/go-gitea/gitea/blob/main/templates/base/head.tmpl">templates/base/head.tmpl</a></li></ol>]]></content>
    
    
      
      
    <summary type="html">&lt;style&gt;
.imgdiv a {
    width: 45%;
}
&lt;/style&gt;
&lt;p&gt;最近去检查 Bing 和 Google 的网站收录情况，发现收录了一大堆自建的 Gitea 和 Memos 链接，这些链接不太希望直接发布在收索引擎中，而且变换比较快，参考意义不大</summary>
      
    
    
    
    <category term="技术笔记" scheme="https://www.foolishfox.cn/categories/%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0/"/>
    
    <category term="工具" scheme="https://www.foolishfox.cn/categories/%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0/%E5%B7%A5%E5%85%B7/"/>
    
    
    <category term="网站收录" scheme="https://www.foolishfox.cn/tags/%E7%BD%91%E7%AB%99%E6%94%B6%E5%BD%95/"/>
    
    <category term="bing" scheme="https://www.foolishfox.cn/tags/bing/"/>
    
    <category term="google" scheme="https://www.foolishfox.cn/tags/google/"/>
    
    <category term="gitea" scheme="https://www.foolishfox.cn/tags/gitea/"/>
    
  </entry>
  
  <entry>
    <title>在 zsh 中自动补全命令参数</title>
    <link href="https://www.foolishfox.cn/posts/202501-zsh-comp.html"/>
    <id>https://www.foolishfox.cn/posts/202501-zsh-comp.html</id>
    <published>2025-01-06T06:48:41.000Z</published>
    <updated>2025-01-06T06:48:41.000Z</updated>
    
    <content type="html"><![CDATA[<p><a href="https://github.com/skywind3000/z.lua">z.lua</a> 是一个很好的工具，可以快速地进入想要的目录。我在本机 WSL 和多个服务器上都安装了这个程序，但是在执行一些命令（例如<code>z -c</code>，在当前目录下的子目录中选择）的时候，自动补全有时候可以用，有时候不能用，很不方便。所以我决定自己写一个 <code>zsh</code> 的自动补全脚本。</p><h2 id="实现">实现 <a class="header-anchor" href="#实现">¶</a></h2><p>首先，通过<code>which z</code>命令拿到实际的命令执行函数：</p><div class="img-wrap"><div class="img-bg"><img class="lazyload lazyload-gif zooming" src="https://asset.foolishfox.cn/2025/01/06/677ba7f259a48.png" alt="image" style="height:100px;"></div></div><p>在 <code>z.lua</code> 脚本中给出了如何对 <code>z</code> 命令进行补全的方法：</p><figure class="highlight zsh"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="title">_zlua_zsh_tab_completion</span></span>() {</span><br><span class="line"><span class="comment"># tab completion</span></span><br><span class="line">(( $+compstate )) &amp;&amp; compstate[insert]=menu <span class="comment"># no expand</span></span><br><span class="line"><span class="built_in">local</span> -a tmp=(<span class="variable">${(f)"$(_zlua --complete "<span class="variable">${words/_zlua/z}</span>")"}</span>)</span><br><span class="line">_describe <span class="string">"directory"</span> tmp -U</span><br><span class="line">}</span><br><span class="line"><span class="keyword">if</span> [ <span class="string">"<span class="variable">${+functions[compdef]}</span>"</span> -ne 0 ]; <span class="keyword">then</span></span><br><span class="line">compdef _zlua_zsh_tab_completion _zlua 2&gt; /dev/null</span><br><span class="line">compdef <span class="variable">${_ZL_CMD:-z}</span>=_zlua</span><br><span class="line"><span class="keyword">fi</span></span><br></pre></td></tr></tbody></table></figure><p>其中：</p><ul><li><code>_zlua_zsh_tab_completion</code> 是自动补全函数；</li><li><code>${(f)"$(_zlua --complete "${words/_zlua/z}")"}</code> 是获取补全的内容，并且按照每行分割转化为数组；</li><li><code>_describe</code> 是定义补全的内容，第一个参数是描述，第二个参数是补全的内容；</li><li><code>compdef</code> 是定义自动补全函数，第一个参数是自动补全函数，第二个参数是实际的命令执行函数。</li></ul><p>参照上面的内容写了一个自动补全脚本：</p><figure class="highlight zsh"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="title">_z_comp</span></span>() {</span><br><span class="line">    <span class="built_in">local</span> -a list=(<span class="variable">${(f)"$(_zlua --complete "<span class="variable">${words/_zlua/z}</span>")"}</span>)</span><br><span class="line">    _describe <span class="string">"directory"</span> list -U</span><br><span class="line">}</span><br><span class="line"><span class="function"><span class="title">_zc_comp</span></span>() {</span><br><span class="line">    <span class="built_in">local</span> -a list=(<span class="string">"<span class="variable">${(@f)$(fdfind -t d -d 1 .)}</span>"</span>)</span><br><span class="line">    <span class="keyword">for</span> ((i=<span class="number">1</span>;i&lt;=<span class="variable">$#list</span>;i++)){</span><br><span class="line">        list[i]=<span class="variable">${list[i]/\//}</span></span><br><span class="line">    }</span><br><span class="line">    _describe <span class="string">"subdirectory"</span> list -U</span><br><span class="line">}</span><br><span class="line"><span class="function"><span class="title">_zlua_comp</span></span>() {</span><br><span class="line">    _arguments -C -S -s \</span><br><span class="line">        <span class="string">'*:enter directory order by frecent:_z_comp'</span>  \</span><br><span class="line">        <span class="string">'-c:enter subdirectory:_zc_comp'</span></span><br><span class="line">}</span><br><span class="line">compdef _zlua_comp _zlua &gt; /dev/null 2&gt;&amp;1</span><br><span class="line">compdef <span class="variable">${_ZL_CMD:-z}</span>=_zlua</span><br></pre></td></tr></tbody></table></figure><p>首先定义了两个补全函数 <code>_z_comp</code> 和 <code>_zc_comp</code>，分别对应 <code>z</code> 和 <code>z -c</code> 命令的补全内容。然后定义了一个 <code>_zlua_comp</code> 函数，通过 <code>_arguments</code> 定义了命令的参数和补全内容。最后通过 <code>compdef</code> 定义了自动补全函数。需要注意的是，<code>_zc_comp</code> 函数中得到的子目录是带有<code>/</code>的，所以需要去掉<code>/</code>，否则可能会进入到所选择子目录下的深度更深的目录：</p><div class="img-wrap"><div class="img-bg"><img class="lazyload lazyload-gif zooming" src="https://asset.foolishfox.cn/2025/01/07/677bff470f203.png" alt="image" style="height:100px;"></div></div><p>最后在脚本末尾加入：</p><figure class="highlight zsh"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">autoload</span> -Uz compinit &amp;&amp; compinit</span><br></pre></td></tr></tbody></table></figure><p>这样就可以实现自动补全：</p><div class="img-wrap"><div class="img-bg"><img class="lazyload lazyload-gif zooming" src="https://asset.foolishfox.cn/2025/01/07/677c022581eb5.gif" alt="image" style="height:150px;"></div></div><h2 id="FZF">FZF<a class="header-anchor" href="#FZF">¶</a></h2><p>如果想要使用 <code>fzf</code>，同样可以参考 <code>z.lua</code> 中的 <code>script_fzf_complete_zsh</code> 脚本，一个示例如下：</p><figure class="highlight zsh"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">bindkey</span> <span class="string">'\e[0n'</span> kill-whole-line</span><br><span class="line"><span class="function"><span class="title">_z_comp</span></span>() {</span><br><span class="line">    <span class="built_in">local</span> list=$(_zlua -l <span class="variable">${words[2,-1]}</span>)</span><br><span class="line">    <span class="keyword">if</span> [ -n <span class="string">"<span class="variable">$list</span>"</span> ]; <span class="keyword">then</span></span><br><span class="line">        <span class="built_in">local</span> selected=$(<span class="built_in">print</span> <span class="variable">$list</span> | <span class="variable">${=zlua_fzf}</span> | sed <span class="string">'s/^[0-9,.]* *//'</span>)</span><br><span class="line">        <span class="keyword">if</span> [ -n <span class="string">"<span class="variable">$selected</span>"</span> ]; <span class="keyword">then</span></span><br><span class="line">            <span class="built_in">cd</span> <span class="variable">${selected}</span></span><br><span class="line">            <span class="built_in">printf</span> <span class="string">'\e[5n'</span></span><br><span class="line">        <span class="keyword">fi</span></span><br><span class="line">    <span class="keyword">fi</span></span><br><span class="line">}</span><br><span class="line"><span class="function"><span class="title">_zc_comp</span></span>() {</span><br><span class="line">    <span class="built_in">local</span> -a list=(<span class="string">"<span class="variable">${(@f)$(fdfind -t d -d 1 .)}</span>"</span>)</span><br><span class="line">    <span class="keyword">for</span> ((i=<span class="number">1</span>;i&lt;=<span class="variable">$#list</span>;i++)){</span><br><span class="line">        list[i]=<span class="variable">${list[i]/\//}</span></span><br><span class="line">    }</span><br><span class="line">    <span class="keyword">if</span> [ -n <span class="string">"<span class="variable">$list</span>"</span> ]; <span class="keyword">then</span></span><br><span class="line">        <span class="built_in">local</span> selected=$(<span class="built_in">print</span> <span class="variable">$list</span> | awk -F <span class="string">" "</span> <span class="string">'{for(row=1;row&lt;=NF;row++) print $row;}'</span> | <span class="variable">${=zlua_fzf}</span>)</span><br><span class="line">        <span class="keyword">if</span> [ -n <span class="string">"<span class="variable">$selected</span>"</span> ]; <span class="keyword">then</span></span><br><span class="line">            <span class="built_in">cd</span> <span class="variable">${selected}</span></span><br><span class="line">            <span class="built_in">printf</span> <span class="string">'\e[5n'</span></span><br><span class="line">        <span class="keyword">fi</span></span><br><span class="line">    <span class="keyword">fi</span></span><br><span class="line">}</span><br><span class="line"><span class="function"><span class="title">_zlua_comp</span></span>() {</span><br><span class="line">    _arguments -C -S -s \</span><br><span class="line">        <span class="string">'*:enter directory order by frecent:_z_comp'</span>  \</span><br><span class="line">        <span class="string">'-c:enter subdirectory:_zc_comp'</span></span><br><span class="line">}</span><br><span class="line">compdef _zlua_comp _zlua &gt; /dev/null 2&gt;&amp;1</span><br><span class="line">compdef <span class="variable">${_ZL_CMD:-z}</span>=_zlua</span><br></pre></td></tr></tbody></table></figure><h2 id="参考资料">参考资料 <a class="header-anchor" href="#参考资料">¶</a></h2><ol><li><a href="https://zsh.sourceforge.io/Doc/Release/Completion-System.html">Completion System</a></li><li><a href="https://zhuanlan.zhihu.com/p/466684661">给 zsh 自定义命令添加参数自动补全</a></li><li><a href="https://www.cnblogs.com/wang_yb/p/5969451.html">命令行自动补全原理</a></li><li><a href="https://thevaluable.dev/zsh-completion-guide-examples/">A Guide to the Zsh Completion with Examples</a></li></ol>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;&lt;a href=&quot;https://github.com/skywind3000/z.lua&quot;&gt;z.lua&lt;/a&gt; 是一个很好的工具，可以快速地进入想要的目录。我在本机 WSL 和多个服务器上都安装了这个程序，但是在执行一些命令（例如&lt;code&gt;z -c&lt;/code&gt;，在当前</summary>
      
    
    
    
    <category term="技术笔记" scheme="https://www.foolishfox.cn/categories/%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0/"/>
    
    <category term="工具" scheme="https://www.foolishfox.cn/categories/%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0/%E5%B7%A5%E5%85%B7/"/>
    
    
    <category term="zsh" scheme="https://www.foolishfox.cn/tags/zsh/"/>
    
    <category term="shell" scheme="https://www.foolishfox.cn/tags/shell/"/>
    
    <category term="linux" scheme="https://www.foolishfox.cn/tags/linux/"/>
    
  </entry>
  
  <entry>
    <title>又一次服务器迁移</title>
    <link href="https://www.foolishfox.cn/posts/202411-migrate-24.html"/>
    <id>https://www.foolishfox.cn/posts/202411-migrate-24.html</id>
    <published>2024-11-06T13:10:44.000Z</published>
    <updated>2024-11-06T13:10:44.000Z</updated>
    
    <content type="html"><![CDATA[<p>之前本站一直使用的腾讯云轻量应用服务器服务器一次性买了 3 年，这个月月底就要到期了，但是一看续费的价格，十分的美丽。其实服务器的 4 个核心一直负载都不大，但是内存使用经常在 3G 作用，因此综合考虑下决定入手一个 2H4G 的服务器，再通过自定义镜像迁移过去。</p><div class="img-wrap"><div class="img-bg"><img class="lazyload lazyload-gif zooming" src="https://asset.foolishfox.cn/2024/11/06/672b719af0074.png" alt="图1 同配置续费3年的价格" style="height:200px;"></div><span class="image-caption">图 1 同配置续费 3 年的价格</span></div><div class="img-wrap"><div class="img-bg"><img class="lazyload lazyload-gif zooming" src="https://asset.foolishfox.cn/2024/11/06/672b7221cd570.png" alt="图2 双十一活动新购服务器" style="height:200px;"></div><span class="image-caption">图 2 双十一活动新购服务器</span></div><p>但是正当我购置好了服务器，正打算用自定义镜像重装系统的时候，请注意图中两个服务器的硬盘大小，旧的服务器硬盘是 80 GB，虽然我只使用了 40+ GB，但是导出的镜像是完整的 80 GB，而新的服务器硬盘只有 70 GB😒😒😒。</p><p>于是只好手动把所有的内容同步到新的服务器上去了，幸好基本大部分的数据都在 home 目录下，同时万分感谢自己在从阿里云迁移到腾讯云的时候将所有的服务都使用 Docker 进行了容器化，所以一行命令迁移：</p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">scp -r <span class="variable">$HOME</span>/docker user@IP:/home/user</span><br></pre></td></tr></tbody></table></figure><p>然后在新服务器上安装 Docker，启动所有的容器就解决了大部分的工作，仅剩的是一些 Docker 的配置文件，也使用 scp 复制过去就行，两台服务器都在同一个区域，直接使用内网 IP 的传输速度还是挺快的，哪怕有很多的小文件。</p><p>so，that’s all，新的服务器已经<s>（看上去）</s>正常运行。如果算上一次同价续费和拼团赠送的 3 个月有效期，这次又能苟 2 年多，希望不要有什么问题。</p><p>PS：腾讯云最近开放了 IPv6 的测试申请，已经通过了，后面捣鼓一下看看有啥用处。下一期讲一下在 Portainer 里面 TLS 连接远程的 Docker 服务。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;之前本站一直使用的腾讯云轻量应用服务器服务器一次性买了 3 年，这个月月底就要到期了，但是一看续费的价格，十分的美丽。其实服务器的 4 个核心一直负载都不大，但是内存使用经常在 3G 作用，因此综合考虑下决定入手一个 2H4G 的服务器，再通过自定义镜像迁移过去。&lt;/p&gt;
</summary>
      
    
    
    
    <category term="技术笔记" scheme="https://www.foolishfox.cn/categories/%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0/"/>
    
    <category term="博客成长日志" scheme="https://www.foolishfox.cn/categories/%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0/%E5%8D%9A%E5%AE%A2%E6%88%90%E9%95%BF%E6%97%A5%E5%BF%97/"/>
    
    
    <category term="服务器" scheme="https://www.foolishfox.cn/tags/%E6%9C%8D%E5%8A%A1%E5%99%A8/"/>
    
    <category term="Docker" scheme="https://www.foolishfox.cn/tags/Docker/"/>
    
    <category term="腾讯云" scheme="https://www.foolishfox.cn/tags/%E8%85%BE%E8%AE%AF%E4%BA%91/"/>
    
  </entry>
  
  <entry>
    <title>独立博客自省问卷 15 题 - 2024</title>
    <link href="https://www.foolishfox.cn/posts/202410-refle-24.html"/>
    <id>https://www.foolishfox.cn/posts/202410-refle-24.html</id>
    <published>2024-10-17T11:29:40.000Z</published>
    <updated>2024-10-17T11:29:40.000Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>以下问卷纯粹自省自娱，自我调侃，勿对号入座。<br>如有不适，请及时关闭浏览器窗口。<br>如有启发，建议每隔一段时间服用一次。<br>From <a href="https://yayu.net/4626.html">独立博客自省问卷 15 题</a></p></blockquote><ol><li>你的博客更新频率是多少？<br>A. 每周更新<br>B. 一周数篇<br>C. 一月 1-2 篇<br>✅ D. 几个月一篇</li></ol><blockquote><p>一直很想写，但是懒…… 发<a href="https://www.foolishfox.cn/memos/">Memos</a> 更多了。</p></blockquote><ol start="2"><li>你的博客上次更新是什么时候？<br>A. 本周<br>B. 上周<br>C. 上个月<br>✅ D. 上季度</li></ol><blockquote><p>现在手上还有两三个内容等着写，咕咕咕（<s>这不又水了一篇</s></p></blockquote><ol start="3"><li>你的博客文章是原创的吗？<br>✅ A. 坚持原创<br>B. 部分借鉴<br><a href="http://C.AI">C.AI</a> 帮我写的<br>D. 搬运别人的，而且不署名</li></ol><blockquote><p>坚决抵制<s>学术</s>博客不端，内容原创，参考留名</p></blockquote><ol start="4"><li>你觉得自己的文章对他人有帮助吗？<br>A. 旨在对他人有启示<br>✅ B. 多少有点意义<br>C. 每日每周流水账<br>✅ D. 自我陶醉就好，管他呢</li></ol><blockquote><p>自己以后用得上也是意义</p></blockquote><ol start="5"><li>你上次换博客主题 / 程序是什么时候？<br>A. 上周<br>B. 上个月<br>✅ C. 去年<br>D. 凭良心说，我多年都是一个主题</li></ol><blockquote><p>从<a href="https://github.com/liuyib/hexo-theme-stun">stun</a> 迁移过来的，主要像侧边栏<code>widget</code>之类的自己写太麻烦，最终找了个现成的</p></blockquote><ol start="6"><li>你上一次捣腾博客主题代码是什么时候？<br>A. 昨天，撸代码到凌晨<br>B. 每周必捣腾<br>C. 每月有那么一次<br>✅ D. 一年有那么一次</li></ol><blockquote><p>个人博客的意义在于记录与折腾</p></blockquote><ol start="7"><li>你会对博客主题进行二次开发？<br>A. 直接配置使用，省心不折腾<br>✅ B. 时不时自己改改，搞点新花样，换图片，换字体，爽<br>C. 删除主题作者版权信息，改改样式，然后自我感觉良好<br>D. 改得面目全非，但保留原作者版权信息或注明</li></ol><blockquote><p>同上，有些功能也得自己加，例如首页的<code>Memos</code>轮播</p></blockquote><ol start="8"><li>你多久打开自己博客自我陶醉一次？<br>A. 每天数次<br>✅ B. 每周一次<br>C. 看心情<br>D. 一般都是照镜子，不看博客</li></ol><blockquote><p>因为有 <a href="https://www.foolishfox.cn/link/moments">Moments 朋友圈</a>的存在，每周都会打开看看博友们发了什么新文章</p></blockquote><ol start="9"><li>你近期对自己博客域名什么感受？<br>A. 想搞到一个 .COM 的域名<br>✅ B. 如果域名能再短几个字符就更好了<br>C. 今年才换双拼域名了，明年再看看<br>D. 目前挺好，没想法</li></ol><blockquote><p>现在域名虽然好记，但是确实有点太长了，但是又没有什么缩短的方向，<code>ff.cn</code>？还是<code>ff.sh.cn</code>或者<code>ffox</code>之类的</p></blockquote><ol start="10"><li>你每天都会看网站的流量统计吗？<br>A. 每天看几次，今天又多了 100PV<br>✅ B. 每周回顾，看看流量趋势<br>C. 记得就看看<br>D. 没有搞流量统计，都是浮云</li></ol><blockquote><p>虽然没什么人，但是自建了<a href="https://umami.foolishfox.cn/dashboard">Umami</a> 和<a href="https://www.foolishfox.cn/statistics/">统计</a>，并且每天会自动给我发送报告</p></blockquote><div class="img-wrap"><div class="img-bg"><img class="lazyload lazyload-gif zooming" src="https://asset.foolishfox.cn/2024/10/17/6710f7bc2a765.png" alt="通过<a href=https://sct.ftqq.com/>Server酱</a>发送每日报告"></div><span class="image-caption">通过 <a href="https://sct.ftqq.com/">Server 酱</a>发送每日报告</span></div><ol start="11"><li>你通过博客的广告赚到钱了吗？<br>A. 有，能覆盖建站费用<br>B. 有，但付出大于收入<br>C. 没考虑通过博客流量赚钱<br>✅ D. 拒绝广告，保证阅读体验</li></ol><blockquote><p><s>主要是接不到广告</s></p></blockquote><ol start="12"><li>你去浏览别人的博客 / 网站主要为什么？<br>✅ A. 学习别人分享的知识<br>B. 搬运别人的内容<br>✅ C. 看看别人怎么装修博客，自己也抄一下，感觉都比自己的好<br>D. 不爱看别人博客，自己爱写啥写啥</li></ol><blockquote><p>两者大概三比一吧</p></blockquote><ol start="13"><li>看到别人分享了一篇文章，你打开第一反应是什么？<br>A. 哇，这域名真不错，怎么我没想到<br>B. 哇，这网站速度真快，图片延迟加载丝滑<br>✅ C. 哇，这程序/主题不错，我也要抄一抄/留言问问哪里搞的<br>✅ D. 看看文章内容</li></ol><blockquote><p>首看内容，然后跑偏……</p></blockquote><ol start="14"><li>你觉得博客哪方面更重要？<br>A. 域名<br>✅ B. 服务器<br>C. 主题<br>✅ D. 内容</li></ol><blockquote><p>首重内容，但是也要能打开😂</p></blockquote><ol start="15"><li>近期通过写博客有哪些新收获？<br>✅ A. 知识面有拓展<br>✅ B. 认识了新朋友<br>✅ C. 写作水平提升<br>D. 通过知识变现</li></ol><blockquote><p>就是主打一个与 Money 无缘</p></blockquote>]]></content>
    
    
      
      
    <summary type="html">&lt;blockquote&gt;
&lt;p&gt;以下问卷纯粹自省自娱，自我调侃，勿对号入座。&lt;br&gt;
如有不适，请及时关闭浏览器窗口。&lt;br&gt;
如有启发，建议每隔一段时间服用一次。&lt;br&gt;
From &lt;a href=&quot;https://yayu.net/4626.html&quot;&gt;独立博客自省问卷 15</summary>
      
    
    
    
    
  </entry>
  
</feed>
