编程笔记

lifelong learning & practice makes perfect

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

除内存异常,其他组件都没发现问题,怀疑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使用

阅读全文 »

summary

multipart 用于在http中高效上传文件

“multipart” or “form-encoded data” is a MIME type which contains multiple files.

优点

  • ‘application/x-www-form-urlencoded’(在multipart之前用于文件上传的方式)需要在文件上传前encoding,multipart不需要

  • stream each part separately(多个文件,对每个文件支持单独流式传输)

样例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
POST /cgi-bin/qtest HTTP/1.1
Content-Type: multipart/form-data; boundary=2a8ae6ad-f4ad-4d9a-a92c-6d217011fe0f
Content-Length: 514

--2a8ae6ad-f4ad-4d9a-a92c-6d217011fe0f
Content-Disposition: form-data; name="datafile1"; filename="r.gif"
Content-Type: image/gif

GIF87a.............,...........D..;
--2a8ae6ad-f4ad-4d9a-a92c-6d217011fe0f
Content-Disposition: form-data; name="datafile2"; filename="g.gif"
Content-Type: image/gif

GIF87a.............,...........D..;
--2a8ae6ad-f4ad-4d9a-a92c-6d217011fe0f
Content-Disposition: form-data; name="datafile3"; filename="b.gif"
Content-Type: image/gif

GIF87a.............,...........D..;
--2a8ae6ad-f4ad-4d9a-a92c-6d217011fe0f--

reference

在分析一个sql执行计划

1
2
3
4
5
6
explain  
SELECT id,user_id
FROM `order`
WHERE shop_id = xxx and (corp_id = xxx)
ORDER BY create_time DESC
LIMIT 10

在返回值的extra中看到一个陌生的字眼”Backward index scan”,下面探索下这是个啥

1
Extra:  Using index condition; Backward index scan
阅读全文 »

explain

output

Table 8.1 EXPLAIN Output Columns

Column JSON Name Meaning
id select_id The SELECT identifier
select_type None The SELECT type
table table_name The table for the output row
partitions partitions The matching partitions
type access_type The join type
possible_keys possible_keys The possible indexes to choose
key key The index actually chosen
key_len key_length The length of the chosen key
ref ref The columns compared to the index
rows rows Estimate of rows to be examined
filtered filtered Percentage of rows filtered by table condition
Extra None Additional information
阅读全文 »

线性变换

常见的线性变换平移、缩放、旋转、投影

三维空间的坐标表示

通常用4x4矩阵表示3D空间中的变换,如平移、旋转、缩放等。

  • 旋转变换:矩阵的前三列表示三个坐标轴的旋转变换,每列都是一个长度为3的向量。例如,第一列表示绕X轴旋转的变换,第二列表示绕Y轴旋转的变换,第三列表示绕Z轴旋转的变换。
  • 平移变换:矩阵的第四列表示平移变换,它是一个长度为3的向量,表示在每个坐标轴上的平移量。
  • 透视变换:矩阵的第四行用于透视变换,通常表示投影平面上的坐标系。
  • 缩放变换:矩阵的对角线元素表示缩放变换的比例因子,例如,x轴缩放因子为矩阵的第一个元素,y轴缩放因子为第二个元素,z轴缩放因子为第三个元素。

平移

对于一个3D空间中的点A(x, y, z),我们可以使用一个4x1列向量表示它,如下所示:

1
2
3
4
x
y
z
1

其中最后一个元素为1,这是为了让矩阵乘法能够正确地进行。
要对这个点进行平移变换,我们可以创建一个如下所示的4x4矩阵:

1
2
3
4
1 0 0 tx
0 1 0 ty
0 0 1 tz
0 0 0 1

其中(tx, ty, tz)表示平移向量。然后,我们可以将该点与矩阵相乘来进行变换,如下所示:

1
2
3
4
x' = x + tx
y' = y + ty
z' = z + tz
1' = 1

缩放

缩放矩阵

1
2
3
4
sx  0   0   0
0 sy 0 0
0 0 sz 0
0 0 0 1

缩放后点A为A’

1
2
3
4
x' = x*sx
y' = y*sy
z' = z*sz
1' = 1

旋转

透视

参考

3ds-max

文件格式

.dxf格式是什么文件

一种CAD(计算机辅助设计)文件格式,常用于存储二维和三维设计数据。它是由AutoCAD开发的,
可以被许多CAD软件读取和编辑。.dxf文件包含设计元素,如直线、圆、弧线、多边形、文本等,也包括图层信息、颜色、线型、线宽等属性。这些文件通常用于建筑、机械、电子工程等领域的设计和制造

阅读全文 »

当配置文件中有中文时,springboot服务读取nacos配置启动报错:

1
2
3
4
5
6
7
8
ERROR 9740 --- [           main] c.a.c.n.c.NacosPropertySourceBuilder     : parse data from Nacos error,dataId:xxxxxxxxxxxxxx.yaml,data:server:


.....



org.yaml.snakeyaml.error.YAMLException: java.nio.charset.MalformedInputException: Input length = 1
阅读全文 »

Maven

Maven如何管理依赖

Maven维护了一个中央仓库repo1.maven.org
所有第三方库将jar包以及相关信息上传至中央仓库,Maven就可以从中央仓库把所需依赖下载到本地.
被下载过的jar包会被Maven自动缓存在本地目录(用户主目录的.m2目录,~/.m2),
除了第一次编译时因为下载需要时间会比较慢,后续过程有本地缓存则不会重复下载相同的jar包

jar包的唯一id

  • groupId:属于组织的名称,类似Java的包名
  • artifactId:该jar包自身的名称,类似Java的类名
  • version:版本号

镜像

在用户主目录下进入.m2目录,创建一个settings.xml配置文件

1
2
3
4
5
6
7
8
9
10
11
<settings>
<mirrors>
<mirror>
<id>aliyun</id>
<name>aliyun</name>
<mirrorOf>central</mirrorOf>
<!-- 阿里云 Maven镜像 -->
<url>https://maven.aliyun.com/repository/central</url>
</mirror>
</mirrors>
</settings>

vscode不使用maven等工具手动导入jar包

步骤

  1. 下载相应的jar包
  2. 加入Referenced Libraries中
    比如下面日志用了Commons Logging(一个第三方日志库)
阅读全文 »

刚开始使用vscode+java时遇到这个问题,Could not find or load main class x,
将源文件加入”Java source paths”并修改文件名与主类名相同后解决了.
这样就能方便地调试运行单个java文件了

新的问题

  1. 但是由于”Run|Debug”这两个快捷按钮每次会根据类名生成配置并写入launch.json,
    且当主类名相同时调试运行的程序会出错(不是当前文件),还是很不方便,
    这要求运行的主类名与已在”Java source paths”的类不同才能正常调试运行
  2. 每次自动根据类名生成配置也会导致配置文件中的配置越来越多
阅读全文 »