大象笔记

知者行之始,行者知之成

使用 swaggo 及 gin-swagger 生成 API 文档

好久没有给别人写接口了,正好遇到一个前后端合作的项目,是时候尝试一下 golang swagger 的 API 文档生成工具了。 注意:尝试了 swaggo 之后,感觉很不好(注释规范口味太重,与三方库有冲突),我觉得再试试 go-swagger。但是没想到 go-swagger 更难上手,且生成速度巨慢,无法接受,还是继续使用 swaggo。 使用 swagger 的好处 返回的数据结构,可以直接引用 struct 的定义:https://github.com/swaggo/swag , 但是同时带来了问题,如果 struct 里嵌入了三方库的类型,依赖检测时会出现与 swaggo 规范冲 ...

阅读全文...

golang 实现蓝牙体征监测设备数据上报及存储的频率控制

需求背景 蓝牙体征检测设备的初始上报频率非常高,单台每秒 370 个数据包。 需要通过通过服务器向蓝牙网关下发禁止波形数据的指令,禁用掉无用数据的上报。 有两个禁用策略: 定时下发禁用指令。例如每十秒 收到波形数据时,就立即下发禁用指令 显然第二种方式更合理,而且在有多台设备接入的情况下,也方便批量下发(根据 mac 地址)。 但是,这里就出现了一个频率控制问题,就是从下发指令,到禁止成功,是有一个时间间隔的。这个时间间隔内,要规避重复下发指令。 同时,还有另外一个需求,就是对写入数据进行控制,设备方的体温上报频率过高,增加了存储成本,所以同样需要限制。 找到一个 golang 的官方库, ...

阅读全文...

夜幕降临,第三次 php 网站被黑

没想到这个被黑系列这么快就要更新第三期 。。。 距离第二次被入侵才过两天,前公司网站再次被攻陷。 歹徒可能发现了首页代码被锁死,无法修改。这次利用了 kangle / easypanel 的漏洞,直接修改了 kangle 的账号密码,通过配置文件,将网站 301 重定向到了一个恶意站点。 kangle 漏洞 网上搜 kangle + easypanel 的漏洞不少,而且都是严重漏洞。 还是换成 apache / nginx 靠谱,早换早享受。 还是之前的观点,用这种国产 php 一键部署工具,加面板,都是给自己挖坑。 不要接手这种项目;万不得已,不得不接手,立马换掉这些渣渣玩意。 漏洞太多怎么 ...

阅读全文...

第二次 php 网站被黑的经历

昨晚九点被拉回前公司,解决一个 php 网站被黑的问题。 现象 网站首页被篡改成了澳门特色网站。 从代码看,只有 index.php 文件被修改。确切地说是被完全覆盖了。 而且触发的时机也非常有趣,都是下午 5:31 分左右,在你正好下班的时候触发。。。 排查的思路 首先过了一遍线上变化的文件。没有发现问题。 然后在上传目录 grep 了包含 php 关键字的图片及其他格式的文件。抽查了几个,也没有问题。而且历史悠久,不太可能潜伏这么久。都没有发现问题。 因为同一个服务器上还有其他的网站也被同样篡改了。怀疑是另一个项目里有恶意代码,然后扫全盘,修改 index.php。但这也是一个猜测,需 ...

阅读全文...

PyTorch 学习计划及相关学习资料

之前用 OpenCV 实现的一个小麦图像识别的 Android APP,但是做到第二版时, 想增加功能,发现大部分类似项目都是用 PyTorch 实现的,所以不得不换技术方案。 可是断断续续看了一个多月的 PyTorch,发现自学效果不佳,连代码都没怎么写。 可能都是在等车,或者车上看的,没有实际敲代码,所以理解不深。 PyTorch 市面上的书籍非常多,但我看的几本口碑不错的书,都是虎头蛇尾。 前面讲的挺细致,比如基础概念、一些原理之类的,还能接受。 但是,一旦到了解决实践问题的章节,需要大量代码说明的部分,就完全滥竽充数。 也不知道是为了水一本书,还是里面确实有核心的业务逻辑不舍得分享, ...

阅读全文...

Windows 11 安装 PyTorch

安装 conda 从介绍来看 conda 是一个比 pip 更强大的包管理工具,除了支持 python 的包管理也支持其他语言。 https://conda.io/projects/conda/en/latest/user-guide/install/windows.html 里面有两个安装包 Miniconda 和 Anaconda,如何选择呢? Miniconda installer = Python + conda Anaconda installer = Python + conda + meta package anaconda 大概 1500 个内置包,3G 空间 看起来 Mi ...

阅读全文...

Ant Design dateTimeRange 组件 UTC 时间的时区问题

后台用 InfluxDB 存储的时序数据,查询时需要使用 UTC 时间。 为了偷懒,我的后台 go 接口没有对时间字段做处理,想直接使用前端传过来的 UTC 时间格式。 于是出现了一个低级的前端 Bug。 功能异常的请求 请求链接格式: http://www.sunzhongwei.com/someAPI?current=1&pageSize=20&startTime=2022-08-09T01%3A10%3A16Z&endTime=2022-08-10T01%3A10%3A16Z startTime: 2022-08-09T01:10:16Z endTime: 20 ...

阅读全文...

升级 gopls 到最新版本

写了一段单元测试的代码,在 vim 中提示错误 func TestGenSlug(t *testing.T) { assert.Equal(t, "hello-world", genSlug("Hello World")) } 错误信息为: [gopls] cannot use t (variable of type *testing.T) as assert.TestingT value in argument to assert.Equal: wrong type for method Errorf (have func(format stri ...

阅读全文...

蓝牙网关 MQTT 的多设备接入及多型号兼容

多设备接入需求 多个设备接入 MQTT 多种设备型号的兼容。考虑到蓝牙网关/体征监测设备商可能停产,或升级。造成蓝牙协议变化。 MQTT Client ID 规范 终端类型 整机设备标识 DeviceID 座位标识 SeatIndex 例如:1/2/3 ...。以密封舱内多设备为例。 例如: - 蓝牙网关:gateway_<DeviceID>_<SeatIndex> - Pad: pad_<DeviceID>_<SeatIndex> 主要是为了防止 client id 冲突。 TOPIC 规范 mqtt 订阅回调函数中可以获取到消息的来 ...

阅读全文...

通过蓝牙网关下发指令,过滤掉蓝牙设备高频率的波形数据

问题 蓝牙设备默认会以每秒钟 350 次的频率向蓝牙网关发送实时波形数据(心电波形、血氧波形、呼吸波形), 然后蓝牙网关再将这些数据转发到服务器。 这些波形数据是没有记录价值的 蓝牙设备数量不可控,在数量多时,对服务器产生巨大的并发请求压力。我在开发机上 WSL Ubuntu 里部署的 EMQX 偶尔会扛不住挂掉。。。原因不明。 高频造成的数据黏包严重。例如蓝牙网关协议的数据包部分,能频繁看到多个蓝牙数据包拼接,且被截断的情况 蓝牙设备虽然支持禁用波形数据输出,但是每次重启都恢复原配置 过滤掉波形数据的方案 服务器端每十秒向蓝牙网关下发一次禁用波形数据的控制指令。 emqx 限速 http ...

阅读全文...

精益开发实战:用看板管理大型项目

无奈,本周要交一篇关于精益工作的思想汇报。我又不想直接去网上搜素 copy 一篇,就找了本精益开发的书看了一下,把读书笔记作为思想汇报交了应付了事吧。 借集团推进精益管理/生产分享汇报活动的机会,作为一名程序员,我也感觉收获良多。比如积压产品配件去库存,零件通用化等,都给了我很大的启发。同时我找了本跟自己日常开发工作相关的书深入学习了一下。书名是《精益开发实战:用看板管理大型项目》作者是 Henrik Kniberg。在这里谈谈我的学习心得: 切割大象 就将大型项目或产品,切分为小的,进度可控的一个个子项目,可以周期性发布。 最大程度降低大型项目风险的关键是找到“切割大象”的正确方式,也就是 ...

阅读全文...

订阅 MQTT 主题后,防止 go 程序退出 main

for 循环会彪 CPU,不好。找了一个 channel 的实现有效解决了这一问题。 实现代码 import ( "os" "os/signal" "syscall" ) func main() { channel := make(chan os.Signal, 1) signal.Notify(channel, os.Interrupt, syscall.SIGTERM) // MQTT 订阅逻辑 // ... <-channel } 代码分析 channel 的发送和接收数据都是阻塞 ...

阅读全文...