大象笔记

知者行之始,行者知之成

多语言软件 i18n 的手动实现流程,及痛点

手动 i18n 的流程,及痛点 基本功能实现 提取文本到默认语言的本地翻译 locale 文件。通常使用英语,但是如果主要群体是国内用户的话,我默认使用中文 翻译文件名使用 locale 命名。例如,zh, en 等。我这种个人开发做得比较粗糙,没有针对同一语言不同地区/国家做区分,例如,en_US,en_IN, zh_CN, zh_TW. 将默认翻译文件内容,复制到 Google 翻译网页版里,然后逐个语言翻译,并复制到对应的其他语言文件中。这个过程枯燥而繁琐 复制内容是 key value 格式的,需要将翻译后的 value 手动摘出来 Google 翻译选择语言的界面,要找到一门语言 ...

阅读全文...

修改 EMQX 最大文件句柄数

是不是叫 EMQX 系统参数调优更合适?因为不但 max open files 需要配置,其他 TCP 参数也需要配置。 主要参考官方的配置: https://www.emqx.io/docs/zh/v5.0/deploy/tune.html 清单 done:ulimit -n 1048576 done: /etc/security/limits.conf done: /etc/sysctl.conf done: /etc/systemd/system.conf done: 重启 emqx 服务:ulimit -n 1048576; ./emqx stop; ./emqx start don ...

阅读全文...

WPF 选择文件夹/目录

需求 我需要在 WPF 程序界面上点击按钮,弹出一个选择对话框,选一个目录/文件夹, 然后界面上显示出来这个具体的目录的全路径,同时列出里面所有的文件清单。 (最终使用) System.Windows.Forms.FolderBrowserDialog 我没太看明白为何 github 相关 issue 评论里抗拒使用 WinForm 的方式。 按照: https://stackoverflow.com/questions/1922204/open-directory-dialog 里所说,WinForm 的 FolderBrowserDialog 在 .Net Core 3.0 之后进行了界面 ...

阅读全文...

.NET 6.0 WPF 项目代码目录结构

使用 Visual Studio 2022 社区版创建,WPF 项目。注意选择的是 .NET 6.0,而不是 .NET Framework。 了解目录结构是为了方便在终端里开发,摆脱 VS。 例如,我新建了一个 I18nTool 的项目: 未编译前目录结构 > tree . ├── I18nTool │   ├── App.xaml │   ├── App.xaml.cs │   ├── AssemblyInfo.cs │   ├── I18nTool.csproj │   ├── I18nTool.csproj.user │   ├── MainWindow.xaml │   ├── ...

阅读全文...

ulimit 查看 Maximum number of open file descriptors

ulimit 的作用 网上大部分介绍是说,ulimit 显示的是当前用户的资源限制。 “ulimit” is an interesting Linux shell command that can set or report the resource limit of the current user. 而 man ulimit 的描述是,shell 的资源限制。 ulimit builtin sets or outputs the resource usage limits of the shell and any processes spawned by it. ulimit ...

阅读全文...

gorm many2many 导致 [gopls] import cycle not allowed

今天第一次遇到 go 的循环引用问题: [gopls] import cycle not allowed 起因 新项目使用了新的包结构,每个 model 及对应 controller 放到独立的 package 中。 而不是两个大 models 目录,controllers 目录。 恰好一个 gorm many2many 关系导致两个 package 相互依赖,例如,文章及标签。 article 和 tag 这俩个 model 引起了 import cycle。 go 为何要禁止 import cycle 提升编译速度。 解决办法 Packages are compilation uni ...

阅读全文...

go gin 打印日志到文件

由于低版本的 systemd 不支持 append 记录日志的方式,所以用代码实现了 gin 写入日志到文件的功能。但是会发现日志文件只记录了 gin 路由的信息,而自己通过 log.Printf 打印的日志,并没有记录下来。 通过已记录日志的关键字 GIN debug 前缀,找到了 gin 里日志的实现。 GIN-debug: debugPrint func debugPrint(format string, values ...any) { if IsDebugging() { if !strings.HasSuffix(format, "\n") { fo ...

阅读全文...

基于 golang gin 重构 php laravel 博客系统

这个想法是两个月前,在用 go gin 实现了一个中英双语的产品介绍网站时产生的。也基于那个代码架构实现了一部分博客功能,但是后面去忙别的紧急项目,就一直搁置了进度。今年十一期间,不是太忙,就断断续续开发了几个功能,但是距离上线还是有很大的距离,主要是现有博客实现的功能又多又杂,重写起来并没有想象中得容易。 核心目标 熟悉一下 go & gin 写网站。毕竟这个博客就是在自学 php 及 laravel 的过程中一点一滴开发出来的。这期间也纠结要不要转向 ASP.NET 实现,反反复复之后还是决定算了,继续用 go 实现,毕竟 go 优点还是太明显。 多语言支持:原本只支持中文,这次 ...

阅读全文...

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,不同之处在于是不同的通信协议,都 ...

阅读全文...