0%

原因是很早之前按照知乎的说法启用了这个设置,本想禁用系统更新时自动安装旧版本的核显驱动,但也使得我的电脑核显驱动坏掉且不能自行安装。

恢复核显驱动首先应该关闭这项,然后去下载对应驱动安装,或者回退到旧的驱动。

这项配置启用时,我的 WSL 也无法正常进入!

常见问题

设置 apt 代理。编辑 /etc/apt/apt.conf,格式如下(ip 会变):

// 很奇怪,注释竟然是//开头,而不是#
Acquire::http::Proxy "http://192.168.1.56:12366/";
Acquire::https::Proxy "http://192.168.1.56:12366/";

sudo 没有 $http_proxy 代理的原因是默认不传递环境变量,使用 -E 选项传递环境变量就可以不设置上面的代理。

清华大学开源软件镜像站 https://mirrors.tuna.tsinghua.edu.cn/help/debian/

先用自己电脑给 apt 开代理,然后改镜像,安装一些 https 源需要的东西,然后 apt update。之后安装 build-essential mlocate 等等。

Chapter 00-11

Java 对象构造顺序:1、基类 2、所有域 3、初始化块 4、自身的构造函数

jshell> a = new Foo()
Value initialization
Initialization block
Constructor

为接口提供默认实现:

逆变、协变、不变的关系:

#include <iostream>
void print(std::ostream &os, const char *s) {
    while (*s) {
        char ch = *s++;
        // Treat "{}" as a normal substring when no arguments are left
        // if (ch == '{' && *s == '}') {
        // }
        if ((ch == '{' && *s == '{') || (ch == '}' && *s == '}')) {
            os << *s++;
        } else {
            os << ch;
        }
    }
}

template <class A, class... Ts>
void print(std::ostream &os, const char *s, A &&a, Ts &&...args) {
    while (*s) {
        char ch = *s++;
        if (ch == '{' && *s == '}') {
            os << a;
            break;
        } else if ((ch == '{' && *s == '{') || (ch == '}' && *s == '}')) {
            os << *s++;
        } else {
            os << ch;
        }
    }
    if (*s) print(os, s + 1, std::forward<Ts>(args)...);
}

int main(int argc, char **argv) {
    std::cout << std::unitbuf;
    print(std::cout, "numbers : {} {} {}\\n", 10, 5, -7);
}

上面的写法依赖了 std::ostream,而且不支持格式指定符。如果能够构造一个模板类 PrintArg 包装 1 个任意类型参数和 1 个输出说明字符串,然后重载 std::ostream<< 操作符,那么可以不用动 print 函数的逻辑。

sed -i

macOS sed 的 -i 需要指定参数,如果不需要备份文件,需要显式给出 sed -i ''。不然可以用 gsed 命令(用 brew 安装)。

xargs

如果没有收到输入,就不会运行。而 GNU 的 xargs 在没有收到输入时会只运行右侧命令而不附带参数。要想 GNU xargs 在此时不运行命令,需要使用 -r 选项。

代码展示

先在参数的位置创建一个新的对象,然后和 *this 交换。

struct MyClass {
    MyClass& operator=(MyClass other) {
        swap(*this, other);
        return *this;
    }

    friend void swap(MyClass &a, MyClass &b) noexcept; {
        using std::swap;
        swap(a.member1, b.member1);
        swap(a.member2, b.member2);
    }

    int member1;
    int member2;
};

这种实现既能够匹配 const MyClass & 的情况,又能匹配 MyClass && 的情况,而且代码行数更短。

注意点 1:必须自定义 swap 函数

使用这种写法必须提供我们自己的 swap 函数,因为 std::swap 对一般类型的实现是使用了构造的,如果不提供我们自己的 swap 函数而去直接调用 std::swap,就会无限递归!std::swap 的相关代码如下:

    void
#endif
    swap(_Tp& __a, _Tp& __b)
    _GLIBCXX_NOEXCEPT_IF(__and_<is_nothrow_move_constructible<_Tp>,
				is_nothrow_move_assignable<_Tp>>::value)
    {
#if __cplusplus < 201103L
      // concept requirements
      __glibcxx_function_requires(_SGIAssignableConcept<_Tp>)
#endif
      _Tp __tmp = _GLIBCXX_MOVE(__a);
      __a = _GLIBCXX_MOVE(__b);
      __b = _GLIBCXX_MOVE(__tmp);
    }

这个写的时间比较早了,当时有的问题现在可能已经被弥补了。

bcdedit 和 hypervisor 相关,直接关掉 hypervisor 还不能够完全关闭。一些软件仍然不能够运行。

运行 bcdedit /set hypervisorlaunchtype off(需要管理员权限)后再重启可以关掉这个功能。直接使用 bcdedit 开始查看当前的配置状况。