大象笔记

知者行之始,行者知之成

使用 ALE 替换 vim-go 插件

我目前 NeoVim 里安装了两个 go 相关的插件: vim-go ALE (Asynchronous Lint Engine) 今天在保存代码修改时,一如既往的卡顿了10几秒,这种情况在1分钟之后就会消失。 可是,我安装的 ALE 号称是异步的啊。。。要不我安装他干啥。。。 我突然感觉可能问题出在了 vim-go 上,除了 gd 快速查看定义,似乎我也没有用过其他功能。 而且我担心 vim-go 和 ALE 都带了 gofmt,会不会保存时调用两次,造成冲突。 于是,干脆把 vim-go 卸载了。 卸载之后果然如预期的一般丝滑。。。再也不会卡顿了。 修改配置 将记不住的 ALEG ...

阅读全文...

golang 给微信小程序码图片底部添加文字

需求 由于要做硬件设备的扫码支付,生产的时候为了方便硬件屏幕上确认部署的支付码跟设备匹配,需要在微信小程序码的底部添加上标识文字, 例如设备 ID 之类的。 效果演示 还是三方库好用 https://github.com/fogleman/gg 比用 golang 自带库方便太多了。否则实现添加个文字,脑子爆炸。 字体下载 https://fonts.google.com/ 图片上添加文字,就涉及到文本字体的选择,可以在 google fonts 上根据语种需要选择字体。 实现逻辑 先生成一张白色底的大背景图,宽度为原小程序码的宽度,高度加上了文字的高度 然后将原小程序图片复制到背景图的顶 ...

阅读全文...

expect 做 telnet shell 脚本测试

需求背景 用 golang 写了个 tcp 数据上报服务,用来接收硬件设备上的传感器实时数据。 但是测试起来很麻烦,每次增加协议功能,都需要手动重复 telnet 并输入指令,费时费力,且容易忘记指令。 测试技术选型 用 go 写这种自动测试,我能想到的就是新建一个 main package,这样会多出一个目录,感觉麻烦 python 涉及到版本依赖,越来越不喜欢 感觉还是直接用 shell 写更简单方便,且直观 expect 还是用 expect 更合理一些,因为要判断 tcp 的返回数据格式,是否跟协议规定的一致。 Expect is a program that "ta ...

阅读全文...

golang gin 与 asp.net 对比

尝试 asp.net 的原因 有三个原因让我想尝试一下 asp.net 听说 Ubuntu 22.04 已经内置 .net 6 运行时 asp.net 可以像 golang 一样编译成一个二进制文件直接部署并运行在 linux 系统环境中,即 AOT 技术栈向原生客户端开发靠拢,毕竟要做个人开发者,能直接向应用商店发布产品是最重要的。而 Windows 平台最靠谱的技术栈必然是 .net。再就是做物联网相关的开发,还是绕不过 windows。 asp.net 初体验 没有使用 visual studio 的安装方式,我直接下载了.net6 sdk,并通过命令行新建了 wpf 和 asp.n ...

阅读全文...

PyTorch 基础概念 - 数据集 Dataset

Datasets and Dataloaders Dataset (torch.utils.data.Dataset) 存储了样本及其对应的标签。 DataLoader (torch.utils.data.DataLoader) 方便访问 Dataset。 Dataset 的类型 图片 文本 音频 等等。 现成的 Dataset 有哪些 例如, FashionMNIST。 >>> from torchvision import datasets >>> dir(datasets) ['CIFAR10', 'CIFAR100', 'CLEVRClass ...

阅读全文...

PyTorch 基础概念 - 张量 Tensors

无论是 PyTorch 还是 TensorFlow,我们首先都会遇到一个基础概念,张量 (Tensor)。 张量 (Tensor) 的作用 模型 (Model) 的输入和输出都是用张量 (Tensor) 表示的。 张量 (Tensor) 是什么 张量 (Tensor) 就是一种数据结构,类似数组 (array),矩阵 (matrix),向量 (vector)。 更形象地理解张量 (Tensor) 例如,如果我们要做一个二手车价格预测模型 (Model),那么如何表示一辆二手车呢? 就可以用一个一维数组来表示,每个元素代表: 生产年份 形式里程数 品牌 事故数 是否泡水过 等等。 也就是,用 ...

阅读全文...

gin.BasicAuth 为生产环境 Swagger UI 文档加上密码保护

虽然大家都推荐将 Swagger 接口文档服务部署在开发环境,但是由于现公司前后端开发人员异地办公,我还是倾向于将 swaggo 服务部署在生产环境。加上个简单的账号密码访问限制即可。 方案选型 Nginx auth golang gin auth 最终,我选择了 gin basic auth 的方案,主要是写在代码里,省去了线上一丢丢地配置麻烦。以后迁移服务器也不用太操心。 安全问题 url 中不使用 swagger 前缀,防止 swagger 出现比较大的漏洞,被人扫出漏洞。例如这里使用了 api-doc,虽然也很容易被猜出。。。还是自己想个复杂的 url 前缀比较安全。 实现代码 ...

阅读全文...

go-swagger 生成 API 文档,及与 swaggo 的对比

go-swagger 与 swaggo 对比 最终没有选择 go-swagger,还是回归了 swaggo。原因: go-swagger 生成文档的速度奇慢无比。我一个 20 多个文件的项目,要整整 30 秒。而 swaggo 可以 5 秒完成。 go-swagger 上手困难。官方文档不友好,没有一个简单清晰的示例说明。 虽然 swaggo 格式规范丑一点,但是至少上手容易,可以直接干活。 这个文章做的对比相对客观一点: https://ldej.nl/post/generating-swagger-docs-from-go/ 再就是我跟上面作者的观点一致,就是这两个货其实都很丑陋,这样 ...

阅读全文...

使用 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。但这也是一个猜测,需 ...

阅读全文...