diff --git a/basic/02-searching-and-question.md b/basic/02-searching-and-question.md index efeede2..e313ca7 100644 --- a/basic/02-searching-and-question.md +++ b/basic/02-searching-and-question.md @@ -96,7 +96,7 @@ 一般而言,你可以在相应技术的官网上找到官方文档的入口。比如 Python 的官方文档就可以在 [Python 官网](https://www.python.org/) 上找到。 -除此之外,很多 Linux 命令行工具带有丰富的 mandoc 文档,可以通过 man 命令查看。man 也含有关于 Linux 系统调用,POSIX 规范和其他杂项手册。比如输入`man signal.7`可以看到 Unix 信号的介绍,输入`man signal.2`可以看到`signal()`系统调用的相关信息,而输入`man signal.3`可以看到 POSIX 规范中`signal()`这个 API 的定义和用法。 +除此之外,很多 Linux 命令行工具带有丰富的 mandoc 文档,可以通过 man 命令查看。man 也含有关于 Linux 系统调用,POSIX 规范和其他杂项手册。比如输入 `man signal.7` 可以看到 Unix 信号的介绍,输入 `man signal.2` 可以看到 `signal()` 系统调用的相关信息,而输入 `man signal.3` 可以看到 POSIX 规范中 `signal()` 这个 API 的定义和用法。 ::: tip 小贴士! man 的用法可以通过 man man 查阅。你可能会疑惑,在刚刚的例子中,最后的点后面的数字是什么意思,在读完 man 的用法之后相信你就明白了! diff --git a/basic/03-computer-basic-knowledge-1.md b/basic/03-computer-basic-knowledge-1.md index e258304..35aff0d 100644 --- a/basic/03-computer-basic-knowledge-1.md +++ b/basic/03-computer-basic-knowledge-1.md @@ -243,7 +243,7 @@ Windows 有一个臭名昭著的“功能”————蓝屏死机,Blue Scre #### 其他操作系统 -- MacOS: 苹果专用,符合 POSIX 标准的 Unix 系统,老版本可在 Intel 机器安装(需要魔法),内核叫 Darwin,修改自 BSD 系内核,内核部分开源 +- macOS: 苹果专用,符合 POSIX 标准的 Unix 系统,老版本可在 Intel 机器安装(需要魔法),内核叫 Darwin,修改自 BSD 系内核,内核部分开源 - FreeBSD: 符合 POSIX 标准的类 Unix 系统,和 Linux 只是内核不同,FreeBSD 带有完整的用户态程序,同时其采用更宽松的许可协议,而不是 Linux 的 GPLv2。 - MSDOS: 古老的操作系统,无图形界面,已不使用,微软近期开源了几个版本的 DOS。FreeDOS 则是由其他志愿者实现的开源版本替代。 @@ -344,12 +344,12 @@ TCP 是在 IP 之上的协议,利用 IP 协议提供的不可靠数据传输 ::: ::: info 提示 -指定端口号的地址,IPv4 可以写作 127.0.0.1:8080 这种形式,IPv6 可以写成[::1]:8080 的形式。 +指定端口号的地址,IPv4 可以写作 127.0.0.1:8080 这种形式,IPv6 可以写成 [::1]:8080 的形式。 ::: ### DNS 协议 -DNS(Domain Name System)协议是用于解析域名信息的协议。我们在日常上网的过程中,由于 IP 地址过于抽象难记,经常会使用类似于`pku.edu.cn`这样的域名,DNS 就是将域名转化为 IP 地址的服务。DNS 服务从点分隔的域名的最后一部分开始查找,整个查找过程先向系统预设的 DNS 服务器查找最后一部分`cn`,返回`cn`域名的服务器,然后向`cn`域名的服务器继续询问`edu`,直到整个域名解析完成,得到最终的 IP 地址。实际情况下,有时候 DNS 服务器会直接返回下一级域名服务器作为结果,也有时候会代替你继续查询,直接返回给你最终的结果。 +DNS(Domain Name System)协议是用于解析域名信息的协议。我们在日常上网的过程中,由于 IP 地址过于抽象难记,经常会使用类似于 `pku.edu.cn` 这样的域名,DNS 就是将域名转化为 IP 地址的服务。DNS 服务从点分隔的域名的最后一部分开始查找,整个查找过程先向系统预设的 DNS 服务器查找最后一部分 `cn`,返回 `cn` 域名的服务器,然后向 `cn` 域名的服务器继续询问 `edu`,直到整个域名解析完成,得到最终的 IP 地址。实际情况下,有时候 DNS 服务器会直接返回下一级域名服务器作为结果,也有时候会代替你继续查询,直接返回给你最终的结果。 ::: info 提示 以前国内的网络运营商默认提供的 DNS 有时会遭到污染,进行植入广告等操作,这时候你可以自行更换 DNS 地址,你可以在互联网上查询到关于如何更换以及更换为哪些声誉较好的 DNS 服务的信息。 diff --git a/basic/05-drive-your-computer-1.md b/basic/05-drive-your-computer-1.md index 9fd6660..09bf23f 100644 --- a/basic/05-drive-your-computer-1.md +++ b/basic/05-drive-your-computer-1.md @@ -15,14 +15,14 @@ 通过本文以及接下来的文章,你将接触一些好用的软件,知晓文件到底是什么,熟悉工作环境的安装配置;进而学会高效管理文件,运用版本控制工具,分析解决常见的故障;寻找自己所需的各类资源,并在此过程中规避常见的网络攻击。希望大家通过掌握这些技能,可以如意地使用电脑,让它成为自己的左膀右臂。 ::: info -本文的完成感谢[leavelet](https://github.com/leavelet)和[李尚泽](https://github.com/LSZ2005)的帮助。 +本文的完成感谢 [leavelet](https://github.com/leavelet) 和[李尚泽](https://github.com/LSZ2005)的帮助。 ::: # 1. 基本环境配置 近些年,基本的编程技能成为各个大学的必修课。在繁多的编程语言中,C、C++、Python 这三门语言是北京大学的基础编程课中涉及较多的三门。然而,对初学者而言,如何让代码“跑起来”是一道不小的难题——写下第一个"Hello World",却花费数个小时查阅资料、配好环境、让它运行,确实是一件较费心力的事。因此,我们希望提供一套简单易操作的流程,帮助大家配置好用、舒心的编程环境。 -我们在此假设 Linux 使用者已经有相关基础,因此主要提供 Windows 与 MacOS 的配置流程。在后续的文档中,我们将为 Linux 系统的使用作更加详尽的介绍。 +我们在此假设 Linux 使用者已经有相关基础,因此主要提供 Windows 与 macOS 的配置流程。在后续的文档中,我们将为 Linux 系统的使用作更加详尽的介绍。 ## 1.0 程序编写的过程 @@ -34,11 +34,11 @@ python 等**解释型**语言,只有解释器。 ::: -读者要尤其注意“编辑”与“编译”的区别,“编辑”是我们常说的“敲代码”的过程,而“编译”是编译器将代码**翻译**成计算机能理解的二进制 01101010……(也就是常说的可执行文件,如 Windows 中的`.exe`文件)的过程,“编辑”发生在“编译”之前的。理解这两个概念对于“编程”是至关重要的。 +读者要尤其注意“编辑”与“编译”的区别,“编辑”是我们常说的“敲代码”的过程,而“编译”是编译器将代码**翻译**成计算机能理解的二进制 01101010……(也就是常说的可执行文件,如 Windows 中的 `.exe` 文件)的过程,“编辑”发生在“编译”之前的。理解这两个概念对于“编程”是至关重要的。 ## 1.1 C++环境配置——与课程评测系统保持一致 -在这部分中,我们希望尽量帮助大家获得与北京大学目前的 C++课程在线测评、考试系统所用的环境一致的编程环境,方便大家适应学校的教学。 +在这部分中,我们希望尽量帮助大家获得与北京大学目前的 C++ 课程在线测评、考试系统所用的环境一致的编程环境,方便大家适应学校的教学。 ### 1.1.1 一些前置问题 @@ -46,7 +46,7 @@ python 等**解释型**语言,只有解释器。 GCC(GNU Compiler Collection)是一类编译器集合。其中,gcc/g++分别是 GCC 下的 C/C++编译器。GCC 目前是 Linux 中最常用的编译器,也是大多数开源项目的首选编译器。 -MinGW 是一种编译器系统,建立在 GCC 和 binutils 项目上。MinGW 提供了一套简单方便的Windows下的基于 GCC 程序开发环境,是一套 GNU 工具集合。 +MinGW 是一种编译器系统,建立在 GCC 和 binutils 项目上。MinGW 提供了一套简单方便的 Windows 下的基于 GCC 程序开发环境,是一套 GNU 工具集合。 #### 什么是 Clang/LLVM? @@ -60,10 +60,10 @@ MSVC(Microsoft Visual C/C++)是微软开发的一套 Windows 下的 C/C++编 根据实际测试,学校相关课程的自动测评中使用 GCC 编译器,且默认使用 C++17 标准。学校机房内 IDE 环境提供的是 Visual Studio,部分机房也提供 VS Code,但是可能需要自行配置。因此,我们推荐使用 GCC 编译器,并且在编译时指定 C++17 标准,同时注意一些关于 Visual Studio 的特例。 -由于不同编译器的实现略有区别,且头文件不同(例如 GCC 下部分函数须引用 algorithm 头文件,而 MSVC 下无需),因此,本文档推荐在 Windows 下使用 MinGW,在 MacOS 下使用 brew 来配置 GCC 编译环境。 +由于不同编译器的实现略有区别,且头文件不同(例如 GCC 下部分函数须引用 algorithm 头文件,而 MSVC 下无需),因此,本文档推荐在 Windows 下使用 MinGW,在 macOS 下使用 brew 来配置 GCC 编译环境。 ::: warning 注意 -可能有同学知道 GCC 中有头文件 ,但是我们不推荐使用。这样做会引入所有的标准库,增加编译时间,降低编译效率。且 MSVC 并不含有此头文件,这样做会使得代码不可移植,因此这个头文件只适合做题时使用。**但是你上大学又不是来做题的**。 +可能有同学知道 GCC 中有头文件 ``,但是我们不推荐使用。这样做会引入所有的标准库,增加编译时间,降低编译效率。且 MSVC 并不含有此头文件,这样做会使得代码不可移植,因此这个头文件只适合做题时使用。**但是你上大学又不是来做题的**。 :::

@@ -89,19 +89,19 @@ MSVC(Microsoft Visual C/C++)是微软开发的一套 Windows 下的 C/C++编 #### 什么是环境变量?Path 是什么? -环境变量是包含关于系统及当前登录用户的**环境信息**的字符串,一些软件程序使用此信息确定在何处放置、使用文件。环境变量的产生可以这样理解。如果你新写了一个程序,需要放到陌生的环境运行。这时候,就需要从系统获取一些和当前环境有关的信息,这就是环境变量。Windows 终端也是这样一个程序,如果在终端中输入`cmd`,这并非完整路径,终端需要负责找到实际的程序位置,那么终端又怎么知道去哪些地方寻找呢?它会读取`Path`这个环境变量,从`Path`指示的路径中寻找。如果`Path`中有一条是 C:\Windows\System32\,终端就会从中找到 cmd.exe,于是实际执行了 C:\Windows\System32\cmd.exe。 +环境变量是包含关于系统及当前登录用户的**环境信息**的字符串,一些软件程序使用此信息确定在何处放置、使用文件。环境变量的产生可以这样理解。如果你新写了一个程序,需要放到陌生的环境运行。这时候,就需要从系统获取一些和当前环境有关的信息,这就是环境变量。Windows 终端也是这样一个程序,如果在终端中输入 `cmd`,这并非完整路径,终端需要负责找到实际的程序位置,那么终端又怎么知道去哪些地方寻找呢?它会读取 `Path` 这个环境变量,从 `Path` 指示的路径中寻找。如果 `Path` 中有一条是 `C:\Windows\System32\`,终端就会从中找到 `cmd.exe`,于是实际执行了 `C:\Windows\System32\cmd.exe`。 #### 如何下载安装 VS Code? -请前往这个网址——[Visual Studio Code](https://code.visualstudio.com/),下载对应系统的安装文件并安装到所需目录。 +请前往这个网址—— [Visual Studio Code](https://code.visualstudio.com/),下载对应系统的安装文件并安装到所需目录。 #### 如何获取合适版本的 MinGW,并添加到环境变量? 1. 前往[谷雨同学的预编译 MinGW 下载](https://gytx.lanzoui.com/b01bpa41i)(提取码 cgzy),下载`gytx_x86_64-14.1.0-win32-seh-ucrt.7z`文件。这是基于 GCC 14.1.0 的 MinGW64 预编译二进制,GCC 默认标准为 C++17),解压到某个目录(这里以 C:\mingw64_14.1.0 为例)。 -2. 点击任务栏的 Windows 徽标,搜索“环境变量”,找到“编辑系统环境变量”,点击进入,找到界面右下角的“环境变量(N)..."按钮,进入后,在**系统变量**栏找到**Path**,双击后,点击"新建(N)",键入引号**里面**的内容: "C:\mingw64_14.1.0\bin" , 然后依次对三个窗口点击确定。 +2. 点击任务栏的 Windows 徽标,搜索“环境变量”,找到“编辑系统环境变量”,点击进入,找到界面右下角的“环境变量(N)..."按钮,进入后,在系统变量栏找到 Path,双击后,点击"新建(N)",键入引号**里面**的内容: "C:\mingw64_14.1.0\bin" , 然后依次对三个窗口点击确定。 -(请确定"C:\mingw64_14.1.0\bin"是真实存在的路径,其中包括`g++.exe`,如果不是,请根据实际情况修改) +(请确定 `C:\mingw64_14.1.0\bin` 是真实存在的路径,其中包括 `g++.exe`,如果不是,请根据实际情况修改) #### 如何在 VS Code 中安装合适的插件? @@ -115,28 +115,28 @@ MSVC(Microsoft Visual C/C++)是微软开发的一套 Windows 下的 C/C++编 #### VS Code 的工作逻辑是什么? -`vscode`分为全局和工作区两部分组成,结构如下图所示。每次打开`vscode`都会新建一个窗口,叫做“工作区”。工作区中包含一个或多个文件夹,可以拥有与全局不同的设置。 +`vscode` 分为全局和工作区两部分组成,结构如下图所示。每次打开 `vscode` 都会新建一个窗口,叫做“工作区”。工作区中包含一个或多个文件夹,可以拥有与全局不同的设置。 -如果工作区只有一个文件夹,配置会被放在该文件夹下`.vscode`文件夹中。如果有多文件夹,工作区配置会用一个`code-workspace`结尾的文件保存。 +如果工作区只有一个文件夹,配置会被放在该文件夹下 `.vscode` 文件夹中。如果有多文件夹,工作区配置会用一个 `code-workspace` 结尾的文件保存。 ![workspace](/assets/basic/05-drive-your-computer-1/workspace.png) #### VS Code 如何打开文件夹、将工作设置保存到工作区便于取用? 1. 点击左侧边栏第一个按钮,点击打开文件夹,浏览到所需位置并打开。 -2. 点击界面上方的“文件”按钮,找到“另存为工作区”,选择一个位置来保存工作区设置。 -3. 点击界面上方的“文件”按钮,点击“从文件打开工作区”,浏览到刚才保存的文件,打开它。 -4. 如果想在这个工作区添加不同文件夹,如"C++""Python"来便于管理作业,请点击界面上方的“文件”按钮,点击”将文件夹添加到工作区“。 +2. 点击界面上方的 “文件” 按钮,找到 “另存为工作区”,选择一个位置来保存工作区设置。 +3. 点击界面上方的 “文件” 按钮,点击 “从文件打开工作区”,浏览到刚才保存的文件,打开它。 +4. 如果想在这个工作区添加不同文件夹,如 "C++" "Python" 来便于管理作业,请点击界面上方的 “文件” 按钮,点击 “将文件夹添加到工作区”。 5. 以后每次打开 VS Code 后,请从刚才保存的文件打开工作区。这个文件会保存各类设置,包括下文提到的内容。 -#### VS Code 中的 C/C++ Configuration UI 配置指南:设定编译器路径、默认语法检查 C++标准 +#### VS Code 中的 C/C++ Configuration UI 配置指南:设定编译器路径、默认语法检查 C++ 标准 设定好前文所述的环境后,我们还需要调整 C/C++插件的编译器路径和语法检查标准,与我们使用的 gcc 相匹配。这样,不会出现引用头文件却报错的情况。 -1. 请在 VS Code 界面最上方搜索栏键入 ">C/C++",找到"C/C++编辑配置(UI)"。 -2. 找到想要用来写 C++程序的文件夹,点击它。 +1. 请在 VS Code 界面最上方搜索栏键入 ">C/C++",找到 "C/C++编辑配置(UI)"。 +2. 找到想要用来写 C++ 程序的文件夹,点击它。 3. 找到编译器路径,点击下拉按钮,应该会自动检测到如下路径:"C:/mingw64_14.1.0/bin/g++.exe",选择它。否则,请你复制此路径,粘贴到框内。 -4. 下拉,找到 C 标准和 C++标准,**选择你的课程使用的在线测评网站使用的标准**。例如,两者分别选择 c17 和 c++17。 +4. 下拉,找到 C 标准和 C++ 标准,**选择你的课程使用的在线测评网站使用的标准**。例如,两者分别选择 c17 和 c++17。 5. 在**刚才所选的文件夹**内创建".cpp"后缀的文件,编写你的 C++程序。你会发现语法检查、include 路径检查都使用了相应环境。 ![UI](/assets/basic/05-drive-your-computer-1/UI.png) @@ -145,28 +145,28 @@ MSVC(Microsoft Visual C/C++)是微软开发的一套 Windows 下的 C/C++编 在 VS Code 编写完程序后,我们可以按如下步骤运行程序。 -1. 使用组合键"Ctrl+`"打开终端(有些时候是"Ctrl+Shift+`")。这里使用 PowerShell。 +1. 使用组合键 Ctrl+\` 打开终端(有些时候是 Ctrl+Shift+\`)。这里使用 PowerShell。 2. cd 到程序所在子目录(请自行查找 cd 命令用法) -3. 使用 g++命令编译程序。如:`g++ .\test.cpp`(寻找文件时可以用 Tab 快捷键)。 -4. 上述命令默认生成"a.exe".请输入命令`.\a.exe`执行生成的 exe 文件。 +3. 使用 g++ 命令编译程序。如:`g++ .\test.cpp`(寻找文件时可以用 Tab 快捷键)。 +4. 上述命令默认生成 "a.exe"。请输入命令 `.\a.exe` 执行生成的 exe 文件。 效果如下图所示: ![Run](/assets/basic/05-drive-your-computer-1/Run.png) -### 1.1.3 MacOS 环境配置——以 M 系列芯片为例 +### 1.1.3 macOS 环境配置——以 M 系列芯片为例 -MacOS 的基本配置与上述流程类似,区别在于 GCC 的安装方法。我们推荐 MacOS 用户使用 brew 来做环境管理。 +macOS 的基本配置与上述流程类似,区别在于 GCC 的安装方法。我们推荐 macOS 用户使用 brew 来做环境管理。 #### 什么是 brew? -brew 全称 Homebrew,是 MacOS 上一个免费的开源软件包管理器。它简化了 MacOS 用户安装软件的过程。 +brew 全称 Homebrew,是 macOS 上一个免费的开源软件包管理器。它简化了 macOS 用户安装软件的过程。 #### 安装 brew 打开终端,执行如下命令。这里我们使用清华大学镜像站的 brew 源。 -```plain +```shell export HOMEBREW_BREW_GIT_REMOTE="https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/brew.git" export HOMEBREW_CORE_GIT_REMOTE="https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/homebrew-core.git" export HOMEBREW_INSTALL_FROM_API=1 @@ -181,27 +181,27 @@ git clone --depth=1 https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/install.gi rm -rf brew-install ``` -这里如果执行`git`时,提示需要安装`Xcode Command Line Tools`,请按照提示安装。 +这里如果执行 `git` 时,提示需要安装 `Xcode Command Line Tools`,请按照提示安装。 ::: info 特别提示 -M1 及以后芯片的 MacBook 上,brew 安装目录是`/opt/Homebrew`,在后续的环境配置中需要用到。 +M1 及以后芯片的 MacBook 上,brew 安装目录是 `/opt/Homebrew`,在后续的环境配置中需要用到。 ::: -安装完成后**重启终端**,通过在终端输入`brew -v`,可以查看 homebrew 版本。如果正确输出版本信息,表示成功安装。实际使用时,使用 brew 指令即可。 +安装完成后**重启终端**,通过在终端输入 `brew -v`,可以查看 homebrew 版本。如果正确输出版本信息,表示成功安装。实际使用时,使用 brew 指令即可。 -推荐参考[基本开发环境配置(终端与 brew)](https://macguide.leavelet.io/Advanced/developmentEnvFromScratch.html),完整配置 MacOS 的开发环境。 +推荐参考[基本开发环境配置(终端与 brew)](https://macguide.leavelet.io/Advanced/developmentEnvFromScratch.html),完整配置 macOS 的开发环境。 #### brew 的基本使用以及 GCC 的安装方法 - **查看 brew 版本**:`brew -v` - **查看 brew 已安装的包列表**: `brew list` - **查看某个包的信息**:`brew info`。如查看`xz`的信息:`brew info xz` -- **安装包**:`brew install`。如`brew install python3` +- **安装包**:`brew install`。如 `brew install python3` - **更新包**:`brew upgrade`。使用方法同上。 -- **卸载包**:``brew uninstall`。使用方法同上 -- **更新 brew**:`brew update` +- **卸载包**:`brew uninstall`。使用方法同上 +- **更新 brew**:`brew update`。 -安装 GCC 时,使用`brew install gcc`即可。安装程序会自动进行,在电脑上安装适配的最新版本。等待安装完成后,键入`brew info gcc`查看是否安装完成。例如,在笔者的电脑上,显示如下结果: +安装 GCC 时,使用 `brew install gcc` 即可。安装程序会自动进行,在电脑上安装适配的最新版本。等待安装完成后,键入 `brew info gcc` 查看是否安装完成。例如,在笔者的电脑上,显示如下结果: ![gccinfo](/assets/basic/05-drive-your-computer-1/gccinfo.png) @@ -216,34 +216,32 @@ Installed /opt/homebrew/Cellar/gcc/14.1.0 (1,560 files, 422.7MB) * ``` -`/opt/homebrew/Cellar/gcc/14.1.0`就是安装路径。我们在后面添加`/bin/g++-14`,最终得到: - -`/opt/homebrew/Cellar/gcc/14.1.0/bin/g++-14`,这就是需要填入“编译器路径”栏的值。 +`/opt/homebrew/Cellar/gcc/14.1.0` 就是安装路径。我们在后面添加 `/bin/g++-14`,最终得到:`/opt/homebrew/Cellar/gcc/14.1.0/bin/g++-14`,这就是需要填入 “编译器路径” 栏的值。 -不同使用者的具体情况有别。请根据自己的`brew info gcc`显示的路径来调整。 +不同使用者的具体情况有别。请根据自己的 `brew info gcc` 显示的路径来调整。 -然后,再设置需要的 C/C++语法检查标准即可。 +然后,再设置需要的 C/C++ 语法检查标准即可。 ::: info 提示 -与 Windows 不同,这里的 g++-14 就是 MacOS 上 g++编译器的**可执行文件**,它没有`.exe`后缀,且命名不同。 +与 Windows 不同,这里的 g++-14 就是 macOS 上 g++编译器的**可执行文件**,它没有 `.exe` 后缀,且命名不同。 ::: -#### 在 MacOS 上运行 C++程序 +#### 在 macOS 上运行 C++ 程序 这一部分大体上也与 Windows 类似:直接在 VS Code 打开终端,编译,然后执行。区别在于: -- g++编译器产生的可执行文件以`.out`结尾,例如`a.out`。 +- g++编译器产生的可执行文件以 `.out` 结尾,例如 `a.out`。 -- Mac 上不要直接使用`g++`命令。 +- macOS 上不要直接使用 `g++` 命令。 ::: warning 注意 -请特别注意**第二点**,这是因为,MacOS 上的 Apple Clang 编译器在环境中注册了`g++/gcc`这两个命令。实际上,它们都指向 Apple Clang 编译器,与`clang`命令**完全一致**。因此,如果直接输入`g++`,实际调用的是 Apple Clang 来编译,而不是我们安装的 GCC。 +请特别注意**第二点**,这是因为,MacOS 上的 Apple Clang 编译器在环境中注册了 `g++/gcc` 这两个命令。实际上,它们都指向 Apple Clang 编译器,与 `clang` 命令**完全一致**。因此,如果直接输入 `g++`,实际调用的是 Apple Clang 来编译,而不是我们安装的 GCC。 ::: **解决方法有如下几种**: - 每次使用 g++-14 命令来编译程序。 -- 在终端配置文件中,添加:`alias g++='g++-14'`和`alias gcc='gcc-14'`来永久替换`g++`和`gcc`命令。这一步所述的配置文件将在后文[终端环境配置](#TerminalEnvironmentConfiguration)中提及。 +- 在终端配置文件中,添加:`alias g++='g++-14'` 和 `alias gcc='gcc-14'` 来永久替换 `g++` 和 `gcc` 命令。这一步所述的配置文件将在后文[终端环境配置](#TerminalEnvironmentConfiguration)中提及。 ## 1.2 Python 环境配置 @@ -255,19 +253,19 @@ Conda 是在 Windows、macOS 和 Linux 上运行的开源软件包管理系统 使用 Conda 配置 Python 环境,有一个**巨大的好处**:它可以同时存储各个不同版本的 Python,每个版本具有独立的包和库;使用时,可以用命令很方便地切换要使用的版本(这使用虚拟环境来实现)。 -在教学、工作中,我们常常会用到不同版本的 Python,每门课程用到的包的版本也不同。因此,为了避免不同版本的 Python 和它们安装的包相互混淆、干扰,我们推荐使用`Conda`来做管理。 +在教学、工作中,我们常常会用到不同版本的 Python,每门课程用到的包的版本也不同。因此,为了避免不同版本的 Python 和它们安装的包相互混淆、干扰,我们推荐使用 `Conda` 来做管理。 -我们对于所有系统,都推荐 Miniforge,这是一个精简版的 Conda,不含 Anaconda 的一些不必要的包,体积更小,更适合个人使用,而且其中的`mamba`命令速度极快。 +我们对于所有系统,都推荐 Miniforge,这是一个精简版的 Conda,不含 Anaconda 的一些不必要的包,体积更小,更适合个人使用,而且其中的 `mamba` 命令速度极快。 具体安装方式如下: -先访问[miniforge 网页](https://github.com/conda-forge/miniforge),下载所需的安装包。这里以 Windows 为例,下载`Miniforge3-Windows-x86_64.exe`。 +先访问 [miniforge 网页](https://github.com/conda-forge/miniforge),下载所需的安装包。这里以 Windows 为例,下载`Miniforge3-Windows-x86_64.exe`。 -然后双击安装包,按照提示安装即可。安装完成后,打开终端,输入`conda -V`,如果显示版本号,表示安装成功。 +然后双击安装包,按照提示安装即可。安装完成后,打开终端,输入 `conda -V`,如果显示版本号,表示安装成功。 #### Conda 的基本使用 -使用前先换源,保证网络连接性。在`~/.condarc`文件中添加如下内容即可。这里的`~`表示用户目录,Windows 上是`C:\Users\用户名`,macOS 上是`/Users/用户名`。注意,Windows 先执行 `conda config --set show_channel_urls yes`生成`.condarc`文件,然后再修改会比较方便。 +使用前先换源,保证网络连接性。在 `~/.condarc` 文件中添加如下内容即可。这里的 `~` 表示用户目录,Windows 上是 `C:\Users\用户名`,macOS 上是 `/Users/用户名`。注意,Windows 先执行 `conda config --set show_channel_urls yes` 生成 `.condarc` 文件,然后再修改会比较方便。 ```plain channels: @@ -284,33 +282,33 @@ custom_channels: 使用时,有下面几个常用命令: -(`mamba`是`conda`的加速版,速度更快,也可以直接使用 `conda` 命令,效果相同) +(`mamba` 是 `conda` 的加速版,速度更快,也可以直接使用 `conda` 命令,效果相同) - `mamba env list`:查看已安装环境。刚安装好 Conda 时,会显示`base`这个环境。 - `mamba list`:查看当前环境下安装的所有包的名称。 - `mamba -V`:查看 Conda 的版本号。 -- `mamba create`:创建环境。参数`-n`指定环境名称,参数`python=`指定 python 版本。此处推荐安装好环境后再安装它的包,不要在这里指定。例如:`mamba create -n AIHomework python=3.10.11`,创建了一个名为 AIHomework 的环境,它的 python 版本是 3.10.11。 -- `mamba activate`:激活环境。例如,`mamba activate test`会在当前终端激活 test 这个环境,激活成功后会有如下显示: +- `mamba create`:创建环境。参数 `-n` 指定环境名称,参数 `python=` 指定 python 版本。此处推荐安装好环境后再安装它的包,不要在这里指定。例如:`mamba create -n AIHomework python=3.10.11`,创建了一个名为 AIHomework 的环境,它的 python 版本是 3.10.11。 +- `mamba activate`:激活环境。例如,`mamba activate test` 会在当前终端激活 test 这个环境,激活成功后会有如下显示: ![activate](/assets/basic/05-drive-your-computer-1/activate.png) ::: info 提示 -windows 下安装`conda`后第一次使用虚拟环境时,要先输入`mamba init`。弹出授权窗口,选是,然后**关闭终端重新打开**。 +Windows 下安装 `conda` 后第一次使用虚拟环境时,要先输入 `mamba init`。弹出授权窗口,选是,然后**关闭终端重新打开**。 ::: -- `mamba deactivate`:退出虚拟环境。如`conda deactivate test`,会**完全退出**conda,此后终端使用系统环境。直接输入`conda deactivate`会切换到`base`环境。 +- `mamba deactivate`:退出虚拟环境。如 `conda deactivate test`,会**完全退出**conda,此后终端使用系统环境。直接输入 `conda deactivate` 会切换到 `base` 环境。 #### 虚拟环境内包的安装 我们推荐先进行换源,保证网络的连接性,执行以下命令,可使用北京大学镜像站。 -```plain +```sh pip config set global.index-url https://mirrors.pku.edu.cn/pypi/web/simple ``` 以下是 pip 的常用命令,可以按需安装包: -- `pip show`:查看包的具体信息。例如`pip show pip`。 +- `pip show`:查看包的具体信息。例如 `pip show pip`。 - `pip list`:查看已经安装的包。 - `pip install`:安装指定的包。后面要接包名。 @@ -324,46 +322,46 @@ pip config set global.index-url https://mirrors.pku.edu.cn/pypi/web/simple ## 1.3 终端环境配置 -在上面提到的步骤中,**终端(Terminal)**始终贯穿全文。终端,就是一种提供各类 Shell 访问的应用程序。在这个部分中,我们来了解一下怎么配置合适的终端环境,以便我们通过命令行的方式来操控电脑。 +在上面提到的步骤中,**终端(Terminal)** 始终贯穿全文。终端,就是一种提供各类 Shell 访问的应用程序。在这个部分中,我们来了解一下怎么配置合适的终端环境,以便我们通过命令行的方式来操控电脑。 ### 1.3.1 Windows 终端配置 -在 Windows 平台上,我们极力推荐使用**PowerShell**。这是近几年新兴的一种命令行工具,由微软基于`.NET`开发,与系统连接紧密,功能极其强大,且命令语言符合直觉。 +在 Windows 平台上,我们极力推荐使用 **PowerShell**。这是近几年新兴的一种命令行工具,由微软基于 `.NET` 开发,与系统连接紧密,功能极其强大,且命令语言符合直觉。 #### 更改脚本执行策略 -要定制 PowerShell,第一步就是更改脚本执行策略。在 Windows11 中,微软为了增强系统的安全性,默认禁止了一切脚本的执行(也就是通过一份文件来批量运行命令)。然而,不巧的是,微软甚至把**终端配置文件**也算在了脚本之中,因此在默认条件下,我们对终端配置文件作的任何修改都是无效的。所以,配置终端环境的第一步就是更改脚本执行策略。 +要定制 PowerShell,第一步就是更改脚本执行策略。在 Windows 11 中,微软为了增强系统的安全性,默认禁止了一切脚本的执行(也就是通过一份文件来批量运行命令)。然而,不巧的是,微软甚至把**终端配置文件**也算在了脚本之中,因此在默认条件下,我们对终端配置文件作的任何修改都是无效的。所以,配置终端环境的第一步就是更改脚本执行策略。 -请在 VS Code 中打开终端,或者按`Win+R`输入 powershell 回车。打开终端后,输入如下命令: +请在 VS Code 中打开终端,或者按 `Win+R` 输入 powershell 回车。打开终端后,输入如下命令: ```plain Set-ExecutionPolicy PolicyYouWant ``` -这里的`PolicyYouWant`有如下几种选择: +这里的 `PolicyYouWant` 有如下几种选择: - `Allsigned`。这个策略要求所有脚本具有可信的签名,安全性很高。 - `Bypass`。这个策略默认允许所有脚本执行。没有安全性。而且执行时没有任何警告。 - `Remotesigned`。这个策略要求从 Internet 下载的脚本和配置文件具有受信任的签名。安全性适中。 - `Restricted`。这个策略只允许单个命令执行,禁止脚本。安全性极高。 - `Unrestricted`。允许未签名脚本执行。安全性很低。 -- `Default`。根据设置,采取`Remotesigned`和`Restricted`之一。 +- `Default`。根据设置,采取 `Remotesigned` 和 `Restricted` 之一。 -为了**兼顾安全性和易用性**,我们建议使用`Remotesigned`策略。 +为了**兼顾安全性和易用性**,我们建议使用 `Remotesigned` 策略。 #### 更改终端配置文件和美化终端 -我们可以在 powershell 中输入`start $PROFILE`来打开配置文件进行编辑。 +我们可以在 powershell 中输入 `start $PROFILE` 来打开配置文件进行编辑。 ::: warning 注意 -使用`code $PROFILE`从 VS Code 打开配置文件可能会出现问题,表现为显示未保存的空文件。此时如果保存,那么配置文件会变为空文件。 +使用 `code $PROFILE` 从 VS Code 打开配置文件可能会出现问题,表现为显示未保存的空文件。此时如果保存,那么配置文件会变为空文件。 ::: 具体的配置和美化过程较复杂,且需求因人而异。读者可以在网上查找相关资料来定制自己的终端。例如,可以查阅如下网站:https://zhuanlan.zhihu.com/p/352882990 -### 1.3.2 MacOS 终端配置与美化 +### 1.3.2 macOS 终端配置与美化 -MacOS 终端提供了几种不同的 shell,比如 bash 和 zsh。修改这些 shell 的配置文件时,无需像 Windows 一样更改脚本执行策略。如果要修改 zsh 的配置文件,可以用文本编辑器打开它。例如,用 VS Code 打开:在 VS Code 内,按 Ctrl+`打开终端,然后输入`code ~/.zshrc` 。 +macOS 终端提供了几种不同的 shell,比如 bash 和 zsh。修改这些 shell 的配置文件时,无需像 Windows 一样更改脚本执行策略。如果要修改 zsh 的配置文件,可以用文本编辑器打开它。例如,用 VS Code 打开:在 VS Code 内,按 Ctrl+\` 打开终端,然后输入 `code ~/.zshrc`。 ::: warning 注意 没有打开 VS Code 的情况下,直接在系统终端输入如上命令可能发生同样的情况(显示未保存的空文件,此时如果保存,那么配置文件会变为空文件)。 @@ -411,7 +409,7 @@ alias c++='c++-14' 还有一些指令非常好用: -- `./a.out < in > out`:在 Linux 和 MacOS 中,此指令可以从`in`读取输入,传递给程序`a.out`作为输入,然后把输出传到文件`out`中。这在做一些题目时非常有效,尤其是程序设计实习的魔兽世界大作业这类输出以 MB 来计数的题目。 +- `./a.out < in > out`:在 Linux 和 macOS 中,此指令可以从 `in` 读取输入,传递给程序 `a.out` 作为输入,然后把输出传到文件 `out` 中。这在做一些题目时非常有效,尤其是程序设计实习的魔兽世界大作业这类输出以 MB 来计数的题目。 ::: warning 注意 这会删除 out 文件中原本的内容。 @@ -419,7 +417,7 @@ alias c++='c++-14' 获取输出后,可以用 VS Code 的**对比功能**对比自己的输出和评测系统的输出,来修正程序。 -- `get-content in | .\a.exe > out`这个命令功能与上述命令相同,但它在 Windows PowerShell 中使用。因为 PowerShell 中 '<' 字符是保留字,所以必须使用这种写法。 +- `get-content in | .\a.exe > out` 这个命令功能与上述命令相同,但它在 Windows PowerShell 中使用。因为 PowerShell 中 '<' 字符是保留字,所以必须使用这种写法。 - `cd`:更改终端所在目录。使用时,输入 cd 后按 Tab 键,可以快捷遍历当前目录下的子目录。或者,也可以直接输入全路径。 @@ -427,13 +425,13 @@ alias c++='c++-14' # 2. 文件和文本 -在使用电脑的过程中,我们常常听到一个名词——文件。安装软件用到的安装包、前文提到的`exe`可执行文件、提交作业时常用的`word`文档、拍照后生成的`jpg`和`jpeg`格式图片,都是文件。虽然我们每天都在使用文件,但我们可能不太了解它。在本节,我们简要了解一下到底什么是文件、文件系统、如何创建文件,文件和文本的区别,从而对文件有更深入的认识。 +在使用电脑的过程中,我们常常听到一个名词——文件。安装软件用到的安装包、前文提到的 `exe` 可执行文件、提交作业时常用的 `word` 文档、拍照后生成的 `jpg` 和 `jpeg` 格式图片,都是文件。虽然我们每天都在使用文件,但我们可能不太了解它。在本节,我们简要了解一下到底什么是文件、文件系统、如何创建文件,文件和文本的区别,从而对文件有更深入的认识。 ## 2.1 文件的本质 不同操作系统(如 Windows,Linux,MacOS,Android)都有文件的概念,而且它们对于文件的处理方式有些不同。但是,在各个操作系统中,我们都可以把文件理解为一堆二进制数据的集合——它是计算机存储系统中的基本单位,用于存储数据和信息。 -无论文件的类型或内容是什么,计算机存储和处理的所有数据最终都表示为**二进制形式**,即由 0 和 1 组成的比特序列。例如,Windows 中常用的`txt`文件,它在打开时虽然显示为文字,但在底层,这些字符是通过字符编码(如 ASCII 或 UTF-8)表示为二进制数据的。例如,字符`A`在 ASCII 编码中表示为二进制的`01000001`。打开文件时,选用的不同种字符编码,实际上就是告诉计算机用什么**标准**去读取文件,并按对应的规则显示为字符。 +无论文件的类型或内容是什么,计算机存储和处理的所有数据最终都表示为**二进制形式**,即由 0 和 1 组成的比特序列。例如,Windows 中常用的 `txt` 文件,它在打开时虽然显示为文字,但在底层,这些字符是通过字符编码(如 ASCII 或 UTF-8)表示为二进制数据的。例如,字符 `A` 在 ASCII 编码中表示为二进制的 `01000001`。打开文件时,选用的不同种字符编码,实际上就是告诉计算机用什么**标准**去读取文件,并按对应的规则显示为字符。 ## 2.2 文件的后缀 @@ -441,7 +439,7 @@ alias c++='c++-14' 实际上,文件的后缀是文件**命名**的一部分,在各个操作系统中一般用`.`来区分:文件名从左到右的第一个`.`右边就是文件后缀。因此,文件后缀与文件的**具体内容**无关,改变它并不会改变文件的内容——归根结底,它只是名字的一部分而已。 -虽然文件后缀不影响文件内容,但在现代操作系统中,它有很大的作用。前文提到,在计算机眼里,文件的内容本质是一个二进制序列,不同的文件即使差别很大,但在二进制的世界里,也就是某些位不同而已。由于文件有许多类别(例如文本文件、照片、视频、可执行文件),计算机需要知道用什么方式(应用程序)来打开指定的文件(这些程序会根据它的设计目的,按照某种固定的**标准**,使用文件中存储的数据。比如,相册打开`bmp`文件时,会将文件开头的固定长度作为**文件头**,从中读取照片大小、长宽等信息,并按照这些信息在后文中读取像素数据,渲染成图片);但这又难以从文件内容直接看出来。所以,**后缀**应运而生——它可以告诉计算机用哪一类应用程序来读取文件。如果随意修改后缀,可能会导致计算机用错误的程序打开文件,或者压根不认识这个后缀,我们就无法看到想要的内容。而实际上所有文件都可以用记事本打开,只不过可能是乱码罢了。 +虽然文件后缀不影响文件内容,但在现代操作系统中,它有很大的作用。前文提到,在计算机眼里,文件的内容本质是一个二进制序列,不同的文件即使差别很大,但在二进制的世界里,也就是某些位不同而已。由于文件有许多类别(例如文本文件、照片、视频、可执行文件),计算机需要知道用什么方式(应用程序)来打开指定的文件(这些程序会根据它的设计目的,按照某种固定的**标准**,使用文件中存储的数据。比如,相册打开 `bmp` 文件时,会将文件开头的固定长度作为**文件头**,从中读取照片大小、长宽等信息,并按照这些信息在后文中读取像素数据,渲染成图片);但这又难以从文件内容直接看出来。所以,**后缀**应运而生——它可以告诉计算机用哪一类应用程序来读取文件。如果随意修改后缀,可能会导致计算机用错误的程序打开文件,或者压根不认识这个后缀,我们就无法看到想要的内容。而实际上所有文件都可以用记事本打开,只不过可能是乱码罢了。 下面介绍一下常见的后缀: @@ -455,13 +453,13 @@ alias c++='c++-14' 源代码文件都可以用记事本打开。它们的本质都是文本。 -- **视频文件**:`.mp4`、`.avi`、`.mkv`、`.ts`、`.m3u8`等。 +- **视频文件**:`.mp4`、`.avi`、`.mkv`、`.ts`、`.m3u8` 等。 -- **图片**:`.jpg/.jpeg`、`.png`、`.gif`、`.bmp`、`.webp`、`.svg`等。 +- **图片**:`.jpg/.jpeg`、`.png`、`.gif`、`.bmp`、`.webp`、`.svg` 等。 -- **压缩文件**:`.zip`、`.rar`、`.7z`等。常用于 Linux 系统的有:`.tar.gz`、`.tar.xz`。常用于 MacOS 系统的有:`.dmg`(用于分发软件)。用于光盘,或虚拟光盘的为:`.iso`,可用来存放系统镜像。 +- **压缩文件**:`.zip`、`.rar`、`.7z` 等。常用于 Linux 系统的有:`.tar.gz`、`.tar.xz`。常用于 macOS 系统的有:`.dmg`(用于分发软件)。用于光盘,或虚拟光盘的为:`.iso`,可用来存放系统镜像。 -- **可执行文件**:Windows:`.exe`;Linux/Unix:无;MacOS:无,或`.app`;Java 程序:`.jar` +- **可执行文件**:Windows:`.exe`;Linux/Unix:无;MacOS:无,或 `.app`;Java 程序:`.jar` - **脚本文件**:Windows:`.bat`、`.cmd`、`.ps1`;Linux/Unix:`.sh` @@ -496,7 +494,7 @@ alias c++='c++-14' 文本是一类特殊的文件,由于源代码文件也属于文本,且我们日常接触较多文本类文件,这里着重提及。 -我们首先来看**纯文本**,在各类系统中可以使用`txt`后缀来区分,打开它时会调用系统自带的纯文本编辑器,例如 Windows 上的记事本。这类文本基本只有单纯的显示字符的功能,没有其他额外功能。实际上,各类后缀的**源代码**本质也是此类文本。 +我们首先来看**纯文本**,在各类系统中可以使用 `txt` 后缀来区分,打开它时会调用系统自带的纯文本编辑器,例如 Windows 上的记事本。这类文本基本只有单纯的显示字符的功能,没有其他额外功能。实际上,各类后缀的**源代码**本质也是此类文本。 ### 文本的编码 @@ -546,22 +544,22 @@ alias c++='c++-14' 在 Windows 上,要创建一份文件,可以在右键菜单中选择创建文本文档,然后根据需要修改名称和后缀。 -在 MacOS 上,系统没有直接在右键菜单中提供类似的选项。可以用下面几种方式: +在 macOS 上,系统没有直接在右键菜单中提供类似的选项。可以用下面几种方式: - **利用软件**:打开 VS Code 等软件,在相应目录右键,点击新建文件 -- **利用终端**:打开终端,定位到需要创建文件的目录,输入命令`touch filename`,创建名为 filename 的文件。 +- **利用终端**:打开终端,定位到需要创建文件的目录,输入命令 `touch filename`,创建名为 filename 的文件。 -在 Linux/MacOS 中,第二种方法比较常见。 +在 Linux/macOS 中,第二种方法比较常见。 # 3. 软件的安装和卸载 -安装卸载软件听起来是很简单的事——但其中其实有很多门道。有一则笑话:“我熟练掌握 PS、AE、Word、Excel、PowerPoint 等软件的安装和卸载“,听起来很好笑,但许多软件的安装和卸载本身也是有难度的。在这一部分中,我们来了解一下如何正确地安装、卸载软件,打造一个干净的电脑环境。 +安装卸载软件听起来是很简单的事——但其中其实有很多门道。有一则笑话:“我熟练掌握 PS、AE、Word、Excel、PowerPoint 等软件的安装和卸载”,听起来很好笑,但许多软件的安装和卸载本身也是有难度的。在这一部分中,我们来了解一下如何正确地安装、卸载软件,打造一个干净的电脑环境。 ## 3.1 软件的安装 ### 定位官网 -常用的免费/付费软件都会有一个官网。然而,由于近年来搜索引擎广告严重,许多官网难以找到,甚至人们在寻找官网的时候被带到“xx 软件园”等流氓网站。因此,找到官网也成了一门技术活。 +常用的免费/付费软件都会有一个官网。然而,由于近年来搜索引擎广告严重,许多官网难以找到,甚至人们在寻找官网的时候被带到 “xx 软件园” 等流氓网站。因此,找到官网也成了一门技术活。 ![steam](/assets/basic/05-drive-your-computer-1/steam.png) @@ -586,7 +584,7 @@ alias c++='c++-14' ![qq2](/assets/basic/05-drive-your-computer-1/qq2.png) ::: info 提示 -这里要**尤为注意**自己电脑的情况。一般来说,64 位 Windows 就用默认下载按钮;而**Surface**这类**Arm**架构的 Windows 电脑要选择**Arm 版本下载**。如果是 MacBook,也要注意**Intel 和 Apple 芯片的区别**,否则无法正常安装。 +这里要**尤为注意**自己电脑的情况。一般来说,64 位 Windows 就用默认下载按钮;而 **Surface** 这类 **Arm** 架构的 Windows 电脑要选择 **Arm 版本下载**。如果是 MacBook,也要注意**Intel 和 Apple 芯片的区别**,否则无法正常安装。 ::: ### GitHub 上软件的下载 @@ -601,7 +599,7 @@ alias c++='c++-14' ![assets](/assets/basic/05-drive-your-computer-1/assets.png) -通常来讲,我们用的电脑是 Arm64/amd64(x64)架构。常见的轻薄本、游戏本、台式机都是 amd64(x64)架构,我们要找到对应的架构,以及后缀为`.exe`或者`.msi`的文件来安装。Linux 则要找到自己的架构,且后缀为`.deb`、`.tar.gz`等的文件;MacOS 用户,如果是 Apple 芯片,则要找到`aarch64`、`arm64`架构,`.dmg`后缀的文件来安装。如果是 Intel 芯片,则要找`x64`架构,`.dmg`后缀文件安装。 +通常来讲,我们用的电脑是 Arm64/amd64(x64)架构。常见的轻薄本、游戏本、台式机都是 amd64(x64)架构,我们要找到对应的架构,以及后缀为 `.exe` 或者 `.msi` 的文件来安装。Linux 则要找到自己的架构,且后缀为 `.deb`、`.tar.gz` 等的文件;MacOS 用户,如果是 Apple 芯片,则要找到 `aarch64`、`arm64` 架构,`.dmg` 后缀的文件来安装。如果是 Intel 芯片,则要找 `x64` 架构,`.dmg` 后缀文件安装。 ### 安装软件 @@ -611,7 +609,7 @@ alias c++='c++-14' 安装完成后,强烈建议**查看整个界面**,是否有捆绑软件勾选,再点击完成。 -对于 MacOS 电脑,情况有所不同。一般来说,下载到的是`.dmg`文件。双击运行,把软件图标拖到 Application 文件夹即可安装。安装完成后,会发现 Apps 中出现这个软件。但有时候,打开软件会提示 App 已损坏。这是 Apple 的过强的安全策略造成的。 +对于 macOS 电脑,情况有所不同。一般来说,下载到的是 `.dmg` 文件。双击运行,把软件图标拖到 Application 文件夹即可安装。安装完成后,会发现 Apps 中出现这个软件。但有时候,打开软件会提示 App 已损坏。这是 Apple 的过强的安全策略造成的。 由于篇幅限制,请针对每个软件出现的问题,搜索相应的解决办法(因为每个软件的包名不同)。下面给出两个网站,介绍了相关问题的通用解决办法: @@ -637,11 +635,11 @@ alias c++='c++-14' 点击后,搜索你要卸载的软件,然后点卸载。 -### MacOS +### macOS 在 MacBook 上删除软件比 Windows 复杂得多。虽然,在访达->Application 文件夹,把软件移到废纸篓,或者在启动台长按,点×删除,可以删除软件主体;**但是**,这样做并不能删除软件在系统各处创建的配置文件等等琐碎的小文件,也就是**软件残留**。 -因此,可以选择用**brew**这样的工具来管理软件。或者,对于具体的软件,搜索其相应残留位置手动删除。 +因此,可以选择用 **brew** 这样的工具来管理软件。或者,对于具体的软件,搜索其相应残留位置手动删除。 ## 3.3 规避流氓、病毒软件 @@ -663,7 +661,7 @@ alias c++='c++-14' 然后在网站中找到想要的软件来下载。激活过程可能需要校园网环境。 -- **Adobe**:现在,请前往[Adobe Creative Cloud Download](https://creativecloud.adobe.com/zh-Hans/apps/download/creative-cloud)直接下载 Creative Cloud,下载时输入学号邮箱(xxx@stu.pku.edu.cn),会自动跳转到门户登录,登录后就会获得授权。 +- **Adobe**:现在,请前往 [Adobe Creative Cloud Download](https://creativecloud.adobe.com/zh-Hans/apps/download/creative-cloud) 直接下载 Creative Cloud,下载时输入学号邮箱(xxx@stu.pku.edu.cn),会自动跳转到门户登录,登录后就会获得授权。 - **VMWare**:现在已经免费。请直接去官网下载。 - **Office**:可按照网站要求,申请学生订阅。或者直接下载软件包,用校园网环境激活。 - **MATLAB**:可直接下载离线包,用学校邮箱登录来安装。 @@ -677,14 +675,14 @@ alias c++='c++-14' 由于各类网络资源都会使用压缩文件的方式进行发布,寻找一款好用且**不流氓**的压缩软件很有必要。下面推荐一些常用的压缩软件: - Windows: - - `7-zip`或者其变种`7-zip-zstd`:老牌压缩软件,能满足大部分需求。[`7-zip`官方网站](https://www.7-zip.org/download.html);[`7-zip-zstd`官方网站](https://github.com/mcmilk/7-Zip-zstd) + - `7-zip` 或者其变种 `7-zip-zstd`:老牌压缩软件,能满足大部分需求。[7-zip 官方网站](https://www.7-zip.org/download.html);[7-zip-zstd 官方网站](https://github.com/mcmilk/7-Zip-zstd) - 老版 `Bandizip`:请不要升级。新版本有广告。[Bandizip - 下载 Bandizip 6.x (bandisoft.com)](https://www.bandisoft.com/bandizip/old/6/) - `WinRAR`:老牌压缩软件。优点是可以生成 RAR 文件,且功能较全、界面不错。**请注意**:若要使用此软件,有如下注意事项: - - 必须从英文官网下载:[WinRAR download free and support: WinRAR (win-rar.com)](https://www.win-rar.com/start.html?&L=0)中文版无论是否购买正版都有广告,而英文版无论是否购买正版都没有广告,也不会有弹窗。30 天试用期不会减少。 - - **版本号必须大于 7.0.0!!!**这是因为,以前的版本有一个重要**高危漏洞**,可以无需以`.exe`后缀存放文件,执行恶意代码。 + - 必须从英文官网下载:[WinRAR download free and support: WinRAR (win-rar.com)](https://www.win-rar.com/start.html?&L=0) 中文版无论是否购买正版都有广告,而英文版无论是否购买正版都没有广告,也不会有弹窗。30 天试用期不会减少。 + - **版本号必须大于 7.0.0!!!**这是因为,以前的版本有一个重要**高危漏洞**,可以无需以 `.exe` 后缀存放文件,执行恶意代码。 - MacOS: - `MacZip`:第三方压缩软件。官网:[MacZip - 专为 macOS 而设计的压缩软件!](https://maczip.cn/?locale=zh-CN)安装后,请自行更改默认的压缩包打开方式。使用此软件,有如下优点: - - 安装后,设置内默认勾选压缩、提取文件忽略`.DS_STORE`文件。如果需要多平台传输压缩文件,这一特性很不错。 + - 安装后,设置内默认勾选压缩、提取文件忽略 `.DS_STORE` 文件。如果需要多平台传输压缩文件,这一特性很不错。 - 支持的压缩包种类全,且支持加密压缩。 ## 4.2 播放器推荐 @@ -703,8 +701,8 @@ alias c++='c++-14' - Windows: - `Internet Download Manager`:功能强大的一款下载器。同网络环境下,相比于浏览器自带下载功能,提速明显,且可以从网页中下载视频、图片。但是收费。 - MacOS: - - `Free Download Manager`:官网[Free Download Manager for Mac | Download](https://www.freedownloadmanager.org/zh/download-fdm-for-mac.htm) - `Aria2`是一款不错的下载器。多个平台都有,但是使用门槛较高。官网:[GitHub - aria2/aria2](https://github.com/aria2/aria2) + - `Free Download Manager`:官网 [Free Download Manager for Mac | Download](https://www.freedownloadmanager.org/zh/download-fdm-for-mac.htm) + - `Aria2` 是一款不错的下载器。多个平台都有,但是使用门槛较高。官网:[GitHub - aria2/aria2](https://github.com/aria2/aria2) ## 4.4 杀毒软件推荐 @@ -744,7 +742,7 @@ alias c++='c++-14' - `DISM++`: 国人出品的 Windows 优化工具,并整合了各类 Windows 工具,如 WIM/ESD 镜像备份和挂载等。下载:https://github.com/Chuyu-Team/Dism-Multi-language/releases - `rufus`: Windows 平台下 USB 安装介质烧录小工具。官网:https://rufus.ie/zh/ - `Ventoy`: 多系统启动盘制作工具,在只有一个 U 盘的情况下想要安装多个系统就可以使用。下载:https://www.ventoy.net/cn/download.html -- `Localsend`:多平台局域网文件传输软件。实用,且界面美观。iOS 和 Mac 可以在 App Store 找到。Android 可以在 Google Play 找到。各平台的安装包也可以在下面的网站找到:[GitHub - localsend/localsend](https://github.com/localsend/localsend) +- `Localsend`:多平台局域网文件传输软件。实用,且界面美观。iOS 和 macOS 可以在 App Store 找到。Android 可以在 Google Play 找到。各平台的安装包也可以在下面的网站找到:[GitHub - localsend/localsend](https://github.com/localsend/localsend) - `Magpie`:一款可以使画面清晰度提高的软件。例如,它可以使陈年老游戏的清晰度提升很多。工作原理为重采样,对显卡性能需求较高。官网:[GitHub - Blinue/Magpie](https://github.com/Blinue/Magpie) - `Handbrake`:使用 ffmpeg 作为后端的一款视频转码软件,全平台,支持红绿蓝三家的硬件加速以及你能想得和你想不到的各类视频音频格式。官网:[HandBrake: Open Source Video Transcoder](https://handbrake.fr/) - `Geek`:Windows 上的一款卸载软件,可以卸载各个软件的残留。官网:[Geek Uninstaller - the best FREE uninstaller](https://geekuninstaller.com/) @@ -753,7 +751,7 @@ alias c++='c++-14' - `FileConverter`:可以在很多文件格式间互转。官网:https://github.com/Tichau/FileConverter - `Calibre`:电子书管理器,也可以支持电子书格式转换。官网:https://calibre-ebook.com/zh_CN - `Croc`:也是一款文件互传软件。[官网](https://github.com/schollz/croc)。优点在于可以自动打洞,不局限于局域网。 -- [convertio](https://convertio.co):也用于文件转换,是一个网站。 +- `convertio`:也用于文件转换,是一个[网站](https://convertio.co)。 - `wiztree`:磁盘空间分析工具。[官网](https://www.diskanalyzer.com)。Linux 上的替代品为 baobab。 - `WallpaperEngine`:可以找到 Steam 创意工坊上的很多壁纸。建议从 Steam 购买并下载。 - `WinSCP`: Windows FTP/SFTP 图形客户端,官网:https://winscp.net/ diff --git a/basic/06-drive-your-computer-2.md b/basic/06-drive-your-computer-2.md index 535a62b..3af1049 100644 --- a/basic/06-drive-your-computer-2.md +++ b/basic/06-drive-your-computer-2.md @@ -100,13 +100,13 @@ git init 我们可能需要对仓库进行一些配置,比如设置用户名和邮箱,设置代理等等。 -配置 Git 只需要用到 config 子命令。如果需要修改全局设置,可以加上`--global`参数,如果需要打开配置文件进行编辑,可以加上`--edit`参数。现在我们修改一下全局参数,执行: +配置 Git 只需要用到 config 子命令。如果需要修改全局设置,可以加上 `--global` 参数,如果需要打开配置文件进行编辑,可以加上 `--edit` 参数。现在我们修改一下全局参数,执行: ```shell git config --global --edit ``` -然后你的终端应该会打开一个文本编辑器(可能是 vim,在 Windows 上也可能是记事本之类的),然后在`[user]`模块下找到`name = xxx`和 `email = xxx@xxx`,将两者修改为自己的信息。如果这两行不存在,你可以在`[user]`后另起一行,加上这两行信息,如果`[user]`也不存在,你可以在文件末尾另起一行加上。很多代码托管平台,比如 GitHub,使用提交的邮箱判断提交的作者。 +然后你的终端应该会打开一个文本编辑器(可能是 vim,在 Windows 上也可能是记事本之类的),然后在 `[user]` 模块下找到 `name = xxx` 和 `email = xxx@xxx`,将两者修改为自己的信息。如果这两行不存在,你可以在 `[user]` 后另起一行,加上这两行信息,如果 `[user]` 也不存在,你可以在文件末尾另起一行加上。很多代码托管平台,比如 GitHub,使用提交的邮箱判断提交的作者。 由于众所周知的原因,你可能需要使用代理。请在文件末尾另起一行,填写以下内容,其中链接需要填写你自己的链接: @@ -162,7 +162,7 @@ git status git commit ``` -会弹出文本编辑器,请在第一行写你的提交信息,比如`My first commit`,然后退出编辑器。或者你也可以执行: +会弹出文本编辑器,请在第一行写你的提交信息,比如 `My first commit`,然后退出编辑器。或者你也可以执行: ```shell git commit -m "My first commit @@ -191,9 +191,9 @@ git status 总结一下,git 整体的工作流程就是修改-暂存-提交-下一轮修改-……这样一直进行。 -如果你觉得暂存操作比较麻烦,可以加上`-a`参数,此参数会在提交前自动暂存修改过和删除的文件,但是新的文件不会被包括进来。 +如果你觉得暂存操作比较麻烦,可以加上 `-a` 参数,此参数会在提交前自动暂存修改过和删除的文件,但是新的文件不会被包括进来。 -有时候上一个提交还没有完成,你可以使用`--amend`参数修订上一个提交。 +有时候上一个提交还没有完成,你可以使用 `--amend` 参数修订上一个提交。 ### 查看并回退到指定历史版本 @@ -297,7 +297,7 @@ git reset --hard 7a6ab ### 排除掉特定的文件 -有时候一些文件不应该被版本管理系统追踪,如编译生成的目标文件,可执行文件,一些敏感配置等等。我们可以使用`.gitignore`文件来排除指定文件和文件夹。执行以下内容: +有时候一些文件不应该被版本管理系统追踪,如编译生成的目标文件,可执行文件,一些敏感配置等等。我们可以使用 `.gitignore` 文件来排除指定文件和文件夹。执行以下内容: ```shell mkdir confidential @@ -337,7 +337,7 @@ git status ``` -可以发现`credential`目录和所有的`.o`文件都被忽略了。 +可以发现 `credential` 目录和所有的 `.o` 文件都被忽略了。 最后我们执行 @@ -398,7 +398,7 @@ git branch update-example 37f7d git checkout update-example ``` -然后我们将文件`example1.txt`改为`Hello, Git2!`,执行: +然后我们将文件 `example1.txt` 改为 `Hello, Git2!`,执行: ```shell git commit -am "Branch!" @@ -453,7 +453,7 @@ git merge merge-example 自动合并失败,修正冲突然后提交修正的结果。 ``` -我们打开`example1.txt`查看内容: +我们打开 `example1.txt` 查看内容: ```plain <<<<<<< HEAD @@ -501,14 +501,14 @@ git clone url://path/to/be/cloned git pull ``` -如果本地有远端不存在的提交,则拉取代码不能以默认的“fast-forward”方式进行,因此需要指定`--no-ff`参数进行合并拉取或者指定`--rebase`进行变基拉取。在特别有必要时,也可以直接 hard reset 到远端 HEAD 处。 +如果本地有远端不存在的提交,则拉取代码不能以默认的 “fast-forward” 方式进行,因此需要指定 `--no-ff` 参数进行合并拉取或者指定 `--rebase` 进行变基拉取。在特别有必要时,也可以直接 hard reset 到远端 HEAD 处。 #### 推送代码 -在工作完成,提交完成之后,可以用这个子命令将修改推送至远端。若有远端有本地没有的提交,需要先进行拉取,才能推送,或者`--force`强制推送,此时不一致的提交会被本地提交代替。 +在工作完成,提交完成之后,可以用这个子命令将修改推送至远端。若有远端有本地没有的提交,需要先进行拉取,才能推送,或者 `--force` 强制推送,此时不一致的提交会被本地提交代替。 ::: danger 警告 -使用`--force`参数前请三思,仔细检查你将要提交的内容! +使用 `--force` 参数前请三思,仔细检查你将要提交的内容! ::: #### 图形化工具的使用 diff --git a/basic/07-drive-your-computer-3.md b/basic/07-drive-your-computer-3.md index 5bdf60f..9f516aa 100644 --- a/basic/07-drive-your-computer-3.md +++ b/basic/07-drive-your-computer-3.md @@ -14,7 +14,7 @@ 如需查看磁盘占用情况,Windows 和 Linux 下的文件管理器都能直观地提供以上信息,故此不再详述。 -如需查看磁盘健康情况,可以使用`smartctl`命令(Linux)或者 CrystalDiskInfo 软件(Windows)查看。 +如需查看磁盘健康情况,可以使用 `smartctl` 命令(Linux)或者 CrystalDiskInfo 软件(Windows)查看。 ![CrystalDiskInfo](../assets/basic/07-drive-your-computer-3/image.png) 图 1. 笔者使用 CrystalDiskInfo 查看磁盘信息 @@ -28,7 +28,7 @@ Windows 下任务管理器即可,Linux 下推荐`btop`程序。 ### 电池信息 {#battery-info} -Windows 下可以使用自带的`powercfg`命令生成 html 格式的电池信息报告,Linux 下可以使用`upower`命令查看 +Windows 下可以使用自带的 `powercfg` 命令生成 html 格式的电池信息报告,Linux 下可以使用 `upower` 命令查看 ### 视频信息 {#video-info} @@ -44,7 +44,7 @@ Windows 下可以使用自带的`powercfg`命令生成 html 格式的电池信 蓝屏(BSOD, Blue Screen of Death),通常意味着 Windows 内核发生了不可恢复的故障。常见的蓝屏原因包括系统服务异常(多是驱动导致),关键进程退出(可能是病毒引起),机器检查(硬件故障)等。如果最近新安装了硬件,可以考虑移除它们再试试,如果怀疑是驱动问题或者是病毒问题,可以考虑进入安全模式: -- 如果你还能进入系统:按下`Win+R`输入`msconfig`并回车,点击“引导”选项卡,勾选“安全启动”,点击应用,重启即可。 +- 如果你还能进入系统:按下 `Win+R` 输入 `msconfig` 并回车,点击“引导”选项卡,勾选“安全启动”,点击应用,重启即可。 - 如果你不能进入系统:启动失败若干次后应该会出现恢复菜单,点击“疑难解答”-“高级选项”-“启动设置”,会提示重启进入安全模式。 @@ -54,7 +54,7 @@ Windows 下可以使用自带的`powercfg`命令生成 html 格式的电池信 完成所有操作后,如果使用 msconfig 设置了安全模式,应当先取消勾选然后应用,然后重启回到正常模式看问题是否解决。 -如果你想向驱动作者报告问题,可以使用 WinDbg 调试内核转储文件,在 WinDbg 中打开转储文件,使用`!analyze -v`获取完整分析报告。WinDbg 可以在应用商店中免费获取。 +如果你想向驱动作者报告问题,可以使用 WinDbg 调试内核转储文件,在 WinDbg 中打开转储文件,使用 `!analyze -v` 获取完整分析报告。WinDbg 可以在应用商店中免费获取。 ### 内核恐慌 {#panic} @@ -62,13 +62,13 @@ Linux 内核的严重错误被叫做 panic。其实由于 Linux 用户态和内 ### 应用软件崩溃 {#application-crash} -这种情况比较复杂,有可能是软件本身的 bug,也有可能是用户的环境或者使用软件的方式的问题。部分软件带有崩溃反馈模块,你可以用这个模块向开发者反馈信息。在反馈之前,请先确保你的软件是最新的,因为你发现的故障可能在新版本中已经被修复,同时需确保你正确使用软件。然后向开发者反馈故障时,尽可能给出软件版本、操作系统版本、库版本(如果有需要)、硬件型号等信息,同时需给出较为详细的复现故障的步骤,必要时附上日志和截图(不要在正文中放大段日志,最好以附件或者在线剪贴板链接,如[gist](https://gist.github.com/)的形式给出)。如果你使用 Linux 并且恰好开启了核心转储,你也可以调试转储文件(例如使用`coredumpctl -r debug`,然后输入`bt`),给出栈回溯信息等。 +这种情况比较复杂,有可能是软件本身的 bug,也有可能是用户的环境或者使用软件的方式的问题。部分软件带有崩溃反馈模块,你可以用这个模块向开发者反馈信息。在反馈之前,请先确保你的软件是最新的,因为你发现的故障可能在新版本中已经被修复,同时需确保你正确使用软件。然后向开发者反馈故障时,尽可能给出软件版本、操作系统版本、库版本(如果有需要)、硬件型号等信息,同时需给出较为详细的复现故障的步骤,必要时附上日志和截图(不要在正文中放大段日志,最好以附件或者在线剪贴板链接,如 [gist](https://gist.github.com/) 的形式给出)。如果你使用 Linux 并且恰好开启了核心转储,你也可以调试转储文件(例如使用 `coredumpctl -r debug`,然后输入 `bt`),给出栈回溯信息等。 -如果你想自行调试,首先你可以寻找软件是否提供了调试符号包,在没有调试符号包和源码的情况下调试将会是非常困难的,而且两者都不提供的软件通常在许可上不允许你做调试(因为会涉及反汇编),除非万不得已,不建议自行调试这种软件。如果没有调试符号包但是有源码,你可以尝试在干净的环境中重新构建带调试符号的软件包,对于用 gcc 编译的软件,可以考虑加上编译参数`-g`。同时不建议使用较高的优化等级,这会给调试带来困难,除非你确信是高优化等级导致的问题。 +如果你想自行调试,首先你可以寻找软件是否提供了调试符号包,在没有调试符号包和源码的情况下调试将会是非常困难的,而且两者都不提供的软件通常在许可上不允许你做调试(因为会涉及反汇编),除非万不得已,不建议自行调试这种软件。如果没有调试符号包但是有源码,你可以尝试在干净的环境中重新构建带调试符号的软件包,对于用 gcc 编译的软件,可以考虑加上编译参数 `-g`。同时不建议使用较高的优化等级,这会给调试带来困难,除非你确信是高优化等级导致的问题。 ### 系统启动慢 {#system-slow} -Windows 下打开任务管理器检查有无不必要启动项,加以禁止即可;Linux 下可以使用`journalctl`检查日志,留意启动慢的服务,有针对性地加以解决,或者直接禁用服务 +Windows 下打开任务管理器检查有无不必要启动项,加以禁止即可;Linux 下可以使用 `journalctl` 检查日志,留意启动慢的服务,有针对性地加以解决,或者直接禁用服务 ### 应用程序慢 {#app-slow} @@ -76,7 +76,7 @@ Windows 下打开任务管理器检查有无不必要启动项,加以禁止即 ### 网络连接故障 {#offline} -建议检查网线是否插好,网关是否登陆,是否欠费,DNS 设置是否正确,上一次关机时代理是否正确关闭等等。对于 Linux 系统,可以检查`rfkill`是否允许相应网卡工作,`ip`是否启动相应适配器。 +建议检查网线是否插好,网关是否登陆,是否欠费,DNS 设置是否正确,上一次关机时代理是否正确关闭等等。对于 Linux 系统,可以检查 `rfkill` 是否允许相应网卡工作,`ip` 是否启动相应适配器。 ## 小知识串讲 {#knowledge-series} @@ -84,7 +84,7 @@ Windows 下打开任务管理器检查有无不必要启动项,加以禁止即 #### 系统快捷键 {#system-shortcut} -不同系统提供了不同的快捷键,这里简单介绍 Windows 和 Linux 在系统层面提供的快捷键。Windows 徽标键(简称 Win 键)在 Linux 下也称 Meta 键,在 Mac 下则是 Command 键。F1-F12 系列按键有可能需要同时按下 Fn 键使用。 +不同系统提供了不同的快捷键,这里简单介绍 Windows 和 Linux 在系统层面提供的快捷键。Windows 徽标键(简称 Win 键)在 Linux 下也称 Meta 键,在 macOS 下则是 Command 键。F1-F12 系列按键有可能需要同时按下 Fn 键使用。 - Windows @@ -108,9 +108,9 @@ Windows 下打开任务管理器检查有无不必要启动项,加以禁止即 `Ctrl+Alt+{F1-F12}`: 切换 tty。一般图形桌面位于 tty1 或者 tty2。这一系列快捷键由 Wayland 或者 Xorg 提供 - `Alt+SysRq`: 这是一系列快捷键,其中 SysRq 键就是 PrintScreen 键(有的键盘应该会在 PrintScreen 键下面一行写上 SysRq),按下这个组合键后,再按下特定按键,内核会有不同的功能,如按下`C`会让内核强制崩溃;按下`E`会向所有进程发送 SIGTERM 使得它们可以做一些清理后退出;按下`I`会向所有进程发送 SIGKILL 使得它们强行退出;按下`S`会同步磁盘写入;按下`U`会使得所有文件系统被重新挂载为只读;按下`B`会让计算机立刻重启。注意:SysRq 功能可以使用 sysctl 进行配置,默认可能并未开启全部功能。利用这些快捷键可以救回卡死的系统,或者可以在保证文件系统完整的情况下强行重启电脑。 + `Alt+SysRq`: 这是一系列快捷键,其中 SysRq 键就是 PrintScreen 键(有的键盘应该会在 PrintScreen 键下面一行写上 SysRq),按下这个组合键后,再按下特定按键,内核会有不同的功能,如按下 `C` 会让内核强制崩溃;按下 `E` 会向所有进程发送 SIGTERM 使得它们可以做一些清理后退出;按下 `I` 会向所有进程发送 SIGKILL 使得它们强行退出;按下 `S` 会同步磁盘写入;按下 `U` 会使得所有文件系统被重新挂载为只读;按下 `B` 会让计算机立刻重启。注意:SysRq 功能可以使用 sysctl 进行配置,默认可能并未开启全部功能。利用这些快捷键可以救回卡死的系统,或者可以在保证文件系统完整的情况下强行重启电脑。 -- MacOS +- macOS TODO! diff --git a/basic/08-drive-your-computer-4.md b/basic/08-drive-your-computer-4.md index 9a0e25d..92485f7 100644 --- a/basic/08-drive-your-computer-4.md +++ b/basic/08-drive-your-computer-4.md @@ -8,7 +8,7 @@ ## 网络安全 -写在前面,虽然这部分的标题叫做“网络安全”,但不会介绍任何关于网络的技术层面的协议或是加密方式实现原理,而是主要介绍如何更好地使用现在这个并不太平的互联网,请放心食用。 +写在前面,虽然这部分的标题叫做 “网络安全”,但不会介绍任何关于网络的技术层面的协议或是加密方式实现原理,而是主要介绍如何更好地使用现在这个并不太平的互联网,请放心食用。 ### 一个作为开始的段子 @@ -24,7 +24,7 @@ 他想要居中标题,在标题前面打了一连串的空格!直到标题看起来在中间的位置了! -他直接在百度上搜“爱奇艺下载”了!他点进了华军软件园了!他点了那个最大的“高速下载”!他直接运行了 p2p 下载器!他没有取消任何一个勾选的捆绑程序,直接点了下一步!他的桌面上多了 4 个,不,5 个,不,6 个图标! +他直接在百度上搜 “爱奇艺下载” 了!他点进了华军软件园了!他点了那个最大的 “高速下载”!他直接运行了 p2p 下载器!他没有取消任何一个勾选的捆绑程序,直接点了下一步!他的桌面上多了 4 个,不,5 个,不,6 个图标! 他的表格做好了,噢他直接保存到 wps 云端了!他不知道如何把这份表格发给他的上司!他点了分享按钮,给他的上司发了一个金山文档链接!这份表格在云端查看的时候彻底乱码了! @@ -36,11 +36,11 @@ 他打开文件的方式是鼠标左键疯狂连点!他至少点了 10 次!天哪现在桌面上的弹窗都堆不下了! -他把"Doc1.docx"直接重命名成了"实验报告"!他连后缀名都删干净了!现在他再也找不到打开这份文档的方法了! +他把 “Doc1.docx” 直接重命名成了 “实验报告”!他连后缀名都删干净了!现在他再也找不到打开这份文档的方法了! 他在微信上收到了一个文件,他需要把这个文件用邮箱发出去。噢他完全不知道该怎么操作!他在收件人这一栏输入了上司的手机号!他完全不知道如何添加附件!他也完全不知道微信文件保存到哪里了!他对着微信消息按右键复制,然后把文件名粘贴到了正文栏! -他需要下载一个腾讯视频!他在视频网页点击了“下载”,浏览器开始下载腾讯视频客户端了!他开始安装了!他在客户端里下载了一个.qlv 格式的文件!他直接把这个文件发给别人了! +他需要下载一个腾讯视频!他在视频网页点击了 “下载”,浏览器开始下载腾讯视频客户端了!他开始安装了!他在客户端里下载了一个 `.qlv` 格式的文件!他直接把这个文件发给别人了! 感受痛苦吧!你甚至没法教会他们! @@ -53,31 +53,31 @@ 很遗憾,这张图内所有看起来像是 steam 的搜索结果全部导向冒充 steam 的第三方网站。 > [!IMPORTANT] 试一试! -> 找到这两个搜索条目中的“广告”字样。 +> 找到这两个搜索条目中的 “广告” 字样。 很显然误导性如此之强的广告放在首位不是一个好的搜索引擎应该有的行为,不过我们还是可以通过自己的一些努力去防范中招。 -首先下载最好认准官方途径,除非对自己有着足够的自信否则不建议尝试 _xx 软件园_ 之类的网站。steam 成为重灾区的一个主要原因就是它的官网域名`https://store.steampowered.com/`并不直观,并且由于其本身的特殊性导致中国境内对其的连接并不稳定,还因为假冒 steam 有利可图而导致大量仿照 steam 的网站被制作出来坑害新人。搜索`steam游戏管家`等关键词可以详细吃瓜这类坑害新人的事件。相比之下国内软件的官网一般不至于在搜索引擎内直接“查无此人”,在搜索引擎中躲开广告条目就可以找到官网。 +首先下载最好认准官方途径,除非对自己有着足够的自信否则不建议尝试 _xx 软件园_ 之类的网站。steam 成为重灾区的一个主要原因就是它的官网域名 `https://store.steampowered.com/` 并不直观,并且由于其本身的特殊性导致中国境内对其的连接并不稳定,还因为假冒 steam 有利可图而导致大量仿照 steam 的网站被制作出来坑害新人。搜索 `steam游戏管家` 等关键词可以详细吃瓜这类坑害新人的事件。相比之下国内软件的官网一般不至于在搜索引擎内直接“查无此人”,在搜索引擎中躲开广告条目就可以找到官网。 -搜索引擎的选择同样很重要,而上图所示的 360 搜索很明显不是一个好的选择。一般来说,`google`在准确度与效率上更胜一筹,不过需要科学上网。`bing`与`百度`大部分情况下也都可以满足使用需求,而其他的搜索引擎就不作推荐了。 +搜索引擎的选择同样很重要,而上图所示的 360 搜索很明显不是一个好的选择。一般来说,`google` 在准确度与效率上更胜一筹,不过需要科学上网。`bing` 与 `百度` 大部分情况下也都可以满足使用需求,而其他的搜索引擎就不作推荐了。 -`edge`,`chrome`,`firefox`这些浏览器都支持安装扩展(插件),可以在浏览器上安装广告拦截器相关插件,能够帮助处理掉很多烦人的广告,当然也包括上面那张图中那些带有“广告”字样的搜索结果条目。插件的安装方法可以自行搜索,不过注意在`chrome`中安装插件可能需要科学上网。另外诸如`360极速浏览器`之类的浏览器不在任何情况下推荐。下图是开启广告拦截器之后,在`bing`用同样的关键词搜索的结果。可以看到第一项就是我们需要的内容,并且第一页结果所有的条目中均没有导向冒充 steam 的山寨网站。 +`edge`, `chrome`, `firefox` 这些浏览器都支持安装扩展(插件),可以在浏览器上安装广告拦截器相关插件,能够帮助处理掉很多烦人的广告,当然也包括上面那张图中那些带有“广告”字样的搜索结果条目。插件的安装方法可以自行搜索,不过注意在 `chrome` 中安装插件可能需要科学上网。另外诸如 `360极速浏览器` 之类的浏览器不在任何情况下推荐。下图是开启广告拦截器之后,在 `bing` 用同样的关键词搜索的结果。可以看到第一项就是我们需要的内容,并且第一页结果所有的条目中均没有导向冒充 steam 的山寨网站。 ![](../assets/basic/08-drive-your-computer-4/steam-bing.png) ### 如何更好地搜索 -最基础的搜索引擎使用技巧是使用关键词而非问句,比如将`怎么下载steam`更换为`steam 下载`。而对于一些有关国外的信息,使用英文搜索通常可以获得更为准确的结果。另外要辨认信息来源,有帮助的信息来源很多样化,包括但不限于官方文档、专门的资料汇总网站、论坛、前人整理的文章等,但要小心自媒体等“看上去就很不靠谱”的信息来源。一般来讲,信息来源越专业获得信息的效率与准确度越高。 +最基础的搜索引擎使用技巧是使用关键词而非问句,比如将 `怎么下载steam` 更换为 `steam 下载`。而对于一些有关国外的信息,使用英文搜索通常可以获得更为准确的结果。另外要辨认信息来源,有帮助的信息来源很多样化,包括但不限于官方文档、专门的资料汇总网站、论坛、前人整理的文章等,但要小心自媒体等“看上去就很不靠谱”的信息来源。一般来讲,信息来源越专业获得信息的效率与准确度越高。 另外,搜索引擎中支持输入修饰符。在部分特殊的需求场景下,使用修饰符可以将搜索结果限定从几百万限定到个位数级别,达到精确搜索的目的。~~比如说想搜索在某个论坛内某个用户发表的评论之类的场合。~~ (以下修饰符笔者只在 google 中进行过验证,其它搜索引擎下可以自行尝试) -- 双引号(" "),可能是最常见的输入修饰符,比如输入`"马克斯"`,就不会出现有关马克思的结果,也不会出现有关马斯克的结果。 -- 减号(-),`-`后面表示不会出现在搜索结果中的词,比如`米哈游 -原神`就只会返回与原神无关的米哈游信息。 -- 或(OR |),`OR`,`|`表示满足两个关键词中的一个即会出现在搜索结果中,比如`原神 OR 绝区零`,`原神 | 绝区零`会同时返回有关两个游戏的结果。注意这里的`OR`必须大写。 -- 限定网站搜索(site: ),使用`site:`后接网站域名的格式,限定只对特定网站进行搜索。比如`原神 site:www.bilibili.com`只会搜索 b 站中有关于原神的内容。对于一些网站本身搜索功能不令人满意的情况可以使用这种技巧。 -- 限定标题搜索(intitle: ,allintitle: ),`intitle:`关键词后接关键字,表示要搜索的关键字只会在标题中出现。比如`intitle: 这辈子有了`中所有的结果标题中带有相应的搜索词。当需要标题中有多个关键词时,可以使用`allintitle:`,比如`alltintitle:原神 星穹铁道 绝区零`可以搜集到标题中同时涉及这三款游戏的条目。 -- 限定正文搜索(intext: ),通常与`intitle:`结合使用,表示关键词应该在正文中出现。比如`intitle:黑神话 intext:政治正确`,可以精准定位将这款游戏与政治正确联系起来的一些报道。 -- 文件类型搜索(filetype: ),`filetype:`后面接文件类型,可以直接搜索文件而非网页。比如`米哈游 filetype:pdf`可以直接搜索到有关米哈游的一些 pdf 文件。 +- 双引号(" "),可能是最常见的输入修饰符,比如输入 `"马克斯"`,就不会出现有关马克思的结果,也不会出现有关马斯克的结果。 +- 减号(-),`-` 后面表示不会出现在搜索结果中的词,比如 `米哈游 -原神` 就只会返回与原神无关的米哈游信息。 +- 或(OR |),`OR`, `|` 表示满足两个关键词中的一个即会出现在搜索结果中,比如 `原神 OR 绝区零`, `原神 | 绝区零`会同时返回有关两个游戏的结果。注意这里的 `OR` 必须大写。 +- 限定网站搜索(site: ),使用 `site:` 后接网站域名的格式,限定只对特定网站进行搜索。比如 `原神 site:www.bilibili.com` 只会搜索 B 站中有关于原神的内容。对于一些网站本身搜索功能不令人满意的情况可以使用这种技巧。 +- 限定标题搜索(intitle: ,allintitle: ),`intitle:` 关键词后接关键字,表示要搜索的关键字只会在标题中出现。比如 `intitle: 这辈子有了` 中所有的结果标题中带有相应的搜索词。当需要标题中有多个关键词时,可以使用 `allintitle:`,比如 `alltintitle:原神 星穹铁道 绝区零` 可以搜集到标题中同时涉及这三款游戏的条目。 +- 限定正文搜索(intext: ),通常与 `intitle:` 结合使用,表示关键词应该在正文中出现。比如 `intitle:黑神话 intext:政治正确` ,可以精准定位将这款游戏与政治正确联系起来的一些报道。 +- 文件类型搜索(filetype: ),`filetype:` 后面接文件类型,可以直接搜索文件而非网页。比如 `米哈游 filetype:pdf` 可以直接搜索到有关米哈游的一些 pdf 文件。 关于更多的搜索修饰符,可以自行搜索学习。 @@ -86,14 +86,14 @@ 之所以想在这里介绍这一项,主要是想解答“为什么我的网址这么长”的问题。 **URL(Uniform Resource Locator,统一资源定位符)**,也就是出现在浏览器“网址框”中的那一长串字符。一般包含协议、域名、路径、查询字符串等信息。 -比如这个一长串 url:`https://search.bilibili.com/all?keyword=never+gonna+give+you+up&from_source=webtop_search&search_source=5` +比如这个一长串 url: `https://search.bilibili.com/all?keyword=never+gonna+give+you+up&from_source=webtop_search&search_source=5` -- `https://`表示访问资源使用的是`https://`协议,关于这个协议的具体内容我们这里不做介绍。 -- `search.bilibili.com`是域名,也即 b 站的搜索页面。 -- `/all`是路径,也即访问的资源在域名的`/all`目录下。其它情况下可能会有更复杂的路径,协议+域名+路径是最常见的 url 组成形式。 -- `?`后面的所有信息都是查询字符串,表示我们向服务器发送的请求。能表示在 url 中的请求都以`xxx=yyy`的`键值对`形式出现,并用`&`连接多个键值对。比如这里的`keyword=never+gonna+give+you+up`代表我们的搜索关键词是`never gonna give you up`。如果更改后面的内容,会发现显示在网页搜索框中的词也同步发生了变化。再后面的`from_source`键值对可能表示搜索请求来自于网站顶部的搜索框。而`search_source`可能与网站内部逻辑有关。 +- `https://` 表示访问资源使用的是 `https://` 协议,关于这个协议的具体内容我们这里不做介绍。 +- `search.bilibili.com` 是域名,也即 b 站的搜索页面。 +- `/all` 是路径,也即访问的资源在域名的 `/all` 目录下。其它情况下可能会有更复杂的路径,协议+域名+路径是最常见的 url 组成形式。 +- `?` 后面的所有信息都是查询字符串,表示我们向服务器发送的请求。能表示在 url 中的请求都以 `xxx=yyy` 的 `键值对` 形式出现,并用 `&` 连接多个键值对。比如这里的 `keyword=never+gonna+give+you+up` 代表我们的搜索关键词是 `never gonna give you up`。如果更改后面的内容,会发现显示在网页搜索框中的词也同步发生了变化。再后面的 `from_source` 键值对可能表示搜索请求来自于网站顶部的搜索框。而 `search_source` 可能与网站内部逻辑有关。 -顺带一提,b 站(可能其它视频软件也有类似的现象)网页端生成的视频分享链接后也同样带有着相同的查询请求字符串,很可能用来标记这个分享链接的生成来源。前段时间有`b站给我推送了qq群群友的账号`之类的新闻,而这种隐私泄露很可能与分享链接有关。如果有需要,可以将`?`及后面的全部内容删掉后再进行分享,只保留域名和路径就可以实现对视频等资源的正常访问。 +顺带一提,B 站(可能其它视频软件也有类似的现象)网页端生成的视频分享链接后也同样带有着相同的查询请求字符串,很可能用来标记这个分享链接的生成来源。前段时间有 `b站给我推送了qq群群友的账号` 之类的新闻,而这种隐私泄露很可能与分享链接有关。如果有需要,可以将 `?` 及后面的全部内容删掉后再进行分享,只保留域名和路径就可以实现对视频等资源的正常访问。 ### 隐私保护 @@ -101,13 +101,13 @@ 在线下店消费过后,有时店员会让你一些填写个人信息,名义上说是用于售后服务。这时记得稍微留意一下,售后服务是否真的需要自己留下的这些信息,如果不需要的话随便填写些假信息即可。比如在线下门店购买手机之类的情景下很明显不需要在门店留下自己的信息。 -社交软件以及论坛同样是隐私泄露的重灾区,除非工作需要没必要在头像、用户名等公开信息中用到任何关于自己个人隐私的信息。`设置-隐私`中一般会有关于自己个人信息可见度的设置,可以根据个人需要进行设置。需要特别注意的是,微信中的`允许陌生人查看十条朋友圈`和支付宝中的`向好友公开我的真实姓名`是默认开启的,强烈建议关闭,尤其在这两个账号都可以被手机号搜索到的情况下。(当然也可以在`添加我的方式`中把手机号等途径取消掉) +社交软件以及论坛同样是隐私泄露的重灾区,除非工作需要没必要在头像、用户名等公开信息中用到任何关于自己个人隐私的信息。`设置-隐私` 中一般会有关于自己个人信息可见度的设置,可以根据个人需要进行设置。需要特别注意的是,微信中的 `允许陌生人查看十条朋友圈` 和支付宝中的 `向好友公开我的真实姓名` 是默认开启的,强烈建议关闭,尤其在这两个账号都可以被手机号搜索到的情况下。(当然也可以在 `添加我的方式` 中把手机号等途径取消掉) 如果活跃在论坛或是公开群聊中,难免涉及到一些自己的真实情况,而如果碰上了别有用心的人,这些信息很容易被收集。~~上文介绍的高级搜索技巧很适用于这种场景!~~ 最简单的反制方式是发言时多留意一下删去敏感的内容。使用常见大众的用户名以及在不同平台使用不同用户名同样是一个好的选择,防止自己在不同平台泄露出的信息被同时收集。当然,不去引起“别有用心的人”的注意也很重要,就像《三体》里描述的“藏好自己”一样,不太张扬总是好的。 ### 简单的安全措施 -在当今的互联网世界,与安全最直接相关的无疑是自己在各个平台下设置的密码(password,更准确的说法是“口令”,但是我们在这里不区分“口令”与“密码”的区别),以及有约等于密码效力的手机验证码。除了防止自己密码被别人偷看这种事情之外,最应该做的事就是不要用弱密码,再就是尽量在不同的平台用不同的密码。诸如`qwertyuiop`,`aptx4869`,`password`及其各种变种,类似于`p@5sw0Rd`等看似很安全的密码,以及常见的日期,拼音等都位于随手就能查到的弱密码库内。密码尽可能不要带有含义,或者说最好能保证只对自己有含义。市面上存在一些密码管理工具,浏览器也开始支持生成随机强密码并与账号绑定进行管理的功能,可以考虑合理地使用这些工具。除了满足以上要求,一般建议密码长度至少 8 个字符,包含大写字母、小写字母、数字和特殊符号中的至少 3 种,有条件的可以定期更换(但是并不强求,自行衡量利弊)。 +在当今的互联网世界,与安全最直接相关的无疑是自己在各个平台下设置的密码(password,更准确的说法是“口令”,但是我们在这里不区分“口令”与“密码”的区别),以及有约等于密码效力的手机验证码。除了防止自己密码被别人偷看这种事情之外,最应该做的事就是不要用弱密码,再就是尽量在不同的平台用不同的密码。诸如 `qwertyuiop`, `aptx4869`, `password` 及其各种变种,类似于 `p@5sw0Rd` 等看似很安全的密码,以及常见的日期,拼音等都位于随手就能查到的弱密码库内。密码尽可能不要带有含义,或者说最好能保证只对自己有含义。市面上存在一些密码管理工具,浏览器也开始支持生成随机强密码并与账号绑定进行管理的功能,可以考虑合理地使用这些工具。除了满足以上要求,一般建议密码长度至少 8 个字符,包含大写字母、小写字母、数字和特殊符号中的至少 3 种,有条件的可以定期更换(但是并不强求,自行衡量利弊)。 一些网站和服务支持多因素认证(2FA),如果可能的话,请尽量开启这一功能,可以保证你在密码遭到泄露时不至于丧失对账户的控制权。 @@ -120,15 +120,15 @@ ::: details 什么是密钥登录 数学中存在一类问题,验证解的正确性很简单,但是求解问题本身却很难。一个很典型的例子是质因数分解,给你一个解,你可以很容易地验证其是否是正确的分解,但是只给你一个由两个大质数的乘积构成的合数,你很难快速得出其分解。密码学则利用这些问题构造非对称加密,如质因数分解的问题诞生了 RSA 算法,还有离散对数,椭圆函数上的运算等问题,也诞生出了相应的非对称加密算法。 -以 RSA 为例,由质数$p$和$q$乘积构成的大整数$n$是可以公开传递的,公钥$e$和私钥$d$在模$(p-1)(q-1)$上互为逆元(也就是$e\times d\ mod\ (p-1)(q-1) = 1$)。利用这个性质使得用$e$加密的信息只能用$d$解密,反之亦然。但是一旦$n$被分解,或者$q$和$p$被泄露,则已知$e$和$d$中的一个就可以很容易推出另一个,非对称加密也就失去了其意义。 +以 RSA 为例,由质数 $p$ 和 $q$ 乘积构成的大整数 $n$ 是可以公开传递的,公钥 $e$ 和私钥 $d$ 在模 $(p-1)(q-1)$ 上互为逆元(也就是 $e\times d\ mod\ (p-1)(q-1) = 1$)。利用这个性质使得用 $e$ 加密的信息只能用 $d$ 解密,反之亦然。但是一旦 $n$ 被分解,或者 $q$ 和 $p$ 被泄露,则已知 $e$ 和 $d$ 中的一个就可以很容易推出另一个,非对称加密也就失去了其意义。 密钥登录则利用了这种特点,服务器上只需要存储公钥,而私钥只在你本地存储,每次验证过程中,你用私钥加密服务器发给你的一段随机内容,服务器再用公钥进行解密。猜对你的私钥或者你加密的结果都是几乎不可能完成的,因此这种方式安全性很高(只要你的私钥不泄露)。 遗憾的是,这些非对称加密算法的安全性没有得到数学上的证明(需要先证明 P=NP 不成立,且要证明这些问题本身是 NP 问题且不是 P 问题,而 P=NP 是否成立是一个悬而未决的世纪难题),但是实践中它们已经被认为是足够安全的。随着计算机算力的提升,算法中使用的数字也越来越大,防止算法被暴力攻破。 ::: -北京大学每学期都会向邮箱中发送包含钓鱼链接的恶意邮件进行安全测试,每次都可以看到有新同学中招。另外,前段时间也有某网红被伪造的法院网站骗走个人信息的新闻传出。前文提到的“steam 山寨网站”其实也可以看作某种钓鱼链接,所以说这种恶意行为在生活中实际上极其常见。 -不相信不确定的信源、不点进陌生的网站、不下载不可信的文件是防范的最好手段。很多攻击行为不需要用户的交互就可以触发,比如打开网页的时刻相关脚本就可以在本地运行,所以说不要随便为了满足自己的好奇心而点进一些有风险的网站。另外不要忽略伪造网站中“漏出的马脚”。伪造网站往往存在错误的域名、存在偏差的界面排布、不合理的功能设置。及时发现这些不合理之处也能够即时止损。 +北京大学每学期都会向邮箱中发送包含钓鱼链接的恶意邮件进行安全测试,每次都可以看到有新同学中招。另外,前段时间也有某网红被伪造的法院网站骗走个人信息的新闻传出。前文提到的 “steam 山寨网站” 其实也可以看作某种钓鱼链接,所以说这种恶意行为在生活中实际上极其常见。 +不相信不确定的信源、不点进陌生的网站、不下载不可信的文件是防范的最好手段。很多攻击行为不需要用户的交互就可以触发,比如打开网页的时刻相关脚本就可以在本地运行,所以说不要随便为了满足自己的好奇心而点进一些有风险的网站。另外不要忽略伪造网站中 “漏出的马脚” 。伪造网站往往存在错误的域名、存在偏差的界面排布、不合理的功能设置。及时发现这些不合理之处也能够即时止损。 ![](../assets/basic/08-drive-your-computer-4/mail.png) 一则用来测试安全意识的钓鱼邮件,可以注意到发件人使用的是高仿北大邮箱域名。无论下载附件还是点进附件中的链接都是危险的行为。 @@ -141,6 +141,6 @@ 客户端和服务器都可以使用代理。客户端代理可以隐藏真实的客户端 ip 地址、过滤一些不正常的访问请求。当然也可以使用代理绕过访问过滤器。服务端的代理将访问转发给真正的服务器,这层代理可以添加缓存功能,以提高服务器相应速度;也可以进行负载均衡,将请求“均匀”地转发给多台均匀的服务器;也可以作为安全组件,阻挡一些针对于服务器的攻击。 -另一个值得介绍的概念是**虚拟专用网络(Virtual Private Network)**,~~这个词的英文简称可能有些敏感。~~ 除了连接全球的 Internet 之外,学校、公司等也会维护自己的专用网络,比如链接在北京大学校园网内部的相关资源就无法从外部进行访问。而虚拟专用网络可以在共用网络上通过加密协议建立虚拟的专用网络,也可以将虚拟网络虚拟扩展的一个或多个其他网络。最经典的应用就是让外地员工访问到内网资源,在内网中架设一台 VPN 服务器。外地员工在当地连上互联网后,通过互联网连接 VPN 服务器,然后通过 VPN 服务器进入企业内网。为了保证数据安全,VPN 服务器和客户机之间的通讯数据都进行了加密处理。 +另一个值得介绍的概念是**虚拟专用网络(Virtual Private Network)**,~~这个词的英文简称可能有些敏感。~~ 除了连接全球的 Internet 之外,学校、公司等也会维护自己的专用网络,比如链接在北京大学校园网内部的相关资源就无法从外部进行访问。而虚拟专用网络可以在共用网络上通过加密协议建立虚拟的专用网络,也可以将虚拟网络虚拟扩展的一个或多个其他网络。最经典的应用就是让外地员工访问到内网资源,在内网中架设一台 VPN 服务器。外地员工在当地连上互联网后,通过互联网连接 VPN 服务器,然后通过 VPN 服务器进入企业内网。为了保证数据安全,VPN 服务器和客户机之间的通讯数据都进行了加密处理。 最后,虽然有加密协议支持,使用代理还是意味着流量经过了客户端与服务器之外的第三者,也因此存在数据泄露的风险。使用时请多加留意。 diff --git a/basic/09-drive-your-computer-5.md b/basic/09-drive-your-computer-5.md index 134044a..e172f3f 100644 --- a/basic/09-drive-your-computer-5.md +++ b/basic/09-drive-your-computer-5.md @@ -22,12 +22,12 @@ ### 用户界面——CLI,TUI 与 GUI -目前常见的计算机操作系统有 Windows,Linux 和 macOS,移动操作系统则包括 Android 与 iOS,当然华为在近些年研发的鸿蒙系统也包括在内。 -前文提到,操作系统负责给用户和其他软件提供接口,给其他软件提供的接口的使用方法往往藏身与各种繁杂的文档中,我们对他们并没有太大的兴趣。相比之下,我们则每天都在使用操作系统为用户提供的接口。从关机到新建文件夹再到打开一大堆程序,这都是我们直接与操作系统交互进行的例子。**UI(User Interface),用户界面**,则是直接涉及到用户应该如何与操作系统(或者是其他的软件)进行交互的核心模块。 +目前常见的计算机操作系统有 Windows, Linux 和 macOS,移动操作系统则包括 Android 与 iOS,当然华为在近些年研发的鸿蒙系统也包括在内。 +前文提到,操作系统负责给用户和其他软件提供接口,给其他软件提供的接口的使用方法往往藏身与各种繁杂的文档中,我们对他们并没有太大的兴趣。相比之下,我们则每天都在使用操作系统为用户提供的接口。从关机到新建文件夹再到打开一大堆程序,这都是我们直接与操作系统交互进行的例子。**UI (User Interface),用户界面**,则是直接涉及到用户应该如何与操作系统(或者是其他的软件)进行交互的核心模块。 -目前大部分常见的 UI 都是**GUI(Graphics User Interface),图形用户界面**,显著特征为通过鼠标(以及触摸屏)等输入设备与图标或菜单选项进行交互,启动对应的程序或执行相应的命令。这种交互方式最大的优点在于直观且易于上手,学习曲线平和,鼠标交互的方式可以省去大量指令的记忆成本,同时也有不错的效率。相对应的,**CLI(Command Line Interface),命令行界面、TUI(Terminal User Interface/Text-based User Interface),终端用户界面/基于文本的用户界面**则不依赖图形而是主要依赖键盘输入大量指令,对指令的记忆成本也造成了较为陡峭的学习曲线。CLI 是早期大部分计算机的交互方式,而 TUI 可以部分视作在 CLI 的基础上进行了丰富。 +目前大部分常见的 UI 都是** GUI (Graphics User Interface),图形用户界面**,显著特征为通过鼠标(以及触摸屏)等输入设备与图标或菜单选项进行交互,启动对应的程序或执行相应的命令。这种交互方式最大的优点在于直观且易于上手,学习曲线平和,鼠标交互的方式可以省去大量指令的记忆成本,同时也有不错的效率。相对应的,**CLI (Command Line Interface,命令行界面)、TUI (Terminal User Interface/Text-based User Interface,终端用户界面/基于文本的用户界面)** 则不依赖图形而是主要依赖键盘输入大量指令,对指令的记忆成本也造成了较为陡峭的学习曲线。CLI 是早期大部分计算机的交互方式,而 TUI 可以部分视作在 CLI 的基础上进行了丰富。 -在 CLI 中,所有操作都通过在命令行中输入指令进行。相应地,系统会通过文本形式输出相应内容。CLI 与现代常见交互方式的一个主要不同是它并没有一个用来交互的“菜单”之类的东西。下面是 Wiki 上关于 CLI 条目里的一张图,可以看到用户在终端中输入了`ping`,`pwd`,`cd`,`ls`,`yum`这些常见的指令,之后计算机将这些指令的执行结果输出到了终端里。虽然输出结果中存在简单的排版与动态进度条之类的要素,但这些结果本身并不能做出“光标选中”之类的交互动作,而是仅仅作为“展示”之用。 +在 CLI 中,所有操作都通过在命令行中输入指令进行。相应地,系统会通过文本形式输出相应内容。CLI 与现代常见交互方式的一个主要不同是它并没有一个用来交互的“菜单”之类的东西。下面是 Wiki 上关于 CLI 条目里的一张图,可以看到用户在终端中输入了 `ping`, `pwd`, `cd`, `ls`, `yum` 这些常见的指令,之后计算机将这些指令的执行结果输出到了终端里。虽然输出结果中存在简单的排版与动态进度条之类的要素,但这些结果本身并不能做出“光标选中”之类的交互动作,而是仅仅作为“展示”之用。 ![](/assets/basic/09-drive-your-computer-5/Linux_command-line._Bash._GNOME_Terminal._screenshot.png) @@ -40,25 +40,25 @@ 写在前面:以下内容更加适合配合计算概论相关课程食用。 -入门的计算概论课往往会推荐 Visual Studio 或 Pycharm 作为编写代码的工具,而更进阶的课程会推荐 VSCode,再深入了解一些还会发现 Vim,Emacs 这样的工具。上面提到的这些代码工具可以大致分为两类,其中 Visual Studio 和 Pycharm 通常被称作**IDE(Integrated Development Environment,集成开发环境)**,而其他的则被称为文本编辑器。虽然说随着时代的发展这两者之间的边界已经开始模糊,但理解这两个概念还是有必要的。IDE 提供代码编辑、调试、构建、版本控制等多种功能于一体,通常集成了编译器、调试器和其他开发工具。而代码编辑器功能相对单一,通常只提供代码高亮等与代码编辑相关的功能。在 IDE 中运行代码可能只需要点击“运行”按钮,而严格来说在代码编辑器中无法运行代码,而需要在终端中手动输入编译相关的指令才能让代码“跑起来”。因此想需要使用代码编辑器需要额外配置编译器、调试器相关的环境(环境配置是一个巨大的坑,新手在这方面遇到挫折是很正常的现象,千万不要灰心),这也略微加大了使用代码编辑器的上手难度。不过代码编辑器轻量简洁的优势值得额外配置环境的工作量,Vim 可以直接在 TUI 中运行,VSCode 的体感启动速度也明显快于 Visual Studio。 +入门的计算概论课往往会推荐 Visual Studio 或 Pycharm 作为编写代码的工具,而更进阶的课程会推荐 VSCode,再深入了解一些还会发现 Vim,Emacs 这样的工具。上面提到的这些代码工具可以大致分为两类,其中 Visual Studio 和 Pycharm 通常被称作**IDE (Integrated Development Environment, 集成开发环境)**,而其他的则被称为文本编辑器。虽然说随着时代的发展这两者之间的边界已经开始模糊,但理解这两个概念还是有必要的。IDE 提供代码编辑、调试、构建、版本控制等多种功能于一体,通常集成了编译器、调试器和其他开发工具。而代码编辑器功能相对单一,通常只提供代码高亮等与代码编辑相关的功能。在 IDE 中运行代码可能只需要点击“运行”按钮,而严格来说在代码编辑器中无法运行代码,而需要在终端中手动输入编译相关的指令才能让代码“跑起来”。因此想需要使用代码编辑器需要额外配置编译器、调试器相关的环境(环境配置是一个巨大的坑,新手在这方面遇到挫折是很正常的现象,千万不要灰心),这也略微加大了使用代码编辑器的上手难度。不过代码编辑器轻量简洁的优势值得额外配置环境的工作量,Vim 可以直接在 TUI 中运行,VSCode 的体感启动速度也明显快于 Visual Studio。 代码编辑器的另一个特点是可以通过添加插件以丰富其原版略显单薄的功能。VSCode 被推荐的一个主要原因就是其可以通过添加插件的方式获得几乎对所有语言的支持。~~当然也可以添加类似 Code Runner 之类的插件将其改造成类似 IDE 的形式,很多 VSCode 的入门教程都会介绍这个插件。~~ 虽然说对于 VSCode 来说更自然的运行代码方式是在其内的终端里手动输入编译/运行相关的指令,这也更符合其“代码编辑器”的定位。 ### 什么是命令式语言 -不同的计算概论课程会分别介绍 Python 和 C/C++这两种语言(计概范围内的 C 与 C++其实可大致看成一种语言)。虽然上到设计理念下到编写细节这两种语言都有很多不同点,但其都属于命令式语言(虽然现代 C++以及 Python 都支持面向对象和函数式设计,但其主体还是属于命令式语言)。命令式语言的计算理论来自于**图灵机**,通过对**状态的改变**描述计算的过程。它们的语句主要为对状态(也就是变量内部存储的值)的改变以及对控制流的改变(也就是条件或循环的跳转语句)。因此将简单的 C++和 Python 代码互相转换并不是什么难事,因为它们描述计算所用的方式所用的方式一样。另一种常见的编程范式是函数式语言,主要例子为 Haskell。其计算理论来自于**λ演算**,通过创建匿名函数和应用函数描述计算。有和图灵机一样的描述能力。函数式语言相对来说更难理解,这里不再深入。 +不同的计算概论课程会分别介绍 Python 和 C/C++这两种语言(计概范围内的 C 与 C++ 其实可大致看成一种语言)。虽然上到设计理念下到编写细节这两种语言都有很多不同点,但其都属于命令式语言(虽然现代 C++ 以及 Python 都支持面向对象和函数式设计,但其主体还是属于命令式语言)。命令式语言的计算理论来自于**图灵机**,通过对**状态的改变**描述计算的过程。它们的语句主要为对状态(也就是变量内部存储的值)的改变以及对控制流的改变(也就是条件或循环的跳转语句)。因此将简单的 C++ 和 Python 代码互相转换并不是什么难事,因为它们描述计算所用的方式所用的方式一样。另一种常见的编程范式是函数式语言,主要例子为 Haskell。其计算理论来自于 **λ演算**,通过创建匿名函数和应用函数描述计算。有和图灵机一样的描述能力。函数式语言相对来说更难理解,这里不再深入。 ### 编译型语言与解释型语言 -C++与 Python 的一个重要区别就是代码实际运行的方式。~~另一个重要的区别是类型系统,不过这一项相对直观我们不做深入。~~ 计算机只能够运行字节形式的可执行文件,而可执行文件(中的代码部分)与编程语言最底层的汇编语言有着一一对应的关系,因此可以说计算机只能识别汇编模式的代码。 +C++ 与 Python 的一个重要区别就是代码实际运行的方式。~~另一个重要的区别是类型系统,不过这一项相对直观我们不做深入。~~ 计算机只能够运行字节形式的可执行文件,而可执行文件(中的代码部分)与编程语言最底层的汇编语言有着一一对应的关系,因此可以说计算机只能识别汇编模式的代码。 -C/C++的**编译器**做的事情实际上就是把源代码翻译成汇编代码,再经由**链接器**进行与头文件的整合相关工作,最终得到一份可以被直接运行的可执行文件。因此,C++代码的运行分为两步:先是编译再是执行。这种方式的一个主要好处就是一份需要被反复运行的代码只需要被编译一次,而节省了编译部分的耗时。编译器与链接器报的错误大部分情况下很好解决,~~小部分情况下会因为涉及到环境问题而变得棘手。~~ 编译器可以识别语法错误以及部分的语义错误,因此一份运行起来的 C++代码天然地有更小几率出现 bug。在“通过编译器减少 bug”方向上一门叫**Rust**的语言做得更加极端,其在编译器内建立了大量的语义约束,保证能被运行的 Rust 代码**一定**不会出现内存安全问题与线程安全问题,不过相应地也显著提高了 Rust 的代码编写难度。 +C/C++ 的**编译器**做的事情实际上就是把源代码翻译成汇编代码,再经由**链接器**进行与头文件的整合相关工作,最终得到一份可以被直接运行的可执行文件。因此,C++代码的运行分为两步:先是编译再是执行。这种方式的一个主要好处就是一份需要被反复运行的代码只需要被编译一次,而节省了编译部分的耗时。编译器与链接器报的错误大部分情况下很好解决,~~小部分情况下会因为涉及到环境问题而变得棘手。~~ 编译器可以识别语法错误以及部分的语义错误,因此一份运行起来的 C++ 代码天然地有更小几率出现 bug。在 “通过编译器减少 bug” 方向上一门叫 **Rust** 的语言做得更加极端,其在编译器内建立了大量的语义约束,保证能被运行的 Rust 代码**一定**不会出现内存安全问题与线程安全问题,不过相应地也显著提高了 Rust 的代码编写难度。 -而 Python 则走向了另一个极端。Python 代码运行使用的是另一套称为**解释器**的代码翻译逻辑。直观来讲,解释器允许代码一边被翻译为汇编语言一边被执行。也因此,终端里可以发现`.py`后缀名的 Python 代码文件可以被直接视为可执行文件,而`.cpp`后缀名的 C++代码文件只能被视为文本文件。解释器可以省去每次更新代码时都要将项目重新编译的时间花销,但代码的实际运行效率相比编译型语言来说更差。体感表现为 Python 代码比 C++代码慢很多,~~真的非常多!~~ 一些完全不符合语法要求的代码也可以在解释器中跑起来——解释器只会在按顺序运行代码,直到在出现问题的的地方停止。Python 自身的动态类型系统与缺少编译器带来的静态查错系统使得实际写出来的 Python 代码中经常包含大量的 bug,并除实际运行之外缺少 debug 的手段。~~但因为语言特性而引发的 bug 必然不是过于复杂的 bug,不需要在这点上过于担心。~~ Python 并不适合大型项目的开发,不过动态类型与解释器带来的灵活性使得 Python 在小型项目上拥有无可匹敌的竞争力。与 C++相比,Python 作为现代语言,拥有更为成熟的库文件机制,`import`比起`include`实在是好用了太多。大量的第三方库以及`pip`,`anaconda`等 Python 环境管理工具也是 Python 竞争力的重要来源。 +而 Python 则走向了另一个极端。Python 代码运行使用的是另一套称为**解释器**的代码翻译逻辑。直观来讲,解释器允许代码一边被翻译为汇编语言一边被执行。也因此,终端里可以发现 `.py` 后缀名的 Python 代码文件可以被直接视为可执行文件,而 `.cpp` 后缀名的 C++ 代码文件只能被视为文本文件。解释器可以省去每次更新代码时都要将项目重新编译的时间花销,但代码的实际运行效率相比编译型语言来说更差。体感表现为 Python 代码比 C++ 代码慢很多,~~真的非常多!~~ 一些完全不符合语法要求的代码也可以在解释器中跑起来——解释器只会在按顺序运行代码,直到在出现问题的的地方停止。Python 自身的动态类型系统与缺少编译器带来的静态查错系统使得实际写出来的 Python 代码中经常包含大量的 bug,并除实际运行之外缺少 debug 的手段。~~但因为语言特性而引发的 bug 必然不是过于复杂的 bug,不需要在这点上过于担心。~~ Python 并不适合大型项目的开发,不过动态类型与解释器带来的灵活性使得 Python 在小型项目上拥有无可匹敌的竞争力。与 C++ 相比,Python 作为现代语言,拥有更为成熟的库文件机制,`import` 比起 `include` 实在是好用了太多。大量的第三方库以及 `pip`, `anaconda` 等 Python 环境管理工具也是 Python 竞争力的重要来源。 ### 如何阅读报错与调试代码 -调试代码中的错误是每位写代码人都不可避免的一件事。错误可以简单地分为语法错误、语义错误与逻辑错误。其中语法错误和大部分语义错误会被编译器(为方便,以下“编译器”包含 Python 等语言中的“解释器)直接发现。而逻辑错误,也就是编写出的代码与预期不符的情况,由于代码逻辑本身所带有的复杂性,而不可避免地拥有复杂性,这种 debug(为方便,以下可能会混用`debug`与`调试`)往往需要优秀的经验、直觉、心态以及运气。 +调试代码中的错误是每位写代码人都不可避免的一件事。错误可以简单地分为语法错误、语义错误与逻辑错误。其中语法错误和大部分语义错误会被编译器(为方便,以下“编译器”包含 Python 等语言中的“解释器)直接发现。而逻辑错误,也就是编写出的代码与预期不符的情况,由于代码逻辑本身所带有的复杂性,而不可避免地拥有复杂性,这种 debug(为方便,以下可能会混用 `debug` 与 `调试`)往往需要优秀的经验、直觉、心态以及运气。 之所以在节标题中单列了如何阅读报错,就是因为语法语义错误是初学者最经常遇到的问题,而编译器会以报错信息的形式友情提示这些错误是什么、在哪里。而高级一些的代码编辑工具,还会把能被编译器检测出来的错误实时地标注在代码上面。~~这也是为什么写出来的 Python 代码往往会带有很多 bug 的原因,因为动态类型导致语法语义层面的错误无法被编译器静态检测出来,从而无法在编写代码时就获得提示。~~ 以下是一个简单的编译器报错信息例子。 @@ -82,7 +82,7 @@ C:/M/B/src/mingw-w64/mingw-w64-crt/crt/crtexewin.c:70: undefined reference to `W collect2.exe: error: ld returned 1 exit status ``` -虽然信息略显抽象,但我们还是可以看到很多有用的信息。`ld`是 c++中的链接器,再往上看可以发现对`WinMain`的引用是未定义的。这提示我们去看 main 函数,从而发现这里`main()`被输入成了`mian()`,因此链接器无法找到 main 函数,从而引发错误 +虽然信息略显抽象,但我们还是可以看到很多有用的信息。 `ld` 是 c++中的链接器,再往上看可以发现对 `WinMain` 的引用是未定义的。这提示我们去看 main 函数,从而发现这里 `main()` 被输入成了 `mian()`,因此链接器无法找到 main 函数,从而引发错误 下面是另一个例子; @@ -111,10 +111,10 @@ Traceback (most recent call last): TypeError: unsupported operand type(s) for +: 'int' and 'str' ``` -可以看到解释器对第 2 行和第 10 行进行了报错,其中最下面一行是错误实际发生的位置,而上面的则描述了函数调用,也即第 2 行的错误是在执行第 10 行中的`calc`函数时发生的。如果代码结构比较复杂或者错误实际发生的位置位于来自`import`的内部库中,则`Traceback`中可能会给出大量的函数调用记录。此时不要惊慌,找到属于自己写的代码最靠近错误位置的行数查看即可。 -回到正题,最后一行给出了错误的原因`TypeError`:Python 中的`+`运算符作用在`int`类型与`str`类型的数据之间。这提示我们去看`sum()`作用的对象,也即`numbers`列表,并进一步发现`numbers.append("60")`向`numbers`中添加了一个字符串形式的`"60"`,而`numbers`其余的元素均为整数类型的数字。将这一句改为`numbers.append(60)`,代码会正常运行。 -顺带一提,虽然这段代码翻译到 C++中根本不会被编译器通过,但 Python 的解释器还是运行代码直到遇到了具体的问题,在输出信息中可以看到第一个`print()`语句仍然被正常地执行。 +可以看到解释器对第 2 行和第 10 行进行了报错,其中最下面一行是错误实际发生的位置,而上面的则描述了函数调用,也即第 2 行的错误是在执行第 10 行中的 `calc` 函数时发生的。如果代码结构比较复杂或者错误实际发生的位置位于来自 `import` 的内部库中,则 `Traceback` 中可能会给出大量的函数调用记录。此时不要惊慌,找到属于自己写的代码最靠近错误位置的行数查看即可。 +回到正题,最后一行给出了错误的原因 `TypeError`:Python 中的 `+` 运算符作用在 `int` 类型与 `str` 类型的数据之间。这提示我们去看 `sum()` 作用的对象,也即 `numbers` 列表,并进一步发现 `numbers.append("60")` 向 `numbers` 中添加了一个字符串形式的 `"60"`,而 `numbers` 其余的元素均为整数类型的数字。将这一句改为 `numbers.append(60)`,代码会正常运行。 +顺带一提,虽然这段代码翻译到 C++中根本不会被编译器通过,但 Python 的解释器还是运行代码直到遇到了具体的问题,在输出信息中可以看到第一个 `print()` 语句仍然被正常地执行。 而关于更复杂的 debug 问题,很难给出具有代表性的例子或是在几段话内讲清楚,不过还是有一些具有普适性的建议。在这方面互联网上有很多的资料,感兴趣的同学可以去自行了解。 -debug 最重要的一件事是缩小错误出现的范围,为达成这一目的我们通常会跟踪代码的行为,直到发现代码的行为与预期不符。调试器可以提供“跟踪代码行为“的功能,而不想学习调试器使用方法的话通过`print`语句打印代码中间状态也是一个不错的选择。前文提到的模块化的设计方式在这里仍然适用。先是找到出现问题的模块,再缩小搜索范围直到找到出现问题的具体语句。 -而更棘手的情况是代码只在特定的数据上出现问题,比如 OJ 告诉你的代码出现了`Wrong Answer`或`Runtime Error`,而你却不知道导致代码出现问题的数据到底是什么。这时最应该做的是重新审视自己的预期(以及 OJ 题的题面),寻找是否遗漏了什么约束条件或关键信息。一份貌似运行正常的代码很有可能会在边界条件或复杂数据的情况下出问题,可以尝试手写一些处于边界条件之下的数据,或编写一个数据生成器来生成更复杂的数据。实在手足无措时,休息一下放空大脑也是很好的选择。实在走投无路之时,摇人求助也不是什么大不了的事情。debug 很可能会占用比编写代码更多的时间和精力,保持良好的心态才是 debug 的关键。 +debug 最重要的一件事是缩小错误出现的范围,为达成这一目的我们通常会跟踪代码的行为,直到发现代码的行为与预期不符。调试器可以提供“跟踪代码行为“的功能,而不想学习调试器使用方法的话通过 `print` 语句打印代码中间状态也是一个不错的选择。前文提到的模块化的设计方式在这里仍然适用。先是找到出现问题的模块,再缩小搜索范围直到找到出现问题的具体语句。 +而更棘手的情况是代码只在特定的数据上出现问题,比如 OJ 告诉你的代码出现了 `Wrong Answer` 或 `Runtime Error`,而你却不知道导致代码出现问题的数据到底是什么。这时最应该做的是重新审视自己的预期(以及 OJ 题的题面),寻找是否遗漏了什么约束条件或关键信息。一份貌似运行正常的代码很有可能会在边界条件或复杂数据的情况下出问题,可以尝试手写一些处于边界条件之下的数据,或编写一个数据生成器来生成更复杂的数据。实在手足无措时,休息一下放空大脑也是很好的选择。实在走投无路之时,摇人求助也不是什么大不了的事情。debug 很可能会占用比编写代码更多的时间和精力,保持良好的心态才是 debug 的关键。 diff --git a/basic/10-linux-basic-1.md b/basic/10-linux-basic-1.md index 59a8e6c..287d229 100644 --- a/basic/10-linux-basic-1.md +++ b/basic/10-linux-basic-1.md @@ -5,7 +5,7 @@ 状态:已审阅的发布版,审阅人:000lbh -注:本文的部分材料来自北京大学超算队“HPC From Scratch“课程第一讲(Linux 与命令行入门)[https://wiki.lcpu.dev/zh/hpc/from-scratch/01-linux-git-101]。 +注:本文的部分材料来自北京大学超算队“HPC From Scratch” 课程第一讲 [Linux 与命令行入门](https://wiki.lcpu.dev/zh/hpc/from-scratch/01-linux-git-101)。 ::: @@ -25,11 +25,11 @@ ## 关于资源 -我们并没有先讲怎么获得一个基于 Linux 的系统,也没有讲这到底是个什么东西。当然,不摸一摸,知道用起来舒不舒服,要了解它、安装它干啥呢?所以我们在这一讲推荐大家直接去[CLab](https://clab.pku.edu.cn/)注册一个账号,根据上面的指南在连接到虚拟机。这样,你就可以在不破坏自己的系统的情况下,体验 Linux 的魅力了。等你被 Linux 深深吸引,就可以到我们的下一讲,看看怎么自己安装一个 Linux 系统了。我们这里以`Debian`系统为例,大家在`CLab`创建云主机的时候,镜像选择`Debian 12`即可。 +我们并没有先讲怎么获得一个基于 Linux 的系统,也没有讲这到底是个什么东西。当然,不摸一摸,知道用起来舒不舒服,要了解它、安装它干啥呢?所以我们在这一讲推荐大家直接去 [CLab](https://clab.pku.edu.cn/) 注册一个账号,根据上面的指南在连接到虚拟机。这样,你就可以在不破坏自己的系统的情况下,体验 Linux 的魅力了。等你被 Linux 深深吸引,就可以到我们的下一讲,看看怎么自己安装一个 Linux 系统了。我们这里以 `Debian` 系统为例,大家在 `CLab` 创建云主机的时候,镜像选择 `Debian 12` 即可。 ## 先跑个小火车 -先来个具体的例子,跑个小火车先。连接到你的`Linux`虚拟机,依次输入: +先来个具体的例子,跑个小火车先。连接到你的 `Linux` 虚拟机,依次输入: ```bash sudo apt update @@ -37,7 +37,7 @@ sudo apt install -y sl sl ``` -就可以看到一个小火车从你的终端窗口驶过了。这个小火车是一个叫`sl`的软件,是一个玩具软件,用来~~矫正把 ls 打成 sl 的坏习惯~~展示 ASCII 艺术的。`apt`是`Debian`系操作系统的包管理器,就是帮你管理软件的,`sl`是一个很小的软件,所以安装的时候很快就安装好了。 +就可以看到一个小火车从你的终端窗口驶过了。这个小火车是一个叫 `sl` 的软件,是一个玩具软件,用来~~矫正把 ls 打成 sl 的坏习惯~~展示 ASCII 艺术的。`apt` 是 `Debian` 系操作系统的包管理器,就是帮你管理软件的,`sl` 是一个很小的软件,所以安装的时候很快就安装好了。 大家看哈,一个程序就这么跑起来了,你已经能让 Linux 系统帮你做事情了。我们来具体看看这是怎么发生的。 @@ -49,7 +49,7 @@ sl 其中,除了子命令,选项和对象都是可选的。我们就以第二个命令为例: -`apt`是你要运行的程序,`install`是子命令,`-y`是选项,`sl`是对象。很明确了是不是?那么我又怎么知道有哪些程序,这些程序又怎么用呢? +`apt` 是你要运行的程序,`install` 是子命令,`-y` 是选项,`sl` 是对象。很明确了是不是?那么我又怎么知道有哪些程序,这些程序又怎么用呢? 第一个问题可以通过搜索学到,描述你要干的事情,搜索引擎会告诉你需要什么软件,相信大家在第二讲已经学过,同时我们也会在第二讲给大家介绍一些常用的命令。 @@ -58,13 +58,13 @@ sl - `apt -h`:这是最简单的程序帮助,会列出一些常用的知识 - `man apt`:这是最详细的程序帮助,会列出所有的知识,但是可能会很长 - `tldr apt`:这个命令会给出一些使用示例,可以照着抄 - (`tldr`需要自行安装,相信你可以根据上面安装`sl`的方法举一反三) + (`tldr` 需要自行安装,相信你可以根据上面安装 `sl` 的方法举一反三) ## Linux 101 好,你现在已经知道怎么用 Linux 了,我们来介绍一下 Linux 的一些基本概念。本讲我们不会涉及到很深刻的内容,只是让大家有一个大概的印象。在后续探索中,大家会有更深入的想法。 -首先我们来想一想,你刚刚输入的命令是什么?是一个叫做`sl`的程序。程序是什么?你的终端怎么知道`sl`是什么的?小火车是怎么输出到你面前的?为了成体系地解决这些问题,计算机前辈们发挥了计算机科学中”抽象“的传家本领:只要能把这些东西抽象归纳为一个概念,就可以方便地管理所有资源。 +首先我们来想一想,你刚刚输入的命令是什么?是一个叫做 `sl` 的程序。程序是什么?你的终端怎么知道 `sl` 是什么的?小火车是怎么输出到你面前的?为了成体系地解决这些问题,计算机前辈们发挥了计算机科学中”抽象“的传家本领:只要能把这些东西抽象归纳为一个概念,就可以方便地管理所有资源。 所以,“文件”这一概念被抽象出来,Unix 认为“一切皆文件”:他们是数据的容器、可读可写,可以被操作。这样,我们就可以用同样的方法来操作文件、程序、设备等等。这时候就有更多问题了: @@ -79,18 +79,18 @@ tar 是 Linux 下常用的压缩解压缩工具,试试看怎么创建一个 ta ### 文件如何组织 -Windows 下,物理实在先于文件而存在,你可能会看到 C D E 盘等盘符,文件是放在盘符下的。但是 Linux 中,硬盘本身也是文件,所以根目录`/`,在所有文件之前存在,所有文件都由其派生。其中,文件夹是一种特殊类型的文件,其中可以包含一系列文件和文件夹的索引。 +Windows 下,物理实在先于文件而存在,你可能会看到 C D E 盘等盘符,文件是放在盘符下的。但是 Linux 中,硬盘本身也是文件,所以根目录 `/`,在所有文件之前存在,所有文件都由其派生。其中,文件夹是一种特殊类型的文件,其中可以包含一系列文件和文件夹的索引。 -通过 `cd` 命令,你可以在切换当前所在的文件夹;通过 `ls` 命令,你可以查看文件夹下面的内容(不加参数默认是查看当前文件夹)。路径有一些缩写,你可以认为它们会被自动扩展为从`/`出发的路径。`.`是当前目录,`..`是当前目录的父目录,`~`是当前用户的家目录,通常为`/home/用户名`,或者 `/root/`。 +通过 `cd` 命令,你可以在切换当前所在的文件夹;通过 `ls` 命令,你可以查看文件夹下面的内容(不加参数默认是查看当前文件夹)。路径有一些缩写,你可以认为它们会被自动扩展为从 `/` 出发的路径。`.` 是当前目录,`..` 是当前目录的父目录,`~` 是当前用户的家目录,通常为 `/home/用户名`,或者 `/root/`。 -Linux 上,文件的路径分绝对路径和相对路径两种。绝对路径指的是以`/`为开头或者将被扩展为`/`开头的,从根目录开始查找到本文件的路径,如`/home/lcpu/hello.c`,`~/hello.c`,`./hello.c`(后两种都将被扩展为`/home/lcpu/hello.c`)。相对路径指的是相对于当前所在文件夹,文件的存放位置。如果你的当前目录在 /home/lcpu/,那么 hello.c 指的就是绝对路径为 /home/lcpu/hello.c 的文件。 +Linux 上,文件的路径分绝对路径和相对路径两种。绝对路径指的是以 `/` 为开头或者将被扩展为 `/` 开头的,从根目录开始查找到本文件的路径,如 `/home/lcpu/hello.c`,`~/hello.c`,`./hello.c`(后两种都将被扩展为`/home/lcpu/hello.c`)。相对路径指的是相对于当前所在文件夹,文件的存放位置。如果你的当前目录在 `/home/lcpu/`,那么 `hello.c` 指的就是绝对路径为 `/home/lcpu/hello.c 的文件`。 -注意,为了安全性考虑,对于可执行文件,如果没有提供绝对路径,终端会在`PATH`中查找,而不会在基于相对路径当前文件夹下查找。如果当前文件夹中有`hello`需要使用`./hello`进行执行。直接执行的话,终端会因为`PATH`指定的路径中没有`hello`而报错。第四讲中讲过`PATH`在 Windows 系统中的含义,Linux 中也大同小异。 +注意,为了安全性考虑,对于可执行文件,如果没有提供绝对路径,终端会在 `PATH` 中查找,而不会在基于相对路径当前文件夹下查找。如果当前文件夹中有 `hello` 需要使用 `./hello` 进行执行。直接执行的话,终端会因为 `PATH` 指定的路径中没有 `hello` 而报错。第四讲中讲过 `PATH` 在 Windows 系统中的含义,Linux 中也大同小异。 ::: tip 试一试 -在自己机器上的`/`路径下面逛逛。 +在自己机器上的 `/` 路径下面逛逛。 -查找资料并回答:`/proc`和`/dev` 是什么?哪个文件可以获取 CPU 的核心频率? +查找资料并回答:`/proc` 和 `/dev` 是什么?哪个文件可以获取 CPU 的核心频率? 查阅 scp 和 rsync 的 manual,可以了解如何与远程主机之间进行文件传输。 @@ -110,13 +110,13 @@ root 是一个特殊用户,可以自行查阅资料了解。 例子:750,当前用户$7 = 4 + 2 + 1$,可读可行可执行;同组$5 = 4 + 1$,可读可执行不可写;其他用户$0$,没有任何权限。你可以查看 `chmod` 的帮助,了解如何改变权限。 -**所以可执行文件并不是因为这个文件本身有什么特别,而是这个文件被你赋予了可执行的性质。** 一个简单的文本文件也可以被加上可执行的权限,也可以发挥操作其他文件的作用,后文的`Shell`脚本,以及`Python`脚本,都是如此。 +**所以可执行文件并不是因为这个文件本身有什么特别,而是这个文件被你赋予了可执行的性质。** 一个简单的文本文件也可以被加上可执行的权限,也可以发挥操作其他文件的作用,后文的 `Shell` 脚本,以及 `Python` 脚本,都是如此。 ::: tip 试一试 如果你会写 Python 的话,写一个从输入读取 4 个数字,输出他们和的程序,输出结果到控制台。 -在本地跑起来这个程序之后,把`#!/usr/bin/env python3`放在脚本的第一行(这个特殊的一行叫 Shebang)。给这个脚本加上可执行的属性,然后直接运行这个文本!还记得应该如何运行一个不在 PATH 中的命令吗? +在本地跑起来这个程序之后,把 `#!/usr/bin/env python3` 放在脚本的第一行(这个特殊的一行叫 Shebang)。给这个脚本加上可执行的属性,然后直接运行这个文本!还记得应该如何运行一个不在 PATH 中的命令吗? ::: diff --git a/basic/11-linux-basic-2.md b/basic/11-linux-basic-2.md index 4aa88c1..77a1713 100644 --- a/basic/11-linux-basic-2.md +++ b/basic/11-linux-basic-2.md @@ -15,7 +15,7 @@ Linux 遵循 GNU 通用公共许可证(GPL),任何个人和机构都可以 ### Linux 安装 -我们以在 x86-64 架构的 windows 下安装 Debian 双系统为例进行介绍。 +我们以在 x86-64 架构的 Windows 下安装 Debian 双系统为例进行介绍。 #### 1. 准备工作 @@ -54,13 +54,13 @@ Linux 遵循 GNU 通用公共许可证(GPL),任何个人和机构都可以 若机器原本没有系统或不想保留原有操作系统则跳过这一步骤(操作同后文虚拟机安装时的步骤)。 -对初学者而言尽量在 windows 下预留出空闲空间后再安装系统,以免在 linux 下操作时误删分区,以下简述 windows 下预留空间的具体方法~~(若能在 linux 下完成这一步骤则可跳过)~~ +对初学者而言尽量在 Windows 下预留出空闲空间后再安装系统,以免在 Linux 下操作时误删分区,以下简述 Windows 下预留空间的具体方法~~(若能在 Linux 下完成这一步骤则可跳过)~~ -使用 windows 系统自带的“创建并格式化硬盘分区”功能可以看到你的磁盘分区情况,若没有空闲空间则可在剩余容量较多的分区右键选择“压缩卷”以获得空闲空间,linux 系统一般需求的磁盘空间不多。若剩余容量较多的分区在逻辑卷内或有其他复杂情况可以使用 diskgenius 等分区软件(正版已经够用,也可使用[图吧工具箱](https://www.tbtool.cn/)内的版本)进行处理。 +使用 Windows 系统自带的“创建并格式化硬盘分区”功能可以看到你的磁盘分区情况,若没有空闲空间则可在剩余容量较多的分区右键选择“压缩卷”以获得空闲空间,linux 系统一般需求的磁盘空间不多。若剩余容量较多的分区在逻辑卷内或有其他复杂情况可以使用 diskgenius 等分区软件(正版已经够用,也可使用[图吧工具箱](https://www.tbtool.cn/)内的版本)进行处理。 ##### d. 启动引导 -由于需要从刻录好镜像文件的 U 盘启动,需要关闭 windows 的快速启动功能。 +由于需要从刻录好镜像文件的 U 盘启动,需要关闭 Windows 的快速启动功能。 打开控制面板->硬件和声音->电源选项,找到左边的“选择电源按钮的功能”,进入这个界面。有的电脑在关机设置这里会有一个“启用快速启动”选项打勾,若有这个选项我们需要将其关闭,先点击“更改当前不可用的设置”来获取管理员权限,然后再将其取消勾选。有的机型的快速启动设置还会在 BIOS 中的 Boot 中,需要进入 BIOS 修改。 @@ -80,7 +80,7 @@ BIOS 的进入:开启电脑时出现电脑品牌图标的时候按 F2 键或 D image-20240831205502046 -在 linux 系统中 root 账户拥有最高权限,你所选择的发行版在安装时可能会要求设置 root 账户密码。如果没有这一选项可以在安装系统后在终端使用 passwd 命令设置。 +在 Linux 系统中 root 账户拥有最高权限,你所选择的发行版在安装时可能会要求设置 root 账户密码。如果没有这一选项可以在安装系统后在终端使用 `passwd` 命令设置。 若使用虚拟机或想直接安装在整个磁盘(即覆盖原有数据)可选择"使用整个磁盘",否则需选择"手动"并找到空闲空间。 @@ -98,7 +98,7 @@ BIOS 的进入:开启电脑时出现电脑品牌图标的时候按 F2 键或 D 如果有着自己的需求也可以在上一项选择“创建新分区”手动在其上建立新分区。主分区需采用 Ext4 文件系统并挂载在”/”根目录下,还需要分配空间给交换空间(swap)等,如果还想建立其他分区来挂载到其余位置可以继续操作。 -最后选择“完成分区操作并将修改写入磁盘”来结束操作并将改动写入磁盘,注意操作后会将所使用的磁盘空间格式化,装双系统时为避免 linux 系统下操作出现失误建议先在 windows 下清理出空闲空间再进行操作。 +最后选择“完成分区操作并将修改写入磁盘”来结束操作并将改动写入磁盘,注意操作后会将所使用的磁盘空间格式化,装双系统时为避免 Linux 系统下操作出现失误建议先在 Windows 下清理出空闲空间再进行操作。 image-20240831205920758 @@ -118,7 +118,7 @@ BIOS 的进入:开启电脑时出现电脑品牌图标的时候按 F2 键或 D ##### root 权限的配置 -root 用户是超级用户,拥有着 linux 系统内最高的权限,在终端内使用`su`命令即可以超级用户开启终端,root 用户的权限最高,而其他账户则可能会有以能以超级用户身份执行命令的授权(可以类比 windows 中的管理员权限),但即使是拥有授权的账户在终端输入的命令也不会以超级用户身份执行,如果需要以超级用户的身份运行则需要在此命令前加 sudo。 +root 用户是超级用户,拥有着 Linux 系统内最高的权限,在终端内使用`su`命令即可以超级用户开启终端,root 用户的权限最高,而其他账户则可能会有以能以超级用户身份执行命令的授权(可以类比 Windows 中的管理员权限),但即使是拥有授权的账户在终端输入的命令也不会以超级用户身份执行,如果需要以超级用户的身份运行则需要在此命令前加 sudo。 第一种情况,如果你所选择的发行版在安装过程中没有设置 root 密码的环节(如 Ubuntu),则新创建的用户会拥有管理员权限,一般不需要使用 root 账户,直接使用 sudo 命令即可。 @@ -155,20 +155,20 @@ cd [dirName] - `dirName`:要切换的目标目录,可以是相对路径或绝对路径。 -这个命令表示切换到目标路径。`dirName`中如果是以`/`,`~`开头则表示绝对路径,`/`表示的是根目录,如`/etc/apt`表示切换至根目录下 etc 文件夹内的 apt 文件夹内。`~`表示的是当前用户的 home 目录,即`/home/yourusername` +这个命令表示切换到目标路径。`dirName` 中如果是以 `/`, `~` 开头则表示绝对路径,`/` 表示的是根目录,如 `/etc/apt` 表示切换至根目录下 etc 文件夹内的 apt 文件夹内。`~` 表示的是当前用户的 home 目录,即 `/home/yourusername` -否则表示的是相对路径,会进入当前路径下名为 dirName 的文件夹。`..`表示当前目录位置的上一层目录。 +否则表示的是相对路径,会进入当前路径下名为 dirName 的文件夹。`..` 表示当前目录位置的上一层目录。 -特殊地,`.`表示当前目录,比如`time.txt`与`./time.txt`都可以表示当前目录下名为`time.txt`的文件。但如果文件名为`time`则会默认执行名为`time`的命令而不是文件本身,这时可以使用`./`来避免歧义。 +特殊地,`.` 表示当前目录,比如 `time.txt` 与 `./time.txt` 都可以表示当前目录下名为 `time.txt` 的文件。但如果文件名为 `time` 则会默认执行名为 `time` 的命令而不是文件本身,这时可以使用 `./` 来避免歧义。 -```plain +```shell dir [options] [Directory] [Files] ls [options] [Directory] ``` -二者都可以展示当前目录下的所有文件。`dir`在 windows 的 cmd 中也可用,不过在 linux 中不常用。`ls`在 powershell 和 linux 的终端中被广泛运用。在 linux 中`ls`命令除可用颜色区分文件类型外还可加入其他参数(也可不加任何参数)。`ls`命令还可使用通配符来显示所有满足要求的文件。 +二者都可以展示当前目录下的所有文件。`dir` 在 Windows 的 cmd 中也可用,不过在 Linux 中不常用。`ls` 在 powershell 和 Linux 的终端中被广泛运用。在 Linux 中 `ls` 命令除可用颜色区分文件类型外还可加入其他参数(也可不加任何参数)。`ls` 命令还可使用通配符来显示所有满足要求的文件。 -```plain +```shell ls -l # 以长格式显示当前目录中的文件和目录 ls -a # 显示当前目录中的所有文件和目录,包括隐藏文件 ls -lh # 以人类可读的方式显示当前目录中的文件和目录大小 @@ -189,15 +189,15 @@ mkdir [-p] dirName - `-p` 确保目录名称存在,不存在的就建一个。 -在当前目录下新建文件夹,后面的`dirName`可以是个目录下的文件夹(即`dir1/dir2`的形式表示在当前目录的 dir1 文件夹下建立它的子文件夹 dir2)。如果加入`-p`选项会一直沿着`dirName`指定的目录建立(即若不存在 dir1 则先建立 dir1 直到指定位置),不加入`-p`若目录不存在则会报错。 +在当前目录下新建文件夹,后面的 `dirName` 可以是个目录下的文件夹(即 `dir1/dir2` 的形式表示在当前目录的 dir1 文件夹下建立它的子文件夹 dir2)。如果加入 `-p` 选项会一直沿着 `dirName` 指定的目录建立(即若不存在 dir1 则先建立 dir1 直到指定位置),不加入 `-p` 若目录不存在则会报错。 -```plain +```shell touch [-acfm][-d<日期时间>][-r<参考文件或目录>][-t<日期时间>][--help][--version] [文件或目录] ``` -在当前目录下创建文件(实际使用时前面的参数经常不指定,可直接加文件名,如`touch file.txt`) +在当前目录下创建文件(实际使用时前面的参数经常不指定,可直接加文件名,如 `touch file.txt`) -```plain +```shell cp [options] source dest ``` @@ -219,7 +219,7 @@ cp [options] source dest mv [options] source dest ``` -前者表示源文件,后者表示目标文件,表示将指定源文件移动到目标文件位置。`cp`与`mv`操作的文件路径都可以是相对路径或绝对路径 +前者表示源文件,后者表示目标文件,表示将指定源文件移动到目标文件位置。`cp` 与 `mv` 操作的文件路径都可以是相对路径或绝对路径 ```plain -b: 当目标文件或目录存在时,在执行覆盖前,会为其创建一个备份。 @@ -233,7 +233,7 @@ mv [options] source dest ps [options] [--help] ``` -用于显示当前进程的状态,类似于 windows 的任务管理器。参数过多故不再一一列举,建议使用`--help`来查看具体用法。 +用于显示当前进程的状态,类似于 Windows 的任务管理器。参数过多故不再一一列举,建议使用 `--help` 来查看具体用法。 ```plain --help 查看帮助 @@ -320,28 +320,28 @@ COMMAND < file 表示将指定文件作为执行命令中的输入 COMMAND > file 表示将命令输出至指定文件而非终端 ``` -表示将命令输出至指定文件而非终端,二者可以连用,比如:`./a.out < test.in > test.out`表示将`test.in`作为程序的读入,`test.out`作为程序的输出。 +表示将命令输出至指定文件而非终端,二者可以连用,比如:`./a.out < test.in > test.out` 表示将 `test.in` 作为程序的读入,`test.out` 作为程序的输出。 -还有一些其他命令如`rm`,`cat`,`systemctl`,`grep`等也较为常用,因篇幅有限不再展开叙述。 +还有一些其他命令如 `rm`, `cat`, `systemctl`, `grep` 等也较为常用,因篇幅有限不再展开叙述。 #### 软件的安装 下述以 debian 系的软件安装为例: -1. 使用`apt`包管理器安装(推荐)安装简单,便于接收持续更新 +1. 使用 `apt` 包管理器安装(推荐)安装简单,便于接收持续更新 -```plain -sudo apt update 列出所有可更新的软件清单 -sudo apt upgrade 升级软件包 -sudo apt install 安装指定的软件包 -sudo apt remove 删除指定软件包 -sudo apt autoremove 清理不再使用的依赖和库文件 -apt list --upgradeable 列出可更新的软件包及版本信息 +```shell +sudo apt update # 列出所有可更新的软件清单 +sudo apt upgrade # 升级软件包 +sudo apt install # 安装指定的软件包 +sudo apt remove # 删除指定软件包 +sudo apt autoremove #清理不再使用的依赖和库文件 +apt list --upgradeable #列出可更新的软件包及版本信息 ``` 部分软件可能会需要自行添加源,需要按照安装指示进行操作 -2. (.deb 文件)直接使用`dpkg`安装 +2. (.deb 文件)直接使用 `dpkg` 安装 ```plain dpkg --help 显示帮助 @@ -350,7 +350,7 @@ sudo dpkg -i file.deb 安装指定的软件包 3. 软件带有安装程序 -软件带有如`.sh`文件、`.pl`文件这类的安装程序。一般可在终端加上`sudo`直接运行,若没有开始运行可能是未添加可执行权限,可通过这个命令手动添加: +软件带有如 `.sh` 文件、`.pl` 文件这类的安装程序。一般可在终端加上 `sudo` 直接运行,若没有开始运行可能是未添加可执行权限,可通过这个命令手动添加: ```plain chmod +x file.txt 给指定文件添加可执行权限 @@ -369,7 +369,7 @@ vim: 由 vi 发展出来的文本编辑器。拥有代码补全、编译及错 vi/vim 分为三种模式:命令模式(普通模式)、输入模式、命令行模式(底线命令模式) -直接在命令行输入`vi`/`vim`则会进入命令模式,以下是几个常用命令: +直接在命令行输入 `vi` / `vim` 则会进入命令模式,以下是几个常用命令: ```plain i -- 切换到输入模式,在光标当前位置开始输入文本。 @@ -395,7 +395,7 @@ Ctrl+r -- 重做上一次撤销的操作。 ``` 除了直接按 vi/vim 以外还可以通过后接文件名的方式来直接打开指定文件, -如`sudo vi /etc/apt/sources.list` +如 `sudo vi /etc/apt/sources.list` ::: info 提示 vim 提供了一个教程软件,可以通过以下命令打开: @@ -414,26 +414,26 @@ vimtutor 常用虚拟机软件: -- VMware Workstation Pro / VMware Fusion Pro : 前者支持 windows/linux 系统,后者支持 mac 系统,是最常用的虚拟机软件,各项功能齐全,性能强大。 -- Oracle VM Virtualbox : 支持 windows/mac/linux 系统,是一个免费开源的虚拟机软件~~(前最强免费虚拟机软件)~~ -- Parallels Desktop : 仅支持 mac 系统的收费虚拟机软件。 -- Hyper-V : windows 自带的虚拟机软件,性能一般。但是 Hyper-V 开启后会与很多其他虚拟化软件冲突(如各大安卓模拟器与 VMware,前期版本勾选 hyper-V 后就无法打开,即使后续版本不再完全冲突也会显著降低性能),开启方式是在"启用或关闭 Windows 功能"中勾选 Hyper-V 虚拟机平台。 +- VMware Workstation Pro / VMware Fusion Pro : 前者支持 Windows / Linux 系统,后者支持 macOS 系统,是最常用的虚拟机软件,各项功能齐全,性能强大。 +- Oracle VM Virtualbox : 支持 Windows / macOS / Linux 系统,是一个免费开源的虚拟机软件~~(前最强免费虚拟机软件)~~ +- Parallels Desktop : 仅支持 macOS 系统的收费虚拟机软件。 +- Hyper-V : Windows 自带的虚拟机软件,性能一般。但是 Hyper-V 开启后会与很多其他虚拟化软件冲突(如各大安卓模拟器与 VMware,前期版本勾选 Hyper-V 后就无法打开,即使后续版本不再完全冲突也会显著降低性能),开启方式是在"启用或关闭 Windows 功能"中勾选 Hyper-V 虚拟机平台。 -windows 下还有一些其他的软件或功能,它们并不算虚拟机但是可以完成虚拟化工作:WSL、WSA(已经宣布停止支持)、windows 沙盒(基于 Hyper-V,可以在隔离状态下运行应用程序)。 +Windows 下还有一些其他的软件或功能,它们并不算虚拟机但是可以完成虚拟化工作:WSL、WSA(已经宣布停止支持)、Windows 沙盒(基于 Hyper-V,可以在隔离状态下运行应用程序)。 -### linux,mac 下的虚拟化解决方案 +### Linux, macOS 下的虚拟化解决方案 -#### mac +#### macOS -Parallels Desktop: mac 下的首选虚拟化软件,优点是安装虚拟机非常简便快捷,设计风格与操作流程非常符合 mac 的设计习惯。由于它兼具性能强、价格贵的特点,是否使用需要你自己衡量。 +Parallels Desktop: macOS 下的首选虚拟化软件,优点是安装虚拟机非常简便快捷,设计风格与操作流程非常符合 macOS 的设计习惯。由于它兼具性能强、价格贵的特点,是否使用需要你自己衡量。 VMware Fusion Pro: 功能也十分全面,目前对个人用户免费,是不想购买 Parallels Desktop 的最优选择。 -Virtualbox: 老牌虚拟机软件,在 VMware 对个人免费之前是 mac 下最好用的免费虚拟机软件,不过现在功能更强大的 VMware Fusion Pro 免费后不太推荐。 +Virtualbox: 老牌虚拟机软件,在 VMware 对个人免费之前是 macOS 下最好用的免费虚拟机软件,不过现在功能更强大的 VMware Fusion Pro 免费后不太推荐。 -#### linux +#### Linux -VMware Workstaion Pro/Virtualbox : 一般 linux 下使用完整的虚拟机会在二者中选择其一,不过一般 linux 下很少有需求需要用到完整独立的 windows 环境,如果想要运行某些 windows 应用或者使用一部分 windows 环境可以使用下面的方法: +VMware Workstaion Pro/Virtualbox : 一般 Linux 下使用完整的虚拟机会在二者中选择其一,不过一般 Linux 下很少有需求需要用到完整独立的 Windows 环境,如果想要运行某些 Windows 应用或者使用一部分 Windows 环境可以使用下面的方法: wine : 是一个 Windows 兼容层,允许你在类 Unix 操作系统(如 Linux)上运行 Windows 应用程序,而无需安装双系统或虚拟机。 @@ -447,15 +447,15 @@ WSL,全称为适用于 Linux 的 Windows 子系统 (Windows Subsystem on Linux #### WSL 的安装 -首先打开"启用或关闭 Windows 功能"(可以在开始菜单搜索到这个程序),勾选"`适用于Linux的Windows子系统`"与"`虚拟机平台`"这两项,然后重新启动。 +首先打开"启用或关闭 Windows 功能"(可以在开始菜单搜索到这个程序),勾选"`适用于 Linux 的 Windows 子系统`"与"`虚拟机平台`"这两项,然后重新启动。 Windows 功能 -(有的电脑没有"`虚拟机平台`"的选项,这时应勾选`Virtual Machine Platform`) +(有的电脑没有"`虚拟机平台`"的选项,这时应勾选 `Virtual Machine Platform`) image-20240901105227418 -注意"`虚拟机平台`"一项实际上就是 Hyper-V,勾选后会导致其余虚拟化软件性能下降。如果不勾选这一选项也可以安装 WSL,但是只能使用 WSL1,具体的区别会在后续说明。 +注意 "`虚拟机平台`" 一项实际上就是 Hyper-V,勾选后会导致其余虚拟化软件性能下降。如果不勾选这一选项也可以安装 WSL,但是只能使用 WSL1,具体的区别会在后续说明。 其中一种安装方法是微软在 WSL 的官方说明中所写的,这种方法会默认安装 Ubuntu 发行版,可以自行阅读档案,这里讲解另一种方法: @@ -465,7 +465,7 @@ WSL,全称为适用于 Linux 的 Windows 子系统 (Windows Subsystem on Linux #### WSL 的版本与配置 -与正常的 linux 发行版相同,WSL 也需要设置 root 账户密码/更换源等操作,方法如上所述。 +与正常的 Linux 发行版相同,WSL 也需要设置 root 账户密码/更换源等操作,方法如上所述。 WSL 有两个版本:WSL1 与 WSL2,功能有着细微差别,各有优缺: @@ -473,7 +473,7 @@ WSL 有两个版本:WSL1 与 WSL2,功能有着细微差别,各有优缺: WSL1 是一个轻量级的 Linux 兼容性层,它会将 Linux 系统调用转换为 Windows NT 内核调用来实现 Linux 应用程序的运行,但不支持完整的 Linux 内核功能。 -相比 WSL2 也有着其优势:首先 WSL1 不需要开启 hyper-V(即选项"`虚拟机平台`"或"`Virtual Machine Platform`"),可以与其他虚拟机软件一同使用。第二点在于 WSL1 由于实际上调用还是 Windows 的内核,所以资源的调用速度与 Windows 上的相差不大,不会因为文件存放的位置影响调用。 +相比 WSL2 也有着其优势:首先 WSL1 不需要开启 hyper-V(即选项 "`虚拟机平台`" 或 "`Virtual Machine Platform`"),可以与其他虚拟机软件一同使用。第二点在于 WSL1 由于实际上调用还是 Windows 的内核,所以资源的调用速度与 Windows 上的相差不大,不会因为文件存放的位置影响调用。 WSL1 在不使用远程桌面连接形成图形化界面的情况下相当于一个 Linux 命令行,如果运行的代码不需要 Linux 内核的情况下没有必要使用 WSL2,WSL1 就已经足够(大部分情况下没有使用 WSL2 的必要)。 @@ -481,15 +481,15 @@ WSL1 在不使用远程桌面连接形成图形化界面的情况下相当于一 WSL2 使用真正的 Linux 内核,并且支持 Docker 等其他高级功能。 -除去完整 linux 内核的优势外,相比 WSL1,WSL2 有着完全的系统调用兼容性,一些 linux 的软件在运行后可以直接在 windows 中以图形化界面的形式打开,还能在安装后直接显示在 windows 的开始菜单上,从开始菜单就可以直接启动 WSL 中的软件。 +除去完整 Linux 内核的优势外,相比 WSL1,WSL2 有着完全的系统调用兼容性,一些 Linux 的软件在运行后可以直接在 Windows 中以图形化界面的形式打开,还能在安装后直接显示在 Windows 的开始菜单上,从开始菜单就可以直接启动 WSL 中的软件。 -但是 WSL2 也有缺点,除去 Hyper-V 开启导致其他虚拟化软件的性能下降问题外,WSL2 虽然由于拥有完整 linux 内核所以 linux 文件系统性能得到了提升,但是 linux 文件系统外的文件(即挂载到`/mnt`目录中的文件)需要将指令传给 windows 系统再传回 linux 系统,这一过程极为缓慢,同理 WSL2 中 windows 系统读取 linux 文件的速度也非常缓慢。如果文件必须存储在 windows 系统中或文件需要在 windows 与 linux 系统间交叉编译等情况还是选择 WSL1 更优。 +但是 WSL2 也有缺点,除去 Hyper-V 开启导致其他虚拟化软件的性能下降问题外,WSL2 虽然由于拥有完整 Linux 内核所以 Linux 文件系统性能得到了提升,但是 Linux 文件系统外的文件(即挂载到 `/mnt` 目录中的文件)需要将指令传给 Windows 系统再传回 Linux 系统,这一过程极为缓慢,同理 WSL2 中 Windows 系统读取 Linux 文件的速度也非常缓慢。如果文件必须存储在 Windows 系统中或文件需要在 Windows 与 Linux 系统间交叉编译等情况还是选择 WSL1 更优。 ##### WSL 的命令 -(均为在 windows 下的终端进行操作) +(均为在 Windows 下的终端进行操作) -```plain +```shell wsl -l -v ``` @@ -497,60 +497,60 @@ wsl -l -v image-20240901112412132 -如图,NAME 表示 linux 系统名,VERSION 表示使用的是 WSL1 或 2,STATE 表示当前是否在运行 +如图,NAME 表示 Linux 系统名,VERSION 表示使用的是 WSL1 或 2,STATE 表示当前是否在运行 -```plain +```shell wsl --shutdown ``` 这个命令会关闭所有正在运行的 WSL 发行版与 WSL2 虚拟机 -```plain +```shell wsl --set-version ``` -这个命令可以转换指定 linux 系统的 WSL 版本(需要关机状态下) +这个命令可以转换指定 Linux 系统的 WSL 版本(需要关机状态下) -```plain +```shell wsl --set-default ``` -这个命令是设置默认启动的发行版,因为你可以选择安装多个 linux 发行版 -(甚至可以 WSL1,2 各留一个应对不同情况) +这个命令是设置默认启动的发行版,因为你可以选择安装多个 Linux 发行版 +(甚至可以 WSL1, 2 各留一个应对不同情况) 后续的几个命令一般连用,可以将原本放在 C 盘指定位置的 WSL 文件导出到其他盘。 -```plain +```shell wsl --export ``` 将指定分发版的快照导出为新的分发文件,默认为 tar 格式。FileName 可以带有路径来以放在其他盘,如 -```plain +```shell wsl --export Ubuntu D:\WSL\Ubuntu.tar ``` -```plain +```shell wsl --unregister ``` 从 WSL 取消注册该发行版(相当于卸载该发行版)。子系统内部的所有数据、设置和软件将永久丢失,从 Store 重新安装会安装分发版的干净副本。如果想要保留数据,未经过导出操作不要使用这个命令。 -```plain +```shell wsl --unregister Ubuntu ``` -```plain +```shell wsl --import ``` 导入指定的 tar 文件作为新的分发版(可在后面添加--version 1/2 表示 WSL 的版本号)。如果用于改变 WSL 的安装位置,则 FileName 与先前所填的相同,InstallLocation 填写新的 WSL 安装目录,如: -```plain +```shell wsl --import Ubuntu D:\WSL\Ubuntu D:\WSL\Ubuntu.tar --version 2 ``` -### windows 下虚拟机的安装 +### Windows 下虚拟机的安装 #### 1. 准备工作 @@ -560,7 +560,7 @@ wsl --import Ubuntu D:\WSL\Ubuntu D:\WSL\Ubuntu.tar --version 2 最新版 Vmware Workstation 17 已对个人用户免费,有条件可直接前往 VMware 官网下载,或自行寻找可信的国内源下载。(注意软件名称为 VMware Workstation Pro) 在安装完成后激活时选择“将 VMware Workstation 17 用于个人用途”即可免费完成激活。 -3. 需要进入 BIOS 开启虚拟化功能,有关该功能的选项一般在 BIOS 中的`Configuration`选项中。若是 Intel 的 CPU 则名为`VT-x` (或写为`Intel Virtualization Technology`),若是 AMD 的 CPU 则是`AMD-V`,将其改为`Enable`即可开启。 +3. 需要进入 BIOS 开启虚拟化功能,有关该功能的选项一般在 BIOS 中的 `Configuration` 选项中。若是 Intel 的 CPU 则名为 `VT-x` (或写为 `Intel Virtualization Technology`),若是 AMD 的 CPU 则是 `AMD-V`,将其改为 `Enable` 即可开启。 #### 2. 安装过程 @@ -602,7 +602,7 @@ wsl --import Ubuntu D:\WSL\Ubuntu D:\WSL\Ubuntu.tar --version 2 image-20240901002603682 -给虚拟机分配内存也是同理,不要超过主机内存的一半,如果是 linux 等对内存需求不高的 4GB 也够用,Windows 可能会需要 8GB 及以上,内存和核心分配的具体数值可以等安装虚拟机后使用软件查看利用情况后再另行调整。 +给虚拟机分配内存也是同理,不要超过主机内存的一半,如果是 Linux 等对内存需求不高的 4GB 也够用,Windows 可能会需要 8GB 及以上,内存和核心分配的具体数值可以等安装虚拟机后使用软件查看利用情况后再另行调整。 image-20240901002654446 @@ -638,7 +638,7 @@ I/O 控制器类型与磁盘类型也可直接采用推荐选项。 image-20240901003803015 -当 CD/DVD 一栏显示正在使用……(你的 ISO 文件路径)的时候即可启动虚拟机,然后与正常 linux 系统的安装方法相同直到进入桌面。 +当 CD/DVD 一栏显示正在使用……(你的 ISO 文件路径)的时候即可启动虚拟机,然后与正常 Linux 系统的安装方法相同直到进入桌面。 原本的"移除安装介质"(即拔掉 U 盘)的环节,可以右键 VMware 窗口右下角的光驱图标并选择"断开连接"来达到相同效果,原本的断网操作也可以右键网络图标并断开连接,等到安装完成后再右键连接。 @@ -656,11 +656,11 @@ I/O 控制器类型与磁盘类型也可直接采用推荐选项。 image-20240901102849649 -然后你的虚拟机系统内就会以光驱的形式挂载 VMware Tools 的安装镜像(如果安装的是非 linux 虚拟机可以直接按步骤操作不在赘述,这里拿 debian 演示 linux 下的安装方式),打开这个光驱,找到 VMware tools 的压缩文件(即`VMwareTools-版本号.tar.gz`格式的文件) +然后你的虚拟机系统内就会以光驱的形式挂载 VMware Tools 的安装镜像(如果安装的是非 Linux 虚拟机可以直接按步骤操作不在赘述,这里拿 debian 演示 Linux 下的安装方式),打开这个光驱,找到 VMware tools 的压缩文件(即 `VMwareTools-版本号.tar.gz` 格式的文件) image-20240901103304129 -在空白位置右键选择在终端中打开(如无图形界面可用命令行打开目录`/media/cdrom0`)。在下一步操作前要保证当前账户拥有`sudo`权限。 +在空白位置右键选择在终端中打开(如无图形界面可用命令行打开目录 `/media/cdrom0`)。在下一步操作前要保证当前账户拥有 `sudo` 权限。 image-20240901103513942 @@ -668,7 +668,7 @@ I/O 控制器类型与磁盘类型也可直接采用推荐选项。 image-20240901104405772 -然后进入解压出来的文件夹(`./vmware-tools-distrib`),用**sudo(管理员权限)**运行`vmware-install.pl`文件 +然后进入解压出来的文件夹(`./vmware-tools-distrib`),用**sudo(管理员权限)**运行 `vmware-install.pl` 文件 image-20240901104554049 @@ -682,7 +682,7 @@ I/O 控制器类型与磁盘类型也可直接采用推荐选项。 image-20240901003411492 -或者也可以采取共享文件夹的方法,为保护主机数据建议将主机路径设置到一个独立的空文件夹内或开启只读。共享文件夹一般挂载到'`/mnt/hgfs/`'下。 +或者也可以采取共享文件夹的方法,为保护主机数据建议将主机路径设置到一个独立的空文件夹内或开启只读。共享文件夹一般挂载到 `/mnt/hgfs/` 下。 image-20240901003446957 @@ -692,7 +692,7 @@ I/O 控制器类型与磁盘类型也可直接采用推荐选项。 image-20240901114423930 -还有 USB 的接入功能,这个功能允许直接将连在主机上的设备直接接入虚拟系统。如图,在虚拟机->可移动设备中可以找到能直接接入虚拟机的设备,若选择"连接"则会将该设备断开与主机的连接并直接接入虚拟机(比如正常模式下的键盘默认按`ctrl+alt`会将焦点移出虚拟机,无法按出 linux 的终端快捷键`ctrl+alt+T`,而直接连接后则可以正常使用该快捷键),常用的直接连接的设备如键盘、鼠标、移动硬盘等。 +还有 USB 的接入功能,这个功能允许直接将连在主机上的设备直接接入虚拟系统。如图,在虚拟机->可移动设备中可以找到能直接接入虚拟机的设备,若选择"连接"则会将该设备断开与主机的连接并直接接入虚拟机(比如正常模式下的键盘默认按 `ctrl+alt` 会将焦点移出虚拟机,无法按出 Linux 的终端快捷键 `ctrl+alt+T`,而直接连接后则可以正常使用该快捷键),常用的直接连接的设备如键盘、鼠标、移动硬盘等。 image-20240901114741910 @@ -708,13 +708,13 @@ SSH 的软件架构是服务器-客户端模式(Server-Client)。在这个 #### SSH 的安装 -若你所使用的 linux 发行版使用`apt`包管理器,可通过以下命令安装: +若你所使用的 Linux 发行版使用 `apt` 包管理器,可通过以下命令安装: ```plain sudo apt install openssh-client openssh-server ``` -若使用的是`yum`包管理器,则是 +若使用的是 `yum` 包管理器,则是 ```plain sudo yum -y install openssh-clients openssh-server @@ -724,18 +724,18 @@ sudo yum -y install openssh-clients openssh-server #### 如何查看 IP -在 windows 中只需要在命令提示符中输入`ipconfig`即可查看自己的 IP +在 Windows 中只需要在命令提示符中输入 `ipconfig` 即可查看自己的 IP -在 linux 系统中有多种方式查看 IP,除了使用图形化界面外还可使用`ifconfig`和`ip`等命令 +在 Linux 系统中有多种方式查看 IP,除了使用图形化界面外还可使用 `ifconfig` 和 `ip` 等命令 -ifconfig: 使用方式为在终端输入`ifconfig`或`sudo ifconfig` -在某些 linux 发行版中没有`ifconfig`命令,可以使用`sudo apt install net-tools`安装 +ifconfig: 使用方式为在终端输入 `ifconfig` 或 `sudo ifconfig` +在某些 Linux 发行版中没有 `ifconfig` 命令,可以使用 `sudo apt install net-tools` 安装 -ip: 使用方式为在终端输入`ip addr` +ip: 使用方式为在终端输入 `ip addr` image-20240901190226341 -如图的红框内即为 IPv4 地址(第一个的 127.0.0.1 为本机地址),同理`inet6`项对应的即为 IPv6 地址 +如图的红框内即为 IPv4 地址(第一个的 127.0.0.1 为本机地址),同理 `inet6` 项对应的即为 IPv6 地址 #### SSH 的用法 @@ -754,13 +754,13 @@ ssh username@hostname ssh -l username hostname ``` -ssh 除了使用`-l`参数指定用户名外还可以使用`-p`指定端口(默认连接 22 端口) +ssh 除了使用 `-l` 参数指定用户名外还可以使用 `-p` 指定端口(默认连接 22 端口) ```plain ssh username@hostname -p 22 ``` -以使用 ssh 从 windows 系统(作为客户端)连接至刚安装好的 debian 虚拟机(作为服务端)为例,主机名与用户名与安装过程中所设的相同(若忘记可查看 linux 系统中终端) +以使用 ssh 从 Windows 系统(作为客户端)连接至刚安装好的 debian 虚拟机(作为服务端)为例,主机名与用户名与安装过程中所设的相同(若忘记可查看 Linux 系统中终端) 第一次连接会出现这样的提示: @@ -772,13 +772,13 @@ Are you sure you want to continue connecting (yes/no)? 这段文字告诉用户,这台服务器的指纹是陌生的,让用户选择是否要继续连接。选择 yes 即可与该服务器建立连接,输入需要登录的账户的密码后即可登录远程服务器的 shell。 -使用这个语句可以在 SSH 登录成功后立刻执行接下来的命令。但是若该命令需要互动式的 shell 环境则会报错。可以加入`-t`参数来解决这个问题 +使用这个语句可以在 SSH 登录成功后立刻执行接下来的命令。但是若该命令需要互动式的 shell 环境则会报错。可以加入 `-t` 参数来解决这个问题 ```plain ssh [-t] username@hostname COMMAND ``` -若是用来连接主机,`hostname`也可换为 IP 地址 +若是用来连接主机,`hostname` 也可换为 IP 地址 ### scp/sftp @@ -792,15 +792,15 @@ scp 的操作与 cp 类似,但是可以 scp source destination ``` -其中`source`与`destination`都可以是本地目录或远程目录。本地目录与正常调用目录相同,绝对路径和相对路径都可以。而远程目录则类比 linux 终端中的使用方式,为`username@hostname:path`的形式(可以打开终端看一眼显示的字符就理解了)。 +其中 `source` 与 `destination` 都可以是本地目录或远程目录。本地目录与正常调用目录相同,绝对路径和相对路径都可以。而远程目录则类比 Linux 终端中的使用方式,为 `username@hostname:path` 的形式(可以打开终端看一眼显示的字符就理解了)。 image-20240901194111878 -如图即为将 windows 系统下的文件传送至虚拟机下的示例,同理也可将远程系统的文件传送至本机或是在多个远程系统间进行复制。 +如图即为将 Windows 系统下的文件传送至虚拟机下的示例,同理也可将远程系统的文件传送至本机或是在多个远程系统间进行复制。 -同理 ssh 操作,scp 也可以指定端口,但需要的参数是`-P`(大写)。若是传送目录可以添加`-r`表示以递归方式复制目录。 +同理 ssh 操作,scp 也可以指定端口,但需要的参数是 `-P`(大写)。若是传送目录可以添加 `-r` 表示以递归方式复制目录。 -注意到冒号被用于分隔远端服务器和路径,如果要操作含有冒号的本地文件(没错,冒号在大多数 Linux 文件系统中是合法字符),可以在前面加上`./`进行区分,或者写绝对路径,这样就不会报错了 +注意到冒号被用于分隔远端服务器和路径,如果要操作含有冒号的本地文件(没错,冒号在大多数 Linux 文件系统中是合法字符),可以在前面加上 `./` 进行区分,或者写绝对路径,这样就不会报错了 #### sftp @@ -812,22 +812,22 @@ sftp username@hostname image-20240901194931485 -如图,出现`sftp>`这个提示符就表示连接成功了 +如图,出现 `sftp>` 这个提示符就表示连接成功了 -用法同 FTP,支持的命令大致与 linux 的终端操作相同,注意`put`与`get`的使用。 +用法同 FTP,支持的命令大致与 Linux 的终端操作相同,注意 `put` 与 `get` 的使用。 -```plain -ls [directory] : 列出一个远程目录的内容。如果没有指定目标目录,则默认列出当前目录。 -cd directory : 从当前目录改到指定目录。 -mkdir directory : 创建一个远程目录。 -rmdir path : 删除一个远程目录。 -put localfile [remotefile] : 本地文件传输到远程主机。 -get remotefile [localfile] : 远程文件传输到本地。 -help : 显示帮助信息。 -bye / quit / exit : 退出 sftp。 +```shell +ls [directory] # 列出一个远程目录的内容。如果没有指定目标目录,则默认列出当前目录。 +cd directory # 从当前目录改到指定目录。 +mkdir directory # 创建一个远程目录。 +rmdir path # 删除一个远程目录。 +put localfile [remotefile] # 本地文件传输到远程主机。 +get remotefile [localfile] # 远程文件传输到本地。 +help # 显示帮助信息。 +bye / quit / exit # 退出 sftp。 ``` -sftp 内默认连接至远程主机主目录(即`~`),且远程主机的路径无法识别`~` +sftp 内默认连接至远程主机主目录(即 `~`),且远程主机的路径无法识别 `~` 下图是一个使用 sftp 传送文件的示例 @@ -853,7 +853,7 @@ SSH 默认采用密码登录,有着不安全且麻烦的缺点。密钥登录 #### 生成密钥 -使用`ssh-keygen`程序,直接在终端输入`ssh-keygen`即可生成密钥,如下是一次生成密钥的过程。 +使用 `ssh-keygen` 程序,直接在终端输入 `ssh-keygen` 即可生成密钥,如下是一次生成密钥的过程。 ```plain lsz@debian:~$ ssh-keygen @@ -868,7 +868,7 @@ The key fingerprint is: SHA256:pIgUUsvjS+NgxWpVDBILelQKOWp/jTzr1xEOVWxjN/c lsz@debian ``` -第一个问题询问的是生成的密钥(私钥)保存的文件位置及文件名,linux 下默认是`~/.ssh/id_rsa`这个文件,对应的公钥文件为`~/.ssh/id_rsa.pub`(若采取不同的加密算法则文件名会有所区别) +第一个问题询问的是生成的密钥(私钥)保存的文件位置及文件名,linux 下默认是 `~/.ssh/id_rsa` 这个文件,对应的公钥文件为 `~/.ssh/id_rsa.pub`(若采取不同的加密算法则文件名会有所区别) 第二个问题询问的是是否为私钥设置密码保护(passphrase) @@ -879,37 +879,37 @@ chmod 600 ~/.ssh/id_rsa chmod 600 ~/.ssh/id_rsa.pub ``` -`ssh-keygen`还有着很多参数,如`-t dsa`表示以 dsa 算法进行加密。 +`ssh-keygen` 还有着很多参数,如 `-t dsa` 表示以 dsa 算法进行加密。 #### 上传公钥 -用户公钥保存在服务器`~/.ssh/authorized_keys`文件,将公钥手动添加进去即可完成上传服务器的过程。 +用户公钥保存在服务器 `~/.ssh/authorized_keys` 文件,将公钥手动添加进去即可完成上传服务器的过程。 -若 SSH 服务器拒绝读取该文件可能是权限设置不对,可以使用`chmod 644 ~/.ssh/authorized_keys`将权限改为只有文件所有者可写。 +若 SSH 服务器拒绝读取该文件可能是权限设置不对,可以使用 `chmod 644 ~/.ssh/authorized_keys` 将权限改为只有文件所有者可写。 ::: danger 警告 -不要乱改`~`目录权限!否则由于 sshd 会拒绝权限设置为其他用户可更改的`authorized_keys`文件,你有可能因此永远失去 ssh 访问权限! +不要乱改 `~` 目录权限!否则由于 sshd 会拒绝权限设置为其他用户可更改的 `authorized_keys` 文件,你有可能因此永远失去 ssh 访问权限! ::: -可以使用如下格式上传(`user`与`host`填写用户名与主机名,第一个文件位置对应着刚生成的公钥位置) +可以使用如下格式上传(`user` 与 `host` 填写用户名与主机名,第一个文件位置对应着刚生成的公钥位置) -```plain +```shell cat ~/.ssh/id_rsa.pub | ssh user@host "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys" ``` -或使用`ssh-copy-id`命令自动上传公钥。 +或使用 `ssh-copy-id` 命令自动上传公钥。 -windows 下可以使用 PuTTY,也可以使用后续介绍的 VSCode +Windows 下可以使用 PuTTY,也可以使用后续介绍的 VSCode ### VSCode 的相关插件 #### 使用 WSL 扩展连接到 WSL 子系统 -首先使用 VSCode 下载并安装扩展"WSL",然后选择左侧边栏的"远程资源管理器",展开"WSL 目标",找到你的 linux 发行版并点击右边的右箭头"在当前窗口中连接"。 +首先使用 VSCode 下载并安装扩展"WSL",然后选择左侧边栏的"远程资源管理器",展开"WSL 目标",找到你的 Linux 发行版并点击右边的右箭头"在当前窗口中连接"。 image-20240901210637302 -然后即可连接至 WSL,VSCode 的打开文件夹将直接打开到 linux 子系统对应的文件夹(若文件在 windows 文件系统上则会被挂载至`/mnt/盘符/...`中调用),终端也会直接调用子系统的终端 +然后即可连接至 WSL,VSCode 的打开文件夹将直接打开到 Linux 子系统对应的文件夹(若文件在 Windows 文件系统上则会被挂载至 `/mnt/盘符/...` 中调用),终端也会直接调用子系统的终端 #### 使用 Remote-SSH 扩展进行 SSH 连接 @@ -936,7 +936,7 @@ Host 保存 config 文件后按"远程(隧道/SSH)"右边的刷新按钮。 -然后按下`F1`或`Ctrl+Shift+P`键,输入`ssh connect`,选择"将当前窗口连接到主机"。并选择刚创建好的配置并按照要求登录。初次登录可能会占用时间设置服务器,最后若右下角可以显示 SSH 的目标主机表示设置成功。 +然后按下 `F1` 或 `Ctrl+Shift+P` 键,输入 `ssh connect`,选择"将当前窗口连接到主机"。并选择刚创建好的配置并按照要求登录。初次登录可能会占用时间设置服务器,最后若右下角可以显示 SSH 的目标主机表示设置成功。 image-20240901211038298 @@ -952,11 +952,11 @@ Host ... IdentityFile ``` -其中``即为存放私钥的路径。 +其中 `` 即为存放私钥的路径。 ## 结尾 -本文主要由@lsz 编写,非常感谢@decmofofs 提供的第三部分的大纲及全文的修改建议,联系方式: +本文主要由 @lsz 编写,非常感谢 @decmofofs 提供的第三部分的大纲及全文的修改建议,联系方式: - aililsz2005@outlook.com [github 主页](https://github.com/LSZ2005) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9229e37..e0e1f96 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -310,46 +310,55 @@ packages: resolution: {integrity: sha512-KRSFHyE/RdxQ1CSeOIBVIAxStFC/hnBgVcaiCkQaVC+EYDtTe4X7z5tBkFyRoBgUGtB6Xg6t9t2kulnX6wJc6A==} cpu: [arm] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm-musleabihf@4.24.3': resolution: {integrity: sha512-h6Q8MT+e05zP5BxEKz0vi0DhthLdrNEnspdLzkoFqGwnmOzakEHSlXfVyA4HJ322QtFy7biUAVFPvIDEDQa6rw==} cpu: [arm] os: [linux] + libc: [musl] '@rollup/rollup-linux-arm64-gnu@4.24.3': resolution: {integrity: sha512-fKElSyXhXIJ9pqiYRqisfirIo2Z5pTTve5K438URf08fsypXrEkVmShkSfM8GJ1aUyvjakT+fn2W7Czlpd/0FQ==} cpu: [arm64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm64-musl@4.24.3': resolution: {integrity: sha512-YlddZSUk8G0px9/+V9PVilVDC6ydMz7WquxozToozSnfFK6wa6ne1ATUjUvjin09jp34p84milxlY5ikueoenw==} cpu: [arm64] os: [linux] + libc: [musl] '@rollup/rollup-linux-powerpc64le-gnu@4.24.3': resolution: {integrity: sha512-yNaWw+GAO8JjVx3s3cMeG5Esz1cKVzz8PkTJSfYzE5u7A+NvGmbVFEHP+BikTIyYWuz0+DX9kaA3pH9Sqxp69g==} cpu: [ppc64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-riscv64-gnu@4.24.3': resolution: {integrity: sha512-lWKNQfsbpv14ZCtM/HkjCTm4oWTKTfxPmr7iPfp3AHSqyoTz5AgLemYkWLwOBWc+XxBbrU9SCokZP0WlBZM9lA==} cpu: [riscv64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-s390x-gnu@4.24.3': resolution: {integrity: sha512-HoojGXTC2CgCcq0Woc/dn12wQUlkNyfH0I1ABK4Ni9YXyFQa86Fkt2Q0nqgLfbhkyfQ6003i3qQk9pLh/SpAYw==} cpu: [s390x] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-gnu@4.24.3': resolution: {integrity: sha512-mnEOh4iE4USSccBOtcrjF5nj+5/zm6NcNhbSEfR3Ot0pxBwvEn5QVUXcuOwwPkapDtGZ6pT02xLoPaNv06w7KQ==} cpu: [x64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-musl@4.24.3': resolution: {integrity: sha512-rMTzawBPimBQkG9NKpNHvquIUTQPzrnPxPbCY1Xt+mFkW7pshvyIS5kYgcf74goxXOQk0CP3EoOC1zcEezKXhw==} cpu: [x64] os: [linux] + libc: [musl] '@rollup/rollup-win32-arm64-msvc@4.24.3': resolution: {integrity: sha512-2lg1CE305xNvnH3SyiKwPVsTVLCg4TmNCF1z7PSHX2uZY2VbUpdkgAllVoISD7JO7zu+YynpWNSKAtOrX3AiuA==}