/favicon.jpg

嗨 👋

在任何时刻,你都可以随时起舞

VSCode升级18.6后提示“你已连接到不受Visual Studio Code支持的OS版本

发生了什么? 在VSCode最近的一次更新中,提升远程开发使用的node版本,更新后的node依赖glibc>=2.28。 在升级1.86版本后,如果尝试连接glibc 2.28以下版本的开发机,会提示连接到不受支持的OS版本。 按照官方的要求。最好的解决方案自然是升级到更新的glibc版本,这也意味着需要使用更新的系统版本。在社区的热烈讨论下,VSCode项目组最终对于旧glibc延长额外支持12个月。但新版本连接到旧glibc服务器后,仍然会有一行醒目的提示: 本文提供一种极端手动的方法(本来是给开发环境的dockerfile使用),即手动编译一份glibc和node,以专供VSCode的远端服务器使用。 开搞 1. 从编译器说起 (可选) 从文档来看,node现在已经要求到了GCC 10,我们的环境很有可能没准备。(如果你的环境已经有一份比较高版本的编译器,可以跳过这里啦) 这里准备了一份贴贴心的安装脚本,以防你真的没有更新的GCC。为了避免搞坏你的环境,它只会在/usr/local/bin下建立gcc-12和g++-12,而不会覆盖掉默认的gcc,g++命令。 # 编译一份GCC, 参考时间半个钟, 配置好的机器请自行按照CPU核心数酌情修改make -jN curl -OL "https://ftp.gnu.org/gnu/gcc/gcc-12.2.0/gcc-12.2.0.tar.gz" \ && tar -zxvf gcc-12.2.0.tar.gz \ && pushd gcc-12.2.0 \ && ./configure --prefix=/usr/local/gcc-12.2.0 \ && make -j8 \ && make install \ && ln -s /usr/local/gcc-12.2.0/bin/gcc /usr/bin/gcc-12 \ && ln -s /usr/local/gcc-12.2.0/bin/g++ /usr/bin/g++-12 \ && popd \ && rm -r gcc-12.2.0.tar.gz gcc-12.2.0 编译了以后记得把LD_LIBRARY_PATH加上: export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/usr/local/gcc-12.2.0/lib64 2. 来一份Glibc 这里我选择编译glibc 2.30,glibc需要更新一些的binutils和make,遂编译之。

红黑树基础操作

性质 每个节点要么是黑色,要么是红色 根节点是黑色 每个叶子结点(NIL)是黑色 每个红色节点的两个子节点一定都是黑色,即不能有两个红色节点相连 任意一节点到每个叶子结点的路径都包含数量相同的黑节点(俗称“黑高”) 推论:如果一个节点存在黑子节点,那么该节点肯定有两个子节点。 自平衡操作 变色:结点的颜色由红变黑或由黑变红。 左旋:以某个节点作为支点(旋转节点),其右子节点变为旋转节点的父节点,右子节点的左子节点变为旋转节点的右子节点,左子节点保持不变。 右旋:以某个节点作为支点(旋转节点),其左子节点变为旋转节点的父节点,左子节点的右子节点变为旋转节点的左子节点,右节点保持不变。 插入操作 插入节点时,节点必须为红色。 原因:红色在父节点为黑色节点时,红黑树的黑色平衡没有被破坏,不需要做自平衡操作。但如果插入节点为黑色,那么插入位置所在的子树黑色节点总是多1,必须做自平衡。 术语 插入情景 红黑树为空树:直接把插入节点作为根节点,并把插入节点设置为黑色。 插入节点的Key已经存在:更新当前节点的值为插入节点的值。 插入节点的父节点为黑色:由于插入的节点是红色的,当父节点是黑色时,并不会影响红黑树的平衡,直接插入即可,无需做自平衡。 插入节点的父节点为红色:如果插入节点的父节点为红节点,那么该父节点不可能为根节点,所以插入节点总是存在祖父节点。 叔叔节点存在并且为红节点 将P和U节点改为黑色 将PP改为红色 将PP设置为当前节点,进行后续处理(即如果PP的父节点也是红色,则继续以PP为当前节点进行插入操作自平衡处理,直到平衡为止) 叔叔节点不存在或为黑节点,并且插入节点的父亲节点是祖父节点的左子节点 新插入的节点是其父节点的左子节点(LL双红) 变色:将P设置为黑色,将PP设置为红色 对PP节点进行右旋 新插入的节点是其父节点的右子节点(LR双红) 对P进行左旋 将P设置为当前节点,得到“LL双红”的情况 按照“LL双红”的情况处理(变颜色、右旋PP) 叔叔节点不存在或为黑节点,并且插入节点的父亲节点是祖父节点的右子节点 新插入的节点是其父节点的右子节点(RR双红) 变色:将P设置为黑色,将PP设置为红色 对PP节点进行左旋 新插入的节点是其父节点的左子节点(RL双红) 对P进行右旋 将P设置为当前节点,得到“RR红色”的情况 按照“RR红色”情况处理(变颜色、左旋PP)

Github代理设置

本文记录了在Linux(含MacOS)、Windows下配置SSH、HTTP代理以加速Github的使用。 HTTP连接 HTTP可以使用HTTP代理服务器进行加速,在Github中配置: git config --global https.proxy http://127.0.0.1:1080 git config --global https.proxy https://127.0.0.1:1080 git config --global --unset http.proxy git config --global --unset https.proxy SSH连接 针对SSH方式操作的仓库,需要配置Socks5代理,在~/.ssh/config文件中加入ProxyCommand配置即可,Linux下可用: Host github.com User git ProxyCommand nc -X 5 -x 127.0.0.1:1086 %h %p Windows下可使用 Host github.com User git ProxyCommand connect -S 127.0.0.1:2801 %h %p

MongoDB基础配置手册

基于Docker的建立 创建数据库 docker run -d -p 27017:27017 —name mongo \ -e MONGO_INITDB_ROOT_USERNAME=root \ -e MONGO_INITDB_ROOT_PASSWORD=mypassword \ -e MONGO_INITDB_DATABASE=myfirstdb \ -v /my/own/datadir:/data/db \ mongo:4 在使用了MONGO_INITDB_ROOT_USERNAME与MONGO_INITDB_ROOT_PASSWORD后,容器脚本将自动创建一个具有完全权限的账号,并在启动mongod时指定—-auth开启身份验证。 创建备份 建立在Docker中的MongoDB可以使用下面的语句来建立备份: docker exec some-mongo sh -c 'exec mongodump -d <database_name> --archive' > /some/path/on/your/host/all-collections.archive 访问控制 注意:启动mongod时应使用—auth才会开启访问控制。 如果admin库中没有任何用户的话,即使在其他数据库创建用户,无论是否启用访问控制,默认的连接方式依然会具有超级权限。 客户端可以在连接时进行身份验证: mongo --port 27017 -u "username" -p "password" --authenticationDatabase "admin" 亦可在连接客户端后进行验证: mongo --port 27017 use admin db.auth("username", "password") // 输出1即认证成功 创建用户 use foo db.createUser( { user: "username", pwd: "password", roles: [{role: "readWrite", db: "foo"}, {role: "read", db: "bar"}] } ) 注意:use foo表明用户在foo库中创建,就一定要由foo库验证身份,即用户的信息跟随随数据库。如上述username虽然有bar库的读取权限,但是一定要先在foo库进行身份验证,直接访问会提示验证失败。

LXD虚拟化服务器

本文档记录了简单的LXD虚拟化方案,能够实现 在物理机上创建多个隔离的容器环境 在容器环境中运行桌面 将GPU接入容器环境中,并在多个容器间共享 快速配置 宿主机 快速初始化宿主机 # 安装对应依赖 sudo apt install lxd zfsutils-linux bridge-utils # 创建存储池 lxc storage create <storage-poll-name> zfs size=256GB # 初始化lxd lxd init # 添加存储池 lxc profile device add default root disk path=/ pool=<storage-poll-name> # 添加清华镜像 lxc remote add tuna-images https://mirrors.tuna.tsinghua.edu.cn/lxc-images/ --protocol=simplestreams --public 快速创建新容器 # 创建容器(此处对应ubuntu/18.04镜像) lxc launch tuna-images:ubuntu/18.04 <container-name> # 添加GPU(此处添加第一个GPU) lxc config device add <container-name> gpu0 gpu id=0 如果需要在容器内运行docker,需要权限 lxc config edit <container-name> 在config段中添加设置

利用vcpkg轻松安装C++库

在C++上配置各种库这件事情是不太容易的。并且在各种平台上可以有各种不同的配置方法。通常我们在使用一个C++库时都具有下面的几个步骤: 下载库源代码 编译库 将库引入到项目中 虽然只有区区几步,但是在实现这些步骤时却需要做很多事情,并且稍有不慎可能就会导致最终的结果完全错误。 基于这个问题,微软开源了跨平台的包管理工具vcpkg,它可以在Windows、Linux和MacOS上运行,只需要用一行命令就可以安装C++库并自动地引入到项目中。 在下面的例子当中我们将尝试自己动手安装一个带有各种支持的OpenCV库。 这篇文章主要针对于Windows系统,如果你需要在Linux、MacOS上配置Vcpkg,请参考这篇微软的文档: 配置Vcpkg 下载并初始化vcpkg vcpkg的整个程序托管在GitHub上,你可以在下面的链接当中把vcpkg克隆到本地或者直接下载它的压缩包解压到某个你认为正确的地方。之后vcpkg安装的各类库都会放在这个目录下。 https://github.com/Microsoft/vcpkg 我们在vcpkg的根目录(即可以看到bootstrap-vcpkg.bat文件的目录)的地址栏中直接输入powershell并按下回车,这将打开PowerShell窗口,在其中请输入下面的命令并回车初始化vcpkg: ./bootstrap-vcpkg.bat 在执行完毕后,你可以尝试键入下面的命令并回车来验证你的vcpkg已经初始化完成: ./vcpkg version 不出意外你应该可以看到一些版本信息的输出。这可以验证你的vcpkg根目录下已经生成了vcpkg.exe这一文件。请你右击这个文件查看属性,并在常规->位置这一项上复制其后的地址,在之后,我会将这个路径称为vcpkg的根目录路径。 安装集成 集成是为了让Visual Studio能够直接访问我们安装的库而不需要其他配置,请按下win+x键,然后在弹出的菜单中选择Windows PowerShell (管理员),并输入命令(请将命令中文字“根目录路径”替换为刚刚复制的vcpkg的根目录路径,注意请保留两侧的引号): cd "根目录路径" 例如我的命令看起来像这样: cd "C:\libs\vcpkg" 按下回车后,你应该可以看到命令行光标前的目录已经改变。此时,你应该关闭Visual Studio后输入下面的命令并回车: ./vcpkg integrate install 此时你已经安装好了Visual Studio的集成,在Visual Studio创建的项目VC++项目当中你可以直接引入头文件调用该库。如果你的项目是CMake项目,你可能需要将CMAKE_TOOLCHAIN_FILE设置为vcpkg根目录路径/scripts/buildsystems/vcpkg.cmake。这个提示通常在你执行上面的命令后获得的输出的最后一行出现。 安装库 此时vcpkg已经在计算机中被安装好了,请在vcpkg的根目录的地址栏中直接输入powershell并按下回车,这将再次打开PowerShell窗口(你可以注意到PowerShell窗口的标题栏上没有“管理员”字样),在其中请输入下面的命令搜索OpenCV库: ./vcpkg search opencv 可以看到得到的结果中OpenCV后有中括号,其中带有各类支持选项,例如可以选择安装contrib或cuda支持。此处我们可以按照下面的选项在vcpkg中下安装OpenCV(这不是唯一的方法): ./vcpkg install opencv[nonfree,contrib,ffmpeg]:x64-windows 注意,上面的命令中开启了三个支持开关,你可以自由地删去或增加一些。另外,我们利用冒号:描述了这个库的安装选项,即在Windows平台下使用x64进行编译,如果不特别描述,vcpkg会使用默认的x86-windows设置。在其他系统(例如Linux、MacOS)下也可以设置到对应的操作系统。这一项设置对下面在项目中使用非常重要,如果项目设置为x64平台而库的安装使用了x86平台,由于项目与库的平台不兼容,之后当项目尝试使用库时IntelliSense将不会列出这个库的头文件。 此时按下回车,vcpkg将按照OpenCV的依赖依次安装需要的库,所以不需要担心可能有任何路径上或者依赖上的问题。vcpkg会自动从待安装库的源代码仓库拉去源代码,而通常库的源代码会被托管在GitHub上,由于大陆的网络环境比较特殊,这可能带来几次在下载途中的失败,你可以尝试重新运行上面的命令,也可以为计算机配置代理。安装的过程通常需要持续数分钟到数十分钟。 在项目中引用 在OpenCV安装完成后,你可以打开某个项目或创建某个新项目,并在项目中直接使用安装好的OpenCV库,值得注意的是,如果此前安装的是x64编译选项的库,那么它仅在平台设置为x64的项目中有效,同理,如果安装的是x86选项的库则对应平台设置为x86的项目: 在编译完成后,vcpkg与Visual Studio的集成将能够把所有依赖的动态链接库文件(Dll文件)拷贝到输出的可执行文件(Exe文件)的目录下。所以你的输出目录可能如下图: 如果你只是像上面的动图一样只引用了头文件而没有写任何使用到OpenCV的代码,你的输出目录仍然可能不包括上面的这些动态链接库文件(Dll文件)。这时你可以利用下面的示例代码来输出OpenCV的版本号。 #include <iostream> #include <opencv2/opencv.hpp> int main() { std::cout << CV_VERSION << std::endl; } 此时,你已经利用vcpkg完成了对OpenCV库的安装。你可以继续尝试安装或使用其他的库。