0%

curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
distribution=$(. /etc/os-release; echo $ID$VERSION_ID)
# 如果 debian12 不支持可以改成 debian11
curl -s -L nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
sudo apt-get update
sudo apt install -y nvidia-docker2
# 必须重启 docker
sudo systemctl restart docker

注意,这个类作为(不完整)类型出现在别的模板的参数中是可以的,只有访问成员才会出错。

template <typename Target>
struct FindValue<Target, TypeList<>> {
  static inline constexpr bool ALWAYS_FALSE = sizeof(Target) == 0;
  static_assert(ALWAYS_FALSE, "Unsupported type! Check `proj::detail::DataTypeList`.");
};

https://stackoverflow.com/a/40472836/

任何类型要么是不完整类型,无法被 sizeof 评估(会报错),要么被评估为正整数(包括 void 也会被评估为 1)。用 -1 的话会有类型转换警告,所以用 0 就好了。

几种模式

模式有三种:

  1. -L 将本地端口映射到远程(将客户端请求给远程服务器)
  2. -R 将远程端口映射到本地(客户端和远程服务器请求)
  3. -D 动态代理,生成一个 socks 代理,支持 socks(4)/socks5 协议

-R 代理

服务器连不上外网的时候常用这个。见 ssh 代理转发,让服务器上外网

-D 代理

生成一个 socks 代理。如图,我创建代理之后,本地用这个代理去访问网站,实际上是远程服务器代我访问了网站。

首先是 google 上能够搜到的所有答案。

如果用 dig axfr 搜不到,说明域名服务器没开 axfr,或者子域名不在同一个 zone。简单来说,axfr 是一个允许 client 下载整个 zone 信息的协议。

如果网站允许搜索引擎爬取,则可以用 google 的网站过滤来搜索,比如 site:xx.yy

如果用 Intellisense

以文件 .vscode/c_cpp_properties.jsonconfigurationconfigurationProvider 的值来分类。

ms-vscode.cmake-tools

缺点:文件不在编译数据库中时 include 路径不正确(对新文件不友好)

configurationProviderms-vscode.cmake-toolscompileCommandsincludePath 设置是无效的。这个时候如果 compile_commands.json (编译数据库)中没有这个文件(尤其是 CMakeLists.txt 中可能尚未加入新编写的文件的情况),或者编译数据库尚未配置(需要先编译生成一次),include 路径就不正确。

[10/26/2023, 7:45:25 PM] "xxxx.cc" not found in "${workspaceFolder}/build/compile_commands.json". 'includePath' from c_cpp_properties.json in folder 'proj' will be used for this file instead.s

apt install nodejs
apt install npm
# 校内可用
npm config set registry xxx
npm install --global http-server
http-server

默认的 serve 路径是 ./public,如果找不到则使用 . 这个路径。

top -H 显示人类能阅读的大小。

进入 top 之后:

  • shift + M:按照内存排序
  • shift + P:按照 CPU 使用排序
  • shift + T:按照时间排序
  • shift + N:按照 PID 排序

其实不是一定要按 shift,只要输入大写字母即可(比如用 CapsLk)

总览

  • C++ 根据在捕获列表中标注的方式进行捕获。
  • Java 按照值捕获(而且 Java 在某些情况下还要求显式的 final 修饰符)。
  • JavaScript:见 JavaScript 捕获
    • 注意:捕获和传值是不同的!例如:JavaScript 在函数参数传递时仍然时按照值传递。
  • Python/Go 按照引用捕获,for 循环不会创造新的作用域。

JavaScript 捕获

看上去是引用捕获,但是 for 循环的 let 和 const 绑定会创造新的作用域。

function generateSquaringFunctions() {
    const funcList = [];
    const values = [1, 2, 3];
    for (var i of values) {
    //   ^^^
    // var:       [9, 9, 9]
    // let/const: [1, 4, 9]
        const square = function () {
            return i * i;
        };
        funcList.push(square);
    }
    return funcList;
}

const [square1, square2, square3] = generateSquaringFunctions();
console.log(square1(), square2(), square3());

可以参考 Javascript’s Hoisting(变量提升、函数提升、类提升)

其他测试:

首先检查 /etc/wsl.conf 配置,如果设置了不追加 Windows 的 PATH,则需要自己额外添加 VS Code 的命令目录到 WSL 中。

# /etc/wsl.conf
[boot]
systemd=true

[interop]
appendWindowsPath=false
# ~/.bashrc 或者其他配置文件
export PATH="/mnt/c/Users/xxx/AppData/Local/Programs/Microsoft VS Code/bin:$PATH"

如果报错:

/mnt/c/Users/xxx/AppData/Local/Programs/Microsoft VS Code/bin/code: 61: /mnt/c/Users/xxx/AppData/Local/Programs/Microsoft VS Code/Code.exe: Exec format error

{...a, ...b} 相当于 Object.assign({}, a, b)Object.assign 还能给已经存在的对象赋值,而且会触发 setter。Spread operator 是在创建对象,不会触发 setter。

[...a, ...b] 相当于 a.concat(b)

Spread operator 的结果是浅拷贝,如果要深拷贝可以用 structuredClone。它能作用于数组字面量却不能作用于对象字面量,必须通过一个额外的变量来完成。(毕竟支持字面量的 spread 没有意义。)

一个非原生数组的对象想要在数组中展开,必须实现 Iterable 接口。