2023-09-23 07:12:58    70    0    0

工作满四年了,过去将近一年时间在凉屋的工作让我产生了极大的转变和技术成长,在进入凉屋之前,我的技术欠缺到了现在的我完全不敢相信的程度,但之前的工作也不是完全浪费时间,所以想记录一下自己工作以来的经历,以后尽可能地将尽可能多的经验转换为决策的依据。

关于在浪潮为什么换工作,是因为浪潮工资太低,周六甚至没有加班费,而加班强度一点也不低,老板“周一来讲讲周六为什么不加班”的言论让人非常不舒服,搬服务器、一根根内存条排查问题也不是一个亟需成长的程序员整天应该做的事情。在觉得自己没有任何留下去的理由后,经过朋友的推荐,去了华为 OD,至于为什么 OD 也去,是因为当时不知道 OD 代表什么,本来就比较佛系,不想在非技术领域探究太多,所以考虑到工资几乎是浪潮y8500块钱的两倍,还能换个领域扩展知识和见识,没有理由不去。现在想想当时如果还留在浪潮,可能还会有很长时间在免费加班做边缘的事情,这种情况是我一定会马上做出改变的。

不过在浪潮工作期间我也学到了很多知识,虽然没有在工作中用到太多,例如从校园走到职场的热情让我啃完了《C和指针》、《Linux应用程序设计》、《UNIX/LINUX shell 编程指南》这几本书,对 linux 应用编程的学习到了华为工作中还在持续发挥重要作用。在写操作系统安装、更新脚本的过程中熟练应用了 shell 编程,从计算机上电、到 BIOS/bootloader 工作、再到 linux 系统的启动流程能略懂一二,能够自己修改操作系统镜像也是一个让极客很满足的技能。

后来到了华为,在华为的第一份工作是消息队列的 demo 开发,用于5G消息,还学习负载均衡的理论知识,因为可能会做负载均衡的服务,但后来真正开始开发,则是5G消息的 MSRP 服务,简单来说就是应用层富文本的解析、转发服务,同时需要关注底层的 TCP + MSRP 协议栈。MSRP 服务的所有数据都存在内存中,包括会话、链路的池子,缓存+顺序处理的 MSRP 包消息队列。华为在将一些虚拟机时代的应用迁移到容器中,但这种迁移并不彻底,在华为有很多被称为大颗粒的服务,实际上就是将原来虚拟机上运行的单体应用打包到了容器中运行,只体现了容器镜像的开发/生产环境一致、快速部

2022-02-23 14:16:24    31    0    0

资源管理

  • 资源包括:
    • 内存(栈或堆)
    • 访问硬盘或其他介质(如网络)上的文件所需的文件句柄
    • 网络连接
    • 线程、锁、定时器和事务
    • 其他操作系统资源,如Windows的GDI(图形设备接)句柄
  • 处理资源时,需要在正常和异常分支都合理地进行资源释放(例如delete释放new创建的对象),但异常分支变多时,很可能忘记,任何一个分支只要有一个忘记释放,就会导致资源泄漏,对于生命周期长或快速分配很多资源的进程,资源泄漏是很严重的问题,还可能导致存在拒绝服务(DOS)攻击漏洞。
  • 一个解决方法就是在栈上创建对象,即不要创建对象的指针。

资源申请即初始化

  • 资源申请即初始化(Resource Acquisition is Initialization,RAII)是帮助我们安全处理资源的术语,该术语也被称为“构造时获得,析构时释放”,或者“基于范围的资源管理”。
  • RAII利用类的构造函数和析构函数的对称性,我们可以在类的构造函数中分配资源,在析构函数中释放资源。下面的示例是一个适用于不同资源的简单模板类,不需要用户去new创建对象或delete释放对象。
    被管理资源:
  1. using namespace std;
  2. class Foo {
  3. public:
  4. void foo();
  5. private:
  6. string name;
  7. };
  8. void Foo::foo() {
  9. name = "foo";
  10. cout << name << endl;
  11. }

模板类实现的资源管理类:

  1. template <typename RESTYPE>
  2. class ScopedResource final {
  3. public:
  4. ScopedR
2022-02-20 16:27:55    37    0    0

说明

  • 该博客由《C++代码整洁之道-C++17可持续软件开发模式实践》总结而来,部分内容有异议所以加上了自己的看法。

良好的命名

  • 源代码文件、命名空间、类、模板、函数、参数、变量和常量等,都应该具有有意义且富有表现力的名字。

名称应该自注释

  • 不好的命名就像打包搬家的箱子上写“东西”,而不是“餐具”等有意义的分类,浪费时间且没有意义。
  • 不好的命名:
  1. unsigned int num;
  2. bool flag;
  3. std::vector<Customer> list;
  4. Product data;
  • 好的命名:
  1. unsigned int numberOfArticles;
  2. bool isChanged;
  3. std::vector<Custom> customers;
  4. Product orderedProduct;
  • 命名也不应该过长,否则也会影响可读性,不要在函数、变量等的命名中包含文件名、类名等上下文信息。

使用域中的名称

  • 领域驱动设计(Domain-Driven Design,DDD)是试图将业务领域的事物和概念映射到代码中,使软件系统成为一个真实系统的模型。
  • 类、方法、参数、返回类型等命名都使用业务领域内典型的术语,具有领域知
2022-02-14 15:58:02    43    0    0

配置网络

配置静态IP

  • 这里安装的CentOS虚拟机,用的桥接模式,所以网关、掩码用宿主机的,IP配置一个不冲突的(宿主机ping不通的)。
  • 最小安装的CentOS没有ifconfig命令,所以用ip addr命令查看网口,然后修改相应的配置:
  1. $ ip addr
  2. ...
  3. 2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
  4. ...
  5. $ vi /etc/sysconfig/network-scripts/ifcfg-ens33
  6. ...
  7. ONBOOT=yes
  8. BOOTPROTO=static
  9. IPADDR=172.31.18.55
  10. NETMASK=255.255.248.0
  11. GATEWAY=172.31.16.1
  12. $ systemctl restart network

配置DNS

  • 宿主机执行ipconfig /all可以获取到DNS地址,虚拟机中在/etc/resolv.conf中配置。
  1. $ cat /etc/resolv.conf
  2. nameserver 116.116.116.116
  3. nameserver 120.80.88.88

配置国内镜像源

  • 配置阿里云开源镜像源:
  1. $ mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
  2. $ curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
  3. $ sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo
  4. $ yum cle
2022-02-14 15:29:48    40    0    0