李迟2022年7月工作生活总结

892 阅读6分钟

本文为 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裸码流播放、各种格式转换功能等加进去。目前迫切需要的是音视频分离,音视频截取功能。主要是要把下载的音乐、儿歌转成音频,减少小孩看手机的机会。