- 记于:2026-04-01 上午
- 地点:浙江省·温州市·家里
- 天气:多云
简介#
插入排序是一种简单的排序算法,它的工作原理是通过将一个元素插入到已排序的子序列中,来实现排序。
将其想象成手中扑克牌的排序过程,这样就比较直观了。
实现#
1 | /** |
主要见 insertionSort 方法。
思路:
- 从第2个元素遍历,与左边的元素对比。
- 如果当前元素小于左边的元素,交换它们的位置。
- 继续对比左边的元素,直到找到比它大的或者到头。
参考#
- 《算法导论》
插入排序是一种简单的排序算法,它的工作原理是通过将一个元素插入到已排序的子序列中,来实现排序。
将其想象成手中扑克牌的排序过程,这样就比较直观了。
1 | /** |
主要见 insertionSort 方法。
思路:
开发的事情断断续续的,前后花了大概有一个月时间,开发完成后,激励活动时间大概还剩有两个月;
接下来就是准备上架了,上架流程反而是最麻烦的。
首先是准备上架华为鸿蒙应用市场,开始就是因为这边的赛事和激励活动才开发的应用;
我的应用属于社区类型的,华为市场的上架资质要求如下:
1 | (1)《安全评估报告》 |
《安全评估报告》
1 | 这个需要在【全国互联网安全管理服务平台】进行操作,底部有平台链接; |
ICP备案或《增值电信业务经营许可证》
1 | 支持群里说,我这社区类型的应用需要《增值电信业务经营许可证》; |
《软著》
1 | 支持群里说这个可以晚点,等应用上架后再处理。 |
先说ICP备案的,这事情异常麻烦;
我用的是百度云服务器,就在上面提交应用的备案信息;
很快就被驳回了,理由也是社区类的应用需要《增值电信业务经营许可证》,然后才能进行ICP备案;
又提交了几次,备注里说了应用是非经营性的,都驳回了;
然后提工单,我说明了根据规定,非经营性应用无需许可证,反正对方意思是,只要是社区类型的就要许可证;
来回交涉几次,后来对方来电,我再次强调我的应用是非盈利的,并要求对方给出驳回的明确依据;
其实法条/规定本身是比较宽松的,但是服务商抓的紧,可能是为了规避责任或图省事吧;
后来对方肯定是拿不出具体驳回的规定依据,就要求我去咨询管局,拿到可以备案的证明;
然后我咨询了浙江省的通信管理局,向其明确确认非营利性应用不需要《增值电信业务经营许可证》就可以进行ICP备案;
我提取了电话录音,再次提交,这次终于是过了。
当然后面还有域名的备案,这跟应用备案里填写的域名信息是两回事,所以又花了点时间。
再来说下《安全评估报告》,这事本身还算顺利,只是等待周期比较长;
提交后,信息流转到本地公安(网管相关部门吧),电话联系询问了一些信息;
由于计划同时上架微信小程序,而那边的【社区】类目必须要公司主体才能选择,所以应用是以公司主体进行备案的;
所以公安那边说最好用公司主体重新提交,然后我就用公司主体重新提交了一份,后来审核过了;
后面华为鸿蒙应用上架的时候问题就来了,进行应用资质审核的时候,由于应用在个人主体的华为账号下,而《安全评估报告》是公司主体,导致主体不一致而驳回,当然其他应用bug方面的问题也有;
另外一个大的问题就是罪恶的审核3.5事项(底部有链接),也是活动大群里很多人吐槽的,以“应用内容单一、不丰富”之类的理由驳回,完全不匹配,完全不合理,根本就是用来卡控的手段;
主体不一致的问题,要么注册公司主体的账号,所有信息重新配置,包括包名占用问题,得先注销,还有证书之类的要重新申请,还得重新进行应用备案(证书也得备案~),非常麻烦且耗时;
或者就是进行应用迁移,在问了支持群后,说这个暂时只支持上架后的应用进行迁移;
上架事宜又搁置了一段时间;
后来活动截止时间逼近,又开始进行问题修复。
对于主体不一致的问题,正准备使用下策,自己手动一点点重新填写和配置信息(重新备案的事情肯定来不及只能延后了,会不会因为备案信息不一致被驳回也不知道);
这时无意间发现了“迁移”按钮,未上架的应用现在也支持迁移了;
再提交了迁移申请后,等了一两天,终于是审核通过并完成迁移。
接下来就是3.5事项的问题了,顺带着其他bug也修复了下,提交后反正驳回原因中一直带有3.5事项;
虽然距离月底12.31没剩几天了,但是也没办法;期间倒是把微信小程序先给上架了;
最后几天,再次提交审核,备注里强调了这是第一个版本,后续还要继续完善功能的,如果还要驳回,请明确指出具体命中哪一行哪一句规则;
然后审核了好几天,我一直催审,同时在支持群里反馈;
所幸最后一天终于是审核通过并上架了。
成功上架后,也是松一口气了,想着到时候有5千到1万的激励奖金,心情舒畅;
同时也在大群里说了成功上架的事;
直到晚上20点左右,刺激的来了~
一位群友问我商户服务开通了没,我脑子一懵,什么商户服务,看了他发的截图,看了活动规则,写着“若您报名的开发者账号在2025年12月31日前仍未成功开通商户服务,视为放弃激励。”;
晚上回去21点多了,赶紧申请开通商户服务,提了加急工单,但是都已经下班了,最后无果,没赶上;
然后过两天商户服务通过了,为时已晚,我在支持群里问了,也提了工单咨询,说是这种情况就是拿不到激励奖金了~
简单总结一下,这事费时费力,最后没拿到奖金,个人认为按照活动初衷,开发者有效建设鸿蒙生态,不应该在这种问题上卡脖子;
不过规则如此,愿赌服输,也是没有办法;
说起来也只能是自己的问题了,其实一开始肯定是有看到这个规则的,但是整个开发和上架周期太长了,开始不急于处理这个事情,最后几天又这么赶,忙起来就把这事给漏掉了;
鸿蒙这边的事情就先翻篇了,接下来以微信小程序那边为主,有空就迭代功能。
顺便吐槽下,开发才花了一个月,备案的时间比开发还长,难度还这么大,真是不知道说什么好。
还有微信小程序那边我也要吐槽一下,3天驳回15次,真的想骂人,还是忍住了。
然后,26年,再接再厉吧!~
1 | ## AI角色和职责定义 |
一开始是为了参加华为鸿蒙极客松比赛而开发的,大概是25年5月份左右;
时间上比较仓促,剩最后10来天才知道这个比赛,然后实际花了一个星期左右才勉强完成前后端开发;
app是用鸿蒙原生开发的,之前有看过一些官方教程;
总之最后是没有入围,意料之中,我感觉是我审错题了~;
搁置了一段时间,后来又有鸿蒙的激励计划,截止25年年底活动还剩3个多月,也就是9月、10月份左右知道这个活动的;
这时候是准备用uniappx重新开发,它支持鸿蒙,同时也想着可以发布到微信小程序;
接下来就是开始探索开发了。
一句话介绍:“一款针对云彩相关主题的图文社交APP;主要功能有:发布和浏览图文、点赞评论收藏关注等互动、云百科信息查看、个人主页等。”
底部有鸿蒙应用商店的链接,这里就不贴图了。
微信上搜索【每日云彩】也能搜到小程序版本。
功能上其实没有做什么调研和思考,会不会有用户喜欢也不清楚,就是自己想了一下,做按自己的需求和理解做了;
现在既然两个平台都已经上架了,这样我也有动力继续迭代下去,哪怕没什么人用;
目前只是初版,功能也比较简单,后续还是会用业余时间逐步迭代,不过具体功能的话可能还是以自己的需求为主,如果有真实用户提需求和建议的话,我也会考虑的。
对于前端部分,之前开发过微信小程序,也懂一点vuejs,uniapp也接触过一些,大概属于需要搜索引擎和AI辅助的程度;
uniapp和uniappx都支持鸿蒙,对比了一下,网上查查,AI问问,最终是选择了uniappx;
然后,全手写是不可能的~整个app端几乎90%以上是AI写的;
万事开头难,开始阶段,用AI提示词生成的效果,真是符合不了一点预期;
我也是第一次用提示词做项目,没啥经验,提示词写的基本也是很随意、口语化的、无结构的;
然后就是问AI,说是用模板,让AI给了模板参考,效果有好一些,不过最重要的还是对具体需求的描述,起码要像需求文档覆盖到各个功能点,然后细化描述功能点;
这时候出来的效果能达到我大概60%的预期了,只是一些页面会有布局错乱的问题;
然后就是需要显式添加一些规则和约束,因为哪怕一开始就定义过了AI的角色和指责,也会出现不听话的情况,所以一些点需要对其进行强调;
经过多次提示词调优,生成的效果能达到预期的80%,这时候我认为就差不多了,达到一个“提示词投入/效果产出”性价比不错的状态,继续优化提示词也没法获取大幅的效果提升了;
接下来就是跟AI进行多伦对话来完善了,同时集成接口,然后还有优化。
后端部分就不多说了,主要就是配合前端业务写一些接口,然后应上架要求,加上内容审核机制。
一些细节:
1 | 提示词的效果不仅仅取决于提示词本身,还取决于使用的IDE以及不同大模型和不同版本,甚至完全相同的情况下前后分别跑两次,出来的效果也不完全相同; |
1 | 还有就是,开发的时候先创建一个初始脚手架,比如uniappx,官方提供了基础的“Hello uni-app x”模板; |
最后在底部附上【初版提示词】链接(后来又微调了几版,没有保存)。
做了个公司官网,静态版本的,唯一的一个数据交互是“提交需求表单”;
又不想为此部署一套“重量级”的后端服务,找了些第三方的集成方案,包括飞书、钉钉等平台都有通知API;
但是不太想依赖这些,后来找到了个纯粹一些的第三方表单服务(Formspree,底部有官网链接);
使用也是比较简单的,只要将表单提交到特定地址,就能收到邮件通知。
1.注册登录后,先创建一个项目(默认也会有一个项目):
2.创建一个表单,填入表单名称、选择刚才创建的项目、接收通知的邮箱:
3.在表单的[Workflow]->[Validations]添加表单相应的字段名称,每个字段可以设置为是否必填、数据类型以及内容长度范围:
注意:email字段是平台预置的,无法删除,但是可以修改是否必填
提示:这个[Validations]其实可以不用设置,需要校验字段的话设置一下
提示:下面的[Actions]可以设置表单提交后的动作,比如提醒方式、集成其他系统之类的
4.网页里表单设置action地址:
提示:action地址是在[Overview]标签页里获取
5.效果:
提示:创建表单时填写的那个邮箱也会收到通知邮件
个人开源项目[yeah-boot]需要一个流控/限流组件;
虽然有一些成熟的开源流控组件,比如Alibaba Sentinel、Bucket4j、Guava RateLimiter等;
但就是想自己造个轮子。
“限流”与“流控”的关联与区别(by AI):
1 | 限流(Rate Limit)是控制单位时间内请求数量的策略,核心是限制流量,通常超限就拒绝请求。 |
我做的偏向于“限流”,但是模块叫“流控”,方便日后朝“流控”方向扩充功能;
主要功能:
核心思路:基于时间窗口内的请求记录与统计做控制。
1 | boolean enabled() default true; // 是否启用 |
1 |
|
主要参数:limitCount, timeWindow, bucketSize
大概思路:
使用滑动时间窗口,将timeWindow窗口大小按照bucketSize大小每个桶进行均分;
将窗口做成动态一直向前滚动的轮状数据结构(需要进行滚动(滑动)操作);
每个请求到来时,先重置过期桶的计数,然后将当前请求落入到对应的桶中;
计算当前所有桶的计数,判断是否超限。
个人感觉轮状机制+过期重置的逻辑有些难理解,有点很细致的东西在里面,具体见下方代码。
主要参数:limitGroupCount, timeWindow, bucketSize, groupType, customGroup
大概思路:
大概的思路与【非分组方式的限流】一致;
只不过多个一个分组维度。
具体见下方代码。
主要参数:limitGroup, timeWindow
大概思路:
时间窗口内,记录每个分组的最新一次请求时间,计算窗口内分组数,判断是否超限。
在代码实现上要尽量保证准确性,需要在一些操作上加锁,也要兼顾性能,锁粒度不能太大;
之前的一个版本,是将请求的时间都记录下来,基于此做统计和判断;
但是数据量大的时候会有存储和性能问题,而且没加锁,有并发下的准确性问题;
后来询问AI做了参考,使用了常用的以计数方式(AtomicInteger)为主,同时进行了加锁。
具体见下方代码。
1 | package com.yeshimin.yeahboot.flowcontrol.ratelimit; |
1 | package com.yeshimin.yeahboot.flowcontrol.ratelimit; |
1 | package com.yeshimin.yeahboot.flowcontrol.ratelimit; |
1 | package com.yeshimin.yeahboot.flowcontrol.ratelimit; |
1 | package com.yeshimin.yeahboot.flowcontrol.enums; |
1 | package com.yeshimin.yeahboot.flowcontrol; |
此处只贴上【非分组方式的限流】的测试结果。
限制2秒内最多5个请求:
1 | curl 'http://localhost:8080/app/demo/ratelimit/test' |
目前够用,后续按需扩展功能;
比如目前是单机,后续支持global分布式限流。
经常会想着搞搞程序员的三大浪漫(操作系统、编译原理、图形学),奈何工作与生活事务繁杂、压力重大,像这种对个人”不太重要“的事情容易一直拖延,遥遥无期;
所以先简单起个头,总比一直空想要好,待有时间时慢慢推进;
先从操作系统开始,咨询了下AI,结合自己的目标(做出一个带图形界面的操作系统),给出的建议和学习路径是先学习minix;
接下来简单介绍下minix以及虚拟机安装。
🧠 什么是 MINIX 3?
MINIX 3 是一个 免费、开源(open-source) 的操作系统,设计目标是 高可靠性、高灵活性与高安全性。
它由著名计算机科学家 Andrew S. Tanenbaum 教授 领导开发,是现代 微内核(microkernel)架构 操作系统的重要代表之一。
⚙️ 系统架构
MINIX 3 采用极小的 微内核 运行在内核态(kernel mode),
而其余大部分操作系统功能——如驱动、文件系统、网络栈等——都以 独立、受保护的进程 形式运行在 用户态(user mode)。
这种设计带来以下优点:
🧩 模块化高:每个系统服务都是独立进程,可单独崩溃、重启。
🛡️ 更安全:驱动和系统服务之间隔离,避免单点故障。
🔁 高可靠性:MINIX 3 能自动检测并重启失效的服务,实现“自我修复”。
💻 平台与兼容性
MINIX 3 支持 x86 与 ARM 架构,
并与 NetBSD 兼容,可直接运行成千上万的 NetBSD 软件包。
这让它不仅适合教学与研究,也能用于嵌入式设备、容错系统等应用场景。
📚 教学与社区
MINIX 3 最初是为教学和研究操作系统原理而生,
因其 源码简洁清晰、架构严谨、文档完善,
被全球众多高校选作操作系统课程实验平台。
它拥有一个活跃的开源社区,
你可以直接下载源码、运行于虚拟机(如 QEMU / VirtualBox),
甚至参与内核与驱动的开发。
🚀 结语
MINIX 3 以极简的内核设计展示了操作系统的本质:
“保持小巧,保持可靠。”
它不仅是一款研究级操作系统,更是一种对高可靠计算理念的实践。
无论你是操作系统爱好者、嵌入式开发者,
还是想深入理解微内核思想的学生,
MINIX 3 都是一个理想的起点。
我是在macos环境,使用qemu方式安装;
官方文档里安装指令无法成功,可能是指令版本太老了,我安装的qemu版本为:
1 | % qemu-system-x86_64 --version |
安装步骤如下:
1.下载安装镜像文件
下载地址为:https://www.minix3.org/download/
我选择的是3.3.0 (stable release);
下载后命名为 minix.iso
2.创建虚拟磁盘镜像文件
1 | % qemu-img create -f qcow2 minix.img 4G |
qemu-img - QEMU 提供的磁盘镜像管理工具-f qcow2 - 指定文件格式为qcow2,该格式主要特点为支持动态分配空间,不会一开始就占用指定的空间create - 创建一个新的镜像文件minix.img - 文件名称4g - 文件最大容量
3.从光盘启动,即从iso文件启动
1 | % qemu-system-x86_64 -m 256 -boot d -cdrom ./minix.iso -hda minix.img -net nic -net user |
qemu-system-x86_64 - 启动一个 64 位 x86 架构的虚拟机-m 256 - 分配 256 MB 内存给虚拟机-boot d - 启动顺序设置为从光驱 (CD-ROM) 启动,用于第一次安装-cdrom ./minix.iso - 指定虚拟光驱使用的 ISO 镜像文件(Minix 安装盘)-hda minix.img - 指定虚拟硬盘文件(之前创建的 minix.img)-net nic - 添加一块虚拟网卡-net user - 使用用户模式网络,使虚拟机能够通过宿主机上网


4.执行安装
输入setup执行安装操作系统到磁盘文件;

基本上可以一路回车(按需选择),卡住的地方看下有需要输入yes或no;
等待一段时间,系统安装完毕;

接下来还有几个选项,也可以一路回车;

接下来输入shutdown -h now退出iso系统;
等待界面上出现MINIX has halted.表示系统已经退出的描述时,可以关闭qemu窗口。
5.从虚拟磁盘文件启动安装的操作系统
这次不指定-cdrom参数,且使用-boot c表示从硬盘(minix.img)启动;
1 | % qemu-system-x86_64 -m 256 -boot c -hda minix.img -net nic -net user |
qemu-system-x86_64 - 启动一个 64 位 x86 架构的虚拟机-m 256 - 分配 256 MB 内存给虚拟机-boot c - 设置启动顺序为从硬盘(C 盘)启动,适合系统安装完成后运行-hda minix.img - 指定虚拟硬盘文件(之前安装了 MINIX 3 的 minix.img)-net nic - 添加一块虚拟网卡-net user - 使用用户模式网络,使虚拟机能够通过宿主机访问互联网
启动成功后使用root账号登录(无密码);
然后可以按需重新设置root密码;
不过还不清楚怎么在是里面配置网络,比如ping也无法成功;
留到下次有空看看吧。
因个人开源的[商城项目]需要用到全文检索功能,主流的Elasticsearch太占资源,经过搜索比对,选择了轻量级的ManticoreSearch作为全文检索引擎。
ManticoreSearch是一个开源、高性能的全文检索引擎,源自Sphinx Search。它能够帮助开发者在海量文本数据中快速查找相关内容,同时支持实时索引和SQL查询,让数据写入后即可被立即搜索。
特点包括:
简单来说,ManticoreSearch就像一个专门为文本搜索优化的数据库,可以让你的应用或网站实现快速、精准的搜索功能。
支持多种方式安装,见官方文档[安装]部分。
MacOS下安装:
1 | % brew install manticoresoftware/tap/manticoresearch manticoresoftware/tap/manticore-extra |
以brew服务的方式启动Manticore:
1 | % brew services start manticoresearch |
支持MySQL客户端连接:
1 | % mysql -h0 -P9306 |
Manticore Search使用MySQL协议实现了一个SQL接口,允许任何MySQL库或连接器以及许多MySQL客户端连接到ManticoreSearch,并像对待MySQL服务器一样使用它,而不是Manticore。
然而,SQL方言不同,并且只实现了MySQL中可用的SQL命令或函数的子集。此外,还有专门针对ManticoreSearch的子句和函数,例如用于全文搜索的MATCH()子句。
Manticore Search不支持服务器端预处理语句,但可以使用客户端预处理语句。需要注意的是,Manticore实现了多值(MVA)数据类型,这在MySQL或实现预处理语句的库中没有等价项。在这些情况下,MVA值必须在原始查询中构造。
某些MySQL客户端/连接器需要用户/密码和/或数据库名称的值。由于Manticore Search没有数据库的概念,也没有实现用户访问控制,这些值可以随意设置,因为Manticore会简单地忽略它们。
具体见官方文档[连接服务器]部分。
ManticoreSearch支持多种编程语言的客户端连接,同时也支持Java客户端连接。
客户端Github地址:https://github.com/manticoresoftware/manticoresearch-java
但是由于我的项目使用的还是Java8,而该客户端的近几个版本已经升级了Java版本,(忘记是11还是17了);
我fork了官方该仓库,改回了Java8,并发布到了maven中央仓库;
Github地址:https://github.com/yeshimin/manticoresearch-java-8
Maven地址:https://mvnrepository.com/artifact/com.yeshimin/manticoresearch-java-8
只需要使用这个非官方的maven依赖,其他使用方式和官方的一样,无需任何改动。
版本使用8.1.1,对应官方的8.1.0。
1 | <!-- manticoresearch 全文检索 --> |
1 | CREATE TABLE product ( |
配置解释:
这样配置可以支持中英文的全文检索。
1 | package com.yeshimin.yeahboot.merchant.service; |
官方建议:Java客户端SDK未实现线程安全,建议每次请求都创建一个新的ApiClient实例。
记于:2025-09-20 下午
地点:浙江省·温州市·家里
天气:阴天
frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议,且支持 P2P 通信。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。
Github上下载对应平台的二进制包,解压即可使用。
注意:服务端和客户端需要下载对应的平台版本。
1 | cat /etc/systemd/system/frps.service |
1 | [Unit] |
1 | systemctl start frps |
服务端frps.toml配置
1 | bindPort = 7000 |
客户端部署
客户端frpc.toml配置
1 | serverAddr = "此处填写部署frps的公网IP" |
serverAddr和serverPort配置为服务端frps的公网IP和端口;localIP和localPort配置为需要内网穿透的服务地址和端口;remotePort配置为服务端开放的端口,外网访问该端口即访问内网服务(即外网6000端转发到本地1111端口)。
启动客户端
1 | # ./frpc -c ./frpc.toml |
访问外网frps的ip+6000端口即可访问内网服务。
另外还有其他场景示例,见官方文档
记于:2025-08-18 下午
地点:浙江省·温州市·家里
天气:晴天
因项目需要,使用到mcp。
MCP,全称 Model Context Protocol,是一种用于 大模型与外部服务交互 的协议。它的核心价值在于:
标准化:定义了一致的通信方式,避免为每个外部服务重复造轮子。
多通道支持:可通过 stdio、SSE(Server-Sent Events) 等传输方式进行通信,满足不同运行环境需求。
插件化:MCP Server 可以像插件一样挂载到模型环境中,模型通过协议与之交互,从而获取外部数据或执行操作。
简单来说,MCP 让 模型与外部世界的连接 更加轻量、统一和可扩展。
智能体中配置mcp插件工具,运行智能体,与智能体中d大型对话时,可让其调用mcp插件工具执行相关操作,比如获取当前天气信息,用于接下来的出行任务规划。
上述只是简单的流程描述,具体可以有多种多样的流程与应用方式。
附上主要代码片段,并做一定说明。
1 |
|
这个mcp工具的作用是查询天气信息。
@Tool注解表示该方法是一个mcp工具方法;
@ToolParam注解用于定义工具方法的参数;
1 |
|
该类用于配置MCP服务。
1 | spring: |
这是spring ai mcp server的基本配置。
末尾附上spring ai mcp server官方文档链接。
mcp协议官方提供一个调试mcp server的命令行具;
示例:
1 | npx -y @modelcontextprotocol/inspector |
执行上述命令后,打开http://127.0.0.1:6274进行配置、连接和调试。
如果有用到nginx,需要在location部分添加相关配置
1 | proxy_buffering off; |
spring boot项目如果配置了context-path,需要在MCP Server的配置中将base-url设置为相应的context-path
比如context-path: /admin,需要同时设置spring.ai.mcp.server.base-url: /admin
另外nginx如果还有前缀(非项目本身路径),比如/api,spring.ai.mcp.server.base-url还需要添加/api前缀,比如:/api/admin
否则会连不上。
还有mcp调试工具经常出现自动断开的问题
1 | Error from MCP server: SseError: SSE error: TypeError: terminated: other side closed |
这个也是添加了nginx的proxy_read_timeout和proxy_write_timeout可以解决;
但是出现了另外的问题:
1 | Error from MCP server: SseError: SSE error: TypeError: terminated: Body Timeout Error |
这个问了AI,说是长时间未收到服务端的心跳或响应,导致客户端主动断开,该问题暂未解决。