<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
    <channel>
            <title>后海不是海</title>
            <link>https://blog.houhaibushihai.me</link>
        <generator>Halo 1.5.5</generator>
        <lastBuildDate>Tue, 11 Nov 2025 17:02:55 CST</lastBuildDate>
                <item>
                    <title>
                        <![CDATA[搬瓦工更换 IP 教程]]>
                    </title>
                    <link>https://blog.houhaibushihai.me/archives/ban-wa-gong-geng-huan-ip-jiao-cheng</link>
                    <description>
                            <![CDATA[<p>由于某些原因，经常会遇到 IP 无法从中国大陆访问。针对这种情况，搬瓦工支持了更换 IP 服务，关于更换 IP 规定如下：</p><ul><li>更换 IP 费用目前每个 $7.39</li><li>IP 必须被封锁才能请求更换</li><li>会从备用 IP 池中随机分配一个可用 IP</li><li>可用的 IP 指从全球均可正常访问</li><li>新 IP 分配后，旧 IP 会被移除</li></ul><h3 id="%E4%B8%80%E3%80%81%E6%A3%80%E6%B5%8B-ip" tabindex="-1">一、检测 IP</h3><p>首先，如果要检测搬瓦工 IP 是否被封，目前有以下几种方法。</p><p><strong>方法一</strong></p><p>使用搬瓦工 KiwiVM 后台提供的检测链接进行检测，一般都以这个检测结果为准。</p><p>首先查看 VPS ID，在 KiwiVM 可以查看：</p><p><img src="https://img.imgdd.com/fb8cca8a-67e3-4cd2-a1d4-00f2688919a7.png" alt="截屏2025-11-05 15.12.47.png" /></p><p>有了 VPS ID 之后，就可以前往检测链接。</p><p>检测链接（<strong>把 VPS-ID 替换成上面的那一串数字，每个人的 VPS-ID 是不一样的</strong>）：</p><pre><code class="language-">https://kiwivm.64clouds.com/VPS-ID/main-exec.php?mode=blacklistcheck</code></pre><p>然后点击页面上的 Test Main IP，就可以开始测试了。</p><p><img src="https://img.imgdd.com/2eaebba6-4dc5-46c9-a433-765d6d1c0ea4.png" alt="截屏2025-11-05 15.27.39.png" /></p><p>一般来说，我们会得到两种结果，要么就是 IP 被封了，要么就是 IP 没被封，两种结果分别对应如下。</p><p><strong>测试结果一</strong></p><p>Test result: <strong>IP NOT BLOCKED</strong></p><p>这种情况说明 IP 完全没有问题，没有被封，一切正常。</p><p><strong>测试结果二</strong></p><p>Test result: <strong>IP BLOCKED</strong></p><p>这种情况就是 IP 被封了。同时我们会看到下面这样的提醒：</p><pre><code class="language-">According to the test results, the IP address is currently on a block list. While the IP is on any major block list, the VPS stays fully operational. However you will not be able to migrate the VPS to a different datacenter until the block is removed.NOTE: This test may not be very accurate during peak usage hours in China. We recommend re-trying this test 2-3 times at different time of day before making final conclusion.Note on IP change policy: officially we do not allow any changes for blocked IPs, free or paid. Our Terms of Services have always been very clear on this.As a courtesy we currently offer paid IP changes. If you are interested in this service, please contact our support desk to find out how to proceed with the IP change. Please note that we do not encourage you to use this optional service, as usually block is cleared by itself (though according to our observations it may take few days to few months, depending on the cause of blocking).</code></pre><p>大概意思就是：</p><ul><li>高峰期建议多测试几次</li><li>不鼓励换 IP，但是如果要换，目前也可以付费换</li></ul><p><strong>方法二</strong></p><p>使用 <a href="https://ping.pe/" target="_blank">ping.pe</a> 检测，绿色表示网络畅通，红色表示网络不通</p><p><img src="https://i1.wp.com/img.erpweb.eu.org/imgs/2025/11/5db57df02b8896a2.png" alt="" /></p><h3 id="%E4%BA%8C%E3%80%81%E6%9B%B4%E6%8D%A2-ip" tabindex="-1">二、更换 IP</h3><p>打开搬瓦工更换 IP 官方页面：<a href="https://bwh81.net/ipchange.php" target="_blank">https://bwh81.net/ipchange.php</a></p><p><img src="https://img.imgdd.com/ae64e939-bc1e-420d-83c8-15710f7e84ba.png" alt="截屏2025-11-05 15.10.46.png" /></p><p>在点击上面按钮之后，会生成一个工单和一个账单，工单内容如下：</p><p><img src="https://img.imgdd.com/edd54915-c7c7-495c-890f-6b30c6bdc5e2.png" alt="更改 IP 工单.png" /></p><p>检查工单里要求更换的 IP 是否正确，如果确认要更换 IP，支付自动生成的账单后24小时内就会进行受理。如果不想更换或者错误提交了，直接关闭这个工单就会取消。</p><p>自动生成的更换 IP 账单，在<a href="https://bwh81.net/billing" target="_blank">搬瓦工账单页面</a>查看</p><p><img src="https://img.imgdd.com/b6a9106d-9249-4bd6-b06c-ef1dc34489e7.png" alt="更换 IP 账单.png" /></p><p>支付账单，等待客服受理即可。</p><p>点击 Make payment 后，将看到最终的支付网关页面。搬瓦工支持多种支付方式，选择您方便的支付方式即可</p><p><img src="https://img.imgdd.com/c57c1a11-6f4b-45e9-b808-2a2fe212da9c.png" alt="支付方式.png" /></p>]]>
                    </description>
                    <pubDate>Tue, 11 Nov 2025 17:02:55 CST</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[代码转图片分享工具搭建]]>
                    </title>
                    <link>https://blog.houhaibushihai.me/archives/dai-ma-zhuan-tu-pian-fen-xiang-gong-ju</link>
                    <description>
                            <![CDATA[<h3 id="1.-%E5%B7%A5%E5%85%B7%E7%AE%80%E4%BB%8B" tabindex="-1">1. 工具简介</h3><p><strong>Code to Image</strong> 是一类将代码片段转换为精美图片的在线工具，方便开发者在社交媒体、博客、演示文稿中分享代码。</p><h3 id="2.-%E9%A1%B9%E7%9B%AE%E5%9C%B0%E5%9D%80" tabindex="-1">2. 项目地址</h3><ul><li><a href="https://github.com/tsrust/CodeToImage" target="_blank">GitHub源码</a></li><li><a href="https://jsrs.net/" target="_blank">Demo</a></li></ul><h3 id="3.-%E7%89%B9%E7%82%B9" tabindex="-1">3. 特点</h3><ul><li>渐变背景</li><li>简洁的界面</li><li>快速调整background颜色</li><li>多种主题和编程语言支持</li><li>自定义背景色、窗口样式</li><li>支持阴影、行号、水印</li><li>可导出 PNG/SVG 格式</li></ul><h3 id="4.-%E4%BD%BF%E7%94%A8%E5%9C%BA%E6%99%AF" tabindex="-1">4. 使用场景</h3><ul><li><strong>社交媒体分享</strong> - Weibo、Twitter、LinkedIn 等平台展示代码</li><li><strong>技术博客</strong> - 让代码片段更美观</li><li><strong>技术演讲</strong> - PPT 中插入精美代码图</li><li><strong>教程制作</strong> - 配合注释说明代码逻辑</li><li><strong>文档编写</strong> - 增强视觉效果</li></ul><h3 id="5.-%E6%B3%A8%E6%84%8F%E4%BA%8B%E9%A1%B9" tabindex="-1">5. 注意事项</h3><ul><li>不要分享敏感信息（密钥、密码等）</li><li>图片无法被搜索引擎索引，不利于 SEO</li><li>大段代码不建议使用，适合片段代码</li></ul><h3 id="6.-%E9%A1%B9%E7%9B%AE%E5%B1%95%E7%A4%BA" tabindex="-1">6. 项目展示</h3><p><img src="https://cdn.acwing.com/media/article/image/2025/10/16/41662_5c9e1083aa-%E6%88%AA%E5%B1%8F2025-10-16-17.05.03.png" alt="截屏2025-10-16 17.05.03.png" /></p><p><img src="https://cdn.acwing.com/media/article/image/2025/10/16/41662_615e4353aa-%E6%88%AA%E5%B1%8F2025-10-16-17.05.17.png" alt="截屏2025-10-16 17.05.17.png" /></p><p><img src="https://cdn.acwing.com/media/article/image/2025/10/16/41662_658ff2e3aa-%E6%88%AA%E5%B1%8F2025-10-16-17.05.33.png" alt="截屏2025-10-16 17.05.33.png" /></p><p><img src="https://cdn.acwing.com/media/article/image/2025/10/16/41662_6a4e4dc0aa-%E6%88%AA%E5%B1%8F2025-10-16-17.05.45.png" alt="截屏2025-10-16 17.05.45.png" /></p><p>这边直接丢出搭建的docker-compose.yaml文件，熟悉docker环境的小伙伴可以直接拷贝搭建。（环境变量可以自行参考文档按需修改）</p><pre><code class="language-shell">version: &#39;3&#39;services:  codetoimage:    container_name: codetoimage    build: .    ports:      - &quot;3000:3000&quot;    volumes:      - .:/app      - /app/node_modules    command: yarn dev</code></pre><p>以下是详细搭建教程。</p><h3 id="7.-%E6%90%AD%E5%BB%BA%E7%8E%AF%E5%A2%83" tabindex="-1">7. 搭建环境</h3><ul><li>服务器提供商：<a href="https://bwh81.net/aff.php?aff=69792" target="_blank">BandwagonHOST</a></li><li>套餐名：<code>SPECIAL 40G KVM PROMO V5 - CN2 GIA ECOMMERCE</code></li><li>服务器配置：2C2G 40GB 2000GB</li><li>系统：<code>Debian 13 x86_64 </code></li></ul><h3 id="8.-%E5%AE%89%E8%A3%85%E7%B3%BB%E7%BB%9F" tabindex="-1">8. 安装系统</h3><p><img src="https://cdn.acwing.com/media/article/image/2025/10/16/41662_938a25cfaa-%E6%88%AA%E5%B1%8F2025-10-16-17.20.55.png" alt="截屏2025-10-16 17.20.55.png" /></p><p>服务器初始化：</p><p><strong>ssh 登录到远程服务器的 root 用户</strong>后再完成以下操作：</p><ol><li><p><strong>更新</strong>系统已知的软件包列表、<strong>升级</strong>系统上的所有软件包、<strong>移除</strong>不再需要的依赖软件包：</p><pre><code class="language-">apt update &amp;&amp; apt upgrade &amp;&amp; apt autoremove -y</code></pre><blockquote><p>正经的 Linux 用户不会用 root 干所有的事情，如果这么做的话将会很危险。创建一个普通的用户，并让它可以通过 <em>sudo</em> 指令用 root 权限执行命令是一般的解决方案。</p></blockquote></li><li><p>在用 <em>sudo</em> 之前，我们需要先安装 <strong>sudo</strong> 这个软件包：</p><pre><code class="language-">apt install sudo</code></pre></li><li><p>时间校准</p><pre><code class="language-">sudo timedatectl set-ntp true # 启用 NTP 服务sudo ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime # 将时区设为“亚洲/上海”sudo hwclock --systohc # 将硬件时钟调整到与当前系统时间一致date -R # 以 RFC 5322 格式输出日期和时间。例如 Mon, 18 Jan 2025 11:04:16 +0800</code></pre><p>执行完之后，终端显示的时间如果正确，那么就没问题了。</p></li><li><p>防火墙初始化</p><pre><code class="language-">sudo apt install ufwsudo ufw enablesudo ufw allow &#39;OpenSSH&#39;</code></pre></li><li><p>安装相关软件</p><p><strong>更新</strong>系统已知的软件包列表、<strong>升级</strong>系统上的所有软件包、<strong>移除</strong>不再需要的依赖软件包：</p><pre><code class="language-">sudo apt update &amp;&amp; sudo apt upgrade &amp;&amp; sudo apt autoremove -y</code></pre><p><strong>安装</strong>所需要的依赖软件包：</p><pre><code class="language-">sudo apt install vim wget curl openssl git -y</code></pre><blockquote><p>注意：VPS的内存如果过小，建议设置一下SWAP，一般为内存的1-1.5倍即可，可以让系统运行更流畅！</p></blockquote></li><li><p>设置SWAP可以用脚本</p><pre><code class="language-">wget -O box.sh https://raw.githubusercontent.com/BlueSkyXN/SKY-BOX/main/box.sh &amp;&amp; chmod +x box.sh &amp;&amp; clear &amp;&amp; ./box.sh</code></pre><p><img src="https://cdn.acwing.com/media/article/image/2025/10/16/41662_165124acaa-%E6%88%AA%E5%B1%8F2025-10-16-18.06.56.png" alt="截屏2025-10-16 18.06.56.png" /></p><p>选择<code>18</code>，然后输入你想要扩容的数值即可。</p><p><img src="https://cdn.acwing.com/media/article/image/2025/10/16/41662_1d4005e3aa-%E6%88%AA%E5%B1%8F2025-10-16-18.07.13.png" alt="截屏2025-10-16 18.07.13.png" /></p></li></ol><h3 id="9.-%E6%90%AD%E5%BB%BA%E6%96%B9%E5%BC%8F" tabindex="-1">9. 搭建方式</h3><h4 id="9.1-%E5%AE%89%E8%A3%85docker%E5%92%8Cdocker-compose" tabindex="-1">9.1 安装Docker和Docker Compose</h4><p>安装docker脚本：</p><pre><code class="language-">curl -fsSL https://get.docker.com | bash -s docker</code></pre><p>测试安装是否成功</p><pre><code class="language-">docker -v</code></pre><p>安装Docker-compose</p><pre><code class="language-">curl -L &quot;https://github.com/docker/compose/releases/download/v2.29.6/docker-compose-$(uname -s)-$(uname -m)&quot; -o /usr/local/bin/docker-compose &amp;&amp; chmod +x /usr/local/bin/docker-compose</code></pre><p>测试是否安装成功：</p><pre><code class="language-">docker-compose -v</code></pre><h4 id="9.2-%E5%8F%8D%E5%90%91%E4%BB%A3%E7%90%86" tabindex="-1">9.2 反向代理</h4><p>运行nginx反代和tls的一键脚本</p><pre><code class="language-">wget -O manage_nginx.sh &quot;https://raw.githubusercontent.com/1keji/AddIPv6/main/manage_nginx.sh&quot; &amp;&amp; chmod +x manage_nginx.sh &amp;&amp; ./manage_nginx.sh</code></pre><p>上面的脚本我没有考虑到单ipv6服务器的情况，下面是一个更新的脚本，增加了对ipv6的支持。由于时间关系，我没有对下面脚本的ipv4功能进行测试，应该不会有问题，如果ipv4万一真有问题的话，可以给我回馈一下，然后先使用上面的脚本吧。请允许我偷个懒，哈哈。</p><pre><code class="language-">wget -O manage_nginx_v6.sh &quot;https://raw.githubusercontent.com/1keji/AddIPv6/main/manage_nginx_v6.sh&quot; &amp;&amp; chmod +x manage_nginx_v6.sh &amp;&amp; ./manage_nginx_v6.sh</code></pre><p><img src="https://cdn.acwing.com/media/article/image/2025/10/16/41662_c9a30229aa-%E6%88%AA2025-10-16-17.58.08.png" alt="截2025-10-16 17.58.08.png" /></p><h4 id="9.3-tcp-bbr" tabindex="-1">9.3 TCP BBR</h4><blockquote><p><strong>TCP BBR</strong>（Bottleneck Bandwidth and Round-trip propagation time）是由 Google 设计的一种<strong>拥塞控制算法</strong>。自从 <em>Linux Kernel 4.9</em> 开始就引入了该算法，但<strong>默认没有启用，所以需要手动开启</strong>。</p></blockquote><p><strong>启用</strong>该算法仅需在 <code>/etc/sysctl.conf</code> 文件<strong>末尾追加两行内容</strong>：</p><pre><code class="language-">sudo bash -c &quot;echo &#39;net.core.default_qdisc=fq&#39; &gt;&gt; /etc/sysctl.conf&quot;sudo bash -c &quot;echo &#39;net.ipv4.tcp_congestion_control=bbr&#39; &gt;&gt; /etc/sysctl.conf&quot;</code></pre><p>接下来你需要重启系统或者直接<strong>使用 *systemctl* 重载变更</strong>。</p><pre><code class="language-">sudo sysctl --system</code></pre><p>您可以使用以下 <em>sysctl</em> 命令<strong>验证配置是否生效</strong>，如下：</p><pre><code class="language-">sudo sysctl net.core.default_qdisc</code></pre><ul><li>若输出结果为 <code>net.core.default_qdisc = fq</code>，则配置已生效</li></ul><pre><code class="language-">sudo sysctl net.ipv4.tcp_congestion_control</code></pre><ul><li>若输出结果为 <code>net.ipv4.tcp_congestion_control = bbr</code>，则配置已生效</li></ul><h3 id="10.-%E7%BB%93%E5%B0%BE" tabindex="-1">10. 结尾</h3><p>祝大家用得开心，有问题可以去 GitHub 提 <a href="https://github.com/tsrust/CodeToImage/issues" target="_blank">Issues</a>，也可以在评论区互相交流探讨。</p><p>同时，有能力给项目做贡献的同学，也欢迎积极加入到项目中来，贡献自己的一份力量！</p><p>最后，欢迎大家都去给这个项目点个 star ⭐️</p>]]>
                    </description>
                    <pubDate>Thu, 16 Oct 2025 18:11:03 CST</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[牛顿迭代法求平方根]]>
                    </title>
                    <link>https://blog.houhaibushihai.me/archives/qiu-ping-fang-gen</link>
                    <description>
                            <![CDATA[<p>我来详细解析一下牛顿迭代法求平方根的核心思想和原理。</p><ol><li>基本思想:</li></ol><ul><li>牛顿迭代法的本质是通过逐步逼近的方式求解方程的根</li><li>求解 x² = n 等价于求解方程 f(x) = x² - n = 0 的根</li><li>每次迭代都用切线与x轴的交点作为新的近似解</li></ul><ol start="2"><li>推导过程:</li></ol><pre><code class="language-">1) 假设要求 n 的平方根2) 构造函数 f(x) = x² - n3) 在点(x₀,f(x₀))处做切线:   f&#39;(x) = 2x   切线方程: y - f(x₀) = f&#39;(x₀)(x - x₀)4) 令y=0求切线与x轴交点:   0 - (x₀² - n) = 2x₀(x - x₀)5) 解出x值:   x = (x₀² + n)/(2x₀) = (x₀ + n/x₀)/2</code></pre><ol start="3"><li>迭代公式:</li></ol><pre><code class="language-">xₙ₊₁ = (xₙ + n/xₙ)/2</code></pre><ol start="4"><li>代码实现示例:</li></ol><pre><code class="language-python">def sqrt_newton(n, tolerance=1e-7):    x = n/2  # 初始猜测值    while True:        next_x = (x + n/x)/2        if abs(next_x - x) &lt; tolerance:            return next_x        x = next_x</code></pre><ol start="5"><li>收敛性分析:</li></ol><ul><li>收敛速度很快,通常3-4次迭代就能得到很好的精度</li><li>初始值的选择会影响收敛速度,但不影响最终结果</li><li>每次迭代至少能获得一倍的精确度</li></ul><ol start="6"><li>优点:</li></ol><ul><li>收敛速度快</li><li>实现简单</li><li>精度可控</li></ul><ol start="7"><li>注意事项:</li></ol><ul><li>需要处理输入为0或负数的特殊情况</li><li>初始值的选择会影响迭代次数</li><li>要设置合适的误差阈值</li></ul><ol start="8"><li>算法复杂度:</li></ol><ul><li>时间复杂度: O(log n)</li><li>空间复杂度: O(1)</li></ul><p>这个方法不仅可以用来求平方根,还可以推广到求解其他方程。牛顿迭代法的核心优势在于其二阶收敛特性,这使得它在很多数值计算场景中都有广泛应用。</p><h3 id="preference" tabindex="-1">Preference</h3><ul><li><a href="https://www.bilibili.com/video/BV1Nt411T7HT/" target="_blank">牛顿求根法</a></li></ul>]]>
                    </description>
                    <pubDate>Wed, 16 Jul 2025 14:50:59 CST</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[About LazyVim]]>
                    </title>
                    <link>https://blog.houhaibushihai.me/archives/aboutlazyvim</link>
                    <description>
                            <![CDATA[<h3 id="what-mean-n%2Ci%2Cc%2Cv%2Cx-etc-of-mode-in-lazyvim%3F" tabindex="-1">what mean n,i,c,v,x etc of Mode in lazyvim?</h3><p>Let me explain the different modes in Vim/LazyVim:</p><p><strong>n (Normal Mode)</strong></p><ul><li>This is the default mode you start in</li><li>Used for navigation and executing commands</li><li>You can enter this mode from any other mode by pressing <code>Esc</code></li><li>In this mode, keystrokes are interpreted as commands rather than text input</li></ul><p><strong>x (Visual Mode)</strong></p><ul><li>Used for selecting and manipulating blocks of text</li><li>There are actually three types of visual mode:<ol><li><code>v</code> - Character-wise visual mode (select characters)</li><li><code>V</code> - Line-wise visual mode (select entire lines)</li><li><code>Ctrl+v</code> - Block-wise visual mode (select rectangular blocks)</li></ol></li></ul><p>Other important modes include:</p><ul><li><code>i</code> (Insert Mode) - For typing/inserting text</li><li><code>R</code> (Replace Mode) - For replacing existing text</li><li><code>c</code> (Command Mode) - Entered by typing <code>:</code> in normal mode</li></ul><p>To see which mode you’re currently in, look at the bottom left of your LazyVim window. It will show:</p><ul><li><code>NORMAL</code> for normal mode</li><li><code>VISUAL</code> for visual mode</li><li><code>INSERT</code> for insert mode</li><li><code>COMMAND</code> for command mode</li></ul><table><thead><tr><th style="text-align:center">Command\Mode</th><th style="text-align:center">Normal</th><th style="text-align:center">Insert</th><th style="text-align:center">Command-line</th><th style="text-align:center">Visual</th><th style="text-align:center">Select</th><th style="text-align:center">Operator-pending</th><th style="text-align:center">Terminal</th><th style="text-align:center">Lang-Arg</th></tr></thead><tbody><tr><td style="text-align:center">[nore]map</td><td style="text-align:center">yes</td><td style="text-align:center">-</td><td style="text-align:center">-</td><td style="text-align:center">yes</td><td style="text-align:center">yes</td><td style="text-align:center">yes</td><td style="text-align:center">-</td><td style="text-align:center">-</td></tr><tr><td style="text-align:center">n[nore]map</td><td style="text-align:center">yes</td><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">-</td><td style="text-align:center">-</td><td style="text-align:center">-</td></tr><tr><td style="text-align:center">[nore]map!</td><td style="text-align:center">-</td><td style="text-align:center">yes</td><td style="text-align:center">yes</td><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">-</td></tr><tr><td style="text-align:center">i[nore]map</td><td style="text-align:center">-</td><td style="text-align:center">yes</td><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">-</td><td style="text-align:center">-</td></tr><tr><td style="text-align:center">c[nore]map</td><td style="text-align:center">-</td><td style="text-align:center">-</td><td style="text-align:center">yes</td><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">-</td></tr><tr><td style="text-align:center">v[nore]map</td><td style="text-align:center">-</td><td style="text-align:center">-</td><td style="text-align:center">-</td><td style="text-align:center">yes</td><td style="text-align:center">yes</td><td style="text-align:center">-</td><td style="text-align:center">-</td><td style="text-align:center">-</td></tr><tr><td style="text-align:center">x[nore]map</td><td style="text-align:center">-</td><td style="text-align:center">-</td><td style="text-align:center">-</td><td style="text-align:center">yes</td><td style="text-align:center">-</td><td style="text-align:center">-</td><td style="text-align:center">-</td><td style="text-align:center">-</td></tr><tr><td style="text-align:center">s[nore]map</td><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">yes</td><td style="text-align:center">-</td><td style="text-align:center">-</td><td style="text-align:center">-</td></tr><tr><td style="text-align:center">o[nore]map</td><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">-</td><td style="text-align:center">yes</td><td style="text-align:center">-</td><td style="text-align:center">-</td></tr><tr><td style="text-align:center">t[nore]map</td><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">-</td><td style="text-align:center">-</td><td style="text-align:center">yes</td><td style="text-align:center">-</td></tr><tr><td style="text-align:center">l[nore]map</td><td style="text-align:center">-</td><td style="text-align:center">yes</td><td style="text-align:center">yes</td><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">yes</td></tr></tbody></table><blockquote><p>注：You can found it: <code>:help map-table</code></p><p>(<a href="https://neovim.io/doc/user/map.html#map-table" target="_blank">map-table</a> in <em>map.txt</em>)</p></blockquote><h3 id="vim-shortcut" tabindex="-1">vim shortcut</h3><p>Here are some essential Vim shortcuts to help you navigate and edit efficiently:</p><p><strong>Basic Navigation (Normal Mode)</strong></p><ul><li><code>h</code> <code>j</code> <code>k</code> <code>l</code> - Move left, down, up, right</li><li><code>w</code> - Jump to start of next word</li><li><code>b</code> - Jump to start of previous word</li><li><code>0</code> - Jump to start of line</li><li><code>$</code> - Jump to end of line</li><li><code>gg</code> - Go to first line</li><li><code>G</code> - Go to last line</li><li><code>{number}G</code> - Go to specific line number</li></ul><p><strong>Editing (Normal Mode)</strong></p><ul><li><code>i</code> - Insert mode before cursor</li><li><code>a</code> - Insert mode after cursor</li><li><code>o</code> - Insert new line below</li><li><code>O</code> - Insert new line above</li><li><code>dd</code> - Delete current line</li><li><code>yy</code> - Copy (yank) current line</li><li><code>p</code> - Paste after cursor</li><li><code>u</code> - Undo</li><li><code>Ctrl + r</code> - Redo</li></ul><p><strong>Visual Mode</strong></p><ul><li><code>v</code> - Enter visual mode (for selecting text)</li><li><code>V</code> - Select entire lines</li><li><code>Ctrl + v</code> - Visual block mode</li></ul><p><strong>Search and Replace</strong></p><ul><li><code>/pattern</code> - Search forward</li><li><code>?pattern</code> - Search backward</li><li><code>n</code> - Next occurrence</li><li><code>N</code> - Previous occurrence</li><li><code>:%s/old/new/g</code> - Replace all occurrences</li></ul><p><strong>Save and Quit</strong></p><ul><li><code>:w</code> - Save</li><li><code>:q</code> - Quit</li><li><code>:wq</code> or <code>:x</code> - Save and quit</li><li><code>:q!</code> - Quit without saving</li></ul><p><strong>LazyVim Specific</strong></p><ul><li><code>Space</code> - Leader key</li><li><code>Space + e</code> - Toggle file explorer</li><li><code>Space + ff</code> - Find files</li><li><code>Space + fg</code> - Live grep</li><li><code>Space + /</code> - Search in current buffer</li><li><code>gc</code> - Comment/uncomment lines</li><li><code>Ctrl + /</code> - Toggle terminal</li></ul><p><strong>Multiple Windows</strong></p><ul><li><code>Ctrl + w + v</code> - Split vertically</li><li><code>Ctrl + w + s</code> - Split horizontally</li><li><code>Ctrl + w + h/j/k/l</code> - Navigate between windows</li></ul><h3 id="how-to-chage-brew-mirrors-on-macos%3F" tabindex="-1">how to chage brew mirrors on macOS?</h3><p>To change Homebrew’s download source (mirrors) on macOS, you can use the following steps:</p><ol><li><p><strong>View current brew source</strong>:</p><pre><code class="language-">brew doctor</code></pre></li><li><p><strong>Popular mirrors you can use</strong>:</p><ul><li><p><strong>Official GitHub Mirror</strong> (Default, generally good worldwide):</p><pre><code class="language-">export HOMEBREW_BREW_GIT_REMOTE=&quot;https://github.com/Homebrew/brew.git&quot;export HOMEBREW_CORE_GIT_REMOTE=&quot;https://github.com/Homebrew/homebrew-core.git&quot;</code></pre></li><li><p>USTC (China):</p><pre><code class="language-">export HOMEBREW_BREW_GIT_REMOTE=&quot;https://mirrors.ustc.edu.cn/brew.git&quot;export HOMEBREW_CORE_GIT_REMOTE=&quot;https://mirrors.ustc.edu.cn/homebrew-core.git&quot;</code></pre></li><li><p>Tsinghua University (China):</p><pre><code class="language-">export HOMEBREW_BREW_GIT_REMOTE=&quot;https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/brew.git&quot;export HOMEBREW_CORE_GIT_REMOTE=&quot;https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/homebrew-core.git&quot;</code></pre></li></ul></li><li><p><strong>Make the change permanent</strong>: Add the export commands to your shell configuration file (<code>~/.zshrc</code> for Zsh or <code>~/.bash_profile</code> for Bash):</p><pre><code class="language-">echo &#39;export HOMEBREW_BREW_GIT_REMOTE=&quot;your-chosen-mirror-url&quot;&#39; &gt;&gt; ~/.zshrcecho &#39;export HOMEBREW_CORE_GIT_REMOTE=&quot;your-chosen-mirror-url&quot;&#39; &gt;&gt; ~/.zshrc</code></pre></li><li><p><strong>Run</strong>:</p><pre><code class="language-">source ~/.zshrc  # or source ~/.bash_profilebrew update-resetbrew update</code></pre></li><li><p>After changing the mirror, you should see faster download speeds when installing or updating packages if you’ve chosen a mirror that’s geographically closer to you.</p><p>Note: If you want to revert to the official source, you can remove the export commands from your shell configuration file and run the update-reset command again.</p></li></ol><h3 id="how-to-set-proxy-in-lazyvim%3F" tabindex="-1">how to set proxy in Lazyvim?</h3><p>To set up a proxy in LazyVim, you have several options:</p><p><strong>System-wide Git Proxy</strong> (Recommended):</p><pre><code class="language-">git config --global http.proxy http://127.0.0.1:7890git config --global https.proxy http://127.0.0.1:7890</code></pre><p><strong>In LazyVim Configuration</strong>: Create or edit <code>~/.config/nvim/lua/config/options.lua</code> and add:</p><pre><code class="language-">-- Set proxy for network operationsvim.g.proxy = &#39;http://127.0.0.1:7890&#39;</code></pre><p><strong>For Mason Package Manager</strong>: Edit <code>~/.config/nvim/lua/config/lazy.lua</code> and add:</p><pre><code class="language-">{  &quot;williamboman/mason.nvim&quot;,  opts = {    -- Add proxy settings to mason    proxy_url = &quot;http://127.0.0.1:7890&quot;,  },}</code></pre><p><strong>For Neovim’s built-in LSP</strong>: Add to your <code>~/.config/nvim/lua/config/options.lua</code>:</p><pre><code class="language-">vim.env.http_proxy = &#39;http://127.0.0.1:7890&#39;vim.env.https_proxy = &#39;http://127.0.0.1:7890&#39;</code></pre><p>Notes:</p><ul><li>Replace <code>7890</code> with your actual proxy port</li><li>Common proxy ports are: 7890 (Clash), 1080 (SOCKS5), 8080 (HTTP)</li><li>After making changes, restart Neovim for the settings to take effect</li><li>You might need to run <code>:Mason</code> and <code>:MasonUpdate</code> to verify the proxy settings are working</li></ul><p>To remove the proxy settings:</p><pre><code class="language-">git config --global --unset http.proxygit config --global --unset https.proxy</code></pre><p>Remember to adjust the proxy address and port according to your specific proxy setup (e.g., if you’re using a different proxy service or port).</p><h3 id="how-to-set-shortcut-of-insert-mode-in-lazyvim%3F" tabindex="-1">how to set shortcut of Insert Mode in Lazyvim?</h3><p>To set shortcuts for Insert Mode in LazyVim, you can modify or add keymaps in your configuration. Here’s how to do it:</p><p><strong>Edit Keymaps File</strong>: Create or edit <code>~/.config/nvim/lua/config/keymaps.lua</code>:</p><pre><code class="language-">-- Basic cursor movement in Insert Modevim.keymap.set(&#39;i&#39;, &#39;&lt;C-h&gt;&#39;, &#39;&lt;Left&gt;&#39;, { desc = &#39;Move left&#39; })vim.keymap.set(&#39;i&#39;, &#39;&lt;C-j&gt;&#39;, &#39;&lt;Down&gt;&#39;, { desc = &#39;Move down&#39; })vim.keymap.set(&#39;i&#39;, &#39;&lt;C-k&gt;&#39;, &#39;&lt;Up&gt;&#39;, { desc = &#39;Move up&#39; })vim.keymap.set(&#39;i&#39;, &#39;&lt;C-l&gt;&#39;, &#39;&lt;Right&gt;&#39;, { desc = &#39;Move right&#39; })-- Word movement in Insert Modevim.keymap.set(&#39;i&#39;, &#39;&lt;C-b&gt;&#39;, &#39;&lt;C-Left&gt;&#39;, { desc = &#39;Move word backward&#39; })vim.keymap.set(&#39;i&#39;, &#39;&lt;C-w&gt;&#39;, &#39;&lt;C-Right&gt;&#39;, { desc = &#39;Move word forward&#39; })-- Line movement in Insert Modevim.keymap.set(&#39;i&#39;, &#39;&lt;C-e&gt;&#39;, &#39;&lt;End&gt;&#39;, { desc = &#39;Move to line end&#39; })vim.keymap.set(&#39;i&#39;, &#39;&lt;C-a&gt;&#39;, &#39;&lt;Home&gt;&#39;, { desc = &#39;Move to line start&#39; })-- Delete operations in Insert Modevim.keymap.set(&#39;i&#39;, &#39;&lt;C-d&gt;&#39;, &#39;&lt;Delete&gt;&#39;, { desc = &#39;Delete forward&#39; })vim.keymap.set(&#39;i&#39;, &#39;&lt;C-BS&gt;&#39;, &#39;&lt;C-w&gt;&#39;, { desc = &#39;Delete word backward&#39; })-- Other useful Insert Mode mappingsvim.keymap.set(&#39;i&#39;, &#39;&lt;C-u&gt;&#39;, &#39;&lt;C-g&gt;u&lt;C-u&gt;&#39;, { desc = &#39;Delete to start of line&#39; })vim.keymap.set(&#39;i&#39;, &#39;&lt;C-y&gt;&#39;, &#39;&lt;Esc&gt;pa&#39;, { desc = &#39;Paste in insert mode&#39; })</code></pre><p><strong>Syntax Explanation</strong>:</p><pre><code class="language-">vim.keymap.set({mode}, {lhs}, {rhs}, {opts})-- mode: &#39;i&#39; for Insert Mode-- lhs: the key combination you press-- rhs: the action to perform-- opts: additional options like description</code></pre><p><strong>Common Options</strong>:</p><pre><code class="language-">local opts = {    desc = &quot;Description of the mapping&quot;,    silent = true,     -- Don&#39;t show command in command line    noremap = true,    -- Don&#39;t use recursive mapping    expr = false,      -- Expression mapping    buffer = nil       -- Buffer local mapping}</code></pre><p><strong>Check Existing Mappings</strong>:</p><ul><li>In Normal mode, type <code>:map</code> to see all mappings</li><li>Use <code>:verbose imap</code> to see Insert mode mappings and where they were set</li></ul><p><strong>Remove Mappings</strong>:</p><pre><code class="language-">-- Remove a mappingvim.keymap.del(&#39;i&#39;, &#39;&lt;C-h&gt;&#39;)</code></pre><p>Remember:</p><ul><li>Test your mappings after setting them</li><li>Avoid overriding essential functionality</li><li>Use <code>:checkhealth</code> to check for conflicts</li><li>Add descriptions for better documentation</li><li>Use <code>&lt;Cmd&gt;</code> instead of <code>:</code> for command mappings in Insert mode</li></ul><p>After making changes, restart Neovim or source the config file:</p><pre><code class="language-">:source ~/.config/nvim/lua/config/keymaps.lua</code></pre><h3 id="caused-by-sslerror" tabindex="-1">Caused by SSLError</h3><p><strong>Q:</strong> Caused by SSLError(SSLCertVerificationError(1, ‘[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1000)’))) - skipping</p><p><strong>A:</strong></p><pre><code class="language-"># Download certificatescurl https://curl.se/ca/cacert.pem -o ~/cacert.pem# Set the SSL certificate pathexport SSL_CERT_FILE=~/cacert.pemexport REQUESTS_CA_BUNDLE=~/cacert.pem</code></pre>]]>
                    </description>
                    <pubDate>Fri, 03 Jan 2025 19:00:34 CST</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[【转载】macOS上HHKB配列Control键完美方案]]>
                    </title>
                    <link>https://blog.houhaibushihai.me/archives/macos-shang-hhkb-pei-lie-control-jian-wan-mei-fang-an</link>
                    <description>
                            <![CDATA[<h3 id="%E9%80%82%E7%94%A8%E4%BA%8E" tabindex="-1">适用于</h3><ul><li>macOS系统</li><li>HHKB配列键盘，支持VIA改键</li><li>保证原键位功能不变，即Control功能不影响，还要做到Caps Lock原有短按切换中英文、长按锁定大小写功能</li></ul><h3 id="%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88" tabindex="-1">解决方案</h3><p><strong>第一步</strong></p><p>其实，很简单，原理就是利用VIA的Any键功能，实现一个键位上绑定短按Caps Lock，长按Control功能。这样可行的原因是Control按键本身就是用于组合键，而一般情况下都是按键时长超过200ms的，完全可以只在长按时触发Control键的。</p><p><img src="https://cdn.acwing.com/media/article/image/2025/01/03/41662_22c10047c9-%E6%88%AA%E5%B1%8F2025-01-03-18.09.50.png" alt="截屏2025-01-03 18.09.50.png" /></p><p>具体VIA改键步骤：连接上键盘后，选中该键位，点击SPECIAL -&gt; 点击Any -&gt; 在弹出框中输入 <code>MT(MOD_LCTL, KC_CAPS)</code> -&gt; 保存即可。</p><p><strong>第二步</strong></p><p>系统中在输入法设置中启用Caps Lock切换中英文，如下图所示。</p><p><img src="https://cdn.acwing.com/media/article/image/2025/01/03/41662_65918d47c9-%E6%88%AA%E5%B1%8F2025-01-03-18.13.27.png" alt="截屏2025-01-03 18.13.27.png" /></p><p><strong>写在最后</strong></p><p>以上两步设置完，可以愉快地实现HHKB中的Control键位和macOS中的Caps Lock短按切换中英文、长按锁定大小写功能的完美融合，并且键位和之前的习惯完全相同，没有任何负担，并且规避了一些系统级切换输入法的隐藏bug。</p><p>另外，需要提到一点，我在测试Keychron Q60Max的时候，Cable有线连接存在bug，短按该键位，系统识别到的是长按Caps Lock，即短按也变成了锁定大小写。而2.4G和蓝牙模式是正常触发Caps Lock短按切换中英文效果的。不知道是固件bug还是系统bug，就先这样吧，反正我平时除了充电，基本都是无线连接。</p><p><strong>补充HHKB配列方向键设置</strong></p><p>将右下角四个键也利用相同思路设置成短按方向键、长按功能键的设置，具体设置如下：</p><p>上：<code>MT(MOD_RSFT, KC_UP)</code><br />下：<code>MT(MOD_RALT, KC_DOWN)</code><br />左：<code>MT(MOD_RGUI, KC_LEFT)</code><br />右：<code>LT(2, KC_RGHT)</code></p><p><img src="https://cdn.acwing.com/media/article/image/2025/01/03/41662_c1e266e4c9-%E6%88%AA%E5%B1%8F2025-01-03-18.15.57.png" alt="截屏2025-01-03 18.15.57.png" /></p><h3 id="preference" tabindex="-1">Preference</h3><ul><li><a href="https://www.zfrontier.com/app/flow/gQ1EPpdLlzNv" target="_blank">macOS上HHKB配列Control键完美方案（原帖）</a></li><li><a href="https://github.com/qmk/qmk_firmware/blob/master/docs/keycodes.md" target="_blank">keycode map</a></li><li><a href="https://www.bilibili.com/video/BV1RV4y197s4/" target="_blank">全网最详细的客制化键盘VIA改键教程</a></li></ul>]]>
                    </description>
                    <pubDate>Fri, 03 Jan 2025 18:24:22 CST</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[【搬瓦工上新】BIGGERBOX 34.5刀 CN2 GIA]]>
                    </title>
                    <link>https://blog.houhaibushihai.me/archives/biggerbox-20-1024</link>
                    <description>
                            <![CDATA[<h2 id="%E9%85%8D%E7%BD%AE" tabindex="-1">配置</h2><table><thead><tr><th>名称</th><th>BIGGERBOX-20-1024</th></tr></thead><tbody><tr><td>CPU</td><td>1 核 Intel Xeon</td></tr><tr><td>内存RAM</td><td>1024 MB</td></tr><tr><td>硬盘</td><td>20 GB SSD</td></tr><tr><td>流量</td><td>1000G/月</td></tr><tr><td>带宽</td><td>1 Gbps</td></tr><tr><td>数据中心</td><td>DC99(USCA_99)</td></tr><tr><td>线路(回程)</td><td>CN2 GIA</td></tr><tr><td>线路(去程)</td><td>电信CN2GIA+联通CU4837+移动CMIN2</td></tr><tr><td>价格</td><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>37</mn><mi mathvariant="normal">/</mi><mtext>年</mtext><mo stretchy="false">(</mo><mtext>实付</mtext><mn>34.5</mn></mrow><annotation encoding="application/x-tex">37/年(实付34.5</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">3</span><span class="mord">7</span><span class="mord">/</span><span class="mord cjk_fallback">年</span><span class="mopen">(</span><span class="mord cjk_fallback">实</span><span class="mord cjk_fallback">付</span><span class="mord">3</span><span class="mord">4</span><span class="mord">.</span><span class="mord">5</span></span></span></span>)</td></tr><tr><td>折扣码</td><td><strong>BWHCGLUKKB</strong> (-6.77%)</td></tr></tbody></table><h2 id="%E8%B4%AD%E4%B9%B0" tabindex="-1">购买</h2><ul><li><a href="https://bwh81.net/aff.php?aff=69792&amp;pid=152" target="_blank">点击购买</a></li><li>优惠码：<strong>BWHCGLUKKB</strong></li><li>邀请码：<strong>bwh_DP2ralsXcgydhuomjUDO4kEVBEcY</strong></li></ul><h2 id="%E5%85%B6%E5%AE%83" tabindex="-1">其它</h2><p>网络解锁情况：ChatGPT是DNS解锁，谷歌Gemini原生解锁，迪斯尼看不了，奈飞只能看自制剧和DC6机房一样</p><p><img src="https://990599.xyz/wp-content/uploads/2024/11/bwh-mediaunlock-dc99.jpg" alt="" /></p><p>三网回程情况：三网CN2GIA回程，电信CN2GIA去程，联通4837去程，移动CMIN2去程，可以说非常的硬</p><p><img src="https://990599.xyz/wp-content/uploads/2024/11/bwh-trace-dc99.jpg" alt="" /></p><p>上海大出口，直连洛杉矶</p><p><img src="https://boat.990599.xyz/20241113-nexttrace.png" alt="" /></p><p>IP质量</p><p><img src="https://990599.xyz/wp-content/uploads/2024/11/bwh-IP-dc99.jpg" alt="" /></p><p>油管打开基本是转1个圈圈就打开，速度能达到8w起，看4K没啥压力<br />打开小飞机也是秒开，没转圈圈（可能我是会员？），刷twitter的feed流也是很流畅，打开instagram的图片也是点哪开哪</p><p><img src="https://boat.990599.xyz/20241113-you1tube-test1.png" alt="" /></p>]]>
                    </description>
                    <pubDate>Sun, 29 Dec 2024 12:00:19 CST</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[老款 PVM.LAX.PRO.WEE 简测]]>
                    </title>
                    <link>https://blog.houhaibushihai.me/archives/lao-kuan-pvmlaxprowee-jian-ce</link>
                    <description>
                            <![CDATA[<h3 id="%E9%85%8D%E7%BD%AE" tabindex="-1">配置</h3><pre><code class="language-">LAX.Pro.WEE1 vCPU1 GB RAM20G SSD Storage500GB Transfer500Mbps VirtIO Interface1 IPv4 &amp; 1 IPv6 /64Premium Network Profile注：老款550G月流量</code></pre><p><a href="https://www.dmit.io/aff.php?aff=4132&amp;pid=183" target="_blank">点击购买</a></p><h3 id="%E7%A1%AC%E4%BB%B6" tabindex="-1">硬件</h3><pre><code class="language-bash">curl -sL yabs.sh | bash -s -- -id5</code></pre><p><img src="https://img.imgdd.com/f210f3.e71f5e5e-444a-4e1f-8204-6538ca56801f.png" alt="截屏2024-12-26 20.07.57.png" /></p><h3 id="%E5%9B%9E%E7%A8%8B" tabindex="-1">回程</h3><pre><code class="language-bash">curl http://tutu.ovh/bash/returnroute/test.sh|bash</code></pre><p><img src="https://img.imgdd.com/f210f3.fbbb9ae5-116b-44d0-b407-f1979009ed1b.png" alt="截屏2024-12-26 20.11.46.png" /></p><h3 id="%E5%A4%9A%E5%AA%92%E4%BD%93%E8%A7%A3%E9%94%81" tabindex="-1">多媒体解锁</h3><pre><code class="language-bash">bash &lt;(curl -L -s https://raw.githubusercontent.com/lmc999/RegionRestrictionCheck/main/check.sh)</code></pre><p><img src="https://img.imgdd.com/f210f3.529b7f6b-2301-4e83-8953-6af116f4ec11.png" alt="截屏2024-12-26 20.08.44.png" /></p>]]>
                    </description>
                    <pubDate>Thu, 26 Dec 2024 20:27:08 CST</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[【搬瓦工上新】MINIBOX 27刀 CN2 GIA]]>
                    </title>
                    <link>https://blog.houhaibushihai.me/archives/minibox-10-512</link>
                    <description>
                            <![CDATA[<h2 id="%E9%85%8D%E7%BD%AE" tabindex="-1">配置</h2><table><thead><tr><th>名称</th><th>MINIBOX-10-512</th></tr></thead><tbody><tr><td>CPU</td><td>1x Epyc</td></tr><tr><td>内存RAM</td><td>512 MB</td></tr><tr><td>硬盘</td><td>10 GB RAID-10</td></tr><tr><td>流量</td><td>500G/月</td></tr><tr><td>带宽</td><td>1 Gbps</td></tr><tr><td>数据中心</td><td>DC99(USCA_99)</td></tr><tr><td>线路(回程)</td><td>CN2 GIA</td></tr><tr><td>线路(去程)</td><td>电信CN2GIA+联通CU4837+移动CMIN2</td></tr><tr><td>价格</td><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>29</mn><mi mathvariant="normal">/</mi><mtext>年</mtext><mo stretchy="false">(</mo><mtext>实付</mtext><mn>27</mn></mrow><annotation encoding="application/x-tex">29/年(实付27</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">2</span><span class="mord">9</span><span class="mord">/</span><span class="mord cjk_fallback">年</span><span class="mopen">(</span><span class="mord cjk_fallback">实</span><span class="mord cjk_fallback">付</span><span class="mord">2</span><span class="mord">7</span></span></span></span>)</td></tr><tr><td>折扣码</td><td><strong>BWHCGLUKKB</strong> (-6.77%)</td></tr></tbody></table><h2 id="%E8%B4%AD%E4%B9%B0" tabindex="-1">购买</h2><ul><li><a href="https://bwh81.net/aff.php?aff=69792&amp;pid=151" target="_blank">点击购买</a></li><li>优惠码：<strong>BWHCGLUKKB</strong></li><li>邀请码：<strong>bwh_qeloGgVp2EkU67jKm4NvaBgPEGIv</strong></li></ul><h2 id="%E5%85%B6%E5%AE%83" tabindex="-1">其它</h2><p>网络解锁情况：ChatGPT是DNS解锁，谷歌Gemini原生解锁，迪斯尼看不了，奈飞只能看自制剧和DC6机房一样</p><p><img src="https://990599.xyz/wp-content/uploads/2024/11/bwh-mediaunlock-dc99.jpg" alt="" /></p><p>三网回程情况：三网CN2GIA回程，电信CN2GIA去程，联通4837去程，移动CMIN2去程，可以说非常的硬</p><p><img src="https://990599.xyz/wp-content/uploads/2024/11/bwh-trace-dc99.jpg" alt="" /></p><p>上海大出口，直连洛杉矶</p><p><img src="https://boat.990599.xyz/20241113-nexttrace.png" alt="" /></p><p>IP质量</p><p><img src="https://990599.xyz/wp-content/uploads/2024/11/bwh-IP-dc99.jpg" alt="" /></p><p>融合怪硬件测试：新硬件，CPU是EPYC 7003系列，硬盘IO很好，终于弃用E5了</p><p><img src="https://990599.xyz/wp-content/uploads/2024/11/bwh-hard-dc99.jpg" alt="" /></p><p>油管打开基本是转1个圈圈就打开，速度能达到8w起，看4K没啥压力<br />打开小飞机也是秒开，没转圈圈（可能我是会员？），刷twitter的feed流也是很流畅，打开instagram的图片也是点哪开哪</p><p><img src="https://boat.990599.xyz/20241113-you1tube-test1.png" alt="" /></p>]]>
                    </description>
                    <pubDate>Wed, 25 Dec 2024 22:34:37 CST</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[编程语言各种运算符优先级]]>
                    </title>
                    <link>https://blog.houhaibushihai.me/archives/bian-cheng-yu-yan-ge-zhong-yun-suan-fu-you-xian-ji</link>
                    <description>
                            <![CDATA[<p>不同编程语言的运算符优先级可能会有细微差别，但大多数编程语言（如C、C++、Java、Python等）共享一些共同的运算符优先级规则。以下是常见运算符按优先级从高到低的顺序排列：</p><ol><li><p><strong>括号</strong></p><ul><li><code>()</code>：括号，用于改变默认的运算顺序</li></ul></li><li><p><strong>一元运算符</strong></p><ul><li><code>++</code>、<code>--</code>：前置自增、自减（如：<code>++a</code>）</li><li><code>+</code>、<code>-</code>：正负号（如：<code>+a</code>、<code>-a</code>）</li><li><code>!</code>：逻辑非（如：<code>!a</code>）</li><li><code>~</code>：按位非（如：<code>~a</code>）</li></ul></li><li><p><strong>乘法和除法</strong></p><ul><li><code>*</code>：乘法（如：<code>a * b</code>）</li><li><code>/</code>：除法（如：<code>a / b</code>）</li><li><code>%</code>：取余（如：<code>a % b</code>）</li></ul></li><li><p><strong>加法和减法</strong></p><ul><li><code>+</code>：加法（如：<code>a + b</code>）</li><li><code>-</code>：减法（如：<code>a - b</code>）</li></ul></li><li><p><strong>移位运算符</strong></p><ul><li><code>&lt;&lt;</code>：左移（如：<code>a &lt;&lt; b</code>）</li><li><code>&gt;&gt;</code>：右移（如：<code>a &gt;&gt; b</code>）</li></ul></li><li><p><strong>关系运算符</strong></p><ul><li><code>&lt;</code>、<code>&gt;</code>、<code>&lt;=</code>、<code>&gt;=</code>：小于、大于、小于等于、大于等于（如：<code>a &lt; b</code>）</li></ul></li><li><p><strong>相等性运算符</strong></p><ul><li><code>==</code>：等于（如：<code>a == b</code>）</li><li><code>!=</code>：不等于（如：<code>a != b</code>）</li></ul></li><li><p><strong>按位与</strong></p><ul><li><code>&amp;</code>：按位与（如：<code>a &amp; b</code>）</li></ul></li><li><p><strong>按位异或</strong></p><ul><li><code>^</code>：按位异或（如：<code>a ^ b</code>）</li></ul></li><li><p><strong>按位或</strong></p><ul><li><code>|</code>：按位或（如：<code>a | b</code>）</li></ul></li><li><p><strong>逻辑与</strong></p><ul><li><code>&amp;&amp;</code>：逻辑与（如：<code>a &amp;&amp; b</code>）</li></ul></li><li><p><strong>逻辑或</strong></p><ul><li><code>||</code>：逻辑或（如：<code>a || b</code>）</li></ul></li><li><p><strong>条件运算符</strong></p><ul><li><code>?:</code>：条件运算符（如：<code>a ? b : c</code>）</li></ul></li><li><p><strong>赋值运算符</strong></p><ul><li><code>=</code>、<code>+=</code>、<code>-=</code>、<code>*=</code>、<code>/=</code>、<code>%=</code>、<code>&lt;&lt;=</code>、<code>&gt;&gt;=</code>、<code>&amp;=</code>、<code>^=</code>、<code>|=</code>：赋值运算符（如：<code>a = b</code>，<code>a += b</code>）</li></ul></li><li><p><strong>逗号运算符</strong></p><ul><li><code>,</code>：逗号运算符（如：<code>a = (b, c)</code>）</li></ul></li></ol><p>这些是大多数编程语言中通用的运算符优先级规则，但具体到某一编程语言，可能会有一些细微的差异。因此，在编写代码时，最好查阅对应编程语言的官方文档以确认具体的运算符优先级。</p>]]>
                    </description>
                    <pubDate>Thu, 27 Jun 2024 18:04:45 CST</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[C++ 指针和常量混合定义时的解读]]>
                    </title>
                    <link>https://blog.houhaibushihai.me/archives/c-zhi-zhen-he-chang-liang-xiu-shi-shi-de-jie-du</link>
                    <description>
                            <![CDATA[<blockquote><p>理解的时候从左往右一层一层解读</p></blockquote><h2 id="i-const-int-*-const-*-const-x%3B-%E4%BB%80%E4%B9%88%E6%84%8F%E6%80%9D%EF%BC%9F" tabindex="-1">I <code>const int * const * const x;</code> 什么意思？</h2><p>在C++中，声明 <code>const int * const * const x;</code> 可能会因为多重使用 <code>const</code> 而显得非常混乱。我们可以逐步分解来理解：</p><ol><li><p><code>const int</code> - 这指定了指向的整数是常量，不能被修改。</p></li><li><p><code>const int *</code> - 这是一个指向常量整数的指针。通过这个指针，不能修改其指向的整数值。</p></li><li><p><code>const int * const</code> - 这是一个指向常量整数的常量指针。这个指针本身不能被更改指向另一个整数，而且它所指向的整数值也不能被修改。</p></li><li><p><code>const int * const *</code> - 这是一个指向常量指针（指向常量整数）的指针。这个指针可以指向不同的常量指针（这些常量指针不能改变它们的目标整数，目标整数也不能被修改）。</p></li><li><p><code>const int * const * const x</code> - 这是一个指向指向常量指针（指向常量整数）的常量指针。换句话说，<code>x</code> 是一个常量指针，所以 <code>x</code> 本身不能被改变为指向其他位置。<code>*x</code> 也是一个常量指针，意味着 <code>x</code> 所指向的指针不能改变。最后，这个二级指针所指向的整数值也是常量，不能被修改。</p></li></ol><p>让我们一步步分解：</p><ul><li>第一个 <code>const</code>（最接近 <code>x</code>）表示 <code>x</code> 本身是一个常量指针。你不能改变 <code>x</code> 指向其他东西。</li><li>第二个 <code>const</code>（在 <code>* const * const x</code> 之前）表示 <code>*x</code> 是一个常量指针。你不能改变 <code>x</code> 指向的指针的值。</li><li>第三个 <code>const</code>（在 <code>int *</code> 之前）表示 <code>**x</code> 指向的是一个常量整数。你不能修改 <code>**x</code> 所指向的整数值。</li></ul><p>这里有一个图示帮助理解：</p><pre><code class="language-">x -&gt; const int * const -&gt; const int</code></pre><p>总之，<code>x</code> 是一个指向常量指针（指向常量整数）的常量指针。<code>x</code> 和它所指向的指针都不能被改变，最终指向的整数值也是不可变的。</p><h2 id="ii-const-int-**x%3B-%E4%BB%80%E4%B9%88%E6%84%8F%E6%80%9D%EF%BC%9F%E6%98%AF%E5%90%A6%E5%92%8C-const-int-*-const-*-const-x%3B-%E7%AD%89%E4%BB%B7%EF%BC%9F" tabindex="-1">II <code>const int **x;</code> 什么意思？是否和 <code>const int * const * const x;</code> 等价？</h2><p><code>const int **x;</code> 和 <code>const int * const * const x;</code> 是两种不同的声明，它们并不等价。我们逐一分析这两种声明的含义：</p><h3 id="const-int-**x" tabindex="-1"><code>const int **x</code></h3><ol><li><code>int</code> - 表示一个整数。</li><li><code>const int</code> - 表示一个常量整数。</li><li><code>const int *</code> - 表示一个指向常量整数的指针。</li><li><code>const int **</code> - 表示一个指向指向常量整数的指针的指针。</li></ol><p>也就是说，<code>x</code> 是一个指针，指向一个指针，该指针指向一个常量整数。在这种情况下：</p><ul><li>你可以改变 <code>x</code> 指向的指针（即 <code>x</code> 可以指向不同的指针）。</li><li>你可以改变 <code>*x</code> 指向的指针（即 <code>*x</code> 可以指向不同的 <code>const int</code> 指针）。</li><li>你不能改变 <code>**x</code> 所指向的整数值，因为它是一个常量整数。</li></ul><h3 id="const-int-*-const-*-const-x" tabindex="-1"><code>const int * const * const x</code></h3><ol><li><code>const int</code> - 表示一个常量整数。</li><li><code>const int *</code> - 表示一个指向常量整数的指针。</li><li><code>const int * const</code> - 表示一个常量指针，指向常量整数。</li><li><code>const int * const *</code> - 表示一个指向常量指针（指向常量整数）的指针。</li><li><code>const int * const * const</code> - 表示一个常量指针，指向一个常量指针（指向常量整数）。</li></ol><p>在这种情况下：</p><ul><li><code>x</code> 是一个常量指针，不能改变它指向的地址。</li><li><code>*x</code> 也是一个常量指针，不能改变它指向的地址。</li><li><code>**x</code> 是一个常量整数，不能改变它的值。</li></ul><h3 id="%E6%80%BB%E7%BB%93" tabindex="-1">总结</h3><ul><li><code>const int **x</code> 表示 <code>x</code> 是一个指向指向常量整数的指针的指针。你可以改变 <code>x</code> 和 <code>*x</code> 的指向，但不能改变 <code>**x</code> 指向的整数值。</li><li><code>const int * const * const x</code> 表示 <code>x</code> 是一个常量指针，指向一个常量指针，该常量指针指向一个常量整数。你不能改变 <code>x</code>、<code>*x</code> 或 <code>**x</code> 的指向或值。</li></ul><p>这两者在语义和用途上完全不同，因此不等价。</p><h2 id="iii-const-int**-x%3B-%E5%92%8C-const-int-**x%3B-%E6%9C%89%E5%8C%BA%E5%88%AB%E5%90%97%EF%BC%9F" tabindex="-1">III <code>const int** x;</code> 和 <code>const int **x;</code> 有区别吗？</h2><p><code>const int** x;</code> 和 <code>const int **x;</code> 在C++中是等价的。它们都表示一个指向指向常量整数的指针的指针。</p><h3 id="%E8%A7%A3%E9%87%8A" tabindex="-1">解释</h3><ul><li><code>const int</code> - 表示一个常量整数。</li><li><code>const int *</code> - 表示一个指向常量整数的指针。</li><li><code>const int **</code> - 表示一个指向指向常量整数的指针的指针。</li></ul><p>无论空格如何，<code>const int** x;</code> 和 <code>const int **x;</code> 都意味着 <code>x</code> 是一个指向指针的指针，该指针指向一个 <code>const int</code> 类型的常量整数。因此，空格在这种情况下不会影响声明的含义。</p><p>为了更清楚地理解，下面是一些示例：</p><h3 id="%E7%A4%BA%E4%BE%8B%E4%BB%A3%E7%A0%81" tabindex="-1">示例代码</h3><pre><code class="language-cpp">const int a = 10;      // a 是一个常量整数const int *p = &amp;a;     // p 是一个指向常量整数的指针const int **x = &amp;p;    // x 是一个指向指向常量整数的指针的指针</code></pre><p>上述代码中的 <code>const int** x</code> 和 <code>const int **x</code> 在功能和用途上没有任何区别。</p><h3 id="%E7%BB%93%E8%AE%BA" tabindex="-1">结论</h3><p>在C++中，空格在声明中的位置对于类型定义没有影响。<code>const int** x;</code> 和 <code>const int **x;</code> 是完全等价的声明，表示 <code>x</code> 是一个指向指向常量整数的指针的指针。</p><h2 id="iv-%E6%9B%B4%E6%8E%A8%E8%8D%90%E5%93%AA%E7%A7%8D%E5%86%99%E6%B3%95%EF%BC%9F" tabindex="-1">IV 更推荐哪种写法？</h2><p>在C++中，推荐的写法主要取决于代码的可读性和一致性。虽然 <code>const int** x;</code> 和 <code>const int **x;</code> 在语义上是等价的，通常建议遵循一些通用的编码风格指南来提高代码的可读性。</p><h3 id="%E6%8E%A8%E8%8D%90%E7%9A%84%E5%86%99%E6%B3%95" tabindex="-1">推荐的写法</h3><ol><li><strong>使用一致的空格</strong>：通常建议在指针声明中保持空格的一致性。这可以提高代码的可读性，让其他开发者更容易理解代码。</li><li><strong>靠近类型修饰符</strong>：将 <code>const</code> 放在它修饰的类型旁边，可以更清晰地表示它修饰的对象。</li></ol><p>例如：</p><pre><code class="language-cpp">const int** x;  // 推荐</code></pre><h3 id="%E5%85%B7%E4%BD%93%E5%BB%BA%E8%AE%AE" tabindex="-1">具体建议</h3><ol><li><p><strong>将 <code>const</code> 放在靠近它修饰的类型旁边</strong>：这使得代码更易于理解。例如，<code>const int*</code> 清楚地表示这是一个指向 <code>const int</code> 的指针。</p></li><li><p><strong>在星号前后保持一致的空格</strong>：这通常是团队一致约定的编码风格。例如：</p><ul><li><code>const int* const* const x;</code>（如果团队习惯不在星号前后加空格）</li><li>或 <code>const int * const * const x;</code>（如果团队习惯在星号前后加空格）</li></ul></li></ol><h3 id="%E7%A4%BA%E4%BE%8B" tabindex="-1">示例</h3><p>推荐的写法是：</p><pre><code class="language-cpp">const int **x;  // 推荐的写法，清晰地表示 x 是一个指向指向常量整数的指针的指针</code></pre><h3 id="%E4%BB%A3%E7%A0%81%E9%A3%8E%E6%A0%BC%E4%B8%80%E8%87%B4%E6%80%A7" tabindex="-1">代码风格一致性</h3><p>无论选择哪种方式，最重要的是在整个代码库中保持一致的风格。这有助于提高代码的可维护性和可读性。通常，团队会有自己的编码规范，可以参考这些规范来决定具体的书写风格。</p><p>总结来说，在指针声明中保持空格的一致性并将 <code>const</code> 放在靠近它修饰的类型旁边是推荐的做法。具体选择哪种风格可以根据团队的编码规范来决定。</p><h2 id="v-int-const-**x%3B-%E5%92%8C-int**-const-x%3B-%E7%AD%89%E4%BB%B7%E5%90%97%EF%BC%9F%E6%9B%B4%E6%8E%A8%E8%8D%90%E5%93%AA%E7%A7%8D%E5%86%99%E6%B3%95%EF%BC%9F" tabindex="-1">V <code>int const **x;</code> 和 <code>int** const x;</code> 等价吗？更推荐哪种写法？</h2><p><code>int const **x;</code> 和 <code>int** const x;</code> 在C++中是不等价的。这两种声明表达了不同的含义。</p><h3 id="int-const-**x%3B" tabindex="-1"><code>int const **x;</code></h3><ol><li><code>int const</code> 或 <code>const int</code> 是一个常量整数，表示整数值不能被修改。</li><li><code>int const *</code> 或 <code>const int *</code> 是一个指向常量整数的指针。</li><li><code>int const **x</code> 或 <code>const int **x</code> 是一个指向指向常量整数的指针的指针。</li></ol><p>这意味着 <code>x</code> 是一个指针，指向一个指向 <code>const int</code> 的指针。你可以改变 <code>x</code> 指向的指针以及该指针指向的指针，但不能改变 <code>**x</code> 所指向的整数值。</p><h3 id="int**-const-x%3B" tabindex="-1"><code>int** const x;</code></h3><ol><li><code>int**</code> 是一个指向指针的指针，指向一个普通的整数。</li><li><code>int** const x</code> 表示 <code>x</code> 是一个常量指针，指向一个指向整数的指针。</li></ol><p>这意味着 <code>x</code> 是一个常量指针，指向一个指向 <code>int</code> 的指针。你不能改变 <code>x</code> 本身指向的地址，但你可以改变 <code>*x</code> 和 <code>**x</code> 所指向的整数值。</p><h3 id="%E5%85%B7%E4%BD%93%E5%8C%BA%E5%88%AB" tabindex="-1">具体区别</h3><ul><li><code>int const **x;</code> 表示 <code>x</code> 是一个可以改变的指针，指向一个可以改变的指针，但最终指向的整数值不能改变。</li><li><code>int** const x;</code> 表示 <code>x</code> 是一个常量指针，不能改变其指向，但可以改变它所指向的指针以及指针指向的整数值。</li></ul><h3 id="%E7%A4%BA%E4%BE%8B%E4%BB%A3%E7%A0%81-1" tabindex="-1">示例代码</h3><pre><code class="language-cpp">#include &lt;iostream&gt;using namespace std;int main() {    // int const **x example    int const a = 10;    int const b = 20;    int const *p1 = &amp;a;    int const *p2 = &amp;b;    int const **x = &amp;p1;    cout &lt;&lt; &amp;a &lt;&lt; &quot; &quot; &lt;&lt; p1 &lt;&lt; &quot; &quot; &lt;&lt; &amp;p1 &lt;&lt; &quot; &quot; &lt;&lt; x &lt;&lt; &quot; &quot; &lt;&lt; *x &lt;&lt; endl;        cout &lt;&lt; p2 &lt;&lt; &quot; &quot; &lt;&lt; &amp;p2 &lt;&lt; endl;    x = &amp;p2;  // OK: you can change the pointer x points to    // **x = 30;  // Error: you cannot change the value of const int    cout &lt;&lt; &amp;b &lt;&lt; &quot; &quot; &lt;&lt; p2 &lt;&lt; &quot; &quot; &lt;&lt; &amp;p2 &lt;&lt; &quot; &quot; &lt;&lt; x &lt;&lt; &quot; &quot; &lt;&lt; *x &lt;&lt; endl;        // int** const x example    int c = 30;    int d = 40;    int *p3 = &amp;c;    int *p4 = &amp;d;    int** const y = &amp;p3;    // y = &amp;p4;  // Error: you cannot change the value of the const pointer y    *y = p4;   // OK: you can change the pointer y points to    **y = 50;  // OK: you can change the value of the pointed integer    return 0;}</code></pre><h3 id="%E6%9B%B4%E6%8E%A8%E8%8D%90%E5%93%AA%E7%A7%8D%E5%86%99%E6%B3%95" tabindex="-1">更推荐哪种写法</h3><p>哪个写法更好取决于你的需求：</p><ul><li>如果你需要一个可以改变的指针，指向一个指向常量整数的指针，使用 <code>int const **x;</code>。</li><li>如果你需要一个常量指针，指向一个可以改变的指向整数的指针，使用 <code>int** const x;</code>。</li></ul><p>在实际使用中，建议选择适合语义的声明，并在团队中保持一致的编码风格。一般来说，尽量使代码的意图清晰易懂是最重要的。</p>]]>
                    </description>
                    <pubDate>Tue, 25 Jun 2024 13:22:42 CST</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[Java main 方法]]>
                    </title>
                    <link>https://blog.houhaibushihai.me/archives/javamain-fang-fa</link>
                    <description>
                            <![CDATA[<h3 id="java-main-%E6%96%B9%E6%B3%95%E4%B8%BA%E4%BB%80%E4%B9%88%E4%B8%80%E5%AE%9A%E8%A6%81%E6%98%AF-static" tabindex="-1">Java main 方法为什么一定要是 static</h3><p>在Java中，<code>main</code>方法之所以必须是<code>static</code>的，主要原因是为了让Java虚拟机（JVM）能够在不创建类的实例的情况下调用它。以下是详细原因：</p><ol><li><p><strong>启动程序的入口点</strong>：<code>main</code>方法是Java程序的入口点。当JVM启动一个Java应用程序时，它需要一个明确的入口点来开始执行代码。通过定义一个标准的静态<code>main</code>方法，JVM能够找到并调用它以启动程序。</p></li><li><p><strong>不需要对象实例</strong>：如果<code>main</code>方法不是静态的，那么在调用它之前必须创建类的实例。然而，在程序启动时，JVM还没有任何对象实例。因此，将<code>main</code>方法定义为静态方法，使得JVM可以在没有对象实例的情况下直接调用它。</p></li><li><p><strong>类加载过程</strong>：在Java中，类的加载和对象的创建是分开的过程。JVM首先加载类，然后可以在需要时创建该类的实例。静态方法在类加载时就可以使用，不需要等到对象实例创建之后。</p></li><li><p><strong>一致性和标准化</strong>：Java语言设计者规定<code>main</code>方法必须是静态的，并且有一个标准的签名（<code>public static void main(String[] args)</code>），这为所有Java应用程序提供了一致的入口点。这种标准化使得工具、框架和JVM都可以一致地处理Java程序的启动过程。</p></li></ol><pre><code class="language-java">public class HelloWorld {    public static void main(String[] args) {        System.out.println(&quot;Hello, World!&quot;);    }}</code></pre><p>以上代码中，<code>main</code>方法是静态的，因此JVM可以在没有创建<code>HelloWorld</code>类的实例的情况下直接调用<code>main</code>方法并执行程序。</p><p>总结来说，<code>main</code>方法必须是<code>static</code>的原因是为了使JVM能够在没有对象实例的情况下调用它，从而顺利地启动程序。这种设计简化了程序启动过程，并确保了一致的入口点。</p><h3 id="%E9%9D%99%E6%80%81%E7%9A%84-main-%E6%96%B9%E6%B3%95%E4%B8%BA%E4%BB%80%E4%B9%88%E5%8F%AF%E4%BB%A5%E8%AE%BF%E9%97%AE%E9%9D%9E%E9%9D%99%E6%80%81%E6%88%90%E5%91%98" tabindex="-1">静态的 main 方法为什么可以访问非静态成员</h3><p>在Java中，静态的<code>main</code>方法可以间接访问非静态成员，但不能直接访问它们。这是因为静态方法属于类本身，而非静态成员（方法和变量）属于类的实例。要访问非静态成员，必须先创建该类的实例。</p><h3 id="%E7%9B%B4%E6%8E%A5%E8%AE%BF%E9%97%AE%E4%B8%8E%E9%97%B4%E6%8E%A5%E8%AE%BF%E9%97%AE" tabindex="-1">直接访问与间接访问</h3><ol><li><p><strong>直接访问</strong>：在静态方法中，不能直接访问非静态成员。</p><pre><code class="language-java">public class Example {    private int instanceVariable = 42;    public void instanceMethod() {        System.out.println(&quot;Instance Method&quot;);    }    public static void main(String[] args) {        // 以下直接访问非静态成员的代码会导致编译错误        // System.out.println(instanceVariable);        // instanceMethod();    }}</code></pre></li><li><p><strong>间接访问</strong>：在静态方法中，通过创建类的实例，可以间接访问非静态成员。</p><pre><code class="language-java">public class Example {    private int instanceVariable = 42;    public void instanceMethod() {        System.out.println(&quot;Instance Method&quot;);    }    public static void main(String[] args) {        // 创建类的实例        Example example = new Example();                // 通过实例访问非静态成员        System.out.println(example.instanceVariable); // 输出: 42        example.instanceMethod(); // 输出: Instance Method    }}</code></pre></li></ol><h3 id="%E7%90%86%E7%94%B1%E8%A7%A3%E9%87%8A" tabindex="-1">理由解释</h3><ul><li><p><strong>静态上下文和非静态成员</strong>：静态方法和静态变量属于类本身，而非静态成员属于类的实例。静态方法在类加载时就可以调用，而非静态成员只有在类的实例创建之后才存在。因此，在静态方法中不能直接访问非静态成员，因为此时可能还没有创建任何实例。</p></li><li><p><strong>对象实例化</strong>：通过在静态方法中创建类的实例，可以通过这个实例访问非静态成员。这是因为实例创建之后，非静态成员变得可用。</p></li></ul><p>通过这种方式，静态<code>main</code>方法可以间接访问非静态成员，从而执行需要的操作。这种设计确保了静态方法在没有实例的情况下可以调用，同时仍然允许在需要时通过实例来访问和操作非静态成员。</p>]]>
                    </description>
                    <pubDate>Mon, 24 Jun 2024 10:28:40 CST</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[Java 四种访问控制符]]>
                    </title>
                    <link>https://blog.houhaibushihai.me/archives/java-si-zhong-fang-wen-kong-zhi-fu</link>
                    <description>
                            <![CDATA[<p>在Java中，有四种访问控制符，它们分别是<code>public</code>、<code>protected</code>、<code>default</code>（包级私有，未使用任何修饰符）、<code>private</code>。每种访问控制符决定了类、变量、方法和构造函数的可见性和访问权限。下面详细介绍每种访问控制符的作用范围和使用场景：</p><h3 id="1.-public" tabindex="-1">1. <code>public</code></h3><ul><li><strong>作用范围</strong>：<code>public</code>修饰的成员可以被任何其他类访问，不论它们是否在同一个包中。</li><li><strong>使用场景</strong>：<ul><li>公共的API方法和类：希望被所有其他类使用的功能性方法和类。</li><li>常量：需要全局访问的常量通常被声明为<code>public</code>且是<code>static final</code>。</li></ul></li></ul><pre><code class="language-java">public class Example {    public int publicVar = 10;    public void publicMethod() {        System.out.println(&quot;This is a public method.&quot;);    }}// 其他类访问class Test {    public static void main(String[] args) {        Example example = new Example();        System.out.println(example.publicVar); // 访问public变量        example.publicMethod(); // 调用public方法    }}</code></pre><h3 id="2.-private" tabindex="-1">2. <code>private</code></h3><ul><li><strong>作用范围</strong>：<code>private</code>修饰的成员只能在它们所在的类内部访问，不能在类外部访问，即使是在同一个包中。</li><li><strong>使用场景</strong>：<ul><li>封装：隐藏类的实现细节，防止外部直接访问类的内部数据。</li><li>内部方法和变量：只在类内部使用的方法和变量。</li></ul></li></ul><pre><code class="language-java">public class Example {    private int privateVar = 10;    private void privateMethod() {        System.out.println(&quot;This is a private method.&quot;);    }    public int getPrivateVar() {        return privateVar;    }    public void setPrivateVar(int privateVar) {        this.privateVar = privateVar;    }}// 其他类访问class Test {    public static void main(String[] args) {        Example example = new Example();        // System.out.println(example.privateVar); // 错误：private变量无法访问        System.out.println(example.getPrivateVar()); // 通过public方法访问private变量    }}</code></pre><h3 id="3.-protected" tabindex="-1">3. <code>protected</code></h3><ul><li><strong>作用范围</strong>：<code>protected</code>修饰的成员可以在同一个包中的其他类以及不同包中的子类访问。</li><li><strong>使用场景</strong>：<ul><li>继承：希望子类能访问的成员。</li><li>同包访问：希望同一个包中的其他类也能访问的成员。</li></ul></li></ul><pre><code class="language-java">public class Example {    protected int protectedVar = 10;    protected void protectedMethod() {        System.out.println(&quot;This is a protected method.&quot;);    }}// 同一个包中的其他类访问class Test {    public static void main(String[] args) {        Example example = new Example();        System.out.println(example.protectedVar); // 访问protected变量        example.protectedMethod(); // 调用protected方法    }}// 不同包中的子类访问package different;import Example;public class SubExample extends Example {    public void accessProtected() {        System.out.println(protectedVar); // 访问protected变量        protectedMethod(); // 调用protected方法    }}</code></pre><h3 id="4.-default%EF%BC%88%E5%8C%85%E7%BA%A7%E7%A7%81%E6%9C%89%EF%BC%89" tabindex="-1">4. <code>default</code>（包级私有）</h3><ul><li><strong>作用范围</strong>：未使用任何访问控制修饰符（即“默认”访问级别）修饰的成员只能在同一个包中的其他类访问。</li><li><strong>使用场景</strong>：<ul><li>包级访问：希望同一个包中的其他类能访问，但不同包中的类不能访问。</li></ul></li></ul><pre><code class="language-java">class Example {    int defaultVar = 10; // 默认访问级别    void defaultMethod() {        System.out.println(&quot;This is a default method.&quot;);    }}// 同一个包中的其他类访问class Test {    public static void main(String[] args) {        Example example = new Example();        System.out.println(example.defaultVar); // 访问default变量        example.defaultMethod(); // 调用default方法    }}// 不同包中的类无法访问package different;import Example;public class DifferentClass {    public void accessDefault() {        Example example = new Example();        // System.out.println(example.defaultVar); // 错误：default变量无法访问        // example.defaultMethod(); // 错误：default方法无法访问    }}</code></pre><h3 id="%E6%80%BB%E7%BB%93" tabindex="-1">总结</h3><ul><li><p><strong><code>public</code></strong>:</p><ul><li><strong>作用范围</strong>：任何地方都可以访问。</li><li><strong>使用场景</strong>：公共API、常量、希望全局访问的类和方法。</li></ul></li><li><p><strong><code>private</code></strong>:</p><ul><li><strong>作用范围</strong>：只能在类内部访问。</li><li><strong>使用场景</strong>：封装内部数据和方法。</li></ul></li><li><p><strong><code>protected</code></strong>:</p><ul><li><strong>作用范围</strong>：同一个包中的其他类和不同包中的子类可以访问。</li><li><strong>使用场景</strong>：继承中使用，允许子类访问的成员。</li></ul></li><li><p><strong><code>default</code></strong>（包级私有）：</p><ul><li><strong>作用范围</strong>：同一个包中的其他类可以访问。</li><li><strong>使用场景</strong>：包级访问，隐藏实现细节但允许包内共享。</li></ul></li></ul>]]>
                    </description>
                    <pubDate>Mon, 24 Jun 2024 10:12:50 CST</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[Java static 作用范围]]>
                    </title>
                    <link>https://blog.houhaibushihai.me/archives/javastatic-zuo-yong-fan-wei</link>
                    <description>
                            <![CDATA[<p>在Java中，<code>static</code>关键字用于修饰类的成员（变量和方法）以及代码块，定义它们的作用范围和生命周期。具体来说，<code>static</code>关键字的作用范围和影响如下：</p><h3 id="%E9%9D%99%E6%80%81%E5%8F%98%E9%87%8F%EF%BC%88static-variable%EF%BC%89" tabindex="-1">静态变量（static variable）</h3><ul><li><strong>作用范围</strong>：静态变量属于类而不是类的实例（对象）。它在类加载时被初始化，可以通过类名直接访问，甚至在没有创建类的实例时也可以访问。</li><li><strong>生命周期</strong>：静态变量在整个应用程序运行期间都存在，直到类被卸载。</li><li><strong>共享性</strong>：所有实例共享同一个静态变量，修改其中一个实例中的静态变量会影响到所有实例。</li></ul><pre><code class="language-java">class Example {    static int staticVar = 10;    public static void main(String[] args) {        System.out.println(Example.staticVar); // 访问静态变量    }}</code></pre><h3 id="%E9%9D%99%E6%80%81%E6%96%B9%E6%B3%95%EF%BC%88static-method%EF%BC%89" tabindex="-1">静态方法（static method）</h3><ul><li><strong>作用范围</strong>：静态方法属于类而不是类的实例。它可以通过类名直接调用。</li><li><strong>限制</strong>：静态方法不能访问非静态成员（实例变量和实例方法），因为静态方法在类加载时已经存在，而非静态成员只有在实例化对象后才存在。静态方法中不能使用<code>this</code>关键字。</li><li><strong>典型用途</strong>：静态方法常用于定义工具类方法（如<code>Math</code>类中的<code>Math.abs()</code>）和工厂方法。</li></ul><pre><code class="language-java">class Example {    static void staticMethod() {        System.out.println(&quot;This is a static method.&quot;);    }    public static void main(String[] args) {        Example.staticMethod(); // 调用静态方法    }}</code></pre><h3 id="%E9%9D%99%E6%80%81%E4%BB%A3%E7%A0%81%E5%9D%97%EF%BC%88static-block%EF%BC%89" tabindex="-1">静态代码块（static block）</h3><ul><li><strong>作用范围</strong>：静态代码块用于在类加载时执行初始化代码。它会在类被加载到内存时自动执行，且只执行一次。</li><li><strong>典型用途</strong>：静态代码块通常用于初始化静态变量或进行类级别的初始化。</li></ul><pre><code class="language-java">class Example {    static int staticVar;        static {        staticVar = 10; // 静态代码块初始化静态变量        System.out.println(&quot;Static block executed.&quot;);    }    public static void main(String[] args) {        System.out.println(Example.staticVar); // 访问静态变量    }}</code></pre><h3 id="%E6%80%BB%E7%BB%93" tabindex="-1">总结</h3><ol><li><strong>静态变量</strong>：类级别变量，所有实例共享，类加载时初始化。</li><li><strong>静态方法</strong>：类级别方法，不依赖实例调用，不能访问非静态成员。</li><li><strong>静态代码块</strong>：类加载时执行，用于初始化类级别资源。</li></ol><p>理解<code>static</code>关键字在Java中的作用范围和使用场景，可以帮助你更好地设计类和方法，提高代码的可读性和效率。</p>]]>
                    </description>
                    <pubDate>Mon, 24 Jun 2024 09:59:33 CST</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[哥哥]]>
                    </title>
                    <link>https://blog.houhaibushihai.me/archives/ge-ge</link>
                    <description>
                            <![CDATA[<p>作者 刘铮 2012 年 8 月发布于<a href="https://weibo.com/1716488301/zBYIXdosy" target="_blank">人人网</a></p><h1 id="%E4%B8%80" tabindex="-1">一</h1><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><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><p>武大经常担心武松饭量大吃不饱。</p><p>武大有时卖着饼也会向人夸口自己有个弟弟能把三百斤的大石抛起作耍。</p><p>天整个昏暗了，大雨似泼地般倾下，耳里净是哗哗的雨声。</p><p>两人等乏了，索性坐在门前的台阶上。武松身上的衣服是新做的，尽管这几日被折腾得黯淡了，武大还是舍不得让衣服淋雨。</p><p>“武二啊，我觉得你以后可以当个步兵都头，手下管几十个兵。咱清河县的都头我瞧他在拳脚上就比不过你。”</p><p>“呔，这都头只会每日去衙门画个卯，然后坐下喝茶。真要跟我对上，三拳打得他趴下。当个都头有什么意思，每月领得几个钱？县官家里有宴席时还要在旁边伺候着，跟家仆有什么两样？”武松很嫌弃这个志向。</p><p>武大叹口气：“我是想呐，要是你当了咱清河的都头，能慑得那些地痞无赖少作恶。当年要不是那群泼皮逼咱娘纳捐，娘也不至于累死。我总惦记这事。”</p><p>武松也被触到了伤痛，半响才回话，声音低沉了很多：“我以后会做一个好汉，行走四方，到一地就杀一地的恶霸。我想名扬江湖，受人称赞。我不想当官府的狗。”</p><p>“哟，大英雄是吃我的饼长大的，真是高兴。”</p><h1 id="%E4%BA%8C" tabindex="-1">二</h1><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><p>我晓得自己模样骇人，那主人是要存心作践她。只是既然命里有安排，我就好好待她，须使她不烦恼，她也是苦命的人呐。你嫂嫂做得一手好针线，饭菜也做得好，家里的事样样顾得来，我时时感激她。</p><p>我常向嫂嫂念诵你，今朝望着你来了，她也高兴坏了。</p><p>武大边说话边喝酒，越醉话越多。</p><p>最后武松将他扶上了床，他眼直直地看着武松，嘴里仍自含混不清地念叨：“你嫂嫂跟我说了，亲兄弟不比别人，我为你清了一间房来家里过活，你若不搬来，我两口也吃街坊邻居笑话……”</p><p>武松走时，嫂嫂亲送出门。武松道：“夜深不便，且在衙门里再歇一宿，明日带铺盖行李搬来”。</p><p>妇人道：“叔叔，是必记心，奴家在这里专望。”</p><h1 id="%E4%B8%89" tabindex="-1">三</h1><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><p>只有被武大接到家中吃酒时，武松才觉得真正回到了清河。</p><p>武大攥着他的手直唤弟弟，武大那张丑脸醉得通红，武大含混颠倒地说酒话，胜过所有的赞誉与奖赏。吃饭时突然碗一沉，嫂嫂拣了一大块肉夹给武松，武松只觉得鼻子一酸，借着酒盖脸，赶忙揩眼角，自娘死后再也没有人给他夹过菜。</p><p>如今成了县里的都头，往后每日去衙门画个卯，做好分内的事，与人应酬往来不失身份。等攒够了钱就挨着哥哥起一幢房屋，娶一个勤劳本分的姑娘，生几个孩子，教他们识字打拳。</p><p>下半辈子，武松不图声名与富贵，只求一点关切与真感情，便足以活下去。</p><p>夜深无人，武松踱步在紫石街，数着道旁一间间亲切的店铺：姚二郎的银铺，赵四哥的纸马铺，张叔的馄饨摊，胡太公的冷酒店，徐三的枣糕店，再过去，就是哥哥摆摊的地方……</p><p>等得天明了，又会是热闹祥和的光景。</p><h1 id="%E5%9B%9B" tabindex="-1">四</h1><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><p>“我一见大郎尸首，便知有事。只是衙门上下多于西门庆有交，那武大娘子又是西门庆的姘头，此事全县皆知。我若声张起来无人做主，因此做声不得，只趁烧化时偷拣了两块骨头。这骨头酥黑，验出了砒霜毒，便是个见证。”</p><p>武松脸色凝重，拔了刀，收回袖子里。没想到何九会这么快把事情倒出来，他似乎憋足了力气没处使，反倒不知道说什么。</p><p>武松怔怔地盯着桌上枯焦的骨头。</p><p>“我哥哥……是被砒霜毒死的，死时痛苦吗？”喉头象是被塞了棉花。</p><p>“不敢相瞒，砒霜发作时，必然肠胃迸断，大声叫喊。令兄死于半夜，也许那刻左右邻舍都惊醒……”</p><p>“咣”，武松一拳把酒碗砸得粉碎，虎目含泪，不住颤抖。</p><p>何九不禁战栗：“都头，死生无常，活着的自要过……砒霜毒发极快，大郎或许只受片刻折磨……”</p><p>武松伸手往桌上一兜，拿起骨头放怀里，撇下何九，踉踉跄跄地奔出酒店。不知那是酒醉还是疯癫。</p><h1 id="%E4%BA%94" tabindex="-1">五</h1><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><p>很多年过去了，当年受过的白眼和打过的架武松大多已记不清楚。不知为何，夕阳下武大挑着担儿拉着郓哥的身影却时常记起，反倒愈发真切。</p><p>如今，武松再想起，只觉得那一日的武大的身影有如顶天立地一般。靠蛮力打死老虎并不难，难的是在艰难的世道中委曲求全地活着，成为他人的倚靠。那时，武松喜欢在众人面前举起三百斤的大石博几声叫好，可是相比挑着两担炊饼当街叫卖的哥哥，自己是多么的虚弱与怯懦。</p><p>此时，武松二十六岁，颓然地坐在县衙门前的台阶上，夕阳仍旧斜斜地铺在紫石街，可是望到尽头也望不见武大的身影。武大只剩了两块骸骨在世上，被武松抱在怀里。</p><p>武大不在了，这清河县显得如此陌生，同揭阳镇或柴家庄并无二致。街上行人熙熙攘攘、神情冷漠、各有心事，看不出那个卖炊饼的矮子曾经活过的迹象。</p><p>武松想起从东京回来的那日，街坊邻居怕惹是非，远远望见自己就闭门关窗。回到家中，武松扶着武大牌位，恍惚欲狂，却是沾一手的灰尘，那歹毒妇人又在旁边假哭干嚎令人厌烦。</p><p>自己在各色人等面前仍要礼数周到地逢迎，暗地里却忍不住饮泣，这其中的压抑和苦楚，令壮士胆寒。</p><p>怀里那两块骨头，是扎在武松心头的尖锥。临行时哥哥叮嘱武松要少喝酒，又说记得给嫂嫂从京城带些时兴的胭脂首饰回来。记忆还鲜活，那个憨憨的殷切的人却已被烧化成乌黑的骨殖。</p><p>武松觉得腹中绞痛，好像吞了一块砒霜，有一只手在捏扯自己的肠子般。又觉得身上彻骨发寒，似乎在柴家庄染上的疟疾仍未痊愈。</p><p>坐在县衙门前的台阶上，武松咬紧牙关，瑟瑟发抖，却又将怀里的骨头抱得更紧了。</p><h1 id="%E5%85%AD" tabindex="-1">六</h1><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><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><p>武松将碗里的酒喝干，把碗往地上一砸，抓起解腕刀，从灵案上跳下来。</p><p>那妇人见头势不好，却待要叫，被武松脑揪倒来，两只脚踏住他两只胳膊，扯开胸脯衣裳。说时迟，那时快，把尖刀去胸前只一剜，口里衔着刀，双手去挖开胸脯，抠出心肝五脏，供养在灵前；“肐查”一刀，便割下那妇人头来，血流满地。四家邻舍，吃了一惊，都掩了脸，见他凶了，又不敢动，只得随顺他。</p><p>水浒故事第五年，武大断七前一天，清河县紫石街，武宅设血祭。</p><p>祭武大往生，祭武松入魔。</p><h1 id="%E4%B8%83" tabindex="-1">七</h1><p>何道士将石碣上的蝌蚪文译了出来，道是山寨中一百零八位头领实为天上一百零八座星辰下凡，分属三十六天罡，七十二地煞云云。萧让取一张黄纸，整整齐齐抄了，贴在忠义堂的壁上。</p><p>众人皆奇，凑上前细细地读，心中暗自评点。李逵不识字，戴宗告诉他纸上写的是“天杀星黑旋风李逵”，杀人的杀。李逵大笑，把腰间的板斧拍得震天响：“俺铁牛应着天上的杀星，直得一板斧砍一排脑袋，痛快痛快！”</p><p>武松看到自己在众好汉中排十四，唤作“天伤星行者武松”。</p><p>伤字何解？为何所伤？为何伤心？武松寻思着。这几年咬钉嚼铁，斩头沥血，唯独不曾伤心。</p><p>被张都监设计陷害时，不觉伤心，在发配途中将押送的公人杀了，再奔回孟州城将张都监全家老小连同马夫丫鬟一并杀了。在壁上留下血字“杀人者打虎武松也”。</p><p>在人肉馒头店瞧得孙二娘要用蒙汗药麻翻他，暗自发笑，假意昏迷，只趁孙二娘动手时翻身把她压在地上作打。</p><p>在蜈蚣岭上，见一个道人搂着妇人调笑，武松见不得这等淫贱勾当，一个照面便挥刀将他头砍了。</p><p>武松心肠似铁、肝胆成冰，行走江湖有何能伤？</p><p>如今在山寨中做一个步兵头领，杀人放火，破州毁府。手上一对雪花镔铁戒刀，劈开过过往富商的箱箧，劈开过大名府粮仓的铁锁，劈开过好汉恶汉的头颅。每日大碗喝酒，大声哭笑，呼兄唤弟，赌咒骂誓。</p><p>没有故乡，没有梦想，没有爱恨，没有荣辱。只要有最利的刀来砍人头，只要有最烈的酒来烧喉咙，便能活过快意麻木的一天。</p><p>至于山寨外的世界，只值一声冷笑。</p><p>何谓伤？武松怎么也记不起来了。​​​​</p>]]>
                    </description>
                    <pubDate>Sat, 30 Sep 2023 13:53:42 CST</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[搬瓦工CN2 GIA 10G限量版（1核512MB，10GB，500GB流量，年付$49.99，可选DC6/DC9 CN2 GIA、日本软银、联通9929、普通机房等）]]>
                    </title>
                    <link>https://blog.houhaibushihai.me/archives/ban-wa-gong-cn2gia10g-xian-liang-ban</link>
                    <description>
                            <![CDATA[<h2 id="%E9%85%8D%E7%BD%AE" tabindex="-1">配置</h2><p><strong>搬瓦工CN2 GIA 10G限量版（1核512MB，10GB，500GB流量，年付$49.99，可选DC6/DC9 CN2 GIA、日本软银、联通9929、普通机房等）</strong></p><pre><code class="language-">【搬瓦工 可切14个机房】方案名称：SPECIAL 10G KVM PROMO V5 - LOS ANGELES - CN2 GIA LIMITED EDITION VPS方案配置：CPU：1核内存：512 MB硬盘：10 GB流量：500 GB/月带宽：1 Gbps价格：$49.99/年</code></pre><h2 id="%E8%B4%AD%E4%B9%B0" tabindex="-1">购买</h2><ul><li><a href="https://bwh81.net/aff.php?aff=69792&amp;pid=94" target="_blank">点击购买</a></li><li>下单记得使用优惠码，实付价格 $46.59/年，优惠码：<strong>BWHCCNCXVV</strong></li></ul><h2 id="%E5%8F%AF%E8%BF%81%E7%A7%BB14%E4%B8%AA%E6%9C%BA%E6%88%BF" tabindex="-1">可迁移14个机房</h2><p><img src="https://cdn.acwing.com/media/article/image/2023/09/13/41662_1c6cc2b851-%E6%88%AA%E5%B1%8F2023-09-13-12.50.01.png" alt="截屏2023-09-13 12.50.01.png" /></p><pre><code class="language-">洛杉矶DC6 CT CN2GIA-E）[USCA_6]：74.211.111.111 洛杉矶(DC9 CT CN2GIA) [USCA_9]：89.208.255.111 洛杉矶(DC3 CN2) [USCA_3]：23.105.212.111 洛杉矶(DC8 ZNET) [USCA_8]：93.179.114.199 日本大阪：212.50.244.1 洛杉矶 (DC2 QNET) [USCA_2]：66.112.212.86 洛杉矶(DC4 MCOM) [USCA_4]：172.93.42.111 美国弗里蒙特[USCA_FMT]：174.137.48.250 美国新泽西州[USNJ]：104.244.88.222 美国新泽西州[USNY_2]：74.121.150.11 荷兰阿姆斯特丹[EUNL_9](China Unicom Premium)：104.255.67.1 荷兰阿姆斯特丹[EUNL_3]：45.62.122.11</code></pre><h3 id="%E8%BD%AF%E9%93%B6%E6%B5%8B%E8%AF%95%E6%95%B0%E6%8D%AE" tabindex="-1">软银测试数据</h3><ul><li><p>流媒体</p><p><img src="https://cdn.acwing.com/media/article/image/2023/04/26/41662_d24347d0e4-%E6%88%AA%E5%B1%8F2023-04-26-15.34.09.png" alt="截屏2023-04-26 15.34.09.png" /></p></li><li><p>yabs</p><p><img src="https://cdn.acwing.com/media/article/image/2023/04/26/41662_add3b277e4-%E6%88%AA%E5%B1%8F2023-04-26-15.44.20.png" alt="截屏2023-04-26 15.44.20.png" /></p></li><li><p>三网去程</p><p>电信：</p><p><img src="https://cdn.acwing.com/media/article/image/2023/04/26/41662_bd9eeecfe4-%E6%88%AA%E5%B1%8F2023-04-26-15.46.12.png" alt="截屏2023-04-26 15.46.12.png" /></p><p>联通：</p><p><img src="https://cdn.acwing.com/media/article/image/2023/04/26/41662_c6003244e4-%E6%88%AA%E5%B1%8F2023-04-26-15.46.28.png" alt="截屏2023-04-26 15.46.28.png" /></p><p>移动：</p><p><img src="https://cdn.acwing.com/media/article/image/2023/04/26/41662_ceec81bfe4-%E6%88%AA%E5%B1%8F2023-04-26-15.46.40.png" alt="截屏2023-04-26 15.46.40.png" /></p></li><li><p>四网回程</p><p>电信：</p><p><img src="https://cdn.acwing.com/media/article/image/2023/04/26/41662_d92bf700e4-%E6%88%AA%E5%B1%8F2023-04-26-15.48.34.png" alt="截屏2023-04-26 15.48.34.png" /></p><p>CN2：</p><p><img src="https://cdn.acwing.com/media/article/image/2023/04/26/41662_e3bd25b5e4-%E6%88%AA%E5%B1%8F2023-04-26-15.48.47.png" alt="截屏2023-04-26 15.48.47.png" /></p><p>联通：</p><p><img src="https://cdn.acwing.com/media/article/image/2023/04/26/41662_eb90a80ee4-%E6%88%AA%E5%B1%8F2023-04-26-15.49.01.png" alt="截屏2023-04-26 15.49.01.png" /></p><p>移动：</p><p><img src="https://cdn.acwing.com/media/article/image/2023/04/26/41662_f3dda8ece4-%E6%88%AA%E5%B1%8F2023-04-26-15.49.32.png" alt="截屏2023-04-26 15.49.32.png" /></p><p>教育网：</p><p><img src="https://cdn.acwing.com/media/article/image/2023/04/26/41662_fd76aa8de4-%E6%88%AA%E5%B1%8F2023-04-26-15.49.46.png" alt="截屏2023-04-26 15.49.46.png" /></p></li><li><p>三网单线程</p><p><img src="https://cdn.acwing.com/media/article/image/2023/04/26/41662_06618237e4-%E6%88%AA%E5%B1%8F2023-04-26-15.50.18.png" alt="截屏2023-04-26 15.50.18.png" /></p></li><li><p>待补充</p></li></ul>]]>
                    </description>
                    <pubDate>Tue, 12 Sep 2023 19:30:34 CST</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[搬瓦工全新限量版套餐 THE PLAN v2 到手价 $110.9 每年]]>
                    </title>
                    <link>https://blog.houhaibushihai.me/archives/ban-wa-gong-quan-xin-xian-liang-ban-tao-can-theplanv2-dao-shou-jia-1109-mei-nian</link>
                    <description>
                            <![CDATA[<h2 id="%E9%85%8D%E7%BD%AE" tabindex="-1">配置</h2><p><strong>搬瓦工全新限量版套餐 THE PLAN v2 年付 $119 美金，多达 17 个机房可选（使用优惠码：BWHCCNCXVV，到手价 $110.90 美金）</strong></p><p>SSD：40 GB SSD<br />内存：2 GB<br />CPU：2 核<br />月流量：<strong>2000GB 月流量</strong></p><p>数据中心：17 个数据中心可切换</p><ul><li>澳大利亚悉尼：2.5 Gbps</li><li>美国新泽西州：1 Gbps</li><li>美国纽约：2.5 Gbps</li><li>荷兰阿姆斯特丹，EUNL_3/ i3d：1 Gbps</li><li>荷兰阿姆斯特丹，EUNL_9/ 中国联通：2.5 Gbps</li><li>美国洛杉矶，USCA_2/ QNET： 1 Gbps</li><li>洛杉矶，美国，USCA_3/ CN2 GT：1 Gbps</li><li>洛杉矶，美国，USCA_4/ MCOM：1 Gbps</li><li>洛杉矶，美国，USCA_6/ CN2GIA-E：2.5 Gbps</li><li>洛杉矶，美国，USCA_8/ ZNET：1 Gbps</li><li>洛杉矶美国安吉利斯，USCA_9/ CN2GIA：1 Gbps</li><li>加拿大温哥华 CN2 GIA：2.5 Gbps</li><li>加拿大温哥华：2.5 Gbps</li><li>美国弗里蒙特/HE：2.5 Gbps</li><li>中国香港 HK85/CMI：2.5 Gbps</li><li>日本大阪软银：2.5 Gbps</li><li>阿联酋迪拜：2.5 Gbps</li></ul><p>与往常一样，您可以在 VM 上线后在控制面板中切换数据中心。</p><h2 id="%E8%B4%AD%E4%B9%B0" tabindex="-1">购买</h2><ul><li><a href="https://bwh81.net/aff.php?aff=69792&amp;pid=131" target="_blank">点击购买</a></li><li>优惠码：<strong>BWHCCNCXVV</strong></li></ul><h2 id="%E7%BD%91%E7%BB%9C%E6%B5%8B%E8%AF%95" tabindex="-1">网络测试</h2><pre><code class="language-">搬瓦工悉尼机房：103.57.167.1 香港 HK85 机房：45.78.18.149 洛杉矶DC6 CT CN2GIA-E）[USCA_6]：74.211.111.111 洛杉矶(DC9 CT CN2GIA) [USCA_9]：89.208.255.111 洛杉矶(DC3 CN2) [USCA_3]：23.105.212.111 洛杉矶(DC8 ZNET) [USCA_8]：93.179.114.199 日本大阪：212.50.244.1 洛杉矶 (DC2 QNET) [USCA_2]：66.112.212.86 洛杉矶(DC4 MCOM) [USCA_4]：172.93.42.111 美国弗里蒙特[USCA_FMT]：174.137.48.250 美国新泽西州[USNJ]：104.244.88.222 美国新泽西州[USNY_2]：74.121.150.11 荷兰阿姆斯特丹[EUNL_9](China Unicom Premium)：104.255.67.1 荷兰阿姆斯特丹[EUNL_3]：45.62.122.11</code></pre><h3 id="%E9%A6%99%E6%B8%AF%E6%B5%8B%E8%AF%95%E6%95%B0%E6%8D%AE" tabindex="-1">香港测试数据</h3><ul><li><p>修改Swap</p><pre><code class="language-">bash &lt;(wget --no-check-certificate -qO- &#39;https://www.moerats.com/usr/shell/swap.sh&#39;)</code></pre></li><li><p>硬件</p><pre><code class="language-">curl -sL yabs.sh | bash -s -- -i</code></pre><p><img src="https://cdn.acwing.com/media/article/image/2023/01/14/41662_11b18a1093-iShot_2023-01-14_18.34.28.png" alt="iShot_2023-01-14_18.34.28.png" /></p></li><li><p>三网测速</p><pre><code class="language-">bash &lt;(curl -Lso- https://git.io/superspeed_uxh)</code></pre></li><li><p>三网回程图一乐脚本</p><pre><code class="language-">bash &lt;(wget -qO- --no-check-certificate https://gitlab.com/spiritysdx/za/-/raw/main/route.sh)</code></pre></li><li><p>流媒体解锁</p><pre><code class="language-">bash &lt;(curl -L -s https://raw.githubusercontent.com/lmc999/RegionRestrictionCheck/main/check.sh)</code></pre><p><img src="https://cdn.acwing.com/media/article/image/2023/01/14/41662_6bf83bc993-iShot_2023-01-14_19.12.42.png" alt="iShot_2023-01-14_19.12.42.png" /></p></li><li><p>四网路由</p><pre><code class="language-">wget https://raw.githubusercontent.com/nanqinlang-script/testrace/master/testrace.shbash testrace.sh</code></pre><p><img src="https://cdn.acwing.com/media/article/image/2023/01/14/41662_271f6f2493-iShot_2023-01-14_19.16.02.png" alt="iShot_2023-01-14_19.16.02.png" /></p><p><img src="https://cdn.acwing.com/media/article/image/2023/01/14/41662_2e6b826193-iShot_2023-01-14_19.16.16.png" alt="iShot_2023-01-14_19.16.16.png" /></p><p><img src="https://cdn.acwing.com/media/article/image/2023/01/14/41662_3861366c93-iShot_2023-01-14_19.16.28.png" alt="iShot_2023-01-14_19.16.28.png" /></p><p><img src="https://cdn.acwing.com/media/article/image/2023/01/14/41662_3d5f9cef93-iShot_2023-01-14_19.16.44.png" alt="iShot_2023-01-14_19.16.44.png" /></p><p><img src="https://cdn.acwing.com/media/article/image/2023/01/14/41662_422023c593-iShot_2023-01-14_19.16.59.png" alt="iShot_2023-01-14_19.16.59.png" /></p></li><li><p>回程CMI，移动宽带强推</p></li></ul><h3 id="%E6%82%89%E5%B0%BC%E6%B5%8B%E8%AF%95%E6%95%B0%E6%8D%AE" tabindex="-1">悉尼测试数据</h3><ul><li><p>硬件</p><pre><code class="language-">curl -sL yabs.sh | bash -s -- -i</code></pre><p><img src="https://cdn.acwing.com/media/article/image/2023/01/14/41662_2c77d68d93-iShot_2023-01-14_18.35.25.png" alt="iShot_2023-01-14_18.35.25.png" /></p></li><li><p>三网测速</p><pre><code class="language-">bash &lt;(curl -Lso- https://git.io/superspeed_uxh)</code></pre><p><img src="https://cdn.acwing.com/media/article/image/2023/01/14/41662_4ca1d4ca93-iShot_2023-01-14_18.49.54.png" alt="iShot_2023-01-14_18.49.54.png" /></p></li><li><p>流媒体解锁</p><pre><code class="language-">bash &lt;(curl -L -s https://raw.githubusercontent.com/lmc999/RegionRestrictionCheck/main/check.sh)</code></pre><p><img src="https://cdn.acwing.com/media/article/image/2023/01/14/41662_974a610993-iShot_2023-01-14_18.52.43.png" alt="iShot_2023-01-14_18.52.43.png" /></p></li><li><p>四网路由</p><pre><code class="language-">wget https://raw.githubusercontent.com/nanqinlang-script/testrace/master/testrace.shbash testrace.sh</code></pre><p><img src="https://cdn.acwing.com/media/article/image/2023/01/14/41662_dcc9453c93-iShot_2023-01-14_19.00.31.png" alt="iShot_2023-01-14_19.00.31.png" /></p><p><img src="https://cdn.acwing.com/media/article/image/2023/01/14/41662_eb06961893-iShot_2023-01-14_19.00.47.png" alt="iShot_2023-01-14_19.00.47.png" /></p><p><img src="https://cdn.acwing.com/media/article/image/2023/01/14/41662_f33f959a93-iShot_2023-01-14_19.01.04.png" alt="iShot_2023-01-14_19.01.04.png" /></p><p><img src="https://cdn.acwing.com/media/article/image/2023/01/14/41662_f769435c93-iShot_2023-01-14_19.01.18.png" alt="iShot_2023-01-14_19.01.18.png" /></p><p><img src="https://cdn.acwing.com/media/article/image/2023/01/14/41662_fb0662ca93-iShot_2023-01-14_19.01.35.png" alt="iShot_2023-01-14_19.01.35.png" /></p></li><li><p>回程四网9929</p></li></ul><h3 id="%E8%BD%AF%E9%93%B6%E6%B5%8B%E8%AF%95%E6%95%B0%E6%8D%AE" tabindex="-1">软银测试数据</h3><ul><li><p>流媒体</p><p><img src="https://cdn.acwing.com/media/article/image/2023/04/26/41662_d24347d0e4-%E6%88%AA%E5%B1%8F2023-04-26-15.34.09.png" alt="截屏2023-04-26 15.34.09.png" /></p></li><li><p>yabs</p><p><img src="https://cdn.acwing.com/media/article/image/2023/04/26/41662_add3b277e4-%E6%88%AA%E5%B1%8F2023-04-26-15.44.20.png" alt="截屏2023-04-26 15.44.20.png" /></p></li><li><p>三网去程</p><p>电信：</p><p><img src="https://cdn.acwing.com/media/article/image/2023/04/26/41662_bd9eeecfe4-%E6%88%AA%E5%B1%8F2023-04-26-15.46.12.png" alt="截屏2023-04-26 15.46.12.png" /></p><p>联通：</p><p><img src="https://cdn.acwing.com/media/article/image/2023/04/26/41662_c6003244e4-%E6%88%AA%E5%B1%8F2023-04-26-15.46.28.png" alt="截屏2023-04-26 15.46.28.png" /></p><p>移动：</p><p><img src="https://cdn.acwing.com/media/article/image/2023/04/26/41662_ceec81bfe4-%E6%88%AA%E5%B1%8F2023-04-26-15.46.40.png" alt="截屏2023-04-26 15.46.40.png" /></p></li><li><p>四网回程</p><p>电信：</p><p><img src="https://cdn.acwing.com/media/article/image/2023/04/26/41662_d92bf700e4-%E6%88%AA%E5%B1%8F2023-04-26-15.48.34.png" alt="截屏2023-04-26 15.48.34.png" /></p><p>CN2：</p><p><img src="https://cdn.acwing.com/media/article/image/2023/04/26/41662_e3bd25b5e4-%E6%88%AA%E5%B1%8F2023-04-26-15.48.47.png" alt="截屏2023-04-26 15.48.47.png" /></p><p>联通：</p><p><img src="https://cdn.acwing.com/media/article/image/2023/04/26/41662_eb90a80ee4-%E6%88%AA%E5%B1%8F2023-04-26-15.49.01.png" alt="截屏2023-04-26 15.49.01.png" /></p><p>移动：</p><p><img src="https://cdn.acwing.com/media/article/image/2023/04/26/41662_f3dda8ece4-%E6%88%AA%E5%B1%8F2023-04-26-15.49.32.png" alt="截屏2023-04-26 15.49.32.png" /></p><p>教育网：</p><p><img src="https://cdn.acwing.com/media/article/image/2023/04/26/41662_fd76aa8de4-%E6%88%AA%E5%B1%8F2023-04-26-15.49.46.png" alt="截屏2023-04-26 15.49.46.png" /></p></li><li><p>三网单线程</p><p><img src="https://cdn.acwing.com/media/article/image/2023/04/26/41662_06618237e4-%E6%88%AA%E5%B1%8F2023-04-26-15.50.18.png" alt="截屏2023-04-26 15.50.18.png" /></p></li><li><p>待补充</p></li></ul><h3 id="%E8%BF%AA%E6%8B%9C%E6%B5%8B%E8%AF%95%E6%95%B0%E6%8D%AE" tabindex="-1">迪拜测试数据</h3><ul><li><p>流媒体</p><p><img src="https://cdn.acwing.com/media/article/image/2023/04/26/41662_108d001ce4-%E6%88%AA%E5%B1%8F2023-04-26-15.53.17.png" alt="截屏2023-04-26 15.53.17.png" /></p></li><li><p>yabs</p><p><img src="https://cdn.acwing.com/media/article/image/2023/04/26/41662_1a31fface4-%E6%88%AA%E5%B1%8F2023-04-26-15.54.16.png" alt="截屏2023-04-26 15.54.16.png" /></p></li><li><p>三网去程</p><p>移动：</p><p><img src="https://cdn.acwing.com/media/article/image/2023/04/26/41662_232a5563e4-%E6%88%AA%E5%B1%8F2023-04-26-15.54.55.png" alt="截屏2023-04-26 15.54.55.png" /></p><p>联通：</p><p><img src="https://cdn.acwing.com/media/article/image/2023/04/26/41662_2c3145c4e4-%E6%88%AA%E5%B1%8F2023-04-26-15.55.06.png" alt="截屏2023-04-26 15.55.06.png" /></p><p>电信：</p><p><img src="https://cdn.acwing.com/media/article/image/2023/04/26/41662_35251495e4-%E6%88%AA%E5%B1%8F2023-04-26-15.55.25.png" alt="截屏2023-04-26 15.55.25.png" /></p></li><li><p>四网回程</p><p>电信：</p><p><img src="https://cdn.acwing.com/media/article/image/2023/04/26/41662_3ef3bb56e4-%E6%88%AA%E5%B1%8F2023-04-26-15.57.41.png" alt="截屏2023-04-26 15.57.41.png" /></p><p>CN2：</p><p><img src="https://cdn.acwing.com/media/article/image/2023/04/26/41662_47e65911e4-%E6%88%AA%E5%B1%8F2023-04-26-15.57.55.png" alt="截屏2023-04-26 15.57.55.png" /></p><p>联通：</p><p><img src="https://cdn.acwing.com/media/article/image/2023/04/26/41662_5175fe1de4-%E6%88%AA%E5%B1%8F2023-04-26-15.58.11.png" alt="截屏2023-04-26 15.58.11.png" /></p><p>移动：</p><p><img src="https://cdn.acwing.com/media/article/image/2023/04/26/41662_5a7bf084e4-%E6%88%AA%E5%B1%8F2023-04-26-15.58.29.png" alt="截屏2023-04-26 15.58.29.png" /></p><p>教育网：</p><p><img src="https://cdn.acwing.com/media/article/image/2023/04/26/41662_647b2b07e4-%E6%88%AA%E5%B1%8F2023-04-26-15.58.41.png" alt="截屏2023-04-26 15.58.41.png" /></p></li><li><p>待续</p></li></ul>]]>
                    </description>
                    <pubDate>Tue, 27 Jun 2023 11:57:44 CST</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[网站基本环境的配置教程]]>
                    </title>
                    <link>https://blog.houhaibushihai.me/archives/wang-zhan-ji-ben-huan-jing-de-pei-zhi-jiao-cheng</link>
                    <description>
                            <![CDATA[<h2 id="%E5%88%9D%E5%A7%8B%E5%8C%96-vps" tabindex="-1">初始化 VPS</h2><ol><li><p><strong>ssh 登录到远程服务器的 root 用户</strong>后再完成以下操作：</p><p><strong>更新</strong>系统已知的软件包列表、<strong>升级</strong>系统上的所有软件包、<strong>移除</strong>不再需要的依赖软件包：</p><pre><code class="language-">apt update &amp;&amp; apt upgrade &amp;&amp; apt autoremove</code></pre><blockquote><p>正经的 Linux 用户不会用 root 干所有的事情，如果这么做的话将会很危险。创建一个普通的用户，并让它可以通过 <em>sudo</em> 指令用 root 权限执行命令是一般的解决方案。</p></blockquote></li><li><p>在用 <em>sudo</em> 之前，我们需要先安装 <strong>sudo</strong> 这个软件包：</p><pre><code class="language-">apt install sudo</code></pre></li><li><p><strong>新建</strong>一个普通用户，本文新建名为 <code>eric</code> 的用户（同时创建相应的 home 目录），并将其添加到 sudo 用户组中；最后给 eric 设置一个密码：</p><pre><code class="language-">useradd -m -G sudo ericpasswd eric</code></pre></li><li><p><strong>更改</strong> eric 的默认 shell</p><pre><code class="language-">chsh eric</code></pre></li><li><p>相关建议（可选操作）</p><p><strong>为了安全</strong>起见，建议你完成下列操作：</p><ul><li>禁止通过 SSH 登录到 root 用户</li><li>限制 SSH 通过用户密码来登录，并实现 SSH 仅能通过密钥登录服务器</li></ul><p>提一下要点，不知道怎么做的话就 Google 学习一下：</p><ul><li><p>编辑 <code>/etc/ssh/sshd_config</code>文件：</p><pre><code class="language-">PermitRootLogin no# 禁止通过 SSH 登录到 root 用户PasswordAuthentication no # 限制 SSH 通过用户密码来登录</code></pre></li><li><p><strong>将本机公钥添加到远程服务器</strong></p><pre><code class="language-">本机 ssh 公钥路径 (如未生成使用 ssh-keygen 生成)：~/.ssh/id_rsa.pub然后将 ~/.ssh/id_rsa.pub 的内容追加到到服务器用户下的 ~/.ssh/authorized_keys最后重启 sshd 服务</code></pre></li></ul></li></ol><h2 id="%E5%AE%89%E8%A3%85-nginx-%E5%89%8D%E7%9A%84%E5%87%86%E5%A4%87" tabindex="-1">安装 nginx 前的准备</h2><blockquote><p>正经的 Linux 用户不会用 root 干所有的事情，如果这么做的话将会很危险。所以<strong>使用普通用户</strong>，再通过 <em>sudo</em> 指令用 root 权限执行命令是坠吼的。</p></blockquote><p><strong>使用普通用户</strong>通过 ssh 登录到你的远程服务器后再完成以下操作：</p><ol><li><p>时间校准</p><pre><code class="language-">sudo timedatectl set-ntp true # 启用 NTP 服务sudo ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime # 将时区设为“亚洲/上海”sudo hwclock --systohc # 将硬件时钟调整到与当前系统时间一致date -R # 以 RFC 5322 格式输出日期和时间。例如 Mon, 18 Jan 2021 11:04:16 +0800</code></pre><p>执行完之后，终端显示的时间如果正确，那么就没问题了。</p></li><li><p>防火墙初始化</p><p>本文将使用 <em>ufw</em> 来管理系统的防火墙</p><pre><code class="language-">sudo apt install ufwsudo ufw enablesudo ufw allow &#39;OpenSSH&#39;</code></pre></li><li><p>安装相关软件包</p><p><strong>更新</strong>系统已知的软件包列表、<strong>升级</strong>系统上的所有软件包、<strong>移除</strong>不再需要的依赖软件包：</p><pre><code class="language-">sudo apt update &amp;&amp; sudo apt upgrade &amp;&amp; sudo apt autoremove</code></pre><p><strong>安装编辑器</strong> vim（后续编写配配置文件需要，当然你也可以使用其他编辑器）：</p><pre><code class="language-">sudo apt install vim</code></pre></li></ol><h2 id="cloudflare-%E6%8E%A5%E7%AE%A1%E5%9F%9F%E5%90%8D%E8%A7%A3%E6%9E%90" tabindex="-1">Cloudflare 接管域名解析</h2><ul><li>添加记录并点亮小云朵</li><li>SSL/TLS 里选择 Full (strict)</li></ul><p><img src="https://cdn.acwing.com/media/article/image/2023/04/12/41662_4d234e15d8-%E6%88%AA%E5%B1%8F2021-12-25-12.58.23.png" alt="截屏2021-12-25 12.58.23.png" /></p><h2 id="%E5%AE%89%E8%A3%85-nginx-%E5%8F%8A%E5%85%B6%E5%88%9D%E5%A7%8B%E9%85%8D%E7%BD%AE" tabindex="-1">安装 Nginx 及其初始配置</h2><blockquote><p><strong>请将本文中的 <code>ijk.me</code> 替换成您注册的域名</strong></p></blockquote><p>安装 Nginx</p><pre><code class="language-">sudo apt install nginx</code></pre><p>配置防火墙</p><pre><code class="language-">sudo ufw allow &#39;Nginx Full&#39;</code></pre><p>配置 Nginx</p><ol><li><p>Nginx 在安装过程中会创建一个<strong>默认的服务器块</strong>。如果它仍然存在，请<strong>将其删除</strong>，因为你后面将<strong>为你注册的域名配置一个自定义服务器块</strong></p><pre><code class="language-">sudo rm /etc/nginx/sites-enabled/default</code></pre></li><li><p>使用如下命令，<strong>为你的域名创建目录</strong></p><pre><code class="language-">sudo mkdir -p /var/www/ijk.me/html</code></pre></li><li><p>接下来，用 <code>$USER</code> 环境变量<strong>给当前的系统用户分配目录的所有权</strong></p><pre><code class="language-">sudo chown -R $USER:$USER /var/www/ijk.me/html</code></pre></li><li><p>使用命令<strong>确保 web root 具有正确的权限</strong></p><pre><code class="language-">sudo chmod -R 755 /var/www/ijk.me</code></pre></li><li><p>接下来，使用 <code>vim</code> 或其他编辑器<strong>创建 <code>index.html</code> 页面文件</strong></p><pre><code class="language-">vim /var/www/ijk.me/html/index.html</code></pre><p>文件<strong>写入以下内容</strong>：</p><pre><code class="language-">&lt;html&gt;    &lt;head&gt;        &lt;title&gt;Welcome&lt;/title&gt;    &lt;/head&gt;    &lt;body&gt;        &lt;h1&gt;Success! Your Nginx server is successfully configured. &lt;/h1&gt;&lt;p&gt;This is a sample page.&lt;/p&gt;    &lt;/body&gt;&lt;/html&gt;</code></pre></li><li><p>我们需要<strong>创建一个服务器块，指向我们自定义的 web root</strong>。我们不直接修改默认的配置文件，而是新建一个文件</p><pre><code class="language-">sudo vim /etc/nginx/sites-available/ijk.me</code></pre><p>填写以下内容：</p><pre><code class="language-">server {        listen 80;        listen [::]:80;        root /var/www/ijk.me/html;        index index.html index.htm index.nginx-debian.html;        server_name ijk.me www.ijk.me;        location / {                try_files $uri $uri/ =404;        }}</code></pre></li><li><p>接下来，让我们通过在 <code>sites-enabled</code> 目录下<strong>创建一个符号链接</strong>来启用这个服务器块，Nginx 在启动时会在这个目录下读取配置文件：</p><pre><code class="language-">sudo ln -s /etc/nginx/sites-available/ijk.me /etc/nginx/sites-enabled/</code></pre></li><li><p>为了<strong>防止可能出现的内存问题</strong>，有必要调整 <code>/etc/nginx/nginx.conf</code> 文件中的一个值</p><pre><code class="language-">sudo vim /etc/nginx/nginx.conf</code></pre><p>找到 <code>server_names_hash_bucket_size</code>，将 <code>#</code> 符号去掉，<strong>取消这一行的注释</strong></p><pre><code class="language-">...http {    ...    server_names_hash_bucket_size 64;    ...}...</code></pre></li><li><p>接下来，<strong>测试一下 Nginx 文件中是否有语法错误</strong></p><pre><code class="language-">sudo nginx -t</code></pre></li><li><p>最后，若你的配置测试没有遇到问题，<strong>重启 Nginx 来启用你的更改</strong></p><pre><code class="language-">sudo systemctl restart nginx</code></pre></li><li><p>现在可以<strong>访问您注册的域名</strong>了，如下：</p><p><img src="https://cdn.acwing.com/media/article/image/2023/04/12/41662_30a11600d8-%E6%88%AA%E5%B1%8F2021-12-25-13.08.56.png" alt="截屏2021-12-25 13.08.56.png" /></p></li></ol><h2 id="%E9%85%8D%E7%BD%AEhttps%EF%BC%88acme.sh%E9%85%8D%E7%BD%AE%EF%BC%89" tabindex="-1">配置https（acme.sh配置）</h2><h3 id="%E7%94%9F%E6%88%90-tls-%E8%AF%81%E4%B9%A6%E5%92%8C%E7%A7%81%E9%92%A5" tabindex="-1">生成 TLS 证书和私钥</h3><p>生成证书的方法有很多，这里我们使用 <a href="https://github.com/acmesh-official/acme.sh" target="_blank">acme.sh</a> 生成证书。</p><ol><li><p>安装 <code>acme</code>：</p><pre><code class="language-">curl https://get.acme.sh | sh -s email=xxx@qq.com</code></pre><p>执行上面命令，然后使用命令 <code>ls -al</code>，我们就可以看到安装完毕，安装在 <code>.acme.sh</code> 隐藏文件夹内了。</p></li><li><p>使用 Global Key：</p><p>Global Key 可以在 <a href="https://dash.cloudflare.com/profile/api-tokens" target="_blank">这个页面</a> 看到，将这个 Key 导入到环境变数中</p><pre><code class="language-">export CF_Key=&quot;example_key&quot;export CF_Email=&quot;yourname@example.com&quot;</code></pre></li><li><p>进入文件夹 <code>.acme.sh</code> 并申请证书：</p><pre><code class="language-">cd .acme.sh./acme.sh --issue --dns dns_cf -d ijk.me -d www.ijk.me</code></pre><p>证书都生成在 <code>/root/.acme.sh/ijk.me_ecc/ </code>文件夹下了</p></li><li><p>修改前文 <code>sudo vim /etc/nginx/sites-available/ijk.me</code> 内容为（域名记得替换为自己的域名）：</p><pre><code class="language-">server {  listen 80 default_server;  listen [::]:80 default_server;  server_name ijk.me www.ijk.me;  return 301 https://$host$request_uri;}server {  listen 443 ssl http2;  listen [::]:443 ssl http2;  ssl_certificate &quot;/root/.acme.sh/ijk.me_ecc/fullchain.cer&quot;; ## 此处相关证书替换为自己的  ssl_certificate_key &quot;/root/.acme.sh/ijk.me_ecc/ijk.me.key&quot;; ## 此处相关证书替换为自己的  ssl_session_cache shared:SSL:1m;  ssl_session_timeout 10m;  # intermediate configuration  ssl_protocols TLSv1.2 TLSv1.3;  ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;  ssl_prefer_server_ciphers off;  # HSTS (ngx_http_headers_module is required) (63072000 seconds)  add_header Strict-Transport-Security &quot;max-age=63072000&quot; always;  server_name ijk.me www.ijk.me;  root /var/www/ijk.me/html;  index index.html index.htm index.nginx-debian.html;  location / {    try_files $uri $uri/ =404;  }}</code></pre></li><li><p>验证是否正确<code>sudo nginx -t</code></p></li><li><p>重新加载nginx使之生效：<code>sudo nginx -s reload</code></p></li><li><p>这时访问 <code>ijk.me</code> 或 <code>www.ijk.me</code>，一切妥当。</p></li></ol><h3 id="%E8%BF%87%E6%9C%9F%E6%89%8B%E5%8A%A8%E6%9B%B4%E6%96%B0" tabindex="-1">过期手动更新</h3><pre><code class="language-">acme.sh --renew -d example.com --forceacme.sh --renew -d example.com --force --ecc  # 如果用的是ECC证书</code></pre><p>由于我的<code>acme.sh</code>安装在<code>/root/.acme.sh/</code>此目录下。所以完整的手动更新证书命令为：</p><pre><code class="language-">cd /root/.acme.sh/./acme.sh --renew -d ijk.me --force</code></pre><p>上面是手动更新证书，下面我们介绍自动更新证书。因为acme颁发的证书有效期90天，所以我们每2个月更新一次证书就行。<br />使用Linux的<code>crontab -e</code>设置自动更新SSL证书：</p><pre><code class="language-"># 1,3,5,7,9,11月的1号，1点30更新证书30 01 1 1,3,5,7,9,11 * /root/.acme.sh/acme.sh --renew -d ijk.me --force# 1,3,5,7,9,11月的1号，2点30重新启动nginx服务器30 02 1 1,3,5,7,9,11 * /usr/sbin/nginx -t &amp;&amp; nginx -s reload &amp;&amp; /usr/sbin/nginx</code></pre><p>以上命令表示奇数月份的每月2号0点38分自动执行更新证书脚本<code>/root/.acme.sh/acme.sh --renew -d ijk.me --force</code></p><h2 id="%E8%87%AA%E5%90%AF%E5%B9%B6%E5%90%AF%E5%8A%A8%E7%9B%B8%E5%85%B3%E6%9C%8D%E5%8A%A1" tabindex="-1">自启并启动相关服务</h2><pre><code class="language-">sudo systemctl enable nginx --now   # 自启并启动 Nginx 的服务sudo systemctl status -l nginx      # 查看 Nginx 服务的状态</code></pre><h2 id="tcp-bbr" tabindex="-1">TCP BBR</h2><blockquote><p><strong>TCP BBR</strong>（Bottleneck Bandwidth and Round-trip propagation time）是由 Google 设计的一种<strong>拥塞控制算法</strong>。自从 <em>Linux Kernel 4.9</em> 开始就引入了该算法，但<strong>默认没有启用，所以需要手动开启</strong>。</p></blockquote><p><strong>启用</strong>该算法仅需在 <code>/etc/sysctl.conf</code> 文件<strong>末尾追加两行内容</strong>：</p><pre><code class="language-">sudo bash -c &quot;echo &#39;net.core.default_qdisc=fq&#39; &gt;&gt; /etc/sysctl.conf&quot;sudo bash -c &quot;echo &#39;net.ipv4.tcp_congestion_control=bbr&#39; &gt;&gt; /etc/sysctl.conf&quot;</code></pre><p>接下来你需要重启系统或者直接 <strong>使用 *systemctl* 重载变更</strong>。</p><pre><code class="language-">sudo sysctl --system</code></pre><p>您可以使用以下 <em>sysctl</em> 命令<strong>验证配置是否生效</strong>，如下：</p><pre><code class="language-">sudo sysctl net.core.default_qdisc</code></pre><p>注：若输出结果为 <code>net.core.default_qdisc = fq</code>，则配置已生效</p><pre><code class="language-">sudo sysctl net.ipv4.tcp_congestion_control</code></pre><p>注：若输出结果为 <code>net.ipv4.tcp_congestion_control = bbr</code>，则配置已生效</p>]]>
                    </description>
                    <pubDate>Wed, 12 Apr 2023 13:32:30 CST</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[搬瓦工 美金99年付 香港CMI/美西CN2 GIA/日本软银/荷兰9929 限量版]]>
                    </title>
                    <link>https://blog.houhaibushihai.me/archives/ban-wa-gong-mei-jin-99-nian-fu-xiang-gang-cmi-mei-xi-cn2gia-ri-ben-ruan-yin--he-lan-9929-xian-liang-ban</link>
                    <description>
                            <![CDATA[<h2 id="%E8%AE%A1%E5%88%92%E8%A7%84%E6%A0%BC" tabindex="-1">计划规格</h2><p>想象一下我们传奇的限量版计划，但配置翻倍：</p><p>SSD：20 GB -&gt; 40 GB RAID-10<br />内存：1 GB -&gt; 2 GB<br />CPU：1 核 -&gt; 2 核<br />月传输：500 GB -&gt; 1000 GB</p><p>数据中心：18个数据中心可切换</p><pre><code class="language-">Osaka, Japan: 2.5 GbpsHong Kong: 2.5 GbpsAmsterdam, Netherlands, EUNL_3/ i3d: 1 GbpsAmsterdam, Netherlands, EUNL_9/ China Unicom: 2.5 GbpsNew Jersey, USA: 1 GbpsNew York, USA: 2.5 GbpsLos Angeles, USA, USCA_2/ AO: 1 GbpsLos Angeles, USA, USCA_3/ CN2 GT: 1 GbpsLos Angeles, USA, USCA_4/ MCOM: 1 GbpsLos Angeles, USA, USCA_6/ CN2GIA-E: 2.5 GbpsLos Angeles, USA, USCA_8/ ZNET: 1 GbpsLos Angeles, USA, USCA_9/ CN2GIA: 1 GbpsVancouver, Canada, CABC_1: 2.5 GbpsVancouver, Canada, CABC_6/ CN2GIA: 2.5 GbpsFremont, USA/ HE: 2.5 GbpsFremont, USA/ FMT8: 2.5 GbpsDubai, UAE: 2.5 GbpsSydney, Australia: 2.5 Gbps</code></pre><p>与往常一样，您可以在 VM 上线后在控制面板中切换数据中心。</p><h2 id="%E5%AE%83%E8%A6%81%E5%A4%9A%E5%B0%91%E9%92%B1%EF%BC%9F" tabindex="-1">它要多少钱？</h2><p>目前最接近的现有计划（实际上提供的价格远低于 The Plan）的价格为 299.99 美元/年。</p><p>今天，您 <strong>每年只需 99 美元（可以季付）</strong> 即可获得 The Plan 。<br />而且，由于我们的奖励计划，它每年都会变得更便宜！</p><ul><li><a href="https://bwh81.net/aff.php?aff=69792&amp;pid=144" target="_blank">点击购买</a></li><li>优惠码：<strong>BWHCCNCXVV</strong></li></ul><h2 id="%E7%BD%91%E7%BB%9C%E6%B5%8B%E8%AF%95" tabindex="-1">网络测试</h2><pre><code class="language-">搬瓦工悉尼机房：103.57.167.1 香港 HK85 机房：45.78.18.149 洛杉矶DC6 CT CN2GIA-E）[USCA_6]：74.211.111.111 洛杉矶(DC9 CT CN2GIA) [USCA_9]：89.208.255.111 洛杉矶(DC3 CN2) [USCA_3]：23.105.212.111 洛杉矶(DC8 ZNET) [USCA_8]：93.179.114.199 日本大阪：212.50.244.1 洛杉矶 (DC2 QNET) [USCA_2]：66.112.212.86 洛杉矶(DC4 MCOM) [USCA_4]：172.93.42.111 美国弗里蒙特[USCA_FMT]：174.137.48.250 美国新泽西州[USNJ]：104.244.88.222 美国新泽西州[USNY_2]：74.121.150.11 荷兰阿姆斯特丹[EUNL_9](China Unicom Premium)：104.255.67.1 荷兰阿姆斯特丹[EUNL_3]：45.62.122.11</code></pre><h3 id="%E9%A6%99%E6%B8%AF%E6%B5%8B%E8%AF%95%E6%95%B0%E6%8D%AE" tabindex="-1">香港测试数据</h3><ul><li><p>修改Swap</p><pre><code class="language-">bash &lt;(wget --no-check-certificate -qO- &#39;https://www.moerats.com/usr/shell/swap.sh&#39;)</code></pre></li><li><p>硬件</p><pre><code class="language-">curl -sL yabs.sh | bash -s -- -i</code></pre><p><img src="https://cdn.acwing.com/media/article/image/2023/01/14/41662_11b18a1093-iShot_2023-01-14_18.34.28.png" alt="iShot_2023-01-14_18.34.28.png" /></p></li><li><p>三网测速</p><pre><code class="language-">bash &lt;(curl -Lso- https://git.io/superspeed_uxh)</code></pre></li><li><p>三网回程图一乐脚本</p><pre><code class="language-">bash &lt;(wget -qO- --no-check-certificate https://gitlab.com/spiritysdx/za/-/raw/main/route.sh)</code></pre></li><li><p>流媒体解锁</p><pre><code class="language-">bash &lt;(curl -L -s https://raw.githubusercontent.com/lmc999/RegionRestrictionCheck/main/check.sh)</code></pre><p><img src="https://cdn.acwing.com/media/article/image/2023/01/14/41662_6bf83bc993-iShot_2023-01-14_19.12.42.png" alt="iShot_2023-01-14_19.12.42.png" /></p></li><li><p>四网路由</p><pre><code class="language-">wget https://raw.githubusercontent.com/nanqinlang-script/testrace/master/testrace.shbash testrace.sh</code></pre><p><img src="https://cdn.acwing.com/media/article/image/2023/01/14/41662_271f6f2493-iShot_2023-01-14_19.16.02.png" alt="iShot_2023-01-14_19.16.02.png" /></p><p><img src="https://cdn.acwing.com/media/article/image/2023/01/14/41662_2e6b826193-iShot_2023-01-14_19.16.16.png" alt="iShot_2023-01-14_19.16.16.png" /></p><p><img src="https://cdn.acwing.com/media/article/image/2023/01/14/41662_3861366c93-iShot_2023-01-14_19.16.28.png" alt="iShot_2023-01-14_19.16.28.png" /></p><p><img src="https://cdn.acwing.com/media/article/image/2023/01/14/41662_3d5f9cef93-iShot_2023-01-14_19.16.44.png" alt="iShot_2023-01-14_19.16.44.png" /></p><p><img src="https://cdn.acwing.com/media/article/image/2023/01/14/41662_422023c593-iShot_2023-01-14_19.16.59.png" alt="iShot_2023-01-14_19.16.59.png" /></p></li><li><p>回程CMI，移动宽带强推</p></li></ul><h3 id="%E6%82%89%E5%B0%BC%E6%B5%8B%E8%AF%95%E6%95%B0%E6%8D%AE" tabindex="-1">悉尼测试数据</h3><ul><li><p>硬件</p><pre><code class="language-">curl -sL yabs.sh | bash -s -- -i</code></pre><p><img src="https://cdn.acwing.com/media/article/image/2023/01/14/41662_2c77d68d93-iShot_2023-01-14_18.35.25.png" alt="iShot_2023-01-14_18.35.25.png" /></p></li><li><p>三网测速</p><pre><code class="language-">bash &lt;(curl -Lso- https://git.io/superspeed_uxh)</code></pre><p><img src="https://cdn.acwing.com/media/article/image/2023/01/14/41662_4ca1d4ca93-iShot_2023-01-14_18.49.54.png" alt="iShot_2023-01-14_18.49.54.png" /></p></li><li><p>流媒体解锁</p><pre><code class="language-">bash &lt;(curl -L -s https://raw.githubusercontent.com/lmc999/RegionRestrictionCheck/main/check.sh)</code></pre><p><img src="https://cdn.acwing.com/media/article/image/2023/01/14/41662_974a610993-iShot_2023-01-14_18.52.43.png" alt="iShot_2023-01-14_18.52.43.png" /></p></li><li><p>四网路由</p><pre><code class="language-">wget https://raw.githubusercontent.com/nanqinlang-script/testrace/master/testrace.shbash testrace.sh</code></pre><p><img src="https://cdn.acwing.com/media/article/image/2023/01/14/41662_dcc9453c93-iShot_2023-01-14_19.00.31.png" alt="iShot_2023-01-14_19.00.31.png" /></p><p><img src="https://cdn.acwing.com/media/article/image/2023/01/14/41662_eb06961893-iShot_2023-01-14_19.00.47.png" alt="iShot_2023-01-14_19.00.47.png" /></p><p><img src="https://cdn.acwing.com/media/article/image/2023/01/14/41662_f33f959a93-iShot_2023-01-14_19.01.04.png" alt="iShot_2023-01-14_19.01.04.png" /></p><p><img src="https://cdn.acwing.com/media/article/image/2023/01/14/41662_f769435c93-iShot_2023-01-14_19.01.18.png" alt="iShot_2023-01-14_19.01.18.png" /></p><p><img src="https://cdn.acwing.com/media/article/image/2023/01/14/41662_fb0662ca93-iShot_2023-01-14_19.01.35.png" alt="iShot_2023-01-14_19.01.35.png" /></p></li><li><p>回程四网9929</p></li></ul><h3 id="%E8%BD%AF%E9%93%B6%E6%B5%8B%E8%AF%95%E6%95%B0%E6%8D%AE" tabindex="-1">软银测试数据</h3><ul><li><p>流媒体</p><p><img src="https://cdn.acwing.com/media/article/image/2023/04/26/41662_d24347d0e4-%E6%88%AA%E5%B1%8F2023-04-26-15.34.09.png" alt="截屏2023-04-26 15.34.09.png" /></p></li><li><p>yabs</p><p><img src="https://cdn.acwing.com/media/article/image/2023/04/26/41662_add3b277e4-%E6%88%AA%E5%B1%8F2023-04-26-15.44.20.png" alt="截屏2023-04-26 15.44.20.png" /></p></li><li><p>三网去程</p><p>电信：</p><p><img src="https://cdn.acwing.com/media/article/image/2023/04/26/41662_bd9eeecfe4-%E6%88%AA%E5%B1%8F2023-04-26-15.46.12.png" alt="截屏2023-04-26 15.46.12.png" /></p><p>联通：</p><p><img src="https://cdn.acwing.com/media/article/image/2023/04/26/41662_c6003244e4-%E6%88%AA%E5%B1%8F2023-04-26-15.46.28.png" alt="截屏2023-04-26 15.46.28.png" /></p><p>移动：</p><p><img src="https://cdn.acwing.com/media/article/image/2023/04/26/41662_ceec81bfe4-%E6%88%AA%E5%B1%8F2023-04-26-15.46.40.png" alt="截屏2023-04-26 15.46.40.png" /></p></li><li><p>四网回程</p><p>电信：</p><p><img src="https://cdn.acwing.com/media/article/image/2023/04/26/41662_d92bf700e4-%E6%88%AA%E5%B1%8F2023-04-26-15.48.34.png" alt="截屏2023-04-26 15.48.34.png" /></p><p>CN2：</p><p><img src="https://cdn.acwing.com/media/article/image/2023/04/26/41662_e3bd25b5e4-%E6%88%AA%E5%B1%8F2023-04-26-15.48.47.png" alt="截屏2023-04-26 15.48.47.png" /></p><p>联通：</p><p><img src="https://cdn.acwing.com/media/article/image/2023/04/26/41662_eb90a80ee4-%E6%88%AA%E5%B1%8F2023-04-26-15.49.01.png" alt="截屏2023-04-26 15.49.01.png" /></p><p>移动：</p><p><img src="https://cdn.acwing.com/media/article/image/2023/04/26/41662_f3dda8ece4-%E6%88%AA%E5%B1%8F2023-04-26-15.49.32.png" alt="截屏2023-04-26 15.49.32.png" /></p><p>教育网：</p><p><img src="https://cdn.acwing.com/media/article/image/2023/04/26/41662_fd76aa8de4-%E6%88%AA%E5%B1%8F2023-04-26-15.49.46.png" alt="截屏2023-04-26 15.49.46.png" /></p></li><li><p>三网单线程</p><p><img src="https://cdn.acwing.com/media/article/image/2023/04/26/41662_06618237e4-%E6%88%AA%E5%B1%8F2023-04-26-15.50.18.png" alt="截屏2023-04-26 15.50.18.png" /></p></li><li><p>待补充</p></li></ul><h3 id="%E8%BF%AA%E6%8B%9C%E6%B5%8B%E8%AF%95%E6%95%B0%E6%8D%AE" tabindex="-1">迪拜测试数据</h3><ul><li><p>流媒体</p><p><img src="https://cdn.acwing.com/media/article/image/2023/04/26/41662_108d001ce4-%E6%88%AA%E5%B1%8F2023-04-26-15.53.17.png" alt="截屏2023-04-26 15.53.17.png" /></p></li><li><p>yabs</p><p><img src="https://cdn.acwing.com/media/article/image/2023/04/26/41662_1a31fface4-%E6%88%AA%E5%B1%8F2023-04-26-15.54.16.png" alt="截屏2023-04-26 15.54.16.png" /></p></li><li><p>三网去程</p><p>移动：</p><p><img src="https://cdn.acwing.com/media/article/image/2023/04/26/41662_232a5563e4-%E6%88%AA%E5%B1%8F2023-04-26-15.54.55.png" alt="截屏2023-04-26 15.54.55.png" /></p><p>联通：</p><p><img src="https://cdn.acwing.com/media/article/image/2023/04/26/41662_2c3145c4e4-%E6%88%AA%E5%B1%8F2023-04-26-15.55.06.png" alt="截屏2023-04-26 15.55.06.png" /></p><p>电信：</p><p><img src="https://cdn.acwing.com/media/article/image/2023/04/26/41662_35251495e4-%E6%88%AA%E5%B1%8F2023-04-26-15.55.25.png" alt="截屏2023-04-26 15.55.25.png" /></p></li><li><p>四网回程</p><p>电信：</p><p><img src="https://cdn.acwing.com/media/article/image/2023/04/26/41662_3ef3bb56e4-%E6%88%AA%E5%B1%8F2023-04-26-15.57.41.png" alt="截屏2023-04-26 15.57.41.png" /></p><p>CN2：</p><p><img src="https://cdn.acwing.com/media/article/image/2023/04/26/41662_47e65911e4-%E6%88%AA%E5%B1%8F2023-04-26-15.57.55.png" alt="截屏2023-04-26 15.57.55.png" /></p><p>联通：</p><p><img src="https://cdn.acwing.com/media/article/image/2023/04/26/41662_5175fe1de4-%E6%88%AA%E5%B1%8F2023-04-26-15.58.11.png" alt="截屏2023-04-26 15.58.11.png" /></p><p>移动：</p><p><img src="https://cdn.acwing.com/media/article/image/2023/04/26/41662_5a7bf084e4-%E6%88%AA%E5%B1%8F2023-04-26-15.58.29.png" alt="截屏2023-04-26 15.58.29.png" /></p><p>教育网：</p><p><img src="https://cdn.acwing.com/media/article/image/2023/04/26/41662_647b2b07e4-%E6%88%AA%E5%B1%8F2023-04-26-15.58.41.png" alt="截屏2023-04-26 15.58.41.png" /></p></li><li><p>待续</p></li></ul>]]>
                    </description>
                    <pubDate>Fri, 13 Jan 2023 19:42:32 CST</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[Java大于int类型的变量如何自定义排序]]>
                    </title>
                    <link>https://blog.houhaibushihai.me/archives/java-da-yu-int-lei-xing-de-bian-liang-ru-he-zi-ding-yi-pai-xu</link>
                    <description>
                            <![CDATA[<h3 id="%E8%87%AA%E5%AE%9A%E4%B9%89%E6%8E%92%E5%BA%8F" tabindex="-1">自定义排序</h3><p>我们让<code>a</code>数组元素全部加入小顶堆排序，<code>a[][0]</code>小的置于堆顶，<code>a[][0]</code>相等的情况下，<code>a[][1]</code>小的置于堆顶。</p><p>当被排序元素的类型是<code>int</code>时，我们很好排：</p><pre><code class="language-java">import java.util.*;import javafx.util.Pair;class Untitled {public static void main(String[] args) {int[][] a = new int[][] {{2,1}, {2,0}, {32,2}, {5,4}, {4,0}, {1,3}};PriorityQueue&lt;Pair&lt;Integer, Integer&gt;&gt; pq = new PriorityQueue&lt;&gt;((o1, o2) -&gt; o1.getKey() != o2.getKey() ? o1.getKey() - o2.getKey() : o1.getValue() - o2.getValue());for (int[] p: a) {Pair t = new Pair(p[0], p[1]);pq.offer(t);}while (!pq.isEmpty()) {Pair t = pq.poll();System.out.println(t.getKey() + &quot; &quot; + t.getValue());}}}/*输出结果：1 32 02 14 05 432 2*/</code></pre><p>但是，当被排序元素类型比<code>int</code>大时，需要按照下面方法排序：</p><pre><code class="language-java">import java.util.*;import javafx.util.Pair;class Untitled {public static void main(String[] args) {int[][] a = new int[][] {{2,1}, {2,0}, {32,2}, {5,4}, {4,0}, {1,3}};    // PriorityQueue&lt;Pair&lt;Long, Integer&gt;&gt; pq = new PriorityQueue&lt;&gt;((o1, o2) -&gt; o1.getKey() != o2.getKey() ? Long.compare(o1.getKey(), o2.getKey()) : o1.getValue() - o2.getValue());    // 当 o.getKey() 的数据类型大于 int 时，按上面写法有些数据和场景会产生不可预知错误，推荐下面这种写法。    // 即 将o1.getKey() != o2.getKey()改写为!Objects.equals(o1.getKey(), o2.getKey())PriorityQueue&lt;Pair&lt;Long, Integer&gt;&gt; pq = new PriorityQueue&lt;&gt;((o1, o2) -&gt; !Objects.equals(o1.getKey(), o2.getKey()) ? Long.compare(o1.getKey(), o2.getKey()) : o1.getValue() - o2.getValue());for (int[] p: a) {long t1 = p[0];int t2 = p[1];Pair t = new Pair(t1, t2);pq.offer(t);}while (!pq.isEmpty()) {Pair t = pq.poll();System.out.println(t.getKey() + &quot; &quot; + t.getValue());}}}/*输出结果：1 32 02 14 05 432 2*/</code></pre><h3 id="preferece" tabindex="-1">Preferece</h3><ul><li><a href="https://www.javatpoint.com/java-long-compare-method" target="_blank">Long.compare</a></li></ul>]]>
                    </description>
                    <pubDate>Sun, 04 Sep 2022 18:28:27 CST</pubDate>
                </item>
                <item>
                    <title>
                        <![CDATA[Java中，关于Comparator三点说明]]>
                    </title>
                    <link>https://blog.houhaibushihai.me/archives/java-zhong--guan-yu-comparator-san-dian-shuo-ming</link>
                    <description>
                            <![CDATA[<p>我们在使用<code>Arrays.sort(xx, new Comparator&lt;T&gt;() {});</code>和<code>Collections.sort(xx, new Comparator&lt;T&gt;() {})</code>时，明确三点即可：</p><ol><li><code>int compare(T o1, T o2)</code> 是“比较o1和o2的大小”。返回“负数”，意味着“o1比o2小”；返回“零”，意味着“o1等于o2”；返回“正数”，意味着“o1大于o2”。</li><li>默认（原始）顺序是o1在前，o2在后。<ul><li>那么此时如果返回正数，表示需要调整o1，o2的顺序，也就是需要把o2放到o1前面；</li><li>那么此时如果返回负数，表示不需要调整，o1，o2维持原顺序。</li></ul></li><li>关于1中的正数负数指的是o1，o2比较时的ASCII码差值；关于2中的正数负数指的是是否需要交换o1，o2位置。使用时，我们一般把1，2统一起来使用。</li></ol>]]>
                    </description>
                    <pubDate>Tue, 19 Jul 2022 17:19:15 CST</pubDate>
                </item>
    </channel>
</rss>