本文为 2022 年 7 月工作生活总结。
研发编码
近来编码,基本都是业务、自动化测试相关的,在写代码时,主要考虑便捷性,快速出结果。性能方面不怎么考虑。像写C++,如果没有什么特殊的要求,字符串都是用string
类型,涉及格式化,则还是用数组,结合sprintf
,但最后还是用string
,因为组装比较方便。另一方面,也不怎么纠结字节大小,一般数字用int
存储,也不考虑深拷贝还是浅拷贝,原则就是,怎么写代码快就怎么来。像实现web服务器,对外提供接口,优先考虑 golang,解析json文件亦然。
C++
某个txt文件,使用=
分割字段和值,需读取解析出来。使用了C++的getline
函数,但当文件格式为\r\n
结束时,会出错,会把\r
当成普通字符读取,导致值错乱,而结束符为\n
时正常。为了使用那套代码,在读取一行字符串时,判断最后一字符,如果为\r
则删除。
int readInputFile(std::string filename)
{
std::string str;
std::ifstream ifs1(filename);
if (!ifs1.is_open())
{
printf("open [%s] failed: %s\n", filename.c_str(), strerror(errno));
return -1;
}
while (getline(ifs1, str))
{
if ((int)str.size() == 0 || str.at(0) == '[' || str.at(0) == ';' || str.at(0) == '#')
continue;
if (str.at((int)str.size()-1) == 0x0d) str.pop_back();
std::vector<std::string> linestr = splitString(str, "=");
int len = (int)linestr.size();
if (len != 2)
{
continue;
}
std::string key;
std::string value;
key = linestr[0];
value = linestr[1];
if (key.compare("foo") == 0)
{
printf("foo = [%s]\n", value.c_str());
}
// ... 其它字段
}
return 0;
}
go
某工程需要使用测试数据,但又不想直接在代码中固定。可在指定目录使用特殊的文件名称以作区别,随机读取其中一个作为测试用例数据。思路:
- 先获取符合要求的文件数量N;
- 再从[0, N)中取一随机数,得到某个文件的索引,使用包
math/rand
即可; - 再读取该文件。
如此一来,不用再修改代码,而是添加不同测试用例文件即可达到目的。
func CmdCmd() {
fmt.Println("test...")
fmt.Printf("file: %v\n", getTestFileData("postcase_"))
fmt.Printf("file: %v\n", getTestFileData("getcast_"))
fmt.Printf("file: %v\n", getTestFileData("update_"))
}
// 固定测试目录
var testdata = "testdata"
// 获取指定目录N个指定文件格式中的随机一个,返回内容
func getTestFileData(patten string) (ret string) {
ret = ""
// 获取目录下所有符合的文件数量
files, err := com.GetAllFilesOneDir(testdata)
if err != nil {
return
}
var myfiles []string
for _, item := range files {
if strings.Contains(item, patten) {
myfiles = append(myfiles, item)
}
}
// 防止随机数函数小于0出错
if len(myfiles) == 0 {
return
}
// 随机一个
rand.Seed(time.Now().UnixNano())
randidx := rand.Intn(len(myfiles))
// fmt.Printf("files: %d %d %d\n", len(files), len(myfiles), randidx)
// 读取之
buffer, err := com.ReadFile(myfiles[randidx])
ret = string(buffer)
// ret = myfiles[randidx]
return
}
工作记录
在国产化工控机移植任务中,因为 onvif 视频播放有问题,最终定位到 gsoap 版本不兼容,于是重新编译,花了一定的时间。后机缘巧合下,拿到一台前前前前东家的相机进行测试,开机的LED灯状态没变化,依然是我设计的红灯、黄灯,绿灯的顺序,所幸还记得默认IP、默认账号,不需要额外的协助。离开那家公司时,大锤才三个月,现在他妹妹都两岁半了,时间过得真快。
主任工找了我一次,语重心长分享了编码、测试心得,并问我如何做好测试,如何管理代码,因为有个较重要较关键的工程要交接,——这也是主任担心的原因,我受宠若惊,也诚惶诚恐,如履薄冰,这是个挑战,也是个机遇。
生活记录
月初,网购了几种不同的蟑螂药,都一一试了,战果颇丰,清除几次后,半夜就没再见小强到处散步了。但不知道能坚持多久。
中旬,在大锤多次要求下,办了一张小区的游泳卡,共30次,但下个月底过期,所以周末又多了一个事:带大锤和大妞去游泳——当然现在更多的是玩水。
天气越来越热,用电量持续上升,但又不能天天呆家里,当然也不能长时间呆户外。某个周末全家去公园,天空时而放晴,时而下雨,看完荷花盛开,又爬小山坡听松涛阵阵,顺便找蝉壳和松果,让大锤大妞知道夏天的气息。
这段时间,看到新闻报道有较多负面的事:打人,取不出钱,篡改数据,烂尾,断供,停贷。我的不幸,是在去年利率处于较高(可能是最高)水平时买房。我的幸运,是当初没有在五象入手期房而是购买二手房、现在有份稳定的工作(虽然是外包,虽然工资延后近一个月发),所以现在有地方住,有钱交房贷。我和父母通话谈了这些事,父母说得最多的是没有多余的钱支持,但不用担忧他俩生活,管好我自己,孙子的钱不能太省。居安思危,我对工作的态度,可谓比家人还好,叫加班二话没有,叫搬东西二话不说,熬夜写代码是常事。
思想方面
互联网太泛了,聚集了不同的观点的人,可发表不同的看法。我关注但很少参与网上的事,目前我的重点是:努力工作写代码,顺便写点文章,偶尔看书提升自己,教育小孩,带小孩玩,买菜,做家务。人的精力有限,挑主要的做即可。
我在网上分享了软考的事,很人质疑,但没过多回复,因为没必要。如质疑证书真假,对我而言,能靠证书评职称或者有补贴就好,不用对外交待。如质疑技术,大可看写的文章和 github 的代码。如质疑我不懂带小孩,我也无须过多辩解和证明,小孩开心即可(当然不听话时该打还得打)。
业余研究
掘金平台上个月的日更活动得了全勤奖,共发表31篇文章,奖品在月末如期收到,大锤和大妞喝上新鲜果汁了,我的拖鞋码数也符合,后面整理些东西,和电饭煲一起寄回老家。
计划实现一个播放器,初步设想中,使用 Qt、ffmpeg、SDL编写,把以前写的YUV播放、H264裸码流播放、各种格式转换功能等加进去。目前迫切需要的是音视频分离,音视频截取功能。主要是要把下载的音乐、儿歌转成音频,减少小孩看手机的机会。