<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0">
  <channel>
    <atom:link href="https://blog.nest.moe/rss-fragments.xml" rel="self" type="application/rss+xml"/>
    <title><![CDATA[ MANKA の blog - Fragments ]]></title>
    <link>https://blog.nest.moe</link>
    <description><![CDATA[ 不知道写什么，随便记点什么 ]]></description>
    <language>zh-cn</language>
    <copyright><![CDATA[ © 2026 MANKA の blog ]]></copyright>
    <pubDate>Sun, 08 Mar 2026 10:23:55 GMT</pubDate>
    <generator>https://blog.nest.moe</generator>
    <image>
      <url>https://blog.nest.moe/assets/avatar.png</url>
      <title><![CDATA[ MANKA の blog ]]></title>
      <link>https://blog.nest.moe</link>
    </image>
    <item>
      <title><![CDATA[ config rg mu3063 ]]></title>
      <link>https://blog.nest.moe/fragments/#config-rg-mu3063</link>
      <guid>https://blog.nest.moe/fragments/#config-rg-mu3063</guid>
      <pubDate>Thu, 05 Mar 2026 16:21:00 GMT</pubDate>
      <updated>2026-03-08T10:22:26.000Z</updated>
      <description><![CDATA[ <p >一次意外跳闸让 k2p 原地去世，在<a href="/posts/find-router-ip-by-arp" href="/posts/find-router-ip-by-arp" target="_blank">复活 AX5</a>以前，我翻出了一个移动送的 RG-MA3063</p><p >解锁开发者模式和一些操作主要参考了下面两篇文章：</p><ul ><li ><a href="https://blog.kokomi.me/posts/enable-ssh-for-rg-ma3063" href="https://blog.kokomi.me/posts/enable-ssh-for-rg-ma3063" rel="nofollow" target="_blank">锐捷 RG-MA3063 开启 SSH 的方法</a></li><li ><a href="https://www.right.com.cn/forum/thread-8377493-1-1.html" href="https://www.right.com.cn/forum/thread-8377493-1-1.html" rel="nofollow" target="_blank">锐捷MA3063系列中国移动定制版免拆开启ssh、删除插件、解除锁网限制(更新全版本通用)</a></li></ul><pre><code language="sh" class="language-sh"># from https://blog.kokomi.me/posts/enable-ssh-for-rg-ma3063
$ curl http://192.168.10.1/__factory_verify_mode__
$ ssh admin@192.168.10.1 -o HostKeyAlgorithms=+ssh-rsa -o StrictHostKeyChecking=no
admin@192.168.10.1's password: wifi@cmcc
</code></pre><p >不知道是我为了用 SSH 开了工厂模式还是我的固件不太一样，两篇文章里面的一些内容我就没有找到，下面再说一下我干了些啥：</p><ul ><li >192.168.10.1（eweb，就是厂商定制的后台）和 192.168.10.1:8088（luci）里面的大多数配置和数据都是共享的，但有一小部分不共享，通过 luci 进行的修改 eweb 不会显示（修改 DHCP 网关地址），一些 eweb 的修改也不会生效（开启 ipv6/UPnP），两边处于一个奇怪的叠加态</li><li >luci 登录密码并不是填什么都行，但我确实忘了是哪个了，eweb 或者 admin 的密码二选一，通过 luci 修改 luci 的密码不会影响其他部分</li><li >DNS 默认会在 <code >/var/resolv.conf.auto</code> 最后添加 <code >114.114.114.114</code>，看起来是用来做 fallback 的，实际并没有在使用</li><li >由于 telnet 安全性不太可靠，这玩意也不可能升级，干脆直接关了，另外通过 luci 禁止了通过 wan 访问 luci 和 SSH</li></ul><pre><code language="sh" class="language-sh">/etc/init.d/telnet disable
/etc/init.d/telnet stop
</code></pre><ul ><li >鉴于启动工厂模式可以一劳永逸解决大量问题，所以干脆开一个服务来保证开机自启</li></ul><pre><code language="sh" class="language-sh">#!/bin/sh /etc/rc.common
# -> save as '/etc/init.d/dev_port_fix'
# chmod +x /etc/init.d/dev_port_fix
# /etc/init.d/dev_port_fix enable

START=99

start() {
    /etc/init.d/dev_port_config.sh enable
}
</code></pre><ul ><li >虽然我所在地区和使用的运营商都是正确的，暂时不会有锁网危机，但以防万一，还是按照着恩山的那个教程将 <code >Enable</code> 全部改成 <code >0</code></li></ul><pre><code language="sh" class="language-sh">sed -i 's/Enable":1/Enable":0/g' /data/cfgfile
</code></pre><ul ><li >检查运行中的进程时发现每隔一段时间就会向锐捷的域名上报一些遥测数据</li></ul><pre><code language="sh" class="language-sh">curl -k -sS -m 20 -X POST -H 'Content-Type: application/json' -d '{"ctei":"...","sysHardVer":" 3.00","sn":"...","sysDesc":" RG-MA3063-&#x3C;wuhu3-cmcc-main>","sysSoftVer":" MA_2.1(1)B6P6, Release(09242915)","buiTime":" 2022\/12\/29 15","mac":"...  "}' https://lamp.ruijie.com.cn/mvp/device/apOnlineUpload
</code></pre><p >翻了一圈发现是用于 <a href="https://wis.ruijie.com.cn/" href="https://wis.ruijie.com.cn/" rel="nofollow" target="_blank">WIS云网</a> 的，虽然没太看懂，但家用肯定用不上这些政企管理功能，检查 <code >/sbin/wis_report.sh</code> 发现脚本通过检查 <code >/data/wis_report_enable</code> 是否存在来判断要不要上报，但我的系统里面没有这个文件，说明在我连上 SSH 前这文件就被删掉了</p><p >我懒得纠结太多，干脆在 <code >/sbin/wis_report.sh</code> 第二行加个 <code >exit 0</code></p><p >先用一段时间，后续跟 AX5 比较一下留哪个来日用，k2p 过了那么多年，硬件和软件都有点跟不上了，是时候换代了（虽然还是远古玩意）</p><p >* 1 天后换成 AX5 了，虽然都不怎么样，但它信号好啊……</p> ]]></description>
      <comments>https://blog.nest.moe/fragments#comment</comments>
      <dc:creator><![CDATA[ BANKA2017 ]]></dc:creator>
      <category>fragment</category>
      <category><![CDATA[ 锐捷 RG-MA3063 ]]></category>
      <category><![CDATA[ 路由器 ]]></category>
    </item>
    <item>
      <title><![CDATA[ giffgaff sms issue ]]></title>
      <link>https://blog.nest.moe/fragments/#giffgaff-sms-issue</link>
      <guid>https://blog.nest.moe/fragments/#giffgaff-sms-issue</guid>
      <pubDate>Thu, 26 Feb 2026 06:17:00 GMT</pubDate>
      <updated>2026-02-26T06:44:10.000Z</updated>
      <description><![CDATA[ <p >翻了一下记录发现手上的 giffgaff 卡片是在 <code >2025-09-05</code> 激活的，那到现在也是时候消费一下续命了。</p><p >翻了一圈发现主流消费保号方法就是<strong >发短信</strong>和<strong >用流量</strong>，由于在漫游，普通短信发给谁（不论国家）都是一样的 30p，比起流量更可控</p><p >然后就悲剧了，可能是各种原因导致发了两遍，扣了 60p ……orz</p><p >事后上 <a href="https://www.google.com/search?q=giffgaff+sms+twice" href="https://www.google.com/search?q=giffgaff+sms+twice" rel="nofollow" target="_blank">Google 查</a> 了一下发现还有不少受害者，我在手机的 <a href="https://play.google.com/store/apps/details?id=com.google.android.apps.messaging" href="https://play.google.com/store/apps/details?id=com.google.android.apps.messaging" rel="nofollow" target="_blank">Google 信息</a> 找了一圈也没找到阻止重复发送的选项</p> ]]></description>
      <comments>https://blog.nest.moe/fragments#comment</comments>
      <dc:creator><![CDATA[ BANKA2017 ]]></dc:creator>
      <category>fragment</category>
      <category><![CDATA[ giffgaff ]]></category>
    </item>
    <item>
      <title><![CDATA[ cosmic princess kaguya ]]></title>
      <link>https://blog.nest.moe/fragments/#cosmic-princess-kaguya</link>
      <guid>https://blog.nest.moe/fragments/#cosmic-princess-kaguya</guid>
      <pubDate>Sun, 08 Feb 2026 16:16:00 GMT</pubDate>
      <updated>2026-02-08T16:28:54.000Z</updated>
      <description><![CDATA[ <p >这年头赌原创动画真的太难了</p><p >加上画风和剧情还不错，符合个人口味的就更难挑了</p><p >好吧我承认是有点戒断反应了……</p> ]]></description>
      <comments>https://blog.nest.moe/fragments#comment</comments>
      <dc:creator><![CDATA[ BANKA2017 ]]></dc:creator>
      <category>fragment</category>
      <category><![CDATA[ 随想 ]]></category>
      <category><![CDATA[ 超时空辉耀姬 ]]></category>
    </item>
    <item>
      <title><![CDATA[ fix widescreen layout ]]></title>
      <link>https://blog.nest.moe/fragments/#fix-widescreen-layout</link>
      <guid>https://blog.nest.moe/fragments/#fix-widescreen-layout</guid>
      <pubDate>Wed, 04 Feb 2026 18:27:00 GMT</pubDate>
      <updated>2026-02-26T06:50:21.000Z</updated>
      <description><![CDATA[ <p >前端框架一般都会提供一个叫 <a href="https://tailwindcss.com/docs/max-width" href="https://tailwindcss.com/docs/max-width" rel="nofollow" target="_blank">container</a> 的 <code >class</code> 用来限制页面最大宽度，然后需要用 <a href="https://tailwindcss.com/docs/margin" href="https://tailwindcss.com/docs/margin" rel="nofollow" target="_blank">mx-auto</a> 来将页面居中……小屏幕用久了的野路子很难注意到这问题</p> ]]></description>
      <comments>https://blog.nest.moe/fragments#comment</comments>
      <dc:creator><![CDATA[ BANKA2017 ]]></dc:creator>
      <category>fragment</category>
      <category><![CDATA[ 前端 ]]></category>
    </item>
    <item>
      <title><![CDATA[ sql batch tasks ]]></title>
      <link>https://blog.nest.moe/fragments/#sql-batch-tasks</link>
      <guid>https://blog.nest.moe/fragments/#sql-batch-tasks</guid>
      <pubDate>Sun, 25 Jan 2026 18:03:00 GMT</pubDate>
      <updated>2026-01-25T18:25:43.000Z</updated>
      <description><![CDATA[ <p >一个实际需求，在一张表 <code >list</code> 中，有递增的列 <code >id</code> 和映射用户 id 的列 <code >pid</code>，从前往后每个用户最多抽取 10 行，总共最多抽取 30 行……在号池中，每个用户能够对外的请求的次数是有限的，这时资源会过剩，就可以用这招简单地压榨一轮了</p><pre><code language="sql" class="language-sql">SELECT * FROM (
    SELECT * FROM (
        SELECT *,ROW_NUMBER() OVER (PARTITION BY pid ORDER BY id) AS rn FROM `list` WHERE ...(original query)
    ) as filtered_tasks WHERE rn &#x3C;= 10
) as tasks LIMIT 30
</code></pre> ]]></description>
      <comments>https://blog.nest.moe/fragments#comment</comments>
      <dc:creator><![CDATA[ BANKA2017 ]]></dc:creator>
      <category>fragment</category>
      <category><![CDATA[ SQL ]]></category>
    </item>
    <item>
      <title><![CDATA[ dot matrix background ]]></title>
      <link>https://blog.nest.moe/fragments/#dot-matrix-background</link>
      <guid>https://blog.nest.moe/fragments/#dot-matrix-background</guid>
      <pubDate>Sun, 25 Jan 2026 17:19:00 GMT</pubDate>
      <updated>2026-01-25T18:40:58.000Z</updated>
      <description><![CDATA[ <p >点阵背景，从 <a href="https://hackathon.polar.sh/" href="https://hackathon.polar.sh/" rel="nofollow" target="_blank">https://hackathon.polar.sh/</a> 抄来的，<a href="https://twitter.com/dingyi/status/2015095899740131469" href="https://twitter.com/dingyi/status/2015095899740131469" rel="nofollow" target="_blank">刷推</a>看到，效果看背景</p><p >原版使用 Tailwind CSS v4.0，而这个 blog 还在使用 v3，所以我转写成 css 了：</p><pre><code language="css" class="language-css">.bg-dot-matrix {
  background-size: 25px 25px;
  background-image: radial-gradient(#64748b 5%, #0000 5%);
  background-position: 0 0;
}
</code></pre> ]]></description>
      <comments>https://blog.nest.moe/fragments#comment</comments>
      <dc:creator><![CDATA[ BANKA2017 ]]></dc:creator>
      <category>fragment</category>
      <category><![CDATA[ 前端 ]]></category>
    </item>
    <item>
      <title><![CDATA[ about open source project maintaining ]]></title>
      <link>https://blog.nest.moe/fragments/#about-open-source-project-maintaining</link>
      <guid>https://blog.nest.moe/fragments/#about-open-source-project-maintaining</guid>
      <pubDate>Thu, 08 Jan 2026 16:09:04 GMT</pubDate>
      <updated>2026-01-25T18:00:14.000Z</updated>
      <description><![CDATA[ <p >* 2026-01-26 补充：</p><p >本文写在差不多 20 天前，到现在已经有项目（<a href="https://gist.github.com/bagder/07f7581f6e3d78ef37dfbfc81fd1d1cd" href="https://gist.github.com/bagder/07f7581f6e3d78ef37dfbfc81fd1d1cd" rel="nofollow" target="_blank">curl</a>、<a href="https://twitter.com/tldraw/status/2011911073834672138" href="https://twitter.com/tldraw/status/2011911073834672138" rel="nofollow" target="_blank">tldraw</a>...）因 AI slop 暂停外界直接贡献了，下面是原文</p><hr /><p >昨天看到 tailwindcss 拒绝了一个添加 llms.txt 的 <a href="https://github.com/tailwindlabs/tailwindcss.com/pull/2388" href="https://github.com/tailwindlabs/tailwindcss.com/pull/2388" rel="nofollow" target="_blank">pull request</a>，然后底下评论，HN还有推上大辩论了半天，看到了不少关于怎么做开源项目商业化的问题……当然现在我不想讨论这个，因为开源商业化本来就很难，能做成的凤毛麟角，这些都是老生常谈了聊起来没意思。所以我想聊的是作为一个开发者拒绝或者摆烂不管一个 PR 时究竟在想什么</p><p >首先是最简单的原因，就是不想合并。而 GitHub 的 pull request 功能是无法关闭的，对就那么简单</p><p >其次是后续维护麻烦。提交 PR 的讨论再怎么鸡飞狗跳都只会持续到合并的那一刻，合并以后维护的责任就会落到维护者的头上了，就算提交者撒手不管维护者也没法强制要求什么，但是：</p><ul ><li >一旦出现漏洞或者紧急情况，项目维护者不可能指望提交者会跑出来提交，这时就只能自己上了，所以为了不要出事时头疼，需要在合并前就把事情搞清楚搞明白，稀里糊涂地合并最后自己是要吃苦头的</li><li >有时候遇到提交者灵机一动在自己的提交里面加上奇怪的小巧思更是把审核的麻烦程度提升了一个维度，比如这次 tailwind 的提交就加了个提交者自己维护的依赖，这是很可疑的，谁都没法保证这会不会是供应链攻击，会不会是下一个 <a href="https://zh.wikipedia.org/wiki/XZ%E5%AE%9E%E7%94%A8%E7%A8%8B%E5%BA%8F%E5%90%8E%E9%97%A8" href="https://zh.wikipedia.org/wiki/XZ%E5%AE%9E%E7%94%A8%E7%A8%8B%E5%BA%8F%E5%90%8E%E9%97%A8" rel="nofollow" target="_blank">xz 后门</a>，要确定就还要审核这个依赖，工作量是非常大的；</li><li >现在 LLM 足够强大，让很多人觉得自己行了，没有问题就创造问题，提交一大堆不知所云的东西，真人的水平是真的会限制 LLM 的水平的，另外我不止一次看到类似 <strong >如果 LLM 足够强大，那 <code >llms.txt</code> 完全没有存在的必要</strong> 的说法，我同意
<ul ><li >既然别人能用 LLM，开发者自己也能用啊，自己对项目还更熟悉，为什么要外人来插手</li></ul></li></ul><p >还有一个最根本的是：没时间没精力，每天活着已经很累了，有的项目还没有完善的测试，有的测试不适合做完全自动化，比如爬网程序做高强度自动化很容易封号，必须要有人盯着，费时费力，心累</p> ]]></description>
      <comments>https://blog.nest.moe/fragments#comment</comments>
      <dc:creator><![CDATA[ BANKA2017 ]]></dc:creator>
      <category>fragment</category>
      <category><![CDATA[ 开源 ]]></category>
      <category><![CDATA[ 随想 ]]></category>
    </item>
    <item>
      <title><![CDATA[ move to cloudflare workers ]]></title>
      <link>https://blog.nest.moe/fragments/#move-to-cloudflare-workers</link>
      <guid>https://blog.nest.moe/fragments/#move-to-cloudflare-workers</guid>
      <pubDate>Sun, 28 Dec 2025 06:45:00 GMT</pubDate>
      <updated>2026-01-07T16:03:52.000Z</updated>
      <description><![CDATA[ <p >将 blog 和一些网页小玩意从 Cloudflare Pages 迁移到了 Workers</p><p >走了一些弯路，简单记录一下 <code >wrangler.jsonc</code> 该怎么配置，因为我不喜欢 <code >toml</code> 的格式，所以不用</p><pre><code language="json" class="language-json">{
    "name": "manka-no-blog",
    "compatibility_date": "2025-12-21",
    "assets": {
        "directory": "./.output/public/",
        "not_found_handling": "404-page",
        "html_handling": "drop-trailing-slash" // 尾斜杠的处理看个人喜好，我喜欢去掉
    },
    "workers_dev": false,
    "preview_urls": true,
    "vars": { "WRANGLER_SEND_METRICS": "false" }
}
</code></pre><ul ><li ><code >assets.binding</code> 不需要存在，<code >main</code> 的入口脚本也不需要存在，在旧版本的 wrangler 没有 <code >main</code> 在启动时会爆找不到脚本之类的错误，升级即可</li><li ><code >workers_dev</code> 是给自动配置的固定链接，<code >preview_urls</code> 是每次部署的版本的链接，后者在复盘 bug 时有用，看个人喜好是否启用</li></ul><p >如果用框架（next/nuxt/astro...）做 ssg 的谨慎考虑使用 Cloudflare 官方提供的打包插件，至少要检查一遍 <code >build/generate</code> 后生成了什么。以我现在使用的 <a href="https://developers.cloudflare.com/workers/framework-guides/web-apps/more-web-frameworks/nuxt/" href="https://developers.cloudflare.com/workers/framework-guides/web-apps/more-web-frameworks/nuxt/" rel="nofollow" target="_blank">nuxt</a> 为例，打包得到的实际是 ssr 服务端，并不是 ssg 后纯静态的，启动后每个页面都是动态生成，会消耗运行次数</p><p >如果网站有动态部分不要学官网文档那样绑定 <code >ASSETS</code> 然后在 worker 脚本调用，尤其是被 bot 扫不存在的目录时，会因为找不到文件导致降级跑 worker 脚本，那样也是会消耗次数的，应该准备一个 <a href="https://developers.cloudflare.com/workers/static-assets/redirects/" href="https://developers.cloudflare.com/workers/static-assets/redirects/" rel="nofollow" target="_blank"><code >_redirects</code></a> 文件，将预期外的请求统统丢给一个固定的存在的目录</p><pre><code language="txt" class="language-txt">/ / 200
/api /api 200
/* /
</code></pre><p >最后别忘了在 <code >.assetsignore</code> 忽略掉 <code >_redirects</code></p><p >至于为什么用 <code >_redirects</code> 都不用 <code >assets.not_found_handling="single-page-application"</code>，因为 <code >single-page-application</code> 不会跳转离开不存在的页面，我不喜欢 :P</p> ]]></description>
      <comments>https://blog.nest.moe/fragments#comment</comments>
      <dc:creator><![CDATA[ BANKA2017 ]]></dc:creator>
      <category>fragment</category>
      <category><![CDATA[ Cloudflare ]]></category>
    </item>
    <item>
      <title><![CDATA[ wtf chrome password autocomplete ]]></title>
      <link>https://blog.nest.moe/fragments/#wtf-chrome-password-autocomplete</link>
      <guid>https://blog.nest.moe/fragments/#wtf-chrome-password-autocomplete</guid>
      <pubDate>Wed, 10 Dec 2025 17:56:00 GMT</pubDate>
      <updated>2025-12-13T08:15:10.000Z</updated>
      <description><![CDATA[ <p >时至今日，前端们还是没有任何办法在网页层面 <strong >可靠地永久禁用</strong> Chrome 对原生 <code language="css" style="">input[type=password]</code> 表单弹出的自动填充框，而这个困境，已经有十年了</p><p >在可以预见的未来，这都没有解决的希望，尽管只需要 Chrome 简单地<strong >重新</strong>支持 <code >autocomplete="off"</code> 就可以完事了</p><p >为什么用「重新」，因为它在<a href="https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#attr-fe-autocomplete-off" href="https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#attr-fe-autocomplete-off" rel="nofollow" target="_blank">标准</a>里面，并且曾经可用</p><p >FYI: <a href="https://issues.chromium.org/issues/41239842" href="https://issues.chromium.org/issues/41239842" rel="nofollow" target="_blank">https://issues.chromium.org/issues/41239842</a></p><p >这条 issue 创建自 2016年2月17日，算上在此之前关闭的 issue，就更早了</p><p >ps: <a href="https://stackoverflow.com/questions/15738259/disabling-chrome-autofill" href="https://stackoverflow.com/questions/15738259/disabling-chrome-autofill" rel="nofollow" target="_blank">stackoverflow/disabling-chrome-autofill</a> 里面提了不少路子，老东西别指望能用，新东西也好用不到哪去，归根到底还是 <code >fxxk u Google 🖕</code></p> ]]></description>
      <comments>https://blog.nest.moe/fragments#comment</comments>
      <dc:creator><![CDATA[ BANKA2017 ]]></dc:creator>
      <category>fragment</category>
      <category><![CDATA[ 前端 ]]></category>
      <category><![CDATA[ Chrome ]]></category>
    </item>
    <item>
      <title><![CDATA[ use nuxt4 ]]></title>
      <link>https://blog.nest.moe/fragments/#use-nuxt4</link>
      <guid>https://blog.nest.moe/fragments/#use-nuxt4</guid>
      <pubDate>Sun, 07 Dec 2025 09:16:00 GMT</pubDate>
      <updated>2025-12-12T21:55:24.000Z</updated>
      <description><![CDATA[ <p >周末折腾了一番，对 blog 做了一点升级：</p><ul ><li >支持用密码来加密文章，放出了几篇老东西，不过里面的内容已经失效得差不多了，密码学大厦倒塌前这加密应该都是安全的</li><li >升级到了 nuxt4，迁移时看到文档发现 nuxt5 都要出来了，实在是令人感叹
<ul ><li ><del >不过还是继续做 content v2 钉子户，应该以后都不会升级了，实在有需要考虑自己搓 markdown parser 或者调其他第三方的库，wasm SQLite 实在不能接受，一个库顶整个网页的大小</del> 已迁移到 nuxt content v3，为了绕开 wasm SQLite 全部查询都通过 api 在后端跑，通过 <code >useFetch</code> 拉下来做 SSG</li><li >神秘的 SSG 后网页尾部出现重复字符问题可能是一些链接尾斜杠的问题，尝试去除掉以后每次打包都正常了</li></ul></li><li >发现还在用老版本的 gtag 标签名，导致每次加载都会多跑点流量</li><li >现在主题色是 <code >#8BD2B1</code>，开发环境的是 <code >#F58A78</code>，分别取自 BangDream! 手游 7 周年 Pastel*Palettes 和 Poppin'Party 的贺图，之前的绿色在亮色模式下太刺眼了</li></ul> ]]></description>
      <comments>https://blog.nest.moe/fragments#comment</comments>
      <dc:creator><![CDATA[ BANKA2017 ]]></dc:creator>
      <category>fragment</category>
      <category><![CDATA[ 前端 ]]></category>
      <category><![CDATA[ NuxtJS ]]></category>
    </item>
    <item>
      <title><![CDATA[ modified nexus xyz cli ]]></title>
      <link>https://blog.nest.moe/fragments/#modified-nexus-xyz-cli</link>
      <guid>https://blog.nest.moe/fragments/#modified-nexus-xyz-cli</guid>
      <pubDate>Mon, 06 Oct 2025 13:19:00 GMT</pubDate>
      <updated>2025-10-10T17:01:58.000Z</updated>
      <description><![CDATA[ <p >挂 <a href="https://app.nexus.xyz/" href="https://app.nexus.xyz/" rel="nofollow" target="_blank">NEXUS Testnet III</a>，客户端对物理内存有限制，一个线程要 <code >4GB</code> 的物理内存，并且还需要另外保留 <code >25%</code> 的物理内存用于系统和其他进程的运行</p><p >根据观察实际运行中一个线程占用 <code >1.2GB</code> 左右，所以我们可以手动改小 <code >clients/cli/src/consts.rs</code> 的<a href="https://github.com/nexus-xyz/nexus-cli/blob/739b7de78275d312b253e0ba20c8a986593dc278/clients/cli/src/consts.rs#L30" href="https://github.com/nexus-xyz/nexus-cli/blob/739b7de78275d312b253e0ba20c8a986593dc278/clients/cli/src/consts.rs#L30" rel="nofollow" target="_blank">其中一行</a>，使程序能够尽可能地榨干 CPU</p><pre><code language="diff" class="language-diff">- pub const PROJECTED_MEMORY_REQUIREMENT: u64 = 4294967296; // 4gb
+ pub const PROJECTED_MEMORY_REQUIREMENT: u64 = 1288490189; // 1.2gb
</code></pre><p >然后打包运行即可，需要注意的是要自行找到适合的线程数，否则占用太高导致不断假死反而得不偿失</p><p >ps: 树莓派 4B 可以以 2 线程跑到 <code >LARGE</code>，一轮耗时 11 分钟左右</p> ]]></description>
      <comments>https://blog.nest.moe/fragments#comment</comments>
      <dc:creator><![CDATA[ BANKA2017 ]]></dc:creator>
      <category>fragment</category>
      <category><![CDATA[ NEXUS Testnet ]]></category>
    </item>
    <item>
      <title><![CDATA[ fix disqus background ]]></title>
      <link>https://blog.nest.moe/fragments/#fix-disqus-background</link>
      <guid>https://blog.nest.moe/fragments/#fix-disqus-background</guid>
      <pubDate>Sun, 05 Oct 2025 07:00:00 GMT</pubDate>
      <updated>2025-12-12T04:36:45.000Z</updated>
      <description><![CDATA[ <p >自从修正了网页的 color-scheme 以后，Disqus 的背景就一直不正常，暗色模式下会变成白底</p><p >找了半天才找到一个说法：<a href="https://github.com/disqus/disqus-react/issues/150" href="https://github.com/disqus/disqus-react/issues/150" rel="nofollow" target="_blank">Dark Mode (Tailwind) not working #150</a>，改一下 css 就好了</p><pre><code language="css" class="language-css">#disqus_thread {
    color: currentColor;
    color-scheme: none;
}
</code></pre><p >但 Firefox 好像还是会有这个 bug，也不知道怎么回事</p><p >* 2025-12-12 更新</p><p >换成用 js 直接改</p><pre><code language="js" class="language-js">const darkMode = inject('darkMode')

function applyDisqusTheme() {
    const el = document.getElementById('disqus_thread')
    if (!el) return

    if (document.documentElement.classList.contains('dark')) {
        el.style.setProperty('color-scheme', 'dark')
    } else {
        el.style.setProperty('color-scheme', 'light')
    }
}

onMounted(() => {
    setTimeout(applyDisqusTheme, 0)
})

watch(darkMode, () => {
    setTimeout(applyDisqusTheme, 0)
})
</code></pre> ]]></description>
      <comments>https://blog.nest.moe/fragments#comment</comments>
      <dc:creator><![CDATA[ BANKA2017 ]]></dc:creator>
      <category>fragment</category>
      <category><![CDATA[ 前端 ]]></category>
      <category><![CDATA[ Disqus ]]></category>
    </item>
    <item>
      <title><![CDATA[ terminal color scheme ]]></title>
      <link>https://blog.nest.moe/fragments/#terminal-color-scheme</link>
      <guid>https://blog.nest.moe/fragments/#terminal-color-scheme</guid>
      <pubDate>Sun, 05 Oct 2025 03:58:00 GMT</pubDate>
      <updated>2025-10-10T17:01:58.000Z</updated>
      <description><![CDATA[ <blockquote ><p ><em >Rynco Maekawa @<a href="mailto:rynco@dvd.chat" href="mailto:rynco@dvd.chat" target="_blank">rynco@dvd.chat</a> (<a href="https://twitter.com/LynzRand" href="https://twitter.com/LynzRand" rel="nofollow" target="_blank">@LynzRand</a>)</em></p><blockquote ><p >自己做完用了六七年的色弱友好终端配色方案
<code >#000000</code>, <code >#E63E52</code>, <code >#27A881</code>, <code >#FF8C05</code>, <code >#6780DA</code>, <code >#E4288E</code>, <code >#37ADC7</code>, <code >#B9C7CB</code>, <code >#7B8083</code>, <code >#F7929E</code>, <code >#16D0AF</code>, <code >#E1DA3B</code>, <code >#B0C2FF</code>, <code >#BC42DB</code>, <code >#2FEDED</code>, <code >#FFFFFF</code></p></blockquote><p ><a href="https://twitter.com/LynzRand/status/1974643513561395374" href="https://twitter.com/LynzRand/status/1974643513561395374" rel="nofollow" target="_blank">https://twitter.com/LynzRand/status/1974643513561395374</a></p></blockquote> ]]></description>
      <comments>https://blog.nest.moe/fragments#comment</comments>
      <dc:creator><![CDATA[ BANKA2017 ]]></dc:creator>
      <category>fragment</category>
      <category><![CDATA[ 前端 ]]></category>
      <category><![CDATA[ 设计 ]]></category>
    </item>
    <item>
      <title><![CDATA[ migrate to nuxt content v3 ]]></title>
      <link>https://blog.nest.moe/fragments/#migrate-to-nuxt-content-v3</link>
      <guid>https://blog.nest.moe/fragments/#migrate-to-nuxt-content-v3</guid>
      <pubDate>Mon, 28 Apr 2025 07:42:34 GMT</pubDate>
      <updated>2025-05-04T08:10:03.000Z</updated>
      <description><![CDATA[ <p >2022 年，我快乐地<a href="/posts/hexo-to-nuxtjs" href="/posts/hexo-to-nuxtjs" target="_blank">将博客迁移到了 Nuxt</a></p><p >2024 年，我记录了维护这个 Nuxt 博客<a href="/posts/nuxt-is-not-the-silver-bullet" href="/posts/nuxt-is-not-the-silver-bullet" target="_blank">遇过的事情</a></p><p >2025 年，我要跑路了</p><p >众所周知，Nuxt content 官网的文档都是语焉不详的，能参考文档完成的迁移只占很小一部分。剩下的只能在遇到问题时多翻 issue</p><p >这次更新最大也是最明显的改动就是查询底层的语法从类 MongoDB 变成了 SQL</p><p >因此需要自己写 schema 用于建表，启动时会扫描 <code >/content</code> 目录把符合要求的内容全部写到数据库里面</p><p >既然底层改了，那查询的 DSL 也要改，直接大改造</p><p >输出 Markdown 的 AST 也改了，那基于 v2 写的 body parser 怎么办，没办法搓了个 Wrapper 用来把 AST 改回原本 v2 时的输出</p><pre><code language="javascript" class="language-javascript">export const NuxtContentV3ASTWrapper = (body) => {
    let _type = 'element'

    if (Array.isArray(body[0])) {
        _type = 'root'
    } else if (typeof body === 'string') {
        _type = 'text'
    }

    let tmpElement = {
        type: _type
    }
    if (_type === 'text') {
        tmpElement.value = body
    } else if (_type === 'root') {
        tmpElement.children = body.map((children) => NuxtContentV3ASTWrapper(children))
    } else {
        tmpElement.tag = body[0]
        tmpElement.props = body[1]
        if (_type === 'element') {
            tmpElement.children = body.slice(2).map((children) => NuxtContentV3ASTWrapper(children))
        }
    }

    return tmpElement
}
</code></pre><p >默认的时间戳变成了 <code >z.date()</code> ，别忘了旧版 Safari 不支持 ISO 8601</p><pre><code language="javascript" class="language-javascript">post.date.replaceAll('-', '/').replace('T', ' ')
</code></pre><p >用于 Server 的 <code >serverQueryContent</code> 直接被删了，要用只能 <code >queryCollection(event, 'collection-name')</code>，然后看着 typescript 检查爆红</p><p >在我解决完这些问题以后，我还没意识到问题的严重性，当我随手检查开发者控制台的时候，我发现了 SQLite wasm 的请求……</p><p >这不对吧？在我费尽心思想要节省那丁点流量消耗的时候，一个 wasm 下场杀死了比赛</p><p >我一开始就看到缓存文件里面的数据库，我以为这个 SQLite 只是用于打包时的优化，用临时介质来优化处理速度是很正常的，我就没多想</p><p >但，我一个简简单单的博客，为什么要在前端跑这种重量级的东西？</p><p >也许有人会说几百 KB 并不多，现在谁会在乎那点流量。没错，没人在乎多消耗那一丁点，CDN 还会压缩优化。但跟 v2 相比呢？为了这点东西多消耗了多少倍？我做了个粗略的比较：</p><p >新旧两版同时打开首页，然后打开第一篇文章</p><pre><code language="txt" class="language-txt"># blog.nest.moe
58 requests | 488 kB transferred | 1.3 MB resources
# localhost
56 requests | 1.3 MB transferred | 2.7 MB resources
</code></pre><p >显然，社区里面被这个新特性苦恼的使用者<a href="https://github.com/nuxt/content/issues/3050" href="https://github.com/nuxt/content/issues/3050" rel="nofollow" target="_blank">不止我一个</a>，Nuxt 官方的人员也有回复<a href="https://github.com/nuxt/content/issues/3050#issuecomment-2637687598" href="https://github.com/nuxt/content/issues/3050#issuecomment-2637687598" rel="nofollow" target="_blank">这么干的原因</a>：</p><blockquote ><p >In Nuxt Content v1, we used <a href="https://github.com/techfort/LokiJS" href="https://github.com/techfort/LokiJS" rel="nofollow" target="_blank">LokiJS</a> for the query builder which is now unmaintained for years.</p><p >In Nuxt Content v2, we used <a href="https://github.com/unjs/unstorage" href="https://github.com/unjs/unstorage" rel="nofollow" target="_blank">unstorage</a> + our own query builder which was slower and making the server bundle bigger (was impossible to deploy on workers for instance).</p></blockquote><p >冷静下来我的觉得是这是一个侧重程度的问题，究竟要重<strong >服务端</strong>，还是要<strong >客户端</strong>。作为开发者是很难实现完美平衡的</p><p >Nuxt content 的定位很尴尬，要作为 CMS 比它成熟的现成的方案多种多样，也没有选它的必要</p><p >这个博客一年都出不了几篇文章（那还不赶紧多写点？），自然就没有任何更新上去的理由</p><p >等到 v2 彻底被抛弃并且出现漏洞时（？），大概也是我跟 Nuxt 说拜拜的时候了</p> ]]></description>
      <comments>https://blog.nest.moe/fragments#comment</comments>
      <dc:creator><![CDATA[ BANKA2017 ]]></dc:creator>
      <category>fragment</category>
      <category><![CDATA[ 前端 ]]></category>
      <category><![CDATA[ NuxtJS ]]></category>
    </item>
    <item>
      <title><![CDATA[ beware of vibe coding ]]></title>
      <link>https://blog.nest.moe/fragments/#beware-of-vibe-coding</link>
      <guid>https://blog.nest.moe/fragments/#beware-of-vibe-coding</guid>
      <pubDate>Sun, 13 Apr 2025 16:00:00 GMT</pubDate>
      <updated>2025-05-02T11:00:39.000Z</updated>
      <description><![CDATA[ <p >关于 vibe coding 的争论已经够多了，我无意加入，只是复盘一次修 bug 的过程</p><p ><a href="https://tl.nest.moe" href="https://tl.nest.moe" rel="nofollow" target="_blank">Tweet Listener</a>的爬虫和主站通信使用的是一套运行在 WebRTC 上的内部 RPC，但在一次更新以后，爬虫因为无法从账号池获取到账号而停机</p><p >这问题挺好解决的对吧，找到哪里出问题修了就好了，但问题这时就出现了，前期我出于偷懒并没有打 log，导致根本不知道问题出在哪里，只能把 error log 打出来，然后继续跑直到下一次停机</p><p >等到第二次停机，我发现根本没有什么 error，log 非常干净：在一次常规的掉线重连以后爬虫就进入了神秘的单向通信的状态——能上报数据，但接收不到任何主站下发的配置和账号。数据进了 <code >webrtc.DataChannel.Send()</code> 以后就消失了，但 <code >Send()</code> 也没返回任何错误，然后就卡在这里好几个星期，期间我为爬虫加了一小段代码，用于检测来自主站的消息，当一定时间内接收不到消息时直接 <code >os.exit(1)</code>，让守护程序去保证重启。然后还考虑了组网软件 zerotier 和 tailscale 的影响，停止使用组网的内网 ip，改成直接通过公网 ip 连接</p><p >但问题一直都在，并且还是捉摸不透，连稳定复现的办法都没有。不过还是有一点好消息的：停机越来越频繁，一般不超过 30 小时就能出现一次</p><p >我精简了整个项目的代码，整理出简单的 WebRTC 服务端和客户端，这两个端的工作就是不断连接，连上以后尝试互相发送消息，接收成功以后就断开重连……不断重复，希望能找到原因，期间还是一无所获，我还很迷惑 pion 没有 debug 级别的 log 吗，翻了 issue 都是直接贴代码，没看到几个会贴 log 的……好神奇的 debug 手法</p><p >终于，在一次偶然的机会，我重新查看 pion 仓库的 examples 目录，找到了<a href="https://github.com/pion/webrtc/tree/master/examples/custom-logger" href="https://github.com/pion/webrtc/tree/master/examples/custom-logger" rel="nofollow" target="_blank">一段打 log 的示例</a>，修改了代码过了两天以后，最终于有好消息传来：</p><pre><code language="txt" class="language-txt">customLogger Warn: Failed to start manager: connecting canceled by caller
customLogger Warn: Failed to start SCTP: DTLS not established
customLogger Warn: undeclaredMediaProcessor failed to open SrtpSession: the DTLS transport has not started yet
customLogger Warn: undeclaredMediaProcessor failed to open SrtcpSession: the DTLS transport has not started yet

</code></pre><p >有了这几行文字，自然就能搞清楚问题所在，那么修复手法也就显而易见了：</p><pre><code language="diff" class="language-diff">- Peer.OnICEConnectionStateChange(func(state webrtc.ICEConnectionState) {
-     log.Printf("Peer ICE Connection State Changed: %s [%s]\n", state, rtcContext.Addr)
+ Peer.OnConnectionStateChange(func(state webrtc.PeerConnectionState) {
+     log.Printf("Peer Connection State Changed: %s [%s]\n", state, rtcContext.Addr)
      switch state {
-     case webrtc.ICEConnectionStateConnected:
+     case webrtc.PeerConnectionStateConnected:
          OnConnected()
-     case webrtc.ICEConnectionStateDisconnected, webrtc.ICEConnectionStateClosed, webrtc.ICEConnectionStateFailed:
+     case webrtc.PeerConnectionStateFailed, webrtc.PeerConnectionStateClosed:
          rtcContext.Close()
    }
})
</code></pre><p >很简单的 bug 对吧，一下子就修好了</p><p >现在 bug 修完了，那么 vibe coding 在哪里？接下来就到 chatgpt 的聊天记录复盘了</p><p >去年 12 月想到这个需求的时候我对 WebRTC 一无所知，就一路顺着 chatgpt 的话来写——它给什么我用什么，顶多就简单改改，再经过简单测试一下就上线了</p><p >在 <code >OnICEConnectionStateChange</code> 这里我直接拷贝了代码粘贴上去运行，后面就没看了。其实我只需要往下拉大约 <code >200vh</code> 的网页内容，就能看到用 <code >OnConnectionStateChange</code> 的正解</p><p >但那时我连个概念都没有，怎么会思考两个事件之间会有什么异同呢。并且复现条件要求 ICE 连上但 DTLS 未连接……那么特殊的条件，<code >webrtc.DataChannel.Send()</code> 默认还不抛出 error，谁都不会第一时间想到这种原因，只能一点一点试。现在复盘可以站在上帝视角知晓一切，而在当时，就算我去提 issue，连稳定复现都做不到，又怎么描述呢，总不能 “各位别着急，可能下一秒复现，也可能要等几个星期。另外复现要求东京和洛杉矶各买一台服务器” 吧？</p><p >那么为什么在使用 WebRTC 后，那次更新前又不会停机呢？原因正好就在那次奇怪的更新为了配合特殊用户组自部署的特性，收紧了爬虫的权限：以前爬虫从主站获取账号池的地址和金钥自行连接获取，更新后只能通过主站获取这些配置。账号池跟爬虫位于同一台设备，所以可以非常可靠地直连，而爬虫在设计上只要有稳定的账号供应就能运作（先有爬虫，后来才有主站），所以连接到主站不是必须的；即使连接出现问题上报还是正常的，而启动后第一次连接基本都是正常的，没有任何问题——我连发现监听了不合适的事件的机会都没有</p><p >我也是老菜鸟了，也用过很长时间的 LLM 辅助编程，在无脑相信 LLM 的内容编程时还是翻车了——面对不熟悉的地方连有错有漏都不知道，更别说发现问题在哪了。那么那些时间线上各种<strong >零基础</strong>管杀不管埋的补光灯，是怎么回事就不用多说了……</p><p >2025-05-02 补充</p><p >半个月前写的，然而现在时间线好像见不到这些怪人了，另外爬虫也正常运行已经一百多个小时了（修了别的导致崩溃的 bug 重启过）</p> ]]></description>
      <comments>https://blog.nest.moe/fragments#comment</comments>
      <dc:creator><![CDATA[ BANKA2017 ]]></dc:creator>
      <category>fragment</category>
      <category><![CDATA[ Vibe coding ]]></category>
      <category><![CDATA[ AI ]]></category>
      <category><![CDATA[ 流水账 ]]></category>
    </item>
    <item>
      <title><![CDATA[ building an automatic registration plugin system ]]></title>
      <link>https://blog.nest.moe/fragments/#building-an-automatic-registration-plugin-system</link>
      <guid>https://blog.nest.moe/fragments/#building-an-automatic-registration-plugin-system</guid>
      <pubDate>Thu, 10 Oct 2024 09:16:00 GMT</pubDate>
      <updated>2024-10-10T15:09:26.000Z</updated>
      <description><![CDATA[ <p >用 Golang 和 Nuxt 重写了一个 PHP 软件，到插件系统时懵了，最后花了点时间折腾出来了，这里记录一下思路</p><ul ><li >Golang 同一个包的文件的命名对打包没太大影响（只要不是隐藏文件或者带不打包标记），但同一个包的所有文件会共用变量/函数名称。所以不能重复，要为每个插件准备自己的 namespace 作为变量的<strong >前缀</strong>或者<strong >后缀</strong><ul ><li >准备一个公共的列表变量，以及一个注册函数</li></ul></li></ul><pre><code language="go" class="language-go">// /plugins/hooks.go
type PluginInfo struct {
    Name string
    // ...other data or func
}

var PluginList = make(map[string]PluginInfo)
func RegisterPlugin(name string, plugin PluginInfo) {
    PluginList[name] = plugin
}
```

</code></pre><ul ><li >插件文件也放置在 <code >/plugins/</code>，通过 <a href="https://go.dev/doc/effective_go#init" href="https://go.dev/doc/effective_go#init" rel="nofollow" target="_blank"><code >init()</code></a> 调用 <code >RegisterPlugin()</code> 自动将插件信息注入到 <code >PluginList</code></li></ul><pre><code language="go" class="language-go">// /plugins/example.go
func init() {
    RegisterPlugin(ExamplePlugin.Name, ExamplePlugin)
}

type ExamplePluginType struct {
    PluginInfo
}

var ExamplePlugin = ExamplePluginType{
    Name: "example1"
    //...
}
```

</code></pre><ul ><li >为什么还是要通过修改源码再编译打包实现？因为打包成动态库对系统有限制，还有可能遇到还不知道的坑，不如求稳 <del >反正也只有我在写插件，一块分发更方便</del></li><li >Nuxt 做前端就没啥好说的，反正最终都会注入到 <a href="https://nuxt.com/docs/api/composables/use-router" href="https://nuxt.com/docs/api/composables/use-router" rel="nofollow" target="_blank">router</a> ，Nuxt 有个 <a href="https://nuxt.com/docs/api/utils/define-page-meta" href="https://nuxt.com/docs/api/utils/define-page-meta" rel="nofollow" target="_blank">definePageMeta</a> 可以用来放置页面信息</li></ul><pre><code language="vue" class="language-vue">&#x3C;!--/pages/some-page.vue-->
&#x3C;script setup>
definePageMeta({
  plugin_name: 'example1'
  // ...
})
&#x3C;/script>

&#x3C;!--/pages/another-page.vue-->
&#x3C;script setup>
definePageMeta({
  plugin_name: 'example2'
  // ...
})

const router = useRouter()
console.log(router.currentRoute.value.meta.plugin_name)// example2
console.log(router.getRoutes().find(route => route.name === 'some-page')?.meta.plugin_name) // example1
&#x3C;/script>
</code></pre> ]]></description>
      <comments>https://blog.nest.moe/fragments#comment</comments>
      <dc:creator><![CDATA[ BANKA2017 ]]></dc:creator>
      <category>fragment</category>
      <category><![CDATA[ Nuxt ]]></category>
      <category><![CDATA[ Golang ]]></category>
    </item>
    <item>
      <title><![CDATA[ replace the screen of oneplus 8t ]]></title>
      <link>https://blog.nest.moe/fragments/#replace-the-screen-of-oneplus-8t</link>
      <guid>https://blog.nest.moe/fragments/#replace-the-screen-of-oneplus-8t</guid>
      <pubDate>Mon, 05 Aug 2024 08:29:00 GMT</pubDate>
      <updated>2024-09-06T15:57:34.000Z</updated>
      <description><![CDATA[ <p >万恶起源是<a href="https://twitter.com/manka_takami/status/1715783059415736505" href="https://twitter.com/manka_takami/status/1715783059415736505" rel="nofollow" target="_blank">有一天发现屏幕冒了条绿线</a>，手机是21年1月买的，上官网找了一下保外物料的价格：￥1150……还是凑合着继续用好了，然后就这么用了差不多一年。</p><p >直到昨晚吃过饭又有点受不了十几条绿线，去搜才发现一年前一加就已经针对这事提供以<strong >无修无摔无进水</strong>为前提的保外免费换屏，但官方从来都没有公开宣传过（印度那边的换屏政策也是通过媒体宣布的，一加官方对于这政策没有留下任何记录），于是今天爬起来做完备份就直接跑去本地的 OPPO 售后换屏，顺便自费换块电池。</p><p >一套流程（检测->拆盖->拆机->换屏/电池->组装->清胶打胶封盖->下载 H2OS 刷机->校准指纹传感器）下来大概耗时 2 小时，前 1 小时修机，后 1 小时刷机，我使用的 PixelExperience 没有一加的工程模式，要校准就只能刷回官方的系统，选择 ColorOS 是不可能的，我又不可能让中国售后给我刷 OxygenOS ……那只能折中一下刷大氢了……</p><p >下面是工单节选：</p><table ><thead ><tr ><th align="left">序号</th><th align="left">收费类型</th><th align="left">物料名称</th><th align="left">零售价</th><th align="left">数量</th><th align="left">优惠金额</th><th align="left">理赔金额</th></tr></thead><tbody ><tr ><td align="left">1</td><td align="left">维修</td><td align="left">电池组件</td><td align="left">￥119.00</td><td align="left">1</td><td align="left">￥0.00</td><td align="left">￥0.00</td></tr><tr ><td align="left">2</td><td align="left">维修</td><td align="left">屏幕上盖组件</td><td align="left">￥1150.00</td><td align="left">1</td><td align="left">￥1150.00</td><td align="left">￥0.00</td></tr></tbody></table><p >物料原价合计：￥1269.00，单项优惠金额合计：￥1150.00，理赔金额合计：￥0.00</p><p >刷机期间有一台 9R 来送修，一看屏幕又是熟悉的绿线……</p><p >再后续是刷氧刷 PE 折腾到两三点：自从网页不再发布完整卡刷包以后，一加发了很多 OTA 完整包，我又没有这些包只能每次都下载安装一步一步更新上去，费了很多时间。恢复备份弄到四五点</p><p >希望这玩意能再战三年</p><ul ><li >注1：免费保外换屏服务可能有手机型号限制</li><li >注2：维修前打工单需要查看 IMEI，可能还需要检查购买凭证来确定购买日期</li><li >注3：要校准指纹就最好用官方系统（ColorOS、H2OS、OxygenOS），不然可能会因为缺少工程模式而需要刷机，刷机不保资料。不过也可以选择不校准，拼完等胶水干了就可以拿走了</li><li >注4：维修期间跟小哥聊天，听说 vivo 也有类似的换屏政策</li></ul> ]]></description>
      <comments>https://blog.nest.moe/fragments#comment</comments>
      <dc:creator><![CDATA[ BANKA2017 ]]></dc:creator>
      <category>fragment</category>
      <category><![CDATA[ OnePlus 8t ]]></category>
      <category><![CDATA[ 屏幕竖线 ]]></category>
    </item>
    <item>
      <title><![CDATA[ install chromium on raspberry pi 3b+ ]]></title>
      <link>https://blog.nest.moe/fragments/#install-chromium-on-raspberry-pi-3b+</link>
      <guid>https://blog.nest.moe/fragments/#install-chromium-on-raspberry-pi-3b+</guid>
      <pubDate>Sat, 03 Aug 2024 03:00:00 GMT</pubDate>
      <updated>2024-11-09T05:10:12.000Z</updated>
      <description><![CDATA[ <p >折腾某个 DePIN 项目（互联网是一个圈，早年的挂机网赚玩法换个皮又出来了）要用到 Chromium 插件挂机，拿我自己的笔记本挂怕是到最后连电费都交不起……最后翻箱倒柜找出当年的树莓派3B+</p><p >系统是 Ubuntu 22.04.4 LTS，装上 KDE 、 xrdp（我主要用 Windows 系统自带的 RDP 客户端，如果是其它系统可以用 VNC 代替） 和 Chromium 挂机就完事了</p><pre><code language="shell" class="language-shell">apt install kde-standard xrdp chromium-browser
</code></pre><p >这篇应该会在发币后公开（看看能有多少收益 :)）</p><blockquote ><p >You’ve Successfully Claimed 55.04 GRASS</p></blockquote><p >也太抠了</p><p >啊？怎么就四倍了？？？</p> ]]></description>
      <comments>https://blog.nest.moe/fragments#comment</comments>
      <dc:creator><![CDATA[ BANKA2017 ]]></dc:creator>
      <category>fragment</category>
      <category><![CDATA[ 树莓派 ]]></category>
      <category><![CDATA[ Chromium ]]></category>
    </item>
    <item>
      <title><![CDATA[ using mediapipe language detector for web in nodejs ]]></title>
      <link>https://blog.nest.moe/fragments/#using-mediapipe-language-detector-for-web-in-nodejs</link>
      <guid>https://blog.nest.moe/fragments/#using-mediapipe-language-detector-for-web-in-nodejs</guid>
      <pubDate>Sun, 14 Jul 2024 10:27:00 GMT</pubDate>
      <updated>2025-05-02T11:00:39.000Z</updated>
      <description><![CDATA[ <p >虽然可能没什么用，不过既然花了点时间研究就顺便发出来吧</p><p >首先我要说的是这玩意没什么用，因为它并不开源，用户只能通过 <a href="https://www.npmjs.com/package/@mediapipe/tasks-text" href="https://www.npmjs.com/package/@mediapipe/tasks-text" rel="nofollow" target="_blank">npm</a> 拿到混淆后的版本，其次<a href="https://ai.google.dev/edge/mediapipe/solutions/text/language_detector?hl=zh-cn#configurations_options" href="https://ai.google.dev/edge/mediapipe/solutions/text/language_detector?hl=zh-cn#configurations_options" rel="nofollow" target="_blank">文档</a>也等于没有，参数给了也不一定会用到，不论是 <a href="https://codepen.io/mediapipe-preview/pen/RweLdpK" href="https://codepen.io/mediapipe-preview/pen/RweLdpK" rel="nofollow" target="_blank">官方demo</a> 还是 用户自己实际体验 都跟 <a href="https://mediapipe-studio.webapps.google.com/studio/demo/language_detector" href="https://mediapipe-studio.webapps.google.com/studio/demo/language_detector" rel="nofollow" target="_blank">官网demo</a>（注：官网需要登录 Google 帐号） 的体验不一致</p><p >官方似乎就没考虑过给 Node.js 等非浏览器运行时使用，硬是塞了一个完全没用上的 <code >canvas API</code> 进代码，最后导致其他运行时用不了</p><p >所以要用就得改改文件，由于 npm 包内的文件内容会被压缩到一行，所以要修改的部分基本都是在同一行的，需要单独搜索找到并修改</p><p >同样是因为被压缩到一行，所以我懒得放出特别大的 patch 包……尤其是在这个一次会加载全部内容的碎片栏目</p><pre><code language="diff" class="language-diff"># node_modules/@mediapipe/tasks-text/wasm/text_wasm_internal.js
## begin
#### note: esm only
+ import fs from "fs";
+ import path from "path";
+ import crypto from "crypto";
+ 
+ import { fileURLToPath } from "url";
+ import { dirname } from "path";
+ const __filename = fileURLToPath(import.meta.url);
+ const __dirname = dirname(__filename);
+ 
+ const nodePath = path;
+ const crypto_module = crypto;

#### ---
#### note: esm only
- var fs=require("fs");var nodePath=require("path");
- var crypto_module=require("crypto");

#### ---
### replace
- if(typeof custom_dbg==="undefined"){function custom_dbg(text){console.warn.apply(console,arguments)}}
+ function custom_dbg(text){console.warn.apply(console,arguments)}
#### ---

## end
### replace
#### note: esm only

- if (typeof exports === 'object' &#x26;&#x26; typeof module === 'object')
-   module.exports = ModuleFactory;
- else if (typeof define === 'function' &#x26;&#x26; define['amd'])
-   define([], () => ModuleFactory);
+ export default ModuleFactory

# node_modules/@mediapipe/tasks-text/text_bundle.mjs
### replace
- void 0!==e?this.h.canvas=e:Ui()?this.h.canvas=new OffscreenCanvas(1,1):(console.warn("OffscreenCanvas not supported and GraphRunner constructor glCanvas parameter is undefined. Creating backup canvas."),this.h.canvas=document.createElement("canvas"))
+ this.h.canvas=null

### replace
- if(e&#x26;&#x26;await Oi(e),!self.ModuleFactory)throw Error("ModuleFactory not set.");if(n&#x26;&#x26;(await Oi(n),!self.ModuleFactory))throw Error("ModuleFactory not set.");return self.Module&#x26;&#x26;r&#x26;&#x26;((e=self.Module).locateFile=r.locateFile,r.mainScriptUrlOrBlob&#x26;&#x26;(e.mainScriptUrlOrBlob=r.mainScriptUrlOrBlob)),
#### note: next line is ending with a space " "
+ return 
</code></pre><p >然后就是很不优雅的使用，需要提前将<a href="https://storage.googleapis.com/mediapipe-models/language_detector/language_detector/float32/1/language_detector.tflite" href="https://storage.googleapis.com/mediapipe-models/language_detector/language_detector/float32/1/language_detector.tflite" rel="nofollow" target="_blank">模型</a>下载到本地</p><pre><code language="javascript" class="language-javascript">import { LanguageDetector,FilesetResolver } from "@mediapipe/tasks-text";

import ModuleFactory from "./node_modules/@mediapipe/tasks-text/wasm/text_wasm_internal.js";

import { readFileSync } from "fs";
globalThis.ModuleFactory = ModuleFactory;
global.self = globalThis;

const buf = readFileSync(`./language_detector.tflite`);

const wasmFileSet = await FilesetResolver.forTextTasks('./node_modules/@mediapipe/tasks-text/wasm')

const languageDetector = await LanguageDetector.createFromOptions(wasmFileSet, {
  baseOptions: {
    modelAssetBuffer: new Uint8Array(buf),
    maxResults: -1
  },
});
const textData = "hello";
const result = languageDetector.detect(textData);

console.log(result);

// Graph successfully started running.
// INFO: Created TensorFlow Lite XNNPACK delegate for CPU.
// WARNING: Attempting to use a delegate that only supports static-sized tensors with a graph that has dynamic-sized tensors (tensor#15 is a dynamic-sized tensor).
// W0714 11:12:40.749000  678624 inference_feedback_manager.cc:121] Feedback manager requires a model with a single signature inference. Disabling support for feedback tensors.
// {
//   languages: [ { languageCode: 'en', probability: 0.5111953616142273 } ]
// }
</code></pre><p >我也不知道为什么只能返回一种语言，鉴于 <a href="https://codepen.io/mediapipe-preview/pen/RweLdpK" href="https://codepen.io/mediapipe-preview/pen/RweLdpK" rel="nofollow" target="_blank">官方demo</a> 其实也只会返回一种语言，我也无话可说了</p><ul ><li >注1：本文使用的是当时最新的版本 <a href="https://www.npmjs.com/package/@mediapipe/tasks-text/v/0.10.14" href="https://www.npmjs.com/package/@mediapipe/tasks-text/v/0.10.14" rel="nofollow" target="_blank">@mediapipe/tasks-text@0.10.14</a></li></ul> ]]></description>
      <comments>https://blog.nest.moe/fragments#comment</comments>
      <dc:creator><![CDATA[ BANKA2017 ]]></dc:creator>
      <category>fragment</category>
      <category><![CDATA[ MediaPipe ]]></category>
      <category><![CDATA[ Language Detector ]]></category>
    </item>
    <item>
      <title><![CDATA[ the reason why i still write in chinese ]]></title>
      <link>https://blog.nest.moe/fragments/#the-reason-why-i-still-write-in-chinese</link>
      <guid>https://blog.nest.moe/fragments/#the-reason-why-i-still-write-in-chinese</guid>
      <pubDate>Wed, 10 Jul 2024 16:30:00 GMT</pubDate>
      <updated>2024-07-10T16:38:36.000Z</updated>
      <description><![CDATA[ <p >我一直在用中文写作的原因其实很简单……外语没学好，与其写出非中文和中文使用者都看不懂的奇怪表达，不如用中文写明白写清楚，写到即使机翻也能轻松转换</p><p >不过，我还是进行了新的尝试，前两天我上传了一篇拿 GPT-4o 翻译的库存文章，未来可能还会上传这种机翻润色的文章来帮助到非中文的读者。</p><p >现在归档页面是全语言的文章混合的，未来可能会按照语言来拆分不同的栏目，并且做好其他仅中文的组件的翻译工作</p><hr /><p >The following part is translated using GPT-4o.</p><p >The reason I've been writing in Chinese all along is quite simple: I haven't mastered foreign languages. Instead of producing strange expressions that neither Chinese nor non-Chinese speakers can understand, it's better to write clearly and intelligibly in Chinese, so that even machine translation can easily convert it.</p><p >However, I've tried something new recently. A few days ago, I uploaded a previously written article translated by GPT-4o. In the future, I might upload more machine-translated and polished articles to help non-Chinese readers.</p><p >Currently, the archive page mixes articles in all languages. In the future, I might split it into different sections based on language and ensure proper translation for other Chinese-only components.</p> ]]></description>
      <comments>https://blog.nest.moe/fragments#comment</comments>
      <dc:creator><![CDATA[ BANKA2017 ]]></dc:creator>
      <category>fragment</category>
      <category><![CDATA[ 随想 ]]></category>
      <category><![CDATA[ 水 ]]></category>
    </item>
    <item>
      <title><![CDATA[ import or export json from sqlite ]]></title>
      <link>https://blog.nest.moe/fragments/#import-or-export-json-from-sqlite</link>
      <guid>https://blog.nest.moe/fragments/#import-or-export-json-from-sqlite</guid>
      <pubDate>Tue, 13 Feb 2024 07:20:00 GMT</pubDate>
      <updated>2024-02-13T07:26:44.000Z</updated>
      <description><![CDATA[ <p >最近在折腾贴吧列表，为了方便处理数据，我把数据库转成 <code >json</code> 再进行处理</p><ul ><li ><a href="https://stackoverflow.com/questions/5491858/how-to-export-sqlite-to-json" href="https://stackoverflow.com/questions/5491858/how-to-export-sqlite-to-json" rel="nofollow" target="_blank">How to export SQLite to JSON?</a></li><li ><a href="https://stackoverflow.com/questions/46407770/how-to-convert-a-json-file-to-an-sqlite-database" href="https://stackoverflow.com/questions/46407770/how-to-convert-a-json-file-to-an-sqlite-database" rel="nofollow" target="_blank">How to convert a JSON file to an SQLite database</a></li></ul> ]]></description>
      <comments>https://blog.nest.moe/fragments#comment</comments>
      <dc:creator><![CDATA[ BANKA2017 ]]></dc:creator>
      <category>fragment</category>
      <category><![CDATA[ sqlite ]]></category>
      <category><![CDATA[ json ]]></category>
    </item>
    <item>
      <title><![CDATA[ renew the passport ]]></title>
      <link>https://blog.nest.moe/fragments/#renew-the-passport</link>
      <guid>https://blog.nest.moe/fragments/#renew-the-passport</guid>
      <pubDate>Thu, 14 Dec 2023 11:07:00 GMT</pubDate>
      <updated>2023-12-24T10:12:54.000Z</updated>
      <description><![CDATA[ <p >年初我就想着去更新我那个早在 2018 年就过期的护照，结果一路拖到年末才去，前后10分钟就搞定了，之前在网上看的一大堆“教程”似乎也没什么用</p><p >在移民局小程序预约最大的作用是提早填好一大堆琐碎的东西，不必到现场再填，现场并没有多少人，所以不看预约，直接去也是可以的</p><p >拍照可以现场用自助机拍照，至于要穿有衣领的衣服什么的古早规定早就不用在意了……</p><p >然后就是经典的提交相片回执和身份证，签名，交钱，然后就没了</p><p >邮寄 18CNY 每本</p><p >旧护照/通行证也不管，不回收也不剪角，所以可以不带</p><p >最后战绩：</p><ul ><li ><input checked="true" disabled="true" type="checkbox"></input> 护照</li><li ><input checked="true" disabled="true" type="checkbox"></input> 港澳通行证</li><li ><input disabled="true" type="checkbox"></input> 台湾通行证（说是没开，那之前看的推友们是怎么办成的？）</li></ul><p >后续补充：</p><p >移民局小程序查到<strong >待取证</strong>状态就可以带身份证直接去自助机取了，那张写着要带的回执并没有用上</p><p >另外自助机真的很慢很慢……</p> ]]></description>
      <comments>https://blog.nest.moe/fragments#comment</comments>
      <dc:creator><![CDATA[ BANKA2017 ]]></dc:creator>
      <category>fragment</category>
      <category><![CDATA[ 护照 ]]></category>
    </item>
    <item>
      <title><![CDATA[ update the style of blog ]]></title>
      <link>https://blog.nest.moe/fragments/#update-the-style-of-blog</link>
      <guid>https://blog.nest.moe/fragments/#update-the-style-of-blog</guid>
      <pubDate>Tue, 28 Nov 2023 09:46:00 GMT</pubDate>
      <updated>2023-12-10T17:01:44.000Z</updated>
      <description><![CDATA[ <p >翻 md3 官网时看到一个 <a href="https://www.figma.com/community/plugin/1034969338659738588/material-theme-builder" href="https://www.figma.com/community/plugin/1034969338659738588/material-theme-builder" rel="nofollow" target="_blank">figma 插件</a>，于是就改造了一下，现在支持主题色了，分享一下主题色是 <code >#1a6356</code></p> ]]></description>
      <comments>https://blog.nest.moe/fragments#comment</comments>
      <dc:creator><![CDATA[ BANKA2017 ]]></dc:creator>
      <category>fragment</category>
      <category><![CDATA[ 前端 ]]></category>
      <category><![CDATA[ Material Design ]]></category>
    </item>
    <item>
      <title><![CDATA[ twitter datacenter location ]]></title>
      <link>https://blog.nest.moe/fragments/#twitter-datacenter-location</link>
      <guid>https://blog.nest.moe/fragments/#twitter-datacenter-location</guid>
      <pubDate>Sat, 21 Oct 2023 03:16:00 GMT</pubDate>
      <updated>2023-12-10T17:01:44.000Z</updated>
      <description><![CDATA[ <p >Some twitter api endpoints location</p><h3 id="north-america">North America</h3><ul ><li >Atlanta, GA</li><li >Portland, OR</li></ul><p >* I made a mistake, <strong >NOT ALL</strong> verified accounts send tweets to Atlanta</p><h3 id="south-america">South America</h3><ul ><li >Sao Paulo, BR</li></ul><h3 id="europe">Europe</h3><ul ><li >London, UK</li></ul><h3 id="asia">Asia</h3><ul ><li >Tokyo, JP</li><li >Singapore, SG</li></ul><h3 id="oceania">Oceania</h3><ul ><li >Sydney, SYD</li></ul> ]]></description>
      <comments>https://blog.nest.moe/fragments#comment</comments>
      <dc:creator><![CDATA[ BANKA2017 ]]></dc:creator>
      <category>fragment</category>
      <category><![CDATA[ Twitter ]]></category>
    </item>
    <item>
      <title><![CDATA[ create a high concurrency crawler in golang ]]></title>
      <link>https://blog.nest.moe/fragments/#create-a-high-concurrency-crawler-in-golang</link>
      <guid>https://blog.nest.moe/fragments/#create-a-high-concurrency-crawler-in-golang</guid>
      <pubDate>Sun, 15 Oct 2023 08:15:00 GMT</pubDate>
      <updated>2024-08-03T03:24:38.000Z</updated>
      <description><![CDATA[ <p >最近学习了一番怎么写高并发的爬虫</p><p >首先丢掉的是用了很久的 Node.js，类型转过来倒过去时间就被浪费掉了，想了半天我还记得又便于部署的语言，就剩下 golang 了</p><p >然后到了各种被各种“教程”写到烂的优化办法，我就不细讲了</p><ul ><li ><del >尽量不用 https，用也不验证证书（所以要我自己保证连接安全？）</del></li><li >调大 MaxIdleConnsPerHost 和 MaxIdleConns……具体用处好像是 <code >Transport</code> 的连接池保留多少连接
超时肯定要设置的，不然等着卡死吧</li><li >goroutine + channel，都用 go 了，这个没什么好说的</li><li >什么代理和帐号池？常规操作不值一提</li><li >用 <code >json.NewDecoder(..).Decode(...) / json.NewEncoder(..).Encode(...)</code> 替代更慢的 <code >json.Marshal() / json.Unmarshal()</code>，同时关掉 <code >json.NewEncoder(..)</code> 的转义 html 选项</li><li >少点输出，输出也占时间，而且还不少，在我羸弱的树莓派上面能用几百毫秒</li></ul><p >然而还是有个一个奇奇怪怪的接口，它的反爬手法是限制单个 tcp 连接的总请求数…… stackoverflow 的回答说 <code >http.Client</code> 没有这个方法，得自己手操 tcp 连接池（<code >net.Dial()</code>），GPT 只会跟我说要 <code >response.Body.Close()</code>，手操连接池什么的还是饶了我吧……经过几天的现场学习，我暂且算是想到了一个解决办法，丢在这里算是抛砖引玉吧</p><pre><code language="go" class="language-go">package main

import (
    "io"
    "log"
    "net/http"
    "time"
)

func initClient() *http.Client {
    var transport = http.DefaultTransport.(*http.Transport).Clone()
    return &#x26;http.Client{
        Timeout:   time.Second,
        Transport: transport,
    }
}

var sequence = 0
var client *http.Client
var maxConnection = 100

func main() {
    client = initClient()
    var requestTicker = time.NewTicker(time.Millisecond * 100)
    for {
        select {
        case &#x3C;-requestTicker.C:
            if sequence%maxConnection == 0 {
                client = initClient()
            }
            go func() {
                req, _ := http.NewRequest("GET", "http://example.com", nil)
                response, err := client.Do(req)
                if err != nil {
                    log.Fatal(err)
                    return
                }
                defer response.Body.Close()
                str, _ := io.ReadAll(response.Body)
                log.Println(string(str[:]))
            }()
            sequence++
        }
    }
}
</code></pre><p >大概思路就是次数够了就创建一个新的 <code >http.Client()</code>，再用指针 <code >client</code> 指向它，原来的 <code >http.Client()</code> 会继续执行到结束，然后被 GC 回收 &#x3C;- 不知道 GPT 有没有坑我</p> ]]></description>
      <comments>https://blog.nest.moe/fragments#comment</comments>
      <dc:creator><![CDATA[ BANKA2017 ]]></dc:creator>
      <category>fragment</category>
      <category><![CDATA[ 爬虫 ]]></category>
      <category><![CDATA[ golang ]]></category>
      <category><![CDATA[ 水 ]]></category>
    </item>
    <item>
      <title><![CDATA[ build a guest account pool ]]></title>
      <link>https://blog.nest.moe/fragments/#build-a-guest-account-pool</link>
      <guid>https://blog.nest.moe/fragments/#build-a-guest-account-pool</guid>
      <pubDate>Mon, 21 Aug 2023 19:38:00 GMT</pubDate>
      <updated>2023-08-22T09:34:51.000Z</updated>
      <description><![CDATA[ <p >最近 Twitter 费尽心思在阻止用户和开发者匿名访问推文内容，尽管我在 nitter 的 <a href="https://github.com/zedeus/nitter/issues/983#issuecomment-1681199357" href="https://github.com/zedeus/nitter/issues/983#issuecomment-1681199357" rel="nofollow" target="_blank">issue</a> 提出取得访客帐号并签名请求的方案，但在<a href="/posts/how-to-crawl-twitter-with-android" href="/posts/how-to-crawl-twitter-with-android" target="_blank">本篇</a>我也提到过要运行这玩意需要大量的访客帐号，所以单打独斗可能不是一个好的办法。</p><p >压力大时我就会胡思乱想，想着能不能构建一个分布式的帐号池，由于 Twitter 客户端的请求统一采用 OAuth 签名，这一套方案甚至能在访客帐号彻底失效后继续由人工录入 userbot 的各种信息的方式延续下去。</p><p >架构我就参考 ZeroTier，总共分成三级：</p><ul ><li >Planet，这个是中心节点，会保存属于自己的帐号池，通过录入添加的 userbot 在允许共享前也只会存在这里，下一层的节点会跟此节点共享帐号池；Planet 可以自由地允许或者移除下一级别的节点的连接；基于上一点，Planet 需要公网可访问。</li><li >Node，Node 可以自由地选择连接到一个或多个 Planet，同一 Planet 下的 Node 会共享帐号池，Node 可以理解为一种基础设施，是所有人都能用的</li><li >Leaf，叶节点专注于获得访客帐号，只能单向将获取到的访客帐号传输给 Node，一般用于没有公网ip的设备，如果设备能在公网访问，其实可以跟 Node 节点合并。</li></ul><p >Planet 可以开放 API 供外部调用，发号顺序应该是 本机的访客帐号 > 同步来的访客帐号 > 本机的 userbot 帐号（如果开放）</p><p >这只是一个想法，还有很多不完善的地方，暂时想到的：</p><ul ><li >如何防止”串号“的情况发生？方案似乎没有解决这个问题。</li><li >存储方面我在考虑 SQLite，也许会有更好的方案？</li><li >通信用什么方式，长连接？WebSocket？还是别的，我不知道。如果一个 Planet 连接着大量的下一级节点，会不会因为这些连接拖慢整个系统的运行效率？</li><li >怎么防止恶意请求？如果每位 Planet 控制者都限制他人的连接这还叫不叫“分布式”？</li><li >如果将整个架构改成类似 bt 的架构，Planet 改成类似 Tracker，Node 之间共享访客帐号，这时 Twitter 偷偷也建立一个 Node 节点加进来，将所有的帐号都一网打尽时又该如何应对？</li><li >访客帐号有效期只有一个月，一个月后怎么同步删除？</li></ul><p >当然啦，这只是我的一点想法，目前我还没有时间和精力去完善那些问题，甚至还没新建文件夹。</p><p >也许只是又一个在我的胡思乱想下的无用产物。</p> ]]></description>
      <comments>https://blog.nest.moe/fragments#comment</comments>
      <dc:creator><![CDATA[ BANKA2017 ]]></dc:creator>
      <category>fragment</category>
      <category><![CDATA[ 随想 ]]></category>
      <category><![CDATA[ Twitter ]]></category>
    </item>
    <item>
      <title><![CDATA[ create a rolling emoji component ]]></title>
      <link>https://blog.nest.moe/fragments/#create-a-rolling-emoji-component</link>
      <guid>https://blog.nest.moe/fragments/#create-a-rolling-emoji-component</guid>
      <pubDate>Tue, 15 Aug 2023 19:45:00 GMT</pubDate>
      <updated>2023-10-15T09:30:52.000Z</updated>
      <description><![CDATA[ <p >在两个月前的某一天，我就想到了我这个 blog 的标题栏的那个 <strong >の</strong> 很适合拿来替换成各种各样的元素，于是这个组件的雏形就出来了：</p><ul ><li >单字。因为 <strong >の</strong> 也是单字，这就意味着中间的元素需要尽量方正，否则切换时会让标题反复横跳，于是 emoji 就成了我的首选</li><li >扁平化。当时我看了 Android 和 iOS 自带的 emoji，感觉都不够平，于是选了微软的 fluent-emoji-flat，由于微软一向不自绘各种国旗，所以想要国旗的只能自己另找图标了</li><li >动画。直接切换太生硬了，加点动画是很有必要的</li><li >可筛选时间。目前我写了一套简单的方法来决定什么时候放什么 emoji，以后独立成组件时应该会用相关轮子来提高可玩性</li></ul><p >至于怎么引入 svg，我试了好几种，目前的方案是 @iconify-json + @unocss，这并不是最优解，我还需要自己在 <code >uno.config.ts</code> 加 <code >safelist</code></p><p >动画用了点奇技淫巧，本来我想像轮播图那样滚动，js 控制当前要显示的元素，css 控制动画，于是不同步的计时器就会导致动画跑完了图还没切最后一闪而过的问题，最后选择用 <code >position: absolute</code> + <code >display: none</code> 来让所有元素都堆在同一位置，再把进出的动画拆分，当下一个元素显示时当前元素会淡出，最后不透明度变 <code >0</code>，从视觉上消失</p> ]]></description>
      <comments>https://blog.nest.moe/fragments#comment</comments>
      <dc:creator><![CDATA[ BANKA2017 ]]></dc:creator>
      <category>fragment</category>
      <category><![CDATA[ 前端 ]]></category>
      <category><![CDATA[ 滚动emoji ]]></category>
    </item>
    <item>
      <title><![CDATA[ create a balloon component ]]></title>
      <link>https://blog.nest.moe/fragments/#create-a-balloon-component</link>
      <guid>https://blog.nest.moe/fragments/#create-a-balloon-component</guid>
      <pubDate>Sat, 05 Aug 2023 17:27:00 GMT</pubDate>
      <updated>2026-02-08T16:28:54.000Z</updated>
      <description><![CDATA[ <p >前段时间心血来潮写 <del >chāo</del> 了个类似 Twitter 生日气球的组件，因为是 vue 组件所以这边也能玩，点卡片右下角的气球标就会放气球，鼠标移上去就可以戳爆了，气球跑完以后再点再放</p><p >跟原版有小改动以适应博客环境，未来会加入好玩的组件大包中。</p><ul ><li >调教水平有限，直接用原版左右飘关键帧得到的效果过于诡异，所以我去掉了</li><li >击破统计挡字的可以点一下以清零隐藏</li></ul><balloon-pop ></balloon-pop> ]]></description>
      <comments>https://blog.nest.moe/fragments#comment</comments>
      <dc:creator><![CDATA[ BANKA2017 ]]></dc:creator>
      <category>fragment</category>
      <category><![CDATA[ 前端 ]]></category>
      <category><![CDATA[ 生日气球 ]]></category>
    </item>
    <item>
      <title><![CDATA[ use self hosted github actions runner ]]></title>
      <link>https://blog.nest.moe/fragments/#use-self-hosted-github-actions-runner</link>
      <guid>https://blog.nest.moe/fragments/#use-self-hosted-github-actions-runner</guid>
      <pubDate>Sat, 05 Aug 2023 16:12:00 GMT</pubDate>
      <updated>2023-08-05T18:20:55.000Z</updated>
      <description><![CDATA[ <p >最近用 GitHub Actions 来更新静态资产，由于涉及到爬虫，需要跟第三方网站交互，我感觉用官方实例来跑有可能会像那些跑签到脚本的仓库那样被封，终究还是自托管一个实例。</p><p >吐槽几句：</p><ul ><li >每个实例只能用于一个仓库，不能重复添加……想加个仓库？那就再新建一个文件夹吧……</li><li >没有 yarn，首次使用时需要自己装，另外我这台甲骨文的小鸡跑 <code >npm i</code> 直接跑挂了，不知什么问题</li><li >上半年 GitHub 泄露了私钥因此最近更换了公钥，我用的其中一个组件没更新 <code >known_hosts</code> ，最后<a href="https://github.com/BANKA2017/git-publish-subdir-action/commit/96f97bfe2bd2c9cf2ea961b46143a4bb481057e1" href="https://github.com/BANKA2017/git-publish-subdir-action/commit/96f97bfe2bd2c9cf2ea961b46143a4bb481057e1" rel="nofollow" target="_blank">自己换上去</a>就好了，没有用 <code >KNOWN_HOSTS_FILE</code> 是因为文档也没细讲干脆一改了之</li><li >后来翻阅 <a href="https://docs.github.com/en/site-policy/github-terms/github-terms-for-additional-products-and-features#actions" href="https://docs.github.com/en/site-policy/github-terms/github-terms-for-additional-products-and-features#actions" rel="nofollow" target="_blank">GitHub 附加产品和功能条款</a>，发现 <strong >此外，无论操作是否使用自托管运行器，Actions 都不应用于...</strong>，使用自托管也还是有风险，今后可能还是会换成 <code >ci/cd + cron</code> 的方案（主要是简单了解一下市面上的那些 ci/cd 占内存都是以 <code >GB</code> 为单位的，而我的小鸡的内存 <code >1GB</code> 都不到</li></ul> ]]></description>
      <comments>https://blog.nest.moe/fragments#comment</comments>
      <dc:creator><![CDATA[ BANKA2017 ]]></dc:creator>
      <category>fragment</category>
      <category><![CDATA[ GitHub Actions ]]></category>
    </item>
    <item>
      <title><![CDATA[ sqlite with sequelize ]]></title>
      <link>https://blog.nest.moe/fragments/#sqlite-with-sequelize</link>
      <guid>https://blog.nest.moe/fragments/#sqlite-with-sequelize</guid>
      <pubDate>Mon, 24 Jul 2023 18:50:00 GMT</pubDate>
      <updated>2023-07-24T19:14:30.000Z</updated>
      <description><![CDATA[ <p >怎么说呢……体验就是很难受：</p><ul ><li >由于 SQLite 的库不像 MySQL 的那样支持自动将 <code >BIGINT</code> 转成 <code >TEXT</code>，只能自己想办法，找了半天找到一个 <code >CAST(&#x3C;AA> AS text) AS &#x3C;AA></code>，然后就是很苦逼地挨个去拷贝粘贴</li></ul><pre><code language="javascript" class="language-javascript">  attributes: [
      [Sequelize.options.dialect === 'sqlite' ? Sequelize.literal('CAST(value AS text)') : 'value', 'value'],
  ]
</code></pre><ul ><li >没有 <code >MATCH...AGAINST</code>，<code >MATCH</code> 还在研究怎么搞，<code >REGEXP</code> 那个耗时看着就头疼，最后只能回归 <code >LIKE%%</code> 大法</li><li >全局大锁直接锁死了，不知为啥 <code >WAL</code> 模式也救不了，写都写不进去；高 <code >I/O</code> 的查询直接歇菜，动不动就是几十秒的耗时</li></ul><p >吐槽归吐槽，最后还要继续折腾……</p> ]]></description>
      <comments>https://blog.nest.moe/fragments#comment</comments>
      <dc:creator><![CDATA[ BANKA2017 ]]></dc:creator>
      <category>fragment</category>
      <category><![CDATA[ Sequelize ]]></category>
      <category><![CDATA[ SQLite ]]></category>
      <category><![CDATA[ 吐槽 ]]></category>
    </item>
    <item>
      <title><![CDATA[ use cloudflare to proxy b2 bucket ]]></title>
      <link>https://blog.nest.moe/fragments/#use-cloudflare-to-proxy-b2-bucket</link>
      <guid>https://blog.nest.moe/fragments/#use-cloudflare-to-proxy-b2-bucket</guid>
      <pubDate>Thu, 20 Jul 2023 17:20:00 GMT</pubDate>
      <updated>2023-07-21T06:25:33.000Z</updated>
      <description><![CDATA[ <p >一直都有听说 B2 桶，但注册以后用不上只能摆在一边吃灰，最近准备将跑了三年半的 bing 每日图片丢上云，于是这玩意就成了省钱利器。</p><p >什么注册账号配置代理这些烂大街的内容就不说了，看 <a href="https://51.ruyo.net/17895.html" href="https://51.ruyo.net/17895.html" rel="nofollow" target="_blank">如有乐享的文章</a> 就好。</p><p >这里就补充一个，应该是前人写文章时还没出的功能：Redirect Rules。</p><ul ><li >If...</li><li ><input disabled="true" type="checkbox"></input> All incoming requests</li><li ><input checked="true" disabled="true" type="checkbox"></input> Custom filter expression</li><li >When incoming requests match…</li></ul><p ><code >(http.host eq "b2.example.com" and http.request.uri.query ne "")</code></p><ul ><li >Then...</li></ul><table ><thead ><tr ><th align="center">Type</th><th align="center">Expression</th><th align="center">Status code</th></tr></thead><tbody ><tr ><td align="center">Dynamic</td><td align="center"><code >concat("https://b2.example.com", http.request.uri.path)</code></td><td align="center"><code >301</code></td></tr></tbody></table><ul ><li ><input disabled="true" type="checkbox"></input> Preserve query string</li></ul><p >其中那个 <code >b2.example.com</code> 改成自己的 <code >host</code></p><p >这样做主要是防止被有心人无限改查询字符串刷调用次数，毕竟 <code >2500</code> 次动动手指就刷完了。</p> ]]></description>
      <comments>https://blog.nest.moe/fragments#comment</comments>
      <dc:creator><![CDATA[ BANKA2017 ]]></dc:creator>
      <category>fragment</category>
      <category><![CDATA[ Cloudflare ]]></category>
      <category><![CDATA[ Backblaze B2 ]]></category>
    </item>
    <item>
      <title><![CDATA[ capture network traffic on android 9 ]]></title>
      <link>https://blog.nest.moe/fragments/#capture-network-traffic-on-android-9</link>
      <guid>https://blog.nest.moe/fragments/#capture-network-traffic-on-android-9</guid>
      <pubDate>Fri, 07 Jul 2023 04:20:25 GMT</pubDate>
      <updated>2023-08-22T09:34:51.000Z</updated>
      <description><![CDATA[ <h3 id="签发证书">签发证书</h3><p >先把证书导出来得到一个 <code >FiddlerRoot.cer</code>，</p><pre><code language="shell" class="language-shell">openssl x509 -inform der -in FiddlerRoot.cer -out fiddler.pem
file1=$(openssl x509 -inform PEM -subject_hash_old -in fiddler.pem | head -1)
cat fiddler.pem > "$file1.0"
openssl x509 -inform PEM -text -in fiddler.pem -out /dev/null >>"$file1.0"
file2=$(openssl x509 -inform PEM -subject_hash -in fiddler.pem | head -1)
cat fiddler.pem > "$file2.0"
openssl x509 -inform PEM -text -in fiddler.pem -out /dev/null >>"$file2.0"
</code></pre><p >然后将生成的这两个文件拷贝到 <code >/system/etc/security/cacerts/</code> 目录下，重启设备。</p><h3 id="ssl-pinning-bypass">SSL Pinning Bypass</h3><p ><a href="https://github.com/LSPosed/LSPosed" href="https://github.com/LSPosed/LSPosed" rel="nofollow" target="_blank">LSPosed</a> + <a href="https://github.com/Fuzion24/JustTrustMe" href="https://github.com/Fuzion24/JustTrustMe" rel="nofollow" target="_blank">JustTrustMe</a></p> ]]></description>
      <comments>https://blog.nest.moe/fragments#comment</comments>
      <dc:creator><![CDATA[ BANKA2017 ]]></dc:creator>
      <category>fragment</category>
      <category><![CDATA[ Android ]]></category>
      <category><![CDATA[ Fiddler ]]></category>
      <category><![CDATA[ 抓包 ]]></category>
    </item>
    <item>
      <title><![CDATA[ try svelte ]]></title>
      <link>https://blog.nest.moe/fragments/#try-svelte</link>
      <guid>https://blog.nest.moe/fragments/#try-svelte</guid>
      <pubDate>Tue, 30 May 2023 09:14:00 GMT</pubDate>
      <updated>2023-06-29T15:26:17.000Z</updated>
      <description><![CDATA[ <p >拿 Svelte 来重构了一下blog，虽然最后没完成，不过还是挺有意思的，处理 Markdown 的生态一般，有种 <strong >戴着镣铐跳舞的感觉</strong>。</p><p >留下了一个本来用来替换掉右下角 <code >NuxtJS</code> 标的玩意。</p><svelte-brand ></svelte-brand> ]]></description>
      <comments>https://blog.nest.moe/fragments#comment</comments>
      <dc:creator><![CDATA[ BANKA2017 ]]></dc:creator>
      <category>fragment</category>
      <category><![CDATA[ 尝试 ]]></category>
      <category><![CDATA[ Svelte ]]></category>
    </item>
    <item>
      <title><![CDATA[ top ]]></title>
      <link>https://blog.nest.moe/fragments/#top</link>
      <guid>https://blog.nest.moe/fragments/#top</guid>
      <pubDate>Thu, 23 Mar 2023 10:00:00 GMT</pubDate>
      <updated>2024-07-10T16:38:36.000Z</updated>
      <description><![CDATA[ <p ><strong >Fragments</strong> 用于存放不适合单独成文的碎片内容。</p><p >内容随心所欲，没有方向限制。本页内容独立于归档文章，单独设置 RSS 全文订阅</p> ]]></description>
      <comments>https://blog.nest.moe/fragments#comment</comments>
      <dc:creator><![CDATA[ BANKA2017 ]]></dc:creator>
      <category>fragment</category>
    </item>
  </channel>
</rss>