本文为 2024年4月工作生活总结。
研发编码
excel创建直方图
因工作需要,在excel学习使用了直方图。下面是文字版。
加载工具库:
直方图可在"数据"->"数据分析"中找到,如无,则要加载之。文件->选项->加载项,"管理 Excel加载项","转到",勾选"分析工具库",确定。
创建直方图:
A列填写标题及数据,B列写标题及区间数值(包含本级),如60、80、100(表示60及以下的,60~80,80~100,100及以上的)。"数据"->"数据分析"->"直方图",确定。输入区域选A列(从标题开始至结束),接收区域选B列(含标题),勾选"标志",输出区域选空白列即可,勾选"图表输出",确定,即可。可再对创建的直方图及数据进行调整。
改现有代码的一点记录
本月因某工程代码迭代,查了一些模块代码,改一一些代码。记录一下。
- 头文件的结构体定义
char foo[18]
字段,但在使用时,较大使用if (foo == NULL)
来判断其是否合法。我一度认为是未初始化时foo里的数据为空,于是用NULL
来判断,大胆猜测,小心求证,经过自编测试代码,发现foo
不会为NULL
。 - 接上,偶尔发现有部分地方使用
sizeof(foo) < 18
这样的语句判断是否合法,这个也有点影响到我朴素的编码认知。也不是不行,只是有点不太能接受。
Golang计算经纬度
源码如下:
// 返回距离 四舍五入取整到米 latlng 传入为经度、纬度
func GetEarthDistance(latlng [][2]float64) int {
if len(latlng) < 1 {
return 0
}
total := 0.0
for i := 0; i < len(latlng)-1; i++ {
dis := GetEarthDistanceSingle(latlng[i][1], latlng[i][0], latlng[i+1][1], latlng[i+1][0])
total += dis
}
return int(math.Round(total))
}
// 计算2个经纬度之间的距离,单位为米(不取整) 纬度 lat1 lat2 经度 lng1 lng2
func GetEarthDistanceSingle(lat1, lng1, lat2, lng2 float64) float64 {
if lng1 == lng2 { // 经测试lng1和lng2相等时,会返回NaN,判断之
return 0.0
}
// 地球赤道半径。一说用 6378137.0,经测试,会有误差,弃用
radius := 6371000.0
rad := math.Pi / 180.0
lat1 = lat1 * rad
lng1 = lng1 * rad
lat2 = lat2 * rad
lng2 = lng2 * rad
theta := lng2 - lng1
dist := math.Acos(math.Sin(lat1)*math.Sin(lat2) + math.Cos(lat1)*math.Cos(lat2)*math.Cos(theta))
return dist * radius
}
说明:就我们国家而言,数值大的是经度,小的是纬度。按latlng的排序,应该是纬度、经度。但一般都称呼"经纬度"。所以2个函数有参数顺序有点不同。leaflet的坐标是纬经度,个人保存的数据还是用经纬度。在传给前端时程序内部调换一下顺序,两边都happy。
旧机制新形势
我手上维护着的代码,最早可以追溯到2000年前,几个主力工程,诞生时间也有在2015、2016年的。改祖传代码我都很小心,除了明显的问题,如打开文件不关闭,申请内存不释放,数组长度不够等,基本会大胆地改。但对于机制不明的地方,还是不敢随便动。领导提过几次,原来是这样,就一直是这样吗?按发展观点看,的确不能如此,但改动触发某些坑,责任就很大了。比如之前重构某工程的接口,实际是有2个接口,绝大部分的实现是一样的,但是却人为区分开,在分析代码时,一个代码片段,经常在多个地方看到,加上C++的重载特性,不小心就会搞混。
在开会时,领导多次提到,设计、开发、测试,原来都是一个人做完的,现在人多了,问题也多了。
目前还没有找到好的方法解决问题。在没有文档情况下,走一步算一步,积累经验。
程序性能和投入时间
我真正编程是从单片机开始的工作后很长时间内是做嵌入式开发(当然也搞上位机)。因此对存储、耗时比较敏感,这个习惯现在也保持着。但往往要投入比较多的时间。
概括与概念
要善于概括,提炼文字,形成概念,这样方便和他人沟通,特别是对业主。否则对外一种说法,内部是另一种说法,不易交流。这点我还是比较欠缺的。
责任心
某集群跑着若干服务,有的服务有多个实例,且用nginx进行负载均衡,但服务使用方没有将IP和端口配置成nginx统一入口,去年提过几次。这个月出了线上事故,某实例异常,导致服务异常,经查,另一实例正常在跑。但因为使用方没有配置nginx的端口,所以已有的负载均衡机制没有生效。
某几台服务器在跑应用服务,每天产生较多日志,平均1GB,最甚者有3GB~5GB。而应用服务所在的磁盘分区只有几十GB,由于是生产环境且有一定年限,所以只能用脚本处理日志。这个也是我做测试查日志才知道,虽然只是负责其中一动态库模块,但还是写了定期脚本清除日志。
趁着搬迁,决定彻底和服务器维护撇开关系,不是自己开发的程序,不负责部署,以前就是口子开了,很多程序传着传着变成是我负责了。我觉得现在涉及的语言和技术栈已经够杂的了,像Java、spring那些,真的啃不动,宁可把花在这上面的时间投入到业务了解上。
生活记录
热爱生活
某天突然发现,自己已经很久没有热爱过生活了。没什么爱好,周末假期不想出去玩,如果大锤没有特别要求去玩,我宁可在家,博物馆的青铜器展出有4个多月,我才带大锤去过一次。文学类文字和小说,现在也看不下去了。回顾大锤出生至今的7年多时间,除了起初工作变动带来的刻心记忆外,其它的,没什么值得记下来的。
回首这一路,让我铭记的,或者是初中那个夏天的下午,我刚去市区买了个随身听,用来自己录音背书,然后在一快餐店吃饭,几块钱的菜已经很丰富了,店里还放着《河东狮吼》电影。那时对未来是有憧憬的,作为从山村出来的娃,好好学习,考上高中,就是对父母的报答。
育儿记录
每次大锤不听话,都会吵架,大锤性格也有变化了。这个月班上有3位学生被老师找家长,大锤是其中一个。不懂是不是教育体系发展趋势使然,现在的很多作业都是在手册布置,学生完成,家长批改。我对大锤要求其实不高,背诗文没有时间要求,对写的作业也不要求全对,有时个别字写得不好,也没纠正,有些数学写错也没说。但队友不行,印象最深的一句话是:两个人,两天时间,还错那么多。用特有的南普口音说出来,我能记住很长一段时间。于是我对大锤也严格起来,于是大锤在家被骂,在学校被老师批评。