大象笔记

知者行之始,行者知之成

golang 实现微信小程序自动退款及 API 证书配置

之前用 golang 实现微信支付, 为了偷懒就没有加自动退款功能。 因为本以为是个试验性项目也没有人会去退款,再就是退款需要配置 API 证书,看起来很麻烦。 没想到,项目有真实客户需求了,于是不得不补上退款功能。 同时,由于涉及到一个微信小程序多个商户号的支付,及退款问题,需要每个商户配置一套证书。 微信官方的退款文档 https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=9_4 主要看里面哪些参数是必填的。 API 证书 关于 API 证书的介绍文档 https://pay.weixin.qq.com/wiki/do ...

阅读全文...

js 类似 gofmt 的自动格式化代码工具 prettier

用习惯了 golang 的 gofmt 自动格式化代码工具,迫切需要其他语言的自动 format 功能。发现 js 也有类似的工具 prettier。 https://prettier.io/ 用了一下,还可以。至少可以自动帮我补充行尾的分号,及自动换行。但是也有非常不爽的地方,就是会把你多行对齐的注释毁掉。而且官方维护团队态度恶劣,对这个问题连讨论的余地都不留。远不如 gofmt 优雅。 全局安装 虽然官方推荐每个项目独立安装一个,且做好不同的配置,但是我基本都一个人开发项目,所以也不需要兼顾别人的感受,全局安装更方便。 sudo npm install -g prettier VIM 中 ...

阅读全文...

微信小程序通过 MQTT Over Websocket 实时获取远程设备运行状态

需要实时拉取的数据 远程设备当前运行状态。比如,是运行中,还是已暂停 设备运行时长 设备上传感器的实时数值 如果通过微信小程序端定时轮询,例如,每 10 秒拉取一次,体验上不够好,因为有肉眼可见的延迟。特殊是设备运行状态这里,点击开始,如果不能立即看已启动状态,那就太 low 了。而 MQTT 协议可以实现实时推送的效果。 小程序后台配置可信域名 在 socket 合法域名里填写。例如: wss://www.sunzhongwei.com 这里是一个大坑,配置时候是 wss,用的时候是 wxs。 配置 WSS 证书 参考EMQX MQTT 服务配置 WSS 证书,由于 WSS 默认是使 ...

阅读全文...

EMQX MQTT 服务配置 WSS 证书

为何要配置 WSS 证书 原本用 EMQX 内置的 8083 端口,就可以实现 mqtt over websocket。 例如,地址: ws://www.sunzhongwei.com:8083/mqtt 但是,由于我又需要在微信小程序里使用 mqtt over websocket,而微信小程序只允许使用 WSS 和 HTTPS 协议。所以不得不配置证书。 WSS 与 WS 的区别 WSS 全称是 Web Socket Secure, 即 WebSocket 的加密版本。类似与 HTTPS 之于 HTTP。 WSS 与 WS 类似于 HTTPS 和 HTTP,不同之处在于是不同的通信协议,都 ...

阅读全文...

使用 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 系统环境中 技术栈向原生客户端开发靠拢,毕竟要做个人开发者,能直接向应用商店发布产品是最重要的。而 Windows 平台最靠谱的技术栈必然是 .net。再就是做物联网相关的开发,还是绕不过 windows。 asp.net 初体验 没有使用 visual studio 的安装方式,我直接下载了.net6 sdk,并通过命令行新建了 wpf 和 asp.net 项目进 ...

阅读全文...

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/ 再就是我跟上面作者的观点一致,就是这两个货其实都很丑陋,这样 ...

阅读全文...