diff --git "a/docs/\350\256\241\347\256\227\346\234\272\347\247\221\345\255\246\345\255\246\344\271\240\350\267\257\347\272\277/\350\256\241\347\256\227\346\234\272\345\237\272\347\241\200/\345\205\210\344\277\256\345\206\205\345\256\271/git.md" "b/docs/\350\256\241\347\256\227\346\234\272\347\247\221\345\255\246\345\255\246\344\271\240\350\267\257\347\272\277/\350\256\241\347\256\227\346\234\272\345\237\272\347\241\200/\345\205\210\344\277\256\345\206\205\345\256\271/git.md" new file mode 100644 index 0000000..b264bd7 --- /dev/null +++ "b/docs/\350\256\241\347\256\227\346\234\272\347\247\221\345\255\246\345\255\246\344\271\240\350\267\257\347\272\277/\350\256\241\347\256\227\346\234\272\345\237\272\347\241\200/\345\205\210\344\277\256\345\206\205\345\256\271/git.md" @@ -0,0 +1,300 @@ +# Git:分布式版本控制软件 + +!!! note "什么是分布式版本控制软件" + + ![image-20211007231126799](https://i.loli.net/2021/10/07/yTHKCmGkxJXUOSj.png) + + 在代码开发过程中,总会遇到一些问题。代码不知道改了哪里不能运行了,想要回退怎么办?多个人同时想对代码进行修改(并行开发),开发完后怎么合并?显然,有一个能帮助我们解决这些问题的工具将极大的加快我们开发的速度。而这种工具,便是版本控制软件。 + + 版本控制软件帮助使用者找出: + + + 不同版本之间的差异 + + 谁做出了这个修改 + + 什么时候做出了这个修改 + + 做出修改的人给出的修改理由 + + 那么,什么是分布式的版本控制软件呢?为了了解清楚,我们需要区分**中央版本控制系统**和**分布式版本控制系统**的区别。 + + 中央版本控制系统必须同时存在服务端和客户端。当进行代码备份时,客户端会向服务端发出请求,并将此次修改的内容发送到服务器当中去,服务端收到请求后,会将代码存储在服务器当中;同样当客户端想查看某一个版本的修改内容或者想恢复到某一个版本之时,客户端也会发送请求到服务端,服务在端接收到请求之后会做出相应的处理并返回给客户端。也就是说,在业务流程过程中,服务端必须存在,**所有请求必须经过服务端的处理**。 + + 分布式版本控制器,主要是将备份的代码以及记录**完全独立在本地存储**。比如说当你想将代码恢复到某一个版本的时候,本地版本控制器**不需要依赖网络**便可以完成此操作,因为本地版本控制器拥有**完整独立的一套控制系统**。 + + Excerpted from https://www.imooc.com/read/51/article/1008. + +!!! note "什么是 Git" + + Git 是 Linux(一种程序员热爱的操作系统)之父 Linus Torvalds 为开发 Linux 内核而建立的一个**分布式版本控制软件**。 + + Git 除了版本控制软件本身的优势以外,还可以: + + + 通过查看 `git history`,开发者可以看到一个项目开发的时间线 + + 通过 `git branch`(分支),开发者可以在不用担心影响主代码的情况下进行开发 + +## 前置知识 + ++ 命令行命令的使用操作 ++ 愿意**动手实践**的决心(多尝试) ++ 做好笔记整理与总结的能力(遗忘后便于快速回忆) + +## 从安装与配置开始 + +### Windows + +**编辑器** + +Git 需要绑定文本编辑器使用,自带支持以下编辑器: + ++ Nano ++ Vim ++ Notepad++ ++ VS Code ++ Sublime ++ Atom ++ VS Codium + +如果你没有安装上述文本编辑器,那么你使用的很可能是⻛评并不好的记事本(英文:Notepad),不建议拿它作为 Git 的绑定编辑器。这种情况下建议使用 Notepad++,它的操作与界面可以和记事本实现很好的过渡。可以使用 [科协云盘下载链接](https://cloud.tsinghua.edu.cn/f/9bd487642fcb4e468c67/?dl=1) 下载,安装过程中全部点“下一步”(或同位置的按钮)即可。完成之后你将和记事本永远告别,打开文本文件的默认方式会变成 Notepad++。 + +**下载** + ++ 安装包下载地址:https://gitforwindows.org/ ++ 国内镜像:https://npm.taobao.org/mirrors/git-for-windows/ ++ 清华镜像(校内访问较快):https://mirrors.tuna.tsinghua.edu.cn/github-release/git-for-windows/git/ + +**安装** + +下面内容英文大佬或者熟练掌握了 `git config` 指令(乃至会直接修改配置文件)的同学可以忽略在安装过程中大部分选项,直接点 Next 即可。但是有两个地方需要注意:编辑器和换行符。 + +编辑器默认选项是 Vim,如果没有 Vim 经验的同学,请选择其他熟悉的编辑器(如上面提到的 NotePad++)。 + +![image-20211008145023695](https://i.loli.net/2021/10/08/3P62Ayk9hUEVw5t.png) + +对于换行符,在 Windows 中,默认的换行是 CRLF,但实际开发时,通常会发现大家一致使用 LF。关于 CRLF 和 LF 的区别我们在这里不再详细介绍,因为读者在《程序设计基础》课程中已了解过相关内容。 + +对于安装过程中换行符的配置,这里 Checkout 表示从仓库中拉取的代码是以什么换行符结尾,Commit 表示你提交的代码是以什么换行符结尾,as-is 是说换行符保持原样。 + +我们推荐的选项是根据今后的应用场景来选择。如果团队中既有 Windows 选手又有 Linux 选手,那么我们可以选择第三项(即改动最小原则,我们并不想因为 Commit 时换行符的问题覆盖掉其他开发者的贡献)。当然如果团队中的各位做过约定,大家统一以 LF 为换行符为结尾开发,提交的代码也只能是 LF 结尾,那么我们就可以选择第一项或者第二项。 + +注意,这个设置我们推荐默认选择第三项,然后对于有需要的项目分别配置: + +```bash +git config core.autocrlf true/input/false +``` + +其中 `true`, `input`, `false` 分别对应第一,第二,第三项。 + +![image-20211008145130391](https://i.loli.net/2021/10/08/FHmSajyeDAnI2Cd.png) + +### Debian/Ubuntu + +```bash +apt-get install libcurl4-gnutls-dev libexpat1-dev gettext +apt-get install git +``` + +### Centos/RedHat + +```bash +yum install curl-devel expat-devel gettext-devel +yum install git-core +``` + +### Mac + +一般 Mac 平台是自带 Git 的。 + +如果实在没有在 Mac 平台上安装 Git 最容易的当属使用图形化的 Git 安装工具,下载地址为 http://sourceforge.net/projects/git-osx-installer/。 + +有 Homebrew 的同学也可以用 `brew install git` 安装(或者自学怎么安装 Homebrew)。 + +### 配置 Git + +使用如下命令可以配置自己在 git 中的用户名和邮箱,你也可以通过 `git config` 命令按自己的喜好配置更多东西。 + +```bash +git config --global user.name +git config --global user.email +``` + +## 基础操作 + ++ Repo(sitory) 简介 + +包含了一个项目的所有文件、文件夹。每个文件的修改、删除,Git 都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。(可以理解成代码的文件根目录) + ++ 创建仓库 + +创建一个新文件夹作为你的第一个 Repo,在命令行中进入该文件夹,输入 `git init`,以使用 Git 来管理这个文件夹。(初始化 Repo 仓库) + +![image-20211008145824725](https://i.loli.net/2021/10/08/EJRlQmMG3CgHaPh.png) + ++ 添加文件 + +在这个文件夹中添加文件(例如我们写了一个 `test.py`),使用 `git add test.py` 将文件到目前为止的修改放入 Git 的暂存区。 + +![image-20211008145833054](https://i.loli.net/2021/10/08/3onX9gIdY57cEMW.png) + +一次性添加工作环境目录下的所有文件,使用 `git add .`。 + ++ 记录修改 + +当所有的修改都用 `git add` 加入到暂存区后,就使用 `git commit –m "..."` 将所有的暂存区里的修改提交至本地仓库,省略号处填写这次版本迭代都干了什么。 + +![image-20211008145902465](https://i.loli.net/2021/10/08/GeqgAYIbx4QWmSr.png) + ++ 版本迭代 + +为了展示 Git 的作用,我们在 `test.py` 中随便输入了一些内容。 + +然后再次执行 `git add test.py`、`git commit –m "..."` 提交更改。 + +![image-20211008145952669](https://i.loli.net/2021/10/08/R3wUTtaAZHjSxEV.png) + ++ 查看历史 + +通过 `git log`,我们可以查看之前的 Commit 记录,以及对应的 SHA 编码。 + +![image-20211008150040805](https://i.loli.net/2021/10/08/4mn5Jf9SBUlbpVF.png) + ++ 版本回退 + +首先,我们必须指定要回退到的版本。而指定版本有两种方式。 + +1. 相对寻址。在 Git 中,用 `HEAD` 表示当前版本,也就是最新的提交 `1aada331...`(注意不同工程,不同次 Commit 的版本 ID 肯定不同),上一个版本就是 `HEAD^`,上上一个版本就是 `HEAD^^`,当然往上 100 个版本写 100 个 `^` 比较容易数不过来,所以写成 `HEAD~100`。 + +2. ID 寻址。如上述 `"modify test.py"` 这个版本,可以用版本 SHA ID 的前几个字符来表示(只要没有歧义即可),比如 `c9df5e`。 + +而了解了怎样指定版本后,我们便可以使用 `git reset --hard ` 来恢复到之前的版本了。 + ++ 工作区,暂存区与分支的概念 + +工作区(英文:Working Directory)指你电脑上存储的当前项目文件(最新),版本库(英文:Repository)中存了很多东西,其中最重要的就是暂存区,还有 Git 为我们自动创建的第一个分支(英文:Branch)`master`,以及指向 `master` 的一个指针叫 `HEAD`。 + +![image-20211008184709509](https://i.loli.net/2021/10/08/VZXzSgrhc8yFx75.png) + +`git add` 命令实际上就是把要提交的所有修改放到暂存区(英文:Stage),然后,执行 `git commit` 就可以一次性把暂存区的所有修改提交到分支。 + +## 同步开发 + +### 分支的简介 + +分支(英文:Branching)就是科幻电影里面的平行宇宙,当你正在电脑前努力学习 Git 的时候,另一个你正在另一个平行宇宙里努力学习 SVN。如果两个平行宇宙互不干扰,那对现在的你也没啥影响。不过,在某个时间点,两个平行宇宙合并了,结果,你既学会了 Git 又学会了 SVN! + +分支在实际中有什么用呢?假设你准备开发一个新功能,但是需要两周才能完成,第一周你写了 50% 的代码,如果立刻提交,由于代码还没写完,不完整的代码库会导致别人不能干活了。如果等代码全部写完再一次提交,又存在丢失每天进度的巨大风险。 + +现在有了分支,就不用怕了。你创建了一个属于你自己的分支,别人看不到,还继续在原来的分支上正常工作,而你在自己的分支上干活,想提交就提交,直到开发完毕后,再一次性合并到原来的分支上,这样,既安全,又不影响别人工作。 + +引用自 [廖雪峰《分支的介绍》](https://www.liaoxuefeng.com/wiki/896043488029600/896954848507552)。 + +### 创建与合并分支 + +我们可以将项目的进展理解成一条时间线,这条时间线就是一个分支,而项目的主进程线,则是 `master` 分支。我们之前提到的指针 `HEAD`,事实上是指向当前分支头部的指针。 + +正如这一小节的标题所说,我们想要创建新分支与合并分支。 + +比如我们可以举个例子。(引自 [廖雪峰《创建与合并分支》](https://www.liaoxuefeng.com/wiki/896043488029600/900003767775424)) + +一开始的时候,`master` 分支是一条线,Git 用 `master` 指向最新的提交,再用 `HEAD` 指向 `master`,就能确定当前分支,以及当前分支的提交点: + +![git-br-initial](https://s2.loli.net/2022/02/07/B6NoF2WH3rfXzY9.png) + +每次提交,`master` 分支都会向前移动一步,这样,随着你不断提交,`master` 分支的线也越来越长。 + +现在我们使用命令创建新的分支 `dev` 并切换过去,使用 `git checkout -b dev`。Git 新建了一个指针叫 `dev`,指向 `master` 相同的提交,再把 `HEAD` 指向 `dev`,就表示当前分支在 `dev` 上: + +![git-br-create](https://s2.loli.net/2022/02/07/o4S2zElsyMVvKt3.png) + +我们可以使用 `git branch` 命令来查看所有分支,在结果中,当前分支前面会多出一个 `*` 号。 + +从现在开始,对工作区的修改和提交就是针对 `dev` 分支了,比如新提交一次后,`dev` 指针往前移动一步,而 `master` 指针不变: + +![git-br-dev-fd](https://s2.loli.net/2022/02/07/nRwakbBu46zpNEe.png) + +假如我们在 `dev` 上的工作完成了,就可以把 `dev` 合并到 `master` 上。怎么合并呢?首先我们要搞清楚,是谁要合并谁。这里我们应该理解成,`master` 要吃掉新建的 `dev` 分支,成为新的 `master`。于是,首先我们应该切换回 `master` 分支,使用命令 `git checkout master`,以表明这是 `master` 分支的操作。然后,我们可以使用 `git merge dev`,进行分支合并。最后,我们可以通过 `git branch -d dev`,将 `dev` 分支删除。 + +![git-br-ff-merge](https://s2.loli.net/2022/02/07/cr6TpJQXiS8yjNE.png) + +### 解决冲突 + +假设我们设想出现这么一种情况,`master` 分支和新建的 `feature1` 分支均提交了新的更改,那么我们该怎么将其 Merge 呢? + +![git-br-feature1](https://s2.loli.net/2022/02/07/8oMzgqa4yxXStkN.png) + +这种情况下,我们尝试用 `master` 去 Merge `feature1` 的时候,控制台便会提醒我们产生合并冲突。必须手动解决冲突后再提交。而我们根据提示信息去寻找对应的冲突文件,在冲突处 Git 也会将其显著的标出,例如: + +``` +Git is a distributed version control system. +Git is free software distributed under the GPL. +Git has a mutable index called stage. +Git tracks changes of files. +<<<<<<< HEAD +Creating a new branch is quick & simple. +======= +Creating a new branch is quick AND simple. +>>>>>>> feature1 +``` + +在这里我们手动修改后,再重新使用 `git add` 和 `git commit` 就可以成功将两个分支合并了。 + +特别的,在分支合并之后,使用 `git log --graph` 可以看到分支合并图。 + +### Rebase + +感觉版本树因为合并冲突,产生了环形结构,于是很不爽?`git rebase` 可以帮助你将版本树恢复线性。 + +在这里我们给出教程链接,推荐大家自行阅读。 + +附:https://www.liaoxuefeng.com/wiki/896043488029600/1216289527823648。 + +## 远程 Git 仓库 + +显然,大家不会都挤在你的电脑上开发。我们记得,Git 是分布式的版本控制软件。于是,我们需要一种方式进行同步。例如,把 Git 仓库放在网上。 + +在这里我们介绍几种远程的 Git 仓库: + ++ GitHub:全球最大同性交流网站。一个基于Git的代码托管服务平台,开源社区交流代码的重要网站。网址 https://www.github.com/ ++ GitLab:类似Github,但主要面向企业、组织等内部合作。网址 https://www.gitlab.com/ ++ Tsinghua Git:清华大学基于 GitLab 搭建的大学内部的 Git,适用于课程小组内部或者学生组织内部的合作。网址 https://git.tsinghua.edu.cn/ + +下面我们介绍一些在远程仓库控制时的基本操作: + ++ 克隆仓库到本地 + +比如,以 [本技能引导文档](https://github.com/SAST-skill-docers/sast-skill-docs) 所在的 Git 仓库为例。我们使用 `git clone git@github.com:SAST-skill-docers/sast-skill-docs.git`,这样便把远程仓库中的内容取到了本地,并创建了工作区。 + +![image-20211008200605468](https://i.loli.net/2021/10/08/6sKx2NSBD98pcWE.png) + +![image-20211008200810881](https://i.loli.net/2021/10/08/EOyfHRC97DTQnk6.png) + ++ 添加远程仓库地址 + +有时,我们的项目是使用 `git init` 来创建的,并不是从 GitHub 上直接 Clone 的别人的代码。这时我们要首先在 GitHub/GitLab/Tsinghua Git 上新建一个 Repo,然后按照提示,使用 `git remote add origin <你的 Repo 的 HTTP/SSH 地址>`。这样便是告诉本地的 Git 管理器,这个地址起一个简便的名字叫做 `origin`,方便今后使用。 + ++ 推送更改 + +![image-20211008201240601](https://i.loli.net/2021/10/08/rP13BOZjqCystTg.png) + +我们将所有的更改暂存(英文:Add)和提交(英文:Commit)后,便可以使用 `git push origin master` 申请向远端 `origin` 的 `master` 分支同步提交记录。 + ++ 拉取更改 + +我们可以使用命令 `git pull origin master` 来从远端 `origin` 的 `master` 获取其最新的数据(可能是别人更新上去的)。正常的推送更改流程为:先 Add 和 Commit 本地修改,然后拉取远端更改,如果此时出现了合并冲突(英文:Merge Conflict),解决合并冲突。然后,在合并冲突解决后推送更改。 + +## 后续拓展 + +想要学习更多 Git 内容? + ++ 使用命令 `git help` ++ Pro Git Book https://git-scm.com/book/zh/v2 ++ 学习 Git 分支 https://learngitbranching.js.org/?locale=zh_CN + +学了 Git 不知该如何应用? + ++ 程设大作业 ++ 试着去入手一些软件工程项目 + +## 参考资料 + ++ 2021 暑培讲义 by tshoigyr ++ 2020 暑培讲义 by rls ++ 2021 春季学期《面向对象程序设计基础》课程讲义 ++ 廖雪峰的 Git 教程 https://www.liaoxuefeng.com/wiki/896043488029600 \ No newline at end of file diff --git "a/docs/\350\256\241\347\256\227\346\234\272\347\247\221\345\255\246\345\255\246\344\271\240\350\267\257\347\272\277/\350\256\241\347\256\227\346\234\272\345\237\272\347\241\200/\345\267\245\345\205\267/index.md" "b/docs/\350\256\241\347\256\227\346\234\272\347\247\221\345\255\246\345\255\246\344\271\240\350\267\257\347\272\277/\350\256\241\347\256\227\346\234\272\345\237\272\347\241\200/\345\205\210\344\277\256\345\206\205\345\256\271/index.md" similarity index 100% rename from "docs/\350\256\241\347\256\227\346\234\272\347\247\221\345\255\246\345\255\246\344\271\240\350\267\257\347\272\277/\350\256\241\347\256\227\346\234\272\345\237\272\347\241\200/\345\267\245\345\205\267/index.md" rename to "docs/\350\256\241\347\256\227\346\234\272\347\247\221\345\255\246\345\255\246\344\271\240\350\267\257\347\272\277/\350\256\241\347\256\227\346\234\272\345\237\272\347\241\200/\345\205\210\344\277\256\345\206\205\345\256\271/index.md" diff --git "a/docs/\350\256\241\347\256\227\346\234\272\347\247\221\345\255\246\345\255\246\344\271\240\350\267\257\347\272\277/\350\256\241\347\256\227\346\234\272\345\237\272\347\241\200/\345\205\210\344\277\256\345\206\205\345\256\271/latex.md" "b/docs/\350\256\241\347\256\227\346\234\272\347\247\221\345\255\246\345\255\246\344\271\240\350\267\257\347\272\277/\350\256\241\347\256\227\346\234\272\345\237\272\347\241\200/\345\205\210\344\277\256\345\206\205\345\256\271/latex.md" new file mode 100644 index 0000000..ab95efc --- /dev/null +++ "b/docs/\350\256\241\347\256\227\346\234\272\347\247\221\345\255\246\345\255\246\344\271\240\350\267\257\347\272\277/\350\256\241\347\256\227\346\234\272\345\237\272\347\241\200/\345\205\210\344\277\256\345\206\205\345\256\271/latex.md" @@ -0,0 +1,539 @@ +# LaTeX + +虽然 Markdown 很好用,但是生成的 pdf 文档看起来就是没有范不够正式。此外,使用 LaTeX 也是我们之后写论文的必备技能。 + +本教程主要涉及已对 Markdown 较为熟识之后的迁移学习。 + +!!! note + 实际上,你可以在 Markdown 里使用 LaTeX 的子集 [KaTeX](https://katex.org/) + +## 前置知识 + ++ Markdown 入门 ++ Markdown 编写数学公式的方法 + +## LaTeX 简介 + +我们首先解决以下几个问题: + ++ LaTeX 是什么? ++ LaTeX 怎样运作? ++ 我该在哪里写 LaTex? + +在解决上述几个问题之后,我们再详细介绍该怎么写 LaTeX 的问题。 + +### LaTeX 是什么? + +相信你读到这里已经做好觉悟要被灌输一系列关键词和其对应概念了。让我们开始: + +> 历史回溯到 Knuth 教授的巨著 The Art of Computer Programming 将要出版之际,当出版商将他们排版的书稿草样交给 Knuth 教授的时候,他对于其中复杂数学公式的排版处理十分不满。其排版之粗糙,已达到了会影响人们理解原书内容的程度。因此,对于复杂的数学和物理公式,我们急需一种能够将其在互联网上传输的编码格式,使得人能阅读的公式和机器能存储的公式之间达到一种互相转化。 + ++ **TeX**:一种排版引擎,也是该引擎使用的标记语言的名称。引擎是指能够断行、分页的程序,标记语言是控制命令和文本结合的格式。可以类比理解成你写的 C++ 源代码或者更底层的机器指令码,如输入 `$2^6$`。 ++ **LaTeX**:是一个基于 TeX 的排版系统,将用户按照它的格式编写的文档解释成 TeX 引擎能理解的形式并交付给 TeX 引擎处理,再将最终结果返回给用户。可以类比理解成 g++ 编译器,将上述代码渲染为 $2^6$。 ++ **pdfTeX** 与 **pdfLaTeX**:原版 TeX 系统生成的文件是 `dvi` 格式,而 pdfTeX 系统下生成的文件是 `pdf` 格式。 ++ **XeTeX** 与 **XeLaTeX**:上述 TeX 系统生成的字符集只支持 ASCII 字符。在 XeTeX 出现之前,我们曾使用过引用引入 CJK 宏库(解决不支持中日韩字符问题的一个库)手段来处理中文字符的问题。但是这个排版系统对所有 Unicode 字符都实现了支持。 ++ **LuaTeX** 与 **LuaLaTeX**:`pdfTeX` 系统的继承者,支持使用一些用户自定义脚本来实现之前需要写成 TeX 的功能。支持 Unicode,内联 lua,支持 OpenType。 + +这里我们推荐使用 `XeTeX` 系统来进行我们日常的工作,我们后续的教程也围绕这个排版系统展开。为了简洁起见,我们后续不再区分上述概念,统一使用 `TeX`,`LaTeX` 来表述我们在说的这个话题。 + +### LaTeX 怎样运作? + +LaTeX 排版系统的输入是含有我们敲的文本和控制命令的 `tex` 文件,输出是一份 `pdf` 文件。我们只需要负责在 `tex` 文件中写下源码,然后剩下的编译和生成工作全部交给 LaTeX 即可。 + +有时我们还可以把一个 LaTeX 项目组织成一个文件夹,此时还是一份 `tex` 文件决定一个 `pdf` 的生成,但是我们还可以在这个文件夹中引入其他一些文件,如字体文件,图片文件,`.cls` 文件(文档模板类文件)等等。此外,我们还可以在这个文件夹中编写多个 `tex` 文件,以共享文件夹中的其他资源。此时不同的 `tex` 文件之间甚至可以项目包含(类比于 C++ 的 `#include` 包含)。 + +### 在哪里编写 LaTeX? + +我们有离线和在线两种模式来撰写 LaTeX。 + +离线模式就是安装一个 LaTeX 排版系统,类比我们想写 Markdown 的时候装了一个 Typora 软件一样,我们可以安装相应的软件来辅助我们工作,如: + ++ TeXworks ++ TeXstudio + +而使用这种方式安装带来的问题是可能安装包过于臃肿,优点是不用受到网络环境等等因素的干扰,也不用受到网络环境存储容量或运行时环境的限制。其安装方式在网络上搜索“LaTeX 入门”便可找到堆积如山的[教程](https://www.zhihu.com/question/62943097)。 + +而我们这里推崇的方式就是使用在线方式来编写。如 `Overleaf` 在内的托管网站会将你的每个 TeX 项目组织成一个仓库的形式,并允许你在其中进行在线编辑: + +![image-20220213203750216](https://s2.loli.net/2022/02/14/JcqCKNfs31vxm2u.png) + +![image-20220213204115880](https://s2.loli.net/2022/02/13/IKAPDlYTmFEu5S1.png) + +左上角是我们当前仓库的文件清单,较左侧窗口是编辑器,右侧窗口是即时预览窗口。类似于 `Overleaf` 的网站甚至还提供了仓库权限管理系统,你可以邀请其他人一起编辑,或是导入别人编辑好的模板继续你的编辑等等。值得一提的是许多学术会议都会给出他们接受的论文的模板。 + +鉴于 `Overleaf` 需要科学上网才能访问: + ++ 贵校 TUNA 协会维护了一份 [Tsinghua Overleaf](https://overleaf.tsinghua.edu.cn/login),需要使用清华统一认证登录; ++ 贵校贵系贵协网络部维护了一份自己的基于 `Overleaf` 的 LaTeX 在线编辑网站 [TeX9](https://stu.cs.tsinghua.edu.cn/tex9/),需要使用酒井 ID 才能进行登录。 + +我们接下来的演示便是基于 TeX9。 + +## LaTeX 编写基础 + +说是编写基础,接下来我们就要像介绍 Markdown 一样,先简单罗列一些简单的文档控制命令。在基础篇中我们先仅仅介绍怎样实现从 Markdown 到 LaTeX 的迁移。对于其中一些文档控制命令,我们将会在后续教程详细说明。 + +这里提供 CheatSheet 供查阅: + +![image-20220214004156979](https://s2.loli.net/2022/02/14/KP5yeuotcJhTlVO.png) + +![image-20220214004207594](https://s2.loli.net/2022/02/14/j3EHglvqhoetRi4.png) + +### Hello, World! + +![image-20220213205714169](https://s2.loli.net/2022/02/13/HPCaZJUtNOj74uF.png) + +上述便是一份 `tex` 文件的示例,我们推荐你新建一个项目,然后将下面我们要介绍的内容一一尝试。 + +### 支持中文字符 + +首先,我们上述已经介绍过,支持中文字符的方式有二,一种是引入 `CJK` 宏包,另一种是使用 XeLaTeX 编译器并对源码做适当修改。这里我们采用第二种方式。 + +首先,按下你项目左上角的 Menu 按钮,然后在 Compiler 选项中选择 XeLaTeX 选项。 + +然后,输入以下内容: + +```latex +\documentclass[UTF8]{ctexart} +\begin{document} +你好,world! +\end{document} +``` + +这样我们就完成了中文字符的引入。至于 `documentclass` 是什么,我们将在后续介绍。 + +### 导言与文档信息 + +```latex +\documentclass[UTF8]{ctexart} +\title{Sample Document} +\author{c7w} +\date{\today} + +\begin{document} + +% 这条控制命令会读取导言部分的文档相关信息 +% 并将其渲染到文档中 +% 事实上可以参考相关宏包的 Doc: +% http://texdoc.net/texmf-dist/doc/latex/titling/titling.pdf +\maketitle + +你好,world! + +[在这里你就开始写你的作业第一题了] + +\end{document} +``` + +![image-20220213210910831](https://s2.loli.net/2022/02/13/IbNdaCD2wFXVlAq.png) + +### 章节与段落 + +```latex +\documentclass[UTF8]{ctexart} +\title{Sample Document} +\author{c7w} +\date{\today} + +\begin{document} + +\maketitle + +\section{我是 Section 标题} + +我是 Section 介绍。 + +\subsection{我是 Subsection 标题} +我是 Subsection 介绍。 + +\subsubsection{我是 Subsubsection 标题} +我是 Subsubsection 介绍。 + +% \subsubsubsection{不能继续套 sub 了,到底了} + +\paragraph{我是 Paragraph 标题} +我是 Paragraph 后面跟着写的东西。 +本人也是经过了深思熟虑,在每个日日夜夜思考这个问题。 +我们都知道,只要有意义,那么就必须慎重考虑。 +这种事实对本人来说意义重大,相信对这个世界也是有一定意义的。 +要想清楚,一天掉多少根头发,到底是一种怎么样的存在。 +贝多芬曾经说过,卓越的人一大优点是:在不利与艰难的遭遇里百折不饶。 + + +\subparagraph{我是 Subparagraph 标题} +我是 Subparagraph 后面跟着写的东西。 +这不禁令我深思既然如何,一天掉多少根头发的发生,到底需要如何做到,不一天掉多少根头发的发生,又会如何产生。 +总结的来说, 所谓一天掉多少根头发,关键是一天掉多少根头发需要如何写。 生活中,若一天掉多少根头发出现了,我们就不得不考虑它出现了的事实。 郭沫若曾经说过,形成天才的决定因素应该是勤奋。这不禁令我深思这种事实对本人来说意义重大,相信对这个世界也是有一定意义的。 我们一般认为,抓住了问题的关键,其他一切则会迎刃而解。 + +\subsection{这是第二节} +\paragraph{第二节} 的首段。 +\subparagraph{第二节}的第二段。 + +\end{document} +``` + + + +![image-20220213211528785](https://s2.loli.net/2022/02/13/kIeOlBjF7uzJ5ZH.png) + +在文档类 `article`/`ctexart` 中(文档类的概念我们会在进阶篇中提供指导),我们使用这些控制序列来调整行文组织结构。他们分别是: + +- `\section{·}` +- `\subsection{·}` +- `\subsubsection{·}` +- `\paragraph{·}` +- `\subparagraph{·}` + +### 文档目录 + +我们尝试在渲染区 `\maketitle` 后加入如下控制命令: + +```latex +\tableofcontents +``` + +没错,正如你所想的,这就会生成文档的 TOC: + +![image-20220213211830033](https://s2.loli.net/2022/02/13/sSI8byUWJjYLkPw.png) + +### 数学公式 + +#### 行内公式与行间公式 + +首先引入相应包 **amsmath**,然后我们简单介绍公式的引入: + +```latex +\documentclass[UTF8]{ctexart} + +\usepackage{amsmath} % 注意这里引入相应包 + +\title{Sample Document} +\author{c7w} +\date{\today} + +\begin{document} + +\maketitle + +\tableofcontents + +\section{我是 Section 标题} + +我是 Section 介绍。 + +\subsection{这个 Section 我们介绍数学公式的写法} + +\subsubsection{行内公式} + +% 行内公式基本可以照搬 Markdown 的模式。 + +初始处理 1 - 5 位的初始字符串集合需要处理 $18 + 18^2 + 18^3 + 18^4 + 18^5 = 2*10^6$ 的数据,因此需要 $O(T)$ 的时间,这里 $T=2*10^6$。 + +\subsubsection{行间公式} + +% 行间公式用 $$ $$ 或者 \[ \] 来框住都可以,但在 LaTeX 中前者会改变行文的默认行间距,因此不推荐采用。 + +\[ +\text{dp}[i] = \text{dp}[next[i]]+1, next[i] > 0. +\] + + +\end{document} +``` + +![image-20220213213336585](https://s2.loli.net/2022/02/13/CI2hzmUEwluDp6s.png) + +#### 上下标、根式与分式 + ++ 上下标请使用 `^` 与 `_` ++ 根式与分式请使用 `\sqrt{·}` 与 `\frac{·}{·}` + + 在行间公式和行内公式中,分式的输出效果是有差异的。如果要强制行内模式的分式显示为行间模式的大小,可以使用 `\dfrac`, 反之可以使用 `\tfrac` + +#### 运算符 + +一些小的运算符,可以在数学模式下直接输入;另一些需要用控制序列生成,如 + +``` +\[ \pm\; \times \; \div\; \cdot\; \cap\; \cup\; +\geq\; \leq\; \neq\; \approx \; \equiv \] +``` + +连加、连乘、极限、积分等大型运算符分别用 `\sum`, `\prod`, `\lim`, `\int` 生成。他们的上下标在行内公式中被压缩,以适应行高。我们可以用 `\limits` 和 `\nolimits` 来强制显式地指定是否压缩这些上下标。例如: + +``` +$ \sum_{i=1}^n i\quad \prod_{i=1}^n $ +$ \sum\limits _{i=1}^n i\quad \prod\limits _{i=1}^n $ +\[ \lim_{x\to0}x^2 \quad \int_a^b x^2 dx \] +\[ \lim\nolimits _{x\to0}x^2\quad \int\nolimits_a^b x^2 dx \] +``` + +多重积分可以使用 `\iint`, `\iiint`, `\iiiint`, `\idotsint` 等命令输入。 + +``` +\[ \iint\quad \iiint\quad \iiiint\quad \idotsint \] +``` + +![image-20220213214301901](https://s2.loli.net/2022/02/13/VeI1zToC3JfAyK9.png) + +#### 定界符 + +各种括号用 `()`, `[]`, `\{\}`, `\langle\rangle` 等命令表示;注意花括号通常用来输入命令和环境的参数,所以在数学公式中它们前面要加 `\`。 + +因为 LaTeX 中 `|` 和 `\|` 的应用过于随意,amsmath 宏包推荐用 `\lvert\rvert` 和 `\lVert\rVert` 取而代之。 + +为了调整这些定界符的大小,amsmath 宏包推荐使用 `\big`, `\Big`, `\bigg`, `\Bigg` 等一系列命令放在上述括号前面调整大小。 + +#### 省略号 + +省略号用 `\dots`, `\cdots`, `\vdots`, `\ddots` 等命令表示。`\dots` 和 `\cdots` 的纵向位置不同,前者一般用于有下标的序列。 + +#### 矩阵 + +`amsmath` 的 `pmatrix`, `bmatrix`, `Bmatrix`, `vmatrix`, `Vmatrix` 等环境可以在矩阵两边加上各种分隔符。 + +``` +\[ \begin{pmatrix} a&b\\c&d \end{pmatrix} \quad +\begin{bmatrix} a&b\\c&d \end{bmatrix} \quad +\begin{Bmatrix} a&b\\c&d \end{Bmatrix} \quad +\begin{vmatrix} a&b\\c&d \end{vmatrix} \quad +\begin{Vmatrix} a&b\\c&d \end{Vmatrix} \] +``` + +![img](https://s2.loli.net/2022/02/14/uix67cYI4UaXvK9.jpg) + +#### 多行公式 + +可以用 `aligned` 环境来实现,用 `&` 实现位置对齐。 + +```latex +\[ +\begin{aligned} +x = a+b+c+ \\ ++d+e+f+g+d+d+d+d+d+d+d+d+d+d+d+d \\ ++h+i \\ ++1 \\ +\end{aligned} +\] + +\[ +\begin{aligned} +x &= a+b+c+ \\ +& +d+e+f+g+d+d+d+d+d+d+d+d+d+d+d+d \\ +& +h+i \\ +& +1 \\ +\end{aligned} +\] +``` + +效果: + +![image-20220214001008550](https://s2.loli.net/2022/02/14/oZugGY2MF78Lk9t.png) + +若想要公式自带编号,可以用 `gather` 和 `align` 环境,其中 `gather` 环境将公式分行渲染,`align` 同上述 `aligned`,可以控制对齐: + +```latex +\begin{gather} +a = b+c+d \\ +x = y+z \\ +p = a_1 + a_2 + a_3 + \dots + a_{200} +\end{gather} + +\begin{align} +a &= b+c+d \\ +x &= y+z \\ +p &= a_1 + a_2 + a_3 + \dots + a_{200} +\end{align} +``` + +![image-20220214001355079](https://s2.loli.net/2022/02/14/5tZcTngyKSIsWxV.png) + +若想使用分段函数,可以使用 `cases` 环境: + +```latex +\[ +y= +\begin{cases} +-x,\quad x\leq 0 \\ +x,\quad x>0 +\end{cases} +\] +``` + +#### 小结 + +数学公式是在引入了 **amsmath** 包之后,利用其提供的各种各样次环境来实现了较为复杂的公式的编辑。整体来说,与 Mathjax 的风格相差不大,因此迁移学习起来也十分方便。 + +这里我们再提供辅助工具: + ++ https://mathpix.com/ 能够 OCR 手写体或是印刷体公式,而后将图片中的公式转换成 LaTeX 数学公式的代码。 + +### 表格 + +`tabular` 环境提供了最简单的表格功能。它用 `\hline` 命令表示横线,在列格式中用 `|` 表示竖线;用 `&` 来分列,用 `\\` 来换行;每列可以采用居左、居中、居右等横向对齐方式,分别用 `l`、`c`、`r` 来表示。 + +```latex +\begin{tabular}{|l|c|r|} + \hline +操作系统& 发行版& 编辑器\\ + \hline +Windows & MikTeX & TexMakerX \\ + \hline +Unix/Linux & teTeX & Kile \\ + \hline +Mac OS & MacTeX & TeXShop \\ + \hline +通用& TeX Live & TeXworks \\ + \hline +\end{tabular} +``` + +![img](https://s2.loli.net/2022/02/14/ytG5hReFbjWClwg.jpg) + +### 图片 + +在 LaTeX 中插入图片,有很多种方式。最好用的应当属利用 `graphicx` 宏包提供的 `\includegraphics` 命令。比如你在你的 TeX 源文件同目录下,有名为 `a.jpg` 的图片,你可以用这样的方式将它插入到输出文档中: + +```latex +\documentclass{article} +\usepackage{graphicx} +\begin{document} +\includegraphics{a.jpg} +\end{document} +``` + +想要了解更多,参见 `graphicx` 的文档:http://texdoc.net/texmf-dist/doc/latex/graphics/graphicx.pdf。 + +> **浮动体环境** +> +> 什么是浮动体环境:`table` 与 `figure`,两种浮动体环境可以替代上述的表格和图片环境,实现为表格或图片自动安排位置。 +> +> 想了解更多有关浮动体环境的内容,详见[这里](https://liam.page/series/#LaTeX-%E4%B8%AD%E7%9A%84%E6%B5%AE%E5%8A%A8%E4%BD%93)。 + +### 页面设置 + +#### 页边距 + +设置页边距,推荐使用 `geometry` 宏包。可以在[这里](http://texdoc.net/texmf-dist/doc/latex/geometry/geometry.pdf)查看它的说明文档。 + +比如我希望,将纸张的长度设置为 20cm、宽度设置为 15cm、左边距 1cm、右边距 2cm、上边距 3cm、下边距 4cm,可以在导言区加上这样几行: + +``` +\usepackage{geometry} +\geometry{papersize={20cm,15cm}} +\geometry{left=1cm,right=2cm,top=3cm,bottom=4cm} +``` + +#### 页眉页脚 + +设置页眉页脚,推荐使用 `fancyhdr` 宏包。可以在[这里](http://texdoc.net/texmf-dist/doc/latex/fancyhdr/fancyhdr.pdf)查看它的说明文档。 + +比如我希望,设置自定义页眉;页脚的正中写上页码;页眉和正文之间有一道宽为 0.4pt 的横线分割,可以在导言区加上如下几行: + +```latex +\usepackage{fancyhdr} +\pagestyle{fancy} +\lhead{页眉左侧} +\chead{页眉中间} +\rhead{页眉右侧} +\lfoot{} +\cfoot{\thepage} +\rfoot{} +\renewcommand{\headrulewidth}{0.4pt} +\renewcommand{\headwidth}{\textwidth} +\renewcommand{\footrulewidth}{0pt} +``` + +#### 段间距 + +我们可以通过修改长度 `\parskip` 的值来调整段间距。例如在导言区添加以下内容 + +``` +\addtolength{\parskip}{.4em} +``` + +则可以在原有的基础上,增加段间距 0.4em。如果需要减小段间距,只需将该数值改为负值即可。 + +### 引用与尾注脚注 + +#### 交叉引用 + +交叉引用设置方法: + ++ 给对象命名:`\label{name}` ++ 引用对象:`\ref{name}` + +注意,在引用对象时,`\ref{name}` 会被替换会被引用对象的编号。举个例子,如果被引用对象在文档中是第 5 个被命名的,那么这里就会被替换为 5. + +要想避免图/表/论文等等引用在计数上互相影响,你可以在命名时命名为 `tag:name` 的格式,引用时使用 `tag:name` 的格式来引用。具体来说,这些 tag 有: + +| Tag | Description | +| ------------- | -------------------- | +| **`ch:`** | chapter | +| **`sec:`** | section | +| **`subsec:`** | subsection | +| **`fig:`** | figure | +| **`tab:`** | table | +| **`eq:`** | equation | +| **`lst:`** | code listing | +| **`itm:`** | enumerated list item | +| **`alg:`** | algorithm | +| **`app:`** | appendix subsection | + +#### 尾注脚注 + +尾注直接在最后写就行,记得设置引用。 + +脚注可以使用 `\footnote{角注内容}` 来声明。 + +> 想了解该如何更好地引入参考文献,请学习 BibTeX 宏包。 +> +> + https://zh.wikipedia.org/wiki/BibTeX + +### 列表与枚举 + +```latex +\begin{enumerate} + \item \LaTeX{} 好 处 都 有 啥 + \begin{description} + \item[好 用] 体 验 好 才 是 真 的 好 + \item[好 看] 强 迫 症 的 福 音 + \item[开 源] 众 人 拾 柴 火 焰 高 + \end{description} + \item 还 有 呢? + \begin{itemize} + \item 好 处 1 + \item 好 处 2 + \end{itemize} +\end{enumerate} +``` + +![image-20220214004408507](https://s2.loli.net/2022/02/14/U3E8uCBy4RKxfSL.png) + +## LaTeX 后续学习 + +### 更多宏包 + +宏包一般都会提供相应的文档供我们阅读使用。 + +这里提供查询宏包对应文档的网站: + ++ https://texdoc.org/index.html + +![image-20220214003834121](https://s2.loli.net/2022/02/14/jkVbA8vBeY9FsUR.png) + +### 制作自己的模板 + +详见参考资料中 `.cls` 文件详解部分。我们同时推荐读者可以去多读一读其他已存在的 Template 的 `.cls` 内容。 + +### 制作幻灯片 + +使用 Beamer 宏包可以制作幻灯片。详见: + ++ https://www.overleaf.com/learn/latex/Beamer + +同时,校内也提供了一些适用于各种 pre 的 Beamer 模板。 + +## 参考链接 + ++ (推荐)一份其实很短的 LaTeX 入门文档:https://liam.page/2014/09/08/latex-introduction/ ++ (推荐)如何使用 LaTeX 排版论文:https://github.com/tuna/thulib-latex-talk ++ (`.cls` 文件详解)How to write a LaTeX class file and design your own CV: https://www.overleaf.com/learn/latex/How_to_write_a_LaTeX_class_file_and_design_your_own_CV_(Part_1) diff --git "a/docs/\350\256\241\347\256\227\346\234\272\347\247\221\345\255\246\345\255\246\344\271\240\350\267\257\347\272\277/\350\256\241\347\256\227\346\234\272\345\237\272\347\241\200/\345\205\210\344\277\256\345\206\205\345\256\271/linux.md" "b/docs/\350\256\241\347\256\227\346\234\272\347\247\221\345\255\246\345\255\246\344\271\240\350\267\257\347\272\277/\350\256\241\347\256\227\346\234\272\345\237\272\347\241\200/\345\205\210\344\277\256\345\206\205\345\256\271/linux.md" new file mode 100644 index 0000000..fc2952d --- /dev/null +++ "b/docs/\350\256\241\347\256\227\346\234\272\347\247\221\345\255\246\345\255\246\344\271\240\350\267\257\347\272\277/\350\256\241\347\256\227\346\234\272\345\237\272\347\241\200/\345\205\210\344\277\256\345\206\205\345\256\271/linux.md" @@ -0,0 +1,338 @@ +# Linux + +
+ +
+ +## 前置知识 + ++ 有一台自己的电脑 ++ 愿意**动手实践**的决心(多尝试) ++ 做好笔记整理与总结的能力(遗忘后便于快速回忆) + +## 序言 Prologue + +### What Is Linux? + +Linux 是一种自由和开放源码的类 UNIX 操作系统,其内核由 Linus Torvalds 在 1991 年发布。 + +Linux 也是自由软件和开放源代码软件发展中最著名的例子,只要遵循 GNU,任何个人和机构都可以自由地使用 Linux 的所有底层源代码,这使得它得到来自全世界软件爱好者和组织的开发支持。 + +Linux 以各种形式被广泛应用在各个领域,包括但不限于: + ++ 服务器、主机、超级计算机 ++ 嵌入式系统(机顶盒、移动设备等) ++ 基础设施(红绿灯、工业传感器) + +### Linux Distros + +我们平时使用的“Linux”严格来说是 Linux 发行版本,而 Linux 狭义上单指操作系统的内核。 + +发行版本在内核的基础上还包括安装工具、系统配置、图形桌面界面、各种 GNU 软件等,使得这个系统能够适用于各种使用目的。 + +常见的 Linux 发行版有 Debian、Ubuntu、Fedora、CentOS、Arch Linux 等。不同的发行版使用的软件不同,有些发行版本是设计成专门的目的(比如 Kali 用于网安)。 + +我们一般使用的虚拟机的发行版为 Ubuntu 20.04。 + +### Ways to Use Linux + +我们接触 Linux 的方式通常有以下几种: + ++ 安装 Linux 系统(单系统、Windows & Linux 双系统) ++ WSL(英语:Windows Subsystem for Linux)**(Recommended)** ++ 虚拟机(Virtualbox、Docker) ++ 服务器远程连接(SSH、RDP) + +我推荐有条件的同学给电脑装一个Linux系统。这样你就能在各种配置中度过一段漫长而有趣的时光了。 + +## Basic Concepts + ++ **GUI**:Graphical User Interface. 图形用户界面,如其名。 ++ **CLI**:Command-Line Interface. 命令行界面,如其名。 ++ **Shell**:一种软件,我们可以将它视为“用户到内核之间的中介”,它接受并解析(英语:Parse)用户输入命令行的指令,并调用内核所提供的对应服务。Shell 的发明是因为内核并不提供与用户交互的方式。 + +![OxQZi](https://i.loli.net/2021/10/10/9ESFQNB6ZKCYHm2.png) + +其实 Shell 还分为图形界面和命令行界面两种,比如 Windows 的文件浏览器、程序管理器都可以算是 GUI Shell,但用 Linux 时我们一般说的都是 CLI Shell。 + +常见的 Shell 包括 sh、bash、zsh、fish 等。 + ++ **Terminal**:终端的名字来源于它在用户和机器交互过程中所处的位置:用户在终端输入、机器通过终端输出,现在我们已经不再需要专门的硬件充当终端,而是利用一个程序来模拟其行为。当我们打开一个终端模拟器(如 Windows 的 cmd,Linux 的 Konsole、gnome-terminal)时,一个 Shell 随即被运行,我们就可以通过这个 Shell 所提供的 CLI 输入指令了。 + +一个简单区分上述术语的回答:https://askubuntu.com/a/506880。 + +## Shell 101 + +打开终端,界面上会出现类似于下面样子的提示符:`training@SAST-Training:~$`。 + +从左到右依次是当前身份 `training`,主机名 `SAST-Training`,和当前工作目录 `~` 以及一个美元符号(fish 下是 `>` 号),这个美元符号表明当前用户不是 `root`。 + +如果你用 root 身份打开 Shell,呈现的提示符大概是这样 `root@SAST-Training:~#`。即 `#` 符号表明了 `root` 身份。 + +### How Does Shell Run Commands? + +在 Shell 中你每次输入一个命令,这个命令被 Shell 解析、运行,并将结果输出到终端。 + +```bash +training@SAST:~$ echo "Hello SAST!" +Hello SAST! +``` + +Shell 的命令由空格分割,第一个是要运行的程序(如上例 `echo`),后面跟它的参数(如上例 `"Hello World!"`)。 + +注意到我们把想输出的 `Hello SAST!` 用引号扩了起来,这样本来空格分隔的两个词就合并成了一个参数。(其实这个例子中并不需要将它们合并,因为 `echo` 指令可以接受多个字符串输入。) + +可是 Shell 怎么知道 `echo` 指的是什么呢?这些程序都是 Shell 内置的吗?其实当 Shell 遇到它不认识的程序关键字时,会查询环境变量 `$PATH`,在里面记录的路径中寻找 `echo` 这个程序,如果找到便执行。如果我们想知道这个程序实际所在的位置,可以使用 `which echo`。 + +```bash +training@SAST:~$ echo $PATH +/usr/local/sbin:/usr/local/bin: +/usr/sbin:/usr/bin:/sbin:/bin +training@SAST:~$ which echo +/usr/bin/echo +``` + +所以当我们执行 `echo "Hello"` 时,实质上等价于执行 `/usr/bin/echo "Hello"`,后者明确指定了要执行程序的所在目录和它的名字。 + +### Basic Commands + +接下来我们看一些基本指令。 + +| Command | Description| +|:------------: |:------------------------:| +| **目录相关** | | +| pwd | 当前目录| +| cd | 切换目录| +| ls | 查看目录列表| +| mkdir | 创建目录| +| find | 在层级目录下搜索文件| +| **文件相关** | | +| touch | 创建| +| mv | 移动(可用于重命名)| +| cp | 拷贝| +| rm | 删除| +| chmod | 更改文件权限| +| chown | 更改文件所属| +| echo | 输出提供的文本| +| file | 查看文件类型| +| cat | 将文件内容输出到标准输出| +| **用户和组相关** | | +| useradd | 创建用户| +| groupadd | 创建组| +| passwd | 更改密码| +| chpasswd | 批量更改密码| +| su | 一般用于切换用户| +| sudo | 一般用于执行 root 权限指令| + +其他一些可能用到的指令包括 `grep`、`ps`、`systemctl`、`ip` 等。 + +### File System + +现在我们可以用 `ls` 和 `cd` 来翻阅系统里的文件了! + +首先是一些基本的表示:`/` 表示根路径,`~` 表示家路径(`/home/username/`,如果是 root 则为 `/root/`),`.` 表示当前目录,`..` 表示上一级目录。这些表示省去了很多写绝对路径的麻烦。你可以试试 `cd` 到这些地方,然后用 `ls` 查看目录里的内容。 + +我们来看看根路径下都有哪些文件夹: + +![Screenshot from 2021-07-11 17-20-03](https://i.loli.net/2021/10/10/SFkXU36brB2DAKg.png) + +- `/etc` 目录是系统根路径下最重要的目录之一,它是用来存储操作系统文件的公共区域,比如 `/etc/sudoers`、`/etc/passwd` 分别记录了拥有 root 权限的用户、系统内的所有用户信息。 +- `/var` 目录是系统的服务或应用频繁写入的地方,比如 `/var/log` 存储了程序的 log 文件。 +- `/tmp` 里是一些程序只需要访问一两次的文件,每当系统重启时,这里的文件都会被清空。注意这个文件夹默认可被任何用户写入。 +- `/home` 这个文件夹下是各个用户的家目录。 +- `/mnt` 是数据卷的挂载点;通过 USB 等接口连接的外部媒体也可能出现在 `/media` 文件夹中。 +- `/srv` 存放这个服务器提供的服务所需的文件(如网站资源)。 + +### Permissions + +Linux 系统支持多用户同时登录并执行各自的任务。为了对不同用户进行管理控制,可以定义用户组(英语:group)来划分不同的访问权限。我们通过具体例子来理解。 + +```bash +training@SAST: /Documents/sast-training $ ls -l +total 8 +drwxrwxr-x 2 training training 4096 7月 11 22:31 folder +-rw-rw-r-- 1 training training 0 7月 11 20:16 hello.txt +-rwxrwxr-x 1 training training 27 7月 11 22:33 program.sh +``` + +对于目录中每一项开头的 "-rw-rw-r--"(以文本 `hello.txt` 为例)字样,下图给了一些解释: + +![IMG_2021-07-11T22-47-19](https://i.loli.net/2021/10/10/iJtCH3Un6uOpkKb.jpg) + ++ 开头第一个字符是用于特殊权限的 `flag`,它来表明该文件的一些特殊属性如文件夹、连接等。 ++ 接下来九个 flag 每三个为一组,分别代表所属用户、所属组、所有其他用户对于这个文件的 r(read)、w(write)、x(execute) 三种访问的权限。 ++ 除了用 rwx 字符来表示外,还可以用二进制编码表示,其中 r 为最高位 4,w 中间位 2,x 最低位 1。例如可读写可执行的权限编码为 7,可读写不可执行为 6,可读可执行为 5 等。 + +对于一些重要文件,你大概不希望组内其他用户或者任意用户对它有过多的访问权限;或者对于一些刚写好的脚本文件默认为可读写不可执行,你希望能够获得执行它的权限。这时我们可以通过 `chmod` 指令来改变文件的权限设置。 + +```bash +chmod +x script.sh # 给脚本添加可执行权限(默认对于任何人 (a)) +chmod 777 public.py # 让文件可被任何人读写执行,777 等价于 a+rwx +chmod o-rw journal.txt # 禁止组外用户 (o) 的读写 +``` + +### Shell Operations + +以下是一些 Shell 中能用到的操作符。最好还是结合实际应用来掌握。 + +| Operator | Description | Example | +| -------- | ----------------------------- | -------------------------------------------- | +| & | 允许命令在后台执行 | `cp -r ./here ./there &` | +| && | 执行多条指令,逻辑和 C++ 类似 | `wget someurl/install.sh . && ./install.sh ` | +| > | 重定向输出 | `echo "Hello" > hello.txt` | +| < | 重定向输入 | `./main < in.txt` | +| >> | 重定向输出并采取“追加”模式 | `echo cirno >> visitors.txt` | +| \| | 连接前后两个程序的输出和输入 | `ls ~/Documents | grep note.txt` | + +### Read the Manual + +```bash +man +``` + +`man` 指令是了解各种指令具体用法的最快途径,绝大多数的指令和软件都会有对应的 Manual 提供查看,在里面你可以看到指令的名称来源、作者、描述和用法等等。 + +`man` 所打开的界面支持多种浏览方式,Vim 的 J/K、方向键、回车键、翻页键等都可以使用,并且支持搜索功能。 + +比如我们想了解 `ls` 的 `-h` 选项的作用,可以在 `man ls` 中输入 `/-h` 并回车,搜索到的 `-h` 选项就会高亮显示,继续回车找到下一个结果。`/` 是向后搜索,而 `?` 是向前搜索。 + +如果你想查看帮助的软件凑巧没有对应的 Manual,你总可以试试在指令名后加上 `-h / --help` 选项,通常来说命令输出错误时它就会有 Usage 的提示。 + +类似的软件还有 tldr(too long; didn't read)、cheat(cheatsheet)、fuck 等,它们是精简版的 man,提供了指令的常见用法。 + +## SSH + +现在我们回到 SSH 上来。 + +### Executing Commands + +SSH 可以直接远程执行命令而不需要连接到远程的 Shell 中,在连接命令后加上需要执行的命令: + +```bash +ssh foobar@server [command] +``` + +### Copying Files + +`scp` 指令可以从远程拷贝文件到本地/从本地拷贝文件到远程,基本格式是 `scp `。如果要拷贝一个文件夹,应该使用 flag `-r` 表示递归深入目录。 + +```bash +# 将本地当前目录的 test.zip 拷贝到远程的 ~/test.zip +scp test.zip training@153.223.56.12:~/test.zip +# 将远程的 data.csv 拷贝到本地当前目录 +scp training@152.32.34.12:~/data.csv . +``` + +### Config File + +每次连接服务器都要输入用户名、IP 和端口未免过于繁琐,我们可以通过编辑 SSH 配置文件来简化命令。这个配置文件位于家路径的 `.ssh` 文件夹下,名字为 `config`(如果不存在需自己创建),即 `~/.ssh/config`。对于 Windows 系统而言,这个 `.ssh` 文件夹位于用户目录下 `C:\Users\\.ssh\config`。配置文件写法如下: + +``` +HOST sast + HostName 152.136.177.53 + Port 8000 (默认22,此时不需要指定) + User root +``` + +这样每次我们想连接到 `root@152.136.177.53 -p 8000` 时只需要输入 `ssh sast` 即可。 + +这个配置文件同样适用于 `scp` 命令: + +``` +# 前一小节例子的简略版 +scp test.zip sast:~/test.zip +scp sast:~/data.csv . +``` + +### Key Authentication + +SSH 配置文件并不能指定登录时的密码(显然这样会很不安全),所以我们登录时还是要输入密码。能不能连密码都不用输入? + +利用密码学中的公钥-私钥非对称加密机制,我们只需要在服务器中预存好自己的公钥,就可以在登录时自动化验证流程而免去密码。这个过程的关键是向服务器 Alice 证明自己是持有私钥的那个客户端 Bob:Alice 用 Bob 预存的公钥加密一个用于验证的串发给 Bob,Bob 用私钥解密得到这个串后发给 Alice,就能证明自己确实持有与公钥对应的私钥。 + +![Screenshot from 2021-07-15 10-59-22](https://i.loli.net/2021/10/10/nhiC3kRQ9ZVgoBD.png) + +**密钥生成** + +```bash +ssh-keygen +``` + +按照命令行提示流程,默认在 `~/.ssh` 下生成公钥 `id_rsa.pub` 和私钥 `id_rsa`,后者需要妥善保存。通过 `ssh-keygen -y -f ~/.ssh/id_rsa` 检验密钥的存在。 + +**在服务器中存放公钥** + +在接受 SSH 连接请求时,服务器的 SSH 会在目标用户的 `~/.ssh/authorized_keys` 中查找公钥。因此我们需要将自己的 `id_rsa.pub` 中的内容追加到服务器的 `authorized_keys` 中。 + +```bash +cat ~/.ssh/id_rsa.pub | ssh training 'mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys' +# Windows 下路径为 ~/.ssh/id_rsa.pub +``` + +上面的命令完成了将本地公钥保存到远程服务器的过程,经过之前的学习,你能理解这个命令是如何执行的吗? + +`ssh-copy-id` 提供了更简便的解决方案:`ssh-copy-id -i ~/.ssh/id_rsa.pub training`。 + +## Basic Tools + +### Package Manager + +**软件包管理系统**是在电脑中自动安装、配置、卸载和升级软件包的工作组合。使用软件包管理系统可以大大简化在 Linux 发行版中安装软件的流程。常见的软件包有两种类型:deb 软件包(由 dpkg 和它的前端 apt 管理,使用于 Debian、Ubuntu)和 RPM 软件包(由 dnf、yum、ZYpp 等前端管理)。 + +绝大多数的 Linux 发行版或类 Unix 系统都有它的包管理器,Ubuntu 有 `apt`,Arch Linux 有 `pacman`,macOS 有 `Homebrew`。 + +包管理器的指令一般都很符合直观,如果失败了可以通过 `man` 或者 `help` 查看用法。 + +系统中包管理器所使用的仓库往往默认位于国外,这使得每次从仓库拉取东西时耗费很长时间或者甚至连不上。好在我们国内有许多的镜像源,比如清华的 TUNA,访问 https://mirrors.tuna.tsinghua.edu.cn/help 可以找到 Ubuntu 在内的各种仓库镜像源配置方法。 + +Homebrew 的安装方法: + +```bash +/bin/bash -c \ +"$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" +``` + +### Vim + +`vimtutor` explains it all. `vimtutor -g zh` for Chinese learner. + +![hottest_editors](https://i.loli.net/2021/10/10/DFpv8LzXEIRiCPr.png) + +### tmux + +我们每次打开终端或是 SSH 登录远程服务器时,都是创建了一个会话(英文:session)来进行临时的交互,此时窗口(或连接)是和它开启的进程(比如 Shell)绑定在一起。当我们关闭窗口或者断开连接时,对应的进程也随之终止了。 + +为了在会话结束后其开启的进程还能继续进行,我们需要先进行"解绑",在后续需要时再重新进行绑定。tmux 完成的就是这样一个任务。 + +```bash +tmux # 创建新的 tmux 会话 +tmux detach # 分离当前 tmux 会话,快捷键 Ctrl+B D +tmux ls # tmux list-session +tmux attach -t # Sessions are labeled by numbers by default +tmux kill-session -t +``` + +除了能够让任务持续进行,tmux 还有一个很重要的功能是分窗口和分屏。 + +```bash +Ctrl+B % # Split horizontally +Ctrl+B " # Split vertically +Ctrl+B 方向键 # Switch between panes +# ... +``` + +这一系列操作的快捷键基本上都是 Ctrl+B xxx,请自行学习掌握。 + +附:https://tmuxcheatsheet.com/ + +## 后续拓展 + +想要学习更多 Linux 内容? + ++ TryHackMe "Linux Fundamentals" Series https://www.tryhackme.com ++ Missing Semester https://missing.csail.mit.edu/ + +## 参考资料 + ++ 2021 暑培讲义 by JuneTheRiver ++ 菜鸟教程 https://www.runoob.com/linux/linux-tutorial.html diff --git "a/docs/\350\256\241\347\256\227\346\234\272\347\247\221\345\255\246\345\255\246\344\271\240\350\267\257\347\272\277/\350\256\241\347\256\227\346\234\272\345\237\272\347\241\200/\345\205\210\344\277\256\345\206\205\345\256\271/markdown.md" "b/docs/\350\256\241\347\256\227\346\234\272\347\247\221\345\255\246\345\255\246\344\271\240\350\267\257\347\272\277/\350\256\241\347\256\227\346\234\272\345\237\272\347\241\200/\345\205\210\344\277\256\345\206\205\345\256\271/markdown.md" new file mode 100644 index 0000000..36e87b0 --- /dev/null +++ "b/docs/\350\256\241\347\256\227\346\234\272\347\247\221\345\255\246\345\255\246\344\271\240\350\267\257\347\272\277/\350\256\241\347\256\227\346\234\272\345\237\272\347\241\200/\345\205\210\344\277\256\345\206\205\345\256\271/markdown.md" @@ -0,0 +1,127 @@ +# Markdown 入门 + +!!! note "前言" + + Markdown 是一种学习成本较低的轻量级标记语言。它用简单的标记语法代替按钮,因此能省去频繁使用鼠标调整排版的麻烦,为文档编写者提供便利。用 Markdown 编写的内容可导出为 HTML、Word、PDF 等多种格式的文档。由于易读易写,它在 GitHub、简书等网站上也有广泛的应用。 + + 通过阅读本文档,读者可以在五分钟内快速学习到常用的 Markdown 标记。更多的内容请移步菜鸟教程。 + + 我们强烈建议计算机类的同学们在大一的春季学期学会 Markdown 或 LaTeX 二者中其中之一,因为这将是我们后续实验报告或大作业报告将利用的常用工具。 + + 在开始学习 Markdown 语法之前,建议先通过 [Typora 官网](https://typora.io/) 安装好 Typora 编辑器。 + +## 语法 + +### 标题 + +共有 1-6 级标题,使用 `#` 标记。`#` 数量与标题级别对应。注意 `#` 与文字间的空格不可省略。 + +```markdown +#### 四级标题 +##### 五级标题 +###### 六级标题 +``` + +#### 四级标题 +##### 五级标题 +###### 六级标题 + +### 字体 + +```markdown +*斜体* _斜体_ +**粗体** __粗体__ +***粗斜体*** ___粗斜体___ +~~删除线~~ +下划线 +``` + +*斜体* _斜体_ + +**粗体** __粗体__ + +***粗斜体*** ___粗斜体___ + +~~删除线~~ + +下划线 + +### 列表 + +无序列表用 `*` 或 `+` 或 `-` 标识,有序列表用数字和 `.` 来标识,支持列表嵌套。 + +```markdown +* 第一项 ++ 第二项 +- 第三项 + 1. 子项一 + 1. 孙子项一 + * 重孙子项一 +``` + +* 第一项 ++ 第二项 +- 第三项 + 1. 子项一 + 1. 孙子项一 + * 重孙子项一 + +### 引用 + +```markdown +> 这是一条无意义的引用。 +``` + +> 这是一条无意义的引用。 + +### 代码 + +```markdown +加法操作由 `add()` 函数完成 +``` + +加法操作由 `add()` 函数完成 + +````markdown +```Python +def add(a, b): + return a + b +``` +```` + +```Python +def add(a, b): + return a + b +``` + +### 链接 + +```markdown +[菜鸟教程](https://www.runoob.com/markdown/md-tutorial.html) + +``` + +[菜鸟教程](https://www.runoob.com/markdown/md-tutorial.html) + + + +### 图片 + +插入图片需依照 `![alt 属性文本](图片地址)` 格式。注意不要使用本地路径,可以将图片上传到清华云盘再获取图片链接。 + +```markdown +![示例图片](https://i.loli.net/2021/10/08/R3wUTtaAZHjSxEV.png) +``` + +![示例图片](https://i.loli.net/2021/10/08/R3wUTtaAZHjSxEV.png) + +## 其他 + +Markdown 还有一些高级玩法,例如表格、公式、HTML 元素、画时序图、画流程图等等。由于不是很常用,这些都留给有兴趣的读者自行探索。 + +友情链接: + ++ 菜鸟教程 ++ **(推荐学习)**公式编辑教程 ++ 绘制流程图、时序图、甘特图 ++ CommonMark,一个常用的 Markdown 标准 diff --git "a/docs/\350\256\241\347\256\227\346\234\272\347\247\221\345\255\246\345\255\246\344\271\240\350\267\257\347\272\277/\350\256\241\347\256\227\346\234\272\345\237\272\347\241\200/\345\205\210\344\277\256\345\206\205\345\256\271/meet-problems.md" "b/docs/\350\256\241\347\256\227\346\234\272\347\247\221\345\255\246\345\255\246\344\271\240\350\267\257\347\272\277/\350\256\241\347\256\227\346\234\272\345\237\272\347\241\200/\345\205\210\344\277\256\345\206\205\345\256\271/meet-problems.md" new file mode 100644 index 0000000..fed3189 --- /dev/null +++ "b/docs/\350\256\241\347\256\227\346\234\272\347\247\221\345\255\246\345\255\246\344\271\240\350\267\257\347\272\277/\350\256\241\347\256\227\346\234\272\345\237\272\347\241\200/\345\205\210\344\277\256\345\206\205\345\256\271/meet-problems.md" @@ -0,0 +1,87 @@ +# 当我遇到问题时,我该怎么做... + +> 科协水群里闲聊时,有人“暴言”:“在贵系有技术问题时,摇人比查文档更方便。”遇到问题时多和其他人交流、避免闷头苦干当然是支持的,但这并不意味着问问题前不需要付出努力(例如在搜索引擎上查找)、问问题时对方有义务替你解答...... +> +> —— 摘自 “酒井科协” 公众号 2022 年 3 月 25 日文章 + +学习过程中遇到问题是在所难免的,而如何面对遇到的问题,却是值得我们学习的话题。本篇文章我们从“如何使用搜索引擎”、“如何查阅官方文档”、“如何选择常用网站”、“如何有效地进行提问”这几种方式来阐述,“当我在学习过程中遇到问题时,我应该怎样做...” + + + +## 如何使用搜索引擎 + +### 我应该怎样选用搜索引擎 + +“百度一下,你就知道”诚然是大众的选择,而我们必须指出其在搜索结果呈现时的局限性。具体来说,由于一些商业性因素的限制,它大概率会返回一些与搜索结果不是最强相关的内容。我们在这里推荐两款搜索引擎:如果你因为中国大陆的限制无法访问互联网上的一部分内容,我们推荐你使用 **“Bing 国际版”**,而如果你可以访问到世界互联网上的内容,我们则推荐你使用 **“Google”**。我们接下来的讨论均以后者作为基础展开。 + +### 我应该如何使用搜索引擎 + +相信大家都掌握了搜索引擎的基本使用方法,也掌握了例如“搜索关键词”而不是“搜索整句话”的这种基本搜索技巧。接下来我们演示一些较为进阶的搜索方法。 + ++ 指定网站搜索 `site:web.site` ++ 精确匹配 `"Exact Match"` ++ 必须包含 `+` 与必须不包含 `-` ++ 任意匹配 `*` ++ 指定时间范围,例如只获取过去 1 年内的搜索结果,这样可以保证搜索结果的时效性 + +参考资料:[How to properly use a search engine](https://www.instructables.com/How-to-Properly-Use-a-Search-Engine/). + + + +## 如何查阅官方文档 + +大部分你使用的工具或者库都会有自己的官网网站;有些即使没有官方网站也会有自己的 GitHub Repo 和配套的 Wiki。了解一个工具或者函数库最全面、也是最便利的方法,实际上是读它对应部分的说明文档。 + +比如,我们想了解怎么在 PyTorch 中实现叉乘,或许我们可以在百度中搜索 `pytorch 叉乘`,然后点开一个 CSDN 教程,但这远没有 Google 搜索 `pytorch cross product`,然后打开 pytorch.org 的官方文档进行阅读来的全面而透彻。 + +再比如,如果我想快速上手一个名叫 “Carla” 的模拟仿真工具,最合适的方式,应该是搜索 “carla doc”,然后打开[官方文档](https://carla.readthedocs.io/en/latest/)阅读其中 “Getting Started” 部分,这样能对这个软件有最基本的了解。之后再根据自己的需要阅读其他部分的内容。 + + + +## 如何选择常用网站 + +要想搜索不同的内容,我们一般会选择不同的网站。这里我们针对一些常见的问题,列出一些常用的网站: + +`Runtime Error / Compilation Error` + +程序运行时遇到了我不了解的报错,即使查看了函数调用栈也不理解最终的报错信息;程序编译不过,其中用了我不理解的编译特性... **StackOverflow** 是这些问题的好帮手,可以替代 CSDN 作为你的搜索首选。事实上,CSDN 的部分内容是直接从 StackOverflow 上搬运而来,而这些搬运而来的内容在国内网站上又相互爬取、相互展示... + +但这也不意味着中文内容都是差的,如果使用 Google 并且语言为中文,通常能查到一些中文个人博客的内容,这些内容一般不会是机器搬运的,可以作为参考。例如如果想要配置 `DN42` 实验网络,由于官方文档不详细,个人博客的内容也是非常重要的参考。 + +`What is the original paper of XXX...` + +我们想知道某篇学术论文的出处,或者是其引用格式。这时 **scholar.google.com** 就可以起到很好的作用。如果你知道这篇论文的全名,你可以直接进行搜索,然后便捷地获取引用格式与论文原文的 PDF 版本。 + +`I want to know whether or not someone has implemented this...` + +想找过往的轮子?好办,在 **GitHub** 中进行搜索,你可以看到规模庞大的开源代码...但是,在使用时请务必遵守其对应的 LICENSE。可以尝试使用 [GitHub Code Search](https://cs.github.com),能够更加精确、全面的搜索公开仓库的代码。 + +此外,在学习对应的内容时,我们推荐到对应的官方网站、教程、文档或 Wiki 上进行学习。在学习一些公开课程可能涉及到的知识时(如 CS231n),我们推荐先搜索课程主页,进而在 YouTube 上搜索对应的讲解视频,然后在 B 站与知乎等国内平台上进行检索。 + + + +## 如何有效地进行提问 + +在你尝试了如上内容无果之后,自己闷头苦干或许已经不能解决你的问题了。是时候进行提问了 —— 打开微信列表,翻出一个人的账号,然后敲下一句“在吗”,等待回复 —— 不,这并不是正确的提问方式,至少对方从一句“在吗”中并没有获得任何的信息增益。他/她可能认为你想邀他/她喝一杯下午茶,而不是帮你还有 24 个小时就到 DDL 的 DSA 编程作业 Debug。 + +要想有效地进行提问,我们强烈推荐你阅读一遍参考资料。当然,我们在这里列出几点重点: + +**在你提问之前** + ++ 请确保你通过搜索引擎检索不到你想问的问题 ++ 请确保你查阅了官方文档,其中并没有提及可以直接解决你的问题的答案 ++ 请确保你自己做了充分的预实验 + + 比如 `这段程序的运行结果是什么?`,为什么不自己跑一下呢 + +**你的提问内容** + ++ 请提供充分的信息给回答者 + + 比如请不要发一个 `这段代码有 Bug [捂脸]` 的语句给对方,然后附上一个 ~300 行,以文本方式发送在微信聊天框的代码 + + 请至少提供充分的说明:哪段代码?出了什么问题?报错信息是什么?这段代码的目标功能是什么? + + 如果有可能的话,请给出足够多的注释(不过是代码还是你的思考内容) ++ 请说出你做过了哪些努力 + + 比如按照某个论坛某条回复的方法进行了尝试 + +即使提问,也不代表问题的主动权放在了对方手里。问题毕竟是你自己的问题,对方没有义务帮助你必须解决掉这个问题,所以继续自行寻找答案也许是需要的... + +参考资料:[How to ask the question the smart way](https://github.com/ryanhanwu/How-To-Ask-Questions-The-Smart-Way). \ No newline at end of file diff --git "a/docs/\350\256\241\347\256\227\346\234\272\347\247\221\345\255\246\345\255\246\344\271\240\350\267\257\347\272\277/\350\256\241\347\256\227\346\234\272\345\237\272\347\241\200/\345\205\210\344\277\256\345\206\205\345\256\271/vscode.md" "b/docs/\350\256\241\347\256\227\346\234\272\347\247\221\345\255\246\345\255\246\344\271\240\350\267\257\347\272\277/\350\256\241\347\256\227\346\234\272\345\237\272\347\241\200/\345\205\210\344\277\256\345\206\205\345\256\271/vscode.md" new file mode 100644 index 0000000..b9ba25d --- /dev/null +++ "b/docs/\350\256\241\347\256\227\346\234\272\347\247\221\345\255\246\345\255\246\344\271\240\350\267\257\347\272\277/\350\256\241\347\256\227\346\234\272\345\237\272\347\241\200/\345\205\210\344\277\256\345\206\205\345\256\271/vscode.md" @@ -0,0 +1,274 @@ +# VSCode 配置 + +VSCode 是一款**轻量级**的**代码编辑器**,可以通过安装各种各样不同**扩展**的方式来实现开发者所需要的功能。 + +!!! note "区分:代码编辑器(Editor)与集成开发环境(IDE, Integrated Development Environment)" + + 代码编辑器事实上我们可以看成是一个记事本(没错,如果是 Windows 用户,就是你按下 Win+R 输入 notepad 回车之后的那个记事本),其最基本的功能是文档编辑。不过之所以将其称为是**代码编辑器**,是因为它虽然继承自一般的文档编辑器,又具备了一些一般的文档编辑器所不具备的功能。具体来说,例如自动语法高亮,自动补全,甚至是自动代码重构等等。 + + 集成开发环境(IDE)是一种用于构建应用程序的软件,**可将常用的开发人员工具合并到单个图形用户界面**(GUI)中。具体来说,我们只需要简单的点击按钮,可能就可以完成程序的编译、链接、运行、调试等等工作。而这些工作在最初都是需要人手工在命令行中完成的。我们在《程序设计基础》课程中最初使用的 Dev-C++ 便是一个集成开发环境。 + + 我们今天要介绍的 VSCode 是一款轻量级的**代码编辑器**。如果没有各种扩展插件的支持的话,可能我们只能把它称作是大号的 Notepad++,而正是因为社区中各种各样的扩展,VSCode 才得以展现其强大。 + +![image-20220209114623794](https://s2.loli.net/2022/02/09/psKk8yJ2CxMic1O.png) + +本文我们介绍 VSCode 的基本配置,重点在于介绍一些未来可能会用到的扩展插件。按照本文的流程完成后,你应该等效地完成了足以应对《面向对象程序设计基础》课程中的代码的集成开发环境的配置。此外,我们还会介绍一些基本的调试方法,而这恰恰是 VSCode 比 Dev-C++ 在现阶段不知道高到哪里去的地方。 + +事实上,在未来,我们可以用 VSCode 配置 Python 开发环境,配置软件工程课程中所需要的框架的开发环境,而这些都是通过“扩展”(Extension)来实现的。 + + + +## 前置知识 + ++ 了解一个 C++ 程序从源代码到可执行程序中发生了编译、链接这两步操作(《程序设计基础》大作业中会有此部分的讲解) ++ 动手能力 + +## 下载与运行 + ++ 打开 VSCode 官网:https://code.visualstudio.com/ ++ 点击大大的 Download 按钮(如果是 Windows 64 位用户可以点击下拉框选择 x64 安装包版本) ++ 进行安装或解压缩(注意路径中不能存在任何中文字符,推荐仅用字母和数字) ++ 到你安装 VSCode 的目录下,新建 `data` 文件夹 + +> 这里我们新建 `data` 文件夹后,之后 VSCode 运行时的扩展插件和用户数据便都会存放在 `data` 文件夹下,这样可以在一定程度上避免系统盘容量占用的问题。如果不新建 `data` 文件夹,那么 VSCode 会将上述插件和用户信息存放在系统盘的用户目录下。 +> +> ![image-20220209213021194](https://s2.loli.net/2022/02/09/IsPShQ2nLyqmwH8.png) + +## C++ 相关开发环境配置 + +### 环境变量与 Mingw64 + +我们可以先打开终端(Windows 用户请使用 Win+R,输入 `cmd`),尝试输入: + +```bash +g++ --version +``` + +如果你的终端返回了 `g++` 的版本信息,恭喜,您 C++ 编译器的环境变量配置正确,可以跳过这一小节。当然,如果想更加详细地了解环境变量是什么,可以继续阅读这一小节。 + +而如果返回: + +```bash +'g++' 不是内部或外部命令,也不是可运行的程序 +或批处理文件。 +``` + +那么则说明你的终端不知道 `g++` 是什么命令。我们接下来将首先讲解环境变量是什么,然后再为大家讲述该怎么配置环境变量。 + +!!! note "什么是环境变量?" + + 当你的 Shell 在执行命令时,会尝试在**一系列路径**下搜索同名的可执行文件。这一系列路径我们就称作是环境变量。 + + Windows 用户可以在终端中输入 path 来查看当前环境变量(由于我进行过一系列配置,所以其输出结果可能与你的不同): + + ```bash + D:\Coding>path + PATH=D:\Anaconda;D:\Anaconda\Library\mingw-w64\bin;D:\Anaconda\Library\usr\bin;...... + ``` + + Linux 用户可以通过使用 `echo $PATH` 来查看自己的环境变量: + + ```bash + c7w@cc7w > /mnt/d/Coding > echo $PATH + /home/c7w/.local/lib/python3.8/site-packages:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/mnt/d/Anaconda:/mnt/d/Anaconda/Library/mingw-w64/bin:/mnt/d/Anaconda/Library/usr/bin:/mnt/d/Anaconda/Library/bin:/mnt/d/Anaconda/Scripts:/mnt/f/VM/bin/:/mnt/c/Program Files (x86)/Common Files/Intel/Shared Libraries/redist/intel64/compiler:/mnt/c/Program Files/Common Files/Oracle/Java/javapath:...... + ``` + + 没错,就是这一系列文件夹。回忆我们刚才执行 `g++ --version` 命令的时候,我们的终端会在这一系列文件夹下为我们寻找叫做 `g++` 的可执行文件。如果找到了名为 `g++` 的可执行文件,我们的终端就会将参数传入,将其执行;而如果我们的终端没有找到,那么就会向我们报告“未知命令”。 + + 我们刚刚已经理解了“环境变量(Path)”的运行逻辑,接下来我们讲解如何进行环境变量的配置。` + + 对于 Windows 用户,请按下 Windows + S 打开搜索框,在其中输入 `path`,然后选择"编辑系统环境变量",进而选择“环境变量”,然后选择“系统变量”中的 Path 字段,双击打开后即可配置。 + + ![image-20220209214212982](https://s2.loli.net/2022/02/09/L9DhPnOjNZ58gCV.png) + + 对于 Linux 用户,环境变量是绑定在你的 Shell 上的,不同的 Shell 有不同的配置方式。这里我们提供一个[链接](https://www.cnblogs.com/youyoui/p/10680329.html)帮助您了解环境变量的相关配置。 + +!!! note "什么是 Mingw64?" + + MinGW 的全称是:Minimalist GNU on Windows。 + + 它实际上是将经典的开源 C 语言编译器 GCC 移植到了 Windows 平台下,并且包含了 Win32API,因此可以将源代码编译为可在 Windows 中运行的可执行程序。而且还可以使用一些 Windows 不具备的,Linux平台下的开发工具。 + + 一句话来概括:MinGW 就是 GCC 的 Windows 版本。这是将你写的 C/C++ 语言的源代码编译成汇编代码,进而链接成可执行文件的工具。之前我们的 Dev-C++ 事实上也集成了这个工具。 + +我们下载官方的安装工具([链接](https://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting%20Win32/Personal%20Builds/mingw-builds/installer/mingw-w64-install.exe)),下载完成后右键以管理员身份运行,`Architecture` 中 `i686` 是针对于 32 位系统,`x86_64` 针对于 64 位系统,其他不用修改,进入下一步选择安装目录即可。然后即可等待安装程序下载并进行安装。 + +然后,我们需要进行环境变量配置。进入 `Mingw64 的安装路径/mingw64/bin/`,我们可以看到 `gcc`,`g++` 这些我们熟悉的可执行文件。**然后我们需要做的就是将这个文件夹添加至环境变量中。** + +然后我们就可以打开终端,输入 `g++` 验证环境变量是否配置成功。(请注意,在环境变量配置后需要重启终端才能生效) + +### Make + +同时,针对于我们之后课上所需要用到的 `make` 命令,我们可以将同目录下的 `mingw32-make.exe` 复制一份,改名为 `make.exe`,这样我们也能正常使用 `make` 命令了。 + +由于 Linux 平台自带了 `gcc` 和 `make` 等等编译工具,所以这里不需要进行额外的配置。 + +## 扩展插件的安装 + +我们打开 VSCode,先简单介绍下界面及其功能: + +![image-20220209220846472](https://s2.loli.net/2022/02/09/pM6kzGH4xbIRW5K.png) + +红色框是我们当前项目(即文件夹)下的所有文件清单,蓝色框是我们编写代码的地方,绿色框是我们的应用商店。 + +这里我们推荐几个扩展,在应用商店中搜索即可下载: + ++ Chinese (Simplified) Language Pack for Visual Studio Code:语言 ++ Code Runner:调试用 ++ C/C++:支持在 Code 中调试 C/C++ 程序 ++ Remote - SSH:之后进行远程开发会用到,这里不多做介绍 + +在安装了简体中文插件后,我们可以按 `Ctrl + Shift + P`,打开输入框,输入 `Configurate display language`,选择中文后重新启动即可。 + +## 代码调试 + +如何运行一段代码呢?很简单,我们只需要在**对应的代码界面**按下 `F5` 或是在菜单栏找到“运行 > 启动调试”,便可以启动调试模式: + +![image-20220209221547145](https://s2.loli.net/2022/02/09/x6yBiPzfVAQsErZ.png) + +在配置中选择 `C++ (GDB)`,进而选择 `g++.exe`。 + +然后我们会发现项目路径下生成了一个 `.vscode` 文件夹,内含 `tasks.json` 和 `launch.json`,这两个文件分别有什么作用我们即将就会进行介绍。 + +![image-20220209221657511](https://s2.loli.net/2022/02/09/pwDenGirIJZdjsv.png) + +(你的界面排版可能和我有所不同,不过主要功能是大同小异的,当你熟练运用了 Code 之后你可以自行将这几个框框拖来拖去摆到你觉得舒适的位置) + +我们接下来将分单文件项目和多文件项目进行讨论,说明一些在 Code 中调试 C++ 代码的技巧。 + +### 单文件项目 + +单文件项目指只有一个 cpp 文件的项目,`main()` 函数的定义就在其中,我们在《程序设计基础》课程的大部分平时作业都是这种项目。 + +这种项目我们直接按 `F5` 便可进行运行,其输出结果会在“终端”选项卡中出现。 + +![image-20220209222124275](https://s2.loli.net/2022/02/09/UO5mv1K3VBcN2lL.png) + +这是一段演示单向平方和双向平方探测在哈希表中可以占用的位置的示例程序,在这里仅做说明使用,大家不必理解其背后的原理。(事实上你给别人调代码的时候不都是这样嘛,对着看不懂的逻辑满脸黑线.jpeg) + +想要在程序运行过程中设置断点,我们只需点击对应的行号: + +![image-20220209222401148](https://s2.loli.net/2022/02/09/ZVFLrcwSbaOdxTm.png) + +在这里设置断点,程序将会在第 30 行执行完成,第 31 行将要执行的时候触发断点,让我们看一看: + +![image-20220209222500324](https://s2.loli.net/2022/02/09/5tHAOwQBdh1Sqcs.png) + +红框,也就是“终端框中,我们的程序输出了前半段运行时产生的 `cout` 信息。接下来我们将说明该如何查看中间变量: + +![image-20220209222635735](https://s2.loli.net/2022/02/09/UEioypzr9fa57GK.png) + +比如程序在命中这个断点时,我们有以下途径获取中间变量的值: + +在黄色框“变量”中,我们可以看到程序自动追溯的局部变量和寄存器值。在蓝色框“监视”中,我们可以自行定义一些需要追溯的变量。在红色框中,我们可以直接输入变量名来查看其对应的值。 + +![image-20220209222812673](https://s2.loli.net/2022/02/09/jAlCZgHIYphwoDv.png) + +然后,我们来将目光放在上述这几个按钮身上。 + ++ 继续(F5)按钮将会使程序继续执行,直到命中下一个断点或是到程序结尾。 ++ 单步跳过(F10)按钮对于程序来说,如果将要执行的行调用了某些函数,那么将直接将本行执行完毕,进入下一行。 ++ 单步调试(F11)按钮对于程序来说,如果将要执行的行调用了某些函数,那么将进入将要执行的函数内部。 ++ 停止(Shift+F5)按钮终止当前调试工作。 + +### 多文件项目 + +对于多文件项目的调试来说,我们重点关注点在于 `.vscode` 下两个文件的配置。 + +首先我们将我们的示例程序修改为多文件项目: + +![image-20220209223422595](https://s2.loli.net/2022/02/09/IBLJmUG7NCy1ikv.png) + +我们采用最简单的方式,将我们的单文件项目魔改成多文件。 + +我们回忆如果使用命令行,该如何将我们的程序编译: + +```bash +g++ hash.cpp another.cpp -o main +``` + +没错,我们现在配置 Code 使得其在“生成目标文件”任务中执行上述命令。 + +`tasks.json` 负责可执行文件的生成,我们主要进行如下修改: + +```json +{ + "tasks": [ + { + "type": "shell", // cppbuild -> shell + "label": "C/C++: g++.exe 生成活动文件", + "command": "D:\\Mingw\\mingw64\\bin\\g++.exe", + "args": [ + "-g", + "hash.cpp", // ${file} -> your source code list + "another.cpp", + "-o", + "${fileDirname}\\main.exe" // main.exe + ], + "options": { + "cwd": "${fileDirname}" + }, + "problemMatcher": [ + "$gcc" + ], + "group": { + "kind": "build", + "isDefault": true + }, + "detail": "调试器生成的任务。" + } + ], + "version": "2.0.0" +} +``` + +`launch.json` 主要负责调试目标程序,我们做以下修改: + +```json +{ + // 使用 IntelliSense 了解相关属性。 + // 悬停以查看现有属性的描述。 + // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "g++.exe - 生成和调试活动文件", + "type": "cppdbg", + "request": "launch", + "program": "${fileDirname}\\main.exe", // main.exe + "args": [], + "stopAtEntry": false, + "cwd": "${fileDirname}", + "environment": [], + "externalConsole": false, + "MIMode": "gdb", + "miDebuggerPath": "D:\\Mingw\\mingw64\\bin\\gdb.exe", + "setupCommands": [ + { + "description": "为 gdb 启用整齐打印", + "text": "-enable-pretty-printing", + "ignoreFailures": true + } + ], + "preLaunchTask": "C/C++: g++.exe 生成活动文件" + } + ] +} +``` + +然后我们就可以愉快地调试多文件项目了。 + +## 后续学习 + ++ 自行研究 Remote-SSH 的使用方法,如何连接到外部服务器进行开发 ++ 自行研究 Python 配置调试环境的方法 ++ 在《软件工程》课程中,使用 Code Prettier 插件 + ESLint 规范项目 + +## 资源链接 + ++ https://code.visualstudio.com/ ++ https://zhuanlan.zhihu.com/p/76613134 ++ https://blog.csdn.net/linjf520/article/details/108559210 + +!!! note "Tips" + 配置开发环境往往是在学习的过程中最恼人的一件事,但是不用心急,常言道“良好的开端是成功的一半”。如果实在遇到配置问题,在进行搜索无法解决后,建议向同年级/学长/答疑坊进行求助。 \ No newline at end of file diff --git "a/docs/\350\256\241\347\256\227\346\234\272\347\247\221\345\255\246\345\255\246\344\271\240\350\267\257\347\272\277/\350\256\241\347\256\227\346\234\272\345\237\272\347\241\200/\345\205\210\344\277\256\345\206\205\345\256\271/web.md" "b/docs/\350\256\241\347\256\227\346\234\272\347\247\221\345\255\246\345\255\246\344\271\240\350\267\257\347\272\277/\350\256\241\347\256\227\346\234\272\345\237\272\347\241\200/\345\205\210\344\277\256\345\206\205\345\256\271/web.md" new file mode 100644 index 0000000..db23078 --- /dev/null +++ "b/docs/\350\256\241\347\256\227\346\234\272\347\247\221\345\255\246\345\255\246\344\271\240\350\267\257\347\272\277/\350\256\241\347\256\227\346\234\272\345\237\272\347\241\200/\345\205\210\344\277\256\345\206\205\345\256\271/web.md" @@ -0,0 +1,198 @@ +# Web 与 Web 应用基础 + +## 前言 + +当我们访问网站的时候,发生了些什么?网页实质上是文件。当我们通过浏览器访问网站时,浏览器会向服务器发送请求,服务器会将网页文件发送给浏览器,浏览器再将网页文件渲染成我们看到的网页。 + +## Web 页面 + +### HTML + +HTML (Hyper Text Markup Language, 超文本标记语言) 是一种用于描述网页文档的语言。HTML 定义了许多不同种类的标签, 它们被尖括号包围,起始标签和结束标签通常成对出现,标签自身则表示了内容的类型与格式,标签内含有具体的内容。例如,下面的代码表示 **加粗的** “你好” + +```html +你好 +``` + +在 Word 中,我们通过手动在 Tab 栏里调整格式,文本的写作、结构和格式的调整相分离。而在 HTML 中,**内容的格式信息以标签的形式,作为纯文本存储在文件中**,便于生成、编辑、传输、渲染。 + +下面是一些常见的用来表征文本的 HTML 标签: + +|标签|描述| +|---|---| +|`

` - `

`|定义标题,从最高级别到最低级别| +|`

`|定义段落| +|`