纪念|买了个新键盘

抛弃以前的键盘的原因:服役了很久的罗技键鼠套装,甚至鼠标都不知道飞到哪里去了。服役年龄长带来的问题:

  1. 键面有点黏,粘了一些尘,手感很差
  2. 按下去的时候很硬,反弹的时候又黏滞,导致错漏很多;最严重的是尾指控制的键,由于尾指的力量本来就弱,按z和ctrl的时候手掌也没办法辅助给力,经常漏按这两个键。

所以看知乎的建议,买了个达尔优的87键茶轴。初步体验感觉不错:

  1. 87键没有了数字区,刚好适合面积有限的桌面,鼠标再也不需要和键盘抢位置了
  2. 有背光,虽然是无法更改颜色的普通背光,但是至少照明效果有了(可以调亮度,多级)
  3. 茶轴的两段式手感没特别的感觉,但是比起原来的键盘实在是好太多了,打起来带劲
  4. 声音还是有点出乎意料的(大)
  5. 有Fn键,可以控制媒体播放(这条出乎意料,解决了听歌的各种问题)

总而言之,109块买到一个这样的键盘,确实是小确幸。

C++|用Visual Studio配置GTest

第一步.下载源代码

Google Test的Github下载最新的Release的zip。解压。

第二步.cmake创建工程

打开Developer Prompt For VS 2019,cd进解压出来的文件夹(见上图)里的googletest子目录,执行:

cmake .

会自动侦测出是在VS环境,生成sln文件。打开sln。

第三步.生成lib文件

gtest实际上就两个lib文件,一个用于Debug,一个用于Release。打开sln之后,下图里的Debug生成一次,改成Release再生成一次:

生成的文件就在sln文件同目录下的lib文件夹里,对应的Debug、Release两个文件夹:

把lib文件夹复制到随便能找到的地方,在正在开发的解决方案里配置“链接器”相关属性即可。

Extra.更改配置为lib

gtest是对lib进行测试的,所以如果开始时用了exe配置,跑unit test的时候就会报错LNK2019,要改成lib:

C++|copy-and-swap idiom

copy-and-swap是为了赋值操作符和move构造器能够更优雅(而且稳定)地完成工作而出现的。Rule Of Three要求自己定义的类如果提供了以下其中之一,就要提供全部:

  1. 析构器
  2. 复制构造器
  3. 复制赋值操作符

C++11就成了Rule Of Five

  1. 复制构造器
  2. 复制赋值操作符
  3. 析构器
  4. 移动构造器
  5. 移动赋值操作符

废话不多说,直接写比较成熟的方案,来自于Stack Overflow

class AClass{
int length_;
int * array;
public:
...
    friend void swap(AClass & dest, AClass& src) noexcept {
        using std::swap;
        swap(dest.length_, src.length_);
        swap(dest.array, src.array);
    }
};

核心就是这个swap方法,用到了ADL——为了满足ADL所以要写成friend,更深入的原因看这个

有了swap之后,就可以把移动构造器写成这样:

AClass::AClass(AClass&& another) noexcept : AClass() {
    swap(*this,another);
}

需要调用默认构造器来先把this给设置好,再swap。

然后把赋值构造器统一成:

AClass& operator=(AClass another){
    swap(*this,another);
    return *this;
};

所以Rule of Five就会变成Rule of Four and A Half.

这种方法对于只控制一个资源的class很有效,但是习惯上,一个class只应该控制一个资源,多个资源会带来混乱和麻烦。

vscode使用clangd(Makefile)

clangd最大的特点是需要一个json格式的compilation database,通过这个文件才能让其他的lint、智能补全之类的功能正常运作。关于如何生成“compilation_database.json”,官方有针对不同的build工具对应的文档

类似CMake这类的高级工具自然是不需要其他插件,它内置了这个功能。对于其他类型的构建工具,比如Makefile,就要借助额外的工具来生成这个文件了。

这里使用的是scan-build工具来辅助,这东西是用python来写的,所以要用pip安装:

pip install scan-build

而调用的命令的名字是intercept-build,结合make的调用方法是:

intercept-build make

其实就是在正常的make命令前面加个intercept-build就可以了。

vscode的libstdc++的debug问题

今天用linux下的vscode,通过gdb和lldb做debug,在单点调试的时候总是会在new一个对象的时候报错,表示找不到libstdc++-v3之类的文件在哪,没法debug。解决这个问题的办法之一是把/usr/lib/libstdc++.so.6的debug symbol给strip了,debug的时候就不会尝试去解析标准库了,问题就解决。

由于strip会导致很多应用崩掉,所以建议在tty下面做这个:

sudo strip /usr/lib/libstdc++.so.6

解决方案来源于stackexchange。第二种方法没有成功,不知为何。