编程笔记

lifelong learning & practice makes perfect

概念

LLM/大语言模型

大语言模型(英文:Large Language Model,缩写LLM)是一种人工智能模型,旨在理解和生成人类语言。它们在大量的文本数据上进行训练,可以执行广泛的任务,包括文本总结、翻译、情感分析等等。LLM的特点是规模庞大,包含数十亿的参数

阅读全文 »

为什么有时候mysql不区分大小写

业务要求一个数据必须是唯一的,通过

1
select xx,count(*) from xxx group by xx

发现有重复数据,进一步发现有的其实不是重复,大小写不同,这就引出一个问题:为什么有时候mysql不区分大小写

阅读全文 »

单测

在vscode中,带_test的go源文件里的测试函数有有专门的优化,可点击”run test”,”debug test”一键测试

配置

在settings.json可以指定go buld参数如ldfalgs,gcflags等

1
2
3
4
5
6
7
8
9
10
"go.buildFlags": [
"--ldflags -r=${workspaceRoot}/lib" // works for 'debug test' but not 'run test'
// "-ldflags=-r ${workspaceRoot}/lib" // works for 'run test' but not 'debug test'
],
"go.buildTags": "linux",
"gopls": {
"build.buildFlags": [
"-tags=linux",
]
}
阅读全文 »

gopls

gopls是go官方维护的工具,提供代码提示,补全,格式化等诸多功能,之前的版本在vscode+wsl里使用,内存/cpu占
用都不小,大项目打开时容易卡顿.
在2023.9.8官方发文提到了新版本所做的优化和实现原理,更新
体验了下,确实有明显的体验提升.

使用以下命令更新

1
go install golang.org/x/tools/gopls@latest

目前最新版本是 golang.org/x/tools/gopls v0.13.2

更新内容

Reductions in memory use and startup time

减少内存占用,启动时间,官方测试了28个github上流行的项目大部分可减少60%~80%的内存占用

Across these repos, the savings average around 75%, but memory reductions are non-linear: as projects get larger, so does the relative decrease in memory usage. We’ll explain this in more detail below.

在这些存储库中,平均节省约75%,但内存减少是非线性的:随着项目变大,内存使用的相对减少也是如此

Separate compilation

之前,go原本最小的编译单位是package,为了获取import的package信息,需要将所有import的package提前编译好

在v0.12开始通过使用package summary和file-based cache优化最小编译单元,使gopls可以重用部分已编译的package

Fine-grained invalidation

在之前,对package代码做了变更后,gopls必须重新编译直接或间接import该package的package(增量构建系统的基本原理)

When you make a change in one package, it’s only necessary to recompile the packages that import that one, directly or indirectly. This idea is the basis of all incremental build systems since Make in the 1970s, and gopls has been using it since its inception

从v0.12开始,只要代码变更不影响import summary就不需要重新编译

optimize static anlysis

在此之前,gopls无法实现在内存中做太多static anlysis(会引入大量依赖,内存占用飙升)

v0.12优化内存占用后引入了新的anlysis,实现类似go vet的静态分析

参考

问题

在SpringCloud应用里使用protobuf,通过Maven编译生成对应的类,结果有一个类Idea飘红,无法跳转

1
2
3
message Position{
double x = 1;
}
  • Position正常情况下,应该生成 Position 和 PositionOrBuilder 2个类,出现的问题是Position类飘红,无法跳转

  • 安装了Idea官方插件”Protocol Buffers”,正常能从Protobuf文件中的定义跳转到生成的类上,Position只能跳转到
    PositionOrBuilder上

  • 在Protobuf文件中还定义了多个其他类,都能正常生成

结果

发现是生成的类文件过大,修改Idea配置,解决”The file size exceeds configured limit”
问题后能正常跳转了

file size exceeds configured limit

Idea菜单栏点击”Help”->”Edit custom properties” 添加下面的配置,修改文件大小限制

1
2
# custom IntelliJ IDEA properties
idea.max.intellisense.filesize=50000
阅读全文 »

Error

Error 1835: Malformed communication packet.

错误的数据包格式?

环境

  • 阿里云Serverless Mysql
  • Mysql 8.0

报错时发现DAS上显示’接入异常’,但是操作数据库写入,查询均正常,只有某个客户端用户操作报错.

几分钟后DAS状态恢复正常,未能复现

file/文件系统

dir/文件夹/目录

创建文件夹

makeDir all:

1
2
-- 传true将路径上所有子目录都会自动创建
makeDir @"c:\temp\test\deleteme\if\you\can" all:true

删除目录

maxscript 2014,2015没有提供内置函数删除目录,需要调用.net类或者外部命令删除,下面的案例使用rmDir命令删除

HiddenDOSCommand [ startpath:unsupplied] [ prompt:unsupplied] [ donotwait:false] [ ExitCode:&variable]

1
2
3
4
5
6
makeDir "C:\\doscmdtest\\"
str = "rmDir C:\\doscmdtest\\"
hiddendoscommand str startpath:"$max" exitCode:&exitcode
exitcode --> 0
hiddendoscommand str startpath:"$max" exitCode:&exitcode
exitcode --> 2 (error since directory does not exist anymore)

File Name Parsing/获取文件名,路径

filenameFromPath

filenameFromPath

返回文件名(包含后缀)

1
2
file="g:\\subdir1\\subdir2\\myImage.jpg"
filenameFromPath file -- returns: "myImage.jpg"
getFilenamePath

getFilenamePath

1
2


参考:

UI

1
2
3
4
5
6
7
8
9
10
11
12
-- 按钮,点击按钮弹窗展示一张图片
-- layout是弹出窗口的布局,只有一张图片

rollout layout "示例图"
(
bitmap bmp fileName: ("img\\example.png")
)
button displayImg "查看示例图" across:1 offset:[0,0] align:#center width:100 height:35
on displayImg pressed do
(
createDialog layout 1920 1080
)

通过命令传参

linux系统

1
2
# 通过 GOOS指定系统,GOARCH指定架构
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build main.go

windows系统

上述命令在powershell,cmd中不可用

通过设置环境变量

1
2
3
4
5
6
7
8
9
#查看go环境变量
go env

# 设置
go env -w GOOS=windows GOARCH=amd64

# 设置完环境变量再构建

go build -o xxx xxx.go

系统,架构值参考

1
2
3
4
5
6
7
8
9
10
$GOOS         $GOARCH     
darwin 386
darwin amd64
freebsd 386
freebsd amd64
linux 386
linux amd64
linux arm
windows 386
windows amd64

参考

近来,serverless这个词出现次数愈加频繁,各云厂商也纷纷推出相关的产品和工具,最近也尝试在公
司项目上使用severless去解决一些问题,这里讲讲我的体验.

阿里云FC

阿里云的severless产品,从对已有框架的支持上说,FC的体验非常好,go,java,js,python的各种框架基本都支持,也通过社区/官方提供了完善的demo和模板(serverless devs,工具, demo,模板)

阅读全文 »

一次线上报表导出的功能异常无法使用,看监控日志,服务器内存有段时间占用高
监控

除内存异常,其他组件都没发现问题,怀疑OOM导致服务挂了,查询服务运行时间,发现确实是重启了.

1
2
3
4
5
# 查看程序pid
ps -aux | grep "xxxx"

# 通过pid查看启动时间
ps -o lstart,etime -p xxx

go pprof 分析内存占用

分析异常api的功能主要是excel的读写(用的excelize这个库),便用prof测试下内存占用,这里在测试用例读取一个几万行的excel文件(.xlsx),使用go的工具pprof记录内存占用

从.xlsx文件与.csv文件读取对比看,excelizexlsx读取xlsx文件,比使用encoding/csv包读取csv文件更占内存,相差在2至3倍,前者平均需要4,5GB内存,后者仅占1.7GB左右.

综上,没有特殊需求,简单的表格文件保存可以优先选择csv

文件大小

file size

以下测试使用同样内容的文件,8w行,csv:30.1MB,xlsx:18.7MB

go pprof使用

阅读全文 »