大象笔记

知者行之始,行者知之成

gin 服务线上没有 systemd 日志的问题

原配置 StandardOutput=append:/some_path/log/access.log StandardError=append:/some_path/log/err.log 我确认了目录权限没有问题。 查看 systemd 错误日志 journalctl -u some_service -b 果然,大量的错误信息: Failed to parse output specifier, ignoring: /some_path/access.log Failed to parse output specifier 参考: https://stackoverflow.com ...

阅读全文...

Google Play 商品详情的描述规范

趁着 Google Play 最近搞的一个学习活动,了解了一下谷歌应用市场的优化技巧。 产品介绍的写作思路 面向的特定用户群体:例如,孩子家长,研究生,程序员之类 其他 app 没有的特色功能 常用功能有哪些?用户对哪些功能赞不绝口。 使用应用能获得什么优势? 你对应用最满意的部分是什么 是否有订阅内容 隐私保障 避免使用的词汇 免费 完美 最佳 排名第一 顶级 新 折扣 促销 百万次下载等 立即下载 立即安装 立即开始游戏 立即体验 避免堆砌关键词 这个是 Google 明确指出的。 而我恰好有这个习惯,这个做法在 baidu 和 bing 上屡试不爽。 但是确实对 Google 效 ...

阅读全文...

Material Design 3

官方文档 https://m3.material.io 契机 最近要启动一个 Android 项目,我感觉需要一套 Android 上的 UI 模板/框架。 类似 Web 开发中的 Bootstrap 这样的 UI 框架,否则我的组件、配色都很难搞定。 Material Design 看起来是最好的选择。 选择 Material Design 3 还是 2 看起来 Material Design 3 比 2 少了很多组件 例如: 分割线 日期选择器 需要动手测试,3 是否兼容 2 的组件,即 3 中也能使用 2 的组件。 但也不一定 2 就更全,可以看到很多 2 的组件,只有规范,但是 ...

阅读全文...

微信小程序显示蓝牙信号强弱

需求背景 蓝牙控制板放到控制柜里之后,就会有 20% 的概率出现蓝牙通信丢失的情况。 不确定是信号干扰的问题,还是放到控制柜之后,受隔音棉的影响信号变弱所致。 所以需要能够实时打印当前的蓝牙信号强度,来排除信号减弱的问题。 微信小程序界面上显示信号强度。底部,默认隐藏,点击显示。 参考文档 https://developers.weixin.qq.com/miniprogram/dev/api/device/bluetooth-ble/wx.getBLEDeviceRSSI.html wx.getBLEDeviceRSSI(Object object) 获取蓝牙低功耗设备的信号强度 (Rec ...

阅读全文...

微信小程序切换到后台时,取消蓝牙监听

需求背景 蓝牙设备一直在给微信小程序发送数据,例如一秒一次。 但是切到后台之后,再切回来,例如,间隔了5分钟,再切回来会收到大量的蓝牙数据。 看起来是微信帮小程序做了缓存队列,然后疯狂地传给小程序。 造成的影响就是,用户会看到界面在一顿疯狂地刷新,异常鬼畜。 我比较担心的是,如果时间更长,会不会导致用户切回来的时候,会在很长一段时间内无法操作。 解决思路 小程序切到后台时,需要取消监听。等切回来时,再重新监听。 因为在后台这期间收到的数据并没有处理的意义,只需要在再次打开时, 同步一下状态即可。 搜索了半天没有找到相关的文档。迫不得已浏览一遍小程序蓝牙文档,看看是否有相关接口。 没想到在车间里 ...

阅读全文...

gofmt, golint, gopls, govet 的区别

ALEInfo 显示,目前用 NeoVim 打开 go 代码文件时,默认启用了 4 个 linter: Enabled Linters: ['gofmt', 'golint', 'gopls', 'govet'] 其引起的不便是,同一行代码错误,可能会显示两条错误信息。例如, composite literal uses unkeyed fields 这一个问题,显示了两行提示:一个 warning,一个 error。推测是启用了两个 go lint 语法检测。 禁用之前,需要先了解各个工具的功能,及区别。 go vet vet 兽医的意思。。。大概是治疗 go 吉祥物这个大老鼠的吧。 ...

阅读全文...

go warnning: composite literal uses unkeyed fields

在启用了 NeoVim ALE 语法检测插件之后,我发现自己的代码到处都是各种警告,无论是 JS 还是 Go。 而 Go 代码中经常出现的警告信息就是 composite literal uses unkeyed fields。 例如,在使用 Gin I18N 实现多语言翻译的功能时: 警告信息 i18n/i18n.go|32 col 23-45 warning| github.com/gin-contrib/i18n.EmbedLoader composite literal uses unkeyed fields composite: 合成的 出问题的代码: Loader: & ...

阅读全文...

腾讯云 MQTT 由服务器生成长期的设备密码

密码过期问题 登录腾讯云管理后台,物联网通信,设备调试。可以看到提示: 以下MQTT三元组仅用于调试,将于2022-09-05 12:00:00后失效,正式设备请按算法生成 Client ID xxx MQTT Username yyy MQTT Password zzz 由于嵌入式硬件不方便接入腾讯云的 MQTT SDK,所以改成硬件从服务器获取 Username 和 Password。 然后将密码过期时间设置成 50 年,因为硬件设备的寿命大概也不会超过 10 年。虽然不严谨,但是满足目前的需求场景。 Client ID 格式 ${productId}${deviceName} ...

阅读全文...

js reduce 计算最大值、最小值

示例代码 const maxWidth = imgs.reduce((m, x) => Math.max(m, x.width), 0); 其功能是计算一组图片的最大宽度。 但是看起来很难理解。 可读性更好的 reduce 用法 const maxWidth = imgs.reduce( (previousValue, img) => Math.max(previousValue, img.width), 0 ); 其实就是遍历数组中的每一项,通过函数逐一比对,最终返回一个最大/小值。 reduce 参数说明 reduce() 方法接收一个函数作为累加器,数组中的每个值( ...

阅读全文...

go build tag 实现开发环境与生产环境采用不同的 embed.FS 策略

通过 go embed.FS 将 gin 模板及静态资源文件打包进二进制程序 确实非常方便在服务器上部署、更新程序,但是开发环境调试前端代码就非常麻烦了。 因为每次修改都需要重新编译。 所以,我想利用 go build tag 条件编译来实现,开发环境不启用 embed.FS,只在发布时使用。 重命名问题 xxx redeclared in this block build tag 的互斥来解决。即 //go:build !prod //go:build prod 省略任何一个,如果定义了同名的函数,或者变量,都会导致重复声明的问题。 文件命名来区分 绞尽脑汁起名 load.go / l ...

阅读全文...

用手抠破耳朵,流脓,有异味

最近耳朵痒,就用手抠,越抠越痒,就挠破了。 持续了两个周,开始流脓,结痂; 结痂之后,又痒,手贱,如此反复。 直到流脓开始有异味,感觉大事不妙。 就搜索了一下,大概是外耳道被感染。 于是晚上赶紧去楼下买了 氧氟沙星滴耳液 双氧水 三包医用棉签 一共 13 元。氧氟沙星滴耳液大概 5 块多。 处理流程 先用棉签蘸双氧水清理外耳道。流脓那只耳朵有明显的沙沙声,就像小时候吃跳跳糖的感觉,而正常那只则没有感觉。 然后滴入氧氟沙星滴耳液 十五分钟后用棉签清理 实际感受 其实用双氧水消毒后,感觉已经非常清爽了,只是不放心又继续滴了氧氟沙星滴耳液。 效果 大概3天,基本痊愈了,滴耳液实际只用了一天, ...

阅读全文...

Go build tag 实现条件编译

今天遇到了需要使用条件编译的场景,于是查了一下 golang 是如何支持条件编译的。 条件编译简介 go 文档里称之为,Build Constraints,即,编译限制。 也称为 build tag。 //go:build tag_name 其决定了当前文件是否会被当前 package 所包含。 重点: 用于限制一整个文件是否应该被编译入最终的二进制文件,而不是一个文件中的部分代码片段 (block) build tag 的一些使用场景 测试环境使用 mock 服务;而正式环境使用真实数据 免费版、专业版和企业版提供不同的功能 不同操作系统的兼容性处理。通常用于跨平台,例如 windows ...

阅读全文...