├── .github └── workflows │ └── check.yaml ├── .gitignore ├── .nvmrc ├── .prettierignore ├── .prettierrc.yml ├── .vitepress ├── config.mts └── theme │ ├── FeaturesTitle.vue │ └── index.mts ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── advanced └── 01-linux-fs.md ├── assets └── basic │ ├── 01-introduction │ └── fly.jpg │ ├── 02-searching-and-question │ ├── baidu_python.png │ ├── bing_python_1.png │ ├── bing_python_2.png │ ├── bing_python_3.png │ ├── github.png │ ├── google_python.png │ ├── python_doc.png │ ├── stackoverflow.png │ ├── w3schools.png │ └── wikipedia.png │ ├── 03-computer-basic-knowledge-1 │ ├── BIOS.jpg │ ├── ComputerMemoryHierarchy.svg │ ├── DRAM.jpg │ ├── ENIAC.jpg │ ├── GPU_Teardown.jpg │ ├── GTX980tiFE.jpg │ ├── IPhone_6.png │ ├── Intel_C8086.jpg │ ├── Laptop-hard-drive-exposed.jpg │ ├── Notebook_Internal.jpg │ ├── SSD.jpg │ ├── Turing.jpg │ ├── Von_Neumann_Architecture.svg │ └── Von_Neumann_Machine.png │ ├── 04-computer-basic-knowledge-2 │ ├── Amdahl.svg │ ├── Dennerd.svg │ ├── Moore.svg │ ├── Opt.svg │ └── Perf.svg │ ├── 05-drive-your-computer-1 │ ├── Run.png │ ├── UI.png │ ├── activate.png │ ├── assets.png │ ├── clv.png │ ├── encode.webp │ ├── gccinfo.png │ ├── processOfCoding.png │ ├── qq.png │ ├── qq2.png │ ├── software.png │ ├── stdcpp.png │ ├── steam.png │ ├── steam2.png │ ├── steaminstall.png │ ├── uninstall.png │ ├── workspace.png │ └── zsh.png │ ├── 06-drive-your-computer-2 │ ├── git-a-changed.png │ ├── git-b-changed.png │ ├── git-commited.png │ └── git-graph-no-modified.png │ ├── 07-drive-your-computer-3 │ ├── image.png │ └── image2.png │ ├── 08-drive-your-computer-4 │ ├── mail.png │ ├── steam-bing.png │ └── steam.png │ ├── 09-drive-your-computer-5 │ ├── Linux_command-line._Bash._GNOME_Terminal._screenshot.png │ └── Vim-(logiciel)-console.png │ ├── 11-linux-basic-2 │ ├── image-20240831200902600.png │ ├── image-20240831201200824.png │ ├── image-20240831201443388.png │ ├── image-20240831202651295.png │ ├── image-20240831204242101.png │ ├── image-20240831205318293.png │ ├── image-20240831205502046.png │ ├── image-20240831205556924.png │ ├── image-20240831205619702.png │ ├── image-20240831205713350.png │ ├── image-20240831205748850.png │ ├── image-20240831205920758.png │ ├── image-20240831210030977.png │ ├── image-20240831210031979.png │ ├── image-20240831210119209.png │ ├── image-20240831215346761.png │ ├── image-20240831215713312.png │ ├── image-20240901002048261.png │ ├── image-20240901002109618.png │ ├── image-20240901002126326.png │ ├── image-20240901002156060.png │ ├── image-20240901002224900.png │ ├── image-20240901002317606.png │ ├── image-20240901002326909.png │ ├── image-20240901002358587.png │ ├── image-20240901002422584.png │ ├── image-20240901002516660.png │ ├── image-20240901002603682.png │ ├── image-20240901002654446.png │ ├── image-20240901002716229.png │ ├── image-20240901002730501.png │ ├── image-20240901002740664.png │ ├── image-20240901002844318.png │ ├── image-20240901002910526.png │ ├── image-20240901003303914.png │ ├── image-20240901003403670.png │ ├── image-20240901003411492.png │ ├── image-20240901003446957.png │ ├── image-20240901003459605.png │ ├── image-20240901003803015.png │ ├── image-20240901003953636.png │ ├── image-20240901003954815.png │ ├── image-20240901102451292.png │ ├── image-20240901102457715.png │ ├── image-20240901102849649.png │ ├── image-20240901103304129.png │ ├── image-20240901103513942.png │ ├── image-20240901104310783.png │ ├── image-20240901104405772.png │ ├── image-20240901104554049.png │ ├── image-20240901104740639.png │ ├── image-20240901105227418.png │ ├── image-20240901110107708.png │ ├── image-20240901112412132.png │ ├── image-20240901114423930.png │ ├── image-20240901114741910.png │ ├── image-20240901190226341.png │ ├── image-20240901194111878.png │ ├── image-20240901194931485.png │ ├── image-20240901200012668.png │ ├── image-20240901204654164.png │ ├── image-20240901204758261.png │ ├── image-20240901204840440.png │ ├── image-20240901205237955.png │ ├── image-20240901205346758.png │ ├── image-20240901210637302.png │ └── image-20240901211038298.png │ └── 12-text-editing │ ├── latex1.png │ ├── latex4.png │ ├── latex5.png │ ├── latex6.png │ ├── latex7.png │ └── purple_head.jpg ├── basic ├── 01-introduction.md ├── 02-searching-and-question.md ├── 03-computer-basic-knowledge-1.md ├── 04-computer-basic-knowledge-2.md ├── 05-drive-your-computer-1.md ├── 06-drive-your-computer-2.md ├── 07-drive-your-computer-3.md ├── 08-drive-your-computer-4.md ├── 09-drive-your-computer-5.md ├── 10-linux-basic-1.md ├── 11-linux-basic-2.md ├── 12-text-editing.md └── 13-windows-overview.md ├── components ├── MacOSCommandKey.vue ├── MacOSControlKey.vue ├── MacOSOptionKey.vue └── MacOSShiftKey.vue ├── index.md ├── package.json ├── pnpm-lock.yaml └── public └── favicon.ico /.github/workflows/check.yaml: -------------------------------------------------------------------------------- 1 | name: Code Checks 2 | 3 | on: 4 | push: 5 | branches: ['main'] 6 | pull_request: 7 | branches: ['main'] 8 | 9 | jobs: 10 | check: 11 | runs-on: ubuntu-latest 12 | steps: 13 | - name: Checkout 14 | uses: actions/checkout@v4 15 | with: 16 | fetch-depth: 0 17 | 18 | - name: Setup Node 19 | uses: actions/setup-node@v4 20 | with: 21 | node-version-file: '.nvmrc' 22 | 23 | - name: Install dependencies 24 | run: corepack pnpm i 25 | 26 | - name: Lint 27 | run: corepack pnpm lint 28 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .vitepress/dist 3 | .vitepress/cache 4 | -------------------------------------------------------------------------------- /.nvmrc: -------------------------------------------------------------------------------- 1 | v22.14.0 2 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | pnpm-lock.yaml 2 | asserts 3 | .vitepress/dist 4 | -------------------------------------------------------------------------------- /.prettierrc.yml: -------------------------------------------------------------------------------- 1 | singleQuote: true 2 | semi: false 3 | printWidth: 100 4 | trailingComma: none 5 | plugins: ['prettier-plugin-lint-md'] 6 | -------------------------------------------------------------------------------- /.vitepress/config.mts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vitepress' 2 | 3 | export default defineConfig({ 4 | lang: 'zh-CN', 5 | title: 'LCPU Getting Started', 6 | description: 'The Missing Semester refreshed by PKU Linux Club', 7 | lastUpdated: true, 8 | cleanUrls: true, 9 | srcExclude: ['README.md'], 10 | rewrites: {}, 11 | markdown: { 12 | container: { 13 | tipLabel: '提示', 14 | warningLabel: '警告', 15 | dangerLabel: '危险', 16 | infoLabel: '信息', 17 | detailsLabel: '详细信息' 18 | }, 19 | math: true 20 | }, 21 | head: [ 22 | [ 23 | 'script', 24 | { 25 | defer: '', 26 | src: 'https://report.lcpu.dev/js/script.outbound-links.tagged-events.js', 27 | 'data-domain': 'missing.lcpu.dev' 28 | } 29 | ], 30 | [ 31 | 'script', 32 | {}, 33 | `window.plausible = window.plausible || function() { (window.plausible.q = window.plausible.q || []).push(arguments) }` 34 | ] 35 | ], 36 | themeConfig: { 37 | i18nRouting: false, 38 | sidebar: { 39 | '/': [ 40 | { 41 | text: '基础部分', 42 | items: [ 43 | { text: '01. 简介', link: '/basic/01-introduction' }, 44 | { text: '02. 搜索和知识获取', link: '/basic/02-searching-and-question' }, 45 | { 46 | text: '03. 计算机基本知识概览 I: 软硬件和操作系统', 47 | link: '/basic/03-computer-basic-knowledge-1' 48 | }, 49 | { 50 | text: '04. 计算机基本知识概览 II: 计算机的评价', 51 | link: '/basic/04-computer-basic-knowledge-2' 52 | }, 53 | { 54 | text: '05. 用好你的电脑 I: 环境配置,常用软件选择、安装与卸载', 55 | link: '/basic/05-drive-your-computer-1' 56 | }, 57 | { 58 | text: '06. 用好你的电脑 II: 版本控制,Git和文件备份', 59 | link: '/basic/06-drive-your-computer-2' 60 | }, 61 | { 62 | text: '07. 用好你的电脑 III: 小知识串讲,网络资源获取 ', 63 | link: '/basic/07-drive-your-computer-3' 64 | }, 65 | { text: '08. 用好你的电脑 IV: 网络安全', link: '/basic/08-drive-your-computer-4' }, 66 | { 67 | text: '09. 用好你的电脑 V: 操作系统和编程语言', 68 | link: '/basic/09-drive-your-computer-5' 69 | }, 70 | { text: '10. Linux 基础知识: Linux 101', link: '/basic/10-linux-basic-1' }, 71 | { text: '11. Linux 基础知识: 虚拟机安装和常用操作', link: '/basic/11-linux-basic-2' }, 72 | { 73 | text: '12. 文本编辑: Markdown, LaTeX, Typst 和 Beamer', 74 | link: '/basic/12-text-editing' 75 | }, 76 | { text: '13. Windows 入门指南', link: '/basic/13-windows-overview' } 77 | ] 78 | }, 79 | { 80 | text: '进阶:运维方向', 81 | items: [{ text: '01. Linux文件系统', link: '/advanced/01-linux-fs' }] 82 | } 83 | ] 84 | }, 85 | outline: { 86 | label: '目录', 87 | level: [2, 4] 88 | }, 89 | socialLinks: [{ icon: 'github', link: 'https://github.com/lcpu-club' }], 90 | footer: { 91 | message: '由北京大学学生 Linux 俱乐部所著', 92 | copyright: '© 2024 LCPU Club, licensed under CC BY-NC-SA 4.0' 93 | }, 94 | docFooter: { 95 | prev: '上一节', 96 | next: '下一节' 97 | }, 98 | lastUpdated: { 99 | text: '更新于', 100 | formatOptions: { 101 | dateStyle: 'full', 102 | timeStyle: 'medium', 103 | forceLocale: true 104 | } 105 | }, 106 | editLink: { 107 | pattern: 'https://github.com/lcpu-club/getting-started/edit/main/:path', 108 | text: '在GitHub上更新本页' 109 | }, 110 | darkModeSwitchLabel: '颜色选择', 111 | lightModeSwitchTitle: '切换至亮色模式', 112 | darkModeSwitchTitle: '切换至暗色模式', 113 | sidebarMenuLabel: '目录', 114 | returnToTopLabel: '回到顶部', 115 | externalLinkIcon: true, 116 | search: { 117 | provider: 'local', 118 | options: { 119 | locales: { 120 | root: { 121 | translations: { 122 | button: { 123 | buttonText: '搜索', 124 | buttonAriaLabel: '搜索' 125 | }, 126 | modal: { 127 | displayDetails: '显示详细列表', 128 | resetButtonTitle: '重置搜索', 129 | backButtonTitle: '关闭搜索', 130 | noResultsText: '没有结果', 131 | footer: { 132 | selectText: '选择', 133 | selectKeyAriaLabel: '输入', 134 | navigateText: '导航', 135 | navigateUpKeyAriaLabel: '上箭头', 136 | navigateDownKeyAriaLabel: '下箭头', 137 | closeText: '关闭', 138 | closeKeyAriaLabel: 'esc' 139 | } 140 | } 141 | } 142 | } 143 | } 144 | } 145 | } 146 | } 147 | }) 148 | -------------------------------------------------------------------------------- /.vitepress/theme/FeaturesTitle.vue: -------------------------------------------------------------------------------- 1 | 10 | 65 | -------------------------------------------------------------------------------- /.vitepress/theme/index.mts: -------------------------------------------------------------------------------- 1 | import DefaultTheme from 'vitepress/theme-without-fonts' 2 | 3 | export default DefaultTheme 4 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Missing Semester 写作规范指南 2 | 3 | > [!important] 4 | > 5 | > Work in progress. 6 | 7 | ## 标点 8 | 9 | 优先使用**全角**标点符号,**除非**: 10 | 11 | - `/` 12 | - 在以英文作为主导语言的上下文中,例如: 13 | - 英文引文 14 | - 多个英文单词的并列,导致全角标点在其间并不合适,e.g. `ls`, `cd`, `cat` 15 | - 对英文缩写进行解释,e.g. CLI (Command Line Interface, 命令行界面) 16 | - 半角引号(有待商榷,Windows 下全角引号占一个字符宽,前后无需加空格,而 macOS 下将全角引号压缩至半角宽度,前后需要加上空格确保可读性) 17 | - 引文原文如此 18 | - 其他全角字符看上去怪异的情况 19 | 20 | 不要在列表后插入分号或其他字符,段落尾部使用句号结束段落。 21 | 22 | ## 空格 23 | 24 | - 在全角字符与半角字符间(取决于渲染后效果,而非 Markdown 源代码)插入空格,**除非**: 25 | - 全角字符为全角标点 26 | - 引文原文如此 27 | - 在半角标点后插入空格,**除非**: 28 | - `(` 29 | - 在恰当的呼吸处插入空格 30 | - 在 `/` 前后插入空格(有待商榷) 31 | - 在行内代码块前后插入空格(有待商榷) 32 | 33 | > [!important] 34 | > 35 | > 将空格置于文本块外,而不是块内,例如: 36 | > 37 | > - 正确的 [example](/#) like this 38 | > - 错误的[example](/#)like this 39 | 40 | ## 拼写 41 | 42 | - 正确使用大小写,对齐官方使用的样式,重灾区例如: 43 | - macOS(旧作 OS X,MacOS) 44 | - Windows 45 | - Linux 46 | - VMware Workstation 47 | - 使用 `macOS` 而非 `mac`,除非特指硬件 48 | 49 | ## 链接 50 | 51 | 链接应当有明确的链接文本,避免使用 [官网](/#), [网址](/#) 这样的文本。一般的,使用页面标题或其适当的缩略形式作为链接文本,对于 Github 仓库链接,使用 [Github - owner/repo](/#) 的短格式。 52 | 53 | > [!important] 54 | > 55 | > 方括号和圆括号不要写反!!! 56 | 57 | ## 引用(有待商榷) 58 | 59 | - 由于全角引号跨平台显示的不一致性及在全角环境中使用半角直引号的怪异效果,优先使用 `行内代码块` 表示短语或句子的原文引用 60 | - 正确使用 Blockquote 引用段落 61 | 62 | ## 代码块 63 | 64 | 代码块应当有明确的语言标注以获得最佳的着色效果,如非必要,不使用 plain 类型。如果需要对语句作出解释,使用注释,而不是鲁莽地将语言类型设置为 plain。 65 | 66 | ## 分段 67 | 68 | 在合适处分段以减小阅读压力,避免产生过长的段落。 69 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 Linux Club of Peking University 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 仓库说明 2 | 3 | 每一讲单独放一个文件,文件命名规则为:系列/编号-名称.md。 4 | 5 | 系列为:basic, advanced, expert。basic 系列的编号如下: 6 | 7 | - 01-introduction 8 | - 02-searching-and-question 9 | - 03-computer-basic-knowledge-1 10 | - 04-computer-basic-knowledge-2 11 | - 05-drive-your-computer-1 12 | - 06-drive-your-computer-2 13 | - 07-drive-your-computer-3 14 | - 08-drive-your-computer-4 15 | - 09-drive-your-computer-5 16 | - 10-linux-basic-1 17 | - 11-linux-basic-2 18 | - 12-text-editing 19 | - 13-windows-overview 20 | 21 | 新增内容应该开分支,上传,开 PR,Review 后合并。 22 | 23 | 图片应该统一放到 assets 目录下,如`assets/basic/01-introduction/a.png`。 24 | 25 | # 版权说明 26 | 27 | 网页代码采取 MIT 协议,各个章节讲义默认采用 CC BY-NC-SA 4.0 协议。 28 | 部分章节可能有更宽松的许可,可以见各个章节讲义具体说明。 29 | -------------------------------------------------------------------------------- /advanced/01-linux-fs.md: -------------------------------------------------------------------------------- 1 | # Linux 文件系统的基本概念与操作 2 | 3 | ::: info 本文信息 4 | 作者:thezzisuwith Claude Sonnet 5 | 6 | 状态:待审阅 7 | 8 | ::: 9 | 10 | ## 块设备、磁盘与分区的概念 11 | 12 | 在开始学习 Linux 文件系统之前,我们需要先理解几个基本概念,它们之间的关系如下: 13 | 14 | ```mermaid 15 | graph TB 16 | A[物理硬件] --> B[块设备] 17 | B --> C[磁盘] 18 | C --> D[分区] 19 | D --> E[文件系统] 20 | ``` 21 | 22 | ### 块设备 23 | 24 | 块设备是一种以块(block)为单位进行数据读写的设备。与字符设备(按字符读写)不同,块设备允许随机访问数据,可以跳到任意位置读写数据。最常见的块设备就是硬盘。 25 | 26 | 一些关键特点: 27 | 28 | - 以固定大小的块为单位读写数据(通常是 512 字节或 4KB) 29 | - 支持随机访问,可以直接跳转到任意位置 30 | - 在 Linux 中以特殊文件形式存在,通常位于 `/dev` 目录下 31 | 32 | ### 磁盘 33 | 34 | 磁盘是最常见的块设备,在 Linux 系统中有不同的命名规则: 35 | 36 | - IDE/SATA 硬盘:`/dev/sda`, `/dev/sdb`, `/dev/sdc`... 37 | - NVMe 固态硬盘:`/dev/nvme0n1`, `/dev/nvme0n2`... 38 | - 虚拟磁盘:`/dev/vda`, `/dev/vdb`... 39 | 40 | 其中字母表示不同的物理设备,数字表示分区编号。 41 | 42 | ### 分区 43 | 44 | 分区是将一个物理磁盘划分为多个逻辑区域的方式。分区的主要目的是: 45 | 46 | - 更好地组织和管理数据 47 | - 提高系统性能和安全性 48 | - 支持多个操作系统共存 49 | 50 | 分区类型: 51 | 52 | 1. MBR 分区表(传统) 53 | 54 | - 最多支持 4 个主分区 55 | - 或 3 个主分区 + 1 个扩展分区(扩展分区可包含多个逻辑分区) 56 | - 单个分区最大支持 2TB 57 | 58 | 2. GPT 分区表(现代) 59 | 60 | - 支持最多 128 个主分区 61 | - 支持超过 2TB 的分区大小 62 | - 更好的容错性 63 | 64 | ### 文件系统 65 | 66 | 文件系统是在分区之上建立的数据组织方式,它决定了如何在分区中存储和管理文件。常见的 Linux 文件系统类型包括: 67 | 68 | - `ext4`:Linux 最常用的文件系统,功能强大且稳定 69 | - `xfs`:适合大容量存储,性能优秀 70 | - `btrfs`:新一代文件系统,支持快照等高级特性 71 | - `fat32/ntfs`:主要用于与 Windows 系统交互 72 | 73 | #### 不同文件系统的区别 74 | 75 | - `ext4`:支持大文件和大分区,具有良好的性能和稳定性,适合大多数场景。 76 | - `xfs`:在处理大文件和高并发访问时表现优异,适合大容量存储和高性能需求的场景。 77 | - `btrfs`:支持快照、压缩和子卷等高级特性,适合需要高级数据管理功能的场景。 78 | - `fat32/ntfs`:主要用于与 Windows 系统交互,`fat32` 适合小容量 U 盘,`ntfs` 适合大容量存储设备。 79 | 80 | 如果你不知道怎么选择,`xfs` 是一个不错的选择。 81 | 82 | #### 选择文件系统的最佳实践 83 | 84 | - 对于大多数 Linux 系统,推荐使用 `ext4` 文件系统。 85 | - 对于需要处理大文件和高并发访问的场景,推荐使用 `xfs` 文件系统。 86 | - 对于需要高级数据管理功能的场景,推荐使用 `btrfs` 文件系统。 87 | - 对于需要与 Windows 系统交互的存储设备,推荐使用 `fat32` 或 `ntfs` 文件系统。 88 | 89 | ## Linux 的挂载机制 90 | 91 | Linux 系统中的所有文件都在一个统一的目录树中,通过挂载将物理设备整合到这个目录树中: 92 | 93 | ```mermaid 94 | graph LR 95 | A[物理设备] --挂载--> B[挂载点] 96 | B --> C[统一目录树] 97 | C --> D[/] 98 | C --> E[/home] 99 | C --> F[/mnt] 100 | ``` 101 | 102 | ### 挂载的概念 103 | 104 | 挂载(mount)是将一个文件系统关联到目录树的过程。可以把它想象成把一个新的抽屉(文件系统)安装到书柜(目录树)上。 105 | 106 | 为什么需要挂载: 107 | 108 | - 保持文件系统的统一性 109 | - 灵活管理不同的存储设备 110 | - 实现文件系统的动态扩展 111 | 112 | ### 挂载点与目录树的关系 113 | 114 | - 挂载点是目录树中的一个目录 115 | - 挂载后,访问该目录就等于访问被挂载的文件系统 116 | - 常用的挂载点位置: 117 | - `/mnt`:临时挂载点 118 | - `/media`:可移动设备自动挂载点 119 | - `/`:根文件系统挂载点 120 | 121 | ### 自动挂载与手动挂载 122 | 123 | Linux 系统支持两种挂载方式: 124 | 125 | 1. 自动挂载 126 | 127 | - 系统启动时通过 `/etc/fstab` 自动挂载 128 | - 对于 Linux 部分桌面发行版,插入可移动设备时通常由 `udisks2` 自动挂载,无需手动干预 129 | 130 | 2. 手动挂载 131 | - 使用 `mount` 命令临时挂载 132 | - 系统重启后需要重新挂载 133 | 134 | ## Linux 磁盘与文件系统常用命令 135 | 136 | ### 查看磁盘信息 137 | 138 | 1. 使用 `fdisk -l` 查看分区信息 139 | 140 | ```plain 141 | Disk /dev/sda: 500 GB 142 | Device Boot Start End Sectors Size Id Type 143 | /dev/sda1 * 2048 999423 997376 487M 83 Linux 144 | /dev/sda2 999424 41943039 40.9G 83 Linux 145 | ``` 146 | 147 | 2. 使用 `lsblk` 查看块设备信息 148 | 149 | ```plain 150 | NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT 151 | sda 8:0 0 500G 0 disk 152 | ├─sda1 8:1 0 487M 0 part /boot 153 | └─sda2 8:2 0 40.9G 0 part / 154 | ``` 155 | 156 | 3. 使用 `df -h` 查看磁盘使用情况 157 | 158 | ```plain 159 | 文件系统 容量 已用 可用 已用% 挂载点 160 | /dev/sda2 41G 15G 24G 39% / 161 | /dev/sda1 487M 98M 364M 22% /boot 162 | ``` 163 | 164 | ### 磁盘分区操作 165 | 166 | ::: warning 警告 167 | 在进行任何分区操作之前,请确保: 168 | 169 | 1. 已备份重要数据 170 | 2. 确认操作的设备名称正确(可使用 `lsblk` 和 `fdisk -l` 仔细核对) 171 | 3. 了解分区操作可能带来的风险 172 | 173 | ::: 174 | 175 | 4. 使用 `fdisk` 创建新分区 176 | 177 | ```bash 178 | sudo fdisk /dev/sdb 179 | ``` 180 | 181 | 常用的 `fdisk` 交互命令: 182 | 183 | - `n`:创建新分区 184 | - `p`:打印分区表 185 | - `d`:删除分区 186 | - `w`:写入更改并退出 187 | - `q`:不保存退出 188 | 189 | 2. 使用 `parted` 命令(支持 GPT) 190 | 191 | ```bash 192 | sudo parted /dev/sdb 193 | ``` 194 | 195 | `parted` 的常用命令: 196 | 197 | - `mklabel gpt`:创建 GPT 分区表 198 | - `mkpart`:创建新分区 199 | - `print`:显示分区信息 200 | - `rm`:删除分区 201 | 202 | ### 创建文件系统 203 | 204 | 1. 在分区上创建 `ext4` 文件系统 205 | 206 | ```bash 207 | sudo mkfs.ext4 /dev/sdb1 208 | ``` 209 | 210 | 2. 创建 `xfs` 文件系统 211 | 212 | ```bash 213 | sudo mkfs.xfs /dev/sdb1 214 | ``` 215 | 216 | 3. 创建 `fat32` 文件系统(用于跨平台兼容) 217 | 218 | ```bash 219 | sudo mkfs.vfat -F 32 /dev/sdb1 220 | ``` 221 | 222 | ### 挂载文件系统 223 | 224 | 1. 手动挂载 225 | 226 | ```bash 227 | # 创建挂载点 228 | sudo mkdir /mnt/mydisk 229 | 230 | # 挂载分区 231 | sudo mount /dev/sdb1 /mnt/mydisk 232 | 233 | # 指定文件系统类型挂载 234 | sudo mount -t ext4 /dev/sdb1 /mnt/mydisk 235 | ``` 236 | 237 | 2. 卸载文件系统 238 | 239 | ```bash 240 | sudo umount /mnt/mydisk 241 | # 或 242 | sudo umount /dev/sdb1 243 | ``` 244 | 245 | ### 配置开机自动挂载 246 | 247 | 编辑 `/etc/fstab` 文件来配置开机自动挂载: 248 | 249 | ```bash 250 | sudo nano /etc/fstab 251 | ``` 252 | 253 | `fstab` 文件格式: 254 | 255 | ```plain 256 | # 257 | UUID=xxxxx /mnt/mydisk ext4 defaults 0 2 258 | ``` 259 | 260 | 字段说明: 261 | 262 | - `file system`:设备名或 UUID 263 | - `mount point`:挂载点 264 | - `type`:文件系统类型 265 | - `options`:挂载选项 266 | - `dump`:是否备份(0 表示不备份) 267 | - `pass`:开机时 `fsck` 检查的顺序(0 表示不检查) 268 | 269 | ## 实践练习 270 | 271 | ### 练习 1:创建并挂载新分区 272 | 273 | 1. 查看可用磁盘 274 | 275 | ```bash 276 | sudo fdisk -l 277 | ``` 278 | 279 | 2. 在目标磁盘创建新分区 280 | 281 | ```bash 282 | sudo fdisk /dev/sdb 283 | # 按 `n` 创建新分区 284 | # 按 `w` 保存更改 285 | ``` 286 | 287 | 3. 创建文件系统 288 | 289 | ```bash 290 | sudo mkfs.ext4 /dev/sdb1 291 | ``` 292 | 293 | 4. 创建挂载点并挂载 294 | 295 | ```bash 296 | sudo mkdir /mnt/newdisk 297 | sudo mount /dev/sdb1 /mnt/newdisk 298 | ``` 299 | 300 | 5. 配置开机自动挂载 301 | 302 | ```bash 303 | # 获取分区 UUID 304 | sudo blkid /dev/sdb1 305 | 306 | # 编辑 `fstab` 307 | sudo nano /etc/fstab 308 | # 添加如下行 309 | # UUID= /mnt/newdisk ext4 defaults 0 2 310 | ``` 311 | 312 | ### 练习 2:U 盘操作实战 313 | 314 | 1. 插入 U 盘后查看设备名 315 | 316 | ```bash 317 | dmesg | tail 318 | # 或 319 | lsblk 320 | ``` 321 | 322 | 2. 挂载 U 盘 323 | 324 | ```bash 325 | sudo mkdir /mnt/usb 326 | sudo mount /dev/sdc1 /mnt/usb 327 | ``` 328 | 329 | 3. 安全卸载 330 | 331 | ```bash 332 | sudo umount /mnt/usb 333 | ``` 334 | 335 | ## 常见问题与故障排除 336 | 337 | ### 1. 挂载失败常见原因 338 | 339 | 1. 设备忙 340 | 问题: 341 | 342 | ```plain 343 | mount: /dev/sdb1 is already mounted or /mnt/mydisk busy 344 | ``` 345 | 346 | 解决: 347 | 348 | ```bash 349 | # 查看是否有进程在使用 350 | lsof | grep /mnt/mydisk 351 | # 结束相关进程 352 | sudo kill 353 | ``` 354 | 355 | 2. 文件系统损坏 356 | 问题: 357 | 358 | ```plain 359 | mount: wrong fs type, bad option, bad superblock 360 | ``` 361 | 362 | 解决: 363 | 364 | ```bash 365 | # 检查并修复文件系统 366 | sudo fsck /dev/sdb1 367 | ``` 368 | 369 | ### 2. `fstab` 配置错误修复 370 | 371 | 如果 `/etc/fstab` 配置错误导致系统无法正常启动: 372 | 373 | 1. 在启动时进入紧急模式 374 | 2. 使用以下命令修复: 375 | 376 | ```bash 377 | # 以读写方式重新挂载根文件系统 378 | mount -o remount,rw / 379 | 380 | # 编辑 `fstab` 381 | nano /etc/fstab 382 | 383 | # 注释掉有问题的行 384 | # UUID=xxx /mnt/mydisk ext4 defaults 0 2 385 | ``` 386 | 387 | ### 3. 磁盘空间告警 388 | 389 | 1. 查找大文件 390 | 391 | ```bash 392 | # 查找大于 1GB 的文件 393 | sudo find / -type f -size +1G 394 | 395 | # 按大小排序显示目录占用 396 | sudo du -h / | sort -rh | head -10 397 | 398 | # 查看各目录占用情况 399 | sudo ncdu / 400 | ``` 401 | 402 | 2. 清理常见的空间占用 403 | 404 | ```bash 405 | # 清理软件包缓存 406 | sudo apt clean 407 | 408 | # 删除旧内核(保留当前使用的内核) 409 | sudo apt autoremove 410 | 411 | # 清理日志文件 412 | sudo journalctl --vacuum-time=3d 413 | 414 | # 清理临时文件 415 | sudo rm -rf /tmp/* 416 | sudo rm -rf ~/.cache/* 417 | ``` 418 | 419 | 3. 扩容方案示例 420 | 421 | ```bash 422 | # LVM 在线扩容 423 | sudo vgdisplay # 查看卷组 424 | sudo lvextend -L +10G /dev/mapper/vg0-root # 扩容 10GB 425 | sudo resize2fs /dev/mapper/vg0-root # 更新文件系统 426 | 427 | # 查看 RAID 状态(如果使用 RAID) 428 | cat /proc/mdstat 429 | ``` 430 | 431 | 4. 实际案例分析 432 | 433 | - 案例 1:Docker 镜像占用过大 434 | 435 | ```bash 436 | # 清理未使用的 Docker 资源 437 | docker system prune -a 438 | ``` 439 | 440 | - 案例 2:日志文件占满磁盘 441 | 442 | ```bash 443 | # 找到大型日志文件 444 | sudo find /var/log -type f -size +100M 445 | 446 | # 安全清理日志 447 | sudo truncate -s 0 /var/log/large_log.log 448 | ``` 449 | 450 | - 案例 3:备份文件堆积 451 | ```bash 452 | # 查找并删除超过 30 天的备份 453 | find /backup -name "*.bak" -mtime +30 -delete 454 | ``` 455 | 456 | ## 附注 457 | 458 | ### ext4 的基本操作命令 459 | 460 | 1. 创建 ext4 文件系统 461 | 462 | ```bash 463 | sudo mkfs.ext4 /dev/sdb1 464 | ``` 465 | 466 | 2. 检查和修复 ext4 文件系统 467 | 468 | ```bash 469 | sudo fsck.ext4 /dev/sdb1 470 | ``` 471 | 472 | 3. 调整 ext4 文件系统大小 473 | 474 | ```bash 475 | sudo resize2fs /dev/sdb1 476 | ``` 477 | 478 | ### xfs 的基本操作命令 479 | 480 | 1. 创建 xfs 文件系统 481 | 482 | ```bash 483 | sudo mkfs.xfs /dev/sdb1 484 | ``` 485 | 486 | 2. 检查和修复 xfs 文件系统 487 | 488 | ```bash 489 | sudo xfs_repair /dev/sdb1 490 | ``` 491 | 492 | 3. 增加 xfs 文件系统大小 493 | 494 | ```bash 495 | sudo xfs_growfs /mnt/mydisk 496 | ``` 497 | 498 | 注意:`xfs` 文件系统不支持缩小操作。 `xfsprogs 5.12` 增加了对缩小操作的实验性支持,但仍需谨慎使用。 499 | 500 | ### btrfs 简介 501 | 502 | `btrfs` 是一种现代的 Linux 文件系统,支持快照、压缩和子卷等高级特性,适合需要高级数据管理功能的场景。 503 | 504 | #### btrfs 子卷 505 | 506 | btrfs 子卷(subvolume)是 btrfs 文件系统中的一个逻辑分区,可以独立管理和操作。子卷类似于目录,但具有独立的文件系统属性,可以单独进行快照和备份。 507 | 508 | #### btrfs 基本概念与操作命令 509 | 510 | 1. 创建 btrfs 文件系统 511 | 512 | ```bash 513 | sudo mkfs.btrfs /dev/sdb1 514 | ``` 515 | 516 | 2. 创建子卷 517 | 518 | ```bash 519 | sudo btrfs subvolume create /mnt/mydisk/subvol 520 | ``` 521 | 522 | 3. 创建快照 523 | 524 | ```bash 525 | sudo btrfs subvolume snapshot /mnt/mydisk/subvol /mnt/mydisk/snapshot 526 | ``` 527 | 528 | 4. 检查和修复 btrfs 文件系统 529 | 530 | ```bash 531 | sudo btrfs check /dev/sdb1 532 | ``` 533 | 534 | 5. 调整 btrfs 文件系统大小 535 | 536 | ```bash 537 | sudo btrfs filesystem resize +10G /mnt/mydisk 538 | ``` 539 | 540 | ### LVM 简介 541 | 542 | LVM(Logical Volume Manager,逻辑卷管理器)是一种灵活的磁盘管理工具,可以动态调整磁盘分区大小,方便磁盘空间的管理和扩展。 543 | 544 | 在部分 Linux 发行版中,安装系统时默认就会配置 LVM。如果你在 `fstab` 中看到 `/dev/mapper` 开头的设备,那么你的系统可能已经使用了 LVM。 545 | 546 | #### LVM 的基本概念 547 | 548 | 1. **物理卷(PV)**:物理硬盘或分区,通过 `pvcreate` 命令创建。 549 | 2. **卷组(VG)**:由一个或多个物理卷组成,通过 `vgcreate` 命令创建。 550 | 3. **逻辑卷(LV)**:从卷组中分配的逻辑存储单元,通过 `lvcreate` 命令创建。 551 | 552 | #### LVM 的基本操作命令 553 | 554 | 1. 创建物理卷 555 | 556 | ```bash 557 | sudo pvcreate /dev/sdb1 558 | ``` 559 | 560 | 2. 创建卷组 561 | 562 | ```bash 563 | sudo vgcreate myvg /dev/sdb1 564 | ``` 565 | 566 | 3. 创建逻辑卷 567 | 568 | ```bash 569 | sudo lvcreate -L 10G -n mylv myvg 570 | ``` 571 | 572 | 4. 创建文件系统 573 | 574 | ```bash 575 | sudo mkfs.ext4 /dev/myvg/mylv 576 | ``` 577 | 578 | 5. 挂载逻辑卷 579 | 580 | ```bash 581 | sudo mkdir /mnt/mylv 582 | sudo mount /dev/myvg/mylv /mnt/mylv 583 | ``` 584 | 585 | 6. 扩展逻辑卷 586 | 587 | ```bash 588 | sudo lvextend -L +5G /dev/myvg/mylv 589 | sudo resize2fs /dev/myvg/mylv 590 | ``` 591 | 592 | LVM 使得磁盘管理更加灵活,特别适合需要频繁调整磁盘空间的场景。 593 | -------------------------------------------------------------------------------- /assets/basic/01-introduction/fly.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/01-introduction/fly.jpg -------------------------------------------------------------------------------- /assets/basic/02-searching-and-question/baidu_python.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/02-searching-and-question/baidu_python.png -------------------------------------------------------------------------------- /assets/basic/02-searching-and-question/bing_python_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/02-searching-and-question/bing_python_1.png -------------------------------------------------------------------------------- /assets/basic/02-searching-and-question/bing_python_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/02-searching-and-question/bing_python_2.png -------------------------------------------------------------------------------- /assets/basic/02-searching-and-question/bing_python_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/02-searching-and-question/bing_python_3.png -------------------------------------------------------------------------------- /assets/basic/02-searching-and-question/github.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/02-searching-and-question/github.png -------------------------------------------------------------------------------- /assets/basic/02-searching-and-question/google_python.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/02-searching-and-question/google_python.png -------------------------------------------------------------------------------- /assets/basic/02-searching-and-question/python_doc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/02-searching-and-question/python_doc.png -------------------------------------------------------------------------------- /assets/basic/02-searching-and-question/stackoverflow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/02-searching-and-question/stackoverflow.png -------------------------------------------------------------------------------- /assets/basic/02-searching-and-question/w3schools.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/02-searching-and-question/w3schools.png -------------------------------------------------------------------------------- /assets/basic/02-searching-and-question/wikipedia.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/02-searching-and-question/wikipedia.png -------------------------------------------------------------------------------- /assets/basic/03-computer-basic-knowledge-1/BIOS.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/03-computer-basic-knowledge-1/BIOS.jpg -------------------------------------------------------------------------------- /assets/basic/03-computer-basic-knowledge-1/DRAM.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/03-computer-basic-knowledge-1/DRAM.jpg -------------------------------------------------------------------------------- /assets/basic/03-computer-basic-knowledge-1/ENIAC.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/03-computer-basic-knowledge-1/ENIAC.jpg -------------------------------------------------------------------------------- /assets/basic/03-computer-basic-knowledge-1/GPU_Teardown.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/03-computer-basic-knowledge-1/GPU_Teardown.jpg -------------------------------------------------------------------------------- /assets/basic/03-computer-basic-knowledge-1/GTX980tiFE.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/03-computer-basic-knowledge-1/GTX980tiFE.jpg -------------------------------------------------------------------------------- /assets/basic/03-computer-basic-knowledge-1/IPhone_6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/03-computer-basic-knowledge-1/IPhone_6.png -------------------------------------------------------------------------------- /assets/basic/03-computer-basic-knowledge-1/Intel_C8086.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/03-computer-basic-knowledge-1/Intel_C8086.jpg -------------------------------------------------------------------------------- /assets/basic/03-computer-basic-knowledge-1/Laptop-hard-drive-exposed.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/03-computer-basic-knowledge-1/Laptop-hard-drive-exposed.jpg -------------------------------------------------------------------------------- /assets/basic/03-computer-basic-knowledge-1/Notebook_Internal.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/03-computer-basic-knowledge-1/Notebook_Internal.jpg -------------------------------------------------------------------------------- /assets/basic/03-computer-basic-knowledge-1/SSD.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/03-computer-basic-knowledge-1/SSD.jpg -------------------------------------------------------------------------------- /assets/basic/03-computer-basic-knowledge-1/Turing.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/03-computer-basic-knowledge-1/Turing.jpg -------------------------------------------------------------------------------- /assets/basic/03-computer-basic-knowledge-1/Von_Neumann_Machine.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/03-computer-basic-knowledge-1/Von_Neumann_Machine.png -------------------------------------------------------------------------------- /assets/basic/04-computer-basic-knowledge-2/Moore.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Figure 2. Transistors per chip of Intel microprocessors vs. Moore’s Law. 10,000,000Moore’s Law vs. Intel Microprocessor Density1,000,000100,00010,0001,0001001019801990Density20002010Moore’s Law (1975 version) 363 | -------------------------------------------------------------------------------- /assets/basic/04-computer-basic-knowledge-2/Opt.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Figure 7. Potential speedup of matrix multiply in Python for four optimizations. 100,00010,0001,0001001011473666,72762,806PythonMatrix Multiply Speedup Over Native PythonSpeedupC+ parallelloops+ memoryoptimization+ SIMDinstructions 180 | -------------------------------------------------------------------------------- /assets/basic/05-drive-your-computer-1/Run.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/05-drive-your-computer-1/Run.png -------------------------------------------------------------------------------- /assets/basic/05-drive-your-computer-1/UI.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/05-drive-your-computer-1/UI.png -------------------------------------------------------------------------------- /assets/basic/05-drive-your-computer-1/activate.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/05-drive-your-computer-1/activate.png -------------------------------------------------------------------------------- /assets/basic/05-drive-your-computer-1/assets.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/05-drive-your-computer-1/assets.png -------------------------------------------------------------------------------- /assets/basic/05-drive-your-computer-1/clv.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/05-drive-your-computer-1/clv.png -------------------------------------------------------------------------------- /assets/basic/05-drive-your-computer-1/encode.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/05-drive-your-computer-1/encode.webp -------------------------------------------------------------------------------- /assets/basic/05-drive-your-computer-1/gccinfo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/05-drive-your-computer-1/gccinfo.png -------------------------------------------------------------------------------- /assets/basic/05-drive-your-computer-1/processOfCoding.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/05-drive-your-computer-1/processOfCoding.png -------------------------------------------------------------------------------- /assets/basic/05-drive-your-computer-1/qq.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/05-drive-your-computer-1/qq.png -------------------------------------------------------------------------------- /assets/basic/05-drive-your-computer-1/qq2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/05-drive-your-computer-1/qq2.png -------------------------------------------------------------------------------- /assets/basic/05-drive-your-computer-1/software.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/05-drive-your-computer-1/software.png -------------------------------------------------------------------------------- /assets/basic/05-drive-your-computer-1/stdcpp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/05-drive-your-computer-1/stdcpp.png -------------------------------------------------------------------------------- /assets/basic/05-drive-your-computer-1/steam.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/05-drive-your-computer-1/steam.png -------------------------------------------------------------------------------- /assets/basic/05-drive-your-computer-1/steam2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/05-drive-your-computer-1/steam2.png -------------------------------------------------------------------------------- /assets/basic/05-drive-your-computer-1/steaminstall.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/05-drive-your-computer-1/steaminstall.png -------------------------------------------------------------------------------- /assets/basic/05-drive-your-computer-1/uninstall.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/05-drive-your-computer-1/uninstall.png -------------------------------------------------------------------------------- /assets/basic/05-drive-your-computer-1/workspace.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/05-drive-your-computer-1/workspace.png -------------------------------------------------------------------------------- /assets/basic/05-drive-your-computer-1/zsh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/05-drive-your-computer-1/zsh.png -------------------------------------------------------------------------------- /assets/basic/06-drive-your-computer-2/git-a-changed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/06-drive-your-computer-2/git-a-changed.png -------------------------------------------------------------------------------- /assets/basic/06-drive-your-computer-2/git-b-changed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/06-drive-your-computer-2/git-b-changed.png -------------------------------------------------------------------------------- /assets/basic/06-drive-your-computer-2/git-commited.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/06-drive-your-computer-2/git-commited.png -------------------------------------------------------------------------------- /assets/basic/06-drive-your-computer-2/git-graph-no-modified.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/06-drive-your-computer-2/git-graph-no-modified.png -------------------------------------------------------------------------------- /assets/basic/07-drive-your-computer-3/image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/07-drive-your-computer-3/image.png -------------------------------------------------------------------------------- /assets/basic/07-drive-your-computer-3/image2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/07-drive-your-computer-3/image2.png -------------------------------------------------------------------------------- /assets/basic/08-drive-your-computer-4/mail.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/08-drive-your-computer-4/mail.png -------------------------------------------------------------------------------- /assets/basic/08-drive-your-computer-4/steam-bing.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/08-drive-your-computer-4/steam-bing.png -------------------------------------------------------------------------------- /assets/basic/08-drive-your-computer-4/steam.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/08-drive-your-computer-4/steam.png -------------------------------------------------------------------------------- /assets/basic/09-drive-your-computer-5/Linux_command-line._Bash._GNOME_Terminal._screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/09-drive-your-computer-5/Linux_command-line._Bash._GNOME_Terminal._screenshot.png -------------------------------------------------------------------------------- /assets/basic/09-drive-your-computer-5/Vim-(logiciel)-console.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/09-drive-your-computer-5/Vim-(logiciel)-console.png -------------------------------------------------------------------------------- /assets/basic/11-linux-basic-2/image-20240831200902600.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/11-linux-basic-2/image-20240831200902600.png -------------------------------------------------------------------------------- /assets/basic/11-linux-basic-2/image-20240831201200824.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/11-linux-basic-2/image-20240831201200824.png -------------------------------------------------------------------------------- /assets/basic/11-linux-basic-2/image-20240831201443388.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/11-linux-basic-2/image-20240831201443388.png -------------------------------------------------------------------------------- /assets/basic/11-linux-basic-2/image-20240831202651295.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/11-linux-basic-2/image-20240831202651295.png -------------------------------------------------------------------------------- /assets/basic/11-linux-basic-2/image-20240831204242101.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/11-linux-basic-2/image-20240831204242101.png -------------------------------------------------------------------------------- /assets/basic/11-linux-basic-2/image-20240831205318293.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/11-linux-basic-2/image-20240831205318293.png -------------------------------------------------------------------------------- /assets/basic/11-linux-basic-2/image-20240831205502046.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/11-linux-basic-2/image-20240831205502046.png -------------------------------------------------------------------------------- /assets/basic/11-linux-basic-2/image-20240831205556924.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/11-linux-basic-2/image-20240831205556924.png -------------------------------------------------------------------------------- /assets/basic/11-linux-basic-2/image-20240831205619702.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/11-linux-basic-2/image-20240831205619702.png -------------------------------------------------------------------------------- /assets/basic/11-linux-basic-2/image-20240831205713350.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/11-linux-basic-2/image-20240831205713350.png -------------------------------------------------------------------------------- /assets/basic/11-linux-basic-2/image-20240831205748850.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/11-linux-basic-2/image-20240831205748850.png -------------------------------------------------------------------------------- /assets/basic/11-linux-basic-2/image-20240831205920758.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/11-linux-basic-2/image-20240831205920758.png -------------------------------------------------------------------------------- /assets/basic/11-linux-basic-2/image-20240831210030977.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/11-linux-basic-2/image-20240831210030977.png -------------------------------------------------------------------------------- /assets/basic/11-linux-basic-2/image-20240831210031979.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/11-linux-basic-2/image-20240831210031979.png -------------------------------------------------------------------------------- /assets/basic/11-linux-basic-2/image-20240831210119209.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/11-linux-basic-2/image-20240831210119209.png -------------------------------------------------------------------------------- /assets/basic/11-linux-basic-2/image-20240831215346761.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/11-linux-basic-2/image-20240831215346761.png -------------------------------------------------------------------------------- /assets/basic/11-linux-basic-2/image-20240831215713312.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/11-linux-basic-2/image-20240831215713312.png -------------------------------------------------------------------------------- /assets/basic/11-linux-basic-2/image-20240901002048261.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/11-linux-basic-2/image-20240901002048261.png -------------------------------------------------------------------------------- /assets/basic/11-linux-basic-2/image-20240901002109618.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/11-linux-basic-2/image-20240901002109618.png -------------------------------------------------------------------------------- /assets/basic/11-linux-basic-2/image-20240901002126326.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/11-linux-basic-2/image-20240901002126326.png -------------------------------------------------------------------------------- /assets/basic/11-linux-basic-2/image-20240901002156060.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/11-linux-basic-2/image-20240901002156060.png -------------------------------------------------------------------------------- /assets/basic/11-linux-basic-2/image-20240901002224900.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/11-linux-basic-2/image-20240901002224900.png -------------------------------------------------------------------------------- /assets/basic/11-linux-basic-2/image-20240901002317606.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/11-linux-basic-2/image-20240901002317606.png -------------------------------------------------------------------------------- /assets/basic/11-linux-basic-2/image-20240901002326909.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/11-linux-basic-2/image-20240901002326909.png -------------------------------------------------------------------------------- /assets/basic/11-linux-basic-2/image-20240901002358587.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/11-linux-basic-2/image-20240901002358587.png -------------------------------------------------------------------------------- /assets/basic/11-linux-basic-2/image-20240901002422584.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/11-linux-basic-2/image-20240901002422584.png -------------------------------------------------------------------------------- /assets/basic/11-linux-basic-2/image-20240901002516660.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/11-linux-basic-2/image-20240901002516660.png -------------------------------------------------------------------------------- /assets/basic/11-linux-basic-2/image-20240901002603682.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/11-linux-basic-2/image-20240901002603682.png -------------------------------------------------------------------------------- /assets/basic/11-linux-basic-2/image-20240901002654446.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/11-linux-basic-2/image-20240901002654446.png -------------------------------------------------------------------------------- /assets/basic/11-linux-basic-2/image-20240901002716229.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/11-linux-basic-2/image-20240901002716229.png -------------------------------------------------------------------------------- /assets/basic/11-linux-basic-2/image-20240901002730501.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/11-linux-basic-2/image-20240901002730501.png -------------------------------------------------------------------------------- /assets/basic/11-linux-basic-2/image-20240901002740664.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/11-linux-basic-2/image-20240901002740664.png -------------------------------------------------------------------------------- /assets/basic/11-linux-basic-2/image-20240901002844318.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/11-linux-basic-2/image-20240901002844318.png -------------------------------------------------------------------------------- /assets/basic/11-linux-basic-2/image-20240901002910526.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/11-linux-basic-2/image-20240901002910526.png -------------------------------------------------------------------------------- /assets/basic/11-linux-basic-2/image-20240901003303914.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/11-linux-basic-2/image-20240901003303914.png -------------------------------------------------------------------------------- /assets/basic/11-linux-basic-2/image-20240901003403670.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/11-linux-basic-2/image-20240901003403670.png -------------------------------------------------------------------------------- /assets/basic/11-linux-basic-2/image-20240901003411492.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/11-linux-basic-2/image-20240901003411492.png -------------------------------------------------------------------------------- /assets/basic/11-linux-basic-2/image-20240901003446957.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/11-linux-basic-2/image-20240901003446957.png -------------------------------------------------------------------------------- /assets/basic/11-linux-basic-2/image-20240901003459605.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/11-linux-basic-2/image-20240901003459605.png -------------------------------------------------------------------------------- /assets/basic/11-linux-basic-2/image-20240901003803015.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/11-linux-basic-2/image-20240901003803015.png -------------------------------------------------------------------------------- /assets/basic/11-linux-basic-2/image-20240901003953636.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/11-linux-basic-2/image-20240901003953636.png -------------------------------------------------------------------------------- /assets/basic/11-linux-basic-2/image-20240901003954815.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/11-linux-basic-2/image-20240901003954815.png -------------------------------------------------------------------------------- /assets/basic/11-linux-basic-2/image-20240901102451292.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/11-linux-basic-2/image-20240901102451292.png -------------------------------------------------------------------------------- /assets/basic/11-linux-basic-2/image-20240901102457715.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/11-linux-basic-2/image-20240901102457715.png -------------------------------------------------------------------------------- /assets/basic/11-linux-basic-2/image-20240901102849649.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/11-linux-basic-2/image-20240901102849649.png -------------------------------------------------------------------------------- /assets/basic/11-linux-basic-2/image-20240901103304129.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/11-linux-basic-2/image-20240901103304129.png -------------------------------------------------------------------------------- /assets/basic/11-linux-basic-2/image-20240901103513942.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/11-linux-basic-2/image-20240901103513942.png -------------------------------------------------------------------------------- /assets/basic/11-linux-basic-2/image-20240901104310783.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/11-linux-basic-2/image-20240901104310783.png -------------------------------------------------------------------------------- /assets/basic/11-linux-basic-2/image-20240901104405772.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/11-linux-basic-2/image-20240901104405772.png -------------------------------------------------------------------------------- /assets/basic/11-linux-basic-2/image-20240901104554049.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/11-linux-basic-2/image-20240901104554049.png -------------------------------------------------------------------------------- /assets/basic/11-linux-basic-2/image-20240901104740639.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/11-linux-basic-2/image-20240901104740639.png -------------------------------------------------------------------------------- /assets/basic/11-linux-basic-2/image-20240901105227418.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/11-linux-basic-2/image-20240901105227418.png -------------------------------------------------------------------------------- /assets/basic/11-linux-basic-2/image-20240901110107708.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/11-linux-basic-2/image-20240901110107708.png -------------------------------------------------------------------------------- /assets/basic/11-linux-basic-2/image-20240901112412132.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/11-linux-basic-2/image-20240901112412132.png -------------------------------------------------------------------------------- /assets/basic/11-linux-basic-2/image-20240901114423930.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/11-linux-basic-2/image-20240901114423930.png -------------------------------------------------------------------------------- /assets/basic/11-linux-basic-2/image-20240901114741910.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/11-linux-basic-2/image-20240901114741910.png -------------------------------------------------------------------------------- /assets/basic/11-linux-basic-2/image-20240901190226341.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/11-linux-basic-2/image-20240901190226341.png -------------------------------------------------------------------------------- /assets/basic/11-linux-basic-2/image-20240901194111878.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/11-linux-basic-2/image-20240901194111878.png -------------------------------------------------------------------------------- /assets/basic/11-linux-basic-2/image-20240901194931485.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/11-linux-basic-2/image-20240901194931485.png -------------------------------------------------------------------------------- /assets/basic/11-linux-basic-2/image-20240901200012668.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/11-linux-basic-2/image-20240901200012668.png -------------------------------------------------------------------------------- /assets/basic/11-linux-basic-2/image-20240901204654164.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/11-linux-basic-2/image-20240901204654164.png -------------------------------------------------------------------------------- /assets/basic/11-linux-basic-2/image-20240901204758261.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/11-linux-basic-2/image-20240901204758261.png -------------------------------------------------------------------------------- /assets/basic/11-linux-basic-2/image-20240901204840440.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/11-linux-basic-2/image-20240901204840440.png -------------------------------------------------------------------------------- /assets/basic/11-linux-basic-2/image-20240901205237955.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/11-linux-basic-2/image-20240901205237955.png -------------------------------------------------------------------------------- /assets/basic/11-linux-basic-2/image-20240901205346758.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/11-linux-basic-2/image-20240901205346758.png -------------------------------------------------------------------------------- /assets/basic/11-linux-basic-2/image-20240901210637302.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/11-linux-basic-2/image-20240901210637302.png -------------------------------------------------------------------------------- /assets/basic/11-linux-basic-2/image-20240901211038298.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/11-linux-basic-2/image-20240901211038298.png -------------------------------------------------------------------------------- /assets/basic/12-text-editing/latex1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/12-text-editing/latex1.png -------------------------------------------------------------------------------- /assets/basic/12-text-editing/latex4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/12-text-editing/latex4.png -------------------------------------------------------------------------------- /assets/basic/12-text-editing/latex5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/12-text-editing/latex5.png -------------------------------------------------------------------------------- /assets/basic/12-text-editing/latex6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/12-text-editing/latex6.png -------------------------------------------------------------------------------- /assets/basic/12-text-editing/latex7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/12-text-editing/latex7.png -------------------------------------------------------------------------------- /assets/basic/12-text-editing/purple_head.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/assets/basic/12-text-editing/purple_head.jpg -------------------------------------------------------------------------------- /basic/01-introduction.md: -------------------------------------------------------------------------------- 1 | # 前言 2 | 3 | > 快进来,找个位置随便坐! 4 | 5 | 欢迎阅读 LCPU Getting Started 系列教程配套 wiki! 6 | 7 | 本 wiki 由来自北京大学学生 Linux 俱乐部的一群志同道合的优秀成员协力编写,用于进行配套的校内活动。我们希望其能够为同学们介绍正确的计算机使用方式,同时也希望能够为不同层次的对于技术具有浓厚兴趣的同学的学习之旅提供有力的援助。 8 | 9 | ### 契机 10 | 11 | 对于相当一部分刚迈入大学生活的同学来说,第一次拥有属于自己的笔记本电脑,这无疑是令人兴奋的。然而,由于中学阶段相关课程的缺失,很多同学对于计算机的使用方式并不了解。而在大一开设的计算概论课程中,就要求部分同学从 Word,Excel,PowerPoint 都不一定熟练掌握的小白,转变为能够使用高级语言编写程序的学生,这无疑是一个巨大的挑战。 12 | 13 |
fly_b***h
14 |
骨感的现实
15 | 16 | 当然,事情总是在逐渐变好的。热心学长们编写了各环境下配置教程,信科也在新生教育阶段开设了计算机基础课,一定程度上弥补了这一缺失。 17 | 18 | 但我们仍然注意到,这样的“补丁”是零散的,有的不够系统全面,有的毫无针对性。同时,即使是有一定基础的同学,也会在学习技术的过程中遇到不同的问题,而这些知识往往在**课程中并不会涉及**。 19 | 20 | 受到 [The Missing Semester of Your CS Education](https://missing.csail.mit.edu/) 的启发,我们决定启动 LCPU Getting Started 系列教程的建设,希望能够将这部分内容更加系统地整理好,以便于同学们更好地学习与使用。 21 | 22 | ### 结构安排 23 | 24 | 我们将课程内容分为了入门、中级、进阶三大类。 25 | 26 | - 入门部分面向零基础同学,希望提供一个相对正确的学习路径,同时介绍基本的整个计算机的概念、体系,以及如何更加充分地使用计算机或其他设备。 27 | - 中级部分面向对计算机已有初步认识,并有兴趣深入了解的同学,较为全面地介绍 Linux 、软硬件知识以及部分工具的使用。 28 | - 进阶部分面向有一定技术基础的同学,拓宽同学们的技术视野,同时也为社团培养中坚力量,帮助感兴趣的同学更好地上手与参与社团项目共建。 29 | 30 | 目前仅有入门篇初步完成了建设。欢迎感兴趣的同学与我们共建 wiki! 31 | 32 | --- 33 | 34 | > 你当然可以即刻开始 Getting Started,不过笔者仍然强烈建议你花几分钟时间阅读下面的内容,这将有助于你更好地了解本部分的主体知识模块与学习路径。 35 | 36 | ### 入门篇 37 | 38 | 本部分主要分为五个板块。 39 | 40 | - 提问及知识获取,包含搜索引擎和大模型的使用,以及如何提问等内容。 41 | - 计算机知识概览,包含对于计算机软硬件及基本体系结构等的简要介绍。 42 | - 充分利用计算机,包含计算机的环境配置、文件版本控制、网络安全等多方面内容。 43 | - Linux 基础使用指南,包含虚拟机创建、环境配置以及部分常用操作等内容。 44 | - 文本编辑与写作工具,包含对于 Markdown, LaTeX, Typst, Beamer 等 pre 和论文写作时常用工具的介绍。 45 | 46 | 到此,如果你完整地学完了本部分的 wiki,你应该能对于计算机的基本概念有了一定的了解,从此计算机对你也不再是黑箱。当然,你对于大学期间所需要使用的最基本的技术与工具也应当不再陌生。更重要的是,你应当已经逐渐拥有了通过计算机**独立探索并解决问题**的能力。 47 | 48 | 那么,让我们开始吧! 49 | -------------------------------------------------------------------------------- /basic/02-searching-and-question.md: -------------------------------------------------------------------------------- 1 | # 搜索和知识获取 2 | 3 | ::: info 本文信息 4 | 作者:mt19937 5 | 6 | 状态:已审阅的发布版,审阅人:leavelet 7 | ::: 8 | 9 | ## 记号与约定 10 | 11 | 在本文中,所有的提示、练习及补充资料均以这样的形式出现: 12 | 13 | ::: info 示例 14 | 你来的真早! 15 | 16 | 在本文的写作中,笔者参考了许多网络上已公开的文章,均以补充资料的形式标注,在此向它们的作者表示由衷的感谢。 17 | 18 | 那就从这里开始你的 Getting Started 之旅吧! 19 | ::: 20 | 21 | ## 知识的获取 22 | 23 | ### 搜索引擎的选取 24 | 25 | 你得知大一开学的计算概论课上需要用到 Python 语言,于是你决定提前学习一下。你兴致勃勃地打开了浏览器,打开了熟悉的“度娘”,输入了 `Python`,然后点击了搜索。结果呢? 26 | 27 | ![baidu_python](../assets/basic/02-searching-and-question/baidu_python.png) 28 | 29 |
Baidu 搜索结果
30 | 31 | 搜索页面充斥着各种打着“正版网站”旗号的广告,官方网站甚至没能挤进首页!这显然不是我们想要的结果。 32 | 33 | **一个好的搜索引擎往往能提升你的查询效率**。所以,相较于 Baidu(或是更为小众的 360 搜索和搜狗搜索),笔者更推荐你使用[微软 Bing 搜索](https://www.bing.com)和 [Google 搜索](https://www.google.com)。 34 | 35 | 对于 Bing 搜索,你应该能够在页面顶端发现**国内版**以及**国际版**的选项。经过笔者测试,在使用国内版进行搜索时,仍然会出现少量的广告(国内:发自我的百度),但**官方网站通常能够出现在首页**。而在使用国际版进行搜索时,广告会更少,搜索结果也更为准确。 36 | 37 | 所以,如果你想要得到更好的搜索结果,同时你要搜索的信息**非中文社区独有**,在这两个版本间笔者更建议你使用后者。 38 | 39 | ![bing_python1](../assets/basic/02-searching-and-question/bing_python_1.png) 40 | 41 |
微软 Bing 搜索国内版结果
42 | 43 | ![bing_python2](../assets/basic/02-searching-and-question/bing_python_2.png) 44 | 45 |
微软 Bing 搜索国际版结果
46 | 47 | ::: tip 小贴士! 48 | 细心的你也许会发现,在使用 Bing 搜索时,地址栏上的网址并不是以 `www.bing.com` 开头,而是 `cn.bing.com`。而如果你能够访问 `www.bing.com`,得到的结果大概是这样的: 49 | ![bing_python_3](../assets/basic/02-searching-and-question/bing_python_3.png) 50 | 51 | 没有广告,官方网站直接出现在了首位,我们得到了非常不错的搜索结果! 52 | ::: 53 | 而对于 Google 搜索,如你所见,作为全球最大的搜索引擎,其搜索结果往往较为准确,直接且全面。 54 | 55 | 简言之,在条件允许的情况下,笔者推荐你优先使用 Google 搜索,其次是 Bing 搜索的国际版和国内版。 56 | 57 | ![google_python](../assets/basic/02-searching-and-question/google_python.png) 58 | 59 |
Google 搜索结果
60 | 61 | ::: tip 小贴士! 62 | 要更方便地使用 Google 搜索以及真正的 Bing 搜索,你也许可以在 [CS 自学指南](https://csdiy.wiki/) 的**必学工具**中找到一些更为优雅的方式。 63 | ::: 64 | 65 | ### 如何搜索? 66 | 67 | #### 关键词组合 68 | 69 | 在搜索时,你需要使用**关键词**进行组合来描述你的问题。关键词是搜索引擎用来匹配你的搜索内容的重要依据,它能够帮助你更快地找到你需要的信息。尽可能避免使用完整句子进行搜索,因为其往往可能包含多余的信息,导致搜索结果不够精确。此外,关键词搜索也可以更好地利用搜索引擎的算法优化网页。 70 | 71 | ::: info 举个例子! 72 | 比如你想解决“我最近一直睡不好,想知道有哪些方法可以帮助我改善睡眠质量,让我每晚都能有更好的休息”。这时候,你可以尝试使用关键词 `改善睡眠 方法 快速` 的组合,也许会搜索到更有效的信息。 73 | ::: 74 | 75 | #### 英文关键词 76 | 77 | 英文作为国际通用语言,使用英文关键词搜索能获取来自**全球范围内**的最新信息,而不仅仅局限于中文社区。尤其在技术、科学等领域,技术文档、编程教程、软件说明等都是以英文撰写,相关领域的最新研究和资料,也通常首先以英文发布。 78 | 79 | 即使你的英文水平没那么好,也可以通过翻译工具将你的问题翻译成英文,然后再进行搜索,进而获得更丰富、更全面的搜索结果。 80 | 81 | ::: tip 小贴士! 82 | 事实上,上面两条建议在绝大多数情况下都已经完全足够了。但若有需要,也可以尝试使用一些**高级搜索选项**。比如在搜索框中输入 `site:python.org`,这样你就可以只搜索 Python 官方网站上的内容了。 83 | 84 | 如果你对更多的高级搜索选项感兴趣,可以使用前文提到的两条建议查找相关资料。 85 | ::: 86 | 87 | > [!IMPORTANT] 试一试! 88 | > 89 | > The Book 几乎是学习 Rust 语言的必读书目。你能尝试找到其英文原版的官方网站主页地址吗? 90 | 91 | ### 信息平台 92 | 93 | #### 官方文档 94 | 95 | 如果你想要获取关于一个软件或者一门编程语言的信息,最好的地方往往是它的**官方文档**。官方文档通常包含了该软件或者编程语言的所有信息,包括使用方法、函数说明、示例代码等等。官方文档通常是最权威、最全面的,是你学习一个新技术的最佳选择。 96 | 97 | 一般而言,你可以在相应技术的官网上找到官方文档的入口。比如 Python 的官方文档就可以在 [Python 官网](https://www.python.org/) 上找到。 98 | 99 | 除此之外,很多 Linux 命令行工具带有丰富的 mandoc 文档,可以通过 man 命令查看。man 也含有关于 Linux 系统调用,POSIX 规范和其他杂项手册。比如输入 `man signal.7` 可以看到 Unix 信号的介绍,输入 `man signal.2` 可以看到 `signal()` 系统调用的相关信息,而输入 `man signal.3` 可以看到 POSIX 规范中 `signal()` 这个 API 的定义和用法。 100 | 101 | ::: tip 小贴士! 102 | man 的用法可以通过 man man 查阅。你可能会疑惑,在刚刚的例子中,最后的点后面的数字是什么意思,在读完 man 的用法之后相信你就明白了! 103 | ::: 104 | 105 | ![python_doc](../assets/basic/02-searching-and-question/python_doc.png) 106 | 107 |
Python 官方文档
108 | 109 | ::: tip 小贴士! 110 | 有一个古老而神圣的传统:如果你收到了类似 RTFM(Read The F\*\*king Manual)的回应,回答者认为你应该去搜索官方文档或使用手册。当然,**大概率他是对的,你应该去读一读**。 111 | 112 | 同样道理的还有 STFW(Search The F\*\*king Web)和 RTFSC(Read The F\*\*king Source Code)。 113 | 114 | 通常,用这几句话之一回答你的人会给你一份包含你需要内容的手册或者一个网址,这意味着你需要的信息非常容易获得。而往往你自己去搜索这些信息比直接告诉你答案,能让你学到更多。 115 | 116 | ::: 117 | 118 | > [!IMPORTANT] 试一试! 119 | > $\LaTeX$ 是在论文写作中非常常用的排版工具。你能尝试找到其官方文档的地址吗? 120 | 121 | > [!IMPORTANT] 试一试! 122 | > 123 | > 本 wiki 由 vitepress 强力驱动,你能尝试在其官方文档中找到如何修改右侧的目录栏吗? 124 | 125 | #### [Stack Overflow](https://stackoverflow.com/) 126 | 127 | ![stackoverflow](../assets/basic/02-searching-and-question/stackoverflow.png) 128 | 129 | **Stack Overflow**(意为 “堆栈溢出”) 是一个面向**计算机程序员**的问答网站。截至 2024 年 3 月,Stack Overflow 已收到了超过 2400 万个问题和 3500 万个答案。该网站和类似的编程问答网站在 2000 年代在全球范围内主要取代了编程书籍,作为日常编程参考,成为计算机编程的重要组成部分。 130 | 131 | 你可以在 Stack Overflow 上搜索到大量的问题和答案,这往往是程序员们在工作或学习中遇到的问题,相信能对你的技术学习之旅有所帮助。 132 | 133 | #### [GitHub](https://github.com/) 134 | 135 | ![github](../assets/basic/02-searching-and-question/github.png) 136 | 137 | **GitHub** 是一个在线软件源代码托管服务平台,允许开发人员创建、存储、管理和共享他们的代码。它使用 [Git](https://git-scm.com/) 软件,为每个项目提供 Git 的分布式版本控制以及访问控制、错误跟踪、软件功能请求、任务管理、持续集成和 Wiki。 138 | 139 | 你可以在 GitHub 上找到许多优秀的开源项目。一般而言,进入一个项目主页后,你可以通过查看 `Readme` 文件来快速上手如何构建或使用一个项目,同时也许可以在该文件中找到项目对应的官方文档地址和下载地址;你也可以在右侧的 `Releases` 选项中找到不同版本的安装包。当然,你也可以通过访问这些项目的 `Issues` 页面来查看其他人提出的有关该项目的问题和解答,这对你解决使用过程中遇到的问题非常有帮助。 140 | 141 | ::: tip 小贴士! 142 | 如果你对 Git 感兴趣,可以提前阅读入门篇的 [第六章](/basic/06-drive-your-computer-2)。 143 | ::: 144 | 145 | #### [知乎](https://www.zhihu.com/) / [博客园](https://www.cnblogs.com/) / [简书](https://www.jianshu.com/) / [Bilibili](https://www.bilibili.com/) 146 | 147 | 这是一些国内的问答社区、博客和视频平台。在这些平台上,你可以找到许多关于技术、编程、学习、生活等方面的问题和答案。当然,**时间距现在越近,获得的点赞或收藏数越多**的回答或视频往往更为准确、全面。 148 | 149 | #### [Wikipedia](https://www.wikipedia.org/) 150 | 151 | ![wikipedia](../assets/basic/02-searching-and-question/wikipedia.png) 152 | 153 | 相较于百度百科,**Wikipedia** 是一个更为全面、更为权威的网络百科全书,早已成为全球网络上最大且最受大众欢迎的参考工具书。你几乎可以在 Wikipedia 上找到关于任何事物的信息,包括历史、科学、技术、文化等等。 154 | 155 | 维基百科在性质上一如其号称般属于可自由访问和编辑的全球知识体,这也意味着除传统百科全书所收录的信息外,维基百科也能够收录**非学术但仍具有一定媒体关注度的动态事件**,这使得许多人也渐渐将维基百科视为新闻来源。同时,为方便一般学生或者浏览群众能够简单了解条目的内容,维基百科中的绝大多数条目都尽可能以简单的话语来解释复杂的概念。 156 | 157 | 当然,值得注意的是,这类百科类的信息平台往往允许较多用户编辑,破坏者能够轻易部分条目中添加虚假内容、删除正确信息或者任意添加偏见性内容。同时,不同语言版本的内容可能会有较大差异,质量也可能天差地别。你可以在阅读维基百科时**参考多个语言版本的内容**,以获得更全面的信息。 158 | 159 | 另外,你可能需要一些前文提到过的比较优雅的方式才能访问到这个网站。 160 | 161 | #### [W3Schools](https://www.w3schools.com/) 162 | 163 | ![w3schools](../assets/basic/02-searching-and-question/w3schools.png) 164 | 165 | **W3Schools** 提供了许多关于开发和编程语言的教程。这些教程涵盖了 HTML、CSS、JavaScript、SQL、Python、Java、PHP、C、C++、C#、Bootstrap、React、jQuery、XML 和 EXCEL 等多个方面。W3Schools 官网上免费提供原始代码示例及说明,其中大部分示例还可以在即时编辑器中进行交互式编辑与执行,非常适合初学者上手体验。 166 | 167 | 如果读起来有些费力,没关系!国内也有类似的平台在做着相同的事情。比如[菜鸟教程](https://www.runoob.com/),[W3School](https://www.w3school.com.cn/) 等,只是内容丰富度上相比 W3Schools 稍显逊色。 168 | 169 | #### [OI Wiki](https://oi-wiki.org/) / [CTF Wiki](https://ctf-wiki.org/) / [HPC Wiki](https://hpcwiki.io/) 170 | 171 | 学校每年都会举行 [PKU Campus](http://poj.openjudge.cn/)、[GeekGame](https://geekgame.pku.edu.cn/) 和 [HPC Game](https://hpcgame.pku.edu.cn/) 等比赛,这些比赛往往会涉及到算法、数据结构、网络安全、操作系统、并行与分布式计算等多个领域。在这些比赛中,上述三个 wiki 都是非常好的参考资料。 172 | 173 | 如果你正在被计概和数算课程困扰,或是对算法、CTF 或是 HPC 领域感兴趣,不妨来看看!这些 wiki 几乎都由在相关领域耕耘多年的现役/退役选手撰写,也许比授课老师们的 PPT 更有趣,也更容易理解。 174 | 175 | #### [CS 自学指南](https://csdiy.wiki/) 176 | 177 | 这是一本计算机专业相关知识的**自学指南**,包含了计算机科学、编程、网络安全、操作系统、数据库、分布式系统、机器学习等多个领域的优质课程推荐及资源指南。如果你觉得老师讲的不合你胃口,或是想要在课程之外更深入地学习某个领域,不妨来看看这本指南。 178 | 179 | --- 180 | 181 | 上文介绍了多个较为靠谱的问答平台与知识整合平台,但也只是冰山一角。值得注意的是,从各种平台获取的信息**不应盲目相信**。首先,这些信息未必准确,有的文章或问答可能已有十年之久,早已过时。其次,即使这些信息在当时是正确的,也仅仅解决了当时的特定问题,不一定完全适用于当前你所处的情境。 182 | 183 | 最直接也最简单的鉴别信息可靠性的方法是**亲自实践**。多尝试是快速解决问题的重要方法之一。如果无法进行尝试,则尽可能信任官方平台发布的信息。 184 | 185 | ::: tip 小贴士! 186 | 特别的,此处笔者并没有列举知名平台 [CSDN](https://blog.csdn.net/),这并不代表 CSDN 上没有好的文章,事实上笔者也有少部分问题最终在该平台上找到答案。但正如前文所述,**高质量的平台能够节约你鉴别信息的精力**。在笔者个人的使用体验中,在 CSDN 的铺天盖地的广告与付费低质量文章的夹缝中寻找答案,是一件相当痛苦的事情。 187 | ::: 188 | 189 | ## 提问的智慧 190 | 191 | “我所能收集到的信息都试过了,都没法解决问题,走投无路了,怎么办?” 192 | 193 | 这时候,你可以考虑大胆提问了! 194 | 195 | ### 在哪里提问? 196 | 197 | 除了向你熟悉的大佬“抱大腿”,你还可以尝试以下几种方式: 198 | 199 | #### 在前文提到的论坛或问答网站上发表帖子或提问 200 | 201 | 这是一个很传统也很有效的提问方式。你可以得到来自不同人的回答,这样你就有概率能够得到更多的帮助。当然,收集到的信息也相对良莠不齐,信息的价值需要自行甄别。同时,你的贴子和问答也会被其他人看到,一定程度上也可造福后人。 202 | 203 | #### 在 Github 上发 Issue 204 | 205 | 如果你在使用一个开源项目时遇到了问题,你可以尝试在该项目的 GitHub 仓库中发 Issue。这样,项目的维护者或是其他用户就能够看到你的问题,并给出可能的解决方法。事实上有时这可能并不是你的问题,而是项目本身出现了小小的漏洞。当然,这也一定程度上能够帮助到以后遇到相同问题的用户。 206 | 207 | #### 尝试在社群中提问 208 | 209 | 尝试加入一些技术社群,大胆提问,和社群中的人积极交流,也许你就能够得到解答,并增长见识。社群中的部分活跃成员往往有着丰富的经验,他们也许能够帮助你解决问题,或是给出更好的解决方案。 210 | 211 | 如果你还没有加入任何技术社群,欢迎加入**北京大学学生 Linux 俱乐部**!我们拥有着活跃的微信社群与 QQ 社群,且有相当一部分热心的成员解答群内的问题。如果你是校内同学,请邮件联系 [linuxclub@pku.edu.cn](mailto:),在确定你符合要求后,我们会将你拉入微信社群。如果你是校外同学,也欢迎加入我们的 [QQ 社群](https://qm.qq.com/q/LrcHgbpfqi)。 212 | 213 | #### 不妨问问看起来比你懂得多一些的 LLM? 214 | 215 | 稍安勿躁,后文会较为详细地介绍这一部分。 216 | 217 | ### 如何提问? 218 | 219 | 提问是一项非常重要的技能,既要让其他人能够快速了解你的现状与需求,又能让别人感受到问题的独特价值,同时保持适度的礼貌,**是一门艺术**。你需要注意许多细节,才能高效地提出一个好的问题。 220 | 221 | 这里笔者给出一些必要的建议: 222 | 223 | #### 展现出必要的礼貌与尊重 224 | 225 | ::: info 举个例子! 226 | “我电脑蓝屏了,谁能来帮修一下。” 227 | ::: 228 | 229 | 在寻求帮助时,礼貌和尊重是至关重要的。**没有人有义务解答你的问题**,解决问题也许会耗费不少的时间和精力,大多数人解答问题往往只是出于本能的善意。礼貌的表达不仅能促使他人更愿意帮助你,还能建立良好的沟通氛围。恰当地使用礼貌用语,避免使用命令式的语气,尊重对方的时间和专业知识,能使问题解决过程更顺畅、高效。 230 | 231 | #### 尽可能具体地描述你的问题 232 | 233 | ::: info 举个例子! 234 | “我的电脑不知道为什么蓝屏了,我今年刚上小学二年级,那能请你帮帮我吗?谢谢,谢谢。” 235 | ::: 236 | 237 | 即使拥有最真诚的语气,这样的问题也往往会让别人无从下手。蓝屏的可能原因有很多,而且不同的蓝屏信息也对应着可能截然不同的解决方案。如果你能够**更为具体地描述**你遇到的问题,比如蓝屏时的错误代码、蓝屏时的操作、蓝屏时的应用程序等等,那么别人就能更好地帮助你解决问题。 238 | 239 | #### 阐释你为解决该问题已经做出的尝试 240 | 241 | ::: info 举个例子! 242 | “我的电脑突然蓝屏了,我今年刚上小学二年级,我的蓝屏时候遇到的代码是 XXXXXXXX,正在直面天命的时候蓝屏了。那能请你帮帮我吗?拜托了,这对我来说真的很重要!谢谢,谢谢。” 243 | ::: 244 | 245 | 在提问时,你需要展现出你**已经尝试过的解决方案**,表现出你为了**自己解决自己遇到的问题所付出的努力**。一方面,如果自己能够解决问题,就省去了提问所带来的时间成本,也可以减少如同 STFW 这样的回复,带来好心情;另一方面,这样可以减少重复劳动,同时也能让别人更好地理解你的问题,从而给出更准确的解答。同时,提问也应该**尽量避免无关信息**的出现,描述简洁且直接。 246 | 247 | ::: info 举个例子! 248 | “我的电脑突然蓝屏了,我的蓝屏时候遇到的代码是 XXXXXXXX,是在游玩《黑神话·悟空》的时候突然蓝屏的。我上网搜索了代码相关的错误信息,尝试了网上可能有用的 A 方法和 B 方法,但都没有奏效。能麻烦你帮我看看吗?拜托了,非常感谢!” 249 | ::: 250 | 251 | 一个较好的提问诞生了! 252 | 253 | ::: tip 小贴士! 254 | 上述建议仅是笔者在有限篇幅内列出的认为最重要的几点建议。如果你此刻有些闲暇时间,笔者**衷心地建议**你阅读 [How To Ask Questions The Smart Way](http://www.catb.org/~esr/faqs/smart-questions.html) 一文。这是一篇关于提问的经典文章,其中包含了大量关于提问的技巧和建议。如果读起来有些费力,这里是一个版本的中文翻译:[提问的智慧 - LUG @ USTC](https://lug.ustc.edu.cn/wiki/doc/smart-questions/)。 255 | ::: 256 | 257 | ### 向大模型提问 258 | 259 | 随着人工智能技术的发展,大语言模型(Large Language Model, LLM)的出现为我们提供了一个全新的提问方式。对于许多知识性上的问题,得益于大模型的强大计算能力和海量数据,其往往能给出相对准确、全面的答案。 260 | 261 | 在当今时代,**大模型已经成为了获取知识的重要途径之一**,每一个人都应该学会如何更好地与 LLM 交流,以及将 LLM 作为自己的“助手”,为学习、工作与生活提供更多便利。 262 | 263 | #### 哪里找到好用的大模型? 264 | 265 | - [Github Copilot](https://copilot.github.com/) 266 | 267 | GitHub Copilot 是由 GitHub 和 OpenAI 联合开发的 AI 编程助手,为多种编程语言提供智能代码补全和生成。它集成于 VS Code、Neovim 和 JetBrains IDE 等,支持多种语言如 C++、Python、Rust 等,可以根据上下文为代码提供个性化建议。 268 | 269 | ::: tip 小贴士! 270 | 你可以通过过申请 [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**。 271 | 272 | 原因也很简单,正如 Copilot 的名字所暗示的,它只是一个“协作者”,而不是“替代者”。在学习编程的过程中,你需要自己动手,自己思考,自己解决问题,这样才能更好地掌握编程技能,你的水准才会超过 Copilot,才能利用 Copilot 提高效率,而不是被 Copilot 所限制。 273 | ::: 274 | 275 | - [OpenAI](https://www.openai.com/) 276 | 277 | 无需多言。你可以在 OpenAI 的官网上找到大量关于如何使用 OpenAI 的文档和教程。同时,你也可以在 [chatgpt.com](https://www.chatgpt.com/) 上体验 OpenAI 的大模型,如 `GPT-4o mini`。 278 | 279 | - [Azure](https://azure.microsoft.com/) 280 | 281 | 由于微软与 OpenAI 的关系,你同样可以在 Azure 平台上使用 OpenAI 的大模型。 282 | 283 | ::: tip 小贴士! 284 | Azure 几乎是目前所有商业云服务提供商中对于学生群体最为友好的一个。你可以在 [Azure for Students](https://azure.microsoft.com/zh-cn/free/students/) 中按照指示填写表单以获取**无需信用卡且只要在校即可不断刷新**的免费云服务(包括但不限于多台海外位置的服务器),以及每年 100 美元的 Azure 服务额度,可以用于购买包含 OpenAI Token、公网静态 IP 地址在内的多种服务,也容易实现个人对于 OpenAI 付费服务的免费使用。 285 | 286 | 另外,如果你在使用 Azure OpenAI 时遇到了配额不足的问题,可以访问[此链接](https://aka.ms/oai/quotaincrease)填写表单以申请提升配额。 287 | ::: 288 | 289 | - [Deepseek](https://deepseek.com/) 290 | 291 | 以极具竞争力的价格和较良好的性能脱颖而出。目前 Linux 俱乐部正在维护的[大模型网站](https://chat.lcpu.dev)就使用了 Deepseek。如你是社团成员,可以在社团社群获取密码后免费使用这个网站。 292 | 293 | #### 如何更好地与 LLM 交流? 294 | 295 | > 下文中的所有测试基于 GPT-4o 模型。 296 | 297 | ##### 具体性 298 | 299 | 与搜索时的建议截然不同,在与大模型交流时,笔者**不推荐**你采用关键词组合的方式。你需要**尽可能地详细且完整**地描述你的问题。同时,大模型也可以被用来指导你如何搜索与提问。当你有一个很模糊的问题无从下手,或许可以尝试向 LLM 提问,询问可能的探索方向。 300 | 301 | 同时,大模型目前基本上是“随机鹦鹉”,是一个好的 agent ,但并非是好的 solver。很多时候,你仍然需要自己思考,自己解决问题,而不是完全依赖 LLM。 302 | 303 | ##### 明确性 304 | 305 | 在与 LLM 交流时,你需要**尽可能明确**地表达你的问题。如果你的问题不够明确,LLM 也就不一定会给出正确的答案。 306 | 307 | ::: info 举个例子! 308 | 309 | Q:请你随机生成 10 个正整数并计算其中 2 的倍数和 3 的倍数的和。 310 | 311 | A:(省略……) 因此,2 的倍数的和是 70,3 的倍数的和是 78。 312 | 313 | 你会发现,LLM 给出的答案也许并不是我们想要的。这是因为**问题并不够明确**,LLM 无法准确判断我们需要的是 2 的倍数和 3 的倍数的和,还是 2 和 3 的倍数的和。 314 | ::: 315 | 316 | 如果有输出模式上的需求,你可以尝试给出一个示例,这对获得**特定格式的期望输出**非常有效。 317 | 318 | ::: info 举个例子! 319 | Q:请用“你说得对,但是原神是一款开放世界动作角色扮演游戏”的格式用一句话介绍你自己,使用第三人称。 320 | 321 | A:你说得对,但是这个 AI 是一个帮助人们查找信息和解答问题的人工智能助手。 322 | ::: 323 | 324 | ##### 简单化 325 | 326 | LLM 虽然收集了大量的数据,但他本质上还是一个“笨小孩”。稍显复杂的问题,可能会让 LLM 产生混乱,进而给出错误的答案。也许你可以试着将问题分解为**简单的几个小问题**,并在提示中逐一询问,这样往往能够更容易得到正确的答案。 327 | 328 | ::: info 举个例子! 329 | Q:请你随机生成 20 个正整数并计算其 中 2 的倍数 和 3 的倍数的数的和,生成整数时不要换行。 330 | 331 | A:生成的 20 个正整数是:3, 12, 25, 7, 18, 5, 21, 14, 8, 9, 30, 22, 11, 24, 17, 26, 33, 6, 27, 16。 332 | 333 | 2 的倍数有:12, 18, 14, 8, 30, 22, 24, 26, 6, 16。 334 | 335 | 2 的倍数的和是:12 + 18 + 14 + 8 + 30 + 22 + 24 + 26 + 6 + 16 = 176。 336 | 337 | 3 的倍数有:3, 12, 18, 21, 9, 30, 24, 33, 6, 27。 338 | 339 | 3 的倍数的和是:3 + 12 + 18 + 21 + 9 + 30 + 24 + 33 + 6 + 27 = 183。 340 | 341 | 2 和 3 的倍数的总和是:176 + 183 = 359。 342 | 343 | 你发现它没有去除 6 的倍数!我们尝试**把问题分解**,再次询问: 344 | 345 | Q:请你随机生成 20 个正整数,先找出其中是 2 的倍数或是 3 的倍数的数,再计算他们的和,生成整数时不要换行。 346 | 347 | A:生成的 20 个正整数是:15, 26, 33, 7, 18, 5, 21, 14, 8, 9, 30, 22, 11, 24, 17, 27, 32, 6, 28, 16。 348 | 349 | 2 的倍数或 3 的倍数有:26, 33, 18, 21, 14, 8, 9, 30, 22, 24, 27, 32, 6, 28, 16。 350 | 351 | 这些数的和是:26 + 33 + 18 + 21 + 14 + 8 + 9 + 30 + 22 + 24 + 27 + 32 + 6 + 28 + 16 = 314。 352 | 353 | 完全正确!LLM 出色地完成了任务! 354 | ::: 355 | 356 | ::: tip 小贴士! 357 | 你可以在 [提示工程指南](https://www.promptingguide.ai/zh) 中获取更多相关的知识。 358 | ::: 359 | 360 | --- 361 | 362 | 以上就是本节的所有内容了!希望你能够从中获得帮助。在亲身实践中获得更多收获吧! 363 | -------------------------------------------------------------------------------- /basic/03-computer-basic-knowledge-1.md: -------------------------------------------------------------------------------- 1 | # 计算机基本知识概览 I 2 | 3 | ::: info 本文信息 4 | 作者:000lbh AnterCreeper 5 | 6 | 状态:已审阅的发布版,审阅人:AnterCreeper 000lbh 7 | ::: 8 | 9 | ## 软件与硬件 10 | 11 | 什么是软件?什么是硬件?相信刚接触计算机的同学也不会不清楚这个问题,我们在这里并不打算给软件和硬件一个正式的定义,而是通过举例介绍各种软件和硬件,从而使得同学们获得一个直观的认识。 12 | 13 | ### 硬件 14 | 15 | 各位刚刚接触计算机的同学可能还没有来得及拆开过你心爱的计算机。没关系,我们为大家提供了一些图片,同时通过这些图片进行介绍。 16 | 17 | #### 计算机 18 | 19 | 计算机,顾名思义,做计算的机器。 20 | 长久以来,人们日常生活中,到处都需要计算,但不得不手工完成,耗费大量心智。 21 | 于是,神降临了世界,从天间盗取了圣火。 22 | 伟大的图灵,在众人面前伸手于虚无中画了个圈,曰,我有一圣物,这些问题都可以被我的机器求解! 23 | 从此,自动化的机器极大地解放了人类。人类从此有了一个判定基准,先衡量一个问题是否属于图灵可计算,如果是,就可以从裤兜里掏出图灵机,盘之。 24 | 开天辟地,计算机这门学科诞生。计算机,一个魔力的机器,一个让人又爱又狠的机器。无数后身工程师为之努力奋斗、脱发明志,为之痴迷,为之疯狂! 25 | 26 | ![Turing](/assets/basic/03-computer-basic-knowledge-1/Turing.jpg) 27 | 图 1. Alan Turing (23 June 1912 – 7 June 1954), from wiki 28 | 29 | #### 冯诺依曼架构 30 | 31 | 尽管有了原理,此时天地昏暗,依然看不见光明。 32 | 冯诺依曼,跟着神的指引,构筑了世间万物。 33 | 他具体提出的是这样一种实现形式,由运算器、控制器、存储器、输入输出设备组成。 34 | ![Von Neumann Architecture](/assets/basic/03-computer-basic-knowledge-1/Von_Neumann_Architecture.svg) 35 | 36 | 从 1945 年(1946 年 2 月 14 日对外公布)第一台计算机 ENIAC 诞生,到今天移动手机(也是一种计算机),计算机依然也基于这个架构进行设计。 37 | ![ENIAC](/assets/basic/03-computer-basic-knowledge-1/ENIAC.jpg) 38 | 图 2. ENIAC, 包含了万余电子元件,重达 27 吨,占地 167 平方米。运行起来耗电 150 千瓦,有传言说,每当这台计算机启动的时候,费城的灯都变暗了。 39 | ![iPhone](/assets/basic/03-computer-basic-knowledge-1/IPhone_6.png) 40 | 图 3. iPhone 6, 发布于 2014 年 9 月。其采用了 A8 处理器,20nm 制程,包含约 20 亿晶体管。 41 | 42 | 计算机就像一个数据计算加工的工厂,控制器有条不紊根据一条条指令控制处理器中的各个状态,指挥数据的搬运和计算,并与各类外设进行交互。 43 | ![Von Neumann Machine](/assets/basic/03-computer-basic-knowledge-1/Von_Neumann_Machine.png) 44 | 45 | #### CPU 46 | 47 | CPU 是整个计算机的核心,承担着运算和控制的功能。CPU 从存储设备中读取代码和数据,尽管现代处理器对代码和数据会有不同的处理,但是其本质上并没有严格的区分。代码由一条一条的指令组成,CPU 按照顺序一条一条执行从存储设备中读取的指令(至少从软件和程序员等使用者的视角看是这样),指令可以是修改 CPU 的状态,进行运算,或者是从其他硬件读取信息或者输出信息。 48 | 49 | ![Intel 8086](/assets/basic/03-computer-basic-knowledge-1/Intel_C8086.jpg) 50 | 图 4. 这是 Intel 8086 处理器,和现在的处理器“长相”很不一样,但是你案头的计算机用的处理器很可能与之兼容(除非你是新版 Apple 或者你自己知道你用的不是 x86 架构的处理器)。图源自 wiki,获 CC BY-SA 授权 51 | 52 | 目前市面上的处理器拥有很多种不同的 ISA(Instruction Set Architecture),ISA 定义了程序员如何使用 CPU,如处理器有哪些指令、指令编码方式和功能、寄存器的大小数量和功能、怎么寻找和读取数据、能暂存多少数据、每个暂存的数据有多大、数据存放的顺序如何等等各种约定,并不是指令的简单集合。一般来说,为其他 ISA 编译好的程序是不能够直接在当前 ISA 上运行的,需要转译,或者(在有源代码的情况下)重新按照当前 ISA 进行编译。同学们在下载软件时,也要注意 ISA 的信息。下面是一些常见的 ISA: 53 | 54 | - x86: 最经典最常见的 ISA,同学案头计算机的处理器基本都基于此,历史兼容性好(低情商:历史包袱重) 55 | - ARM: 移动端(包括手机)常见的 ISA,不管是苹果还是遥遥领先,处理器都使用该 ISA。苹果 M 系列处理器也使用该 ISA 56 | - RiscV: 新兴的开源 ISA,嵌入式设备中有使用,由于其设计比较简单,易于阅读和学习,学校也喜欢用于教学 57 | - Loongarch: 一个国产自主设计的 ISA 58 | - 还有其他诸如 MIPS、PowerPC 等架构不再赘述 59 | 60 | 现代的 ISA 一般都设计保护功能。保护功能提供不同的模式,在特权模式下,代码有对处理器和硬件的(几乎)完全的控制权;而在非特权模式(用户模式)下,代码只能控制有限的资源,进行“安全”的操作,而其他操作需要通过切换到特权模式完成。同时,ISA 提供了虚拟内存的功能,也就是将物理内存地址(也就是下文将提到的“存储空间的编号”)映射到虚拟地址,并设置访问权限。此时用户模式的程序员看到的是一片连续的地址空间,这样可以简化程序设计,同时提供安全隔离。 61 | 62 | ::: info 历史的注记 63 | Intel 常年为 x86 的丑陋感到自卑。有一天在 HP 的“蛊惑”,联合开发了一个全新的 64 位架构 IA64 以图改变命运,处理器代号为安腾(Itanium)。该架构具有很多让人眼前一亮的特性,然而与之前 Intel 的 x86 完全不兼容。而 AMD 选择开发了与之前 x86 架构兼容的 AMD64 架构,迅速抢占市场份额。由于安腾落后的性能和开发速度,市场表现不佳,因此转而采用 AMD64 架构,或者更中立的名称,x86-64 架构,而安腾逐渐被历史淘汰。 64 | ::: 65 | 66 | #### 内存 67 | 68 | 这里说的内存是 RAM(Random Access Memory),断电丢失数据的随机存储器。然而在不同语境下,内存也可以指下文中的“硬盘”,请注意区分。 69 | 70 | 内存是处理器 CPU 能够直接访问到的数据存储器。面向使用的程序员,内存被简化抽象为一个个存储单元,每个存储单元大小一个字节,或者说 8 比特,也就是 8 个数字 0 或者 1,每个存储单元都有唯一编号,就像一个浩大的图书馆,在每个书架每个特定的位置存放着图书,并有编号。CPU 就和我们找书的过程一样,通过编号,从内存拿出对应存储单元中的数据或者向存储单元写入数据。而随机存储器中“随机”的意思是不论拿什么编号来找数据,所需时间总是差不太多的。与之相对的是顺序存储器,比如磁带(后文有介绍)。 71 | 72 | 内存访问速度比其他外部存储要快,但是随着处理器的发展(由几 MHz 如 8086 的 5MHz 发展至几 GHz),内存速度的提升却跟不上处理器速度提升的步伐。今日从内存中找一个数据所需的典型时间内处理器大约能执行上百条指令,因此在离得更近的处理器内部引入了高速缓存。关于这一点,我们将在本章节第二部分讲述。 73 | 74 | ![DRAM](/assets/basic/03-computer-basic-knowledge-1/DRAM.jpg) 75 | 图 5. 一根台式机内存条,来自尔必达(日本),后为镁光公司收购。由于单颗内存芯片性能和性价比受限,故而将若干颗内存芯片并列组装成一个条形的内存模块。 76 | 77 | ::: info 历史的注记 78 | 你知道吗?历史上 Intel 早期是一家内存制造公司。后因与日本的公司竞争不利,随转向处理器制造。 79 | 关于内存的发展历史,曾有不少滔天巨浪。此提供若干关键词供感兴趣的人进一步了解: Rambus 之战, 奇梦达 80 | ::: 81 | 82 | #### 硬盘 83 | 84 | 有时候也被称作“内存”或者“外存”(是不是有些混乱?),不过你只需要记住我们这里讲的是断电数据不丢失的可以反复改写的存储设备即可。 85 | 86 | 目前市面上主要有两种硬盘,一种是机械硬盘 HDD,里面有一组极为平滑如镜子一样的硬质盘片,表面有磁性物质,旁边有若干磁头,背面则有电路和芯片进行控制。机械硬盘工作时,盘片高速运转,电路控制磁头由于旋转带动的气流从而悬浮在盘片表面(仅有几十纳米甚至更小!)通过磁场读写其中的内容。由于这种机械的旋转结构导致其对振动较为敏感(剧烈的撞击极易导致磁头撞击盘片表面从而损坏磁介质,产生坏道),严忌于其工作时摔碰。 87 | 88 | 另一种是固态硬盘 SSD,里面没有高速运转的机械结构,取而代之的是闪存芯片和控制电路,在闪存芯片内部有大量的单元通过捕获电荷来存储信息。固态硬盘具有较为明确的寿命特点,其写入次数有限(个人日常使用的实际寿命并不一定比机械硬盘差,各有优缺),且由于电荷流失,长时间不通电时不能保证数据稳定(jedec 标准为在 TBW 寿命耗尽后断电下仅能保持 1 年,不过相较实验数据,实际情况都更为糟糕)。为了最大化固态硬盘寿命,其一般有较为复杂的控制电路,保证写入均匀地发生在固态硬盘的不同部位,也因此在异常断电等情况下也更容易发生损坏。 89 | 90 | 一般来说,固态硬盘较贵,速度较快,抗振动辐射,而机械硬盘较为廉价,但速率较低,不过相对固态硬盘数据存放稳定性较好。他们二者都是优秀的大容量存储媒介。不过总之,重要数据应该做好备份,硬盘有价,数据无价。 91 | 92 | ![HDD](/assets/basic/03-computer-basic-knowledge-1/Laptop-hard-drive-exposed.jpg) 93 | 图 6. 机械硬盘内部结构。图源自 wiki,获 CC BY-SA 授权 94 | ![SSD](/assets/basic/03-computer-basic-knowledge-1/SSD.jpg) 95 | 图 7. 固态硬盘内部结构。左 SandForce 标志芯片为主控,负责与主机通讯以及管理和读写右侧 6 颗闪存颗粒内的数据。图源自 wiki,获 CC BY-SA 授权 96 | 97 | ::: warning 注意 98 | 由于固态硬盘为了平衡擦写的特点,其引入了 FTL 映射表,用于将用户存储的位置(逻辑地址)和实际物理上闪存内部位置(物理地址)之间建立映射,于此同时数据被交叉分布在各个颗粒之间,在读取的时候可以并行从而极大地提高了传输速度,通道数量越多,传输速度越快,于此同时管理更复杂,可靠性更低。换言之,固态硬盘内数据都是以碎片形式存在的。 99 | 如果你在比较早的时候接触过或者从长辈口中听说过“磁盘碎片”这回事,请注意,固态硬盘不需要整理磁盘碎片。 100 | ::: 101 | 102 | #### 其他你可能听说过或没有听说过的存储设备 103 | 104 | - U 盘: 较为简化的一种固态硬盘,通过 USB 接口与主机连接,性能较弱,主控结构比较简单,所以可靠性不佳,用于临时的数据搬运 105 | - 存储卡: 也是一种固态硬盘,接口为移动插拔做了优化 106 | - 光盘: 在闪存时代前常见的存储设备用于交换数据(如 Windows 安装光碟),一般只能写入一次,存储容量在几百 M 到几十 G 不等。内部有一层薄介质,通过激光在上面进行刻蚀或由母盘压制而得,并通过反射读取信息 107 | - 软盘:更古董的设备,一个薄磁性塑料软片,故名软盘,存储容量在几百 KB 至几 MB 左右 108 | - 磁带:一圈一圈卷起来的塑料磁性软带,因此读取写入只能顺序进行,意味着找数据的时候需要倒带到指定位置,时间和倒带的距离成正比(非常非常非常慢)。曾经用于存储音频,后被用于长时间归档巨量数据,需要特定的仪器和环境,维护成本高。 109 | 110 | #### 常见存储设备对比 111 | 112 | | 种类 | 单盘最大容量 | 密度 | 容量/价格 | 单盘带宽 | 延迟 | 可靠性 | 维护成本 | 113 | | ------- | ------------ | ---- | ---------- | --------- | ------- | ------ | -------- | 114 | | HDD | 24 TB | 中 | 8 GB/RMB | 300 MB/s | 10 ms | 高 | 低 | 115 | | SSD | 60 TB | 极高 | 2 GB/RMB | 6000 MB/s | 50 μs | 中 | 低 | 116 | | Blu-ray | 100 GB | 低 | 5.5 GB/RMB | 35 MB/s | 100 ms | 很高 | 中 | 117 | | Tape | 18 TB | 极高 | 45 GB/RMB | 750 MB/s | loooong | 很高 | 极高 | 118 | 119 | #### 存储层次结构 120 | 121 | 存储器有很多种类,速度、容量单价、稳定性都各有不同。根据其响应速度,存储器可被划分为多级结构: 122 | 123 | ![Memory Hierarchy](/assets/basic/03-computer-basic-knowledge-1/ComputerMemoryHierarchy.svg) 124 | 图 8. 存储器层次结构示意图,公有领域作品 125 | 126 | 处理器中的寄存器,通常用于存储计算中的临时数据,随取随用性能要求极高,因此使用的晶体管非常多,同时其单位容量价格自然也是十分高。 127 | 128 | 在寄存器和内存中间,一般还存在多级缓存。高速缓存由硬件自动管理,对一般程序员不可见。常用的数据将被放入速度快很多的缓存中。但由于其仍然占用了不少宝贵的芯片面积,故缓存单位容量的价格也比较高,目前个人计算机缓存的容量普遍在数十 MB 以内。 129 | 130 | 内存参照前文,不再赘述。 131 | 132 | 以上三种存储都属于易失性存储(volatile),也就是断电后数据将会在短时间内消失。而其中前两种存储是静态随机存储,意味着在通电状态下其状态可保持不需要进行刷新,但制造所需晶体管较多。而后者为了实现更大化地存储,通过电荷存储在一个个微小的电容中,故只需要一个晶体管,但其随着时间电荷会逐渐流失导致数据丢失,因此需要每几个毫秒对每个存储单元都进行刷新操作,故称为动态随机存储。 133 | 134 | ::: details 局部性原理 135 | 你可能会想问,缓存为什么能够在程序员不参与的情况下完成内存访问的提速,这就涉及到一个重要的概念:局部性原理。这个原理主要说的是,一个程序在总是倾向于访问最近访问过的存储单元或者与之相邻的存储单元,缓存可以据此将最近访问过的存储单元放入自身当中,或者预测将要访问的存储单元,将其提前放入自身当中。当然这种预测并不会百发百中,而基于缓存的工作原理,提升自己程序的局部性,是改善程序性能的一个好方法。 136 | ::: 137 | 138 | #### GPU 139 | 140 | ![GPU](/assets/basic/03-computer-basic-knowledge-1/GTX980tiFE.jpg) 141 | 图 9. Graphics Processing Unit, 也叫做显卡,有独立显卡和集成显卡两种,前者以一种通过 PCIe 接口连接的扩展卡或直接独立集成在主板(通常存在于笔记本或者一体机内)的形式存在,而后者直接存在于处理器 SoC 内部(故名集成)。 142 | ![GPU_Internal](/assets/basic/03-computer-basic-knowledge-1/GPU_Teardown.jpg) 143 | 图 10. 一张独立显卡内部(图源自 TechPowerUp,图中显卡型号为 RTX4090),包含居中镜面的硕大的 GPU 核心,供电电路(一相包含一个电感以实现降压,通常每一相大致提供 20A~40A 左右。图中有 26 个电感(通常制作成方形的,体积较大比较明显),故可以粗略估计出该卡大致峰值允许的功耗在 500W 左右)和围绕着核心的若干个显存芯片(通常称为显存颗粒,图中为 12 个,每个位宽 32bit 即 32 根数据线,合计 12\*2=24GB 大小 384bit 位宽)用于存储图像和计算数据。最左侧是四个视频输出接口,底部金色的 PCIe 接口接触点(通常成为金手指)插入主板上的插槽,与 CPU 相连。 144 | 145 | GPU 用于图形处理加速和视频输出(因此如果使用独立显卡输出,显示器视频线需要连到显卡的接口,而不是主板上的),同时包含了各类专用的加速单元(见第二章详细介绍)。(省流:可以用来玩原神) 146 | 后用于大规模并行计算,如 AI,科学计算等等。虽然 GPU 的计算能力远远大于 CPU,但是各自特色分明: CPU 擅长控制和逻辑,单核处理能力强得多,适合各种通用的场合; 而 GPU 仅适用于并行且逻辑简单的计算,以其独特的架构取胜。 147 | 148 | ::: info 显卡与 GPU 149 | 严格来说,GPU 是显卡上面主要的计算芯片,也可集成在 CPU 中,但是人们经常混用两个概念,我们在此也不严加区分。 150 | ::: 151 | 152 | #### 主板 153 | 154 | 将各种硬件连接在一起,形成一个电路系统,为主芯片的工作提供各类条件支持(如供电降压,数据的传输,机械支撑,芯片工作顺序的控制等),提供固件进行硬件自我检查和系统初始化,保存各个硬件的配置等。 155 | 156 | ![Notebook Internal](/assets/basic/03-computer-basic-knowledge-1/Notebook_Internal.jpg) 157 | 图 11. 一台笔记本电脑内部,上部蓝色主板上集合了若干各式功能的组件 (笔者自摄) 158 | 159 | ::: info 历史的注记 160 | 早年的计算机各个部件都是一个个独立的芯片,如 8086 是控制器和运算器,8087 芯片实现浮点计算的功能,8089 芯片则提供接口的功能,以及 82 系列的若干个功能芯片。后随着时代发展,这些功能被整合至一整个芯片上,称为 SoC(System On Chip, 片上系统)。 161 | ::: 162 | 163 | #### 电源 164 | 165 | 为各类电子元件提供电力。CPU 和 GPU 核心的工作电压通常很低,只有 1V 左右,比一节干电池的电压还来得低,但是工作电流很高,有几十至上百 A。其他辅助芯片的电压通常也只需要 5 V 以内的直流供电。但是一般家庭供电是 220 V, 50 Hz 交流,因此需要此模块进行逐级降低,提供工作所需的大电流低电压。 166 | 167 | #### 外设 168 | 169 | 外设种类众多,提供计算机对外的数据接口,如有线或无线网卡可以使计算机连接到以太网,鼠标、键盘、显示器和声卡是人机交互的接口,而众人熟知的 USB 接口是各类外部设备与计算机进行交互的标准实现。设备种类众多,此处不一一赘述。 170 | 171 | Peripheral Component Interconnect Express,简称 PCI-E,官方简称 PCIe,由早年的 PCI 接口演变而来。是计算机总线的一个重要分支,用于 CPU 系统与其他设备比如 GPU、网卡、固态硬盘的连接,也可以延伸到芯片组间的连接,其最大特点是标准化,模块化和可移植性,一个显卡或网卡可以插入不同的电脑均可自动正常运作。 172 | 173 | 从 2003 发布 PCIe 1.0 至如今,PCIe 速率有着大幅进步,由 1.0 的 2.5GT/s,2.0 的 5GT/s 至 3.0 达到 8GT/s,4.0 则高达 16GT/s。 174 | PCIe 由电源,一些辅助信号和若干条 Lane 组成,不同的 Lane 间数据并行传输,提高了传输速率。一个 Lane 由两根线组成,其之间相互电磁耦合,有效降低信号干扰和外部的电磁噪声,从而实现了极高的传输速率(参见双绞线以了解其物理原理)。GT/s 代表一条链每秒钟传输 16G 次,每次一条链估算近似能传送 1bit(8 个比特组成一个字节),故对于一个 PCIe 4.0 x4 的固态硬盘,其最大传输速率大致为 16GT/s\*4lanes/8bit=8GB/s。 175 | 176 | ### 软件 177 | 178 | 软件根据其功能不同也可以分为很多种,有一些软件是直接跟硬件打交道的,而另一些软件则直接跟用户打交道。前者包含操作系统和硬件驱动程序,而后者是我们平时使用的各类应用程序。另外,人们发现,各类软件有很多功能是相同的,于是人们开发了各种各样的“库”这个软件,为各个软件公用。 179 | 180 | #### 保护和抽象 181 | 182 | 现代 ISA 都提供保护的功能。保护的功能主要是限制对资源的访问,比如虚拟内存技术,低权限的程序只能看到设定好范围的物理内存空间的内容,且是否可以修改,是否可以作为代码执行(回想冯诺依曼架构的内容,代码和数据并没有严格区分)也受到控制。除此之外,处理器提供了特权指令,如访问外部设备,修改保护权限,改变处理器工作模式等等,这些指令的使用也必须受到限制。 183 | 184 | 绝大部分的保护都会至少分为两种操作模式,一种叫内核模式(有时候也叫超级用户、特权模式、系统态、核心态、管态等),一种叫用户模式(也叫目态等),部分 ISA 还提供更多操作模式(比如 x86 提供权限从高到低 r0-r3 四个模式,但是主流操作系统只使用 r0 和 r3 两个模式,RiscV 提供机器、系统和用户三个模式)。简单理解,内核模式下,程序拥有对硬件软件资源(几乎)全部的访问权限;而用户模式下程序可进行的操作则受到限制,但是允许通过预先定义的接口,通过内核模式下的程序授权完成需要特权的操作。 185 | 186 | 保护的功能既保护了整个计算机系统不受无意编写有缺陷程序和部分恶意编写的程序的破坏,也能更方便地提供抽象。比如操作系统借助硬件提供的虚拟内存技术,让应用程序拥有完整的虚拟地址空间,应用程序不再需要关心自己被加载到内存的哪个部分,只需要让操作系统完成地址映射和转换即可;又比如操作提供统一的文件访问接口,让应用程序不论是读写硬盘,读写软盘还是读写磁带都只需要使用统一的文件读写接口即可完成。 187 | 188 | ##### 进程 189 | 190 | 一个进程(Process)包含了一个程序运行的全部状态和属性。这也是冯诺依曼机的核心思想,当你获得了程序在内存以及寄存器中的状态也就得到了一切。一个例子是休眠,计算机可冻结并将内存写回硬盘并关机,随后在下次开机后恢复,维持原先的程序运行。 191 | 操作系统对各个进程分配资源,相互隔离并不断地进行时分复用(硬件上存在一个可编程的计时器每隔固定的间隔触发中断将处理器控制权交由操作系统),以实现一个系统上同时进行多任务(早期的如 DOS 系统只能同时进行一个程序)。 192 | 193 | ##### 线程 194 | 195 | 线程(Thread)是轻量级的进程,一个进程可建立多个线程子程序任务同时执行。一般进程具有处理器和内存地址的隔离,而一个进程下的线程仅有处理器的隔离,虚拟内存地址是共用的,不同线程之间的通信成本要比进程之间小很多。 196 | 197 | ##### 例外 198 | 199 | 例外(Exception),有些时候翻译为异常(此处异常通常指代 abnormality,对于硬件系统中通常异常不等于错误),通常后者称呼使用更多(后续使用异常这一称呼)。 200 | 通常异常的产生代表的是发生了一些例外情况,因此往往也代表着移交控制权,可以发生在硬件层面,也可以发生在软件层面。 201 | 硬件层面的异常通常包含有: 202 | 203 | 1. 来自硬件的中断(Interrupt),比如键盘按下了一个键,或外设如网卡已经获取数据并已将其写入了内存,随后发出中断令处理器切换至相应的处理程序进行响应; 204 | 2. 陷阱(Trap),包括调试陷阱,以及来自软件主动请求的系统调用(以前也称软件中断)。前者可用于程序的调试(或者程序运行中对某些状态进行捕获),而后者目的通常是向 OS 发出某些请求如打开文件等; 205 | 3. 故障(Fault),通常是可以恢复的,也可能是有意为止的,可由硬件,也可由软件造成,发生后将调用内核内的故障处理程序处理并随后回到现场继续执行原先的代码,如发生了缺页,除法除数为 0,硬件发生了故障等,在不能处理时也会导致程序终止; 206 | 4. 终止(Abort),也就是不可以恢复的严重问题,比如机器检查(一般是严重的硬件错误导致)、双重故障(也就是在处理故障时发生了另一个故障,一个简单的例子是缺页处理程序被交换出去,导致发生缺页时找不到缺页处理程序,从而发生另一个缺页故障)等。 207 | 208 | #### 操作系统概述 209 | 210 | 操作系统的核心部分以及部分硬件驱动程序运行在内核模式下,为上层的各类用户软件提供了对各种资源,比如处理器、内存、网络、各种外部设备如打印机等的统一抽象和管理,使得大部分应用程序在大部分不同的硬件上都能正确、安全、高效地运行,简化了应用程序员的工作,同时也将不同资源进行隔离,尽可能防止有缺陷或者恶意的程序影响其他程序运行。 211 | 212 | 部分几乎被所有软件使用的库、与内核进行通信并提供人机交互的管理程序等运行在用户模式的程序也被视为操作系统的一部分,而且这部分程序占据的比例不小,和操作系统内核一道进行资源的抽象和管理。 213 | 214 | 总的来说,操作系统就是一个管理者,为上层应用提供资源和服务,根据其权限和当前系统资源利用情况处理上层应用的请求。 215 | 216 | ::: details 用户模式程序能让整个系统崩溃吗 217 | 有些人可能被不负责任地告知,使用 C 语言的指针非常危险,因为可以对内存任意位置读写,进而导致整个系统崩溃。实际上这对于大部分程序(尤其是初学者写的程序)而言是不正确的,因为其运行在用户模式下,并没有权限读写任意内存,发生这种情况下时,程序只会因为触发保护例外(例外的概念后面有介绍)而终止。 218 | 219 | 但是这种情况确实存在。第一,早期部分操作系统保护支持不完善;第二,高权限的应用程序滥用权限可以合法地让系统崩溃(甚至是主动触发崩溃);第三,程序总是有漏洞的,而部分漏洞可以用于使系统崩溃,甚至可以进行权限提升,执行任意代码等等。 220 | 221 | 没有绝对的安全,但是可以通过及时打补丁,避免不必要的授权(有些人觉得 Windows 的 UAC,也就是“以管理员运行”的弹窗非常烦人,进而把它禁用,这是非常不可取的)等方式,使得攻击面最小化,进而减少被攻击的可能。 222 | ::: 223 | 224 | 下面我们着重介绍 Windows 操作系统和 Linux 操作系统。 225 | 226 | #### Windows 227 | 228 | Windows 是微软公司开发的图形化操作系统,具有成熟的图形界面。同学们个人计算机日常使用的系统很可能就是 Windows(苹果用户除外)。Windows 系统较为庞大,里面很多组件在日常使用中完全用不到,甚至是以一种历史包袱的形式存在。不过正因为如此,很多老旧的将近 20 年前的 Windows 软件仍然能在最新的系统中正常运行。 229 | 230 | #### Linux 231 | 232 | 从 1991 年 Linus 宣告 Linux 的存在,到 2024 年,Linux 已经走过 30 多个年头。下面是 Linus 向社区宣告 Linux 存在的邮件(尽管当时还没有名字): 233 | 234 | ```plain 235 | Hello everybody out there using minix - 236 | 237 | I'm doing a (free) operating system (just a hobby, won't be big and 238 | professional like gnu) for 386(486) AT clones. This has been brewing 239 | since april, and is starting to get ready. I'd like any feedback on 240 | things people like/dislike in minix, as my OS resembles it somewhat 241 | (same physical layout of the file-system (due to practical reasons) 242 | among other things). 243 | 244 | I've currently ported bash(1.08) and gcc(1.40), and things seem to work. 245 | This implies that I'll get something practical within a few months, and 246 | I'd like to know what features most people would want. Any suggestions 247 | are welcome, but I won't promise I'll implement them :-) 248 | 249 | Linus (torv...@kruuna.helsinki.fi) 250 | 251 | PS. Yes - it's free of any minix code, and it has a multi-threaded fs. 252 | It is NOT protable (uses 386 task switching etc), and it probably never 253 | will support anything other than AT-harddisks, as that's all I have :-(. 254 | ``` 255 | 256 | 严格来说,Linux 只是一个“操作系统内核”,并没有包含用户态的程序,而一般来说,一个完整的操作系统需要包含用户态的一些基础设施,比如供更上层应用程序使用的库函数,以及用于管理其他软件和硬件,但不必放进内核态的程序。目前说 Linux 操作系统,一般指的是基于 Linux 内核衍生的各大发行版。大多发行版采用了来自 GNU 这个组织制作的各类辅助基础设置,故全名为 GNU/Linux。各种 Linux 发行版为 Linux 内核配置了一系列用户态程序,这样才能构成一个完整的操作系统。 257 | 258 | 在本章剩余部分,如未特别提及所述对象为 Linux 内核,Linux 即指以 Linux 为内核的操作系统。 259 | 260 | 与 Windows 内核(名字是 NT 内核)不同,Linux 内核并不直接提供图形界面,只提供了最基本的各个接口,Linux 发行版的图形界面属于用户态程序,且是选配的。因此对于一个不需要图形界面的服务器,完全可以省下这一笔空间。与 Windows 不同,在 Linux 发行版中,Linux 内核和系统的其他组建完全都是由一个个软件包组成的,如果你不需要某个功能,完全可以将相应的软件包移除。也可以用其他功能类似的软件包替换某个软件包。系统具有高度可定制性。 261 | 262 | Linux 是一种类 Unix 操作系统,API 符合 POSIX 标准。 263 | 264 | ::: details 历史的注记:微软与 Linux 265 | 微软在 21 世纪初将 Linux 称作“癌症”,认为 Linux 侵犯了知识产权,试图在客户中培育对 Linux 的恐慌,并以专利威胁起诉 Linux 开发者。然而十年后,微软表示“We love Linux”,可能是因为 Linux 在服务器市场占有率已经很高了。不过,由于微软曾经和网景和 Sun(Java)上"Embrace, extend, and extinguish"的 3E 战略垄断扼杀的黑历史,大家依然对微软的举动保持警惕。 266 | ::: 267 | 268 | ::: details 历史的注记:蓝屏死机 269 | Windows 有一个臭名昭著的“功能”————蓝屏死机,Blue Screen of Death,非常的生动形象(:。这是 NT 内核在遇到不可恢复的错误时产生的错误提示信息,系统将进行冻结并重启把正在进行的事情搞砸(我论文还没保存呢!),由于蓝色色调本身较冷,以及早期 Windows 给人以不稳定的印象,这个界面因此变得声名狼藉。而对于 Linux,这个情况被称为 panic。Linux 内核并不会出现蓝屏,一方面是 Linux 的错误分级相对良好,驱动常年迭代更新,在一些不重要的错误情况(注: 曾经有过某些 Windows 驱动开发者为了便于调试,在任何错误的条件下使用蓝屏的手段以导出状态进行调试。这一特性被继承到了实际用户手上)下允许内核“带病运行”(这不一定是好事),另一则是由于 Linux 无法直接提供图形界面,因此内核错误信息只显示在非图形界面的终端上,使用图形界面的用户只能看到大写锁定键的灯光一直闪烁,看不到任何提示信息。最近 Linux 内核开发者试图在内核严重错误时绘制一个黑色界面,并展示一个二维码作为错误提示信息。 270 | ::: 271 | 272 | #### 其他操作系统 273 | 274 | - macOS: 苹果专用,符合 POSIX 标准的 Unix 系统,老版本可在 Intel 机器安装(需要魔法),内核叫 Darwin,修改自 BSD 系内核,内核部分开源 275 | - FreeBSD: 符合 POSIX 标准的类 Unix 系统,和 Linux 只是内核不同,FreeBSD 带有完整的用户态程序,同时其采用更宽松的许可协议,而不是 Linux 的 GPLv2。 276 | - MSDOS: 古老的操作系统,无图形界面,已不使用,微软近期开源了几个版本的 DOS。FreeDOS 则是由其他志愿者实现的开源版本替代。 277 | 278 | #### 移动操作系统 279 | 280 | 没错,你的手机上也是有操作系统的 281 | 282 | - Android: Google 开发的基于 Linux 内核的操作系统,Google 自己在上面开发了 AOSP 一套基础设施环境。 283 | - iOS: 苹果公司的产品,2007 年随 iPhone 横空问世,基于 Darwin 内核开发,封闭性较强。 284 | 285 | #### 应用程序 286 | 287 | 操作系统大部分情况下只充当资源的管理者,具体的任务还需要更上层的程序依靠操作系统提供的抽象和功能完成。 288 | 289 | ##### 桌面程序与命令行程序 290 | 291 | 有些程序有漂亮的图形界面进行人机交互,有些程序则只处理字符流的输入输出。这两种程序分别被成为桌面程序和命令行程序。详细介绍请看后续课程讲义。 292 | 293 | ##### 库 294 | 295 | 操作系统当然也可以使用库,但是大部分库都为应用程序所使用,因此这一小节放在了应用程序下面。 296 | 297 | 之前提及,很多代码是被大量重复使用的,这些代码被做成了库。库作为一种特殊的应用程序,在各种平台上面被广泛使用。库可以是以源代码形式或者封装好的机器码的形式存在。库可以是在程序编译时一同编译并连接,也可以是提前编译好,并在程序编译后以静态或者动态的方式与程序链接在一起。 298 | 299 | #### 程序的执行 300 | 301 | ##### 机器码与汇编 302 | 303 | 先前已经提过,处理器是一条一条执行机器码的,而直接使用机器码编写程序,工作量非常大,目前应该已经彻底没有这么做的意义了。 304 | 305 | 比机器码稍微高一点的抽象就是汇编语言,汇编语言大体上和机器码呈现一一对应的关系。汇编语言为每一类指令操作分配了一个助记符,例如在 x86 架构下,用于将一个操作数复制到另一个地方的指令就被分配了 `mov` 这么一个助记符,而用于两个操作数相加的指令就被分配了 `add` 这么一个助记符。同时每个指令还有参数,比如 `mov` 指令就有两个参数,一个参数指示复制的目的地,一个参数指示复制的来源。把汇编语言翻译成机器码的过程叫做汇编,而与之相反的过程则叫做反汇编。 306 | 307 | ##### 编译 308 | 309 | 汇编语言功能强大,但是书写起来令人头疼,因此人们开发出了各种高级语言。除了极个别需要进行特殊的架构相关优化,或者执行特殊的指令的的场景,很少有手写汇编的机会,但是为了分析程序出现错误或者性能不佳的原因,需要程序员能够阅读汇编语言。为了执行高级语言编写的代码,有两种思路: 310 | 311 | - 将高级语言预先翻译成汇编语言,再翻译成机器语言,交付执行 312 | - 预先制作一段叫做解释器的程序,在处理器之上再自行维护一套状态,解释器一行一行读取高级语言源代码,根据源代码改变维护的状态,并进行操作 313 | 314 | 使用这两种思路的高级语言分别被叫做编译型语言和解释型语言,后续章节会有介绍。 315 | 316 | ##### 链接 317 | 318 | 以编译型语言为例,一段源代码要得到执行,首先需要经过编译和汇编,得到机器码。这还不够,我们还需要一个链接的过程。你可以把链接视为编译的一环,但是由于链接本身处理过程并不像“翻译”,更像“查找”和“填表”。你可能会问,我就一个源程序,链接是和谁“链接”?别忘了,如果你写的是用户模式的应用程序,你是极大概率会用到库函数的,此时链接就是链接到了这些库函数,将你原来生成的机器代码中对这些库函数的引用查询并填写上正确的地址。除此之外,链接也处理整个程序在内存中的放置位置,修改各处内存引用等。 319 | 320 | ##### 可执行文件 321 | 322 | 在冯诺依曼机内,数据和指令均被存储在磁盘内。为了存储这些这些信息,将其抽象为一个个文件,比如有的储存图片,有的储存程序,有的储存文字信息。每一类信息,都可以一种或多种文件格式保存在电脑存储中。 323 | 程序代码也是以一种文件的形式存储,称为可执行文件,具有其特定的储存编码方式,记录了程序启动的方式和环境需求。Windows 中其格式被称为可移植可执行文件(PE),而 Linux 下则称为 ELF(Executable and Linkable Format)。PE 格式也被用于 EFI 程序和 vmlinuz(压缩的 Linux 内核镜像)封装。 324 | 当执行可执行文件时,操作环境(比如 bash 或者 Windows 资源管理器 explorer.exe)会请求 OS 读取该文件并加载准备所需的环境(如创造进程,准备文件描述符,准备虚拟地址空间并建立映射,进行动态链接等)。 325 | 326 | ##### 动态链接 327 | 328 | 为了节省空间,动态链接的技术被发明。比如 Windows 中你应该见过很多后缀名是 `.dll` 的文件,Linux 下也有很多后缀名是 `.so` 的文件,macOS 中也有后缀名是 `.dylib` 的文件,这些都是动态链接库。动态链接可以发生在使用库的程序被加载时,操作系统按照程序预先提供的信息动态地将二者链接在一起;也可以可以是程序运行之后借助操作系统提供的功能自己按需进行链接。 329 | 330 | 动态链接可以很好地提升程序的灵活性和可扩展性,很多软件的插件以动态链接库的形式提供。 331 | 332 | 关于动态链接库相关错误的排除,请看后续讲义故障自查相关章节。 333 | 334 | ##### 程序的加载与结束 335 | 336 | 对于应用程序,你现在可以启动它了。操作系统会先进行一系列包括权限在内的检查,然后加载程序到内存,可能还需要进行动态链接,然后跳转到指定的第一条指令开始不断运行,直到程序因为非法操作被系统夺回控制权并强行结束,或者程序通过系统提供的接口主动退出为止。 337 | 338 | ::: details 例子 339 | 当你在一台笔记本上播放 PPT 的时候,按下空格键,计算机发生了什么? 340 | 341 | 键盘是由一个矩阵网络实现,嵌入式控制器每隔几 ms 进行扫描,以查看有哪些键被按下。此时,它发现了变化,随后其产生了一个信号经过一系列组件,最终到达 CPU 产生了一个外部中断(同时在一个寄存器内记录了这个中断的来源,每种来源都有一种代号)。 342 | 343 | 当处理器未设置屏蔽时,处理器便进入异常状态。首先,处理器将进入内核态,也就是将控制权转交给操作系统内核。CPU 将自动记录下一刻要执行的位置,随后跳转到中断入口程序(其位置通常是操作系统和硬件互相约定的,操作系统启动时将中断处理程序写入该位置)。 344 | 其将保存程序运行的中间状态到内存,进入等待调度程序的队列,根据寄存器中记录的外部中断的来源代号跳转到相应的程序进行处理。 345 | 346 | 哦!程序在 EC 内部的寄存器里查到了,原来是按下了空格键。于是,他到表格里查一查,发现一个名为 PowerPoint.exe 的程序,在等待空格键(处于阻塞睡眠状态)。随后操作系统将其唤醒,PowerPoint 发现收到了一个空格键,随后执行了翻页的动作,刷新屏幕生成动画,然后接着进入睡眠。 347 | 操作系统正是不断地从等待调度的队列取出进行程序的调度,恢复、执行、冻结,周而复始。 348 | ::: 349 | 350 | 而操作系统代码的执行,请看下一节“开机”: 351 | 352 | #### 开机 353 | 354 | 当你给你心爱的电脑插上电源,按下开机键,会发生什么事情? 355 | 356 | 通常,我们称计算机的启动过程为 BOOT,来自于一个单词 BOOTSTRAP(靴子)。 357 | BOOTSTRAP 的意思是 靴带,来自短语:“Pull oneself up by one’s bootstrap”——用靴带将自己拉起来 358 | 359 | 通常在 CPU 或南桥(一个用于辅助 CPU 的芯片,包含了大量低速外设的控制逻辑)中存在着一个极其简易的待机控制电路,其只要在插上电后便会获得电源供应就会运转起来,等待外部的各种信号。 360 | 当按下开机键的时候,信号经由嵌入式控制器传送至电源控制电路,随后其将启动内部的振荡器为 CPU 的工作提供时钟信号,并将 CPU 复位线以及外设复位线置位(在随后的 Advanced 教程中会具体说明),并启动主板上的电源降压单元。当降压单元稳定后其会输出 PWRGD(POWER GOOD)信号通知其取消 CPU 复位,CPU 开始进入工作状态。 361 | CPU 刚启动的时候,CPU 将从固定的位置内获取第一条指令,该地址被映射到 BIOS 芯片,通常是一颗容量在几 MB 至几十 MB 的闪存。 362 | 363 | ![BIOS](/assets/basic/03-computer-basic-knowledge-1/BIOS.jpg) 364 | 图 12. 图中为来自华邦公司的 25 系列 SPI NOR Flash,型号 W25Q32BVSIG,容量 32Mbit,存有 BIOS 程序 365 | 366 | 首先 BIOS(Basic Input Output System,基本输入输出系统)程序将进行称为自检(POST,Power On Self Test)的过程,第一步是进行内存的初始化,因为现在的 BIOS 程序功能非常的复杂,自己就是一个小型操作系统(如可以联网,甚至可以通过 HTTP 下载文件)。 367 | 因为此时内存尚未就绪,CPU 将使用内部的高速缓存作为临时的数据存放的地方为初始化的程序所使用。CPU 将根据内存上的一颗 SPD 存储器的信息,进行训练和学习寻找合适的电气参数(如内存频率和时序等)以保证数据可以正确的在 CPU 和内存之间传输,随后将高速缓存修改为正常工作模式。 368 | 369 | 随后将进行 CPU 的功能的一些初始化(如调节 CPU 的电压或频率,以及一些功能的启用或关闭),以及检查显卡、磁盘等关键设备是否存在功能异常,并进行一个最基本的,能用就行的初始化。当上述检查和初始化发生错误,或者无法找到合适的参数,程序将操控主机上的 LED 灯珠(如某些主板上具有 DEBUG 灯,或者使用硬盘或电源指示灯)或者通过蜂鸣器(一种迷你的喇叭)的声响发出警告。 370 | 当初始化完毕,主机 LOGO 也就能够显示在屏幕上,随后对各个磁盘进行搜索操作系统的引导程序(其将依次启动内核和操作系统各个必要的服务程序,并进行更高层次的硬件各个功能的初始化和复位,如更高级的电源管理功能,其也通常是与操作系统相关),并根据启动顺序进行启动,将控制权交由操作系统。 371 | 372 | #### 软件的许可 373 | 374 | 软件著作权也是知识产权的一种,受到国内外著作权法的保护。通常,软件的授权分为两种模式,一种是保留所有权利,限制源代码的取得和分发(这样授权的软件暂且称为专有软件);另外一种是附条件开放源代码的取得和分发(这样授权的软件暂且不太严谨地叫做开源软件)。在使用软件时,一定要注意软件的授权模式,避免侵权。对于保留所有权利的软件,注意不要与他人分享软件副本、激活码等信息;而对开放源代码获取和分发的软件,一般都可以自由分发其副本,这些软件一般也不会有“激活码”等反盗版技术保护措施。但是如果你需要基于这些软件的代码开发衍生软件,则需要注意: 375 | 376 | - 一般都需要保留原作者的署名和版权声明 377 | 378 | - 对于以 GPL 等 Copyleft 性质的许可证授权的软件,你的代码也需要以同样或者符合原来许可证规定的许可证开源。这种特性也被称为传染性。 379 | 380 | ::: warning 盗版软件 381 | 一般来说,不按照授权的方式使用软件就可以算盗版软件。你可能因为经济原因或者看垄断大公司不爽,或者是单纯因为自己技术高超,而使用盗版软件。但是需要注意的是,使用盗版软件存在法律风险,同时,网上来路不明的盗版软件可能还会带来安全风险(尽管正版软件商有时候也会干一些见不得人的勾当)。因此请尽量避免使用盗版软件。如果经济条件等不允许,可以使用开源软件替代品。本系列教程也不会有关于盗版软件的任何教程和推荐,如果读者发现,欢迎提出,我们将会立即修改或删除。 382 | ::: 383 | 384 | ::: details 自由软件运动与 Copyleft 385 | 有一些人认为,把软件变为私有财产,会阻碍技术交流,导致很多重复工作,不利于技术的进步(很多反对著作权法的声音也是类似的观点)。在上个世纪八十年代,开启了一场自由软件运动,提出了“四项基本自由”,致力于自由软件的传播与发展。自由软件运动并不是反著作权 Copyright,反而是借助了著作权相关法律的力量,推出了 Copyleft 类型的许可证。这种许可证授予被授权者充分的自由,唯一不允许做的就是把软件变为不自由的软件,前面提到的“传染性”就保证了这一点,即自由软件的衍生软件必须还是自由软件。 386 | 387 | 最开始,微软为代表的大公司极力阻碍自由软件运动。尽管 Linus 本人并不是自由软件运动的信徒,但是他领导的 Linux 内核项目使用了 GPL v2 许可证,也是自由软件。尽管商业化运作并不符合自由软件运动的初衷,开源并不意味着不能做商业。许多商业公司会使用更宽松的许可证,如 MIT 许可,由于其不限制衍生作品需要使用相同的许可证,因此可以保证商业公司能借助来自社区的代码力量,完善自己的专有软件产品。同时也有一些公司使用双重授权,由于许可证是版权所有者与被授权者的协议,因此同一个软件自然可以用不同的许可证发布。一些软件对于社区免费提供以 Copyleft 模式授权的软件,而对于准备开发专有软件的开发者,则收费提供另一套不允许传播源代码,但是没有 Copyleft 许可证“传染性”的授权。 388 | ::: 389 | 390 | ## 计算机网络 391 | 392 | 我们这辈人生活在一个高度信息化的时代中,自打记事开始,很多人就知道网络,并且经常在网上进行查找资料,聊天视频,联机游戏等活动。那么计算机网络究竟是如何组织起来的呢?我们这篇文章将做一些简要的介绍 393 | 394 | ### OS/I 七层模型 395 | 396 | ```plain 397 | -------------- 398 | | 应用层 | 7 399 | -------------- 400 | | 表示层 | 6 401 | -------------- 402 | | 会话层 | 5 403 | -------------- 404 | | 传输层 | 4 405 | -------------- 406 | | 网络层 | 3 407 | -------------- 408 | | 数据链路层 | 2 409 | -------------- 410 | | 物理层 | 1 411 | -------------- 412 | ``` 413 | 414 | 目前基本不再使用 5、6 层的说法,按照 OS/I 的定义和现在的实际情况,5、6 层功能被 4、7 层包含。各层具体的作用我们以后再提。 415 | 416 | ### TCP/IP 协议 417 | 418 | TCP 和 IP 协议分别工作在上述模型的第四层和第三层,IP 协议为世界上每一个能连入全球互联网的设备分配一个地址,同时提供不可靠的包交换服务。数据包指的是一段长度有限(但不总是固定)的数据,不可靠的包交换意思是把数据包从出发地传送到目的地,但是不保证包按照顺序到达,不保证有且仅有一个包到达,不保证包内容正确。 419 | 420 | 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,但是这样会存在很多不方便的地方。 421 | 422 | > [!IMPORTANT] 练习 423 | > 114.514.1919.810 是不是有效的 IPv4 地址? 424 | 425 | 目前正在快速普及的 IPv4 的后继者是 IPv6,其地址由冒号分隔的 16 进制组成,长度是 128bit。如果地址中存在连续多项 0,可以用两个冒号替代,但是只能替代一次。下面是一些 IPv6 的地址示例: 426 | 427 | ```plain 428 | ::1 429 | 240c:c001:1014:4a3a:22f7:cb5f:88e2:219d 430 | fe80::b7bf:964:d695:708d 431 | ``` 432 | 433 | IPv6 资源丰富很多,基本不会存在枯竭问题。 434 | 435 | TCP 是在 IP 之上的协议,利用 IP 协议提供的不可靠数据传输,为上层提供流式的端到端可靠数据传输。端口号是在这一层协议定义的。TCP 协议存有状态,必须先双方三次交互建立连接,每个数据报文对方都要确认,报文都带有编号和校验码,确保报文正确按顺序到达。TCP 不能保证服务质量,比如传输速率。 436 | 437 | ::: details UDP 协议 438 | 与 TCP 同层还有 UDP 协议。UDP 协议不提供可靠传输服务,无状态,适合对数据准确性要求不高但是追求数据快速到达的场景,也适合上层实现别的可靠传输协议。 439 | ::: 440 | 441 | ::: info 提示 442 | 指定端口号的地址,IPv4 可以写作 127.0.0.1:8080 这种形式,IPv6 可以写成 [::1]:8080 的形式。 443 | ::: 444 | 445 | ### DNS 协议 446 | 447 | DNS(Domain Name System)协议是用于解析域名信息的协议。我们在日常上网的过程中,由于 IP 地址过于抽象难记,经常会使用类似于 `pku.edu.cn` 这样的域名,DNS 就是将域名转化为 IP 地址的服务。DNS 服务从点分隔的域名的最后一部分开始查找,整个查找过程先向系统预设的 DNS 服务器查找最后一部分 `cn`,返回 `cn` 域名的服务器,然后向 `cn` 域名的服务器继续询问 `edu`,直到整个域名解析完成,得到最终的 IP 地址。实际情况下,有时候 DNS 服务器会直接返回下一级域名服务器作为结果,也有时候会代替你继续查询,直接返回给你最终的结果。 448 | 449 | ::: info 提示 450 | 以前国内的网络运营商默认提供的 DNS 有时会遭到污染,进行植入广告等操作,这时候你可以自行更换 DNS 地址,你可以在互联网上查询到关于如何更换以及更换为哪些声誉较好的 DNS 服务的信息。 451 | ::: 452 | -------------------------------------------------------------------------------- /basic/04-computer-basic-knowledge-2.md: -------------------------------------------------------------------------------- 1 | # 计算机基本知识概览 II 2 | 3 | ::: info 本文信息 4 | 作者:AnterCreeper 5 | 6 | 状态:经初步审阅的草稿,审阅人:000lbh 7 | ::: 8 | 9 | ## 前言 10 | 11 | 过去,现在,与可见的未来, 12 | 从人类第一台通用电子计算机,到今日的个人手机移动设备,物联网设备与云计算和数据中心, 13 | 计算技术发生且依然在继续发生翻天覆地的变化。 14 | 在历史长河中,人们发明了各种各样的技术,正是这样的创新,对计算机的高速发展作出了巨大的贡献。 15 | 不过,这些技术,留存到现在的,不多。 16 | 很多技术,在历史的长河中被淘汰。 17 | 18 | 然而,对于技术本身的态度,从人角度出发的一种价值评价,应当是谨慎和辩证的。 19 | 我们应当认识到: 20 | 21 | 1. 任何的陈述是片面的,有条件的。因此价值评价也是如此。 22 | 2. 实践是检验的唯一标准,但检验是有限的,条件是运动变化的。因此不能穷尽。 23 | 24 | 一些技术,过去算力不够,无法实现,因为条件不足被淘汰了。但是随着时间变化,时机成熟,又成功了。 25 | 或是,一些技术在一些领域里效果不理想,但在其他领域则大放光彩。 26 | 甚至另有一些技术,效果优异,但是由于势力和话语权较弱,或是商业不成功,最终被其他技术利益集团抹杀了。 27 | 没有一项技术能够解决万事万物,技术成功的条件因素众多,而其条件在不断的发生变化,而某些时候这种变化是较为反直觉的。 28 | 因此进行价值评价,应当认识到其存在的这些特点。 29 | 30 | ## 衡量计算机的指标——面向最终交付的评价 31 | 32 | ### 能耗与功耗 33 | 34 | 今天,对于几乎所有类型的计算机,电力是工程师面对的最大挑战。 35 | 对于一个桌面和服务器处理器,其工作电流可达到几十 A 至几百 A 不等,而对于移动端最高亦有十几 A,因此芯片管脚的电流密度很高。 36 | 而另一点,处理器运行产生的热量需要耗散,以维持芯片正常工作温度。 37 | 38 | 能耗和功耗的定义,读者应当是很容易回答的: 功耗是芯片单位时间消耗的电能,而能耗是芯片消耗单位电能完成的工作量。 39 | 在比较处理器之间的价值,后者指标似乎更好,对于手机与笔记本电脑,我们希望续航更久;而对于数据中心,我们希望相同一度电能创造更多价值。 40 | 而对于前者,功耗通常被作为计算机设计的约束条件,在各类场景下,其有着不同的数值。如对于手机,过高的功耗会导致手机过热从而使消费者不适,并影响其他组件寿命。 41 | 而对于个人电脑和服务器,其散热条件具有能力上限(如水冷比风冷散热能力更强,因此可以选用功耗更高的处理器),主板降压配电能力也有上限,芯片工作不应当超越这些约束条件,否则造成设备损毁。我们需要仔细区别这两个概念。 42 | 43 | 而一种更直观的理解,计算机是消耗电力的印钞机,电源一插,黄金万两,因此为了能产出更多的钱,我们的期待实际上是期望其消耗更多电能印更多的钱,印钱速度越高越好。但实际情况一是这一能力具有上限,二是二者的曲线具有非线性的特点,也就是具有边际效益。 44 | 45 | ::: details 处理器的热效应 46 | 通常芯片一部分功耗以如驱动信号这样的形式耗散,而剩余绝大多数功耗以热量形式散失。 47 | 常常我们能见到 TDP(热设计功耗)这个概念,其代表了在较长的持续时间下,为实现处理器能够持续运作在基础频率,需要满足的散热条件,是芯片功耗的平均预算。 48 | 产生的热量的吸收和传播需要一定时间,而芯片又往往不是长时间运行在最高负荷的情况,因此发明了睿频技术,允许在温度还不是很高的时候(实际上温度越低,芯片运行速度更快,因此有极客通过液氮冷却超频以追求最高性能),在瞬时的一些情况下通过增加电压增加功耗(相当多,很不节能!)的方式提高一瞬时的运行速度,从而降低了延迟提高了响应速度(如在一台闲置的电脑上打开 Office),改善用户体验。 49 | 通常处理器制造时会产生一些缺陷,于是导致某些处理器运行的速度较慢或不能运行,因此制造厂家为了减少损失对处理器的运行频率进行限制(也叫锁倍频。对于 Intel 处理器,没有锁倍频的通常会标有 K 字母,允许用户修改使处理器运行在任何频率下)且增加一定的电压(某些核心不仅不能运行的更快,在相同频率下也比其他核心需要更高的电压,因此体质不同的处理器功耗也存在一些差异),或屏蔽了一些功能如屏蔽了一些数量的处理器或集成显卡的核心,形成了不同的型号(如 Intel i3,i5 和 i7)。 50 | TDP 不是因,而是果,是芯片运行时产生不得不需要散失的热量所导致的。因此对于同个型号的处理器,运行的频率越高从而性能越高,而由于频率变高电压增高(为了保证更高频率下运行不出错,不得不增加电压以加速晶体管的翻转)所以功耗也高,产生的热量更多,需要 TDP 更高的散热能力。不过对于某些设备散热条件不佳(如单管压 i9,轻薄本,被动散热的平板等),OEM 制造商或芯片制造厂家需要进一步增加额外的功耗限制,禁止处理器产生热量过多从而损毁处理器。早期 Intel 增加了一些具有不同的 TDP 限制的 SKU(面向各个场景)供给厂家使用,而后来增加了 cTDP 参数,可以由 OEM 厂家进行配置修改。 51 | 而实际上今日 OEM 制造商选择一个更好的策略:只要芯片运行温度不超过限制,就一直允许 CPU 运行在最高速度下。 52 | ::: 53 | 54 | ### 性能 55 | 56 | 性能是永恒的话题。完成一项任务,时间越短越好。时间就是生命,效率就是金钱。 57 | 时间等于一个程序运行需要运行的指令数和平均每个指令运行需要的时间相乘,而后者等于 1 秒钟除以芯片运行的平均频率和每个周期平均运行的指令数量的乘积。后者每个周期平均运行的指令数量通常被成为 IPC。 58 | 对于不同的电脑,如果架构不同,程序的指令数量通常不一样。 59 | 而对于不同的处理器,芯片能够持续运行的最大平均频率和 IPC 也不同。 60 | 61 | 如何评价一个处理器的性能?这个问题是复杂的,归结为任务的复杂性和多样性。 62 | CPU 作为一种通用处理器,通用便意味着面向日常各种各样的应用,比如视频转码编辑,游戏,文字办公,程序编译等。 63 | 不过尽管任务多种多样,但是大多数任务都具有某些种有限的特点,因此为了衡量一个 CPU 性能如何, 64 | 人们在这些各种各样的应用中选取了一些典型任务代表常见的任务情况,开发了基准测试程序,也叫 Benchmark。是骡子是马,溜一溜便知。 65 | 66 | 不过,Benchmark 不是永远有效的,有一些因素对其产生可观的影响。 67 | 其中一个重要方面是,人们意识到可以通过对抗性的针对性的优化,或者对其运行规则做出对自己有利的解读。 68 | 这里强调的是针对性和对抗性,这种调优不具有普适性,也无法表征整体性能,除了使得数字上更好看,没有什么实际价值。 69 | 但是,于此同时,需要认识到软件上的优化也是提高性能的非常重要的办法之一,如可以通过循环展开,向量化等操作获得很高的性能提升。 70 | 因此基准测试软件控制了一些可选的选项,在指定的规则框架内进行对比。 71 | 这是一个冲突性的,两面性的问题,因此需要辩证地参考,尽信书不如无书。 72 | 而典型任务也不代表全部任务,最终效果依然需要落实到实际的应用上。 73 | 74 | 另一个有趣的例子是 GPU,作为专用的协处理器完成图像处理和 3D 渲染,面向了较高并行的任务进行了优化, 75 | 在一些任务,比如视频处理深度学习等,GPU 相比通用处理器具有巨大的性能提升(从而极大的降低了成本,一张显卡的算力可以与百余核高端通用处理器相当,且相当便宜!),而在另一些任务中相差甚远,几乎不能完成。 76 | 这一例子更加强调了系统的重要思想: 设计最终目的是满足目标和功能。 77 | 78 | ::: info 基准测试 79 | 常见的 Benchmark 有如 Geekbench,Passmark,Spec2017,Cinebench,Blender Benchmark 等。 80 | Spec2017 包括浮点和整数两个部分,前者包含如 gcc 编译器,h264 视频编解码,后者包含如 imagick 图像处理和各类科学计算等。 81 | ::: 82 | 83 | ### 成本 84 | 85 | 成本是一台计算机极为重要的考核指标,并且逐渐成为当下计算机行业的一个重要主题。 86 | 但一些时候,我们总会有意无意的忽视了这个问题。 87 | 88 | 举一个比较简单的例子:一位同学,买了一台电脑,花了 3k5,用了一年损坏了,而另一个情况下,买了一台同样性能水准的电脑,花费了 3k5,用了五年而损坏。 89 | 而另外一个例子:某个同学因学习需要,由于性能和续航优异而亲睐一种以水果作为商标的某款电脑,但最终因囊中羞涩无力购买。 90 | 91 | 成本包括制造成本和运作成本,而利润是系统运行创造的价值除以其总成本减一。 92 | 随着计算机商品的大众化,其一件产品的制造成本与售价之间的差额在不断的缩小,而大多数公司的研发费用只占其收入的 4%~12%。 93 | 制造成本主要是指购买一件设备的单次投资,通常其包含了生产的成本与其他的支持成本(如配套的操作系统和软件的研发与生态的维护), 94 | 而运作成本,在互联网大型数据中心是极为重要的,其包括电费,网费,冷却的费用(如空调费),地皮空间的租金,以及设备损毁更换的开销等。 95 | 96 | 此外,我们需要注意到,成本是一个整体性的概念,是面向最终需求的解决方案不多不少,而不应当仅仅关注其内某个单一组件。 97 | 如小明需要进行深度学习的实践和学习,此外有游戏的需求,需要一台个人台式电脑。那么,他也许会更亲睐在显卡上做更多的投资。 98 | 又如小王有大量储存的需求,有许多的学习资料,故而,他选择了购买更多的机械硬盘和固态硬盘。 99 | 不管如何,这是一个权衡的艺术,而最终评价标准依然还是面向最终整体的实际效果。 100 | 101 | 一些时候,我们需要更加丰厚的利润,我们总是希望花最少的钱,办最多的事,因此需要考量我们的实际需求情况与性价比。 102 | 而实际需求和性价比也是会随着时间发生变化,因此购买也相当于对未来情况的一次投资。前言已经强调了世界运动性的这一特点。 103 | 104 | 而另一方面,成本也成为了约束条件,当无法满足则没有讨论的意义。 105 | 106 | ### 生态 107 | 108 | 随着时代发展硬件进步速度逐渐减慢(见后文),程序员越来越需要承担起提高程序性能的重担,对程序的优化日益显得尤为重要。 109 | 由于物理限制,处理器运行主频无法无限提升,因此提高性能的主要实现手段是增加并行性,即通过在单位时间内进行更多无关的计算。 110 | 111 | 程序优化是一个收益显著的事情。 112 | 113 | 一个程序未经修改,通过编译器的优化便能获得几倍的性能提升。而通过程序员手工进行并行化编程,程序可以获得非常高的提升:如采用 SIMD 向量指令,即单个指令可以对一个向量内每个元素进行相同操作,从而单位时间计算量增加。或采用多核系统,无关的任务(比如开视频的同时进行微信聊天)之间不存在关联被分布于多个核上从而实现并行加速,而同一程序则可以通过各个线程分而执行相互同步,以提高性能。而经过精细设计构造从而运行于 GPU 的程序,通常可以获得更高的加速比,但是由于 GPU 专用的特点,程序员需要承担很大的心智负担,从而开发调试成本增加。 114 | 115 | 而这些优化通常离不开程序员对计算机系统的理解和熟悉,这些标准有 CPU 上的 ISA(见前一章),也有 GPU 系统的如来自 NVIDIA 公司的 CUDA API 和来自 AMD 的 Rocm。一些架构较为易用,程序员负担较小,设备比较大众通用和容易获取,来自制造商的支持较多,来自社区和商业的库较为丰富,从而程序员更倾向于于这些架构开发并进行针对优化,从而导致了程序与架构的黏性。而某些架构设备较为稀有,设计复杂,几乎没有资料和制造商的支持,或是乃至程序几乎无法正常运行,这些无疑增加了开发成本,让人望而生畏。CUDA 的日益垄断日益凸显了生态的重要性。 116 | 117 | ## 计算机的过去,现在和未来 118 | 119 | ### 摩尔定律与后摩尔时代 120 | 121 | (TODO) 122 | 123 | ### Dennard Scaling Law 124 | 125 | (TODO) 126 | 127 | ### Amdahl's Law 128 | 129 | (TODO) 130 | 131 | ## 计算机层次化 132 | 133 | 当今计算机系统复杂程度日益增高,为了构建高效、可维护和可扩展的系统,因此需要进行层次化。(也被称为 UNIX 哲学,但这一哲学思想不仅仅限于 UNIX 相关,可以说基本涵盖了计算机科学的方方面面。) 134 | 135 | ### 简单性 136 | 137 | 简单性即主张将复杂的问题分解为一系列简单的问题,然后分而治之。通过将系统分解为小的、独立的模块,每个部件只需要针对这个更小的问题进行研究,可以大幅降低复杂性,提高可维护性和可重用性。 138 | 139 | ### 模块化 140 | 141 | 模块化是实现简单性和可维护性的关键,每个模块负责特定的功能,之间通过接口进行交互。通过定义清晰的接口,这些模块可以相互独立地进行开发与测试,而不会对其他模块产生过多的影响,从而实现整个产业链的层次分工专攻,而模块化使得具有更多普适性,从而实现了更多的复用,减少了重复工作。 142 | 143 | ### 标准化 144 | 145 | 标准化原则是实现模块化原则的重要手段。通过制定统一的规范和标准,不同的模块可以实现互操作和集成。降低了风险同时保持系统的稳定性和可维护性。 146 | 147 | - 在芯片制造领域,通常具有两大模式,一种称为 IDM(Integrated Device Manufacture)模式,集芯片设计、芯片制造、芯片封装和测试等多个产业链环节于一身并进行联合优化,为早期多数集成电路企业采用的模式;而一种被称为 Fabless,这些芯片公司仅实现芯片的设计工作,并将图纸交由芯片代工厂(通常成为 Fab)进行生产,后者包括有台积电(台湾积体电路制造有限公司,英文简称 TSMC)、中芯国际、三星、Global Foundries。设计和制造相分离的 Fabless 降低了设计人员的负担以及企业运行的投资和成本开销,为行业所亲睐。 148 | 149 | - 而在芯片设计领域,有一些公司提供设计芯片所需要的工业软件(称为 EDA),而有另一些公司则以兜售被称为 IP 的模块谋生,这些设计模块只可以完成某些小型的特定功能,如视频输出、图像处理、内存控制器等,以黑盒子出售给各个芯片设计公司。后者通过集成各种 IP 模块与其自己的设计实现拼接组合为最终的 SoC 芯片。 150 | 151 | - 在软件领域,这一现象更为普遍。人们将众多子程序集合(也称为库)单独分离出来成为一个个单独的文件,一些在程序编译链接时被其他开发者集合在一起,称为静态链接库;而另一些则是在运行时动态的被其他程序使用,则称为动态链接库。这些子程序用途广泛,有的可用于被开发图形界面如 Qt,有的则包含了视频格式的编解码算法程序,如 libx264,libsvtav1 等,而有一些库则将底层复杂的接口进一步整合抽象为更简单的函数功能。库大大方便了软件的开发,可以很容易地发布、替换或二次开发。 152 | -------------------------------------------------------------------------------- /basic/06-drive-your-computer-2.md: -------------------------------------------------------------------------------- 1 | # 用好你的电脑 II 2 | 3 | ::: info 本文信息 4 | 作者:000lbh 5 | 6 | 状态:未审阅的草稿版本 7 | 8 | 许可:CC BY-NC-SA 3.0 9 | ::: 10 | 11 | ## 版本控制概览 12 | 13 | 你是否正在编写项目,希望反复尝试不同的代码的效果?你是否曾经为了调整功能删除过大段代码,后悔时却发现无法找回?你是否想和其他人合作开发项目,却发现代码难以同步?本章你将学习 Git 这一版本控制系统,可以解决以上问题。 14 | 15 | 版本控制系统(Version Control System, VCS)用来管理和追踪一个软件的源文件版本的系统,同时也可以提供协作、备份等功能。其可以分为中心化和去中心化两种工作方式。 16 | 17 | ### 中心化版本控制 18 | 19 | 中心化的工作方式必须有一个服务器,储存所有的版本记录,客户端只负责拉取某个版本,进行修改,并推送回去。代表作有 SVN。 20 | 21 | ### 去中心化的版本控制 22 | 23 | 而去中心化的工作方式中,每个人都有完整的版本记录,可以存在中心服务器用于交换各个客户端的提交,但是即使服务器下线或者不存在,两个人之间也可以通过互相交换信息来完成版本同步。代表作有 Git。请注意,Git 和 GitHub,GitLab 并不是同一个东西,前者是 VCS,后者是使用 Git 作为 VCS 的代码托管平台。 24 | 25 | ## Git 的基本理念 26 | 27 | 在介绍 Git 基本理念之前,我们先讲一点故事。2002 年以前,Linux 内核开发完全依赖于 Linus 一个人手工检查并合并全世界发来的补丁,这样工作量非常大。于是,Linus 的一个朋友介绍了 BitMover 公司开发的商业 VCS 软件 BitKeeper 免费授权给 Linux 开发团队使用。此举招致了 FSF 的 RMS 等人的批评,认为在自由软件开发中使用非自由软件是“道德上有污点”的行为,但是作为实用主义者的 Linus 并不在意这些事情,BitKeeper 作为去中心化的 VCS,满足了 Linus 的需求。然而好景不长,有 Linux 内核开发者逆向了 BitKeeper 的协议,致使 BitMover 公司在 2005 年决定收回其授权。Git 就是在这种条件下诞生的,据说第一版 Git 是 Linus 利用 1 周休假时间完成的。 28 | 29 | Git 的设计出于这样一种基本抽象:一个项目的历史记录可以被看作是一个有向无环图(DAG),每个提交是一个节点,每个节点有一个或多个父节点,代表这个提交是由哪些提交衍生出来的。Git 的基本操作就是在这个图上进行操作,比如创建新的节点,删除节点,合并节点等等。或许同学们不熟悉有向无环图这个概念,我们举个例子:家谱就可以类比为一个有向无环图,每个人是一个节点,每个人有父母,父母又有父母,但是不可能有一个人的父母是他自己,也不会有一个人的父母是他的后代,这样就构成了一个有向无环图。 30 | 31 | 这样的抽象是自然的:人们写的代码大概率是基于之前写过的一份或多份代码,写完之后,又会有其他人基于这份代码继续开发,具有继承性。这样的抽象也是实用的,每一次提交(一个节点)都可以看作是一个快照,你可以随时回到这个快照,查看这个快照的内容,或者基于这个快照进行修改。你也能知道目前的状态是如何从过去的状态演变而来的,这样你就可以知道每一次修改的意图,也可以知道每一次修改的后果。 32 | 33 | 对于 Git 来说,有三个目录:工作区(Working Directory),暂存区(Staging Area)和版本库(Repository)。工作区就是你的项目目录,你可以随意改动,直到你决定记录你的修改。版本库是 Git 存储有向无环图的地方。暂存区可能不那么好理解,暂存区是一个缓冲区,你可以把你的修改放到暂存区,然后一次性提交到版本库,差不多就是这样: 34 | 35 |

36 | areas 37 |

38 | 39 | 有点抽象,我们举个例子: 40 | 41 | 我们假设有一个 Git 仓库(Repository),里面有两个文件 A 和 B。仓库之前有提交记录。此时你开始基于之前的提交记录工作,你从历史中取出了文件 A 和 B 放到工作区(这其实是自动的)。此刻就像这样: 42 | 43 |

44 | areas 45 |

46 | 47 | 然后你修改了文件 A,这对 Git 的状态没有任何影响:因为你没有告诉 Git 你修改了文件 A。这时候你可以把文件 A 放到暂存区,这样 Git 就知道你修改了文件 A。这时候 Git 的状态是这样的: 48 | 49 |

50 | areas 51 |

52 | 53 | 然后你修改了文件 B,并把 B 放到暂存区,这时候 Git 的状态是这样的: 54 | 55 |

56 | areas 57 |

58 | 59 | 你觉得差不多了,这时你打算永久保存工作区目前的状态,就把暂存区提交到版本库,这时候 Git 的状态是这样的: 60 | 61 |

62 | areas 63 |

64 | 65 | 你的暂存区已经被保存到了版本库,就是版本 Y 节点。这时候工作区和版本库最新节点一致,暂存区是空的。 66 | 67 | ## Git 的使用 68 | 69 | 下面我们分步介绍 Git 的使用方法: 70 | 71 | ### 初始化仓库 72 | 73 | 我们使用 init 子命令来初始化一个仓库。打开你的 shell,执行: 74 | 75 | ```shell 76 | mkdir git-example 77 | cd git-example 78 | git init 79 | ``` 80 | 81 | 你可能会看到以下内容: 82 | 83 | ```plain 84 | 已初始化空的 Git 仓库于 /path/to/example/git-example/.git/ 85 | ``` 86 | 87 | 这说明一个空的 git 仓库已经创建好了。 88 | 89 | 如果你看到如下内容,意思是你系统的 git 默认选择了 master 作为主分支的名字。目前我们推荐使用 main 作为主分支的名字,你可以根据它的建议进行配置: 90 | 91 | ```plain 92 | 提示: 使用 'master' 作为初始分支的名称。这个默认分支名称可能会更改。要在新仓库中 93 | 提示: 配置使用初始分支名,并消除这条警告,请执行: 94 | 提示: 95 | 提示: git config --global init.defaultBranch <名称> 96 | 提示: 97 | 提示: 除了 'master' 之外,通常选定的名字有 'main'、'trunk' 和 'development'。 98 | 提示: 可以通过以下命令重命名刚创建的分支: 99 | 提示: 100 | 提示: git branch -m 101 | ``` 102 | 103 | ### 配置 Git 104 | 105 | 我们可能需要对仓库进行一些配置,比如设置用户名和邮箱,设置代理等等。 106 | 107 | 配置 Git 只需要用到 config 子命令。如果需要修改全局设置,可以加上 `--global` 参数,如果需要打开配置文件进行编辑,可以加上 `--edit` 参数。现在我们修改一下全局参数,执行: 108 | 109 | ```shell 110 | git config --global --edit 111 | ``` 112 | 113 | 然后你的终端应该会打开一个文本编辑器(可能是 vim,在 Windows 上也可能是记事本之类的),然后在 `[user]` 模块下找到 `name = xxx` 和 `email = xxx@xxx`,将两者修改为自己的信息。如果这两行不存在,你可以在 `[user]` 后另起一行,加上这两行信息,如果 `[user]` 也不存在,你可以在文件末尾另起一行加上。很多代码托管平台,比如 GitHub,使用提交的邮箱判断提交的作者。 114 | 115 | 由于众所周知的原因,你可能需要使用代理。请在文件末尾另起一行,填写以下内容,其中链接需要填写你自己的链接: 116 | 117 | ```plain 118 | [http] 119 | proxy = http://127.0.0.1:7890(请更改为你自己的链接) 120 | [https] 121 | proxy = http://127.0.0.1:7890(同上) 122 | ``` 123 | 124 | 有时候对于某些 repo,你想使用其他的名称或者邮箱进行提交,这时你可以在 repo 目录中执行: 125 | 126 | ```shell 127 | git config --edit 128 | ``` 129 | 130 | 用和全局配置类似的方法,配置你的用户名和邮箱。 131 | 132 | ### 暂存你的更改 133 | 134 | 使用 add 子命令可以暂存某一个文件的更改,以便后续提交。先试着在目录中创建一个文件,内容是 Hello, world!,然后暂存: 135 | 136 | ```shell 137 | echo Hello, world! > example1.txt 138 | git add . 139 | ``` 140 | 141 | 使用`.`指示所有未被忽略的文件,你也可以写出具体的文件路径进行暂存。 142 | 143 | 执行: 144 | 145 | ```shell 146 | git status 147 | ``` 148 | 149 | 查看当前分支的状态,如果你前面操作全部正确,你应该看到如下内容: 150 | 151 | ```plain 152 | 位于分支 master 153 | 154 | 尚无提交 155 | 156 | 要提交的变更:# 这里就是暂存区,笔者注 157 | (使用 "git rm --cached <文件>..." 以取消暂存) 158 | 新文件: example1.txt 159 | ``` 160 | 161 | ### 提交你的更改 162 | 163 | 使用 commit 子命令来提交你的更改。执行: 164 | 165 | ```shell 166 | git commit 167 | ``` 168 | 169 | 会弹出文本编辑器,请在第一行写你的提交信息,比如 `My first commit`,然后退出编辑器。或者你也可以执行: 170 | 171 | ```shell 172 | git commit -m "My first commit 173 | ``` 174 | 175 | 达到同样的效果。此时你应该能看到如下信息: 176 | 177 | ```plain 178 | [master(根提交) 7a6ab77] My first commit 179 | 1 file changed, 1 insertion(+) 180 | create mode 100644 example1.txt 181 | ``` 182 | 183 | 这个时候我们再执行一遍: 184 | 185 | ```shell 186 | git status 187 | ``` 188 | 189 | 你会发现目前处于“干净的工作区” 190 | 191 | ```plain 192 | 位于分支 master 193 | 无文件要提交,干净的工作区 194 | ``` 195 | 196 | 总结一下,git 整体的工作流程就是修改-暂存-提交-下一轮修改-……这样一直进行。 197 | 198 | 如果你觉得暂存操作比较麻烦,可以加上 `-a` 参数,此参数会在提交前自动暂存修改过和删除的文件,但是新的文件不会被包括进来。 199 | 200 | 有时候上一个提交还没有完成,你可以使用 `--amend` 参数修订上一个提交。 201 | 202 | ### 查看并回退到指定历史版本 203 | 204 | 在开始讲解之前,我们再建立一个提交,方便后续讲解。执行: 205 | 206 | ```shell 207 | echo Hello, Git! > example1.txt 208 | git commit -am "My second commit" 209 | ``` 210 | 211 | 如果你之前都是按照教程完成的,你应该可以看到: 212 | 213 | ```plain 214 | [master 37f7d83] My second commit 215 | 1 file changed, 1 insertion(+), 1 deletion(-) 216 | ``` 217 | 218 | 然后我们使用 log 子命令,执行: 219 | 220 | ```shell 221 | git log 222 | ``` 223 | 224 | 你应该可以看到类似以下内容: 225 | 226 | ```plain 227 | commit 37f7d83baa4f765071daad0a316b8ec380fcedb3 (HEAD -> master) 228 | Author: 000lbh <73009215+000lbh@users.noreply.github.com> 229 | Date: Wed Aug 28 14:41:19 2024 +0800 230 | 231 | My second commit 232 | 233 | commit 7a6ab774caa62ba9d0a091a2c1dc3e96af04ffa7 234 | Author: 000lbh <73009215+000lbh@users.noreply.github.com> 235 | Date: Wed Aug 28 14:28:30 2024 +0800 236 | 237 | My first commit 238 | ``` 239 | 240 | 其中 241 | commit 后面跟着的编号(实际上是散列值)、日期会不同,作者和邮箱信息应该是你刚刚设置的。 242 | 243 | 此时我们想检查第一个提交,这个时候我们可以使用多种方式来完成,我们先使用 checkout 子命令: 244 | 245 | ```shell 246 | git checkout 7a6ab774caa62ba9d0a091a2c1dc3e96af04ffa7 247 | ``` 248 | 249 | 此时该提交被检出,当前工作区应该回到上一个提交的状态,显示: 250 | 251 | ```plain 252 | 注意:正在切换到 '7a6ab774caa62ba9d0a091a2c1dc3e96af04ffa7'。 253 | 254 | 您正处于分离头指针状态。您可以查看、做试验性的修改及提交,并且您可以在切换 255 | 回一个分支时,丢弃在此状态下所做的提交而不对分支造成影响。 256 | 257 | 如果您想要通过创建分支来保留在此状态下所做的提交,您可以通过在 switch 命令 258 | 中添加参数 -c 来实现(现在或稍后)。例如: 259 | 260 | git switch -c <新分支名> 261 | 262 | 或者撤销此操作: 263 | 264 | git switch - 265 | 266 | 通过将配置变量 advice.detachedHead 设置为 false 来关闭此建议 267 | 268 | HEAD 目前位于 7a6ab77 My first commit 269 | 270 | ``` 271 | 272 | 你可以使用 273 | 274 | ```shell 275 | cat example1.txt 276 | ``` 277 | 278 | 检查文件内容。 279 | 280 | 事实上,使用散列值指定提交时,若无歧义,写前 5 个字符即可。 281 | 282 | 如果你想回到最新的提交,执行: 283 | 284 | ```shell 285 | git checkout master 286 | ``` 287 | 288 | 即可。 289 | 290 | 如果你想回退到当前提交,可以使用 291 | 292 | ```shell 293 | git reset --hard 7a6ab 294 | ``` 295 | 296 | 此命令将签出并将头指针指向指定提交。后续提交除非你知道提交的散列值,否则你无法找回提交。可以使用垃圾回收(gc 子命令)清除未被引用的提交。 297 | 298 | ::: danger 警告 299 | 请谨慎使用 hard reset 300 | ::: 301 | 302 | ### 排除掉特定的文件 303 | 304 | 有时候一些文件不应该被版本管理系统追踪,如编译生成的目标文件,可执行文件,一些敏感配置等等。我们可以使用 `.gitignore` 文件来排除指定文件和文件夹。执行以下内容: 305 | 306 | ```shell 307 | mkdir confidential 308 | echo Password is not a good password > confidential/password.txt 309 | echo This is pretend to be a object file > main.o 310 | git status 311 | ``` 312 | 313 | 应该可以看到以下内容: 314 | 315 | ```plain 316 | 位于分支 master 317 | 未跟踪的文件: 318 | (使用 "git add <文件>..." 以包含要提交的内容) 319 | confidential/ 320 | main.o 321 | 322 | 提交为空,但是存在尚未跟踪的文件(使用 "git add" 建立跟踪) 323 | ``` 324 | 325 | 我们再执行: 326 | 327 | ```shell 328 | echo confidential\n\*.o > .gitignore 329 | git status 330 | ``` 331 | 332 | 应该可以看到 333 | 334 | ```plain 335 | 位于分支 master 336 | 未跟踪的文件: 337 | (使用 "git add <文件>..." 以包含要提交的内容) 338 | .gitignore 339 | 340 | 提交为空,但是存在尚未跟踪的文件(使用 "git add" 建立跟踪) 341 | 342 | ``` 343 | 344 | 可以发现 `credential` 目录和所有的 `.o` 文件都被忽略了。 345 | 346 | 最后我们执行 347 | 348 | ```shell 349 | git add . 350 | git commit -m "add .gitignore" 351 | ``` 352 | 353 | 将这一修改纳入 VCS 进行管理,完成这一节。 354 | 355 | ### 分支管理 356 | 357 | 有时候我们会想同时开发新功能,并且调优以前的代码,这样可能就需要两条线进行开发,此时分支相关的功能就会很有帮助。分支的英文是 branch,其实就像树枝一样,你可以在树干上开出一个新的树枝,然后在这个树枝上进行开发,多条树枝之间不会影响,同时树枝也可以合并到树干上(这个有点不符合自然常理,不过你可以做一些想象)。 358 | 359 | 接下来的例子,我们将演示如何创建分支、变基分支、合并分支以及冲突解决。 360 | 361 | 首先我们执行: 362 | 363 | ```shell 364 | git log 365 | ``` 366 | 367 | 查看目前分支的记录,参考结果如下: 368 | 369 | ```plain 370 | commit 714d500c7f5f15445bfa59a0d04d01e177602db5 (HEAD -> master) 371 | Author: 000lbh <73009215+000lbh@users.noreply.github.com> 372 | Date: Wed Aug 28 15:18:36 2024 +0800 373 | 374 | add .gitignore 375 | 376 | commit 37f7d83baa4f765071daad0a316b8ec380fcedb3 377 | Author: 000lbh <73009215+000lbh@users.noreply.github.com> 378 | Date: Wed Aug 28 14:41:19 2024 +0800 379 | 380 | My second commit 381 | 382 | commit 7a6ab774caa62ba9d0a091a2c1dc3e96af04ffa7 383 | Author: 000lbh <73009215+000lbh@users.noreply.github.com> 384 | Date: Wed Aug 28 14:28:30 2024 +0800 385 | 386 | My first commit 387 | 388 | ``` 389 | 390 | #### 创建分支 391 | 392 | 我们想以第二个提交为根节点,向上延伸分支,我们可以执行: 393 | 394 | ```shell 395 | git checkout -b update-example 37f7d 396 | ``` 397 | 398 | 以上等价于执行 399 | 400 | ```shell 401 | git branch update-example 37f7d 402 | git checkout update-example 403 | ``` 404 | 405 | 然后我们将文件 `example1.txt` 改为 `Hello, Git2!`,执行: 406 | 407 | ```shell 408 | git commit -am "Branch!" 409 | ``` 410 | 411 | 提交更改。 412 | 413 | #### 变基分支 414 | 415 | 接着我们将刚刚创建的提交变到主线上,如下图所示: 416 | 417 | ```plain 418 | A-----B-----C (master) 419 | \ A-----B-----C-----D (update_example) 420 | \ ===> (master) 421 | D (update-example) 422 | ``` 423 | 424 | 只需执行 425 | 426 | ```plain 427 | git rebase master 428 | git checkout master 429 | ``` 430 | 431 | 分支 update-example 将重新以 master 的最新提交为根基。 432 | 请注意,rebase 会使得移动的全部提交的散列值被重新计算!因为 git 提交的散列值与上一个提交的散列值有关。 433 | 434 | #### 合并分支与冲突解决 435 | 436 | 合并分支是一种比较有意思的操作,因为其会产生一种叫做合并提交的提交。 437 | 合并提交本身的特别性在于,其具有多于一个的父提交,因此可以将两个分支合并到一起。 438 | 439 | 我们将 master 的 HEAD 设置到刚刚 rebase 后的分支的顶部,然后我们新建一个分支: 440 | 441 | ```shell 442 | git checkout -b merge-example 443 | echo Lorem ipsum > example2.txt 444 | echo Hello, Git6! > example1.txt 445 | git add example2.txt 446 | git commit -m "Prepare to merge" 447 | ``` 448 | 449 | 然后我们检出 master,然后执行: 450 | 451 | ```plain 452 | git merge merge-example 453 | ``` 454 | 455 | 由于合并的两个分支涉及同一行的修改,git 没有办法决定如何应用这些修改,因此需要手动介入解决。 456 | 变基操作也会出现冲突,感兴趣的同学可以尝试一下如何解决。 457 | 如果不出意外,你应该看到: 458 | 459 | ```plain 460 | 自动合并 example1.txt 461 | 冲突(内容):合并冲突于 example1.txt 462 | 自动合并失败,修正冲突然后提交修正的结果。 463 | ``` 464 | 465 | 我们打开 `example1.txt` 查看内容: 466 | 467 | ```plain 468 | <<<<<<< HEAD 469 | Hello, Git2! 470 | ======= 471 | Hello, Git6! 472 | >>>>>>> merge-example 473 | 474 | ``` 475 | 476 | 如果你使用 VSCode 等 IDE,应该已经自动显示修正冲突的选项。我们在这里把结果修正为: 477 | 478 | ```plain 479 | Hello, Git8! 480 | ``` 481 | 482 | 然后我们运行: 483 | 484 | ```shell 485 | git add . 486 | git merge --continue 487 | ``` 488 | 489 | 应该会弹出一个文本编辑器,编辑合并提交的消息,然后退出即可。 490 | 491 | ### Git 服务器与多人合作 492 | 493 | 到这里你已经完成了 Git 大部分基础功能的学习!下面我们看看如何用 Git 进行多人合作: 494 | 495 | #### 克隆仓库 496 | 497 | 克隆就是把别人的代码仓库复制一份过来。一般来说,执行: 498 | 499 | ```shell 500 | git clone url://path/to/be/cloned 501 | ``` 502 | 503 | 就可以了。在当前工作目录下会新建克隆项目名字的文件夹,一般 http(s)和 ssh 协议是常见的 clone 协议。对于后者,你可能需要本地生成 ssh 密钥对,并将公钥上传到服务器。 504 | 505 | #### 拉取代码 506 | 507 | 有时候远端代码库已经更新,你需要更新本地代码,这时候用 pull 子命令。 508 | 509 | ```shell 510 | git pull 511 | ``` 512 | 513 | 事实上,pull 子命令同时执行了 fetch 然后将当前分支的 HEAD 指针指向远端对应分支的 HEAD 指针。 514 | 515 | 如果本地有远端不存在的提交,则拉取代码不能以默认的 “fast-forward” 方式进行,因此需要指定 `--no-ff` 参数进行合并拉取或者指定 `--rebase` 进行变基拉取。在特别有必要时,也可以直接 hard reset 到远端 HEAD 处,丢弃本地未上传的提交。 516 | 517 | 由于本地的提交可以很方便的进行变基,不用担心散列值重新计算带来的合作上的冲突,建议出现拉取冲突时使用变基的方式解决,而合并会引入不必要的非线性历史,可能会让历史记录不太简洁。 518 | 519 | ::: danger 警告 520 | 再次提醒,请谨慎使用 hard reset。如果你已经弄丢了一些提交,可以通过提交 hash 找回你的提交。 521 | ::: 522 | 523 | #### 推送代码 524 | 525 | 在工作完成,提交完成之后,可以用这个子命令将修改推送至远端。若有远端有本地没有的提交,需要先进行拉取,才能推送,或者 `--force` 强制推送,此时不一致的提交会被本地提交代替。 526 | 527 | ::: danger 警告 528 | 使用 `--force` 参数前请三思,仔细检查你将要提交的内容!远端可能配置了自动 gc,在这种情况下,你的提交再也无法找回! 529 | ::: 530 | 531 | #### 分叉与合并请求/拉取请求 532 | 533 | 如果你没有一个远程仓库的写权限而又想贡献代码,可以考虑通过代码托管平台提供的分叉(fork)功能,分叉一份代码进行开发,分叉的仓库与原来的仓库独立,一般来说,如果原仓库被删除,分叉的仓库会失去与原仓库的联系,但是并不会被删除。一般情况下,在分叉的仓库中进行开发时也不要使用默认分支(一般叫 master 或者 main),部分代码托管平台拒绝分叉中的默认分支的合并请求被自动合并。 534 | 535 | 开发完成之后,你可以发起合并请求(Merge Request, MR)/拉取请求(Pull Request, PR),向原仓库提交你的修改。原仓库的作者可能会经过一系列审查之后,选择合并你的代码,提出修改意见或者拒绝并关闭你的请求,不过一般直接关闭一个合并请求并不是很礼貌,所以原仓库的作者更可能提出拒绝的意见,此时你可以说服他或者自行关闭请求。 536 | 537 | 除了分叉可以发起合并请求/拉取请求,项目仓库内存在的分支也可以发起向其他分支的合并请求。这一般适用于对仓库有写权限的人,为了审查讨论代码修改,避免意外,不直接将修改放入默认分支而是先使用其他分支进行开发,通过合并请求/拉取请求再将代码放入默认分支。 538 | 539 | 如果你是仓库的所有者,你可能会收到合并请求/拉取请求,一般的代码托管平台提供三种合并方式: 540 | 541 | - 合并(merge):创建一个基于提出请求的分支和目标分支的合并提交(见前面合并分支部分的说明) 542 | - 变基(rebase):将提出请求的分支中的相关提交的修改内容依次应用到目标分支上 543 | - 压缩(squash):将提出请求的分支中的相关提交的修改内容作为一个提交应用到目标分支上 544 | 545 | 请注意,变基的合并方式不会把提出请求的分支中的提交原样纳入到目标分支上,因为变基需要重新计算每个提交的散列值(部分代码托管平台对于可以快进的情况变基不会重新计算散列值),因此基于散列值的内容,比如提交签名,可能会失效。 546 | 547 | 如果需要线性历史,建议不使用合并的请求合并方式。 548 | 549 | ### 图形化工具的使用 550 | 551 | 1. VSCode 552 | 553 | VSCode 自带 Git 管理功能,可以使用该功能进行可视化编辑和提交 554 | 555 | 2. gitg 556 | 557 | Gnome 桌面的 git 管理软件 558 | 559 | 3. kommit 560 | 561 | KDE 桌面的 git 管理软件 562 | 563 | ## 结语 564 | 565 | Git 部分的介绍就暂告一段段落了。Git 本身有上百个子命令,本教程肯定无法完全覆盖,很多高级用法自然也没有办法介绍。更多信息可以访问[Git Book](https://git-scm.com/book/en/v2)学习,也可以参考 man 手册。 566 | -------------------------------------------------------------------------------- /basic/07-drive-your-computer-3.md: -------------------------------------------------------------------------------- 1 | # 用好你的电脑 III:故障自查与知识串讲 {#heading} 2 | 3 | ::: info 本文信息 4 | 作者:000lbh LightYourJourney 5 | 6 | 状态:未审阅的草稿版本 7 | ::: 8 | 9 | ## 硬件资源监控 {#hw-monitor} 10 | 11 | 有时候我们需要检查硬件的信息,包括处理器占用情况,内存占用情况,磁盘占用情况等等,以进行故障排除。 12 | 13 | ### 磁盘信息 {#disk-info} 14 | 15 | 如需查看磁盘占用情况,Windows 和 Linux 下的文件管理器都能直观地提供以上信息,故此不再详述。 16 | 17 | 如需查看磁盘健康情况,可以使用 `smartctl` 命令(Linux)或者 CrystalDiskInfo 软件(Windows)查看。 18 | 19 | ![CrystalDiskInfo](../assets/basic/07-drive-your-computer-3/image.png) 20 | 图 1. 笔者使用 CrystalDiskInfo 查看磁盘信息 21 | 22 | ### 处理器与内存信息 {#cpu-mem-info} 23 | 24 | Windows 下任务管理器即可,Linux 下推荐`btop`程序。 25 | 26 | ![任务管理器](../assets/basic/07-drive-your-computer-3/image2.png) 27 | 图 2. 笔者使用任务管理器查看处理器占用情况,右侧菜单可以打开资源监视器,有更详细的信息。 28 | 29 | ### 电池信息 {#battery-info} 30 | 31 | Windows 下可以使用自带的 `powercfg` 命令生成 html 格式的电池信息报告,Linux 下可以使用 `upower` 命令查看 32 | 33 | ### 视频信息 {#video-info} 34 | 35 | (TODO) 36 | 37 | ### 音频信息 {#audio-info} 38 | 39 | (TODO) 40 | 41 | ## 常见故障自查 {#troubleshooting} 42 | 43 | ### 蓝屏 {#bsod} 44 | 45 | 蓝屏(BSOD, Blue Screen of Death),通常意味着 Windows 内核发生了不可恢复的故障。常见的蓝屏原因包括系统服务异常(多是驱动导致),关键进程退出(可能是病毒引起),机器检查(硬件故障)等。如果最近新安装了硬件,可以考虑移除它们再试试,如果怀疑是驱动问题或者是病毒问题,可以考虑进入安全模式: 46 | 47 | - 如果你还能进入系统:按下 `Win+R` 输入 `msconfig` 并回车,点击“引导”选项卡,勾选“安全启动”,点击应用,重启即可。 48 | 49 | - 如果你不能进入系统:启动失败若干次后应该会出现恢复菜单,点击“疑难解答”-“高级选项”-“启动设置”,会提示重启进入安全模式。 50 | 51 | 安全模式下只有最基本的驱动和启动项会被加载,可以考虑卸载最近安装的驱动或者查杀病毒,如需查杀病毒,建议选择带网络的安全模式。 52 | 53 | 以前的系统也可通过启动时按 F8 进入安全模式菜单,但是目前这样做不太可行。 54 | 55 | 完成所有操作后,如果使用 msconfig 设置了安全模式,应当先取消勾选然后应用,然后重启回到正常模式看问题是否解决。 56 | 57 | 如果你想向驱动作者报告问题,可以使用 WinDbg 调试内核转储文件,在 WinDbg 中打开转储文件,使用 `!analyze -v` 获取完整分析报告。WinDbg 可以在应用商店中免费获取。 58 | 59 | ### 内核恐慌 {#panic} 60 | 61 | Linux 内核的严重错误被叫做 panic。其实由于 Linux 用户态和内核态耦合更低,且 Linux 本身容错能力更好,Linux panic 遇见的频率相对更低,常见的原因也不外乎驱动故障,1 号进程退出等。一般来说,部分硬件厂商为 Linux 提供的驱动问题较多,除了卸载驱动以外,还需要和驱动开发者和 Linux 内核维护者进行沟通,以取得更好的解决方案。 62 | 63 | ### 应用软件崩溃 {#application-crash} 64 | 65 | 这种情况比较复杂,有可能是软件本身的 bug,也有可能是用户的环境或者使用软件的方式的问题。部分软件带有崩溃反馈模块,你可以用这个模块向开发者反馈信息。在反馈之前,请先确保你的软件是最新的,因为你发现的故障可能在新版本中已经被修复,同时需确保你正确使用软件。然后向开发者反馈故障时,尽可能给出软件版本、操作系统版本、库版本(如果有需要)、硬件型号等信息,同时需给出较为详细的复现故障的步骤,必要时附上日志和截图(不要在正文中放大段日志,最好以附件或者在线剪贴板链接,如 [gist](https://gist.github.com/) 的形式给出)。如果你使用 Linux 并且恰好开启了核心转储,你也可以调试转储文件(例如使用 `coredumpctl -r debug`,然后输入 `bt`),给出栈回溯信息等。 66 | 67 | 如果你想自行调试,首先你可以寻找软件是否提供了调试符号包,在没有调试符号包和源码的情况下调试将会是非常困难的,而且两者都不提供的软件通常在许可上不允许你做调试(因为会涉及反汇编),除非万不得已,不建议自行调试这种软件。如果没有调试符号包但是有源码,你可以尝试在干净的环境中重新构建带调试符号的软件包,对于用 gcc 编译的软件,可以考虑加上编译参数 `-g`。同时不建议使用较高的优化等级,这会给调试带来困难,除非你确信是高优化等级导致的问题。 68 | 69 | ### 系统启动慢 {#system-slow} 70 | 71 | Windows 下打开任务管理器检查有无不必要启动项,加以禁止即可;Linux 下可以使用 `journalctl` 检查日志,留意启动慢的服务,有针对性地加以解决,或者直接禁用服务 72 | 73 | ### 应用程序慢 {#app-slow} 74 | 75 | 建议首先检查内存和处理器占用情况,结束其他无关程序;对于有网络 IO 的程序,检查网络连接;对于有磁盘 IO 的程序,检查磁盘健康状态。 76 | 77 | ### 网络连接故障 {#offline} 78 | 79 | 建议检查网线是否插好,网关是否登陆,是否欠费,DNS 设置是否正确,上一次关机时代理是否正确关闭等等。对于 Linux 系统,可以检查 `rfkill` 是否允许相应网卡工作,`ip` 是否启动相应适配器。 80 | 81 | ## 小知识串讲 {#knowledge-series} 82 | 83 | ### 快捷键 {#shortcut} 84 | 85 | #### 系统快捷键 {#system-shortcut} 86 | 87 | 不同系统提供了不同的快捷键,这里简单介绍 Windows 和 Linux 在系统层面提供的快捷键。Windows 徽标键(简称 Win 键)在 Linux 下也称 Meta 键,在 macOS 下则是 Command 键。F1-F12 系列按键有可能需要同时按下 Fn 键使用。 88 | 89 | - Windows 90 | 91 | `Ctrl+Alt+Del`: 打开一个可以唤起任务管理器的屏幕。这个组合键比较特殊,它只能被内核捕获而不会传给用户态程序处理。 92 | 93 | `Ctrl+Shift+Esc`: 直接打开任务管理器。 94 | 95 | `Alt+F4`: 关闭处于焦点的窗口。如果没有窗口处于焦点,打开关闭计算机的对话框。 96 | 97 | `Alt+Tab`: 切换窗口。 98 | 99 | `Win+Tab`: 切换桌面。 100 | 101 | `Win+R`: 打开运行窗口。 102 | 103 | `PrintScreen(PrtSc)`: 截图 104 | 105 | - Linux 106 | 107 | Linux 下很多快捷键由桌面环境提供,在此无法一一讲述,有兴趣的可以自行了解。一般这些快捷键可以根据个人使用习惯重新配置。 108 | 109 | `Ctrl+Alt+{F1-F12}`: 切换 tty。一般图形桌面位于 tty1 或者 tty2。这一系列快捷键由 Wayland 或者 Xorg 提供 110 | 111 | `Alt+SysRq`: 这是一系列快捷键,其中 SysRq 键就是 PrintScreen 键(有的键盘应该会在 PrintScreen 键下面一行写上 SysRq),按下这个组合键后,再按下特定按键,内核会有不同的功能,如按下 `C` 会让内核强制崩溃;按下 `E` 会向所有进程发送 SIGTERM 使得它们可以做一些清理后退出;按下 `I` 会向所有进程发送 SIGKILL 使得它们强行退出;按下 `S` 会同步磁盘写入;按下 `U` 会使得所有文件系统被重新挂载为只读;按下 `B` 会让计算机立刻重启。注意:SysRq 功能可以使用 sysctl 进行配置,默认可能并未开启全部功能。利用这些快捷键可以救回卡死的系统,或者可以在保证文件系统完整的情况下强行重启电脑。 112 | 113 | - macOS 114 | 115 | 如果你有 Windows 的使用经历,那么大部分情况下,你可以将 macOS 下的 `Option` 键视为 Windows 下的 `Alt` 键,将 Command 键视为 Windows 下的 `Ctrl` 键。 116 | 117 | 下面是一些常用的 macOS 快捷键: 118 | 119 | - `Command+C`: 复制(或者用 Apple 一向的逻辑:拷贝) 120 | - `Command+V`: 粘贴 121 | - `Command+X`: 剪切 122 | - `Command+A`: 全选 123 | - `Command+Z`: 撤销 124 | - `Command+Shift+Z / Command+Y`: 重做 125 | - `Command+F`: 查找 126 | - `Command+Shift+3`: 全屏幕截图 127 | - `Command+Shift+4`: 选区截图 128 | - `Command+Shift+5`: 完整的截图工具。窗口截图和录屏都可以在这里找到 129 | - `Command+Tab`: 切换应用 130 | - `Command+Q`: 退出当前应用 131 | - `Command+W`: 关闭当前窗口 132 | - `Command+M`: 最小化当前窗口 133 | - `Command+Space`: 打开聚焦搜索 134 | - `Option-Command-Esc`: 打开 `强制退出应用程序` 窗口,类似于 Windows 下的任务管理器 135 | - `Control+左右方向键`: 切换虚拟桌面 136 | 137 | 一些地方也可能会使用图标表示相应的修饰键,例如: 138 | 139 | | 修饰键 | 图标 | 140 | | ------- | :-----------------: | 141 | | Command | | 142 | | Option | | 143 | | Shift | | 144 | | Control | | 145 | 146 | ::: tip 147 | 事实上,上述快捷键不一定是绝对的,例如: 148 | 149 | - 在多标签页的程序(VS Code、浏览器等)中,`Command+W` 用于关闭当前标签页,当没有标签页可以关闭时,关闭窗口。 150 | - 一般情况下,重做对应的快捷键是 `Command+Shift+Z`,但是在某些第三方程序,例如 Microsoft Word 中,`Command+Y` 也可以用于重做。 151 | - 访达下,`Command+C` 表示把文件复制复制(Copy,拷贝)到剪贴板,而 `Command+D` 表示在当前位置创建副本(Duplicate,复制)。至于 `Command+X`,在选择文件的情况下你不能使用这个快捷键,如果你想要 “剪切” 一个文件,正确的做法是 `Command+C` 拷贝,然后使用 `Command+Option+V` 移动。这一快捷键被 Apple 描述为 “将剪贴板中的文件从原始位置移动到当前位置”。 152 | - 访达下还有一个特殊的快捷键 `Command+Shift+G`,用于快速定位到你指定的文件夹 ~~(对自己敲路径的手速有自信的话,快来试试吧)~~。 153 | - 多提一嘴:在 Mac 的原装键盘上你可能找不到 `Del` 键,事实上,那个像是退格键的按键被 Apple 称之为 `Delete`。如果你想要删除后边的一个字符用 `Fn+Delete`,删除文件时用 `Command+Backspace`,删除一个对象?随缘吧,可能是 `Delete` 键本身,也可能根本没有快捷键。 154 | - 你可以在 [Apple 支持](https://support.apple.com/zh-cn/102650) 找到更完整的快捷键参考列表,也可以在顶端菜单栏找到当前应用的快捷键。 155 | 156 | ::: 157 | 158 | #### Shell 快捷键 {#shell-shortcut} 159 | 160 | 我们把这些快捷键单独放一栏。因为它们和操作系统关系较小。这些快捷键如无特殊说明主要针对 Linux Shell。 161 | 162 | `Ctrl+C`: 发送 SIGINT 到前台进程组,默认行为是程序退出。在 Shell 中复制文本避免按下此键! 163 | 164 | `Ctrl+D`: 关闭标准输入,或者说发送 EOF(文件末尾)。在 Windows Shell 中,一般为`Ctrl+Z, Enter`。 165 | 166 | `Ctrl+Z`: 发送 SIGTSTP 到前台进程组,默认行为是程序退出,可用`fg`使程序恢复运行,或使用`bg`使程序在后台恢复运行,或者直接向程序发送 SIGCONT 恢复运行。 167 | 168 | `Ctrl+\`: 发送 SIGQUIT 到前台进程组,和 SIGINT 不同的是,该信号默认不仅让程序退出,还会产生核心转储文件(coredump)。 169 | 170 | `Ctrl+Shift+C`: 复制内容。 171 | 172 | `Ctrl+Shift+V`: 粘贴内容。 173 | 174 | `Ctrl+A`: 编辑命令时回到行首。 175 | 176 | `Ctrl+L`: 清除屏幕,并重新打印当前行。 177 | 178 | 还有其他很多快捷键,有兴趣的同学可以网上搜索或者看 bash 的 man 手册。 179 | 180 | ::: tip 181 | 上面这些 `Ctrl` 键在 macOS 下对应 `Control` 键,这与 macOS 全局对应 `Command` 键有所区别。 182 | 183 | 不过这也带来了一些好处,例如:代表复制的 `Command+C` 在终端下不会与 `Control+C` 冲突,无需担心复制的时候一不小心把程序给终止了。 184 | ::: 185 | 186 | 192 | -------------------------------------------------------------------------------- /basic/08-drive-your-computer-4.md: -------------------------------------------------------------------------------- 1 | # 用好你的电脑 IV 2 | 3 | ::: info 本文信息 4 | 作者:DrBit-64 5 | 6 | 状态:已审阅的发布版,审阅人:000lbh 7 | ::: 8 | 9 | ## 网络安全 10 | 11 | 写在前面,虽然这部分的标题叫做 “网络安全”,但不会介绍任何关于网络的技术层面的协议或是加密方式实现原理,而是主要介绍如何更好地使用现在这个并不太平的互联网,请放心食用。 12 | 13 | ### 一个作为开始的段子 14 | 15 | 你已经死了,这里是地狱! 16 | 17 | 因为你生前总是对着一堆没品笑话哈哈大笑,所以我们决定对你实施最严厉的酷刑! 18 | 19 | ——观看大学生操作电脑! 20 | 21 | 看吧!他在使用 Excel,但是他不会用任何一个快捷键!哦天哪他的 Ctrl 键甚至是全新的……他连自动填充和方向键都不用!从 1 到 100 都是手打的! 22 | 23 | 他输入中文的时候只用两根食指!每输入完一个词,他都用鼠标去点候选词!他一分钟打 20 个字! 24 | 25 | 他想要居中标题,在标题前面打了一连串的空格!直到标题看起来在中间的位置了! 26 | 27 | 他直接在百度上搜 “爱奇艺下载” 了!他点进了华军软件园了!他点了那个最大的 “高速下载”!他直接运行了 p2p 下载器!他没有取消任何一个勾选的捆绑程序,直接点了下一步!他的桌面上多了 4 个,不,5 个,不,6 个图标! 28 | 29 | 他的表格做好了,噢他直接保存到 wps 云端了!他不知道如何把这份表格发给他的上司!他点了分享按钮,给他的上司发了一个金山文档链接!这份表格在云端查看的时候彻底乱码了! 30 | 31 | 他正在下载破解版游戏,他得到了一个压缩包!噢他没有解压缩,直接在压缩软件里点开了 game.exe!游戏报错了! 32 | 33 | 他安装了一个游戏!他把 game.exe 直接剪切到了桌面!点开之后又报错了! 34 | 35 | 他希望把室友电脑里的游戏拷贝到自己电脑里!他把桌面上的快捷方式直接拖到了自己的 U 盘里!插回自己电脑运行的时候又报错了! 36 | 37 | 他打开文件的方式是鼠标左键疯狂连点!他至少点了 10 次!天哪现在桌面上的弹窗都堆不下了! 38 | 39 | 他把 “Doc1.docx” 直接重命名成了 “实验报告”!他连后缀名都删干净了!现在他再也找不到打开这份文档的方法了! 40 | 41 | 他在微信上收到了一个文件,他需要把这个文件用邮箱发出去。噢他完全不知道该怎么操作!他在收件人这一栏输入了上司的手机号!他完全不知道如何添加附件!他也完全不知道微信文件保存到哪里了!他对着微信消息按右键复制,然后把文件名粘贴到了正文栏! 42 | 43 | 他需要下载一个腾讯视频!他在视频网页点击了 “下载”,浏览器开始下载腾讯视频客户端了!他开始安装了!他在客户端里下载了一个 `.qlv` 格式的文件!他直接把这个文件发给别人了! 44 | 45 | 感受痛苦吧!你甚至没法教会他们! 46 | 47 | ### 小心搜索引擎中的陷阱 48 | 49 | 上面段子里主角一样的人物终究只占少数,不过有关搜索引擎使用带来的问题却十分常见,而事故高发地之一就是 steam 的下载。 50 | 51 | ![](../assets/basic/08-drive-your-computer-4/steam.png) 52 | 53 | 很遗憾,这张图内所有看起来像是 steam 的搜索结果全部导向冒充 steam 的第三方网站。 54 | 55 | > [!IMPORTANT] 试一试! 56 | > 找到这两个搜索条目中的 “广告” 字样。 57 | 58 | 很显然误导性如此之强的广告放在首位不是一个好的搜索引擎应该有的行为,不过我们还是可以通过自己的一些努力去防范中招。 59 | 60 | 首先下载最好认准官方途径,除非对自己有着足够的自信否则不建议尝试 _xx 软件园_ 之类的网站。steam 成为重灾区的一个主要原因就是它的官网域名 `https://store.steampowered.com/` 并不直观,并且由于其本身的特殊性导致中国境内对其的连接并不稳定,还因为假冒 steam 有利可图而导致大量仿照 steam 的网站被制作出来坑害新人。搜索 `steam游戏管家` 等关键词可以详细吃瓜这类坑害新人的事件。相比之下国内软件的官网一般不至于在搜索引擎内直接“查无此人”,在搜索引擎中躲开广告条目就可以找到官网。 61 | 62 | 搜索引擎的选择同样很重要,而上图所示的 360 搜索很明显不是一个好的选择。一般来说,`google` 在准确度与效率上更胜一筹,不过需要科学上网。`bing` 与 `百度` 大部分情况下也都可以满足使用需求,而其他的搜索引擎就不作推荐了。 63 | 64 | `edge`, `chrome`, `firefox` 这些浏览器都支持安装扩展(插件),可以在浏览器上安装广告拦截器相关插件,能够帮助处理掉很多烦人的广告,当然也包括上面那张图中那些带有“广告”字样的搜索结果条目。插件的安装方法可以自行搜索,不过注意在 `chrome` 中安装插件可能需要科学上网。另外诸如 `360极速浏览器` 之类的浏览器不在任何情况下推荐。下图是开启广告拦截器之后,在 `bing` 用同样的关键词搜索的结果。可以看到第一项就是我们需要的内容,并且第一页结果所有的条目中均没有导向冒充 steam 的山寨网站。 65 | 66 | ![](../assets/basic/08-drive-your-computer-4/steam-bing.png) 67 | 68 | ### 如何更好地搜索 69 | 70 | 最基础的搜索引擎使用技巧是使用关键词而非问句,比如将 `怎么下载steam` 更换为 `steam 下载`。而对于一些有关国外的信息,使用英文搜索通常可以获得更为准确的结果。另外要辨认信息来源,有帮助的信息来源很多样化,包括但不限于官方文档、专门的资料汇总网站、论坛、前人整理的文章等,但要小心自媒体等“看上去就很不靠谱”的信息来源。一般来讲,信息来源越专业获得信息的效率与准确度越高。 71 | 72 | 另外,搜索引擎中支持输入修饰符。在部分特殊的需求场景下,使用修饰符可以将搜索结果限定从几百万限定到个位数级别,达到精确搜索的目的。~~比如说想搜索在某个论坛内某个用户发表的评论之类的场合。~~ (以下修饰符笔者只在 google 中进行过验证,其它搜索引擎下可以自行尝试) 73 | 74 | - 双引号(" "),可能是最常见的输入修饰符,比如输入 `"马克斯"`,就不会出现有关马克思的结果,也不会出现有关马斯克的结果。 75 | - 减号(-),`-` 后面表示不会出现在搜索结果中的词,比如 `米哈游 -原神` 就只会返回与原神无关的米哈游信息。 76 | - 或(OR |),`OR`, `|` 表示满足两个关键词中的一个即会出现在搜索结果中,比如 `原神 OR 绝区零`, `原神 | 绝区零`会同时返回有关两个游戏的结果。注意这里的 `OR` 必须大写。 77 | - 限定网站搜索(site: ),使用 `site:` 后接网站域名的格式,限定只对特定网站进行搜索。比如 `原神 site:www.bilibili.com` 只会搜索 B 站中有关于原神的内容。对于一些网站本身搜索功能不令人满意的情况可以使用这种技巧。 78 | - 限定标题搜索(intitle: ,allintitle: ),`intitle:` 关键词后接关键字,表示要搜索的关键字只会在标题中出现。比如 `intitle: 这辈子有了` 中所有的结果标题中带有相应的搜索词。当需要标题中有多个关键词时,可以使用 `allintitle:`,比如 `alltintitle:原神 星穹铁道 绝区零` 可以搜集到标题中同时涉及这三款游戏的条目。 79 | - 限定正文搜索(intext: ),通常与 `intitle:` 结合使用,表示关键词应该在正文中出现。比如 `intitle:黑神话 intext:政治正确` ,可以精准定位将这款游戏与政治正确联系起来的一些报道。 80 | - 文件类型搜索(filetype: ),`filetype:` 后面接文件类型,可以直接搜索文件而非网页。比如 `米哈游 filetype:pdf` 可以直接搜索到有关米哈游的一些 pdf 文件。 81 | 82 | 关于更多的搜索修饰符,可以自行搜索学习。 83 | 84 | ### 什么是 url 85 | 86 | 之所以想在这里介绍这一项,主要是想解答“为什么我的网址这么长”的问题。 87 | 88 | **URL(Uniform Resource Locator,统一资源定位符)**,也就是出现在浏览器“网址框”中的那一长串字符。一般包含协议、域名、路径、查询字符串等信息。 89 | 比如这个一长串 url: `https://search.bilibili.com/all?keyword=never+gonna+give+you+up&from_source=webtop_search&search_source=5` 90 | 91 | - `https://` 表示访问资源使用的是 `https://` 协议,关于这个协议的具体内容我们这里不做介绍。 92 | - `search.bilibili.com` 是域名,也即 b 站的搜索页面。 93 | - `/all` 是路径,也即访问的资源在域名的 `/all` 目录下。其它情况下可能会有更复杂的路径,协议+域名+路径是最常见的 url 组成形式。 94 | - `?` 后面的所有信息都是查询字符串,表示我们向服务器发送的请求。能表示在 url 中的请求都以 `xxx=yyy` 的 `键值对` 形式出现,并用 `&` 连接多个键值对。比如这里的 `keyword=never+gonna+give+you+up` 代表我们的搜索关键词是 `never gonna give you up`。如果更改后面的内容,会发现显示在网页搜索框中的词也同步发生了变化。再后面的 `from_source` 键值对可能表示搜索请求来自于网站顶部的搜索框。而 `search_source` 可能与网站内部逻辑有关。 95 | 96 | 顺带一提,B 站(可能其它视频软件也有类似的现象)网页端生成的视频分享链接后也同样带有着相同的查询请求字符串,很可能用来标记这个分享链接的生成来源。前段时间有 `b站给我推送了qq群群友的账号` 之类的新闻,而这种隐私泄露很可能与分享链接有关。如果有需要,可以将 `?` 及后面的全部内容删掉后再进行分享,只保留域名和路径就可以实现对视频等资源的正常访问。 97 | 98 | ### 隐私保护 99 | 100 | 隐私泄露一直是很严重的一项问题,甚至很多隐私泄露不是我们能够防止的。不过在日常中做好相关预防工作,降低自己隐私泄露的风险还是有意义的。 101 | 102 | 在线下店消费过后,有时店员会让你一些填写个人信息,名义上说是用于售后服务。这时记得稍微留意一下,售后服务是否真的需要自己留下的这些信息,如果不需要的话随便填写些假信息即可。比如在线下门店购买手机之类的情景下很明显不需要在门店留下自己的信息。 103 | 104 | 社交软件以及论坛同样是隐私泄露的重灾区,除非工作需要没必要在头像、用户名等公开信息中用到任何关于自己个人隐私的信息。`设置-隐私` 中一般会有关于自己个人信息可见度的设置,可以根据个人需要进行设置。需要特别注意的是,微信中的 `允许陌生人查看十条朋友圈` 和支付宝中的 `向好友公开我的真实姓名` 是默认开启的,强烈建议关闭,尤其在这两个账号都可以被手机号搜索到的情况下。(当然也可以在 `添加我的方式` 中把手机号等途径取消掉) 105 | 106 | 如果活跃在论坛或是公开群聊中,难免涉及到一些自己的真实情况,而如果碰上了别有用心的人,这些信息很容易被收集。~~上文介绍的高级搜索技巧很适用于这种场景!~~ 最简单的反制方式是发言时多留意一下删去敏感的内容。使用常见大众的用户名以及在不同平台使用不同用户名同样是一个好的选择,防止自己在不同平台泄露出的信息被同时收集。当然,不去引起“别有用心的人”的注意也很重要,就像《三体》里描述的“藏好自己”一样,不太张扬总是好的。 107 | 108 | ### 简单的安全措施 109 | 110 | 在当今的互联网世界,与安全最直接相关的无疑是自己在各个平台下设置的密码(password,更准确的说法是“口令”,但是我们在这里不区分“口令”与“密码”的区别),以及有约等于密码效力的手机验证码。除了防止自己密码被别人偷看这种事情之外,最应该做的事就是不要用弱密码,再就是尽量在不同的平台用不同的密码。诸如 `qwertyuiop`, `aptx4869`, `password` 及其各种变种,类似于 `p@5sw0Rd` 等看似很安全的密码,以及常见的日期,拼音等都位于随手就能查到的弱密码库内。密码尽可能不要带有含义,或者说最好能保证只对自己有含义。市面上存在一些密码管理工具,浏览器也开始支持生成随机强密码并与账号绑定进行管理的功能,可以考虑合理地使用这些工具。除了满足以上要求,一般建议密码长度至少 8 个字符,包含大写字母、小写字母、数字和特殊符号中的至少 3 种,有条件的可以定期更换(但是并不强求,自行衡量利弊)。 111 | 112 | 一些网站和服务支持多因素认证(2FA),如果可能的话,请尽量开启这一功能,可以保证你在密码遭到泄露时不至于丧失对账户的控制权。 113 | 114 | 校园网内并不太平,有很多被黑客控制的机器(也被称作“肉鸡”)正每时每刻试图扫描校园网内的 SSH、VNC、RDP 等服务,获取受害机器的权限。对于使用弱密码的机器,非常容易在这种扫描中被攻破,从而沦为下一个“肉鸡”,进行攻击、非法挖矿、勒索数据甚至非法窃取数据的黑客活动。我们建议在开启上述服务的机器上的远程身份验证仅开启密钥验证手段(11 章有教程)。如果因为协议本身不支持密钥或者其他特殊原因必须使用密码登录,则务必使用强密码,且建议配置 fail2ban 或者类似服务。Windows 服务器可以在组策略中设置输错密码若干次则锁定账户。 115 | 116 | ::: danger 警告 117 | 即使是短时间的测试,也不要使用弱密码,你的机器可能瞬间沦陷!如果实在有必要,可以考虑临时关闭 SSH 等服务。 118 | ::: 119 | 120 | ::: details 什么是密钥登录 121 | 数学中存在一类问题,验证解的正确性很简单,但是求解问题本身却很难。一个很典型的例子是质因数分解,给你一个解,你可以很容易地验证其是否是正确的分解,但是只给你一个由两个大质数的乘积构成的合数,你很难快速得出其分解。密码学则利用这些问题构造非对称加密,如质因数分解的问题诞生了 RSA 算法,还有离散对数,椭圆函数上的运算等问题,也诞生出了相应的非对称加密算法。 122 | 123 | 以 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$ 中的一个就可以很容易推出另一个,非对称加密也就失去了其意义。 124 | 125 | 密钥登录则利用了这种特点,服务器上只需要存储公钥,而私钥只在你本地存储,每次验证过程中,你用私钥加密服务器发给你的一段随机内容,服务器再用公钥进行解密。猜对你的私钥或者你加密的结果都是几乎不可能完成的,因此这种方式安全性很高(只要你的私钥不泄露)。 126 | 127 | 遗憾的是,这些非对称加密算法的安全性没有得到数学上的证明(需要先证明 P=NP 不成立,且要证明这些问题本身是 NP 问题且不是 P 问题,而 P=NP 是否成立是一个悬而未决的世纪难题),但是实践中它们已经被认为是足够安全的。随着计算机算力的提升,算法中使用的数字也越来越大,防止算法被暴力攻破。 128 | ::: 129 | 130 | 北京大学每学期都会向邮箱中发送包含钓鱼链接的恶意邮件进行安全测试,每次都可以看到有新同学中招。另外,前段时间也有某网红被伪造的法院网站骗走个人信息的新闻传出。前文提到的 “steam 山寨网站” 其实也可以看作某种钓鱼链接,所以说这种恶意行为在生活中实际上极其常见。 131 | 不相信不确定的信源、不点进陌生的网站、不下载不可信的文件是防范的最好手段。很多攻击行为不需要用户的交互就可以触发,比如打开网页的时刻相关脚本就可以在本地运行,所以说不要随便为了满足自己的好奇心而点进一些有风险的网站。另外不要忽略伪造网站中 “漏出的马脚” 。伪造网站往往存在错误的域名、存在偏差的界面排布、不合理的功能设置。及时发现这些不合理之处也能够即时止损。 132 | 133 | ![](../assets/basic/08-drive-your-computer-4/mail.png) 134 | 一则用来测试安全意识的钓鱼邮件,可以注意到发件人使用的是高仿北大邮箱域名。无论下载附件还是点进附件中的链接都是危险的行为。 135 | 136 | ### 什么是代理 137 | 138 | 代理在日常网络生活中被广泛使用,并且它不只是某项不可言说的东西,所以介绍代理的概念还是十分有必要的。 139 | 140 | 就像字面意思一样,代理服务器的功能就是代理网络用户去取得网络信息。在一般情况下,我们使用网络浏览器直接去连接其他 Internet 站点取得网络信息时,须先向对方发出请求,然后对方再把信息传送回来。代理服务器是介于浏览器和 Web 服务器之间的一台服务器,有了它之后,浏览器不是直接到 Web 服务器去取回网页而是向代理服务器发出请求,请求报文会先送到代理服务器,由代理服务器来取回浏览器所需要的信息并传送给你的浏览器。 141 | 142 | 客户端和服务器都可以使用代理。客户端代理可以隐藏真实的客户端 ip 地址、过滤一些不正常的访问请求。当然也可以使用代理绕过访问过滤器。服务端的代理将访问转发给真正的服务器,这层代理可以添加缓存功能,以提高服务器相应速度;也可以进行负载均衡,将请求“均匀”地转发给多台均匀的服务器;也可以作为安全组件,阻挡一些针对于服务器的攻击。 143 | 144 | 另一个值得介绍的概念是**虚拟专用网络(Virtual Private Network)**,~~这个词的英文简称可能有些敏感。~~ 除了连接全球的 Internet 之外,学校、公司等也会维护自己的专用网络,比如链接在北京大学校园网内部的相关资源就无法从外部进行访问。而虚拟专用网络可以在共用网络上通过加密协议建立虚拟的专用网络,也可以将虚拟网络虚拟扩展的一个或多个其他网络。最经典的应用就是让外地员工访问到内网资源,在内网中架设一台 VPN 服务器。外地员工在当地连上互联网后,通过互联网连接 VPN 服务器,然后通过 VPN 服务器进入企业内网。为了保证数据安全,VPN 服务器和客户机之间的通讯数据都进行了加密处理。 145 | 146 | 最后,虽然有加密协议支持,使用代理还是意味着流量经过了客户端与服务器之外的第三者,也因此存在数据泄露的风险。使用时请多加留意。 147 | -------------------------------------------------------------------------------- /basic/09-drive-your-computer-5.md: -------------------------------------------------------------------------------- 1 | # 用好你的电脑 V 2 | 3 | ::: info 本文信息 4 | 作者:DrBit-64 5 | 6 | 状态:未审阅的草稿版本 7 | ::: 8 | 9 | ## 操作系统与编程语言 10 | 11 | ### 什么是操作系统 12 | 13 | 用最简单的话来说,操作系统负责管理计算机的软硬件资源,并给用户和其他软件提供接口和环境,是计算机中**最基础的软件**。 14 | 15 | 很显然,对于一个程序开发者而言,直接面向硬件编写程序是费时费力的。这样的话,大量的程序可能都会涉及到一些相似的功能,比如如何处理来自键盘等设备的输入,再比如如何管理文件与内存。从“合并同类项”的角度来看,建立一个新的抽象层次来负责管理系统资源相关的事项是自然且合理的。顺带一提,这种**建立抽象层次**的设计模式在计算机中是相当常见的。 16 | 抽象意味着上层次只需要知道下层次可以满足他们的某项需求,而无需了解这项需求是如何被实现的。这种设计理念可以让每一个层次专注于它们自己应该实现的功能,而避免被来自其他层次的细节所困扰。如果一台电脑更换了 cpu,我们显然不会重写运行在这台电脑上的所有程序,而是仅仅将 cpu 调用模块相关的代码“更换”掉。将不同的功能**封装**在不同的模块里所带来的好处是显而易见的,而这种封装就是抽象的一种体现。 17 | 18 | 操作系统可以被看做一个功能很强大的封装模块。在有了操作系统之后,我们可以实现更方便地实现一些功能,同时实现一些没有操作系统就实现不了的功能。以下有一些简单的例子: 19 | 20 | - 哪怕在只有一颗 cpu 的电脑上,也可以做到同时写代码和听音乐。但很明显,音乐播放器和代码编辑器的代码中不会包含自己如何和别的程序同时运行的功能,cpu 也不是生来就会同时运行多个程序。操作系统通过微观上协调多个程序**交替**执行,而在宏观上表现为多个程序**同时**执行。这种**并发**技术是操作系统的一个重要特征。 21 | - 在实际上的电脑使用中,我们会遇到各种各样的错误,一个软件的小错误就导致整台电脑蓝屏甚至硬件损坏显然是不可接受的。虽然程序内部也应该包含错误处理机制,但遇到一些不负责的程序或者程序遇到了一些它们自己处理不了的情况时,操作系统的错误处理机制是必要的。比如在信科相关的课上,会有同学尝试编写生成上万个子进程却不负责销毁的代码,再比如有些同学会编写占用远大于内存大小的空间的代码。此时则需要操作系统进行“兜底”,在软件层面即时地阻断错误与异常继续向下层传播。关于操作系统与错误处理,这里有一个(可能)有趣的知乎问题:[如果抛开操作系统,直接在裸机上进行除零操作会发生什么情况?](https://www.zhihu.com/question/552173126) 22 | 23 | ### 用户界面——CLI,TUI 与 GUI 24 | 25 | 目前常见的计算机操作系统有 Windows, Linux 和 macOS,移动操作系统则包括 Android 与 iOS,当然华为在近些年研发的鸿蒙系统也包括在内。 26 | 前文提到,操作系统负责给用户和其他软件提供接口,给其他软件提供的接口的使用方法往往藏身与各种繁杂的文档中,我们对他们并没有太大的兴趣。相比之下,我们则每天都在使用操作系统为用户提供的接口。从关机到新建文件夹再到打开一大堆程序,这都是我们直接与操作系统交互进行的例子。**UI (User Interface),用户界面**,则是直接涉及到用户应该如何与操作系统(或者是其他的软件)进行交互的核心模块。 27 | 28 | 目前大部分常见的 UI 都是** GUI (Graphics User Interface),图形用户界面**,显著特征为通过鼠标(以及触摸屏)等输入设备与图标或菜单选项进行交互,启动对应的程序或执行相应的命令。这种交互方式最大的优点在于直观且易于上手,学习曲线平和,鼠标交互的方式可以省去大量指令的记忆成本,同时也有不错的效率。相对应的,**CLI (Command Line Interface,命令行界面)、TUI (Terminal User Interface/Text-based User Interface,终端用户界面/基于文本的用户界面)** 则不依赖图形而是主要依赖键盘输入大量指令,对指令的记忆成本也造成了较为陡峭的学习曲线。CLI 是早期大部分计算机的交互方式,而 TUI 可以部分视作在 CLI 的基础上进行了丰富。 29 | 30 | 在 CLI 中,所有操作都通过在命令行中输入指令进行。相应地,系统会通过文本形式输出相应内容。CLI 与现代常见交互方式的一个主要不同是它并没有一个用来交互的“菜单”之类的东西。下面是 Wiki 上关于 CLI 条目里的一张图,可以看到用户在终端中输入了 `ping`, `pwd`, `cd`, `ls`, `yum` 这些常见的指令,之后计算机将这些指令的执行结果输出到了终端里。虽然输出结果中存在简单的排版与动态进度条之类的要素,但这些结果本身并不能做出“光标选中”之类的交互动作,而是仅仅作为“展示”之用。 31 | 32 | ![](/assets/basic/09-drive-your-computer-5/Linux_command-line._Bash._GNOME_Terminal._screenshot.png) 33 | 34 | 而 TUI 虽然绝大部分都由字符组成,但有更为丰富的表现形式且可以接受更为丰富的输入。最经典的 TUI 恐怕要属(可能很)大名鼎鼎的文本编辑器**Vim**。在 Vim 中,用户可以通过大量的功能强大的指令进行移动光标、修改文本以及其他更复杂的操作。从图中可以看到,TUI 相比 CLI 来说更像一个“界面”,包含了光标,窗口等要素,只不过这些要素都由文本构成(感谢 ╣ 之类的框线字符)。CLI 与 TUI 的一个好处是摆脱了对于鼠标的依赖,不过更大的好处是避免机器将性能花费在渲染图形上。现在的家用电脑大多不需要对这种程度的性能精打细算,但涉及到服务器以及需要远程控制之类的场合,节省下来的这些性能以及空间还是显得十分实惠,以及远程传输文本总比远程传输图片方便,不至于被肉眼可见的鼠标移动延迟折磨心智、血压升高的尴尬情况出现。另外说句题外话,从代码编写者的角度来讲,由于为代码编写 UI 总是耗费精力的,所以我们大多时候与自己写的程序进行交互总是通过 CLI 的方式,所以熟悉 CLI 与 TUI 的这种交互方式总是没有坏处的。 35 | 36 | ![]() 37 | 一张 Wiki 上 Vim 的图片,注意到虽然界面还是全部由文字组成,但出现了“窗口”的概念,窗口中的内容也可以动态进行交互。 38 | 39 | ### 集成开发环境与文本编辑器 40 | 41 | 写在前面:以下内容更加适合配合计算概论相关课程食用。 42 | 43 | 入门的计算概论课往往会推荐 Visual Studio 或 Pycharm 作为编写代码的工具,而更进阶的课程会推荐 VSCode,再深入了解一些还会发现 Vim,Emacs 这样的工具。上面提到的这些代码工具可以大致分为两类,其中 Visual Studio 和 Pycharm 通常被称作**IDE (Integrated Development Environment, 集成开发环境)**,而其他的则被称为文本编辑器。虽然说随着时代的发展这两者之间的边界已经开始模糊,但理解这两个概念还是有必要的。IDE 提供代码编辑、调试、构建、版本控制等多种功能于一体,通常集成了编译器、调试器和其他开发工具。而代码编辑器功能相对单一,通常只提供代码高亮等与代码编辑相关的功能。在 IDE 中运行代码可能只需要点击“运行”按钮,而严格来说在代码编辑器中无法运行代码,而需要在终端中手动输入编译相关的指令才能让代码“跑起来”。因此想需要使用代码编辑器需要额外配置编译器、调试器相关的环境(环境配置是一个巨大的坑,新手在这方面遇到挫折是很正常的现象,千万不要灰心),这也略微加大了使用代码编辑器的上手难度。不过代码编辑器轻量简洁的优势值得额外配置环境的工作量,Vim 可以直接在 TUI 中运行,VSCode 的体感启动速度也明显快于 Visual Studio。 44 | 45 | 代码编辑器的另一个特点是可以通过添加插件以丰富其原版略显单薄的功能。VSCode 被推荐的一个主要原因就是其可以通过添加插件的方式获得几乎对所有语言的支持。~~当然也可以添加类似 Code Runner 之类的插件将其改造成类似 IDE 的形式,很多 VSCode 的入门教程都会介绍这个插件。~~ 虽然说对于 VSCode 来说更自然的运行代码方式是在其内的终端里手动输入编译/运行相关的指令,这也更符合其“代码编辑器”的定位。 46 | 47 | ### 什么是命令式语言 48 | 49 | 不同的计算概论课程会分别介绍 Python 和 C/C++这两种语言(计概范围内的 C 与 C++ 其实可大致看成一种语言)。虽然上到设计理念下到编写细节这两种语言都有很多不同点,但其都属于命令式语言(虽然现代 C++ 以及 Python 都支持面向对象和函数式设计,但其主体还是属于命令式语言)。命令式语言的计算理论来自于**图灵机**,通过对**状态的改变**描述计算的过程。它们的语句主要为对状态(也就是变量内部存储的值)的改变以及对控制流的改变(也就是条件或循环的跳转语句)。因此将简单的 C++ 和 Python 代码互相转换并不是什么难事,因为它们描述计算所用的方式所用的方式一样。另一种常见的编程范式是函数式语言,主要例子为 Haskell。其计算理论来自于 **λ演算**,通过创建匿名函数和应用函数描述计算。有和图灵机一样的描述能力。函数式语言相对来说更难理解,这里不再深入。 50 | 51 | ### 编译型语言与解释型语言 52 | 53 | C++ 与 Python 的一个重要区别就是代码实际运行的方式。~~另一个重要的区别是类型系统,不过这一项相对直观我们不做深入。~~ 计算机只能够运行字节形式的可执行文件,而可执行文件(中的代码部分)与编程语言最底层的汇编语言有着一一对应的关系,因此可以说计算机只能识别汇编模式的代码。 54 | 55 | C/C++ 的**编译器**做的事情实际上就是把源代码翻译成汇编代码,再经由**链接器**进行与头文件的整合相关工作,最终得到一份可以被直接运行的可执行文件。因此,C++代码的运行分为两步:先是编译再是执行。这种方式的一个主要好处就是一份需要被反复运行的代码只需要被编译一次,而节省了编译部分的耗时。编译器与链接器报的错误大部分情况下很好解决,~~小部分情况下会因为涉及到环境问题而变得棘手。~~ 编译器可以识别语法错误以及部分的语义错误,因此一份运行起来的 C++ 代码天然地有更小几率出现 bug。在 “通过编译器减少 bug” 方向上一门叫 **Rust** 的语言做得更加极端,其在编译器内建立了大量的语义约束,保证能被运行的 Rust 代码**一定**不会出现内存安全问题与线程安全问题,不过相应地也显著提高了 Rust 的代码编写难度。 56 | 57 | 而 Python 则走向了另一个极端。Python 代码运行使用的是另一套称为**解释器**的代码翻译逻辑。直观来讲,解释器允许代码一边被翻译为汇编语言一边被执行。也因此,终端里可以发现 `.py` 后缀名的 Python 代码文件可以被直接视为可执行文件,而 `.cpp` 后缀名的 C++ 代码文件只能被视为文本文件。解释器可以省去每次更新代码时都要将项目重新编译的时间花销,但代码的实际运行效率相比编译型语言来说更差。体感表现为 Python 代码比 C++ 代码慢很多,~~真的非常多!~~ 一些完全不符合语法要求的代码也可以在解释器中跑起来——解释器只会在按顺序运行代码,直到在出现问题的的地方停止。Python 自身的动态类型系统与缺少编译器带来的静态查错系统使得实际写出来的 Python 代码中经常包含大量的 bug,并除实际运行之外缺少 debug 的手段。~~但因为语言特性而引发的 bug 必然不是过于复杂的 bug,不需要在这点上过于担心。~~ Python 并不适合大型项目的开发,不过动态类型与解释器带来的灵活性使得 Python 在小型项目上拥有无可匹敌的竞争力。与 C++ 相比,Python 作为现代语言,拥有更为成熟的库文件机制,`import` 比起 `include` 实在是好用了太多。大量的第三方库以及 `pip`, `anaconda` 等 Python 环境管理工具也是 Python 竞争力的重要来源。 58 | 59 | ### 如何阅读报错与调试代码 60 | 61 | 调试代码中的错误是每位写代码人都不可避免的一件事。错误可以简单地分为语法错误、语义错误与逻辑错误。其中语法错误和大部分语义错误会被编译器(为方便,以下“编译器”包含 Python 等语言中的“解释器)直接发现。而逻辑错误,也就是编写出的代码与预期不符的情况,由于代码逻辑本身所带有的复杂性,而不可避免地拥有复杂性,这种 debug(为方便,以下可能会混用 `debug` 与 `调试`)往往需要优秀的经验、直觉、心态以及运气。 62 | 63 | 之所以在节标题中单列了如何阅读报错,就是因为语法语义错误是初学者最经常遇到的问题,而编译器会以报错信息的形式友情提示这些错误是什么、在哪里。而高级一些的代码编辑工具,还会把能被编译器检测出来的错误实时地标注在代码上面。~~这也是为什么写出来的 Python 代码往往会带有很多 bug 的原因,因为动态类型导致语法语义层面的错误无法被编译器静态检测出来,从而无法在编写代码时就获得提示。~~ 64 | 以下是一个简单的编译器报错信息例子。 65 | 66 | ```cpp 67 | #include 68 | using namespace std; 69 | int mian() 70 | { 71 | cout<<"Hello World!"< g++ example.cpp -o example.exe 80 | D:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: D:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.1.0/../../../../lib/libmingw32.a(lib64_libmingw32_a-crtexewin.o): in function `main': 81 | C:/M/B/src/mingw-w64/mingw-w64-crt/crt/crtexewin.c:70: undefined reference to `WinMain' 82 | collect2.exe: error: ld returned 1 exit status 83 | ``` 84 | 85 | 虽然信息略显抽象,但我们还是可以看到很多有用的信息。 `ld` 是 c++中的链接器,再往上看可以发现对 `WinMain` 的引用是未定义的。这提示我们去看 main 函数,从而发现这里 `main()` 被输入成了 `mian()`,因此链接器无法找到 main 函数,从而引发错误 86 | 87 | 下面是另一个例子; 88 | 89 | ```python 90 | def calc(numbers): 91 | total = sum(numbers) 92 | count = len(numbers) 93 | return total / count 94 | 95 | numbers = [10, 20, 30, 40, 50] 96 | print("Average:", calc(numbers)) 97 | 98 | numbers.append("60") 99 | print("Updated Average:", calc(numbers)) 100 | ``` 101 | 102 | 以下是运行代码后输出的信息: 103 | 104 | ```arduino 105 | Average: 30.0 106 | Traceback (most recent call last): 107 | File "example.py", line 10, in 108 | print("Updated Average:", calc(numbers)) 109 | File "example.py", line 2, in calc 110 | total = sum(numbers) 111 | TypeError: unsupported operand type(s) for +: 'int' and 'str' 112 | ``` 113 | 114 | 可以看到解释器对第 2 行和第 10 行进行了报错,其中最下面一行是错误实际发生的位置,而上面的则描述了函数调用,也即第 2 行的错误是在执行第 10 行中的 `calc` 函数时发生的。如果代码结构比较复杂或者错误实际发生的位置位于来自 `import` 的内部库中,则 `Traceback` 中可能会给出大量的函数调用记录。此时不要惊慌,找到属于自己写的代码最靠近错误位置的行数查看即可。 115 | 回到正题,最后一行给出了错误的原因 `TypeError`:Python 中的 `+` 运算符作用在 `int` 类型与 `str` 类型的数据之间。这提示我们去看 `sum()` 作用的对象,也即 `numbers` 列表,并进一步发现 `numbers.append("60")` 向 `numbers` 中添加了一个字符串形式的 `"60"`,而 `numbers` 其余的元素均为整数类型的数字。将这一句改为 `numbers.append(60)`,代码会正常运行。 116 | 顺带一提,虽然这段代码翻译到 C++中根本不会被编译器通过,但 Python 的解释器还是运行代码直到遇到了具体的问题,在输出信息中可以看到第一个 `print()` 语句仍然被正常地执行。 117 | 118 | 而关于更复杂的 debug 问题,很难给出具有代表性的例子或是在几段话内讲清楚,不过还是有一些具有普适性的建议。在这方面互联网上有很多的资料,感兴趣的同学可以去自行了解。 119 | debug 最重要的一件事是缩小错误出现的范围,为达成这一目的我们通常会跟踪代码的行为,直到发现代码的行为与预期不符。调试器可以提供“跟踪代码行为“的功能,而不想学习调试器使用方法的话通过 `print` 语句打印代码中间状态也是一个不错的选择。前文提到的模块化的设计方式在这里仍然适用。先是找到出现问题的模块,再缩小搜索范围直到找到出现问题的具体语句。 120 | 而更棘手的情况是代码只在特定的数据上出现问题,比如 OJ 告诉你的代码出现了 `Wrong Answer` 或 `Runtime Error`,而你却不知道导致代码出现问题的数据到底是什么。这时最应该做的是重新审视自己的预期(以及 OJ 题的题面),寻找是否遗漏了什么约束条件或关键信息。一份貌似运行正常的代码很有可能会在边界条件或复杂数据的情况下出问题,可以尝试手写一些处于边界条件之下的数据,或编写一个数据生成器来生成更复杂的数据。实在手足无措时,休息一下放空大脑也是很好的选择。实在走投无路之时,摇人求助也不是什么大不了的事情。debug 很可能会占用比编写代码更多的时间和精力,保持良好的心态才是 debug 的关键。 121 | -------------------------------------------------------------------------------- /basic/10-linux-basic-1.md: -------------------------------------------------------------------------------- 1 | # Linux 与服务器介绍与基本使用 I 2 | 3 | ::: info 本文信息 4 | 作者:leavelet 5 | 6 | 状态:已审阅的发布版,审阅人:000lbh 7 | 8 | 注:本文的部分材料来自北京大学超算队“HPC From Scratch” 课程第一讲 [Linux 与命令行入门](https://wiki.lcpu.dev/zh/hpc/from-scratch/01-linux-git-101)。 9 | 10 | ::: 11 | 12 | ## 前言 13 | 14 | 相信各位中一定有很多人是因为迫不得已而使用 Linux。更深入得想一想,还有没有其他原因呢? 15 | 16 | 对于 Windows 等带图形化界面操作系统,我们所访问的其实是设计者抽象出的交互逻辑。但对于高效的系统,自底向上的彻底理解和掌握是高效使用系统的必备途径。我们得以更深入洞悉文件和文件之间的联系,获得系统更高的主动权。同时,以最小化的人机接口访问能把足够多的资源投入至计算,获得最高的资源利用率。`Linux` 正是带着这样的思想而诞生的。 17 | 18 | 因此,学习 Linux ,我们需要掌握: 19 | 20 | 1. 对这一套思想有充分理解、能顺利玩一些玩具 21 | 2. 使用现有的工具操作命令行、把他人准备好的软件运行起来 22 | 3. 创造新的工具 23 | 24 | 让我们开始吧! 25 | 26 | ## 关于资源 27 | 28 | 我们并没有先讲怎么获得一个基于 Linux 的系统,也没有讲这到底是个什么东西。当然,不摸一摸,知道用起来舒不舒服,要了解它、安装它干啥呢?所以我们在这一讲推荐大家直接去 [CLab](https://clab.pku.edu.cn/) 注册一个账号,根据上面的指南在连接到虚拟机。这样,你就可以在不破坏自己的系统的情况下,体验 Linux 的魅力了。等你被 Linux 深深吸引,就可以到我们的下一讲,看看怎么自己安装一个 Linux 系统了。我们这里以 `Debian` 系统为例,大家在 `CLab` 创建云主机的时候,镜像选择 `Debian 12` 即可。 29 | 30 | ## 先跑个小火车 31 | 32 | 先来个具体的例子,跑个小火车先。连接到你的 `Linux` 虚拟机,依次输入: 33 | 34 | ```bash 35 | sudo apt update 36 | sudo apt install -y sl 37 | sl 38 | ``` 39 | 40 | 就可以看到一个小火车从你的终端窗口驶过了。这个小火车是一个叫 `sl` 的软件,是一个玩具软件,用来~~矫正把 ls 打成 sl 的坏习惯~~展示 ASCII 艺术的。`apt` 是 `Debian` 系操作系统的包管理器,就是帮你管理软件的,`sl` 是一个很小的软件,所以安装的时候很快就安装好了。 41 | 42 | 大家看哈,一个程序就这么跑起来了,你已经能让 Linux 系统帮你做事情了。我们来具体看看这是怎么发生的。 43 | 44 | 你输入的命令大概是这样一个形式: 45 | 46 | ```bash 47 | 程序 子命令 选项 对象 48 | ``` 49 | 50 | 其中,除了子命令,选项和对象都是可选的。我们就以第二个命令为例: 51 | 52 | `apt` 是你要运行的程序,`install` 是子命令,`-y` 是选项,`sl` 是对象。很明确了是不是?那么我又怎么知道有哪些程序,这些程序又怎么用呢? 53 | 54 | 第一个问题可以通过搜索学到,描述你要干的事情,搜索引擎会告诉你需要什么软件,相信大家在第二讲已经学过,同时我们也会在第二讲给大家介绍一些常用的命令。 55 | 56 | 第二个问题,程序的作者也想到这个问题了,所以大部分程序都会带有帮助程序和帮助文档: 57 | 58 | - `apt -h`:这是最简单的程序帮助,会列出一些常用的知识 59 | - `man apt`:这是最详细的程序帮助,会列出所有的知识,但是可能会很长 60 | - `tldr apt`:这个命令会给出一些使用示例,可以照着抄 61 | (`tldr` 需要自行安装,相信你可以根据上面安装 `sl` 的方法举一反三) 62 | 63 | ## Linux 101 64 | 65 | 好,你现在已经知道怎么用 Linux 了,我们来介绍一下 Linux 的一些基本概念。本讲我们不会涉及到很深刻的内容,只是让大家有一个大概的印象。在后续探索中,大家会有更深入的想法。 66 | 67 | 首先我们来想一想,你刚刚输入的命令是什么?是一个叫做 `sl` 的程序。程序是什么?你的终端怎么知道 `sl` 是什么的?小火车是怎么输出到你面前的?为了成体系地解决这些问题,计算机前辈们发挥了计算机科学中”抽象“的传家本领:只要能把这些东西抽象归纳为一个概念,就可以方便地管理所有资源。 68 | 69 | 所以,“文件”这一概念被抽象出来,Unix 认为“一切皆文件”:他们是数据的容器、可读可写,可以被操作。这样,我们就可以用同样的方法来操作文件、程序、设备等等。这时候就有更多问题了: 70 | 71 | - 文件怎么组织? 72 | - 文件是谁的,如何反应不同类型的特性? 73 | - 如何处理文件间的联系? 74 | 75 | ::: tip 停下来想一想 76 | 77 | tar 是 Linux 下常用的压缩解压缩工具,试试看怎么创建一个 tar 压缩包,然后解压缩它。 78 | ::: 79 | 80 | ### 文件如何组织 81 | 82 | Windows 下,物理实在先于文件而存在,你可能会看到 C D E 盘等盘符,文件是放在盘符下的。但是 Linux 中,硬盘本身也是文件,所以根目录 `/`,在所有文件之前存在,所有文件都由其派生。其中,文件夹是一种特殊类型的文件,其中可以包含一系列文件和文件夹的索引。 83 | 84 | 通过 `cd` 命令,你可以在切换当前所在的文件夹;通过 `ls` 命令,你可以查看文件夹下面的内容(不加参数默认是查看当前文件夹)。路径有一些缩写,你可以认为它们会被自动扩展为从 `/` 出发的路径。`.` 是当前目录,`..` 是当前目录的父目录,`~` 是当前用户的家目录,通常为 `/home/用户名`,或者 `/root/`。 85 | 86 | Linux 上,文件的路径分绝对路径和相对路径两种。绝对路径指的是以 `/` 为开头或者将被扩展为 `/` 开头的,从根目录开始查找到本文件的路径,如 `/home/lcpu/hello.c`,`~/hello.c`,`./hello.c`(后两种都将被扩展为`/home/lcpu/hello.c`)。相对路径指的是相对于当前所在文件夹,文件的存放位置。如果你的当前目录在 `/home/lcpu/`,那么 `hello.c` 指的就是绝对路径为 `/home/lcpu/hello.c 的文件`。 87 | 88 | 注意,为了安全性考虑,对于可执行文件,如果没有提供绝对路径,终端会在 `PATH` 中查找,而不会在基于相对路径当前文件夹下查找。如果当前文件夹中有 `hello` 需要使用 `./hello` 进行执行。直接执行的话,终端会因为 `PATH` 指定的路径中没有 `hello` 而报错。第四讲中讲过 `PATH` 在 Windows 系统中的含义,Linux 中也大同小异。 89 | ::: tip 试一试 90 | 91 | 在自己机器上的 `/` 路径下面逛逛。 92 | 93 | 查找资料并回答:`/proc` 和 `/dev` 是什么?哪个文件可以获取 CPU 的核心频率? 94 | 95 | 查阅 scp 和 rsync 的 manual,可以了解如何与远程主机之间进行文件传输。 96 | 97 | ::: 98 | 99 | ### 文件是谁的,有哪些属性? 100 | 101 | 对文件的基本操作,有读、写、执行三种。作为多机系统,Linux 中文件如果对每个访问者都相同,那就没有安全性可言了。Linux 的做法是,抽象出了“用户”这个实体(其实就是在 `/etc/passwd` 里面定义的一行 UID 和用户名的对应而已)。为了方便用户的文件共享,同时抽象出了组(Group)的概念,代表一组互相信任的用户。 102 | 103 | ::: info 补充材料 104 | 105 | root 是一个特殊用户,可以自行查阅资料了解。 106 | 107 | ::: 108 | 109 | 用权限位 4、2、1 (二进制下第 3 2 1 个 bit )代表读、写、执行的权限,每个文件的读、写、执行,对应当前用户、组内用户以及其他用户组成的 3\*3 矩阵,就是文件的权限。把每一类用户的权限相加可以得到当前权限的简写。 110 | 111 | 例子:750,当前用户$7 = 4 + 2 + 1$,可读可行可执行;同组$5 = 4 + 1$,可读可执行不可写;其他用户$0$,没有任何权限。你可以查看 `chmod` 的帮助,了解如何改变权限。 112 | 113 | **所以可执行文件并不是因为这个文件本身有什么特别,而是这个文件被你赋予了可执行的性质。** 一个简单的文本文件也可以被加上可执行的权限,也可以发挥操作其他文件的作用,后文的 `Shell` 脚本,以及 `Python` 脚本,都是如此。 114 | 115 | ::: tip 试一试 116 | 117 | 如果你会写 Python 的话,写一个从输入读取 4 个数字,输出他们和的程序,输出结果到控制台。 118 | 119 | 在本地跑起来这个程序之后,把 `#!/usr/bin/env python3` 放在脚本的第一行(这个特殊的一行叫 Shebang)。给这个脚本加上可执行的属性,然后直接运行这个文本!还记得应该如何运行一个不在 PATH 中的命令吗? 120 | 121 | ::: 122 | 123 | ### 文件间的联系 124 | 125 | 文件间的联系,主要是通过文件系统的链接来实现的。Linux 中有两种链接:硬链接和软链接。硬链接是指在文件系统中,一个文件可以有多个文件名,存在于多个位置,但是文件系统中只有一份文件副本,所有链接均指向这一副本。删除其中一个文件名并不会影响文件内容,只有所有位置下的文件链接均被删除时,此文件副本才会被最终移除。软链接是指一个文件名指向另一个文件名,删除原文件名会影响软链接的有效性。 126 | 127 | 硬链接和软链接的区别在于,硬链接是文件系统的一个特性,而软链接是文件系统的一个单独的文件。硬链接只能在同一个文件系统下,而软链接可以在不同文件系统下。硬链接不能链接目录,而软链接可以链接目录。 128 | -------------------------------------------------------------------------------- /basic/12-text-editing.md: -------------------------------------------------------------------------------- 1 | # 文本编辑: Markdown,$\LaTeX$ 和 Typst 2 | 3 | ::: info 本文信息 4 | 作者:TheOnlyEthene,Tianqi Zhang 5 | 6 | 状态:尚未审阅 7 | ::: 8 | 9 | ## 引言 10 | 11 | 文本编辑工具是我们表达思想、传递知识的重要手段。无论是在科研、写作还是展示中,排版都是重要且必要的内容;我们需要选择合适的排版工具,以大大提高作品质量。 12 | 13 | 有一部分同学可能会认为,我们已经有微软提供的排版利器 Microsoft Word 了,为什么还需要这些看起来非常复杂的内容呢?这是因为,Word 虽然操作简单而舒适了,但是它既不能够像 $\LaTeX$ 一样很好地兼容公式、插图、算法等内容,也不能像 Markdown 一样足够轻量级、且完美兼容网络通行的 HTML 格式。而在科研中,$\LaTeX$ 更是大多数刊物指定的唯一排版工具,因此不学习相关的内容甚至在科研界寸步难行。 14 | 15 | 让我们先从最简单的 Markdown 开始吧: 16 | 17 | ## Markdown 18 | 19 | ### 什么是 Markdown? 20 | 21 | Markdown 是一种轻量级的标记语言,可用于在纯文本文档中添加格式化元素。和其他排版工具相比,它仅仅使用十几个记号进行排版。这使得它易于学习,使得使用者能够更专注于内容的同时,快速地进行美观大方的排版。如你所见,我们所有 Getting Started 文章都是由 Markdown 书写的。 22 | 23 | ### 怎样使用 Markdown? 24 | 25 | Markdown 甚至没有自己的专用编辑器,由此可见其轻量级,令人感叹。一般的,VS Code 已经集成了 MD 的编译,因此你完全可以于 VS Code 中创建一个名为 `*.md` 的文件,然后进行相关的操作。如果需要预览,则可以使用 VS Code 自带的侧边预览功能! 26 | 27 | Markdown 的内容输入和纯文本文件几乎一模一样,接下来我们将逐个介绍 Markdown 排版所用到的控制符号。值得注意的是,常用的标点符号(逗号、句号、问号等)均不是控制符号。 28 | 29 | 不过,在此之前,请把你的输入法标点符号切换为半角,防止出现类似于¥¥的臭名昭著的错误。 30 | 31 | #### 分段、换行、分割线 32 | 33 | 在 Markdown 中,必须通过空行来进行分段。也就是说,如果你想要对文件进行分段,需要在两段之间加入一个空行。特别注意,Markdown 不接受缩进或者首行缩进,所以不要使用 `Tab` 键或者空格进行缩进!(否则会编译为代码块) 34 | 35 | 而如果希望仅仅换行而不分段,则仅仅在行尾加入两个空格,然后另起一行,在新的行中书写; 或者使用兼容性更加好的 HTML 标记,也就是 `
` 符号,该符号无需另起一行也可以进行换行操作。
36 | 同时,你可能会在某些网站看到行尾 \\ 或者直接换行来进行换行操作,这是因为 Markdown 语法具有明显的**方言性**特征,不同的 Md 编译器对不同符号的处理不尽相同。为了兼容性起见,不建议使用这些符号。 37 | 38 | 对于分割线 (你经常会在知乎看见这种分割线),请在单独一行上使用三个或多个星号 (`***`)、破折号 (`---`) 或下划线 (`___`) ,并且不能包含其他内容。为了兼容性考虑,请在该分割线前后加上空行。 39 | 40 | #### 转义符号 `\` 41 | 42 | 符号 `\` 是转义符。该符号接下来的下一个符号**不会**被编译为 Markdown 的控制符号(代码块外,代码块内的转义参见代码符号)。这使得你能够在不影响排版的前提下,随意打出几乎所有的符号! 43 | 44 | #### 标题符号 `#` 45 | 46 | 符号 `#` 是标题符号。在一行的开头打 `#` 号,再接一个空格,后面的内容就会被编译成标题。这个空格不是必须的,但是为了兼容性考虑,建议加上。 47 | 48 | 打几个 `#` 号,最终编译出来的就是几级标题。 49 | 50 | #### 强调符号 `*` 和删除线 51 | 52 | 这两个符号用于特别强调的词句,可以实现**粗体**,_斜体_,**_粗斜体_** 和 ~~删除线~~。
53 | 上述四个格式分别可以使用下列方法表示:`**粗体**`、`*斜体*`、`***粗斜体***`、`~~删除线~~`. 54 | 55 | 你可能会在有些地方见到使用下划线 `_` 来进行类似操作的,但是同样为了兼容性考虑我不建议这样做。 56 | 57 | 值得注意的是,Markdown 不原生支持 下划线 ;但因其支持 HTML 嵌入,可以通过 `下划线` 标签实现类似效果。不过需注意,在 HTML5 中该标签具有特定语义,建议装饰性下划线应通过 CSS 实现。 58 | 59 | #### 代码符号 60 | 61 | 这个符号用于进行代码高亮与代码块高亮. 62 | 63 | 小块代码高亮使用方法非常简单: 使用 `` ` `` 把你需要的代码内容包装起来即可,例如 `` `Hello, world!` `` 64 | 65 | 代码块则稍稍复杂一些,你可以使用 `把你需要的代码块内容包装起来。在第一个` 之后,你可以手动指定代码使用的语言。直接进行缩进也可以定义代码块。 66 | 67 | 代码块**不属于** Markdown 正文,因此内部的内容**不会**被编译。你可以用完全相同的方式输入任何代码,而不必增加多余的空行。下面就是一个实例: 68 | 69 | ```cpp 70 | #include 71 | #include 72 | 73 | int main() 74 | { 75 | std::cout << "Hello, world!" << std::endl; 76 | return 0; 77 | } 78 | ``` 79 | 80 | 如果需要在代码块中打出 `` ` `` 且防止此反引号被编译,你可以这样编译: `` ` `` 。只要保证用于包装的反引号数量比防止编译的反引号数量多就可以了。注意,一定要使用空格分开反引号以避免歧义! 81 | 82 | #### 列表符号 `1.` 和 `-` 83 | 84 | 要创建有序列表和无序列表,可以分别使用上述的两个符号。上述几个符号和标题符号的使用方法类似,这两格符号位于行首,前面不能有内容,后面应该有空格。 85 | 86 | 有序列表无序列表之间是可以嵌套的;如果要制作多级列表,请使用 `Tab` 缩进多级列表的内容即可。 87 | 88 | 值得注意的是,有序列表中的 `1.` 也可以替换为其他数字,反正满足数字加个点就行,Markdown 会自动帮你排序。 89 | 90 | 例如: 91 | 92 | ```plain 93 | 1. 甲乙丙丁 94 | 1. 戊己庚辛 95 | 1. 子丑寅卯 96 | 1. 辰巳午未 97 | - 申酉 98 | - 戌亥 99 | 1. 壬癸 100 | ``` 101 | 102 | 会编译为: 103 | 104 | 1. 甲乙丙丁 105 | 1. 戊己庚辛 106 | 1. 子丑寅卯 107 | 1. 辰巳午未 108 | - 申酉 109 | - 戌亥 110 | 1. 壬癸 111 | 112 | #### 引用符号 `>` 113 | 114 | 这个符号用于插入引用块,处于引用块内部的文字与普通文字一样。和标题符号一样,`>` 后面最好是有一个空格,且前面什么都不要有: 115 | 116 | 引用块也是可以堆叠的,只需要多增加几个引用符号即可: 117 | 118 | > 偏差认知了 119 | > 120 | > > 偏差认知 121 | > > 122 | > > > 偏差认 123 | > > > 124 | > > > > 偏差 125 | > > > > 126 | > > > > > 偏 127 | 128 | ~~故障机器人是杀戮尖塔最强角色!~~ 129 | 130 | 如果需要在不切断引用块的情况下分段,请在预定的空行开头也加上上述引用符号。 131 | 132 | #### 表格 133 | 134 | 你可以使用下列手段创建一个原生表格:使用三个或多个连字符(`---`)创建每列的标题,并使用管道(`|`)分隔每列。可以选择在表的任一端添加管道。 135 | 136 | 你不必过度在意排版问题,编译器会自动给你编译出优美的格式。 137 | 138 | 如果要使用左对齐/居中/右对齐,请在连字符那里添加冒号:左对齐使用 `:---`,居中使用 `:---:`,右对齐使用 `---:` 。 139 | 140 | 下面是一个实例: 141 | 142 | ```plain 143 | | Syntax | Description | 144 | | --- | ----------- | 145 | | Header | Title | 146 | | Paragraph | Text | 147 | ``` 148 | 149 | 得到的表格是这样的: 150 | 151 | | Syntax | Description | 152 | | --------- | ----------- | 153 | | Header | Title | 154 | | Paragraph | Text | 155 | 156 | 表格中可以添加链接,代码(仅反引号(`)中的单词或短语,而不是代码块)和强调;但是不能添加标题,块引用,列表,图像或 HTML 标签。 157 | 158 | #### 外部路径: 图片与链接 159 | 160 | 要添加图像,请使用感叹号 `!`,然后在方括号增加替代文本,图片链接放在圆括号里,括号里的链接后可以增加一个可选的图片标题文本。 161 | 162 | 例如,这是本文主要作者的 GitHub 头像,则使用 `![Purple Head](../assets/basic/12-text-editing/purple_head.jpg)` 163 | 164 | ![Purple Head](../assets/basic/12-text-editing/purple_head.jpg) 165 | 166 | 如果你需要在文档中插入链接,则把链接文本放在中括号内,链接地址放在后面的括号中。 167 | 168 | 例如,一个著名代码共享平台叫做 [GitHub](https://github.com),其中 GitHub 这个超链接就是使用代码`[GitHub](https://github.com)`完成的。 169 | 170 | 对于图片型超链接,则把前面的中括号内的链接文本改为上述的图片路径即可。 171 | 172 | #### 公式符号: `$` 173 | 174 | 使用 `$ $` 框住对应的 $\LaTeX$ 公式,即可将对应的公式按照 $\LaTeX$ 格式编译出来,使用方法和 $\LaTeX$ 完全一致。如果需要进一步教学,请移步 $\LaTeX$ 相关篇章。 175 | 176 | ::: tip 特别注意 177 | 178 | 公式的前后应该有空格,否则不会编译。这是 Markdown 的自动转义特性导致的。 179 | 180 | ```plaintext 181 | 这样写: 182 | 这是一个 $\Latex$ 公式 183 | 184 | 而不要这样写: 185 | 这是一个$\Latex$公式 186 | ``` 187 | 188 | ::: 189 | 190 | 例如:调和级数 $\sum_{i=1}^n \frac{1}{i}$ 可以使用 `$\sum_{i=1}^n \frac{1}{i}$` 进行编译。 191 | 192 | ::: tip 特别提醒 193 | 194 | 1。一定要用半角标点符号,否则你会见到臭名昭著的 ¥¥ 类错误。 195 | 196 | 2。大多数的 Markdown 编译器都会正确渲染 $\LaTeX$ 公式,但是不排除少数编译器不支持渲染 $\LaTeX$,一般而言,不支持渲染的编译器将会原样显示公式内容。开始写作前试试编辑器能否正常渲染公式总是好的选择。 197 | 198 | ::: 199 | 200 | ## $\LaTeX$ 201 | 202 | ### 什么是 $\LaTeX$ ? 203 | 204 | $\LaTeX$ 是一种极为专业的**排版**工具,而**不是**文本编辑器。它的源文档与 Markdown 的简洁干净不同,而是充斥了各种各样的反斜杠,大括号和宏。这表明了如果直接使用 $\LaTeX$ 进行文本编辑的话会令人极度头大乃至效率降低;因此我个人建议同学们在使用上述工具时,最好是心中打好腹稿然后再进行工作。 205 | 206 | 纵然如此,$\LaTeX$依然是目前最强大的排版工具,没有之一。其强大的功能甚至能够支持其于一个 PDF 文件中写一个 Linux 系统;而且这个系统甚至可以直接运行!虽然如此,我们暂时不需要研究 Linux in PDF 的工作原理,还是从最简单的 $\LaTeX$ 安装与使用开始吧。 207 | 208 | ### 怎样安装 $\LaTeX$ ? 209 | 210 | > 我好久好久没装过这玩意了,本地安装与环境配置等待其他的人写罢 211 | > 212 | > 人话: 咕咕咕 213 | 214 | 虽然如此,我们还有 [PKU LaTeX](https://latex.pku.edu.cn/) !它是一个由 LCPU 开发和维护的线上 $\LaTeX$ 编译器,欢迎大家使用!~~(才...才不是给自己打广告呢)~~ 215 | 216 | ### 怎样使用 $\LaTeX$ ? 217 | 218 | $\LaTeX$ 功能最强大的一点在于它支持巨量的包与文件类型,使得它能够适用于大量工作: 短文用 `article`,长文用 `report`,书本用 `book`,信件用 `letter`,简历用 `moderncv`,幻灯片用 `beamer`……遗憾的是,上述文档类型除了大部分相同的通用语法以外,还都有着自己独立的宏和语句功能。如果需要全部精通上述文档类型,难度不亚于掌握 `C++23` 的所有发行包,连笔者都不能说自己全部掌握了它们。因此我将仅仅讲述基本语法,实用包和几种文档类型。 219 | 220 | ![Latex 1: 文章](../assets/basic/12-text-editing/latex1.png) 221 | 222 | ### 基本语法 223 | 224 | 一个最基本的 $\LaTeX$ 文档应该如下代码块所示: 225 | 226 | ```latex 227 | \documentclass{article} 228 | 229 | \begin{document} 230 | Hello, Latex! 231 | \end{document} 232 | ``` 233 | 234 | 上述第一行代码表明了文章的类型是 `article`,其意思是短文,通常用于不太长的论文书写,是 $\LaTeX$ 的最基本文档类型。 235 | 236 | 中间的 `begin...end` 结构则是 $\LaTeX$ 中最常见也最通用的宏类型,它标志一个内容类型的起止。几乎所有的内容类型都需要它。在本文中,其意思为正文的开始与结束。 237 | 238 | 在 `begin...end` 结构之内的则是文章内容,其分段手段与 Markdown 类似,使用空行分段; 但是换行则需要使用符号 `\\` (双反斜杠) 而不是行尾空格或者 HTML 控制符。 239 | 240 | 对于转义符号,与 Markdown 的使用完全相同,这里不再赘述。 241 | 242 | ::: tip 243 | 244 | 在 Markdown 中,你可以直接打出 `\\` 表示 `\`;但是在 $\LaTeX$ 中,`\\` 被认为是换行符号。因此你应使用宏 `\textbackslash` 来实际地打出反斜杠。幸亏这个符号在英语中并不常用! 245 | 246 | ::: 247 | 248 | #### 标题 249 | 250 | $\LaTeX$ 标题由 `\maketitle` 提供,它应该紧随 `\begin{document}` 之后。该标题的内容则需要在其他地方标明,且标明的地方应该在 `\maketitle` 之前。 251 | 252 | 下面是一个实例: 253 | 254 | ```latex 255 | \title{我是标题内容} 256 | \author{我是作者} 257 | \date{我是日期} 258 | % \date{\today} 可以直接使用当日日期 259 | 260 | \begin{document} 261 | \maketitle % 这个的意思就是我把标题放在这里 262 | 我是正文 263 | \end{document} 264 | ``` 265 | 266 | #### 下级标题 267 | 268 | $\LaTeX$ 最多支持四级标题。其宏为`\section`,`\subsection`,`\subsubsection`。 269 | 270 | $\LaTeX$ 会给标题自动打上编号。默认情况下,编号分别是 `1,2,...` ,`1.1,1.2,...` 和 `1.1.1,1.1.2,...`。如果在标题上面加一个星号 `*` 则不会显示标题编号。 271 | 272 | 标题宏后面的大括号内的内容可以缺省,这样就只有编号没有标题文字。~~当然如果你想也可以给无编号标题缺省内容,那样就相当于是空行了~~ ~~但是你为什么要这么做?~~ 273 | 274 | ```latex 275 | \begin{document} 276 | \section{我是二级标题} 277 | \subsection{我是三级标题} 278 | \section*{我是二级标题(无编号)} 279 | \end{document} 280 | ``` 281 | 282 | #### 列表 283 | 284 | $\LaTeX$ 有序列表由 `enumerate` 支持,无序列表由 `itemize` 支持,两者使用几乎相同,因此以有序列表为例。 285 | 286 | ```latex 287 | \begin{enumerate} 288 | \item 这是第一项 289 | \item 这是第二项 290 | \end{enumerate} 291 | ``` 292 | 293 | 该列表可以直接插在 `document` 的任意地方。列表支持多级列表,只需要嵌套即可。 294 | 295 | #### 强调: 粗体,斜体和下划线 296 | 297 | 在 $\LaTeX$ 中,粗体使用 `\textbf{}` 支持,斜体使用 `\textit{}` 支持,下划线使用 `\underline{}` 支持。除此以外,还可以使用 `\emph{}` 来对文字进行笼统的强调任务,但是这个强调会随着使用包的不同和上下文环境的不同而改变。 298 | 299 | ```latex 300 | 这是一个\textbf{粗体}实例 301 | 这是一个\textit{斜体}实例 302 | 这是一个\underline{下划线}实例 303 | ``` 304 | 305 | #### 公式 306 | 307 | 行内公式和 Markdown 的使用方式是一样的,使用 `$...$` 把需要编译的公式包住即可。例如写一个非常简单的乘法算式 `$3\times 4 = 12$`,编译出来就是 $3\times 4 = 12$ 。 308 | 309 | 单列公式则会单独列出一行展示,写法分为两种,一种是简易形态的,一种是较为正式的。简易形态的单列公式使用的是 `$$...$$` ,正式形态的单列公式则使用下面的宏: 310 | 311 | ```latex 312 | \begin{equation} 313 | 3 \times 4 = 12 314 | \end{equation} 315 | ``` 316 | 317 | 正式形态的公式有以下的好处: 318 | 319 | - 自带公式号; 320 | - 能够更简单地兼容 `\label` 等超链接形式。 321 | 322 | 除了展示方式不一样以外,行内公式和单列公式的外观也有差别。一般单列公式的外观更加美观大方,而行内公式更加紧凑。比如说求和符号: 323 | 324 | $\sum_{i=0}^{10}$ 325 | 326 | $$\sum_{i=0}^{10}$$ 327 | 328 | 你可以轻易地发现两者的差别。一般当公式比较长的时候,应该使用正式形态的公式。 329 | 330 | 除此之外,还有多行公式,使用的宏是 `align`。这个公式功能更强大,不过使用更加复杂。例如我们要做一个脱式计算,这时候要考虑对齐问题,此时则使用 `&` 来对齐 (本质上是制表符) ,`\\` 来换行。 331 | 332 | ```latex 333 | \begin{align} 334 | & 3 \times 4 + 6 \\ 335 | =& 12 + 6 336 | =& 18 337 | \end{align} 338 | ``` 339 | 340 | 注意到,有一些符号在键盘是不能直接打出来的,例如乘号 $\times$ 除号 $\div$ 等; 还有一些非英语字母,例如阿尔法 $\alpha$。这些特别的符号在 $\LaTeX$ 都有特殊的宏对应。你可以查相关的表来打出符号,或者使用 VS Code 的相关插件。 341 | 342 | ### $\LaTeX$ 实用包简介 343 | 344 | 先前提到,$\LaTeX$ 功能最强大的一点在于它支持巨量的包。下面我将会举例几个最简单有用的包。不过我们应该先学会使用包: 345 | 346 | ```latex 347 | \documentclass{article} 348 | \usepackage[UTF8]{ctex} 349 | 350 | \begin{document} 351 | 你好,\Latex! 352 | \end{document} 353 | ``` 354 | 355 | 如上代码块所示,你直接在文件类型下面增加一个使用包的命令即可,很类似于 `C++` 的 `#include` 预编译指令,或者 `Python` 的 `import` 指令。中括号内的内容是调用包时进行的设置,不同的包有不同的设置,具体请参见相关网站。 356 | 357 | #### `ctex` 358 | 359 | 伟大无需多言的中文支持,使用方法刚刚已经举例过了。 360 | 361 | #### `AMS` 系列 362 | 363 | 美国数学会出品的一系列宏包。学会根据其印刷和电子出版物以及在线资料库的样式要求,编写了一组用于排版数学出版物的宏包套件。我们在这个系列中最经常使用的包有下列三个: 364 | 365 | - `amssymb` 提供符号; 366 | - `amsfonts` 提供字体; 367 | - `amsmath` 提供算符。 368 | 369 | 直接使用 `usepackage` 命令引用即可。 370 | 371 | #### `geometry` 372 | 373 | 这是一个完全负责版式的宏包,比 $\LaTeX$ 自带的版式配置要好用得多。 374 | 375 | ```latex 376 | \usepackage{geometry} 377 | \geometry{a4paper, margin=1in} % A4纸张,页边距1英寸 378 | ``` 379 | 380 | #### `graphicx` 381 | 382 | 这是一个专门负责图片的宏包。具体使用较为复杂,参见 [Overleaf 官方网站: 插入图片](https://www.overleaf.com/learn/latex/Inserting_Images)。 383 | 384 | 在使用这个宏包的时候,建议把图片全部放到同一个目录,以便于整理。 385 | 386 | #### `listings` 387 | 388 | 这是一个专门负责代码的宏包。具体使用较为复杂,参见 [Overleaf 官方网站: 列出代码](https://www.overleaf.com/learn/latex/Code_listing)。 389 | 390 | 上述官方网站列出了一个叫 `verbatim` 的宏包,但是它过于~~香草味~~原始,我个人非常不喜欢这个宏包,不建议使用它来展示代码。不过 `verbatim` 非常适合在 $\LaTeX$ 中教学 $\LaTeX$,这是因为这个结构内的所有内容都会被**直接打印**。 391 | 392 | #### `algorithm2e` 393 | 394 | 这是一个专门负责伪代码的宏包,在算法伪码上的表现比 `listings` 要好得多。使用也较为复杂,参见 [Overleaf 官方网站: 算法](https://www.overleaf.com/learn/latex/Algorithms)。 395 | 396 | #### `cases` 397 | 398 | 这是一个负责分段函数等的宏包,在分段函数和方程组上的表现比 `align` 要好得多。不过有时候 `usepackage` 不需要单独列出这个宏包,但是有时候不列出来就会出错。下面的例子是直接从 Overleaf 上节选的,这里就没有列出。 399 | 400 | ```latex 401 | \documentclass{article} 402 | \usepackage{amsmath} 403 | 404 | \begin{document} 405 | \maketitle 406 | 407 | $$ 408 | 1+(-1)^n= 409 | \begin{cases} 410 | 0, & \text{if $n$ odd}\\ 411 | 2, & \text{otherwise} 412 | \end{cases} 413 | $$ 414 | 415 | \end{document} 416 | ``` 417 | 418 | 这个包还有一些其他的写法,例如 `subnumcases`,尚待读者主动探索。 419 | 420 | ### `beamer` 简述: 令人头秃 (主观) 的演示文稿 421 | 422 | `beamer` 可以称得上是 $\LaTeX$ 除了 `article` 以外最重要的包了。它能够通过非图形界面来编写一种风格非常鲜明 ~~令人头秃~~ 的演示文稿,许多教授 (尤其是理工科院系) 非常喜欢这个包; 这是因为它能够极为完美地兼容 $\LaTeX$ 中的大部分包,使得插入代码和公式非常简单易懂 (点名批评 PowerPoint)。 423 | 424 | 不过由于这个包的理工味道实在是过于浓重,对于文史类的 `Pre` ~~(为什么大伙都在卷 PPT 的精美程度啊)~~ 来说并不适用。因此在何种情况下使用这个包,需要同学们自己衡量。 425 | 426 | #### `beamer` 基本语法 427 | 428 | 对于一个 `beamer` 而言,它有一个最基本的组成单位 "帧",指的是一张幻灯片,宏名为 `frame`。 429 | 430 | 下面是一个非常简单的 `beamer` 实例: 431 | 432 | ```latex 433 | \documentclass{beamer} 434 | \usepackage[UTF8]{ctex} 435 | \title{如何科学摸鱼} 436 | \author{某位学长} 437 | 438 | \begin{document} 439 | \begin{frame} 440 | \frametitle{能量守恒定律} 441 | 摸鱼时长 $\propto$ 课程难度 $\times$ 截止日期焦虑^{-1} 442 | \end{frame} 443 | \end{document} 444 | ``` 445 | 446 | 对于唯一的帧而言,编出来的是这样的: 447 | 448 | ![Beamer实例](../assets/basic/12-text-editing/latex4.png) 449 | 450 | 你可能会问: 标题哪去了? 451 | 452 | 别急,标题在下面: 453 | 454 | #### `beamer` 的特殊页语法 455 | 456 | `beamer` 的特殊页有 2 个: 标题页和目录页。使用方法非常简单: 457 | 458 | ```latex 459 | \begin{frame} 460 | \titlepage % 我是标题页,该页基于\title结构自动生成 461 | \end{frame} 462 | 463 | % 上述标题帧也可以直接用 \frame{\titlepage} 代替 464 | 465 | \begin{frame} 466 | \contentsname % 我是目录名称,也可以缺省后面的内容 467 | \tableofcontents % 我是目录页,这也是根据文档的\section结构自动生成的 468 | \end{frame} 469 | ``` 470 | 471 | 值得注意的是,`beamer` 的目录页依赖于文档的固有 `\section` 结构。如果没有上述结构,那么目录页反而会留空。 472 | 473 | #### `beamer` 的主题与配色 474 | 475 | Beamer 提供了多种主题和颜色主题,可以通过 \usetheme 和 \usecolortheme 命令来设置。 476 | 477 | [这里](https://latex-beamer.com/tutorials/beamer-themes/)是 beamer 官方的主题集合~~也是最令人头秃的一批~~。当然,你可以使用其他的主题;关于主题的下载,这里暂不介绍。~~(人话: 咕了)~~ 478 | 479 | #### `beamer` 的强调块 480 | 481 | `beamer` 内置了三种强调块: 蓝块 `\block`,红块 `\alertblock`,以及绿块 `\exampleblock`。使用方式不用我再啰嗦了,下面是一个实例(使用的主题是 `Berlin`,配色为 `default`;如果有不同的配色,则可能会有所不同): 482 | 483 | ```latex 484 | \begin{frame} 485 | 486 | \begin{block}{这是蓝块} 487 | 咕 488 | \end{block} 489 | 490 | \begin{alertblock}{这是红块} 491 | 咕咕 492 | \end{alertblock} 493 | 494 | \begin{exampleblock}{这是绿块} 495 | 咕咕咕 496 | \end{exampleblock} 497 | 498 | \end{frame} 499 | ``` 500 | 501 | ![Beamer实例2](../assets/basic/12-text-editing/latex5.png) 502 | 503 | 以上是 Beamer 的一些最最基本的用法。不过通过这些语法,就可以创建出结构清晰、内容丰富的演示文稿了;当然,Beamer 的功能远不止这些,还有许多例如动画等的高级功能等待你去探索。 504 | 505 | ### `report` 简述: 超超超长文的处理利器 506 | 507 | 如果说 article 是 $\LaTeX$ 界的瑞士军刀,那么 report 就是自带章节暴击的屠龙宝刀: 专门用来对付课程论文/实验报告等需要疯狂堆字数的超超超长文 (比如某门课要求你写 30 页的**小型**综述时,懂的都懂🙃)。 508 | 509 | 它的核心优势在于分章节如呼吸般自然,内置 \chapter{} 直接生成超大号标题,搭配自动目录 (\tableofcontents) 和分页控制,轻松实现从「草稿像蚯蚓」到「排版像艺术品」的阶级跃迁 (当然前提是你能肝完)。 510 | 511 | #### 基础操作:从入门到摆烂 512 | 513 | ```latex 514 | \documentclass{report} 515 | \usepackage[UTF8]{ctex} 516 | \title{关于熬夜是否影响发量的研究} 517 | \author{一位秃然的学者} 518 | 519 | \begin{document} 520 | \maketitle % 生成标题页(比beamer的\frame{\titlepage}更简单!) 521 | \tableofcontents % 自动生成目录(建议写完全文再生成,否则目录可能比脸还干净) 522 | 523 | \chapter{深夜作死原理} 524 | \section{咖啡因代谢动力学} 525 | 凌晨2点的大脑: 526 | \begin{equation} 527 | \text{效率} = \frac{\text{咖啡摄入量}}{\text{ddl剩余时间}} + \epsilon_{\text{玄学}} 528 | \end{equation} 529 | 530 | \chapter{实验数据} 531 | % 此处应有100个表格和50张图,但作者已躺平 532 | \end{document} 533 | ``` 534 | 535 | 编出来以后大概是这样的: 536 | 537 | ![report](../assets/basic/12-text-editing/latex6.png) 538 | 539 | ::: tip 特别提醒 540 | 541 | 1. 写 report 时请远离 Ctrl+S 成瘾症: 因为文章超长,每次保存后重新编译的时间足够你思考人生三遍。这边建议关掉自动编译,写完以后一口气编完,把等待时间用来补觉~~或植发~~。 542 | 543 | 2. 用 `\tableofcontents` 自动生成目录后,可用 `tocloft` 包调整行距/缩进,防止目录页比正文还长 ~~(被暴打力)(悲)~~ 544 | 545 | 什么,你想让我写怎么用 `tocloft` 包? (╯‵□′)╯︵┻━┻ 546 | 547 | > 有时间会写的,不过现在暂时还是咕了罢 548 | 549 | ::: 550 | 551 | ### `moderncv` 简述: 不用排版的简历? 还有这等好事? 552 | 553 | `moderncv` 是简历界的一股清流:它号称能让你彻底摆脱 Word 里对齐线、字号和页边距的噩梦,用 $\LaTeX$ 自动生成排版工整的简历。对于那些曾被 “一页纸简历” “如何优雅地写 ‘精通 Office’ ” 折磨到失眠的同学来说,简直是救星 (前提是你愿意花 10 分钟学代码语法)。 554 | 555 | 不过要注意,此包自带一股“性冷淡极简风”,如果你梦想设计出五彩斑斓的黑/赛博朋克特效简历,建议直接转行当 UI 设计师 (或者去某宝花 5 块钱买个模板)。 556 | 557 | 只需声明文档类型为 moderncv,就能召唤出标准简历框架。以下代码足以让 HR/导师眼前一亮 (也可能眼前一黑): 558 | 559 | ```latex 560 | \documentclass{moderncv} 561 | \usepackage[UTF8]{ctex} 562 | 563 | \moderncvtheme[blue]{casual} % 主题选casual,颜色选忧郁蓝 564 | \name{王小明}{摸鱼学硕士} % 名字和头衔分开写,防止过于嚣张 565 | \email{run@fast.com} % 建议别用“ilovexxx@qq.com” 566 | \social[github]{github.com/xxx} % 虽然你仓库里可能到头来只有HelloWorld 567 | \social[linkedin]{xxx} % 假装有国际化人脉,不过谁用领英啊 (大嘘) 568 | \quote{Stay hungry,stay foolish} % 乔布斯名言,HR已免疫 569 | 570 | \begin{document} 571 | \maketitle % 生成个人信息区块 572 | 573 | \section{教育背景} 574 | \cventry{2021--2025}{专业:理论与实操}{如何科学划水大学}{寄点3.7/5.0}{}{核心课程:《咖啡因代谢学》《早八生存指南》} 575 | 576 | \section{实习经历} 577 | \cventry{2023.06--2023.09}{首席工位守护者}{某厂}{}{}{主要成就:带薪拉屎时长部门TOP1} 578 | \end{document} 579 | ``` 580 | 581 | 编出来以后大概是这样的: 582 | ![?](../assets/basic/12-text-editing/latex7.png) 583 | 584 | ⚠️**警告**:此包可能导致副作用——当发现同学还在用 Word 调段落间距时,会忍不住露出怜悯微笑 (然后被揍) 585 | 586 | 该包的一个极为良好的特性是,自动压缩空白区域,可以有效地避免“半页纸尴尬”。但是与其这样,真不如多整点活填满这页纸吧 (大嘘) 。 587 | 588 | ~~所以欢迎来 LCPU 玩~~ 589 | 590 | ## Typst 591 | 592 | > 这玩意我也不会,就咕咕咕了吧 593 | > 594 | > 此处能者居之 595 | 596 | ## 结语 597 | 598 | 由于本人的整活特性,越到后来的且可能用不上的内容写得便越发抽象起来了。不过我觉得这种求生指南 Blog 肯定是相对轻松一些更好: 这只是一个引导性质的内容,更加进阶的内容肯定需要同学们自己去探索学习。~~毕竟在你北上课可能是获取知识的最差手段之一了~~。 599 | 600 | 这边建议同学们先用这 12 篇博文的知识,从日常作业开始慢慢上手,再自行查找资料进阶与熟练: 至少技多不压身,在未来写毕业论文或者课程论文的时候不必焦头烂额地现学了。毕竟 ddl 是无止境的,而头发是有限的;两者相比,看起来还是头发更重要哦( ̄▽ ̄)~\* 601 | -------------------------------------------------------------------------------- /basic/13-windows-overview.md: -------------------------------------------------------------------------------- 1 | # Windows 入门指南 2 | 3 | ::: info 本文信息 4 | 作者:[The Only Ethene](https://github.com/ZangXuanyi) 5 | 6 | 状态:尚未审阅 7 | ::: 8 | 9 | 虽然我们 LCPU 并不推荐使用 Windows 作为我们的开发工具,但是 Windows 目前依然具有以下的优势: 10 | 11 | - 占有了目前计算机系统市场的最大份额 12 | - 与其配套的 Microsoft Office 系列更是目前比 LaTeX 使用更广泛的办公软件 13 | - 目前使用最广泛的游戏编程语言是微软的 `C#`,而 `C#` 跨平台做得很一般,导致开发几乎不得不用 Windows 14 | - ~~Linux 和 Mac 不太能打游戏~~ 15 | 16 | 因此我经过深思熟虑还是写了这一章。 17 | 18 | 由于 Windows 版本繁多,我们在这里讲述的是 Windows 11 23H2 及其更高版本系统。 19 | 20 | ## Windows 的大小姐脾气 21 | 22 | ### 找不到路的迷宫症候群 23 | 24 | Windows 的注册表就像大小姐的日记本,记录着系统最私密的配置信息。但随意修改就像用马克笔在她日记上涂鸦——可能让系统直接崩溃。 25 | 26 | 与之类似的还有另一个迷宫“环境变量”:虽然 Windows 安装软件只需要鼠标点点点就可以解决问题,但是装完以后你在 `Powershell` 里面把命令行一打,哇, 27 | 28 | ```plain 29 | The term 'conda' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again. 30 | ``` 31 | 32 | 虽然很离谱且抽象,但是这就是事实:装完软件以后,大多数情况下,大小姐根本不知道从闺房去拿这个工具应该怎么走。 33 | 34 | ### 强制更新的茶话会 35 | 36 | 大小姐会在你最需要专注时突然宣布:“我要更新啦!”,并擅自决定 15 分钟后重启你的工作现场。这种强制更新在温良的 `Win7` 小姐那里还可以轻松地商量着关闭,但是在刁蛮的 `Win11` 那里这是不能碰的话题。 37 | 38 | 我那么大一只 “不接受更新” 哪里去了哼啊啊啊啊! 39 | 40 | 这可太酸爽了,如果误用 Arch Linux 这类滚动更新系统当生产服务器的同学们应该深有体会罢。话不多说,还是让我们看看远方的 2024 年 7 月 19 日,全球多地同时发生的超大蓝屏事件吧。 41 | 42 | ### 你的权限呢? 43 | 44 | Windows 大小姐永远极为关心自己的权限问题。 45 | 46 | 用户账户控制(UAC)和 Defender 防病毒构成了双重枷锁。开发者编译程序要穿越证书签名、SmartScreen 过滤、Defender 误报三重关卡,其严格程度堪比过境海关。这种安全策略本质是微软对自家闺女衣服打的补丁——Windows 拥有全球最高的 43.2% 漏洞占比(CVE 2023 数据)。当然,这一套管理机制虽然牺牲了自由度,但是确实显著增加了 Windows 系统的安全性。 47 | 48 | 这种“大小姐脾气”与开源生态形成鲜明对比:Linux 默认相信用户是系统的真正主人,所有组件都可审查、可修改、可替代。 49 | 50 | ::: warning 警告 51 | 52 | 不要执行下面代码块的命令!你的 Linux 必然会在执行以下命令后坏掉! 53 | 54 | ::: 55 | 56 | ```plain 57 | > sudo rm -rf / 58 | > Password: ******** 59 | 然后你苦苦养的女儿就坏掉了,而且是接受你的命令后不带一丝迟疑自毁的(悲) 60 | 61 | 一个更经典但是不那么常见的例子: 62 | > sudo pacman -Rc python 63 | > Password: ******** 64 | (我初学Linux时电脑就是这么坏掉的)(大悲) 65 | ``` 66 | 67 | 实际上当你被迫在 Windows 上开发时,本质上是在微软划定的游乐场里玩沙盒游戏——看似自由,实则每个操作都受限于 invisible wall(隐形墙)的约束。(其实 Mac 也一样,但是 Mac 比 Windows 舒服多了,这我认为应该是因为 Windows 做得太差而不是 Mac 做得太好导致的) 68 | 69 | --- 70 | 71 | Windows 其实还有不少别的大小姐脾气,足见其不好用,尤其是开发上。那我们这些管理员的目的,当然就是把这位大小姐调教为能正常上岗的社畜;不求能像 Linux 一样完美契合工作,至少也得能用吧…… 72 | 73 | ## 第一步:获取真正的 `Administrator` 权限 74 | 75 | ::: warning 警告 76 | 77 | **对于小白,一定不要随便开 Admin。常规使用下,普通管理员基本足够。** 78 | 79 | 这和 Linux 老手也不会随便用 `root` 的原因完全一样:权限太高、自由度太高、安全度太低且几乎毫无容错。Windows 系统有很多防呆设计都藏在 UAC 中,而 Admin 会凭借自身的超高权限,力大砖飞地绕过去,然后…… 咳咳,大概率就造成 `sudo rm -rf /` 一样严重的错误了。 80 | 81 | 即使是 Linux,非 `sudo` 情况下上述命令也属于危险命令,不会让你执行。但是对于权限甚至高于系统的`root`,有没有`sudo`都一个样,那就很酸爽了。 82 | 83 | ::: 84 | 85 | 我们知道,在 Linux 和 Mac 上,最高管理员是 `root`,他是真正的最高权限者,其所有权限默认为 `sudo` 的;对于其他管理员而言,只需要一句轻描淡写的 `sudo`,就可以获得 `root` 的力量。而 Windows 虽然也有 `sudo`,但是并不好用。 86 | 87 | ~~当然我自己都忘了全新的 Windows 上有没有 `sudo` 了,反正我电脑有,要是没有那就是我自己装的~~ 88 | 89 | 我们在 Windows 使用常规手段创建用户的时候,可以看到普通用户和管理员两个选项。一般情况下,你在电脑店购入一台全新的 Windows 机器,所提供的初始账户就是这个普通管理员账户。 90 | 91 | 不过,在 Windows 的庄园中,普通管理员虽说也是管家,但只不过是穿着燕尾服的实习管家罢了。他虽然名为管理员,大小姐的许多房间他依然无权进入: 92 | 93 | - 普通管理员执行敏感操作时会触发 UAC(用户账户控制)弹窗,这种设计相当于大小姐要求管家每次触碰银餐具都必须当面请示; 94 | - 试图修改 `C:\Windows\System32` 这类核心目录时,普通管理员会被大小姐的贴身护卫 Defender 提着后领子踹出去(错误 `0x80070005`); 95 | - 创建系统级自动化任务时,普通管理员只能设置早八自动播放起床铃声这种小事,这实在是微不足道了; 96 | - 当需要修改 `HKEY_LOCAL_MACHINE` 这个象征最高权限的注册表分支时,普通管理员只能在外围的 `HKEY_CURRENT_USER` 花园散步,剩下的啥都改不了。 97 | 98 | ::: warning 警告 99 | 100 | `HKLM` 是 Windows 注册表的核心根键之一。对于会调注册表的人而言,该注册表可以调优系统启动项或者其他性能参数。 101 | 102 | **对于小白,我建议你永远不要动这个东西。**如果一个教程说要修改`HKLM`项目,如可能,请试着寻找其他替代手段。 103 | 104 | 直接修改 `HKLM` 可能导致系统崩溃或软件故障,操作前务必备份注册表并创建系统还原点——无论你能不能事先确认该修改是否正确。 105 | 106 | ::: 107 | 108 | 而真正的超级大管家 `Administrator` 却从不露面;我们要完成不少工作,都不得不请求他的首肯。对于以上问题,`Administrator` 静默提权、随意替换系统文件、随意修改系统时间同步规则,随便按需修改注册表……实在是太轻松啦! 109 | 110 | 既然如此,那么我们为什么不直接穿上他的衣服,变成超级大管家呢?那么就打开计算机管理面板: 111 | 112 | > 开始 > 计算机管理 > 本地用户和组 > 用户 113 | 114 | 你会看到 `Administrator` 正静静地躺在那里。点开他,解除他的封印(把 “账户已禁用” 关掉)。 115 | 116 | 一个更简单的办法是命令行(必须以管理员身份运行!) 117 | 118 | ```bash 119 | net user administrator /active:yes 120 | ``` 121 | 122 | 然后切换用户到他身上即可,是不是感觉你的力量无穷无尽如同群星呢? 123 | 124 | 不过我依然要给你泼盆冷水:虽然这实际上是 Windows 中我们能够访问的最高权限账户,但是他的权限实际上依然比不上 Linux 中的 `root` 。即使强悍如 `Administrator`,也没办法真正地接近大小姐本人:即使开启 `Administrator`,修改 `TrustedInstaller` 保护的文件仍需施展 “夺取所有权” 的仪式;涉及安全启动或 BitLocker 的操作,即使大管家也要被大小姐踹飞。 125 | 126 | ::: warning 警告 127 | 128 | 最后提醒一遍:**如非需要,切勿随意使用这个账户**。 129 | 130 | ::: 131 | 132 | ~~呜呜我们 Linux 小姐还是太温柔了~~ 133 | 134 | ## 第二步:让大小姐认识路 135 | 136 | Windows 大小姐的庄园错综复杂,连她本人都只能堪堪记住系统自带房间的路。而在庄园里开辟新的房间的时候(指安装新的软件),她几乎从不知道自己应该怎么去到那个房间。如果我们对她做出命令“Windows,移动”,她大概率无动于衷,并一口气给你爆三行红色警告。而这并不是因为她生性懒惰:她只是不知道罢了。那么,当务之急就是让她知道怎么走。 137 | 138 | 我们以 GCC 为例。增加这个系统变量也有两个手段:视窗操作和命令行操作。 139 | 140 | 在视窗环境下: 141 | 142 | > 系统 > 高级系统设置 > 环境变量 > Path (系统变量) 143 | 144 | 然后把新的 Path 手动加进去,例如 `C:\Program Files\mingw64\bin`。然后一路确定即可。 145 | 146 | 或者直接使用更简单的命令行(管理员权限!) 147 | 148 | ```bash 149 | $env:Path += ";C:\Program Files\mingw64\bin" 150 | ``` 151 | 152 | 这个分号一定要打半角分号,否则后果不堪设想! 153 | 154 | 然后给终端 `$PROFILE` 一下(或者开一个新的也行),输入 `gcc`,你发现 Win 小姐终于识别出来这玩意了!!! 155 | 156 | 可喜可贺可喜可贺,不过一想到 Linux 直接 `sudo pacman -Sy gcc` 之后就解决一切问题以后,我突然笑不出来了。 157 | 158 | ~~呜呜我们 Linux 小姐还是太温柔了~~ 159 | 160 | ## 第三步:给大小姐换套工作服 161 | 162 | 对于 Linux 用户而言,Terminal 是不可不用的一个东西,而它也是 Linux 小姐最喜欢的工作服。而 Win 小姐的默认终端是 `cmd`(命令提示符),这玩意极其难用。~~而 B 站竟然还有一堆低质量营销号教人怎么用 bat 脚本,思之令人发笑~~ 163 | 164 | 都 5202 年了,这 CMD 还在遵从 1981 年的祖训:批量处理依赖批处理脚本这种活字印刷术,调试循环变量堪比在迷宫找出口,操作注册表要忍受 reg add 参数里反人类的斜杠森林……还沉浸在过往之中吗?这种又难看又难穿的旧式晚礼服早该被扔掉了好吧?! 165 | 166 | 好在微软已经看不下去了,亲自下场给 Win 小姐做了一套新的衣服:Windows PowerShell(不少地方简称 PowerShell,甚至直接使用 `pwsh` 或者更简洁的 `PS` 代替了)。但是,当 Win 小姐被随着新电脑打包运送到我们手里的时候,这件衣服却不在包裹里面,搞半天原来要自己去下载。 167 | 168 | 下载反而比预想的简单许多,直接找官网,下载安装一气呵成。一个好消息是默认情况下这玩意会被直接添加到环境变量中去。 169 | 170 | 这太爽了。比方说你要给一大堆东西重命名,你在 CMD 要写一大堆的 `*.bat` 去批,或者死记硬背 `ren` 要咋用。但是你在 PS 只需要把 `ren` 打进去,然后跟着下面的交互式命令行一步步走下去,岂不美哉? 171 | 172 | ```plaintext 173 | 这是CMD的ren: 174 | 175 | C:\Users\Administrator>ren 176 | The syntax of the command is incorrect. 177 | 178 | --------------- 179 | 这是PS的ren: 180 | 181 | > ren 182 | 183 | cmdlet Rename-Item at command pipeline position 1 184 | Supply values for the following parameters: 185 | Path: rename.txt 186 | NewName: powershell_is_good.txt 187 | ``` 188 | 189 | PS 不仅是一个终端,它还是一门完备的语言。因此它能做到的事情比你想象的更多,且能对系统进行非常深度的控制。 190 | 191 | 但是现在的问题就变成,PS 很差的一点在于用惯 Linux 的人根本不会玩这玩意。对于简单操作而言,其命令的繁琐程度令人汗颜。同样是创建文件,Linux 简简单单 `touch`,CMD 就得用 `echo >`, PS 更得用 `New-Item`……我有点想掀桌。 192 | 193 | 其实这倒也无可厚非,因为 PS 是基于 `.NET` 框架的,命令行 `C#` 化也不是不可理解。但是现在的问题是你几乎是被逼着用这个,因为 PS 根本没有竞品 (CMD:我到底是不是竞品啊), Linux 上面广受欢迎的 `fish` 和 `zsh` 在 Windows 上都查无此人。 194 | 195 | 不过 git 等第三方命令倒是无所谓,这个在哪里都一样。所以这种情况我还是用 PS 吧,至少比 CMD 强。谁叫这是 Win 小姐呢。 196 | 197 | 对于喜欢给 Win 小姐化妆的管理员们,我推荐一个比较好的终端美化工具:Oh My Posh,有兴趣的可以自己去了解。而且这玩意在 Linux 上也可以用。 198 | 199 | ~~呜呜我们 Linux 小姐还是太温柔了~~ 200 | 201 | ## 第四步:大小姐的自动化管理 202 | 203 | 最终我们还是厌倦了手动下载安装软件包,其配环境等过程实在是依托答辩。我们想到,Linux 有著名的 `apt`、`pacman`、`yay` 等包管理器,Mac 也有 `Homebrew`。那么能否在 Windows 下使用同样的手段安装和管理包呢? 204 | 205 | 有的,兄弟,有的。下面请让我隆重介绍微软为大小姐钦定的包管理器 `winget`。 206 | 207 | winget 是 Windows 10/11 内置的包管理工具,专司软件安装与更新,如同为大小姐整理梳妆台: 208 | 209 | - **一键安装**:`winget install VSCode` 直接召唤 Visual Studio Code,免去浏览器搜索之苦; 210 | - **批量管理**:`winget upgrade --all` 可同时更新所有软件,避免“逐个点击更新按钮”的繁琐; 211 | - **仓库生态**:对接微软官方及第三方软件源,如同从贵族集市采购正版货物。 212 | 213 | 如果拿上一章的 Oh My Posh 举例子的话: 214 | 215 | ```bash 216 | winget install JanDeDobbeleer.OhMyPosh -s winget 217 | ``` 218 | 219 | 过一会你就会发现 Win 小姐自动给你安装好了 Oh My Posh!这确实很好用,这使得它非常适用于安装一些比较底层的包,例如 `Node.js` 等。 220 | 221 | 不过这个 `winget` 有一个很巨大的问题:因为它是微软钦定的包管理器,所以自然极为依赖微软本身,导致它**只能安装**微软钦定的包!像 `yay` 一样从 GitHub 上面下载包然后给你直接 build 了那更是不可能的! 222 | 223 | 而更搞笑的事情在于,对于部分包而言,它甚至是直接把安装用的 exe 给你拉下来然后自动运行的。这种事情很抽象,不过既然是 Win 小姐,那也正常。 224 | 225 | 于是我们发现这个除了在全新 Windows 机器上批量安装开发工具链以外,实在是用处有限。 226 | 227 | ```bash 228 | winget install Python Nodejs Git 229 | ``` 230 | 231 | 这导致我个人还是不太喜欢这玩意。和它的 Linux 亲戚相比,它实在是太没趣了;虽然它确实比从网上一个个地下载东西方便的多了! 232 | 233 | ~~呜呜我们 Linux 小姐还是太温柔了~~ 234 | 235 | ## 第五步 236 | 237 | > 咕咕咕,后面有再加,欢迎去[LCPU Getting Started](https://github.com/lcpu-club/getting-started)提 Issue! 238 | > 239 | > 目前计划:磁盘管理(尤其是 Anaconda),注册表 240 | 241 | ## 结语 242 | 243 | 结语我竟然不知道写些什么,令人感叹。 244 | 245 | 或许 Windows 就是这么令人又爱又恨:不要看 Windows 有这么多缺陷,但是你要是作为一个新手玩 Linux 那更有你受的了,把系统搞坏几次是 Linux 新手的常态。而对于一些非常简单的工作而言,用 Linux 更是有杀鸡焉用牛刀之嫌疑,此时 Windows 则成为一种良好的替代。 246 | 247 | 当然,最好的使用方式当然是“都强都带”,因地制宜地使用对应的系统才是王道。 248 | -------------------------------------------------------------------------------- /components/MacOSCommandKey.vue: -------------------------------------------------------------------------------- 1 | 17 | 18 | 26 | -------------------------------------------------------------------------------- /components/MacOSControlKey.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 15 | -------------------------------------------------------------------------------- /components/MacOSOptionKey.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 16 | -------------------------------------------------------------------------------- /components/MacOSShiftKey.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 19 | -------------------------------------------------------------------------------- /index.md: -------------------------------------------------------------------------------- 1 | --- 2 | # https://vitepress.dev/reference/default-theme-home-page 3 | layout: home 4 | 5 | hero: 6 | name: LCPU Getting Started 7 | text: 计算机入门系列课程 8 | tagline: 补充学校课程涉及不到的知识 9 | actions: 10 | - theme: brand 11 | text: 基础部分 12 | link: /basic/01-introduction 13 | features_title: 在本课程中,你将会学习到: 14 | features: 15 | - icon: 🧭 16 | title: 基础方法论 17 | details: 掌握基础知识和方法并非理所当然…… 18 | - icon: 💻 19 | title: 用好你的电脑 20 | details: 配环境,用 Linux, 写 LaTeX 论文,用 Git 版本管理…… 21 | - icon: 🏗️ 22 | title: 计算机结构和硬件理念 23 | details: 了解计算机如何工作,遇到问题也好解决…… 24 | --- 25 | 26 | ## 课程规划 27 | 28 | 内容分入门、中级、进阶三大类,入门面向全校同学,普及计算机基础,导论性质,为零基础的同学介绍整个计算机的概念、体系,以及一些常见的计算机理念。中级面向 Linux 社的成员,介绍 Linux 及软硬件知识。进阶的目标是拓宽技术视野,让同学们能完成 AP 的任务,包括带团队,参与俱乐部开发和学习组工作。 29 | 30 | 主要使用问题驱动的思路,通过实践任务鼓励同学们加深理解。 31 | 32 | ## 课程团队 33 | 34 | 课程由北京大学学生 Linux 俱乐部学习组负责。如有任何问题,请发邮件至 `linuxclub at pku.edu.cn`。邮件地址请替换`at`,同时在主题内准确包含 `[lgs]` 。 35 | 36 | 也可在 [GitHub 仓库](https://github.com/lcpu-club/getting-started)提出 issue 或 PR。 37 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "packageManager": "pnpm@9.12.3+sha512.cce0f9de9c5a7c95bef944169cc5dfe8741abfb145078c0d508b868056848a87c81e626246cb60967cbd7fd29a6c062ef73ff840d96b3c86c40ac92cf4a813ee", 3 | "devDependencies": { 4 | "prettier": "^3.3.3", 5 | "prettier-plugin-lint-md": "^1.0.1", 6 | "vitepress": "^1.3.4" 7 | }, 8 | "scripts": { 9 | "docs:dev": "vitepress dev", 10 | "docs:build": "vitepress build", 11 | "docs:preview": "vitepress preview", 12 | "lint": "prettier --check .", 13 | "lint:fix": "prettier --write ." 14 | }, 15 | "dependencies": { 16 | "markdown-it-mathjax3": "^4.3.2" 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lcpu-club/getting-started/173e5f3708707b1b0effe4aaeacbd8af7ee565a2/public/favicon.ico --------------------------------------------------------------------------------