From 23179379f9a17587d62d3b9c4c7fac2209db3619 Mon Sep 17 00:00:00 2001 From: Bohai Li Date: Wed, 30 Oct 2024 23:25:49 +0800 Subject: [PATCH] revert: zhlint style This reverts commit 184edb5599a00b6d42813349a1650cfea56adb00. --- basic/01-introduction.md | 6 +- basic/02-searching-and-question.md | 78 ++--- basic/03-computer-basic-knowledge-1.md | 186 +++++------ basic/04-computer-basic-knowledge-2.md | 64 ++-- basic/05-drive-your-computer-1.md | 426 ++++++++++++------------ basic/06-drive-your-computer-2.md | 104 +++--- basic/07-drive-your-computer-3.md | 80 ++--- basic/08-drive-your-computer-4.md | 102 +++--- basic/09-drive-your-computer-5.md | 52 +-- basic/10-linux-basic-1.md | 42 +-- basic/11-linux-basic-2.md | 444 ++++++++++++------------- 11 files changed, 792 insertions(+), 792 deletions(-) diff --git a/basic/01-introduction.md b/basic/01-introduction.md index 88da346..6d5b390 100644 --- a/basic/01-introduction.md +++ b/basic/01-introduction.md @@ -15,7 +15,7 @@ 当然,事情总是在逐渐变好的。热心学长们编写了各环境下配置教程,信科也在新生教育阶段开设了计算机基础课,一定程度上弥补了这一缺失。 -但我们仍然注意到,这样的 “补丁” 是零散的,有的不够系统全面,有的毫无针对性。同时,即使是有一定基础的同学,也会在学习技术的过程中遇到不同的问题,而这些知识往往在**课程中并不会涉及**。 +但我们仍然注意到,这样的“补丁”是零散的,有的不够系统全面,有的毫无针对性。同时,即使是有一定基础的同学,也会在学习技术的过程中遇到不同的问题,而这些知识往往在**课程中并不会涉及**。 受到 [The Missing Semester of Your CS Education](https://missing.csail.mit.edu/) 的启发,我们决定启动 LCPU Getting Started 系列教程的建设,希望能够将这部分内容更加系统地整理好,以便于同学们更好地学习与使用。 @@ -24,7 +24,7 @@ 我们将课程内容分为了入门、中级、进阶三大类。 + 入门部分面向零基础同学,希望提供一个相对正确的学习路径,同时介绍基本的整个计算机的概念、体系,以及如何更加充分地使用计算机或其他设备。 -+ 中级部分面向对计算机已有初步认识,并有兴趣深入了解的同学,较为全面地介绍 Linux、软硬件知识以及部分工具的使用。 ++ 中级部分面向对计算机已有初步认识,并有兴趣深入了解的同学,较为全面地介绍 Linux 、软硬件知识以及部分工具的使用。 + 进阶部分面向有一定技术基础的同学,拓宽同学们的技术视野,同时也为社团培养中坚力量,帮助感兴趣的同学更好地上手与参与社团项目共建。 目前仅有入门篇初步完成了建设。欢迎感兴趣的同学与我们共建 wiki! @@ -41,7 +41,7 @@ + 计算机知识概览,包含对于计算机软硬件及基本体系结构等的简要介绍。 + 充分利用计算机,包含计算机的环境配置、文件版本控制、网络安全等多方面内容。 + Linux 基础使用指南,包含虚拟机创建、环境配置以及部分常用操作等内容。 -+ 文本编辑与写作工具,包含对于 Markdown,LaTeX,Typst,Beamer 等 pre 和论文写作时常用工具的介绍。 ++ 文本编辑与写作工具,包含对于 Markdown, LaTeX, Typst, Beamer 等 pre 和论文写作时常用工具的介绍。 到此,如果你完整地学完了本部分的 wiki,你应该能对于计算机的基本概念有了一定的了解,从此计算机对你也不再是黑箱。当然,你对于大学期间所需要使用的最基本的技术与工具也应当不再陌生。更重要的是,你应当已经逐渐拥有了通过计算机**独立探索并解决问题**的能力。 diff --git a/basic/02-searching-and-question.md b/basic/02-searching-and-question.md index f291a0e..c0f3dfc 100644 --- a/basic/02-searching-and-question.md +++ b/basic/02-searching-and-question.md @@ -22,17 +22,17 @@ ### 搜索引擎的选取 -你得知大一开学的计算概论课上需要用到 Python 语言,于是你决定提前学习一下。你兴致勃勃地打开了浏览器,打开了熟悉的 “度娘”,输入了 `Python`,然后点击了搜索。结果呢? +你得知大一开学的计算概论课上需要用到 Python 语言,于是你决定提前学习一下。你兴致勃勃地打开了浏览器,打开了熟悉的“度娘”,输入了 `Python`,然后点击了搜索。结果呢? ![baidu_python](../assets/basic/02-searching-and-question/baidu_python.png)
Baidu 搜索结果
-搜索页面充斥着各种打着 “正版网站” 旗号的广告,官方网站甚至没能挤进首页!这显然不是我们想要的结果。 +搜索页面充斥着各种打着“正版网站”旗号的广告,官方网站甚至没能挤进首页!这显然不是我们想要的结果。 -**一个好的搜索引擎往往能提升你的查询效率**。所以,相较于 Baidu (或是更为小众的 360 搜索和搜狗搜索),笔者更推荐你使用[微软 Bing 搜索](https://www.bing.com)和 [Google 搜索](https://www.google.com)。 +**一个好的搜索引擎往往能提升你的查询效率**。所以,相较于 Baidu(或是更为小众的 360 搜索和搜狗搜索),笔者更推荐你使用[微软 Bing 搜索](https://www.bing.com)和 [Google 搜索](https://www.google.com)。 -对于 Bing 搜索,你应该能够在页面顶端发现**国内版**以及**国际版**的选项。经过笔者测试,在使用国内版进行搜索时,仍然会出现少量的广告 (国内:发自我的百度),但**官方网站通常能够出现在首页**。而在使用国际版进行搜索时,广告会更少,搜索结果也更为准确。 +对于 Bing 搜索,你应该能够在页面顶端发现**国内版**以及**国际版**的选项。经过笔者测试,在使用国内版进行搜索时,仍然会出现少量的广告(国内:发自我的百度),但**官方网站通常能够出现在首页**。而在使用国际版进行搜索时,广告会更少,搜索结果也更为准确。 所以,如果你想要得到更好的搜索结果,同时你要搜索的信息**非中文社区独有**,在这两个版本间笔者更建议你使用后者。 @@ -59,7 +59,7 @@
Google 搜索结果
::: tip 小贴士! -要更方便地使用 Google 搜索以及真正的 Bing 搜索,你也许可以在 [CS 自学指南](https://csdiy.wiki/)的**必学工具**中找到一些更为优雅的方式。 +要更方便地使用 Google 搜索以及真正的 Bing 搜索,你也许可以在 [CS 自学指南](https://csdiy.wiki/) 的**必学工具**中找到一些更为优雅的方式。 ::: @@ -71,7 +71,7 @@ 在搜索时,你需要使用**关键词**进行组合来描述你的问题。关键词是搜索引擎用来匹配你的搜索内容的重要依据,它能够帮助你更快地找到你需要的信息。尽可能避免使用完整句子进行搜索,因为其往往可能包含多余的信息,导致搜索结果不够精确。此外,关键词搜索也可以更好地利用搜索引擎的算法优化网页。 ::: info 举个例子! -比如你想解决 “我最近一直睡不好,想知道有哪些方法可以帮助我改善睡眠质量,让我每晚都能有更好的休息”。这时候,你可以尝试使用关键词 `改善睡眠 方法 快速` 的组合,也许会搜索到更有效的信息。 +比如你想解决“我最近一直睡不好,想知道有哪些方法可以帮助我改善睡眠质量,让我每晚都能有更好的休息”。这时候,你可以尝试使用关键词 `改善睡眠 方法 快速` 的组合,也许会搜索到更有效的信息。 ::: #### 英文关键词 @@ -86,7 +86,7 @@ 如果你对更多的高级搜索选项感兴趣,可以使用前文提到的两条建议查找相关资料。 ::: -> [!IMPORTANT] 试一试! +> [!IMPORTANT] 试一试! > > The Book 几乎是学习 Rust 语言的必读书目。你能尝试找到其英文原版的官方网站主页地址吗? @@ -97,12 +97,12 @@ 如果你想要获取关于一个软件或者一门编程语言的信息,最好的地方往往是它的**官方文档**。官方文档通常包含了该软件或者编程语言的所有信息,包括使用方法、函数说明、示例代码等等。官方文档通常是最权威、最全面的,是你学习一个新技术的最佳选择。 -一般而言,你可以在相应技术的官网上找到官方文档的入口。比如 Python 的官方文档就可以在 [Python 官网](https://www.python.org/)上找到。 +一般而言,你可以在相应技术的官网上找到官方文档的入口。比如 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 的用法之后相信你就明白了! +man的用法可以通过man man查阅。你可能会疑惑,在刚刚的例子中,最后的点后面的数字是什么意思,在读完man的用法之后相信你就明白了! ::: ![python_doc](../assets/basic/02-searching-and-question/python_doc.png) @@ -110,18 +110,18 @@ man 的用法可以通过 man man 查阅。你可能会疑惑,在刚刚的例
Python 官方文档
::: tip 小贴士! -有一个古老而神圣的传统:如果你收到了类似 RTFM (Read The F\*\*king Manual) 的回应,回答者认为你应该去搜索官方文档或使用手册。当然,**大概率他是对的,你应该去读一读**。 +有一个古老而神圣的传统:如果你收到了类似 RTFM(Read The F\*\*king Manual)的回应,回答者认为你应该去搜索官方文档或使用手册。当然,**大概率他是对的,你应该去读一读**。 -同样道理的还有 STFW (Search The F\*\*king Web) 和 RTFSC (Read The F\*\*king Source Code)。 +同样道理的还有 STFW(Search The F\*\*king Web)和 RTFSC(Read The F\*\*king Source Code)。 通常,用这几句话之一回答你的人会给你一份包含你需要内容的手册或者一个网址,这意味着你需要的信息非常容易获得。而往往你自己去搜索这些信息比直接告诉你答案,能让你学到更多。 ::: -> [!IMPORTANT] 试一试! +> [!IMPORTANT] 试一试! > $\LaTeX$ 是在论文写作中非常常用的排版工具。你能尝试找到其官方文档的地址吗? -> [!IMPORTANT] 试一试! +> [!IMPORTANT] 试一试! > > 本 wiki 由 vitepress 强力驱动,你能尝试在其官方文档中找到如何修改右侧的目录栏吗? @@ -129,7 +129,7 @@ man 的用法可以通过 man man 查阅。你可能会疑惑,在刚刚的例 ![stackoverflow](../assets/basic/02-searching-and-question/stackoverflow.png) -**Stack Overflow** (意为 “堆栈溢出”) 是一个面向**计算机程序员**的问答网站。截至 2024 年 3 月,Stack Overflow 已收到了超过 2400 万个问题和 3500 万个答案。该网站和类似的编程问答网站在 2000 年代在全球范围内主要取代了编程书籍,作为日常编程参考,成为计算机编程的重要组成部分。 +**Stack Overflow**(意为 “堆栈溢出”) 是一个面向**计算机程序员**的问答网站。截至 2024 年 3 月,Stack Overflow 已收到了超过 2400 万个问题和 3500 万个答案。该网站和类似的编程问答网站在 2000 年代在全球范围内主要取代了编程书籍,作为日常编程参考,成为计算机编程的重要组成部分。 你可以在 Stack Overflow 上搜索到大量的问题和答案,这往往是程序员们在工作或学习中遇到的问题,相信能对你的技术学习之旅有所帮助。 #### [GitHub](https://github.com/) @@ -141,7 +141,7 @@ man 的用法可以通过 man man 查阅。你可能会疑惑,在刚刚的例 你可以在 GitHub 上找到许多优秀的开源项目。一般而言,进入一个项目主页后,你可以通过查看 `Readme` 文件来快速上手如何构建或使用一个项目,同时也许可以在该文件中找到项目对应的官方文档地址和下载地址;你也可以在右侧的 `Releases` 选项中找到不同版本的安装包。当然,你也可以通过访问这些项目的 `Issues` 页面来查看其他人提出的有关该项目的问题和解答,这对你解决使用过程中遇到的问题非常有帮助。 ::: tip 小贴士! -如果你对 Git 感兴趣,可以提前阅读入门篇的[第六章](/basic/06-drive-your-computer-2)。 +如果你对 Git 感兴趣,可以提前阅读入门篇的 [第六章](/basic/06-drive-your-computer-2)。 ::: #### [知乎](https://www.zhihu.com/) / [博客园](https://www.cnblogs.com/) / [简书](https://www.jianshu.com/) / [Bilibili](https://www.bilibili.com/) @@ -203,7 +203,7 @@ man 的用法可以通过 man man 查阅。你可能会疑惑,在刚刚的例 ### 在哪里提问? -除了向你熟悉的大佬 “抱大腿”,你还可以尝试以下几种方式: +除了向你熟悉的大佬“抱大腿”,你还可以尝试以下几种方式: #### 在前文提到的论坛或问答网站上发表帖子或提问 @@ -266,9 +266,9 @@ man 的用法可以通过 man man 查阅。你可能会疑惑,在刚刚的例 ### 向大模型提问 -随着人工智能技术的发展,大语言模型 (Large Language Model,LLM) 的出现为我们提供了一个全新的提问方式。对于许多知识性上的问题,得益于大模型的强大计算能力和海量数据,其往往能给出相对准确、全面的答案。 +随着人工智能技术的发展,大语言模型(Large Language Model, LLM)的出现为我们提供了一个全新的提问方式。对于许多知识性上的问题,得益于大模型的强大计算能力和海量数据,其往往能给出相对准确、全面的答案。 -在当今时代,**大模型已经成为了获取知识的重要途径之一**,每一个人都应该学会如何更好地与 LLM 交流,以及将 LLM 作为自己的 “助手”,为学习、工作与生活提供更多便利。 +在当今时代,**大模型已经成为了获取知识的重要途径之一**,每一个人都应该学会如何更好地与 LLM 交流,以及将 LLM 作为自己的“助手”,为学习、工作与生活提供更多便利。 #### 哪里找到好用的大模型? @@ -277,21 +277,21 @@ man 的用法可以通过 man man 查阅。你可能会疑惑,在刚刚的例 GitHub Copilot 是由 GitHub 和 OpenAI 联合开发的 AI 编程助手,为多种编程语言提供智能代码补全和生成。它集成于 VS Code、Neovim 和 JetBrains IDE 等,支持多种语言如 C++、Python、Rust 等,可以根据上下文为代码提供个性化建议。 ::: tip 小贴士! -你可以通过过申请 [GitHub Student Developer Pack](https://education.github.com/pack) 来免费获得 GitHub Copilot 的使用权限。这里有一份[申请指南](https://docs.github.com/zh/education/explore-the-benefits-of-teaching-and-learning-with-github-education/github-education-for-students/apply-to-github-education-as-a-student)。但请注意,若你正在学习计算机相关课程 (如计概、数算或是需要自行完成 Lab 的课程),**笔者不建议你在这个阶段过度依赖 Copilot**。 +你可以通过过申请 [GitHub Student Developer Pack](https://education.github.com/pack) 来免费获得 GitHub Copilot 的使用权限。这里有一份[申请指南](https://docs.github.com/zh/education/explore-the-benefits-of-teaching-and-learning-with-github-education/github-education-for-students/apply-to-github-education-as-a-student)。但请注意,若你正在学习计算机相关课程(如计概、数算或是需要自行完成 Lab 的课程),**笔者不建议你在这个阶段过度依赖 Copilot**。 -原因也很简单,正如 Copilot 的名字所暗示的,它只是一个 “协作者”,而不是 “替代者”。在学习编程的过程中,你需要自己动手,自己思考,自己解决问题,这样才能更好地掌握编程技能,你的水准才会超过 Copilot,才能利用 Copilot 提高效率,而不是被 Copilot 所限制。 +原因也很简单,正如 Copilot 的名字所暗示的,它只是一个“协作者”,而不是“替代者”。在学习编程的过程中,你需要自己动手,自己思考,自己解决问题,这样才能更好地掌握编程技能,你的水准才会超过 Copilot,才能利用 Copilot 提高效率,而不是被 Copilot 所限制。 ::: + [OpenAI](https://www.openai.com/) -无需多言。你可以在 OpenAI 的官网上找到大量关于如何使用 OpenAI 的文档和教程。同时,你也可以在 [chatgpt.com](https://www.chatgpt.com/) 上体验 OpenAI 的大模型,如 `GPT-4o mini`。 +无需多言。你可以在 OpenAI 的官网上找到大量关于如何使用 OpenAI 的文档和教程。同时,你也可以在 [chatgpt.com](https://www.chatgpt.com/) 上体验 OpenAI 的大模型,如 `GPT-4o mini`。 + [Azure](https://azure.microsoft.com/) 由于微软与 OpenAI 的关系,你同样可以在 Azure 平台上使用 OpenAI 的大模型。 ::: tip 小贴士! -Azure 几乎是目前所有商业云服务提供商中对于学生群体最为友好的一个。你可以在 [Azure for Students](https://azure.microsoft.com/zh-cn/free/students/) 中按照指示填写表单以获取**无需信用卡且只要在校即可不断刷新**的免费云服务 (包括但不限于多台海外位置的服务器),以及每年 100 美元的 Azure 服务额度,可以用于购买包含 OpenAI Token、公网静态 IP 地址在内的多种服务,也容易实现个人对于 OpenAI 付费服务的免费使用。 +Azure 几乎是目前所有商业云服务提供商中对于学生群体最为友好的一个。你可以在 [Azure for Students](https://azure.microsoft.com/zh-cn/free/students/) 中按照指示填写表单以获取**无需信用卡且只要在校即可不断刷新**的免费云服务(包括但不限于多台海外位置的服务器),以及每年 100 美元的 Azure 服务额度,可以用于购买包含 OpenAI Token、公网静态 IP 地址在内的多种服务,也容易实现个人对于 OpenAI 付费服务的免费使用。 另外,如果你在使用 Azure OpenAI 时遇到了配额不足的问题,可以访问[此链接](https://aka.ms/oai/quotaincrease)填写表单以申请提升配额。 ::: @@ -308,7 +308,7 @@ Azure 几乎是目前所有商业云服务提供商中对于学生群体最为 与搜索时的建议截然不同,在与大模型交流时,笔者**不推荐**你采用关键词组合的方式。你需要**尽可能地详细且完整**地描述你的问题。同时,大模型也可以被用来指导你如何搜索与提问。当你有一个很模糊的问题无从下手,或许可以尝试向 LLM 提问,询问可能的探索方向。 -同时,大模型目前基本上是 “随机鹦鹉”,是一个好的 agent,但并非是好的 solver。很多时候,你仍然需要自己思考,自己解决问题,而不是完全依赖 LLM。 +同时,大模型目前基本上是“随机鹦鹉”,是一个好的 agent ,但并非是好的 solver。很多时候,你仍然需要自己思考,自己解决问题,而不是完全依赖 LLM。 ##### 明确性 @@ -318,7 +318,7 @@ Azure 几乎是目前所有商业云服务提供商中对于学生群体最为 Q:请你随机生成 10 个正整数并计算其中 2 的倍数和 3 的倍数的和。 - A:(省略......) 因此,2 的倍数的和是 70,3 的倍数的和是 78。 + A:(省略......) 因此,2 的倍数的和是 70,3 的倍数的和是 78。 你会发现,LLM 给出的答案也许并不是我们想要的。这是因为**问题并不够明确**,LLM 无法准确判断我们需要的是 2 的倍数和 3 的倍数的和,还是 2 和 3 的倍数的和。 ::: @@ -326,37 +326,37 @@ Azure 几乎是目前所有商业云服务提供商中对于学生群体最为 如果有输出模式上的需求,你可以尝试给出一个示例,这对获得**特定格式的期望输出**非常有效。 ::: info 举个例子! -Q:请用 “你说得对,但是原神是一款开放世界动作角色扮演游戏” 的格式用一句话介绍你自己,使用第三人称。 +Q:请用“你说得对,但是原神是一款开放世界动作角色扮演游戏”的格式用一句话介绍你自己,使用第三人称。 A:你说得对,但是这个 AI 是一个帮助人们查找信息和解答问题的人工智能助手。 ::: ##### 简单化 -LLM 虽然收集了大量的数据,但他本质上还是一个 “笨小孩”。稍显复杂的问题,可能会让 LLM 产生混乱,进而给出错误的答案。也许你可以试着将问题分解为**简单的几个小问题**,并在提示中逐一询问,这样往往能够更容易得到正确的答案。 +LLM 虽然收集了大量的数据,但他本质上还是一个“笨小孩”。稍显复杂的问题,可能会让 LLM 产生混乱,进而给出错误的答案。也许你可以试着将问题分解为**简单的几个小问题**,并在提示中逐一询问,这样往往能够更容易得到正确的答案。 ::: info 举个例子! - Q:请你随机生成 20 个正整数并计算其中 2 的倍数和 3 的倍数的数的和,生成整数时不要换行。 + Q:请你随机生成 20 个正整数并计算其中2的倍数和3的倍数的数的和,生成整数时不要换行。 - A:生成的 20 个正整数是:3,12,25,7,18,5,21,14,8,9,30,22,11,24,17,26,33,6,27,16。 + A:生成的20个正整数是:3, 12, 25, 7, 18, 5, 21, 14, 8, 9, 30, 22, 11, 24, 17, 26, 33, 6, 27, 16。 -2 的倍数有:12,18,14,8,30,22,24,26,6,16。 +2的倍数有:12, 18, 14, 8, 30, 22, 24, 26, 6, 16。 -2 的倍数的和是:12 + 18 + 14 + 8 + 30 + 22 + 24 + 26 + 6 + 16 = 176。 +2的倍数的和是:12 + 18 + 14 + 8 + 30 + 22 + 24 + 26 + 6 + 16 = 176。 -3 的倍数有:3,12,18,21,9,30,24,33,6,27。 +3的倍数有:3, 12, 18, 21, 9, 30, 24, 33, 6, 27。 -3 的倍数的和是:3 + 12 + 18 + 21 + 9 + 30 + 24 + 33 + 6 + 27 = 183。 +3的倍数的和是:3 + 12 + 18 + 21 + 9 + 30 + 24 + 33 + 6 + 27 = 183。 -2 和 3 的倍数的总和是:176 + 183 = 359。 +2和3的倍数的总和是:176 + 183 = 359。 -你发现它没有去除 6 的倍数!我们尝试**把问题分解**,再次询问: +你发现它没有去除 6 的倍数!我们尝试**把问题分解**,再次询问: -Q:请你随机生成 20 个正整数,先找出其中是 2 的倍数或是 3 的倍数的数,再计算他们的和,生成整数时不要换行。 +Q:请你随机生成 20 个正整数,先找出其中是2的倍数或是3的倍数的数,再计算他们的和,生成整数时不要换行。 -A:生成的 20 个正整数是:15,26,33,7,18,5,21,14,8,9,30,22,11,24,17,27,32,6,28,16。 +A:生成的20个正整数是:15, 26, 33, 7, 18, 5, 21, 14, 8, 9, 30, 22, 11, 24, 17, 27, 32, 6, 28, 16。 -2 的倍数或 3 的倍数有:26,33,18,21,14,8,9,30,22,24,27,32,6,28,16。 +2的倍数或3的倍数有:26, 33, 18, 21, 14, 8, 9, 30, 22, 24, 27, 32, 6, 28, 16。 这些数的和是:26 + 33 + 18 + 21 + 14 + 8 + 9 + 30 + 22 + 24 + 27 + 32 + 6 + 28 + 16 = 314。 @@ -365,7 +365,7 @@ A:生成的 20 个正整数是:15,26,33,7,18,5,21,14,8,9 ::: tip 小贴士! -你可以在[提示工程指南](https://www.promptingguide.ai/zh)中获取更多相关的知识。 +你可以在 [提示工程指南](https://www.promptingguide.ai/zh) 中获取更多相关的知识。 ::: --- diff --git a/basic/03-computer-basic-knowledge-1.md b/basic/03-computer-basic-knowledge-1.md index f0357f0..cb764df 100644 --- a/basic/03-computer-basic-knowledge-1.md +++ b/basic/03-computer-basic-knowledge-1.md @@ -19,107 +19,107 @@ 计算机,顾名思义,做计算的机器。 长久以来,人们日常生活中,到处都需要计算,但不得不手工完成,耗费大量心智。 于是,神降临了世界,从天间盗取了圣火。 -伟大的图灵,在众人面前伸手于虚无中画了个圈,曰,我有一圣物,这些问题都可以被我的机器求解! +伟大的图灵,在众人面前伸手于虚无中画了个圈,曰,我有一圣物,这些问题都可以被我的机器求解! 从此,自动化的机器极大地解放了人类。人类从此有了一个判定基准,先衡量一个问题是否属于图灵可计算,如果是,就可以从裤兜里掏出图灵机,盘之。 -开天辟地,计算机这门学科诞生。计算机,一个魔力的机器,一个让人又爱又狠的机器。无数后身工程师为之努力奋斗、脱发明志,为之痴迷,为之疯狂! +开天辟地,计算机这门学科诞生。计算机,一个魔力的机器,一个让人又爱又狠的机器。无数后身工程师为之努力奋斗、脱发明志,为之痴迷,为之疯狂! ![Turing](/assets/basic/03-computer-basic-knowledge-1/Turing.jpg) -图 1。Alan Turing (23 June 1912 – 7 June 1954),from wiki +图1. Alan Turing (23 June 1912 – 7 June 1954), from wiki #### 冯诺依曼架构 尽管有了原理,此时天地昏暗,依然看不见光明。 冯诺依曼,跟着神的指引,构筑了世间万物。 他具体提出的是这样一种实现形式,由运算器、控制器、存储器、输入输出设备组成。 -![Von Neumann Architecture](/assets/basic/03-computer-basic-knowledge-1/Von_Neumann_Architecture.svg) +![Von Neumann Architecture](/assets/basic/03-computer-basic-knowledge-1/Von_Neumann_Architecture.svg) -从1945年 (1946年2月14日对外公布) 第一台计算机 ENIAC 诞生,到今天移动手机 (也是一种计算机),计算机依然也基于这个架构进行设计。 +从1945年(1946年2月14日对外公布)第一台计算机ENIAC诞生,到今天移动手机(也是一种计算机),计算机依然也基于这个架构进行设计。 ![ENIAC](/assets/basic/03-computer-basic-knowledge-1/ENIAC.jpg) -图 2。ENIAC,包含了万余电子元件,重达 27 吨,占地 167 平方米。运行起来耗电 150 千瓦,有传言说,每当这台计算机启动的时候,费城的灯都变暗了。 +图2. ENIAC, 包含了万余电子元件,重达27吨,占地167平方米。运行起来耗电150千瓦,有传言说,每当这台计算机启动的时候,费城的灯都变暗了。 ![iPhone](/assets/basic/03-computer-basic-knowledge-1/IPhone_6.png) -图 3。iPhone 6,发布于2014年9月。其采用了 A8 处理器,20nm 制程,包含约 20 亿晶体管。 +图3. iPhone 6, 发布于2014年9月。其采用了A8处理器,20nm制程,包含约20亿晶体管。 计算机就像一个数据计算加工的工厂,控制器有条不紊根据一条条指令控制处理器中的各个状态,指挥数据的搬运和计算,并与各类外设进行交互。 -![Von Neumann Machine](/assets/basic/03-computer-basic-knowledge-1/Von_Neumann_Machine.png) +![Von Neumann Machine](/assets/basic/03-computer-basic-knowledge-1/Von_Neumann_Machine.png) #### CPU -CPU 是整个计算机的核心,承担着运算和控制的功能。CPU 从存储设备中读取代码和数据,尽管现代处理器对代码和数据会有不同的处理,但是其本质上并没有严格的区分。代码由一条一条的指令组成,CPU 按照顺序一条一条执行从存储设备中读取的指令 (至少从软件和程序员等使用者的视角看是这样),指令可以是修改 CPU 的状态,进行运算,或者是从其他硬件读取信息或者输出信息。 +CPU是整个计算机的核心,承担着运算和控制的功能。CPU从存储设备中读取代码和数据,尽管现代处理器对代码和数据会有不同的处理,但是其本质上并没有严格的区分。代码由一条一条的指令组成,CPU按照顺序一条一条执行从存储设备中读取的指令(至少从软件和程序员等使用者的视角看是这样),指令可以是修改CPU的状态,进行运算,或者是从其他硬件读取信息或者输出信息。 ![Intel 8086](/assets/basic/03-computer-basic-knowledge-1/Intel_C8086.jpg) -图 4。这是 Intel 8086 处理器,和现在的处理器 “长相” 很不一样,但是你案头的计算机用的处理器很可能与之兼容 (除非你是新版 Apple 或者你自己知道你用的不是 x86 架构的处理器)。图源自 wiki,获 CC BY-SA 授权 +图4. 这是Intel 8086处理器,和现在的处理器“长相”很不一样,但是你案头的计算机用的处理器很可能与之兼容(除非你是新版Apple或者你自己知道你用的不是x86架构的处理器)。图源自wiki,获CC BY-SA授权 -目前市面上的处理器拥有很多种不同的 ISA(Instruction Set Architecture),ISA 定义了程序员如何使用 CPU,如处理器有哪些指令、指令编码方式和功能、寄存器的大小数量和功能、怎么寻找和读取数据、能暂存多少数据、每个暂存的数据有多大、数据存放的顺序如何等等各种约定,并不是指令的简单集合。一般来说,为其他 ISA 编译好的程序是不能够直接在当前 ISA 上运行的,需要转译,或者 (在有源代码的情况下) 重新按照当前 ISA 进行编译。同学们在下载软件时,也要注意 ISA 的信息。下面是一些常见的 ISA: +目前市面上的处理器拥有很多种不同的ISA(Instruction Set Architecture),ISA定义了程序员如何使用CPU,如处理器有哪些指令、指令编码方式和功能、寄存器的大小数量和功能、怎么寻找和读取数据、能暂存多少数据、每个暂存的数据有多大、数据存放的顺序如何等等各种约定,并不是指令的简单集合。一般来说,为其他ISA编译好的程序是不能够直接在当前ISA上运行的,需要转译,或者(在有源代码的情况下)重新按照当前ISA进行编译。同学们在下载软件时,也要注意ISA的信息。下面是一些常见的ISA: -- x86:最经典最常见的 ISA,同学案头计算机的处理器基本都基于此,历史兼容性好 (低情商:历史包袱重) -- ARM:移动端 (包括手机) 常见的 ISA,不管是苹果还是遥遥领先,处理器都使用该 ISA。苹果 M 系列处理器也使用该 ISA -- RiscV:新兴的开源 ISA,嵌入式设备中有使用,由于其设计比较简单,易于阅读和学习,学校也喜欢用于教学 -- Loongarch:一个国产自主设计的 ISA -- 还有其他诸如 MIPS、PowerPC 等架构不再赘述 +- x86: 最经典最常见的ISA,同学案头计算机的处理器基本都基于此,历史兼容性好(低情商:历史包袱重) +- ARM: 移动端(包括手机)常见的ISA,不管是苹果还是遥遥领先,处理器都使用该ISA。苹果M系列处理器也使用该ISA +- RiscV: 新兴的开源ISA,嵌入式设备中有使用,由于其设计比较简单,易于阅读和学习,学校也喜欢用于教学 +- Loongarch: 一个国产自主设计的ISA +- 还有其他诸如MIPS、PowerPC等架构不再赘述 -现代的 ISA 一般都设计保护功能。保护功能提供不同的模式,在特权模式下,代码有对处理器和硬件的 (几乎) 完全的控制权;而在非特权模式 (用户模式) 下,代码只能控制有限的资源,进行 “安全” 的操作,而其他操作需要通过切换到特权模式完成。同时,ISA 提供了虚拟内存的功能,也就是将物理内存地址 (也就是下文将提到的 “存储空间的编号”) 映射到虚拟地址,并设置访问权限。此时用户模式的程序员看到的是一片连续的地址空间,这样可以简化程序设计,同时提供安全隔离。 +现代的ISA一般都设计保护功能。保护功能提供不同的模式,在特权模式下,代码有对处理器和硬件的(几乎)完全的控制权;而在非特权模式(用户模式)下,代码只能控制有限的资源,进行“安全”的操作,而其他操作需要通过切换到特权模式完成。同时,ISA提供了虚拟内存的功能,也就是将物理内存地址(也就是下文将提到的“存储空间的编号”)映射到虚拟地址,并设置访问权限。此时用户模式的程序员看到的是一片连续的地址空间,这样可以简化程序设计,同时提供安全隔离。 ::: info 历史的注记 -Intel 常年为 x86 的丑陋感到自卑。有一天在 HP 的 “蛊惑”,联合开发了一个全新的 64 位架构 IA64 以图改变命运,处理器代号为安腾 (Itanium)。该架构具有很多让人眼前一亮的特性,然而与之前 Intel 的 x86 完全不兼容。而 AMD 选择开发了与之前 x86 架构兼容的 AMD64 架构,迅速抢占市场份额。由于安腾落后的性能和开发速度,市场表现不佳,因此转而采用 AMD64 架构,或者更中立的名称,x86-64 架构,而安腾逐渐被历史淘汰。 +Intel常年为x86的丑陋感到自卑。有一天在HP的“蛊惑”,联合开发了一个全新的64位架构IA64以图改变命运,处理器代号为安腾(Itanium)。该架构具有很多让人眼前一亮的特性,然而与之前Intel的x86完全不兼容。而AMD选择开发了与之前x86架构兼容的AMD64架构,迅速抢占市场份额。由于安腾落后的性能和开发速度,市场表现不佳,因此转而采用AMD64架构,或者更中立的名称,x86-64架构,而安腾逐渐被历史淘汰。 ::: #### 内存 -这里说的内存是 RAM(Random Access Memory),断电丢失数据的随机存储器。然而在不同语境下,内存也可以指下文中的 “硬盘”,请注意区分。 +这里说的内存是RAM(Random Access Memory),断电丢失数据的随机存储器。然而在不同语境下,内存也可以指下文中的“硬盘”,请注意区分。 -内存是处理器 CPU 能够直接访问到的数据存储器。面向使用的程序员,内存被简化抽象为一个个存储单元,每个存储单元大小一个字节,或者说 8 比特,也就是 8 个数字 0 或者 1,每个存储单元都有唯一编号,就像一个浩大的图书馆,在每个书架每个特定的位置存放着图书,并有编号。CPU 就和我们找书的过程一样,通过编号,从内存拿出对应存储单元中的数据或者向存储单元写入数据。而随机存储器中 “随机” 的意思是不论拿什么编号来找数据,所需时间总是差不太多的。与之相对的是顺序存储器,比如磁带 (后文有介绍)。 +内存是处理器CPU能够直接访问到的数据存储器。面向使用的程序员,内存被简化抽象为一个个存储单元,每个存储单元大小一个字节,或者说8比特,也就是8个数字0或者1,每个存储单元都有唯一编号,就像一个浩大的图书馆,在每个书架每个特定的位置存放着图书,并有编号。CPU就和我们找书的过程一样,通过编号,从内存拿出对应存储单元中的数据或者向存储单元写入数据。而随机存储器中“随机”的意思是不论拿什么编号来找数据,所需时间总是差不太多的。与之相对的是顺序存储器,比如磁带(后文有介绍)。 -内存访问速度比其他外部存储要快,但是随着处理器的发展 (由几 MHz 如 8086 的 5MHz 发展至几 GHz),内存速度的提升却跟不上处理器速度提升的步伐。今日从内存中找一个数据所需的典型时间内处理器大约能执行上百条指令,因此在离得更近的处理器内部引入了高速缓存。关于这一点,我们将在本章节第二部分讲述。 +内存访问速度比其他外部存储要快,但是随着处理器的发展(由几MHz如8086的5MHz发展至几GHz),内存速度的提升却跟不上处理器速度提升的步伐。今日从内存中找一个数据所需的典型时间内处理器大约能执行上百条指令,因此在离得更近的处理器内部引入了高速缓存。关于这一点,我们将在本章节第二部分讲述。 ![DRAM](/assets/basic/03-computer-basic-knowledge-1/DRAM.jpg) -图 5。一根台式机内存条,来自尔必达 (日本),后为镁光公司收购。由于单颗内存芯片性能和性价比受限,故而将若干颗内存芯片并列组装成一个条形的内存模块。 +图5. 一根台式机内存条,来自尔必达(日本),后为镁光公司收购。由于单颗内存芯片性能和性价比受限,故而将若干颗内存芯片并列组装成一个条形的内存模块。 ::: info 历史的注记 -你知道吗?历史上 Intel 早期是一家内存制造公司。后因与日本的公司竞争不利,随转向处理器制造。 -关于内存的发展历史,曾有不少滔天巨浪。此提供若干关键词供感兴趣的人进一步了解:Rambus 之战,奇梦达 +你知道吗?历史上Intel早期是一家内存制造公司。后因与日本的公司竞争不利,随转向处理器制造。 +关于内存的发展历史,曾有不少滔天巨浪。此提供若干关键词供感兴趣的人进一步了解: Rambus之战, 奇梦达 ::: #### 硬盘 -有时候也被称作 “内存” 或者 “外存” (是不是有些混乱?),不过你只需要记住我们这里讲的是断电数据不丢失的可以反复改写的存储设备即可。 +有时候也被称作“内存”或者“外存”(是不是有些混乱?),不过你只需要记住我们这里讲的是断电数据不丢失的可以反复改写的存储设备即可。 -目前市面上主要有两种硬盘,一种是机械硬盘 HDD,里面有一组极为平滑如镜子一样的硬质盘片,表面有磁性物质,旁边有若干磁头,背面则有电路和芯片进行控制。机械硬盘工作时,盘片高速运转,电路控制磁头由于旋转带动的气流从而悬浮在盘片表面 (仅有几十纳米甚至更小!) 通过磁场读写其中的内容。由于这种机械的旋转结构导致其对振动较为敏感 (剧烈的撞击极易导致磁头撞击盘片表面从而损坏磁介质,产生坏道),严忌于其工作时摔碰。 +目前市面上主要有两种硬盘,一种是机械硬盘HDD,里面有一组极为平滑如镜子一样的硬质盘片,表面有磁性物质,旁边有若干磁头,背面则有电路和芯片进行控制。机械硬盘工作时,盘片高速运转,电路控制磁头由于旋转带动的气流从而悬浮在盘片表面(仅有几十纳米甚至更小!)通过磁场读写其中的内容。由于这种机械的旋转结构导致其对振动较为敏感(剧烈的撞击极易导致磁头撞击盘片表面从而损坏磁介质,产生坏道),严忌于其工作时摔碰。 -另一种是固态硬盘 SSD,里面没有高速运转的机械结构,取而代之的是闪存芯片和控制电路,在闪存芯片内部有大量的单元通过捕获电荷来存储信息。固态硬盘具有较为明确的寿命特点,其写入次数有限 (个人日常使用的实际寿命并不一定比机械硬盘差,各有优缺),且由于电荷流失,长时间不通电时不能保证数据稳定 (jedec 标准为在 TBW 寿命耗尽后断电下仅能保持1年,不过相较实验数据,实际情况都更为糟糕)。为了最大化固态硬盘寿命,其一般有较为复杂的控制电路,保证写入均匀地发生在固态硬盘的不同部位,也因此在异常断电等情况下也更容易发生损坏。 +另一种是固态硬盘SSD,里面没有高速运转的机械结构,取而代之的是闪存芯片和控制电路,在闪存芯片内部有大量的单元通过捕获电荷来存储信息。固态硬盘具有较为明确的寿命特点,其写入次数有限(个人日常使用的实际寿命并不一定比机械硬盘差,各有优缺),且由于电荷流失,长时间不通电时不能保证数据稳定(jedec标准为在TBW寿命耗尽后断电下仅能保持1年,不过相较实验数据,实际情况都更为糟糕)。为了最大化固态硬盘寿命,其一般有较为复杂的控制电路,保证写入均匀地发生在固态硬盘的不同部位,也因此在异常断电等情况下也更容易发生损坏。 -一般来说,固态硬盘较贵 (写此文时约 400RMB/TB,TLC,带宽 1-8GB/s),速度较快,抗振动辐射,而机械硬盘较为廉价 (约 100RMB/TB,带宽 100-300MB/s),但速率较低,不过相对固态硬盘数据存放稳定性较好。他们二者都是优秀的大容量存储媒介。不过总之,重要数据应该做好备份,硬盘有价,数据无价。 +一般来说,固态硬盘较贵(写此文时约400RMB/TB, TLC, 带宽1-8GB/s),速度较快,抗振动辐射,而机械硬盘较为廉价(约100RMB/TB, 带宽100-300MB/s),但速率较低,不过相对固态硬盘数据存放稳定性较好。他们二者都是优秀的大容量存储媒介。不过总之,重要数据应该做好备份,硬盘有价,数据无价。 ![HDD](/assets/basic/03-computer-basic-knowledge-1/Laptop-hard-drive-exposed.jpg) -图 6。机械硬盘内部结构。图源自 wiki,获 CC BY-SA 授权 +图6. 机械硬盘内部结构。图源自wiki,获CC BY-SA授权 ![SDD](/assets/basic/03-computer-basic-knowledge-1/SSD.jpg) -图 7。固态硬盘内部结构。左 SandForce 标志芯片为主控,负责与主机通讯以及管理和读写右侧 6 颗闪存颗粒内的数据。图源自 wiki,获 CC BY-SA 授权 +图7. 固态硬盘内部结构。左SandForce标志芯片为主控,负责与主机通讯以及管理和读写右侧6颗闪存颗粒内的数据。图源自wiki,获CC BY-SA授权 ::: warning 注意 -如果你在比较早的时候接触过或者从长辈口中听说过 “磁盘碎片” 这回事,请注意,固态硬盘不要整理磁盘碎片。 +如果你在比较早的时候接触过或者从长辈口中听说过“磁盘碎片”这回事,请注意,固态硬盘不要整理磁盘碎片。 ::: #### 其他你可能听说过或没有听说过的存储设备 -- U 盘:较为简化的一种固态硬盘,通过 USB 接口与主机连接,性能较弱,主控结构比较简单 -- 存储卡:也是一种固态硬盘,接口为移动插拔做了优化 -- 光盘:在闪存时代前常见的存储设备用于交换数据,一般只能写入一次,存储容量在几百 M 到几十 G 不等。内部有一层薄介质,通过激光在上面进行刻蚀或由母盘压制而得,并通过反射读取信息 -- 软盘:更古董的设备,一个薄磁性塑料软片,故名软盘,存储容量在几百 KB 至几 MB 左右 -- 磁带:一圈一圈卷起来的塑料磁性软带,因此读取写入只能顺序进行,意味着找数据的时间和当前读写位置的距离成正比 (而不像随机存储器,基本差别不多),用于长时间保存巨量数据,需要特定的仪器和环境。 +- U盘: 较为简化的一种固态硬盘,通过USB接口与主机连接,性能较弱,主控结构比较简单 +- 存储卡: 也是一种固态硬盘,接口为移动插拔做了优化 +- 光盘: 在闪存时代前常见的存储设备用于交换数据,一般只能写入一次,存储容量在几百M到几十G不等。内部有一层薄介质,通过激光在上面进行刻蚀或由母盘压制而得,并通过反射读取信息 +- 软盘:更古董的设备,一个薄磁性塑料软片,故名软盘,存储容量在几百KB至几MB左右 +- 磁带:一圈一圈卷起来的塑料磁性软带,因此读取写入只能顺序进行,意味着找数据的时间和当前读写位置的距离成正比(而不像随机存储器,基本差别不多),用于长时间保存巨量数据,需要特定的仪器和环境。 #### 存储层次结构 存储器有很多种类,速度、容量单价、稳定性都各有不同。根据其响应速度,存储器可被划分为多级结构: ![Memory Hierarchy](/assets/basic/03-computer-basic-knowledge-1/ComputerMemoryHierarchy.svg) -图 8。存储器层次结构示意图,公有领域作品 +图8. 存储器层次结构示意图,公有领域作品 -处理器中的寄存器,通常用于存储计算中的临时数据,随取随用性能要求极高,因此使用的晶体管非常多,同时其单位容量价格自然也是十分高。 +处理器中的寄存器,通常用于存储计算中的临时数据,随取随用性能要求极高,因此使用的晶体管非常多,同时其单位容量价格自然也是十分高。 -在寄存器和内存中间,一般还存在多级缓存。高速缓存由硬件自动管理,对一般程序员不可见。常用的数据将被放入速度快很多的缓存中。但由于其仍然占用了不少宝贵的芯片面积,故缓存单位容量的价格也比较高,目前个人计算机缓存的容量普遍在数十 MB 以内。 +在寄存器和内存中间,一般还存在多级缓存。高速缓存由硬件自动管理,对一般程序员不可见。常用的数据将被放入速度快很多的缓存中。但由于其仍然占用了不少宝贵的芯片面积,故缓存单位容量的价格也比较高,目前个人计算机缓存的容量普遍在数十MB以内。 -内存参照前文,不再赘述。 +内存参照前文,不再赘述。 -以上三种存储都属于易失性存储 (volatile),也就是断电后数据将会在短时间内消失。而其中前两种存储是静态随机存储,意味着在通电状态下其状态可保持不需要进行刷新,但制造所需晶体管较多。而后者为了实现更大化地存储,通过电荷存储在一个个微小的电容中,故只需要一个晶体管,但其随着时间电荷会逐渐流失导致数据丢失,因此需要每几个毫秒对每个存储单元都进行刷新操作,故称为动态随机存储。 +以上三种存储都属于易失性存储(volatile),也就是断电后数据将会在短时间内消失。而其中前两种存储是静态随机存储,意味着在通电状态下其状态可保持不需要进行刷新,但制造所需晶体管较多。而后者为了实现更大化地存储,通过电荷存储在一个个微小的电容中,故只需要一个晶体管,但其随着时间电荷会逐渐流失导致数据丢失,因此需要每几个毫秒对每个存储单元都进行刷新操作,故称为动态随机存储。 ::: details 局部性原理 你可能会想问,缓存为什么能够在程序员不参与的情况下完成内存访问的提速,这就涉及到一个重要的概念:局部性原理。这个原理主要说的是,一个程序在总是倾向于访问最近访问过的存储单元或者与之相邻的存储单元,缓存可以据此将最近访问过的存储单元放入自身当中,或者预测将要访问的存储单元,将其提前放入自身当中。当然这种预测并不会百发百中,而基于缓存的工作原理,提升自己程序的局部性,是改善程序性能的一个好方法。 @@ -128,51 +128,51 @@ Intel 常年为 x86 的丑陋感到自卑。有一天在 HP 的 “蛊惑”, #### GPU ![GPU](/assets/basic/03-computer-basic-knowledge-1/GTX980tiFE.jpg) -图 9。Graphic Process Unit,也叫做显卡,有独立显卡和集成显卡两种,前者以一种通过 PCIe 接口连接的扩展卡或直接独立集成在主板 (通常存在于笔记本或者一体机内) 的形式存在,而后者直接存在于处理器 SoC 内部 (故名集成)。 +图9. Graphic Process Unit, 也叫做显卡,有独立显卡和集成显卡两种,前者以一种通过PCIe接口连接的扩展卡或直接独立集成在主板(通常存在于笔记本或者一体机内)的形式存在,而后者直接存在于处理器SoC内部(故名集成)。 ![GPU_Internal](/assets/basic/03-computer-basic-knowledge-1/GPU_Teardown.jpg) -图 10。一张独立显卡内部 (图源自 TechPowerUp,途中显卡型号为 RTX4090),包含居中镜面的硕大的 GPU 核心,供电电路 (具有标志性的电感,以实现降压,通常一个电感为一相大致提供 20A~40A 左右。图中有 26 个,故可以粗略估计出该卡大致峰值允许的功耗在 500W 左右) 和围绕着核心的若干个显存芯片 (通常称为显存颗粒,图中为 12 个,每个位宽 32bit 即 32 根数据线,合计 12*2=24GB 大小 384bit 位宽) 用于存储图像和计算数据。最左侧是四个视频输出接口,底部金色的 PCIe 接口接触点 (通常成为金手指) 插入主板上的插槽,与 CPU 相连。 +图10. 一张独立显卡内部(图源自TechPowerUp,途中显卡型号为RTX4090),包含居中镜面的硕大的GPU核心,供电电路(具有标志性的电感,以实现降压,通常一个电感为一相大致提供20A~40A左右。图中有26个,故可以粗略估计出该卡大致峰值允许的功耗在500W左右)和围绕着核心的若干个显存芯片(通常称为显存颗粒,图中为12个,每个位宽32bit即32根数据线,合计12*2=24GB大小384bit位宽)用于存储图像和计算数据。最左侧是四个视频输出接口,底部金色的PCIe接口接触点(通常成为金手指)插入主板上的插槽,与CPU相连。 -GPU 用于图形处理加速和视频输出 (因此如果使用独立显卡输出,显示器视频线需要连到显卡的接口,而不是主板上的),同时包含了各类专用的加速单元 (见第二章详细介绍)。(省流:可以用来玩原神) -后用于大量并行处理,如 AI,科学计算等等。虽然 GPU 的计算能力远远大于 CPU,但是各自特色分明:CPU 擅长控制和逻辑,单核处理能力强的多,适合各种通用的场合;而 GPU 仅适用于并行且逻辑简单的计算,以其独特的架构取胜。 +GPU用于图形处理加速和视频输出(因此如果使用独立显卡输出,显示器视频线需要连到显卡的接口,而不是主板上的),同时包含了各类专用的加速单元(见第二章详细介绍)。(省流:可以用来玩原神) +后用于大量并行处理,如AI,科学计算等等。虽然GPU的计算能力远远大于CPU,但是各自特色分明: CPU擅长控制和逻辑,单核处理能力强的多,适合各种通用的场合; 而GPU仅适用于并行且逻辑简单的计算,以其独特的架构取胜。 #### 主板 -将各种硬件连接在一起,形成一个电路系统,为主芯片的工作提供各类条件支持 (如供电降压,数据的传输,机械支撑,芯片工作顺序的控制等),提供固件进行硬件自我检查和系统初始化,保存各个硬件的配置等。 +将各种硬件连接在一起,形成一个电路系统,为主芯片的工作提供各类条件支持(如供电降压,数据的传输,机械支撑,芯片工作顺序的控制等),提供固件进行硬件自我检查和系统初始化,保存各个硬件的配置等。 ![Notebook Internal](/assets/basic/03-computer-basic-knowledge-1/Notebook_Internal.jpg) -图 11。一台笔记本电脑内部,上部蓝色主板上集合了若干各式功能的组件 (笔者自摄) +图11. 一台笔记本电脑内部,上部蓝色主板上集合了若干各式功能的组件 (笔者自摄) ::: info 历史的注记 -早年的计算机各个部件都是一个个独立的芯片,如 8086 是控制器和运算器,8087 芯片实现浮点计算的功能,8089 芯片则提供接口的功能,以及 82 系列的若干个功能芯片。后随着时代发展,这些功能被整合至一整个芯片上,称为 SoC(System On Chip,片上系统)。 +早年的计算机各个部件都是一个个独立的芯片,如8086是控制器和运算器,8087芯片实现浮点计算的功能,8089芯片则提供接口的功能,以及82系列的若干个功能芯片。后随着时代发展,这些功能被整合至一整个芯片上,称为SoC(System On Chip, 片上系统)。 ::: #### 电源 -为各类电子元件提供电力。CPU 和 GPU 核心的工作电压通常很低,只有 1V 左右,比一节干电池的电压还来得低,但是工作电流很高,有几十至上百 A。其他辅助芯片的电压通常也只需要 5 V 以内的直流供电。但是一般家庭供电是 220 V,50 Hz 交流,因此需要此模块进行逐级降低,提供工作所需的大电流低电压。 +为各类电子元件提供电力。CPU和GPU核心的工作电压通常很低,只有1V左右,比一节干电池的电压还来得低,但是工作电流很高,有几十至上百A。其他辅助芯片的电压通常也只需要5 V以内的直流供电。但是一般家庭供电是220 V, 50 Hz交流,因此需要此模块进行逐级降低,提供工作所需的大电流低电压。 #### 外设 -外设种类众多,提供计算机对外的数据接口,如有线或无线网卡可以使计算机连接到以太网,鼠标、键盘、显示器和声卡是人机交互的接口,而众人熟知的 USB 接口是各类外部设备与计算机进行交互的标准实现。设备种类众多,此处不一一赘述。 +外设种类众多,提供计算机对外的数据接口,如有线或无线网卡可以使计算机连接到以太网,鼠标、键盘、显示器和声卡是人机交互的接口,而众人熟知的USB接口是各类外部设备与计算机进行交互的标准实现。设备种类众多,此处不一一赘述。 -Peripheral Component Interconnect Express,简称 PCI-E,官方简称 PCIe,由早年的 PCI 接口演变而来。是计算机总线的一个重要分支,用于 CPU 系统与其他设备比如 GPU、网卡、固态硬盘的连接,也可以延伸到芯片组间的连接,其最大特点是标准化,模块化和可移植性,一个显卡或网卡可以插入不同的电脑均可自动正常运作。 +Peripheral Component Interconnect Express,简称PCI-E,官方简称PCIe,由早年的PCI接口演变而来。是计算机总线的一个重要分支,用于CPU系统与其他设备比如GPU、网卡、固态硬盘的连接,也可以延伸到芯片组间的连接,其最大特点是标准化,模块化和可移植性,一个显卡或网卡可以插入不同的电脑均可自动正常运作。 -从 2003 发布 PCIe 1.0 至如今,PCIe 速率有着大幅进步,由 1.0 的 2.5GT/s,2.0 的 5GT/s 至 3.0 达到 8GT/s,4.0 则高达 16GT/s。 -PCIe 由电源,一些辅助信号和若干条 Lane 组成,不同的 Lane 间数据并行传输,提高了传输速率。一个 Lane 由两根线组成,其之间相互电磁耦合,有效降低信号干扰和外部的电磁噪声,从而实现了极高的传输速率 (参见双绞线以了解其物理原理)。GT/s 代表一条链每秒钟传输 16G 次,每次一条链估算近似能传送 1bit(8 个比特组成一个字节),故对于一个 PCIe 4.0 x4 的固态硬盘,其最大传输速率大致为 16GT/s*4lanes/8bit=8GB/s。 +从2003发布PCIe 1.0至如今,PCIe速率有着大幅进步,由1.0的2.5GT/s,2.0的5GT/s至3.0达到8GT/s,4.0则高达16GT/s。 +PCIe由电源,一些辅助信号和若干条Lane组成,不同的Lane间数据并行传输,提高了传输速率。一个Lane由两根线组成,其之间相互电磁耦合,有效降低信号干扰和外部的电磁噪声,从而实现了极高的传输速率(参见双绞线以了解其物理原理)。GT/s代表一条链每秒钟传输16G次,每次一条链估算近似能传送1bit(8个比特组成一个字节),故对于一个PCIe 4.0 x4的固态硬盘,其最大传输速率大致为16GT/s*4lanes/8bit=8GB/s。 ### 软件 -软件根据其功能不同也可以分为很多种,有一些软件是直接跟硬件打交道的,而另一些软件则直接跟用户打交道。前者包含操作系统和硬件驱动程序,而后者是我们平时使用的各类应用程序。另外,人们发现,各类软件有很多功能是相同的,于是人们开发了各种各样的 “库” 这个软件,为各个软件公用。 -操作系统为上层的各类用户软件提供了对各种资源,比如处理器、内存、网络、各种外部设备如打印机等的统一抽象和管理,使得大部分应用程序在大部分不同的硬件上都能正确、安全、高效地运行,简化了应用程序员的工作,同时也将不同资源进行隔离,尽可能防止有缺陷或者恶意的程序影响其他程序运行。 +软件根据其功能不同也可以分为很多种,有一些软件是直接跟硬件打交道的,而另一些软件则直接跟用户打交道。前者包含操作系统和硬件驱动程序,而后者是我们平时使用的各类应用程序。另外,人们发现,各类软件有很多功能是相同的,于是人们开发了各种各样的“库”这个软件,为各个软件公用。 +操作系统为上层的各类用户软件提供了对各种资源,比如处理器、内存、网络、各种外部设备如打印机等的统一抽象和管理,使得大部分应用程序在大部分不同的硬件上都能正确、安全、高效地运行,简化了应用程序员的工作,同时也将不同资源进行隔离,尽可能防止有缺陷或者恶意的程序影响其他程序运行。 -这一节我们着重介绍 Windows 操作系统和 Linux 操作系统。 +这一节我们着重介绍Windows操作系统和Linux操作系统。 #### Windows -Windows 是微软公司开发的图形化操作系统,具有成熟的图形界面。同学们个人计算机日常使用的系统很可能就是 Windows (苹果用户除外)。Windows 系统较为庞大,里面很多组件在日常使用中完全用不到,甚至是以一种历史包袱的形式存在。不过正因为如此,很多老旧的将近20年前的 Windows 软件仍然能在最新的系统中正常运行。 +Windows是微软公司开发的图形化操作系统,具有成熟的图形界面。同学们个人计算机日常使用的系统很可能就是Windows(苹果用户除外)。Windows系统较为庞大,里面很多组件在日常使用中完全用不到,甚至是以一种历史包袱的形式存在。不过正因为如此,很多老旧的将近20年前的Windows软件仍然能在最新的系统中正常运行。 #### Linux -从1991年 Linus 宣告 Linux 的存在,到2024年,Linux 已经走过 30 多个年头。下面是 Linus 向社区宣告 Linux 存在的邮件 (尽管当时还没有名字): +从1991年Linus宣告Linux的存在,到2024年,Linux已经走过30多个年头。下面是Linus向社区宣告Linux存在的邮件(尽管当时还没有名字): ``` Hello everybody out there using minix - @@ -195,62 +195,62 @@ It is NOT protable (uses 386 task switching etc), and it probably never will support anything other than AT-harddisks, as that's all I have :-(. ``` -严格来说,Linux 只是一个 “操作系统内核”,并没有包含用户态的程序,而一般来说,一个完整的操作系统需要包含用户态的一些基础设施,比如供更上层应用程序使用的库函数,以及用于管理其他软件和硬件,但不必放进内核态的程序。目前说 Linux 操作系统,一般指的是基于 Linux 内核衍生的各大发行版。大多发行版采用了来自 GNU 这个组织制作的各类辅助基础设置,故全名为 GNU/Linux。各种 Linux 发行版为 Linux 内核配置了一系列用户态程序,这样才能构成一个完整的操作系统。 +严格来说,Linux只是一个“操作系统内核”,并没有包含用户态的程序,而一般来说,一个完整的操作系统需要包含用户态的一些基础设施,比如供更上层应用程序使用的库函数,以及用于管理其他软件和硬件,但不必放进内核态的程序。目前说Linux操作系统,一般指的是基于Linux内核衍生的各大发行版。大多发行版采用了来自GNU这个组织制作的各类辅助基础设置,故全名为GNU/Linux。各种Linux发行版为Linux内核配置了一系列用户态程序,这样才能构成一个完整的操作系统。 -与 Windows 内核 (名字是 NT 内核) 不同,Linux 内核并不直接提供图形界面,只提供了最基本的各个接口,Linux 发行版的图形界面属于用户态程序,且是选配的。因此对于一个不需要图形界面的服务器,完全可以省下这一笔空间。与 Windows 不同,在 Linux 发行版中,Linux 内核和系统的其他组建完全都是由一个个软件包组成的,如果你不需要某个功能,完全可以将相应的软件包移除。也可以用其他功能类似的软件包替换某个软件包。系统具有高度可定制性。 +与Windows内核(名字是NT内核)不同,Linux内核并不直接提供图形界面,只提供了最基本的各个接口,Linux发行版的图形界面属于用户态程序,且是选配的。因此对于一个不需要图形界面的服务器,完全可以省下这一笔空间。与Windows不同,在Linux发行版中,Linux内核和系统的其他组建完全都是由一个个软件包组成的,如果你不需要某个功能,完全可以将相应的软件包移除。也可以用其他功能类似的软件包替换某个软件包。系统具有高度可定制性。 -Linux 是一种类 Unix 操作系统,API 符合 POSIX 标准。 +Linux是一种类Unix操作系统,API符合POSIX标准。 ::: info 历史的注记 -微软在 21 世纪初将 Linux 称作 “癌症”,认为 Linux 侵犯了知识产权,试图在客户中培育对 Linux 的恐慌,并以专利威胁起诉 Linux 开发者。然而十年后,微软表示 “We love Linux”,可能是因为 Linux 在服务器市场占有率已经很高了。不过,由于微软曾经和网景和 Sun(Java) 上 “Embrace,extend,and extinguish” 的 3E 战略垄断扼杀的黑历史,大家依然对微软的举动保持警惕。 +微软在21世纪初将Linux称作“癌症”,认为Linux侵犯了知识产权,试图在客户中培育对Linux的恐慌,并以专利威胁起诉Linux开发者。然而十年后,微软表示“We love Linux”,可能是因为Linux在服务器市场占有率已经很高了。不过,由于微软曾经和网景和Sun(Java)上"Embrace, extend, and extinguish"的3E战略垄断扼杀的黑历史,大家依然对微软的举动保持警惕。 ::: ::: info 历史的注记 -Windows 有一个臭名昭著的 “功能”————蓝屏死机,Blue Screen of Death,非常的生动形象 (:。这是 NT 内核在遇到不可恢复的错误时产生的错误提示信息,系统将进行冻结并重启把正在进行的事情搞砸 (我论文还没保存呢!),由于蓝色色调本身较冷,以及早期 Windows 给人以不稳定的印象,这个界面因此变得声名狼藉。而对于 Linux,这个情况被称为 panic。Linux 内核并不会出现蓝屏,一方面是 Linux 的错误分级相对良好,驱动常年迭代更新,在一些不重要的错误情况 (注:曾经有过某些 Windows 驱动开发者为了便于调试,在任何错误的条件下使用蓝屏的手段以导出状态进行调试。这一特性被继承到了实际用户手上) 下允许内核 “带病运行” (这不一定是好事),另一则是由于 Linux 无法直接提供图形界面,因此内核错误信息只显示在非图形界面的终端上,使用图形界面的用户只能看到大写锁定键的灯光一直闪烁,看不到任何提示信息。最近 Linux 内核开发者试图在内核严重错误时绘制一个黑色界面,并展示一个二维码作为错误提示信息。 +Windows有一个臭名昭著的“功能”————蓝屏死机,Blue Screen of Death,非常的生动形象(:。这是NT内核在遇到不可恢复的错误时产生的错误提示信息,系统将进行冻结并重启把正在进行的事情搞砸(我论文还没保存呢!),由于蓝色色调本身较冷,以及早期Windows给人以不稳定的印象,这个界面因此变得声名狼藉。而对于Linux,这个情况被称为panic。Linux内核并不会出现蓝屏,一方面是Linux的错误分级相对良好,驱动常年迭代更新,在一些不重要的错误情况(注: 曾经有过某些Windows驱动开发者为了便于调试,在任何错误的条件下使用蓝屏的手段以导出状态进行调试。这一特性被继承到了实际用户手上)下允许内核“带病运行”(这不一定是好事),另一则是由于Linux无法直接提供图形界面,因此内核错误信息只显示在非图形界面的终端上,使用图形界面的用户只能看到大写锁定键的灯光一直闪烁,看不到任何提示信息。最近Linux内核开发者试图在内核严重错误时绘制一个黑色界面,并展示一个二维码作为错误提示信息。 ::: #### 其他操作系统 -- MacOS:苹果专用,符合 POSIX 标准的 Unix 系统,老版本可在 Intel 机器安装 (需要魔法),内核叫 Darwin,修改自 BSD 系内核,内核部分开源 -- FreeBSD:符合 POSIX 标准的类 Unix 系统,和 Linux 只是内核不同,FreeBSD 带有完整的用户态程序,同时其采用更宽松的许可协议,而不是 Linux 的 GPLv2。 -- MSDOS:古老的操作系统,无图形界面,已不使用,微软近期开源了几个版本的 DOS。FreeDOS 则是由其他志愿者实现的开源版本替代。 +- MacOS: 苹果专用,符合POSIX标准的Unix系统,老版本可在Intel机器安装(需要魔法),内核叫Darwin,修改自BSD系内核,内核部分开源 +- FreeBSD: 符合POSIX标准的类Unix系统,和Linux只是内核不同,FreeBSD带有完整的用户态程序,同时其采用更宽松的许可协议,而不是Linux的GPLv2。 +- MSDOS: 古老的操作系统,无图形界面,已不使用,微软近期开源了几个版本的DOS。FreeDOS则是由其他志愿者实现的开源版本替代。 #### 移动操作系统 -- Android:Google 开发的基于 Linux 内核的操作系统,Google 自己在上面开发了 AOSP 一套基础设施环境。 -- iOS:苹果公司的产品,2007年随 iPhone 横空问世,基于 Darwin 内核开发,封闭性较强。 +- Android: Google开发的基于Linux内核的操作系统,Google自己在上面开发了AOSP一套基础设施环境。 +- iOS: 苹果公司的产品,2007年随iPhone横空问世,基于Darwin内核开发,封闭性较强。 #### 应用程序 ##### 可执行文件 在冯诺依曼机内,数据和指令均被存储在磁盘内。为了存储这些这些信息,将其抽象为一个个文件,比如有的储存图片,有的储存程序,有的储存文字信息。每一类信息,都可以一种或多种文件格式保存在电脑存储中。 -程序代码也是以一种文件的形式存储,称为可执行文件,具有其特定的储存编码方式,记录了程序启动的方式和环境需求。Windows 中其格式被称为可移植可执行文件 (PE),而 Linux 下则称为 ELF(Executable and Linkable Format)。PE 格式也被用于 EFI 程序和 vmlinuz (压缩的 Linux 内核镜像) 封装。 -当执行可执行文件时,操作环境 (比如 bash 或者 Windows 资源管理器 explorer.exe) 会请求 OS 读取该文件并加载准备所需的环境 (如创造进程,准备文件描述符,准备虚拟地址空间并建立映射,进行动态链接等)。 +程序代码也是以一种文件的形式存储,称为可执行文件,具有其特定的储存编码方式,记录了程序启动的方式和环境需求。Windows中其格式被称为可移植可执行文件(PE),而Linux下则称为ELF(Executable and Linkable Format)。PE格式也被用于EFI程序和vmlinuz(压缩的Linux内核镜像)封装。 +当执行可执行文件时,操作环境(比如bash或者Windows资源管理器explorer.exe)会请求OS读取该文件并加载准备所需的环境(如创造进程,准备文件描述符,准备虚拟地址空间并建立映射,进行动态链接等)。 ##### 进程 -一个进程 (Process) 包含了一个程序运行的全部状态和属性。这也是冯诺依曼机的核心思想,当你获得了程序在内存以及寄存器中的状态也就得到了一切。一个例子是休眠,计算机可冻结并将内存写回硬盘并关机,随后在下次开机后恢复,维持原先的程序运行。 -操作系统对各个进程分配资源,相互隔离并不断地进行时分复用 (硬件上存在一个可编程的计时器每隔固定的间隔触发中断将处理器控制权交由操作系统),以实现一个系统上同时进行多任务 (早期的如 DOS 系统只能同时进行一个程序)。 +一个进程(Process)包含了一个程序运行的全部状态和属性。这也是冯诺依曼机的核心思想,当你获得了程序在内存以及寄存器中的状态也就得到了一切。一个例子是休眠,计算机可冻结并将内存写回硬盘并关机,随后在下次开机后恢复,维持原先的程序运行。 +操作系统对各个进程分配资源,相互隔离并不断地进行时分复用(硬件上存在一个可编程的计时器每隔固定的间隔触发中断将处理器控制权交由操作系统),以实现一个系统上同时进行多任务(早期的如DOS系统只能同时进行一个程序)。 ##### 线程 -线程 (Thread) 是轻量级的进程,一个进程可建立多个线程子程序任务同时执行。一般进程具有处理器和内存地址的隔离,而一个进程下的线程仅有处理器的隔离,虚拟内存地址是共用的,不同线程之间的通信成本要比进程之间小很多。 +线程(Thread)是轻量级的进程,一个进程可建立多个线程子程序任务同时执行。一般进程具有处理器和内存地址的隔离,而一个进程下的线程仅有处理器的隔离,虚拟内存地址是共用的,不同线程之间的通信成本要比进程之间小很多。 ##### 例外 -例外 (Exception),有些时候翻译为异常 (此处异常通常指代 abnormality,对于硬件系统中通常异常不等于错误),通常后者称呼使用更多 (后续使用异常这一称呼)。 +例外(Exception),有些时候翻译为异常(此处异常通常指代abnormality,对于硬件系统中通常异常不等于错误),通常后者称呼使用更多(后续使用异常这一称呼)。 通常异常的产生代表的是发生了一些例外情况,因此往往也代表着移交控制权,可以发生在硬件层面,也可以发生在软件层面。 硬件层面的异常通常包含有: -1. 来自硬件的中断 (Interrupt),比如键盘按下了一个键,或外设如网卡已经获取数据并已将其写入了内存,随后发出中断令处理器切换至相应的处理程序进行响应; -2. 陷阱 (Trap),包括调试陷阱,以及来自软件主动请求的系统调用 (以前也称软件中断)。前者可用于程序的调试 (或者程序运行中对某些状态进行捕获),而后者目的通常是向 OS 发出某些请求如打开文件等; -3. 故障 (Fault),通常是可以恢复的,也可能是有意为止的,可由硬件,也可由软件造成,发生后将调用内核内的故障处理程序处理并随后回到现场继续执行原先的代码,如发生了缺页,除法除数为 0,硬件发生了故障等,在不能处理时也会导致程序终止; -4. 终止 (Abort),也就是不可以恢复的严重问题,比如机器检查 (一般是严重的硬件错误导致)、双重故障 (也就是在处理故障时发生了另一个故障,一个简单的例子是缺页处理程序被交换出去,导致发生缺页时找不到缺页处理程序,从而发生另一个缺页故障) 等。 +1. 来自硬件的中断(Interrupt),比如键盘按下了一个键,或外设如网卡已经获取数据并已将其写入了内存,随后发出中断令处理器切换至相应的处理程序进行响应; +2. 陷阱(Trap),包括调试陷阱,以及来自软件主动请求的系统调用(以前也称软件中断)。前者可用于程序的调试(或者程序运行中对某些状态进行捕获),而后者目的通常是向OS发出某些请求如打开文件等; +3. 故障(Fault),通常是可以恢复的,也可能是有意为止的,可由硬件,也可由软件造成,发生后将调用内核内的故障处理程序处理并随后回到现场继续执行原先的代码,如发生了缺页,除法除数为0,硬件发生了故障等,在不能处理时也会导致程序终止; +4. 终止(Abort),也就是不可以恢复的严重问题,比如机器检查(一般是严重的硬件错误导致)、双重故障(也就是在处理故障时发生了另一个故障,一个简单的例子是缺页处理程序被交换出去,导致发生缺页时找不到缺页处理程序,从而发生另一个缺页故障)等。 ## 计算机网络 我们这辈人生活在一个高度信息化的时代中,自打记事开始,很多人就知道网络,并且经常在网上进行查找资料,聊天视频,联机游戏等活动。那么计算机网络究竟是如何组织起来的呢?我们这篇文章将做一些简要的介绍 -### OS/I 七层模型 +### OS/I七层模型 ``` -------------- @@ -270,40 +270,40 @@ Windows 有一个臭名昭著的 “功能”————蓝屏死机,Blue Scr -------------- ``` -目前基本不再使用 5、6 层的说法,按照 OS/I 的定义和现在的实际情况,5、6 层功能被 4、7 层包含。各层具体的作用我们以后再提。 +目前基本不再使用5、6层的说法,按照OS/I的定义和现在的实际情况,5、6层功能被4、7层包含。各层具体的作用我们以后再提。 -### TCP/IP 协议 +### TCP/IP协议 -TCP 和 IP 协议分别工作在上述模型的第四层和第三层,IP 协议为世界上每一个能连入全球互联网的设备分配一个地址,同时提供不可靠的包交换服务。数据包指的是一段长度有限 (但不总是固定) 的数据,不可靠的包交换意思是把数据包从出发地传送到目的地,但是不保证包按照顺序到达,不保证有且仅有一个包到达,不保证包内容正确。 +TCP和IP协议分别工作在上述模型的第四层和第三层,IP协议为世界上每一个能连入全球互联网的设备分配一个地址,同时提供不可靠的包交换服务。数据包指的是一段长度有限(但不总是固定)的数据,不可靠的包交换意思是把数据包从出发地传送到目的地,但是不保证包按照顺序到达,不保证有且仅有一个包到达,不保证包内容正确。 -IP 协议目前有两个版本,一个是 IPv4,其地址由点分十进制,也就是类似于 111.111.111.111 的形式表示,每个十进制范围是 0-255,同时有许多地址被保留,如 127.xxx.xxx.xxx,10.xxx.xxx.xxx,192.168.xxx.xxx,0.0.0.0,255.255.255.255 等等,它们或被用于标示本机回环地址,或被用于局域网内,或被用于广播地址或保留地址。即使不考虑上述情况,IPv4 也只能为最多 4294967296 (42 亿) 个设备分配唯一地址,很明显目前地球上的人口数已经远远超过这个数值,IPv4 已经接近枯竭。目前的缓解办法包括 NAT 等协议使得多台设备共用一个公网 IP,但是这样会存在很多不方便的地方。 +IP协议目前有两个版本,一个是IPv4,其地址由点分十进制,也就是类似于111.111.111.111的形式表示,每个十进制范围是0-255,同时有许多地址被保留,如127.xxx.xxx.xxx,10.xxx.xxx.xxx,192.168.xxx.xxx,0.0.0.0,255.255.255.255等等,它们或被用于标示本机回环地址,或被用于局域网内,或被用于广播地址或保留地址。即使不考虑上述情况,IPv4也只能为最多4294967296(42亿)个设备分配唯一地址,很明显目前地球上的人口数已经远远超过这个数值,IPv4已经接近枯竭。目前的缓解办法包括NAT等协议使得多台设备共用一个公网IP,但是这样会存在很多不方便的地方。 -> [!IMPORTANT] 练习 -> 114.514.1919.810 是不是有效的 IPv4 地址? +> [!IMPORTANT] 练习 +> 114.514.1919.810是不是有效的IPv4地址? -目前正在快速普及的 IPv4 的后继者是 IPv6,其地址由冒号分隔的 16 进制组成,长度是 128bit。如果地址中存在连续多项 0,可以用两个冒号替代,但是只能替代一次。下面是一些 IPv6 的地址示例: +目前正在快速普及的IPv4的后继者是IPv6,其地址由冒号分隔的16进制组成,长度是128bit。如果地址中存在连续多项0,可以用两个冒号替代,但是只能替代一次。下面是一些IPv6的地址示例: ``` ::1 240c:c001:1014:4a3a:22f7:cb5f:88e2:219d fe80::b7bf:964:d695:708d ``` -IPv6 资源丰富很多,基本不会存在枯竭问题。 +IPv6资源丰富很多,基本不会存在枯竭问题。 -TCP 是在 IP 之上的协议,利用 IP 协议提供的不可靠数据传输,为上层提供流式的端到端可靠数据传输。端口号是在这一层协议定义的。TCP 协议存有状态,必须先双方三次交互建立连接,每个数据报文对方都要确认,报文都带有编号和校验码,确保报文正确按顺序到达。TCP 不能保证服务质量,比如传输速率。 +TCP是在IP之上的协议,利用IP协议提供的不可靠数据传输,为上层提供流式的端到端可靠数据传输。端口号是在这一层协议定义的。TCP协议存有状态,必须先双方三次交互建立连接,每个数据报文对方都要确认,报文都带有编号和校验码,确保报文正确按顺序到达。TCP不能保证服务质量,比如传输速率。 ::: details UDP协议 -与 TCP 同层还有 UDP 协议。UDP 协议不提供可靠传输服务,无状态,适合对数据准确性要求不高但是追求数据快速到达的场景,也适合上层实现别的可靠传输协议。 +与TCP同层还有UDP协议。UDP协议不提供可靠传输服务,无状态,适合对数据准确性要求不高但是追求数据快速到达的场景,也适合上层实现别的可靠传输协议。 ::: ::: info 提示 -指定端口号的地址,IPv4 可以写作 127.0.0.1:8080 这种形式,IPv6 可以写成 [::1]:8080 的形式。 +指定端口号的地址,IPv4可以写作127.0.0.1:8080这种形式,IPv6可以写成[::1]:8080的形式。 ::: -### DNS 协议 +### 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 服务的信息。 +以前国内的网络运营商默认提供的DNS有时会遭到污染,进行植入广告等操作,这时候你可以自行更换DNS地址,你可以在互联网上查询到关于如何更换以及更换为哪些声誉较好的DNS服务的信息。 ::: diff --git a/basic/04-computer-basic-knowledge-2.md b/basic/04-computer-basic-knowledge-2.md index 2e9cccb..b1b1232 100644 --- a/basic/04-computer-basic-knowledge-2.md +++ b/basic/04-computer-basic-knowledge-2.md @@ -15,7 +15,7 @@ 很多技术,在历史的长河中被淘汰。 然而,对于技术本身的态度,从人角度出发的一种价值评价,应当是谨慎和辩证的。 -我们应当认识到: +我们应当认识到: 1. 任何的陈述是片面的,有条件的。因此价值评价也是如此。 2. 实践是检验的唯一标准,但检验是有限的,条件是运动变化的。因此不能穷尽。 @@ -23,44 +23,44 @@ 一些技术,过去算力不够,无法实现,因为条件不足被淘汰了。但是随着时间变化,时机成熟,又成功了。 或是,一些技术在一些领域里效果不理想,但在其他领域则大放光彩。 甚至另有一些技术,效果优异,但是由于势力和话语权较弱,或是商业不成功,最终被其他技术利益集团抹杀了。 -没有一项技术能够解决万事万物,技术成功的条件因素众多,而其条件在不断的发生变化,而某些时候这种变化是较为反直觉的。 +没有一项技术能够解决万事万物,技术成功的条件因素众多,而其条件在不断的发生变化,而某些时候这种变化是较为反直觉的。 因此进行价值评价,应当认识到其存在的这些特点。 ## 衡量计算机的指标——面向最终交付的评价 ### 能耗与功耗 今天,对于几乎所有类型的计算机,电力是工程师面对的最大挑战。 -对于一个桌面和服务器处理器,其工作电流可达到几十 A 至几百 A 不等,而对于移动端最高亦有十几 A,因此芯片管脚的电流密度很高。 +对于一个桌面和服务器处理器,其工作电流可达到几十A至几百A不等,而对于移动端最高亦有十几A,因此芯片管脚的电流密度很高。 而另一点,处理器运行产生的热量需要耗散,以维持芯片正常工作温度。 -能耗和功耗的定义,读者应当是很容易回答的:功耗是芯片单位时间消耗的电能,而能耗是芯片消耗单位电能完成的工作量。 +能耗和功耗的定义,读者应当是很容易回答的: 功耗是芯片单位时间消耗的电能,而能耗是芯片消耗单位电能完成的工作量。 在比较处理器之间的价值,后者指标似乎更好,对于手机与笔记本电脑,我们希望续航更久;而对于数据中心,我们希望相同一度电能创造更多价值。 而对于前者,功耗通常被作为计算机设计的约束条件,在各类场景下,其有着不同的数值。如对于手机,过高的功耗会导致手机过热从而使消费者不适,并影响其他组件寿命。 -而对于个人电脑和服务器,其散热条件具有能力上限 (如水冷比风冷散热能力更强,因此可以选用功耗更高的处理器),主板降压配电能力也有上限,芯片工作不应当超越这些约束条件,否则造成设备损毁。我们需要仔细区别这两个概念。 +而对于个人电脑和服务器,其散热条件具有能力上限(如水冷比风冷散热能力更强,因此可以选用功耗更高的处理器),主板降压配电能力也有上限,芯片工作不应当超越这些约束条件,否则造成设备损毁。我们需要仔细区别这两个概念。 而一种更直观的理解,计算机是消耗电力的印钞机,电源一插,黄金万两,因此为了能产出更多的钱,我们的期待实际上是期望其消耗更多电能印更多的钱,印钱速度越高越好。但实际情况一是这一能力具有上限,二是二者的曲线具有非线性的特点,也就是具有边际效益。 ::: details 处理器的热效应 通常芯片一部分功耗以如驱动信号这样的形式耗散,而剩余绝大多数功耗以热量形式散失。 -常常我们能见到 TDP (热设计功耗) 这个概念,其代表了在较长的持续时间下,为实现处理器能够持续运作在基础频率,需要满足的散热条件,是芯片功耗的平均预算。 -产生的热量的吸收和传播需要一定时间,而芯片又往往不是长时间运行在最高负荷的情况,因此发明了睿频技术,允许在温度还不是很高的时候 (实际上温度越低,芯片运行速度更快,因此有极客通过液氮冷却超频以追求最高性能),在瞬时的一些情况下通过增加电压增加功耗 (相当多,很不节能!) 的方式提高一瞬时的运行速度,从而降低了延迟提高了响应速度 (如在一台闲置的电脑上打开 Office),改善用户体验。 -通常处理器制造时会产生一些缺陷,于是导致某些处理器运行的速度较慢或不能运行,因此制造厂家为了减少损失对处理器的运行频率进行限制 (也叫锁倍频。对于 Intel 处理器,没有锁倍频的通常会标有 K 字母,允许用户修改使处理器运行在任何频率下) 且增加一定的电压 (某些核心不仅不能运行的更快,在相同频率下也比其他核心需要更高的电压,因此体质不同的处理器功耗也存在一些差异),或屏蔽了一些功能如屏蔽了一些数量的处理器或集成显卡的核心,形成了不同的型号 (如 Intel i3,i5 和 i7)。 -TDP 不是因,而是果,是芯片运行时产生不得不需要散失的热量所导致的。因此对于同个型号的处理器,运行的频率越高从而性能越高,而由于频率变高电压增高 (为了保证更高频率下运行不出错,不得不增加电压以加速晶体管的翻转) 所以功耗也高,产生的热量更多,需要 TDP 更高的散热能力。不过对于某些设备散热条件不佳 (如单管压 i9,轻薄本,被动散热的平板等),OEM 制造商或芯片制造厂家需要进一步增加额外的功耗限制,禁止处理器产生热量过多从而损毁处理器。早期 Intel 增加了一些具有不同的 TDP 限制的 SKU (面向各个场景) 供给厂家使用,而后来增加了 cTDP 参数,可以由 OEM 厂家进行配置修改。 -而实际上今日 OEM 制造商选择一个更好的策略:只要芯片运行温度不超过限制,就一直允许 CPU 运行在最高速度下。 +常常我们能见到TDP(热设计功耗)这个概念,其代表了在较长的持续时间下,为实现处理器能够持续运作在基础频率,需要满足的散热条件,是芯片功耗的平均预算。 +产生的热量的吸收和传播需要一定时间,而芯片又往往不是长时间运行在最高负荷的情况,因此发明了睿频技术,允许在温度还不是很高的时候(实际上温度越低,芯片运行速度更快,因此有极客通过液氮冷却超频以追求最高性能),在瞬时的一些情况下通过增加电压增加功耗(相当多,很不节能!)的方式提高一瞬时的运行速度,从而降低了延迟提高了响应速度(如在一台闲置的电脑上打开Office),改善用户体验。 +通常处理器制造时会产生一些缺陷,于是导致某些处理器运行的速度较慢或不能运行,因此制造厂家为了减少损失对处理器的运行频率进行限制(也叫锁倍频。对于Intel处理器,没有锁倍频的通常会标有K字母,允许用户修改使处理器运行在任何频率下)且增加一定的电压(某些核心不仅不能运行的更快,在相同频率下也比其他核心需要更高的电压,因此体质不同的处理器功耗也存在一些差异),或屏蔽了一些功能如屏蔽了一些数量的处理器或集成显卡的核心,形成了不同的型号(如Intel i3,i5和i7)。 +TDP不是因,而是果,是芯片运行时产生不得不需要散失的热量所导致的。因此对于同个型号的处理器,运行的频率越高从而性能越高,而由于频率变高电压增高(为了保证更高频率下运行不出错,不得不增加电压以加速晶体管的翻转)所以功耗也高,产生的热量更多,需要TDP更高的散热能力。不过对于某些设备散热条件不佳(如单管压i9,轻薄本,被动散热的平板等),OEM制造商或芯片制造厂家需要进一步增加额外的功耗限制,禁止处理器产生热量过多从而损毁处理器。早期Intel增加了一些具有不同的TDP限制的SKU(面向各个场景)供给厂家使用,而后来增加了cTDP参数,可以由OEM厂家进行配置修改。 +而实际上今日OEM制造商选择一个更好的策略:只要芯片运行温度不超过限制,就一直允许CPU运行在最高速度下。 ::: ### 性能 性能是永恒的话题。完成一项任务,时间越短越好。时间就是生命,效率就是金钱。 -时间等于一个程序运行需要运行的指令数和平均每个指令运行需要的时间相乘,而后者等于1秒钟除以芯片运行的平均频率和每个周期平均运行的指令数量的乘积。后者每个周期平均运行的指令数量通常被成为 IPC。 +时间等于一个程序运行需要运行的指令数和平均每个指令运行需要的时间相乘,而后者等于1秒钟除以芯片运行的平均频率和每个周期平均运行的指令数量的乘积。后者每个周期平均运行的指令数量通常被成为IPC。 对于不同的电脑,如果架构不同,程序的指令数量通常不一样。 -而对于不同的处理器,芯片能够持续运行的最大平均频率和 IPC 也不同。 +而对于不同的处理器,芯片能够持续运行的最大平均频率和IPC也不同。 如何评价一个处理器的性能?这个问题是复杂的,归结为任务的复杂性和多样性。 -CPU 作为一种通用处理器,通用便意味着面向日常各种各样的应用,比如视频转码编辑,游戏,文字办公,程序编译等。 -不过尽管任务多种多样,但是大多数任务都具有某些种有限的特点,因此为了衡量一个 CPU 性能如何, -人们在这些各种各样的应用中选取了一些典型任务代表常见的任务情况,开发了基准测试程序,也叫 Benchmark。是骡子是马,溜一溜便知。 +CPU作为一种通用处理器,通用便意味着面向日常各种各样的应用,比如视频转码编辑,游戏,文字办公,程序编译等。 +不过尽管任务多种多样,但是大多数任务都具有某些种有限的特点,因此为了衡量一个CPU性能如何, +人们在这些各种各样的应用中选取了一些典型任务代表常见的任务情况,开发了基准测试程序,也叫Benchmark。是骡子是马,溜一溜便知。 -不过,Benchmark 不是永远有效的,有一些因素对其产生可观的影响。 +不过,Benchmark不是永远有效的,有一些因素对其产生可观的影响。 其中一个重要方面是,人们意识到可以通过对抗性的针对性的优化,或者对其运行规则做出对自己有利的解读。 这里强调的是针对性和对抗性,这种调优不具有普适性,也无法表征整体性能,除了使得数字上更好看,没有什么实际价值。 但是,于此同时,需要认识到软件上的优化也是提高性能的非常重要的办法之一,如可以通过循环展开,向量化等操作获得很高的性能提升。 @@ -68,26 +68,26 @@ CPU 作为一种通用处理器,通用便意味着面向日常各种各样的 这是一个冲突性的,两面性的问题,因此需要辩证地参考,尽信书不如无书。 而典型任务也不代表全部任务,最终效果依然需要落实到实际的应用上。 -另一个有趣的例子是 GPU,作为专用的协处理器完成图像处理和 3D 渲染,面向了较高并行的任务进行了优化, -在一些任务,比如视频处理深度学习等,GPU 相比通用处理器具有巨大的性能提升 (从而极大的降低了成本,一张显卡的算力可以与百余核高端通用处理器相当,且相当便宜!),而在另一些任务中相差甚远,几乎不能完成。 -这一例子更加强调了系统的重要思想:设计最终目的是满足目标和功能。 +另一个有趣的例子是GPU,作为专用的协处理器完成图像处理和3D渲染,面向了较高并行的任务进行了优化, +在一些任务,比如视频处理深度学习等,GPU相比通用处理器具有巨大的性能提升(从而极大的降低了成本,一张显卡的算力可以与百余核高端通用处理器相当,且相当便宜!),而在另一些任务中相差甚远,几乎不能完成。 +这一例子更加强调了系统的重要思想: 设计最终目的是满足目标和功能。 ::: info 基准测试 -常见的 Benchmark 有如 Geekbench,Passmark,Spec2017,Cinebench,Blender Benchmark 等。 -Spec2017 包括浮点和整数两个部分,前者包含如 gcc 编译器,h264 视频编解码,后者包含如 imagick 图像处理和各类科学计算等。 +常见的Benchmark有如Geekbench,Passmark,Spec2017,Cinebench,Blender Benchmark等。 +Spec2017包括浮点和整数两个部分,前者包含如gcc编译器,h264视频编解码,后者包含如imagick图像处理和各类科学计算等。 ::: ### 成本 成本是一台计算机极为重要的考核指标,并且逐渐成为当下计算机行业的一个重要主题。 但一些时候,我们总会有意无意的忽视了这个问题。 -举一个比较简单的例子:一位同学,买了一台电脑,花了 3k5,用了一年损坏了,而另一个情况下,买了一台同样性能水准的电脑,花费了 3k5,用了五年而损坏。 +举一个比较简单的例子:一位同学,买了一台电脑,花了3k5,用了一年损坏了,而另一个情况下,买了一台同样性能水准的电脑,花费了3k5,用了五年而损坏。 而另外一个例子:某个同学因学习需要,由于性能和续航优异而亲睐一种以水果作为商标的某款电脑,但最终因囊中羞涩无力购买。 成本包括制造成本和运作成本,而利润是系统运行创造的价值除以其总成本减一。 -随着计算机商品的大众化,其一件产品的制造成本与售价之间的差额在不断的缩小,而大多数公司的研发费用只占其收入的 4%~12%。 -制造成本主要是指购买一件设备的单次投资,通常其包含了生产的成本与其他的支持成本 (如配套的操作系统和软件的研发与生态的维护), -而运作成本,在互联网大型数据中心是极为重要的,其包括电费,网费,冷却的费用 (如空调费),地皮空间的租金,以及设备损毁更换的开销等。 +随着计算机商品的大众化,其一件产品的制造成本与售价之间的差额在不断的缩小,而大多数公司的研发费用只占其收入的4%~12%。 +制造成本主要是指购买一件设备的单次投资,通常其包含了生产的成本与其他的支持成本(如配套的操作系统和软件的研发与生态的维护), +而运作成本,在互联网大型数据中心是极为重要的,其包括电费,网费,冷却的费用(如空调费),地皮空间的租金,以及设备损毁更换的开销等。 此外,我们需要注意到,成本是一个整体性的概念,是面向最终需求的解决方案不多不少,而不应当仅仅关注其内某个单一组件。 如小明需要进行深度学习的实践和学习,此外有游戏的需求,需要一台个人台式电脑。那么,他也许会更亲睐在显卡上做更多的投资。 @@ -100,14 +100,14 @@ Spec2017 包括浮点和整数两个部分,前者包含如 gcc 编译器,h26 而另一方面,成本也成为了约束条件,当无法满足则没有讨论的意义。 ### 生态 -随着时代发展硬件进步速度逐渐减慢 (见后文),程序员越来越需要承担起提高程序性能的重担,对程序的优化日益显得尤为重要。 +随着时代发展硬件进步速度逐渐减慢(见后文),程序员越来越需要承担起提高程序性能的重担,对程序的优化日益显得尤为重要。 由于物理限制,处理器运行主频无法无限提升,因此提高性能的主要实现手段是增加并行性,即通过在单位时间内进行更多无关的计算。 程序优化是一个收益显著的事情。 -一个程序未经修改,通过编译器的优化便能获得几倍的性能提升。而通过程序员手工进行并行化编程,程序可以获得非常高的提升:如采用 SIMD 向量指令,即单个指令可以对一个向量内每个元素进行相同操作,从而单位时间计算量增加。或采用多核系统,无关的任务 (比如开视频的同时进行微信聊天) 之间不存在关联被分布于多个核上从而实现并行加速,而同一程序则可以通过各个线程分而执行相互同步,以提高性能。而经过精细设计构造从而运行于 GPU 的程序,通常可以获得更高的加速比,但是由于 GPU 专用的特点,程序员需要承担很大的心智负担,从而开发调试成本增加。 +一个程序未经修改,通过编译器的优化便能获得几倍的性能提升。而通过程序员手工进行并行化编程,程序可以获得非常高的提升:如采用SIMD向量指令,即单个指令可以对一个向量内每个元素进行相同操作,从而单位时间计算量增加。或采用多核系统,无关的任务(比如开视频的同时进行微信聊天)之间不存在关联被分布于多个核上从而实现并行加速,而同一程序则可以通过各个线程分而执行相互同步,以提高性能。而经过精细设计构造从而运行于GPU的程序,通常可以获得更高的加速比,但是由于GPU专用的特点,程序员需要承担很大的心智负担,从而开发调试成本增加。 -而这些优化通常离不开程序员对计算机系统的理解和熟悉,这些标准有 CPU 上的 ISA (见前一章),也有 GPU 系统的如来自 NVIDIA 公司的 CUDA API 和来自 AMD 的 Rocm。一些架构较为易用,程序员负担较小,设备比较大众通用和容易获取,来自制造商的支持较多,来自社区和商业的库较为丰富,从而程序员更倾向于于这些架构开发并进行针对优化,从而导致了程序与架构的黏性。而某些架构设备较为稀有,设计复杂,几乎没有资料和制造商的支持,或是乃至程序几乎无法正常运行,这些无疑增加了开发成本,让人望而生畏。CUDA 的日益垄断日益凸显了生态的重要性。 +而这些优化通常离不开程序员对计算机系统的理解和熟悉,这些标准有CPU上的ISA(见前一章),也有GPU系统的如来自NVIDIA公司的CUDA API和来自AMD的Rocm。一些架构较为易用,程序员负担较小,设备比较大众通用和容易获取,来自制造商的支持较多,来自社区和商业的库较为丰富,从而程序员更倾向于于这些架构开发并进行针对优化,从而导致了程序与架构的黏性。而某些架构设备较为稀有,设计复杂,几乎没有资料和制造商的支持,或是乃至程序几乎无法正常运行,这些无疑增加了开发成本,让人望而生畏。CUDA的日益垄断日益凸显了生态的重要性。 ## 计算机的过去,现在和未来 @@ -124,7 +124,7 @@ Spec2017 包括浮点和整数两个部分,前者包含如 gcc 编译器,h26 (TODO) ## 计算机层次化 -当今计算机系统复杂程度日益增高,为了构建高效、可维护和可扩展的系统,因此需要进行层次化。(也被称为 UNIX 哲学,但这一哲学思想不仅仅限于 UNIX 相关,可以说基本涵盖了计算机科学的方方面面。) +当今计算机系统复杂程度日益增高,为了构建高效、可维护和可扩展的系统,因此需要进行层次化。(也被称为UNIX哲学,但这一哲学思想不仅仅限于UNIX相关,可以说基本涵盖了计算机科学的方方面面。) ### 简单性 简单性即主张将复杂的问题分解为一系列简单的问题,然后分而治之。通过将系统分解为小的、独立的模块,每个部件只需要针对这个更小的问题进行研究,可以大幅降低复杂性,提高可维护性和可重用性。 ### 模块化 @@ -132,10 +132,10 @@ Spec2017 包括浮点和整数两个部分,前者包含如 gcc 编译器,h26 ### 标准化 标准化原则是实现模块化原则的重要手段。通过制定统一的规范和标准,不同的模块可以实现互操作和集成。降低了风险同时保持系统的稳定性和可维护性。 -- 在芯片制造领域,通常具有两大模式,一种称为 IDM (Integrated Device Manufacture) 模式,集芯片设计、芯片制造、芯片封装和测试等多个产业链环节于一身并进行联合优化,为早期多数集成电路企业采用的模式;而一种被称为 Fabless,这些芯片公司仅实现芯片的设计工作,并将图纸交由芯片代工厂 (通常成为 Fab) 进行生产,后者包括有台积电 (台湾积体电路制造有限公司,英文简称 TSMC)、中芯国际、三星、Global Foundries。设计和制造相分离的 Fabless 降低了设计人员的负担以及企业运行的投资和成本开销,为行业所亲睐。 +- 在芯片制造领域,通常具有两大模式,一种称为IDM(Integrated Device Manufacture)模式,集芯片设计、芯片制造、芯片封装和测试等多个产业链环节于一身并进行联合优化,为早期多数集成电路企业采用的模式;而一种被称为Fabless,这些芯片公司仅实现芯片的设计工作,并将图纸交由芯片代工厂(通常成为Fab)进行生产,后者包括有台积电(台湾积体电路制造有限公司,英文简称TSMC)、中芯国际、三星、Global Foundries。设计和制造相分离的Fabless降低了设计人员的负担以及企业运行的投资和成本开销,为行业所亲睐。 -- 而在芯片设计领域,有一些公司提供设计芯片所需要的工业软件 (称为 EDA),而有另一些公司则以兜售被称为 IP 的模块谋生,这些设计模块只可以完成某些小型的特定功能,如视频输出、图像处理、内存控制器等,以黑盒子出售给各个芯片设计公司。后者通过集成各种 IP 模块与其自己的设计实现拼接组合为最终的 SoC 芯片。 +- 而在芯片设计领域,有一些公司提供设计芯片所需要的工业软件(称为EDA),而有另一些公司则以兜售被称为IP的模块谋生,这些设计模块只可以完成某些小型的特定功能,如视频输出、图像处理、内存控制器等,以黑盒子出售给各个芯片设计公司。后者通过集成各种IP模块与其自己的设计实现拼接组合为最终的SoC芯片。 -- 在软件领域,这一现象更为普遍。人们将众多子程序集合 (也称为库) 单独分离出来成为一个个单独的文件,一些在程序编译链接时被其他开发者集合在一起,称为静态链接库;而另一些则是在运行时动态的被其他程序使用,则称为动态链接库。这些子程序用途广泛,有的可用于被开发图形界面如 Qt,有的则包含了视频格式的编解码算法程序,如 libx264,libsvtav1 等,而有一些库则将底层复杂的接口进一步整合抽象为更简单的函数功能。库大大方便了软件的开发,可以很容易地发布、替换或二次开发。 +- 在软件领域,这一现象更为普遍。人们将众多子程序集合(也称为库)单独分离出来成为一个个单独的文件,一些在程序编译链接时被其他开发者集合在一起,称为静态链接库;而另一些则是在运行时动态的被其他程序使用,则称为动态链接库。这些子程序用途广泛,有的可用于被开发图形界面如Qt,有的则包含了视频格式的编解码算法程序,如libx264,libsvtav1等,而有一些库则将底层复杂的接口进一步整合抽象为更简单的函数功能。库大大方便了软件的开发,可以很容易地发布、替换或二次开发。 diff --git a/basic/05-drive-your-computer-1.md b/basic/05-drive-your-computer-1.md index c516f39..26a1bef 100644 --- a/basic/05-drive-your-computer-1.md +++ b/basic/05-drive-your-computer-1.md @@ -10,19 +10,19 @@ 随着信息技术的快速发展,电脑已经成为学习和生活中最重要的工具之一。无论你是不是计算机相关专业的学生,电脑都是学习、娱乐中必不可少的伙伴。正因为如此,我们希望大家能够真正掌握电脑的使用技巧,充分发挥它的潜力。 -本文的主题是 “Drive Your Computer”,旨在帮助大家深入了解电脑的更多功能和使用技巧。我们将带领大家探索从基本操作到高级应用的各个方面,提升你们在学习和生活中的效率和生产力。不论你是刚刚接触电脑的新手,还是已经有一定基础的使用者,我们相信本指南都能为你提供有益的帮助。 +本文的主题是“Drive Your Computer”,旨在帮助大家深入了解电脑的更多功能和使用技巧。我们将带领大家探索从基本操作到高级应用的各个方面,提升你们在学习和生活中的效率和生产力。不论你是刚刚接触电脑的新手,还是已经有一定基础的使用者,我们相信本指南都能为你提供有益的帮助。 通过本文以及接下来的文章,你将接触一些好用的软件,知晓文件到底是什么,熟悉工作环境的安装配置;进而学会高效管理文件,运用版本控制工具,分析解决常见的故障;寻找自己所需的各类资源,并在此过程中规避常见的网络攻击。希望大家通过掌握这些技能,可以如意地使用电脑,让它成为自己的左膀右臂。 ::: info -本文的完成感谢 (leavelet)[https://github.com/leavelet] 和 (李尚泽)[https://github.com/LSZ2005] 的帮助。 +本文的完成感谢(leavelet)[https://github.com/leavelet]和(李尚泽)[https://github.com/LSZ2005]的帮助。 ::: -# 1。基本环境配置 +# 1. 基本环境配置 -近些年,基本的编程技能成为各个大学的必修课。在繁多的编程语言中,C、C++、Python 这三门语言是北京大学的基础编程课中涉及较多的三门。然而,对初学者而言,如何让代码 “跑起来” 是一道不小的难题——写下第一个 “Hello World”,却花费数个小时查阅资料、配好环境、让它运行,确实是一件较费心力的事。因此,我们希望提供一套简单易操作的流程,帮助大家配置好用、舒心的编程环境。 +近些年,基本的编程技能成为各个大学的必修课。在繁多的编程语言中,C、C++、Python这三门语言是北京大学的基础编程课中涉及较多的三门。然而,对初学者而言,如何让代码“跑起来”是一道不小的难题——写下第一个"Hello World",却花费数个小时查阅资料、配好环境、让它运行,确实是一件较费心力的事。因此,我们希望提供一套简单易操作的流程,帮助大家配置好用、舒心的编程环境。 -我们在此假设 Linux 使用者已经有相关基础,因此主要提供 Windows 与 MacOS 的配置流程。在后续的文档中,我们将为 Linux 系统的使用作更加详尽的介绍。 +我们在此假设Linux使用者已经有相关基础,因此主要提供Windows与MacOS的配置流程。在后续的文档中,我们将为Linux系统的使用作更加详尽的介绍。 ## 1.0 程序编写的过程 @@ -31,41 +31,41 @@ ![process](/assets/basic/05-drive-your-computer-1/processOfCoding.png) ::: info 提示 -python 等**解释型**语言,只有解释器。 +python等**解释型**语言,只有解释器。 ::: -读者要尤其注意 “编辑” 与 “编译” 的区别,“编辑” 是我们常说的 “敲代码” 的过程,而 “编译” 是编译器将代码**翻译**成计算机能理解的二进制 01101010......(也就是常说的可执行文件,如 Windows 中的 `.exe` 文件) 的过程,“编辑” 发生在 “编译” 之前的。理解这两个概念对于 “编程” 是至关重要的。 +读者要尤其注意“编辑”与“编译”的区别,“编辑”是我们常说的“敲代码”的过程,而“编译”是编译器将代码**翻译**成计算机能理解的二进制01101010......(也就是常说的可执行文件,如Windows中的`.exe`文件)的过程,“编辑”发生在“编译”之前的。理解这两个概念对于“编程”是至关重要的。 ## 1.1 C++环境配置——与课程评测系统保持一致 -在这部分中,我们希望尽量帮助大家获得与北京大学目前的 C++课程在线测评、考试系统所用的环境一致的编程环境,方便大家适应学校的教学。 +在这部分中,我们希望尽量帮助大家获得与北京大学目前的C++课程在线测评、考试系统所用的环境一致的编程环境,方便大家适应学校的教学。 ### 1.1.1 一些前置问题 -#### 什么是 GCC/MinGW? +#### 什么是GCC/MinGW? -GCC (GNU Compiler Collection) 是一类编译器集合。其中,gcc/g++分别是 GCC 下的 C/C++编译器。GCC 目前是 Linux 中最常用的编译器,也是大多数开源项目的首选编译器。 +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? +#### 什么是Clang/LLVM? Clang 是 C、C++、Objective-C 和 Objective-C++ 编程语言的编译器,基于 LLVM 实现,支持将代码编译到多架构、多平台。macOS 上,默认编辑器是基于 Clang 的 Apple Clang,请注意,Apple Clang 的特性与 GCC 或者标准 Clang 有所不同。macOS 上的 gcc 命令本质上也是 clang,所以我们推荐在 macOS 上安装和使用 gcc,具体可以参考 1.1.3 节 -#### 什么是 MSVC 和 Visual Studio? +#### 什么是MSVC 和 Visual Studio? -MSVC (Microsoft Visual C/C++) 是微软开发的一套 Windows 下的 C/C++编译器。Visual Studio 是微软的一款集成开发环境 (IDE),其中包含了 MSVC 编译器。 +MSVC(Microsoft Visual C/C++)是微软开发的一套Windows下的C/C++编译器。Visual Studio是微软的一款集成开发环境(IDE),其中包含了MSVC编译器。 #### 上面这几种编译器怎么选? -根据实际测试,学校相关课程的自动测评中使用 GCC 编译器,且默认使用 C++17 标准。学校机房内 IDE 环境提供的是 Visual Studio,部分机房也提供 VS Code,但是可能需要自行配置。因此,我们推荐使用 GCC 编译器,并且在编译时指定 C++17 标准,同时注意一些关于 Visual Studio 的特例。 +根据实际测试,学校相关课程的自动测评中使用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并不含有此头文件,这样做会使得代码不可移植,因此这个头文件只适合做题时使用。**但是你上大学又不是来做题的**。 :::

@@ -73,9 +73,9 @@ MSVC (Microsoft Visual C/C++) 是微软开发的一套 Windows 下的 C/C++编 转自2021年计算概论课程群

-#### Visual Studio,XCode,Dev-C++, VS Code 是什么?怎么选? +#### Visual Studio, XCode, Dev-C++, VS Code是什么?怎么选? -前三款软件是 IDE (集成开发环境)。其中,Visual Studio,XCode 分别是微软、苹果推出的 IDE,体量较大;Dev-C++是较老的 C++ IDE。VS Code 是一款可拓展的文本编辑器,其功能丰富,体量较轻。 +前三款软件是IDE(集成开发环境)。其中,Visual Studio,XCode分别是微软、苹果推出的IDE,体量较大;Dev-C++是较老的C++ IDE。VS Code 是一款可拓展的文本编辑器,其功能丰富,体量较轻。 一个趁手的编译环境能够让你专心于实现自己的想法,减少工具的束缚。总的来说,我们想要实现这些目标: @@ -84,92 +84,92 @@ MSVC (Microsoft Visual C/C++) 是微软开发的一套 Windows 下的 C/C++编 2. 拥有开放的插件生态和丰富的插件体系 3. 对编译器和调试器有一定的内嵌支持 -综合考虑以上要求,我们在这里推荐使用 VS Code 来构建你的编程环境。但我们推荐你在编程上机课使用机房的 Visual Studio,应对考试需求。 +综合考虑以上要求,我们在这里推荐使用VS Code来构建你的编程环境。但我们推荐你在编程上机课使用机房的 Visual Studio,应对考试需求。 -### 1.1.2 Windows 环境配置——以 Windows10、11 为例 +### 1.1.2 Windows环境配置——以Windows10、11为例 -以下分几个部分介绍 Windows 下的环境配置。 +以下分几个部分介绍Windows下的环境配置。 -#### 什么是环境变量?Path 是什么? +#### 什么是环境变量?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? +#### 如何下载安装VS Code? 请前往这个网址——[Visual Studio Code](https://code.visualstudio.com/),下载对应系统的安装文件并安装到所需目录。 -#### 如何获取合适版本的 MinGW,并添加到环境变量? +#### 如何获取合适版本的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 为例)。 +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 中安装合适的插件? +#### 如何在VS Code中安装合适的插件? -请打开 VS Code,在左侧边栏找到扩展模块,进入后搜索并下载插件。 +请打开VS Code,在左侧边栏找到扩展模块,进入后搜索并下载插件。 我们推荐如下插件:`C/C++`,`C/C++ Extension Pack`,`C/C++ Themes`,`Python`,`Python Debugger`,`Pylance`。 ::: info 提示 -需要使用简体中文界面的同学,请搜索 “简体中文”,找到 “Chinese (Simplified)(简体中文) Language Pack for Visual Studio Code”,安装后右下角会自动提示重启 VS Code 并更换显示语言。 +需要使用简体中文界面的同学,请搜索 “简体中文”,找到 “Chinese (Simplified)(简体中文) Language Pack for Visual Studio Code”,安装后右下角会自动提示重启VS Code并更换显示语言。 ::: -#### VS Code 的工作逻辑是什么? +#### VS Code的工作逻辑是什么? -`vscode` 分为全局和工作区两部分组成,结构如下图所示。每次打开 `vscode` 都会新建一个窗口,叫做 “工作区”。工作区中包含一个或多个文件夹,可以拥有与全局不同的设置。 +`vscode`分为全局和工作区两部分组成,结构如下图所示。每次打开`vscode`都会新建一个窗口,叫做“工作区”。工作区中包含一个或多个文件夹,可以拥有与全局不同的设置。 -如果工作区只有一个文件夹,配置会被放在该文件夹下 `.vscode` 文件夹中。如果有多文件夹,工作区配置会用一个 `code-workspace` 结尾的文件保存。 +如果工作区只有一个文件夹,配置会被放在该文件夹下`.vscode`文件夹中。如果有多文件夹,工作区配置会用一个`code-workspace`结尾的文件保存。 ![workspace](/assets/basic/05-drive-your-computer-1/workspace.png) -#### VS Code 如何打开文件夹、将工作设置保存到工作区便于取用? +#### VS Code如何打开文件夹、将工作设置保存到工作区便于取用? 1. 点击左侧边栏第一个按钮,点击打开文件夹,浏览到所需位置并打开。 -2. 点击界面上方的 “文件” 按钮,找到 “另存为工作区”,选择一个位置来保存工作区设置。 -3. 点击界面上方的 “文件” 按钮,点击 “从文件打开工作区”,浏览到刚才保存的文件,打开它。 -4. 如果想在这个工作区添加不同文件夹,如 “C++” “Python” 来便于管理作业,请点击界面上方的 “文件” 按钮,点击”将文件夹添加到工作区 “。 -5. 以后每次打开 VS Code 后,请从刚才保存的文件打开工作区。这个文件会保存各类设置,包括下文提到的内容。 +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 相匹配。这样,不会出现引用头文件却报错的情况。 +设定好前文所述的环境后,我们还需要调整C/C++插件的编译器路径和语法检查标准,与我们使用的gcc相匹配。这样,不会出现引用头文件却报错的情况。 -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。 -5. 在**刚才所选的文件夹**内创建 “.cpp” 后缀的文件,编写你的 C++程序。你会发现语法检查、include 路径检查都使用了相应环境。 +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。 +5. 在**刚才所选的文件夹**内创建".cpp"后缀的文件,编写你的C++程序。你会发现语法检查、include路径检查都使用了相应环境。 ![UI](/assets/basic/05-drive-your-computer-1/UI.png) -#### 编译运行你的 C++程序——使用终端 PowerShell +#### 编译运行你的C++程序——使用终端PowerShell -在 VS Code 编写完程序后,我们可以按如下步骤运行程序。 +在VS Code编写完程序后,我们可以按如下步骤运行程序。 -1. 使用组合键 “Ctrl+\`” 打开终端 (有些时候是 “Ctrl+Shift+\`”)。这里使用 PowerShell。 -2. cd 到程序所在子目录 (请自行查找 cd 命令用法) -3. 使用 g++命令编译程序。如:`g++ .\test.cpp` (寻找文件时可以用 Tab 快捷键)。 -4. 上述命令默认生成 “a.exe”。请输入命令 `.\a.exe` 执行生成的 exe 文件。 +1. 使用组合键"Ctrl+\`"打开终端(有些时候是"Ctrl+Shift+\`")。这里使用PowerShell。 +2. cd到程序所在子目录(请自行查找cd命令用法) +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? -brew 全称 Homebrew,是 MacOS 上一个免费的开源软件包管理器。它简化了 MacOS 用户安装软件的过程。 +brew全称Homebrew,是 MacOS 上一个免费的开源软件包管理器。它简化了MacOS用户安装软件的过程。 -#### 安装 brew +#### 安装brew -打开终端,执行如下命令。这里我们使用清华大学镜像站的 brew 源。 +打开终端,执行如下命令。这里我们使用清华大学镜像站的brew源。 ``` export HOMEBREW_BREW_GIT_REMOTE="https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/brew.git" @@ -186,34 +186,34 @@ 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的基本使用以及GCC的安装方法 -- **查看 brew 版本**:`brew -v` -- **查看 brew 已安装的包列表**:`brew list` -- **查看某个包的信息**:`brew info`。如查看 `xz` 的信息:`brew info xz` -- **安装包**:`brew install`。如 `brew install python3` +- **查看brew版本**:`brew -v` +- **查看brew已安装的包列表**: `brew list` +- **查看某个包的信息**:`brew info`。如查看`xz`的信息:`brew info xz` +- **安装包**:`brew install`。如`brew install python3` - **更新包**:`brew upgrade`。使用方法同上。 - **卸载包**:``brew uninstall`。使用方法同上 -- **更新 brew**:`brew update` +- **更新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) -#### MacBook 上的 C/C++ Configuration UI 配置 +#### MacBook上的C/C++ Configuration UI配置 -此处配置与前文所述的 Windows 配置方法大致相同。**但是**,VS Code 无法自动检测到 brew 安装的 GCC 编译器路径,因此需要手动输入。 +此处配置与前文所述的Windows配置方法大致相同。**但是**,VS Code无法自动检测到brew安装的GCC编译器路径,因此需要手动输入。 如上一张图片的其中两行所示: @@ -222,61 +222,61 @@ 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 打开终端,编译,然后执行。区别在于: +这一部分大体上也与Windows类似:直接在VS Code打开终端,编译,然后执行。区别在于: -- g++编译器产生的可执行文件以 `.out` 结尾,例如 `a.out`。 +- g++编译器产生的可执行文件以`.out`结尾,例如`a.out`。 -- Mac 上不要直接使用 `g++` 命令。 +- Mac上不要直接使用`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)中提及。 +- 每次使用g++-14命令来编译程序。 +- 在终端配置文件中,添加:`alias g++='g++-14'`和`alias gcc='gcc-14'`来永久替换`g++`和`gcc`命令。这一步所述的配置文件将在后文[终端环境配置](#TerminalEnvironmentConfiguration)中提及。 -## 1.2 Python 环境配置 +## 1.2 Python环境配置 -Python 也是北京大学课程教学中常用的一门语言,例如数据结构与算法和各类 AI 相关课程。本文中,我们来探讨一下 Python 环境的配置方法。 +Python也是北京大学课程教学中常用的一门语言,例如数据结构与算法和各类AI相关课程。本文中,我们来探讨一下Python环境的配置方法。 -### 1.2.1 Conda 是什么? +### 1.2.1 Conda是什么? -Conda 是在 Windows、macOS 和 Linux 上运行的开源软件包管理系统和环境管理系统。**Conda 可以快速安装、运行和更新软件包及其依赖项**。 +Conda是在Windows、macOS和Linux上运行的开源软件包管理系统和环境管理系统。**Conda可以快速安装、运行和更新软件包及其依赖项**。 -使用 Conda 配置 Python 环境,有一个**巨大的好处**:它可以同时存储各个不同版本的 Python,每个版本具有独立的包和库;使用时,可以用命令很方便地切换要使用的版本 (这使用虚拟环境来实现)。 +使用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 的基本使用 +#### 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`文件,然后再修改会比较方便。 ``` channels: @@ -293,21 +293,21 @@ custom_channels: 使用时,有下面几个常用命令: -(`mamba` 是 `conda` 的加速版,速度更快,也可以直接使用 `conda` 命令,效果相同) +(`mamba`是`conda`的加速版,速度更快,也可以直接使用 `conda` 命令,效果相同) -- `mamba env list`:查看已安装环境。刚安装好 Conda 时,会显示 `base` 这个环境。 +- `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 -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这个环境,激活成功后会有如下显示: ![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`环境。 #### 虚拟环境内包的安装 @@ -317,9 +317,9 @@ windows 下安装 `conda` 后第一次使用虚拟环境时,要先输入 `mamb pip config set global.index-url https://mirrors.pku.edu.cn/pypi/web/simple ``` -以下是 pip 的常用命令,可以按需安装包: +以下是pip的常用命令,可以按需安装包: -- `pip show`:查看包的具体信息。例如 `pip show pip`。 +- `pip show`:查看包的具体信息。例如`pip show pip`。 - `pip list`:查看已经安装的包。 - `pip install`:安装指定的包。后面要接包名。 @@ -327,58 +327,58 @@ pip config set global.index-url https://mirrors.pku.edu.cn/pypi/web/simple - `pip install -r requirements.txt`:根据文本文件批量安装包。 - `pip uninstall`:卸载包。 - `pip install --upgrade 包名称==版本号`:更新包。 -- `python -m pip install --upgrade pip`:更新 pip。 +- `python -m pip install --upgrade pip`:更新pip。 -如果要使用 conda 来管理包,命令类似。 +如果要使用conda来管理包,命令类似。 ## 1.3 终端环境配置 -在上面提到的步骤中,**终端 (Terminal)**始终贯穿全文。终端,就是一种提供各类 Shell 访问的应用程序。在这个部分中,我们来了解一下怎么配置合适的终端环境,以便我们通过命令行的方式来操控电脑。 +在上面提到的步骤中,**终端(Terminal)**始终贯穿全文。终端,就是一种提供各类Shell访问的应用程序。在这个部分中,我们来了解一下怎么配置合适的终端环境,以便我们通过命令行的方式来操控电脑。 -### 1.3.1 Windows 终端配置 +### 1.3.1 Windows终端配置 -在 Windows 平台上,我们极力推荐使用**PowerShell**。这是近几年新兴的一种命令行工具,由微软基于 `.NET` 开发,与系统连接紧密,功能极其强大,且命令语言符合直觉。 +在Windows平台上,我们极力推荐使用**PowerShell**。这是近几年新兴的一种命令行工具,由微软基于`.NET`开发,与系统连接紧密,功能极其强大,且命令语言符合直觉。 #### 更改脚本执行策略 -要定制 PowerShell,第一步就是更改脚本执行策略。在 Windows11 中,微软为了增强系统的安全性,默认禁止了一切脚本的执行 (也就是通过一份文件来批量运行命令)。然而,不巧的是,微软甚至把**终端配置文件**也算在了脚本之中,因此在默认条件下,我们对终端配置文件作的任何修改都是无效的。所以,配置终端环境的第一步就是更改脚本执行策略。 +要定制PowerShell,第一步就是更改脚本执行策略。在Windows11中,微软为了增强系统的安全性,默认禁止了一切脚本的执行(也就是通过一份文件来批量运行命令)。然而,不巧的是,微软甚至把**终端配置文件**也算在了脚本之中,因此在默认条件下,我们对终端配置文件作的任何修改都是无效的。所以,配置终端环境的第一步就是更改脚本执行策略。 -请在 VS Code 中打开终端,或者按 `Win+R` 输入 powershell 回车。打开终端后,输入如下命令: +请在VS Code中打开终端,或者按`Win+R`输入powershell回车。打开终端后,输入如下命令: ``` 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 的情况下,直接在系统终端输入如上命令可能发生同样的情况 (显示未保存的空文件,此时如果保存,那么配置文件会变为空文件)。 +没有打开VS Code的情况下,直接在系统终端输入如上命令可能发生同样的情况(显示未保存的空文件,此时如果保存,那么配置文件会变为空文件)。 ::: 笔者在此推荐一种配置,目前正在使用: @@ -400,93 +400,93 @@ alias cc='gcc-14' alias c++='c++-14' ``` -这个配置让终端显示了当前所在目录的全名、登录账户名、设置了前文所述的编译器别名,且个人觉得颜色在 VS Code 中比较好看。效果如下: +这个配置让终端显示了当前所在目录的全名、登录账户名、设置了前文所述的编译器别名,且个人觉得颜色在VS Code中比较好看。效果如下: ![zsh](/assets/basic/05-drive-your-computer-1/zsh.png) 在设置好配置文件后,保存重启终端即可。 -此外,笔者还推荐一种系统终端主题:打开系统终端,在电脑的最上边栏选择终端按钮,下拉栏中选择设置,在左边栏找到 Pro 主题设为默认。如果使用此主题,那么颜色会和上面的图片一样。 +此外,笔者还推荐一种系统终端主题:打开系统终端,在电脑的最上边栏选择终端按钮,下拉栏中选择设置,在左边栏找到Pro主题设为默认。如果使用此主题,那么颜色会和上面的图片一样。 ### 1.3.3 常用快捷键和一些指令 在课程中,我们会经常和终端打交道。这里介绍一些常用快捷键: -- `Ctrl+Shift+C/V`:终端中的复制和粘贴。注意,它与常用的复制粘贴快捷键不同。在 Windows 中,你也可以直接选中文本,然后右键复制。 +- `Ctrl+Shift+C/V`:终端中的复制和粘贴。注意,它与常用的复制粘贴快捷键不同。在Windows中,你也可以直接选中文本,然后右键复制。 - `Ctrl+C`:强制终止程序并释放内存。 - `Ctrl+Z`:强制暂停程序,不释放内存。 其它快捷键: - `Ctrl+A`:全选代码,方便快速复制提交。 -- 按住滚轮,上下滑动:扩展光标所在行数,可以批量在很多行代码前面加 Tab 或者删空格,便于控制缩进。 +- 按住滚轮,上下滑动:扩展光标所在行数,可以批量在很多行代码前面加Tab或者删空格,便于控制缩进。 还有一些指令非常好用: -- `./a.out < in > out`:在 Linux 和 MacOS 中,此指令可以从 `in` 读取输入,传递给程序 `a.out` 作为输入,然后把输出传到文件 `out` 中。这在做一些题目时非常有效,尤其是程序设计实习的魔兽世界大作业这类输出以 MB 来计数的题目。 +- `./a.out < in > out`:在Linux和MacOS中,此指令可以从`in`读取输入,传递给程序`a.out`作为输入,然后把输出传到文件`out`中。这在做一些题目时非常有效,尤其是程序设计实习的魔兽世界大作业这类输出以MB来计数的题目。 ::: warning 注意 - 这会删除 out 文件中原本的内容。 + 这会删除out文件中原本的内容。 ::: - 获取输出后,可以用 VS Code 的**对比功能**对比自己的输出和评测系统的输出,来修正程序。 + 获取输出后,可以用VS Code的**对比功能**对比自己的输出和评测系统的输出,来修正程序。 -- `get-content in | .\a.exe > out ` 这个命令功能与上述命令相同,但它在 Windows PowerShell 中使用。因为 PowerShell 中 ‘<’ 字符是保留字,所以必须使用这种写法。 +- `get-content in | .\a.exe > out `这个命令功能与上述命令相同,但它在Windows PowerShell中使用。因为PowerShell中 '<' 字符是保留字,所以必须使用这种写法。 -- `cd`:更改终端所在目录。使用时,输入 cd 后按 Tab 键,可以快捷遍历当前目录下的子目录。或者,也可以直接输入全路径。 +- `cd`:更改终端所在目录。使用时,输入cd后按Tab键,可以快捷遍历当前目录下的子目录。或者,也可以直接输入全路径。 -在后续的文档 (Drive Your Computer III) 中,我们会提到更多的快捷键。 +在后续的文档(Drive Your Computer III)中,我们会提到更多的快捷键。 -# 2。文件和文本 +# 2. 文件和文本 -在使用电脑的过程中,我们常常听到一个名词——文件。安装软件用到的安装包、前文提到的 `exe` 可执行文件、提交作业时常用的 `word` 文档、拍照后生成的 `jpg` 和 `jpeg` 格式图片,都是文件。虽然我们每天都在使用文件,但我们可能不太了解它。在本节,我们简要了解一下到底什么是文件、文件系统、如何创建文件,文件和文本的区别,从而对文件有更深入的认识。 +在使用电脑的过程中,我们常常听到一个名词——文件。安装软件用到的安装包、前文提到的`exe`可执行文件、提交作业时常用的`word`文档、拍照后生成的`jpg`和`jpeg`格式图片,都是文件。虽然我们每天都在使用文件,但我们可能不太了解它。在本节,我们简要了解一下到底什么是文件、文件系统、如何创建文件,文件和文本的区别,从而对文件有更深入的认识。 ## 2.1 文件的本质 -不同操作系统 (如 Windows,Linux,MacOS,Android) 都有文件的概念,而且它们对于文件的处理方式有些不同。但是,在各个操作系统中,我们都可以把文件理解为一堆二进制数据的集合——它是计算机存储系统中的基本单位,用于存储数据和信息。 +不同操作系统(如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 文件的后缀 -常用 Windows 的读者或许会发现,基本上每个文件都有自己的后缀;如果改变某个文件的后缀,系统会弹出警告,提示可能会导致文件不可用。现在,我们来了解一下文件后缀。 +常用Windows的读者或许会发现,基本上每个文件都有自己的后缀;如果改变某个文件的后缀,系统会弹出警告,提示可能会导致文件不可用。现在,我们来了解一下文件后缀。 -实际上,文件的后缀是文件**命名**的一部分,在各个操作系统中一般用 `.` 来区分:文件名从左到右的第一个 `.` 右边就是文件后缀。因此,文件后缀与文件的**具体内容**无关,改变它并不会改变文件的内容——归根结底,它只是名字的一部分而已。 +实际上,文件的后缀是文件**命名**的一部分,在各个操作系统中一般用`.`来区分:文件名从左到右的第一个`.`右边就是文件后缀。因此,文件后缀与文件的**具体内容**无关,改变它并不会改变文件的内容——归根结底,它只是名字的一部分而已。 -虽然文件后缀不影响文件内容,但在现代操作系统中,它有很大的作用。前文提到,在计算机眼里,文件的内容本质是一个二进制序列,不同的文件即使差别很大,但在二进制的世界里,也就是某些位不同而已。由于文件有许多类别 (例如文本文件、照片、视频、可执行文件),计算机需要知道用什么方式 (应用程序) 来打开指定的文件 (这些程序会根据它的设计目的,按照某种固定的**标准**,使用文件中存储的数据。比如,相册打开 `bmp` 文件时,会将文件开头的固定长度作为**文件头**,从中读取照片大小、长宽等信息,并按照这些信息在后文中读取像素数据,渲染成图片);但这又难以从文件内容直接看出来。所以,**后缀**应运而生——它可以告诉计算机用哪一类应用程序来读取文件。如果随意修改后缀,可能会导致计算机用错误的程序打开文件,或者压根不认识这个后缀,我们就无法看到想要的内容。而实际上所有文件都可以用记事本打开,只不过可能是乱码罢了。 +虽然文件后缀不影响文件内容,但在现代操作系统中,它有很大的作用。前文提到,在计算机眼里,文件的内容本质是一个二进制序列,不同的文件即使差别很大,但在二进制的世界里,也就是某些位不同而已。由于文件有许多类别(例如文本文件、照片、视频、可执行文件),计算机需要知道用什么方式(应用程序)来打开指定的文件(这些程序会根据它的设计目的,按照某种固定的**标准**,使用文件中存储的数据。比如,相册打开`bmp`文件时,会将文件开头的固定长度作为**文件头**,从中读取照片大小、长宽等信息,并按照这些信息在后文中读取像素数据,渲染成图片);但这又难以从文件内容直接看出来。所以,**后缀**应运而生——它可以告诉计算机用哪一类应用程序来读取文件。如果随意修改后缀,可能会导致计算机用错误的程序打开文件,或者压根不认识这个后缀,我们就无法看到想要的内容。而实际上所有文件都可以用记事本打开,只不过可能是乱码罢了。 下面介绍一下常见的后缀: -- **文本和文档**:`.txt`、`.doc`、`.docx`、`.xls`、`.xlsx`、`.ppt`、`.pptx`。前者是记事本文件,后面则是 Word、Excel、PowerPoint 软件的文件格式。 +- **文本和文档**:`.txt`、`.doc`、`.docx`、`.xls`、`.xlsx`、`.ppt`、`.pptx`。前者是记事本文件,后面则是Word、Excel、PowerPoint软件的文件格式。 - **源代码**:C++:`.cpp`、`.cc`、`.cxx`、`.hpp`、`.hxx` - ​ C:`.h`、`.c` + ​ C:`.h`、`.c` - ​ Python:`.py` + ​ Python:`.py` 源代码文件都可以用记事本打开。它们的本质都是文本。 -- **视频文件**:`.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` ## 2.3 文件系统 -我们都知道,文件存储在硬盘等实体介质中。为了便于管理文件,人们发明了 “文件系统”,用于管理和组织存储设备 (如硬盘、SSD、光盘等) 上的文件。下面是文件系统上的一些概念: +我们都知道,文件存储在硬盘等实体介质中。为了便于管理文件,人们发明了“文件系统”,用于管理和组织存储设备(如硬盘、SSD、光盘等)上的文件。下面是文件系统上的一些概念: -- **目录 (文件夹)**:是包含文件和子目录的特殊文件,用于组织和管理文件。 +- **目录(文件夹)**:是包含文件和子目录的特殊文件,用于组织和管理文件。 - **文件路径**: - **绝对路径**:从根目录开始的完整路径,例如 `/home/user/document.txt`。 - **相对路径**:相对于当前工作目录的路径,例如 `document.txt`。 @@ -496,7 +496,7 @@ alias c++='c++-14' - **管理文件权限**: - 文件系统管理文件和目录的访问权限,通常包括读取、写入和执行权限。 - - 在类 Unix 系统中,文件权限由所有者、所属组和其他用户的权限组成。 + - 在类Unix系统中,文件权限由所有者、所属组和其他用户的权限组成。 - **文件操作**: - 文件系统提供基本的文件操作,如创建、删除、读取、写入、重命名、复制等。 - **挂载和卸载**: @@ -504,31 +504,31 @@ alias c++='c++-14' 我们来看一些常见的文件系统: -- **FAT32**:一种较老的文件系统,广泛用于 USB 闪存驱动器和存储卡。 -- **NTFS**:是 Windows 操作系统的默认文件系统,支持大文件和高级功能。 -- **ext4**:Linux 操作系统常用的文件系统,支持大文件和高性能。 -- **APFS**:苹果公司为 macOS 和 iOS 开发的文件系统,支持加密和快照。 +- **FAT32**:一种较老的文件系统,广泛用于USB闪存驱动器和存储卡。 +- **NTFS**:是Windows操作系统的默认文件系统,支持大文件和高级功能。 +- **ext4**:Linux操作系统常用的文件系统,支持大文件和高性能。 +- **APFS**:苹果公司为macOS和iOS开发的文件系统,支持加密和快照。 ## 2.4 文本 文本是一类特殊的文件,由于源代码文件也属于文本,且我们日常接触较多文本类文件,这里着重提及。 -我们首先来看**纯文本**,在各类系统中可以使用 `txt` 后缀来区分,打开它时会调用系统自带的纯文本编辑器,例如 Windows 上的记事本。这类文本基本只有单纯的显示字符的功能,没有其他额外功能。实际上,各类后缀的**源代码**本质也是此类文本。 +我们首先来看**纯文本**,在各类系统中可以使用`txt`后缀来区分,打开它时会调用系统自带的纯文本编辑器,例如Windows上的记事本。这类文本基本只有单纯的显示字符的功能,没有其他额外功能。实际上,各类后缀的**源代码**本质也是此类文本。 ### 文本的编码 -上述文本的保存和显示需要用到**编码**。前文提到,所谓编码,就是**将字符转换为二进制数据的规则**,它是一种字符与二进制数据的对应关系,可以理解为数学上的双射。保存文本文件和打开文本文件时,分别需要选择一种编码格式。如果这两种编码格式不匹配,打开时就可能显示乱码,例如常见的**锟斤拷烫烫烫**。如果编码 A 是编码 B 的子集,那么,用 A 保存、用 B 打开也是可以的。下面这张图展示了常见编码之间的关系: +上述文本的保存和显示需要用到**编码**。前文提到,所谓编码,就是**将字符转换为二进制数据的规则**,它是一种字符与二进制数据的对应关系,可以理解为数学上的双射。保存文本文件和打开文本文件时,分别需要选择一种编码格式。如果这两种编码格式不匹配,打开时就可能显示乱码,例如常见的**锟斤拷烫烫烫**。如果编码A是编码B的子集,那么,用A保存、用B打开也是可以的。下面这张图展示了常见编码之间的关系: ![encode](/assets/basic/05-drive-your-computer-1/encode.webp) -图中可以看到,ASCII 编码是图中其他编码的子集,因此用它保存的文本,用其他编码都可以打开。(UTF-16,UTF-32 等除外)。 +图中可以看到,ASCII编码是图中其他编码的子集,因此用它保存的文本,用其他编码都可以打开。(UTF-16,UTF-32等除外)。 ::: info 提示 -我们常用的可以显示中文字符的编码是 **UTF-8**,较老的文档中也会使用 GB2312 等国标编码,这些编码与 UTF-8 不兼容。 +我们常用的可以显示中文字符的编码是**UTF-8** ,较老的文档中也会使用GB2312等国标编码,这些编码与UTF-8不兼容。 ::: -记事本和 VS Code 都会在当前界面的右下角显示目前使用的编码格式。通常,这类文本编辑器会自行检测打开的文件使用的编码,如果检测失败,可以手动切换。 +记事本和VS Code都会在当前界面的右下角显示目前使用的编码格式。通常,这类文本编辑器会自行检测打开的文件使用的编码,如果检测失败,可以手动切换。 ### 文本的字体 @@ -547,7 +547,7 @@ alias c++='c++-14' -下面介绍 VS Code 更改字体的方法。依次选中文件->首选项->设置,搜索字体,在 Font Size 和 Font Family 中更改字体大小和字体系列。逗号分隔字体,系统会依次搜索可以使用于当前文本的字体。 +下面介绍VS Code更改字体的方法。依次选中文件->首选项->设置,搜索字体,在Font Size和Font Family中更改字体大小和字体系列。逗号分隔字体,系统会依次搜索可以使用于当前文本的字体。 @@ -555,48 +555,48 @@ alias c++='c++-14' 除了纯文本,还有许多种文档被广泛使用。下面列举其中的一部分: -- **Word 文本** -- **Excel 表格** -- **PowerPoint 幻灯片** -- **PDF**:是 Adobe 开发的文件格式,广泛用于公文、电子书、论文等正式文档,较为安全。 -- **Markdown**:一种轻量级标记语言,旨在以简洁易读的纯文本格式编写文档,同时能够转换为结构化的 HTML 等格式。 -- **LaTeX**:是基于 TeX 的文档排版系统,提供高级命令和宏包,简化了复杂文档特别是包含数学公式的技术和科学文档的编写和排版。可以编译生成 PDF 文档。 +- **Word文本** +- **Excel表格** +- **PowerPoint幻灯片** +- **PDF**:是Adobe开发的文件格式,广泛用于公文、电子书、论文等正式文档,较为安全。 +- **Markdown**:一种轻量级标记语言,旨在以简洁易读的纯文本格式编写文档,同时能够转换为结构化的HTML等格式。 +- **LaTeX**:是基于 TeX 的文档排版系统,提供高级命令和宏包,简化了复杂文档特别是包含数学公式的技术和科学文档的编写和排版。可以编译生成PDF文档。 -我们会在第 11 讲涉及到文本编辑的更多内容。 +我们会在第11讲涉及到文本编辑的更多内容。 ## 2.5 创建文件 -在 Windows 上,要创建一份文件,可以在右键菜单中选择创建文本文档,然后根据需要修改名称和后缀。 +在Windows上,要创建一份文件,可以在右键菜单中选择创建文本文档,然后根据需要修改名称和后缀。 -在 MacOS 上,系统没有直接在右键菜单中提供类似的选项。可以用下面几种方式: +在MacOS上,系统没有直接在右键菜单中提供类似的选项。可以用下面几种方式: -- **利用软件**:打开 VS Code 等软件,在相应目录右键,点击新建文件 -- **利用终端**:打开终端,定位到需要创建文件的目录,输入命令 `touch filename`,创建名为 filename 的文件。 +- **利用软件**:打开VS Code等软件,在相应目录右键,点击新建文件 +- **利用终端**:打开终端,定位到需要创建文件的目录,输入命令`touch filename`,创建名为filename的文件。 -在 Linux/MacOS 中,第二种方法比较常见。 +在Linux/MacOS中,第二种方法比较常见。 -# 3。软件的安装和卸载 +# 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) -如上图,在百度中搜索 steam,第一个结果就不是官网。一般来说,搜索引擎以蓝色小块标注官网的,就是官网。 +如上图,在百度中搜索steam,第一个结果就不是官网。一般来说,搜索引擎以蓝色小块标注官网的,就是官网。 ![steam2](/assets/basic/05-drive-your-computer-1/steam2.png) -如上图,我们采用必应搜索引擎搜索 steam,此时第一个结果就是官网。选择一个好的搜索引擎对于找到软件官网很有帮助——我们推荐使用必应,有条件的可以使用谷歌,来寻找需要的软件。相信大家在第二讲中已经有所体会了。 +如上图,我们采用必应搜索引擎搜索steam,此时第一个结果就是官网。选择一个好的搜索引擎对于找到软件官网很有帮助——我们推荐使用必应,有条件的可以使用谷歌,来寻找需要的软件。相信大家在第二讲中已经有所体会了。 ### 下载软件 -进入官网后,一般来说软件下载按钮会出现在主页。但有时候需要耐心寻找。例如 steam 的安装按钮就很小: +进入官网后,一般来说软件下载按钮会出现在主页。但有时候需要耐心寻找。例如steam的安装按钮就很小: ![steaminstall](/assets/basic/05-drive-your-computer-1/steaminstall.png) @@ -604,44 +604,44 @@ alias c++='c++-14' ![qq](/assets/basic/05-drive-your-computer-1/qq.png) -请根据自己电脑的类型来选择。例如,电脑是 Windows,点进去后是如下的画面: +请根据自己电脑的类型来选择。例如,电脑是Windows,点进去后是如下的画面: ![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 上软件的下载 +### GitHub上软件的下载 -第一次在 GitHub 下载软件的时候,可能有许多人会被它的命名方式困扰。首先,我们需要进入一个项目的 Releases 界面: +第一次在GitHub下载软件的时候,可能有许多人会被它的命名方式困扰。首先,我们需要进入一个项目的Releases界面: -(在搜索引擎上搜索你要的软件名,后面加上 GitHub,一般可以搜到它的 GitHub 主页) +(在搜索引擎上搜索你要的软件名,后面加上 GitHub,一般可以搜到它的GitHub主页) ![clv](/assets/basic/05-drive-your-computer-1/clv.png) -然后找到它的 Assets 部分: +然后找到它的Assets部分: ![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`后缀文件安装。 ### 安装软件 打开安装包后,就可以开始安装了。 -在 Windows 电脑上:请一定仔细检查所谓**极速安装/快速安装**这些按钮。出现这些按钮后,建议点击详情,它们一般会默认安装到 C 盘;这时,需要的话,可以点击浏览,安装到其他盘 (尤其是对于**原神**这类大型游戏,几个就把 C 盘占满了)。不需要更改目录的话,也请查看是否有**捆绑软件**默认勾选。 +在Windows电脑上:请一定仔细检查所谓**极速安装/快速安装**这些按钮。出现这些按钮后,建议点击详情,它们一般会默认安装到C盘;这时,需要的话,可以点击浏览,安装到其他盘(尤其是对于**原神**这类大型游戏,几个就把C盘占满了)。不需要更改目录的话,也请查看是否有**捆绑软件**默认勾选。 安装完成后,强烈建议**查看整个界面**,是否有捆绑软件勾选,再点击完成。 -对于 MacOS 电脑,情况有所不同。一般来说,下载到的是 `.dmg` 文件。双击运行,把软件图标拖到 Application 文件夹即可安装。安装完成后,会发现 Apps 中出现这个软件。但有时候,打开软件会提示 App 已损坏。这是 Apple 的过强的安全策略造成的。 +对于MacOS电脑,情况有所不同。一般来说,下载到的是`.dmg`文件。双击运行,把软件图标拖到Application文件夹即可安装。安装完成后,会发现Apps中出现这个软件。但有时候,打开软件会提示App已损坏。这是Apple的过强的安全策略造成的。 -由于篇幅限制,请针对每个软件出现的问题,搜索相应的解决办法 (因为每个软件的包名不同)。下面给出两个网站,介绍了相关问题的通用解决办法: +由于篇幅限制,请针对每个软件出现的问题,搜索相应的解决办法(因为每个软件的包名不同)。下面给出两个网站,介绍了相关问题的通用解决办法: -[最新 | 解决 Mac 安装软件的 “已损坏,无法打开。您应该将它移到废纸篓” 问题 - 知乎 (zhihu.com)](https://zhuanlan.zhihu.com/p/135948430) +[最新|解决Mac安装软件的“已损坏,无法打开。 您应该将它移到废纸篓”问题 - 知乎 (zhihu.com)](https://zhuanlan.zhihu.com/p/135948430) -[无法打开 App 的可能解决方法 - Mac 指北 (leavelet.io)](https://macguide.leavelet.io/Bike/appnotopen.html) +[无法打开App的可能解决方法 - Mac 指北 (leavelet.io)](https://macguide.leavelet.io/Bike/appnotopen.html) @@ -649,7 +649,7 @@ alias c++='c++-14' ### Windows -一般来说,Windows 上的软件在安装后会提供卸载程序。 +一般来说,Windows上的软件在安装后会提供卸载程序。 **注意**:直接把桌面上的软件图标移动到回收站是不可行的!!! @@ -665,20 +665,20 @@ alias c++='c++-14' ### MacOS -在 MacBook 上删除软件比 Windows 复杂得多。虽然,在访达->Application 文件夹,把软件移到废纸篓,或者在启动台长按,点 × 删除,可以删除软件主体;**但是**,这样做并不能删除软件在系统各处创建的配置文件等等琐碎的小文件,也就是**软件残留**。 +在MacBook上删除软件比Windows复杂得多。虽然,在访达->Application文件夹,把软件移到废纸篓,或者在启动台长按,点×删除,可以删除软件主体;**但是**,这样做并不能删除软件在系统各处创建的配置文件等等琐碎的小文件,也就是**软件残留**。 -因此,可以选择用 **brew** 这样的工具来管理软件。或者,对于具体的软件,搜索其相应残留位置手动删除。 +因此,可以选择用**brew**这样的工具来管理软件。或者,对于具体的软件,搜索其相应残留位置手动删除。 ## 3.3 规避流氓、病毒软件 -流氓软件多如牛毛,相应的规避方法也不完全相同。在安装软件时 (尤其是 Windows),要注意: +流氓软件多如牛毛,相应的规避方法也不完全相同。在安装软件时(尤其是Windows),要注意: - 不要去任何软件园下载软件。 -- 不要去下载未经确认安全的盗版资源。这种时候,下载完了可以用 Windows Defender 之类的杀毒软件扫一扫。但也不一定安全。 -- 与直觉相反,360 软件管家下载的软件一般是安全的,例如可以下载到正版 steam。(笔者最近在网上冲浪时发现了这一点,非常震惊) ~~但这种方法有不菲的代价,比如电脑上留了个大流氓~~ +- 不要去下载未经确认安全的盗版资源。这种时候,下载完了可以用Windows Defender之类的杀毒软件扫一扫。但也不一定安全。 +- 与直觉相反,360软件管家下载的软件一般是安全的,例如可以下载到正版steam。(笔者最近在网上冲浪时发现了这一点,非常震惊)~~但这种方法有不菲的代价,比如电脑上留了个大流氓~~ - 安装的时候,安装程序的**每一个界面**都要留意,例如修改浏览器主页、勾选捆绑软件等行为。甚至有**不要取消勾选你不想要的软件**这种神奇操作。 -- 可以多去 GitHub 下载开源软件。但要注意,开源软件也不一定安全。 +- 可以多去GitHub下载开源软件。但要注意,开源软件也不一定安全。 总之,没有任何方法能彻底避免流氓、病毒软件。这是一个魔高一尺道高一丈的过程。我们能做的,也就是擦亮眼睛,开动脑筋,用我们的火眼金睛去发现问题、规避问题。 @@ -691,14 +691,14 @@ 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**:可直接下载离线包,用学校邮箱登录来安装。 -# 4。常用软件推荐 +# 4. 常用软件推荐 这一部分,我们来了解一下不同领域的常用软件,希望能对你有所帮助。我们尽量推荐免费、开源、功能强的软件,从而保持良好、干净的电脑环境。 @@ -708,15 +708,15 @@ alias c++='c++-14' 由于各类网络资源都会使用压缩文件的方式进行发布,寻找一款好用且**不流氓**的压缩软件很有必要。下面推荐一些常用的压缩软件: - Windows: - - `7-zip` 或者其变种 `7-zip-zstd`:老牌压缩软件,能满足大部分需求。官方网站:https://www.7-zip.org/download.html;`7-zip-zstd`官方网站:[GitHub - mcmilk/7-Zip-zstd:7-Zip with support for Brotli,Fast-LZMA2,Lizard,LZ4,LZ5 and Zstandard](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` 后缀存放文件,执行恶意代码。 - - 可以参考如下网站进行**个人学习**:[GitHub - bitcookies/winrar-keygen:Principle of WinRAR key generation。](https://github.com/bitcookies/winrar-keygen?tab=readme-ov-file)请参考此网站的 README 的 **6.3** 节。 + - `7-zip`或者其变种`7-zip-zstd`:老牌压缩软件,能满足大部分需求。官方网站:https://www.7-zip.org/download.html;`7-zip-zstd`官方网站:[GitHub - mcmilk/7-Zip-zstd: 7-Zip with support for Brotli, Fast-LZMA2, Lizard, LZ4, LZ5 and Zstandard](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`后缀存放文件,执行恶意代码。 + - 可以参考如下网站进行**个人学习**:[GitHub - bitcookies/winrar-keygen: Principle of WinRAR key generation.](https://github.com/bitcookies/winrar-keygen?tab=readme-ov-file)请参考此网站的README的**6.3**节。 - MacOS: - `MacZip`:第三方压缩软件。官网:[MacZip - 专为 macOS 而设计的压缩软件!](https://maczip.cn/?locale=zh-CN)安装后,请自行更改默认的压缩包打开方式。使用此软件,有如下优点: - - 安装后,设置内默认勾选压缩、提取文件忽略 `.DS_STORE` 文件。如果需要多平台传输压缩文件,这一特性很不错。 + - 安装后,设置内默认勾选压缩、提取文件忽略`.DS_STORE`文件。如果需要多平台传输压缩文件,这一特性很不错。 - 支持的压缩包种类全,且支持加密压缩。 @@ -727,7 +727,7 @@ alias c++='c++-14' - Windows: - `Potplayer`:一款老牌的播放器,功能强大。官网:https://potplayer.tv/?lang=zh_CN - MacOS: - - `IINA`:VLC 的重新封装,界面美观 + - `IINA`:VLC的重新封装,界面美观 ## 4.3 下载器推荐 @@ -735,26 +735,26 @@ 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:aria2 is a lightweight multi-protocol & multi-source,cross platform download utility operated in command-line。It supports HTTP/HTTPS,FTP,SFTP,BitTorrent and Metalink。](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: aria2 is a lightweight multi-protocol & multi-source, cross platform download utility operated in command-line. It supports HTTP/HTTPS, FTP, SFTP, BitTorrent and Metalink.](https://github.com/aria2/aria2) ## 4.4 杀毒软件推荐 -主要针对 Windows。 +主要针对Windows。 -- `火绒`:轻量小巧,~~用于关闭 Windows Defender~~,且有许多实用功能。但杀毒能力不强。 +- `火绒`:轻量小巧,~~用于关闭Windows Defender~~,且有许多实用功能。但杀毒能力不强。 - `Windows Defender`:杀毒能力强,默认自带。但是容易误杀,需要花点时间摸清楚配置。愿意挨个设置白名单的话,还是很好用的。 ## 4.5 杂项 - 浏览器插件: - - `Tampermonkey`:可以在网页上执行脚本。这里推荐一个脚本:[GitHub - zhuozhiyongde/PKU-Art:一个北大教学网的美化样式](https://github.com/zhuozhiyongde/PKU-Art)。更多脚本可以在下面的网站找到:[Greasy Fork - 安全且实用的用户脚本站](https://greasyfork.org/zh-CN) -- `Localsend`:多平台局域网文件传输软件。实用,且界面美观。iOS 和 Mac 可以在 App Store 找到。Android 可以在 Google Play 找到。各平台的安装包也可以在下面的网站找到:[GitHub - localsend/localsend:An open-source cross-platform alternative to AirDrop](https://github.com/localsend/localsend) -- `Magpie`:一款可以使画面清晰度提高的软件。例如,它可以使陈年老游戏的清晰度提升很多。工作原理为重采样,对显卡性能需求较高。官网:[GitHub - Blinue/Magpie:An all-purpose window upscaler for Windows 10/11。](https://github.com/Blinue/Magpie) -- `Geek`:Windows 上的一款卸载软件,可以卸载各个软件的残留。官网:[Geek Uninstaller - the best FREE uninstaller](https://geekuninstaller.com/) + - `Tampermonkey`:可以在网页上执行脚本。这里推荐一个脚本:[GitHub - zhuozhiyongde/PKU-Art: 一个北大教学网的美化样式](https://github.com/zhuozhiyongde/PKU-Art)。更多脚本可以在下面的网站找到:[Greasy Fork - 安全且实用的用户脚本站](https://greasyfork.org/zh-CN) +- `Localsend`:多平台局域网文件传输软件。实用,且界面美观。iOS和Mac可以在App Store找到。Android可以在Google Play找到。各平台的安装包也可以在下面的网站找到:[GitHub - localsend/localsend: An open-source cross-platform alternative to AirDrop](https://github.com/localsend/localsend) +- `Magpie`:一款可以使画面清晰度提高的软件。例如,它可以使陈年老游戏的清晰度提升很多。工作原理为重采样,对显卡性能需求较高。官网:[GitHub - Blinue/Magpie: An all-purpose window upscaler for Windows 10/11.](https://github.com/Blinue/Magpie) +- `Geek`:Windows上的一款卸载软件,可以卸载各个软件的残留。官网:[Geek Uninstaller - the best FREE uninstaller](https://geekuninstaller.com/) - `Snipaste`:多平台通用的截图软件。功能强大,非常推荐。免费版即可。官网:https://zh.snipaste.com/ - `Everything`:文件搜索工具,搜索速度快。官网:https://www.voidtools.com/zh-cn/support/everything/ - `FileConverter`:可以在很多文件格式间互转。官网:https://github.com/Tichau/FileConverter @@ -762,8 +762,8 @@ alias c++='c++-14' - `Croc`:也是一款文件互传软件。[官网](https://github.com/schollz/croc)。优点在于可以自动打洞,不局限于局域网。 - [convertio](https://convertio.co):也用于文件转换,是一个网站。 - `wiztree`:磁盘空间分析工具。[官网](https://www.diskanalyzer.com)。 -- `WallpaperEngine`:可以找到 Steam 创意工坊上的很多壁纸。建议从 Steam 购买并下载。 +- `WallpaperEngine`:可以找到Steam创意工坊上的很多壁纸。建议从Steam购买并下载。 - `OBS`:一款免费录屏软件,适配多平台。有虚拟摄像头等功能。官网:[Open Broadcaster Software | OBS (obsproject.com)](https://obsproject.com/) -- `Typora`:一款轻量的 Markdown 文件编辑器。支持部分 LaTeX 语法和全功能 Markdown 语法。收费。官网:[Typora 官方中文站 (typoraio.cn)](https://typoraio.cn/)。 +- `Typora`:一款轻量的Markdown文件编辑器。支持部分LaTeX语法和全功能Markdown语法。收费。官网:[Typora 官方中文站 (typoraio.cn)](https://typoraio.cn/)。 欢迎补充更多好用的软件! diff --git a/basic/06-drive-your-computer-2.md b/basic/06-drive-your-computer-2.md index 9f7ae95..e42b994 100644 --- a/basic/06-drive-your-computer-2.md +++ b/basic/06-drive-your-computer-2.md @@ -8,25 +8,25 @@ ## 版本控制概览 -版本控制系统 (Version Control System,VCS) 用来管理和追踪一个软件的源文件版本的系统,同时也可以提供协作、备份等功能。其可以分为中心化和去中心化两种工作方式。 +版本控制系统(Version Control System, VCS)用来管理和追踪一个软件的源文件版本的系统,同时也可以提供协作、备份等功能。其可以分为中心化和去中心化两种工作方式。 ### 中心化版本控制 -中心化的工作方式必须有一个服务器,储存所有的版本记录,客户端只负责拉取某个版本,进行修改,并推送回去。代表作有 SVN。 +中心化的工作方式必须有一个服务器,储存所有的版本记录,客户端只负责拉取某个版本,进行修改,并推送回去。代表作有SVN。 ### 去中心化的版本控制 -而去中心化的工作方式中,每个人都有完整的版本记录,可以存在中心服务器用于交换各个客户端的提交,但是即使服务器下线或者不存在,两个人之间也可以通过互相交换信息来完成版本同步。代表作有 Git。请注意,Git 和 GitHub,GitLab 并不是同一个东西,前者是 VCS,后者是使用 Git 作为 VCS 的代码托管平台。 +而去中心化的工作方式中,每个人都有完整的版本记录,可以存在中心服务器用于交换各个客户端的提交,但是即使服务器下线或者不存在,两个人之间也可以通过互相交换信息来完成版本同步。代表作有Git。请注意,Git和GitHub,GitLab并不是同一个东西,前者是VCS,后者是使用Git作为VCS的代码托管平台。 ## Git 的故事和基本抽象 -在介绍 Git 使用之前,我们先讲一点故事。当时 Linux 内核开发完全依赖于 Linus 一个人手工检查并合并全世界发来的补丁,这样工作量非常大。于是,Linus 的一个朋友介绍了 BitMover 公司开发的商业 VCS 软件 BitKeeper 免费授权给 Linux 开发团队使用。此举招致了 FSF 的 RMS 等人的批评,认为在自由软件开发中使用非自由软件是 “道德上有污点” 的行为,但是作为实用主义者的 Linus 并不在意这些事情,BitKeeper 作为去中心化的 VCS,满足了 Linus 的需求。然而好景不长,有 Linux 内核开发者逆向了 BitKeeper 的协议,致使 BitMover 公司决定收回其授权。Git 就是在这种条件下诞生的,据说第一版 Git 是 Linus 利用 1 周休假时间完成的。 +在介绍Git使用之前,我们先讲一点故事。当时Linux内核开发完全依赖于Linus一个人手工检查并合并全世界发来的补丁,这样工作量非常大。于是,Linus的一个朋友介绍了BitMover公司开发的商业VCS软件BitKeeper免费授权给Linux开发团队使用。此举招致了FSF的RMS等人的批评,认为在自由软件开发中使用非自由软件是“道德上有污点”的行为,但是作为实用主义者的Linus并不在意这些事情,BitKeeper作为去中心化的VCS,满足了Linus的需求。然而好景不长,有Linux内核开发者逆向了BitKeeper的协议,致使BitMover公司决定收回其授权。Git就是在这种条件下诞生的,据说第一版Git是Linus利用1周休假时间完成的。 -Git 的设计出于这样一种基本抽象:一个项目的历史记录可以被看作是一个有向无环图 (DAG),每个提交是一个节点,每个节点有一个或多个父节点,代表这个提交是由哪些提交衍生出来的。Git 的基本操作就是在这个图上进行操作,比如创建新的节点,删除节点,合并节点等等。或许同学们不知道什么叫什么叫有向无环图,我们举个例子:你的家谱就可以类比为一个有向无环图,每个人是一个节点,每个人有父母,父母又有父母,但是不可能有一个人的父母是他自己,这样就构成了一个有向无环图。 +Git 的设计出于这样一种基本抽象:一个项目的历史记录可以被看作是一个有向无环图(DAG),每个提交是一个节点,每个节点有一个或多个父节点,代表这个提交是由哪些提交衍生出来的。Git的基本操作就是在这个图上进行操作,比如创建新的节点,删除节点,合并节点等等。或许同学们不知道什么叫什么叫有向无环图,我们举个例子:你的家谱就可以类比为一个有向无环图,每个人是一个节点,每个人有父母,父母又有父母,但是不可能有一个人的父母是他自己,这样就构成了一个有向无环图。 -这样的抽象是自然的:你写的东西大概率是基于别人写的东西,你写完之后,又会有其他人基于你的东西写东西,具有继承性。这样的抽象也是实用的,每一次提交 (一个节点) 都可以看作是一个快照,你可以随时回到这个快照,查看这个快照的内容,或者基于这个快照进行修改。你也能知道目前的状态是如何从过去的状态演变而来的,这样你就可以知道每一次修改的意图,也可以知道每一次修改的后果。 +这样的抽象是自然的:你写的东西大概率是基于别人写的东西,你写完之后,又会有其他人基于你的东西写东西,具有继承性。这样的抽象也是实用的,每一次提交(一个节点)都可以看作是一个快照,你可以随时回到这个快照,查看这个快照的内容,或者基于这个快照进行修改。你也能知道目前的状态是如何从过去的状态演变而来的,这样你就可以知道每一次修改的意图,也可以知道每一次修改的后果。 -对于 Git 来说,有三个目录:工作区 (Working Directory),暂存区 (Staging Area) 和版本库 (Repository)。工作区就是你的项目目录,你可以随意改动,直到你决定记录你的修改。版本库是 Git 存储有向无环图的地方。暂存区可能不那么好理解,暂存区是一个缓冲区,你可以把你的修改放到暂存区,然后一次性提交到版本库,差不多就是这样: +对于 Git 来说,有三个目录:工作区(Working Directory),暂存区(Staging Area)和版本库(Repository)。工作区就是你的项目目录,你可以随意改动,直到你决定记录你的修改。版本库是Git存储有向无环图的地方。暂存区可能不那么好理解,暂存区是一个缓冲区,你可以把你的修改放到暂存区,然后一次性提交到版本库,差不多就是这样:

areas @@ -34,7 +34,7 @@ Git 的设计出于这样一种基本抽象:一个项目的历史记录可以 有点抽象,我们举个例子: -我们假设有一个 Git 仓库 (Repository),里面有两个文件 A 和 B。仓库之前有提交记录。此时你开始基于之前的提交记录工作,你从历史中取出了文件 A 和 B 放到工作区 (这其实是自动的)。此刻就像这样: +我们假设有一个 Git 仓库(Repository),里面有两个文件 A 和 B。仓库之前有提交记录。此时你开始基于之前的提交记录工作,你从历史中取出了文件 A 和 B 放到工作区(这其实是自动的)。此刻就像这样:

areas @@ -61,13 +61,13 @@ Git 的设计出于这样一种基本抽象:一个项目的历史记录可以 你的暂存区已经被保存到了版本库,就是版本 Y 节点。这时候工作区和版本库最新节点一致,暂存区是空的。 -## Git 的使用 +## Git的使用 -下面我们分步介绍 Git 的使用方法: +下面我们分步介绍Git的使用方法: ### 初始化仓库 -我们使用 init 子命令来初始化一个仓库。打开你的 shell,执行: +我们使用init子命令来初始化一个仓库。打开你的shell,执行: ```shell mkdir git-example cd git-example @@ -77,7 +77,7 @@ git init ``` 已初始化空的 Git 仓库于 /path/to/example/git-example/.git/ ``` -这说明一个空的 git 仓库已经创建好了。 +这说明一个空的git仓库已经创建好了。 如果你看到如下内容,意思是你系统的 git 默认选择了 master 作为主分支的名字。目前我们推荐使用 main 作为主分支的名字,你可以根据它的建议进行配置: @@ -93,15 +93,15 @@ git init 提示: git branch -m ``` -### 配置 Git +### 配置Git 我们可能需要对仓库进行一些配置,比如设置用户名和邮箱,设置代理等等。 -配置 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,使用提交的邮箱判断提交的作者。 由于众所周知的原因,你可能需要使用代理。请在文件末尾另起一行,填写以下内容,其中链接需要填写你自己的链接: ``` @@ -111,7 +111,7 @@ git config --global --edit proxy = http://127.0.0.1:7890(同上) ``` -有时候对于某些 repo,你想使用其他的名称或者邮箱进行提交,这时你可以在 repo 目录中执行: +有时候对于某些repo,你想使用其他的名称或者邮箱进行提交,这时你可以在repo目录中执行: ```shell git config --edit ``` @@ -119,14 +119,14 @@ git config --edit ### 暂存你的更改 -使用 add 子命令可以暂存某一个文件的更改,以便后续提交。先试着在目录中创建一个文件,内容是 Hello,world!,然后暂存: +使用add子命令可以暂存某一个文件的更改,以便后续提交。先试着在目录中创建一个文件,内容是Hello, world!,然后暂存: ```shell echo Hello, world! > example1.txt git add . ``` -使用 ``` . ``` 指示所有未被忽略的文件,你也可以写出具体的文件路径进行暂存。 +使用``` . ```指示所有未被忽略的文件,你也可以写出具体的文件路径进行暂存。 执行: ```shell @@ -145,11 +145,11 @@ git status ### 提交你的更改 -使用 commit 子命令来提交你的更改。执行: +使用commit子命令来提交你的更改。执行: ```shell git commit ``` -会弹出文本编辑器,请在第一行写你的提交信息,比如 ``` My first commit ```,然后退出编辑器。或者你也可以执行: +会弹出文本编辑器,请在第一行写你的提交信息,比如``` My first commit ```,然后退出编辑器。或者你也可以执行: ```shell git commit -m "My first commit ``` @@ -163,17 +163,17 @@ git commit -m "My first commit ```shell git status ``` -你会发现目前处于 “干净的工作区” +你会发现目前处于“干净的工作区” ``` 位于分支 master 无文件要提交,干净的工作区 ``` -总结一下,git 整体的工作流程就是修改-暂存-提交-下一轮修改-……这样一直进行。 +总结一下,git整体的工作流程就是修改-暂存-提交-下一轮修改-……这样一直进行。 -如果你觉得暂存操作比较麻烦,可以加上 ``` -a ``` 参数,此参数会在提交前自动暂存修改过和删除的文件,但是新的文件不会被包括进来。 +如果你觉得暂存操作比较麻烦,可以加上``` -a ```参数,此参数会在提交前自动暂存修改过和删除的文件,但是新的文件不会被包括进来。 -有时候上一个提交还没有完成,你可以使用 ``` --amend ``` 参数修订上一个提交。 +有时候上一个提交还没有完成,你可以使用``` --amend ```参数修订上一个提交。 ### 查看并回退到指定历史版本 @@ -187,7 +187,7 @@ git commit -am "My second commit" [master 37f7d83] My second commit 1 file changed, 1 insertion(+), 1 deletion(-) ``` -然后我们使用 log 子命令,执行: +然后我们使用log子命令,执行: ```shell git log ``` @@ -207,9 +207,9 @@ Date: Wed Aug 28 14:28:30 2024 +0800 ``` 其中 -commit 后面跟着的编号 (实际上是散列值)、日期会不同,作者和邮箱信息应该是你刚刚设置的。 +commit后面跟着的编号(实际上是散列值)、日期会不同,作者和邮箱信息应该是你刚刚设置的。 -此时我们想检查第一个提交,这个时候我们可以使用多种方式来完成,我们先使用 checkout 子命令: +此时我们想检查第一个提交,这个时候我们可以使用多种方式来完成,我们先使用checkout子命令: ```shell git checkout 7a6ab774caa62ba9d0a091a2c1dc3e96af04ffa7 ``` @@ -240,7 +240,7 @@ cat example1.txt ``` 检查文件内容。 -事实上,使用散列值指定提交时,若无歧义,写前 5 个字符即可。 +事实上,使用散列值指定提交时,若无歧义,写前5个字符即可。 如果你想回到最新的提交,执行: ```shell @@ -252,15 +252,15 @@ git checkout master ```shell git reset --hard 7a6ab ``` -此命令将签出并将头指针指向指定提交。后续提交除非你知道提交的散列值,否则你无法找回提交。可以使用垃圾回收 (gc 子命令) 清除未被引用的提交。 +此命令将签出并将头指针指向指定提交。后续提交除非你知道提交的散列值,否则你无法找回提交。可以使用垃圾回收(gc子命令)清除未被引用的提交。 ::: danger 警告 -请谨慎使用 hard reset +请谨慎使用hard reset ::: ### 排除掉特定的文件 -有时候一些文件不应该被版本管理系统追踪,如编译生成的目标文件,可执行文件,一些敏感配置等等。我们可以使用 ``` .gitignore ``` 文件来排除指定文件和文件夹。执行以下内容: +有时候一些文件不应该被版本管理系统追踪,如编译生成的目标文件,可执行文件,一些敏感配置等等。我们可以使用``` .gitignore ```文件来排除指定文件和文件夹。执行以下内容: ```shell mkdir confidential echo Password is not a good password > confidential/password.txt @@ -292,18 +292,18 @@ git status 提交为空,但是存在尚未跟踪的文件(使用 "git add" 建立跟踪) ``` -可以发现 ``` credential ``` 目录和所有的 ``` .o ``` 文件都被忽略了。 +可以发现``` credential ```目录和所有的``` .o ```文件都被忽略了。 最后我们执行 ```shell git add . git commit -m "add .gitignore" ``` -将这一修改纳入 VCS 进行管理,完成这一节。 +将这一修改纳入VCS进行管理,完成这一节。 ### 分支管理 -有时候我们会想同时开发新功能,并且调优以前的代码,这样可能就需要两条线进行开发,此时分支相关的功能就会很有帮助。分支的英文是 branch,其实就像树枝一样,你可以在树干上开出一个新的树枝,然后在这个树枝上进行开发,多条树枝之间不会影响,同时树枝也可以合并到树干上 (这个有点不符合自然常理,不过你可以做一些想象)。 +有时候我们会想同时开发新功能,并且调优以前的代码,这样可能就需要两条线进行开发,此时分支相关的功能就会很有帮助。分支的英文是 branch,其实就像树枝一样,你可以在树干上开出一个新的树枝,然后在这个树枝上进行开发,多条树枝之间不会影响,同时树枝也可以合并到树干上(这个有点不符合自然常理,不过你可以做一些想象)。 接下来的例子,我们将演示如何创建分支、合并分支,变基分支以及冲突解决。 @@ -344,7 +344,7 @@ git checkout -b update-example 37f7d git branch update-example 37f7d git checkout update-example ``` -然后我们将文件 ``` example1.txt ``` 改为 ``` Hello, Git2! ```,执行: +然后我们将文件``` example1.txt ```改为``` Hello, Git2! ```,执行: ```shell git commit -am "Branch!" ``` @@ -364,12 +364,12 @@ A-----B-----C (master) git rebase master git checkout master ``` -分支 update-example 将重新以 master 的最新提交为根基。 -请注意,rebase 会使得移动的全部提交的散列值被重新计算!因为 git 提交的散列值与上一个提交的散列值有关。 +分支update-example将重新以master的最新提交为根基。 +请注意,rebase会使得移动的全部提交的散列值被重新计算!因为git提交的散列值与上一个提交的散列值有关。 #### 合并分支与冲突解决 -我们将 master 的 HEAD 设置到刚刚 rebase 后的分支的顶部,然后我们新建一个分支: +我们将master的HEAD设置到刚刚rebase后的分支的顶部,然后我们新建一个分支: ```shell git checkout -b merge-example echo Lorem ipsum > example2.txt @@ -377,7 +377,7 @@ echo Hello, Git6! > example1.txt git add example2.txt git commit -m "Prepare to merge" ``` -然后我们检出 master,然后执行: +然后我们检出master,然后执行: ``` git merge merge-example ``` @@ -389,7 +389,7 @@ git merge merge-example 自动合并失败,修正冲突然后提交修正的结果。 ``` -我们打开 ``` example1.txt ``` 查看内容: +我们打开``` example1.txt ```查看内容: ``` <<<<<<< HEAD Hello, Git2! @@ -399,7 +399,7 @@ Hello, Git6! ``` -如果你使用 VSCode 等 IDE,应该已经自动显示修正冲突的选项。我们在这里把结果修正为: +如果你使用VSCode等IDE,应该已经自动显示修正冲突的选项。我们在这里把结果修正为: ``` Hello, Git8! ``` @@ -410,9 +410,9 @@ git merge --continue ``` 应该会弹出一个文本编辑器,编辑合并提交的消息,然后退出即可。 -### Git 服务器与多人合作 +### Git服务器与多人合作 -到这里你已经完成了 Git 大部分基础功能的学习!下面我们看看如何用 Git 进行多人合作: +到这里你已经完成了Git大部分基础功能的学习!下面我们看看如何用Git进行多人合作: #### 克隆仓库 @@ -420,39 +420,39 @@ git merge --continue ```shell git clone url://path/to/be/cloned ``` -就可以了。在当前工作目录下会新建克隆项目名字的文件夹,一般 http(s) 和 ssh 协议是常见的 clone 协议。对于后者,你可能需要本地生成 ssh 密钥对,并将公钥上传到服务器。 +就可以了。在当前工作目录下会新建克隆项目名字的文件夹,一般http(s)和ssh协议是常见的clone协议。对于后者,你可能需要本地生成ssh密钥对,并将公钥上传到服务器。 #### 拉取代码 -有时候远端代码库已经更新,你需要更新本地代码,这时候用 pull 子命令。 +有时候远端代码库已经更新,你需要更新本地代码,这时候用pull子命令。 ```shell git pull ``` -如果本地有远端不存在的提交,则拉取代码不能以默认的 “fast-forward” 方式进行,因此需要指定 ``` --no-ff ``` 参数进行合并拉取或者指定 ``` --rebase ``` 进行变基拉取。在特别有必要时,也可以直接 hard reset 到远端 HEAD 处。 +如果本地有远端不存在的提交,则拉取代码不能以默认的“fast-forward”方式进行,因此需要指定``` --no-ff ```参数进行合并拉取或者指定``` --rebase ```进行变基拉取。在特别有必要时,也可以直接hard reset到远端HEAD处。 #### 推送代码 -在工作完成,提交完成之后,可以用这个子命令将修改推送至远端。若有远端有本地没有的提交,需要先进行拉取,才能推送,或者 ``` --force ``` 强制推送,此时不一致的提交会被本地提交代替。 +在工作完成,提交完成之后,可以用这个子命令将修改推送至远端。若有远端有本地没有的提交,需要先进行拉取,才能推送,或者``` --force ```强制推送,此时不一致的提交会被本地提交代替。 ::: danger 警告 -使用 ``` --force ``` 参数前请三思,仔细检查你将要提交的内容! +使用``` --force ```参数前请三思,仔细检查你将要提交的内容! ::: #### 图形化工具的使用 1. VSCode - VSCode 自带 Git 管理功能,可以使用该功能进行可视化编辑和提交 + VSCode自带Git管理功能,可以使用该功能进行可视化编辑和提交 2. gitg - Gnome 桌面的 git 管理软件 + Gnome桌面的git管理软件 3. kommit - KDE 桌面的 git 管理软件 + KDE桌面的git管理软件 #### 附加:对提交签名 -多人合作中,验证你的提交来自于你是很重要的,因此你可以对提交签名以确保这一点 (具体操作暂略) +多人合作中,验证你的提交来自于你是很重要的,因此你可以对提交签名以确保这一点(具体操作暂略) diff --git a/basic/07-drive-your-computer-3.md b/basic/07-drive-your-computer-3.md index 01361e2..bf38c98 100644 --- a/basic/07-drive-your-computer-3.md +++ b/basic/07-drive-your-computer-3.md @@ -12,23 +12,23 @@ ### 磁盘信息 {#disk-info} -如需查看磁盘占用情况,Windows 和 Linux 下的文件管理器都能直观地提供以上信息,故此不再详述。 +如需查看磁盘占用情况,Windows和Linux下的文件管理器都能直观地提供以上信息,故此不再详述。 -如需查看磁盘健康情况,可以使用 ` smartctl ` 命令 (Linux) 或者 CrystalDiskInfo 软件 (Windows) 查看。 +如需查看磁盘健康情况,可以使用` smartctl `命令(Linux)或者CrystalDiskInfo软件(Windows)查看。 ![CrystalDiskInfo](../assets/basic/07-drive-your-computer-3/image.png) -图 1。笔者使用 CrystalDiskInfo 查看磁盘信息 +图1. 笔者使用CrystalDiskInfo查看磁盘信息 ### 处理器与内存信息 {#cpu-mem-info} -Windows 下任务管理器即可,Linux 下推荐 ` btop ` 程序。 +Windows下任务管理器即可,Linux下推荐` btop `程序。 ![任务管理器](../assets/basic/07-drive-your-computer-3/image2.png) -图 2。笔者使用任务管理器查看处理器占用情况,右侧菜单可以打开资源监视器,有更详细的信息。 +图2. 笔者使用任务管理器查看处理器占用情况,右侧菜单可以打开资源监视器,有更详细的信息。 ### 电池信息 {#battery-info} -Windows 下可以使用自带的 ` powercfg ` 命令生成 html 格式的电池信息报告,Linux 下可以使用 ` upower ` 命令查看 +Windows下可以使用自带的` powercfg `命令生成html格式的电池信息报告,Linux下可以使用` upower `命令查看 ### 视频信息 {#video-info} @@ -42,41 +42,41 @@ Windows 下可以使用自带的 ` powercfg ` 命令生成 html 格式的电池 ### 蓝屏 {#bsod} -蓝屏 (BSOD,Blue Screen of Death),通常意味着 Windows 内核发生了不可恢复的故障。常见的蓝屏原因包括系统服务异常 (多是驱动导致),关键进程退出 (可能是病毒引起),机器检查 (硬件故障) 等。如果最近新安装了硬件,可以考虑移除它们再试试,如果怀疑是驱动问题或者是病毒问题,可以考虑进入安全模式: +蓝屏(BSOD, Blue Screen of Death),通常意味着Windows内核发生了不可恢复的故障。常见的蓝屏原因包括系统服务异常(多是驱动导致),关键进程退出(可能是病毒引起),机器检查(硬件故障)等。如果最近新安装了硬件,可以考虑移除它们再试试,如果怀疑是驱动问题或者是病毒问题,可以考虑进入安全模式: -- 如果你还能进入系统:按下 ` Win+R ` 输入 ` msconfig ` 并回车,点击 “引导” 选项卡,勾选 “安全启动”,点击应用,重启即可。 +- 如果你还能进入系统:按下` Win+R `输入` msconfig `并回车,点击“引导”选项卡,勾选“安全启动”,点击应用,重启即可。 -- 如果你不能进入系统:启动失败若干次后应该会出现恢复菜单,点击 “疑难解答”-“高级选项”-“启动设置”,会提示重启进入安全模式。 +- 如果你不能进入系统:启动失败若干次后应该会出现恢复菜单,点击“疑难解答”-“高级选项”-“启动设置”,会提示重启进入安全模式。 安全模式下只有最基本的驱动和启动项会被加载,可以考虑卸载最近安装的驱动或者查杀病毒,如需查杀病毒,建议选择带网络的安全模式。 -以前的系统也可通过启动时按 F8 进入安全模式菜单,但是目前这样做不太可行。 +以前的系统也可通过启动时按F8进入安全模式菜单,但是目前这样做不太可行。 -完成所有操作后,如果使用 msconfig 设置了安全模式,应当先取消勾选然后应用,然后重启回到正常模式看问题是否解决。 +完成所有操作后,如果使用msconfig设置了安全模式,应当先取消勾选然后应用,然后重启回到正常模式看问题是否解决。 -如果你想向驱动作者报告问题,可以使用 WinDbg 调试内核转储文件,在 WinDbg 中打开转储文件,使用 ` !analyze -v ` 获取完整分析报告。WinDbg 可以在应用商店中免费获取。 +如果你想向驱动作者报告问题,可以使用WinDbg调试内核转储文件,在WinDbg中打开转储文件,使用` !analyze -v `获取完整分析报告。WinDbg可以在应用商店中免费获取。 ### 内核恐慌 {#panic} -Linux 内核的严重错误被叫做 panic。其实由于 Linux 用户态和内核态耦合更低,且 Linux 本身容错能力更好,Linux panic 遇见的频率相对更低,常见的原因也不外乎驱动故障,1号进程退出等。一般来说,部分硬件厂商为 Linux 提供的驱动问题较多,除了卸载驱动以外,还需要和驱动开发者和 Linux 内核维护者进行沟通,以取得更好的解决方案。 +Linux内核的严重错误被叫做panic。其实由于Linux用户态和内核态耦合更低,且Linux本身容错能力更好,Linux panic遇见的频率相对更低,常见的原因也不外乎驱动故障,1号进程退出等。一般来说,部分硬件厂商为Linux提供的驱动问题较多,除了卸载驱动以外,还需要和驱动开发者和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} -建议首先检查内存和处理器占用情况,结束其他无关程序;对于有网络 IO 的程序,检查网络连接;对于有磁盘 IO 的程序,检查磁盘健康状态。 +建议首先检查内存和处理器占用情况,结束其他无关程序;对于有网络IO的程序,检查网络连接;对于有磁盘IO的程序,检查磁盘健康状态。 ### 网络连接故障 {#offline} -建议检查网线是否插好,网关是否登陆,是否欠费,DNS 设置是否正确,上一次关机时代理是否正确关闭等等。对于 Linux 系统,可以检查 ` rfkill ` 是否允许相应网卡工作,` ip ` 是否启动相应适配器。 +建议检查网线是否插好,网关是否登陆,是否欠费,DNS设置是否正确,上一次关机时代理是否正确关闭等等。对于Linux系统,可以检查` rfkill `是否允许相应网卡工作,` ip `是否启动相应适配器。 ## 小知识串讲 {#knowledge-series} @@ -84,54 +84,54 @@ Windows 下打开任务管理器检查有无不必要启动项,加以禁止即 #### 系统快捷键 {#system-shortcut} -不同系统提供了不同的快捷键,这里简单介绍 Windows 和 Linux 在系统层面提供的快捷键。Windows 徽标键 (简称 Win 键) 在 Linux 下也称 Meta 键,在 Mac 下则是 Command 键。F1-F12 系列按键有可能需要同时按下 Fn 键使用。 +不同系统提供了不同的快捷键,这里简单介绍Windows和Linux在系统层面提供的快捷键。Windows徽标键(简称Win键)在Linux下也称Meta键,在Mac下则是Command键。F1-F12系列按键有可能需要同时按下Fn键使用。 - Windows - ` Ctrl+Alt+Del `:打开一个可以唤起任务管理器的屏幕。这个组合键比较特殊,它只能被内核捕获而不会传给用户态程序处理。 + ` Ctrl+Alt+Del `: 打开一个可以唤起任务管理器的屏幕。这个组合键比较特殊,它只能被内核捕获而不会传给用户态程序处理。 - ` Ctrl+Shift+Esc `:直接打开任务管理器。 + ` Ctrl+Shift+Esc `: 直接打开任务管理器。 - ` Alt+F4 `:关闭处于焦点的窗口。如果没有窗口处于焦点,打开关闭计算机的对话框。 + ` Alt+F4 `: 关闭处于焦点的窗口。如果没有窗口处于焦点,打开关闭计算机的对话框。 - ` Alt+Tab `:切换窗口。 + ` Alt+Tab `: 切换窗口。 - ` Win+Tab `:切换桌面。 + ` Win+Tab `: 切换桌面。 - ` Win+R `:打开运行窗口。 + ` Win+R `: 打开运行窗口。 - ` PrintScreen(PrtSc) `:截图 + ` PrintScreen(PrtSc) `: 截图 - Linux - Linux 下很多快捷键由桌面环境提供,在此无法一一讲述,有兴趣的可以自行了解。一般这些快捷键可以根据个人使用习惯重新配置。 + Linux下很多快捷键由桌面环境提供,在此无法一一讲述,有兴趣的可以自行了解。一般这些快捷键可以根据个人使用习惯重新配置。 - ` Ctrl+Alt+{F1-F12} `:切换 tty。一般图形桌面位于 tty1 或者 tty2。这一系列快捷键由 Wayland 或者 Xorg 提供 + ` 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 TODO! -#### Shell 快捷键 {#shell-shortcut} +#### Shell快捷键 {#shell-shortcut} -我们把这些快捷键单独放一栏。因为它们和操作系统关系较小。这些快捷键如无特殊说明主要针对 Linux Shell。 +我们把这些快捷键单独放一栏。因为它们和操作系统关系较小。这些快捷键如无特殊说明主要针对Linux Shell。 -` Ctrl+C `:发送 SIGINT 到前台进程组,默认行为是程序退出。在 Shell 中复制文本避免按下此键! +` Ctrl+C `: 发送SIGINT到前台进程组,默认行为是程序退出。在Shell中复制文本避免按下此键! -` Ctrl+D `:关闭标准输入,或者说发送 EOF (文件末尾)。在 Windows Shell 中,一般为 ` Ctrl+Z, Enter `。 +` Ctrl+D `: 关闭标准输入,或者说发送EOF(文件末尾)。在Windows Shell中,一般为` Ctrl+Z, Enter `。 -` Ctrl+Z `:发送 SIGTSTP 到前台进程组,默认行为是程序退出,可用 ` fg ` 使程序恢复运行,或使用 ` bg ` 使程序在后台恢复运行,或者直接向程序发送 SIGCONT 恢复运行。 +` Ctrl+Z `: 发送SIGTSTP到前台进程组,默认行为是程序退出,可用` fg `使程序恢复运行,或使用` bg `使程序在后台恢复运行,或者直接向程序发送SIGCONT恢复运行。 -` Ctrl+\ `:发送 SIGQUIT 到前台进程组,和 SIGINT 不同的是,该信号默认不仅让程序退出,还会产生核心转储文件 (coredump)。 +` Ctrl+\ `: 发送SIGQUIT到前台进程组,和SIGINT不同的是,该信号默认不仅让程序退出,还会产生核心转储文件(coredump)。 -` Ctrl+Shift+C `:复制内容。 +` Ctrl+Shift+C `: 复制内容。 -` Ctrl+Shift+V `:粘贴内容。 +` Ctrl+Shift+V `: 粘贴内容。 -` Ctrl+A `:编辑命令时回到行首。 +` Ctrl+A `: 编辑命令时回到行首。 -` Ctrl+L `:清除屏幕,并重新打印当前行。 +` Ctrl+L `: 清除屏幕,并重新打印当前行。 -还有其他很多快捷键,有兴趣的同学可以网上搜索或者看 bash 的 man 手册。 +还有其他很多快捷键,有兴趣的同学可以网上搜索或者看bash的man手册。 diff --git a/basic/08-drive-your-computer-4.md b/basic/08-drive-your-computer-4.md index a91ee44..0d7eaab 100644 --- a/basic/08-drive-your-computer-4.md +++ b/basic/08-drive-your-computer-4.md @@ -7,7 +7,7 @@ ::: ## 网络安全 -写在前面,虽然这部分的标题叫做 “网络安全”,但不会介绍任何关于网络的技术层面的协议或是加密方式实现原理,而是主要介绍如何更好地使用现在这个并不太平的互联网,请放心食用。 +写在前面,虽然这部分的标题叫做“网络安全”,但不会介绍任何关于网络的技术层面的协议或是加密方式实现原理,而是主要介绍如何更好地使用现在这个并不太平的互联网,请放心食用。 ### 一个作为开始的段子 你已经死了,这里是地狱! @@ -16,110 +16,110 @@ ——观看大学生操作电脑! -看吧!他在使用 Excel,但是他不会用任何一个快捷键!哦天哪他的 Ctrl 键甚至是全新的……他连自动填充和方向键都不用!从 1 到 100 都是手打的! +看吧!他在使用Excel,但是他不会用任何一个快捷键!哦天哪他的Ctrl键甚至是全新的……他连自动填充和方向键都不用!从1到100都是手打的! -他输入中文的时候只用两根食指!每输入完一个词,他都用鼠标去点候选词!他一分钟打 20 个字! +他输入中文的时候只用两根食指!每输入完一个词,他都用鼠标去点候选词!他一分钟打20个字! 他想要居中标题,在标题前面打了一连串的空格!直到标题看起来在中间的位置了! -他直接在百度上搜 “爱奇艺下载” 了!他点进了华军软件园了!他点了那个最大的 “高速下载”!他直接运行了 p2p 下载器!他没有取消任何一个勾选的捆绑程序,直接点了下一步!他的桌面上多了 4 个,不,5 个,不,6 个图标! +他直接在百度上搜“爱奇艺下载”了!他点进了华军软件园了!他点了那个最大的“高速下载”!他直接运行了p2p下载器!他没有取消任何一个勾选的捆绑程序,直接点了下一步!他的桌面上多了4个,不,5个,不,6个图标! -他的表格做好了,噢他直接保存到 wps 云端了!他不知道如何把这份表格发给他的上司!他点了分享按钮,给他的上司发了一个金山文档链接!这份表格在云端查看的时候彻底乱码了! +他的表格做好了,噢他直接保存到wps云端了!他不知道如何把这份表格发给他的上司!他点了分享按钮,给他的上司发了一个金山文档链接!这份表格在云端查看的时候彻底乱码了! -他正在下载破解版游戏,他得到了一个压缩包!噢他没有解压缩,直接在压缩软件里点开了 game.exe!游戏报错了! +他正在下载破解版游戏,他得到了一个压缩包!噢他没有解压缩,直接在压缩软件里点开了game.exe!游戏报错了! -他安装了一个游戏!他把 game.exe 直接剪切到了桌面!点开之后又报错了! +他安装了一个游戏!他把game.exe直接剪切到了桌面!点开之后又报错了! -他希望把室友电脑里的游戏拷贝到自己电脑里!他把桌面上的快捷方式直接拖到了自己的 U 盘里!插回自己电脑运行的时候又报错了! +他希望把室友电脑里的游戏拷贝到自己电脑里!他把桌面上的快捷方式直接拖到了自己的U盘里!插回自己电脑运行的时候又报错了! -他打开文件的方式是鼠标左键疯狂连点!他至少点了 10 次!天哪现在桌面上的弹窗都堆不下了! +他打开文件的方式是鼠标左键疯狂连点!他至少点了10次!天哪现在桌面上的弹窗都堆不下了! -他把 “Doc1.docx” 直接重命名成了 “实验报告”!他连后缀名都删干净了!现在他再也找不到打开这份文档的方法了! +他把"Doc1.docx"直接重命名成了"实验报告"!他连后缀名都删干净了!现在他再也找不到打开这份文档的方法了! 他在微信上收到了一个文件,他需要把这个文件用邮箱发出去。噢他完全不知道该怎么操作!他在收件人这一栏输入了上司的手机号!他完全不知道如何添加附件!他也完全不知道微信文件保存到哪里了!他对着微信消息按右键复制,然后把文件名粘贴到了正文栏! -他需要下载一个腾讯视频!他在视频网页点击了 “下载”,浏览器开始下载腾讯视频客户端了!他开始安装了!他在客户端里下载了一个。qlv 格式的文件!他直接把这个文件发给别人了! +他需要下载一个腾讯视频!他在视频网页点击了“下载”,浏览器开始下载腾讯视频客户端了!他开始安装了!他在客户端里下载了一个.qlv格式的文件!他直接把这个文件发给别人了! 感受痛苦吧!你甚至没法教会他们! ### 小心搜索引擎中的陷阱 -上面段子里主角一样的人物终究只占少数,不过有关搜索引擎使用带来的问题却十分常见,而事故高发地之一就是 steam 的下载。 +上面段子里主角一样的人物终究只占少数,不过有关搜索引擎使用带来的问题却十分常见,而事故高发地之一就是steam的下载。 ![](../assets/basic/08-drive-your-computer-4/steam.png) -很遗憾,这张图内所有看起来像是 steam 的搜索结果全部导向冒充 steam 的第三方网站。 +很遗憾,这张图内所有看起来像是steam的搜索结果全部导向冒充steam的第三方网站。 -> [!IMPORTANT] 试一试! -> 找到这两个搜索条目中的 “广告” 字样。 +> [!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 文件。 +另外,搜索引擎中支持输入修饰符。在部分特殊的需求场景下,使用修饰符可以将搜索结果限定从几百万限定到个位数级别,达到精确搜索的目的。~~比如说想搜索在某个论坛内某个用户发表的评论之类的场合。~~ (以下修饰符笔者只在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文件。 关于更多的搜索修饰符,可以自行搜索学习。 -### 什么是 url -之所以想在这里介绍这一项,主要是想解答 “为什么我的网址这么长” 的问题。 +### 什么是url +之所以想在这里介绍这一项,主要是想解答“为什么我的网址这么长”的问题。 -**URL (Uniform Resource Locator,统一资源定位符)**,也就是出现在浏览器 “网址框” 中的那一长串字符。一般包含协议、域名、路径、查询字符串等信息。 -比如这个一长串 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` 可能与网站内部逻辑有关。 +**URL(Uniform Resource Locator,统一资源定位符)**,也就是出现在浏览器“网址框”中的那一长串字符。一般包含协议、域名、路径、查询字符串等信息。 +比如这个一长串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`可能与网站内部逻辑有关。 -顺带一提,b 站 (可能其它视频软件也有类似的现象) 网页端生成的视频分享链接后也同样带有着相同的查询请求字符串,很可能用来标记这个分享链接的生成来源。前段时间有 `b站给我推送了qq群群友的账号` 之类的新闻,而这种隐私泄露很可能与分享链接有关。如果有需要,可以将 `?` 及后面的全部内容删掉后再进行分享,只保留域名和路径就可以实现对视频等资源的正常访问。 +顺带一提,b站(可能其它视频软件也有类似的现象)网页端生成的视频分享链接后也同样带有着相同的查询请求字符串,很可能用来标记这个分享链接的生成来源。前段时间有`b站给我推送了qq群群友的账号`之类的新闻,而这种隐私泄露很可能与分享链接有关。如果有需要,可以将`?`及后面的全部内容删掉后再进行分享,只保留域名和路径就可以实现对视频等资源的正常访问。 ### 隐私保护 隐私泄露一直是很严重的一项问题,甚至很多隐私泄露不是我们能够防止的。不过在日常中做好相关预防工作,降低自己隐私泄露的风险还是有意义的。 在线下店消费过后,有时店员会让你一些填写个人信息,名义上说是用于售后服务。这时记得稍微留意一下,售后服务是否真的需要自己留下的这些信息,如果不需要的话随便填写些假信息即可。比如在线下门店购买手机之类的情景下很明显不需要在门店留下自己的信息。 -社交软件以及论坛同样是隐私泄露的重灾区,除非工作需要没必要在头像、用户名等公开信息中用到任何关于自己个人隐私的信息。`设置-隐私` 中一般会有关于自己个人信息可见度的设置,可以根据个人需要进行设置。需要特别注意的是,微信中的 `允许陌生人查看十条朋友圈` 和支付宝中的 `向好友公开我的真实姓名` 是默认开启的,强烈建议关闭,尤其在这两个账号都可以被手机号搜索到的情况下。(当然也可以在 `添加我的方式` 中把手机号等途径取消掉) +社交软件以及论坛同样是隐私泄露的重灾区,除非工作需要没必要在头像、用户名等公开信息中用到任何关于自己个人隐私的信息。`设置-隐私`中一般会有关于自己个人信息可见度的设置,可以根据个人需要进行设置。需要特别注意的是,微信中的`允许陌生人查看十条朋友圈`和支付宝中的`向好友公开我的真实姓名`是默认开启的,强烈建议关闭,尤其在这两个账号都可以被手机号搜索到的情况下。(当然也可以在`添加我的方式`中把手机号等途径取消掉) -如果活跃在论坛或是公开群聊中,难免涉及到一些自己的真实情况,而如果碰上了别有用心的人,这些信息很容易被收集。~~上文介绍的高级搜索技巧很适用于这种场景!~~最简单的反制方式是发言时多留意一下删去敏感的内容。使用常见大众的用户名以及在不同平台使用不同用户名同样是一个好的选择,防止自己在不同平台泄露出的信息被同时收集。当然,不去引起 “别有用心的人” 的注意也很重要,就像《三体》里描述的 “藏好自己” 一样,不太张扬总是好的。 +如果活跃在论坛或是公开群聊中,难免涉及到一些自己的真实情况,而如果碰上了别有用心的人,这些信息很容易被收集。~~上文介绍的高级搜索技巧很适用于这种场景!~~ 最简单的反制方式是发言时多留意一下删去敏感的内容。使用常见大众的用户名以及在不同平台使用不同用户名同样是一个好的选择,防止自己在不同平台泄露出的信息被同时收集。当然,不去引起“别有用心的人”的注意也很重要,就像《三体》里描述的“藏好自己”一样,不太张扬总是好的。 ### 简单的安全措施 -在当今的互联网世界,与安全最直接相关的无疑是自己在各个平台下设置的密码 (password,更准确的说法是 “口令”,但是我们在这里不区分 “口令” 与 “密码” 的区别),以及有约等于密码效力的手机验证码。除了防止自己密码被别人偷看这种事情之外,最应该做的事就是不要用弱密码,再就是尽量在不同的平台用不同的密码。诸如 `qwertyuiop`,`aptx4869`,`password` 及其各种变种,类似于 `p@5sw0Rd` 等看似很安全的密码,以及常见的日期,拼音等都位于随手就能查到的弱密码库内。密码尽可能不要带有含义,或者说最好能保证只对自己有含义。市面上存在一些密码管理工具,浏览器也开始支持生成随机强密码并与账号绑定进行管理的功能,可以考虑合理地使用这些工具。除了满足以上要求,一般建议密码长度至少 8 个字符,包含大写字母、小写字母、数字和特殊符号中的至少 3 种,有条件的可以定期更换 (但是并不强求,自行衡量利弊)。 +在当今的互联网世界,与安全最直接相关的无疑是自己在各个平台下设置的密码(password,更准确的说法是“口令”,但是我们在这里不区分“口令”与“密码”的区别),以及有约等于密码效力的手机验证码。除了防止自己密码被别人偷看这种事情之外,最应该做的事就是不要用弱密码,再就是尽量在不同的平台用不同的密码。诸如`qwertyuiop`,`aptx4869`,`password`及其各种变种,类似于`p@5sw0Rd`等看似很安全的密码,以及常见的日期,拼音等都位于随手就能查到的弱密码库内。密码尽可能不要带有含义,或者说最好能保证只对自己有含义。市面上存在一些密码管理工具,浏览器也开始支持生成随机强密码并与账号绑定进行管理的功能,可以考虑合理地使用这些工具。除了满足以上要求,一般建议密码长度至少8个字符,包含大写字母、小写字母、数字和特殊符号中的至少3种,有条件的可以定期更换(但是并不强求,自行衡量利弊)。 -一些网站和服务支持多因素认证 (2FA),如果可能的话,请尽量开启这一功能,可以保证你在密码遭到泄露时不至于丧失对账户的控制权。 +一些网站和服务支持多因素认证(2FA),如果可能的话,请尽量开启这一功能,可以保证你在密码遭到泄露时不至于丧失对账户的控制权。 -校园网内并不太平,有很多被黑客控制的机器 (也被称作 “肉鸡”) 正每时每刻试图扫描校园网内的 SSH、VNC、RDP 等服务,获取受害机器的权限。对于使用弱密码的机器,非常容易在这种扫描中被攻破,从而沦为下一个 “肉鸡”,进行攻击、非法挖矿、勒索数据甚至非法窃取数据的黑客活动。我们建议在开启上述服务的机器上的远程身份验证仅开启密钥验证手段 (11 章有教程)。如果因为协议本身不支持密钥或者其他特殊原因必须使用密码登录,则务必使用强密码,且建议配置 fail2ban 或者类似服务。Windows 服务器可以在组策略中设置输错密码若干次则锁定账户。 +校园网内并不太平,有很多被黑客控制的机器(也被称作“肉鸡”)正每时每刻试图扫描校园网内的SSH、VNC、RDP等服务,获取受害机器的权限。对于使用弱密码的机器,非常容易在这种扫描中被攻破,从而沦为下一个“肉鸡”,进行攻击、非法挖矿、勒索数据甚至非法窃取数据的黑客活动。我们建议在开启上述服务的机器上的远程身份验证仅开启密钥验证手段(11章有教程)。如果因为协议本身不支持密钥或者其他特殊原因必须使用密码登录,则务必使用强密码,且建议配置fail2ban或者类似服务。Windows服务器可以在组策略中设置输错密码若干次则锁定账户。 ::: danger 警告 -即使是短时间的测试,也不要使用弱密码,你的机器可能瞬间沦陷!如果实在有必要,可以考虑临时关闭 SSH 等服务。 +即使是短时间的测试,也不要使用弱密码,你的机器可能瞬间沦陷!如果实在有必要,可以考虑临时关闭SSH等服务。 ::: ::: details 什么是密钥登录 -数学中存在一类问题,验证解的正确性很简单,但是求解问题本身却很难。一个很典型的例子是质因数分解,给你一个解,你可以很容易地验证其是否是正确的分解,但是只给你一个由两个大质数的乘积构成的合数,你很难快速得出其分解。密码学则利用这些问题构造非对称加密,如质因数分解的问题诞生了 RSA 算法,还有离散对数,椭圆函数上的运算等问题,也诞生出了相应的非对称加密算法。 +数学中存在一类问题,验证解的正确性很简单,但是求解问题本身却很难。一个很典型的例子是质因数分解,给你一个解,你可以很容易地验证其是否是正确的分解,但是只给你一个由两个大质数的乘积构成的合数,你很难快速得出其分解。密码学则利用这些问题构造非对称加密,如质因数分解的问题诞生了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 是否成立是一个悬而未决的世纪难题),但是实践中它们已经被认为是足够安全的。随着计算机算力的提升,算法中使用的数字也越来越大,防止算法被暴力攻破。 +遗憾的是,这些非对称加密算法的安全性没有得到数学上的证明(需要先证明P=NP不成立,且要证明这些问题本身是NP问题且不是P问题,而P=NP是否成立是一个悬而未决的世纪难题),但是实践中它们已经被认为是足够安全的。随着计算机算力的提升,算法中使用的数字也越来越大,防止算法被暴力攻破。 ::: -北京大学每学期都会向邮箱中发送包含钓鱼链接的恶意邮件进行安全测试,每次都可以看到有新同学中招。另外,前段时间也有某网红被伪造的法院网站骗走个人信息的新闻传出。前文提到的 “steam 山寨网站” 其实也可以看作某种钓鱼链接,所以说这种恶意行为在生活中实际上极其常见。 -不相信不确定的信源、不点进陌生的网站、不下载不可信的文件是防范的最好手段。很多攻击行为不需要用户的交互就可以触发,比如打开网页的时刻相关脚本就可以在本地运行,所以说不要随便为了满足自己的好奇心而点进一些有风险的网站。另外不要忽略伪造网站中 “漏出的马脚”。伪造网站往往存在错误的域名、存在偏差的界面排布、不合理的功能设置。及时发现这些不合理之处也能够即时止损。 +北京大学每学期都会向邮箱中发送包含钓鱼链接的恶意邮件进行安全测试,每次都可以看到有新同学中招。另外,前段时间也有某网红被伪造的法院网站骗走个人信息的新闻传出。前文提到的“steam山寨网站”其实也可以看作某种钓鱼链接,所以说这种恶意行为在生活中实际上极其常见。 +不相信不确定的信源、不点进陌生的网站、不下载不可信的文件是防范的最好手段。很多攻击行为不需要用户的交互就可以触发,比如打开网页的时刻相关脚本就可以在本地运行,所以说不要随便为了满足自己的好奇心而点进一些有风险的网站。另外不要忽略伪造网站中“漏出的马脚”。伪造网站往往存在错误的域名、存在偏差的界面排布、不合理的功能设置。及时发现这些不合理之处也能够即时止损。 ![](../assets/basic/08-drive-your-computer-4/mail.png) 一则用来测试安全意识的钓鱼邮件,可以注意到发件人使用的是高仿北大邮箱域名。无论下载附件还是点进附件中的链接都是危险的行为。 @@ -127,10 +127,10 @@ ### 什么是代理 代理在日常网络生活中被广泛使用,并且它不只是某项不可言说的东西,所以介绍代理的概念还是十分有必要的。 -就像字面意思一样,代理服务器的功能就是代理网络用户去取得网络信息。在一般情况下,我们使用网络浏览器直接去连接其他 Internet 站点取得网络信息时,须先向对方发出请求,然后对方再把信息传送回来。代理服务器是介于浏览器和 Web 服务器之间的一台服务器,有了它之后,浏览器不是直接到 Web 服务器去取回网页而是向代理服务器发出请求,请求报文会先送到代理服务器,由代理服务器来取回浏览器所需要的信息并传送给你的浏览器。 +就像字面意思一样,代理服务器的功能就是代理网络用户去取得网络信息。在一般情况下,我们使用网络浏览器直接去连接其他Internet站点取得网络信息时,须先向对方发出请求,然后对方再把信息传送回来。代理服务器是介于浏览器和Web服务器之间的一台服务器,有了它之后,浏览器不是直接到Web服务器去取回网页而是向代理服务器发出请求,请求报文会先送到代理服务器,由代理服务器来取回浏览器所需要的信息并传送给你的浏览器。 -客户端和服务器都可以使用代理。客户端代理可以隐藏真实的客户端 ip 地址、过滤一些不正常的访问请求。当然也可以使用代理绕过访问过滤器。服务端的代理将访问转发给真正的服务器,这层代理可以添加缓存功能,以提高服务器相应速度;也可以进行负载均衡,将请求 “均匀” 地转发给多台均匀的服务器;也可以作为安全组件,阻挡一些针对于服务器的攻击。 +客户端和服务器都可以使用代理。客户端代理可以隐藏真实的客户端ip地址、过滤一些不正常的访问请求。当然也可以使用代理绕过访问过滤器。服务端的代理将访问转发给真正的服务器,这层代理可以添加缓存功能,以提高服务器相应速度;也可以进行负载均衡,将请求“均匀”地转发给多台均匀的服务器;也可以作为安全组件,阻挡一些针对于服务器的攻击。 -另一个值得介绍的概念是**虚拟专用网络 (Virtual Private Netword)**,~~这个词的英文简称可能有些敏感。~~除了连接全球的 Internet 之外,学校、公司等也会维护自己的专用网络,比如链接在北京大学校园网内部的相关资源就无法从外部进行访问。而虚拟专用网络可以在共用网络上通过加密协议建立虚拟的专用网络,也可以将虚拟网络虚拟扩展的一个或多个其他网络。最经典的应用就是让外地员工访问到内网资源,在内网中架设一台 VPN 服务器。外地员工在当地连上互联网后,通过互联网连接 VPN 服务器,然后通过 VPN 服务器进入企业内网。为了保证数据安全,VPN 服务器和客户机之间的通讯数据都进行了加密处理。 +另一个值得介绍的概念是**虚拟专用网络(Virtual Private Netword)**,~~这个词的英文简称可能有些敏感。~~ 除了连接全球的Internet之外,学校、公司等也会维护自己的专用网络,比如链接在北京大学校园网内部的相关资源就无法从外部进行访问。而虚拟专用网络可以在共用网络上通过加密协议建立虚拟的专用网络,也可以将虚拟网络虚拟扩展的一个或多个其他网络。最经典的应用就是让外地员工访问到内网资源,在内网中架设一台VPN服务器。外地员工在当地连上互联网后,通过互联网连接VPN服务器,然后通过VPN服务器进入企业内网。为了保证数据安全,VPN服务器和客户机之间的通讯数据都进行了加密处理。 最后,虽然有加密协议支持,使用代理还是意味着流量经过了客户端与服务器之外的第三者,也因此存在数据泄露的风险。使用时请多加留意。 diff --git a/basic/09-drive-your-computer-5.md b/basic/09-drive-your-computer-5.md index cbefc21..be11fec 100644 --- a/basic/09-drive-your-computer-5.md +++ b/basic/09-drive-your-computer-5.md @@ -10,55 +10,55 @@ ### 什么是操作系统 用最简单的话来说,操作系统负责管理计算机的软硬件资源,并给用户和其他软件提供接口和环境,是计算机中**最基础的软件**。 -很显然,对于一个程序开发者而言,直接面向硬件编写程序是费时费力的。这样的话,大量的程序可能都会涉及到一些相似的功能,比如如何处理来自键盘等设备的输入,再比如如何管理文件与内存。从 “合并同类项” 的角度来看,建立一个新的抽象层次来负责管理系统资源相关的事项是自然且合理的。顺带一提,这种**建立抽象层次**的设计模式在计算机中是相当常见的。 -抽象意味着上层次只需要知道下层次可以满足他们的某项需求,而无需了解这项需求是如何被实现的。这种设计理念可以让每一个层次专注于它们自己应该实现的功能,而避免被来自其他层次的细节所困扰。如果一台电脑更换了 cpu,我们显然不会重写运行在这台电脑上的所有程序,而是仅仅将 cpu 调用模块相关的代码 “更换” 掉。将不同的功能**封装**在不同的模块里所带来的好处是显而易见的,而这种封装就是抽象的一种体现。 +很显然,对于一个程序开发者而言,直接面向硬件编写程序是费时费力的。这样的话,大量的程序可能都会涉及到一些相似的功能,比如如何处理来自键盘等设备的输入,再比如如何管理文件与内存。从“合并同类项”的角度来看,建立一个新的抽象层次来负责管理系统资源相关的事项是自然且合理的。顺带一提,这种**建立抽象层次**的设计模式在计算机中是相当常见的。 +抽象意味着上层次只需要知道下层次可以满足他们的某项需求,而无需了解这项需求是如何被实现的。这种设计理念可以让每一个层次专注于它们自己应该实现的功能,而避免被来自其他层次的细节所困扰。如果一台电脑更换了cpu,我们显然不会重写运行在这台电脑上的所有程序,而是仅仅将cpu调用模块相关的代码“更换”掉。将不同的功能**封装**在不同的模块里所带来的好处是显而易见的,而这种封装就是抽象的一种体现。 操作系统可以被看做一个功能很强大的封装模块。在有了操作系统之后,我们可以实现更方便地实现一些功能,同时实现一些没有操作系统就实现不了的功能。以下有一些简单的例子: -- 哪怕在只有一颗 cpu 的电脑上,也可以做到同时写代码和听音乐。但很明显,音乐播放器和代码编辑器的代码中不会包含自己如何和别的程序同时运行的功能,cpu 也不是生来就会同时运行多个程序。操作系统通过微观上协调多个程序**交替**执行,而在宏观上表现为多个程序**同时**执行。这种**并发**技术是操作系统的一个重要特征。 -- 在实际上的电脑使用中,我们会遇到各种各样的错误,一个软件的小错误就导致整台电脑蓝屏甚至硬件损坏显然是不可接受的。虽然程序内部也应该包含错误处理机制,但遇到一些不负责的程序或者程序遇到了一些它们自己处理不了的情况时,操作系统的错误处理机制是必要的。比如在信科相关的课上,会有同学尝试编写生成上万个子进程却不负责销毁的代码,再比如有些同学会编写占用远大于内存大小的空间的代码。此时则需要操作系统进行 “兜底”,在软件层面即时地阻断错误与异常继续向下层传播。关于操作系统与错误处理,这里有一个 (可能) 有趣的知乎问题:[如果抛开操作系统,直接在裸机上进行除零操作会发生什么情况?](https://www.zhihu.com/question/552173126) +- 哪怕在只有一颗cpu的电脑上,也可以做到同时写代码和听音乐。但很明显,音乐播放器和代码编辑器的代码中不会包含自己如何和别的程序同时运行的功能,cpu也不是生来就会同时运行多个程序。操作系统通过微观上协调多个程序**交替**执行,而在宏观上表现为多个程序**同时**执行。这种**并发**技术是操作系统的一个重要特征。 +- 在实际上的电脑使用中,我们会遇到各种各样的错误,一个软件的小错误就导致整台电脑蓝屏甚至硬件损坏显然是不可接受的。虽然程序内部也应该包含错误处理机制,但遇到一些不负责的程序或者程序遇到了一些它们自己处理不了的情况时,操作系统的错误处理机制是必要的。比如在信科相关的课上,会有同学尝试编写生成上万个子进程却不负责销毁的代码,再比如有些同学会编写占用远大于内存大小的空间的代码。此时则需要操作系统进行“兜底”,在软件层面即时地阻断错误与异常继续向下层传播。关于操作系统与错误处理,这里有一个(可能)有趣的知乎问题:[如果抛开操作系统,直接在裸机上进行除零操作会发生什么情况?](https://www.zhihu.com/question/552173126) -### 用户界面——CLI,TUI 与 GUI -目前常见的计算机操作系统有 Windows,Linux 和 macOS,移动操作系统则包括 Android 与 iOS,当然华为在近些年研发的鸿蒙系统也包括在内。 -前文提到,操作系统负责给用户和其他软件提供接口,给其他软件提供的接口的使用方法往往藏身与各种繁杂的文档中,我们对他们并没有太大的兴趣。相比之下,我们则每天都在使用操作系统为用户提供的接口。从关机到新建文件夹再到打开一大堆程序,这都是我们直接与操作系统交互进行的例子。**UI(User Interface),用户界面**,则是直接涉及到用户应该如何与操作系统 (或者是其他的软件) 进行交互的核心模块。 +### 用户界面——CLI,TUI与GUI +目前常见的计算机操作系统有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) -而 TUI 虽然绝大部分都由字符组成,但有更为丰富的表现形式且可以接受更为丰富的输入。最经典的 TUI 恐怕要属 (可能很) 大名鼎鼎的文本编辑器 **Vim**。在 Vim 中,用户可以通过大量的功能强大的指令进行移动光标、修改文本以及其他更复杂的操作。从图中可以看到,TUI 相比 CLI 来说更像一个 “界面”,包含了光标,窗口等要素,只不过这些要素都由文本构成 (感谢 ╣ 之类的框线字符)。CLI 与 TUI 的一个好处是摆脱了对于鼠标的依赖,不过更大的好处是避免机器将性能花费在渲染图形上。现在的家用电脑大多不需要对这种程度的性能精打细算,但涉及到服务器以及需要远程控制之类的场合,节省下来的这些性能以及空间还是显得十分实惠,以及远程传输文本总比远程传输图片方便,不至于被肉眼可见的鼠标移动延迟折磨心智、血压升高的尴尬情况出现。另外说句题外话,从代码编写者的角度来讲,由于为代码编写 UI 总是耗费精力的,所以我们大多时候与自己写的程序进行交互总是通过 CLI 的方式,所以熟悉 CLI 与 TUI 的这种交互方式总是没有坏处的。 +而TUI虽然绝大部分都由字符组成,但有更为丰富的表现形式且可以接受更为丰富的输入。最经典的TUI恐怕要属(可能很)大名鼎鼎的文本编辑器**Vim**。在Vim中,用户可以通过大量的功能强大的指令进行移动光标、修改文本以及其他更复杂的操作。从图中可以看到,TUI相比CLI来说更像一个“界面”,包含了光标,窗口等要素,只不过这些要素都由文本构成(感谢 ╣ 之类的框线字符)。CLI与TUI的一个好处是摆脱了对于鼠标的依赖,不过更大的好处是避免机器将性能花费在渲染图形上。现在的家用电脑大多不需要对这种程度的性能精打细算,但涉及到服务器以及需要远程控制之类的场合,节省下来的这些性能以及空间还是显得十分实惠,以及远程传输文本总比远程传输图片方便,不至于被肉眼可见的鼠标移动延迟折磨心智、血压升高的尴尬情况出现。另外说句题外话,从代码编写者的角度来讲,由于为代码编写UI总是耗费精力的,所以我们大多时候与自己写的程序进行交互总是通过CLI的方式,所以熟悉CLI与TUI的这种交互方式总是没有坏处的。 ![](/assets/basic/09-drive-your-computer-5/Vim-(logiciel)-console.png) -一张 Wiki 上 Vim 的图片,注意到虽然界面还是全部由文字组成,但出现了 “窗口” 的概念,窗口中的内容也可以动态进行交互。 +一张Wiki上Vim的图片,注意到虽然界面还是全部由文字组成,但出现了“窗口”的概念,窗口中的内容也可以动态进行交互。 ### 集成开发环境与文本编辑器 写在前面:以下内容更加适合配合计算概论相关课程食用。 -入门的计算概论课往往会推荐 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 来说更自然的运行代码方式是在其内的终端里手动输入编译/运行相关的指令,这也更符合其 “代码编辑器” 的定位。 +代码编辑器的另一个特点是可以通过添加插件以丰富其原版略显单薄的功能。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 的原因,因为动态类型导致语法语义层面的错误无法被编译器静态检测出来,从而无法在编写代码时就获得提示。~~ +之所以在节标题中单列了如何阅读报错,就是因为语法语义错误是初学者最经常遇到的问题,而编译器会以报错信息的形式友情提示这些错误是什么、在哪里。而高级一些的代码编辑工具,还会把能被编译器检测出来的错误实时地标注在代码上面。~~这也是为什么写出来的Python代码往往会带有很多bug的原因,因为动态类型导致语法语义层面的错误无法被编译器静态检测出来,从而无法在编写代码时就获得提示。~~ 以下是一个简单的编译器报错信息例子。 ```cpp #include @@ -76,7 +76,7 @@ D:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.1.0/../../../../x86_64-w64 C:/M/B/src/mingw-w64/mingw-w64-crt/crt/crtexewin.c:70: undefined reference to `WinMain' collect2.exe: error: ld returned 1 exit status ``` -虽然信息略显抽象,但我们还是可以看到很多有用的信息。`ld` 是 c++中的链接器,再往上看可以发现对 `WinMain` 的引用是未定义的。这提示我们去看 main 函数,从而发现这里 `main()` 被输入成了 `mian()`,因此链接器无法找到 main 函数,从而引发错误 +虽然信息略显抽象,但我们还是可以看到很多有用的信息。`ld`是c++中的链接器,再往上看可以发现对`WinMain`的引用是未定义的。这提示我们去看main函数,从而发现这里`main()`被输入成了`mian()`,因此链接器无法找到main函数,从而引发错误 下面是另一个例子; ```python @@ -102,10 +102,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 的关键。 \ No newline at end of file +而关于更复杂的debug问题,很难给出具有代表性的例子或是在几段话内讲清楚,不过还是有一些具有普适性的建议。在这方面互联网上有很多的资料,感兴趣的同学可以去自行了解。 +debug最重要的一件事是缩小错误出现的范围,为达成这一目的我们通常会跟踪代码的行为,直到发现代码的行为与预期不符。调试器可以提供“跟踪代码行为“的功能,而不想学习调试器使用方法的话通过`print`语句打印代码中间状态也是一个不错的选择。前文提到的模块化的设计方式在这里仍然适用。先是找到出现问题的模块,再缩小搜索范围直到找到出现问题的具体语句。 +而更棘手的情况是代码只在特定的数据上出现问题,比如OJ告诉你的代码出现了`Wrong Answer`或`Runtime Error`,而你却不知道导致代码出现问题的数据到底是什么。这时最应该做的是重新审视自己的预期(以及OJ题的题面),寻找是否遗漏了什么约束条件或关键信息。一份貌似运行正常的代码很有可能会在边界条件或复杂数据的情况下出问题,可以尝试手写一些处于边界条件之下的数据,或编写一个数据生成器来生成更复杂的数据。实在手足无措时,休息一下放空大脑也是很好的选择。实在走投无路之时,摇人求助也不是什么大不了的事情。debug很可能会占用比编写代码更多的时间和精力,保持良好的心态才是debug的关键。 \ No newline at end of file diff --git a/basic/10-linux-basic-1.md b/basic/10-linux-basic-1.md index e089c3f..b7f159f 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]。 ::: @@ -15,7 +15,7 @@ 对于 Windows 等带图形化界面操作系统,我们所访问的其实是设计者抽象出的交互逻辑。但对于高效的系统,自底向上的彻底理解和掌握是高效使用系统的必备途径。我们得以更深入洞悉文件和文件之间的联系,获得系统更高的主动权。同时,以最小化的人机接口访问能把足够多的资源投入至计算,获得最高的资源利用率。`Linux` 正是带着这样的思想而诞生的。 -因此,学习 Linux,我们需要掌握: +因此,学习 Linux ,我们需要掌握: 1. 对这一套思想有充分理解、能顺利玩一些玩具 2. 使用现有的工具操作命令行、把他人准备好的软件运行起来 @@ -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,15 +58,15 @@ sl - `apt -h`:这是最简单的程序帮助,会列出一些常用的知识 - `man apt`:这是最详细的程序帮助,会列出所有的知识,但是可能会很长 - `tldr apt`:这个命令会给出一些使用示例,可以照着抄 -(`tldr` 需要自行安装,相信你可以根据上面安装 `sl` 的方法举一反三) +(`tldr`需要自行安装,相信你可以根据上面安装`sl`的方法举一反三) ## Linux 101 好,你现在已经知道怎么用 Linux 了,我们来介绍一下 Linux 的一些基本概念。本讲我们不会涉及到很深刻的内容,只是让大家有一个大概的印象。在后续探索中,大家会有更深入的想法。 -首先我们来想一想,你刚刚输入的命令是什么?是一个叫做 `sl` 的程序。程序是什么?你的终端怎么知道 `sl` 是什么的?小火车是怎么输出到你面前的?为了成体系地解决这些问题,计算机前辈们发挥了计算机科学中”抽象 “的传家本领:只要能把这些东西抽象归纳为一个概念,就可以方便地管理所有资源。 +首先我们来想一想,你刚刚输入的命令是什么?是一个叫做`sl`的程序。程序是什么?你的终端怎么知道`sl`是什么的?小火车是怎么输出到你面前的?为了成体系地解决这些问题,计算机前辈们发挥了计算机科学中”抽象“的传家本领:只要能把这些东西抽象归纳为一个概念,就可以方便地管理所有资源。 -所以,“文件” 这一概念被抽象出来,Unix 认为 “一切皆文件”:他们是数据的容器、可读可写,可以被操作。这样,我们就可以用同样的方法来操作文件、程序、设备等等。这时候就有更多问题了: +所以,“文件”这一概念被抽象出来,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,可以了解如何与远程主机之间进行文件传输。 @@ -98,25 +98,25 @@ Linux 上,文件的路径分绝对路径和相对路径两种。绝对路径 ### 文件是谁的,有哪些属性? -对文件的基本操作,有读、写、执行三种。作为多机系统,Linux 中文件如果对每个访问者都相同,那就没有安全性可言了。Linux 的做法是,抽象出了 “用户” 这个实体 (其实就是在 `/etc/passwd` 里面定义的一行 UID 和用户名的对应而已)。为了方便用户的文件共享,同时抽象出了组 (Group) 的概念,代表一组互相信任的用户。 +对文件的基本操作,有读、写、执行三种。作为多机系统,Linux 中文件如果对每个访问者都相同,那就没有安全性可言了。Linux 的做法是,抽象出了“用户”这个实体(其实就是在 `/etc/passwd` 里面定义的一行 UID 和用户名的对应而已)。为了方便用户的文件共享,同时抽象出了组(Group)的概念,代表一组互相信任的用户。 ::: info 补充材料 -root 是一个特殊用户,可以自行查阅资料了解。 +root是一个特殊用户,可以自行查阅资料了解。 ::: -用权限位 4、2、1 (二进制下第 3 2 1 个 bit) 代表读、写、执行的权限,每个文件的读、写、执行,对应当前用户、组内用户以及其他用户组成的 3\*3 矩阵,就是文件的权限。把每一类用户的权限相加可以得到当前权限的简写。 +用权限位 4、2、1 (二进制下第 3 2 1个 bit )代表读、写、执行的权限,每个文件的读、写、执行,对应当前用户、组内用户以及其他用户组成的 3\*3 矩阵,就是文件的权限。把每一类用户的权限相加可以得到当前权限的简写。 例子:750,当前用户$7 = 4 + 2 + 1$,可读可行可执行;同组$5 = 4 + 1$,可读可执行不可写;其他用户$0$,没有任何权限。你可以查看 `chmod` 的帮助,了解如何改变权限。 -**所以可执行文件并不是因为这个文件本身有什么特别,而是这个文件被你赋予了可执行的性质。**一个简单的文本文件也可以被加上可执行的权限,也可以发挥操作其他文件的作用,后文的 `Shell` 脚本,以及 `Python` 脚本,都是如此。 +**所以可执行文件并不是因为这个文件本身有什么特别,而是这个文件被你赋予了可执行的性质。** 一个简单的文本文件也可以被加上可执行的权限,也可以发挥操作其他文件的作用,后文的`Shell`脚本,以及`Python`脚本,都是如此。 ::: tip 试一试 -如果你会写 Python 的话,写一个从输入读取 4 个数字,输出他们和的程序,输出结果到控制台。 +如果你会写 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 4e4cc38..408411c 100644 --- a/basic/11-linux-basic-2.md +++ b/basic/11-linux-basic-2.md @@ -1,4 +1,4 @@ -# Linux 与服务器介绍与基本使用 II +# Linux与服务器介绍与基本使用 II ::: info 本文信息 作者:LSZ2005 @@ -8,70 +8,70 @@ ## Linux 安装和使用 -### Linux 简介 +### Linux简介 -Linux,一般指 GNU/Linux,是一种自由和开放源码的类 UNIX 操作系统内核。其英文解释为 Linux is not Unix。Linux 的内核由林纳斯·托瓦兹 (Linus Torvalds) 于1991年10月5日首次发布。它主要受到 Minix 和 Unix 思想的启发,是一个基于 POSIX 的多用户、多任务、支持多线程和多 CPU 的操作系统内核。它支持非常丰富的硬件,能运行主要的 Unix 工具软件、应用程序和网络协议。 +Linux,一般指GNU/Linux,是一种自由和开放源码的类 UNIX 操作系统内核。其英文解释为 Linux is not Unix。Linux 的内核由林纳斯·托瓦兹(Linus Torvalds)于1991年10月5日首次发布。它主要受到Minix和Unix思想的启发,是一个基于POSIX的多用户、多任务、支持多线程和多CPU的操作系统内核。它支持非常丰富的硬件,能运行主要的Unix工具软件、应用程序和网络协议。 -Linux 遵循 GNU 通用公共许可证 (GPL),任何个人和机构都可以自由地使用 Linux 的所有底层源代码,也可以自由地修改和再发布。因此 Linux 有上百种不同的发行版,目前主流的 Linux 版本有:Debian 系 (包括 Ubuntu、Linux Mint 等)、EL 系 (包括及 Red Hat Enterprise Linux、Fedora,CentOS)、openSUSE 等。 +Linux 遵循 GNU 通用公共许可证(GPL),任何个人和机构都可以自由地使用 Linux 的所有底层源代码,也可以自由地修改和再发布。因此Linux有上百种不同的发行版,目前主流的Linux版本有:Debian系(包括Ubuntu、Linux Mint等)、EL系(包括及Red Hat Enterprise Linux、Fedora, CentOS)、openSUSE等。 -### Linux 安装 +### Linux安装 -我们以在 x86-64 架构的 windows 下安装 Debian 双系统为例进行介绍。 +我们以在x86-64架构的windows下安装Debian双系统为例进行介绍。 -#### 1。准备工作 +#### 1. 准备工作 -需要的硬件:U 盘 (备份好内部数据) +需要的硬件:U盘(备份好内部数据) -##### a。镜像的下载 +##### a. 镜像的下载 - 前往你所选择的发行版的官网下载镜像,同一发行版的镜像会拥有不同版本,根据需要选择适合的版本。以下我会简略说明各版本的区别。 -- 有条件尽量前往官网下载,大部分发行版的官网国内都可以直连。也可以到各高校镜像站的 “ISO 下载” 一栏下载,速度较快。 +- 有条件尽量前往官网下载,大部分发行版的官网国内都可以直连。也可以到各高校镜像站的“ISO下载”一栏下载,速度较快。 -- 64 位与 32 位:指的是 CPU 通用寄存器的数据宽度,常见的 32 位架构为 x86,64 位架构为 AMD64/x64/x86_64。32 位架构逐渐被淘汰,我们选择版本时应选择 64 位的操作系统 (即带有后三者之一标识的镜像)。 +- 64位与32位:指的是CPU通用寄存器的数据宽度,常见的32位架构为x86,64位架构为AMD64/x64/x86_64。32位架构逐渐被淘汰,我们选择版本时应选择64位的操作系统(即带有后三者之一标识的镜像)。 -- 正式版与测试版:对于初学者来说应选择正式版,如果想为体验新功能并为其纠错等可以选择测试版系统。测试版系统的生命周期会远低于正式版系统,需要及时更新以获得软件支持,一般官方网站也会提供相应的测试版下载渠道。特别地,Ubuntu 系统还有着长期支持版 (LTS),在每个偶数年的4月一更,相比其他版本生命周期更长。 +- 正式版与测试版:对于初学者来说应选择正式版,如果想为体验新功能并为其纠错等可以选择测试版系统。测试版系统的生命周期会远低于正式版系统,需要及时更新以获得软件支持,一般官方网站也会提供相应的测试版下载渠道。特别地,Ubuntu系统还有着长期支持版(LTS),在每个偶数年的4月一更,相比其他版本生命周期更长。 image-20240831200902600 -(如图,20年发布的 Ubuntu 20.04 LTS 至今仍在提供更新,而非 LTS 版最早只支持到23年发布的 Ubuntu 23.10) +(如图,20年发布的Ubuntu 20.04 LTS至今仍在提供更新,而非LTS版最早只支持到23年发布的Ubuntu 23.10) -- 桌面版、服务器版与其他版本:同一个发行版会根据用途来分为不同子版本,功能有所差异,如服务器版很多不带有图形界面。用于日常使用建议下载桌面版 (desktop),用于部署服务器则考虑 Server 版,其他情况应按需选择。 +- 桌面版、服务器版与其他版本:同一个发行版会根据用途来分为不同子版本,功能有所差异,如服务器版很多不带有图形界面。用于日常使用建议下载桌面版(desktop),用于部署服务器则考虑Server版,其他情况应按需选择。 ![image-20240831201200824](/assets/basic/11-linux-basic-2/image-20240831201200824.png) -- 镜像的种类 (安装方式):以 debian 12.x 为例,官方提供了两种安装方式:较小的网络安装包与完整的离线安装包,前者需要联网进行安装,后者安装过程无需联网。由于官网连接速度不稳定所以一般选择下载完整的安装映像 (这里的 iso 文件的链接表示直接下载镜像文件,torrent 种子需用第三方下载器来下载镜像文件) +- 镜像的种类(安装方式):以debian 12.x为例,官方提供了两种安装方式:较小的网络安装包与完整的离线安装包,前者需要联网进行安装,后者安装过程无需联网。由于官网连接速度不稳定所以一般选择下载完整的安装映像(这里的iso文件的链接表示直接下载镜像文件,torrent种子需用第三方下载器来下载镜像文件) image-20240831201443388 -##### b。U 盘的刻录 +##### b. U盘的刻录 -加载映像文件并运行安装程序需要系统重新引导,一般的处理方式为将其刻录至 U 盘中,再让电脑启动这个 U 盘中的安装文件。一般使用第三方镜像刻录软件完成这一步骤。这里笔者使用 rufus (也可以使用 UltraISO,不过这个是收费软件) 来进行刻录 ([下载链接](https://rufus.ie/zh/)) +加载映像文件并运行安装程序需要系统重新引导,一般的处理方式为将其刻录至U盘中,再让电脑启动这个U盘中的安装文件。一般使用第三方镜像刻录软件完成这一步骤。这里笔者使用rufus(也可以使用UltraISO,不过这个是收费软件)来进行刻录([下载链接](https://rufus.ie/zh/)) image-20240831202651295 -如图,在第一栏 “设备” 处选择你的 U 盘,然后点击 “选择” 并选择指定安装镜像,然后点击下面的 “开始” 即可完成刻录。注意刻录会将 U 盘内原有数据清空,请注意备份数据。U 盘大小只要足够装得下镜像文件即可。 +如图,在第一栏“设备”处选择你的U盘,然后点击“选择”并选择指定安装镜像,然后点击下面的“开始”即可完成刻录。注意刻录会将U盘内原有数据清空,请注意备份数据。U盘大小只要足够装得下镜像文件即可。 -##### c。磁盘分区 +##### c. 磁盘分区 -若机器原本没有系统或不想保留原有操作系统则跳过这一步骤 (操作同后文虚拟机安装时的步骤)。 +若机器原本没有系统或不想保留原有操作系统则跳过这一步骤(操作同后文虚拟机安装时的步骤)。 -对初学者而言尽量在 windows 下预留出空闲空间后再安装系统,以免在 linux 下操作时误删分区,以下简述 windows 下预留空间的具体方法~~(若能在 linux 下完成这一步骤则可跳过)~~ +对初学者而言尽量在windows下预留出空闲空间后再安装系统,以免在linux下操作时误删分区,以下简述windows下预留空间的具体方法~~(若能在linux下完成这一步骤则可跳过)~~ -使用 windows 系统自带的 “创建并格式化硬盘分区” 功能可以看到你的磁盘分区情况,若没有空闲空间则可在剩余容量较多的分区右键选择 “压缩卷” 以获得空闲空间,linux 系统一般需求的磁盘空间不多。若剩余容量较多的分区在逻辑卷内或有其他复杂情况可以使用 diskgenius 等分区软件 (正版已经够用,也可使用[图吧工具箱](https://www.tbtool.cn/)内的版本) 进行处理。 +使用windows系统自带的“创建并格式化硬盘分区”功能可以看到你的磁盘分区情况,若没有空闲空间则可在剩余容量较多的分区右键选择“压缩卷”以获得空闲空间,linux系统一般需求的磁盘空间不多。若剩余容量较多的分区在逻辑卷内或有其他复杂情况可以使用diskgenius等分区软件(正版已经够用,也可使用[图吧工具箱](https://www.tbtool.cn/)内的版本)进行处理。 -##### d。启动引导 +##### d. 启动引导 -由于需要从刻录好镜像文件的 U 盘启动,需要关闭 windows 的快速启动功能。 +由于需要从刻录好镜像文件的U盘启动,需要关闭windows的快速启动功能。 -打开控制面板->硬件和声音->电源选项,找到左边的 “选择电源按钮的功能”,进入这个界面。有的电脑在关机设置这里会有一个 “启用快速启动” 选项打勾,若有这个选项我们需要将其关闭,先点击 “更改当前不可用的设置” 来获取管理员权限,然后再将其取消勾选。有的机型的快速启动设置还会在 BIOS 中的 Boot 中,需要进入 BIOS 修改。 +打开控制面板->硬件和声音->电源选项,找到左边的“选择电源按钮的功能”,进入这个界面。有的电脑在关机设置这里会有一个“启用快速启动”选项打勾,若有这个选项我们需要将其关闭,先点击“更改当前不可用的设置”来获取管理员权限,然后再将其取消勾选。有的机型的快速启动设置还会在BIOS中的Boot中,需要进入BIOS修改。 image-20240831204242101 -BIOS 的进入:开启电脑时出现电脑品牌图标的时候按 F2 键或 Delete 键会进入 BIOS (部分电脑可能会是 F1、F12 或 Esc 键)。有的 BIOS 厂商做了图形界面,可以直接图形化显示引导项,将刻录好的 U 盘拖拽到第一项即可。若没有图形化界面,则在 Boot 栏中调整启动顺序,使 U 盘为第一引导项。 +BIOS的进入:开启电脑时出现电脑品牌图标的时候按F2键或Delete键会进入BIOS(部分电脑可能会是F1、F12或Esc键)。有的BIOS厂商做了图形界面,可以直接图形化显示引导项,将刻录好的U盘拖拽到第一项即可。若没有图形化界面,则在Boot栏中调整启动顺序,使U盘为第一引导项。 -#### 2。安装系统 +#### 2. 安装系统 -这里以 debian 12.x 的安装为例进行说明,我们使用北京大学镜像站,加速下载。在选择镜像时,请选择 “指定镜像” 并选择你所在地区的镜像站。 +这里以debian 12.x的安装为例进行说明,我们使用北京大学镜像站,加速下载。在选择镜像时,请选择“指定镜像”并选择你所在地区的镜像站。 进入后会出现几个选项,这里是在选择安装类型,简单起见这里选择第一项,使用图形界面安装 @@ -81,62 +81,62 @@ BIOS 的进入:开启电脑时出现电脑品牌图标的时候按 F2 键或 D image-20240831205502046 -在 linux 系统中 root 账户拥有最高权限,你所选择的发行版在安装时可能会要求设置 root 账户密码。如果没有这一选项可以在安装系统后在终端使用 passwd 命令设置。 +在linux系统中root账户拥有最高权限,你所选择的发行版在安装时可能会要求设置root账户密码。如果没有这一选项可以在安装系统后在终端使用passwd命令设置。 -若使用虚拟机或想直接安装在整个磁盘 (即覆盖原有数据) 可选择 “使用整个磁盘”,否则需选择 “手动” 并找到空闲空间。 +若使用虚拟机或想直接安装在整个磁盘(即覆盖原有数据)可选择"使用整个磁盘",否则需选择"手动"并找到空闲空间。 image-20240831205556924 -如图,这里的 21.5GB 即为空闲空间,我们就要在这块空间上安装系统。 +如图,这里的21.5GB即为空闲空间,我们就要在这块空间上安装系统。 image-20240831205619702 -若对分区操作不熟或者没有特殊需求的可以选择 “对空闲区间进行自动分区” 来自动完成操作。这里 debian 系统预留了三种分区方案可供选择。 +若对分区操作不熟或者没有特殊需求的可以选择“对空闲区间进行自动分区”来自动完成操作。这里debian系统预留了三种分区方案可供选择。 image-20240831205713350 image-20240831205748850 -如果有着自己的需求也可以在上一项选择 “创建新分区” 手动在其上建立新分区。主分区需采用 Ext4 文件系统并挂载在”/”根目录下,还需要分配空间给交换空间 (swap) 等,如果还想建立其他分区来挂载到其余位置可以继续操作。 +如果有着自己的需求也可以在上一项选择“创建新分区”手动在其上建立新分区。主分区需采用Ext4文件系统并挂载在”/”根目录下,还需要分配空间给交换空间(swap)等,如果还想建立其他分区来挂载到其余位置可以继续操作。 -最后选择 “完成分区操作并将修改写入磁盘” 来结束操作并将改动写入磁盘,注意操作后会将所使用的磁盘空间格式化,装双系统时为避免 linux 系统下操作出现失误建议先在 windows 下清理出空闲空间再进行操作。 +最后选择“完成分区操作并将修改写入磁盘”来结束操作并将改动写入磁盘,注意操作后会将所使用的磁盘空间格式化,装双系统时为避免linux系统下操作出现失误建议先在windows下清理出空闲空间再进行操作。 image-20240831205920758 -若使用网络安装则可能会有选择镜像源的选项,举例所使用的 Debian12 系统中自带了多个软件源来选择,一般换用国内源速度较快。如果某些发行版安装过程中没有选项则可以在安装完成后自行更换。 +若使用网络安装则可能会有选择镜像源的选项,举例所使用的Debian12系统中自带了多个软件源来选择,一般换用国内源速度较快。如果某些发行版安装过程中没有选项则可以在安装完成后自行更换。 image-20240831210031979 -下一步选择的是安装的软件集。Debian 桌面环境与标准系统工具是需要安装的,web Server、SSH Server 这些服务器组件按需安装。GNOME、Xfce、KDE、cinnamon、MATE、LXDE、LXQt 则是 Linux 的桌面环境 (可以理解为图形界面),一般选择默认的 GNOME,剩余的按照喜好勾选。 +下一步选择的是安装的软件集。Debian桌面环境与标准系统工具是需要安装的,web Server、SSH Server这些服务器组件按需安装。GNOME、Xfce、KDE、cinnamon、MATE、LXDE、LXQt则是Linux的桌面环境(可以理解为图形界面),一般选择默认的GNOME,剩余的按照喜好勾选。 image-20240831210119209 -接下来即可顺利完成安装。等到系统安装完成,重启过程中显示 “请移除安装介质后 ENTER” 或已经重启完毕后再拔掉 U 盘,然后即可进入系统。若是双系统则也可按照喜好更改 GRUB 引导方式。 +接下来即可顺利完成安装。等到系统安装完成,重启过程中显示“请移除安装介质后ENTER”或已经重启完毕后再拔掉U盘,然后即可进入系统。若是双系统则也可按照喜好更改GRUB引导方式。 -### Linux 使用 +### Linux使用 #### 环境的配置 -##### root 权限的配置 +##### root权限的配置 -root 用户是超级用户,拥有着 linux 系统内最高的权限,在终端内使用 `su` 命令即可以超级用户开启终端,root 用户的权限最高,而其他账户则可能会有以能以超级用户身份执行命令的授权 (可以类比 windows 中的管理员权限),但即使是拥有授权的账户在终端输入的命令也不会以超级用户身份执行,如果需要以超级用户的身份运行则需要在此命令前加 sudo。 +root用户是超级用户,拥有着linux系统内最高的权限,在终端内使用`su`命令即可以超级用户开启终端,root用户的权限最高,而其他账户则可能会有以能以超级用户身份执行命令的授权(可以类比windows中的管理员权限),但即使是拥有授权的账户在终端输入的命令也不会以超级用户身份执行,如果需要以超级用户的身份运行则需要在此命令前加sudo。 -第一种情况,如果你所选择的发行版在安装过程中没有设置 root 密码的环节 (如 Ubuntu),则新创建的用户会拥有管理员权限,一般不需要使用 root 账户,直接使用 sudo 命令即可。 +第一种情况,如果你所选择的发行版在安装过程中没有设置root密码的环节(如Ubuntu),则新创建的用户会拥有管理员权限,一般不需要使用 root 账户,直接使用 sudo 命令即可。 -第二种情况,如果你所选择的发行版在安装过程中已经设置了 root 密码,但是自己的账户并没有管理员权限 (如 Debian),为了用起来方便一般会用 root 账户给自己的账户添加管理员权限,具体操作如下 (\$号后的为输入的命令): +第二种情况,如果你所选择的发行版在安装过程中已经设置了root密码,但是自己的账户并没有管理员权限(如Debian),为了用起来方便一般会用root账户给自己的账户添加管理员权限,具体操作如下(\$号后的为输入的命令): ``` yourusername@yourcomputer$ su root@yourcomputer$ /usr/sbin/usermod -aG sudo yourusername ``` -前者表示切换至 root 账户,后者表示为你指定的账户添加管理员权限。有些发行版中 wheel 组表示有 sudo 权限的用户组,也可以用 visudo 编辑 sudo 配置。 +前者表示切换至root账户,后者表示为你指定的账户添加管理员权限。有些发行版中wheel组表示有sudo权限的用户组,也可以用visudo编辑sudo配置。 ##### 软件源的配置 如果你的系统在安装的时候已经选择过了国内源则忽略,否则默认源来自于国外。从国外的服务器更新软件包会很慢,可以根据自己系统的版本自行搜索匹配的源并更换。具体参考[北京大学镜像站帮助](https://mirrors.pku.edu.cn/Help) -以采用 apt 包管理器为例,更新源后需要重新更新软件索引,请执行以下操作: +以采用apt包管理器为例,更新源后需要重新更新软件索引,请执行以下操作: ```bash sudo apt-get update @@ -145,7 +145,7 @@ sudo apt-get upgrade # 如果需要升级软件包 #### 基本命令 -在这之前,我们想先聊一聊 Linux 的中心--文件。从 Unix 时代,文件就是操作系统的核心抽象,甚至有 “一切皆文件” 的说法。在 Linux 中,文件是一切的基础,包括硬件设备、目录、文件、套接字、管道等等,都是文件。Linux 中的文件系统是一个树状结构,根目录为 /,所有文件都是从根目录开始的。 +在这之前,我们想先聊一聊 Linux 的中心--文件。从 Unix 时代,文件就是操作系统的核心抽象,甚至有“一切皆文件”的说法。在 Linux 中,文件是一切的基础,包括硬件设备、目录、文件、套接字、管道等等,都是文件。Linux 中的文件系统是一个树状结构,根目录为 /,所有文件都是从根目录开始的。 对系统的使用其实是对文件的操作,所以我们先来看看 Linux 中的文件操作。 ##### 常用命令 @@ -156,18 +156,18 @@ 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```的命令而不是文件本身,这时可以使用```./```来避免歧义。 ``` 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```命令还可使用通配符来显示所有满足要求的文件。 ``` ls -l # 以长格式显示当前目录中的文件和目录 @@ -183,7 +183,7 @@ ls -l /etc/passwd # 显示/etc/passwd文件的详细信息 pwd [--help] [--version] ``` -显示当前的目录,一般是在程序中用 (实际上就是终端中光标左边的目录) +显示当前的目录,一般是在程序中用(实际上就是终端中光标左边的目录) ``` mkdir [-p] dirName @@ -191,19 +191,19 @@ mkdir [-p] dirName - ```-p``` 确保目录名称存在,不存在的就建一个。 -在当前目录下新建文件夹,后面的 ```dirName``` 可以是个目录下的文件夹 (即 ```dir1/dir2``` 的形式表示在当前目录的 dir1 文件夹下建立它的子文件夹 dir2)。如果加入 ```-p``` 选项会一直沿着 ```dirName``` 指定的目录建立 (即若不存在 dir1 则先建立 dir1 直到指定位置),不加入 ```-p``` 若目录不存在则会报错。 +在当前目录下新建文件夹,后面的```dirName```可以是个目录下的文件夹(即```dir1/dir2```的形式表示在当前目录的dir1文件夹下建立它的子文件夹dir2)。如果加入```-p```选项会一直沿着```dirName```指定的目录建立(即若不存在dir1则先建立dir1直到指定位置),不加入```-p```若目录不存在则会报错。 ``` touch [-acfm][-d<日期时间>][-r<参考文件或目录>][-t<日期时间>][--help][--version] [文件或目录] ``` -在当前目录下创建文件 (实际使用时前面的参数经常不指定,可直接加文件名,如 ```touch file.txt```) +在当前目录下创建文件(实际使用时前面的参数经常不指定,可直接加文件名,如```touch file.txt```) ``` cp [options] source dest ``` -前者表示源文件,后者表示目标文件,表示将指定源文件复制到目标文件位置。若目标文件不存在则会新建一个 (此时作用相当于备份),若目标文件存在则会替换 (此时相当于替换) +前者表示源文件,后者表示目标文件,表示将指定源文件复制到目标文件位置。若目标文件不存在则会新建一个(此时作用相当于备份),若目标文件存在则会替换(此时相当于替换) ``` -a:此选项通常在复制目录时使用,它保留链接、文件属性,并复制目录下的所有内容。其作用等于 dpR 参数组合。 -d:复制时保留链接。这里所说的链接相当于 Windows 系统中的快捷方式。 @@ -220,7 +220,7 @@ cp [options] source dest mv [options] source dest ``` -前者表示源文件,后者表示目标文件,表示将指定源文件移动到目标文件位置。```cp``` 与 ```mv``` 操作的文件路径都可以是相对路径或绝对路径 +前者表示源文件,后者表示目标文件,表示将指定源文件移动到目标文件位置。```cp```与```mv```操作的文件路径都可以是相对路径或绝对路径 ``` -b: 当目标文件或目录存在时,在执行覆盖前,会为其创建一个备份。 @@ -234,7 +234,7 @@ mv [options] source dest ps [options] [--help] ``` -用于显示当前进程的状态,类似于 windows 的任务管理器。参数过多故不再一一列举,建议使用 ```--help``` 来查看具体用法。 +用于显示当前进程的状态,类似于windows的任务管理器。参数过多故不再一一列举,建议使用```--help```来查看具体用法。 ``` --help 查看帮助 @@ -266,7 +266,7 @@ ps -ef | grep 进程关键字 压缩:gzip FileName ``` -。tar.gz 和。tgz +.tar.gz 和 .tgz ``` 解压:tar -zxvf FileName.tar.gz @@ -321,15 +321,15 @@ 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 系的软件安装为例: +下述以debian系的软件安装为例: -1. 使用 ```apt``` 包管理器安装 (推荐) 安装简单,便于接收持续更新 +1. 使用```apt```包管理器安装(推荐)安装简单,便于接收持续更新 ``` sudo apt update 列出所有可更新的软件清单 @@ -342,7 +342,7 @@ apt list --upgradeable 列出可更新的软件包及版本信息 部分软件可能会需要自行添加源,需要按照安装指示进行操作 -2. (。deb 文件) 直接使用 ```dpkg``` 安装 +2. (.deb文件)直接使用```dpkg```安装 ``` dpkg --help 显示帮助 @@ -351,7 +351,7 @@ sudo dpkg -i file.deb 安装指定的软件包 3. 软件带有安装程序 -软件带有如 ```.sh``` 文件、```.pl``` 文件这类的安装程序。一般可在终端加上 ```sudo``` 直接运行,若没有开始运行可能是未添加可执行权限,可通过这个命令手动添加: +软件带有如```.sh```文件、```.pl```文件这类的安装程序。一般可在终端加上```sudo```直接运行,若没有开始运行可能是未添加可执行权限,可通过这个命令手动添加: ``` chmod +x file.txt 给指定文件添加可执行权限 @@ -363,14 +363,14 @@ chmod +x file.txt 给指定文件添加可执行权限 #### 文本编辑 -这里简单介绍命令行模式下的常用文本编辑器:vi/vim +这里简单介绍命令行模式下的常用文本编辑器:vi/vim -vi:文书编辑器,所有的类 Unix 系统中都内建有 vi -vim:由 vi 发展出来的文本编辑器。拥有代码补全、编译及错误跳转的功能。 +vi: 文书编辑器,所有的类Unix系统中都内建有vi +vim: 由vi发展出来的文本编辑器。拥有代码补全、编译及错误跳转的功能。 -vi/vim 分为三种模式:命令模式 (普通模式)、输入模式、命令行模式 (底线命令模式) +vi/vim 分为三种模式:命令模式(普通模式)、输入模式、命令行模式(底线命令模式) -直接在命令行输入 ```vi```/```vim``` 则会进入命令模式,以下是几个常用命令: +直接在命令行输入```vi```/```vim```则会进入命令模式,以下是几个常用命令: ``` i -- 切换到输入模式,在光标当前位置开始输入文本。 @@ -384,9 +384,9 @@ u -- 撤销上一次操作。 Ctrl+r -- 重做上一次撤销的操作。 ``` -输入模式通过在命令模式按 ‘i’ 进入,按 Esc 则返回普通模式,输入模式下可以完成文本编辑工作,与日常使用的文本编辑器区别不大。 +输入模式通过在命令模式按'i'进入,按Esc则返回普通模式,输入模式下可以完成文本编辑工作,与日常使用的文本编辑器区别不大。 -底线命令模式在命令模式下按 ‘:’ 进入,最常用的是如下命令: +底线命令模式在命令模式下按':'进入,最常用的是如下命令: ``` :w -- 保存文件。 @@ -395,11 +395,11 @@ Ctrl+r -- 重做上一次撤销的操作。 :q! -- 不保存修改强制退出 Vim 编辑器。 ``` -除了直接按 vi/vim 以外还可以通过后接文件名的方式来直接打开指定文件, -如 ```sudo vi /etc/apt/sources.list``` +除了直接按vi/vim以外还可以通过后接文件名的方式来直接打开指定文件, +如```sudo vi /etc/apt/sources.list``` ::: info 提示 -vim 提供了一个教程软件,可以通过以下命令打开: +vim提供了一个教程软件,可以通过以下命令打开: ``` vimtutor ``` @@ -409,120 +409,120 @@ vimtutor ### 虚拟机的介绍 -虚拟机 (Virtual Machine) 指通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统。在实体计算机中能够完成的工作在虚拟机中都能够实现。在计算机中创建虚拟机时,需要将实体机的部分硬盘和内存容量作为虚拟机的硬盘和内存容量。每个虚拟机都有独立的 CMOS、硬盘和操作系统,可以像使用实体机一样对虚拟机进行操作。 +虚拟机(Virtual Machine)指通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统。在实体计算机中能够完成的工作在虚拟机中都能够实现。在计算机中创建虚拟机时,需要将实体机的部分硬盘和内存容量作为虚拟机的硬盘和内存容量。每个虚拟机都有独立的CMOS、硬盘和操作系统,可以像使用实体机一样对虚拟机进行操作。 常用虚拟机软件: -- 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系统,后者支持mac系统,是最常用的虚拟机软件,各项功能齐全,性能强大。 +- Oracle VM Virtualbox : 支持windows/mac/linux系统,是一个免费开源的虚拟机软件~~(前最强免费虚拟机软件)~~ +- Parallels Desktop : 仅支持mac系统的收费虚拟机软件。 +- 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,mac下的虚拟化解决方案 #### mac -Parallels Desktop:mac 下的首选虚拟化软件,优点是安装虚拟机非常简便快捷,设计风格与操作流程非常符合 mac 的设计习惯。由于它兼具性能强、价格贵的特点,是否使用需要你自己衡量。 +Parallels Desktop: mac下的首选虚拟化软件,优点是安装虚拟机非常简便快捷,设计风格与操作流程非常符合mac的设计习惯。由于它兼具性能强、价格贵的特点,是否使用需要你自己衡量。 -VMware Fusion Pro:功能也十分全面,目前对个人用户免费,是不想购买 Parallels Desktop 的最优选择。 +VMware Fusion Pro: 功能也十分全面,目前对个人用户免费,是不想购买Parallels Desktop的最优选择。 -Virtualbox:老牌虚拟机软件,在 VMware 对个人免费之前是 mac 下最好用的免费虚拟机软件,不过现在功能更强大的 VMware Fusion Pro 免费后不太推荐。 +Virtualbox: 老牌虚拟机软件,在VMware对个人免费之前是mac下最好用的免费虚拟机软件,不过现在功能更强大的VMware Fusion Pro免费后不太推荐。 #### linux -VMware Workstaion Pro/Virtualbox:一般 linux 下使用完整的虚拟机会在二者中选择其一,不过一般 linux 下很少有需求需要用到完整独立的 windows 环境,如果想要运行某些 windows 应用或者使用一部分 windows 环境可以使用下面的方法: +VMware Workstaion Pro/Virtualbox : 一般linux下使用完整的虚拟机会在二者中选择其一,不过一般linux下很少有需求需要用到完整独立的windows环境,如果想要运行某些windows应用或者使用一部分windows环境可以使用下面的方法: -wine:是一个 Windows 兼容层,允许你在类 Unix 操作系统 (如 Linux) 上运行 Windows 应用程序,而无需安装双系统或虚拟机。 +wine : 是一个Windows兼容层,允许你在类Unix操作系统(如Linux)上运行Windows应用程序,而无需安装双系统或虚拟机。 -qemu:是纯软件实现的虚拟化模拟器,几乎可以模拟任何硬件设备,也能够模拟一台能够独立运行操作系统的虚拟机。常与 KVM 搭配使用,KVM 用于 CPU 和内存的虚拟化,qemu 用于 I/O 的虚拟化,二者一同完成虚拟化操作。 +qemu : 是纯软件实现的虚拟化模拟器,几乎可以模拟任何硬件设备,也能够模拟一台能够独立运行操作系统的虚拟机。常与KVM搭配使用,KVM用于CPU和内存的虚拟化,qemu用于I/O的虚拟化,二者一同完成虚拟化操作。 -### WSL 的使用 +### WSL的使用 -#### WSL 的定义 +#### WSL的定义 -WSL,全称为适用于 Linux 的 Windows 子系统 (Windows Subsystem on Linux) 是一个可以在 Windows 计算机上同时访问 Windows 和 Linux 的强大功能。可以安装 Linux 发行版并直接在 Windows 上使用 Linux 应用程序、实用程序和 Bash 命令行工具,不用进行任何修改,也无需承担传统虚拟机或双启动设置的费用。 +WSL,全称为适用于Linux的Windows子系统 (Windows Subsystem on Linux)是一个可以在Windows计算机上同时访问Windows和Linux的强大功能。可以安装Linux发行版并直接在Windows上使用Linux应用程序、实用程序和Bash命令行工具,不用进行任何修改,也无需承担传统虚拟机或双启动设置的费用。 -#### WSL 的安装 +#### 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 发行版,可以自行阅读档案,这里讲解另一种方法: +其中一种安装方法是微软在WSL的官方说明中所写的,这种方法会默认安装Ubuntu发行版,可以自行阅读档案,这里讲解另一种方法: -去 Microsoft Store 中搜索你想要的 Linux 发行版及其版本号,随后点击 “安装”,安装后点击 “打开”,会弹出一个命令行窗口,需要配置一段时间。接下老会让你设置初始账户的名称与密码,然后 WSL 就安装完成了。 +去Microsoft Store中搜索你想要的Linux发行版及其版本号,随后点击"安装",安装后点击"打开",会弹出一个命令行窗口,需要配置一段时间。接下老会让你设置初始账户的名称与密码,然后WSL就安装完成了。 image-20240901110107708 -#### WSL 的版本与配置 +#### WSL的版本与配置 -与正常的 linux 发行版相同,WSL 也需要设置 root 账户密码/更换源等操作,方法如上所述。 +与正常的linux发行版相同,WSL也需要设置root账户密码/更换源等操作,方法如上所述。 -WSL 有两个版本:WSL1 与 WSL2,功能有着细微差别,各有优缺: +WSL有两个版本:WSL1与WSL2,功能有着细微差别,各有优缺: ##### WSL 1 -WSL1 是一个轻量级的 Linux 兼容性层,它会将 Linux 系统调用转换为 Windows NT 内核调用来实现 Linux 应用程序的运行,但不支持完整的 Linux 内核功能。 +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 的必要)。 +WSL1在不使用远程桌面连接形成图形化界面的情况下相当于一个Linux命令行,如果运行的代码不需要Linux内核的情况下没有必要使用WSL2,WSL1就已经足够(大部分情况下没有使用WSL2的必要)。 ##### WSL 2 -WSL2 使用真正的 Linux 内核,并且支持 Docker 等其他高级功能。 +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 的命令 +##### WSL的命令 -(均为在 windows 下的终端进行操作) +(均为在windows下的终端进行操作) ``` wsl -l -v ``` -这个命令可以查看当前的 WSL 的状态 +这个命令可以查看当前的WSL的状态 image-20240901112412132 -如图,NAME 表示 linux 系统名,VERSION 表示使用的是 WSL1 或 2,STATE 表示当前是否在运行 +如图,NAME表示linux系统名,VERSION表示使用的是WSL1或2,STATE表示当前是否在运行 ``` wsl --shutdown ``` -这个命令会关闭所有正在运行的 WSL 发行版与 WSL2 虚拟机 +这个命令会关闭所有正在运行的WSL发行版与WSL2虚拟机 ``` wsl --set-version ``` -这个命令可以转换指定 linux 系统的 WSL 版本 (需要关机状态下) +这个命令可以转换指定linux系统的WSL版本(需要关机状态下) ``` wsl --set-default ``` -这个命令是设置默认启动的发行版,因为你可以选择安装多个 linux 发行版 -(甚至可以 WSL1,2 各留一个应对不同情况) +这个命令是设置默认启动的发行版,因为你可以选择安装多个linux发行版 +(甚至可以WSL1,2各留一个应对不同情况) -后续的几个命令一般连用,可以将原本放在 C 盘指定位置的 WSL 文件导出到其他盘。 +后续的几个命令一般连用,可以将原本放在C盘指定位置的WSL文件导出到其他盘。 ``` wsl --export ``` -将指定分发版的快照导出为新的分发文件,默认为 tar 格式。FileName 可以带有路径来以放在其他盘,如 +将指定分发版的快照导出为新的分发文件,默认为tar格式。FileName可以带有路径来以放在其他盘,如 ``` wsl --export Ubuntu D:\WSL\Ubuntu.tar @@ -532,7 +532,7 @@ wsl --export Ubuntu D:\WSL\Ubuntu.tar wsl --unregister ``` -从 WSL 取消注册该发行版 (相当于卸载该发行版)。子系统内部的所有数据、设置和软件将永久丢失,从 Store 重新安装会安装分发版的干净副本。如果想要保留数据,未经过导出操作不要使用这个命令。 +从WSL取消注册该发行版(相当于卸载该发行版)。子系统内部的所有数据、设置和软件将永久丢失,从Store重新安装会安装分发版的干净副本。如果想要保留数据,未经过导出操作不要使用这个命令。 ``` wsl --unregister Ubuntu @@ -542,36 +542,36 @@ wsl --unregister Ubuntu wsl --import ``` -导入指定的 tar 文件作为新的分发版 (可在后面添加--version 1/2 表示 WSL 的版本号)。如果用于改变 WSL 的安装位置,则 FileName 与先前所填的相同,InstallLocation 填写新的 WSL 安装目录,如: +导入指定的tar文件作为新的分发版(可在后面添加--version 1/2表示WSL的版本号)。如果用于改变WSL的安装位置,则FileName与先前所填的相同,InstallLocation填写新的WSL安装目录,如: ``` wsl --import Ubuntu D:\WSL\Ubuntu D:\WSL\Ubuntu.tar --version 2 ``` -### windows 下虚拟机的安装 +### windows下虚拟机的安装 -#### 1。准备工作 +#### 1. 准备工作 -1. 下载对应发行版的镜像 (ISO 文件) +1. 下载对应发行版的镜像(ISO文件) -2. VMware 的安装: -最新版 Vmware Workstation 17 已对个人用户免费,有条件可直接前往 VMware 官网下载,或自行寻找可信的国内源下载。(注意软件名称为 VMware Workstation Pro) -在安装完成后激活时选择 “将 VMware Workstation 17 用于个人用途” 即可免费完成激活。 +2. VMware的安装: +最新版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。安装过程 +#### 2. 安装过程 -注:VMware 的自动安装功能不够完善,安装某些特殊发行版时会出现问题,且可选项有限。接下来我将演示手动安装虚拟机的步骤 (以使用 VMware 安装 Debian 虚拟机为例) +注:VMware的自动安装功能不够完善,安装某些特殊发行版时会出现问题,且可选项有限。接下来我将演示手动安装虚拟机的步骤(以使用VMware安装Debian虚拟机为例) ##### 2.1 虚拟机的创建 -首先,如图点击 “创建新的虚拟机” +首先,如图点击“创建新的虚拟机” image-20240901002126326 -然后在新建虚拟机向导中选择 “自定义”。 +然后在新建虚拟机向导中选择“自定义”。 image-20240901002156060 @@ -579,11 +579,11 @@ wsl --import Ubuntu D:\WSL\Ubuntu D:\WSL\Ubuntu.tar --version 2 image-20240901002224900 -注意下一步的安装来源这里需要选择 “稍后安装操作系统”,否则 VMware 会自动安装镜像文件中的系统。 +注意下一步的安装来源这里需要选择“稍后安装操作系统”,否则VMware会自动安装镜像文件中的系统。 image-20240901002317606 -在下一步中选择你想要安装的系统的版本,以这个镜像为例需要选择 Debian 12.x 64 位,具体需要根据你下载的镜像决定 (这个选项主要需要把 64 位或 32 位看清楚,其余的不是特别重要) +在下一步中选择你想要安装的系统的版本,以这个镜像为例需要选择Debian 12.x 64位,具体需要根据你下载的镜像决定(这个选项主要需要把64位或32位看清楚,其余的不是特别重要) image-20240901002358587 @@ -595,35 +595,35 @@ wsl --import Ubuntu D:\WSL\Ubuntu D:\WSL\Ubuntu.tar --version 2 image-20240901002516660 -处理器配置这里的 “处理器数量” 指分配的核心数量,“每个处理器的内核数量” 指给每个核心分配的线程数,总共给虚拟机分配的线程数为二者乘积。 +处理器配置这里的"处理器数量"指分配的核心数量,"每个处理器的内核数量"指给每个核心分配的线程数,总共给虚拟机分配的线程数为二者乘积。 -若安装的系统对性能要求不高且不运行大项目则无需太多核心,2x2 或 4x1 乃至 2x1 就已经很够了,不要分配太多以免主机卡顿,分配前请计算自己 CPU 的核心数量 (如大小核需要~~鸡兔同笼~~特别计算)。 +若安装的系统对性能要求不高且不运行大项目则无需太多核心,2x2或4x1乃至2x1就已经很够了,不要分配太多以免主机卡顿,分配前请计算自己CPU的核心数量(如大小核需要~~鸡兔同笼~~特别计算)。 image-20240901002603682 -给虚拟机分配内存也是同理,不要超过主机内存的一半,如果是 linux 等对内存需求不高的 4GB 也够用,Windows 可能会需要 8GB 及以上,内存和核心分配的具体数值可以等安装虚拟机后使用软件查看利用情况后再另行调整。 +给虚拟机分配内存也是同理,不要超过主机内存的一半,如果是linux等对内存需求不高的4GB也够用,Windows可能会需要8GB及以上,内存和核心分配的具体数值可以等安装虚拟机后使用软件查看利用情况后再另行调整。 image-20240901002654446 -网络类型如无特殊需求可直接选用默认的网络地址转换 (NAT) +网络类型如无特殊需求可直接选用默认的网络地址转换(NAT) image-20240901002716229 -I/O 控制器类型与磁盘类型也可直接采用推荐选项。 +I/O控制器类型与磁盘类型也可直接采用推荐选项。 image-20240901002730501 image-20240901002740664 -选择磁盘时,如果有既有的虚拟机磁盘 (如转移其他版本或其他软件上的虚拟机) 则可选择 “使用现有虚拟磁盘” 一栏并直接导入。 +选择磁盘时,如果有既有的虚拟机磁盘(如转移其他版本或其他软件上的虚拟机)则可选择"使用现有虚拟磁盘"一栏并直接导入。 -否则选择 “创建新虚拟磁盘”。具体的磁盘大小根据你的用途决定,正常情况下推荐的大小就够用了。 +否则选择"创建新虚拟磁盘"。具体的磁盘大小根据你的用途决定,正常情况下推荐的大小就够用了。 image-20240901002844318 -如果不勾选 “立即分配磁盘空间” 则会根据该虚拟磁盘储存数据多少来动态占用磁盘空间 (较为推荐)。 +如果不勾选"立即分配磁盘空间"则会根据该虚拟磁盘储存数据多少来动态占用磁盘空间(较为推荐)。 -将虚拟磁盘存储为单个文件会导致转移时需要分卷转移或使用较大的移动硬盘,还对磁盘的格式有限制 (如 U 盘常用的 FAT32 格式单个文件最大支持 4GB) +将虚拟磁盘存储为单个文件会导致转移时需要分卷转移或使用较大的移动硬盘,还对磁盘的格式有限制(如U盘常用的FAT32格式单个文件最大支持4GB) image-20240901002910526 @@ -633,65 +633,65 @@ I/O 控制器类型与磁盘类型也可直接采用推荐选项。 image-20240901003303914 -选择设置里的硬件->CD/DVD->连接选项,改为 “使用 ISO 映像文件” 并选择你下载的发行版安装镜像。 +选择设置里的硬件->CD/DVD->连接选项,改为"使用ISO映像文件"并选择你下载的发行版安装镜像。 image-20240901003803015 -当 CD/DVD 一栏显示正在使用…(你的 ISO 文件路径) 的时候即可启动虚拟机,然后与正常 linux 系统的安装方法相同直到进入桌面。 +当CD/DVD一栏显示正在使用…(你的ISO文件路径)的时候即可启动虚拟机,然后与正常linux系统的安装方法相同直到进入桌面。 -原本的 “移除安装介质” (即拔掉 U 盘) 的环节,可以右键 VMware 窗口右下角的光驱图标并选择 “断开连接” 来达到相同效果,原本的断网操作也可以右键网络图标并断开连接,等到安装完成后再右键连接。 +原本的"移除安装介质"(即拔掉U盘)的环节,可以右键VMware窗口右下角的光驱图标并选择"断开连接"来达到相同效果,原本的断网操作也可以右键网络图标并断开连接,等到安装完成后再右键连接。 image-20240901003954815 -##### 2.3 VMware tools 的安装 +##### 2.3 VMware tools的安装 -如果刚装好虚拟机你可能会发现有几个问题:分辨率锁死无法调节、拖拽和共享文件夹无法使用、3D 加速无法开启等诸多问题,这是因为 VMware tools 没有安装 (你可以将其理解需要在虚拟机内安装 VMware 的驱动) +如果刚装好虚拟机你可能会发现有几个问题:分辨率锁死无法调节、拖拽和共享文件夹无法使用、3D加速无法开启等诸多问题,这是因为VMware tools没有安装(你可以将其理解需要在虚拟机内安装VMware的驱动) -首先需要加载 VMware tools 的镜像,在**系统安装完成后**如果出现了下面这个黄条就点击 “安装 Tools” 按钮。 +首先需要加载VMware tools的镜像,在**系统安装完成后**如果出现了下面这个黄条就点击"安装Tools"按钮。 ![image-20240901102457715](/assets/basic/11-linux-basic-2/image-20240901102457715.png) -如果没有这个黄条也可以在 VMware 的菜单栏中选择虚拟机->安装 VMware Tools (第一次安装没有 “重新” 二字,如果你已经安装过 VMware Tools 了就会显示重新安装,可以根据上述功能是否正常工作判断是否需要重新安装) +如果没有这个黄条也可以在VMware的菜单栏中选择虚拟机->安装VMware Tools(第一次安装没有"重新"二字,如果你已经安装过VMware Tools了就会显示重新安装,可以根据上述功能是否正常工作判断是否需要重新安装) 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 -然后将这个压缩文件拷贝到一个其他位置,如自己的主目录 (因为原位置只读),然后再进入该目录并将其解压。 +然后将这个压缩文件拷贝到一个其他位置,如自己的主目录(因为原位置只读),然后再进入该目录并将其解压。 image-20240901104405772 -然后进入解压出来的文件夹 (```./vmware-tools-distrib```),用**sudo (管理员权限)**运行 ```vmware-install.pl``` 文件 +然后进入解压出来的文件夹(```./vmware-tools-distrib```),用**sudo(管理员权限)**运行```vmware-install.pl```文件 image-20240901104554049 -然后在如图所示第一个选项 (默认选择为 no) 输入 yes,其余的选项直接狂按 Enter 键走默认选项就可以,随后安装成功。 +然后在如图所示第一个选项(默认选择为no)输入yes,其余的选项直接狂按Enter键走默认选项就可以,随后安装成功。 image-20240901104740639 ##### 2.4 虚拟机的设置 -虚拟机与主机的信息交换方式常用三种,最简单的是将下面的 “拖放” 与 “复制粘贴” 开启。 +虚拟机与主机的信息交换方式常用三种,最简单的是将下面的“拖放”与“复制粘贴”开启。 image-20240901003411492 -或者也可以采取共享文件夹的方法,为保护主机数据建议将主机路径设置到一个独立的空文件夹内或开启只读。共享文件夹一般挂载到 ‘```/mnt/hgfs/```’ 下。 +或者也可以采取共享文件夹的方法,为保护主机数据建议将主机路径设置到一个独立的空文件夹内或开启只读。共享文件夹一般挂载到'```/mnt/hgfs/```'下。 image-20240901003446957 image-20240901003459605 -快照功能是虚拟机相比直接装系统的一大优势,相当于将虚拟机存档。(WSL 也有快照功能,不过用起来没有虚拟机的方便)。VMware 菜单上三个时钟图样的表示的就是快照功能,使用 “快照管理器” 可以用时间轴的方式直观地展示各快照的关系并随时添加快照。 +快照功能是虚拟机相比直接装系统的一大优势,相当于将虚拟机存档。(WSL也有快照功能,不过用起来没有虚拟机的方便)。VMware菜单上三个时钟图样的表示的就是快照功能,使用"快照管理器"可以用时间轴的方式直观地展示各快照的关系并随时添加快照。 image-20240901114423930 -还有 USB 的接入功能,这个功能允许直接将连在主机上的设备直接接入虚拟系统。如图,在虚拟机->可移动设备中可以找到能直接接入虚拟机的设备,若选择 “连接” 则会将该设备断开与主机的连接并直接接入虚拟机 (比如正常模式下的键盘默认按 ```ctrl+alt``` 会将焦点移出虚拟机,无法按出 linux 的终端快捷键 ```ctrl+alt+T```,而直接连接后则可以正常使用该快捷键),常用的直接连接的设备如键盘、鼠标、移动硬盘等。 +还有USB的接入功能,这个功能允许直接将连在主机上的设备直接接入虚拟系统。如图,在虚拟机->可移动设备中可以找到能直接接入虚拟机的设备,若选择"连接"则会将该设备断开与主机的连接并直接接入虚拟机(比如正常模式下的键盘默认按```ctrl+alt```会将焦点移出虚拟机,无法按出linux的终端快捷键```ctrl+alt+T```,而直接连接后则可以正常使用该快捷键),常用的直接连接的设备如键盘、鼠标、移动硬盘等。 image-20240901114741910 @@ -699,67 +699,67 @@ I/O 控制器类型与磁盘类型也可直接采用推荐选项。 ### SSH -#### SSH 的介绍 +#### SSH的介绍 -SSH 全称 Secure Shell,是一种网络协议,用于加密两台计算机之间的通信,并且支持各种身份验证机制。它主要用于保证远程登录和远程通信的安全,任何网络服务都可以用这个协议来加密。 +SSH全称Secure Shell,是一种网络协议,用于加密两台计算机之间的通信,并且支持各种身份验证机制。它主要用于保证远程登录和远程通信的安全,任何网络服务都可以用这个协议来加密。 -SSH 的软件架构是服务器-客户端模式 (Server-Client)。在这个架构中,SSH 软件分成两个部分:向服务器发出请求的部分,称为客户端 (client),OpenSSH 的实现为 ```ssh```;接收客户端发出的请求的部分,称为服务器 (server),OpenSSH 的实现为 ```sshd```。 +SSH 的软件架构是服务器-客户端模式(Server-Client)。在这个架构中,SSH软件分成两个部分:向服务器发出请求的部分,称为客户端(client),OpenSSH 的实现为 ```ssh```;接收客户端发出的请求的部分,称为服务器(server),OpenSSH 的实现为 ```sshd```。 -#### SSH 的安装 +#### SSH的安装 -若你所使用的 linux 发行版使用 ```apt``` 包管理器,可通过以下命令安装: +若你所使用的linux发行版使用```apt```包管理器,可通过以下命令安装: ``` sudo apt install openssh-client openssh-server ``` -若使用的是 ```yum``` 包管理器,则是 +若使用的是```yum```包管理器,则是 ``` sudo yum -y install openssh-clients openssh-server ``` -查看 SSH 服务是否正在运行:```systemctl status sshd``` +查看SSH服务是否正在运行:```systemctl status sshd``` -#### 如何查看 IP +#### 如何查看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 的用法 +#### SSH的用法 -查看 openSSH 安装版本:```ssh -V``` +查看openSSH安装版本:```ssh -V``` -使用 ssh 登录服务器的命令: +使用ssh登录服务器的命令: ``` ssh hostname ``` -```hostname```:主机名,可以是域名、IP 地址或局域网内部的主机名。不指定用户名的情况下,将使用客户端的当前用户名,作为远程服务器的登录用户名,也可以用以下两种方式指定用户名: +```hostname```: 主机名,可以是域名、IP地址或局域网内部的主机名。不指定用户名的情况下,将使用客户端的当前用户名,作为远程服务器的登录用户名,也可以用以下两种方式指定用户名: ``` ssh username@hostname ssh -l username hostname ``` -ssh 除了使用 ```-l``` 参数指定用户名外还可以使用 ```-p``` 指定端口 (默认连接 22 端口) +ssh除了使用```-l```参数指定用户名外还可以使用```-p```指定端口(默认连接22端口) ``` ssh username@hostname -p 22 ``` -以使用 ssh 从 windows 系统 (作为客户端) 连接至刚安装好的 debian 虚拟机 (作为服务端) 为例,主机名与用户名与安装过程中所设的相同 (若忘记可查看 linux 系统中终端) +以使用ssh从windows系统(作为客户端)连接至刚安装好的debian虚拟机(作为服务端)为例,主机名与用户名与安装过程中所设的相同(若忘记可查看linux系统中终端) 第一次连接会出现这样的提示: @@ -769,39 +769,39 @@ ECDSA key fingerprint is SHA256: ... Are you sure you want to continue connecting (yes/no)? ``` -这段文字告诉用户,这台服务器的指纹是陌生的,让用户选择是否要继续连接。选择 yes 即可与该服务器建立连接,输入需要登录的账户的密码后即可登录远程服务器的 shell。 +这段文字告诉用户,这台服务器的指纹是陌生的,让用户选择是否要继续连接。选择yes即可与该服务器建立连接,输入需要登录的账户的密码后即可登录远程服务器的shell。 -使用这个语句可以在 SSH 登录成功后立刻执行接下来的命令。但是若该命令需要互动式的 shell 环境则会报错。可以加入 ```-t``` 参数来解决这个问题 +使用这个语句可以在SSH登录成功后立刻执行接下来的命令。但是若该命令需要互动式的shell环境则会报错。可以加入```-t```参数来解决这个问题 ``` ssh [-t] username@hostname COMMAND ``` -若是用来连接主机,```hostname``` 也可换为 IP 地址 +若是用来连接主机,```hostname```也可换为IP地址 ### scp/sftp #### scp -scp 是 SSH 提供的一个客户端程序,用来在两台主机之间加密传送文件 (即复制文件)。它的底层是 SSH 协议且默认端口也为 22,相当于先使用 ssh 命令登录远程主机,然后再执行拷贝操作。 +scp是SSH提供的一个客户端程序,用来在两台主机之间加密传送文件(即复制文件)。它的底层是SSH协议且默认端口也为22,相当于先使用ssh命令登录远程主机,然后再执行拷贝操作。 -scp 的操作与 cp 类似,但是可以 +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 -sftp 是 SSH 提供的一个客户端应用程序,主要用来访问 SFTP 服务器。使用下面的命令连接 SFTP 主机: +sftp是SSH提供的一个客户端应用程序,主要用来访问SFTP服务器。使用下面的命令连接SFTP主机: ``` sftp username@hostname @@ -809,9 +809,9 @@ sftp username@hostname image-20240901194931485 -如图,出现 ```sftp>``` 这个提示符就表示连接成功了 +如图,出现```sftp>```这个提示符就表示连接成功了 -用法同 FTP,支持的命令大致与 linux 的终端操作相同,注意 ```put``` 与 ```get``` 的使用。 +用法同FTP,支持的命令大致与linux的终端操作相同,注意```put```与```get```的使用。 ``` ls [directory] : 列出一个远程目录的内容。如果没有指定目标目录,则默认列出当前目录。 @@ -824,33 +824,33 @@ help : 显示帮助信息。 bye / quit / exit : 退出 sftp。 ``` -sftp 内默认连接至远程主机主目录 (即 ```~```),且远程主机的路径无法识别 ```~``` +sftp内默认连接至远程主机主目录(即```~```),且远程主机的路径无法识别```~``` -下图是一个使用 sftp 传送文件的示例 +下图是一个使用sftp传送文件的示例 image-20240901200012668 -### SSH 的密钥登录 +### SSH的密钥登录 -SSH 默认采用密码登录,有着不安全且麻烦的缺点。密钥登录是比密码登录更好的解决方案。 +SSH默认采用密码登录,有着不安全且麻烦的缺点。密钥登录是比密码登录更好的解决方案。 -- 密钥 (key) 是一个非常大的数字,通过加密算法得到。对称加密只需要一个密钥,而 SSH 密钥采用的非对称加密需要两个密钥成对使用,分为公钥和私钥。每个用户通过自己私密保存的私钥登录。而公钥则是公开对外发送的。公钥和私钥是一一对应的,每一个私钥都有且仅有一个对应的公钥,反之亦然。 -- 如果数据使用公钥加密,那么只有使用对应的私钥才能解密,其他密钥都不行;反过来,如果使用私钥加密 (这个过程一般称为 “签名”),也只有使用对应的公钥解密。 +- 密钥(key)是一个非常大的数字,通过加密算法得到。对称加密只需要一个密钥,而SSH密钥采用的非对称加密需要两个密钥成对使用,分为公钥和私钥。每个用户通过自己私密保存的私钥登录。而公钥则是公开对外发送的。公钥和私钥是一一对应的,每一个私钥都有且仅有一个对应的公钥,反之亦然。 +- 如果数据使用公钥加密,那么只有使用对应的私钥才能解密,其他密钥都不行;反过来,如果使用私钥加密(这个过程一般称为"签名"),也只有使用对应的公钥解密。 使用密钥登录有着如下流程: 1. 手动将客户端的公钥放入远程服务器的指定位置。 -2. 客户端向服务器发起 SSH 登录的请求。 -3. 服务器收到用户 SSH 登录的请求,发送一些随机数据给用户,要求用户证明自己的身份。 +2. 客户端向服务器发起SSH登录的请求。 +3. 服务器收到用户SSH登录的请求,发送一些随机数据给用户,要求用户证明自己的身份。 4. 客户端收到服务器发来的数据,使用私钥对数据进行签名,然后再发还给服务器。 5. 服务器收到客户端发来的加密签名后,使用对应的公钥解密,然后跟原始数据比较。如果一致,就允许用户登录。 -> [!IMPORTANT] 想一想 -> 前文第 3 步使用随机数据要求用户证明自己身份,如果使用固定的数据让用户证明自己身份,会发生什么? +> [!IMPORTANT] 想一想 +> 前文第3步使用随机数据要求用户证明自己身份,如果使用固定的数据让用户证明自己身份,会发生什么? #### 生成密钥 -使用 ```ssh-keygen``` 程序,直接在终端输入 ```ssh-keygen``` 即可生成密钥,如下是一次生成密钥的过程。 +使用```ssh-keygen```程序,直接在终端输入```ssh-keygen```即可生成密钥,如下是一次生成密钥的过程。 ``` lsz@debian:~$ ssh-keygen @@ -865,9 +865,9 @@ 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) +第二个问题询问的是是否为私钥设置密码保护(passphrase) 生成密钥后为了安全可以修改权限 @@ -876,45 +876,45 @@ 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```填写用户名与主机名,第一个文件位置对应着刚生成的公钥位置) ``` 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 的相关插件 +### VSCode的相关插件 -#### 使用 WSL 扩展连接到 WSL 子系统 +#### 使用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 连接 +#### 使用Remote-SSH扩展进行SSH连接 -首先使用 VSCode 下载并安装扩展 “Remote-SSH” +首先使用VSCode下载并安装扩展"Remote-SSH" image-20240901204654164 -然后选择左侧边栏的 “远程资源管理器”,展开 “远程 (隧道/SSH)”,点击 “SSH” 右边的设置键 +然后选择左侧边栏的"远程资源管理器",展开"远程(隧道/SSH)",点击"SSH"右边的设置键 image-20240901205237955 @@ -922,7 +922,7 @@ windows 下可以使用 PuTTY,也可以使用后续介绍的 VSCode image-20240901205346758 -然后写入如下内容 (尖括号内为自己远程连接的设备信息,Port 为连接的端口号): +然后写入如下内容(尖括号内为自己远程连接的设备信息,Port为连接的端口号): ``` Host @@ -931,15 +931,15 @@ Host User ``` -保存 config 文件后按 “远程 (隧道/SSH)” 右边的刷新按钮。 +保存config文件后按"远程(隧道/SSH)"右边的刷新按钮。 -然后按下 ```F1``` 或 ```Ctrl+Shift+P``` 键,输入 ```ssh connect```,选择 “将当前窗口连接到主机”。并选择刚创建好的配置并按照要求登录。初次登录可能会占用时间设置服务器,最后若右下角可以显示 SSH 的目标主机表示设置成功。 +然后按下```F1```或```Ctrl+Shift+P```键,输入```ssh connect```,选择"将当前窗口连接到主机"。并选择刚创建好的配置并按照要求登录。初次登录可能会占用时间设置服务器,最后若右下角可以显示SSH的目标主机表示设置成功。 image-20240901211038298 -如图,远程系统的文件与命令行可以正常地在 VSCode 中显示。 +如图,远程系统的文件与命令行可以正常地在VSCode中显示。 -VSCode 也支持通过公钥私钥配对的方式免密登录,再次打开先前的 config 文件,加入新的一行: +VSCode也支持通过公钥私钥配对的方式免密登录,再次打开先前的config文件,加入新的一行: ``` Host ... @@ -949,14 +949,14 @@ Host ... IdentityFile ``` -其中 `````` 即为存放私钥的路径。 +其中``````即为存放私钥的路径。 ## 结尾 -本文主要由@lsz 编写,非常感谢@decmofofs 提供的第三部分的大纲及全文的修改建议,联系方式: +本文主要由@lsz编写,非常感谢@decmofofs提供的第三部分的大纲及全文的修改建议,联系方式: -- aililsz2005@outlook.com [github 主页](https://github.com/LSZ2005) +- aililsz2005@outlook.com [github主页](https://github.com/LSZ2005) -- decmofofs@gmail.com [github 主页](https://github.com/decmofofs) +- decmofofs@gmail.com [github主页](https://github.com/decmofofs) -**注**:本文版权属于 LCPU (Linux Club of Peking University),用作 LCPU Getting Started 项目,转载请注明出处。联系方式:linuxclub@pku.edu.cn +**注**:本文版权属于LCPU(Linux Club of Peking University),用作LCPU Getting Started项目,转载请注明出处。联系方式:linuxclub@pku.edu.cn