<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Tokisaki Galaxy的博客</title><description>Tokisaki Galaxy</description><link>https://tski.uk/</link><language>zh_CN</language><item><title>搭建博客</title><link>https://tski.uk/blog/make-blog/</link><guid isPermaLink="true">https://tski.uk/blog/make-blog/</guid><description>使用vercel托管博客，并使用cloudflare进行访问加速</description><pubDate>Wed, 22 Apr 2020 18:31:54 GMT</pubDate><content:encoded>&lt;h2&gt;第一部分&lt;/h2&gt;
&lt;h3&gt;HEXO简介&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;Hexo 是一个快速、简洁且高效的博客框架。Hexo 使用 &lt;a href=&quot;http://daringfireball.net/projects/markdown/&quot;&gt;Markdown&lt;/a&gt;（或其他渲染引擎）解析文章，在几秒内，即可利用靓丽的主题生成静态网页。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;原来我是用jekyll的，但是无奈支持的东西比较少，生成速度慢，所以改HEXO。&lt;/p&gt;
&lt;h4&gt;1. 安装HEXO&lt;/h4&gt;
&lt;p&gt;&lt;a href=&quot;https://hexo.io/zh-cn/docs/index.html&quot;&gt;HEXO中文文档&lt;/a&gt;上都有&lt;/p&gt;
&lt;h4&gt;2.新建存储库&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;如果你是把整个HEXO文件夹上传！！一定要设成私有！！&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;如果你用deploy部署，那随便你设不设私有&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;去Github上新建一个存储库，名字随便，记得&lt;strong&gt;设置私有&lt;/strong&gt;。保证只有你和vercel上的机器人看得到。&lt;/p&gt;
&lt;p&gt;至于为什么把整个HEXO上传，原因是如果你换一台电脑不是还可以接写博客吗。&lt;/p&gt;
&lt;h4&gt;3.初始化HEXO&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;hexo init
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;关联Github&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cd hexo
echo &quot;# Blog&quot; &amp;gt;&amp;gt; README.md
git init
git add README.md
git commit -m &quot;first commit&quot;
git branch -M main
git remote add origin git@github.com:Tokisaki-Galaxy/blog.git   #这里的路径换成你自己的存储库地址
git push -u origin main
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;3.下载主题，设置submodule&lt;/h4&gt;
&lt;p&gt;直接把模板clone下来之后后继更新非常麻烦，所以使用submodule。&lt;/p&gt;
&lt;p&gt;推荐模板&lt;a href=&quot;https://github.com/blinkfox/hexo-theme-matery&quot;&gt;hexo-theme-matery&lt;/a&gt;（当然你用别的也行）。&lt;/p&gt;
&lt;p&gt;先在网页上fork到自己的存储库里，然后在根目录中执行&lt;code&gt;git submodule add https://github.com/blinkfox/hexo-theme-matery/ themes\hexo-theme-matery&lt;/code&gt;，作为子模块clone到themes目录中的hexo-theme-matery。&lt;/p&gt;
&lt;p&gt;接着试着用github desktop或者git进行push，如果没问题就往下看。&lt;/p&gt;
&lt;p&gt;当然有些教程会说设置deploy，直接上传源目录和上传public目录效果完全一致，区别只是在vercel上的部署有一点点不同。但是我更喜欢这种方法。（毕竟可以直接在github上写博客嘛）&lt;/p&gt;
&lt;h4&gt;4.本地预览&lt;/h4&gt;
&lt;p&gt;随便打开个什么cmd或者powershell，进入上一步的那个文件夹，输入&lt;code&gt;hexo s&lt;/code&gt;之后，等一会，直到你看到出现了&lt;code&gt;Hexo is running at http://localhost:4000&lt;/code&gt;之后在浏览器里打开&lt;a href=&quot;http://localhost:4000/&quot;&gt;这个网址&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;看完了按Ctrl+C就可以关掉本地预览。&lt;/p&gt;
&lt;p&gt;啊对了，第一次操作会让你安装依赖包，跟着他提示操作就行了。&lt;/p&gt;
&lt;h4&gt;5.使用zeit托管&lt;/h4&gt;
&lt;h5&gt;为什么使用zeit托管&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;百度收录&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;免费&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Vercel is the easiest way to deploy websites. Host your web projects with zero configuration, automatic SSL, and global CDN.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;同类产品有&lt;a href=&quot;https://app.netlify.com/&quot;&gt;netlify&lt;/a&gt;，其实这个也不错，我不用他是因为我不挂梯子打不开他的页面。
其实我原来用Github Pages，但是那玩意域名我觉得不好看（xxx.github.io），并且不能被百度爬，所以最后放弃了。
当然你也可以用coding对国内进行分流，来实现让百度爬你的目的，但是太麻烦了。
&lt;s&gt;并且coding的服务不太稳定。&lt;/s&gt;(2021coding更新了，我没试过，不好评论)
另一个是gitee，那个各方面都挺不错的，除了&lt;strong&gt;不支持自定义域名&lt;/strong&gt;。。&lt;/p&gt;
&lt;h5&gt;1.&lt;a href=&quot;https://zeit.co/login&quot;&gt;注册zeit&lt;/a&gt;&lt;/h5&gt;
&lt;h5&gt;2.导入&lt;/h5&gt;
&lt;p&gt;主页点击 &quot;Import Project&quot;，然后 “Import Project From Git Repo”，选择 GitHub。进行一下授权，然后选择你在一开始新建的存储库导入。&lt;/p&gt;
&lt;p&gt;注意如果你用我的方法，将整个hexo文件夹同步到云端，你会看到你的类型是HEXO，如果你用的是deploy，这里显示是other。&lt;/p&gt;
&lt;p&gt;最后你就可以访问一个类似于xxxx.now.sh的网址来访问你的博客了（是不是比github那个xxx.github.io好看多了？）。&lt;/p&gt;
&lt;p&gt;并且如果你是将整个HEXO文件夹同步到github，你会发现&lt;/p&gt;
&lt;h5&gt;3.搞一个域名&lt;/h5&gt;
&lt;p&gt;可能有人会问，zeit给的now.sh不好吗，搞什么自己域名？当然可以啦，只不过访问速度慢死而已，有了自己的域名就可以用cloudflare加速！&lt;/p&gt;
&lt;p&gt;域名随便你去哪弄，可以去买腾讯云的域名，首年才1块钱得一个xyz，而且附带可以用域名邮箱。&lt;/p&gt;
&lt;p&gt;当然你想白嫖可以，去&lt;a href=&quot;https://www.freenom.com/zh/index.html?lang=zh&quot;&gt;freenom&lt;/a&gt;注册个免费域名，然后把&lt;strong&gt;NS服务商改成cloudflare&lt;/strong&gt;的就行了。&lt;/p&gt;
&lt;p&gt;（但是freenom上的域名&lt;strong&gt;好像&lt;/strong&gt;不能注册腾讯的企业邮箱）&lt;/p&gt;
&lt;h5&gt;4.注册&lt;a href=&quot;https://www.cloudflare.com/&quot;&gt;cloudflare&lt;/a&gt;&lt;/h5&gt;
&lt;p&gt;刚刚说过了，now.sh在国内访问速度不（惨）太（不）好（忍）看（睹），用cloudflare可以大大提升访问速度。&lt;/p&gt;
&lt;p&gt;去&lt;a href=&quot;https://www.cloudflare.com/&quot;&gt;cloudflare&lt;/a&gt;注册一个账户，然后按照提示一步一步操作，将NS记录（域名服务器记录）改成cloudflare为你提供的。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;之后你所有DNS更改都需要在cloudflare上操作，否则无效&lt;/strong&gt;&lt;/p&gt;
&lt;h5&gt;5.增加指向vercel的记录&lt;/h5&gt;
&lt;p&gt;去vercel，在项目里找到&quot;view domains&quot;，将你想用的域名输进去（就是前缀+&quot;&quot;.&quot;+之前搞到的域名）&lt;/p&gt;
&lt;p&gt;然后按照他的提示去cloudflare增加一条CNAME。&lt;/p&gt;
&lt;p&gt;当然我其实想设置CNAME记录的，但是如果设置CNAME的话，总是出现一些奇奇怪怪的问题，所以只好设置成A记录。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s1.ax1x.com/2020/04/22/JUuG1H.png&quot; alt=&quot;DNS-CONFIG&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;无论如何，请一定确认时候一定要确认代理状态为黄色（已代理）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;无论如何，请一定确认时候一定要确认代理状态为黄色（已代理）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;无论如何，请一定确认时候一定要确认代理状态为黄色（已代理）&lt;/strong&gt;&lt;/p&gt;
&lt;h5&gt;6.添加404页面&lt;/h5&gt;
&lt;p&gt;在根目录下面新建now.json，里面如下。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{
  &quot;version&quot;: 2,
  &quot;routes&quot;: [
    { &quot;handle&quot;: &quot;filesystem&quot; },
    { &quot;src&quot;: &quot;/(.*)&quot;, &quot;status&quot;: 404, &quot;dest&quot;: &quot;/404.html&quot; }
  ]
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h5&gt;可能会有的一些坑&lt;/h5&gt;
&lt;h6&gt;1.访问博客出现525错误，如下图&lt;/h6&gt;
&lt;p&gt;&lt;img src=&quot;https://i.loli.net/2020/04/22/y7upcTkeHxlNJPw.png&quot; alt=&quot;site-error-525&quot; /&gt;&lt;/p&gt;
&lt;p&gt;这个问题原因我也不太清楚，但是可以通过设置cloudflare里面SSL/TLS规则来消除&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s1.ax1x.com/2020/04/22/JUu2Bq.png&quot; alt=&quot;cloudflare-ssl-config&quot; /&gt;&lt;/p&gt;
&lt;p&gt;如上图，先设置成关闭，然后访问你的博客直到可以正常访问，再设置成完全。&lt;/p&gt;
&lt;h2&gt;第二部分&lt;/h2&gt;
&lt;p&gt;大概就是讲博客的自定义配置，懒得写了。&lt;/p&gt;
&lt;p&gt;等以后有空或者有人看再写吧。&lt;/p&gt;
&lt;h3&gt;接入评论&lt;/h3&gt;
&lt;p&gt;Gitalk&lt;/p&gt;
&lt;h2&gt;附件&lt;/h2&gt;
&lt;p&gt;&lt;code&gt; !update.bat&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;@echo off
git add -A
git commit -m &quot;Updated: %date:~0,4%/%date:~5,2%/%date:~8,2% %time%&quot;
git push||git push||git push
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;!preview.bat&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;hexo s
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;第三部分&lt;/h2&gt;
&lt;p&gt;自带的节点已经足够好了！！！几乎可以不用自定义节点了&lt;/p&gt;
&lt;p&gt;自定义节点可能还会减速！！！&lt;/p&gt;
</content:encoded></item><item><title>ThrottleStop教程</title><link>https://tski.uk/blog/throttlestop/</link><guid isPermaLink="true">https://tski.uk/blog/throttlestop/</guid><description>ThrottleStop教程</description><pubDate>Sun, 09 Feb 2020 21:26:58 GMT</pubDate><content:encoded>&lt;p&gt;官网下载地址：
&lt;a href=&quot;https://www.techpowerup.com/download/techpowerup-throttlestop/&quot;&gt;ThrottleStop&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;ThrottleStop是什么&lt;/h2&gt;
&lt;p&gt;ThrottleStop最初的设计目的是为了对付笔记本电脑中的温度墙，以及调整CPU时钟速度。&lt;/p&gt;
&lt;p&gt;但是它不仅仅可以作为解除温度墙的工具，也可以用来给CPU打鸡血（老电脑狂喜）和给CPU放血（降频。&lt;/p&gt;
&lt;p&gt;为什么要给CPU降频？cpu降频之后，可以让续航时间加倍。比如之前网课的时候，我这电脑不用TS续航大概两个小时，用了之后锁到1Ghz。虽然低，但是网课也够用了，续航时间能达到4-5个小时&lt;/p&gt;
&lt;h2&gt;ThrottleStop配置&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://s2.ax1x.com/2020/02/09/1h5Vqs.png&quot; alt=&quot;主界面&quot; /&gt;&lt;/p&gt;
&lt;p&gt;左上第一个红框是选择配置文件,软件默认有4个配置文件&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Performance&lt;/li&gt;
&lt;li&gt;Game&lt;/li&gt;
&lt;li&gt;Internet&lt;/li&gt;
&lt;li&gt;Battery&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;用法就像名字一样(废话)&lt;/strong&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;左下那个红框,&lt;em&gt;先介绍第一列的功能&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Clock Modulation和Chipset Clock Modulation&lt;/strong&gt; 这两个选项对一些有点岁数的CPU 会有用，我们用不着..
&lt;strong&gt;不需要勾选!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Set Multiplier&lt;/strong&gt; 设置倍频，设到默认+1就行了
&lt;strong&gt;不设也行&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Speed Shift EPP&lt;/strong&gt; &lt;strong&gt;非常有用!&lt;/strong&gt;
看到左边的数字了吗,那里是可以编辑的!(想不到吧)
&lt;strong&gt;值取一个0-255的数字,越接近0 性能越高,越接近255越节能(性能越低)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Power Saver&lt;/strong&gt; 需要勾选 Disable Turbo 才能使用，该选项确保待机频率最低以降低功耗，对较新的处理器来说用处不大，因为现代处理器有新技术降低待机功耗。比酷睿 2 更新的处理器不建议使用这个。
&lt;strong&gt;看着办,一般不勾&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Disable Turbo&lt;/strong&gt; 关闭睿频。没啥可说
&lt;strong&gt;现在处理器最好别勾&lt;/strong&gt;(你基础频率才2G+)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;BD PROCHOT&lt;/strong&gt; &lt;strong&gt;非常,非常重要和有用&lt;/strong&gt;
在温度达到某一值的时候降低功率,俗称温度墙,就是这东西.(默认打开)
&lt;strong&gt;有需要就关上,但并不建议关&lt;/strong&gt;
!!!关了如果&lt;strong&gt;没有其他措施&lt;/strong&gt;会导致cpu无法自动降频,直到100度&lt;strong&gt;强制断电&lt;/strong&gt;!!!&lt;/p&gt;
&lt;p&gt;Taskbar 最小化到任务栏
&lt;strong&gt;给我关上!!!烦死了&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Log File 启用日志
&lt;strong&gt;一般不勾(大佬勾)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Stop/Start Data 停止或开启右侧表格记录数据更新。&lt;/p&gt;
&lt;p&gt;SpeedStep 也是个老古董,没必要勾,已被Shift EPP替代(除非你也是古董)
&lt;strong&gt;如果没有Speed Shift EPP就勾&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;C1E 玄学选项,默认勾选
&lt;strong&gt;既然默认勾就别动了&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;On Top 使得 ThrottleStop 置顶（不会被其他窗口遮挡）。
&lt;strong&gt;调试的时候才勾&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;More Data 加快右侧表格数据更新频率，从每秒更新 1 次加快到每秒更新 8 次。
&lt;strong&gt;一般用不着&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Save 将当前设置存入 ini 文件。
&lt;strong&gt;修改完记得按一下&lt;/strong&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;右上红框是你CPU的数据&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;VID是当前电压&lt;/li&gt;
&lt;li&gt;倍数x基础频率&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;你当前cpu频率&lt;/strong&gt;(就是第二行的结果)&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;p&gt;自己理解那个表格&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;右下没被框的区域
Pkg/Min/Max Power 当前/最小/最大记录到的功率。&lt;/p&gt;
&lt;p&gt;Limits 可以显示 Core/GPU/Ring 降频的原因&lt;/p&gt;
&lt;p&gt;FIVR 和 TPL 一会用得到&lt;/p&gt;
&lt;p&gt;BCLK 重新读取校准基频读数&lt;/p&gt;
&lt;p&gt;C7s C-STATE&lt;/p&gt;
&lt;p&gt;DTS/Temp 切换温度显示方式
&lt;strong&gt;DTS是距离到达CPUTJMAX的温度,TEMP是现在的温度(CPUTJMAX-DTS)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;CLR 清空数据&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;Options&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;打开下面 Options 按钮&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s2.ax1x.com/2020/02/09/1hqlkj.png&quot; alt=&quot;1hqlkj.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Profile Names 起名字&lt;/p&gt;
&lt;p&gt;Notification Area 设置托盘处显示的信息
&lt;em&gt;这里建议勾上CPU Temp&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Alarm 设置温度警报,DTS和TEMP上面讲过了&lt;/p&gt;
&lt;p&gt;AC profile 插电时配置&lt;/p&gt;
&lt;p&gt;Battery profile 用电池时配置。&lt;/p&gt;
&lt;p&gt;Low Battery% 电池剩余电量百分比&lt;/p&gt;
&lt;p&gt;Low Battery profile 到了上面的百分比,你用哪个配置&lt;/p&gt;
&lt;p&gt;Do Not reset FID/VID on exit，退出不TS恢复设置
&lt;strong&gt;建议勾上&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Battery Monitoring 在主界面上显示电池剩余电量&lt;/p&gt;
&lt;p&gt;AC-On，Battery-Off 字面意思&lt;/p&gt;
&lt;p&gt;Start Minimized 启动时最小化
&lt;strong&gt;建议勾上&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Minimize on Close
&lt;strong&gt;建议勾上&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Add Limits Reason to Log File 在日志中记录限制原因&lt;/p&gt;
&lt;p&gt;Table Grid Lines 主界面数据表格线显示&lt;/p&gt;
&lt;p&gt;MHz Min 数据显示最小的单位为 MHz。&lt;/p&gt;
&lt;p&gt;Nvidia GPU/AMD GPU 你用哪个勾哪个&lt;/p&gt;
&lt;p&gt;Start dual IDA 老技术,不勾&lt;/p&gt;
&lt;p&gt;DC exit time使用电池后几秒自动关闭TS&lt;/p&gt;
&lt;p&gt;Timer Resolution计时器间隔。&lt;/p&gt;
&lt;p&gt;AC Timer Res AC 计时器间隔。&lt;/p&gt;
&lt;p&gt;Power Save C0% 调整 Power Saver 选项的敏感度&lt;/p&gt;
&lt;p&gt;Force TDP/TDC &lt;strong&gt;不明&lt;/strong&gt;
如果有人知道请评论区告诉我,谢谢&lt;/p&gt;
&lt;p&gt;Run Program After Profile Change 指定切换为某个模式前或后所运行的第三方程序&lt;/p&gt;
&lt;p&gt;Log Folder 日志文件路径&lt;/p&gt;
&lt;p&gt;Hotkeys 设置各种快捷键，例如切换配置文件等&lt;/p&gt;
&lt;p&gt;Defaults 还原默认设置&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;FIVR(最重要的部分)&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://s2.ax1x.com/2020/02/09/1hLqR1.png&quot; alt=&quot;1hLqR1.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;直接说中间那行,左边不说了.&lt;/p&gt;
&lt;p&gt;上面FIVR CONTROL很好理解,就是指选择哪个组件,然后通过下面的XXX Voltage来调整&lt;/p&gt;
&lt;p&gt;XXX Voltage是重点,这里为了防止你瞎改,还特意有一个&quot;Unlock Adjustable Voltage&quot;,必须先点了这个才能修改下面的设置&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;注意不要碰到那个STATIC!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;不要碰那个Voltage&lt;/p&gt;
&lt;p&gt;看Offset Voltage,Range是控制你调整范围,左边是降低电压,右边升高电压&lt;/p&gt;
&lt;p&gt;IccMax &lt;strong&gt;不明&lt;/strong&gt;
如果有人知道请评论区告诉我,谢谢&lt;/p&gt;
&lt;p&gt;右边那行,最上面的表格应该都懂&lt;/p&gt;
&lt;p&gt;Memory那行的Disable and Lock Tur bo Power Limits,要安装另外一个东西才能用,降压用不着&lt;/p&gt;
&lt;p&gt;Cache Radio 设置缓存的倍频范围。&lt;/p&gt;
&lt;p&gt;PowerCut 类似于 BIOS 里修改 IMON Slope/offset 通过虚假的功耗读数来超出某些处理器的功耗限制。&lt;/p&gt;
&lt;p&gt;VR Faults/VR Efficiency Mode 自己查(懒得写)(反正降压用不着)&lt;/p&gt;
&lt;p&gt;Save Voltages Changes to ThrottleStop.INI 选项一，不保存电压设置。选项二，关闭时保存。选项三，立即保存。&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;TPL&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://s2.ax1x.com/2020/02/09/1hvVL6.png&quot; alt=&quot;1hvVL6.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Tur bo Boost Long Power Max 最大长时功率&lt;/p&gt;
&lt;p&gt;Tur bo Boost Short Power Max 最大短时功率&lt;/p&gt;
&lt;p&gt;Lock 是说在寄存器中锁定这两项,避免软件或系统对其进行修改,如果日后要解锁需要按照上边卸载和重置的流程来做
Clamp 勾选代表任何时候都遵循此设置,不勾选时仅在睿频时起效.例如 CPU 默频 3.4G，但是在 3.4G 时仍然超过所给功率限制（例如做密集 AVX 运算），勾选 Clamp 的情况会强制 CPU 继续降频直到满足功耗限制，不勾选的话则不会。&lt;/p&gt;
&lt;p&gt;PP0 就是PL4 设置&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;C7s&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://s2.ax1x.com/2020/02/09/1hvVL6.png&quot; alt=&quot;1hvVL6.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;C10 分别设置 1-4 四种配置的 C-states，C0 为最高性能状态，基本上后边的数字越大越省电，相应的恢复到 C0 需要的时间也就越长。调整这里的选项可以省电降低待机温度或者相反的提高待机温度费电以获得更高的性能。&lt;/p&gt;
</content:encoded></item><item><title>CPU升(降)压教程</title><link>https://tski.uk/blog/cpu-adjust/</link><guid isPermaLink="true">https://tski.uk/blog/cpu-adjust/</guid><description>CPU升(降)压教程</description><pubDate>Sun, 09 Feb 2020 08:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;ThrottleStop&lt;/li&gt;
&lt;li&gt;Process Lasso&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;下载地址:
&lt;a href=&quot;https://www.techpowerup.com/download/techpowerup-throttlestop/&quot;&gt;ThrottleStop&lt;/a&gt;
&lt;a href=&quot;https://dl.bitsum.com/files/processlassosetup64.exe&quot;&gt;Process Lasso&lt;/a&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;注意事项:&lt;/h3&gt;
&lt;p&gt;XTU和TS不需要用在一起&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;ThrottleStop&lt;/h2&gt;
&lt;p&gt;下载后解压到固定位置(&lt;strong&gt;不要轻易更改的路径&lt;/strong&gt;)(&lt;em&gt;例如&quot;C:\Program File\ThrottleStop&quot;&lt;/em&gt;)&lt;/p&gt;
&lt;p&gt;然后点开ThrottleStop.exe&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s2.ax1x.com/2020/02/09/1h5Vqs.png&quot; alt=&quot;主界面&quot; /&gt;&lt;/p&gt;
&lt;p&gt;左上第一个红框是选择配置文件,软件默认有4个配置文件&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Performance&lt;/li&gt;
&lt;li&gt;Game&lt;/li&gt;
&lt;li&gt;Internet&lt;/li&gt;
&lt;li&gt;Battery&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;用法就像名字一样(废话)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;把你的每个选项里的Speed Shift - EPP都勾上,从左到右分别设成0/30/128/255&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;左下那个红框,&lt;em&gt;先介绍第一列的功能&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Clock Modulation和Chipset Clock Modulation&lt;/strong&gt;
&lt;strong&gt;不需要勾选!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Set Multiplier&lt;/strong&gt;
&lt;strong&gt;不设也行&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Speed Shift EPP&lt;/strong&gt; &lt;strong&gt;非常有用!&lt;/strong&gt;
看到左边的数字了吗,那里是可以编辑的!(想不到吧)
&lt;strong&gt;值取一个0-255的数字,越接近0 性能越高,越接近255越节能(性能越低)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Power Saver&lt;/strong&gt; 需要勾选 Disable Turbo 才能使用，该选项确保待机频率最低以降低功耗，对较新的处理器来说用处不大，因为现代处理器有新技术降低待机功耗。比酷睿 2 更新的处理器不建议使用这个。
&lt;strong&gt;看着办,一般不勾&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Disable Turbo&lt;/strong&gt; 关闭睿频.没啥可说
&lt;strong&gt;现在处理器最好别勾&lt;/strong&gt;(你基础频率才2G+)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;BD PROCHOT&lt;/strong&gt; &lt;strong&gt;非常,非常重要和有用&lt;/strong&gt;
在温度达到某一值的时候降低功率,俗称温度墙,就是这东西.(默认打开)
&lt;strong&gt;有需要就关上,但并不建议关&lt;/strong&gt;
!!!关了如果&lt;strong&gt;没有其他措施&lt;/strong&gt;会导致cpu无法自动降频,直到100度&lt;strong&gt;强制断电&lt;/strong&gt;!!!&lt;/p&gt;
&lt;p&gt;Save 将当前设置存入 ini 文件。
&lt;strong&gt;修改完记得按一下&lt;/strong&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;strong&gt;打开下面 Options 按钮&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s2.ax1x.com/2020/02/09/1hqlkj.png&quot; alt=&quot;1hqlkj.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Do Not reset FID/VID on exit，退出不TS恢复设置
&lt;strong&gt;建议勾上&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Start Minimized 启动时最小化
&lt;strong&gt;建议勾上&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Minimize on Close
&lt;strong&gt;建议勾上&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Nvidia GPU/AMD GPU 你用哪个勾哪个
&lt;strong&gt;可以不勾&lt;/strong&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;FIVR(最重要的部分)&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://s2.ax1x.com/2020/02/09/1hLqR1.png&quot; alt=&quot;1hLqR1.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;直接说中间那行,左边不说了.&lt;/p&gt;
&lt;p&gt;上面FIVR CONTROL很好理解,就是指选择哪个组件,然后通过下面的XXX Voltage来调整&lt;/p&gt;
&lt;p&gt;XXX Voltage是重点,这里为了防止你瞎改,还特意有一个&quot;Unlock Adjustable Voltage&quot;,必须先点了这个才能修改下面的设置&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;注意不要碰到那个STATIC!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;不要碰那个Voltage&lt;/p&gt;
&lt;p&gt;看Offset Voltage,Range是控制你调整范围,左边是降低电压,右边升高电压&lt;/p&gt;
&lt;p&gt;IccMax &lt;strong&gt;不明&lt;/strong&gt;
如果有人知道请评论区告诉我,谢谢&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;这里需要你自己调出最适合你电脑的OFFSET VOLTAGE&lt;/strong&gt;
&lt;strong&gt;每个CPU的质量不一样,没有统一数据&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Save Voltages Changes to ThrottleStop.INI 选项一，不保存电压设置。选项二，关闭时保存。选项三，立即保存。&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;设置开机自启动&lt;/h3&gt;
&lt;p&gt;按一下windows(或者按搜索)输入任务计划程序&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s2.ax1x.com/2020/02/09/1hxD4e.png&quot; alt=&quot;1hxD4e.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;任务计划程序 - 创建基本任务&lt;/p&gt;
&lt;p&gt;设置名称 - 下一步&lt;/p&gt;
&lt;p&gt;希望何时开始？当用户登录时&lt;/p&gt;
&lt;p&gt;希望执行什么操作？启动程序&lt;/p&gt;
&lt;p&gt;程序或脚本：填入ThrottleStop.exe 的完整路径&lt;/p&gt;
&lt;p&gt;勾选“当单击完成时，打开任务属性对话框”&lt;/p&gt;
&lt;p&gt;勾选“使用最高权限运行”&lt;/p&gt;
&lt;p&gt;条件选项卡：取消所有的勾选项，有些灰色的勾选项可以先勾选他的上层将其取消之后再取消勾选他的上层。总之不要有任何的勾选项，灰色的也不要有。&lt;/p&gt;
&lt;p&gt;设置选项卡：勾选允许按需运行任务。其余全部取消勾选。&lt;/p&gt;
&lt;p&gt;确定。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Process Lasso&lt;/h2&gt;
&lt;p&gt;施工中.....&lt;/p&gt;
</content:encoded></item><item><title>用 Cloudflare Workers 免费搭多Key聚合Tavily MCP代理</title><link>https://tski.uk/blog/mcp-tavily-proxy/</link><guid isPermaLink="true">https://tski.uk/blog/mcp-tavily-proxy/</guid><description>在Claude、Cursor 等 AI 客户端里聚合多个 Tavily Key，额度自动轮换、自动跳过耗尽的 Key，还能在网页上管理。</description><pubDate>Fri, 31 Jul 2026 15:13:03 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;多个 Tavily API Key 合成一个池子，Claude、Cursor 等 AI 客户端共享使用，额度自动轮换、自动跳过耗尽的 Key，还能在网页上管理。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;这是什么？&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://tavily.com&quot;&gt;Tavily&lt;/a&gt; 是很好用的 AI 搜索 API，也提供 MCP 服务让 Claude、Cursor 直接调用搜索工具。但它每个 API Key 的搜索额度是独立的、有限的——一个 Key 不够用，分发给多个客户端又不放心。&lt;/p&gt;
&lt;p&gt;这个项目把多个 Tavily Key 放进一个&quot;池子&quot;，统一暴露一个 MCP 地址。你只需要把它当成一个 Tavily MCP 来配置，实际调用会&lt;strong&gt;自动均匀地分摊到池子里所有 Key&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;额度耗尽的 Key 自动跳过，下月自动恢复&lt;/li&gt;
&lt;li&gt;被限流的 Key 自动冷却，换下一个&lt;/li&gt;
&lt;li&gt;失效的 Key 自动剔除&lt;/li&gt;
&lt;li&gt;一键在网页上添加 / 删除 / 查看所有 Key&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;部署（约 5 分钟）&lt;/h2&gt;
&lt;p&gt;前提：一个 Cloudflare 账号、一个或多个 Tavily API Key。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;打开项目仓库点 &lt;strong&gt;Deploy to Cloudflare Workers&lt;/strong&gt; 一键部署（或本地 &lt;code&gt;npx wrangler deploy&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;在 Cloudflare 控制台创建 &lt;strong&gt;KV namespace&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;进入 Worker → &lt;strong&gt;Settings&lt;/strong&gt; → &lt;strong&gt;Bindings&lt;/strong&gt;，添加 KV 绑定，变量名填 &lt;code&gt;KV&lt;/code&gt;，指向刚建的 namespace&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Settings&lt;/strong&gt; → &lt;strong&gt;Variables&lt;/strong&gt; → 添加加密变量 &lt;code&gt;AUTH_KEY&lt;/code&gt;（这是管理面板和 API 的登录口令，自定义一个）&lt;/li&gt;
&lt;li&gt;触发一次 Redeploy 让配置生效&lt;/li&gt;
&lt;li&gt;打开 &lt;code&gt;https://你的worker地址/admin&lt;/code&gt;，输入 &lt;code&gt;AUTH_KEY&lt;/code&gt; 登录，添加你的 Tavily Key，完工&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;全部在免费额度内即可运行，不花钱。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;接入 AI 客户端&lt;/h2&gt;
&lt;p&gt;以 &lt;code&gt;mcp-remote&lt;/code&gt; 为例（Cursor、Claude Desktop 通用）：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{
  &quot;mcpServers&quot;: {
    &quot;tavily-proxy&quot;: {
      &quot;command&quot;: &quot;npx&quot;,
      &quot;args&quot;: [&quot;-y&quot;, &quot;mcp-remote&quot;, &quot;https://你的worker地址/mcp&quot;, &quot;--header&quot;, &quot;x-api-key:你的AUTH_KEY&quot;]
    }
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;配置完就能在客户端里用上搜索功能，池子里所有 Key 的额度共享给所有客户端。&lt;/p&gt;
&lt;h2&gt;日常怎么用&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;管理面板&lt;/strong&gt;：浏览器打开 &lt;code&gt;/admin&lt;/code&gt;，登录后能查看所有 Key 的状态（正常 / 耗尽 / 冷却中）、额度是否还有、添加/删除 Key、给 Key 写备注、手动同步额度。登录状态会记住，刷新不用重输。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;添加 Key 时&lt;/strong&gt;：可以顺手填个备注（比如&quot;工作账号&quot;、&quot;朋友共享&quot;），方便区分。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;命令行管理&lt;/strong&gt;（可选）：
&lt;ul&gt;
&lt;li&gt;添加 Key：&lt;code&gt;POST /api/keys&lt;/code&gt;，body 传 &lt;code&gt;{&quot;apiKey&quot;: &quot;tvly-xxx&quot;}&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;看列表：&lt;code&gt;GET /api/keys&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;强制同步额度：&lt;code&gt;POST /api/keys/sync&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;删除：&lt;code&gt;DELETE /api/keys&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;除 &lt;code&gt;/admin&lt;/code&gt; 和健康检查外，所有接口都要带 &lt;code&gt;x-api-key: 你的AUTH_KEY&lt;/code&gt; 头。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;常见问题&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;额度显示不准？&lt;/strong&gt; 额度只是展示用，实际健康度由 Tavily 返回的状态自动判定（432=耗尽、429=限流、401/403=失效），会自动处理。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;工作区不在 Cloudflare？&lt;/strong&gt; 完全没关系，部署在 Cloudflare，任何客户端只要能访问 HTTPS 就行。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Key 会被看到吗？&lt;/strong&gt; 面板和列表里 Key 都是掩码显示的，客户端拿到的也只是代理地址，看不到真实 Key。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;strong&gt;项目地址&lt;/strong&gt;：https://github.com/Tokisaki-Galaxy/tavily-proxy&lt;/p&gt;
&lt;p&gt;觉得有用的话，欢迎 Star ⭐&lt;/p&gt;
</content:encoded></item><item><title>Bibliography Search MCP 让 AI 助手帮你搜论文的开源利器</title><link>https://tski.uk/blog/mcp-bibliography-search/</link><guid isPermaLink="true">https://tski.uk/blog/mcp-bibliography-search/</guid><description>把学术文献搜索接入 MCP 协议，让 AI 助手直接帮你搜论文，支持 7 大数据库和中英文自动识别。</description><pubDate>Thu, 18 Jun 2026 18:29:13 GMT</pubDate><content:encoded>&lt;p&gt;:::tip&lt;/p&gt;
&lt;p&gt;项目已开源在 &lt;a href=&quot;https://github.com/Tokisaki-Galaxy/bibliographySearchMCP&quot;&gt;Tokisaki-Galaxy/bibliographySearchMCP&lt;/a&gt;，欢迎点 star。&lt;/p&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;h2&gt;背景&lt;/h2&gt;
&lt;p&gt;做学术研究时，文献检索是绕不开的第一步。但现实往往是：打开 Google Scholar 搜一个关键词，翻了几十页结果，却发现大部分要么不相关，要么是重复的。尤其是做中英文跨语言的课题时，还要在百度学术和英文数据库之间来回切换，效率极低。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Bibliography Search MCP&lt;/code&gt; 把这个问题解决得很优雅——直接让 AI 助手帮你搜论文。&lt;/p&gt;
&lt;h2&gt;它是什么&lt;/h2&gt;
&lt;p&gt;这是一个基于 MCP 协议的学术文献搜索服务，运行在 Cloudflare Workers 上。简单来说，你可以把它接入任何支持 MCP 的 AI 客户端（比如 Claude Desktop、Cursor 等），然后直接用自然语言让 AI 帮你搜索学术论文。&lt;/p&gt;
&lt;h2&gt;核心亮点&lt;/h2&gt;
&lt;h3&gt;7 大学术数据库，一次搜索全覆盖&lt;/h3&gt;
&lt;p&gt;支持 arXiv、DBLP、Semantic Scholar、Crossref、OpenAlex、PubMed、百度学术共 7 个数据库。一次查询，结果自动去重、打分、排序，省去逐个平台对比的麻烦。&lt;/p&gt;
&lt;h3&gt;中英文自动识别&lt;/h3&gt;
&lt;p&gt;输入中文查询，系统自动识别并同时搜索百度学术和英文数据库，结果按 50/50 比例混合返回。输入英文则走英文数据库优先策略。不用手动切换语言，写什么就搜什么。&lt;/p&gt;
&lt;h3&gt;LLM 驱动的查询规划&lt;/h3&gt;
&lt;p&gt;这是最聪明的部分——通过 Groq API 调用大语言模型，将自然语言查询转换为精准的布尔搜索表达式。比如你输入&quot;基于深度学习的医学影像诊断&quot;，LLM 会自动生成类似 &lt;code&gt;&quot;deep learning&quot; AND &quot;medical image&quot; AND &quot;diagnosis&quot;&lt;/code&gt; 的搜索语句，极大提升检索质量。&lt;/p&gt;
&lt;p&gt;没有 Groq API key 也没关系，内置了中文学术词典作为降级方案，依然能用。但是针对中文搜索，效果远远不如有GroqAPI。&lt;/p&gt;
&lt;h3&gt;医学查询自动路由&lt;/h3&gt;
&lt;p&gt;当检测到生物医学相关关键词时，自动优先查询 PubMed，确保医学文献不遗漏。&lt;/p&gt;
&lt;h3&gt;智能打分排序&lt;/h3&gt;
&lt;p&gt;综合考虑标题相关性、来源权重、发表年份、引用次数等维度，对结果进行打分排序。arXiv 和 PubMed 的权重最高，最近 3 年的论文额外加分。&lt;/p&gt;
&lt;h3&gt;一键导出&lt;/h3&gt;
&lt;p&gt;搜索结果支持 CSV 和 BibTeX 两种格式导出。BibTeX 直接可以导入 LaTeX 写论文用，非常方便。&lt;/p&gt;
&lt;h2&gt;使用方式&lt;/h2&gt;
&lt;h3&gt;1. 部署到 Cloudflare Workers（可选）&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;git clone https://github.com/Tokisaki-Galaxy/bibliographySearchMCP.git
cd bibliographySearchMCP
npm install
npx wrangler login
npx wrangler secret put GROQ_API_KEY  # 可选，用于 LLM 查询规划
npx wrangler secret put BAIDU_API_KEY  # 可选，用于百度学术
npm run deploy
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2. 在 MCP 客户端配置&lt;/h3&gt;
&lt;p&gt;以 Claude Desktop 为例，在配置文件中添加：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{
  &quot;mcpServers&quot;: {
    &quot;bibliography-search&quot;: {
      &quot;url&quot;: &quot;https://bib.api.tski.uk/mcp&quot;
    }
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;3. 直接用自然语言搜索&lt;/h3&gt;
&lt;p&gt;配置好后，直接在 AI 助手中说：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;帮我搜一下关于 transformer 在时间序列预测方面的最新论文&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;AI 会自动调用 &lt;code&gt;search_papers&lt;/code&gt; 工具，返回结构化的论文列表，包括标题、作者、年份、摘要、PDF 链接等。&lt;/p&gt;
&lt;h3&gt;不想部署？用 API Key 透传&lt;/h3&gt;
&lt;p&gt;如果不想部署，可以在 MCP 请求头中传递自己的 API key：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;x-groq-api-key: gsk_your_key_here
x-baidu-api-key: your_baidu_key
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;技术亮点&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;TypeScript + Cloudflare Workers&lt;/strong&gt;：边缘计算，全球低延迟&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;JSON-RPC 2.0&lt;/strong&gt;：严格遵循 MCP 协议规范&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;LLM 降级策略&lt;/strong&gt;：Groq 不可用时自动降级到本地词典分析&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;渐进式搜索&lt;/strong&gt;：先查权重高的数据库，不够再补，避免不必要的 API 调用&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;结构化输出&lt;/strong&gt;：返回标准化的 Paper 对象，包含完整的元数据&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;适用场景&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;文献综述&lt;/strong&gt;：快速了解某个领域的研究现状&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;选题调研&lt;/strong&gt;：对比不同方向的研究热度&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;中英文跨语言检索&lt;/strong&gt;：做中国特色课题时同时搜中英文文献&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;论文写作&lt;/strong&gt;：导出 BibTeX 直接用在 LaTeX 中&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AI 辅助研究&lt;/strong&gt;：让 AI 助手成为你的文献检索助手&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;总结&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;Bibliography Search MCP&lt;/code&gt; 把学术搜索和 AI 助手结合得很好。它不是简单的 API 封装，而是真正理解了学术搜索的痛点——语言自动识别、查询规划、多源融合、智能排序、一键导出，每一步都让搜索体验更流畅。&lt;/p&gt;
&lt;p&gt;如果你经常需要做文献调研，或者想让 AI 助手帮你做学术研究，这个项目值得试试。&lt;/p&gt;
</content:encoded></item><item><title>给openwrt添加现代化安全2fa认证</title><link>https://tski.uk/blog/openwrt-advance-security/</link><guid isPermaLink="true">https://tski.uk/blog/openwrt-advance-security/</guid><description>记录将双重身份验证（2FA）与 WebAuthn 引入 OpenWrt LuCI 的开发历程</description><pubDate>Wed, 27 May 2026 23:50:10 GMT</pubDate><content:encoded>&lt;h2&gt;现状&lt;/h2&gt;
&lt;p&gt;:::tip&lt;/p&gt;
&lt;p&gt;经过努力，已经把&lt;a href=&quot;https://github.com/Tokisaki-Galaxy/luci-plugin-2fa&quot;&gt;luci-plugin-2fa&lt;/a&gt;和对应的登录补丁合并进OpenWRT的luci代码库，可以直接从新版（大概是25.x之后）下载&lt;code&gt;luci-plugin-2fa&lt;/code&gt;软件包使用。&lt;/p&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;p&gt;:::note&lt;/p&gt;
&lt;p&gt;欢迎前往我独立的 &lt;a href=&quot;https://github.com/Tokisaki-Galaxy/luci-plugin-2fa&quot;&gt;luci-plugin-2fa&lt;/a&gt; 代码库点个 Star，感谢支持！&lt;/p&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;h2&gt;起因&lt;/h2&gt;
&lt;p&gt;OpenWrt 自 2004 年诞生以来，一直是大量路由器系统的基石。即便其功能与性能不断进化，但在账号安全认证方面，LuCI（其 Web 界面）长期停留在传统的“用户名+密码”模式。在当今网络攻击手段日益多样的环境下，这种单一的认证方式显得有些力不从心。&lt;/p&gt;
&lt;p&gt;在立项之初，我查阅了社区资料，发现官方一直缺乏原生的 2FA 组件。虽然在 &lt;a href=&quot;https://github.com/openwrt/luci/issues/8273&quot;&gt;Issue #8273&lt;/a&gt; 中可以看到社区曾有过零星的尝试，但大多由于架构限制或开发者断更，最终都停留在不可用的状态。最接近成功的一次是 &lt;a href=&quot;https://github.com/openwrt/luci/pull/7069&quot;&gt;PR #7069&lt;/a&gt;，它实现了 TOTP 算法的基础，但由于未能解决登录逻辑的耦合问题，原作者也已查无此人，项目随之搁浅。&lt;/p&gt;
&lt;p&gt;在接手这个挑战时，我并没有预料到，真正的难点并不在 2FA 算法本身，而是在于 OpenWrt 沿用了十几年的登录架构。&lt;/p&gt;
&lt;h2&gt;修改架构：重新设计登录流程&lt;/h2&gt;
&lt;p&gt;在深入研究 &lt;a href=&quot;https://github.com/openwrt/luci/pull/8281&quot;&gt;PR #8281&lt;/a&gt; 时，我意识到 LuCI 之前的登录链过于线性且缺乏原子化。原始的逻辑可以概括为：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;输入凭据 -&amp;gt; 验证 -&amp;gt; 立即生成 Session -&amp;gt; 登录完成&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;这种强耦合的逻辑被硬编码在核心分发器（Dispatcher）中，完全没有给第三方模块留出干预空间。若直接在这个链条里强行塞入 2FA 逻辑，会导致代码极其臃肿且难以维护。&lt;/p&gt;
&lt;p&gt;在方案选择上，直接拦截（HOOK）核心分发器文件虽然实现路径较短，但这种做法缺乏优雅性，会带来巨大的维护风险，本质上是在原有的技术债务上继续堆叠。考虑到未来还需加入验证码（Captcha）或 WebAuthn 等认证方式，这种打补丁式的开发模式是完全不负责任的。&lt;/p&gt;
&lt;p&gt;为了从根本上解决问题，我与 OpenWrt 核心开发者 @systemcrash 进行了多次深入沟通。我们在讨论中明确了&lt;a href=&quot;https://github.com/openwrt/luci/pull/8430&quot;&gt;插件系统&lt;/a&gt;的概念与设计。通过在登录过程中引入“多阶段验证钩子”机制，将登录流程重塑为：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;输入凭据 -&amp;gt; 基础验证 -&amp;gt; 调用认证钩子（2FA/LDAP等） -&amp;gt; 全部通过后生成 Session&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;这种设计将 2FA 转化为一个可选的增强插件，消除了必须修改核心代码的束缚。相较于传统的硬编码方式，这种原子化的重构为后续支持 WebAuthn 等现代化安全协议打下了稳健的底层基础。&lt;/p&gt;
&lt;h2&gt;2FA 的实现细节&lt;/h2&gt;
&lt;p&gt;在解决了底层架构后，&lt;a href=&quot;https://github.com/openwrt/luci/pull/8280&quot;&gt;PR #8280&lt;/a&gt; 的实现就变得水到渠成了。对于 TOTP（基于时间的一次性密码）算法，我利用了现成的 &lt;code&gt;uqr&lt;/code&gt; 库来生成配置所需的二维码，降低了系统的依赖负担。&lt;/p&gt;
&lt;p&gt;在开发过程中，安全性与稳健性是考量的核心。相较于简单的 Demo，合入官方库的代码需要考虑多种边缘情况，例如：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;时钟同步问题&lt;/strong&gt;：路由器如果 NTP 同步失败，会导致 TOTP 验证失效，因此增加了显眼的同步提示。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;紧急恢复方案&lt;/strong&gt;：一旦用户丢失手机或误删密钥，需要有后台重置机制。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;UI 适配&lt;/strong&gt;：确保在各种移动端浏览器上都能正常显示验证界面。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;整个过程经历多次代码审查（Code Review），最终得到了官方维护者的认可并成功合入主干。&lt;/p&gt;
&lt;h2&gt;未来展望：拥抱 WebAuthn&lt;/h2&gt;
&lt;p&gt;目前的 2FA 主要是基于 TOTP 的验证码，虽然安全，但在用户体验上仍有提升空间。我目前正在推进 &lt;a href=&quot;https://github.com/Tokisaki-Galaxy/luci-plugin-webauthn&quot;&gt;luci-plugin-webauthn&lt;/a&gt; 的开发工作。&lt;/p&gt;
&lt;p&gt;相比 TOTP 验证码，WebAuthn 允许用户使用指纹、FaceID 或是 Yubikey 等硬件密钥进行身份认证。这不仅是安全性上的跃升，更能实现“无感登录”。虽然这部分的实现涉及更复杂的加密挑战与浏览器交互，但我相信它会成为 OpenWrt 安全体系中的重要一环。&lt;/p&gt;
&lt;p&gt;从一个简单的 Issue 到最终合入官方主干，这段经历让我深刻体会到：在开源社区，实现一个功能往往只需几行代码，但若要构建一个通用的标准架构，则需要反复的推敲与对细节的极致追求。&lt;/p&gt;
</content:encoded></item><item><title>build-way</title><link>https://tski.uk/blog/build-way/</link><guid isPermaLink="true">https://tski.uk/blog/build-way/</guid><pubDate>Sat, 09 May 2026 23:46:38 GMT</pubDate><content:encoded>&lt;p&gt;帮我评估一下有没有可能windows弄成noCRT的，难度有多大即可，不用详细看完&lt;/p&gt;
&lt;p&gt;● 根据我对 LuaJIT 源码的分析，总结如下：&lt;/p&gt;
&lt;p&gt;可行性：理论上可行，但工作量极大
┌───────────────────────────────────────────────────┬────────┬────────────────────────────────────────────────────────────────────────────────────────────┐
│                       模块                        │  难度  │                                            说明                                            │
├───────────────────────────────────────────────────┼────────┼────────────────────────────────────────────────────────────────────────────────────────────┤
│ memcpy/memset/memmove/memcmp                      │ 容易   │ 换成 intrinsic 或自己写个循环即可                                                          │
├───────────────────────────────────────────────────┼────────┼────────────────────────────────────────────────────────────────────────────────────────────┤
│ strlen/strcmp/strchr 等字符串函数                 │ 中等   │ 调用点多但实现简单，就是体力活                                                             │
├───────────────────────────────────────────────────┼────────┼────────────────────────────────────────────────────────────────────────────────────────────┤
│ malloc/realloc/free                               │ 容易   │ 只有 lib_aux.c 用到，包一层 HeapAlloc 就行                                                 │
├───────────────────────────────────────────────────┼────────┼────────────────────────────────────────────────────────────────────────────────────────────┤
│ exit/abort/信号                                   │ 容易   │ 换成 ExitProcess                                                                           │
├───────────────────────────────────────────────────┼────────┼────────────────────────────────────────────────────────────────────────────────────────────┤
│ clock/time/localtime/setlocale                    │ 中等   │ 有 Win32 API 可替代                                                                        │
├───────────────────────────────────────────────────┼────────┼────────────────────────────────────────────────────────────────────────────────────────────┤
│ 文件 I/O                                          │ 非常难 │ lib_io.c、lib_os.c、lib_package.c、luajit.c 四个文件大量依赖 stdio，需要全部重写为         │
│ (fopen/fread/fwrite/fprintf/fgets/tmpfile 等)     │        │ CreateFile/ReadFile/WriteFile 等                                                           │
├───────────────────────────────────────────────────┼────────┼────────────────────────────────────────────────────────────────────────────────────────────┤
│ 数学库 (pow/sin/cos/tan/log/exp/sqrt 等等)        │ 非常难 │ lib_math.c + lj_vmmath.c 用到了全套数学函数，需要自己实现数值算法（或偷偷 link             │
│                                                   │        │ ucrtbase.dll）                                                                             │
└───────────────────────────────────────────────────┴────────┴────────────────────────────────────────────────────────────────────────────────────────────┘&lt;/p&gt;
&lt;p&gt;两个硬骨头&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;数学库 — x64 上 sqrt 可以用 SSE sqrtsd，但 pow、log、exp、sin、cos、tan、asin 等没有 CPU 指令，需要几千行的数值算法实现&lt;/li&gt;
&lt;li&gt;文件 I/O — 这四个文件涉及所有 Lua 文件操作（读文件、写文件、管道、临时文件、错误输出），要全面改写
┌───────────────────────────────────────────────────┬────────┬────────────────────────────────────────────────────────────────────────────────────────────┐
│                       模块                        │  难度  │                                            说明                                            │
├───────────────────────────────────────────────────┼────────┼────────────────────────────────────────────────────────────────────────────────────────────┤
│ memcpy/memset/memmove/memcmp                      │ 容易   │ 换成 intrinsic 或自己写个循环即可                                                          │
├───────────────────────────────────────────────────┼────────┼────────────────────────────────────────────────────────────────────────────────────────────┤
│ strlen/strcmp/strchr 等字符串函数                 │ 中等   │ 调用点多但实现简单，就是体力活                                                             │
├───────────────────────────────────────────────────┼────────┼────────────────────────────────────────────────────────────────────────────────────────────┤
│ malloc/realloc/free                               │ 容易   │ 只有 lib_aux.c 用到，包一层 HeapAlloc 就行                                                 │
├───────────────────────────────────────────────────┼────────┼────────────────────────────────────────────────────────────────────────────────────────────┤
│ exit/abort/信号                                   │ 容易   │ 换成 ExitProcess                                                                           │
├───────────────────────────────────────────────────┼────────┼────────────────────────────────────────────────────────────────────────────────────────────┤
│ clock/time/localtime/setlocale                    │ 中等   │ 有 Win32 API 可替代                                                                        │
├───────────────────────────────────────────────────┼────────┼────────────────────────────────────────────────────────────────────────────────────────────┤
│ 文件 I/O                                          │ 非常难 │ lib_io.c、lib_os.c、lib_package.c、luajit.c 四个文件大量依赖 stdio，需要全部重写为         │
│ (fopen/fread/fwrite/fprintf/fgets/tmpfile 等)     │        │ CreateFile/ReadFile/WriteFile 等                                                           │
├───────────────────────────────────────────────────┼────────┼────────────────────────────────────────────────────────────────────────────────────────────┤
│ 数学库 (pow/sin/cos/tan/log/exp/sqrt 等等)        │ 非常难 │ lib_math.c + lj_vmmath.c 用到了全套数学函数，需要自己实现数值算法（或偷偷 link             │
│                                                   │        │ ucrtbase.dll）                                                                             │
└───────────────────────────────────────────────────┴────────┴────────────────────────────────────────────────────────────────────────────────────────────┘&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;两个硬骨头&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;数学库 — x64 上 sqrt 可以用 SSE sqrtsd，但 pow、log、exp、sin、cos、tan、asin 等没有 CPU 指令，需要几千行的数值算法实现&lt;/li&gt;
&lt;li&gt;文件 I/O — 这四个文件涉及所有 Lua 文件操作（读文件、写文件、管道、临时文件、错误输出），要全面改写&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;建议&lt;/p&gt;
&lt;p&gt;你的 /MT 构建已经静态链接了 CRT，二进制不依赖外部的 msvcrt.dll，体积和兼容性已经大幅改善。如果非要彻底 noCRT，工作量相当于重写 LuaJIT 底层 IO 层 +
内嵌一个迷你数学库，而且后续上游升级维护成本极高。&lt;/p&gt;
&lt;p&gt;更务实的方案：/MT + 链路裁剪（去掉不需要的 CRT 代码），基本能达到 &quot;零 DLL 依赖&quot; 的效果，而无需重写半个 LuaJIT。&lt;/p&gt;
&lt;p&gt;要不要我详细说说 /MT 基础上还能做什么优化？&lt;/p&gt;
&lt;p&gt;✻ Cogitated for 31s&lt;/p&gt;
&lt;p&gt;❯ 我有点不太理解啊，我已经设置了MT模式，为什么生成的lib还是要连接CRT呢？MT模式只是针对exe吗&lt;/p&gt;
&lt;p&gt;● 你理解得很对——这个问题很重要，我来解释清楚：&lt;/p&gt;
&lt;p&gt;/MT 到底做了什么
/MT 和 /MD 的区别只在于 CRT 代码的来源位置：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;/MD（动态）： .obj 里记录&quot;去 MSVCRT.DLL 找这些函数&quot;，exe/dll 启动时加载 MSVCRT.dll&lt;/li&gt;
&lt;li&gt;/MT（静态）： .obj 里记录&quot;去 libcmt.lib 找这些函数&quot;，链接时链接器把 CRT 的机器码复制进 exe/dll&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;两种方式下，.obj 里引用的 CRT 符号完全一样——memcpy、printf、strlen 等等一个都没少。区别仅仅是这些函数的实现代码最终从哪里来。&lt;/p&gt;
&lt;p&gt;那 .lib 是怎么回事？&lt;/p&gt;
&lt;p&gt;一个 .lib（静态库）本质上是一个 .obj 文件的压缩包。里面的每一个 .obj 都包含：&lt;/p&gt;
&lt;p&gt;memcpy  → 未定义符号（需要外部提供）
printf  → 未定义符号（需要外部提供）
strlen  → 未定义符号（需要外部提供）
...&lt;/p&gt;
&lt;p&gt;.lib 本身不是最终的可执行文件，它不会链接任何东西。当你把 .lib 链接到你的项目时，链接器才会去解析这些符号。&lt;/p&gt;
&lt;p&gt;所以你的 luajit_static.lib 并不是&quot;还需要链接 CRT&quot;——它里面躺着的 .obj 们只是记录着&quot;我需要 memcpy、printf...&quot;，不管用 /MD 还是 /MT，这些记录都在。&lt;/p&gt;
&lt;p&gt;关键区别在执行文件层面&lt;/p&gt;
&lt;p&gt;┌────────────┬───────────────────────────────────┬─────────────────────────────────────┐
│  构建方式  │ EXE/DLL 运行需不需要 MSVCRT.dll？ │     EXE/DLL 里有没有 CRT 代码？     │
├────────────┼───────────────────────────────────┼─────────────────────────────────────┤
│ /MD        │ 需要（运行时加载 MSVCRT.dll）     │ 有（但只加载不嵌入）                │
├────────────┼───────────────────────────────────┼─────────────────────────────────────┤
│ /MT        │ 不需要                            │ 有（嵌入在二进制里）                │
├────────────┼───────────────────────────────────┼─────────────────────────────────────┤
│ 真正 noCRT │ 不需要                            │ 没有（但需要自己实现所有 CRT 函数） │
└────────────┴───────────────────────────────────┴─────────────────────────────────────┘&lt;/p&gt;
&lt;p&gt;类比&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;/MD：你说&quot;我要一个锤子&quot;，去邻居家借（MSVCRT.dll）&lt;/li&gt;
&lt;li&gt;/MT：你说&quot;我要一个锤子&quot;，去工具箱拿（libcmt.lib），放进口袋带走&lt;/li&gt;
&lt;li&gt;noCRT：你不需要锤子，但遇到钉子你得用手指按进去——也就是你得自己实现 pow、sin、fopen...&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这就是我上一轮说的——/MT 已经解决了&quot;零 DLL 依赖&quot;的问题，但要真正&quot;代码里没有 CRT 函数&quot;（noCRT），需要重写大量代码。/MT 大概 80% 的好处（无外部依赖），20%
的工作量；true noCRT 剩下 20% 的好处，80% 的工作量。&lt;/p&gt;
&lt;p&gt;问题一：/MT vs /MD 对静态库的影响&lt;/p&gt;
&lt;p&gt;你的直觉错了。/MT vs /MD 对 .lib 绝对有影响。&lt;/p&gt;
&lt;p&gt;区别在于 .obj 文件里记录的符号引用方式：&lt;/p&gt;
&lt;p&gt;┌──────────┬───────────────────┬──────────────────────────────┐
│ 编译选项 │ printf 的调用方式 │     .obj 中的未解析符号      │
├──────────┼───────────────────┼──────────────────────────────┤
│ /MT      │ call printf       │ printf（普通符号）           │
├──────────┼───────────────────┼──────────────────────────────┤
│ /MD      │ call __imp_printf │ __imp_printf（DLL 导入符号） │
└──────────┴───────────────────┴──────────────────────────────┘&lt;/p&gt;
&lt;p&gt;两者都是未解析的——静态库不解析符号，只是把 .obj 打包。区别在于最终链接时：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;/MT 的 printf → 链接器从 libcmt.lib（静态 CRT）找到实现 → 嵌入二进制&lt;/li&gt;
&lt;li&gt;/MD 的 __imp_printf → 链接器从 msvcrt.lib（导入库）找到 thunk → 指向 msvcrt.dll&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;p&gt;你的 lua51.lib 是 /MT 编译的&lt;/p&gt;
&lt;p&gt;build.zig 第 281-283 行的证据：&lt;/p&gt;
&lt;p&gt;_ = msvc_stubs.add(&quot;libLIBCMT.a&quot;, &quot;!&amp;lt;arch&amp;gt;\n&quot;);   // 空壳，消音 /DEFAULTLIB:LIBCMT
_ = msvc_stubs.add(&quot;libOLDNAMES.a&quot;, &quot;!&amp;lt;arch&amp;gt;\n&quot;);  // 空壳，消音 /DEFAULTLIB:OLDNAMES&lt;/p&gt;
&lt;p&gt;/DEFAULTLIB:LIBCMT 指令是 /MT 编译的 .obj 独有的特征（/MD 会是 /DEFAULTLIB:MSVCRT）。所以 lua51.lib 是 /MT 编译的。&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;那么，Zig 的 no-CRT 努力白费了吗？&lt;/p&gt;
&lt;p&gt;没有白费，但也不是完全成功。 让我追踪整个符号链：&lt;/p&gt;
&lt;p&gt;lua51.lib (/MT 编译)
├─ 提供: luaL_newstate, vma_pcall, vma_close, ...
├─ 未解析: malloc, free, printf, ...         ← CRT 函数
├─ 未解析: __security_cookie, ...             ← /GS 栈保护
└─ /DEFAULTLIB:LIBCMT 指令                     ← 被空壳 libLIBCMT.a 消音&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;       ↓ addObjectFile
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;zafkiel-client.lib (link_libc = false, Windows)
├─ Zig 代码: HeapAlloc/HeapFree（无 CRT）      ← ✓ 你的 no-CRT 成果
├─ 提供: __security_cookie, __security_check_cookie, ... ← Zig stubs
├─ 未提供: malloc, free, printf, ...            ← 这些仍悬空！
└─ lua51.lib 的 .obj 原样传播，未解析符号带着走&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;       ↓ MSVC 链接器 (C DLL 项目)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;最终 C DLL
├─ __security_cookie → Zig stub 解决 ✓
├─ malloc/free/printf → 谁来提供？？？
└─ 取决于 C DLL 项目的编译选项&lt;/p&gt;
&lt;p&gt;关键在最后一步。 你的 Zig no-CRT 工作移除的是 Zig 自己产生的 CRT 引用（std.c.malloc → HeapAlloc），但 lua51.lib 的 CRT 引用原封不动地穿过了 Zig
静态库，落到最终 C DLL 的链接器头上。&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;最终 C DLL 的三个选择&lt;/p&gt;
&lt;p&gt;选择 A：C DLL 用 /MT 编译&lt;/p&gt;
&lt;p&gt;malloc/free/printf → libcmt.lib → 嵌入 DLL&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;不依赖外部 CRT DLL（CRT 代码在 DLL 体内）&lt;/li&gt;
&lt;li&gt;增加 ~100KB 体积&lt;/li&gt;
&lt;li&gt;这是&quot;妥协版 no-CRT&quot;——没有外部依赖，但 CRT 代码以静态方式存在&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;选择 B：C DLL 用 /MD 编译&lt;/p&gt;
&lt;p&gt;malloc/free/printf → msvcrt.lib → 导入 vcruntime140.dll / ucrtbase.dll&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;启动就崩溃（LoadLibrary 时 Windows 加载器解析导入表失败，返回 ERROR_MOD_NOT_FOUND）&lt;/li&gt;
&lt;li&gt;不会执行到任何代码，连 DllMain 都不进&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;选择 C：C DLL 用 /NODEFAULTLIB 且不链接任何 CRT&lt;/p&gt;
&lt;p&gt;malloc/free/printf → 无提供者 → 链接器报错 unresolved external symbol&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;根本编译不过，链接阶段直接失败&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;p&gt;实际情况&lt;/p&gt;
&lt;p&gt;你现在能编译通过并运行，说明 C DLL 项目用了选择 A 或 B：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;如果是 A：目标机器不需要 CRT DLL，但 CRT 静态代码在 DLL 体内 → 实质达成了&quot;无外部 CRT 依赖&quot;&lt;/li&gt;
&lt;li&gt;如果是 B：目标机器需要 CRT DLL，但你的测试机恰好装了 VS Redist → 掩盖了依赖&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;你可以用这个命令验证最终 DLL 的 CRT 依赖：&lt;/p&gt;
&lt;p&gt;dumpbin /imports your_final.dll | grep -i &quot;vcruntime|msvcrt|ucrtbase&quot;&lt;/p&gt;
&lt;p&gt;如果输出为空 → 选择 A，真正无 CRT 依赖。如果有条目 → 选择 B，换上 /MT。&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;总结&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;/MT vs /MD 对静态库绝对有影响——影响的是 .obj 里的符号命名（printf vs __imp_printf），而不是&quot;嵌不嵌入代码&quot;。&lt;/li&gt;
&lt;li&gt;Zig 侧的 no-CRT 工作没有白费——它确保了 Zig 代码本身不产生新的 CRT 依赖。但 lua51.lib 的 CRT 依赖是独立的问题，需要靠 C DLL 的 /MT 编译来消化。&lt;/li&gt;
&lt;li&gt;如果你想要彻底零 CRT 代码（连静态嵌入都不要），需要重新编译 LuaJIT，替换掉它对 malloc/free/printf 的调用——就像你给 Zig 代码做的那样。LuaJIT 的 CRT
使用其实很有限（只有初始分配和错误输出），工作量不大。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;编译lib MT/MD&lt;/h2&gt;
&lt;p&gt;编译lib的时候，MT/MD选择仍然是有意义的。&lt;/p&gt;
</content:encoded></item><item><title>Bangumi MCP：轻量级 HTTP MCP 服务</title><link>https://tski.uk/blog/mcp-bangumi/</link><guid isPermaLink="true">https://tski.uk/blog/mcp-bangumi/</guid><description>把 Bangumi API 封装成适合 AI 客户端调用的 MCP 服务，并收敛成更容易理解的少量工具。</description><pubDate>Fri, 24 Apr 2026 18:56:39 GMT</pubDate><content:encoded>&lt;p&gt;:::tip&lt;/p&gt;
&lt;p&gt;项目已开源在 &lt;a href=&quot;https://github.com/Tokisaki-Galaxy/bangumimcp-ts&quot;&gt;Tokisaki-Galaxy/bangumimcp-ts&lt;/a&gt;，欢迎点 star。&lt;/p&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;p&gt;:::note&lt;/p&gt;
&lt;p&gt;第三方 MCP 服务器不建议直接用于敏感账号。涉及收藏、评论、个人信息时，更适合自建。&lt;/p&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;p&gt;如果你想把 Bangumi 接到 Claude、Cursor、Copilot 这类支持 MCP 的客户端里，真正麻烦的地方通常不是接入，而是工具太多，模型不好选。&lt;/p&gt;
&lt;p&gt;这个项目做的事情很直接。它把 Bangumi API 封装成一个可部署在 Cloudflare Workers 上的 HTTP MCP 服务，再把原本分散的几十个接口收敛成更容易理解的 8 个入口。&lt;/p&gt;
&lt;h2&gt;为什么要做成 MCP&lt;/h2&gt;
&lt;p&gt;Bangumi 的能力很完整。条目、人物、角色、收藏、目录、章节、编辑历史，都有对应接口。&lt;/p&gt;
&lt;p&gt;问题也很明显。对大模型来说，工具太多会带来两个负担。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;容易选错工具&lt;/li&gt;
&lt;li&gt;一次上下文里塞进太多说明&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;所以这里的思路不是把每个接口原样暴露，而是把常用动作聚合起来，让模型先理解“要做什么”，再去调用具体工具。&lt;/p&gt;
&lt;h2&gt;如何使用&lt;/h2&gt;
&lt;p&gt;在支持 MCP 的客户端里，直接添加服务器地址即可。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;https://bgm.api.tski.uk/mcp
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果你需要写入收藏、修改进度、收藏人物或角色，再补充个人令牌。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;https://next.bgm.tv/demo/access-token/create
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;部署方式&lt;/h2&gt;
&lt;h3&gt;一键部署&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://deploy.workers.cloudflare.com/?url=https://github.com/Tokisaki-Galaxy/bangumimcp-ts&quot;&gt;&lt;img src=&quot;https://deploy.workers.cloudflare.com/button&quot; alt=&quot;deploy&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Fork 后部署&lt;/h3&gt;
&lt;p&gt;Fork &lt;a href=&quot;https://github.com/Tokisaki-Galaxy/bangumimcp-ts&quot;&gt;Tokisaki-Galaxy/bangumimcp-ts&lt;/a&gt; 到自己的账户，再在 Cloudflare 里连接 GitHub 仓库即可。&lt;/p&gt;
&lt;h3&gt;部署前提&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;一个 Cloudflare 账号&lt;/li&gt;
&lt;li&gt;一个 GitHub 仓库连接&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;暴露的 8 个工具&lt;/h2&gt;
&lt;p&gt;这个 MCP 默认只暴露这 8 个入口。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;search&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;get_subject&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;get_user&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;get_calendar&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;update_collection&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;get_person&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;get_character&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;manage_index&lt;/code&gt;（默认关闭）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;code&gt;search&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;一个入口搜索三类对象：条目、人物、角色。&lt;/p&gt;
&lt;p&gt;它支持 &lt;code&gt;scope&lt;/code&gt; 限定搜索范围，也支持分页和筛选参数。模型一般先搜索，再决定要不要展开详情。&lt;/p&gt;
&lt;h3&gt;&lt;code&gt;get_subject&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;条目详情入口。它不只返回标题和简介。&lt;/p&gt;
&lt;p&gt;还可以通过 &lt;code&gt;include&lt;/code&gt; 展开这些内容：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;persons&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;characters&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;relations&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;episodes&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这样模型可以一次拿到主信息和关联信息，减少来回调用。&lt;/p&gt;
&lt;h3&gt;&lt;code&gt;get_user&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;用户画像入口。&lt;/p&gt;
&lt;p&gt;它会返回用户资料和收藏快照，适合看“这个人平时看什么、收藏什么、偏好什么”。&lt;/p&gt;
&lt;h3&gt;&lt;code&gt;get_calendar&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;放送表入口。&lt;/p&gt;
&lt;p&gt;如果你想查今天或本周有哪些番在播，这个工具最直接。&lt;/p&gt;
&lt;h3&gt;&lt;code&gt;update_collection&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;这是唯一的写入口。&lt;/p&gt;
&lt;p&gt;我把“收藏条目”“改进度”“收藏人物”“收藏角色”统一到一个入口里，再由 &lt;code&gt;target_type&lt;/code&gt; 严格分流。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;target_type=subject&lt;/code&gt; 才能用 &lt;code&gt;subject_status / progress / rating / comment&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;target_type=person&lt;/code&gt; 或 &lt;code&gt;target_type=character&lt;/code&gt; 只能用 &lt;code&gt;favorite&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这样可以避免模型把无关参数混着传。&lt;/p&gt;
&lt;h3&gt;&lt;code&gt;get_person&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;人物详情入口。它会同时带出人物相关作品和角色信息。&lt;/p&gt;
&lt;h3&gt;&lt;code&gt;get_character&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;角色详情入口。它会同时带出出演作品和声优相关信息。&lt;/p&gt;
&lt;h3&gt;&lt;code&gt;manage_index&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;目录管理入口，但默认关闭。&lt;/p&gt;
&lt;p&gt;只有显式开启环境变量后，它才会出现在工具列表里。&lt;/p&gt;
&lt;h2&gt;这次收敛工具的原因&lt;/h2&gt;
&lt;p&gt;核心不是删功能，而是降低认知成本。&lt;/p&gt;
&lt;p&gt;对模型来说，工具越少越好选。对人来说，入口越聚合越容易记。&lt;/p&gt;
&lt;p&gt;以前可能会拆成这些工具：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;get_subject_details&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;get_subject_persons&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;get_subject_characters&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;get_subject_relations&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;get_episodes&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;现在变成一个 &lt;code&gt;get_subject&lt;/code&gt;，通过 &lt;code&gt;include&lt;/code&gt; 就能拿到需要的展开数据。&lt;/p&gt;
&lt;p&gt;这类设计对 MCP 很关键，因为 MCP 的目标不是给人写脚本，而是给模型调用。&lt;/p&gt;
&lt;h2&gt;这版做了哪些细节处理&lt;/h2&gt;
&lt;h3&gt;部分失败不会炸全局&lt;/h3&gt;
&lt;p&gt;像 &lt;code&gt;get_subject&lt;/code&gt;、&lt;code&gt;get_user&lt;/code&gt;、&lt;code&gt;get_person&lt;/code&gt;、&lt;code&gt;get_character&lt;/code&gt; 这种聚合工具，内部会并行拉多个子接口。&lt;/p&gt;
&lt;p&gt;如果其中某个子请求失败，不会直接打断整次调用，而是把那一段结果标成 &lt;code&gt;_error&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;这样模型还能继续使用其余可用信息。&lt;/p&gt;
&lt;h3&gt;写参数会严格校验&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;update_collection&lt;/code&gt; 不会再“尽量帮你猜”。&lt;/p&gt;
&lt;p&gt;如果参数组合不合法，直接返回 &lt;code&gt;invalid_argument&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;这对模型很重要。静默忽略会让它误以为自己写成功了。&lt;/p&gt;
&lt;h3&gt;&lt;code&gt;nsfw_filter&lt;/code&gt; 会正常透传&lt;/h3&gt;
&lt;p&gt;搜索角色时，如果用户没有 token，Bangumi 本身会忽略 NSFW 过滤条件，而不是报错。&lt;/p&gt;
&lt;p&gt;所以这个 MCP 会把参数原样传下去，让后端按权限处理。&lt;/p&gt;
&lt;h2&gt;适合什么场景&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;用自然语言查 Bangumi 条目&lt;/li&gt;
&lt;li&gt;让模型总结人物、角色和条目关系&lt;/li&gt;
&lt;li&gt;快速查看收藏状态和放送表&lt;/li&gt;
&lt;li&gt;用更少的工具让客户端更稳定地选工具&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;总结&lt;/h2&gt;
&lt;p&gt;这版 Bangumi MCP 的方向很明确。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;少而稳的工具入口，配合清晰的语义说明。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;它不是把 Bangumi API 全部摊开给模型，而是把常见操作聚合起来，让 MCP 更像一个可对话的 Bangumi 门面。&lt;/p&gt;
&lt;p&gt;如果目标是让 AI 真正好用地访问 Bangumi，这种收敛过的工具设计，通常比接口全暴露更有效。&lt;/p&gt;
</content:encoded></item><item><title>Zig Docs MCP：把 Zig 文档变成可查询服务</title><link>https://tski.uk/blog/mcp-zig-docs/</link><guid isPermaLink="true">https://tski.uk/blog/mcp-zig-docs/</guid><description>把 Zig 官方文档整理成可被 AI 助手、编辑器和脚本直接调用的 MCP 服务。</description><pubDate>Fri, 24 Apr 2026 17:16:03 GMT</pubDate><content:encoded>&lt;p&gt;:::tip&lt;/p&gt;
&lt;p&gt;该项目已在 &lt;a href=&quot;https://github.com/Tokisaki-Galaxy/zig-docs-mcp&quot;&gt;Tokisaki-Galaxy/zig-docs-mcp&lt;/a&gt; 开源，欢迎去点 star。&lt;/p&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;p&gt;:::tip&lt;/p&gt;
&lt;p&gt;提供公益mcp服务器，但是鼓励自建以减轻服务器压力&lt;a href=&quot;https://zigdocs.api.tski.uk/mcp&quot;&gt;https://zigdocs.api.tski.uk/mcp&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;h2&gt;为什么要做 Zig Docs MCP？&lt;/h2&gt;
&lt;p&gt;Zig 的官方文档很完整。但它仍然主要是网页。开发时更常见的需求，并不是“读完一整页”，而是直接拿到某个符号的说明、签名、参数和错误集。&lt;/p&gt;
&lt;p&gt;并且zig至今还没有稳定版本发布，还在0.x版本快速迭代。AI 编程 (vibe coding) 对于这种快速变化的文档支持不太友好，经常采用训练时候记忆的旧版本文档，很多时候导致回答过时或者不准确。如果agent直接查询本地zig安装的示例/文档，会消耗大量token和上下文。更好的方法是 docs MCP 服务，直接让AI助手直接查询最新版本的文档。&lt;/p&gt;
&lt;p&gt;我做 &lt;code&gt;Zig Docs MCP&lt;/code&gt;，就是想把这些信息变成一组可以直接调用的工具。这样，AI 助手、编辑器插件和脚本都能像查 API 一样查 Zig 文档。&lt;/p&gt;
&lt;h2&gt;它解决了什么问题&lt;/h2&gt;
&lt;p&gt;日常写 Zig 时，常见的动作其实很琐碎。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;查某个 builtin 的定义&lt;/li&gt;
&lt;li&gt;搜索标准库里的类型和函数&lt;/li&gt;
&lt;li&gt;按版本查看文档&lt;/li&gt;
&lt;li&gt;让 AI 直接拿到结构化上下文&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果全靠网页跳转，效率并不高。&lt;code&gt;Zig Docs MCP&lt;/code&gt; 做的，是把文档拆成可检索、可调用、可复用的接口。&lt;/p&gt;
&lt;p&gt;目前核心工具包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;list_builtin_functions&lt;/code&gt;：列出 builtin 函数&lt;/li&gt;
&lt;li&gt;&lt;code&gt;get_builtin_function&lt;/code&gt;：查询 builtin 的签名和说明&lt;/li&gt;
&lt;li&gt;&lt;code&gt;search_std_lib&lt;/code&gt;：搜索标准库符号&lt;/li&gt;
&lt;li&gt;&lt;code&gt;get_std_lib_item&lt;/code&gt;：获取某个条目的完整文档&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;它的意义不只是“能查”，而是&lt;strong&gt;让文档变成可编程资源&lt;/strong&gt;。这对 IDE 集成、自动补全、AI 辅助问答都很有用。&lt;/p&gt;
&lt;h2&gt;它是怎么实现的&lt;/h2&gt;
&lt;p&gt;这个项目大致分成两层。&lt;/p&gt;
&lt;h3&gt;1. TypeScript / Bun 层&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;mcp/&lt;/code&gt; 目录负责 MCP 服务入口、文档缓存、版本索引、本地预览和 R2 bundle 生成。&lt;/p&gt;
&lt;p&gt;这一层更像调度中心，负责把 Zig 侧产出的数据组织成稳定的接口。&lt;/p&gt;
&lt;h3&gt;2. Zig / WASM 层&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;docs/&lt;/code&gt; 目录负责真正的文档解析和 AST 遍历。&lt;/p&gt;
&lt;p&gt;它会扫描标准库声明，解析函数、类型、字段和错误集，再生成结构化 Markdown 和搜索索引。
这部分最后会编译成 WASM，供 TS 侧调用。&lt;/p&gt;
&lt;p&gt;这样做的好处很直接：Zig 自己来理解 Zig 的语法和 AST，前端和 Worker 侧只负责消费结果。&lt;/p&gt;
&lt;h2&gt;我最看重的点&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;查询路径更短。&lt;/strong&gt;&lt;br /&gt;
以前查 Zig 文档，要在网页、源码和版本文档之间来回切换。现在更像直接向工具要答案。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;版本化更实用。&lt;/strong&gt;&lt;br /&gt;
很多项目并不使用最新 Zig，而是固定版本。这个项目支持按版本打包和缓存文档，更适合真实开发环境。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;更适合 AI 集成。&lt;/strong&gt;&lt;br /&gt;
MCP 的价值就在这里。客户端可以直接拿到结构化结果，不需要手动把文档复制进提示词。&lt;/p&gt;
&lt;h2&gt;一个我很喜欢的细节&lt;/h2&gt;
&lt;p&gt;这个项目不是简单地做文档镜像。它更像是在做“文档产品化”。&lt;/p&gt;
&lt;p&gt;同样是查询 &lt;code&gt;std.hash_map.HashMap&lt;/code&gt;，你可以直接拿到：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;它是什么类型&lt;/li&gt;
&lt;li&gt;怎么初始化&lt;/li&gt;
&lt;li&gt;常用方法有哪些&lt;/li&gt;
&lt;li&gt;文档、错误和源码入口&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这比单纯浏览 HTML 页面更接近“知识接口”。&lt;/p&gt;
&lt;h2&gt;适合谁&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;写 Zig 的开发者&lt;/li&gt;
&lt;li&gt;想把 Zig 文档接进 AI 工具的人&lt;/li&gt;
&lt;li&gt;想做 MCP 服务示例的人&lt;/li&gt;
&lt;li&gt;需要版本化文档和本地缓存的人&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;结语&lt;/h2&gt;
&lt;p&gt;如果说传统文档是给人看的，那么 Zig Docs MCP 更像是给人和工具一起看的。&lt;/p&gt;
&lt;p&gt;它把 Zig 文档从网页变成了一个可以检索、可以集成、可以自动化调用的服务。对我来说，这正是 MCP 最实用的地方：&lt;strong&gt;让知识从页面里出来，进入工作流里。&lt;/strong&gt;&lt;/p&gt;
</content:encoded></item><item><title>Kindle + KOReader 用 OPDS 传书实践</title><link>https://tski.uk/blog/kindle-koreader-opds-via-onedrive-cf-index-ng/</link><guid isPermaLink="true">https://tski.uk/blog/kindle-koreader-opds-via-onedrive-cf-index-ng/</guid><description>用 Cloudflare Workers 转发 OneDrive 目录为 OPDS 书库，解决 Kindle 上 KOReader 传书步骤繁琐的问题。</description><pubDate>Tue, 24 Mar 2026 21:45:00 GMT</pubDate><content:encoded>&lt;p&gt;我在 Kindle 上主要用 KOReader 看书。&lt;br /&gt;
传书这件事以前一直不够顺手。常见方法是邮件推送、局域网传输，或者接数据线手动拷贝。它们都能用，但每次都要多走几步。&lt;/p&gt;
&lt;p&gt;后来我把 OneDrive 目录接到了 OPDS。&lt;br /&gt;
KOReader 可以直接按书库方式浏览和下载，体验明显更好。&lt;/p&gt;
&lt;h2&gt;背景：为什么想做 OPDS&lt;/h2&gt;
&lt;p&gt;KOReader 自带 OPDS 客户端。&lt;br /&gt;
这意味着只要有一个 OPDS 服务端，Kindle 就能像访问在线书店一样管理自己的电子书。&lt;/p&gt;
&lt;p&gt;我原来在用这个项目做 OneDrive 目录索引。它是一个基于 Cloudflare Workers 的轻量网盘目录服务：&lt;br /&gt;
&lt;a href=&quot;https://github.com/lyc8503/onedrive-cf-index-ng&quot;&gt;lyc8503/onedrive-cf-index-ng&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;这个项目本身很适合做轻量目录服务。&lt;br /&gt;
它跑在 Cloudflare Workers 上，部署成本很低，访问也稳定。&lt;br /&gt;
问题是它之前并不支持 OPDS 输出。&lt;/p&gt;
&lt;h2&gt;方案：给 onedrive-cf-index-ng 增加 OPDS&lt;/h2&gt;
&lt;p&gt;我把 OPDS 支持补了上去，并提交了这两个 PR：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;https://github.com/lyc8503/onedrive-cf-index-ng/pull/77（先补齐 OPDS 相关能力）&lt;/li&gt;
&lt;li&gt;https://github.com/lyc8503/onedrive-cf-index-ng/pull/80（再完善后续细节）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;改完以后，同一个 OneDrive 目录可以同时服务网页浏览和 KOReader 的 OPDS 取书。&lt;br /&gt;
这就把“网盘目录”变成了“可订阅书库”。&lt;/p&gt;
&lt;h2&gt;使用体验&lt;/h2&gt;
&lt;p&gt;实际使用时，流程会简单很多：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;书放进 OneDrive 指定目录&lt;/li&gt;
&lt;li&gt;Workers 站点自动索引&lt;/li&gt;
&lt;li&gt;KOReader 里添加 OPDS 源&lt;/li&gt;
&lt;li&gt;在 Kindle 上直接检索、下载、打开&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;和邮件推送相比，它更像一个持续在线的私人书库。&lt;br /&gt;
和局域网或有线拷贝相比，它不依赖同一网络，也不需要每次连线。&lt;/p&gt;
&lt;h2&gt;KOReader 侧配置要点&lt;/h2&gt;
&lt;p&gt;在 KOReader 里进入 OPDS 目录，新增一个目录源。&lt;br /&gt;
把你的 Workers 地址填进去即可。&lt;br /&gt;
如果你启用了 OPDS 路径，就填对应的 OPDS URL。&lt;/p&gt;
&lt;p&gt;建议把书按作者或系列整理到不同目录。&lt;br /&gt;
这样在 KOReader 里浏览会更清晰，检索也更快。&lt;/p&gt;
&lt;h2&gt;小结&lt;/h2&gt;
&lt;p&gt;这套方案的核心价值不在“能不能传书”，而在“传书是否足够顺手”。&lt;br /&gt;
当 OneDrive + Workers + OPDS 接起来后，Kindle 上的取书动作会变成日常化操作。&lt;br /&gt;
对长期阅读来说，这个体验差异很明显。&lt;/p&gt;
</content:encoded></item><item><title>使用cf Workers构建windbg符号加速下载</title><link>https://tski.uk/blog/cf-symbol-proxy/</link><guid isPermaLink="true">https://tski.uk/blog/cf-symbol-proxy/</guid><description>通过 Cloudflare Workers 构建一个高性能的 WinDbg 符号代理，解决国内访问微软符号服务器慢的问题。</description><pubDate>Wed, 25 Feb 2026 11:04:04 GMT</pubDate><content:encoded>&lt;p&gt;:::tip&lt;/p&gt;
&lt;p&gt;该项目已在&lt;a href=&quot;https://github.com/Tokisaki-Galaxy/cf-symbol-proxy&quot;&gt;Tokisaki-Galaxy/cf-symbol-proxy&lt;/a&gt;开源，欢迎去点star。&lt;/p&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;p&gt;:::warning&lt;/p&gt;
&lt;p&gt;Cloudflare Cache API 必须绑定自定义域名才能生效，*.workers.dev 域名不提供持久缓存。&lt;/p&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;h2&gt;告别 WinDbg 缓慢加载：为什么总是那么慢？&lt;/h2&gt;
&lt;p&gt;很多 Windows 开发者和安全研究员都遇到过 WinDbg 加载符号时卡住的情况。微软符号服务器 msdl.microsoft.com 在国内访问速度不稳定，下载一个 PDB 文件经常要等很久。&lt;/p&gt;
&lt;p&gt;我开发了 cf-symbol-proxy 项目，利用 Cloudflare Workers 搭建一个轻量级符号代理。这样可以大幅提升下载速度，解决符号加载慢的问题。&lt;/p&gt;
&lt;h2&gt;为什么选择 Cloudflare Workers？&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;全球加速&lt;/strong&gt;：利用 Cloudflare 的边缘节点，让请求在离你最近的地方处理。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;免费额度&lt;/strong&gt;：每天 10 万次免费请求，对于个人开发者完全足够。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;边缘缓存 (Cache API)&lt;/strong&gt;：符号文件（PDB）具有不可变性（Immutable），一旦缓存，后续下载几乎是瞬时的。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;零维护&lt;/strong&gt;：无需购买服务器，无需担心运维。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;亮点&lt;/h2&gt;
&lt;p&gt;针对微软符号服务器的特殊行为，做了深度优化：&lt;/p&gt;
&lt;p&gt;修复 0 字节污染。微软服务器对 HEAD 请求会返回 200 OK，但内容为空。代理强制回源用 GET，确保缓存的是完整文件。
智能缓存。200 OK 缓存一年，404 缓存一小时，避免 WinDbg 频繁重试。
自动部署。集成 GitHub Actions，代码 push 后自动部署。
环境解耦。上游地址可通过 wrangler.toml 配置，支持多种符号源。&lt;/p&gt;
&lt;h2&gt;快速部署指南&lt;/h2&gt;
&lt;p&gt;你可以直接 Fork 我的仓库并快速上线自己的代理：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;(可选)&lt;strong&gt;Fork 仓库&lt;/strong&gt;：访问 &lt;a href=&quot;https://github.com/Tokisaki-Galaxy/cf-symbol-proxy/&quot;&gt;Tokisaki-Galaxy/cf-symbol-proxy&lt;/a&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;配置自动构建&lt;/strong&gt;：在 Cloudflare Workers 的控制台创建一个新 Worker，选择 GitHub 作为代码来源，连接到&lt;code&gt;https://github.com/Tokisaki-Galaxy/cf-symbol-proxy/&lt;/code&gt;，并设置自动部署。&lt;/li&gt;
&lt;li&gt;(可选)&lt;strong&gt;修改 wrangler.toml&lt;/strong&gt;：将 &lt;code&gt;upstream&lt;/code&gt; 字段改为你想代理的符号服务器地址。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;使用&lt;/h2&gt;
&lt;p&gt;一旦部署完成，你只需要在 Windows 环境变量中设置符号路径即可。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;变量名&lt;/strong&gt;：&lt;code&gt;_NT_SYMBOL_PATH&lt;/code&gt;
&lt;strong&gt;变量值&lt;/strong&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;srv*D:\Symbols*https://your-custom-domain.com
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;碎碎念&lt;/h2&gt;
&lt;p&gt;在项目实现中，我遇到并解决了有点奇怪的问题，&lt;strong&gt;HEAD 请求与缓存键的冲突&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;Cloudflare 的 Cache API 默认会根据请求的方法来处理。如果 WinDbg 发送了一个 &lt;code&gt;HEAD&lt;/code&gt; 请求检查文件是否存在，而代理脚本简单地转发了这个请求，微软会返回一个 0 字节的响应。如果这个 0 字节响应被缓存，后续真正的 &lt;code&gt;GET&lt;/code&gt; 下载请求也会拿到 0 字节。&lt;/p&gt;
&lt;p&gt;解决方案是&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// 强制使用 GET 构建缓存键
const cacheKey = new Request(url.toString(), { method: &apos;GET&apos; });
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;通过强制转换缓存键，确保了无论客户端发什么，我们存入边缘节点的永远是实实在在的文件数据。&lt;/p&gt;
</content:encoded></item><item><title>DLL Proxy 项目详解：高兼容性 version.dll 劫持与隐匿型 Payload 启动器</title><link>https://tski.uk/blog/dll-proxy/</link><guid isPermaLink="true">https://tski.uk/blog/dll-proxy/</guid><description>高度兼容的dll劫持与隐匿型Payload启动器。</description><pubDate>Sun, 15 Feb 2026 15:25:16 GMT</pubDate><content:encoded>&lt;p&gt;:::caution&lt;/p&gt;
&lt;p&gt;该项目可能涉及安全研究和渗透测试等敏感领域，请确保在合法授权的环境中使用。未经授权的使用可能违反法律法规。&lt;/p&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;h2&gt;项目简介&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/Tokisaki-Galaxy/dll-proxy&quot;&gt;项目链接&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;本项目使用C语言开发高度兼容的 version.dll 劫持用动态链接库（DLL Proxy）。核心目标如下：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;无缝转发&lt;/strong&gt;：所有标准 version.dll API 调用均透明转发到系统原版 DLL。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;隐匿触发&lt;/strong&gt;：DLL 加载时异步启动线程，解密并执行隐藏 Payload（如启动系统计算器）。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;适用平台为 Windows 7/8/10/11 x64，兼顾兼容性、隐匿性与体积控制。适合安全研究、渗透测试等场景。&lt;/p&gt;
&lt;h2&gt;目录结构&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;.
├── .gitignore
├── build.bat
├── LICENSE
├── README.md
├── .github/
│   └── workflows/
│       ├── build.yml
│       └── copilot-setup-steps.yml
└── src/
    ├── proxy.c
    ├── version.rc
    └── vm_engine.h
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;proxy.c&lt;/code&gt;：主代理逻辑，实现 API 转发与 Payload 启动&lt;/li&gt;
&lt;li&gt;&lt;code&gt;vm_engine.h&lt;/code&gt;：虚拟机引擎，用于动态生成/还原加密命令字符串&lt;/li&gt;
&lt;li&gt;&lt;code&gt;version.rc&lt;/code&gt;：资源脚本，伪装 DLL 版本信息&lt;/li&gt;
&lt;li&gt;&lt;code&gt;build.bat&lt;/code&gt;：本地构建脚本&lt;/li&gt;
&lt;li&gt;&lt;code&gt;build.yml&lt;/code&gt;：GitHub Actions 自动化构建与打包&lt;/li&gt;
&lt;li&gt;&lt;code&gt;README.md&lt;/code&gt;：详细设计文档&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;核心功能与实现细节&lt;/h2&gt;
&lt;h3&gt;1. 绝对路径 API 转发&lt;/h3&gt;
&lt;p&gt;通过 &lt;code&gt;#pragma comment(linker, &quot;/export:...&quot;)&lt;/code&gt;，将 17 个标准 version.dll 导出函数全部转发到系统目录下原版 DLL。&lt;br /&gt;
采用绝对路径，避免再次被劫持，提升兼容性和稳定性。&lt;/p&gt;
&lt;h3&gt;2. 字符串难读化与动态还原&lt;/h3&gt;
&lt;p&gt;避免明文存储 &quot;calc.exe&quot; 字符串，避免对抗时通过 strings 或类似工具直接发现。通过自定义虚拟机（见 &lt;code&gt;vm_engine.h&lt;/code&gt;）动态生成命令。&lt;br /&gt;
字节码运行时还原目标命令，避免静态分析直接发现敏感字符串。&lt;/p&gt;
&lt;h3&gt;3. 异步 Payload 启动&lt;/h3&gt;
&lt;p&gt;在 DllMain 的 DLL_PROCESS_ATTACH 阶段，立即用 CreateThread 启动新线程，避免 Loader Lock 和主线程阻塞。&lt;br /&gt;
新线程中调用 CreateProcessW 启动计算器，命令行参数由虚拟机还原。&lt;br /&gt;
命令使用后，调用 SecureWipe 和 SecureZeroMemory 立即清除内存，防止敏感数据残留。&lt;/p&gt;
&lt;h3&gt;4. 资源伪装与体积控制&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;version.rc&lt;/code&gt; 仿造微软官方 version.dll 的资源描述，提升伪装性。&lt;br /&gt;
构建参数优化，关闭调试符号，启用链接器优化，确保 DLL 体积小于 50KB。&lt;/p&gt;
&lt;h2&gt;构建与自动化&lt;/h2&gt;
&lt;h3&gt;本地构建&lt;/h3&gt;
&lt;p&gt;直接运行 &lt;code&gt;build.bat&lt;/code&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;rc.exe /v src/version.rc
cl.exe /c /O1 /GL /GS- /MT src/proxy.c /Fo:proxy.obj
link.exe /DLL /OUT:version.dll /ENTRY:DllMain /NODEFAULTLIB /SUBSYSTEM:WINDOWS ^
/LTCG /OPT:REF /OPT:ICF ^
proxy.obj src/version.res kernel32.lib user32.lib
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;CI/CD 自动化&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;build.yml&lt;/code&gt; 支持主分支和 Tag 自动构建、打包、发布 Release。&lt;br /&gt;
自动 strip 符号、打包 zip 并上传 Release。&lt;/p&gt;
&lt;h2&gt;关键代码片段&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;API 转发声明：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#pragma comment(linker, &quot;/export:GetFileVersionInfoA=C:\\Windows\\System32\\version.GetFileVersionInfoA,@1&quot;)
// ...其余16个API同理...
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;虚拟机动态还原命令：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;static void ExecuteVM(WCHAR* output) {
    // ...虚拟机解释字节码，动态生成 &quot;calc.exe&quot; ...
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;异步 Payload 启动与内存擦除：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;DWORD WINAPI ExecutePayload(LPVOID lpParam) {
    WCHAR command[64];
    ExecuteVM(command);
    // ...CreateProcessW 启动 calc.exe...
    SecureWipe(command, sizeof(command));
    return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;总结&lt;/h2&gt;
&lt;p&gt;本项目通过 DLL Proxy 技术，实现了对系统 version.dll 的无缝转发，并集成隐匿型 Payload 启动机制。设计兼顾兼容性、隐匿性与安全性，适合安全研究、红队测试等场景。详细设计与实现细节请参考 README.md 及源码注释。&lt;/p&gt;
</content:encoded></item><item><title>自动化开发模板仓库：Github Actions 与高效项目模版实践</title><link>https://tski.uk/blog/template-github/</link><guid isPermaLink="true">https://tski.uk/blog/template-github/</guid><description>通过 Github Actions 和 Copilot Agent 实现的自动化开发模板仓库，涵盖 Zig、Rust、Web 前端和 OpenWrt 插件等多个领域。</description><pubDate>Fri, 13 Feb 2026 15:38:49 GMT</pubDate><content:encoded>&lt;p&gt;:::note&lt;/p&gt;
&lt;p&gt;该项目所涉及Copilot Agent的自动化编程功能需要开启Github Copilot服务，并且可能会产生相关费用。&lt;/p&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;h2&gt;简介&lt;/h2&gt;
&lt;p&gt;在现代软件学习与开发中，“环境配置”往往是消磨开发热情的元凶。最近我沉迷于 &lt;strong&gt;Github Actions&lt;/strong&gt;，利用云端工具直接构建、测试和部署项目，彻底告别了在本地电脑反复折腾环境的痛苦。通过简单的 &lt;code&gt;.yml&lt;/code&gt; 工作流配置，我可以针对不同的系统、不同的编译器版本进行构建，实现真正的“环境无关”。相比以往安装一个依赖库就要耗费半天，Actions 提供的纯净、隔离且即用即走的运行环境，确保了每次构建都是从零开始，完全规避了历史遗留问题引发的“玄学 Bug”。&lt;/p&gt;
&lt;p&gt;不仅如此，结合当下流行的 &lt;strong&gt;Vibe Coding&lt;/strong&gt; 模式，我通过预设 &lt;code&gt;copilot-setup-steps.yml&lt;/code&gt; 和 &lt;code&gt;copilot-instructions.md&lt;/code&gt;，让 Github Copilot Agent 在云端实现全自动编程。这种“开箱即用”的体验，意味着我只需要清晰地描述需求，剩下的代码实现、单元测试、甚至是多平台部署，都可以放心地交给 AI Agent 和自动化流水线去完成。&lt;/p&gt;
&lt;p&gt;即使面对一些不熟悉的高性能语言或框架，我也不再有“心理负担”。借助于这套自动化链路，我能跳过繁琐的本地搭建过程，直接进入核心逻辑的开发，开发效率得到了量级提升。为了方便自己和大家快速开启新项目，我将常用的开发环境封装成了几个通用的 &lt;strong&gt;项目模版&lt;/strong&gt;。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;核心原理&lt;/h2&gt;
&lt;h3&gt;1. Github Actions：云端的“执行肌肉”&lt;/h3&gt;
&lt;p&gt;Github Actions 允许我们将开发工作流（Workflow）代码化。无论是代码推送（Push）、发起 PR，还是定时任务，都能触发预设的任务序列。其强大的生态插件（Actions Marketplace）让你可以像搭积木一样，轻松实现从“交叉编译 Rust”到“自动化 UI 测试”的复杂操作。&lt;/p&gt;
&lt;h3&gt;2. Github Copilot Agent：云端的“调度大脑”&lt;/h3&gt;
&lt;p&gt;如果说 Actions 是执行者，那么 &lt;strong&gt;Github Copilot Agent&lt;/strong&gt; 就是大脑。通过在项目中配置引导文件，我们可以：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;定制 Agent 环境&lt;/strong&gt;：预装特定版本的编译器（如 Zig/Rust）或特定的 CLI 工具。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;注入领域知识&lt;/strong&gt;：通过指令文件告知 AI 你的架构偏好、注释风格以及必须通过的测试标准。
这种“AI 编排 + CI/CD 执行”的组合，让AI自动化从简单的“尝试理解”进化到了“编写-&amp;gt;测试闭环”的层面。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;项目模版推荐&lt;/h2&gt;
&lt;p&gt;以下模版均集成了 CI/CD 流程以及通过tag推送一键构建Release。为了保持长期演进，模版中默认包含 &lt;code&gt;sync-template.yml&lt;/code&gt; 以实现与上游仓库同步。如果你希望项目完全独立，可以直接删除该文件。&lt;/p&gt;
&lt;p&gt;:::note&lt;/p&gt;
&lt;p&gt;由于个人目前没有 MacOS 的开发需求，这些模版对 MacOS 的适配优先级较低，部分模版可能暂不支持 MacOS 环境。&lt;/p&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;h3&gt;1. Zig 项目模版：高性能开发的先锋&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/Tokisaki-Galaxy/zig-template&quot;&gt;zig-template&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;核心逻辑&lt;/strong&gt;：针对 Zig 语言精巧的构建系统（build.zig）进行优化，支持跨平台交叉编译。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;自动化优势&lt;/strong&gt;：内置自动化测试与静态分析。即便你本地没有安装 Zig 编译器，也可以通过云端 Action 验证代码的内存安全与性能表现。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2. Rust 项目模版：广范围平台/架构的全能选手&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/Tokisaki-Galaxy/rust-template&quot;&gt;rust-template&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;核心逻辑&lt;/strong&gt;：深度集成 &lt;code&gt;cargo&lt;/code&gt; / &lt;code&gt;cross&lt;/code&gt; 工具链，热门平台使用&lt;code&gt;cargo&lt;/code&gt;，冷门平台使用&lt;code&gt;cross&lt;/code&gt;。支持近乎所有架构/平台的构建能力（包括riscv/龙芯等平台）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;自动化优势&lt;/strong&gt;：Rust 的编译速度通常较慢，但在云端 Actions 中，模板使用缓存机制加速构建。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;示例项目：
&lt;a href=&quot;https://github.com/Tokisaki-Galaxy/webauthn-helper&quot;&gt;webauthn-helper&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;3. Web 前端模版：极速 Vibe Coding 起点&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/Tokisaki-Galaxy/web-template&quot;&gt;web-template&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;核心逻辑&lt;/strong&gt;：playwright + mock 的组合，赋予agent闭环检测能力，为构建现代 Web 应用设计。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;自动化优势&lt;/strong&gt;：内置多环境配置（Dev/Prod），支持一键部署至 GitHub Pages。由于配置了详尽的类型定义，Copilot Agent 在该模版下的代码生成准确率极高。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;4. OpenWrt 插件模版：嵌入式开发的“降维打击”&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/Tokisaki-Galaxy/openwrt-template&quot;&gt;openwrt-template&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;核心逻辑&lt;/strong&gt;：专为 LuCI 插件设计，支持 &lt;strong&gt;ucode/Lua&lt;/strong&gt; （注意，现在luci社区由Lua全面转向ucode）。包含了 OpenWrt 插件开发的标准目录结构和示例代码，极大降低了入门门槛。带有开发、构建、签名到发布全流程模板代码。在本地打完tag再推送之后，会自动发布Release并支持发布到自定义opkg源（Github Pages）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;自动化Agent优势&lt;/strong&gt;：集成了 &lt;strong&gt;Playwright + Docker&lt;/strong&gt; 自动化 UI 测试。在 OpenWrt 极其碎片化的固件环境下，手动测试极其痛苦，而通过云端模拟环境，可以实现AI自主修改-&amp;gt;调试。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;示例项目：
&lt;a href=&quot;https://github.com/tokisaki-galaxy/luci-app-tailscale-community&quot;&gt;luci-app-tailscale-community&lt;/a&gt;
&lt;a href=&quot;https://github.com/tokisaki-galaxy/luci-app-2fa&quot;&gt;luci-app-2fa&lt;/a&gt;
&lt;a href=&quot;https://github.com/tokisaki-galaxy/luci-app-webauthn&quot;&gt;luci-app-webauthn&lt;/a&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;如何快速开始？&lt;/h2&gt;
&lt;p&gt;只需三步，即可开启你的自动化开发之旅：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Use this template&lt;/strong&gt;：点击模版仓库右上角的绿色按钮，创建一个属于你的新仓库。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;唤醒 AI Agent&lt;/strong&gt;：如果你想尝试“只写需求，不写代码”，确保已开启 Copilot 功能，在 GitHub 页面唤起 Copilot Agent 对话框，输入你的功能设想。Agent 会自动根据 &lt;code&gt;copilot-instructions.md&lt;/code&gt; 开始构建代码。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;监控 Actions&lt;/strong&gt;：每当你或 Agent 提交代码后，Github Actions 就会自动触发。你只需在 &lt;code&gt;Actions&lt;/code&gt; 标签页观察绿色的对勾，剩下的交给云端。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;p&gt;自动化和vibe coding并不是为了“偷懒”，而是为了将有限的精力从重复的劳动中释放出来，投入到真正的核心逻辑和创造性工作中。&lt;/p&gt;
</content:encoded></item><item><title>现代化 LuCI 插件开发方案：AI Agent 集成 Playwright 和 Docker 全自动开发</title><link>https://tski.uk/blog/openwrt-template/</link><guid isPermaLink="true">https://tski.uk/blog/openwrt-template/</guid><description>通过 GitHub Copilot Agent 集成 Playwright 和 Docker 实现的现代化 LuCI 插件开发方案，显著提升开发效率和测试覆盖率。</description><pubDate>Thu, 29 Jan 2026 20:09:38 GMT</pubDate><content:encoded>&lt;p&gt;OpenWrt 的 LuCI 插件开发一直存在环境搭建复杂、UI 调试效率低、跨平台编译繁琐等问题，导致开发周期极长。&lt;/p&gt;
&lt;p&gt;最近发现 GitHub Copilot 可以预装测试环境软件包，更改&lt;code&gt;copilot-instrument.md&lt;/code&gt;来实现自定义agent行为，于是尝试将其与 Playwright 和 Docker 结合，打造了一套现代化的 LuCI 插件开发方案。&lt;/p&gt;
&lt;p&gt;该方案集成 AI 辅助代码生成（playwright docker）、自动化 UI 测试和全自动 CI/CD 构建发布流水线，大幅提升开发效率&lt;/p&gt;
&lt;p&gt;已经成功运用于多个 LuCI 插件项目中，如 &lt;a href=&quot;https://github.com/tokisaki-galaxy/luci-app-2fa&quot;&gt;luci-app-2fa&lt;/a&gt; 和 &lt;a href=&quot;https://github.com/tokisaki-galaxy/luci-app-tailscale-community&quot;&gt;luci-app-tailscale-community&lt;/a&gt;。&lt;/p&gt;
&lt;h2&gt;AI 辅助开发：让 Copilot 理解 OpenWrt&lt;/h2&gt;
&lt;p&gt;在编写 LuCI 后端代码（如 ucode 或 Lua）时，AI 生成内容容易出现理解偏差。通过在项目目录下配置 &lt;code&gt;copilot-instructions.md&lt;/code&gt;，可以为 AI 预设一套开发规范。&lt;/p&gt;
&lt;p&gt;这份指令集包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;全自动调试指令：告诉 AI 如何在 Docker 容器中编译、部署和测试插件。&lt;/li&gt;
&lt;li&gt;服务启动顺序：明确 &lt;code&gt;ubusd&lt;/code&gt;、&lt;code&gt;procd&lt;/code&gt;、&lt;code&gt;rpcd&lt;/code&gt;、&lt;code&gt;uhttpd&lt;/code&gt; 的依赖关系，避免页面报错。&lt;/li&gt;
&lt;li&gt;路径映射：帮助 AI 理解源码与 OpenWrt 文件系统（如 &lt;code&gt;/www/luci-static&lt;/code&gt;）的对应关系。&lt;/li&gt;
&lt;li&gt;开发规范：定义代码风格与openwrt/luci类似、注释要求和最佳实践。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;自动化 UI 测试：Playwright + Docker&lt;/h2&gt;
&lt;p&gt;为了确保插件在不同 OpenWrt 版本下的 UI 渲染一致，引入 Playwright 进行端到端测试。通过 Docker 容器模拟完整的 LuCI 环境，Agent 可自动登录、截图并验证页面效果，大幅减少手动测试时间。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Login Page&lt;/th&gt;
&lt;th&gt;2FA Verification&lt;/th&gt;
&lt;th&gt;Invalid OTP&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img src=&quot;https://github.com/user-attachments/assets/7b8e4cfb-1f06-4c3f-b63a-1ba23a01be86&quot; alt=&quot;login&quot; /&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src=&quot;https://github.com/user-attachments/assets/a95d879e-b404-423b-95ca-2230b696a243&quot; alt=&quot;2fa&quot; /&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src=&quot;https://github.com/user-attachments/assets/56399325-ebfb-46c9-aeb4-f162e27b99ce&quot; alt=&quot;error&quot; /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/Tokisaki-Galaxy/luci-app-2fa/pull/3&quot;&gt;来源自 luci-app-2fa #3&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;相关配置可在 &lt;code&gt;copilot-instructions.md&lt;/code&gt; 中定义，适用于如 &lt;code&gt;luci-app-tailscale-community&lt;/code&gt; 这类复杂应用。&lt;/p&gt;
&lt;h2&gt;全自动 CI/CD 构建流水线&lt;/h2&gt;
&lt;p&gt;本项目模板内置 GitHub Actions 配置文件 &lt;code&gt;build.yml&lt;/code&gt;，实现：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;多格式并行编译：同时支持 IPK 和 APK 格式。&lt;/li&gt;
&lt;li&gt;动态版本管理：基于 Git Tag 或 Commit Hash 自动注入 &lt;code&gt;PKG_VERSION&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;自动签名与托管：构建后自动使用 &lt;code&gt;usign&lt;/code&gt; 签名，并部署至 GitHub Pages，生成可直接用于 OpenWrt 的 OPKG 软件源。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;快速开始&lt;/h2&gt;
&lt;p&gt;你可以直接使用本模板快速创建项目：&lt;/p&gt;
&lt;p&gt;👉 &lt;a href=&quot;https://github.com/Tokisaki-Galaxy/openwrt-template&quot;&gt;Tokisaki-Galaxy/openwrt-template&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;核心配置文件：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;构建逻辑：&lt;code&gt;build.yml&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;AI 指令集：&lt;code&gt;copilot-instructions.md&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;测试 Mock：&lt;code&gt;handlers.js&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;通过结合 AI Agent 的生成能力与端到端测试的验证能力，LuCI 插件的开发协作与分发效率将显著提升。欢迎在 GitHub Discussion 参与交流。&lt;/p&gt;
&lt;h2&gt;案例&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/tokisaki-galaxy/luci-app-2fa&quot;&gt;luci-app-2fa&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/tokisaki-galaxy/luci-app-tailscale-community&quot;&gt;luci-app-tailscale-community&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;PR 示例&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/Tokisaki-Galaxy/luci-app-2fa/pull/3&quot;&gt;Integrate 2FA verification into LuCI login flow #3&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/Tokisaki-Galaxy/luci-app-2fa/pull/4&quot;&gt;Add LuCI auth plugin mechanism for 2FA login enforcement #4&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/Tokisaki-Galaxy/luci-app-2fa/pull/1&quot;&gt;feat: Revive luci-app-2fa from openwrt/luci PR #7069 #1&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;技术细节&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;SDK 环境：基于 &lt;code&gt;openwrt/rootfs:x86-64-23.05.5&lt;/code&gt; 镜像&lt;/li&gt;
&lt;li&gt;主要工具：ucode、ubus、rpcd、Playwright&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>基于大语言模型的 Hexo 博客自动化翻译方案</title><link>https://tski.uk/blog/hexo-translate-llm/</link><guid isPermaLink="true">https://tski.uk/blog/hexo-translate-llm/</guid><description>利用大语言模型实现博客内容的自动化翻译，支持智能双语切换、缓存机制、多端同步和 SEO 优化的npm包。</description><pubDate>Mon, 05 Jan 2026 18:47:13 GMT</pubDate><content:encoded>&lt;p&gt;:::tip&lt;/p&gt;
&lt;p&gt;该项目已在 GitHub 开源。您可以访问 &lt;a href=&quot;https://github.com/Tokisaki-Galaxy/hexo-translate-llm&quot;&gt;Tokisaki-Galaxy/hexo-translate-llm&lt;/a&gt; 获取更多信息。&lt;/p&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;p&gt;跨语言的信息传播在数字化时代愈发重要。手动翻译文章不仅耗时，也难以保证更新频率。&lt;strong&gt;Hexo LLM Translate&lt;/strong&gt; 插件为此提供了自动化解决方案。它利用大语言模型（LLM）实现博客内容的高质量翻译。&lt;/p&gt;
&lt;h2&gt;核心特性&lt;/h2&gt;
&lt;p&gt;智能双语切换提升了读者的阅读体验。插件会识别浏览器的语言偏好。读者无需手动点击即可阅读对应版本。&lt;/p&gt;
&lt;p&gt;缓存机制保障了翻译效率。插件通过内容哈希识别变更。只有在正文或标题变动时才会触发接口调用。这有效降低了 API 的使用成本。&lt;/p&gt;
&lt;p&gt;多端同步支持远程数据库。通过 &lt;strong&gt;Neon PostgreSQL&lt;/strong&gt;，不同设备间的构建缓存可以实时共享。（可选）&lt;/p&gt;
&lt;p&gt;稳定性是插件设计的核心。内置限流器防止并发过高导致接口熔断。自动重试机制能有效应对网络波动。&lt;/p&gt;
&lt;p&gt;SEO 优化确保了搜索权重的留存。翻译后的内容直接注入 HTML 结构。搜索引擎可以完整抓取双语信息。Hexo 特有的标签也得到了妥善保护，避免了页面结构的破坏。&lt;/p&gt;
&lt;p&gt;对于不想被翻译的文章，可以通过 Front-matter 设置 &lt;code&gt;no_translate: true&lt;/code&gt; 来排除在外。&lt;/p&gt;
&lt;h2&gt;快速上手&lt;/h2&gt;
&lt;h3&gt;安装插件&lt;/h3&gt;
&lt;p&gt;在 Hexo 根目录下执行安装指令：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;npm install hexo-translate-llm
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;配置参数&lt;/h3&gt;
&lt;p&gt;在 &lt;code&gt;_config.yml&lt;/code&gt; 中加入以下配置。建议选用性价比更高的模型：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;llm_translation:
  enable: true
  model: deepseek-ai/DeepSeek-V3.2
  endpoint: https://api.siliconflow.cn/v1/chat/completions
  max_concurrency: 4
  single_timeout: 120
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note&lt;/p&gt;
&lt;p&gt;如果不想使用远程数据库，可以跳过 Neon PostgreSQL 的配置步骤。插件会自动使用本地缓存。&lt;/p&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;h3&gt;安全设置&lt;/h3&gt;
&lt;p&gt;本项目通过环境变量管理敏感信息。&lt;/p&gt;
&lt;h4&gt;Vercel 部署&lt;/h4&gt;
&lt;p&gt;在 Vercel 仪表盘的项目设置中，添加&lt;code&gt;LLM_API_KEY&lt;/code&gt;环境变量。
设置 Storage 连接，连接到neon PostgreSQL数据库。vercel会自动注入&lt;code&gt;DATABASE_URL&lt;/code&gt;环境变量。&lt;/p&gt;
&lt;h4&gt;本地构建&lt;/h4&gt;
&lt;p&gt;在根目录创建 &lt;code&gt;.env&lt;/code&gt; 文件：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;LLM_API_KEY=您的密钥
DATABASE_URL=数据库连接地址
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;使用技巧&lt;/h2&gt;
&lt;p&gt;特定文章可以排除在翻译范围之外。只需在 Front-matter 中设置 &lt;code&gt;no_translate: true&lt;/code&gt;。插件会自动同步页面的 &lt;code&gt;title&lt;/code&gt; 标签，确保浏览器标签页的语言一致性。&lt;/p&gt;
</content:encoded></item><item><title>Kindle 浏览器 User-Agent 切换工具</title><link>https://tski.uk/blog/kindle-modify-browserua/</link><guid isPermaLink="true">https://tski.uk/blog/kindle-modify-browserua/</guid><description>针对 Kindle 内置浏览器强制跳转移动版页面的问题，开发了基于 KUAL 的 UA 修改插件，实现桌面端网页的完整访问。</description><pubDate>Tue, 30 Dec 2025 10:28:10 GMT</pubDate><content:encoded>&lt;p&gt;:::caution&lt;/p&gt;
&lt;p&gt;修改系统文件存在潜在风险。操作前请务必备份重要数据。&lt;/p&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;p&gt;:::note&lt;/p&gt;
&lt;p&gt;开源仓库：&lt;a href=&quot;https://github.com/Tokisaki-Galaxy/kindle-modify-browserUA&quot;&gt;Tokisaki-Galaxy/kindle-modify-browserUA&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;h2&gt;开发背景&lt;/h2&gt;
&lt;p&gt;Kindle 内置浏览器在访问现代网页被识别为移动设备。这导致页面功能缺失或强制重定向至简陋的移动版。
亚马逊在 5.16.4 版本固件中引入了 Chromium 内核。在新的浏览器内核下，基本上可以获得与电脑浏览器相似的体验。我购买KPW5原本就是为了在kindle上看小说，但是没想到贴吧居然强制跳转到移动版，导致无法正常使用。于是找了好久，找到了修改为电脑版User-Agent的方法，以便访问完整的网页内容。&lt;/p&gt;
&lt;h2&gt;核心特性&lt;/h2&gt;
&lt;h3&gt;桌面模式伪装&lt;/h3&gt;
&lt;p&gt;系统支持一键将 UA 修改为 Windows 10 Edge 字符串。网页服务端将识别设备为桌面电脑。用户可直接访问完整的桌面版布局。&lt;/p&gt;
&lt;h3&gt;状态实时监测&lt;/h3&gt;
&lt;p&gt;集成 &lt;code&gt;status.sh&lt;/code&gt; 脚本。用户可通过 KUAL 界面直接查看当前生效的 UA 类型。确保修改状态透明可查。&lt;/p&gt;
&lt;h3&gt;无损还原机制&lt;/h3&gt;
&lt;p&gt;系统保留原始 UA 配置。用户可随时通过菜单恢复 Kindle 默认设置。操作过程安全可逆。&lt;/p&gt;
&lt;h2&gt;工作原理&lt;/h2&gt;
&lt;p&gt;插件通过修改系统路径 &lt;code&gt;/usr/bin/browser&lt;/code&gt; 实现。脚本在执行时自动获取 &lt;code&gt;mntroot rw&lt;/code&gt; 读写权限。修改完成后系统将自动重启。新配置将在浏览器启动时生效。&lt;/p&gt;
&lt;h2&gt;安装与操作&lt;/h2&gt;
&lt;h3&gt;前提条件&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;设备已完成越狱。&lt;/li&gt;
&lt;li&gt;已安装 KUAL (Kindle Unified Application Launcher)。&lt;/li&gt;
&lt;li&gt;固件版本不低于 5.16.4。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;部署步骤&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;下载项目压缩包。&lt;/li&gt;
&lt;li&gt;将 &lt;code&gt;modify-browserUA&lt;/code&gt; 文件夹拷贝至 Kindle 的 &lt;code&gt;extensions&lt;/code&gt; 目录。&lt;/li&gt;
&lt;li&gt;在 KUAL 菜单中找到 &lt;code&gt;modify browserUA&lt;/code&gt; 选项。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;功能菜单&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Change to Desktop UA：切换至桌面模式。&lt;/li&gt;
&lt;li&gt;Status：查询当前 UA 状态。&lt;/li&gt;
&lt;li&gt;Restore：还原系统默认设置。&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>住理生活自动记账工具开发实践</title><link>https://tski.uk/blog/statistics-zhulishenghuo/</link><guid isPermaLink="true">https://tski.uk/blog/statistics-zhulishenghuo/</guid><description>基于 Tesseract.js 与 IndexedDB 实现的校园生活消费自动统计工具，解决校园 App 缺乏财务统计功能的问题。</description><pubDate>Tue, 23 Dec 2025 17:09:07 GMT</pubDate><content:encoded>&lt;p&gt;:::note&lt;/p&gt;
&lt;p&gt;项目在线地址：&lt;a href=&quot;https://zhulishenghuo-statis.tski.uk/&quot;&gt;住理生活 · 记账助手&lt;/a&gt;
开源仓库：&lt;a href=&quot;https://github.com/Tokisaki-Galaxy/statistics-zhulishenghuo&quot;&gt;Tokisaki-Galaxy/statistics-zhulishenghuo&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/Tokisaki-Galaxy/statistics-zhulishenghuo/refs/heads/master/image/0.jpg&quot; alt=&quot;项目图片&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;开发背景&lt;/h2&gt;
&lt;p&gt;校园生活中的水费、接水及洗衣支出呈现零碎且频繁的特点。住理生活 App 目前缺乏直观的财务统计功能。手动记录此类微小支出效率低下。本项目旨在利用浏览器端技术实现消费记录的自动化提取与分析。&lt;/p&gt;
&lt;h2&gt;核心特性&lt;/h2&gt;
&lt;h3&gt;图像识别录入&lt;/h3&gt;
&lt;p&gt;系统集成 OCR 技术。用户上传消费记录长截图即可完成数据采集。无需手动输入金额与时间。&lt;/p&gt;
&lt;h3&gt;本地化隐私保护&lt;/h3&gt;
&lt;p&gt;所有图像识别逻辑均在浏览器本地运行。数据存储于客户端 IndexedDB。信息不上传至任何服务器。隐私安全性得到底层保障。&lt;/p&gt;
&lt;h3&gt;多维度数据可视化&lt;/h3&gt;
&lt;p&gt;系统提供月度账单汇总。消费时段热力图展示生活规律。GitHub 风格的贡献图直观反映消费频次。&lt;/p&gt;
&lt;h2&gt;技术架构&lt;/h2&gt;
&lt;h3&gt;前端框架&lt;/h3&gt;
&lt;p&gt;选用轻量级的 Alpine.js。逻辑层级清晰。适合小型单页应用的快速开发。&lt;/p&gt;
&lt;h3&gt;文字识别&lt;/h3&gt;
&lt;p&gt;集成 Tesseract.js 引擎。在浏览器端实现高性能 OCR 识别。支持复杂长图的文本解析。&lt;/p&gt;
&lt;h3&gt;数据持久化与可视化&lt;/h3&gt;
&lt;p&gt;利用 IndexedDB 实现大容量本地存储。确保页面刷新后数据不丢失。采用 Chart.js 绘制动态统计图表。&lt;/p&gt;
&lt;h2&gt;操作流程&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;获取截图&lt;/strong&gt;：在住理生活 App 中截取消费记录长图。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;上传解析&lt;/strong&gt;：将截图上传至记账助手界面。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;查阅报表&lt;/strong&gt;：系统自动解析并生成统计图表。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据导出&lt;/strong&gt;：支持导出 CSV 或 JSON 格式文件进行二次分析。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;注意事项&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;建议使用 PC 端浏览器以获得更佳的体验。&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>KOReader 自定义翻译后端插件</title><link>https://tski.uk/blog/kindle-koreader-custom-translator/</link><guid isPermaLink="true">https://tski.uk/blog/kindle-koreader-custom-translator/</guid><description>通过自建 Cloudflare Worker 端点替换 KOReader 官方翻译接口，解决特定网络下的不可用问题。</description><pubDate>Tue, 16 Dec 2025 20:56:33 GMT</pubDate><content:encoded>&lt;p&gt;项目地址 https://github.com/Tokisaki-Galaxy/kindle-koreader-custom-translator&lt;/p&gt;
&lt;h2&gt;背景&lt;/h2&gt;
&lt;p&gt;KOReader 原生 Google 翻译接口在部分网络环境下不可达。为保持自动检测、拼音/罗马音等原生体验，提供自定义后端替换方案。&lt;/p&gt;
&lt;p&gt;默认使用Cloudflare Worker 上的AI模型&lt;code&gt;@cf/meta/m2m100-1.2b&lt;/code&gt;进行翻译，如果需要可以通过自建方式，自行更换成其他模型，或提升速率限制。&lt;/p&gt;
&lt;h2&gt;核心思路&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;自定义端点：&lt;code&gt;CUSTOM_ENDPOINT&lt;/code&gt; 指向 &lt;code&gt;translate.api.tski.uk&lt;/code&gt;，可选代理 &lt;code&gt;translate-proxy.api.tski.uk&lt;/code&gt;，但是代理可能会有延迟。&lt;/li&gt;
&lt;li&gt;语言映射：&lt;code&gt;SUPPORTED_LANGUAGES&lt;/code&gt; 覆盖 249 种语言。&lt;/li&gt;
&lt;li&gt;配置入口：KUAL 动态菜单在 &lt;code&gt;menu.json&lt;/code&gt;，插件元数据在 &lt;code&gt;config.xml&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;安装与恢复：&lt;code&gt;bin/install.sh&lt;/code&gt;、&lt;code&gt;bin/use_proxy.sh&lt;/code&gt;、&lt;code&gt;bin/restore.sh&lt;/code&gt; 负责部署、切换与回滚。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;文件结构&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;translator.lua&lt;/code&gt;：请求改写与展示逻辑，向自定义端点发送 &lt;code&gt;{ text, targetLanguage, sourceLanguage }&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;menu.json&lt;/code&gt;：KUAL 菜单项，支持直连与代理安装。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;config.xml&lt;/code&gt;：插件元信息。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;bin/install.sh&lt;/code&gt;：安装并自动备份原版文件。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;bin/use_proxy.sh&lt;/code&gt;：切换代理端点。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;bin/restore.sh&lt;/code&gt;：恢复官方 translator。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;安装与使用&lt;/h2&gt;
&lt;h3&gt;Kindle + KUAL&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;将项目放入 &lt;code&gt;/mnt/us/extensions/koreader-custom-translator/&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;KUAL → “KOReader Custom Translator” → &lt;strong&gt;Install&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;若直连受限，选择 &lt;strong&gt;Install (Use Proxy API)&lt;/strong&gt;。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;手动部署（Kobo/Android/Linux）&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;cd bin
sh install.sh                 # 自动检测 KOReader 路径
KO_DIR=/path/to/koreader sh install.sh  # 手动指定路径
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;代理与恢复&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;切换代理：&lt;code&gt;sh bin/use_proxy.sh&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;恢复官方：KUAL 选择 &lt;strong&gt;Restore&lt;/strong&gt;，或运行 &lt;code&gt;sh bin/restore.sh&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;使用提示&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;升级 KOReader 后需重新执行安装脚本，避免官方更新覆盖 &lt;code&gt;translator.lua&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;确认设备可访问自定义端点；若不可达，可先试代理端点。&lt;/li&gt;
&lt;li&gt;发生异常可使用自动生成的 &lt;code&gt;translator.lua.bak&lt;/code&gt; 回滚。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;结语&lt;/h2&gt;
&lt;p&gt;该插件在受限网络下提供稳定的翻译后端，同时保持 KOReader 原生语言检测与罗马音展示能力。直连与代理可按环境自由切换，更新与恢复均可一键完成。&lt;/p&gt;
</content:encoded></item><item><title>Google AI Studio 对话导出工具</title><link>https://tski.uk/blog/aistudio-dump-script/</link><guid isPermaLink="true">https://tski.uk/blog/aistudio-dump-script/</guid><description>针对 Google AI Studio 缺少原生导出功能的问题，开发了一款基于 Tampermonkey 的用户脚本。该脚本可将对话内容完整抓取并导出为 JSON 格式，支持 Markdown 渲染，便于后续的资料整理与归档。</description><pubDate>Thu, 04 Dec 2025 15:11:53 GMT</pubDate><content:encoded>&lt;h2&gt;背景与动机&lt;/h2&gt;
&lt;p&gt;Google AI Studio 提供了优秀的对话体验。但在科研或日常记录中，我们常面临数据留存的难题。原生界面并未提供导出选项。&lt;/p&gt;
&lt;p&gt;若要保存灵感、整理代码片段或备份团队协作内容，逐条复制粘贴显然过于低效。这种重复性劳动不应占据宝贵的时间。&lt;/p&gt;
&lt;p&gt;为此，编写了一款基于 Tampermonkey 的用户脚本：&lt;strong&gt;AI Studio Chat Exporter&lt;/strong&gt;。它旨在解决这一痛点，实现对话内容的一键打包。&lt;/p&gt;
&lt;h2&gt;功能概述&lt;/h2&gt;
&lt;p&gt;该脚本主要实现了以下几项功能，旨在简化数据获取流程：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;一键导出&lt;/strong&gt;
页面加载完成后，屏幕上会出现一个悬浮的 “Export JSON” 按钮。点击它，即可将当前的聊天内容打包成 JSON 文件并下载。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;完整抓取&lt;/strong&gt;
脚本会自动处理页面的滚动加载。这确保了每一轮对话——无论是用户的输入还是模型的回复——都能被完整收录，避免了手动复制可能产生的遗漏。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;系统提示词提取&lt;/strong&gt;
System Prompt 往往定义了对话的基调和规则。即使侧边栏处于折叠状态，脚本也会自动展开并捕获这部分关键信息。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Markdown 格式支持&lt;/strong&gt;
模型输出中的标题、列表、代码块等元素，会被转换为标准的 Markdown 格式。这使得导出的内容可以直接粘贴到笔记软件或博客中，无需二次排版。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;多语言适配&lt;/strong&gt;
界面提示词支持简体中文、英文、德语等多种语言，会根据浏览器的语言设置自动切换。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;部署方法&lt;/h2&gt;
&lt;p&gt;使用该脚本需要浏览器扩展程序的支持。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;环境准备&lt;/strong&gt;
在 Chrome、Edge 或 Brave 等浏览器中安装 &lt;strong&gt;Tampermonkey&lt;/strong&gt; (油猴) 扩展。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;脚本安装&lt;/strong&gt;
获取 &lt;code&gt;script.js&lt;/code&gt; 脚本文件或链接。Tampermonkey 会自动识别并弹出安装界面，点击 “Install” 即可。
&lt;a href=&quot;https://greasyfork.org/zh-CN/scripts/557864-ai-studio-chat-exporter-markdown-code-block-support&quot;&gt;点此安装&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;权限确认&lt;/strong&gt;
确保脚本的匹配规则覆盖了 &lt;code&gt;https://aistudio.google.com/prompts/*&lt;/code&gt; 这一域名。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;生效验证&lt;/strong&gt;
刷新 AI Studio 的对话页面。若页面顶部出现一个可拖拽的蓝色按钮，即表示安装成功。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;使用说明&lt;/h2&gt;
&lt;p&gt;操作流程非常直观：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;打开任意一个 AI Studio 对话项目。&lt;/li&gt;
&lt;li&gt;找到悬浮按钮，将其拖动到不遮挡视线的位置。&lt;/li&gt;
&lt;li&gt;点击按钮。脚本将自动执行以下操作：
&lt;ul&gt;
&lt;li&gt;获取系统提示词 (System Instruction)。&lt;/li&gt;
&lt;li&gt;滚动并加载所有历史对话。&lt;/li&gt;
&lt;li&gt;将内容格式化为 Markdown。&lt;/li&gt;
&lt;li&gt;生成并下载 JSON 文件。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;文件默认以当前项目的标题命名，例如 &lt;code&gt;My_Project.json&lt;/code&gt;。&lt;/p&gt;
&lt;h2&gt;数据结构&lt;/h2&gt;
&lt;p&gt;导出的 JSON 文件结构清晰，便于程序二次处理或人工阅读：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{
  &quot;system_instruction&quot;: &quot;项目的系统提示词&quot;,
  &quot;messages&quot;: [
    { &quot;role&quot;: &quot;user&quot;, &quot;content&quot;: &quot;用户输入的 Markdown 文本&quot; },
    { &quot;role&quot;: &quot;assistant&quot;, &quot;content&quot;: &quot;模型输出的 Markdown 文本&quot; }
  ]
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;注意事项&lt;/h2&gt;
&lt;p&gt;在使用过程中，可能会遇到一些细微的情况：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;按钮未显示&lt;/strong&gt;：请检查 Tampermonkey 扩展是否已启用，或者尝试刷新页面。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;导出内容为空&lt;/strong&gt;：脚本依赖于页面的 DOM 结构。请确保对话区域已正常加载，且能够滚动。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;System Prompt 字段为空&lt;/strong&gt;：并非所有对话都设置了系统提示词。若原项目未设置，该字段自然为空。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;权限提示&lt;/strong&gt;：脚本更新时，Tampermonkey 可能会请求新的地址权限，允许即可。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;结语&lt;/h2&gt;
&lt;h2&gt;AI Studio Chat Exporter 将繁琐的备份工作简化为一个点击动作。这不仅节省了时间，也让知识管理变得// filepath: x:\GitHub\hexo\source_posts\aistudio-dump-script.md&lt;/h2&gt;
&lt;p&gt;title: Google AI Studio 对话导出工具
date: 2025-12-04 15:11:53
author: Tokisaki Galaxy
excerpt: 针对 Google AI Studio 缺少原生导出功能的问题，开发了一款基于 Tampermonkey 的用户脚本。该脚本可将对话内容完整抓取并导出为 JSON 格式，支持 Markdown 渲染，便于后续的资料整理与归档。
tags:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Tampermonkey&lt;/li&gt;
&lt;li&gt;Google AI Studio&lt;/li&gt;
&lt;li&gt;效率工具&lt;/li&gt;
&lt;li&gt;JavaScript
categories:&lt;/li&gt;
&lt;li&gt;效率工具&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;背景与动机&lt;/h2&gt;
&lt;p&gt;Google AI Studio 提供了优秀的对话体验。但在科研或日常记录中，我们常面临数据留存的难题。原生界面并未提供导出选项。&lt;/p&gt;
&lt;p&gt;若要保存灵感、整理代码片段或备份团队协作内容，逐条复制粘贴显然过于低效。这种重复性劳动不应占据宝贵的时间。&lt;/p&gt;
&lt;p&gt;为此，编写了一款基于 Tampermonkey 的用户脚本：&lt;strong&gt;AI Studio Chat Exporter&lt;/strong&gt;。它旨在解决这一痛点，实现对话内容的一键打包。&lt;/p&gt;
&lt;h2&gt;功能概述&lt;/h2&gt;
&lt;p&gt;该脚本主要实现了以下几项功能，旨在简化数据获取流程：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;一键导出&lt;/strong&gt;
页面加载完成后，屏幕上会出现一个悬浮的 “Export JSON” 按钮。点击它，即可将当前的聊天内容打包成 JSON 文件并下载。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;完整抓取&lt;/strong&gt;
脚本会自动处理页面的滚动加载。这确保了每一轮对话——无论是用户的输入还是模型的回复——都能被完整收录，避免了手动复制可能产生的遗漏。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;系统提示词提取&lt;/strong&gt;
System Prompt 往往定义了对话的基调和规则。即使侧边栏处于折叠状态，脚本也会自动展开并捕获这部分关键信息。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Markdown 格式支持&lt;/strong&gt;
模型输出中的标题、列表、代码块等元素，会被转换为标准的 Markdown 格式。这使得导出的内容可以直接粘贴到笔记软件或博客中，无需二次排版。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;多语言适配&lt;/strong&gt;
界面提示词支持简体中文、英文、德语等多种语言，会根据浏览器的语言设置自动切换。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;部署方法&lt;/h2&gt;
&lt;p&gt;使用该脚本需要浏览器扩展程序的支持。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;环境准备&lt;/strong&gt;
在 Chrome、Edge 或 Brave 等浏览器中安装 &lt;strong&gt;Tampermonkey&lt;/strong&gt; (油猴) 扩展。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;脚本安装&lt;/strong&gt;
获取 &lt;code&gt;script.js&lt;/code&gt; 脚本文件或链接。Tampermonkey 会自动识别并弹出安装界面，点击 “Install” 即可。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;权限确认&lt;/strong&gt;
确保脚本的匹配规则覆盖了 &lt;code&gt;https://aistudio.google.com/prompts/*&lt;/code&gt; 这一域名。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;生效验证&lt;/strong&gt;
刷新 AI Studio 的对话页面。若页面顶部出现一个可拖拽的蓝色按钮，即表示安装成功。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;使用说明&lt;/h2&gt;
&lt;p&gt;操作流程非常直观：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;打开任意一个 AI Studio 对话项目。&lt;/li&gt;
&lt;li&gt;找到悬浮按钮，将其拖动到不遮挡视线的位置。&lt;/li&gt;
&lt;li&gt;点击按钮。脚本将自动执行以下操作：
&lt;ul&gt;
&lt;li&gt;获取系统提示词 (System Instruction)。&lt;/li&gt;
&lt;li&gt;滚动并加载所有历史对话。&lt;/li&gt;
&lt;li&gt;将内容格式化为 Markdown。&lt;/li&gt;
&lt;li&gt;生成并下载 JSON 文件。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;文件默认以当前项目的标题命名，例如 &lt;code&gt;My_Project.json&lt;/code&gt;。&lt;/p&gt;
&lt;h2&gt;数据结构&lt;/h2&gt;
&lt;p&gt;导出的 JSON 文件结构清晰，便于程序二次处理或人工阅读：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{
  &quot;system_instruction&quot;: &quot;项目的系统提示词&quot;,
  &quot;messages&quot;: [
    { &quot;role&quot;: &quot;user&quot;, &quot;content&quot;: &quot;用户输入的 Markdown 文本&quot; },
    { &quot;role&quot;: &quot;assistant&quot;, &quot;content&quot;: &quot;模型输出的 Markdown 文本&quot; }
  ]
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;注意事项&lt;/h2&gt;
&lt;p&gt;在使用过程中，可能会遇到一些细微的情况：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;按钮未显示&lt;/strong&gt;：请检查 Tampermonkey 扩展是否已启用，或者尝试刷新页面。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;导出内容为空&lt;/strong&gt;：脚本依赖于页面的 DOM 结构。请确保对话区域已正常加载，且能够滚动。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;System Prompt 字段为空&lt;/strong&gt;：并非所有对话都设置了系统提示词。若原项目未设置，该字段自然为空。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;权限提示&lt;/strong&gt;：脚本更新时，Tampermonkey 可能会请求新的地址权限，允许即可。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;结语&lt;/h2&gt;
&lt;p&gt;AI Studio Chat Exporter 将繁琐的备份工作简化为一个点击动作。这不仅节省了时间，也让知识管理变得更加有序。希望这个小工具能为各位的研究与工作带来便利。&lt;/p&gt;
</content:encoded></item><item><title>POPUCOM 三消棋：网页的多人联机小游戏</title><link>https://tski.uk/blog/popucom-chess/</link><guid isPermaLink="true">https://tski.uk/blog/popucom-chess/</guid><description>9×9 棋盘的三消策略棋，支持本地与多人联机。提供 Serverless 与 Python（Legacy）两套实现。</description><pubDate>Sat, 22 Nov 2025 16:16:33 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://pop.tski.uk/&quot;&gt;在线试玩（Vercel）&lt;/a&gt;
&lt;a href=&quot;https://github.com/Tokisaki-Galaxy/POPUCOM-Chess-Multiplayer&quot;&gt;项目地址（GitHub）&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;:::note&lt;/p&gt;
&lt;p&gt;复刻自yj的小游戏，现在改为浏览器的轻量棋类游戏。规则简洁。决策空间充足。支持房间对战与本地练习。&lt;/p&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;h2&gt;玩法概要&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;棋盘：9×9。&lt;/li&gt;
&lt;li&gt;落子：只能落在中立或己方领地。不可落在对方领地。&lt;/li&gt;
&lt;li&gt;三消：横、竖、两条对角线。出现连续 3 子即消除这三子，格点清空。&lt;/li&gt;
&lt;li&gt;领地：三消所在直线归属当前玩家。自该直线两端向外延伸，遇到对方棋子或下一格为对方棋子即停止。领地可被覆盖。&lt;/li&gt;
&lt;li&gt;回合与胜负：双方共 50 步即结算。比较己方领地格数。多者胜，持平为和。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;屏幕截图与录屏见仓库 README。&lt;/p&gt;
&lt;h2&gt;形态&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Serverless（推荐）：前端 + API 全托管在 Vercel。数据落在 Supabase。支持限流中间件。&lt;/li&gt;
&lt;li&gt;Python（Legacy）：Flask REST 服务 + Pygame 客户端。本地或自建服务器可用。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;架构与核心文件&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;前端与规则引擎
&lt;ul&gt;
&lt;li&gt;页面与样式：index.html、styles.css。&lt;/li&gt;
&lt;li&gt;交互与本地规则引擎：main.js。&lt;/li&gt;
&lt;li&gt;关键类：BaseGame。核心算法在 BaseGame.calculateNextState。处理三连消与领地扩张，并推进回合与胜负。&lt;/li&gt;
&lt;li&gt;模式：
&lt;ul&gt;
&lt;li&gt;LocalGame：本地单机。&lt;/li&gt;
&lt;li&gt;OnlineGame：基于轮询同步房间状态。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Serverless API（Vercel）
&lt;ul&gt;
&lt;li&gt;入口：api/game.js，导出 handler。&lt;/li&gt;
&lt;li&gt;路由：
&lt;ul&gt;
&lt;li&gt;GET /api/game?roomId=... 查询房间状态。&lt;/li&gt;
&lt;li&gt;POST /api/game 创建或确保房间存在。&lt;/li&gt;
&lt;li&gt;PUT /api/game 写入局面（棋盘、领地、当前手、胜负、最后一步）。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;数据与运维（Supabase / PostgreSQL）
&lt;ul&gt;
&lt;li&gt;表结构初始化与 Realtime 发布：database-init.sql。&lt;/li&gt;
&lt;li&gt;定时清理 48 小时未活跃房间（pg_cron）：cron-cleandata.sql。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;频控（Edge Middleware）
&lt;ul&gt;
&lt;li&gt;文件：middleware.js。&lt;/li&gt;
&lt;li&gt;依赖：@upstash/redis、@upstash/ratelimit、@vercel/edge。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;规则实现要点&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;三消检测：以每个落子点为起点，同时检测四个方向是否形成长度为 3 的连续同色。&lt;/li&gt;
&lt;li&gt;消除与归零：命中三消的格点清零。可并发命中多线。&lt;/li&gt;
&lt;li&gt;领地扩张：记录三消线段归属后，从线段两端向外扫描。遇到对手棋子或“下一格是对手棋子”即停止。被覆盖的领地以最新归属为准。&lt;/li&gt;
&lt;li&gt;结算：总步数到 $50$ 即统计两侧领地格数。多者胜，持平为和局。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;实现对应：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;JS：BaseGame.calculateNextState（落子 → 扫描 → 清子 → 领地扩张 → 回合推进 → 胜负判定）。&lt;/li&gt;
&lt;li&gt;Python：process_eliminations、remove_elimination_tiles、claim_line，统一由 GameEngine 驱动。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Serverless 快速开始&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;准备 Supabase&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;新建项目。执行 database-init.sql 初始化表与策略。&lt;/li&gt;
&lt;li&gt;可选：执行 cron-cleandata.sql，启用 pg_cron 清理过期房间。&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;配置 Vercel 环境变量&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;SUPABASE_URL：项目 REST URL。&lt;/li&gt;
&lt;li&gt;SUPABASE_KEY：建议使用 Legacy API Key。&lt;/li&gt;
&lt;li&gt;可选限流：配置 Upstash Redis（URL、TOKEN）。&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;部署&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;将仓库导入 Vercel。完成后访问根路径即可游玩。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;数据表（Supabase / PostgreSQL）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;表 games（JSON 持久化局面 + 元数据）：
&lt;ul&gt;
&lt;li&gt;room_id（PK）&lt;/li&gt;
&lt;li&gt;board（int[][]）&lt;/li&gt;
&lt;li&gt;territory（int[][]）&lt;/li&gt;
&lt;li&gt;current_player（int）&lt;/li&gt;
&lt;li&gt;winner（int）&lt;/li&gt;
&lt;li&gt;last_move_pos（int[2]）&lt;/li&gt;
&lt;li&gt;updated_at（timestamptz）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;示例（节选）：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;create table if not exists public.games (
  room_id text primary key,
  board jsonb not null,
  territory jsonb not null,
  current_player int not null default 1,
  winner int not null default 0,
  last_move_pos jsonb,
  updated_at timestamptz not null default now()
);

create index if not exists idx_games_updated_at on public.games(updated_at desc);
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Python 版本（Legacy）&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;服务端（Flask）
&lt;ul&gt;
&lt;li&gt;GameEngine：维护棋面与回合、胜负。&lt;/li&gt;
&lt;li&gt;process_eliminations / remove_elimination_tiles / claim_line：规则的三阶段实现。&lt;/li&gt;
&lt;li&gt;MatchState：对局调度与并发安全。&lt;/li&gt;
&lt;li&gt;server.py：加入、查询、落子、重置的 REST 路由。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;客户端（Pygame）
&lt;ul&gt;
&lt;li&gt;LocalGame：本地对局。&lt;/li&gt;
&lt;li&gt;RemoteGame：轮询 Flask 服务。&lt;/li&gt;
&lt;li&gt;client.py：渲染与事件循环。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;启动步骤：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 进入 python 子目录（若有）
pip install -r python/requirements.txt
python python/server.py
python python/client.py  # 选择本地或在线模式
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;频控与稳定性&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;middleware.js 基于 Upstash Redis 实现节流。&lt;/li&gt;
&lt;li&gt;按 IP 与路径维度限速。边缘执行，开销低。&lt;/li&gt;
&lt;li&gt;与 Supabase Realtime 可并用，减少轮询压力。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;可扩展方向&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;实时联动：由轮询迁移至 Supabase Realtime 或 WebSocket / Edge Functions。&lt;/li&gt;
&lt;li&gt;观战与复盘：为非玩家提供只读视角。持久化历史步谱并可回放。&lt;/li&gt;
&lt;li&gt;防作弊：IP/设备指纹/节流策略结合服务器侧校验。&lt;/li&gt;
&lt;li&gt;体验优化：房间分享卡片。一键截图（已在 main.js 集成 html2canvas）。移动端触控适配（styles.css 已适配基础尺寸）。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;许可证与致谢&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;参见仓库 LICENSE。&lt;/li&gt;
&lt;li&gt;感谢 Vercel、Supabase、Upstash 提供的云端基础设施。&lt;/li&gt;
&lt;li&gt;感谢社区对规则与可用性的建议。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::tip&lt;/p&gt;
&lt;p&gt;服务已就绪即可直接游玩。欢迎提交 Issue 与 PR。&lt;/p&gt;
&lt;p&gt;:::&lt;/p&gt;
</content:encoded></item><item><title>在 OpenWrt 上优雅地管理 Tailscale：luci-app-tailscale-community</title><link>https://tski.uk/blog/openwrt-luci-app-tailscale-community/</link><guid isPermaLink="true">https://tski.uk/blog/openwrt-luci-app-tailscale-community/</guid><description>一个功能丰富的 LuCI 应用程序，用于在 OpenWrt 上无缝管理 Tailscale，提供直观的状态监控和强大的配置选项。</description><pubDate>Sun, 19 Oct 2025 15:31:50 GMT</pubDate><content:encoded>&lt;h2&gt;2026/1/23&lt;/h2&gt;
&lt;p&gt;经过两三个月的代码审查&lt;a href=&quot;https://github.com/openwrt/luci/pull/8018&quot;&gt;PR#8018&lt;/a&gt;，&lt;code&gt;luci-app-tailscale-community&lt;/code&gt; 已正式合并到 OpenWrt 主线 LuCI 仓库中，未来的发行版可以直接通过官方源安装该插件，无需额外操作。&lt;/p&gt;
&lt;p&gt;另外，这是我第一次将个人项目成功合并到 OpenWrt 主线，感到非常荣幸！&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;项目地址&lt;/h2&gt;
&lt;p&gt;https://github.com/tokisaki-galaxy/luci-app-tailscale-community&lt;/p&gt;
&lt;h2&gt;简介&lt;/h2&gt;
&lt;p&gt;Tailscale 作为一种基于 WireGuard 的零配置 VPN，极大地简化了设备之间的安全连接。对于在 OpenWrt 路由器上运行 Tailscale 的用户来说，通过命令行进行管理虽然可行，但远不如图形化界面来得直观和高效。为了解决这一问题，我开发了 &lt;code&gt;luci-app-tailscale-community&lt;/code&gt;，一个专为 OpenWrt LuCI 界面设计的 Tailscale 管理插件。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;luci-app-tailscale-community&lt;/code&gt; 旨在提供一个原生集成、功能全面的 Web 界面，让用户可以轻松地监控 Tailscale 网络状态并调整各项配置，而无需登录 SSH。&lt;/p&gt;
&lt;h3&gt;核心功能概览&lt;/h3&gt;
&lt;p&gt;该插件将 Tailscale 的核心功能无缝集成到 LuCI 的“服务”菜单下，主要分为“状态”和“设置”两个部分。&lt;/p&gt;
&lt;h4&gt;1. 状态仪表盘&lt;/h4&gt;
&lt;p&gt;提供对 Tailscale 网络健康状况的即时洞察：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;服务状态&lt;/strong&gt;: 清晰地显示 &lt;code&gt;tailscaled&lt;/code&gt; 守护进程是“运行中”还是“未运行”。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;设备 IP&lt;/strong&gt;: 展示当前设备的 Tailscale IPv4 和 IPv6 地址。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;网络设备列表&lt;/strong&gt;: 以表格形式详尽列出 Tailnet 中的所有对等节点（Peers），包含以下关键信息：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;在线状态&lt;/strong&gt;: 通过颜色标识节点是在线还是离线。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;主机名与 DNS&lt;/strong&gt;: 显示设备的主机名和完整的 Tailscale DNS 名称。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;连接类型&lt;/strong&gt;: 指明连接是“直连 (Direct)”还是通过“中继 (Relay)”，并显示中继服务器信息。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;操作系统&lt;/strong&gt; 和 &lt;strong&gt;Tailscale IP&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;最后在线时间&lt;/strong&gt;: 对于离线设备，显示其最后一次活跃的时间。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/Tokisaki-Galaxy/luci-app-tailscale-community/refs/heads/master/image/status.png&quot; alt=&quot;状态页面截图&quot; /&gt;&lt;/p&gt;
&lt;h4&gt;2. 强大的设置管理&lt;/h4&gt;
&lt;p&gt;设置页面通过两个标签页，区分了即时生效的节点设置和需要重启服务的守护进程设置。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;节点设置 (Node Settings)&lt;/strong&gt;
这些设置通过调用 &lt;code&gt;tailscale set&lt;/code&gt; 命令实现，更改会立即生效，无需中断服务。支持的配置项包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;接受/通告路由 (&lt;code&gt;Accept Routes&lt;/code&gt; / &lt;code&gt;Advertise Routes&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;作为或使用出口节点 (&lt;code&gt;Advertise as Exit Node&lt;/code&gt; / &lt;code&gt;Use Exit Node&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;为子网路由启用 SNAT&lt;/li&gt;
&lt;li&gt;启用内置 SSH 服务器&lt;/li&gt;
&lt;li&gt;切换 &lt;code&gt;Shields Up&lt;/code&gt; 模式以增强安全性&lt;/li&gt;
&lt;li&gt;设置自定义主机名&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;守护进程环境设置 (Daemon Environment Settings)&lt;/strong&gt;
这些高级选项通过修改 &lt;code&gt;tailscaled&lt;/code&gt; 启动时的环境变量来实现，因此在保存后需要重启服务。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;自定义 MTU&lt;/strong&gt;: 解决特定网络环境下的连接问题。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;减少内存使用&lt;/strong&gt;: 针对内存有限的设备进行优化，通过设置 &lt;code&gt;GOGC=10&lt;/code&gt; 环境变量，以少量 CPU 开销换取更低的内存占用。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/Tokisaki-Galaxy/luci-app-tailscale-community/refs/heads/master/image/setting.png&quot; alt=&quot;设置页面截图&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;技术实现&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;luci-app-tailscale-community&lt;/code&gt; 主要使用 Lua 编写，并遵循 LuCI 的 MVC 架构。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;数据模型&lt;/strong&gt;: &lt;code&gt;luasrc/model/tailscale_data.lua&lt;/code&gt; 是核心数据加载器。它通过执行 &lt;code&gt;tailscale status --json&lt;/code&gt; 和 &lt;code&gt;tailscale ip&lt;/code&gt; 命令获取实时状态，并解析 &lt;code&gt;/etc/tailscale/tailscaled.state&lt;/code&gt; 文件以获取更详细的运行时配置。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CBI 界面&lt;/strong&gt;: &lt;code&gt;luasrc/model/cbi/tailscale_status.lua&lt;/code&gt; 和 &lt;code&gt;tailscale_settings.lua&lt;/code&gt; 文件使用 LuCI 的 CBI (Configuration Binding Interface) 框架来构建用户界面，并将前端选项与后端配置和命令关联起来。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;配置应用&lt;/strong&gt;: 对于守护进程设置，插件会动态创建或更新位于 &lt;code&gt;/etc/profile.d/&lt;/code&gt; 的一个 shell 脚本，确保在 &lt;code&gt;tailscaled&lt;/code&gt; 服务启动时能加载正确的环境变量。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;安装与使用&lt;/h3&gt;
&lt;p&gt;安装过程非常简单：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;前提条件&lt;/strong&gt;: 确保您的 OpenWrt 设备已安装 &lt;code&gt;tailscale&lt;/code&gt; 和 &lt;code&gt;coreutils-base64&lt;/code&gt;。&lt;pre&gt;&lt;code&gt;opkg update
opkg install tailscale coreutils-base64
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;安装插件&lt;/strong&gt;: 从项目的 &lt;a href=&quot;https://github.com/Tokisaki-Galaxy/luci-app-tailscale-community/releases&quot;&gt;GitHub Release&lt;/a&gt; 页面下载最新的 &lt;code&gt;.ipk&lt;/code&gt; 软件包，上传到路由器并使用 &lt;code&gt;opkg&lt;/code&gt; 安装。&lt;pre&gt;&lt;code&gt;opkg install luci-app-tailscale-community_*.ipk
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;也可以从项目的action下载&lt;/strong&gt;
安装完成后，刷新 LuCI 页面，即可在“服务”菜单下找到“Tailscale”入口。&lt;/p&gt;
</content:encoded></item><item><title>Github云编译Openwrt软件包，再也不用本地配环境</title><link>https://tski.uk/blog/github-action-openwrt-package-builder/</link><guid isPermaLink="true">https://tski.uk/blog/github-action-openwrt-package-builder/</guid><description>自动编译多架构 OpenWrt 软件包的 Action</description><pubDate>Sun, 12 Oct 2025 12:32:23 GMT</pubDate><content:encoded>&lt;h2&gt;项目地址&lt;/h2&gt;
&lt;p&gt;https://github.com/Tokisaki-Galaxy/openwrt-package-builder-action&lt;/p&gt;
&lt;h2&gt;简介&lt;/h2&gt;
&lt;p&gt;对于许多 OpenWrt 爱好者和开发者来说，为不同的目标架构编译软件包可能是一项重复且耗时的工作。为了每次搭建不同环境非常麻烦，我开发并开源了 OpenWrt Package Builder，这是一个基于 GitHub Actions 的自动化工作流，旨在让 OpenWrt 软件包的编译过程变得前所未有的简单和高效。&lt;/p&gt;
&lt;p&gt;你只需要将软件包源码上传至 GitHub 仓库，选择一个预设的工作流，修改两个配置变量，即可自动为多个目标平台编译出 .ipk 文件。
下面是项目的README.md&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;一个简单、通用且开箱即用的 GitHub Actions 工作流，用于自动编译任何 OpenWrt 软件包。本项目提供了两种编译模式：&lt;strong&gt;SDK 模式（推荐）&lt;/strong&gt; 和 &lt;strong&gt;源码模式&lt;/strong&gt;，以满足不同需求。&lt;/p&gt;
&lt;p&gt;你只需要将你的软件包源码放在仓库中，选择一个工作流文件，修改两个变量，即可为多个目标架构自动编译出 &lt;code&gt;.ipk&lt;/code&gt; 文件。&lt;/p&gt;
&lt;h2&gt;✨ 特性&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;🚀 简单易用&lt;/strong&gt;: 只需复制粘贴工作流文件，修改两个环境变量即可。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;⚡️ 极速编译 (SDK 模式)&lt;/strong&gt;: 利用官方预编译的 SDK，将编译时间从 30+ 分钟缩短至 5 分钟以内。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;💡 灵活强大 (源码模式)&lt;/strong&gt;: 可编译包括内核模块在内的任何软件包，并支持 &lt;code&gt;master&lt;/code&gt; 等开发分支。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;⚙️ 高度通用&lt;/strong&gt;: 可用于编译 LuCI 应用、命令行工具、内核模块等任何类型的 OpenWrt 软件包。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;🎯 多目标编译&lt;/strong&gt;: 默认配置为 &lt;code&gt;x86_64&lt;/code&gt;, &lt;code&gt;armv8&lt;/code&gt;, &lt;code&gt;mips_mt7621&lt;/code&gt; 等常用架构，可轻松自定义。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;📦 自动发布&lt;/strong&gt;: 编译成功后，自动将 &lt;code&gt;.ipk&lt;/code&gt; 文件上传为构建产物 (Artifacts)，方便下载。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;💬 提交评论&lt;/strong&gt;: (可选) 所有构建任务成功后，会在对应的 Commit 下自动发表评论，提供产物下载链接。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;🤔 如何选择编译模式？&lt;/h2&gt;
&lt;p&gt;本项目提供两种工作流，请根据你的需求选择其一。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;特性 / 场景&lt;/th&gt;
&lt;th&gt;✅ SDK 模式 (推荐)&lt;/th&gt;
&lt;th&gt;⚠️ 源码模式&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;编译速度&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;极快&lt;/strong&gt; (通常 &amp;lt; 1 分钟)&lt;/td&gt;
&lt;td&gt;慢 (首次编译 &amp;gt; 40 分钟，后续有缓存)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;适用包类型&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;大多数 &lt;strong&gt;LuCI 应用&lt;/strong&gt; 和 &lt;strong&gt;普通软件包&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;所有软件包&lt;/strong&gt;，特别是&lt;strong&gt;内核模块 (&lt;code&gt;kmod-xxx&lt;/code&gt;)&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;支持的 OpenWrt 版本&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;仅支持&lt;strong&gt;官方正式发布版&lt;/strong&gt; (如 &lt;code&gt;v23.05.3&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;支持&lt;strong&gt;所有版本&lt;/strong&gt;，包括 &lt;code&gt;master&lt;/code&gt; 开发分支&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;工作流文件&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;build-with-sdk.yml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;build-from-source.yml&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;总而言之：如果不确定，或者你只是编译一个 LuCI 应用，请优先选择 &lt;code&gt;SDK 模式&lt;/code&gt;。&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;🚀 如何使用&lt;/h2&gt;
&lt;h4&gt;举个例子&lt;/h4&gt;
&lt;p&gt;如果有不明白地方，可以参考&lt;a href=&quot;https://github.com/Tokisaki-Galaxy/luci-app-tailscale-community/.github/workflows/build.yml&quot;&gt;这里&lt;/a&gt;。&lt;/p&gt;
&lt;h4&gt;步骤 1: 选择并创建工作流文件&lt;/h4&gt;
&lt;p&gt;根据上方的选择，在你的仓库根目录下创建对应的 &lt;code&gt;.github/workflows/&lt;/code&gt; 目录和 YAML 文件。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;对于 SDK 模式&lt;/strong&gt;: 创建 &lt;code&gt;.github/workflows/build.yml&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;对于源码模式&lt;/strong&gt;: 创建 &lt;code&gt;.github/workflows/build-nonSDK.yml&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;步骤 2: 复制工作流代码&lt;/h4&gt;
&lt;p&gt;根据你在上一步的选择，将本仓库中对应文件的完整代码复制过去。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;➡️ &lt;a href=&quot;build.yml&quot;&gt;&lt;strong&gt;&lt;code&gt;build-with-sdk.yml&lt;/code&gt; 的代码&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;➡️ &lt;a href=&quot;build-nonSDK.yml&quot;&gt;&lt;strong&gt;&lt;code&gt;build-from-source.yml&lt;/code&gt; 的代码&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;步骤 3: 修改配置&lt;/h4&gt;
&lt;p&gt;打开你创建的 YAML 文件，你只需要修改 &lt;code&gt;env&lt;/code&gt; 部分的 &lt;strong&gt;两个&lt;/strong&gt; 变量：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;PACKAGE_NAME&lt;/code&gt;&lt;/strong&gt;:
将其值修改为你的软件包的目录名。&lt;strong&gt;非常重要&lt;/strong&gt;，这个名字必须和你的软件包在仓库中的文件夹名称完全一致。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;OPENWRT_VERSION&lt;/code&gt;&lt;/strong&gt;:
设置你想要基于哪个 OpenWrt 版本进行编译。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;使用 SDK 模式时&lt;/strong&gt;: &lt;strong&gt;必须&lt;/strong&gt;是一个官方发布的标签，例如 &lt;code&gt;v23.05.3&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;使用源码模式时&lt;/strong&gt;: 可以是任何标签或分支名，例如 &lt;code&gt;v23.05.3&lt;/code&gt; 或 &lt;code&gt;master&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;提示:&lt;/strong&gt; 别忘了更新 &lt;code&gt;README.md&lt;/code&gt; 文件顶部的徽章链接，将 &lt;code&gt;Tokisaki-Galaxy/openwrt-package-builder-action&lt;/code&gt; 替换成你自己的！&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;步骤 4: 检查 Makefile (重要)&lt;/h4&gt;
&lt;p&gt;确保你的软件包目录下的 &lt;code&gt;Makefile&lt;/code&gt; 文件中正确定义了所有依赖项。本工作流依赖 &lt;code&gt;make defconfig&lt;/code&gt; 来自动解析并选中这些依赖。&lt;/p&gt;
&lt;p&gt;例如:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;define Package/my-cool-package
  # ...
  DEPENDS:=+libcurl +libjson-c +some-other-package
endef
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;步骤 5: 提交并运行&lt;/h4&gt;
&lt;p&gt;将你的代码和 &lt;code&gt;.github/workflows/&lt;/code&gt; 下的 YAML 文件提交并推送到 GitHub。GitHub Actions 会自动开始运行。&lt;/p&gt;
&lt;p&gt;你可以在仓库的 &lt;code&gt;Actions&lt;/code&gt; 标签页查看编译进度。编译完成后，可以在对应的运行记录页面找到并下载 &lt;code&gt;Artifacts&lt;/code&gt;。&lt;/p&gt;
&lt;h2&gt;🔧 自定义&lt;/h2&gt;
&lt;h3&gt;修改编译目标&lt;/h3&gt;
&lt;p&gt;如果你需要为其他架构编译，可以修改工作流文件中的 &lt;code&gt;jobs.build.strategy.matrix.target&lt;/code&gt; 部分。只需按照现有格式添加或修改条目即可。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;请注意&lt;/strong&gt;：两种模式的 &lt;code&gt;matrix&lt;/code&gt; 结构略有不同，请参照各自文件中的格式进行修改。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;修改触发条件&lt;/h3&gt;
&lt;p&gt;你可以修改文件顶部的 &lt;code&gt;on&lt;/code&gt; 部分来更改触发工作流的条件，例如改为 &lt;code&gt;pull_request&lt;/code&gt; 或定时运行 (&lt;code&gt;schedule&lt;/code&gt;)。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;协议&lt;/h2&gt;
&lt;p&gt;本项目使用MIT授权。&lt;/p&gt;
</content:encoded></item><item><title>在 Linux 上使用 ipset 高效屏蔽特定国家 IP（中国等）</title><link>https://tski.uk/blog/use-ipset-ban-chinaip/</link><guid isPermaLink="true">https://tski.uk/blog/use-ipset-ban-chinaip/</guid><description>一种在 Linux 服务器上，利用 ipset 和 systemd 定时任务，实现低资源消耗、非持久化、高效率地屏蔽特定国家或地区 IP 地址列表的方案。</description><pubDate>Sun, 17 Aug 2025 18:19:40 GMT</pubDate><content:encoded>&lt;h2&gt;前言&lt;/h2&gt;
&lt;p&gt;从Google Cloud白嫖了个服务器，但是最近时不时总是发现偷偷跑钱，每个月一两块钱，虽然少但是与白嫖相悖。&lt;/p&gt;
&lt;p&gt;因为虽然每个月有200G免费流量，但是中国不属于免费流量范围，所以每次访问中国IP都会扣钱。于是就想办法封中国IP。&lt;/p&gt;
&lt;p&gt;一开始看到网上很多ufw的脚步，比如这种&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#!/bin/bash for ip in $(cat cn.zone); do sudo ufw deny from $ip done
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;用一堆for循环塞到ufw里面，当一个网络数据包到达时，内核需要从上到下逐一检查这个长长的规则列表。时间复杂度是O(n)，当规则数量很多时，性能会显著下降。&lt;/p&gt;
&lt;p&gt;而ipset是专门为处理大量IP地址而设计的，它使用哈希表来存储IP地址，查询时间复杂度接近O(1)。所以使用ipset代替ufw可以显著提高性能。&lt;/p&gt;
&lt;p&gt;一开始是用ipset-persistent，netfilter-persistent进行持久化，但是这两个工具会保存所有规则，容易导致ipset规则积累过多。所以采用服务的方式绕开持久化。&lt;/p&gt;
&lt;h2&gt;解决方案&lt;/h2&gt;
&lt;h3&gt;systemed Service&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# /etc/systemd/system/china-ip-blocker.service
[Unit]
Description=Update and apply China IP blocklist using ipset
After=network-online.target
Wants=network-online.target

[Service]
Type=oneshot
# 脚本绝对路径
ExecStart=/usr/local/bin/update_china_blocklist.sh
PrivateTmp=true
ProtectSystem=strict
ReadWritePaths=/var/run
ProtectHome=true
NoNewPrivileges=true
SupplementaryGroups=systemd-resolve
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;systemed Timer&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# /etc/systemd/system/china-ip-blocker.timer
[Unit]
Description=Run china-ip-blocker service on boot and daily
[Timer]
OnBootSec=2min
OnUnitActiveSec=12h
Unit=china-ip-blocker.service
[Install]
WantedBy=timers.target
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;主程序&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;#!/bin/bash
# =================================================================
#  High-Performance, Low-Resource IP Blocklist Update Script
#
#  Designed for execution via systemd timer or cron.
#  This script is non-persistent and relies on being run on boot
#  and periodically to maintain firewall rules.
# =================================================================

set -o errexit   # Exit immediately if a command exits with a non-zero status.
set -o nounset   # Exit immediately if it tries to use an undeclared variable.
set -o pipefail  # The return value of a pipeline is the status of the last command to exit with a non-zero status.

# --- Configuration ---
readonly IPSET_NAME=&quot;chinablock&quot;
readonly IP_LIST_URL=&quot;https://www.ipdeny.com/ipblocks/data/countries/cn.zone&quot;
readonly TMP_FILE=&quot;/dev/shm/${IPSET_NAME}.zone&quot;
readonly LOCK_FILE=&quot;/var/run/${IPSET_NAME}.lock&quot;
readonly MIN_IP_COUNT=100 # Minimum expected number of IP ranges

# Efficient logging function using bash printf built-in (&amp;gt;= bash 4.2)
log() {
    # %-1s prints a single space. Using it to get printf to evaluate the format string.
    printf &apos;%(%Y-%m-%d %H:%M:%S)T - %s\n&apos; -1 &quot;$1&quot;
}

# Centralized error-handling function
die() {
    log &quot;FATAL: $1&quot; &amp;gt;&amp;amp;2
    exit 1
}

main() {
    # --- Prerequisite Checks ---
    if [[ ${EUID:-$(id -u)} -ne 0 ]]; then
        die &quot;This script must be run as root.&quot;
    fi

    for cmd in ipset wget iptables flock awk head tail; do
        if ! command -v &quot;$cmd&quot; &amp;amp;&amp;gt;/dev/null; then
            die &quot;Required command &apos;$cmd&apos; is not found.&quot;
        fi
    done
    
    # Ensure temporary file is cleaned up on any exit
    trap &apos;rm -f &quot;$TMP_FILE&quot;&apos; EXIT

    log &quot;Starting IP blocklist update for set &apos;$IPSET_NAME&apos;...&quot;

    # --- Download IP List ---
    log &quot;Downloading IP list from $IP_LIST_URL...&quot;
    if ! wget -q --timeout=60 --tries=3 -O &quot;$TMP_FILE&quot; &quot;$IP_LIST_URL&quot;; then
        die &quot;Download failed from $IP_LIST_URL.&quot;
    fi

    # --- Create and Load Temporary IPSet ---
    local temp_ipset_name=&quot;${IPSET_NAME}_temp&quot;
    ipset create &quot;$temp_ipset_name&quot; hash:net -exist
    ipset flush &quot;$temp_ipset_name&quot;

    log &quot;Validating list and preparing for bulk load...&quot;
    # Use a single awk pass to validate and generate restore data.
    # It exits with an error code if the line count is too low.
    # The last line of its output is the total count.
    local awk_output
    awk_output=$(awk -v set_name=&quot;$temp_ipset_name&quot; \
        &apos;{ print &quot;add &quot; set_name &quot; &quot; $1 } END { if (NR &amp;lt; &apos;$MIN_IP_COUNT&apos;) exit 1; print NR }&apos; &quot;$TMP_FILE&quot;) \
        || die &quot;IP list validation failed (expected &amp;gt;$MIN_IP_COUNT lines, found $(wc -l &amp;lt; &quot;$TMP_FILE&quot; | awk &apos;{print $1}&apos;)).&quot;
    
    # Pipe all but the last line (the count) to ipset restore for high-speed loading.
    echo &quot;$awk_output&quot; | head -n -1 | ipset restore || die &quot;ipset restore command failed.&quot;
    
    local final_count
    final_count=$(echo &quot;$awk_output&quot; | tail -n 1)
    
    log &quot;Loaded $final_count IP blocks into temporary set &apos;$temp_ipset_name&apos;.&quot;

    # --- Atomically Activate the New IPSet ---
    ipset create &quot;$IPSET_NAME&quot; hash:net -exist
    ipset swap &quot;$temp_ipset_name&quot; &quot;$IPSET_NAME&quot;
    ipset destroy &quot;$temp_ipset_name&quot;
    log &quot;Successfully updated and activated ipset &apos;$IPSET_NAME&apos;.&quot;

    # --- Ensure IPTables Rule Exists ---
    # This check is crucial because the rule is lost on reboot.
    if ! iptables -C INPUT -m set --match-set &quot;$IPSET_NAME&quot; src -j DROP &amp;amp;&amp;gt;/dev/null; then
        log &quot;iptables rule not found. Inserting it at the top of the INPUT chain...&quot;
        # -I INPUT 1 ensures it&apos;s one of the first rules evaluated, which is critical for performance.
        iptables -I INPUT 1 -m set --match-set &quot;$IPSET_NAME&quot; src -j DROP
        log &quot;iptables rule for &apos;$IPSET_NAME&apos; added.&quot;
    else
        log &quot;iptables rule for &apos;$IPSET_NAME&apos; already exists.&quot;
    fi

    log &quot;Update completed successfully.&quot;
}

# --- Execution Wrapper ---
# Use flock for robust concurrency control. The lock is held on file descriptor 200.
(
    flock -n 200 || die &quot;Script is already running. Another instance holds the lock.&quot;
    main
) 200&amp;gt;&quot;$LOCK_FILE&quot;

exit 0
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;使用方式&lt;/h2&gt;
&lt;h3&gt;创建 &lt;code&gt;systemd&lt;/code&gt; Service 文件&lt;/h3&gt;
&lt;p&gt;在 &lt;code&gt;/etc/systemd/system/&lt;/code&gt; 目录下创建 &lt;code&gt;china-ip-blocker.service&lt;/code&gt;。&lt;/p&gt;
&lt;h3&gt;创建 &lt;code&gt;systemd&lt;/code&gt; Timer 文件&lt;/h3&gt;
&lt;p&gt;这个文件定义了触发上述 &lt;code&gt;service&lt;/code&gt; 的时间和频率。&lt;/p&gt;
&lt;p&gt;在 &lt;code&gt;/etc/systemd/system/&lt;/code&gt; 目录下创建一个与 &lt;code&gt;service&lt;/code&gt; 文件同名（但后缀不同）的 &lt;code&gt;china-ip-blocker.timer&lt;/code&gt; 文件。&lt;/p&gt;
&lt;h3&gt;部署和启用&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;放置脚本&lt;/strong&gt;：将脚本（例如 &lt;code&gt;update_china_blocklist.sh&lt;/code&gt;）放置到一个合适的位置，比如 &lt;code&gt;/usr/local/bin/&lt;/code&gt;，并确保它有可执行权限。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo chmod +x /usr/local/bin/update_china_blocklist.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;重载 &lt;code&gt;systemd&lt;/code&gt; 配置&lt;/strong&gt;：让 &lt;code&gt;systemd&lt;/code&gt; 知道你创建了新的单元文件。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl daemon-reload
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;启用并启动定时器&lt;/strong&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl enable china-ip-blocker.timer
sudo systemctl start china-ip-blocker.timer
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;enable&lt;/code&gt; 会让定时器开机自启。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;start&lt;/code&gt; 会立即激活定时器，让它开始计时。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;注意&lt;/strong&gt;：你只需要 &lt;code&gt;enable&lt;/code&gt; 和 &lt;code&gt;start&lt;/code&gt; &lt;code&gt;.timer&lt;/code&gt; 文件，它会自动管理 &lt;code&gt;.service&lt;/code&gt; 文件。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;管理和调试&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;查看定时器状态&lt;/strong&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;systemctl status china-ip-blocker.timer
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;输出会显示 &lt;code&gt;NEXT&lt;/code&gt;（下一次运行时间）。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;查看服务运行日志&lt;/strong&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;journalctl -u china-ip-blocker.service
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这会显示脚本的所有输出和错误信息，比传统的日志文件管理更方便。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;手动触发一次任务&lt;/strong&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl start china-ip-blocker.service
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;检查生效&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;root@nagasaki-soyo:/home/tokisaki# sudo ipset list chinablock
Name: chinablock
Type: hash:net
Revision: 7
Header: family inet hashsize 2048 maxelem 65536 bucketsize 12 initval 0xc19a419f
Size in memory: 233664
References: 1
Number of entries: 8711
Members:
58.240.0.0/15
103.3.100.0/22
...
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;root@nagasaki-soyo:/home/tokisaki# sudo iptables -L INPUT -n -v
Chain INPUT (policy DROP 619 packets, 41086 bytes)
 pkts bytes target     prot opt in     out     source               destination
 5345  916K DROP       0    --  *      *       0.0.0.0/0            0.0.0.0/0            match-set chinablock src
 492K  168M ts-input   0    --  *      *       0.0.0.0/0            0.0.0.0/0
 355K  138M ufw-before-logging-input  0    --  *      *       0.0.0.0/0            0.0.0.0/0
 355K  138M ufw-before-input  0    --  *      *       0.0.0.0/0            0.0.0.0/0
  627 41710 ufw-after-input  0    --  *      *       0.0.0.0/0            0.0.0.0/0
  619 41086 ufw-after-logging-input  0    --  *      *       0.0.0.0/0            0.0.0.0/0
  619 41086 ufw-reject-input  0    --  *      *       0.0.0.0/0            0.0.0.0/0
  619 41086 ufw-track-input  0    --  *      *       0.0.0.0/0            0.0.0.0/0
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>Openwrt或Linux上Tailscale与ZeroTier的路由冲突IPProto-44</title><link>https://tski.uk/blog/resolve-route-conflict-zerotier-tailscale/</link><guid isPermaLink="true">https://tski.uk/blog/resolve-route-conflict-zerotier-tailscale/</guid><description>从发现到解决IPProto-44，Openwrt或Linux上Tailscale与ZeroTier的路由冲突</description><pubDate>Fri, 11 Jul 2025 22:44:42 GMT</pubDate><content:encoded>&lt;p&gt;因为有时候tailscale和zerotier都不太稳定，所以我在OpenWrt上同时使用了这两个VPN。平时主要用tailscale，zerotier作为应急有时候有奇效。&lt;/p&gt;
&lt;h3&gt;问题的浮现：神秘的丢包日志&lt;/h3&gt;
&lt;p&gt;一切始于一个看似无关的现象。在检查 OpenWrt 的系统日志时，我反复看到由 &lt;code&gt;tailscaled&lt;/code&gt;（Tailscale 的守护进程）打印出的错误信息：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Fri Jul 11 21:10:43 2025 daemon.err tailscaled[3274]: Drop: IPProto-44{[fd7a:...] &amp;gt; [fd7a:...]} ... unknown-protocol-44
Fri Jul 11 21:10:53 2025 daemon.err tailscaled[3274]: [RATELIMIT] format(&quot;%s: %s %d %s\n%s&quot;) (8 dropped)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;日志显示 Tailscale 正在丢弃一种它不认识的协议（&lt;code&gt;IPProto-44&lt;/code&gt;）的数据包，来源和目的地都是我网络内的设备。更奇怪的是，这些流量似乎与 Tailscale 本身无关。经过排查，元凶很快就锁定了——这些“异常流量”正是我的 ZeroTier 客户端为了连接其 Moon 中继服务器而发出的。&lt;/p&gt;
&lt;h3&gt;深入分析，路由表？&lt;/h3&gt;
&lt;p&gt;为什么 ZeroTier 的流量会跑到 Tailscale 的地盘上呢？答案藏在路由规则里。&lt;/p&gt;
&lt;p&gt;通过 SSH 登录到 OpenWrt 并执行 &lt;code&gt;ip rule show&lt;/code&gt;，我们看到了问题的关键：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;root@ImmortalWrt:~# ip rule show
0:      from all lookup local
...
5270:   from all lookup 52
32766:  from all lookup main
...
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Linux 的路由规则是按优先级（&lt;code&gt;prio&lt;/code&gt;，数字越小优先级越高）执行的。这段输出告诉我们：
系统会先检查是不是发给路由器自己的流量 (&lt;code&gt;lookup local&lt;/code&gt;)。如果不是，它会去检查一个优先级为 &lt;code&gt;5270&lt;/code&gt; 的规则，这条规则说：“&lt;strong&gt;所有流量，都先去查阅路由表 &lt;code&gt;52&lt;/code&gt;&lt;/strong&gt;”。路由表 &lt;code&gt;52&lt;/code&gt; 是 Tailscale 安装时创建的专属路由表，里面只有通往其他 Tailscale 节点的路由。只有在路由表 &lt;code&gt;52&lt;/code&gt; 里也找不到路时，流量才会继续往下，去查询优先级更低的 &lt;code&gt;main&lt;/code&gt; 主路由表（我们正常的互联网出口就在这里）。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;结论显而易见：Tailscale 设置了一条过于“霸道”的高优先级规则，把所有从路由器发出的流量（包括 ZeroTier 的）都“劫持”了。当 ZeroTier 的特殊数据包被导向 Tailscale 的网络时，不认识它的 Tailscale 自然就选择丢弃。&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;解决方案&lt;/h3&gt;
&lt;p&gt;要解决这个问题，我们不能粗暴地修改 Tailscale 的规则，而是应该为 ZeroTier 建立一条优先级更高的“专属通道”。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;我们的策略是：&lt;/strong&gt; 创建一条新的路由规则，明确告诉系统：“&lt;strong&gt;凡是从 ZeroTier 虚拟网卡发出的流量，请直接走 &lt;code&gt;main&lt;/code&gt; 主路由表&lt;/strong&gt;”，并确保这条规则的优先级高于 Tailscale 的 &lt;code&gt;5270&lt;/code&gt;。&lt;/p&gt;
&lt;h4&gt;Openwrt脚本与使用&lt;/h4&gt;
&lt;h5&gt;第一步：（推荐）安装完整版 &lt;code&gt;ip&lt;/code&gt; 工具&lt;/h5&gt;
&lt;p&gt;OpenWrt 自带的 &lt;code&gt;ip&lt;/code&gt; 命令功能可能不全。安装 &lt;code&gt;ip-full&lt;/code&gt; 可以避免很多疑难杂症。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;opkg update
opkg install ip-full
&lt;/code&gt;&lt;/pre&gt;
&lt;h5&gt;第二步：创建服务脚本&lt;/h5&gt;
&lt;p&gt;使用 &lt;code&gt;vi&lt;/code&gt; 或 &lt;code&gt;nano&lt;/code&gt; 创建一个新的服务文件。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;nano /etc/init.d/zerotier-policy-route
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;将下面的完整脚本代码粘贴到你打开的文件中。&lt;/p&gt;
&lt;p&gt;:::warning&lt;/p&gt;
&lt;p&gt;请根据你的实际情况，修改 &lt;code&gt;ZT_IFACE&lt;/code&gt; 变量的值。你可以通过 &lt;code&gt;ifconfig | grep zt&lt;/code&gt; 命令找到你的 ZeroTier 网卡名称。&lt;/p&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#!/bin/sh /etc/rc.common

#
# This script creates policy routing rules for ZeroTier to coexist with Tailscale.
# It prevents ZeroTier&apos;s traffic from being intercepted by Tailscale&apos;s high-priority rule.
# Version 3: Intelligently handles IPv4 and IPv6 addresses.
#

START=99
STOP=15

# --- CONFIGURATION ---
# The name of your ZeroTier virtual network interface. Find it with `ifconfig | grep zt`.
ZT_IFACE=&quot;ztypia4gba&quot;

# The priority for the new routing rule. Must be lower (higher priority) than Tailscale&apos;s (usually 5270).
RULE_PRIO=&quot;5260&quot;

# Tag for system log entries.
LOG_TAG=&quot;zerotier-policy-route&quot;
# --- END CONFIGURATION ---

add_rules() {
    # Get all global/unique IP addresses (v4 and v6), excluding link-local (fe80::) addresses.
    IP_LIST=$(ip addr show dev &quot;${ZT_IFACE}&quot; | grep -E &apos;inet|inet6&apos; | grep -v &apos; fe80::&apos; | awk &apos;{print $2}&apos; | cut -d&apos;/&apos; -f1)

    if [ -z &quot;${IP_LIST}&quot; ]; then
        logger -t &quot;${LOG_TAG}&quot; &quot;Warning: No usable IP addresses found on interface ${ZT_IFACE}.&quot;
        return
    fi

    for ip in ${IP_LIST}; do
        # Check if a rule for this IP already exists to avoid duplication.
        if ! ip rule | grep -q &quot;from ${ip} lookup main&quot;; then
            logger -t &quot;${LOG_TAG}&quot; &quot;Adding rule for ${ip} with priority ${RULE_PRIO}.&quot;
            
            # CRITICAL FIX: Use the &apos;-6&apos; flag for IPv6 addresses.
            if echo &quot;${ip}&quot; | grep -q &quot;:&quot;; then
                ip -6 rule add from &quot;${ip}&quot; lookup main prio &quot;${RULE_PRIO}&quot;
            else
                ip rule add from &quot;${ip}&quot; lookup main prio &quot;${RULE_PRIO}&quot;
            fi
        else
            logger -t &quot;${LOG_TAG}&quot; &quot;Rule for ${ip} already exists. Skipping.&quot;
        fi
    done
}

remove_rules() {
    IP_LIST=$(ip addr show dev &quot;${ZT_IFACE}&quot; | grep -E &apos;inet|inet6&apos; | grep -v &apos; fe80::&apos; | awk &apos;{print $2}&apos; | cut -d&apos;/&apos; -f1)
    if [ -z &quot;${IP_LIST}&quot; ]; then return; fi

    for ip in ${IP_LIST}; do
        if ip rule | grep -q &quot;from ${ip} lookup main&quot;; then
            logger -t &quot;${LOG_TAG}&quot; &quot;Removing rule for ${ip}.&quot;

            # Use the &apos;-6&apos; flag for deletion of IPv6 rules as well.
            if echo &quot;${ip}&quot; | grep -q &quot;:&quot;; then
                ip -6 rule del from &quot;${ip}&quot; lookup main prio &quot;${RULE_PRIO}&quot;
            else
                ip rule del from &quot;${ip}&quot; lookup main prio &quot;${RULE_PRIO}&quot;
            fi
        fi
    done
}

start() {
    logger -t &quot;${LOG_TAG}&quot; &quot;Service starting, applying rules...&quot;
    add_rules
}

stop() {
    logger -t &quot;${LOG_TAG}&quot; &quot;Service stopping, removing rules...&quot;
    remove_rules
}

reload() {
    logger -t &quot;${LOG_TAG}&quot; &quot;Service reloading...&quot;
    stop
    start
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h5&gt;第三步：授权并启用服务&lt;/h5&gt;
&lt;p&gt;保存文件后，在终端执行以下命令：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 赋予脚本执行权限
chmod +x /etc/init.d/zerotier-policy-route

# 启用服务，让它开机自启
/etc/init.d/zerotier-policy-route enable

# 立即启动服务以应用规则
/etc/init.d/zerotier-policy-route start
&lt;/code&gt;&lt;/pre&gt;
&lt;h5&gt;第四步：验证成果&lt;/h5&gt;
&lt;p&gt;执行 &lt;code&gt;ip rule show&lt;/code&gt;，你将看到类似下面的输出，我们为 ZeroTier 的每个 IP 添加的 &lt;code&gt;5260&lt;/code&gt; 规则已经稳稳地待在了 Tailscale 的规则之上。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;0:      from all lookup local
...
5260:   from 172.27.72.251 lookup main
5260:   from fddd:ec77:... lookup main
5260:   from fce1:9571:... lookup main
5270:   from all lookup 52
...
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Linux服务器脚本与使用&lt;/h4&gt;
&lt;p&gt;由于Openwrt出现这个提示，必然tailscale虚拟局域网中有另一台Linux服务器也安装了Tailscale和ZeroTier。我们可以将上面的脚本稍作修改，适用于其他Linux发行版。&lt;/p&gt;
&lt;h5&gt;策略路由脚本&lt;/h5&gt;
&lt;pre&gt;&lt;code&gt;sudo nano /usr/local/sbin/zerotier-policy-route.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;#!/bin/bash

#
# This script creates policy routing rules for all ZeroTier interfaces
# to coexist with Tailscale on a Debian-based system.
#

set -e # Exit immediately if a command exits with a non-zero status.

# --- CONFIGURATION ---
# The priority for the new routing rule.
# This MUST be a lower number (higher priority) than Tailscale&apos;s rule (usually 5270).
RULE_PRIO=&quot;5260&quot;
LOG_TAG=&quot;zerotier-policy-route&quot;
# --- END CONFIGURATION ---

# Find all ZeroTier network interfaces (names starting with &apos;zt&apos;).
# We use `ip -o link show` for a stable, one-line-per-interface output.
ZT_INTERFACES=$(ip -o link show | awk -F&apos;: &apos; &apos;{print $2}&apos; | grep &apos;^zt&apos;)

if [ -z &quot;$ZT_INTERFACES&quot; ]; then
    logger -t &quot;$LOG_TAG&quot; &quot;No ZeroTier interfaces found. Exiting.&quot;
    exit 0
fi

# Function to add rules for all found interfaces
add_rules() {
    logger -t &quot;$LOG_TAG&quot; &quot;Applying policy routing rules...&quot;
    for iface in $ZT_INTERFACES; do
        # Get all global/unique IP addresses (v4 and v6), excluding link-local (fe80::)
        IP_LIST=$(ip addr show dev &quot;$iface&quot; | grep -E &apos;inet|inet6&apos; | grep -v &apos;fe80::&apos; | awk &apos;{print $2}&apos; | cut -d&apos;/&apos; -f1)
        
        if [ -z &quot;$IP_LIST&quot; ]; then
            logger -t &quot;$LOG_TAG&quot; &quot;No usable IP addresses on interface $iface. Skipping.&quot;
            continue
        fi

        for ip in $IP_LIST; do
            # Only add the rule if it doesn&apos;t already exist.
            if ! ip rule | grep -q &quot;from $ip lookup main&quot;; then
                logger -t &quot;$LOG_TAG&quot; &quot;Adding rule for $ip (on $iface) with priority $RULE_PRIO.&quot;
                # Use the &apos;-6&apos; flag for IPv6 addresses.
                if [[ &quot;$ip&quot; == *&quot;:&quot;* ]]; then
                    ip -6 rule add from &quot;$ip&quot; lookup main prio &quot;$RULE_PRIO&quot;
                else
                    ip rule add from &quot;$ip&quot; lookup main prio &quot;$RULE_PRIO&quot;
                fi
            fi
        done
    done
}

# Function to remove rules for all found interfaces
remove_rules() {
    logger -t &quot;$LOG_TAG&quot; &quot;Removing policy routing rules...&quot;
    # We need to find all possible IPs that could have had rules.
    # It&apos;s safer to just try deleting any rule with our priority.
    # This is simpler and more robust than tracking IPs.
    while ip rule | grep -q &quot;prio $RULE_PRIO&quot;; do
        # Find the first rule with our priority and delete it. Loop until none are left.
        RULE_TO_DELETE=$(ip rule | grep &quot;prio $RULE_PRIO&quot; | head -n 1)
        logger -t &quot;$LOG_TAG&quot; &quot;Deleting rule: $RULE_TO_DELETE&quot;
        # Re-construct the delete command from the rule string.
        ip rule del ${RULE_TO_DELETE}
    done
}

# Main command logic
case &quot;$1&quot; in
    start)
        add_rules
        ;;
    stop)
        remove_rules
        ;;
    restart)
        remove_rules
        add_rules
        ;;
    *)
        echo &quot;Usage: $0 {start|stop|restart}&quot;
        exit 1
        ;;
esac

exit 0
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;最后记得加上权限&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo chmod +x /usr/local/sbin/zerotier-policy-route.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;自启动服务脚本&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;sudo nano /etc/systemd/system/zerotier-policy-route.service
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;[Unit]
Description=ZeroTier Policy Routing Fix for Tailscale Coexistence
After=network-online.target
Wants=network-online.target
After=zerotier-one.service tailscaled.service

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/local/sbin/zerotier-policy-route.sh start
ExecStop=/usr/local/sbin/zerotier-policy-route.sh stop

[Install]
WantedBy=multi-user.target
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;最后，要启动服务。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl enable zerotier-policy-route.service
sudo systemctl start zerotier-policy-route.service
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;可以验证一下&lt;code&gt;ip rule show&lt;/code&gt;，应该可以看到下面这样&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;0:      from all lookup local
5210:   from all fwmark 0x80000/0xff0000 lookup main
5230:   from all fwmark 0x80000/0xff0000 lookup default
5250:   from all fwmark 0x80000/0xff0000 unreachable
5260:   from 172.27.72.101 lookup main  &amp;lt;--
5260:   from 172.27.62.101 lookup main  &amp;lt;--
5260:   from 172.27.71.101 lookup main  &amp;lt;--
5270:   from all lookup 52
32766:  from all lookup main
32767:  from all lookup default
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;同时，&lt;code&gt;logread&lt;/code&gt; 中烦人的丢包日志也从此消失了。&lt;/p&gt;
</content:encoded></item><item><title>ReFS使用注意事项</title><link>https://tski.uk/blog/refs-attention/</link><guid isPermaLink="true">https://tski.uk/blog/refs-attention/</guid><description>ReFS 使用注意事项，例如禁止自动更新，手动更新，数据压缩，重复数据删除，数据修复，完整性流等。</description><pubDate>Mon, 21 Apr 2025 17:58:22 GMT</pubDate><content:encoded>&lt;h2&gt;什么是ReFS&lt;/h2&gt;
&lt;p&gt;浏览本文的时候，默认你已经了解了ReFS的基本概念以及优劣。如果不了解，可以参考&lt;a href=&quot;https://learn.microsoft.com/zh-cn/windows-server/storage/refs/refs-overview&quot;&gt;ReFS概述&lt;/a&gt;。
本文只讨论自己使用ReFS的注意事项，若有命令参数等请自行参考本文的超链接官方文档。
并且本文对ReFS的归纳并不完整，请参阅官方文档。&lt;/p&gt;
&lt;h2&gt;ReFS注意事项&lt;/h2&gt;
&lt;p&gt;下面只讨论作为数据盘的情况，不太建议用作系统盘。虽然新版本的Windows支持从REFS引导，但是社区依然发现在系统还原这种基础问题上依然有问题。&lt;/p&gt;
&lt;p&gt;:::warning&lt;/p&gt;
&lt;p&gt;强烈建议在使用前，禁止自动升级REFS版本。不然在回撤Windows版本的时候，你会无法访问数据盘，变成RAW分区。
REFS的版本升级是不可逆的，升级后无法降级！！！&lt;/p&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;h2&gt;日常维护&lt;/h2&gt;
&lt;h3&gt;禁止自动升级（推荐）&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem]
&quot;RefsDisableLastAccessUpdate&quot;=dword:00000001
;&quot;RefsDisableVolumeUpgrade&quot;=dword:00000001   不用这种方法，似乎会阻止手动升级
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;手动升级（推荐）&lt;/h3&gt;
&lt;p&gt;在你确认你不需要降级的情况下，手动升级ReFS版本。高版本的ReFS会有更好的性能和稳定性。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 查看版本
fsutil fsinfo refsinfo z:

# 升级文件系统版本
fsutil Volume Upgrade &amp;lt;C:&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;数据压缩（推荐）&lt;/h3&gt;
&lt;p&gt;这个挺好用的。
&lt;a href=&quot;https://learn.microsoft.com/zh-cn/windows-server/administration/windows-commands/refsutil-compression&quot;&gt;数据压缩文档&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;重复数据删除（推荐）&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://learn.microsoft.com/zh-cn/windows-server/administration/windows-commands/refsutil-dedupe&quot;&gt;重复数据删除文档&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;数据修复（必看）&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://learn.microsoft.com/zh-cn/windows-server/administration/windows-commands/refsutil-triage&quot;&gt;分析和解决文件系统损坏问题&lt;/a&gt;
&lt;a href=&quot;https://learn.microsoft.com/zh-cn/windows-server/administration/windows-commands/refsutil-salvage&quot;&gt;对于变成RAW(损坏的卷)执行恢复作以检索数据。&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;高级功能&lt;/h2&gt;
&lt;h3&gt;ReFS完整性流（推荐）&lt;/h3&gt;
&lt;p&gt;完整性流是 ReFS 的一项功能，它可以确保文件数据的完整性。它使用 CRC32 校验和来验证文件数据的完整性。启用完整性流后，ReFS 会在每次读取文件时计算 CRC32 校验和，并将其与存储在文件中的校验和进行比较。如果校验和不匹配，则 ReFS 会尝试修复文件。
&lt;a href=&quot;https://learn.microsoft.com/zh-cn/windows-server/storage/refs/integrity-streams&quot;&gt;完整性流文档&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;Get-FileIntegrity&lt;/h4&gt;
&lt;p&gt;若要查看是否为文件数据启用了完整性流，请使用 Get-FileIntegrity cmdlet。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Get-FileIntegrity -FileName &apos;C:\Docs\TextDocument.txt&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;Get-Item -Path &apos;C:\Docs\*&apos; | Get-FileIntegrity
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;也可以使用 Get-Item cmdlet 获取指定目录中所有文件的完整性流设置。&lt;/p&gt;
&lt;h4&gt;Set-FileIntegrity&lt;/h4&gt;
&lt;p&gt;若要对文件数据启用/禁用完整性流，请使用 Set-FileIntegrity cmdlet。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Set-FileIntegrity -FileName &apos;H:\Docs\TextDocument.txt&apos; -Enable $True
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;也可以使用 Get-Item cmdlet 设置指定文件夹中所有文件的完整性流设置。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Get-Item -Path &apos;H\Docs\*&apos; | Set-FileIntegrity -Enable $True
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Set-FileIntegrity cmdlet 也可直接用于卷和目录。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Set-FileIntegrity H:\ -Enable $True
Set-FileIntegrity H:\Docs -Enable $True
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;高级重复数据删除&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://learn.microsoft.com/en-us/powershell/module/microsoft.refsdedup.commands/?view=windowsserver2025-ps&quot;&gt;高级重复数据删除指令&lt;/a&gt;
我一直分不清ReFSDedupSchedule和ReFSDedupScrubSchedule区别。总之我一直用ReFSDedupScrubSchedule。&lt;/p&gt;
&lt;p&gt;不过基本上常用的下面这些&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Disable-ReFSDedup Z:
refsutil dedup z: /d
Enable-ReFSDedup -Volume &quot;Z:&quot; -Type DedupAndCompress
Set-ReFSDedupScrubSchedule -Volume: Z: -Start 2025/4/29 19:0:0 -WeeksInterval 2
Start-ReFSDedupJob -Volume Z: -CompressionFormat LZ4
Stop-ReFSDedupJob Z:
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>ZeroTier和Tailscale的区别</title><link>https://tski.uk/blog/diff-zerotier-tailscale/</link><guid isPermaLink="true">https://tski.uk/blog/diff-zerotier-tailscale/</guid><description>对比了ZeroTier和Tailscale，分析了它们在协议、网络结构、连接稳定性等差异。</description><pubDate>Sun, 20 Apr 2025 13:53:45 GMT</pubDate><content:encoded>&lt;p&gt;网上基本上没人说这两个有什么差别，其实实际使用的时候区别还是蛮大的。&lt;/p&gt;
&lt;p&gt;先说结论，ZeroTier用的是私有协议，Tailscale用的是WireGuard。但是ZeroTier有点像玩具，Tailscale更完善。&lt;/p&gt;
&lt;h2&gt;ZeroTier&lt;/h2&gt;
&lt;p&gt;ZeroTier 是一种虚拟局域网解决方案，它可以将不同地点的设备连接到同一个网络中，如同它们处于同一物理网络。&lt;/p&gt;
&lt;h2&gt;Tailscale&lt;/h2&gt;
&lt;p&gt;Tailscale 是一种基于 WireGuard 的 VPN 解决方案，可以安全地连接您的设备和应用，无需复杂的防火墙配置。&lt;/p&gt;
&lt;h3&gt;协议以及网络结构&lt;/h3&gt;
&lt;p&gt;ZeroTier使用的是私有协议，Tailscale使用的是WireGuard。ZeroTier和Tailscale都提供自定义中继服务器，分别是MOON和DERP服务器。
在网络结构上，ZeroTier是一个P2P网络，Tailscale是一个Mesh网络。&lt;/p&gt;
&lt;h3&gt;连接稳定性(最大区别)&lt;/h3&gt;
&lt;p&gt;Tailscale的稳定性比ZeroTier要好的多。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Tailscale在网络中，如果对其他节点没有数据交互，会设置为idle状态，在开始数据交换，会先由DERP服务器进行中转，&lt;strong&gt;同时&lt;/strong&gt;开始尝试进行NAT穿透。对于客户端，可以通过&lt;code&gt;tailscale status&lt;/code&gt;命令来查看连接状态。&lt;/li&gt;
&lt;li&gt;ZeroTier在网络中，默认会尝试对所有节点进行连接，并直接进行NAT穿透。ZeroTier的MOON服务器会在连接不稳定的时候，自动进行中转。对于客户端，可以通过&lt;code&gt;zerotier-cli peers&lt;/code&gt;命令来查看连接状态。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::warning&lt;/p&gt;
&lt;p&gt;但是ZeroTier的MOON服务器只提供UDP中继，默认不提供TCP中继！
如果要使用TCP中继，需要自行编译源代码并且配置，非常麻烦。
而UDP中继在国内网络环境下，基本上不可用的，这就导致如果显示为REPLYING的节点，基本上无法连接。&lt;/p&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;这就导致了ZeroTier中，如果双方有任意一方在较差的网络环境下，连接会非常不稳定，甚至无法连接。而Tailscale则不会出现这种情况。&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;穿透NAT(速度)&lt;/h3&gt;
&lt;p&gt;ZeroTier的私有协议在穿透NAT方面做得非常好，Tailscale的WireGuard没有ZeroTier好。&lt;/p&gt;
&lt;h3&gt;安全性&lt;/h3&gt;
&lt;p&gt;都差不多，对普通人没啥区别。&lt;/p&gt;
</content:encoded></item><item><title>仿 TrymenT 游戏风格的Hexo时钟组件</title><link>https://tski.uk/blog/background-tryment-clock/</link><guid isPermaLink="true">https://tski.uk/blog/background-tryment-clock/</guid><description>一个模仿游戏 TrymenT 中时钟界面的 Web 时钟实现，带有独特双环设计</description><pubDate>Mon, 10 Mar 2025 22:24:58 GMT</pubDate><content:encoded>&lt;p&gt;:::tip&lt;/p&gt;
&lt;p&gt;本文由 Fluid 用户授权转载，版权归原作者所有。&lt;/p&gt;
&lt;p&gt;本文作者：Tokisaki_Galaxy
原文地址：&lt;a href=&quot;https://tski.uk/background-tryment-clock&quot;&gt;https://tski.uk/background-tryment-clock&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;p&gt;:::warning&lt;/p&gt;
&lt;p&gt;该项目特别针对Hexo-Fluid主题进行了优化，其他主题可能需要手动修改主题代码以获得最佳体验。
Hexo-Theme-Fluid项目地址：&lt;a href=&quot;https://github.com/fluid-dev/hexo-theme-fluid&quot;&gt;https://github.com/fluid-dev/hexo-theme-fluid&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;:::&lt;/p&gt;
&lt;h2&gt;效果预览&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/Tokisaki-Galaxy/TrymenT-ClocK/&quot;&gt;Github上的项目&lt;/a&gt;
&lt;a href=&quot;https://tski.uk/&quot;&gt;在Hexo的在线预览&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;时钟效果展现了游戏中那种略带神秘感的界面设计，转动的双环加上特殊符号标记，营造出一种独特的视觉体验。无论是作为博客装饰还是个人页面点缀，都能增添不少科幻氛围。&lt;/p&gt;
&lt;h2&gt;介绍&lt;/h2&gt;
&lt;p&gt;一个仿 &lt;code&gt;TrymenT ―今を変えたいと願うあなたへ―&lt;/code&gt; 游戏中时钟界面设计的 Web 时钟实现。提供了一个特殊视觉风格的数字时钟。 很喜欢这个游戏，RASK公司什么时候出OmegaA啊？说好分割商法，也别烂尾啊！ 以最左边的指针为指示，指针不动，取而代之的是内外盘不停地动。内盘代表小时，外盘代表分钟。&lt;/p&gt;
&lt;h2&gt;特性&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;独特的双环时钟设计&lt;/li&gt;
&lt;li&gt;特殊的字体和符号标记&lt;/li&gt;
&lt;li&gt;自定义日期显示格式&lt;/li&gt;
&lt;li&gt;响应式设计，自适应不同屏幕尺寸&lt;/li&gt;
&lt;li&gt;半透明背景图片效果&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;使用方法&lt;/h2&gt;
&lt;h3&gt;需要的文件&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://cdn.jsdelivr.net/gh/Tokisaki-Galaxy/TrymenT-ClocK/TrymenT-ClocK.min.css&quot;&gt;TrymenT-ClocK.min.css&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cdn.jsdelivr.net/gh/Tokisaki-Galaxy/TrymenT-ClocK/TrymenT-ClocK.min.js&quot;&gt;TrymenT-ClocK.min.js&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cdn.jsdelivr.net/gh/Tokisaki-Galaxy/TrymenT-ClocK/img.png&quot;&gt;TrymenT-ClocK-PNG&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;在Hexo中使用&lt;/h3&gt;
&lt;h4&gt;（推荐！）Hexo注入&lt;/h4&gt;
&lt;p&gt;&lt;a href=&quot;https://hexo.fluid-dev.com/posts/hexo-injector/&quot;&gt;Hexo注入器&lt;/a&gt;是一项Hexo5之后提出的功能.
编写注入代码，需要在博客的根目录下创建 scripts 文件夹，然后在里面任意命名创建一个 js 文件即可。&lt;/p&gt;
&lt;p&gt;例如创建一个 /blog/scripts/Tryment-Clock.js，内容为&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;hexo.extend.injector.register(&apos;body_begin&apos;, &apos;&amp;lt;link rel=&quot;stylesheet&quot; href=&quot;https://cdn.jsdelivr.net/gh/Tokisaki-Galaxy/TrymenT-ClocK/TrymenT-ClocK.min.css&quot;&amp;gt;&amp;lt;script type=&quot;text/javascript&quot; src=&quot;https://cdn.jsdelivr.net/gh/Tokisaki-Galaxy/TrymenT-ClocK/TrymenT-ClocK.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;&apos;, &apos;default&apos;);
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;（比较麻烦）修改主题代码&lt;/h4&gt;
&lt;p&gt;把下面的代码放到主题的 &lt;code&gt;layout/layout.ejs&lt;/code&gt; 文件中，然后把相应的文件复制到css，js，img文件夹里面。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;% if (theme.background_trymentclock.enable) { %&amp;gt;
  &amp;lt;!--下面两行是核心内容--&amp;gt;
  &amp;lt;%- css_ex(theme.static_prefix.internal_css, &apos;TrymenT-ClocK.min.css&apos;) %&amp;gt;
  &amp;lt;%- js_ex(theme.static_prefix.internal_js, &apos;TrymenT-ClocK.min.js&apos;) %&amp;gt;
  &amp;lt;% } %&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;# 背景的TrymenT时钟特效，如果需要切换背景图片请在主题目录下替换 /source/img/img.png
# See: https://github.com/Tokisaki-Galaxy/TrymenT-ClocK
background_trymentclock:
  enable: false
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;作为独立页面使用&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;en&quot;&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&amp;gt;
    &amp;lt;title&amp;gt;TrymenT ClocK&amp;lt;/title&amp;gt;
    &amp;lt;link rel=&quot;stylesheet&quot; href=&quot;https://cdn.jsdelivr.net/gh/Tokisaki-Galaxy/TrymenT-ClocK/TrymenT-ClocK.min.css&quot;&amp;gt;
    &amp;lt;script type=&quot;text/javascript&quot; src=&quot;https://cdn.jsdelivr.net/gh/Tokisaki-Galaxy/TrymenT-ClocK/TrymenT-ClocK.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;注意事项&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;时钟效果可能会占用一定的系统资源，在低配置设备上可能会有轻微卡顿&lt;/li&gt;
&lt;li&gt;背景图片默认为半透明效果，可能会与某些深色主题产生冲突&lt;/li&gt;
&lt;li&gt;在移动设备上浏览时，时钟会自动调整大小以适应屏幕&lt;/li&gt;
&lt;li&gt;如需更换背景图片，图片尺寸建议保持在1920×1080以上&lt;/li&gt;
&lt;li&gt;不建议在页面中添加多个时钟实例，可能会导致性能问题&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>通过wheel文件解决rpy2安装权限问题</title><link>https://tski.uk/blog/rpy2-install-via-wheel/</link><guid isPermaLink="true">https://tski.uk/blog/rpy2-install-via-wheel/</guid><description>解决Windows环境下pip安装rpy2时出现的权限错误问题</description><pubDate>Thu, 27 Feb 2025 23:01:48 GMT</pubDate><content:encoded>&lt;h2&gt;问题背景&lt;/h2&gt;
&lt;p&gt;最近在尝试Python与R语言交互时，需要安装rpy2这个包。按照常规方式使用pip安装时，却不断遇到各种各样的错误：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;        File &quot;Z:\ProgramData\miniconda3\Lib\subprocess.py&quot;, line 1538, in _execute_child
          hp, ht, pid, tid = _winapi.CreateProcess(executable, args,
                             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      PermissionError: [WinError 5] Access is denied
      [end of output]

  note: This error originates from a subprocess, and is likely not a problem with pip.
error: subprocess-exited-with-error

× Getting requirements to build wheel did not run successfully.
│ exit code: 1
╰─&amp;gt; See above for output.

note: This error originates from a subprocess, and is likely not a problem with pip.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;还有其他各种各样的问题，在重新设置 &lt;code&gt;R_HOME&lt;/code&gt; (https://www.cnblogs.com/Xeonilian/p/windows_rpy2_install.html) 、安装 &lt;code&gt;R_Tools&lt;/code&gt; (https://blog.csdn.net/BioFlorist/article/details/121665959) 、安装 MinGW 等等方法都无法解决。
这个问题困扰了我整整两天，尝试了各种方法都未能解决。
甚至到了我一度以为是rpy2不支持windows（在rpy2的官网上，他说对windows的支持不由官方提供，而是由社区提供），但是我同学却轻轻松松安装成功了。&lt;/p&gt;
&lt;h2&gt;解决方案&lt;/h2&gt;
&lt;p&gt;在多次尝试失败后，网上别人推荐使用conda安装的方法，但是那种虽然能安装，但是却使用的是conda安装的R环境，而不是我本地的R环境。有大量的R包需要重装。
在找了许久之后，我发现可以通过预编译的wheel文件来绕过编译问题。
但是，网上很多教程用的是&lt;a href=&quot;https://www.cnblogs.com/cloudtj/articles/6372197.html&quot;&gt;托管在www.lfd.uci.edu的wheel包&lt;/a&gt;，但是维护托管网站的教授因为服务器费用问题，已经关闭不再提供对rpy2的托管。
不过后来经过寻找，我在&lt;a href=&quot;https://www.piwheels.org/project/rpy2/&quot;&gt;piwheels&lt;/a&gt;网站上找到了预编译好的rpy2 wheel文件。
虽然没有很多版本的wheel文件，最新的稳定版3.5.17也没有，只有3.6.0.dev2 pre-release，但是怎么说都比没有强很多了。&lt;/p&gt;
&lt;p&gt;另外，&lt;a href=&quot;https://rpy2.github.io/doc/v3.5.x/html/overview.html#background&quot;&gt;官网上也有些R和rpy2的兼容性情况&lt;/a&gt;。&lt;/p&gt;
&lt;h2&gt;安装步骤&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;访问&lt;a href=&quot;https://www.piwheels.org/project/rpy2/&quot;&gt;piwheels&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;根据你的python版本，找到对应的wheel文件&lt;/li&gt;
&lt;li&gt;下载wheel文件到本地&lt;/li&gt;
&lt;li&gt;打开命令行，使用以下命令安装：&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;pip install 你下载的wheel文件路径
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;安装要点&lt;/h2&gt;
&lt;p&gt;安装前请确保系统中已经正确配置了R语言环境，rpy2需要调用R的库文件。&lt;/p&gt;
&lt;h2&gt;总结&lt;/h2&gt;
&lt;p&gt;当pip编译rpy2出现错误时，可以去www.piwheels.org试试看，能不能搜到预编译的wheel文件。
虽然这个过程有点曲折，但希望我的经历能帮助到遇到类似问题的你，少走一些弯路。&lt;/p&gt;
</content:encoded></item><item><title>使用ZeroTier搭建游戏局域网环境</title><link>https://tski.uk/blog/zerotier-game-setting/</link><guid isPermaLink="true">https://tski.uk/blog/zerotier-game-setting/</guid><description>优化用于游戏的ZeroTier，解决常见的连接问题</description><pubDate>Tue, 04 Feb 2025 17:32:19 GMT</pubDate><content:encoded>&lt;h2&gt;前言&lt;/h2&gt;
&lt;p&gt;ZeroTier是一个非常好用的软件定义局域网SDN，但在用来玩局域网游戏时可能会遇到一些问题，比如无法发现其他玩家或连接延迟高。&lt;/p&gt;
&lt;h2&gt;服务器端配置&lt;/h2&gt;
&lt;h3&gt;1. 启用网络广播&lt;/h3&gt;
&lt;p&gt;要让游戏能够自动发现其他玩家，需要在ZeroTier网络设置中启用广播和组播：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;登录管理面板（或者是ztncui）&lt;/li&gt;
&lt;li&gt;添加新路由&lt;/li&gt;
&lt;li&gt;添加以下两条路由规则：
&lt;ul&gt;
&lt;li&gt;目标: &lt;code&gt;255.255.255.255/32&lt;/code&gt;，via: &lt;code&gt;0.0.0.0&lt;/code&gt;（启用广播）&lt;/li&gt;
&lt;li&gt;目标: &lt;code&gt;224.0.0.0/4&lt;/code&gt;，via: &lt;code&gt;0.0.0.0&lt;/code&gt;（启用组播）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;注意：虽然广播会降低网络效率，但对于游戏发现功能来说是必需的。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;2. 优化MTU设置&lt;/h3&gt;
&lt;p&gt;大多数家用网络的MTU为1500（PPPoE环境下为1492），需要调整ZeroTier的MTU以避免数据包分片：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 进入ZeroTier配置目录
sudo su
cd /var/lib/zerotier-one/controller.d/network
# 修改目录下所有json网络配置文件中的MTU值
# 使用文本编辑器打开.json文件，将&quot;mtu&quot;:2800改为&quot;mtu&quot;:1492
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;客户端配置&lt;/h2&gt;
&lt;h3&gt;1.安装WindowsIPBroadcast&lt;/h3&gt;
&lt;p&gt;某些游戏（文明6）只在第一个网络适配器上面广播，需要第三方软件广播到全部适配器上，WindowsIPBroadcast可以解决这个问题：
&lt;a href=&quot;https://github.com/dechamps/WinIPBroadcast&quot;&gt;GitHub仓库&lt;/a&gt;下载最新版本&lt;/p&gt;
&lt;h3&gt;&lt;s&gt;2.加钱上moon服务器&lt;/s&gt;&lt;/h3&gt;
</content:encoded></item><item><title>在 OpenWRT 上使用 acme.sh 配置 SSL 证书</title><link>https://tski.uk/blog/openwrt-acmesh/</link><guid isPermaLink="true">https://tski.uk/blog/openwrt-acmesh/</guid><description>如何在 OpenWRT 系统上使用 acme.sh 申请和管理 SSL 证书</description><pubDate>Mon, 03 Feb 2025 15:49:47 GMT</pubDate><content:encoded>&lt;h2&gt;前言&lt;/h2&gt;
&lt;p&gt;OpenWRT 自带的 luci-app-acme 非常难用，而且找不到官方文档（luci很多插件都这样一坨,比如tinyproxy也是年久失修。。）所以我选择官方原版acmesh。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/acmesh-official/acme.sh&quot;&gt;如有需要可以参照官方README&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;安装 acme.sh&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;wget -O -  https://get.acme.sh | sh -s email=my@example.com
cd ~/.acme.sh
./acme.sh --upgrade --auto-upgrade
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;配置 DNS API 密钥&lt;/h2&gt;
&lt;p&gt;编辑 &lt;code&gt;~/.acme.sh/account.conf&lt;/code&gt; 文件，添加以下内容：&lt;/p&gt;
&lt;p&gt;由于我使用的是cloudflare的dns，如果你是其他的，请&lt;a href=&quot;https://github.com/acmesh-official/acme.sh/wiki/dnsapi&quot;&gt;参照官方&lt;/a&gt;。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;export CF_Zone_ID=&quot;aaaaaaaaaaa&quot;
export CF_Token=&quot;aaaaaaaa&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;申请证书&lt;/h2&gt;
&lt;p&gt;使用以下命令通过 Cloudflare 的 DNS 验证方式申请证书：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;./acme.sh --issue --dns dns_cf -d admin.tski.uk -d &apos;*.example.com&apos; # dns方式可以申请通配符证书
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;查看证书列表&lt;/h2&gt;
&lt;p&gt;可以使用以下命令查看已申请的证书：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;./acme.sh --list
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;安装证书&lt;/h2&gt;
&lt;p&gt;将申请到的证书安装到指定位置，并重启 uhttpd 服务：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;./acme.sh --install-cert -d admin.tski.uk \
--key-file /etc/uhttpd.key \
--fullchain-file /etc/uhttpd.crt \
--reloadcmd &apos;/etc/init.d/uhttpd restart&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;验证安装是否有效&lt;/h2&gt;
&lt;p&gt;使用以下命令强制续期证书：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;./acme.sh --renew -d admin.tski.uk --force
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果安装成功，输出如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;.......
[Mon Feb  3 16:14:16 CST 2025] Your cert is in: /root/.acme.sh/admin.tski.uk_ecc/admin.tski.uk.cer
[Mon Feb  3 16:14:16 CST 2025] Your cert key is in: /root/.acme.sh/admin.tski.uk_ecc/admin.tski.uk.key
[Mon Feb  3 16:14:16 CST 2025] The intermediate CA cert is in: /root/.acme.sh/admin.tski.uk_ecc/ca.cer
[Mon Feb  3 16:14:16 CST 2025] And the full-chain cert is in: /root/.acme.sh/admin.tski.uk_ecc/fullchain.cer
[Mon Feb  3 16:14:17 CST 2025] Installing key to: /etc/uhttpd.key
[Mon Feb  3 16:14:17 CST 2025] Installing full chain to: /etc/uhttpd.crt
[Mon Feb  3 16:14:17 CST 2025] Running reload cmd: /etc/init.d/uhttpd restart
[Mon Feb  3 16:14:17 CST 2025] Reload successful
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>review-relief</title><link>https://tski.uk/blog/review-relief/</link><guid isPermaLink="true">https://tski.uk/blog/review-relief/</guid><description>ReLief 一些想法</description><pubDate>Fri, 24 Jan 2025 23:00:01 GMT</pubDate><content:encoded>&lt;h2&gt;包含大量剧透&lt;/h2&gt;
&lt;h2&gt;ruka&lt;/h2&gt;
&lt;h2&gt;momo&lt;/h2&gt;
&lt;h2&gt;日向子（最喜欢的）&lt;/h2&gt;
</content:encoded></item><item><title>RTL9210(A/B)固件配置</title><link>https://tski.uk/blog/rtl9210-firmware/</link><guid isPermaLink="true">https://tski.uk/blog/rtl9210-firmware/</guid><description>RTL9210(A/B)固件配置</description><pubDate>Fri, 20 Dec 2024 12:11:55 GMT</pubDate><content:encoded>&lt;h2&gt;RTL9210固件配置&lt;/h2&gt;
&lt;p&gt;RTL9210 分为A版和B版。A版支持NVMe，B版同时支持SATA和NVMe。
&lt;a href=&quot;https://www.station-drivers.com/index.php/en/component/remository/search/submit_search,yes/search_filetitle,1/search_filedesc,1/search_text,rtl9210b/page,2/lang,en-gb/?Itemid=0&quot;&gt;RTL9210(A/B)公版&lt;/a&gt;
&lt;a href=&quot;https://github.com/bensuperpc/rtl9210-firmware&quot;&gt;RTL9210A/B参数解释&lt;/a&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;名称&lt;/th&gt;
&lt;th&gt;内容&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;MANUFACTURE&lt;/td&gt;
&lt;td&gt;生产商&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SCSI_VENDOR&lt;/td&gt;
&lt;td&gt;SCSI 中显示的生产商名称&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PRODUCT&lt;/td&gt;
&lt;td&gt;产品型号&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SCSI_PRODUCT&lt;/td&gt;
&lt;td&gt;SCSI 中显示的产品型号&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SERIAL&lt;/td&gt;
&lt;td&gt;产品序列号&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;EN_UPS&lt;/td&gt;
&lt;td&gt;建议关闭，设为1会每次插拔增加不安全关机数&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DIS_SHOW_EMPTY_DISK&lt;/td&gt;
&lt;td&gt;插硬盘是否显示空硬盘&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ASPMDIS&lt;/td&gt;
&lt;td&gt;是否禁用活动电源管理 值为16进制1和0。(开启:0x1 关闭:0x0)  开启后桥接会始终保持高功率，会很烫，但是好像速度没影响。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DISK_IPS_THRES&lt;/td&gt;
&lt;td&gt;指定硬盘多久休眠（分钟）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;EN_U1U2&lt;/td&gt;
&lt;td&gt;开启U1U2功率管理模式&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;U2_MAXPWR&lt;/td&gt;
&lt;td&gt;U2模式最大功率&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;U3_MAXPWR&lt;/td&gt;
&lt;td&gt;U3模式最大功率&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;下列各个设置请&lt;/td&gt;
&lt;td&gt;根据自己的硬盘盒厂商设定&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LED&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SUSPEND_LED_OFF&lt;/td&gt;
&lt;td&gt;弹出后关灯&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SUSPEND_DISK_OFF&lt;/td&gt;
&lt;td&gt;弹出后单色灯灭灯，双色的话显示蓝色&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;UART_DBG_PIN&lt;/td&gt;
&lt;td&gt;UART串口 DEBUG PIN码&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PD&lt;/td&gt;
&lt;td&gt;【待确认】开启PD供电模式？详细作用不明，但是WTG一定要关闭，否则可能导致加电速度慢，引导时找不到硬盘。&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;另外别人记录的坑&lt;/h2&gt;
&lt;p&gt;默认配置里有一行SCSI_WP_PIN = 0xc，这行如果不删会出现向硬盘里写文件时提示硬盘有写保护，同时LED也不亮。&lt;a href=&quot;https://www.bilibili.com/opus/841596810157883397&quot;&gt;来源&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;MD202原厂设置&lt;/h2&gt;
&lt;p&gt;如需使用自行把&lt;code&gt;:&lt;/code&gt;换成&lt;code&gt;=&lt;/code&gt;。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;U2PHY : 02 f4 9b e0 e1 
U3PHY : 02 d4 09 00 d5 00 80 
VID : 0x0bda
PID : 0x9210
MANUFACTURE : &quot;HIKSEMI&quot;
PRODUCT : &quot;MD202&quot;
SERIAL : &quot;012345678935&quot;
SCSI_PRODUCT : &quot;MD202&quot; ;这里出现未知字符，可能是厂商防伪用
SCSI_VENDOR : &quot;HIKSEMI&quot; ;这里出现未知字符，可能是厂商防伪用
USB_SELF_PWR : n/a
DISK_HOTPLUG : 0x00
LED : 0x02
PINMUX1 : 0x00000000
PINMUX2 : 0x00000070
U2_MAXPWR : 0xfa
U3_MAXPWR : 0x70
ASPMDIS : 0x00
PCIE_REFCLK : n/a
DISK_IPS_THRES : 0x0a
SWR_1_2V : n/a
EN_UPS : n/a
PD : n/a
CUSTOMIZED_LED : n/a
SUSPEND_LED_OFF : 0x03
FORCE_USB_SPEED : n/a
FORCE_PCIE_SPEED : n/a
EN_U1U2 : n/a
FORCE_USB_QUIRK : n/a
FORCE_PCIE_QUIRK : n/a
FAN : n/a
DIS_SHOW_EMPTY_DISK : n/a
FORCE_SATA_NORMAL_DMA : n/a
UART_DBG_PIN : 0x05
FINGER_PRINT_EN : n/a
RM_INTERNAL_RD : n/a
HS_AUTO_SWITCH : n/a
UART_BAUD_RATE : n/a
CUSTOMIZED_DISK_IDENTIFY : n/a
HW_LED_CFG : n/a
CDROM_CFG : n/a
SUPPORT_HID : n/a
LATE_INIT_DISK : n/a
SCSI_WP_PIN : n/a
SD_MMC_TYPE : n/a
FORCE_PORT_TYPE : n/a
BCDDEVICE : n/a
SUSPEND_DISK_OFF : n/a
SCSI_WB_PIN : n/a
CUSTOMIZED_FEATURE : n/a
PERIPH_API : n/a
RAID_CFG : n/a

Boot Mode : Flash
FW Ver : 1.27.24
FW Build Date : 2021.09.07
IC Pkg Type : PCIE/SATA
UUID : n/a

Disconn_ForceUSB2 : false
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;自用MD202&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;VID = 0xbda
PID = 0x9210
MANUFACTURE = &quot;HIKSEMI&quot;
SCSI_VENDOR = &quot;HIKSEMI&quot;
PRODUCT = &quot;MD202&quot;
SCSI_PRODUCT = &quot;MD202&quot;
SERIAL = &quot;012345678938&quot;
LED = 0x2
DIS_SHOW_EMPTY_DISK = 0x1
DISK_IPS_THRES = 0

PINMUX1 = 0x0
PINMUX2 = 0x70
U2_MAXPWR = 0xfa
U3_MAXPWR = 0x70
SUSPEND_LED_OFF = 0x1
SUSPEND_DISK_OFF = 0x7
UART_DBG_PIN = 0x5

EN_UPS = 0x0
EN_U1U2 = 0x1
ASPMDIS = 0x0
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>review-weathering-with-you</title><link>https://tski.uk/blog/review-weathering-with-you/</link><guid isPermaLink="true">https://tski.uk/blog/review-weathering-with-you/</guid><description>你的名字个人想法</description><pubDate>Fri, 26 Jul 2024 21:34:22 GMT</pubDate><content:encoded>&lt;h2&gt;长大是为了什么&lt;/h2&gt;
&lt;h2&gt;我们一直在寻找的东西，为什么长大了之后却没有勇气去面对&lt;/h2&gt;
&lt;h2&gt;我为什么一直追求刀&lt;/h2&gt;
&lt;p&gt;从那件事情开始，我从内心里面一直不知道自己是否有能力去爱别人，追求刀，只不过在追求自己因为看别人的爱情中碰到的困难影射到自己身上，或是看到别人在无法相遇爱情中留下的泪水来借此洒下自己的泪水，来以此确认自己还有爱别人的能力。&lt;/p&gt;
&lt;p&gt;长大了之后，我真的还有不惜世界，在别人看来自私的去爱别人的能力吗？
在b站突然看到一个评论，施耐庵在几千年前写下《西游记》的时候都知道牺牲童男童女来换来几十年的太平是不可行的，为什么我们还在电影播出之后讨论是否牺牲阳菜？献祭其他人来换来太平本质上是赞同和接受强大的力量对弱小的力量的肆意切割与施暴。我们人类从树上的猴子历经几千万年进化演变成为现在的人类，难道仅仅是不断献祭他人，换来自己的太平吗？我们人类的进化是为了什么？人类的赞歌是勇气的赞歌，是爱的赞歌。而不是通过不断献祭他人来换来自己的太平。&lt;/p&gt;
</content:encoded></item><item><title>《你的名字。》的一些想法</title><link>https://tski.uk/blog/review-your-name/</link><guid isPermaLink="true">https://tski.uk/blog/review-your-name/</guid><description>新海诚《你的名字。》影评</description><pubDate>Fri, 26 Jul 2024 10:26:10 GMT</pubDate><content:encoded>&lt;h2&gt;两个相爱的人终会相遇&lt;/h2&gt;
&lt;p&gt;这部影片是新海诚成名之作，在近两个小时的时间，为我们绘制一幅纯真的爱情与努力拯救对方的故事。以穿越时间的灵魂互换为契机，以拯救对方以及糸守镇为目标，两个年轻人在不断的交换中，逐渐了解对方，在黄昏之时相遇。
三叶等了八年，在樱花飘落的那一天，终于等到了他。而他，也在那一天，终于发现的自己的内心，找到了她。&lt;/p&gt;
&lt;h2&gt;爱能做到的有哪些&lt;/h2&gt;
&lt;h3&gt;远在乡下的三叶，跨越半个国家去东京&lt;/h3&gt;
&lt;p&gt;在陨石坠落前一天，三叶不放心泷和奥寺的约会，逃课去东京找三年前的泷。地铁上相遇时，在泷看来是个陌生而奇怪的女生，三叶却以为自己不被认可，把纽糸时间的头绳交给了泷，埋下了一颗种子。&lt;/p&gt;
&lt;h3&gt;泷为了拯救三叶，穿越时间&lt;/h3&gt;
&lt;p&gt;虽然梦醒了忘记，泷只能记得三叶的名字或是糸守的地名，但是他也选择了跨越漫长的距离，找到了那个时空的三叶，拯救了她。两人的双向奔赴，虽然有三年的时间差，但是依然构成了一幅美丽的画面。&lt;/p&gt;
&lt;h3&gt;三叶在奔跑中跌倒，看到了“喜欢你”&lt;/h3&gt;
&lt;p&gt;泷在经历了自己手机上的My diary里面变成一堆乱码，发现似乎名字与事件不能同时留下，选择在三叶的手上写下“喜欢你”，而三叶在奔跑中跌倒，看到了这句话。这句话，是泷对三叶的爱。而三叶在见到之后，知道自己不是孤单一人，有泷和她一起努力拯救镇子，泷也在努力拯救他。三叶更加努力的奔跑，与镇长父亲协商转移居民，去完成泷未完成的事情，去拯救整个镇子。&lt;/p&gt;
&lt;h3&gt;【隐藏线】二叶和镇长&lt;/h3&gt;
&lt;p&gt;泷in三叶和一叶的对话中提到，宫水家族的人在青春期总会进行这样的“梦”。而在外传中提到，镇长是其他地方的望族，入赘糸守镇。并且由于他们青春期也经历过泷和三叶这样的互换，虽然梦醒来遗忘了，但是潜意识里面让二叶一见面就和他产生好感，最后结婚。
最终成为镇长，在彗星坠落的时候顺利的以避难演习为名，转移全镇人员，完成了最终的拯救。
如果缺失了二叶和镇长的努力，三叶和泷的努力恐怕没有这样的结果，糸守镇也不会得以幸存。
就此，神明1200年的守护与宫水家族的任务，终于结束。&lt;/p&gt;
&lt;h2&gt;彗星的意义&lt;/h2&gt;
&lt;p&gt;糸守镇诞生于1200年前的彗星陨落，也毁灭于彗星的再次陨落。&lt;/p&gt;
&lt;h2&gt;我们是否也在遗忘？该怎么做？&lt;/h2&gt;
&lt;p&gt;遗忘贯穿了整部影片，不止影片，生活中我们也在不断遗忘着，遗忘着自己的初心，遗忘着自己的梦想，遗忘着自己的爱。而在遗忘之后，我们又该如何做呢？泷和三叶反抗着遗忘，去追寻对方，我们是不是也是经历过邂逅，然后遗忘，然后再次邂逅呢？泷和三叶的两次擦肩而过，在第二次泷终于选择直面三叶，三叶也终于发现了自己所追寻的人。&lt;/p&gt;
&lt;h2&gt;这是一个关于爱情的故事&lt;/h2&gt;
&lt;p&gt;每个人在成长中经历的故事不一样，而每个人是否相信对新海诚影片中主题的爱也不一样。新海诚描绘了他心中的爱情，我认为也是极为纯粹的爱情，两个人在不断交换中拯救对方，了解对方。而你是否愿意相信这样的爱呢？现在我们所接触到的爱情，不可否认的有很多基于利益，基于物质，昂或只是基于诞生下一代。而这样的爱情，是否也是我们所追求的呢？
如果你在内心中接受这样的故事，愿意相信这样的爱情，那么这部影片对你来说，是一部值得一看的影片。&lt;/p&gt;
</content:encoded></item><item><title>cloudflare出现了CurvePreferences-includes-unsupported-curve错误</title><link>https://tski.uk/blog/openwrt-cloudflared-curvepreferences-includes-unsupported-curve/</link><guid isPermaLink="true">https://tski.uk/blog/openwrt-cloudflared-curvepreferences-includes-unsupported-curve/</guid><description>Openwrt上面的cloudflare在新版时出现了CurvePreferences-includes-unsupported-curve错误</description><pubDate>Sat, 18 May 2024 16:10:40 GMT</pubDate><content:encoded>&lt;h2&gt;问题&lt;/h2&gt;
&lt;p&gt;在Openwrt的cloudflared中，当你使用新版本时（2024年3月或者4月开始），可能会出现&lt;code&gt;CurvePreferences includes unsupported curve&lt;/code&gt;错误，这是因为新版本的cloudflared使用了新的加密算法，而这个要求Go构建工具链的更新。
而Openwrt上的cloudflared并没有更新工具链，所以会出现这个错误。&lt;/p&gt;
&lt;h2&gt;解决方法&lt;/h2&gt;
&lt;p&gt;目前解决方法可以通过使用旧版本的cloudflared（不推荐），或者修改参数让它只使用HTTP2协议，而不是默认的QUIC协议。&lt;/p&gt;
&lt;p&gt;修改运行参数，加上&lt;code&gt;--protocol http2&lt;/code&gt;。如果不加，默认是使用auto，但是那个auto只会使用QUIC协议来链接，无法自动切换到HTTP2，只会报&lt;code&gt;CurvePreferences includes unsupported curve&lt;/code&gt;，然后访问时候提示&lt;code&gt;Argo ERROR&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;提及的Issues
https://github.com/openwrt/packages/issues/23852
https://github.com/cloudflare/cloudflared/issues/1158&lt;/p&gt;
</content:encoded></item><item><title>Git子模块教程：更换Hexo博客主题</title><link>https://tski.uk/blog/git-submodule-blog-change-theme/</link><guid isPermaLink="true">https://tski.uk/blog/git-submodule-blog-change-theme/</guid><description>使用git submodule更换Hexo博客主题</description><pubDate>Mon, 13 May 2024 23:38:44 GMT</pubDate><content:encoded>&lt;h2&gt;0.背景&lt;/h2&gt;
&lt;p&gt;很久之前写的博客使用Hexo搭建&lt;a href=&quot;/blog/make-blog/&quot;&gt;传送门&lt;/a&gt;，不同于其他教程，我主张把存储库整个作为&lt;strong&gt;私有存储库&lt;/strong&gt;放到github上。
优点包括没必要用当时装hexo的电脑写文章，可以用github网页版直接传一个md文件就可以。
而且原版的方式如果想迁移很麻烦，因为是本地编译，每次迁移要下载一堆库。而我这种方式只需要把存储库clone下来就可以了（由Serverless平台来编译成静态文件）。&lt;/p&gt;
&lt;p&gt;而我的这种方式更换主题不同于其他方式，需要作为submodule来处理。
我使用的方法主题是一个从别人那里fork来的独立的存储库，可以很容易的直接在github网页版更新后继版本。
而其他人的deploy方法是直接把主题clone到themes文件夹下，这样就没法直接更新了。&lt;/p&gt;
&lt;p&gt;所以我这里记录一下如何使用git submodule更换主题。&lt;/p&gt;
&lt;h2&gt;1. 找一个主题，然后fork&lt;/h2&gt;
&lt;h2&gt;2.设置submodule&lt;/h2&gt;
&lt;h3&gt;方式一：直接设置&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://zhuanlan.zhihu.com/p/404615843&quot;&gt;知乎submodule教程&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;添加一个远程仓库项目 https://github.com/iphysresearch/GWToolkit.git 子模块到一个已有主仓库项目中。代码形式是 git submodule add &amp;lt;url&amp;gt; &amp;lt;repo_name&amp;gt;， 如下面的例子：&lt;code&gt;git submodule add https://github.com/iphysresearch/GWToolkit.git GWToolkit&lt;/code&gt;
如果你是旧版 Git 的话，你会发现 ./GWToolkit 目录中是空的，你还需要在执行一步「更新子模块」，才可以把远程仓库项目中的内容下载下来。&lt;code&gt;$ git submodule update --init --recursive&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;方式二：手动设置(推荐)&lt;/h3&gt;
&lt;p&gt;在主题文件夹下面clone你fork来的主题存储库。
在主存储库目录（和.git同级的目录）下面创建&lt;code&gt;.gitmodules&lt;/code&gt;文件，写入下面内容&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[submodule &quot;themes/hexo-theme-matery&quot;]
	path = themes/hexo-theme-matery
	url = https://github.com/Tokisaki-Galaxy/hexo-theme-matery.git
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;进入主存储库目录下面的.git文件夹，修改config文件，添加下面内容&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[submodule &quot;themes/hexo-theme-matery&quot;]
	url = https://github.com/Tokisaki-Galaxy/hexo-theme-matery.git
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;最后使用&lt;code&gt;git submodule status&lt;/code&gt;来检查是否正确设置。&lt;/p&gt;
&lt;h3&gt;异常处理&lt;/h3&gt;
&lt;p&gt;一般来讲只要使用手动设置就不会有问题。如果你无法使用方法一，请直接使用方法二手动添加。&lt;/p&gt;
&lt;p&gt;检查步骤：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;检查主存储库目录下面是否存在.gitmodules文件。&lt;/li&gt;
&lt;li&gt;检查主存储库.git目录下面config文件夹是否存在[submodules]标签。&lt;/li&gt;
&lt;li&gt;执行&lt;code&gt;git submodule status&lt;/code&gt;，如果显示为 &lt;code&gt;No submodule mapping found&lt;/code&gt;，表示子模块的仓库没有在本地克隆。我们可以使用 &lt;code&gt;git submodule update --init&lt;/code&gt; 命令来克隆子模块的仓库到本地。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;3.检查设置成submodule&lt;/h2&gt;
&lt;p&gt;把本地的所有更改提交到主存储库，然后push到github。打开Github你的存储库网站，检查是否有主题文件夹图标不同，而且名字后面有@xxxx的版本号。如果不存在请进行手动设置。（一般是缺少.gitmodules文件）
并且点击名字后面有@xxxx的子模块进去检查是否能进入，是否有文件。&lt;/p&gt;
</content:encoded></item><item><title>ZeroTier原理与实践</title><link>https://tski.uk/blog/zerotier-network/</link><guid isPermaLink="true">https://tski.uk/blog/zerotier-network/</guid><description>ZeroTier的网络原理和一点点实践经验</description><pubDate>Wed, 10 Apr 2024 13:27:51 GMT</pubDate><content:encoded>&lt;h2&gt;前言&lt;/h2&gt;
&lt;p&gt;因为网络上这方面的信息很少，我在使用的时候有时摸不着头脑，所以写下来供后人参考。
&lt;a href=&quot;https://docs.zerotier.com/protocol&quot;&gt;ZeroTier协议议定书&lt;/a&gt;，下面简称议定书。截止本文书写日期2024/04/11，现在处于v1版本，v2版本据说会大改，但是已经放卫星放四年了，而且这种网络基础设施应该会保持向下兼容，故信息大体上应该长期有效，细枝末节以当前版本为准。&lt;/p&gt;
&lt;h3&gt;什么是Planet&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;To achieve this VL1 is organized like DNS. At the base of the network is a collection of always-present root servers whose role is similar to that of DNS root name servers. Roots run the same software as regular endpoints but reside at fast stable locations on the network and are designated as such by a world definition. World definitions come in two forms: the planet and one or more moons. The protocol includes a secure mechanism allowing world definitions to be updated in-band if root servers&apos; IP addresses or ZeroTier addresses change.
There is only one planet. Earth&apos;s root servers are operated by ZeroTier, Inc. as a free service. There are currently four root servers distributed across the globe and multiple network providers. Almost everyone in the world has one within less than 100ms network latency from their location.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;em&gt;其实我觉得ZeroTier里面的Planet和流浪地球电影版里面的全球根服务器非常非常相似&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;在ZeroTier世界里面，一切以Planet中心为主，可以理解成DNS里面的根服务器（他们也确实这么称呼，在议定书里面称为RootServers）。所有节点在联网的时候都会去尝试连接Planet来获得其他节点的信息。官方提供的Planet服务器是免费的。
Planet的功能包括，&lt;strong&gt;记录所有联网节点网络信息&lt;/strong&gt;（记住这个），记录节点互联所使用的密钥并提供交换服务，在节点无法互相直连的情况下提供中继。&lt;/p&gt;
&lt;p&gt;ZeroTier公司提供收费服务的&lt;strong&gt;只有网页端的&lt;a href=&quot;https://my.zerotier.com&quot;&gt;Controller&lt;/a&gt;&lt;/strong&gt;。其中的25个设备限制我们只需要自行建立Controller即可绕过，&lt;strong&gt;但是&lt;/strong&gt;自建的Controller没有SSO，Ruler之类的功能。&lt;/p&gt;
&lt;p&gt;zerotier在初次启动的时候会从Planet获得所有所需要的连接信息，首先会尝试通过ID定位Moon（如果设置）信息，并且缓存下来，如果无法连接到Planet会连接到缓存的Moon。&lt;/p&gt;
&lt;h3&gt;什么是Moon&lt;/h3&gt;
&lt;p&gt;Planet和Moon的关系可以理解成Moon是自己建立的Private Root Servers。功能&lt;strong&gt;基本上&lt;/strong&gt;和Planet是完全一致的。
如果你&lt;a href=&quot;https://docs.zerotier.com/roots&quot;&gt;选择自建Moon服务器&lt;/a&gt;，Moon服务器为了保证稳定性，官方建议不再承担其他网络功能（作为LEAF之类的）。所以意味着只要你知道别人的Moon服务器ID，&lt;strong&gt;可以直接加入，不需要对方同意。&lt;/strong&gt;&lt;/p&gt;
&lt;h4&gt;加入Moon方式&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;zerotier-cli orbit &amp;lt;world ID&amp;gt; &amp;lt;seed&amp;gt; - Join a moon via any member root
#一般情况下world ID和seed可以一样
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;链路层结构&lt;/h2&gt;
&lt;p&gt;ZeroTier链路层分为VL1和VL2。
VL1称为点对点网络，只用于连接到基础设施Planet和Moon，以获取网络配置。在大部分情况是零配置，不需要关注。
VL2称为以太网虚拟层，是你自己通过my.zerotier.com或者自行构建Controller建立的网络
Planet/Moon 是 Zerotier VL1 层的设施，主要用来辅助 Peer 之间的连接建立。Controller 是 VL2 层的设施，主要用来保存虚拟网的配置。一个虚拟网中的设备首先要接入 VL1 与 Controller 沟通，最后才能接入 VL2 中的一个虚拟网。&lt;/p&gt;
&lt;h2&gt;节点类型&lt;/h2&gt;
&lt;p&gt;在执行&lt;code&gt;zerotier-cli peers&lt;/code&gt;之后，其中&lt;code&gt;&amp;lt;role&amp;gt;&lt;/code&gt;中可以看到每个节点的类型，这些类型是在VL1层中的角色。其中有LEAF,PLANET,MOON。
LEAF是普通的节点，&lt;strong&gt;一般&lt;/strong&gt;是你的设备连上去之后会直接变成LEAF。&lt;/p&gt;
&lt;h2&gt;Controller&lt;/h2&gt;
&lt;p&gt;Controller位于链路层的VL2中，在VL1中是一个特殊的LEAF。
如果你想加入一个网络，或连接这个网络上的其他节点，你首先需要连接这个网络对应的Controller。
如果无法连接到Controller，表现为一直显示为Request Configure（请求配置中）。&lt;/p&gt;
&lt;p&gt;如果你认真看完上面的文字，你应该明白Controller是不需要有公网IP的，但是要求必须连接稳定。&lt;em&gt;为了这点，我自己是在Moon上面运行Controller，但是官方其实不建议这样做&lt;/em&gt;
&lt;a href=&quot;https://docs.zerotier.com/controller&quot;&gt;ZeroTier官方提供了搭建Controller的方式&lt;/a&gt;，但是官方给出的是命令行的形式，已经有人套了个GUI，名字叫ztncui。&lt;/p&gt;
&lt;h2&gt;ztncui搭建&lt;/h2&gt;
&lt;p&gt;https://key-networks.com/ztncui/
注意最好不要使用ZeroTier网络来访问搭建好的Controller，因为这样如果出问题很容易丢失访问权限。我建议用CloudFlare Tunnel来访问，还可以设置二步验证，增强安全性。
ztncui默认是https协议，没有http协议，其证书是自签的。使用Cloudflare Tunnel来映射到域名访问，需要在Cloudflare里面设置要开启运行任意证书（因为默认Tunnel不认自签证书）才能正常访问。&lt;/p&gt;
&lt;p&gt;下面是一些有用的快速脚本。&lt;/p&gt;
&lt;h2&gt;搭建moon的快速命令&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;cd /var/lib/zerotier-one
sudo su
#zerotier-idtool initmoon identity.public &amp;gt; moon.json
exit

#下面几行可以保存为一个脚本，之后只用改moon.json里面的stablePoint
zerotier-idtool genmoon moon.json
sudo mv 000000??????????.moon moons.d/
sudo systemctl restart zerotier-one
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>openwrt找出占用空间最大的文件</title><link>https://tski.uk/blog/router-openwrt-common-operate/</link><guid isPermaLink="true">https://tski.uk/blog/router-openwrt-common-operate/</guid><description>openwrt找出占用空间最大的文件</description><pubDate>Fri, 09 Feb 2024 14:53:30 GMT</pubDate><content:encoded>&lt;p&gt;OpenWrt的find命令不支持-size +1M这种格式。所以我们如果想找分类出大于1M的文件，可以使用-size +1048576c来代替。
1048576是1MB的字节数，c表示计数的是字节。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;find / -type f -size +1048576c -exec du -h {} \;    # 查找大于1M的文件
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后可以去删除不需要的文件，毕竟硬路由寸金寸土。&lt;/p&gt;
</content:encoded></item><item><title>在OpenWrt上安装cloudflared服务</title><link>https://tski.uk/blog/router-openwrt-cloudflare/</link><guid isPermaLink="true">https://tski.uk/blog/router-openwrt-cloudflare/</guid><description>解决openwrt使用cloudflared service install安装服务无法使用的问题</description><pubDate>Fri, 09 Feb 2024 14:52:30 GMT</pubDate><content:encoded>&lt;p&gt;openwrt使用cloudflared安装服务的时候会有兼容性问题，问题出现在/etc/init.d/目录下的服务脚本，默认使用的是SysVinit，而cloudflared使用的是procd。所以我们需要修改服务脚本，将其改为procd的格式。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;SysVinit&lt;/strong&gt; 是许多早期 Linux 发行版使用的传统初始化系统。它使用一系列的 shell 脚本，按照特定的顺序启动各种服务。这些脚本通常位于 &lt;code&gt;/etc/init.d/&lt;/code&gt; 目录中，每个脚本对应一个服务。SysVinit 的主要缺点是它启动服务的方式是线性的，不能并行启动，这可能导致启动时间较长。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;procd&lt;/strong&gt; 是 OpenWrt 使用的初始化系统。与 SysVinit 不同，procd 可以并行启动服务，从而加快系统启动时间。procd 还提供了一些其他高级功能，如进程监控、自动重启和 cgroup 管理。procd 的服务脚本通常位于 &lt;code&gt;/etc/init.d/&lt;/code&gt; 目录中，与 SysVinit 类似，但它们的格式和语法有所不同。&lt;/p&gt;
&lt;p&gt;修改完&lt;code&gt;/etc/init.d/cloudflared&lt;/code&gt;后，使用&lt;code&gt;/etc/init.d/cloudflared restart&lt;/code&gt;重启服务即可。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#!/bin/sh /etc/rc.common
# Copyright (C) 2021 Tianling Shen &amp;lt;cnsztl@immortalwrt.org&amp;gt;

USE_PROCD=1
START=99

CONF=&quot;cloudflared&quot;
PROG=&quot;/usr/bin/cloudflared&quot;

start_service() {
    procd_open_instance
    procd_set_param command &quot;$PROG&quot; &quot;--pidfile&quot; &quot;/var/run/$CONF.pid&quot; &quot;--logfile&quot; &quot;/var/log/cloudflared.log&quot; &quot;--protocol&quot; &quot;http2&quot; &quot;--no-autoupdate&quot; &quot;tunnel&quot; &quot;run&quot; &quot;--token&quot; &quot;xxxxxxxxxxxxxxxx&quot;
    procd_set_param stdout 1
    procd_set_param stderr 1
    procd_set_param pidfile &quot;/var/run/$CONF.pid&quot;
    procd_close_instance
}

stop_service() {
    procd_kill $CONF
}

reload_service() {
    stop
    start
}

service_triggers() {
    procd_add_reload_trigger &quot;$CONF&quot;
}
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>在pwsh里面使用终端Github Copilot</title><link>https://tski.uk/blog/github-copilot/</link><guid isPermaLink="true">https://tski.uk/blog/github-copilot/</guid><pubDate>Wed, 20 Dec 2023 18:32:32 GMT</pubDate><content:encoded>&lt;p&gt;如果在终端里面也可以使用github copilot将会方便很多，很多命令不用刻意去记忆，也不用去网上找很久。
&amp;lt;!-- more --&amp;gt;
先去下载&lt;a href=&quot;https://cli.github.com/&quot;&gt;Github-CLI&lt;/a&gt;。
然后用&lt;code&gt;gh auth login&lt;/code&gt;登陆，默认是不安装copilot的，要手动安装插件&lt;code&gt;gh extension install github/gh-copilot&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;测试一下&lt;code&gt;gh copilot&lt;/code&gt;是不是正常使用。&lt;/p&gt;
&lt;p&gt;然后设置别名，方便使用。
通过读取配置文件&lt;code&gt;echo $PROFILE&lt;/code&gt;的路径，然后修改&lt;code&gt;notepad $PROFILE&lt;/code&gt;。
加入以下内容。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;function Github-Copilot-Explain { gh copilot explain $args }
function Github-Copilot-Suggest { gh copilot suggest $args }

Set-Alias -Name cs -Value Github-Copilot-Suggest
Set-Alias -Name ce -Value Github-Copilot-Explain
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>解决REFS卷变成RAW的经历</title><link>https://tski.uk/blog/refs-salvage-experience/</link><guid isPermaLink="true">https://tski.uk/blog/refs-salvage-experience/</guid><description>之前把分区格式化成REFS，结果系统更新之后变成RAW分区，最后用微软自带的refsutil工具把数据捞出来了。</description><pubDate>Mon, 16 Oct 2023 15:58:21 GMT</pubDate><content:encoded>&lt;h2&gt;起因&lt;/h2&gt;
&lt;p&gt;之前听闻REFS文件系统对NVME和SMR HDD有特别的优化，而且数据安全更好，是未来代替NTFS的文件系统。
所以一年前的时候把两个分区格式化成REFS来试试水。确实效果不错，&lt;strong&gt;除了OneDrive没法在REFS分区上用以外。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;前几天突然内置的SMR HDD在系统更新之后变成了RAW分区。一开始是尝试在文件浏览器里面打开，显示参数错误。后来磁盘管理里显示RAW分区。
一开始以为是系统更新的问题，但是发现另一个REFS分区可以打开，突发奇想去事件管理器里一看，发现原来分区挂了。
&lt;img src=&quot;https://pic.imgdb.cn/item/652d57f2c458853aef660f9d.png&quot; alt=&quot;无法打开&quot; /&gt;&lt;/p&gt;
&lt;p&gt;然后接着发现电脑很卡，在任务管理器里面看到那个已经挂的磁盘占用率持续90%+的读写，很好奇在干嘛，然后发现事件管理器里面提示这个。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.imgdb.cn/item/652d57f1c458853aef660d88.png&quot; alt=&quot;自动修复不成功&quot; /&gt;
&lt;img src=&quot;https://pic.imgdb.cn/item/652d5e21c458853aef7691e4.png&quot; alt=&quot;无法纠正&quot; /&gt;&lt;/p&gt;
&lt;p&gt;那就只能去整数据恢复了。一开始我打算用R-Studio。
但是发现虽然REFS分区现在可以用R-Studio，但是REFS文件系统在快速迭代，那个软件更新速度赶不上微软的更新速度。所以我用那个软件恢复出来的文件是没有文件目录结构的。最后还是用微软自己家的数据恢复工具refsutil。&lt;/p&gt;
&lt;h2&gt;REFS数据打捞工具refsutil&lt;/h2&gt;
&lt;h3&gt;什么是refsutil&lt;/h3&gt;
&lt;p&gt;用于诊断严重损坏的 ReFS 卷（变成RAW）、识别剩余文件，并将这些文件复制到另一个卷。
该工具位于 %SystemRoot%\Windows\System32 文件夹中。
&lt;strong&gt;除非卷为 RAW，否则不必使用 ReFSutil 工具。 如果为只读，则仍可访问数据。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://learn.microsoft.com/zh-cn/windows-server/administration/windows-commands/refsutil&quot;&gt;Microsoft对refsutil的介绍&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;怎么用&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;ReFS Salvage 有两个阶段：扫描阶段和复制阶段。 在自动模式下，扫描阶段和复制阶段将按顺序运行。 在手动模式下，每个阶段都可以单独运行。 进度和日志保存在工作目录中，以允许单独运行阶段以及暂停和恢复扫描阶段。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;1.确定为什么不能挂载
2.快速扫描阶段
3.完全扫描阶段
4.查看交互式控制台(因为可以看看哪些不需要的，然后在txt文件里删掉)
5.使用列表的复制阶段，把选择的文件复制出来&lt;/p&gt;
&lt;p&gt;确定目标卷是否为refs卷，并确定该卷是否可装载。 如果卷不可装载，则会提供原因。
&lt;img src=&quot;https://pic.imgdb.cn/item/652d57fbc458853aef6629f8.png&quot; alt=&quot;诊断扫描&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.imgdb.cn/item/652d57f2c458853aef6610b8.png&quot; alt=&quot;快速扫描阶段&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.imgdb.cn/item/652d57f1c458853aef660ca4.png&quot; alt=&quot;完全扫描阶段&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;后期的思路&lt;/h2&gt;
&lt;h3&gt;启动REFS的完整性流功能&lt;/h3&gt;
&lt;p&gt;启动完整性流可能有帮助，完整性流是REFS的一项可选功能，保证获得数据是原始未出错。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;完整性流是 ReFS 中的可选功能，它使用校验和来验证和维护数据完整性。虽然 ReFS 始终对元数据使用校验和，但默认情况下，ReFS 不会为文件数据生成或验证校验和。 完整性流是一项可选功能，允许用户对文件数据使用校验和。 启用完整性流后，ReFS 可以清楚地确定数据是否有效或已损坏。 此外，ReFS 和存储空间可以共同自动地更正损坏的元数据和数据。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;！！！对性能有负面影响哦！！！&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Get-Item -Path &apos;C:\*&apos; | Set-FileIntegrity -Enable $True
Set-FileIntegrity C:\ -Enable $True

Get-Item -Path &apos;C:\*&apos; | Set-FileIntegrity -Enable $False
Set-FileIntegrity C:\ -Enable $False

Get-Item -Path &apos;C:\*&apos; | Get-FileIntegrity
Get-Item -Path &apos;C:\&apos; | Get-FileIntegrity
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;使用软RAID阵列&lt;/h3&gt;
&lt;p&gt;使用VHDX的虚拟硬盘，并且使用Windows的存储池功能，构造软RAID1。分布在两个硬盘上提升可靠性。&lt;/p&gt;
</content:encoded></item><item><title>小米R3G刷机breed后刷openwrt</title><link>https://tski.uk/blog/r3g-flush-breed-openwrt/</link><guid isPermaLink="true">https://tski.uk/blog/r3g-flush-breed-openwrt/</guid><description>闲鱼淘了R3G刷Openwrt玩，记录一下第一次刷breed和openwrt</description><pubDate>Tue, 10 Oct 2023 23:42:56 GMT</pubDate><content:encoded>&lt;h2&gt;前言&lt;/h2&gt;
&lt;p&gt;挺早之前打算买个路由器玩，因为学了网络技术这么久都没用上，很想玩。
其次宿舍里打游戏有时候要局域网，总是开热点不方便。所以整个路由器刷个openwrt是个不错的选择。
一开始我打算选随身wifi，但是发现那高通CPU太弱了，根本带不动游戏联机，所以买了台据说对标K2P的R3G。
因为第一次刷breed和openwrt，网上没有什么现成的教程。七零八碎，版本也不对的教程看的挺难受，一路上挺坎坷的，终于成功之后记录一下过程。&lt;/p&gt;
&lt;h2&gt;打开SSH&lt;/h2&gt;
&lt;p&gt;先刷入开发版的ROM。将下载的ROM包复制到FAT32格式U盘的根目录，并重命名为miwifi.bin ，同时确保该目录下不存在其它“.bin”文件，若存在会导致刷机失败。
&lt;a href=&quot;https://www.miwifi.com/miwifi_download.html&quot;&gt;https://www.miwifi.com/miwifi_download.html&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;断开小米路由器的电源，将U盘插入路由器USB接口；
按住reset键，接通电源，等待指示灯变为黄色闪烁状态后松开reset键，路由器开始刷机；
等待刷机完成，整个过程约为3-5分钟，完成后系统会自动重启。路由器指示灯变蓝刷机完成；如果出现异常、失败、U盘无法读取的状况，会进入红灯状态，建议重试或更换U盘再试。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;手机要装MiWIFI的APP&lt;/strong&gt;，然后绑定账号（不然用不了SSH）。绑定之后访问这个网站，下载SSH工具包。
&lt;a href=&quot;https://d.miwifi.com/rom/ssh&quot;&gt;https://d.miwifi.com/rom/ssh&lt;/a&gt;
&lt;em&gt;也可以去看看什么强开SSH，但是有人反馈强开SSH得到的shell刷机失败&lt;/em&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;请将下载的工具包bin文件复制到U盘（FAT/FAT32格式）的根目录下，保证文件名为miwifi_ssh.bin；
断开小米路由器的电源，将U盘插入USB接口；
按住reset按钮之后重新接入电源，指示灯变为黄色闪烁状态即可松开reset键；
等待3-5秒后安装完成之后，小米路由器会自动重启，之后您就可以尽情折腾啦 ：）&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;尝试SSH访问。因为路由器上的dropbear版本很古典，必须加额外参数兼容那个古老的算法。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ssh -oKexAlgorithms=+diffie-hellman-group1-sha1 -oHostKeyAlgorithms=+ssh-dss -oCiphers=+3des-cbc root@192.168.31.1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;否则无法连接，会出现出现&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Unable to negotiate with 192.168.31.1 port 22: no matching key exchange method found. 
Their offer: diffie-hellman-group-exchange-sha1,diffie-hellman-group14-sha1,diffie-hellman-group1-sha1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;当时因为没有网线，然后绑定账号必须要用手机APP。我用电脑共享到有线网到路由器，重置路由器好多次都不行，搞了好久。所以看到还挺激动的。
&lt;img src=&quot;https://pic.imgdb.cn/item/65257c99c458853aefc0c83d.png&quot; alt=&quot;挺激动的&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;备份原始数据&lt;/h2&gt;
&lt;p&gt;每台机器的备份有略微不同，混用同一型号其他机器的备份可能会导致信号很差。
&lt;code&gt;cat /proc/mtd&lt;/code&gt;查看分区表，然后依次备份&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;dd if=/dev/mtd0 of=/extdisks/sda/ALL.bin
dd if=/dev/mtd1 of=/extdisks/sda/Bootloader.bin
dd if=/dev/mtd2 of=/extdisks/sda/Config.bin
dd if=/dev/mtd3 of=/extdisks/sda/Bdata.bin
dd if=/dev/mtd4 of=/extdisks/sda/Factory.bin
dd if=/dev/mtd5 of=/extdisks/sda/crash.bin
dd if=/dev/mtd6 of=/extdisks/sda/crash_syslog.bin
dd if=/dev/mtd7 of=/extdisks/sda/reserved0.bin
dd if=/dev/mtd8 of=/extdisks/sda/kernel0.bin
dd if=/dev/mtd9 of=/extdisks/sda/kernel1.bin
dd if=/dev/mtd10 of=/extdisks/sda/rootfs0.bin
dd if=/dev/mtd11 of=/extdisks/sda/rootfs1.bin
dd if=/dev/mtd12 of=/extdisks/sda/overlay.bin
dd if=/dev/mtd13 of=/extdisks/sda/ubi_rootfs.bin
dd if=/dev/mtd14 of=/extdisks/sda/data.bin #这一行可能会因为设备忙无法备份，没关系
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;还原备份&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;mtd write /extdisks/sda/Bootloader.bin Bootloader
mtd write /extdisks/sda/Config.bin Config
mtd write /extdisks/sda/Bdata.bin Bdata
mtd write /extdisks/sda/Factory.bin Factory
mtd write /extdisks/sda/crash.bin crash
mtd write /extdisks/sda/crash_syslog.bin crash_syslog
mtd write /extdisks/sda/reserved0.bin reserved0
mtd write /extdisks/sda/kernel0.bin kernel0
mtd write /extdisks/sda/kernel1.bin kernel1
mtd write /extdisks/sda/rootfs0.bin rootfs0
mtd write /extdisks/sda/rootfs1.bin rootfs1
mtd write /extdisks/sda/overlay.bin overlay
mtd write /extdisks/sda/ubi_rootfs.bin ubi_rootfs
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;刷breed&lt;/h2&gt;
&lt;p&gt;当时很担心成砖，所以上一步备份我备份了三次，都比较了CRC32，发现均相同才敢接着刷。
（其实现在想起来没必要这么谨慎，但是也挺好的习惯）&lt;/p&gt;
&lt;p&gt;下载breed，在目录里搜索文件名包含R3G的文件，下载
&lt;a href=&quot;https://breed.hackpascal.net/&quot;&gt;https://breed.hackpascal.net/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;使用WinSCP来传输文件到临时目录，协议使用SCP，不要用SFTP。（注意，FileZilla因为只支持SFTP，所以用不了。）
这个网站下载的是最新版，截止目前的时间，是1.2版本，和1.1版本的Web操作有较大差异。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mtd -r write /tmp/XXX.bin Bootloader
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.imgdb.cn/item/65257c98c458853aefc0c82e.png&quot; alt=&quot;刷breed&quot; /&gt;&lt;/p&gt;
&lt;p&gt;确认完成之后，按住RESET键开机。
等到路由的灯闪烁时候，松开RESET键，浏览器访问192.168.1.1。（一般情况下不需要手动分配IP地址,有DHCP）&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.imgdb.cn/item/65257c98c458853aefc0c808.png&quot; alt=&quot;breed的web界面&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;在控制台中备份&lt;/h3&gt;
&lt;p&gt;备份EEPROM和编程器固件。其中最重要的是EEPROM。&lt;/p&gt;
&lt;h2&gt;breed控制台刷入openwrt&lt;/h2&gt;
&lt;p&gt;使用的是这个版本的openwrt
&lt;a href=&quot;https://www.right.com.cn/forum/forum.php?mod=viewthread&amp;amp;tid=8303844&quot;&gt;https://www.right.com.cn/forum/forum.php?mod=viewthread&amp;amp;tid=8303844&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;下载底包，然后上传。
在v1.2的breed中，只用选rootfs0和kernel1两个文件，外加闪存布局写Openwrt就可以，不需要额外设置环境变量，挺方便的。
勾上刷机之后自动重启，然后慢慢等，千万别断电就好。
&lt;em&gt;据说v1.1的要设环境变量才能启动&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.imgdb.cn/item/65257c98c458853aefc0c7fb.png&quot; alt=&quot;等自动重启就好&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;进入OPENWRT之后，不要以为结束了，需要继续进行固件更新，更新文件sysupgrade.bin。&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;一些其他的问题&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;mtd write mir3g-squashfs-kernel1.binkernel1
mtd write mir3g-squashfs-rootfs0.binrootfs0
nvram set flag_try_sys1_failed=1
nvram commit
reboot
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;上述命令中nvram是uboot专有命令，Breed与uboot相互独立，参数不共用，根据国外论坛对于小米路由器原厂uboot的分析，小米路由器的kernel0包含的usb恢复的功能，就是将官方固件命名为miwifi.bin放入U盘内，断电时插入路由器，用硬物抵住reset键后插电，保持10秒左右，待黄灯快速闪动后可松手，可恢复至官方固件，这个功能可用于原厂固件损坏后的修复，也算是不错的功能，所以OpenWrt官网上的建议是将内核文件刷入kernel1&lt;/p&gt;
&lt;h2&gt;更新源&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;src/gz immortalwrt_core https://mirror.sjtu.edu.cn/immortalwrt/snapshots/targets/ramips/mt7621/packages
src/gz immortalwrt_base https://downloads.immortalwrt.org/snapshots/packages/mipsel_24kc/base
src/gz immortalwrt_luci https://downloads.immortalwrt.org/snapshots/packages/mipsel_24kc/luci
src/gz immortalwrt_packages https://downloads.immortalwrt.org/snapshots/packages/mipsel_24kc/packages
src/gz immortalwrt_routing https://downloads.immortalwrt.org/snapshots/packages/mipsel_24kc/routing
src/gz immortalwrt_small8 https://downloads.immortalwrt.org/snapshots/packages/mipsel_24kc/small8
src/gz immortalwrt_telephony https://downloads.immortalwrt.org/snapshots/packages/mipsel_24kc/telephony
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;src/gz immortalwrt_core https://mirrors.cloud.tencent.com/openwrt/snapshots/targets/ramips/mt7621/packages
src/gz immortalwrt_base https://mirrors.cloud.tencent.com/openwrt/snapshots/packages/mipsel_24kc/base
src/gz immortalwrt_luci https://mirrors.cloud.tencent.com/openwrt/snapshots/packages/mipsel_24kc/luci
src/gz immortalwrt_packages https://mirrors.cloud.tencent.com/openwrt/snapshots/packages/mipsel_24kc/packages
src/gz immortalwrt_routing https://mirrors.cloud.tencent.com/openwrt/snapshots/packages/mipsel_24kc/routing
src/gz immortalwrt_small8 https://mirrors.cloud.tencent.com/openwrt/snapshots/packages/mipsel_24kc/small8
src/gz immortalwrt_telephony https://mirrors.cloud.tencent.com/openwrt/snapshots/packages/mipsel_24kc/telephony
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>ChromeBook电池阈值限制充电到80%停止</title><link>https://tski.uk/blog/chromebook-batterymanage/</link><guid isPermaLink="true">https://tski.uk/blog/chromebook-batterymanage/</guid><description>ChromeBook适用于coreboot的电池阈值，限制充电到80%停止</description><pubDate>Sat, 16 Sep 2023 15:25:58 GMT</pubDate><content:encoded>&lt;h2&gt;目的&lt;/h2&gt;
&lt;p&gt;前几天买的chromebook，然后有时候要长时间拿出去用，所以比较在意电池的健康。发现老是充电自动到100%，就写个小程序用来限制充电到80%。
C++写的，默认3分钟定时检查一次电量，所以如果有&lt;strong&gt;略微超出80%是正常情况&lt;/strong&gt;。
平时在&lt;strong&gt;休眠状态资源占用极低&lt;/strong&gt;。
确保两个exe文件在同一个目录下。&lt;/p&gt;
&lt;h2&gt;使用方法&lt;/h2&gt;
&lt;h3&gt;手动启动&lt;/h3&gt;
&lt;p&gt;确保两个文件放在同一目录，点击chromebook_batterymanage.exe。&lt;/p&gt;
&lt;h3&gt;自动启动&lt;/h3&gt;
&lt;p&gt;确保两个文件放在同一目录，然后在&quot;任务计划程序&quot;里面创建计划，开机启动，执行chromebook_batterymanage.exe
预期情况，每隔3分钟检测一次电池电量，若大于等于80%，则停止向电池供电。不探测的时候后台休眠，占用极低。&lt;/p&gt;
&lt;h2&gt;下载&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;感谢coreboot提供的ectool。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;真的希望大家顺路可以去gayhub点个star，
&lt;a href=&quot;https://github.com/Tokisaki-Galaxy/chromebook_batterymanage&quot;&gt;github项目链接（首选）&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;分流地址（可能没有更新到最新版本）
https://www.lanzouj.com/b00rw55id
密码:grs8&lt;/p&gt;
</content:encoded></item><item><title>切换主题的纪念和一些想法</title><link>https://tski.uk/blog/switch-theme-log/</link><guid isPermaLink="true">https://tski.uk/blog/switch-theme-log/</guid><description>记录一下切换博客主题的想法</description><pubDate>Thu, 26 Jan 2023 15:56:31 GMT</pubDate><content:encoded>&lt;h2&gt;纪念&lt;/h2&gt;
&lt;p&gt;2023年1月24日晚上，三天前。&lt;/p&gt;
&lt;p&gt;终于下决心把博客从以前的旧主题&lt;code&gt;hexo-theme-matery&lt;/code&gt;切换成现在使用的&lt;code&gt;hexo-theme-fluid&lt;/code&gt;。
不过也由于各种奇怪的问题，磨磨蹭蹭拖了两三天才弄完，至少解决了大部分问题。
旧的主题因为我当时使用的时候功能不多，我自己在自己的分支上添加了很多功能，修改了很多文件，结果更新的时候合并出一大堆问题，版本控制彻底爆炸。再加上没注释，很多东西我自己都不知道是啥。。
大部分是因为我之前在添加代码的时候完全没想到后续更新，然后随意添加代码，删改文件。然后git记录里面乱成一片，自己都不知道自己干什么。。&lt;/p&gt;
&lt;h2&gt;想法和记录&lt;/h2&gt;
&lt;p&gt;在切换主题的时候，最大问题是hexo最近版本新引入的一个功能，覆盖主题设置，就是&lt;code&gt;_config.&amp;lt;theme.name&amp;gt;.yml&lt;/code&gt;。
之前按照&lt;a href=&quot;https://hexo.fluid-dev.com/docs/guide/#%E8%A6%86%E7%9B%96%E9%85%8D%E7%BD%AE&quot;&gt;fluid docs 覆盖配置&lt;/a&gt;来配置，但是搞了一天多一直不生效，但是我又不想直接去修改theme下的_config，所以一直搞不定，结果一天之后突发奇想把&lt;code&gt;_config.fluid.yml&lt;/code&gt;名字改成&lt;code&gt;_config.hexo-theme-fluid.yml&lt;/code&gt;，结果就成功了...&lt;/p&gt;
&lt;p&gt;不得不说切换主题之后，加载速度快多了，而且Lighthouse评分也高多了。效果真的很显著，而且比以前看起来差不多。
以前的主题太注重各种好看的功能，加载了大量js和css，结果加载速度挺慢的，现在fluid在效果和加载速度中取得了不错的平衡。&lt;/p&gt;
</content:encoded></item><item><title>树莓派3b刷openwrt作为旁路由</title><link>https://tski.uk/blog/rpi-openwrt-sideroute/</link><guid isPermaLink="true">https://tski.uk/blog/rpi-openwrt-sideroute/</guid><description>树莓派3b刷openwrt作为旁路由</description><pubDate>Tue, 24 Jan 2023 13:24:11 GMT</pubDate><content:encoded>&lt;h2&gt;参考资料&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://sspai.com/post/68511&quot;&gt;Openwrt 作为旁路网关（不是旁路由、单臂路由）的终极设置方法，破解迷思&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;固件下载&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://doc.openwrt.cc/2-OpenWrt-Rpi/&quot;&gt;OpenWrt RPi&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;刷机&lt;/h2&gt;
&lt;p&gt;用etcher就可以了，然后进Linux里面用GPart扩展分区，不然SD卡空间不能完全利用。&lt;/p&gt;
&lt;h2&gt;配置&lt;/h2&gt;
&lt;p&gt;emmm最后没做到少数派里面说的旁路网关，只做到了单臂路由。等哪天我做到旁路网关再回来吧。
旁路网关只影响上行数据，单臂路由会影响上下行。在树莓派3b上，网卡只有100M最高上限，所以跑不满，会影响网速。。。&lt;/p&gt;
</content:encoded></item><item><title>debian重新命名网卡</title><link>https://tski.uk/blog/debian-rename-network-interface/</link><guid isPermaLink="true">https://tski.uk/blog/debian-rename-network-interface/</guid><description>debian有时候安装完驱动，网卡名字会变得很奇怪，可以重新命名</description><pubDate>Mon, 23 Jan 2023 20:27:43 GMT</pubDate><content:encoded>&lt;p&gt;新买了个RTL8812BU网卡，打算用来给parrot用，然后去找了驱动装上之后，发现网卡名居然不是wlan0，是一串长长的名字，这个可忍不了。
parrot5是基于debian10 x64的。&lt;/p&gt;
&lt;p&gt;查了一下，修改一下命名规则就好啦。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo nano /etc/default/grub
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;将原来&lt;code&gt;GRUB_CMDLINE_LINUX=&quot;&quot;&lt;/code&gt;改为&lt;code&gt;GRUB_CMDLINE_LINUX=&quot;net.ifnames=0 biosdevname=0&quot;&lt;/code&gt;。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo update-grub
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;另外，如果在使用过程中出现&lt;code&gt;write failed: Network is down&lt;/code&gt;，需要把虚拟机设置，主机控制器里面兼容性从USB3.x改成USB2.0。&lt;/p&gt;
</content:encoded></item><item><title>晓龙410芯片随身wifi刷机浅谈</title><link>https://tski.uk/blog/portable-wifi-flash/</link><guid isPermaLink="true">https://tski.uk/blog/portable-wifi-flash/</guid><description>安卓系统随身wifi刷机中一点坑，自己感想</description><pubDate>Sun, 23 Oct 2022 11:22:15 GMT</pubDate><content:encoded>&lt;p&gt;之前在b站看到有人弄随身wifi刷机，感觉好奇怪。点进去一看发现这东西才不到20块钱，而且里面居然是晓龙410的芯片，跑着安卓4.4，然后去酷安找了个车买了俩。&lt;/p&gt;
&lt;p&gt;刷root挺麻烦，我想只做一次root，然后之后买的同样的机器都可以直接刷进去就可以了，省时省力。
之前一直好奇QCN和救砖包到底是什么样的关系，网上有人说两者没有关系，然后我就信了那个鬼话，随便刷了miko全量包，结果基带丢了，联不了联网。。
这就说明，再使用miko保存救砖包的时候，把QCN文件也一起保存下来，所以在复制到其他机器会丢失QCN。。。
丢失QCN会导致无法使用基带，丢失IMEI。每个设备IMEI是独特的，一般来讲复制其他设备IMEI不可行。也就是说这玩意差点废了。
好在我事先用miko全量备份了，没酿成惨案。。
但是我一直想知道QCN和救砖包到底是什么样的关系。仔细想了想，备份QCN需要root，而且有提示是从NV Database里保存的，这说明QCN其实保存在系统可以访问的地方。。
所以我把两个型号一样的随身wifi全量包的每个文件，去用差异计算，寻找不同的地方，也就是保存QCN的位置。&lt;/p&gt;
&lt;p&gt;两个随身wificlone下来的救砖包里基本所有文件都是一样的，有差异的是&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cache.img
modemst1.img
modemst2.img
persist.img
userdata.img
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;很神奇，一开始我预想的是modem.img会有差异，结果居然是一样的。
cache.img不管他，可以当成一样的。
对persist.img分析，里面差异文件是&lt;code&gt;[SYS]\Journal&lt;/code&gt;
所以根据文件名推测，里面应该不是重要文件，可以认为persist.img也是一致的。
所以到这里，知道了随身wifi不同设备不同的地方在于&lt;code&gt;modemst1.img modemst2.img&lt;/code&gt;不同。所以可以认为QCN保存在这里。&lt;/p&gt;
&lt;p&gt;由于这两个文件无法继续使用7zip简单的打开进行查看，所以不管他到底是哪个文件不同了。
不过我们知道QCN位置，所以可以通过Qualcomm Premium Tool刷写指定位置，这样就通过达到在新机器上直接flash预先做好的已经root的镜像，然后再烧一遍保存QCN的分区来达到简化操作的目的。&lt;/p&gt;
&lt;p&gt;最后，通过这样保存分区来保存QCN，也不需要root，相较使用星海SVIP保存更加方便，速度也更加快。毕竟擦写分区可比用软件写QCN快多了。（不管是星海SVIP还是miko，读写QCN都好慢...）&lt;/p&gt;
&lt;p&gt;最后测试一下，写了root的镜像，然后直接打开没有IMEI。重新烧录那两个分区，再打开就出现IMEI了。&lt;/p&gt;
&lt;p&gt;有个很奇怪的问题，网上的教程都是使用Miko保存救砖包，然后再用Qualcomm Premium Tool保存全部文件。难道没有人知道miko生成的救砖包可以打开为压缩包，里面文件和用Qualcomm Premium Tool保存的一模一样吗，绝对是重复操作。或者说网上都是复制粘贴的吗。。
Qualcomm Premium Tool的作用无法替代，因为它可以单独擦写某个分区，但是我不认同网上千篇一律教程所说的miko保存一遍，Qualcomm Premium Tool再保存一遍的重复操作...&lt;/p&gt;
</content:encoded></item><item><title>解决WSA或WSL占用过多C盘空间</title><link>https://tski.uk/blog/resolution-wsa-wsl-usage-much-system-space/</link><guid isPermaLink="true">https://tski.uk/blog/resolution-wsa-wsl-usage-much-system-space/</guid><description>用了WSA、WSL之后C盘空间爆炸，迁移到其他盘的方法</description><pubDate>Sat, 25 Dec 2021 23:08:27 GMT</pubDate><content:encoded>&lt;p&gt;因为我电脑一开始分区只给C盘分了100G，还加了Bitlocker加密，所以搞得现在空间不够用，而且还没法扩容（因为有BitLocker，没法扩容）。所以只好把安装的软件往外面迁，但是WSA是个占空间的大户，而且微软一如既往的不提供迁移方法，只好自己想办法解决。
&lt;strong&gt;同时，此办法也适用于对WSA，WSL有备份需求的用户。&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;WSA迁移方法&lt;/h2&gt;
&lt;p&gt;在文件浏览器中打开&lt;code&gt;%LocalAppData%\Packages\MicrosoftCorporationII.WindowsSubsystemForAndroid_8wekyb3d8bbwe\LocalCache&lt;/code&gt;。
其中&lt;code&gt;userdata.vhdx&lt;/code&gt;文件是WSA的虚拟硬盘，安装的APP都在这个文件里。&lt;/p&gt;
&lt;p&gt;用fastcopy复制到其他位置，再把原来位置的VHDX文件删除就可以了。
这里举例复制到&lt;code&gt;Z:\WSA_VHDX&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/Tokisaki-Galaxy/res/post/resolution-wsa-wsl-usage-much-system-space/1.png&quot; alt=&quot;用fastcopy复制VHDX文件&quot; /&gt;&lt;/p&gt;
&lt;p&gt;然后进入有管理员权限的cmd，创建链接。
&lt;strong&gt;注意一定是cmd，powershell没有mklink指令&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mklink userdata.vhdx Z:\WSA_VHDX\userdata.vhdx
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/Tokisaki-Galaxy/res/post/resolution-wsa-wsl-usage-much-system-space/2.png&quot; alt=&quot;用mklink创建软链接&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;WSL迁移方法&lt;/h2&gt;
&lt;p&gt;基本上和WSA迁移方法一致，不同在于VHDX路径不同。
不同Linux发行版的VHDX存储路径不同，用Ubuntu20.04LTS举例，它的VHDX存储在&lt;code&gt;%LocalAppData%\Packages\CanonicalGroupLimited.Ubuntu20.04onWindows_79rhkp1fndgsc\LocalState&lt;/code&gt;下的&lt;code&gt;ext4.vhdx&lt;/code&gt;里面，迁移其他到位置就好了。&lt;/p&gt;
&lt;h2&gt;注意事项&lt;/h2&gt;
&lt;p&gt;迁移前需要关闭对于软件，不然会提示文件打开，不能删除&lt;/p&gt;
&lt;h3&gt;WSA关闭方法&lt;/h3&gt;
&lt;p&gt;安装完WSA，会有一个绿色图标的应用，叫&lt;code&gt;Windows Subsystem for Android&lt;/code&gt;，里面有个开关是关闭WSA。&lt;/p&gt;
&lt;h3&gt;WSL关闭方法&lt;/h3&gt;
&lt;p&gt;进入powershell或者cmd，输入&lt;code&gt;wsl --shutdown&lt;/code&gt;&lt;/p&gt;
</content:encoded></item><item><title>msf http使用cloudflare argo上线</title><link>https://tski.uk/blog/meterpreter-via-cloudflare-argo/</link><guid isPermaLink="true">https://tski.uk/blog/meterpreter-via-cloudflare-argo/</guid><description>msf http使用cloudflare argo隧道上线，并隐藏C2地址</description><pubDate>Sun, 21 Nov 2021 13:34:14 GMT</pubDate><content:encoded>&lt;p&gt;为了直观展示，本文使用&lt;a href=&quot;https://github.com/FunnyWolf/Viper/&quot;&gt;VIPER图形化界面&lt;/a&gt;。&lt;/p&gt;
&lt;h2&gt;配置Argo隧道方法&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;下面教程是建立在您已经有一条隧道，有一个配置文件的基础上的，如果您还没有，请参阅&lt;a href=&quot;/blog/viper-via-cloudflare-argo/&quot;&gt;使用Cloudflare Argo隐藏VIPER后台&lt;/a&gt;。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在config.yml后面添上
如果已经有了那路径是&lt;code&gt;/etc/cloudflared/config.yml&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;新加如下几行&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#tp
tunnel: xxxxxxxxx
credentials-file: /root/.cloudflared/xxxxxxxxx.json

ingress:
  - hostname: vip.example.top
    service: http://127.0.0.1:60000
    #这里开始
  - hostname: tp.example.top
    service: http://127.0.0.1:2095 #这里端口要和下面msf监听设置成一样的，只要没被占用就行
    #这里结束
  - service: http_status:404
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;最后重启服务，应用配置文件。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl restart cloudflared
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在&lt;a href=&quot;https://dash.cloudflare.com&quot;&gt;cloudflare dashboard&lt;/a&gt;的dns面板里面，将tp.example.top的记录设置为与vip.example.top的记录一样
&lt;img src=&quot;https://cdn.jsdelivr.net/gh/Tokisaki-Galaxy/res/post/meterpreter-via-cloudflare-argo/1.png&quot; alt=&quot;就像这样&quot; /&gt;&lt;/p&gt;
&lt;p&gt;然后通过浏览器访问 &lt;code&gt;http://tp.example.top:2095&lt;/code&gt; ，应该会有这样的提示。
&lt;img src=&quot;https://cdn.jsdelivr.net/gh/Tokisaki-Galaxy/res/post/meterpreter-via-cloudflare-argo/2.png&quot; alt=&quot;提示404 Not found&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;通过http上线&lt;/h2&gt;
&lt;p&gt;因为cloudflare在国内访问不太行，最好用stageless。&lt;/p&gt;
&lt;p&gt;载荷选择&lt;code&gt;windows/meterpreter_reverse_http&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;设置LHOST为&lt;code&gt;tp.example.top&lt;/code&gt;
端口和argo隧道里设的一样就行。&lt;/p&gt;
&lt;p&gt;&lt;s&gt;设置&lt;code&gt;LHOST&lt;/code&gt;为&lt;code&gt;104.19.0.100&lt;/code&gt;，这是Cloudflare的一个香港节点，大陆访问速度相当快，如果你有更快的就直接替代好啦。
下拉找到&lt;code&gt;HttpHostHeader&lt;/code&gt;，里面填&lt;code&gt;tp.example.top&lt;/code&gt;这样既可以用较快的节点访问C2服务器，又不至于太暴露C2域名。&lt;/s&gt;&lt;/p&gt;
&lt;p&gt;如果用HostHeader伪装C2域名，理论上来讲没问题，但是实操会导致上线但无法操作，可能跟缓存有关，下周回来试试。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/Tokisaki-Galaxy/res/post/meterpreter-via-cloudflare-argo/3.png&quot; alt=&quot;设置完之后大概这样&quot; /&gt;&lt;/p&gt;
&lt;p&gt;生成PE/ELF文件，然后执行。就会产生一个Session。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/Tokisaki-Galaxy/res/post/meterpreter-via-cloudflare-argo/4.png&quot; alt=&quot;最终成果&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>使用Cloudflare Argo隐藏VIPER后台</title><link>https://tski.uk/blog/viper-via-cloudflare-argo/</link><guid isPermaLink="true">https://tski.uk/blog/viper-via-cloudflare-argo/</guid><description>使用Cloudflare Argo隐藏VIPER后台。</description><pubDate>Sun, 14 Nov 2021 13:21:08 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;What is a Cloudflare Argo Tunnel
Argo隧道提供了一种简便的方法，可将Web服务器安全地公开到Internet，而无需打开防火墙端口和配置ACL。 Argo隧道还可以确保请求在到达网络服务器之前先通过Cloudflare进行路由，因此可以确保通过Cloudflare的WAF和Unmetered DDoS缓解功能停止了攻击流量，并且如果为帐户启用了这些功能，则可以通过Access进行身份验证。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;为什么走Argo而不是普通CDN？
因为走CDN要用安全组放通60000端口，并且泄露了C&amp;amp;C服务器的IP地址，增加了被溯源隐患。使用ArgoTunnel不需要放通后台端口。而且有Cloudflare官方证书。&lt;/p&gt;
&lt;p&gt;并且现在Cloudflare默认走香港节点，大陆访问也不慢。&lt;/p&gt;
&lt;p&gt;为啥我要这么搞呢，其实一开始我只是想隐藏后台，所以使用宿主机装nginx反代，但是太难弄了。最后突然想起来Argo可以不开放端口，绑定域名外加隐藏地址，所以就赶紧上了Argo。&lt;/p&gt;
&lt;h2&gt;配置VIPER&lt;/h2&gt;
&lt;p&gt;因为viper使用的是自签名证书，如果直接转发&lt;code&gt;https://127.0.0.1:60000&lt;/code&gt;是不行的，会报证书错误。所以要先进容器内改nginx的配置文件，关掉ssl，改成http。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;docker ps #查看容器名
docker exec -i -t viper-c /bin/bash
#下面是在容器内的操作
cd /root/viper/Docker/
nano viper.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;用Ctrl+Shift+_跳转到第7行。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;.......
server {
        include /root/viper/Docker/nginxconfig/viper.conf;
        ssl off;    #把这里由on改成off
        ssl_certificate /root/viper/Docker/nginxconfig/server.crt;
.......
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;最后记得重载nginx的配置文件，让改动生效。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;nginx -s reload
exit #退出容器内
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;配置Argo&lt;/h2&gt;
&lt;h3&gt;安装&lt;/h3&gt;
&lt;p&gt;Cloudflared 是源服务器和 Cloudflare Argo Server 的连接软件。&lt;/p&gt;
&lt;p&gt;你可以参考这里的文档。&lt;/p&gt;
&lt;p&gt;官方文档
&lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/connections/connect-apps/install-and-setup/installation&quot;&gt;Docs&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Github Release
&lt;a href=&quot;https://github.com/cloudflare/cloudflared/releases&quot;&gt;Downloads&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;配置Tunnel&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;cloudflared tunnel login #先登录，并且选择example.com的域名
cloudflared tunnel create viper
cloudflared tunnel route dns viper vip #通过vip这条隧道，自动在cloudflare中添加一条指向vip.example.com的CNAME记录
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;确认Tunnel配置&lt;/h3&gt;
&lt;p&gt;启动隧道试试，如果没问题就继续。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cloudflared tunnel --name viper --url http://127.0.0.1:60000
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后可以访问vip.example.com查看效果，如果没有问题就继续。
这样启动隧道只是一个临时的措施，所以我们要持久化。&lt;/p&gt;
&lt;h3&gt;持久化Argo&lt;/h3&gt;
&lt;p&gt;先运行&lt;code&gt;cloudflared tunnel list&lt;/code&gt;记一下Tunnel的ID是多少。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo cloudflared service install
nano /etc/cloudflared/config.yml
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;按照下面这样写，该改的改一下&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;tunnel: &amp;lt;Tunnel-UUID&amp;gt;
credentials-file: /root/.cloudflared/&amp;lt;Tunnel-UUID&amp;gt;.json

ingress:
  - hostname: vip.example.com
    service: http://127.0.0.1:60000
  - service: http_status:404
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;重启cloudfalred服务&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl restart cloudflared &amp;amp;&amp;amp; sudo systemctl enable cloudflared
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>TencentOS安装Docker</title><link>https://tski.uk/blog/tencentos-install-docker/</link><guid isPermaLink="true">https://tski.uk/blog/tencentos-install-docker/</guid><description>在TencentOS中安装Docker</description><pubDate>Sat, 13 Nov 2021 18:05:50 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;TencentOS Server（又名 Tencent Linux，简称 TS 或 tlinux）是腾讯针对云的场景研发的 Linux 操作系统，提供特定的功能及性能优化，为云服务器实例中的应用程序提供高性能及更加安全可靠的运行环境。TencentOS Server 提供免费使用，在 CentOS（及其他发行版）上开发的应用程序可直接在 TencentOS Server 上运行，用户还可持续获得腾讯云团队的更新维护和技术支持。&lt;/p&gt;
&lt;p&gt;...
TencentOS Server 环境说明
用户态环境
TencentOS Server 2用户态软件包保持与最新版 CentOS 7兼容，即 CentOS 7版本的软件包可以直接在 TencentOS Server 2.4 中使用。
TencentOS Server 3用户态软件包保持与最新版 RHEL 8兼容，即 RHEL 8版本的软件包可以直接在 TencentOS Server 3.1 中使用。
...&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://cloud.tencent.com/document/product/213/38027&quot;&gt;全部简介见官方文档&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;增加适用于云场景的新特性、改进内核性能并修复重大缺陷，针对容器场景进行优化，提供了隔离增强和性能优化特性，所以建议使用TencentOS部署Docter。&lt;/p&gt;
&lt;p&gt;因为买了个服务器，看到有个没用过的TencentOS想试试，结果发现直接用官方的脚本docker死活装不上去，又找不到解决的办法，因此写下这篇文章记录。
支持一下TencentOS，但是用户社区太小了，希望更多人用增大社区用户量吧。&lt;/p&gt;
&lt;p&gt;安装所需软件包&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;yum install yum-utils device-mapper-persistent-data lvm2
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;添加docker官方的安装源&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;yum-config-manager --add-repo http://download.docker.com/linux/centos/docker-ce.repo
yum list docker-ce --showduplicates | sort -r #会报错，不管就行。
cd /etc/yum.repos.d/
nano docker-ce.repo #修改存储库文件
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;将docker-ce.repo改为下面这样，一般只用得上stable，所以就改stable的部分，其他都删了。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[docker-ce-stable]
name=Docker CE Stable - $basearch
#如果是TencentOS 2就是centos/7，如果是TencentOS 3就是centos/8
baseurl=https://download.docker.com/linux/centos/8/x86_64/stable
#baseurl=https://download.docker.com/linux/centos/$releasever/$basearch/stable
enabled=1
gpgcheck=1
gpgkey=https://download.docker.com/linux/centos/gpg
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;最后安装并启动docker&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;yum install docker-ce docker-ce-cli containerd.io
service docker start
systemctl enable docker
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>apt</title><link>https://tski.uk/blog/apt/</link><guid isPermaLink="true">https://tski.uk/blog/apt/</guid><description>Linux,cloudflare,Argo,metasploit,网络安全</description><pubDate>Sat, 30 Oct 2021 17:43:11 GMT</pubDate><content:encoded>&lt;h2&gt;绝对禁止在实战中使用HTTP协议&lt;/h2&gt;
&lt;p&gt;用cobaltstrike的HTTP上线，被教育局抓了，刚上线几分钟教育局就打来电话了。还好套了层cloudflare argo&lt;/p&gt;
&lt;h2&gt;meterpreter/reverse_tcp和meterpreter_reverse_tcp区别&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;payload/windows/x64/meterpreter/reverse_tcp                               normal  No     Windows Meterpreter (Reflective Injection x64), Windows x64 Reverse TCP Stager

payload/windows/x64/meterpreter_reverse_tcp                               normal  No     Windows Meterpreter Shell, Reverse TCP Inline x64
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这两个的区别在于第一个是stage模式，第二个是stageless&lt;/p&gt;
</content:encoded></item><item><title>【CrackMe】之CKme002</title><link>https://tski.uk/blog/crack-me-ckme002/</link><guid isPermaLink="true">https://tski.uk/blog/crack-me-ckme002/</guid><description>CKme002.exe破解</description><pubDate>Mon, 23 Aug 2021 12:03:01 GMT</pubDate><content:encoded>&lt;p&gt;谨以此系列记录自己学破解的进程。&lt;/p&gt;
&lt;p&gt;本文使用的CrackMe链接：&lt;a href=&quot;https://www.52pojie.cn/thread-709699-1-1.html&quot;&gt;【反汇编练习】160个CrackME索引目录1~160建议收藏备用 - 『脱壳破解区』 - 吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn&lt;/a&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;随便找找字符串，然后找到成功意思的字符串，跳转过去。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/Tokisaki-Galaxy/res@master/img/202108231252477.png&quot; alt=&quot;找字符串&quot; /&gt;&lt;/p&gt;
&lt;p&gt;然后抹掉条件跳转指令，完成&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/Tokisaki-Galaxy/res@master/img/202108231253037.png&quot; alt=&quot;抹掉条件跳转指令&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>【CrackMe】之CKme</title><link>https://tski.uk/blog/crack-me-ckme/</link><guid isPermaLink="true">https://tski.uk/blog/crack-me-ckme/</guid><description>CKme.exe破解</description><pubDate>Mon, 23 Aug 2021 11:29:36 GMT</pubDate><content:encoded>&lt;p&gt;谨以此系列记录自己学破解的进程。&lt;/p&gt;
&lt;p&gt;本文使用的CrackMe链接：&lt;a href=&quot;https://www.52pojie.cn/thread-709699-1-1.html&quot;&gt;【反汇编练习】160个CrackME索引目录1~160建议收藏备用 - 『脱壳破解区』 - 吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn&lt;/a&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;字符串搜索，随便搜个成功。&lt;/p&gt;
&lt;p&gt;然后搜索到了&quot;恭喜恭喜！注册成功&quot;，直接跳转过去&lt;/p&gt;
&lt;p&gt;看到右边有虚线，找到虚线起源，jne指令。然后改成NOP，完成。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/Tokisaki-Galaxy/res@master/img/202108231305331.png&quot; alt=&quot;5&quot; /&gt;&lt;/p&gt;
&lt;p&gt;PS.如果没加载出来图，点一下灰色框。&lt;/p&gt;
</content:encoded></item><item><title>【CrackMe】之Acid Burn</title><link>https://tski.uk/blog/crack-me-acid-burn/</link><guid isPermaLink="true">https://tski.uk/blog/crack-me-acid-burn/</guid><description>Acid Burn.exe破解</description><pubDate>Sun, 22 Aug 2021 22:24:31 GMT</pubDate><content:encoded>&lt;p&gt;谨以此系列记录自己学破解的进程。&lt;/p&gt;
&lt;p&gt;本文使用的CrackMe链接：&lt;a href=&quot;https://www.52pojie.cn/thread-709699-1-1.html&quot;&gt;【反汇编练习】160个CrackME索引目录1~160建议收藏备用 - 『脱壳破解区』 - 吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn&lt;/a&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;第一次玩crackme，先直接启动，熟悉一下各个界面。了解一下序列号出错的提示。&lt;/p&gt;
&lt;p&gt;它有两种验证，一种是序列号+注册名，另一种是仅序列号，大致明白流程之后关闭，然后挂上x64dbg走起。&lt;/p&gt;
&lt;h3&gt;序列号&lt;/h3&gt;
&lt;p&gt;先从简单的下手，载入程序后搜索所有模块-字符串，搜索出错提示&quot;Try Again!!&quot;，然后跳转过去。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/Tokisaki-Galaxy/res@master/img/202108231107084.png&quot; alt=&quot;跳转到Try Again!!&quot; /&gt;&lt;/p&gt;
&lt;p&gt;首先必须知道点汇编指令的含义，比如jmp是无条件跳转，jne是条件跳转之类的。&lt;/p&gt;
&lt;p&gt;（其实也不用记，x64dbg用虚线箭头标出来的是条件跳转，实线是无条件跳转，&lt;/p&gt;
&lt;p&gt;然后看到跳转过来的&quot;Try Again!!&quot;附近有一个虚线、一个实线箭头。&lt;/p&gt;
&lt;p&gt;理清一下程序流程，首先它先对输入的数据进行判断，然后用jne判断是否符合，如果不符合就输出Fail，try again!!，如果符合就啥也不干。&lt;/p&gt;
&lt;p&gt;所以将jne指令用nop填充，第一个问题解决。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/Tokisaki-Galaxy/res@master/img/202108231113665.png&quot; alt=&quot;将jne替换为nop&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;序列号+注册名&lt;/h3&gt;
&lt;p&gt;先用搜索字符串找到提示&quot;Sorryxxxxxx&quot;，会出现两个结果，因为它要对序列号和注册名判断两次，所以有两次提示。&lt;/p&gt;
&lt;p&gt;先从第一处开始，jge也是条件跳转指令中一个，只要将jge改为jmp，这里就破解完成了。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/Tokisaki-Galaxy/res@master/img/202108231117268.png&quot; alt=&quot;修改jge指令&quot; /&gt;&lt;/p&gt;
&lt;p&gt;然后找到第二处，&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/Tokisaki-Galaxy/res@master/img/202108231120301.png&quot; alt=&quot;第二处&quot; /&gt;&lt;/p&gt;
&lt;p&gt;大致梳理一下流程，基本和之前一样，把条件跳转jne改为nop就行了&lt;/p&gt;
&lt;h3&gt;结尾&lt;/h3&gt;
&lt;p&gt;至此无论你输什么，都会显示祝贺成功。&lt;/p&gt;
&lt;p&gt;最后可以输出修补程序，就是破解完的程序&lt;/p&gt;
</content:encoded></item><item><title>dnspod public dns 初体验</title><link>https://tski.uk/blog/tencent-public-dns/</link><guid isPermaLink="true">https://tski.uk/blog/tencent-public-dns/</guid><description>试试腾讯的public dns</description><pubDate>Tue, 10 Aug 2021 16:08:44 GMT</pubDate><content:encoded>&lt;p&gt;最近腾讯DnsPod新出了一个产品——个性化dns，可以自定义拦截列表，用于拦截广告，追踪器。国内以前也要类似的产品，比如红🐟之类的。&lt;/p&gt;
&lt;p&gt;我只以前用树莓派搭过adguard home，用于在家里拦截广告，追踪器。这样做的好处是只需要在网关上设置，不需要在家里每个设备上单独设置了。但用树莓派的不足之处在于出门不能使用（废话），解析时间略长（50-60ms，约长一倍）。&lt;/p&gt;
&lt;p&gt;现在新推出的dnspod处于公测期间，可以免费无限量使用，正好拿来试试水。&lt;/p&gt;
&lt;p&gt;从dnspod中进入公共解析，完成创建后可以看到下面这个界面。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://ftp.bmp.ovh/imgs/2021/08/a6d39e3f44ac5ccf.png&quot; alt=&quot;publicdns&quot; /&gt;&lt;/p&gt;
&lt;p&gt;然后只需要把dns服务器地址设为路由器dhcp服务器里面就行了&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://ftp.bmp.ovh/imgs/2021/08/6bd7b21343604d1a.png&quot; alt=&quot;tplink设置dhcp服务器&quot; /&gt;&lt;/p&gt;
&lt;p&gt;TP-LINK打钱
由于dnspod的IPv4地址不能为所有客户1对1的给一个地址，必须将你的地址绑定到你的账户上&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://ftp.bmp.ovh/imgs/2021/08/09de7d3cf32cfec5.png&quot; alt=&quot;publicdns绑定&quot; /&gt;&lt;/p&gt;
&lt;p&gt;家里用的宽带一般是动态IP，每天都会变，而我们又不可能每天都登录dnspod来手动绑定，所以推出了一项功能叫自动绑定接口。&lt;/p&gt;
&lt;p&gt;只要变化的IP后访问了这个接口（GET请求），就会自动绑定。那么我们只需要把这个地址设为我们浏览器的启动页就好了。&lt;/p&gt;
&lt;p&gt;（这真的是最合理的办法了啊）&lt;/p&gt;
&lt;p&gt;第二种方法，写一个python脚本访问，不过你要加启动项或者每天自己点&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import requests
requests.get(&quot;xxxxxxxxxx&quot;) #这是你的自动绑定接口
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>Win/Lin HackRF升级固件 (2021.03.1)</title><link>https://tski.uk/blog/hackrf-upgrade-firmware/</link><guid isPermaLink="true">https://tski.uk/blog/hackrf-upgrade-firmware/</guid><description>Windows/Linux下HackRF 升级固件 (2021.03.1)</description><pubDate>Fri, 23 Jul 2021 21:55:23 GMT</pubDate><content:encoded>&lt;h2&gt;更新固件&lt;/h2&gt;
&lt;h3&gt;安装工具&lt;/h3&gt;
&lt;h4&gt;Windows&lt;/h4&gt;
&lt;p&gt;先安装&lt;a href=&quot;http://www.gcndevelopment.com/gnuradio/index.htm&quot;&gt;GNURadio Windows&lt;/a&gt;，添加安装目录/bin到path里面&lt;/p&gt;
&lt;h4&gt;Linux&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;apt install hackrf&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;检测是否连上&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;hackrf_info&lt;/code&gt;，如果出现了信息，就是连上了，同时可以看到现在的版本号。截止目前最新的Release是&lt;code&gt;hackrf-2021.03.1&lt;/code&gt;。&lt;/p&gt;
&lt;h3&gt;下载Release&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/mossmann/hackrf/releases&quot;&gt;https://github.com/mossmann/hackrf/releases&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;更新&lt;/h3&gt;
&lt;p&gt;解压后，进入firmware-bin目录下。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#更新flash
hackrf_spiflash -Rw hackrf_one_usb.bin
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;如果你的hackrf_spiflash里没有-R选项，那就去掉它，它的作用只是写入新的固件后重启而已&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;网上的很多更新固件的文章都是2017、2018年版的，需要刷flash盒cpld包。但是最新版不需要cpld包了，所以只需要刷进去一个文件就行了。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;CPLD bitstreams are now included in and loaded automatically by the firmware. There is no longer a need to update the CPLD separately.
---Github Release(2021.03.1)发行说明&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;然后再执行&lt;code&gt;hackrf_info&lt;/code&gt;，可以看到已经更新到2021.03.1了。&lt;/p&gt;
&lt;h2&gt;更新软件&lt;/h2&gt;
&lt;p&gt;先安装编译需要的软件&lt;code&gt;sudo apt-get install build-essential cmake libusb-1.0-0-dev pkg-config libfftw3-dev&lt;/code&gt;。
然后进入host目录中&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mkdir build&amp;amp;cd build
cmake ../ -DINSTALL_UDEV_RULES=ON
make
sudo make install
sudo ldconfig
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>ParrotSec提示NO PUBLIC KEY</title><link>https://tski.uk/blog/parrot-prompt-no-public-key/</link><guid isPermaLink="true">https://tski.uk/blog/parrot-prompt-no-public-key/</guid><pubDate>Fri, 23 Jul 2021 21:14:36 GMT</pubDate><content:encoded>&lt;p&gt;本有了wsl2，指望彻底把vmware扔到垃圾桶里，结果今天发现wsl2居然不支持usb设备。。。
只好又赶紧翻出来vmware装上linux。&lt;/p&gt;
&lt;p&gt;结果apt install的时候又提示NO PUBLIC KEY。。。&lt;/p&gt;
&lt;h2&gt;确定要添加的PUBLIC KEY的摘要&lt;/h2&gt;
&lt;p&gt;为啥只有一张图呢？
因为懒，所以我就只传一张图了，包含所有步骤了（狗头&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.loli.net/2021/07/23/6E5zoT9RgrLPywf.png&quot; alt=&quot;1.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;apt update&lt;/code&gt;之后，会提示&lt;code&gt;the public key is not available: NO_PUBKEY XXXXXXXXX&lt;/code&gt;
记下来这个XXXXXXX&lt;/p&gt;
&lt;h2&gt;添加PUBLIC KEY&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys XXXXXXX&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;emmm其实一开始我碰到这个奇葩的问题是一脸懵逼的，去百度查一下，说用ha.pool.sks-keyserver.net这个地址，结果发现访问不了。（百度垃圾）&lt;/p&gt;
&lt;p&gt;最后实在没办法了（找不到了），死马当活马医，给parrotsec用ubuntu的keyserver，发现居然可以，大喜。
可能是因为他们俩都是同父异母的兄弟吧（debian）。&lt;/p&gt;
</content:encoded></item><item><title>HackRF发送信号</title><link>https://tski.uk/blog/hackrf-send-signal/</link><guid isPermaLink="true">https://tski.uk/blog/hackrf-send-signal/</guid><description>GNURadio+HackRF发送信号</description><pubDate>Fri, 23 Jul 2021 18:49:18 GMT</pubDate><content:encoded>&lt;p&gt;近期由于河南强降水，多地区失去通信，水电。许多人受灾情况没法及时传递。
看到家里吃灰已久的HackRF One，终于决定做个紧急求救电台。
（其实很早以前就有这个想法，不过当时是玩游戏玩high了，为核战准备的）&lt;/p&gt;
&lt;p&gt;美中不足的是这玩意是半双工的，不能一边发送一边接收信号。&lt;/p&gt;
&lt;h2&gt;ParrotSec + GNURadio (PLAN A)&lt;/h2&gt;
&lt;p&gt;强烈推荐ParrotSec，比kali不知道好看几倍，比ubuntu多很多工具。
wsl爬，原本以为有了wsl能把vmware扔垃圾桶里，结果发现wsl不支持usb。只好找回vmware。&lt;/p&gt;
&lt;p&gt;在某个版本之后，parrotsec不默认包含gnuradio了，需要自己手动&lt;code&gt;apt install gnuradio&lt;/code&gt;。&lt;/p&gt;
&lt;h2&gt;Windows + GNURadio (PLAN B)&lt;/h2&gt;
&lt;p&gt;本来我在parrotsec下已经弄好了，但是突然想起来gnuradio有windows版本的，加上我其实并不喜欢用vmware（感觉体积太庞大了）。
就试试几年前曾经抛弃的 gnuradio windows。抛弃原因是当时安装好了打不开。
下回来之后发现历经数次版本迭代，windows版本的gnuradio已经和linux版不分上下了，于是乎再次把vmware扔到垃圾桶里。
&lt;a href=&quot;http://www.gcndevelopment.com/gnuradio/index.htm&quot;&gt;GNURadio Win64 Binaries&lt;/a&gt;
（下载是真的慢，idm都救不回来那种
安装完之后记得把安装目录\bin目录加到path里面，里面有hackrf工具，不用另外找了，很方便。&lt;/p&gt;
&lt;h2&gt;&lt;/h2&gt;
</content:encoded></item><item><title>自建游戏加速器</title><link>https://tski.uk/blog/create-game-accelerator/</link><guid isPermaLink="true">https://tski.uk/blog/create-game-accelerator/</guid><description>使用云服务器自建加速器</description><pubDate>Mon, 12 Jul 2021 09:53:57 GMT</pubDate><content:encoded>&lt;h2&gt;服务端&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;wget https://github.tski.uk/github.com/jedisct1/libsodium/releases/download/1.0.18-RELEASE/libsodium-1.0.18.tar.gz
wget --no-check-certificate -O shadowsocks-all.sh https://raw.githubusercontent.com/teddysun/shadowsocks_install/master/shadowsocks-all.sh
chmod +x shadowsocks-all.sh
sudo ./shadowsocks-all.sh 2&amp;gt;&amp;amp;1 | tee shadowsocks-all.log
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后输入配置信息，加密方法建议选择第三种（反正游戏加速器也不需要强加密
等运行完成之后复制SSR链接进入下一步&lt;/p&gt;
&lt;h2&gt;客户端&lt;/h2&gt;
&lt;p&gt;下载&lt;a href=&quot;https://github.com/netchx/netch/releases&quot;&gt;Netch&lt;/a&gt;，然后打开（如果闪退的话转.Net框架）。&lt;/p&gt;
&lt;p&gt;第一个选项栏里选择从剪贴板导入，然后就可以导入服务器了，再选择需要的游戏加速规则，最后点加速。&lt;/p&gt;
</content:encoded></item><item><title>海龟汤</title><link>https://tski.uk/blog/ltp/</link><guid isPermaLink="true">https://tski.uk/blog/ltp/</guid><description>一些海龟汤，网上搜集</description><pubDate>Fri, 21 May 2021 10:21:43 GMT</pubDate><content:encoded>&lt;p&gt;FROM ZHIHU:
soup base-horror-1 牛吃草&lt;/p&gt;
&lt;p&gt;夫妻俩屋内吵架，妻子气急而开始摔东西，丈夫一时气恨交加，用刀割掉了她的舌头，在妻子逃跑的同时丈夫用利斧砍断了她的四肢。丈夫行凶后被自己不正常的暴行和血腥场面所惊愕在原地。而逃出房门的妻子因失去了双臂双腿，趴在草地上用牙齿咬着草一点一点挪到邻居家门口，撞门之后得不到求救，最终因失血过多而死。
山法官
山法官​
(作者) 回复山法官​
(作者) 2020-11-12
soup base-horror-2 情人&lt;/p&gt;
&lt;p&gt;情人是个男人，因为老男人拒绝离婚的理由是他生不出孩子，情人绝望之下，去老男人家里把老男人的儿子杀死塞进肚子中，用这种方式证明自己怀了老男人的儿子。墙上的话是“我怀了你的孩子”。
山法官
山法官​
(作者) 回复山法官​
(作者) 2020-11-12
soup base-horror-3 眼睛&lt;/p&gt;
&lt;p&gt;该车站是某个杀人团伙转移重要尸体的窝点，这天在转移时由于疏忽大意让男子无意间进来，他们拆除了厕所的地下管道，改造成了藏尸间，出口就是男子坑位正前方的地板砖，男子蹲坑时他们正好把尸体从里面顶出出口，男子听到的声响是瓷砖被碰开的声音，然后从门缝底下看到尸体从眼睛处慢慢上升。罪犯顶出来尸体后发现了男子，于是杀人灭口。
山法官
山法官​
(作者) 回复山法官​
(作者) 2020-11-12
soup base-horror-4 犬&lt;/p&gt;
&lt;p&gt;小女孩是个盲人，晚上有小偷潜入家里，把狗杀死吊在天花板上，滴水声是狗在滴血，舔她手的也不是她的狗，而是那个人。
山法官
山法官​
(作者) 回复山法官​
(作者) 2020-11-12
soup base-horror-5 厕所&lt;/p&gt;
&lt;p&gt;凶手在刚刚杀完人的时候听到了厕所外面的动静，知道有人来上厕所，凶手为了不让尸体暴露，所以假装是清洁工在上夜班，然后把死者当成了拖把，背过身拖地，当时厕所灯光十分的昏暗，所以急忙去上厕所的主人公并没有发和现什么异常，只看到一个清洁工在拖地而已，于是上完就走了。其实是凶手把死者倒立，背对男主用死者的头发在拖地。
山法官
山法官​
(作者) 回复山法官​
(作者) 2020-11-12
soup base-horror-6 敲门声&lt;/p&gt;
&lt;p&gt;丈夫下车不久就被杀人犯杀害了，杀人犯出于极致的恶趣味，把尸体吊在车上方的树上，每两声的敲车门声是风吹丈夫尸体摇摆的脚碰到车门发出的声音。
山法官
山法官​
(作者) 回复山法官​
(作者) 2020-11-12
soup base-horror-7 咚咚咚&lt;/p&gt;
&lt;p&gt;一个小偷潜进了一个杀人犯的屋子，杀人犯当时拖着一具尸体往楼梯上走，咚咚的声音是尸体头被倒拖着撞到每层楼梯的声音，进门时杀人犯倒提着尸体进来，躲在床底的小偷的目光与尸体倒立的头的目光相遇，于是魂飞魄散。&lt;/p&gt;
&lt;p&gt;注：改编自同名网传灵异汤。
山法官
山法官​
(作者) 回复山法官​
(作者) 2020-11-28
soup base-horror-8 别回头&lt;/p&gt;
&lt;p&gt;有天女主在街上，刚好头顶高楼天台上有人争执，一人被失手推下楼顶，坠楼者被高空电线和铁丝网分割成碎状，鲜血和内脏溅落街道，女主身后的朋友看到急忙惊慌失措的喊她，女主听到呼喊转身后被散落的肢体内脏和血淋了一身，以及掉在脚前还睁着眼死不瞑目的半个脑袋。&lt;/p&gt;
&lt;p&gt;注：原创为活跃于众多海龟汤线上群的木鱼同学，群内的重口女王（笑）。
山法官
山法官​
(作者) 回复山法官​
(作者) 2020-11-28
souo base-horror-9 爱&lt;/p&gt;
&lt;p&gt;男孩已经死了，抓着的是一只断手，尸体是妈妈的。男孩和男孩母亲长期遭受父亲的家暴，男孩从小体弱多病，再加上家暴的影响，有很深的心理阴影，每晚必须抓着妈妈的手才能入睡。有一天母亲终于忍无可忍，在家里的茶壶里下了安眠药，男孩和父亲在睡前都喝了茶壶里的水。当晚，男孩依旧抓着妈妈的手入睡了。体弱的男孩首先因为过量安眠药致死，母亲半夜准备起来杀掉父亲时，发现男孩已经尸僵，手也挣脱不开，母亲悲痛欲绝之下先砍断自己被男孩握住的手，回头拼命的向孩子父亲砍去。房间满是血迹，男孩父亲被绝望的母亲分尸成碎块散落一地，断手的母亲倚靠在床脚，目光温柔的看着男孩，等待着男孩永远不会再睁开的眼睛睁开，最终因失血过多而死。&lt;/p&gt;
&lt;p&gt;注：此汤是改编里较满意的本子之一。
山法官
山法官​
(作者) 回复山法官​
(作者) 2020-11-28
soup base-horror-10 双胞胎
我有人格分裂，一个内向的姐姐人格和活泼开朗的妹妹人格，和他约会的时候时而是姐姐时而是妹妹，为了隐瞒所以我说我们是双胞胎，但他喜欢的是妹妹。结婚的时候母亲说，这是我唯一的女儿，你要照顾好她，新郎便得知了真相而疯。&lt;/p&gt;
&lt;p&gt;注：收录自抖音是不是团队。
山法官
山法官​
(作者) 回复山法官​
(作者) 2020-11-28
soup base-horror-11 找到你了&lt;/p&gt;
&lt;p&gt;两家人去山林聚餐，小男孩和小女孩跑到深处玩捉迷藏，他们做的约定是谁被找到就偷偷拍身后，那个人就不许动，小女孩躲在从山坡中间斜过来的一颗矮树下，男孩在山坡上发现了女孩，偷偷从他这边的树枝爬到树顶，准备跳到女孩身后吓她一跳，爬上去因为失足摔下来，脖子被卡在树枝中间，窒息死亡后慢慢尸僵，软下来的脚尖刚好搭到女孩背上，女孩一直蹲着捂住耳朵，也没注意到头顶轻微的挣扎声响，背被搭上以为被找到了，于是动也不动。&lt;/p&gt;
&lt;p&gt;注：山法官原创，灵感取自sp-h-6敲门声。
山法官
山法官​
(作者) 回复山法官​
(作者) 2020-11-28
soup base-horror-12 三胞胎&lt;/p&gt;
&lt;p&gt;三胞胎长相一摸一样，感情也很好，三兄弟一直同床共眠，老大的死刺激了患有精神疾病的老三，在几晚上都睡不着之后，无法忍耐的老三把老二从中间劈成了两半，把尸体左边一半放在床的右边，把右边放床的左边，老三躺在中间入睡，左右看都是他的哥哥完整的侧脸。
山法官
山法官​
(作者) 回复山法官​
(作者) 2020-11-28
soup base-horror-13 爱（二）&lt;/p&gt;
&lt;p&gt;我是一个洋娃娃，是用旁边男尸的女儿的皮做成的。有一家三口人，父亲和女儿都有遗传的精神病，女儿因为年龄太小忍受不了折磨每天痛苦不堪，父亲一直深爱着女儿，无法忍受女儿每天如此痛苦便杀了女儿，用女儿的皮做成洋娃娃陪着自己，母亲得知后因为极端的恐惧杀掉了女儿父亲，说：“你们可以永远在一起了。”&lt;/p&gt;
&lt;p&gt;注：重编自网传汤《洋娃娃》。
山法官
山法官​
(作者) 回复山法官​
(作者) 2020-11-28
soup base-horror-14 外婆&lt;/p&gt;
&lt;p&gt;外公因为农村里的重男轻女观念一直不待见孙女，等孙女来到家后晚上拿着镰刀准备杀掉孙女，但外婆发现了急忙上去阻拦，外婆夺过镰刀失手之下杀死了外公，女孩被声音惊醒问进屋来的外婆是什么声音，外婆说是在收麦子，事后外婆把外公制成了一个稻草人放在田地里。隔了几天女孩给外婆在地里帮忙干活时，看到鸟在啄稻草人的脸，稻草人脸上的伪装被鸟啄开，露出了外公尸体的眼珠，女孩问外婆的话是“为什么那个稻草人的眼珠看起来好像外公的眼睛啊。”外婆被孙女的话刺激到了，因为巨大的恐惧与愧疚，便在深夜自杀。
山法官
山法官​
(作者) 回复山法官​
(作者) 2020-11-28
soup base-horror-15 床边有人&lt;/p&gt;
&lt;p&gt;我是一个女孩，妈妈被我杀了。女孩从小患有严重的精神错乱和自闭症，小时候因为精神错乱误杀了她的哥哥，母亲怕她的自闭症加深，便把这事含糊过去，但是女孩一直有深深的怀疑，以为是妈妈杀的哥哥。女孩的精神错乱一般都是深夜自闭症加深引发出来的，所以母亲每天半夜都偷偷过来盯着女孩是否安然入睡。这天终于被半夜醒来的女孩发现，女孩以为母亲来杀她了，惊恐不安下精神错乱又开始了。
山法官
山法官​
(作者) 回复山法官​
(作者) 2020-11-28
soup base-horror-16 红&lt;/p&gt;
&lt;p&gt;她的床对面墙上挂着一副海报，海报里有个红色眼睛正对着她，但眼睛的墙壁位置其实是被掏空的，她墙对面住着一个红眼病人，盯着她的眼睛是这个红眼病人的。她每次发呆愣神都会一直盯着海报里的眼睛，也同时被这双眼睛死死盯着，晚上也受此影响一直做红色眼睛的噩梦，所以感觉快被逼疯了。
山法官
山法官​
(作者) 回复山法官​
(作者) 2020-11-28
soup base-horror-17 女明星&lt;/p&gt;
&lt;p&gt;电视里正在播报新闻，报道说有一个狂热粉丝为了追星，把自己的皮剥下来做成人皮沙发送给了她，而这个明星就是她，女明星低下头看着自己正在坐的柔软的人皮沙发，在惊恐的尖叫中突发心脏病而死。&lt;/p&gt;
&lt;p&gt;注：来自一位海外老哥的友情供稿。&lt;/p&gt;
&lt;p&gt;soup base-weird-1 生日&lt;/p&gt;
&lt;p&gt;这个人天生就是盲人，有次他们出去探险，被困在一个没有任何食物的荒岛上，朋友们骗他说每个人都砍下来自己的一只手臂当食物，他便主动奉上，在生日这天，无数掌声在他耳边响起来时，他忽然明白，自己被骗了。
山法官
山法官​
(作者) 回复山法官​
(作者) 2020-11-12
soup base-weird-2 邻居&lt;/p&gt;
&lt;p&gt;邻居听到女主家有异响，打电话向女主说可能进小偷了，女主回到家寻找完发现并没有丢什么，便放心睡觉了，其实小偷是偷了女主家的备用钥匙，半夜进门后，来到女子床边在她耳朵边轻轻告诉她：“你丢的其实是这把钥匙。”女子因惊恐心脏病发作而死。
山法官
山法官​
(作者) 回复山法官​
(作者) 2020-11-12
soup base-weird-3 水草&lt;/p&gt;
&lt;p&gt;一对情侣在河边玩的时候，不小心双双落水，但两人都不会游泳，男主在水中挣扎的时候脚被水草缠住，男主死命挣脱开才得以活命，女主却再也没有上来。后来和渔夫聊天，被告之河里从来没有水草，男主才醒悟缠住他的不是水草，是女主的头发，女主是被他用脚蹬下去所以死在河中的。
山法官
山法官​
(作者) 回复山法官​
(作者) 2020-11-12
soup base-weird-4 女明星&lt;/p&gt;
&lt;p&gt;女明星毁过容，养女儿是为了移植女儿的脸皮到她自己的脸上，那顶帽子是她自己的，时不时给女儿戴上是为了测量女儿头部大小，一旦刚好合适，就可以带去医院做脸部移植手术，手术后女儿悲愤自杀。
山法官
山法官​
(作者) 回复山法官​
(作者) 2020-11-12
soup base-weird-5 新娘&lt;/p&gt;
&lt;p&gt;故事发生在唐朝，新郎和新娘青梅竹马，定下婚约后新郎去京城求取功名，如愿以偿中了状元当了官之后兴高采烈的回来，才知道新娘因为家里闯进一群歹徒被轮番玷污了身子，新娘不堪受辱便上吊自杀了，新郎大喜后又大悲。
山法官
山法官​
(作者) 回复山法官​
(作者) 2020-11-12
soup base-weird-6 雪山&lt;/p&gt;
&lt;p&gt;两人是一人身中7枪，另外一人自杀而死。自杀的人有梦游症，第一天晚上梦游中把同伴杀死，醒来后发现自己杀人很害怕，就挖了个坑把同伴埋了。第二天晚上梦游的时候，他又把坑里的同伴挖出来，在尸体上打一枪，又去睡了。这样重复了整整7天，在第八天的时候他终于受不了这种恐怖，没有等到救援队就自杀了。
山法官
山法官​
(作者) 回复山法官​
(作者) 2020-11-12
soup base-weird-7 崇拜&lt;/p&gt;
&lt;p&gt;小孩的爸爸是一个魔术师，经常表演用刀切开人体后又如没事般地接回，因而小孩以为魔术是真的，有一天便趁爸爸的同事睡着尝试这项魔术，小孩把这个人真的切块了，等到爸爸回来时，小明对爸爸说了一句“怎么把他变回来啊”，爸爸便在绝望和愧疚中自杀了。&lt;/p&gt;
&lt;p&gt;注：改编自网传汤-魔术。
山法官
山法官​
(作者) 回复山法官​
(作者) 2020-11-12
soup base-weird-8 字条&lt;/p&gt;
&lt;p&gt;女儿有精神病，是她杀了妈妈，字条是妈妈写的。但是被撕碎打乱了顺序，正确的排列应该是，爸爸快走，女儿疯了。
山法官
山法官​
(作者) 回复山法官​
(作者) 2020-11-12
soup base-weird-9 勺&lt;/p&gt;
&lt;p&gt;这是一家人，经常有国外亲戚寄过来特产，有天外祖母在国外过世，国外亲戚便寄过来装在罐子里的骨灰，因为和一起保健品放在箱子里，这家人以为也是罐保健品，便在桌子一勺一勺吃了下去，等最后反应过来他们在吃自己的外祖母，所有人惊恐不已，开始呕吐。&lt;/p&gt;
&lt;p&gt;注：来源于BlackStory黑故事微信公众号，另，骨灰属于无机物，严格意义说有害，但是在故事背景中可以说无毒。
山法官
山法官​
(作者) 回复山法官​
(作者) 2020-11-12
soup base-weird-10 迷踪&lt;/p&gt;
&lt;p&gt;一家三口人，小孩先残疾，生下来就是一条腿，他的父母为了让他们的小孩不自卑，所以搬到了深山老林里面生活，为了给孩子营造出人生下来就是一条腿的假象，所以夫妻两个各自也把一条腿剁了，在男主来到里借住后，夫妻两个为了不让孩子发现，所以趁着男主睡着的时候把男主人公的一条腿也切掉了。
山法官
山法官​
(作者) 回复山法官​
(作者) 2020-11-12
soup base-weird-11 绿牙&lt;/p&gt;
&lt;p&gt;男子是一名殡葬师，有梦游症和异食癖，有一次夜间发作去停尸间拖走并吃了一具尸体，受到上司责骂之后为了搞清楚丢失原因，便用绿色颜料在另一具尸体上做了记号，等第二天发现自己嘴里有绿色颜料，才明白是自己吃了两具尸体，便在惊恐中自杀了。
山法官
山法官​
(作者) 回复山法官​
(作者) 2020-11-12
soup base-weird-12 太平间&lt;/p&gt;
&lt;p&gt;故事有三个人，另一个人躺在尸体架上，3个人是医学院的，这天男子B生日，男子A和男子C约定要用特别的方式帮他庆祝，于是C就假扮成尸体，A去让B帮忙抬尸体。到太平间的时候，C突然跳起来并且拿出藏好的生日蛋糕大喊SUPRISE，B于是被吓得心脏病发作而死。
山法官
山法官​
(作者) 回复山法官​
(作者) 2020-11-12
soup base-weird-13 血&lt;/p&gt;
&lt;p&gt;男子住在一家酒店的最顶层，酒店楼顶的蓄水箱被某个杀人犯扔进尸体，但因为处理不当，在沉尸过程中让大量血液流淌进水箱，混在水中。&lt;/p&gt;
&lt;p&gt;注：改编自洛杉矶塞西尔酒店水箱沉尸案。
山法官
山法官​
(作者) 回复山法官​
(作者) 2020-11-12
soup base-weird-14 腐&lt;/p&gt;
&lt;p&gt;我是一名警察，有人报案说楼里好几天一直味道很重，于是来查看情况。其实一个孤寡老人独自在家，养了很多流浪猫，邻居常常头疼于臭味，有天在鱼里下了毒扔到老人门上，想毒死猫，鱼被老人看到后觉得还新鲜就自己吃了，毒发身亡后尸体被猫啃食干净，因为也出不去，所以一只一只死在屋里，慢慢腐烂。
山法官
山法官​
(作者) 回复山法官​
(作者) 2020-11-12
soup base-weird-15 重见天日&lt;/p&gt;
&lt;p&gt;某先生的太太死后下葬多年，先生准备开馆举行捡骨仪式，但是开馆后发现棺盖上全是太太手指甲的抓痕，说明太太在下葬后还活着，在棺材里活活窒息死的，先生想到这里，便在绝望和愧疚中自杀了。
山法官
山法官​
(作者) 回复山法官​
(作者) 2020-11-12
soup base-weird-16 邻居（二）&lt;/p&gt;
&lt;p&gt;我是一个女人，邻居有通感症，具体是对于声音和画面的通感，觉得我的声音像柠檬，因此他看我就像看到了柠檬一样。&lt;/p&gt;
&lt;p&gt;注：本汤源自豆瓣组。&lt;/p&gt;
&lt;p&gt;另，通感症属于神经系统病症，受外界刺激后，正常人一般只有一个感应器官做出应答，而通感症患者有两个或两个以上。
山法官
山法官​
(作者) 回复山法官​
(作者) 2020-11-12
soup base-weird-17 惩罚&lt;/p&gt;
&lt;p&gt;她是我的妻子，惩罚就是吃人肉。我是个变态杀人狂，喜欢用尸体的腐肉做饭菜，这就是我内心的终极秘密，而妻子一无所知。这天她一边吃一边说看透了我的秘密，所以撒谎的惩罚就是继续吃着满桌的人肉饭菜。
山法官
山法官​
(作者) 回复山法官​
(作者) 2020-11-12
soup base-weird-18 病&lt;/p&gt;
&lt;p&gt;家里老爷子重男轻女，从某处得知了偏方，是用同血缘的人的心脏做药引。于是杀了妹妹取了心脏，做好药汤让哥哥喝。哥哥不见妹妹逼问下老爷子说了实情，绝望痛苦中选择自杀。
山法官
山法官​
(作者) 回复山法官​
(作者) 2020-11-13
soup base-weird-19 人影&lt;/p&gt;
&lt;p&gt;我是一个通缉杀人犯，低价购买了这个凶宅用地下室藏尸，我杀人之前先要烫烂他们的眼睛和舌头，这天有一个没被我杀死的人跑了出来，但庆幸的是，他们跑不远。
山法官
山法官​
(作者) 回复山法官​
(作者) 2020-11-29
soup base-weird-20 浪子回头&lt;/p&gt;
&lt;p&gt;我恨死了这个男人。
每天在外面掂花惹草。
在一天家里他沉迷于球赛在怎么叫喊都不搭理我后，怒火让我失去理智，砍下了他的头，转过来放在脖子上面对着我。
我痴迷的看着他如往日般爱我的温顺。
欣喜万分。&lt;/p&gt;
&lt;p&gt;注：改编汤，故事原型取自鬼故事集。&lt;/p&gt;
&lt;p&gt;soup base-ratiocinate-1 线索&lt;/p&gt;
&lt;p&gt;凶手是妻子，因为男子长期吸毒，妻子实在忍受不了想离婚，所以趁男子吸完毒神志不清的时候给他又打了一针，使他晕过去，接着用男子的拇指粘了红色墨水盖章在离婚协议书上面。但是因为剂量过大，男子直接死亡，女子发觉后，不得已营造出一个自杀的场景。但是法医在脚上面找到了男子并不是自杀的线索，因为如果是上吊自杀，脚是没有受到力自然下垂的，尸僵后脚尖是向下的，但是如果是被他杀，尸僵的时候脚部也是正常的。
山法官
山法官​
(作者) 回复山法官​
(作者) 2020-11-13
soup base-ratiocinate-2 富豪&lt;/p&gt;
&lt;p&gt;富豪年事已高，但妻子还风华正茂，和富豪的私人医生出轨了，他们计划了富豪的死亡为夺取财产。富豪很久就得了心脑血管病，长期服用阿司匹林，但由于阿司匹林会慢慢阻碍身体里维c的运输，所以开始缺c。富豪便让私人医生开维生素c的药，但医生这时已经妻子已经串通好了，所以向富豪开的维c药全部换成了安眠药，富豪因为年老体衰，加上服用药物不当让身体进一步恶化，最终因大量食用安眠药而死。&lt;/p&gt;
&lt;p&gt;注：原创主.霹雳火，一篇珍贵的推理作品，使用时请务必尊重作者版权。&lt;/p&gt;
&lt;p&gt;且，心脑血管病属于神经内科，但是具体部位分布非常广泛，有血管、大脑神经、心肺等，而且症状也遍及全身。
山法官
山法官​
(作者) 回复山法官​
(作者) 2020-11-14
soup base-ratiocinate-3 南瓜灯&lt;/p&gt;
&lt;p&gt;我挂的是人头，一个属于我妻子，一个是我的心理医生。现场有四个南瓜灯，两个真的南瓜灯以尸体为灯具。
我亲爱的妻子为了踢走我，拥抱她的真爱，也就是我的心理医生，他们合计以认知性障碍综合征把我送进精神病医院，但万圣节当天，由于我各种题测显示正常，我便被特许回家过节，于是回到家的我完美的撞见了这两个混账的爱情现场。我提起斧头，砍下了他们的头，把他们的头颅刻成了南瓜灯，挂在了我的门前作为万圣节装饰，又把真正的南瓜头灯放在他们的尸体上。毕竟在所有人眼里，我只是一个可怜的认知性障碍精神病人罢了，把头颅当成南瓜灯，又不是我的错啊。
可问题究竟，谁知道我到底有没有病呢，毕竟，那可是我的心理医生亲口说的呀。&lt;/p&gt;
&lt;p&gt;注：原创主.木鱼，极其珍贵的原创作品，使用时请务必尊重作者版权。&lt;/p&gt;
&lt;p&gt;且：把人头做成南瓜头的细节可自行构想在底中。
山法官
山法官​
(作者) 回复山法官​
(作者) 2020-11-14
soup base-ratiocinate-4 白&lt;/p&gt;
&lt;p&gt;我带着我的猫散步，走到一片森林里，大雾弥漫，地上到处散落着白色粉末。我觉得这里不太对劲，想离开这里，但我的猫忽然挣脱我跑了出去，我循着它的方向往森林更深处追去，可等我找到它的时候，看到它正被背对着我的一个男人疯狂虐杀。怒火一瞬间点燃了我的理智，我失控般的举起脚边的石头狠狠的砸向那人的后脑，血液四溅，男人应声倒地。我擦了一把脸上的血，沉默地把猫埋在一旁的树根下。&lt;/p&gt;
&lt;p&gt;我走出迷雾弥漫的森林时，发现已经被警察用枪指着我包围了。在随后漫长的等待中，他们的调研结果出来了，告诉我森林里的白色粉末是一种很强烈的致幻药物，所以推出结论是是我在不慎吸入大量致幻药物后产生了强烈的幻觉，随后杀了男人和猫。
因此我从监管室转入医护室，开始被观察测试后续药反。&lt;/p&gt;
&lt;p&gt;这样的日子持续了多久呢，我已经开始记不清了。
每天醒来时白色占满我的视野。白色的天花板、白色的墙、白色的床单，和在我身边来来往往的白色的制服。我身上仿佛永远满插着连接庞大冰冷的仪器的管子。
最开始的迷茫、进行测试实验时的痛苦、以及永远得不到离开承诺的绝望和永无止境的白色困笼，让我身陷疯狂。&lt;/p&gt;
&lt;p&gt;我睁开眼，茫然的看着眼前的房间。
没有仪器，没有试管，没有一切，仿佛只是做了一个很长的梦，可梦的样子也记不清了，慢慢回想，只恍惚看到在一片黑暗中疯狂奔跑，没有亮光。
“0213号，病症为重度臆想症，现进行本周第四次康复题测，累积第三百八十一次。”
“0213号，基本题测完毕，现开始照例提问。你还记得在森林的事吗。”
“我，我杀了人…和猫。”
“有白色粉末存在吗。”
“……什么粉末。”
“………”
“好，提问完毕，精神恢复程度尚可，预测接近出院时间，0213号，请回去吧。”
我缓缓站起身，浑浊的眼睛扫过房间，最后落到墙壁的铁窗上，有微弱的光。&lt;/p&gt;
&lt;p&gt;“还有什么问题吗，0213号。”
“不……不。”&lt;/p&gt;
&lt;p&gt;我难以置信的盯着医生的面孔。
藏在面罩背后的眼睛闪着奇异的光。
“你是说，你们把我摆弄了这么久，我在这张床上度过了这么长时间，最后得出的结论是我其实得了精神病？”
“很遗憾，但是根据监测数据来说…”
“你们这是谋杀！我有没有病我自己很清楚！”
&quot;那白色粉末呢，我们在森林根本没有找到你说的那种白色粉末。&quot;
“不可能，我之前有抓回来一些…我手上有的，我记得很清楚！”
“那只是您的幻觉，实际上，只是一些碎石罢了。”
“你——”
“请您先去收拾您留在我们这边的衣物吧，转移您的车马上就要到了。”
房间里，我脱下病号服，换上了来这里就匆忙丢进储物柜的衣服，车就到了。&lt;/p&gt;
&lt;p&gt;我看着精神病院的大门，他们把我扔在这里就急匆匆的走了。
我习惯性摸向自己的口袋，一种微妙的触感被我察觉。
我张开手，看到手指上不均匀地分布着一些淡淡的白色粉末，在阳光下微微发亮。
我被骗了。&lt;/p&gt;
&lt;p&gt;我疯了似的高举着手，冲向大门。
大门却开始慢慢合拢。
“我有证据！我不是精神病啊，你们放我出去！你们听我说——”&lt;/p&gt;
&lt;p&gt;坚硬的大门合上缝隙，夹断了最后一丝光。&lt;/p&gt;
&lt;p&gt;侯校官，你明白了吗。
是长官。
请记住，你现在所做的事是正确的，一切为了最高利益，这些都是必要的牺牲。
是长官。
无论如何也要完成任务，不惜一切代价。
是长官，不惜一切代价，完成任务！&lt;/p&gt;
&lt;p&gt;为了暗地研究违背国际惯例的药物，候校官被派命保证任务顺利。
这种药物研究必须在特殊血型的人身上进行试验，而全国范围内拥有该血型的普通人只检测到我一个，因此我被策划进这场演出。
白色粉末是已经研究出的半成品，只在特殊血型的人身上起作用，但是需要接触皮肤，因此他们乘我不在家的时候潜入杀了猫，粉末洒在猫的身上。而回来的我见猫死亡，悲伤中前往附近的森林去埋掉猫的尸体。但药效开始逐渐发作，我进入森林看见的白雾，地面的白粉，逃掉的猫，和正在虐杀猫的人，全部出自药物对我施加的影响。
于是我被顺理成章的开始研究和监测。试验结束后，我被丢进精神病院。
饱受药物折磨的我，在大门合闭的时候，心也成死寂。
我不知道我到底有没有病，他们也不知道，也不必知道。&lt;/p&gt;
&lt;p&gt;我在精神病院中，度日如年的过着每一天。
如果麻木也算一种病。
我已病入膏肓。&lt;/p&gt;
&lt;p&gt;END&lt;/p&gt;
&lt;p&gt;注：原创主.小垂，极其珍贵的原创汤，使用时请务必尊重作者版权。&lt;/p&gt;
&lt;p&gt;又：我从头到尾没有病，药物的影响后遗症也不致疯，但是经历了实验时的痛苦过程后，又被强行关到精神病院，我被反复折磨到一个半疯麻木的状态。
山法官
山法官​
(作者) 回复山法官​
(作者) 2020-11-29
soup base-ratiocinate-5 冲水声&lt;/p&gt;
&lt;p&gt;一家三口是毒贩，男邻居是他们的眼线。他们利用母亲的身体运毒。具体为母亲把带保护的胶囊状毒品吞入腹内，回到家后利用泻药排出，排泄完后取出毒品，用马桶冲走其余的排泄物，然后反复进行直到所有的毒品都排出来。而事发当晚，母亲发现自己怀孕了，于是不想进行催泄，但父亲强逼着让她排毒，儿子听到母亲抗拒的哭喊声后与父亲进行争吵，随即和父亲殴打起来，母亲绝望中在厕所进行催泄，导致流产，且因身体长时间催泻的虚弱，最终失血过多而死。儿子因和母亲的深厚感情，绝望中也跳楼自杀。父亲惊怒之下，先逃到了男邻居那里，让男邻居给警察制造儿子和母亲关系不好的导向，借以拖延警察的查案思路，随后带着所有毒品逃命了。&lt;/p&gt;
&lt;p&gt;注：原创主.润子小姐，一篇可以力顶经典老汤牛吃草的极其珍贵的原创汤，使用时请务必尊重作者版权。&lt;/p&gt;
&lt;p&gt;soup base-tale-1 湖&lt;/p&gt;
&lt;p&gt;我和妻子都热衷潜水，在一次差点把整个家砸烂的感情宣泄后，我决定要永远摆脱她，但我不知道妻子和我下了同样的决定，我邀请妻子去一个人迹罕至的深湖潜水，妻子欣然应允。我们穿齐所有潜水装具，坠离小船，沉入湖面下，湖水幽蓝，湖底漆黑。我准备杀妻子的办法是提前到这片湖底，在湖底一块石头绑了铁链，到时候缠住妻子，让她永远留在湖底，谁也找不到她。当我来到那个地方时候，居然发现我的铁链消失了，而一根铁链无声无息的圈住了我，我愕然回头，对上了妻子潜水镜后冷漠的眼睛。原来妻子准备的手段是暗中跟随提前过来的我，在我离开后下去把铁链藏到别的地方。可妻子这根铁链没有锚，根本留不住我，我想把铁链挣脱开，却忽然呼不上气来，原来妻子趁我寻找铁链的时候在身后关了我的氧气瓶。我绝望的看着妻子向我游来，却惊愕的看见她把铁链也缠在自己身上，我们被铁链拉到一起。
妻子忽然无声的笑了下，轻轻抱住了我。
我不知道的是，妻子的氧气罐在下来之前就一半不到，她根本没打算再回到上面。
人在死亡临近走马灯的时候，会看到记忆深处最深刻的一幕。于是我看到了我们第一次在水底相遇的场景，妻子回到了笑起来像盛开在深水的花一样美丽的年纪，眼里满溢着星光。
同样年轻的我咧着笑容向她游去，湖水清澈，湖底荡漾。
我忽然回抱住我的妻子。
我们在黝黑的湖底紧紧相拥，没有声音，没有冷漠。&lt;/p&gt;
&lt;p&gt;那天晴朗，我对这个女孩说。
要永远，永远爱你。&lt;/p&gt;
&lt;p&gt;注：故事原型取自鬼故事集(具体出处不明)。
山法官
山法官​
(作者) 回复山法官​
(作者) 2020-11-12
soup base-tale-2 圣诞前夜&lt;/p&gt;
&lt;p&gt;我是个保险推销员，临近年底，我为了冲业绩快逼疯了自己，而小女孩的出现让我有了一个大胆的决定，就是杀掉小女孩然后让她的父母产生恐惧，有利于我上门推销保险。为了造成他杀所以我脱掉了女孩的衣服(他杀属于保险范畴，而自杀不属于)，也同样说明钥匙也落入凶手里。在女孩的父母来不及更换钥匙或者逃离城市之前，我开始上门推销。
山法官
山法官​
(作者) 回复山法官​
(作者) 2020-11-12
soup base-tale-3 一百万&lt;/p&gt;
&lt;p&gt;女子长期被家暴，带上家里的100w去找她的情人，但是情人刚好想跟她分手，女子在火车上把装钱的箱子藏好，自己留着钥匙，下火车打电话给情人后得知情况，告诉情人钱和藏的地方后，说想要钥匙，来找我。但因为意外落水而亡，情人在火车找到了箱子，又在几天后找到了女子的尸体，但是由于尸体在水中泡胀，钥匙是项链所以卡进了脖子里面，情人最终也没有找到。
山法官
山法官​
(作者) 回复山法官​
(作者) 2020-11-13
soup base-tale-4 悔&lt;/p&gt;
&lt;p&gt;第一个他是警察，第二个他是纵火犯。男子多年前与女儿失散 ，后来打听到是被一家人把女儿拐走，男子找到这家人，这家人为了隐瞒，就骗他说他的女儿早已经被卖走 ，男子愤怒之下，晚上把整个村子放火烧了，随后自首。后来警察鉴定了，他的女儿就在那个村子里。警察拿出的是死亡名单，男子在里面看到了女儿的名字，悔恨中自杀。
山法官
山法官​
(作者) 回复山法官​
(作者) 2020-11-14
soup base-tale-5 湖（二）&lt;/p&gt;
&lt;p&gt;我说今天天气这么好，一起去划船吧。
男友又和往常一样慢悠悠的说，划什么船啊，逛逛公园还不行啊，好麻烦啊，真的是。
啊，好气，为什么我会找这么一个又懒又麻烦的男朋友啊！&lt;/p&gt;
&lt;p&gt;我扭过头生闷气。
男友无奈的在一旁哄我。
“好啦，咱们这不已经在船上了嘛，别生气啦老婆，我划船你看风景好不好嘛。”
“我之前不想来也不是纯粹因为懒嘛，因为我今天看了天气预报好像会有暴风雨––”
我猛的扭过头来狠狠的盯着男友。
“你还敢狡辩？你就是懒，大懒猪！”
看着男友无奈的眼神，我忽然觉得没意思了。
“不划了，我要回去。”&lt;/p&gt;
&lt;p&gt;好啊，我们回去。&lt;/p&gt;
&lt;p&gt;突如其来的暴雨差点打翻了我们的小船，短短一会天空已经遍布黑云，我在惊慌失措中猛的记起因为匆忙赶来，我不顾男友的劝阻随手指了一支最小的船。
所以现在，小船将倾。
“我们该怎么办啊。”我发现我的声音已经带了哭腔。
“别害怕，我在。”男友的声音从来没有像这样让我觉得安稳。
我看像面色冷静的男友，紧紧揪住的心忽然轻轻松了一下。
可下瞬间小船被一个猛浪打了起来！
我在空中脑海一片空白。
我…就要这么…
可下一刻又回到一个温暖的怀抱里。
男友在我被拍起的瞬间跳过来抓住了我，可他在握桨啊！
我绝望的看着两支桨滑落水里，转瞬即逝。
暴雨中男友好像在说话，可我绝望中一点儿也没听懂，但这些话好像有生命一样，一个一个的钻进我的脑中。
“没事的老婆，你一定能活下去的，幸好你选了这只渔船，我上船前就发现侧面挂着斧头，待会你要自己划过去了，我的宝贝，要坚强，好吗。”
我呆滞的看着男友举起斧头，我忽然明白过来，疯了一样冲过去嚎啕大哭。
“你别––”
“别动，会砍偏的，我们不是说好了吗，要回去的。”
“不行不能这样青你别––”我又被猛浪拍回船框。
“别乱动。”男友严厉的看着我。
我忽然看不懂他的目光了，我以为我早就熟悉了他。他的慵懒、他的随和、和他从没凶过我的回忆一起在这道严厉的目光里消逝不见。
“答应我，和它们一起活着回去。”
血溅出来，和泪光混合一起蒙住了我的眼睛。&lt;/p&gt;
&lt;p&gt;好啊，我们回去。&lt;/p&gt;
&lt;p&gt;我呆滞无神的化着桨。
暴风依然怒吼在我的耳边。
雨点好像小了一点，又好像依然在疯狂的下着。
小船两侧留下血色的线，又很快被汹涌的湖面掩盖。&lt;/p&gt;
&lt;p&gt;你怎么又在偷懒啊，大懒猪，给我起床！
好啦老婆，别闹了让我再睡一会吧，就一会。
睡睡睡，就知道睡！哪天醒不来我看你怎么办！
没事啦，你醒来叫我就好了，我没关系的。&lt;/p&gt;
&lt;p&gt;老婆。
又怎么啦，我才不叫你呢，我走了，哼。
我爱你呀。&lt;/p&gt;
&lt;p&gt;END&lt;/p&gt;
&lt;p&gt;注：原创主之星.小垂汤友的出道作，答主在基础上进行了微不足道的故事加工，原型是她的自身梦境。一篇珍贵的原创汤。&lt;/p&gt;
&lt;p&gt;且：最后是男友把自己两条腿砍下来让女主当船桨，为了减轻船体重量又主动落湖。&lt;/p&gt;
&lt;p&gt;soup base-taste-1 海龟汤&lt;/p&gt;
&lt;p&gt;这个男孩儿跟爸爸一起出海，中途遇到暴风，在弥留之际，爸爸用自己的肉给他熬了一碗汤，骗他的儿子说这是海龟熬成的汤，爸爸牺牲自己保住了孩子的性命。孩子安全上岸之后，去了餐厅点了一碗真正的海龟汤，发现原来不是那个味道，顿时明白了，就自杀了。&lt;/p&gt;
&lt;p&gt;注：网传版本之一，另著名的版本还有“企鹅肉”，基本都是改编自原版“第一碗汤”(收录在第四模板)。
山法官
山法官​
(作者) 回复山法官​
(作者) 2020-11-29
soup base-taste-2 美餐&lt;/p&gt;
&lt;p&gt;我是一只狮子，人类的衣服对我来说就是不能吃的垃圾，今天的垃圾多是因为多了一个大背包，这是一个跳伞的人，因为降落伞没打开摔死在草原里。
山法官
山法官​
(作者) 回复山法官​
(作者) 2020-11-29
soup base-taste-3 蝴蝶结&lt;/p&gt;
&lt;p&gt;小女孩的妈妈有了婚外情，跟情人约定当小女孩的父亲不在家时就给小女孩戴上蝴蝶结作为暗号，以便情人去她家偷情。因为小女孩自己不会系蝴蝶结，所以这个暗号也就一直行之有效。而这天小女孩的老师给小女孩戴上了蝴蝶结，让情人误以为女孩父亲不在家，于是就暴露了，女孩父亲一怒之下杀了情人。
山法官
山法官​
(作者) 回复山法官​
(作者) 2020-11-29
soup base-taste-4 半根火柴&lt;/p&gt;
&lt;p&gt;一群人坐热气球去沙漠旅行，回程途中燃料不足，必须减负，扔完所有行李后还缺多一个人的重量，于是这群人决定用火柴抽签，抽到半根火柴的那个人就自己跳下去。
山法官
山法官​
(作者) 回复山法官​
(作者) 2020-11-29
soup base-taste-5 鞋&lt;/p&gt;
&lt;p&gt;这是一个女人，出门穿了一双高跟鞋，同时也是马戏团表演蒙眼飞镖的员工，这天因为迟到匆忙上台，所以忘了换鞋，由于她的合作搭档之前一直习惯了之前她的身高，在蒙上眼睛后并不知道这个女生由于穿了高跟鞋而改变了高度，所以导致了女生的意外死亡。
山法官
山法官​
(作者) 回复山法官​
(作者) 2020-11-29
soup base-taste-6 苹果&lt;/p&gt;
&lt;p&gt;女孩是单亲家庭，父女之间相处很不和睦，女孩为了缓和关系，特意做了一件苹果雕刻送给父亲，而父亲对女孩的艺术品毫无兴趣，拿到手随口吃了下去，女孩在做雕刻时用于支撑的刀片又忘了取出，于是父亲因利刃割穿喉咙而死。
山法官
山法官​
(作者) 回复山法官​
(作者) 2020-11-29
soup base-taste-7 纸条&lt;/p&gt;
&lt;p&gt;男子在一片沙漠里迷失了道路，给一株仙人掌上贴了纸条用来当路标，可过了很久不知不觉又绕回来后发现了这个贴了纸条的路标，知道自己走不出沙漠了，于是绝望自杀。
山法官
山法官​
(作者) 回复山法官​
(作者) 2020-11-29
soup base-taste-8 海上&lt;/p&gt;
&lt;p&gt;小女孩是台风代号，死在了海上，所有周围陆地上的人都欣喜若狂。
山法官
山法官​
(作者) 回复山法官​
(作者) 2020-11-29
soup base-taste-9 花茶&lt;/p&gt;
&lt;p&gt;男主人邀请他的妻子和朋友在家喝茶，蓝色是妻子的一杯，绿色是他的朋友的一杯。而故事背景中，妻子与男主朋友出轨，妻子以为被男主人察觉了这件事所以提前在他的红色花茶里下了毒药。但男主早已知道妻子了投毒，于是在自己的红色花茶里加了小苏打使其变成蓝色，在妻子的蓝色花茶里加入了柠檬汁变成红色，于是妻子死了。
山法官
山法官​
(作者) 回复山法官​
(作者) 2020-11-29
soup base-taste-10 光&lt;/p&gt;
&lt;p&gt;男主妻子有心脏病，半夜突发心脏衰竭，紧急之下男人送到了家附近最近的一家私立小医院里，妻子用了呼吸机后男子在楼道里等待，光瞬间熄灭说明医院突发了断电，而因为是小医院没有备用电源，所以妻子靠呼吸机维持的生命也熄灭了，男子意识到了无可挽回的这点，所以瞬间崩溃。&lt;/p&gt;
&lt;p&gt;注：改编中忽然很难过的一碗汤。
山法官
山法官​
(作者) 回复山法官​
(作者) 2020-11-29
soup base-taste-11 bird&lt;/p&gt;
&lt;p&gt;他在已经开始降落的飞机上醒来，而这只鸟离飞机只剩一个危险的距离。之前的梦可以理解为对即将发生的事的心理暗示。&lt;/p&gt;
&lt;p&gt;注：改编自焦糖小姐原创汤《一只鸟》，收录自公众号海龟汤推理大师。
山法官
山法官​
(作者) 回复山法官​
(作者) 2020-11-29
soup base-taste-12 救&lt;/p&gt;
&lt;p&gt;女孩穿的凉鞋，里面有小石子，于是靠在一旁想抖出来， 但是她没注意到靠的是电线杆，她身后的男子看她一直再抖，以为被触电了，于是赶紧上来把她拖到，使之脱离发电体，而女孩以为要被坏人强奸，于是拼命呼喊。&lt;/p&gt;
&lt;p&gt;注：收录改编自海龟汤推理大师.焦糖小姐的《少女路边被袭》。
山法官
山法官​
(作者) 回复山法官​
(作者) 2020-11-29
soup base-taste-13 鸡&lt;/p&gt;
&lt;p&gt;老汉是一个精神分裂者，白天他是一个辛苦劳作的农民，晚上他就以为自己是各种动物，有一天晚上他以为自己是一只黄鼠狼，便生吃了一只鸡，第二天依然如此，吃了两只，第三天他吃了三只鸡后，去河边喝水，因为撑的太滚一头栽进河里，淹死了，尸体顺着河流搁浅在下游河岸边被人发现。
山法官
山法官​
(作者) 回复山法官​
(作者) 2020-11-29
soup base-taste-14 天台&lt;/p&gt;
&lt;p&gt;两个人都在精神病院的天台，第一个人手里是块石头，另一个以为自己是块石头，他认为第一个人手里的石头是他的女朋友，他为了去救女朋友也一起扑下天台。
山法官
山法官​
(作者) 回复山法官​
(作者) 2020-11-29
soup base-taste-15 刺&lt;/p&gt;
&lt;p&gt;男子死于自杀。方法是用尖锐的冰锥，冰锥化为水后无影无踪。&lt;/p&gt;
&lt;p&gt;注：收录改编自焦糖小姐的《死后一滩水》。
山法官
山法官​
(作者) 回复山法官​
(作者) 2020-11-29
soup base-taste-16 草地和枪&lt;/p&gt;
&lt;p&gt;男子在雪山下开了一枪，引起雪崩，被淹没后窒息而死，春天雪消融后尸体才被发现在草地上。
山法官
山法官​
(作者) 回复山法官​
(作者) 2020-11-29
soup base-taste-17 碎&lt;/p&gt;
&lt;p&gt;两具尸体是两条鱼，凶手是小男孩，不小心撞碎了鱼缸，哭着跌跌撞撞去找妈妈。
山法官
山法官​
(作者) 回复山法官​
(作者) 2020-11-29
soup base-taste-18 黑&lt;/p&gt;
&lt;p&gt;我回到家后家里太黑，我去开灯，因为家里煤气泄露，在我开灯的一瞬间发生爆炸，我进入了永恒的黑暗里。
山法官
山法官​
(作者) 回复山法官​
(作者) 2020-11-29
soup base-taste-19 出轨&lt;/p&gt;
&lt;p&gt;妻子准备去闺蜜家，而老公和闺蜜出轨。妻子拿着ipad进闺蜜屋后发现wifi自动连接了，而老公说从未进过闺蜜的家，这是ipad里唯一的破绽。
山法官
山法官​
(作者) 回复山法官​
(作者) 2020-11-29
soup base-taste-20 悔&lt;/p&gt;
&lt;p&gt;我是一个临产妇女，又难产而死，按生前遗愿我的眼睛和眼角膜都捐给了别人，受捐者抱着杀人凶手，也就是我的孩子，用我的眼睛看着我的手术记录和死亡证明，流下了眼泪。我并没有死，只不过换了一种方式去看着世界。&lt;/p&gt;
&lt;p&gt;注：收录改编自我们的原创主之星.木鱼小姐的《被杀记录》。
山法官
山法官​
(作者) 回复山法官​
(作者) 2020-11-29
soup base-taste-21 醉酒的人&lt;/p&gt;
&lt;p&gt;醉汉是一名积木爱好者，家里养着一只猴子，他这天由于大醉后睡姿问题，嘴巴张的很大，猴子受主人平时的影响，将他脸上的“洞”理解成了积木底盘，然后将一堆积木硬塞进去，醉汉活生生的在睡梦中窒息而死。&lt;/p&gt;
&lt;p&gt;注：该本在进行中或被引起重口误会，请谨慎使用。
山法官
山法官​
(作者) 回复山法官​
(作者) 2020-11-29
soup base-taste-22 窗内&lt;/p&gt;
&lt;p&gt;我是一个潜水员，我在海底一个漏水严重的潜水艇窗户外面看里面，尸体和物件在水中漂浮。缘由是这艘潜艇曾经发生船难，船舱里最后只剩两个人等待水慢慢淹进来，而手枪里只剩一颗子弹，两人都不想被淹死，所以通过打牌的方式决定谁能用枪自我了断。
山法官
山法官​
(作者) 回复山法官​
(作者) 2020-11-29
soup base-taste-23 溺&lt;/p&gt;
&lt;p&gt;这人在森林的一条河里练习潜水，而恰好附近有片树林突发火灾，被派过来的消防飞机在就近取水的过程中，潜水的人被水泵的离心力吸附，溺水而亡，尸体被卷进水桶，喷洒出去落到森林深处了。
山法官
山法官​
(作者) 回复山法官​
(作者) 2020-11-29
soup base-taste-24 香&lt;/p&gt;
&lt;p&gt;男子是养蜂人，工作的地点就在山林里。由于受强烈刺激的香水味影响，同时男子的熟悉气味也被遮盖，蜜蜂开始表现的具有攻击性，最终引起疯狂蛰叮。&lt;/p&gt;
&lt;p&gt;注：收录改编自焦糖小姐的《致命香水》。
山法官
山法官​
(作者) 回复山法官​
(作者) 2020-11-29
soup base-taste-25 占线音&lt;/p&gt;
&lt;p&gt;修理厂刚刚帮一个女人的车换了轮胎，但匆忙中忘了拧紧螺丝，修理工记起来后赶紧向女人打电话，但每次打过去都是占线，原来女人开出去后一直在接恋人的电话，在路上急转弯时车轮失去控制，于是发生事故。&lt;/p&gt;
&lt;p&gt;注：收录改编自BlackStory黑故事。&lt;/p&gt;
&lt;p&gt;soup base-fairy-1 红皇后的茶话会&lt;/p&gt;
&lt;p&gt;从仙境重回现实世界后，似乎已经过去很久。爱丽丝常常怀疑那是否真的只是一场梦。
她照常去湖边看书。一天在森林里行走时忽然脚下一空，首先是无止境的坠落，紧接着是如此熟悉的、从耳旁穿过的风。&lt;/p&gt;
&lt;p&gt;再度醒来，疯帽子已经站在身前。&lt;/p&gt;
&lt;p&gt;他说，红皇后得知爱丽丝再度擅闯领地后勃然大怒，并下令如果她想离开，必须在茶话会上进行一次抽牌游戏，赢了就就放她走，否则将被砍下头颅。
“别怕，我会帮你的。”疯帽子温柔地抚摸着爱丽丝金色的头发。&lt;/p&gt;
&lt;p&gt;茶话会开始了，侍女把扑克牌铺成一排，红皇后冷笑着说，三次机会，抽中红桃A，就放你走。
爱丽丝连续抽了两张都不是，绝望中记起疯帽子的话，他说买通了侍女，把赢的那张牌放在了第一张。&lt;/p&gt;
&lt;p&gt;爱丽丝翻开了第一张牌，红色的A显露眼前。爱丽丝如释重负的扔给了红皇后。红皇后撇了一眼后，把这张牌扔在地上，侍卫凑上去一看，黑桃A。&lt;/p&gt;
&lt;p&gt;刽子手手起斧落，金色的脑袋滚落在地上。
在爱丽丝因为困惑和恐惧而放大的瞳孔里，映出红皇后残忍肆虐的笑。&lt;/p&gt;
&lt;p&gt;疯帽子欣赏的着这一幕，咬下一口黄油甜饼，陶醉于分泌的多巴胺之中。&lt;/p&gt;
&lt;p&gt;爱丽丝，你还是像以前一样单纯，哪怕自己是红黑色盲，也对这张牌毫无防备。
可是，自从你那次抛下我回到你的世界，我就被思念和哀怨折磨至今。
我真的快被逼疯了。
所以这次，你终于再也不会离开了吧。&lt;/p&gt;
&lt;p&gt;可是我没骗你啊，这张牌，的确是赢牌啊。&lt;/p&gt;
&lt;p&gt;喷涌而出的血液把盛开的玫瑰染得更加娇艳，疯帽子站起来看着爱丽丝，那双空洞的眼睛仿佛还在同自己对视。&lt;/p&gt;
&lt;p&gt;“爱丽丝，乌鸦为什么像写字台。”
“你为什么不留下，永远陪我呢。”&lt;/p&gt;
&lt;p&gt;注：小垂原创，灵感取自自身梦境，极其珍贵的原创作品，请使用时务必尊重作者版权。&lt;/p&gt;
&lt;p&gt;又：爱丽丝梦游仙境原著中，“乌鸦为什么像写字台”是一句表白语，意为喜欢你没有理由。所以汤面中疯帽子的话的大致意思为，现在你知道我有多爱你了吧。&lt;/p&gt;
&lt;p&gt;soup base-event-1 斩手狂&lt;/p&gt;
&lt;p&gt;大海上发生了船难，男主在救生艇上，但是救生艇已经达到承载人数的上限，许多溺水者仍然不断游过来，想要抓住救生艇。为了避免救生艇翻覆，男子只好将溺水者伸出来的手一一砍断。&lt;/p&gt;
&lt;p&gt;注：算是海龟汤第一碗新闻汤，日本的大和战舰沉没时发生过这样的事情，《史记》中春秋时代的晋楚相争也有过记载。
山法官
山法官​
(作者) 回复山法官​
(作者) 2020-11-29
soup base-event-2 溺&lt;/p&gt;
&lt;p&gt;沙漠的这块地方准备修建水坝，从一处溪谷里引来水流，冲进沙漠，流浪汉就是被这么淹死的。&lt;/p&gt;
&lt;p&gt;注：改编自美国历史中著名的城市开发丑闻，二十世纪初，坐落在荒漠上大海边的洛杉矶缺乏淡水，需要修建水库储水，在此背景上，开发商与市政府合作，推出水坝工程，从远处的埃文斯溪谷引水。中间有三点，其一，开发商承包政府工程利润巨大。其二，为让此工程通过，开发商不惜将水库的储水倾倒大海，加剧城市水危机。其三，开发商大面积廉价购买了郊区荒漠，引来的溪水被用来将此地开发成有水之地，因此得以一本万利。该事件导致了埃文斯溪谷干涸，史称强奸埃文斯溪谷事件。
山法官
山法官​
(作者) 回复山法官​
(作者) 2020-11-29
soup base-event-3 冰激凌&lt;/p&gt;
&lt;p&gt;故事发生在美国六七十年代，小孩们总爱钻进老式冰箱玩耍，他的弟弟才6岁，有天躲进冰箱，但是门被意外上锁，他们家的冰箱里只有巧克力味的冰激凌，他那天想吃其他口味的，于是出去买了，弟弟在冰箱无人回应，最终在又冷又窒息的环境中死去。&lt;/p&gt;
&lt;p&gt;注：改编自某新闻案例。&lt;/p&gt;
&lt;p&gt;又：美国六七十年代大部分家庭还是使用老式冰箱，类似于保险柜，冰箱采用门闩系统，外边的门把垂直锁上后，从里面根本无法打开，为了冷藏效率门关上后密不透风，隔音效果也相当优秀，同时阻拦了空气流通，因此注定使藏身其中的人遭受冰冻和窒息的后果。
山法官
山法官​
(作者) 回复山法官​
(作者) 2020-11-29
soup base-event-4 桥&lt;/p&gt;
&lt;p&gt;我是一名黑人，故事发生在美国的开垦年代，我的居所和公园隔着一条河流，本来用于两地之间通行的桥被改建成了白人专用、禁止黑人及乘载黑人的汽车通行。&lt;/p&gt;
&lt;p&gt;注：改编自美国公民权运动前真实事件。
山法官
山法官​
(作者) 回复山法官​
(作者) 2020-11-29
soup base-event-5 线&lt;/p&gt;
&lt;p&gt;装有心脏起搏器的病人在做核磁共振时，起搏器的导线被共振产生的强大磁力折断，导致死亡。&lt;/p&gt;
&lt;p&gt;注：出自新华网2001年8月新闻报道，美国发生的一项真实案例。&lt;/p&gt;
&lt;p&gt;另，起搏器含有金属，因此才能被核磁共振的磁力吸引。
山法官
山法官​
(作者) 回复山法官​
(作者) 2020-11-29
soup base-event-6 男孩&lt;/p&gt;
&lt;p&gt;男孩在接受核磁共振时，检查室里有一个氧气瓶没有被固定好，被强大的磁力吸入仪器内，砸死了男孩。&lt;/p&gt;
&lt;p&gt;注：出自新华网2001年8月新闻报道，美国发生的一项真实案例。&lt;/p&gt;
&lt;p&gt;另，氧气瓶为金属制，会受磁力牵引。
山法官
山法官​
(作者) 回复山法官​
(作者) 2020-11-29
soup base-event-7 口角&lt;/p&gt;
&lt;p&gt;故事在美国旧金山，a是白人，b是黑人，且a一家三口都是强烈的黑人歧视者。
某天，b在街头撞到了a，因此引发了口角纠纷，a对其进行了强烈的种族侮辱。
b因此怀恨在心，跟踪了a几天后，趁a一个人在路上没有防备时背后打晕了a，并带到了自己开的纹身店，把a整个人全部纹成黑色，然后扔到街道上。
a醒来后，踉踉跄跄回到家中，但一进门就吓到了妻子，妻子拼命呼喊救命，还不等a去努力解释，a就背后中枪而死。
原来是a的儿子在卧室听到母亲尖叫声后，拿上猎枪从窗户翻出去绕到了门外，缓缓地将枪口指向了“黑人”的后背。&lt;/p&gt;
&lt;p&gt;注：改编自盖·纳蒂弗的短篇电影《肤色Skin》(曾获91届奥斯卡金像奖）。&lt;/p&gt;
&lt;p&gt;FROM BILIBILI:
①医学院惨案&lt;/p&gt;
&lt;p&gt;汤面：&lt;/p&gt;
&lt;p&gt;在一间医学院里，ABC是舍友，A的成绩很好，是班里的班长。B的身体比较虚弱。有一天有人发现AB的尸体，C疯了，请推理出故事全貌。&lt;/p&gt;
&lt;p&gt;汤底：&lt;/p&gt;
&lt;p&gt;学校最近有一门解剖考试。 A有梦游症，并且可以在梦游中学习知识，所以成绩优秀。因为是班长所以备有解剖室的钥匙，B因为担心考试挂科等大家都睡觉后偷了A的钥匙到解剖室独自练习，身体虚弱的B在练习完后索性睡在了解剖台上连门都没有关。当晚A梦游到了解剖室打算进行“解剖考试”。梦游中的A把B当作实验尸体把四肢绑在解剖台上一点一点的解剖。当A醒来后发现自己已经把B解剖得不堪入目，接受不了事实于是用刀自杀。室友C一早起床发现AB不在，非常担心于是就出去找，直到在开着门的解剖室发现了血肉模糊的B和自杀的A，吓疯了。&lt;/p&gt;
&lt;p&gt;②出不去的厕所&lt;/p&gt;
&lt;p&gt;汤面：&lt;/p&gt;
&lt;p&gt;张三去了趟厕所，结果发现自己出不去了。&lt;/p&gt;
&lt;p&gt;线索：张三的四段内心独白&lt;/p&gt;
&lt;p&gt;...似乎又可以出去了？&lt;/p&gt;
&lt;p&gt;...真的可以出去吗？&lt;/p&gt;
&lt;p&gt;...不行！决不能出去！&lt;/p&gt;
&lt;p&gt;...我想，我应该是出不去了...&lt;/p&gt;
&lt;p&gt;汤底：&lt;/p&gt;
&lt;p&gt;张三发现厕所外面有人在杀人，胆小的张三不敢制止所以出不去了。杀完人凶手好像离开了，所以又说能出去了。结果凶手杀完人其实是去拿了工具又回来分尸装进麻袋，所以又出不去了。这时尸体怨气不散成了鬼，杀了凶手又来杀了厕所里的张三，因为凶手杀人的时候张三没有制止。&lt;/p&gt;
&lt;p&gt;③村子里的怪叫声&lt;/p&gt;
&lt;p&gt;汤面:&lt;/p&gt;
&lt;p&gt;某个村子每家每户过了0点必须关灯，于此同时半夜三更都会传来怪叫声，虽然把全村人都吵醒都没有人出去看。真相是什么？&lt;/p&gt;
&lt;p&gt;汤底：&lt;/p&gt;
&lt;p&gt;村中有个人人皆知的变态杀人狂，行迹神秘且有夜盲症，所以全村人都必须要在晚上关灯。由于杀人狂在没有灯的地方找不到人，于是就用怪叫声来吸引村民夜晚开灯并将其杀死。&lt;/p&gt;
&lt;p&gt;④甜汤命案&lt;/p&gt;
&lt;p&gt;汤面：&lt;/p&gt;
&lt;p&gt;晚饭时，玛丽的爸爸抱怨妈妈做的汤太甜了，当晚，妈妈就死了&lt;/p&gt;
&lt;p&gt;汤底：玛丽是个极端主义者，无法容忍家庭中有任何人对家庭不忠。玛丽最近发现父母的关系没有从前好了，并且还在厨房里发现了毒药，玛丽断定一定是爸爸妈妈之中有一人想毒害自己的伴侣。为了知道谁对这个家不忠，玛丽把毒药换成了糖，结果当晚喝到甜汤的是爸爸，于是玛丽便下毒药将妈妈毒死了。后来玛丽才知道，原来是爸爸想要杀了妈妈，而他已经知道毒药被玛丽发现，于是顺水推舟，让玛丽亲手害死妈妈。&lt;/p&gt;
&lt;p&gt;⑤一杯冰水&lt;/p&gt;
&lt;p&gt;汤面：&lt;/p&gt;
&lt;p&gt;小蔡走进了一家餐厅，要了一杯冰水，&lt;/p&gt;
&lt;p&gt;服务员掏出了枪对准了他，他说了一声谢谢。&lt;/p&gt;
&lt;p&gt;为什么？&lt;/p&gt;
&lt;p&gt;汤底：&lt;/p&gt;
&lt;p&gt;小蔡打嗝难忍，想点一杯冰水止嗝，于是服务员掏出了一把假枪吓他，他的打嗝成功被吓没了，知道真相的小蔡感激不尽。&lt;/p&gt;
&lt;p&gt;(混入了什么奇怪的东西啊喂！)&lt;/p&gt;
&lt;p&gt;⑥敲门声&lt;/p&gt;
&lt;p&gt;汤面：&lt;/p&gt;
&lt;p&gt;小梅和老公小王驾车旅游，深夜在一条山路车抛锚了，小王说要走到前面的镇子里去找一位修理工，小梅先留在车里。在车内看不到外面的情况下，夫妻俩约定小王回来时敲三下车门小梅就开门，过了不久，小梅听到了很多次敲门声但从来都不是三下。请推理出故事全貌。&lt;/p&gt;
&lt;p&gt;汤底：&lt;/p&gt;
&lt;p&gt;小王刚走不久就被守株待兔的变态杀人犯杀了，拖着他的尸体回到了车旁边，把他吊在了旁边的树上，当时风很大，小王的头时常会撞到车门再回弹撞很多次。&lt;/p&gt;
&lt;p&gt;⑦废旧古堡&lt;/p&gt;
&lt;p&gt;汤面：&lt;/p&gt;
&lt;p&gt;我和小伙伴约好一起去废弃的古堡参加万圣节变装派对，结果只剩下了我一个……请推理故事全貌&lt;/p&gt;
&lt;p&gt;汤底：&lt;/p&gt;
&lt;p&gt;我和小伙伴们约定好玩躲猫猫，我找了半天都没在古堡里发现什么好躲的地方。我只好打算躲在假棺材里吓他们一下，结果我等了好久好久，都没有人来，当我想推开棺材盖时，却发现棺材已经被锁上了，这时，我才发现不对劲，我被伙伴们送进了真棺材……&lt;/p&gt;
&lt;p&gt;⑧不敢喝的水&lt;/p&gt;
&lt;p&gt;汤面：&lt;/p&gt;
&lt;p&gt;有一位男子常驻在了一家饭店，某一天他再也不敢喝饭店里的水了，请问为什么？&lt;/p&gt;
&lt;p&gt;汤底：&lt;/p&gt;
&lt;p&gt;某一天，一位女子在这个饭店里失踪了，&lt;/p&gt;
&lt;p&gt;警察找了很久，都找不到。原来是男子杀了这位女子，并把她藏在饭点顶楼的水仓里。&lt;/p&gt;
&lt;p&gt;改编自《蓝可儿事件》&lt;/p&gt;
&lt;p&gt;⑨健身房&lt;/p&gt;
&lt;p&gt;汤面：&lt;/p&gt;
&lt;p&gt;最近来健身房的人越来越少，但老板的心情却越来越好，钱正前几天受伤找老板请假，发现了老板的秘密……请推理故事全貌&lt;/p&gt;
&lt;p&gt;汤底：&lt;/p&gt;
&lt;p&gt;钱正在跑步机上跑步的时候摔倒了，发现跑步机的履带上居然冒着油，仔细一闻居然好像是人油，钱正没再多想来到老板的办公室请假，发现刚才还在的人现在却不见了，没想到在钱正翻看书架时意外打开了老板的密室，眼前的一幕，把钱正吓坏了……&lt;/p&gt;
&lt;p&gt;⑩三兄弟(经 典 永 流 传)&lt;/p&gt;
&lt;p&gt;汤面：&lt;/p&gt;
&lt;p&gt;A和B是一对双胞胎，他们和C关系非常好，三人每天都要睡在同一张床上，有一天A病死了，当晚C把B杀了。请推理出故事全貌&lt;/p&gt;
&lt;p&gt;汤底：&lt;/p&gt;
&lt;p&gt;A病死后，每天晚上睡在A和B中间的C因为心理怪癖无法忍受睡觉时一边没有人，于是把B纵向劈成了两半，睡觉时C在自己的左边放B的右半边，在自己的右边放B的左半边。以保证睡觉时的“安全感”
作者：九十九克游码
https://www.bilibili.com/read/cv9200136/
出处： bilibili&lt;/p&gt;
</content:encoded></item><item><title>远程桌面使用SSL证书</title><link>https://tski.uk/blog/remote-desktop-use-ssl-certificates/</link><guid isPermaLink="true">https://tski.uk/blog/remote-desktop-use-ssl-certificates/</guid><description>让远程桌面使用SSL证书，解决证书错误</description><pubDate>Fri, 30 Apr 2021 19:57:20 GMT</pubDate><content:encoded>&lt;p&gt;远程桌面默认的证书是自签的，会报证书错误，为了安全起见使用CA签的证书。
去腾讯云TrustAsia弄个一年的免费证书，然后下载。因为windows不能识别这玩意，需要先转换成p12格式。
&lt;strong&gt;openssl是git自带的&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; openssl pkcs12 -export -clcerts -in [xxx.pem] -inkey [xxx.key] -out [xxx.p12]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;把.p12文件拷到服务器，然后导入，并记下证书指纹。&lt;/p&gt;
&lt;p&gt;还需要将导入后的密钥设置权限，添加&lt;code&gt;NETWORK SERVICE&lt;/code&gt;用户的Read（读）权限。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;wmic /namespace:\\root\cimv2\TerminalServices PATH Win32_TSGeneralSetting Set SSLCertificateSHA1Hash=&quot;&amp;lt;指纹&amp;gt;&quot; 。
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;重启远程桌面服务，当你重新连接的时候你就会在上面的连接栏看到一把锁的图案，并且没有证书错误提示了。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;net stop termservice &amp;amp;&amp;amp; net start termservice
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>VS静态编译设置</title><link>https://tski.uk/blog/vs-static-compilation-setting/</link><guid isPermaLink="true">https://tski.uk/blog/vs-static-compilation-setting/</guid><description>VS静态编译设置</description><pubDate>Sun, 04 Apr 2021 10:31:13 GMT</pubDate><content:encoded>&lt;p&gt;有时候把自己写的程序拷到其他电脑上运行，会出现缺少msxxxx.dll的提示，这是因为目标电脑上没有安装对应版本的C++运行库。&lt;/p&gt;
&lt;p&gt;这时候要么在目标电脑上安装C++运行库，要么在编译的时候把动态编译（不包含运行库）改成静态编译（自带运行库）。另外，动态编译生成的体积比静态编译下的的体积要小的多。&lt;/p&gt;
&lt;p&gt;首先必须搞清楚项目-&amp;gt;项目属性-&amp;gt;配置属性-&amp;gt;C/C++-&amp;gt;代码生成-&amp;gt;运行库中四个选项的关系：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;显示名&lt;/th&gt;
&lt;th&gt;编译选项&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;多线程调试Dll (/MDd)&lt;/td&gt;
&lt;td&gt;MD_DynamicDebug&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;多线程Dll (/MD)&lt;/td&gt;
&lt;td&gt;MD_DynamicRelease&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;多线程(/MT)&lt;/td&gt;
&lt;td&gt;MD_StaticRelease&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;多线程(/MTd)&lt;/td&gt;
&lt;td&gt;MD_StaticDebug&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;在msdn中有详细解释:
&lt;a href=&quot;http://msdn.microsoft.com/en-us/library/2kzt1wy3(VS.80).aspx&quot;&gt;http://msdn.microsoft.com/en-us/library/2kzt1wy3(VS.80).aspx&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;带有小d的（比如/MDd，/MTd）是Debug模式的。
带有D是动态（/MD，/MDd），带有T是静态（/MT，/MTd）。&lt;/p&gt;
</content:encoded></item><item><title>refs坏处</title><link>https://tski.uk/blog/refs-disadvantage/</link><guid isPermaLink="true">https://tski.uk/blog/refs-disadvantage/</guid><pubDate>Tue, 30 Mar 2021 14:03:26 GMT</pubDate><content:encoded>&lt;p&gt;一年半前把我那块移动硬盘格式化为refs（好玩），用了这么久这玩意，随便写一点有啥缺点吧。（我只说我碰到的，老生常谈的什么无法引导我就省略了）&lt;/p&gt;
&lt;p&gt;首先它不像NTFS那样可以检查错误，它如果碰到文件错误会直接删除，只会在日志上留条记录，不会跟你说一声
其次如果把steam的库文件夹放到这玩意上，我更新窝窝屎的时候老是出现磁盘写入错误，结果发现那个文件在硬盘上已经没有了，但是还是显示在文件上（就是删除的时候会显示什么未找到xxx，请确认之类的）。
兼容性非常差，不同win10之间都读不出来。更新个测试版的系统，发现天天崩溃，想回去用原来的系统，结果发现原来系统读不出来refs盘，最后只能被绑架用这个天天绿屏的玩意。。&lt;/p&gt;
</content:encoded></item><item><title>cobalt-strike笔记</title><link>https://tski.uk/blog/cobalt-strike-notes/</link><guid isPermaLink="true">https://tski.uk/blog/cobalt-strike-notes/</guid><description>随便记一下玩cs踩的坑</description><pubDate>Sat, 27 Mar 2021 21:53:14 GMT</pubDate><content:encoded>&lt;h2&gt;Windows Executeable（s）和&amp;gt;Windows Executeable的区别&lt;/h2&gt;
&lt;p&gt;Windows Executeable（s）对应的是stage(stageless)
Windows Executeable 对应的是stager
stager是一个小程序，作用是下载stage并运行。stage则就是包含了很多功能的大马，用于接受和执行我们控制端的任务并返回结果。
stager通过各种方式下载stage并运行这个过程称为Payload Staging。同样Cobalt strike也提供了类似传统远控上线的方式，把功能打包好直接运行后便可以与teamserver通讯，这个称为Payload Stageless，如果需要生成Stageless，可以直接在Attack-&amp;gt;Package-&amp;gt;Windows Executeable（s）下生成。&lt;/p&gt;
&lt;h2&gt;去除CS证书特征&lt;/h2&gt;
&lt;p&gt;cs证书库默认密码123456，先添加证书，然后再删除默认的证书。&lt;/p&gt;
&lt;p&gt;查看证书&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;keytool -list -v -keystore cobaltstrike.store
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;添加证书&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;keytool -keystore ./cobaltstrike.store -storepass 123456 -keypass 123456 -genkey -keyalg RSA -alias microsoft -dname &quot;CN=microsoft, OU=Microsoft, O=SoftwareSecurity, L=Washington, S=DC, C=US&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;删除默认证书&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;keytool -delete -alias cobaltstrike
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;DSN beacon&lt;/h2&gt;
&lt;p&gt;一般来讲系统有个叫&lt;code&gt;systemd-resolved&lt;/code&gt;的玩意会占用53端口，需要手动解除占用，才能使用cs的dns监听器&lt;/p&gt;
&lt;p&gt;最后用nslook ns1.xxxxx来检验是否配置正确。&lt;/p&gt;
&lt;p&gt;设置listener的时候，DNS Host(Stager)不是一定要填IP地址，可以填上面DNS Host的任意一条就行。&lt;/p&gt;
&lt;h2&gt;使用Cloudflare隐匿C&amp;amp;C&lt;/h2&gt;
&lt;p&gt;去Freenom注册个域名，然后挂到Cloudflare下。&lt;/p&gt;
&lt;p&gt;Cloudflare -&amp;gt; SSL/TLS -&amp;gt; 源服务器 -&amp;gt; 创建证书&lt;/p&gt;
&lt;p&gt;选择PEM格式，把源证书复制下来叫server.pem。私钥复制下来叫server.key。
然后&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;openssl pkcs12 -export -in server.pem -inkey server.key -out cfcert.p12 -name cloudflare_cert -passout pass:123456

sudo keytool -importkeystore -deststorepass 123456 -destkeypass 123456 -destkeystore cfcert.store -srckeystore cfcert.p12  -srcstoretype PKCS12 -srcstorepass 123456 -alias cloudflare_cert
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后在Malleable C2里加上这个&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;https-certificate {
    set keystore &quot;cfcert.store&quot;;
    set password &quot;123456&quot;;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;另外一定要记得修改X-Forwarded-For 头配置，不然上线IP就是Cloudflare的数据中心了。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;http-config {
    set trust_x_forwarded_for &quot;true&quot;;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后可以访问&lt;a href=&quot;https://www.cloudflare.com/ips/&quot;&gt;https://www.cloudflare.com/ips/&lt;/a&gt;，去把cloudflare的地址都加入云服务器的安全组，只允许cloudflare链接。&lt;/p&gt;
</content:encoded></item><item><title>Office E5订阅</title><link>https://tski.uk/blog/office-e5/</link><guid isPermaLink="true">https://tski.uk/blog/office-e5/</guid><description>关于Office E5订阅的申请与续订</description><pubDate>Wed, 17 Mar 2021 14:09:34 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;！！！2024年4月开始，微软开始大规模整治E5，大量封号，建议不要尝试本文方法！！！&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;其实这玩意去年年末我已经开始搞了，中间想写一篇关于如何白嫖的文章，但是我担心没法续订，所以拖到现在才写。&lt;/p&gt;
&lt;h2&gt;什么是Office E5&lt;/h2&gt;
&lt;p&gt;Office 365 开发版 E5 是为开发人员提供的。申请Office 365开发者计划，可以获得为期3个月的免费Office 365 E5。&lt;/p&gt;
&lt;p&gt;注册成功之后可以获得为其90天的全套Office 365，每个人拥有5T Onedrive网盘。
（该许可证最多可添加25个用户，就相当于25个Office 365订阅，5T×25的Onedrive容量）&lt;/p&gt;
&lt;p&gt;快到90天的时候微软如果认为你是开发者，会自动进行续订，再给你90天的订阅时间，并发送一封续订成功的电子邮件。
&lt;strong&gt;网上有人说，如果到了90天之后，微软会给你点时间进行数据备份，然后微软会删除你的数据，到了这个时候就乖乖备份吧（我没到过这个阶段，你可以赌一下）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;顺便晒一下续订成功的邮件
&lt;img src=&quot;https://cdn.jsdelivr.net/gh/Tokisaki-Galaxy/res/post/office-e5/1.jpg&quot; alt=&quot;续订成功邮件&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;申请教程&lt;/h2&gt;
&lt;h3&gt;申请Office E5&lt;/h3&gt;
&lt;p&gt;1.进入&lt;a href=&quot;https://developer.microsoft.com/zh-cn/microsoft-365/dev-program&quot;&gt;官网&lt;/a&gt;后，点击立即加入。
&lt;img src=&quot;https://cdn.jsdelivr.net/gh/Tokisaki-Galaxy/res/post/office-e5/2.jpg&quot; alt=&quot;立即加入&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;用自己的微软账户登录&lt;/h3&gt;
&lt;h3&gt;登录之后填写国家地区、基本信息就不说了，自己写就好了&lt;/h3&gt;
&lt;h3&gt;创建订阅&lt;/h3&gt;
&lt;p&gt;这一步很关键，&lt;/p&gt;
&lt;p&gt;第一个国家的意思是你的onedrive数据等存储位置。比如我选择US，那么我的数据就是放在美国的微软数据中心。所以根据你自己的真实位置去选择。（当然一般建议如果都很远就选美国，因为美国的网络基础建设很好，以后搭网盘也快一点）&lt;/p&gt;
&lt;p&gt;第二个用户名随意，admin或者root再或者iamsb随便挑。&lt;/p&gt;
&lt;p&gt;第三个域名，是登录时的后缀。是由microsoft给你的免费二级域名。其实也是个邮箱地址的后缀。&lt;/p&gt;
&lt;p&gt;随便写一个自己喜欢的就好，只要不是已经被注册的就行。但是注意，这个注册完就不能改了。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/Tokisaki-Galaxy/res/post/office-e5/3.jpg&quot; alt=&quot;创建订阅&quot; /&gt;
然后会让你验证一个手机号。用国内的也行。&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;添加许可证&lt;/h3&gt;
&lt;p&gt;接着上面，验证完手机号之后你会跳转到&lt;a href=&quot;https://developer.microsoft.com/zh-cn/microsoft-365/profile&quot;&gt;这个页面&lt;/a&gt;，&lt;strong&gt;（当然你应该是显示91天，我这里是因为续订了，才显示120天）&lt;/strong&gt;。点击那个用红框框出来的按钮，进入后台。
&lt;img src=&quot;https://cdn.jsdelivr.net/gh/Tokisaki-Galaxy/res/post/office-e5/4.jpg&quot; alt=&quot;转到订阅&quot; /&gt;&lt;/p&gt;
&lt;p&gt;现在，我们已经申请好了E5订阅了。如果你只是自己用，现在已经可以使用“用户名@域.onmicrosoft.com”和之前设置的密码登录你电脑上的Office和Onedrive了。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;进后台最好挂个梯子，不然国内有些地区加载不了。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;进入 管理 - &amp;gt; 用户 -&amp;gt; 活跃用户 -&amp;gt; 点击用户名 -&amp;gt; 许可证和用户 ,添加好后点击应用就可以了
&lt;img src=&quot;https://cdn.jsdelivr.net/gh/Tokisaki-Galaxy/res/post/office-e5/5.jpg&quot; alt=&quot;“管理”按钮在哪&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;Onedrive网盘&lt;/h3&gt;
&lt;h4&gt;&lt;strong&gt;设置5T网盘容量&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;默认onedrive容量是1T，但是可以通过设置更改为5T。（强烈建议去改成5T）&lt;/p&gt;
&lt;p&gt;一个域名下最多有25个用户，所以最多有25*5T=125T的云存储空间。还可以改回收站保留时间。&lt;/p&gt;
&lt;p&gt;修改默认容量大小：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;打开微软365管理中心，&lt;a href=&quot;https://admin.microsoft.com/&quot;&gt;点击前往✈&lt;/a&gt; 登陆上你的E5管理员账号。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;点击左侧下方的全部显示，点击展开后显示的“SharePoint”，点击打开，选到左边设置，就可以修改默认Onedrive分配大小。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/Tokisaki-Galaxy/res/post/office-e5/6.jpg&quot; alt=&quot;修改默认分配大小&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;其他自己去慢慢探索吧，就不详细说了。&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;零零碎碎的其他注意事项&lt;/h3&gt;
&lt;p&gt;最好给&lt;a href=&quot;admin.microsoft.com&quot;&gt;管理员控制面板&lt;/a&gt;加个书签，免得找不到&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;自动续订教程&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Office E5订阅第一次订阅有效期是90天，到期后会进行一次检测，以此判断你是否有资格继续白嫖。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;无限续期的原理是多次调用API来达到让microsoft认为你是开发者，然后给你白嫖（自动续期）E5的效果。所以续订不是100%成功的，要看巨硬心情。&lt;/p&gt;
&lt;p&gt;（虽然挺大概率成功的，但总归要提醒一下，以防万一&lt;/p&gt;
&lt;h3&gt;Telegram法&lt;/h3&gt;
&lt;p&gt;首推这个方法，最简单的。
添加&lt;a href=&quot;https://t.me/E5Sub_bot&quot;&gt;这个机器人&lt;/a&gt;，然后按提示一步一步走就行了，记得设机器人为免打扰，不然吵死你。&lt;/p&gt;
&lt;h3&gt;Github Actions法&lt;/h3&gt;
&lt;p&gt;论Github Actions的无数种用法。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/ishadows/AutoApiP&quot;&gt;传送门&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;根据教程一步一步做就行了，挺简单的。&lt;/p&gt;
&lt;h3&gt;OneIndex法&lt;/h3&gt;
&lt;p&gt;这个严格来说不能算一个单独的续订方法，续订只是它的一个副产品而已，但是也顺便加上了（毕竟怎么说都是能续订的）。&lt;/p&gt;
&lt;p&gt;这个说的东西有点多，有空哪天再开个坑详细讲吧。这个玩意已经算是个Onedrive的第三方客户端了。今天彩六新赛季，要去上分了。&lt;/p&gt;
</content:encoded></item><item><title>《C++入门经典（第10版）》学习笔记</title><link>https://tski.uk/blog/c-study-notes/</link><guid isPermaLink="true">https://tski.uk/blog/c-study-notes/</guid><description>记录学习《C++入门经典（第10版）》过程中一些重要的知识点和心得，适合自学者参考。</description><pubDate>Sat, 13 Mar 2021 17:36:42 GMT</pubDate><content:encoded>&lt;p&gt;写在学《C++入门经典（第10版）》的时候，主要是记录一些以前没有注意，不知道的地方。&lt;/p&gt;
&lt;p&gt;强力安利这本书，讲的浅显易懂，而且使用的技术都比较新，非常适合自学的人。&lt;/p&gt;
&lt;p&gt;全文都是我一个字一个字打上来的，为了省事，会适量忽略一些不重要信息（比如要包含声明头文件，反正vs有提示，就不打了）。&lt;/p&gt;
&lt;h2&gt;第2章 C++基础知识&lt;/h2&gt;
&lt;h3&gt;转义序列&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;名称&lt;/th&gt;
&lt;th&gt;转义序列&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;换行符&lt;/td&gt;
&lt;td&gt;\n&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;水平制表符&lt;/td&gt;
&lt;td&gt;\t&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;响铃符&lt;/td&gt;
&lt;td&gt;\a&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;反斜杠&lt;/td&gt;
&lt;td&gt;\&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;双引号&lt;/td&gt;
&lt;td&gt;&quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;此外， C++11 支持&lt;strong&gt;原始字符串字面值&lt;/strong&gt;，适合于有大量字符需要转义的情况。
要求以&lt;code&gt;R&lt;/code&gt;开头，而且字符串内容要放到圆括号内，圆括号外还要再加一对双引号。
以下代码输出字符串字面值 &quot;c:\Windows&quot;。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cout &amp;lt;&amp;lt; R&quot;(c:\Windows\)&quot;;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;格式化带小数点的数字&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;#%E7%94%A8%E6%B5%81%E5%87%BD%E6%95%B0%E6%A0%BC%E5%BC%8F%E5%8C%96%E8%BE%93%E5%87%BA&quot;&gt;传送门&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;第3章 更多的控制流程&lt;/h2&gt;
&lt;h3&gt;枚举类型（选读）&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;枚举类型&lt;/strong&gt;是值用一组 int 类型的常量来定义的类型。枚举类型就像是包含了一组声明常量的列表。
枚举类型中，两个或更多的命名常量可接受同一个 int 值。
如果不指定任何数值，枚举类型中的标识符会被自动分配一组连续的值，这些值的第一个是0，其余常量是上一个值增加1——除非显式指定了一个或多个枚举常量的值。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;enum Direction { NORTH = 0, SOUTH = 1, EAST = 2, WEST = 3 }
enum Direction { NORTH, SOUTH, EAST, WEST }
//以上两条语句等价。
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;C++11 中引入了一种新的枚举，称为&lt;strong&gt;强枚举&lt;/strong&gt;或&lt;strong&gt;枚举类&lt;/strong&gt;。
为定义强枚举，在 enum 后添加关键字 class 就可以了。&lt;/p&gt;
&lt;h3&gt;再论递增操作符和递减操作符&lt;/h3&gt;
&lt;p&gt;++在变量之前，先递增再返回值；++在变量之后，先返回值再递增。&lt;/p&gt;
&lt;h2&gt;第4章 过程抽象和返回值的函数&lt;/h2&gt;
&lt;h3&gt;一些预定义函数&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;名称&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;sqrt&lt;/td&gt;
&lt;td&gt;平方根&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;pow&lt;/td&gt;
&lt;td&gt;乘方（幂）（实参，返回值均为 double ）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;abs&lt;/td&gt;
&lt;td&gt;取 int 的绝对值&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;labs&lt;/td&gt;
&lt;td&gt;取 long 的绝对值&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;fabs&lt;/td&gt;
&lt;td&gt;取 double 的绝对值&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ceil&lt;/td&gt;
&lt;td&gt;向上取整&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;floor&lt;/td&gt;
&lt;td&gt;向下取整&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;srand&lt;/td&gt;
&lt;td&gt;为随机数生成器提供种子值&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;rand&lt;/td&gt;
&lt;td&gt;随机数&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;强制类型转换&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;static_cast&amp;lt;目标类型&amp;gt;(表达式);
// int 转 double
static_cast&amp;lt;double&amp;gt;(3);

//强制类型转换的古老形式
类型名(表达式);
double(3);

//虽然说要尽量使用第一种，但是第二种打的字少一些，所以...
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;另一种形式的函数声明&lt;/h3&gt;
&lt;p&gt;函数声明中不一定要列出形参名称，以下两个函数声明等价：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;double abc(int a, double b);
double abc(int, double);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;但应坚持使用第一种形式，以确保可读性。&lt;/p&gt;
&lt;h2&gt;第5章 用函数完成所有子任务&lt;/h2&gt;
&lt;h3&gt;传引用参数&lt;/h3&gt;
&lt;p&gt;有时候有奇效，用起来超级舒服。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// 普通的（传值调用函数）声明方法
int abc(int a);
// 传引用函数声明方法
int abc(int&amp;amp; a);
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;第6章 I/O流——对象和类入门&lt;/h2&gt;
&lt;h3&gt;文件I/O&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;using namespace std;
ifstream inStream;
ofstream outStream;

inStream.open(&quot;infile.dat&quot;);
outStream.open(&quot;outfile.dat&quot;);

inStream.close();
outStream.close();
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;追加到文件（选读）&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;ofstream fout;
fout.open(&quot;data.txt&quot;,ios::app);
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;用流函数格式化输出&lt;/h3&gt;
&lt;p&gt;每个输出流的成员函数（部分）：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;标志&lt;/th&gt;
&lt;th&gt;含义&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;precision()&lt;/td&gt;
&lt;td&gt;指定小数点后不同位数&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;setf()&lt;/td&gt;
&lt;td&gt;设置标志&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;width()&lt;/td&gt;
&lt;td&gt;输出项占多少个空格（域宽）（用于左右对齐）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;setf()的格式化标志：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;标志&lt;/th&gt;
&lt;th&gt;含义&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;ios::fixed&lt;/td&gt;
&lt;td&gt;不用科学计数法&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ios::scientific&lt;/td&gt;
&lt;td&gt;用科学计数法&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ios::showpoint&lt;/td&gt;
&lt;td&gt;显示浮点数后面所有0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ios::showpos&lt;/td&gt;
&lt;td&gt;正整数之前会输出正号&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ios::right&lt;/td&gt;
&lt;td&gt;右对齐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ios::left&lt;/td&gt;
&lt;td&gt;左对齐&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;任何标志都可以使用unsetf()取消。&lt;/p&gt;
&lt;h3&gt;操纵元&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;标志&lt;/th&gt;
&lt;th&gt;含义&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;endl&lt;/td&gt;
&lt;td&gt;这个不说了&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;setw&lt;/td&gt;
&lt;td&gt;和width完全一样&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;setprecision&lt;/td&gt;
&lt;td&gt;和precision完全一样&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;这玩意感觉挺多余的。。&lt;/p&gt;
&lt;h3&gt;字符串I/O&lt;/h3&gt;
&lt;p&gt;put(),get(),putback()&lt;/p&gt;
&lt;h4&gt;万用型流参数&lt;/h4&gt;
&lt;p&gt;适用于有时候是cin，有时候是输入文件流的情况。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;名称&lt;/th&gt;
&lt;th&gt;关键字&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;输入流&lt;/td&gt;
&lt;td&gt;istream&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;输出流&lt;/td&gt;
&lt;td&gt;ostream&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4&gt;函数的默认实参（选读）&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;void newLine(istream&amp;amp; inStream = cin);
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;检查文件结尾&lt;/h4&gt;
&lt;p&gt;方法1：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;double next, sum = 0;
int count = 0;
while (inStream &amp;gt;&amp;gt; next)
{
    sum += next;
    count++;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;方法2：
eof成员函数。&lt;/p&gt;
&lt;h4&gt;预定义字符函数&lt;/h4&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;h2&gt;第7章 数组&lt;/h2&gt;
&lt;h3&gt;C++11基于范围的for语句&lt;/h3&gt;
&lt;p&gt;C++11中一种新的for循环，用于快速遍历数组元素。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;int arr[]={1,2,3,4,5};
for(auto i : arr)
    cout&amp;lt;&amp;lt;i;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;甚至可以这样&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;int arr[]={1,2,3,4,5};
for(int&amp;amp; i : arr)
    i++;
for(int i : arr)
    cout&amp;lt;&amp;lt;i;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;整个数组作为函数参数&lt;/h3&gt;
&lt;p&gt;和传引用参数用法差不多。
&lt;strong&gt;为了防止不经意间的修改，一般使用const修饰。&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;第8章 字符串和向量&lt;/h2&gt;
&lt;h3&gt;预定义C字符串函数&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;函数&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;th&gt;提示&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;strcpy(Target_string,Src_string)&lt;/td&gt;
&lt;td&gt;将Src_string中的值复制到Target_string中&lt;/td&gt;
&lt;td&gt;不检查Target_string中最大可存储的容量&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;strcat(Target_string,Src_string)&lt;/td&gt;
&lt;td&gt;将Src_string中的值连接到Target_string末尾&lt;/td&gt;
&lt;td&gt;不检查Target_string中最大可存储的容量&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;strlen(Src_string)&lt;/td&gt;
&lt;td&gt;返回Src_string长度的整数（空字符&apos;\0&apos;不计算在内）&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;strcmp(String_1, String_2)&lt;/td&gt;
&lt;td&gt;如果两个字符串相等，就返回0&lt;/td&gt;
&lt;td&gt;如果相等，会返回0，它会转换成false。注意这可能与你想象的相反。&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;如果需要检查Target_string中最大可存储的容量，可以使用例如strcpy_s，后面带_s的函数。&lt;/p&gt;
&lt;h3&gt;标准string类&lt;/h3&gt;
&lt;h4&gt;getline成员函数&lt;/h4&gt;
&lt;p&gt;有两个版本&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;istream&amp;amp; getline(istream&amp;amp; ins, string&amp;amp; strVar, char delimiter);
istream&amp;amp; getline(istream&amp;amp; ins, string&amp;amp; strVar);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;第一个版本允许你自定义定界符，第二个版本默认定界符为&apos;\n&apos;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;注意，混用cin和getline的时候需要注意，cin会把&apos;\n&apos;给getline，导致getline读到空字符串。&lt;/strong&gt;&lt;/p&gt;
&lt;h4&gt;成员函数&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;示例&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;元素访问&lt;/strong&gt;&amp;lt;br&amp;gt;str[i]&amp;lt;br&amp;gt;str.at(i)&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;str.substr(position, length)&amp;lt;br&amp;gt;str,length()&lt;/td&gt;
&lt;td&gt;&amp;lt;br&amp;gt;返回对索引i处的引用，不检查非法索引&amp;lt;br&amp;gt;和上面一样，但是这个版本会检查非法索引&amp;lt;br&amp;gt;返回调用对象的一个子字符串，从position开始，含有length个字符&amp;lt;br&amp;gt;返回长度&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;赋值/修改&lt;/strong&gt;&amp;lt;br&amp;gt;str.empty()&amp;lt;br&amp;gt;str.insert(pos, str2)&amp;lt;br&amp;gt;str.erase(pos, length)&lt;/td&gt;
&lt;td&gt;&amp;lt;br&amp;gt;如果str为空字符串，就返回true，否则返回false&amp;lt;br&amp;gt;在str的pos处插入str2&amp;lt;br&amp;gt;删除长度为length的子字符串，从pos处开始&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;查找&lt;/strong&gt;&amp;lt;br&amp;gt;str.find(str1)&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;str.find(str1, pos)&amp;lt;br&amp;gt;str.find_first_of(str1, pos)&amp;lt;br&amp;gt;str.find_first_not_of(str1, pos)&lt;/td&gt;
&lt;td&gt;&amp;lt;br&amp;gt;返回str1在str中首次出现的索引。如果str1没找到，返回特殊值string::npos&amp;lt;br&amp;gt;返回str1在str中首次出现的索引，从pos出开始查找&amp;lt;br&amp;gt;返回str1的任何字符在str中首次出现的索引，从pos处开始查找&amp;lt;br&amp;gt;返回不属于str1的任何字符在str中首次出现的索引，从pos处开始查找&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4&gt;小细节&lt;/h4&gt;
&lt;p&gt;赋值操作不适应于C字符串，所以下面这个看似合法的语句其实是非法的。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;aCString = stringVariable.c_str();  //非法
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;字符串转换&lt;/h4&gt;
&lt;p&gt;C++11下的函数（C++11前滚）
转化到数字
stof(不会吧还有人用float),stod,stoi,stol
各种奇怪的类型转换为字符串
to_string&lt;/p&gt;
&lt;h3&gt;向量&lt;/h3&gt;
&lt;p&gt;最喜欢的功能之一，必须拥有名字，安排上。
&lt;em&gt;可以自动扩充还一下子就知道长度的高级数组谁不喜欢呢&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;第9章 指针和动态数组&lt;/h2&gt;
&lt;h3&gt;基本内存管理&lt;/h3&gt;
&lt;p&gt;new完了记得要delete。
另外delete之后的虚悬指针记得要指向nullptr。&lt;/p&gt;
</content:encoded></item><item><title>jsdelivrCDN使用方法</title><link>https://tski.uk/blog/jsdelivr-cdn/</link><guid isPermaLink="true">https://tski.uk/blog/jsdelivr-cdn/</guid><description>jsdelivrCDN使用方法</description><pubDate>Sun, 28 Feb 2021 11:22:15 GMT</pubDate><content:encoded>&lt;p&gt;博客上用了很多js和css，如果都通过服务器加载，加载速度会很慢（一开始我用这个主题，GithubPages托管的时候，第一次加载用来40s+）。所以需要把js和css文件放到CDN上。
我知道的公共CDN有&lt;a href=&quot;https://www.bootcdn.cn/&quot;&gt;BootCDN&lt;/a&gt;和&lt;a href=&quot;https://www.jsdelivr.com/&quot;&gt;JSDELIVR&lt;/a&gt;。
jsdelivr可以直接加载github上的文件，bootcdn不行。
我原来使用的是BootCDN，但是这玩意比jsdelivr慢，并且只能用官方的库，所以改用了jsdelivr。&lt;/p&gt;
&lt;h2&gt;jsdelivr的加载方法&lt;/h2&gt;
&lt;h3&gt;Github&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;一言蔽之，就是&lt;code&gt;https://cdn.jsdelivr.net/gh/用户名称/仓库名称@版本号/目录&lt;/code&gt;。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;详细版：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// 加载任何GitHub的发布、提交或分支
// 注意:我们建议在支持npm的项目中使用npm
https://cdn.jsdelivr.net/gh/user/repo@version/file

// 加载 jQuery v3.2.1
https://cdn.jsdelivr.net/gh/jquery/jquery@3.2.1/dist/jquery.min.js

// 使用一个版本范围而不是特定的版本
https://cdn.jsdelivr.net/gh/jquery/jquery@3.2/dist/jquery.min.js
https://cdn.jsdelivr.net/gh/jquery/jquery@3/dist/jquery.min.js

// 完全省略版本以获得最新的版本
// 你不应该在生产中使用它
https://cdn.jsdelivr.net/gh/jquery/jquery/dist/jquery.min.js

// 添加 &quot;.min&quot; 到任何js/css文件
// 如果它不存在，我们将为您生成它（并帮你压缩
https://cdn.jsdelivr.net/gh/jquery/jquery@3.2.1/src/core.min.js

// 在末尾添加 &quot;/&quot; 以获得目录列表
https://cdn.jsdelivr.net/gh/jquery/jquery/
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;npm&lt;/h3&gt;
&lt;p&gt;gh换成npm，没有用户名。其他不变。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;https://cdn.jsdelivr.net/npm/包名@版本号/目录
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;刷新CDN&lt;/h2&gt;
&lt;p&gt;把链接中的&lt;code&gt;https://cdn.jsdelivr.net/&lt;/code&gt;换成&lt;code&gt;https://purge.jsdelivr.net/&lt;/code&gt;就行了。&lt;/p&gt;
</content:encoded></item><item><title>cron表达式结构</title><link>https://tski.uk/blog/cron-expressions/</link><guid isPermaLink="true">https://tski.uk/blog/cron-expressions/</guid><description>cron表达式结构</description><pubDate>Sun, 28 Feb 2021 11:03:44 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;工具型软件cron是一款类Unix的操作系统下的基于时间的任务管理系统。用户们可以通过cron在固定时间、日期、间隔下，运行定期任务（可以是命令和脚本）。cron常用于运维和管理，但也可用于其他地方，如：定期下载文件和邮件。cron该词来源于希腊语chronos（χρόνος），原意是时间。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;cron表达式结构&lt;/h2&gt;
&lt;h3&gt;一般形式&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;/&lt;/th&gt;
&lt;th&gt;第一位&lt;/th&gt;
&lt;th&gt;第二位&lt;/th&gt;
&lt;th&gt;第三位&lt;/th&gt;
&lt;th&gt;第四位&lt;/th&gt;
&lt;th&gt;第五位&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;内容&lt;/td&gt;
&lt;td&gt;分钟&lt;/td&gt;
&lt;td&gt;小时&lt;/td&gt;
&lt;td&gt;日&lt;/td&gt;
&lt;td&gt;月&lt;/td&gt;
&lt;td&gt;星期&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;取值范围&lt;/td&gt;
&lt;td&gt;0-59&lt;/td&gt;
&lt;td&gt;0-23&lt;/td&gt;
&lt;td&gt;1-31&lt;/td&gt;
&lt;td&gt;1-12&lt;/td&gt;
&lt;td&gt;0-6（周日为0）（如果不确定填?)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;月也可以写成JAN,FEB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV,DEC。&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;星期也可以写成SUN,MON,TUE,WED,THU,FRI,SAT。&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;注意，范围必须为int整数。&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;特殊形式&lt;/h3&gt;
&lt;p&gt;有一些地方会用到，&lt;strong&gt;比起一般形式没有秒和年，其余一样&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;/ | 第一位 | 第二位 | 第三位 | 第四位 | 第五位
---|---|---|---|---|--|--|--
内容 | 分钟 | 小时 | 日 | 月 | 星期
取值范围|0-59|0-23|1-31|1-12|0-6（周日为0）（如果不确定填?)|1970-2099&lt;/p&gt;
&lt;h2&gt;通配符&lt;/h2&gt;
&lt;p&gt;cron表达式结构所有值，所有形式一般均支持通配符。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;/&lt;/th&gt;
&lt;th&gt;含义&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;*&lt;/td&gt;
&lt;td&gt;任何。例如填在月份里，就是每个月的意思&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;/&lt;/td&gt;
&lt;td&gt;整除，第一个值表开始的时间，第二个是除数。例如在秒里填上&lt;code&gt;1-20&lt;/code&gt;，1，21，41，1，21，41这样轮下去。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;周期，第一个值表开始，第二个结束。例如在月份里填上&lt;code&gt;1-4&lt;/code&gt;，就是1，2，3，4这四个月。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;,&lt;/td&gt;
&lt;td&gt;列举。例如在月份里填上&lt;code&gt;4,6,7,8&lt;/code&gt;，就是4，6，7，8这四个月。&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;在线Cron表达式解释生成&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://cron.qqe2.com/&quot;&gt;https://cron.qqe2.com/&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>美化Windows Terminal</title><link>https://tski.uk/blog/beautify-windows-terminal/</link><guid isPermaLink="true">https://tski.uk/blog/beautify-windows-terminal/</guid><description>美化Windows Terminal</description><pubDate>Sat, 27 Feb 2021 08:42:48 GMT</pubDate><content:encoded>&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/Tokisaki-Galaxy/res/post/beautify-windows-terminal/1.webp&quot; alt=&quot;最后的效果&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;安装Windows Terminal&lt;/h2&gt;
&lt;p&gt;有两种下载方法，去&lt;a href=&quot;https://github.com/microsoft/terminal/releases&quot;&gt;Github&lt;/a&gt;或者Windows Store。
建议去Windows Store下，可以自动更新。&lt;/p&gt;
&lt;h3&gt;更新Windows Powershell&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;这一步是可选的&lt;/strong&gt;
Windows自带的是万年不变的5.0，可以更新到新的版本，目前为止，最新的LTS长期支持是7.0.5版本。
&lt;a href=&quot;https://aka.ms/PSWindows&quot;&gt;更新方法&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;更改Windows Terminal配色方案&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.microsoft.com/zh-cn/windows/terminal/customize-settings/color-schemes&quot;&gt;https://docs.microsoft.com/zh-cn/windows/terminal/customize-settings/color-schemes&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;设置脚本运行权限&lt;/h2&gt;
&lt;p&gt;默认是禁止所有脚本运行，可以通过&lt;code&gt;Get-ExecutionPolicy&lt;/code&gt;来查看当前脚本运行策略，然后通过&lt;code&gt;Set-ExecutionPolicy&lt;/code&gt;来设置新的策略。
可选的策略&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Restricted——默认的设置， 不允许任何script运行
AllSigned——只能运行经过数字证书签名的script
RemoteSigned——运行本地的script不需要数字签名，但是运行从网络上下载的script就必须要有数字签名
Unrestricted——允许所有的script运行
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;可以输入&lt;code&gt;Set-ExecutionPolicy all&lt;/code&gt;来使用&lt;code&gt;AllSigned&lt;/code&gt;策略，即允许只输入前面几个字符。&lt;/p&gt;
&lt;p&gt;为了之后的美化设置，我们需要设置为&lt;code&gt;RemoteSigned&lt;/code&gt;。
输入&lt;code&gt;Set-ExecutionPolicy remote&lt;/code&gt;即可。&lt;/p&gt;
&lt;h2&gt;安装美化模块&lt;/h2&gt;
&lt;h3&gt;安装模块命令语法&lt;/h3&gt;
&lt;p&gt;Powershell下安装模块的命令
&lt;code&gt;Install-Module [moudel name]&lt;/code&gt;
&lt;code&gt;Install-Module [moudel name] -Scope CurrentUser  #只为当前用户安装&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;安装模块&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;Install-Module posh-git
Install-Module oh-my-posh
Install-Module DirColors  #让 ls (Get-ChildItem) 像 Unix 系终端一样具有多彩色
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;加载模块与设置主题&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;注意，加载主题的命令是&lt;code&gt;Set-PoshPrompt -Theme powerline&lt;/code&gt;，而不是&lt;code&gt;Set-Theme powerline&lt;/code&gt;！！！&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Import-Module DirColors
Import-Module posh-git
Import-Module oh-my-posh
Set-PoshPrompt -Theme powerline
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://ohmyposh.dev/docs/&quot;&gt;这里是oh-my-posh的链接&lt;/a&gt;，放在这里给有可能需要的人用。
这时已经可以看到美化后的终端了，但是关闭后就会重置之前的设置，所以需要把刚才这几段命令放到每次打开终端自动加载的脚本里。&lt;/p&gt;
&lt;h2&gt;保存设置&lt;/h2&gt;
&lt;h3&gt;为你一个用户保存&lt;/h3&gt;
&lt;p&gt;输入&lt;code&gt;$PROFILE&lt;/code&gt;，然后它会显示你个人用户每次打开终端自动运行的脚本，然后用notepad编辑那个文件，把下面这一段添加进去。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Import-Module DirColors
Import-Module posh-git
Import-Module oh-my-posh
Set-PoshPrompt -Theme powerline
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;为这台电脑上所有用户保存&lt;/h3&gt;
&lt;p&gt;一样的操作，只不过要修改的文件在&lt;code&gt;&quot;%windir%\system32\WindowsPowerShell\v1.0\Microsoft.PowerShell_profile.ps1&quot;&lt;/code&gt;。&lt;/p&gt;
&lt;h2&gt;乱码的解决方法&lt;/h2&gt;
&lt;p&gt;乱码是因为oh-my-posh使用了图标，但是你的字体里又没有包含图标，所以需要换一个新的，带图标的字体。
&lt;a href=&quot;https://www.nerdfonts.com/&quot;&gt;Nerd字体下载地址&lt;/a&gt;
我自用的是Nerd里面的&lt;a href=&quot;https://github.com/ryanoasis/nerd-fonts/releases/download/v2.1.0/CascadiaCode.zip&quot;&gt;Cascadia Cove Nerd Font&lt;/a&gt;，感觉挺舒服的。
下载完之后安装到电脑，然后在Windows Terminal设置里面使用该字体就好了。&lt;/p&gt;
&lt;h2&gt;自用的设置文件(只是颜色的那一部分)&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;&quot;profiles&quot;:
    {
      &quot;defaults&quot;: {
        // Put settings here that you want to apply to all profiles.
        &quot;acrylicOpacity&quot;: 0.6, //背景透明度(0-1)
        &quot;useAcrylic&quot;: true, // 启用毛玻璃
        &quot;backgroundImage&quot;: &quot;C:\\Users\\Tokisaki_Galaxy\\OneDrive\\图片\\SCP.jpg&quot;, //背景图片
        &quot;backgroundImageOpacity&quot;: 0.1, //图片透明度（0-1）
        &quot;experimental.retroTerminalEffect&quot;: false, //复古的CRT 效果
        &quot;backgroundImageStretchMode&quot;: &quot;uniformToFill&quot;, //填充模式
        &quot;fontFace&quot;: &quot;CaskaydiaCove Nerd Font&quot;, //字体名称
        &quot;fontSize&quot;: 12, //文字大小
        &quot;fontWeight&quot;: &quot;normal&quot;, //文字宽度，可设置加粗
        &quot;colorScheme&quot;: &quot;Solarized Light&quot;, //主题名字
        &quot;cursorColor&quot;: &quot;#FFFFFF&quot;, //光标颜色
        &quot;cursorShape&quot;: &quot;bar&quot;, //光标形状
        &quot;antialiasingMode&quot;: &quot;cleartype&quot; //ClearType
      },
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>NTFS文件系统修复经历</title><link>https://tski.uk/blog/ntfs-file-system/</link><guid isPermaLink="true">https://tski.uk/blog/ntfs-file-system/</guid><description>记录一次在使用OneDrive时遇到的NTFS文件系统问题及其修复过程</description><pubDate>Sun, 31 Jan 2021 14:36:39 GMT</pubDate><content:encoded>&lt;p&gt;玩office e5订阅里的5TOnedrive空间时候，发现有个文件死活删不掉。
然后我手贱的尝试命令行，粉碎机，发现均没用的时候就祭出了dg。（我有Bitlocker，所以不想用PE）
发现dg用来依然没用，并且文件越来越多了，还出现各种乱码文件。
马上警觉.jpg。chkdsk/f走起，是否在下一次重启检查文件系统，是。
结果重启直接NTFS_FILE_SYSTEM蓝屏。发现dg直接把我NTFS文件系统搞炸了。。。
然后只好进PE里用chkdsk。
结语：没事别用dg。。。&lt;/p&gt;
</content:encoded></item><item><title>【碧蓝航线】Azur Lane Crosswave 解包指南+探索历程</title><link>https://tski.uk/blog/unload-azur-lane-crosswave/</link><guid isPermaLink="true">https://tski.uk/blog/unload-azur-lane-crosswave/</guid><description>转载【碧蓝航线】Azur Lane Crosswave 解包指南+探索历程</description><pubDate>Sun, 20 Dec 2020 07:13:17 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;本文转载自&lt;a href=&quot;https://sxjeru.wordpress.com/2020/04/17/%e3%80%90%e7%a2%a7%e8%93%9d%e8%88%aa%e7%ba%bf%e3%80%91azur-lane-crosswave-%e8%a7%a3%e5%8c%85%e6%8c%87%e5%8d%97%e6%8e%a2%e7%b4%a2%e5%8e%86%e7%a8%8b/&quot;&gt;ERU博客&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/Tokisaki-Galaxy/Azur-Lane-Crosswave-Res-Extractor-Tools&quot;&gt;工具，船名对照表&lt;/a&gt;
&lt;strong&gt;前排注意：任何解包行为需把握资源用途，为尊重作品著作权，请勿用于商业行为或大范围传播！&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;此处仅提供教程与经验，无资源。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;本人共计探索了超过4天，终于摸透了包里的数据。目前除了3D模型还未测试（已可提取），其余资源都可成功提取。&lt;/p&gt;
&lt;p&gt;大体流程（目录）：&lt;/p&gt;
&lt;p&gt;PAK数据包解包
虚幻4资源文件提取（CG get~）
Spine动画提取*
3D模型构建*（暂无，有生之年更新）&lt;/p&gt;
&lt;p&gt;探索历程的无关文字会被折叠，请只看教程的读者放心食用。&lt;/p&gt;
&lt;p&gt;文中用到的工具会给出官网与网盘地址，本人希望诸位能支持官方下载。网盘文件可能无法做到及时更新，敬请谅解。&lt;/p&gt;
&lt;h2&gt;一、裂解PAK&lt;/h2&gt;
&lt;p&gt;或许是幸运，或许是“自知之明”，总之地雷社没有给ALC的数据包加密，这也使得解包变得异常简单。这一步并没有坑，因而也就没有探索文字啦。&lt;/p&gt;
&lt;p&gt;准备解包工具QuickBMS（&lt;a href=&quot;https://aluigi.altervista.org/quickbms.htm&quot;&gt;官网&lt;/a&gt;、&lt;a href=&quot;http://sxj.mcmod.cn/tutorial/quickbms.zip&quot;&gt;网盘&lt;/a&gt;）与UE4解包脚本（&lt;a href=&quot;https://aluigi.altervista.org/quickbms.htm&quot;&gt;官网同上&lt;/a&gt;、&lt;a href=&quot;http://sxj.mcmod.cn/tutorial/unreal_tournament_4.bms&quot;&gt;网盘&lt;/a&gt;）。
&lt;img src=&quot;https://sxjeru.files.wordpress.com/2020/04/znarqh5exmviggm.png&quot; alt=&quot;znarqh5exmviggm&quot; /&gt;&lt;/p&gt;
&lt;p&gt;双击“quickbms.exe”，依次选择脚本、PAK数据包（通常位于“~\Azur Lane Crosswave\Azurlane\Content\Paks”）、解包位置（资源保存至何处）。
等待……  Done！&lt;/p&gt;
&lt;h2&gt;二、渗透UE4&lt;/h2&gt;
&lt;p&gt;ALC采用UE4（v4.21.2.0）游戏引擎，导致所有资源文件都被“加密”成uasset、uexp等文件，如何将这些还原成原始文件是这一关的核心任务。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;吐槽
手贱用umodel选游戏路径时把所有解包出来的资源文件全选了，结果分析就花了半个多小时……
而且umodel稳定性也不太好，在我手上至少崩了30多回。另外它无法提取所有文件，这可着实坑惨我了……&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;1.准备提取工具UE Viewer（官网、网盘）。&lt;/p&gt;
&lt;p&gt;2.双击“umodel.exe”，按图中配置参数，路径自选，不建议选择根路径（Content），否则所需时间较长。我在下面列出了子目录中包含的部分资源，可参考个人需要选择相应路径。
最后点击“OK”，等待处理。（此时命令符窗口无显示，请耐心等待）
&lt;img src=&quot;https://sxjeru.files.wordpress.com/2020/04/7p0j57voq0ullllq.png&quot; alt=&quot;7~$P0%ULLLLQ.png&quot; /&gt;
Battle：含有战斗场景下的各种3D模型，2D UI设计等。
Event：含有VN（视觉小说）界面下的各种立绘、CG。
Sound：含有游戏内所有的BGM、SE、Voice（配音）。
System：含有游戏主页面的UI设计文件。
World*：含有主线剧情内世界场景的资源文件，包括地图架构，2D动态Q版人物等。&lt;/p&gt;
&lt;p&gt;4.处理完成后弹出资源选择窗口，左侧目录树找到目标后可在右侧双击感兴趣的资源来预览。建议预览较大的文件，这些文件通常是图片、模型、音乐。
&lt;img src=&quot;https://sxjeru.files.wordpress.com/2020/04/td7s7sro_o4hp6kok.png&quot; alt=&quot;TD7S7SR{O_O$4HP&quot; /&gt;&lt;/p&gt;
&lt;p&gt;5.预览完毕后可以直接在预览器的“Tools”菜单中导出，或在文件浏览窗口批量选择需导出的文件，点击下方“Export”，选好路径与图片格式（仅影响图片文件）后确认导出即可。
&lt;img src=&quot;https://sxjeru.files.wordpress.com/2020/04/31q40q0eth2mxcb1.png&quot; alt=&quot;a&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;注：UE Viewer仅能导出部分资源文件，一些数据文件无法识别与导出。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;通常没有什么刚需的话，止步于此即可。也就只有我这么死脑筋的人会去想下面的内容了……&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;三、​​啊Q版小人太可爱了还会动 i了i了 一定要把她们导出来！~~&lt;/h2&gt;
&lt;p&gt;闹着玩嘛，这节主要是来提取ALC地图场景那些Q版小人。在这个坑里花了70%的时间才爬出来，获得不少经验的同时也感谢各位提供神奇工具的开源作者。&lt;/p&gt;
&lt;p&gt;在这节里，经验伴你同行。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;人生经验（点击查看）
一开始就花了半小时分析数据包文件架构，才找到路径“~\Azurlane\Content\World\Spine”。本以为是CG一样的玩意，结果用Umodel（UE Viewer）一看——Ch001.png
&lt;img src=&quot;https://sxjeru.files.wordpress.com/2020/04/ch001.png?w=1024&quot; alt=&quot;aab&quot; /&gt;
【心脏骤停】誒呀好难受啊……与六年前拆CS1.6素材文件是一样的感觉呢。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ol&gt;
&lt;li&gt;经分析可知此类2D建模由Spine软件设计，单个建模包含json&lt;em&gt;1、atlas&lt;/em&gt;1、png*1，对应解包后的路径为“~\Azurlane\Content\World\Spine”。其中“Ch001”即岛风，“Ch002”即…… 额这是谁来着？&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://sxjeru.files.wordpress.com/2020/04/ch002_touch.png&quot; alt=&quot;Ch002_touch.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;是绫波吗…？是她吧…… 誒别打我啊！&lt;/p&gt;
&lt;p&gt;剩下52位诸位若学成的话就可以自己提取哦~ 请自行探索吧~~（按道理每艘秘书舰都有的说）&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;准备文本编辑器（无脑推荐VS Code、Sublime Text 3，Notepad++ 因过于自由而不推荐），Spine Viewer WPF（作者：kiletw）。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;注：SpineViewerWPF需要.NET Framework 4.7.2与Microsoft XNA Framework Redistributable 4.0作为前置库。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;经验+1（点击查看）
这一步就着实不容易呐，Spine Viewer出奇的好用，虽然有点小Bug但作者很快就修复了，真得感谢他，不然可能就得买原装Spine了。（试用版无法导出图像，基础版就要69刀……）
悲惨的是，到最后我才找到这玩意。
辛运的是，你们的时间不会浪费了&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;利用第二节的方法，通过 umodel 从“~\Azur Lane Crosswave\World\Spine\Chxxx\Textures”（xxx指数字，为避免误解下面采用001，毕竟小岛风辣么可爱，拿来练手也不错~）得到Ch001.png。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;神奇又关键的一步。资源管理器定位至“~\Azurlane\Content\World\Spine\Ch001”，将“Ch001.uexp”用文本编辑器打开，得到下图内容。（可能会有所卡顿）
&lt;img src=&quot;https://sxjeru.files.wordpress.com/2020/04/z9ykx_8ejqg4fckfxbgzl.png?w=768&amp;amp;h=455&quot; alt=&quot;Z9YKX_8KFXBGZL.png&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;将分界线（一排乱码）上端的文字复制，注意顶端乱码不用，按岛风举例是从“Ch001.png”到“index: -1”，创建一个新文本文件，重命名为Ch001.atlas，将内容粘贴进去，保存。&lt;/p&gt;
&lt;p&gt;再将分界线下端文字复制，底端乱码不用，同样以岛风为例是从“{“skeleton”:”到“”angle”:-0.05}]}}}}}”。注意编辑器显示缺陷导致的复制不全。
&lt;img src=&quot;https://sxjeru.files.wordpress.com/2020/04/3r_huhh4nxd40bgtn.png?w=768&amp;amp;h=455&quot; alt=&quot;523N.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;创建新文本文件，命名为Ch001.json，将内容粘贴进去，保存。&lt;/p&gt;
&lt;p&gt;建议移至同个文件夹，便于处理。顺便吹一波QTTabBar。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://sxjeru.files.wordpress.com/2020/04/bc_erkjahts3lq0.png&quot; alt=&quot;JAHTS3LQ0.png&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;痛苦不堪的经历（点击查看）
知道是Spine模型后，我苦思冥想地雷社把json藏哪了。当时用umodel找了一晚上也没找着，倒是在预览窗口发现了端倪，但问题是——根本不能导出啊！！
&lt;img src=&quot;https://sxjeru.files.wordpress.com/2020/04/g4luort5b4hkd26pcuu.png&quot; alt=&quot;G4LUO5B4HPCUU.png&quot; /&gt;
诶呦真的火气来了。在解包文件中浏览，突然一个“Azurlane.uproject”让我眼前一亮。woc，这不就是ALC的工程文件吗！感觉胜利的曙光都要照到身上了，赶紧双击，结果报错……
&lt;img src=&quot;https://sxjeru.files.wordpress.com/2020/04/hpzlaa7_kp_q2cdno04.png&quot; alt=&quot;Q2CDNO04.png&quot; /&gt;
凉拌，这胜利曙光刺激啊，把我眼都给亮瞎了。
接着网上冲浪，但几乎丧失了信心，直到有一次想复制“Ch001.uasset”文件名，不小心双击打开了它……
&lt;img src=&quot;https://sxjeru.files.wordpress.com/2020/04/5gatfi723o9nqeg40w3.png?w=1024&quot; alt=&quot;5GATFI73.png&quot; /&gt;
？？梦寐以求的json与atlas，简直就是乱码丛中的那两颗耀眼的钻石啊！
顺手打开和它在一起的“Ch001.uexp”，便出现教程里这一幕。简直泪流满面……辛苦没有白费！&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;接下去我会分成两种情况，&lt;strong&gt;5富人党（购买了Spine正式版）&lt;strong&gt;与&lt;/strong&gt;6穷人党（如本人）&lt;/strong&gt;，分别用两种颜色描述。&lt;/p&gt;
&lt;p&gt;由于个人经济情况限制，以下步骤可能不准确，以Spine客服为准。&lt;/p&gt;
&lt;p&gt;5-1. 发动钞能力，购买Spine！&lt;/p&gt;
&lt;p&gt;5-2. Spine中新建项目，选择“导入数据”，导入Ch001.json。再选择“纹理解包器”，图集文件导入Ch001.atlas，确保Ch001.png在同一文件夹，选择输出文件夹后确定。&lt;/p&gt;
&lt;p&gt;5-3. 将导出的许多单张图与Ch001.json放在一起，就能在Spine中预览到了。更多功能请自行探索，此处不再赘述。毕竟这不是教程想表达的方法。&lt;/p&gt;
&lt;p&gt;5-4. 选择导出，各种图片视频格式任君挑选。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;接上第4步。双击打开“SpineViewerWPF.exe”，在“Use Version”菜单中选择“3.7.83”（注意不是最新的3.8.x）。再点击“File -&amp;gt; Load Spine”，选择Ch001.atlas文件路径，并保证png与json在同一文件夹，能看到如下图。
&lt;img src=&quot;https://sxjeru.files.wordpress.com/2020/04/t6kpemfn559qp3plm.png&quot; alt=&quot;ASG.PNG&quot; /&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;其中左侧“Anime”可选择不同动画，一个角色通常有多种动画（如岛风有3种）。下方是播放控件与截图（相机键）还有Gif导出（摄像键）。&lt;/p&gt;
&lt;p&gt;没错，白嫖就是那么简单~~  不过探索出这条路来并不是那么简单的……&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;在此提醒下，导出Gif时会占用大量内存资源，请留出足够的内存，否则程序会崩溃。&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;现在让我们看看探索历程的艰辛——
一开始我用Spine 试用版，它可以导入json数据文件。然而Spine不认atlas，而“纹理解包器”功能试用版又无法使用，导致只有骨架，材质全部遗失…… 简直就是死路一条啊。
&lt;img src=&quot;https://sxjeru.files.wordpress.com/2020/04/u49e0tfy_dri.png&quot; alt=&quot;ab&quot; /&gt;
然后就开始考虑分割图集（那张大png），网上找了近乎两天，测试了各种软件：Skeleton Viewer、Texture Packer、Sprite UV、Gdx Texture Packer、Dragon Bones Pro 等等。
最后找到了“splitAtlas.py”，可惜没有原出处了。不过它成功帮我分割了大图，当时怕是都感动到哭了&lt;/p&gt;
&lt;p&gt;一言难尽，其中的辛酸没人能理解，文字完全没法描述。这几天已经处于返校倒计时，我是多么想在返校前作出一番成就呢！终于——
&lt;img src=&quot;https://sxjeru.files.wordpress.com/2020/04/ota55_asbp2om95gt2xu.png&quot; alt=&quot;KP89O26YGB7SN.png&quot; /&gt;
热泪盈眶，终于在游戏外看到成品了！！虽然不能导出，但也足矣。
我并非没想过找破解版的Spine，可这设计软件太小众了，以至于根本没人破解，或许也有联网激活难破解的原因吧。
也尝试了替代品，Dragon Bones Pro。可这玩意有Bug，硬生生把可怜岛风的头发给整没了…… （wdnmd！！毁谁形象呢？！）受害者照片如下：
&lt;img src=&quot;https://sxjeru.files.wordpress.com/2020/04/e94057woete1404k5dc.png?w=1024&quot; alt=&quot;4K5DC.png&quot; /&gt;
最后的最后，我看到了真正的曙光——Spine Viewer WPF！&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;感谢你能看到最后，祝提取顺利。&lt;/p&gt;
&lt;p&gt;当然如果有了解Spine Web用法的盆友，欢迎联系我，我实在是无法玩明白这东西。这是我搭建的测试网址：http://sxj.mcmod.cn/123.html
不知道为什么就是不显示……&lt;/p&gt;
&lt;p&gt;插一句，岛风这憨憨，我要定了，都礼貌点儿，别抢。&lt;/p&gt;
&lt;p&gt;最后有个&lt;a href=&quot;https://www.bilibili.com/video/BV1da4y147Qq&quot;&gt;彩蛋&lt;/a&gt;~ 虽与教程无关，但挺有趣的。&lt;/p&gt;
</content:encoded></item><item><title>完全卸载联想电脑管家</title><link>https://tski.uk/blog/how-to-uninstall-lenovo-im/</link><guid isPermaLink="true">https://tski.uk/blog/how-to-uninstall-lenovo-im/</guid><description>删除LenovoIM控制进程</description><pubDate>Sun, 13 Dec 2020 13:45:26 GMT</pubDate><content:encoded>&lt;p&gt;Lenovo管家（包括UWP）卸载之后会在系统内留下一堆Lenovo.imxxxx的进程，直接定位目录删除，windowsupdate又给下回来了。找了好久才找到卸载的方法。
方法1.
从&lt;strong&gt;设备管理器&lt;/strong&gt;中展开系统设备类别。右键单击&lt;strong&gt;系统接口基础V2设备&lt;/strong&gt;，然后选择&lt;strong&gt;卸载&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;方法2.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;c:\windows\system32\imcontroller.infinstaller.exe -uninstall
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>裸连R6</title><link>https://tski.uk/blog/direct-connection-rain6/</link><guid isPermaLink="true">https://tski.uk/blog/direct-connection-rain6/</guid><description>裸连r6</description><pubDate>Sun, 22 Nov 2020 13:02:03 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;本方法并不保证一定可行，只是根据我的个人实际经历编写&lt;/li&gt;
&lt;li&gt;本方法无法完全代替加速器，只是提供一种省钱（不用加速器）的方法&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本方法只是提供不使用加速器连接到服务器，游玩彩六的一种方法，实际使用效果并不比加速器好。打开游戏时的连接到服务器和加载对战列表需要2,3分钟，每次对战结束都要等一分钟回到主页面&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;但是不用加速器就代表省钱啊，我最喜欢不要钱的东西了&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;上个星期刚重装完系统，结果发现加速器加速之后彩六语音用不了（腾讯加速器），但是上周有VIP，又不是不能玩，所以就没管它。但是这个星期加速器到期了，只好去修复一下NAT类型碰碰运气，看看能不能裸连上去。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;话说腾讯加速器是真的恶心，加速效果堪比三流加速器，而且还整什么VIP和SVIP。。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;插句题外话，育碧的阿三客服真的睿智，上周周日晚上跟我说什么由于恶劣行为永久封禁，然后周一发个工单，周三还不回，周三再发一个，周五才解决封禁，然后最后跟我说什么“出于技术原因，您的账号被误封了。”，害我在学校担心了一个星期。。。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;按下WIN+I打开设置，进入游戏-&amp;gt;Xbox网络，等圈圈转完之后查看&lt;code&gt;Xbox Live多人游戏&lt;/code&gt;那一栏，&lt;code&gt;NAT类型&lt;/code&gt;如果是&lt;strong&gt;开放&lt;/strong&gt;，请按下CTRL+W，这篇博客对你没用。&lt;/p&gt;
&lt;p&gt;我的ISP是移动，当时是看他宽带便宜装的，结果玩游戏比同学的电信差了一大截。移动在你的入户路由外面又套了层小区（或者城区）的大型局域网，所以被人称作墙中墙~~2333~，导致游戏很难连上处在国外的服务器。&lt;/p&gt;
&lt;p&gt;首先点击&lt;code&gt;Xbox Live多人游戏&lt;/code&gt;最下面的修复，并重启电脑后重新检查&lt;code&gt;NAT类型&lt;/code&gt;是否已经变为开放，如果这样就能解决，那么自然皆大欢喜。&lt;/p&gt;
&lt;h2&gt;手动启用teredo&lt;/h2&gt;
&lt;p&gt;如果很不幸的（事实上大部分人都没法通过简单的修复按钮修复）无法修复，那需要手动启用teredo。&lt;/p&gt;
&lt;p&gt;打开powershell或者cmd，输入&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;netsh interface Teredo set state servername=default
netsh interface Teredo set state type=natawareclient
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;// 网上有人说&lt;code&gt;natawareclient&lt;/code&gt;比&lt;code&gt;enterpriseclient&lt;/code&gt;更适合家庭使用，如果&lt;code&gt;natawareclient&lt;/code&gt;不行就试试&lt;code&gt;enterpriseclient&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;重启电脑，再次查看NAT类型&lt;/p&gt;
&lt;p&gt;我自己到这里就已经解决了，并且彩六里语音也可以使用了（惊喜）。&lt;/p&gt;
</content:encoded></item><item><title>临时关闭Hyper-V</title><link>https://tski.uk/blog/temporarily-closed-hyperv/</link><guid isPermaLink="true">https://tski.uk/blog/temporarily-closed-hyperv/</guid><description>临时关闭hyper-V</description><pubDate>Sat, 21 Nov 2020 21:38:36 GMT</pubDate><content:encoded>&lt;p&gt;win10的wsl2中可以装metasploit和hackrf，对我来说实在无法拒绝（windows是最好的linux发行版！），但是wsl2需要HyperV。
但是我用来玩游戏的安卓模拟器却无法和hyperv兼容，在无数次尝试之后（蓝叠那个beta版也不行），还是选择用代码临时关闭开启hypver-v，需要玩游戏的时候关闭hypver-v，需要用wsl的时候开启hypver-v（真麻烦。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;开启&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;bcdedit /set hypervisorlaunchtype auto
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;关闭&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;bcdedit /set hypervisorlaunchtype off
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>WSL安装metasploit</title><link>https://tski.uk/blog/wsl-metasploit-config/</link><guid isPermaLink="true">https://tski.uk/blog/wsl-metasploit-config/</guid><description>wsl，debian安装metasploit，并链接数据库。</description><pubDate>Sun, 25 Oct 2020 08:00:53 GMT</pubDate><content:encoded>&lt;p&gt;https://mirrors.tuna.tsinghua.edu.cn/help/debian/清华的debian国内镜像&lt;/p&gt;
&lt;h2&gt;将系统语言改为中文&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;sudo dpkg-reconfigure locales
#勾上zh_CN GB2312   zh_CN.GBK GBK   zh_CN.UTF-8 UTF-8
#重启生效
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;安装metasploit-framework&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;sudo nano /etc/apt/sources.list
#加入下面这一行
deb http://mirrors.aliyun.com/kali kali-rolling main non-free contrib
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;sudo wget -q -O - https://archive.kali.org/archive-key.asc | sudo apt-key add
sudo apt update
sudo apt install metasploit-framework
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;连接数据库&lt;/h2&gt;
&lt;p&gt;WSL中metasploit链接数据库有点麻烦，如果按照正常操作会报下面这个错误。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;msfconsole
&amp;gt;db_status
postgresql selected,no connect
&amp;gt;msfdb init
System has not been booted with systemd as init system (PID 1). Can&apos;t operate.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;原理是wsl启动的时候没systemd。&lt;/p&gt;
&lt;h3&gt;解决方法&lt;/h3&gt;
&lt;p&gt;启动数据库服务&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;msfdb init
sudo service postgresql start
sudo service postgresql status
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;手动建立数据库用户，数据库&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 
cd /etc/postgresql/13/main
sudo -u postgres psql
alter user postgres password &apos;root&apos;;
create user msf with password &apos;metasploit&apos; createdb;
create database msf with owner=msf;
quit
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在metasploit中链接&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;msfconsole
#db_connect 数据库用户名:数据库密码@数据库ip[:数据库端口]/数据库名
db_connect msf:metasploit@127.0.0.1:5958/msf
db_status
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;设置自动连接&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo nano /usr/share/metasploit-framework/config/database.yml
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;将里面username,password改成自己设置的。&lt;/p&gt;
</content:encoded></item><item><title>DnsPod，cloudflare启用DNSSEC</title><link>https://tski.uk/blog/cloudflare-dnspod-enable-dnssec/</link><guid isPermaLink="true">https://tski.uk/blog/cloudflare-dnspod-enable-dnssec/</guid><description>DnsPod配合cloudflare启用DNSSEC</description><pubDate>Sat, 10 Oct 2020 20:04:58 GMT</pubDate><content:encoded>&lt;h2&gt;DNSSEC介绍&lt;/h2&gt;
&lt;p&gt;DNSSEC 可抵御伪造的 DNS 应答。受 DNSSEC 保护的区域将通过密码进行签名，以确保收到的 DNS 记录与域所有者发布的 DNS 记录相同。&lt;/p&gt;
&lt;h2&gt;cloudflare开启DNSSEC&lt;/h2&gt;
&lt;p&gt;首先在cloudflare中打开dns页面&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/Tokisaki-Galaxy/res/post/cloudflare-dnspod-enable-dnssec/1.webp&quot; alt=&quot;cloudflare打开DNSSEC页面&quot; /&gt;&lt;/p&gt;
&lt;p&gt;下滑找到DNSSEC，点击启用，并且点击右下角那个&lt;code&gt;DS 记录&lt;/code&gt;展开。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/Tokisaki-Galaxy/res/post/cloudflare-dnspod-enable-dnssec/2.webp&quot; alt=&quot;启用DNSSEC&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/Tokisaki-Galaxy/res/post/cloudflare-dnspod-enable-dnssec/3.webp&quot; alt=&quot;展开DS记录&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;打开腾讯云DNSSEC功能&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://console.cloud.tencent.com/domain&quot;&gt;https://console.cloud.tencent.com/domain&lt;/a&gt;，点击域名那一栏的&lt;code&gt;管理&lt;/code&gt;-&amp;gt;&lt;code&gt;域名安全&lt;/code&gt;，点击下面&lt;code&gt;DNSSEC设置&lt;/code&gt;右边蓝色的设置。
&lt;img src=&quot;https://cdn.jsdelivr.net/gh/Tokisaki-Galaxy/res/post/cloudflare-dnspod-enable-dnssec/4.webp&quot; alt=&quot;腾讯云DNSSEC&quot; /&gt;&lt;/p&gt;
&lt;p&gt;第一次进去会有个什么东西让你了解，点击了解就完了。然后按照下面输进去。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/Tokisaki-Galaxy/res/post/cloudflare-dnspod-enable-dnssec/5.webp&quot; alt=&quot;dnspod启用DNSSEC&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;验证DNSSEC情况&lt;/h2&gt;
&lt;p&gt;回到cloudflare的dns页面，已经变成了下面这一个样子。
&lt;img src=&quot;https://cdn.jsdelivr.net/gh/Tokisaki-Galaxy/res/post/cloudflare-dnspod-enable-dnssec/6.webp&quot; alt=&quot;启用成功DNSSEC&quot; /&gt;&lt;/p&gt;
&lt;p&gt;也可以使用第三方检测你的网站是否成功启用DNSSEC。
&lt;a href=&quot;https://dnsviz.net/d/tokisakigalaxy.xyz/dnssec/&quot;&gt;https://dnsviz.net/d/tokisakigalaxy.xyz/dnssec/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/Tokisaki-Galaxy/res/post/cloudflare-dnspod-enable-dnssec/tokisakigalaxy-xyz-DNSViz.webp&quot; alt=&quot;dnsviz中检测启用成功DNSSEC&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>使用hackrf伪造GPS信号</title><link>https://tski.uk/blog/hackrf/</link><guid isPermaLink="true">https://tski.uk/blog/hackrf/</guid><description>使用hackrf伪造GPS信号</description><pubDate>Sun, 04 Oct 2020 16:25:59 GMT</pubDate><content:encoded>&lt;p&gt;环境：Windows 10
&lt;em&gt;win10都可以，linux不会有问题的吧&lt;/em&gt;
&lt;strong&gt;关于本文中的所有链接，文末有整合地址，如果你们不嫌弃慢可以去那里下载&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;伪造GPS信号原理&lt;/h2&gt;
&lt;p&gt;这个没啥好说的，就是用一个更强的信号覆盖掉微弱的GPS信号。&lt;/p&gt;
&lt;h2&gt;下载Hackrf_Tools&lt;/h2&gt;
&lt;p&gt;这个不好找，只能去Github下，然后编译。我提供的整合包里有这些文件。&lt;/p&gt;
&lt;h2&gt;下载gps-sdr-sim&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/osqzss/gps-sdr-sim&quot;&gt;Github地址&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;建议下载Release，不用自己编译，而且windows直接用。&lt;/p&gt;
&lt;p&gt;生成仿真信号的时候需要RINEX星历数据，Release版的gps-sdr-sim已经自带一个上古版本的星历了（2014年的），更新一下。
&lt;a href=&quot;ftp://cddis.gsfc.nasa.gov/pub/gps/data/daily/2020/brdc/&quot;&gt;RINEX星历数据下载地址&lt;/a&gt;
&lt;strong&gt;地址中的2020可以换成你当前年份&lt;/strong&gt;
拉到最下面，下载brdc2780.20n.Z，然后解压就是了。（注意要是以n结尾的星历）
&lt;img src=&quot;https://cdn.jsdelivr.net/gh/Tokisaki-Galaxy/res/post/hackrf/RINEX.png&quot; alt=&quot;RINEX&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;生成GPS仿真数据&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;./gps-sdr-sim -e brdc2780.20n -l 0,0,100 -b 8·&lt;/code&gt;
指定星历文件，设置经纬度，必须指定采样精度为8。
默认情况下只生成300秒的仿真数据，因为生成的文件太大了，怕你硬盘塞不下去2333。&lt;/p&gt;
&lt;h2&gt;发射仿真数据&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;hackrf_transfer -t gpssim.bin -f 1575420000 -s 2600000 -a 1 -x 0&lt;/code&gt;
-t 指定GPS数据
-f 指定频率为1575420000 即民用GPS L1波段频率。
-s 指定采样速率2.6Msps
-a 开启天线增益 1=Enable, 0=Disable
-x 指定TX VGA(IF)的增益，数据范围0-47dB &lt;strong&gt;(为了限制影响范围，最大为47慎用，小心查水表)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;请尽量避免使用手机进行测试，使用其他GPS终端。&lt;/strong&gt;
因为手机会采用多重方法进行定位，比如基站，Wifi，GPS。这类多重定位的东西不好干扰。&lt;/p&gt;
&lt;h2&gt;相关链接&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;http://www.hackrf.net/&quot;&gt;HackRF首页&lt;/a&gt;
&lt;a href=&quot;https://github.com/mossmann/hackrf&quot;&gt;Github上的HackRF&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;hackrf/hackrf.7z&quot;&gt;本文提到的资源整合&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>Edgeless</title><link>https://tski.uk/blog/edgeless/</link><guid isPermaLink="true">https://tski.uk/blog/edgeless/</guid><description>Edgeless</description><pubDate>Sat, 03 Oct 2020 19:51:35 GMT</pubDate><content:encoded>&lt;h1&gt;Edgeless介绍&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;强大而优雅的PE工具
有活跃的社区和强大的插件，可以媲美WTG。
edgeless不仅仅是传统的PE，还有强大的插件扩展，甚至可以让你能在PE中运行Office
可扩展性高，可以自己做各种奇奇怪怪的插件&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;插件包&lt;/h1&gt;
&lt;p&gt;插件包大概是Edgeless最大的特色了！
在启动盘指定目录放置7z插件包即可应用插件
无需专用软件，支持全平台管理插件包
制作插件包也非常方便！&lt;/p&gt;
&lt;p&gt;上至Photoshop2020、Office2010、WPS、Pycharm、VSCode生产力软件&lt;/p&gt;
&lt;p&gt;下至Dism++、Diksgenius、分区精灵等PE都有的软件&lt;/p&gt;
&lt;p&gt;什 么 都 能 装&lt;/p&gt;
&lt;p&gt;甚至有腾讯QQ、TIM、Telegram、微信、钉钉等IM——&lt;/p&gt;
&lt;p&gt;妈妈再也不用担心我装坏系统没法写作业听网课了！（？）&lt;/p&gt;
&lt;p&gt;（不过貌似顺便也能用网易云听听音乐摸鱼？）&lt;/p&gt;
&lt;p&gt;!!!warning &lt;strong&gt;！！！值得注意的是每次重启会还原更改！！！&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;启动界面、桌面图标、系统图标、鼠标指针、桌面壁纸、开始菜单样式均可实现修改&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;无广告 无收费 无劫持——&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;还有就是其他一些特点啦——&lt;/p&gt;
&lt;p&gt;其他U盘管理
自定义启动分辨率和壁纸！
资源管理器缩略图！
内置插件包下载器！
关联wim/esd
虚拟光驱
自动生成镜像快捷方式！
MTP、USB共享网络！（可以在学校搞事情了？）
支持部分msi安装包！
PE的OTA更新！&lt;/p&gt;
&lt;h1&gt;链接&lt;/h1&gt;
&lt;p&gt;Edgeless官网：https://home.edgeless.top/
Edgeless用户手册：https://www.kancloud.cn/cnotech/edgeless&lt;/p&gt;
</content:encoded></item><item><title>c++ 操作mysql数据库</title><link>https://tski.uk/blog/cpp-opt-mysql/</link><guid isPermaLink="true">https://tski.uk/blog/cpp-opt-mysql/</guid><description>C++ 操作mysql数据库</description><pubDate>Sat, 12 Sep 2020 14:17:04 GMT</pubDate><content:encoded>&lt;h1&gt;mysql5 安装&lt;/h1&gt;
&lt;p&gt;用&lt;strong&gt;管理员&lt;/strong&gt;命令行进/bin目录，输入&lt;code&gt;mysqld.exe --install&amp;amp;&amp;amp;net start mysql&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;修改密码&lt;/h2&gt;
&lt;p&gt;首次修改输入&lt;code&gt;mysqladmin -u root password &quot;new_password&quot;&lt;/code&gt;。
修改旧密码输入&lt;code&gt;首次修改输入&lt;/code&gt;mysqladmin -u root -p password &quot;new_password&quot;`，然后输入原有旧密码。&lt;/p&gt;
&lt;h1&gt;IDE设置&lt;/h1&gt;
&lt;p&gt;首先需要在include目录中加上&lt;code&gt;mysql5\include&lt;/code&gt;
lib目录中加上&lt;code&gt;mysql5\lib\opt&lt;/code&gt;
（可选）在链接器的链接的lib文件中，添加&lt;code&gt;libmysql.lib&lt;/code&gt;。
&lt;strong&gt;如果你找不到怎么添加libmysql.lib，可以跳过这一步&lt;/strong&gt;&lt;/p&gt;
&lt;h1&gt;使用C++代码链接并操作数据库&lt;/h1&gt;
&lt;h2&gt;需要的头文件&lt;/h2&gt;
&lt;p&gt;首先需要包含以下头文件&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#include &amp;lt;winsock2.h&amp;gt;
#include &amp;lt;mysql.h&amp;gt;
#pragma comment(lib,&quot;libmysql.lib&quot;) //如果你在IDE中设置了加入libmysql.lib,就可以不需要这一行，但是你加上去也没事
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;链接数据库&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;MYSQL mysqlconn;
mysql_init(&amp;amp;mysqlconn);
char * host=&quot;127.0.0.1&quot;;        //服务器地址
int port=3306;                  //端口
char * username=&quot;root&quot;;         //用户名
char * password=&quot;1234567890&quot;;   //密码
char * dbname=&quot;virus&quot;;          //数据库名

(mysql_real_connect(&amp;amp;mysqlconn,host,username,password,dbname,port,NULL,CLIENT_FOUND_ROWS) != NULL)?cout&amp;lt;&amp;lt;&quot;success&quot;&amp;lt;&amp;lt;endl:cout&amp;lt;&amp;lt;&quot;fail&quot;&amp;lt;&amp;lt;endl;

mysql_query(&amp;amp;mysqlconn,&quot;set names gbk&quot;);    //链接完之后设置编码为GBK
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;读取数据库数据&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;void getdata()
{
    MYSQL_RES *     mysql_res;
    MYSQL_FIELD *   mysql_field;
    MYSQL_ROW       mysql_row;
    char * sql=&quot;select * from virus_data where city_deadCount&amp;gt;50&quot;;

    if(mysql_query(&amp;amp;mysqlconn,sql)==0)
    {
        cout&amp;lt;&amp;lt;&quot;get data success&quot;&amp;lt;&amp;lt;endl;
        mysql_res=mysql_store_result(&amp;amp;mysqlconn);
        if(mysql_res)
        {
            int fiendcount=mysql_num_fields(mysql_res);
            int rowcount=mysql_num_rows(mysql_res);
            cout&amp;lt;&amp;lt;fiendcount&amp;lt;&amp;lt;endl;
            cout&amp;lt;&amp;lt;rowcount&amp;lt;&amp;lt;endl;

            for(int i=0;i&amp;lt;fiendcount;i++)
            {
                mysql_field=mysql_fetch_field(mysql_res);
                cout&amp;lt;&amp;lt;mysql_field-&amp;gt;name&amp;lt;&amp;lt;&quot; &quot;;
            }
            cout&amp;lt;&amp;lt;endl;

            for(int i=0;i&amp;lt;rowcount;i++)
            {
                mysql_row=mysql_fetch_row(mysql_res);
                for(int ja=0;ja&amp;lt;fiendcount;ja++)
                {
                    cout&amp;lt;&amp;lt;mysql_row[ja]&amp;lt;&amp;lt;&quot; &quot;;
                }
                cout&amp;lt;&amp;lt;endl;
            }
        }
    }else{
        cout&amp;lt;&amp;lt;&quot;get data fail&quot;&amp;lt;&amp;lt;endl;
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;修改数据库数据&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;string sql;
sqla = &quot;update item set qty=&quot; + tmp + &quot; where itemid=&apos;&quot; + itemid + &quot;&apos;&quot;;   			//修改
sqlb = &quot;delete from user where userid=&apos;&quot; + userid + &quot;&apos;&quot;;							//删除
sqlc = &quot;insert into datemax(date,value) values(&apos;&quot; + date + &quot;&apos;,&apos;&quot; + &quot;1&quot; + &quot;&apos;);&quot;;     //插入
mysql_query(&amp;amp;mysqlconn, sql);
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;项目实例&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/Tokisaki-Galaxy/LEARN-C&quot;&gt;Github&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>vector 用法</title><link>https://tski.uk/blog/cpp-vector/</link><guid isPermaLink="true">https://tski.uk/blog/cpp-vector/</guid><description>c++中vector用法</description><pubDate>Fri, 04 Sep 2020 20:43:59 GMT</pubDate><content:encoded>&lt;h1&gt;介绍&lt;/h1&gt;
&lt;p&gt;在c++中，vector像是一种动态数组，可以自由更改大小，有时候也被称为容器。
使用vector前需要包含&lt;code&gt;#include &amp;lt;vector&amp;gt;&lt;/code&gt;头文件&lt;/p&gt;
&lt;h1&gt;使用方法&lt;/h1&gt;
&lt;h2&gt;初始化&lt;/h2&gt;
&lt;p&gt;int是指容器的类型，abc是容器的名称。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;vector&amp;lt;int&amp;gt;abc;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;常用内置函数&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;//b为向量，将b的0-2个元素赋值给向量a
a.assign(b.begin(),b.begin()+3);
//a含有4个值为2的元素
a.assign(4,2);
//返回a的最后一个元素
a.back();
//返回a的第一个元素
a.front();
//返回a的第i元素,当且仅当a存在
a[i];
//清空a中的元素
a.clear();
//判断a是否为空，空则返回true，非空则返回false
a.empty();
//删除a向量的最后一个元素
a.pop_back();
//删除a中第一个（从第0个算起）到第二个元素，也就是说删除的元素从a.begin()+1算起（包括它）一直到a.begin()+3（不包括它）结束
a.erase(a.begin()+1,a.begin()+3);
//在a的末尾插入一个元素，其值为i
a.push_back(i);
//在a的第一个元素（从第0个算起）位置插入数值5,
a.insert(a.begin()+1,5);
//在a的第一个元素（从第0个算起）位置插入3个数，其值都为5
a.insert(a.begin()+1,3,5);
//b为数组，在a的第一个元素（从第0个元素算起）的位置插入b的第三个元素到第5个元素（不包括b+6）
a.insert(a.begin()+1,b+3,b+6);
//返回a中元素的个数
a.size();
//返回a在内存中总共可以容纳的元素个数
a.capacity();
//将a的现有元素个数调整至10个，多则删，少则补，其值随机
a.resize(10);
//将a的现有元素个数调整至10个，多则删，少则补，其值为2
a.resize(10,2);
//将a的容量扩充至100，
a.reserve(100);
//b为向量，将a中的元素和b中的元素整体交换
a.swap(b);
//b为向量，向量的比较操作还有 != &amp;gt;= &amp;gt; &amp;lt;= &amp;lt;
a==b;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;常用算法&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt; #include&amp;lt;algorithm&amp;gt;
 //对a中的从a.begin()（包括它）到a.end()（不包括它）的元素进行从小到大排列
 sort(a.begin(),a.end());
 //对a中的从a.begin()（包括它）到a.end()（不包括它）的元素倒置，但不排列，如a中元素为1,3,2,4,倒置后为4,2,3,1
 reverse(a.begin(),a.end());
  //把a中的从a.begin()（包括它）到a.end()（不包括它）的元素复制到b中，从b.begin()+1的位置（包括它）开始复制，覆盖掉原有元素
 copy(a.begin(),a.end(),b.begin()+1);
 //在a中的从a.begin()（包括它）到a.end()（不包括它）的元素中查找10，若存在返回其在向量中的位置
  find(a.begin(),a.end(),10);
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>strtok_s()函数用法</title><link>https://tski.uk/blog/cpp-strtok-s/</link><guid isPermaLink="true">https://tski.uk/blog/cpp-strtok-s/</guid><description>strtok_s()函数用法</description><pubDate>Fri, 28 Aug 2020 18:34:18 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;当您需要性能优化时，请考虑 C printf和sprintf，它们快速且易于使用。 但是，它们不能扩展或免受漏洞的攻击。 （存在安全版本，但它们会受到轻微的性能损失。 有关详细信息，请参阅printf_s、_printf_s_l、wprintf_s、_wprintf_s_l和sprintf_s、_sprintf_s_l、swprintf_s、_swprintf_s_l。
by MSDN，某些旧函数，包括&lt;code&gt;strtok()&lt;/code&gt;似乎有一些安全性的问题，被&lt;code&gt;strtok_s()&lt;/code&gt;代替，新函数新加入了一个参数，感觉新函数比以前那个更好用。使用示例如下&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
#include &amp;lt;string.h&amp;gt;
#include &amp;lt;stdio.h&amp;gt;

using namespace std;

char c_string[] =
&quot;1 2 3 4 5&quot;;
char sepa[] = &quot; &quot;;
char *token = NULL;
char *next_token = NULL;

int main()
{
    // Establish string and get the first token:
    token = strtok_s(c_string, sepa, &amp;amp;next_token);

    // While there are tokens in &quot;string1&quot; or &quot;string2&quot;
    while (token != NULL)
    {
        // Get next token:
        if (token != NULL)
        {
            printf_s(&quot; %s\n&quot;, token);
            token = strtok_s(NULL, sepa, &amp;amp;next_token);
        }
    }
    printf(&quot;remain:\n&quot;);
    printf(&quot;%d&quot;, token);
}
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>平均数及方差计算器</title><link>https://tski.uk/blog/cpp-project-calc-for-average/</link><guid isPermaLink="true">https://tski.uk/blog/cpp-project-calc-for-average/</guid><description>C++简易平均数及方差计算器</description><pubDate>Wed, 26 Aug 2020 18:55:10 GMT</pubDate><content:encoded>&lt;h2&gt;Calc-for-Average&lt;/h2&gt;
&lt;p&gt;用于计算多个数字总和，平均值，方差的MFC程序&lt;/p&gt;
&lt;h2&gt;使用方法&lt;/h2&gt;
&lt;p&gt;把数据输入到框里，允许小数输入，使用空格分开&lt;/p&gt;
&lt;h2&gt;源码及下载&lt;/h2&gt;
&lt;p&gt;项目&lt;a href=&quot;https://github.com/Tokisaki-Galaxy/Calc-for-Average&quot;&gt;Github地址&lt;/a&gt;。
核心代码如下&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;UpdateData(TRUE);
string stringdata = CT2A(m_input.GetBuffer());
char* strdata=(char*)stringdata.c_str();
char* token, * next_token = NULL;
char seps[] = &quot; &quot;;
long double sum=0,e=0,s=0;
vector&amp;lt;long double&amp;gt; data;

token = strtok_s(strdata, seps, &amp;amp;next_token);

while (token != NULL) {
	if (token != NULL)
	{
		data.push_back(stold(token));
		token = strtok_s(NULL, seps, &amp;amp;next_token);
	}
}

for (size_t i = 0; i &amp;lt;= data.size(); i++) //求和
	sum += data[i];
    e = sum / data.size(); //求平均值

for (size_t i = 0; i &amp;lt;= data.size(); i++) { //求方差
	if (i != data.size() - 1)
	s += (data[i] - e) * (data[i] - e);
}
s = s / data.size();

string sum_ret = to_string(sum);
string e_ret = to_string(e);
string s_ret = to_string(s);

m_sum = sum_ret.c_str();
m_avg = e_ret.c_str();
m_var = s_ret.c_str();

UpdateData(FALSE);
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>中国移动宽带配置ipv6与IPTV</title><link>https://tski.uk/blog/config-ipv6-and-iptv/</link><guid isPermaLink="true">https://tski.uk/blog/config-ipv6-and-iptv/</guid><description>中国移动宽带配置ipv6与IPTV</description><pubDate>Sun, 16 Aug 2020 15:37:36 GMT</pubDate><content:encoded>&lt;h2&gt;登录光猫管理页面&lt;/h2&gt;
&lt;p&gt;移动光猫的管理地址一般在192.168.1.1，普通用户名与密码光猫盒子最下面有写（不过那个账户就是看个笑话）。
&lt;strong&gt;超级管理员账号：&lt;code&gt;CMCCAdmin&lt;/code&gt;，密码&lt;code&gt;aDm8H%MdA&lt;/code&gt;。&lt;/strong&gt;
超级管理员比普通用户有更大权限，更多可设置内容。
（弱智移动超管账户密码都设成全国统一2333）&lt;/p&gt;
&lt;h2&gt;设置桥接&lt;/h2&gt;
&lt;p&gt;用超级管理员登录，点最上面绿色那里的网
&lt;img src=&quot;https://files.catbox.moe/wpfgis.jpg&quot; alt=&quot;1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;点连接名称，右边那个下拉菜单点新建
新建一个，端口选LAN3，改为桥模式。
然后在物理上把网线从LAN1拔下来，插到LAN3上。
PS:为什么我要用LAN3，不直接改LAN1，因为如果搞砸了还能改回去。&lt;/p&gt;
&lt;h2&gt;路由器设置&lt;/h2&gt;
&lt;p&gt;改为拨号，输入账号密码完事。
&lt;strong&gt;如果你不知道宽带的密码（像我一样，可以用开户的手机发短信&lt;code&gt;CZKDMM&lt;/code&gt;到10086，会重置一个新随机密码给你&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;IPTV&lt;/h2&gt;
&lt;p&gt;原来移动的IPTV是用网线连在光猫上的，我想把iptv盒子换到房间里，懒得拉这么长的线，所以用无线连接。
登录光猫管理地址，用超管登录，还是设置桥接的那个界面，找到&lt;code&gt;6_OTHER_B_VID_48&lt;/code&gt;那一栏，端口绑定应该只有LAN2被勾上了，把下面SSID1勾上，就可以用无线连接iptv了。&lt;/p&gt;
</content:encoded></item><item><title>高中数学</title><link>https://tski.uk/blog/project-sh-math/</link><guid isPermaLink="true">https://tski.uk/blog/project-sh-math/</guid><description>高中 数学</description><pubDate>Sat, 02 May 2020 21:33:54 GMT</pubDate><content:encoded>&lt;p&gt;如果没有加载出来就多等等，或者刷新一下试试。SVG文件挺大的，加载比较慢。&lt;/p&gt;
&lt;h1&gt;...&lt;/h1&gt;
&lt;p&gt;计划施工完成日期：2022年中&lt;/p&gt;
&lt;h1&gt;部分初中&lt;/h1&gt;
&lt;h2&gt;数与式&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;/blog/project-sh-math/%E6%95%B0%E4%B8%8E%E5%BC%8F-%E6%95%B0.svg&quot; alt=&quot;数与式-数&quot; /&gt;
&lt;img src=&quot;/blog/project-sh-math/%E6%95%B0%E4%B8%8E%E5%BC%8F-%E5%BC%8F.svg&quot; alt=&quot;数与式-式&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;方程与不等式&lt;/h2&gt;
&lt;h1&gt;高中一年级&lt;/h1&gt;
&lt;h2&gt;1.1 集合&lt;/h2&gt;
&lt;h1&gt;计算器&lt;/h1&gt;
&lt;p&gt;&amp;lt;script src=&quot;https://www.geogebra.org/apps/deployggb.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;div id=&quot;ggb-element&quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
var ggbApp = new GGBApplet({&quot;appName&quot;: &quot;graphing&quot;, &quot;width&quot;: 800, &quot;height&quot;: 600, &quot;showToolBar&quot;: true, &quot;showAlgebraInput&quot;: true, &quot;showMenuBar&quot;: true }, true);
window.addEventListener(&quot;load&quot;, function() {
ggbApp.inject(&apos;ggb-element&apos;);
});
&amp;lt;/script&amp;gt;&lt;/p&gt;
</content:encoded></item><item><title>ARKNIGHT 5-1限定</title><link>https://tski.uk/blog/arknight-w/</link><guid isPermaLink="true">https://tski.uk/blog/arknight-w/</guid><pubDate>Fri, 01 May 2020 21:26:58 GMT</pubDate><content:encoded>&lt;p&gt;5-1劳动节快乐！&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;yj天下第一！！！&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s1.ax1x.com/2020/05/01/JXOnZn.png&quot; alt=&quot;JXOnZn.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s1.ax1x.com/2020/05/01/JXOKI0.png&quot; alt=&quot;JXOKI0.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s1.ax1x.com/2020/05/01/JXOlGT.png&quot; alt=&quot;JXOlGT.png&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>RPi连接GPS模块</title><link>https://tski.uk/blog/rpi-gps/</link><guid isPermaLink="true">https://tski.uk/blog/rpi-gps/</guid><description>RPi连接GPS模块</description><pubDate>Wed, 12 Feb 2020 08:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;准备工作&lt;/h1&gt;
&lt;p&gt;RPi GPS Add-on V2.0模块,采用的是UART接口通信,需要先启用uart接口,否则无法收到任何数据&lt;/p&gt;
&lt;p&gt;&lt;code&gt;sudo raspi-config&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;5 Interfacing Options -&amp;gt; P6 Serial 两个全部禁用(这个操作将禁用串口!)&lt;/p&gt;
&lt;p&gt;&lt;code&gt;sudo nano /boot/config.txt&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;拉到最下面,将&lt;code&gt;enable_uart=0&lt;/code&gt;改成&lt;code&gt;enable_uart=1&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;再加一行&lt;code&gt;dtoverlay=pi3-miniuart-bt&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;重启后&lt;/p&gt;
&lt;p&gt;&lt;code&gt;ls /dev -la |grep serial&lt;/code&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;pi@RAAZ:~ $ ls /dev -la | grep serial&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;lrwxrwxrwx  1 root root           7 Feb 12 16:19 serial1 -&amp;gt; ttyAMA0&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;找到自己GPS模块在哪里,&lt;strong&gt;我这里是/dev/ttyAMA0,你可能需要修改&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;然后&lt;code&gt;cat /dev/ttyAMA0&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;然后应该能看到一大堆数据,按&lt;code&gt;Ctrl+C&lt;/code&gt;停止.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;没有任何输出可能是操作有误,或模块损坏&lt;/strong&gt;&lt;/p&gt;
&lt;h1&gt;GPSD&lt;/h1&gt;
&lt;h2&gt;安装GPSD&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;sudo apt-get install gpsd gpsd-clients python-gps&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;修改端口&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;sudo nano /etc/default/gpsd&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;USBAUTO=&quot;false&quot;
DEVICES=&quot;/dev/ttyAMA0&quot;
GPSD_OPTIONS=&quot;-n&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;按照上述改完之后,重启系统&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;cgps&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;cgps is a client resembling xgps, but without the pictorial satellite display and able to run on a serial terminal or terminal emulator.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;The -s option prevents cgps from displaying the data coming from the daemon. This display can also be toggled with the s command.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;The -m option will display your magnetic heading (as opposed to your true heading). This is a calculated value, not a measured value, and is subject to a potential error of up to two degrees in the areas for which the calculation is valid (currently Western Europe, Alaska, and Lower 48 in the USA). The formulas used are those found in the Aviation Formulary v1.43.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;cgps terminates when you send it a SIGHUP or SIGINT; given default terminal settings this will happen when you type Ctrl-C at it. It will also terminate on &apos;q&apos;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;输入&lt;code&gt;cgps -s&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;!如果你用的是图形界面,不是命令行,那试试xgps!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;应该就可以看到结果了&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;冷启动要等挺久的&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;如果NO FIX那一行后面的数字没有跳动,请检查/dev/ttyAMA0是否有输出&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;如果等很久还没定位,可能是GPS信号差&lt;/strong&gt;&lt;/p&gt;
</content:encoded></item><item><title>CMD script</title><link>https://tski.uk/blog/cmd-script/</link><guid isPermaLink="true">https://tski.uk/blog/cmd-script/</guid><description>CMD script</description><pubDate>Mon, 10 Feb 2020 21:26:58 GMT</pubDate><content:encoded>&lt;p&gt;&lt;code&gt;FOR /L %variable IN (start,step,end) DO command [command-parameters]&lt;/code&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;该集表示以增量形式从开始到结束的一个数字序列。因此，(1,1,5)将产生序列
1 2 3 4 5，(5,-1,1)将产生序列(5 4 3 2 1)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;对二进制文件连接用copy /b 1.txt+2.txt 1.txt&lt;/p&gt;
&lt;p&gt;例如1.txt是abc,2.txt是def,运行完之后,1.txt里面内容就是abcdef&lt;/p&gt;
&lt;p&gt;&lt;code&gt;for /l %i in (1,1,36) do (copy /b a.ts+seg-%i-v1-a1.ts&amp;gt;&amp;gt; a.ts)&lt;/code&gt;&lt;/p&gt;
</content:encoded></item><item><title>RPi使用Screen</title><link>https://tski.uk/blog/rpi-screen/</link><guid isPermaLink="true">https://tski.uk/blog/rpi-screen/</guid><description>RPi使用Screen</description><pubDate>Thu, 06 Feb 2020 08:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;在使用ssh时虚拟一个终端,实现不间断操作&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;sudo apt install screen
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;常用命令&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;screen -S 新建终端
screen -r 进入已创建终端
screen -ls 列出已创建终端
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;快捷键&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;Ctrl+A+D 保存并退出
Ctrl+A+K 杀死当前终端
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>Linux新建服务</title><link>https://tski.uk/blog/linux-new-service/</link><guid isPermaLink="true">https://tski.uk/blog/linux-new-service/</guid><description>Linux新建服务</description><pubDate>Wed, 05 Feb 2020 21:26:58 GMT</pubDate><content:encoded>&lt;pre&gt;&lt;code&gt;sudo nano /lib/systemd/system/xxx.service
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;[Unit]
Description=Your Service Name
After=network.target syslog.target
Wants=network.target

[Service]
Type=simple
ExecStart=Your File Path

[Install]
WantedBy=multi-user.target
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;systemctl daemon-reload
systemctl start xxx.service
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>RPi搭建DNS服务器</title><link>https://tski.uk/blog/rpi-make-dns/</link><guid isPermaLink="true">https://tski.uk/blog/rpi-make-dns/</guid><description>RPi搭建DNS服务器</description><pubDate>Thu, 26 Dec 2019 08:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;安装&lt;/li&gt;
&lt;li&gt;配置dnscrypt-proxy&lt;/li&gt;
&lt;li&gt;将路由器默认DNS更改为RPi&lt;/li&gt;
&lt;li&gt;配置失败自动重启&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;blockquote&gt;
&lt;p&gt;安装&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;sudo apt-get install dnscrypt-proxy
sudo apt-get install dnsutils #包含了dig什么的命令,最好装上
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;配置dnscrypt-proxy&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;sudo nano /etc/dnscrypt-proxy/dnscrypt-proxy.toml
listen_addresses = [&apos;127.0.0.1:53&apos;, &apos;192.168.0.150:53&apos;] #按照你自己的IP改
server_names = [&apos;cloudflare&apos;,&apos;cloudflare-ipv6&apos;]
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;dnscrypt-proxy -resolve cloudflare-dns.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;试试行不行,没问题再做下一步安装服务&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;非常重要,不然启动服务时会绑定端口失败&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo nano /lib/systemd/system/dnscrypt-proxy.service #更改dnscrypt-proxy服务设置
#User=_dnscrypt-proxy #注释掉源文件这一行
User=root #新加这一行,让它以root身份运行(好像不怎么安全..哈哈不管了)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;启动服务试试吧!&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl enable dnscrypt-proxy
sudo systemctl start dnscrypt-proxy
sudo systemctl status dnscrypt-proxy
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;将路由器默认DNS更改为RPi&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;略略略!!!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;自己百度,只有一点要注意,就是要改的地方是DHCP的,不是WAN口DNS!!!&lt;/strong&gt;&lt;/p&gt;
&lt;h1&gt;参考网址&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/1.1.1.1/dns-over-https/cloudflared-proxy/&quot;&gt;couldflare&lt;/a&gt;
&lt;a href=&quot;https://github.com/DNSCrypt/dnscrypt-proxy/wiki/installation#setting-up-dnscrypt-proxy&quot;&gt;DNScrypt-proxy&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>C++数组元素个数计算</title><link>https://tski.uk/blog/cpp-array-element-count/</link><guid isPermaLink="true">https://tski.uk/blog/cpp-array-element-count/</guid><description>C++数组元素个数计算</description><pubDate>Tue, 03 Dec 2019 08:00:00 GMT</pubDate><content:encoded>&lt;pre&gt;&lt;code&gt;int i_max(int a[]) {
	int tmp=a[0];
	for (int i = 0; i &amp;lt; sizeof(a) / sizeof(a[0]); i++)
		if (tmp &amp;lt; a[i])
			tmp = a[i];
//		tmp &amp;lt; a[i] ? tmp = a[i] : tmp = tmp;

	return tmp;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;关键代码&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sizeof(a) / sizeof(a[0])
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这一段是网上流行(?)计算数组元素个数的代码&lt;/p&gt;
&lt;p&gt;但是在数组为指针的时候,经常会出错(C6384)&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;解决方法:&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;使用结构(struct)传递&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;struct a{
int b[5]}
xxx(struct a)
{
sizeof(a.b);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;似乎是因为在传递的时候,数组变成了一个指针...&lt;/p&gt;
</content:encoded></item><item><title>RPi配置watchdog和硬盘自动休眠</title><link>https://tski.uk/blog/rpi-watchdog-config/</link><guid isPermaLink="true">https://tski.uk/blog/rpi-watchdog-config/</guid><description>RPi配置watchdog和硬盘自动休眠</description><pubDate>Tue, 05 Nov 2019 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;rpi 3b watchdog&lt;/li&gt;
&lt;li&gt;硬盘闲置自动休眠&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;h1&gt;请依据CPU型号修改watchdog设备&lt;/h1&gt;
&lt;hr /&gt;
&lt;h1&gt;hdparm&lt;/h1&gt;
&lt;hr /&gt;
&lt;blockquote&gt;
&lt;p&gt;安装hdparm（略）&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;测试hdparm&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&quot;http://www.linux-magazine.com/Online/Features/Tune-Your-Hard-Disk-with-hdparm&quot;&gt;hdparm链接&lt;/a&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo hdparm -y /dev/sda1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;如果没有报错就支持&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo hdparm -I /dev/sda1|grep cache
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;如果看到有&quot;*&quot;就支持缓存&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;编辑hdparm&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;sudo nano /etc/hdparm.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;加入&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/dev/sda1 {
write_cache = on
spindown_time = 120
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;如果不支持缓存就不要加入write_cache那行&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;下面延时计算是 无操作休眠时间(分钟)*60/5&lt;/em&gt;&lt;/p&gt;
&lt;h1&gt;watchdog&lt;/h1&gt;
&lt;hr /&gt;
&lt;blockquote&gt;
&lt;p&gt;安装watchdog（略）&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;载入watchdog&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;sudo modprobe bcm2835_wdt
sudo nano /etc/modules
bcm2835_wdt
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;编辑配置&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;sudo /etc/watchdog.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;修改&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;max-load-1=24
watchdog-device = /dev/watchdog
watchdog-timeout=20
temperature-sensor      = /sys/class/thermal/thermal_zone0/temp
max-temperature = 85000
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;启动&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl enable watchdog.service
sudo chkconfig watchdog on
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;附赠一个fork bomb&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;:(){ :|: &amp;amp; };:
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>RPi搭建NAS</title><link>https://tski.uk/blog/rpi-nas/</link><guid isPermaLink="true">https://tski.uk/blog/rpi-nas/</guid><description>RPi搭建NAS</description><pubDate>Fri, 01 Nov 2019 21:26:58 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;安装&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;sudo apt install aria2
sudo apt install nginx
sudo apt install ntfs-3g
sudo apt install samba
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;aria2&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;配置&lt;/p&gt;
&lt;p&gt;把页面最下面那个配置文件复制到/etc/aria2/aria2.conf&lt;/p&gt;
&lt;p&gt;创建aria2用户&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo useradd -M -s /usr/sbin/nologin aria2
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;创建下载会话保存文件&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo touch /etc/aria2/aria2.session
sudo chown aria2 /etc/aria2 /etc/aria2/aria2.session
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;测试一下能不能启动&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;aria2c --conf-path=/etc/aria2/aria2.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;设置服务&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;sudo nano /lib/systemd/system/aria2.service
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;[Unit]
Description=Aria2 Service
After=network.target

[Service]
Type=simple
User=aria2
ExecStart=aria2c --conf-path=/etc/aria2/aria2.conf

[Install]
WantedBy=multi-user.target
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl start aria2.service
sudo systemctl enable aria2.service
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;AriaNg&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;cd /var/www
sudo rm -rf html
sudo mkdir html
cd html
sudo wget https://github.com/mayswind/AriaNg/releases/download/1.1.4/AriaNg-1.1.4.zip
sudo unzip AriaNg-1.1.4.zip
sudo rm AriaNg-1.1.4.zip
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;挂载NTFS硬盘&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;sudo apt-get install exfat-*
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;sudo fdisk -l			#看一下你的硬盘在哪
sudo mkdir /media/HDD	#挂载点
sudo mount /dev/sda1 /media/HDD
sudo nano /etc/fstab	#设置开机自动挂在
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;加一行&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/dev/sda1 /media/HDD auto rw,defaults 0 0
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;注意最好用auto，不指定文件系统。如果指定之后，以后转换为ext4分区的时候忘记改了，那就很好玩了&lt;/em&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;samba&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;sudo nano /etc/samba/smb.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;加入&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[share]
   comment = NAS
   path = /media/HDD
   read only = no
   writable = yes
   create mask = 0777
   directory mask = 0777
   guest ok = yes
   browseable = yes
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;blockquote&gt;
&lt;p&gt;aria2.conf&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;check-intergrity=true
#允许rpc
enable-rpc=true
#允许所有来源, web界面跨域权限需要
rpc-allow-origin-all=true
#允许非外部访问
rpc-listen-all=true
#RPC端口, 仅当默认端口被占用时修改
#rpc-listen-port=6800
# token验证
rpc-secret=****
#rpc-user=****
#rpc-passwd=****
#最大同时下载数(任务数), 路由建议值: 3
max-concurrent-downloads=3
#断点续传
continue=true
#同服务器连接数
max-connection-per-server=6
#最小文件分片大小, 下载线程数上限取决于能分出多少片, 对于小文件重要
min-split-size=10M
#单文件最大线程数, 路由建议值: 5
split=6
#下载速度限制
max-overall-download-limit=0
#单文件速度限制
max-download-limit=0
#上传速度限制
max-overall-upload-limit=0
#单文件速度限制
max-upload-limit=0

input-file=/etc/aria2/aria2.session
save-session=/etc/aria2/aria2.session
#定时保存会话，需要1.16.1之后的release版
save-session-interval=60

#文件保存路径, 默认为当前启动位置
dir=/media/HDD/Download
#文件缓存, 使用内置的文件缓存, 如果你不相信Linux内核文件缓存和磁盘内置缓存时使用, 需要1.16及以上版本
#disk-cache=0
#另一种Linux文件缓存方式, 使用前确保您使用的内核支持此选项, 需要1.15及以上版本(?)
#enable-mmap=true
#文件预分配, 能有效降低文件碎片, 提高磁盘性能. 缺点是预分配时间较长
#所需时间 none &amp;lt; falloc ? trunc &amp;lt;&amp;lt; prealloc, falloc和trunc需要文件系统和内核支持
#file-allocation=falloc

#启用本地节点查找
bt-enable-lpd=true
#添加额外的tracker
#bt-tracker=&amp;lt;URI&amp;gt;,
#单种子最大连接数
#bt-max-peers=55
#强制加密, 防迅雷必备
bt-require-crypto=true
#当下载的文件是一个种子(以.torrent结尾)时, 自动下载BT
follow-torrent=true
#BT监听端口, 当端口屏蔽时使用
listen-port=6881-6999

#不确定是否需要，为保险起见，need more test
enable-dht=false
bt-enable-lpd=false
enable-peer-exchange=false
#修改特征
user-agent=uTorrent/2210(25130)
peer-id-prefix=-UT2210-
#修改做种设置, 允许做种
seed-ratio=0
#保存会话
#force-save=true
bt-hash-check-seed=true
bt-seed-unverified=true
bt-save-metadata=true
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>RPi配置国内软件源</title><link>https://tski.uk/blog/rpi-apt-config/</link><guid isPermaLink="true">https://tski.uk/blog/rpi-apt-config/</guid><description>RPi配置国内软件源</description><pubDate>Fri, 01 Nov 2019 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;先使用官方源进行一次update&lt;/h2&gt;
&lt;h2&gt;查看系统版本(非常重要)&lt;/h2&gt;
&lt;p&gt;注意不要使用不是你系统版本的软件源&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;lsb_release -c
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;换源&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;sudo nano /etc/apt/sources.list
deb https://mirrors.ustc.edu.cn/raspbian/raspbian/ buster main contrib non-free
deb-src https://mirrors.ustc.edu.cn/raspbian/raspbian/ buster main contrib non-free
#deb http://raspbian.raspberrypi.org/raspbian/ buster main contrib non-free rpi
sudo nano /etc/apt/sources.list.d/raspi.list
deb http://mirrors.ustc.edu.cn/archive.raspberrypi.org/debian/ buster main ui
deb https://mirrors.tuna.tsinghua.edu.cn/raspberrypi/ buster main ui
#deb http://archive.raspberrypi.org/debian/ buster main
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;更新&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;sudo apt update
sudo apt upgrade
sudo apt dist-upgrade
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;加个新架构&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;dpkg --add-architecture arm
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>制作VS-C++便携版(基于VSCode)</title><link>https://tski.uk/blog/vscode-portable/</link><guid isPermaLink="true">https://tski.uk/blog/vscode-portable/</guid><description>制作基于VsCode的C++便携版</description><pubDate>Tue, 27 Aug 2019 11:41:03 GMT</pubDate><content:encoded>&lt;h2&gt;正文&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://eyun.baidu.com/s/3jJhjRmA&quot;&gt;不想动手可以直接下载的懒人版,密码QRSJ&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;VSCode&lt;/li&gt;
&lt;li&gt;LLVM&lt;/li&gt;
&lt;li&gt;mingw64&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://code.visualstudio.com/Download&quot;&gt;下载VSCode&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;注意选择下载压缩包格式。&lt;/strong&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;a href=&quot;http://releases.llvm.org/download.html&quot;&gt;下载LLVM&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;不需要选sig文件&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;注意选择&quot;Pre-Built Binaries&quot;,系统位数要对应你上面选的！&lt;/strong&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;a href=&quot;https://sourceforge.net/projects/mingw-w64/files/&quot;&gt;下载MinGW-W64&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;如果你系统版本是x64,下载x86_64-posix-seh。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;如果你系统版本是x32,下载x86_64-win32-seh。&lt;/strong&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;1.解压VSCode到某个地方,再把MinGW解压到VSCode的目录里&lt;/p&gt;
&lt;p&gt;我做这几部只是为了得到LLVM目录,卸载掉它只是因为不想让程序列表里太多&lt;strong&gt;非强迫症可以忽略2-4步,直接选择安装目录到第一步文件夹里&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;2.安装LLVM,先&lt;strong&gt;随便&lt;/strong&gt;安装到一个位置&lt;/p&gt;
&lt;p&gt;3.把LLVM目录整个拷到第1步里的目录里&lt;/p&gt;
&lt;p&gt;4.卸载掉你系统里的LLVM&lt;/p&gt;
&lt;p&gt;5.将附件中!start.vbs和start.bat复制到第一步的文件夹中&lt;/p&gt;
&lt;p&gt;6.注释掉start.bat最后一行&lt;strong&gt;就是在最后一行前面加::&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;7.**!!这一步做完不要关!!**在cmd(或者power shell)中输入.\start.bat运行脚本,然后输入clang和gcc.&lt;strong&gt;如果出现xxx不是内部或外部命令,就说明你start.bat配置有问题&lt;/strong&gt; 。&lt;/p&gt;
&lt;p&gt;8.在你第1步的文件夹中新建以下名字的&lt;strong&gt;文件夹&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Users
Users\AppData
Users\AppData\Local
Users\AppData\Roaming
Users\AppData\Desktop

extensions
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;9.安装扩展&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Chinese(简中语言包)
C/C++
vscode-clangd
Code Runner
Bracket Pair Colorizer 2
One Dark Pro(主题包,可选)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;10.在第7步中的cmd(或power shell)中输入.\code.exe进入VSCode&lt;/p&gt;
&lt;p&gt;11.在文件浏览器中新建一个目录(&lt;strong&gt;我就直接在第1步的目录中新建了一个!Code&lt;/strong&gt;),然后在VSCode中打开它,然后选择将工作区另存为&lt;/p&gt;
&lt;p&gt;需要注意的是这里你把每个语言的工作目录放到单独的文件夹中,比如c放到c中,c++放到c++中&lt;/p&gt;
&lt;p&gt;12.在!Code中又新建一个名叫C++的文件夹**(具体参照自身情况)**&lt;/p&gt;
&lt;p&gt;13.在C++目录中新建一个.vscode的文件夹,然后在里面把附件中的launch.json,tasks.json,settings.json,compile_flags.txt复制进去&lt;/p&gt;
&lt;p&gt;14.取消第6步中的注释,关掉这个VSCode.运行!start.vbs&lt;/p&gt;
&lt;p&gt;15.新建一个文件,输入点什么测试代码&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
using namespace std;
int main (){
    string a=&quot;&quot;;
    cout &amp;lt;&amp;lt; &quot;Input:&quot; &amp;lt;&amp;lt; endl;
    cin &amp;gt;&amp;gt; a;
    cout &amp;lt;&amp;lt; a;
    return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;16.点击右上箭头,看看控制台是不是输出了Input:.然后输入随便什么东西,看看它会不会原封不动的显示出来&lt;/p&gt;
&lt;p&gt;17.没了&lt;/p&gt;
&lt;h2&gt;附件&lt;/h2&gt;
&lt;hr /&gt;
&lt;h3&gt;start.bat&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;set ThisDir=%~dp0
set USERPROFILE=%ThisDir%Users
set APPDATA=%USERPROFILE%\AppData\Roaming
set path=%ThisDir%LLVM\bin;%ThisDir%mingw64\bin;%path%
REM Code.exe --extensions-dir &quot;extensions&quot;
Code.exe !Code\C++\code.code-workspace
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;!start.vbs&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;set ws=createobject(&quot;wscript.shell&quot;)
ws.run &quot;start.bat&quot;,0
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;launch.json&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;{
    &quot;version&quot;: &quot;0.2.0&quot;,
    &quot;configurations&quot;: [
        {
            &quot;name&quot;: &quot;(gdb) Launch&quot;,
            &quot;type&quot;: &quot;cppdbg&quot;,
            &quot;request&quot;: &quot;launch&quot;,
            &quot;program&quot;: &quot;${fileDirname}/${fileBasenameNoExtension}.exe&quot;,
            &quot;args&quot;: [],
            &quot;stopAtEntry&quot;: false,
            &quot;cwd&quot;: &quot;${workspaceFolder}&quot;,
            &quot;environment&quot;: [],
            &quot;externalConsole&quot;: true,
            &quot;internalConsoleOptions&quot;: &quot;neverOpen&quot;,
            &quot;MIMode&quot;: &quot;gdb&quot;,
            &quot;miDebuggerPath&quot;: &quot;gdb.exe&quot;,
            &quot;setupCommands&quot;: [
                {
                    &quot;description&quot;: &quot;Enable pretty-printing for gdb&quot;,
                    &quot;text&quot;: &quot;-enable-pretty-printing&quot;,
                    &quot;ignoreFailures&quot;: false
                }
            ],
            &quot;preLaunchTask&quot;: &quot;Compile&quot;
        }
    ]
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;tasks.json&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;{
    &quot;version&quot;: &quot;2.0.0&quot;,
    &quot;tasks&quot;: [
        {
            &quot;label&quot;: &quot;Compile&quot;,
            &quot;command&quot;: &quot;clang++&quot;, //如果你是用c语言,改成clang
            &quot;args&quot;: [
                &quot;${file}&quot;,
                &quot;-o&quot;,
                &quot;${fileDirname}/${fileBasenameNoExtension}.exe&quot;,
                &quot;-g&quot;,
                &quot;-Wall&quot;,
                &quot;-static-libgcc&quot;,
                &quot;--target=x86_64-w64-mingw&quot;,
            ],
            &quot;type&quot;: &quot;process&quot;,
            &quot;group&quot;: {
                &quot;kind&quot;: &quot;build&quot;,
                &quot;isDefault&quot;: true
            },
            &quot;presentation&quot;: {
                &quot;echo&quot;: true,
                &quot;reveal&quot;: &quot;always&quot;,
                &quot;focus&quot;: false,
                &quot;panel&quot;: &quot;shared&quot;
            },
        }
    ]
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;settings.json&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;{
    &quot;files.defaultLanguage&quot;: &quot;c&quot;,
    &quot;editor.formatOnType&quot;: true,
    &quot;editor.suggest.snippetsPreventQuickSuggestions&quot;: false,
    &quot;editor.acceptSuggestionOnEnter&quot;: &quot;off&quot;,

    &quot;code-runner.runInTerminal&quot;: true,
    &quot;code-runner.executorMap&quot;: {
        &quot;c&quot;: &quot;cd $dir &amp;amp;&amp;amp; clang &apos;$fileName&apos; -o &apos;$fileNameWithoutExt.exe&apos; -Wall -g -O2 -static-libgcc --target=x86_64-w64-mingw -std=c11 &amp;amp;&amp;amp; &amp;amp;&apos;$dir$fileNameWithoutExt&apos;&quot;,
        &quot;cpp&quot;: &quot;cd $dir &amp;amp;&amp;amp; clang++ &apos;$fileName&apos; -o &apos;$fileNameWithoutExt.exe&apos; -Wall -g -O2 -static-libgcc --target=x86_64-w64-mingw -std=c++17 &amp;amp;&amp;amp; &amp;amp;&apos;$dir$fileNameWithoutExt&apos;&quot;
    },
    &quot;code-runner.saveFileBeforeRun&quot;: true,
    &quot;code-runner.preserveFocus&quot;: true,
    &quot;code-runner.clearPreviousOutput&quot;: false,
    &quot;code-runner.ignoreSelection&quot;: true,

    &quot;C_Cpp.clang_format_sortIncludes&quot;: true,
    &quot;C_Cpp.errorSquiggles&quot;: &quot;Disabled&quot;,
    &quot;C_Cpp.autocomplete&quot;: &quot;Disabled&quot;,
    &quot;C_Cpp.suggestSnippets&quot;: false,
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;compile_flags.txt&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;-Wall
--target=x86_64-w64-mingw
-std=c++17
#写的语言是C,注释掉上面那行
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>DEMO_Markdown</title><link>https://tski.uk/blog/edit/</link><guid isPermaLink="true">https://tski.uk/blog/edit/</guid><description>Markdown模板</description><pubDate>Sat, 24 Aug 2019 01:36:48 GMT</pubDate><content:encoded>&lt;h1&gt;欢迎使用 Cmd Markdown 编辑阅读器&lt;/h1&gt;
&lt;hr /&gt;
&lt;p&gt;我们理解您需要更便捷更高效的工具记录思想，整理笔记、知识，并将其中承载的价值传播给他人，&lt;strong&gt;Cmd Markdown&lt;/strong&gt; 是我们给出的答案 —— 我们为记录思想和分享知识提供更专业的工具。 您可以使用 Cmd Markdown：&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;整理知识，学习笔记&lt;/li&gt;
&lt;li&gt;发布日记，杂文，所见所想&lt;/li&gt;
&lt;li&gt;撰写发布技术文稿（代码支持）&lt;/li&gt;
&lt;li&gt;撰写发布学术论文（LaTeX 公式支持）&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;https://www.zybuluo.com/static/img/logo.png&quot; alt=&quot;cmd-markdown-logo&quot; /&gt;&lt;/p&gt;
&lt;p&gt;除了您现在看到的这个 Cmd Markdown 在线版本，您还可以前往以下网址下载：&lt;/p&gt;
&lt;h3&gt;&lt;a href=&quot;https://www.zybuluo.com/cmd/&quot;&gt;Windows/Mac/Linux 全平台客户端&lt;/a&gt;&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;请保留此份 Cmd Markdown 的欢迎稿兼使用说明，如需撰写新稿件，点击顶部工具栏右侧的 &amp;lt;i class=&quot;icon-file&quot;&amp;gt;&amp;lt;/i&amp;gt; &lt;strong&gt;新文稿&lt;/strong&gt; 或者使用快捷键 &lt;code&gt;Ctrl+Alt+N&lt;/code&gt;。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;什么是 Markdown&lt;/h2&gt;
&lt;p&gt;Markdown 是一种方便记忆、书写的纯文本标记语言，用户可以使用这些标记符号以最小的输入代价生成极富表现力的文档：譬如您正在阅读的这份文档。它使用简单的符号标记不同的标题，分割不同的段落，&lt;strong&gt;粗体&lt;/strong&gt; 或者 &lt;em&gt;斜体&lt;/em&gt; 某些文字，更棒的是，它还可以&lt;/p&gt;
&lt;h3&gt;1. 制作一份待办事宜 &lt;a href=&quot;https://www.zybuluo.com/mdeditor?url=https://www.zybuluo.com/static/editor/md-help.markdown#13-%E5%BE%85%E5%8A%9E%E4%BA%8B%E5%AE%9C-todo-%E5%88%97%E8%A1%A8&quot;&gt;Todo 列表&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;[ ] 支持以 PDF 格式导出文稿&lt;/li&gt;
&lt;li&gt;[ ] 改进 Cmd 渲染算法，使用局部渲染技术提高渲染效率&lt;/li&gt;
&lt;li&gt;[x] 新增 Todo 列表功能&lt;/li&gt;
&lt;li&gt;[x] 修复 LaTex 公式渲染问题&lt;/li&gt;
&lt;li&gt;[x] 新增 LaTex 公式编号功能&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2. 书写一个质能守恒公式[^LaTeX]&lt;/h3&gt;
&lt;p&gt;$$E=mc^2$$&lt;/p&gt;
&lt;h3&gt;3. 高亮一段代码[^code]&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;@requires_authorization
class SomeClass:
    pass

if __name__ == &apos;__main__&apos;:
    # A comment
    print &apos;hello world&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;4. 高效绘制 &lt;a href=&quot;https://www.zybuluo.com/mdeditor?url=https://www.zybuluo.com/static/editor/md-help.markdown#7-%E6%B5%81%E7%A8%8B%E5%9B%BE&quot;&gt;流程图&lt;/a&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;st=&amp;gt;start: Start
op=&amp;gt;operation: Your Operation
cond=&amp;gt;condition: Yes or No?
e=&amp;gt;end

st-&amp;gt;op-&amp;gt;cond
cond(yes)-&amp;gt;e
cond(no)-&amp;gt;op
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;5. 高效绘制 &lt;a href=&quot;https://www.zybuluo.com/mdeditor?url=https://www.zybuluo.com/static/editor/md-help.markdown#8-%E5%BA%8F%E5%88%97%E5%9B%BE&quot;&gt;序列图&lt;/a&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;Alice-&amp;gt;Bob: Hello Bob, how are you?
Note right of Bob: Bob thinks
Bob--&amp;gt;Alice: I am good thanks!
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;6. 高效绘制 &lt;a href=&quot;https://www.zybuluo.com/mdeditor?url=https://www.zybuluo.com/static/editor/md-help.markdown#9-%E7%94%98%E7%89%B9%E5%9B%BE&quot;&gt;甘特图&lt;/a&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;    title 项目开发流程
    section 项目确定
        需求分析       :a1, 2016-06-22, 3d
        可行性报告     :after a1, 5d
        概念验证       : 5d
    section 项目实施
        概要设计      :2016-07-05  , 5d
        详细设计      :2016-07-08, 10d
        编码          :2016-07-15, 10d
        测试          :2016-07-22, 5d
    section 发布验收
        发布: 2d
        验收: 3d
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;7. 绘制表格&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;项目&lt;/th&gt;
&lt;th&gt;价格&lt;/th&gt;
&lt;th&gt;数量&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;计算机&lt;/td&gt;
&lt;td&gt;$1600&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;手机&lt;/td&gt;
&lt;td&gt;$12&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;管线&lt;/td&gt;
&lt;td&gt;$1&lt;/td&gt;
&lt;td&gt;234&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;8. 更详细语法说明&lt;/h3&gt;
&lt;p&gt;想要查看更详细的语法说明，可以参考我们准备的 &lt;a href=&quot;https://www.zybuluo.com/mdeditor?url=https://www.zybuluo.com/static/editor/md-help.markdown&quot;&gt;Cmd Markdown 简明语法手册&lt;/a&gt;，进阶用户可以参考 &lt;a href=&quot;https://www.zybuluo.com/mdeditor?url=https://www.zybuluo.com/static/editor/md-help.markdown#cmd-markdown-%E9%AB%98%E9%98%B6%E8%AF%AD%E6%B3%95%E6%89%8B%E5%86%8C&quot;&gt;Cmd Markdown 高阶语法手册&lt;/a&gt; 了解更多高级功能。&lt;/p&gt;
&lt;p&gt;总而言之，不同于其它 &lt;em&gt;所见即所得&lt;/em&gt; 的编辑器：你只需使用键盘专注于书写文本内容，就可以生成印刷级的排版格式，省却在键盘和工具栏之间来回切换，调整内容和格式的麻烦。&lt;strong&gt;Markdown 在流畅的书写和印刷级的阅读体验之间找到了平衡。&lt;/strong&gt; 目前它已经成为世界上最大的技术分享网站 GitHub 和 技术问答网站 StackOverFlow 的御用书写格式。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;什么是 Cmd Markdown&lt;/h2&gt;
&lt;p&gt;您可以使用很多工具书写 Markdown，但是 Cmd Markdown 是这个星球上我们已知的、最好的 Markdown 工具——没有之一 ：）因为深信文字的力量，所以我们和你一样，对流畅书写，分享思想和知识，以及阅读体验有极致的追求，我们把对于这些诉求的回应整合在 Cmd Markdown，并且一次，两次，三次，乃至无数次地提升这个工具的体验，最终将它演化成一个 &lt;strong&gt;编辑/发布/阅读&lt;/strong&gt; Markdown 的在线平台——您可以在任何地方，任何系统/设备上管理这里的文字。&lt;/p&gt;
&lt;h3&gt;1. 实时同步预览&lt;/h3&gt;
&lt;p&gt;我们将 Cmd Markdown 的主界面一分为二，左边为&lt;strong&gt;编辑区&lt;/strong&gt;，右边为&lt;strong&gt;预览区&lt;/strong&gt;，在编辑区的操作会实时地渲染到预览区方便查看最终的版面效果，并且如果你在其中一个区拖动滚动条，我们有一个巧妙的算法把另一个区的滚动条同步到等价的位置，超酷！&lt;/p&gt;
&lt;h3&gt;2. 编辑工具栏&lt;/h3&gt;
&lt;p&gt;也许您还是一个 Markdown 语法的新手，在您完全熟悉它之前，我们在 &lt;strong&gt;编辑区&lt;/strong&gt; 的顶部放置了一个如下图所示的工具栏，您可以使用鼠标在工具栏上调整格式，不过我们仍旧鼓励你使用键盘标记格式，提高书写的流畅度。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.zybuluo.com/static/img/toolbar-editor.png&quot; alt=&quot;tool-editor&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;3. 编辑模式&lt;/h3&gt;
&lt;p&gt;完全心无旁骛的方式编辑文字：点击 &lt;strong&gt;编辑工具栏&lt;/strong&gt; 最右侧的拉伸按钮或者按下 &lt;code&gt;Ctrl + M&lt;/code&gt;，将 Cmd Markdown 切换到独立的编辑模式，这是一个极度简洁的写作环境，所有可能会引起分心的元素都已经被挪除，超清爽！&lt;/p&gt;
&lt;h3&gt;4. 实时的云端文稿&lt;/h3&gt;
&lt;p&gt;为了保障数据安全，Cmd Markdown 会将您每一次击键的内容保存至云端，同时在 &lt;strong&gt;编辑工具栏&lt;/strong&gt; 的最右侧提示 &lt;code&gt;已保存&lt;/code&gt; 的字样。无需担心浏览器崩溃，机器掉电或者地震，海啸——在编辑的过程中随时关闭浏览器或者机器，下一次回到 Cmd Markdown 的时候继续写作。&lt;/p&gt;
&lt;h3&gt;5. 离线模式&lt;/h3&gt;
&lt;p&gt;在网络环境不稳定的情况下记录文字一样很安全！在您写作的时候，如果电脑突然失去网络连接，Cmd Markdown 会智能切换至离线模式，将您后续键入的文字保存在本地，直到网络恢复再将他们传送至云端，即使在网络恢复前关闭浏览器或者电脑，一样没有问题，等到下次开启 Cmd Markdown 的时候，她会提醒您将离线保存的文字传送至云端。简而言之，我们尽最大的努力保障您文字的安全。&lt;/p&gt;
&lt;h3&gt;6. 管理工具栏&lt;/h3&gt;
&lt;p&gt;为了便于管理您的文稿，在 &lt;strong&gt;预览区&lt;/strong&gt; 的顶部放置了如下所示的 &lt;strong&gt;管理工具栏&lt;/strong&gt;：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.zybuluo.com/static/img/toolbar-manager.jpg&quot; alt=&quot;tool-manager&quot; /&gt;&lt;/p&gt;
&lt;p&gt;通过管理工具栏可以：&lt;/p&gt;
&lt;p&gt;&amp;lt;i class=&quot;icon-share&quot;&amp;gt;&amp;lt;/i&amp;gt; 发布：将当前的文稿生成固定链接，在网络上发布，分享
&amp;lt;i class=&quot;icon-file&quot;&amp;gt;&amp;lt;/i&amp;gt; 新建：开始撰写一篇新的文稿
&amp;lt;i class=&quot;icon-trash&quot;&amp;gt;&amp;lt;/i&amp;gt; 删除：删除当前的文稿
&amp;lt;i class=&quot;icon-cloud&quot;&amp;gt;&amp;lt;/i&amp;gt; 导出：将当前的文稿转化为 Markdown 文本或者 Html 格式，并导出到本地
&amp;lt;i class=&quot;icon-reorder&quot;&amp;gt;&amp;lt;/i&amp;gt; 列表：所有新增和过往的文稿都可以在这里查看、操作
&amp;lt;i class=&quot;icon-pencil&quot;&amp;gt;&amp;lt;/i&amp;gt; 模式：切换 普通/Vim/Emacs 编辑模式&lt;/p&gt;
&lt;h3&gt;7. 阅读工具栏&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://www.zybuluo.com/static/img/toolbar-reader.jpg&quot; alt=&quot;tool-manager&quot; /&gt;&lt;/p&gt;
&lt;p&gt;通过 &lt;strong&gt;预览区&lt;/strong&gt; 右上角的 &lt;strong&gt;阅读工具栏&lt;/strong&gt;，可以查看当前文稿的目录并增强阅读体验。&lt;/p&gt;
&lt;p&gt;工具栏上的五个图标依次为：&lt;/p&gt;
&lt;p&gt;&amp;lt;i class=&quot;icon-list&quot;&amp;gt;&amp;lt;/i&amp;gt; 目录：快速导航当前文稿的目录结构以跳转到感兴趣的段落
&amp;lt;i class=&quot;icon-chevron-sign-left&quot;&amp;gt;&amp;lt;/i&amp;gt; 视图：互换左边编辑区和右边预览区的位置
&amp;lt;i class=&quot;icon-adjust&quot;&amp;gt;&amp;lt;/i&amp;gt; 主题：内置了黑白两种模式的主题，试试 &lt;strong&gt;黑色主题&lt;/strong&gt;，超炫！
&amp;lt;i class=&quot;icon-desktop&quot;&amp;gt;&amp;lt;/i&amp;gt; 阅读：心无旁骛的阅读模式提供超一流的阅读体验
&amp;lt;i class=&quot;icon-fullscreen&quot;&amp;gt;&amp;lt;/i&amp;gt; 全屏：简洁，简洁，再简洁，一个完全沉浸式的写作和阅读环境&lt;/p&gt;
&lt;h3&gt;8. 阅读模式&lt;/h3&gt;
&lt;p&gt;在 &lt;strong&gt;阅读工具栏&lt;/strong&gt; 点击 &amp;lt;i class=&quot;icon-desktop&quot;&amp;gt;&amp;lt;/i&amp;gt; 或者按下 &lt;code&gt;Ctrl+Alt+M&lt;/code&gt; 随即进入独立的阅读模式界面，我们在版面渲染上的每一个细节：字体，字号，行间距，前背景色都倾注了大量的时间，努力提升阅读的体验和品质。&lt;/p&gt;
&lt;h3&gt;9. 标签、分类和搜索&lt;/h3&gt;
&lt;p&gt;在编辑区任意行首位置输入以下格式的文字可以标签当前文档：&lt;/p&gt;
&lt;p&gt;标签： 未分类&lt;/p&gt;
&lt;p&gt;标签以后的文稿在【文件列表】（Ctrl+Alt+F）里会按照标签分类，用户可以同时使用键盘或者鼠标浏览查看，或者在【文件列表】的搜索文本框内搜索标题关键字过滤文稿，如下图所示：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.zybuluo.com/static/img/file-list.png&quot; alt=&quot;file-list&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;10. 文稿发布和分享&lt;/h3&gt;
&lt;p&gt;在您使用 Cmd Markdown 记录，创作，整理，阅读文稿的同时，我们不仅希望它是一个有力的工具，更希望您的思想和知识通过这个平台，连同优质的阅读体验，将他们分享给有相同志趣的人，进而鼓励更多的人来到这里记录分享他们的思想和知识，尝试点击 &amp;lt;i class=&quot;icon-share&quot;&amp;gt;&amp;lt;/i&amp;gt; (Ctrl+Alt+P) 发布这份文档给好友吧！&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;再一次感谢您花费时间阅读这份欢迎稿，点击 &amp;lt;i class=&quot;icon-file&quot;&amp;gt;&amp;lt;/i&amp;gt; (Ctrl+Alt+N) 开始撰写新的文稿吧！祝您在这里记录、阅读、分享愉快！&lt;/p&gt;
&lt;p&gt;作者 &lt;a href=&quot;http://weibo.com/ghosert&quot;&gt;@ghosert&lt;/a&gt;&lt;br /&gt;
2016 年 07月 07日&lt;/p&gt;
&lt;p&gt;[^LaTeX]: 支持 &lt;strong&gt;LaTeX&lt;/strong&gt; 编辑显示支持，例如：$\sum_{i=1}^n a_i=0$， 访问 &lt;a href=&quot;http://meta.math.stackexchange.com/questions/5020/mathjax-basic-tutorial-and-quick-reference&quot;&gt;MathJax&lt;/a&gt; 参考更多使用方法。&lt;/p&gt;
&lt;p&gt;[^code]: 代码高亮功能支持包括 Java, Python, JavaScript 在内的，&lt;strong&gt;四十一&lt;/strong&gt;种主流编程语言。&lt;/p&gt;
</content:encoded></item><item><title>测试页面</title><link>https://tski.uk/blog/test-page/</link><guid isPermaLink="true">https://tski.uk/blog/test-page/</guid><description>测试页面。</description><pubDate>Fri, 27 Aug 2010 11:41:03 GMT</pubDate><content:encoded>&lt;p&gt;&amp;lt;style&amp;gt;
a {
text-decoration: none!important
}&lt;/p&gt;
&lt;p&gt;#globalAd {
max-width: 400px;
flex-basis: 100%;
margin: 0 auto;
background: #fff;
border-radius: 10px;
box-shadow: 0 0 30px rgba(0, 0, 0, .3);
-webkit-box-shadow: 0 0 30px rgba(0, 0, 0, .3);
overflow: hidden;
position: fixed;
display: none;
margin: 0 auto;
z-index: 10001
}&lt;/p&gt;
&lt;p&gt;.layer {
width: 100%;
height: 100%;
position: fixed;
top: 0;
left: 0;
filter: alpha(opacity=50);
opacity: .5;
background: #000;
z-index: 1000;
display: none
}&lt;/p&gt;
&lt;p&gt;#globalAd #hero-img {
width: 100%;
height: 100px;
background: #007bff
}&lt;/p&gt;
&lt;p&gt;#globalAd #profile-img {
width: 80px;
height: 80px;
margin: -80px auto 0;
border: 6px solid #fff;
border-radius: 50%;
box-shadow: 0 0 5px rgba(90, 90, 90, .3)
}&lt;/p&gt;
&lt;p&gt;#globalAd #profile-img img {
width: 100%;
background: #fff;
border-radius: 50%
}&lt;/p&gt;
&lt;p&gt;#globalAd #content {
text-align: center;
width: 320px;
margin: 0 auto;
padding: 0 0 50px
}&lt;/p&gt;
&lt;p&gt;#container #content h1 {
font-size: 29px;
font-weight: 500;
margin: 50px 0 0
}&lt;/p&gt;
&lt;p&gt;#globalAd #content p {
font-size: 18px;
font-weight: 400;
line-height: 1.4;
color: #666;
}&lt;/p&gt;
&lt;p&gt;#globalAd #content a {
color: #ccc;
font-size: 14px;
margin: 0 10px;
transition: color .3s ease-in-out;
-webkit-transition: color .3s ease-in-out
}&lt;/p&gt;
&lt;p&gt;#globalAd #content a:hover {
color: #007bff
}&lt;/p&gt;
&lt;p&gt;#globalAd #content .btn {
background: none repeat scroll 0 0 #1ba1e2;
border: 0;
border-radius: 2px;
color: #fff!important;
cursor: pointer;
font-family: open sans, hiragino sans gb, microsoft yahei, wenquanyi micro hei, Arial, Verdana, Tahoma, sans-serif;
font-size: 14px;
padding: 6px 10%
}&lt;/p&gt;
&lt;p&gt;#globalAd #content .btn:hover,
.yanshibtn:hover {
background: none repeat scroll 0 0 #9b59b6;
border: 0;
border-radius: 2px;
color: #fff!important;
cursor: pointer;
font-family: open sans, hiragino sans gb, microsoft yahei, wenquanyi micro hei, Arial, Verdana, Tahoma, sans-serif;
font-size: 14px;
padding: 8px 10%
}
&amp;lt;/style&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;div class=&quot;layer&quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;div id=&quot;globalAd&quot;&amp;gt;
&amp;lt;div id=&apos;hero-img&apos; style=&quot;background-color: #1a95ff;background: linear-gradient(to left, #5dadf3 0, #4583ca 100%);&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div id=&apos;profile-img&apos;&amp;gt;
&amp;lt;img src=&quot;1.jpg&quot; /&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div id=&apos;content&apos;&amp;gt;
&amp;lt;p style=&quot;font-size: 16px;font-weight: bold;&quot;&amp;gt;冰豆网公告&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;冰豆网提示你&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;使用cookie记录&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;一天只弹一次&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;为了好看！冲啊啊啊啊啊！&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;冰豆网&amp;lt;/p&amp;gt;
&amp;lt;a onClick=&quot;closeGlobalAd();&quot; class=&quot;btn btn-default&quot; rel=&apos;nofollow&apos;&amp;gt;朕已阅&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;https://www.bingdou.net&quot; onClick=&quot;redirectUrlToActive();&quot; class=&quot;btn btn-default&quot; rel=&apos;nofollow&apos;&amp;gt;点击访问&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;script src=&quot;https://api.bingdou.net/js/js.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script&amp;gt;
jQuery.cookie = function(name, value, options) {
if(typeof value != &apos;undefined&apos;) {
options = options || {};
if(value === null) {
value = &apos;&apos;;
options.expires = -1;
}
var expires = &apos;&apos;;
if(options.expires &amp;amp;&amp;amp; (typeof options.expires == &apos;number&apos; || options.expires.toUTCString)) {
var date;
if(typeof options.expires == &apos;number&apos;) {
date = new Date();
var totalTime = 24 * 3600;
var hour = date.getHours();
var minutes = date.getMinutes();
var seconds = date.getSeconds();
var pastTime = 3600 * hour + 60 * minutes + seconds;
var leftTime = totalTime - pastTime;
date.setTime(date.getTime() + (options.expires * leftTime * 1000));
} else {
date = options.expires;
}
expires = &apos;; expires=&apos; + date.toUTCString();
}
var path = options.path ? &apos;; path=&apos; + (options.path) : &apos;&apos;;
var domain = options.domain ? &apos;; domain=&apos; + (options.domain) : &apos;&apos;;
var secure = options.secure ? &apos;; secure&apos; : &apos;&apos;;
document.cookie = [name, &apos;=&apos;, encodeURIComponent(value), expires, path, domain, secure].join(&apos;&apos;);
} else {
var cookieValue = null;
if(document.cookie &amp;amp;&amp;amp; document.cookie != &apos;&apos;) {
var cookies = document.cookie.split(&apos;;&apos;);
for(var i = 0; i &amp;lt; cookies.length; i++) {
var cookie = jQuery.trim(cookies[i]);
if(cookie.substring(0, name.length + 1) == (name + &apos;=&apos;)) {
cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
break;
}
}
}
return cookieValue;
}
};
$(function() {
var COOKIE_NAME = &quot;erdangjiade&quot;;
if($.cookie(COOKIE_NAME)) {
$(&quot;.layer&quot;).hide();
$(&quot;#globalAd&quot;).hide();
} else {
var erdangjiadeH = $(window).height();
var erdangjiadeW = $(window).width();
$(&quot;.layer&quot;).show();
$(&quot;#globalAd&quot;).css({
&apos;top&apos;: erdangjiadeH / 2 - $(&quot;#globalAd&quot;).height() / 2,
&apos;left&apos;: erdangjiadeW / 2 - $(&quot;#globalAd&quot;).width() / 2
});
$(&quot;#globalAd&quot;).slideDown(300, function() {
setTimeout(&quot;closeGloableAd()&quot;, &apos;300000&apos;);
});
$.cookie(COOKIE_NAME, &quot;erdangjiade&quot;, {
path: &apos;/&apos;,
expires: 1
});
}
});&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;		function closeGlobalAd() {
			$(&apos;#globalAd&apos;).hide();
			$(&apos;.layer&apos;).hide();

		}

		function redirectUrlToActive() {
			$(&apos;#globalAd&apos;).hide();
			$(&apos;.layer&apos;).hide();
		}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;/script&amp;gt;&lt;/p&gt;
&lt;p&gt;https://evil-binary.github.io/
https://evil-binary.github.io/
https://evil-binary.github.io/&lt;/p&gt;
&lt;p&gt;&amp;lt;link rel=&quot;stylesheet&quot; href=&quot;https://cdn.bootcss.com/aplayer/1.10.1/APlayer.min.css&quot;&amp;gt;
&amp;lt;div id=&quot;aplayer&quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;script src=&quot;https://cdn.bootcss.com/aplayer/1.10.1/APlayer.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script&amp;gt;const ap = new APlayer({    container: document.getElementById(&apos;aplayer&apos;),
audio: [{
name: &apos;Renegade&apos;,
artist: &apos;塞壬唱片-MSR&apos;,
url: &apos;http://music.163.com/song/media/outer/url?id=1444493657.mp3&apos;,
cover: &apos;http://p1.music.126.net/qKU7UETrrdH-x7cZf-FfIw==/109951164949003058.jpg&apos;
}]});&amp;lt;/script&amp;gt;&lt;/p&gt;
&lt;p&gt;!!! warning
这是一条采用默认标题的警告信息。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s2.ax1x.com/2020/02/09/1h5Vqs.png&quot; alt=&quot;主界面&quot; /&gt;&lt;/p&gt;
</content:encoded></item></channel></rss>