MoreRSS

site iconSunZhongWei | 孙仲维 修改

博客名「大象笔记」,全干程序员一名,曾在金山,DNSPod,腾讯云,常驻烟台。
请复制 RSS 到你的阅读器,或快速订阅到 :

Inoreader Feedly Follow Feedbin Local Reader

SunZhongWei | 孙仲维 的 RSS 预览

大赛报名打分系统的测试流程

2025-06-26 11:23:08

大赛报名活动已截止,现在进入了打分环节。 客户让我们自测一下系统是否有问题。😅 又是没有意义的工作内容,哎!

作为北半球最专业的手动测试小天才,我感觉还是有必要写一下测试流程的。 否则这么枯燥的事情,很容易就懈怠导致遗漏。

测试流程

  1. ✅ 线上备份数据库。标记为截止报名数据。并 scp 拖回本地。
  2. ✅ 新建测试的报名账号。账号信息,例如,手机号,身份证号,姓名等,直接使用我开发的小工具一键生成,节省自己乱编的时间。参考 ⚡️随机个人信息生成器
  3. ✅ 短信验证码,需要通过阿里云后台查看。
  4. ✅ 管理员新建测试用的打分分组。分组信息,使用测试标识。跟真实分组区分开。同时将测试的参赛者账号添加到分组中。
  5. ✅ 新建测试用评委账号。依然使用上面的工具一键生成评委信息。将测试评委账号添加到测试分组中。
  6. ✅ 评委打分测试。
  7. ✅ 评分结果查看
  8. ✅ 评分结果导出 Excel 测试
  9. ✅ 测试角色:管理员,评委,参赛者。各自的后台都需要过一遍。
  10. ✅ 管理员修改获奖状态。导出 Excel 确认
  11. ✅ 参赛者登录系统,查看参赛作品获奖状态
  12. ✅清理测试数据。删除测试参数者,测试分组,测试评委账号,测试作品等。

还是有点产出

没想到还找到了两个 bug

  • 阿里云的短信签名失效。虽然后台可以看到签名在三个运营商都报备成功,但是如果短信签名很短,不是公司全称,大概率还是会被运营商拦截。所以,更换了一个公司全称的签名,成功能高一些。但也不是百分之百成功。至少我能收到短信验证码了。
  • 评分结果列表的分页问题。我发现 golang gorm 的 count bug 是真多,多到无法理解。换个写法又正常了。

好了,收工。去干点正事了。

我发现不用 VSCode VIM 插件,打字的速度快多了。输入中文的情况下,还是不要使用 VIM 插件为妙。各种 bug。

WSL2 VmmemWSL 进程导致 CPU 暴涨

2025-06-25 20:52:34

Windows 11 下,在新的 SSD 上安装了 WSL2 之后,不知道什么原因,只要开了 WSL,大概率会遇到 CPU 暴涨至 60% 以上。

不开 WSL,CPU 则 10% 以下。

VmmemWSL CPU 高

本来以为是 WSL2 中 MySQL 的锅,没想到,今天进入 Ubuntu Top 了一下,发现是 Node 造成的。

这个 Node 进程是用来编译 Ant Design Pro 的,把 Node 干掉就恢复正常了。

如何干掉 VmmemWSL 进程

第一次遇到这个问题时,我只想感觉干掉这个进程。但是除了重启和注销,没有可行的办法。 在任务管理器里,是无法直接 kill 掉 VmmemWSL 进程的。

可以参考这个 github 的 issue:

https://github.com/microsoft/WSL/issues/9592

打开 PowerShell 执行:

taskkill /im wslservice.exe /f

世界就清净了。

对话机器人 Rasa(四十二):SocketIO Channel 的 Room 问题

2025-06-25 15:04:42

之前基于 SocketIO 实现了一个 Rasa 的自定义 Channel,参考 对话机器人 Rasa(三十二):新建一个基于 socket.io 的自定义 channel

但是,实现的第一版有一个问题,就是当客户端连接时,默认会收到所有在线设备的消息。

从现象上看,应该是 socketio emit 时没有指定 room,导致所有在线的客户端都能收到消息。

参考 socketio 的文档,emit 时可以指定 to/room 参数来限制消息的接收者。

https://python-socketio.readthedocs.io/en/v4/api.html

async emit(event, data=None, to=None, room=None, skip_sid=None, namespace=None, callback=None, **kwargs)

Emit a custom event to one or more connected clients.

参数说明:

  • event – The event name. It can be any string. The event names 'connect', 'message' and 'disconnect' are reserved and should not be used.
  • data – The data to send to the client or clients. Data can be of type str, bytes, list or dict. To send multiple arguments, use a tuple where each element is of one of the types indicated above.
  • to – The recipient of the message. This can be set to the session ID of a client to address only that client, or to to any custom room created by the application to address all the clients in that room, If this argument is omitted the event is broadcasted to all connected clients. 注意,不传 to 参数时,默认会广播到所有连接的客户端。
  • room – Alias for the to parameter.

rasa 的默认 socketio 实现

rasa 自带的 socketio 的实现,emit 时,指定了 room,所以只会收到指定房间的消息。

~/miniforge3/envs/rasa/lib/python3.9/site-packages/rasa/core/channels/socketio.py

原代码:

async def _send_message(self, socket_id: Text, response: Any) -> None:
    """Sends a message to the recipient using the bot event."""

    await self.sio.emit(self.bot_message_evt, response, room=socket_id)

而我为了方便测试,把 room 参数去掉了。

enter_room 的问题

但根本的问题在于,我的实现,没有将每个连接的用户加入到对应的房间。 也就是没有调用 enter_room 方法。

所以,只需要在 handle_message 方法中,加入以下代码即可:

await self.sio.enter_room(sid, data["sender"])

socketio server 端,是否可以将一个 sid 反复多次进入同一个 room

在 Socket.IO 服务器端,同一个 sid(客户端连接 ID)可以多次加入同一个房间(room),但实际效果等同于单次加入,不会产生重复成员关系

代码中的 emit session_confirm 有什么用

emit("session_confirm", data["session_id"], room=sid)

作用是:

当客户端通过 session_request 事件请求会话时,服务端会生成或确认一个 session_id,然后通过 session_confirm 事件把这个 session_id 发送回给当前连接的客户端(即 sid 对应的 socket 连接)。这样客户端就能拿到自己的 session_id,用于后续通信(如加入房间、消息同步等)。

流程:

  • 客户端发起 session_request。
  • 服务端生成/确认 session_id,让 sid 加入该 room。
  • 服务端通过 session_confirm 把 session_id 发给客户端。
  • 客户端收到 session_id,后续通信可带上该 id,实现多端同步。

这样可以保证每个连接都能拿到唯一的会话标识,实现消息的定向推送和隔离。

额外发现

其实,把用户的输入,直接 emit 也是可以的。 这样就能实时看到对方的输入,而不需要等待从回复信息里解析输入。

线上日志报错

docker compose logs -f --tail=100 rasa_core

具体错误信息:

await self.sio.enter_room(sid, data["sender"])
TypeError: object NoneType can't be used in 'await' expression

https://github.com/miguelgrinberg/python-socketio/issues/1256

应该是 socketio 这个库的版本不同,enter_room 在旧版本中是 async 的,但是在新版本中不是 async 的。

所以,文档里是对的。

因为低版本的,如果不加 await 不会报错,但是会导致并没有加入房间,于是收不到消息。 而高版本,加了 await 就会报错。

所以,在使用 await 之前,判断一下 enter_room 是否返回 None。

查看合集

📖 对话机器人 Rasa 中文系列教程

有了 github copilot pro,在 VSCode 中记录笔记更高效了

2025-06-23 16:03:26

我是一个不记录笔记,就无法正常工作的人 😓。

之前也尝试了各种记录的方案。例如:

  • 手机便签
  • 独立的 markdown git 项目,专门用来记录笔记
  • 在博客网站上记录
  • 使用 obsidian 等笔记软件

每个方式,都坚持过一段时间。但是,我发现自从有了 github copilot pro 之后,笔记记录在项目中是最方便的。 基于无限使用的 gpt 4.1 模型,github copilot 可以实时理解我的需求,并且辅助我编写文档和笔记。 甚至可以节省我去 Google 搜索的时间。

同时,我发现记录在项目中也有更多的优势:

  1. 编辑方便不用切换程序。写代码和写文档,都在 VSCode 中完成,也不用切换到其他应用程序。
  2. 方便 AI 理解需求。因为 AI 可以直接读取项目中的代码和文档,理解上下文。复制需求到 copilot chat 窗口,也非常方便。
  3. 实时利用 github copilot 来辅助文档编写。水起内容来,拦不住的感觉。

内容太杂也不是问题

一天只搞一个项目。这样笔记就能更集中,思路更清晰。晚上回家也可以继续这个项目。

先这样试用一段时间,看看效果如何。

唯一不方便的是,如果 git 项目只有我一个人参与还好,如果多人的项目,在里面记录一些不沾边的笔记,就非常尴尬了 🥲

还是独立的 markdown git 仓库存储笔记比较方便,可以随意写,没有顾虑 😊

VSCode VIM 插件的中文输入法自动切换

2025-06-23 15:20:21

在 VSCode 中使用 VIM 插件写代码时,经常会因为当前在中文输入法下,导致各种奇怪的现象。 例如,

  • 切换到 Normal 模式后,按字母键,会出现中文输入法的提示框。
  • Normal 模式下,想按下 i 键进入 Insert 模式,结果是在中文输入法下,即输入了奇怪的东西。

非常之不爽,我一度想放弃 VIM 插件,甚至干脆不用中文 🥲,但是,这不现实,因为好多界面需要中文描述。

解决思路

在 VIM 插件退出 Insert 模式时,自动切换回英文输入法。

VSCode VIIM 插件的官方文档里,恰好有相关的配置。参考:

https://github.com/VSCodeVim/Vim#input-method

Input Method: Disable input method when exiting Insert Mode.

配置项

  • vim.autoSwitchInputMethod.enable:是否启用自动切换输入法功能。默认值为 true。
  • vim.autoSwitchInputMethod.defaultIM:默认的输入法,注意这里 Mac 和 Windows 的配置不一样。
  • vim.autoSwitchInputMethod.obtainIMCmd: 获取当前输入法的命令的路径。例如 im-select,需要安装这个命令行工具。
  • vim.autoSwitchInputMethod.switchIMCmd: 切换输入法的命令。需要加上 {im} 占位符,表示目标输入法。

Windows 配置示例

"vim.autoSwitchInputMethod.enable": true,
"vim.autoSwitchInputMethod.defaultIM": "1033",
"vim.autoSwitchInputMethod.obtainIMCmd": "D:\\apps\\im-select.exe",
"vim.autoSwitchInputMethod.switchIMCmd": "D:\\apps\\im-select.exe {im}"

im-select.exe 的下载地址

注意,github 上 im-select 的下载地址在这里,项目 readme 里的链接 404。

https://github.com/daipeihust/im-select/issues/72

Windows 下输入法的 ID

在 Windows 下,输入法的 ID 是一个数字。可以通过以下命令获取当前输入法的 ID:

> im-select.exe
1033

> im-select.exe
2052
  • 1033 是英文输入法。即英文键盘输入法
  • 2052 是中文输入法。即切换到中文输入法,例如,微信输入法。注意,如果在中文输入法下,即便是切换为英文输入,仍然是中文输入法,也是返回 2052。

如何修改配置文件

图形化的配置界面,看不太懂。不如直接修改配置文件,更简单直观。

ctrl + shift + p 打开命令面板,输入 settings.json,选择 User Settings,开配置文件。 实际就是一个 json 文件。

User Settings 跟 Workspace Settings 的区别是前者是全局配置,后者是当前工作区的配置。

修改后的效果

会发现,只要按下 ESC 键退出 Insert 模式,输入法就会自动切换回英文输入法。 非常完美。

但是,目前还是有一些小瑕疵

  • 切换速度还是慢,不敢操作快了
  • 如果是切换到英文键盘,再去其他应用里输入中文,还需要切换中英文键盘。我才知道切换中英文输入法的快捷键早已不是 ctrl + space, 而是 win + space。我 out 了
  • 不知道为何每次输入中文标点符号时,都会自动输入两个相同的标点符号 😅

Android App 原生 Kotlin 开发提示词模板

2025-06-17 10:00:55

我发现 claude 3.7 AI 在生成 Android APP 项目代码时,完全不参考当前项目的开发语言。 例如,项目是 kotlin 的项目,AI 默认生成的代码居然是 Java ...

看来,必须在提示词上多下点功夫,避免绕弯路。

提示词模板

## 技术栈
-  编程语言:Kotlin / Java
-  UI 框架:XML Layouts (Views) / Jetpack Compose
-  核心库/组件: (列出关键依赖,例如:ViewModel, LiveData/StateFlow, Room, Retrofit, Hilt/Dagger, Navigation Component, WorkManager, Coil/Glide 等)

对于我来说,使用下面的足够

## 技术栈
-  编程语言:Kotlin
-  UI 框架:XML Layouts (Views)

我甚至找到了一个在线售卖 Android Dev 提示词模板的网站,这细分领域也是没谁了。

最后

github copilot 里的 claude 3.7 写 Android 原生 kotlin,确实不太行。界面设计难看,bug 一堆,逻辑也不通。完全不如写网页的效果。也不知道是不是我的提示词问题。

昨天在 Android Studio 试了试豆包家的 Trae 插件,写出来的 toast 让人哭笑不得。直接一个

showToast(''xxx")

我只想说,are you ok?

可能提示词上,或者项目结构上还是得优化一下。

转念一想,也未必是坏事,如果 AI 写 Android 原生能力不太行,也许说明这个方向还有一点技术门槛,竞争没那么激烈吧。。。

最好的 Android 开发模型

恰好在 reddit 上看到一个帖子讨论

Claude 4 Sonnet is the best model for Android dev (per Kotlin-bench)

https://www.reddit.com/r/androiddev/comments/1kttvd4/claude_4_sonnet_is_the_best_model_for_android_dev/

issue 解决成功率,claude 4 比 3.7 搞了 10 个百分点。

不过,下面的评论也很扎心。

感觉问题的根源,还是网上 android 原生开发的代码太少了,我很多时候根据 Google Android 官方文档的教程,都找不到相关的示例代码,新的组件对应的资料极少,用的人都不多。导致 AI 的训练数据就少的可怜。那训练出来的模型能靠谱么?😮‍💨

早上有人推荐我用 React Native 代替 Android Kotlin 开发,也是个办法。。。但是,我嫌 RN 的包体积太大了,不环保。我也没有 iOS 多端支持的需求,况且我想搞搞桌面组件的开发,先用着 Kotlin 吧。