diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/1.\345\274\225\350\250\200.md" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/1.\345\274\225\350\250\200.md" index 87ab99b..5088f16 100644 --- "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/1.\345\274\225\350\250\200.md" +++ "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/1.\345\274\225\350\250\200.md" @@ -1,4 +1,5 @@ # Introduction to Computer Science + 这是 NekoBytes 计算机科学与技术协会 [NekoBytes-CS-001: Introduction to CS](/2.编程模块/2.1%20NekoBytes-TheMissing/2.1%20NekoBytes-TheMissing.md) 的教科书。它为想要通过编写计算机程序解决复杂问题的学习者奠定强大的编程基础,通过系统学习开发算法,并阅读和编写 C 代码来实现它们,将为从事软件开发或其他计算领域的工作做好准备,并对计算机科学与技术中的常见主题进行了简短的介绍,包括抽象、算法、体系结构、人工智能、嵌入式开发和计算机系统。 ## 你将学到什么 @@ -17,6 +18,6 @@ ## 更正 -截至2024年夏季,本书仍在积极维护和更新中。 +截至 2024 年夏季,本书仍在积极维护和更新中。 如果您发现任何需要更正的部分,请[在此处](https://github.com/camera-2018/hdu-cs-wiki/issues)打开 Github 提交 issue。 diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/2.\345\274\200\345\217\221\347\216\257\345\242\203\351\205\215\347\275\256.md" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/2.\345\274\200\345\217\221\347\216\257\345\242\203\351\205\215\347\275\256.md" index 0986b1c..09efd92 100644 --- "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/2.\345\274\200\345\217\221\347\216\257\345\242\203\351\205\215\347\275\256.md" +++ "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/2.\345\274\200\345\217\221\347\216\257\345\242\203\351\205\215\347\275\256.md" @@ -1,150 +1,151 @@ # VirtualBox 安装 Ubuntu22.04 与系统开发环境配置 > [!INFO] -> 如果使用VMware,可以参考[这里](/2.编程模块/2.1%20NekoBytes-TheMissing/2.1.1%20Book/2.开发环境配置(VMware).md)的VMware版安装教程。 +> 如果使用 VMware,可以参考[这里](/2.编程模块/2.1%20NekoBytes-TheMissing/2.1.1%20Book/2.开发环境配置(VMware).md)的 VMware 版安装教程。 > [!IMPORTANT] -> 什么是Linux? +> 什么是 Linux? > -> 请阅读[Linux概念普及](/2023旧版内容/3.编程思维体系构建/3.Y.1Linux概念普及.md) +> 请阅读[Linux 概念普及](/2023旧版内容/3.编程思维体系构建/3.Y.1Linux概念普及.md) > > 虚拟机太卡了我不喜欢? > > 请阅读[双系统安装指南](/2023旧版内容/3.编程思维体系构建/3.Y.2双系统安装和发行版推荐.md) -## 0. 下载系统初始化工具和VSCode配置文件 +## 0. 下载系统初始化工具和 VSCode 配置文件 请在[课程主页](/2.编程模块/2.1%20NekoBytes-TheMissing/2.1%20NekoBytes-TheMissing)下方“课程工具”中下载。 ## 1. 下载安装 VirtualBox > [!CAUTION] -> 由于 Virtual Box 7.1 版本目前在 Windows 系统下网络连接方式选择“NAT”方式会导致严重的网络性能下降(大约为物理网络的1/100)。 +> 由于 Virtual Box 7.1 版本目前在 Windows 系统下网络连接方式选择“NAT”方式会导致严重的网络性能下降(大约为物理网络的 1/100)。 > -> 设置“控制芯片”选择“virtio-net”可以一定程度上缓解这个问题,此时的网络大约为物理网络的1/25。 +> 设置“控制芯片”选择“virtio-net”可以一定程度上缓解这个问题,此时的网络大约为物理网络的 1/25。 > > 因此请选择安装[7.0 版本的 Virtual Box](https://www.virtualbox.org/wiki/Download_Old_Builds_7_0)。 > > 教程部分图片为 VirtualBox 7.1 界面,两者并不存在操作差异。 -![下载 VirtualBox](https://cdn.xyxsw.site/virtualbox-download.png) +![下载 VirtualBox](./static/virtualbox-download_c16d6e4edd70423ece76a081fd0abbf0.png) -点击[链接](https://www.virtualbox.org/wiki/Downloads)下载VirtuaBox windows 平台安装包和功能扩展包。 +点击[链接](https://www.virtualbox.org/wiki/Downloads)下载 VirtuaBox windows 平台安装包和功能扩展包。 -![安装 VirtualBox](https://cdn.xyxsw.site/virtualbox-install.png) +![安装 VirtualBox](./static/virtualbox-install_d4b1f04d1a07d4782d553ed132db554c.png) -双击VirtualBox安装程序,完成VirtualBox本体安装; 双击扩展包安装程序,会自动打开VirtualBox,完成增强功能安装。 +双击 VirtualBox 安装程序,完成 VirtualBox 本体安装; 双击扩展包安装程序,会自动打开 VirtualBox,完成增强功能安装。 > [!CAUTION] > 如果你需要改变默认的 Virtual Box 的安装路径,请不要选择**已创建的目录**,而是选择直接在**路径栏**中进行修改,比如"D:\Oracle\VirtualBox"(请确保本身不存在这个目录) ## 2. 下载 Ubuntu22.04 系统镜像 -![清华大学开源软件镜像站](https://cdn.xyxsw.site/ubuntu-iso-download1.png) +![清华大学开源软件镜像站](./static/ubuntu-iso-download1_1251e75425cb219cac6b945fefc009a4.png) 进入[清华大学开源软件镜像站](https://mirrors.tuna.tsinghua.edu.cn/),点击"获取下载链接",进入下载界面。 -![下载 Ubuntu22.04 镜像](https://cdn.xyxsw.site/ubuntu-iso-download2.png) +![下载 Ubuntu22.04 镜像](./static/ubuntu-iso-download2_3c4844cd35cece1c4f6cf150f7016703.png) 选择 Ubuntu 操作系统,下载 22.04.5(amd64, Desktop LiveDvD) 镜像。 ## 3. 安装 Ubuntu22.04 -![新建虚拟机](https://cdn.xyxsw.site/virtualbox-ubuntu1.png) +![新建虚拟机](./static/virtualbox-ubuntu1_19e6e119ad454d55cba685115d65b3f2.png) 启动 VirtualBox,在"工具"界面点击"新建(N)"。 -![选择系统镜像](https://cdn.xyxsw.site/virtualbox-ubuntu2.png) +![选择系统镜像](./static/virtualbox-ubuntu2_3da44c2e5708f973be61d611e4837b80.png) 输入虚拟机名称,选择对应的 Ubuntu22.04 系统镜像,勾选"跳过自动安装"。 -![配置虚拟硬件](https://cdn.xyxsw.site/virtualbox-ubuntu3.png) +![配置虚拟硬件](./static/virtualbox-ubuntu3_ce2ae70d101950bc6aaf5f72effbbece.png) 根据计算机性能,调整虚拟机硬件设置。 -![配置虚拟硬盘文件](https://cdn.xyxsw.site/virtualbox-ubuntu4.png) +![配置虚拟硬盘文件](./static/virtualbox-ubuntu4_eb00fcd130dce399d346885b90bf5a87.png) -选择虚拟硬盘文件位置,分配虚拟硬盘文件大小,建议"大于40GB"。 +选择虚拟硬盘文件位置,分配虚拟硬盘文件大小,建议"大于 40GB"。 -![启动虚拟机](https://cdn.xyxsw.site/virtualbox-ubuntu5.png) +![启动虚拟机](./static/virtualbox-ubuntu5_754146aa4db0d404c7da768baf7e03a3.png) -回到VirtualBox主界面,选择创建的虚拟机,点击“启动”。 +回到 VirtualBox 主界面,选择创建的虚拟机,点击“启动”。 -![进入系统镜像引导](https://cdn.xyxsw.site/virtualbox-ubuntu6.png) +![进入系统镜像引导](./static/virtualbox-ubuntu6_03fb2914873629ac7995fcfe7bf6dbe7.png) 进入系统镜像引导界面,选择第一项“Try or Install Ubuntu”。 -注意此时如果鼠标被虚拟机捕获,可以按下键盘“右Ctrl”键脱离虚拟机。 -![选择安装系统](https://cdn.xyxsw.site/virtualbox-ubuntu7.png) +注意此时如果鼠标被虚拟机捕获,可以按下键盘“右 Ctrl”键脱离虚拟机。 -建议安装过程中始终保持语言为English(英文显示),点击"Install Ubuntu"开始安装Ubuntu系统。 +![选择安装系统](./static/virtualbox-ubuntu7_723496caa0bc0ac97c8263c4eefd68fe.png) -![选择地区](https://cdn.xyxsw.site/virtualbox-ubuntu8.png) +建议安装过程中始终保持语言为 English(英文显示),点击"Install Ubuntu"开始安装 Ubuntu 系统。 + +![选择地区](./static/virtualbox-ubuntu8_aa2c01977014151dfe7fdb456feb7d73.png) 一路点击“Continue”,进入地区选择,选择“Shanghai”。 -![创建用户](https://cdn.xyxsw.site/virtualbox-ubuntu9.png) +![创建用户](./static/virtualbox-ubuntu9_4bed09c6cfe0d4ab52daf4c84db4ea32.png) 输入“用户名-密码”创建用户,等待系统安装完毕,等待虚拟机自动重启后,按下键盘“Enter”回车键启动系统,进入系统后先**关闭**虚拟机。 -![设置虚拟机快照](https://cdn.xyxsw.site/virtualbox-ubuntu24.png) +![设置虚拟机快照](./static/virtualbox-ubuntu24_ad49439e0f3ba804a4702336baed9be0.png) 点击左侧菜单,选择“备份[系统快照]”,进入虚拟机快照界面。 -![创建快照](https://cdn.xyxsw.site/virtualbox-ubuntu25.png) +![创建快照](./static/virtualbox-ubuntu25_6fb04f1cd15434aaee98d6383ad44f46.png) 点击上方“生成”按钮,为安装的虚拟机系统设置初始快照,便于后续出现问题后进行恢复。 -![恢复快照](https://cdn.xyxsw.site/virtualbox-ubuntu26.png) +![恢复快照](./static/virtualbox-ubuntu26_12cd6537a72dcdcab3447c6137c65bcf.png) 如果后续出现误操作,可以回到快照界面,选择之前创建的快照,点击上方“恢复备份”,将虚拟机恢复到初始系统状态。 -![设置虚拟机粘贴板](https://cdn.xyxsw.site/virtualbox-ubuntu10.png) +![设置虚拟机粘贴板](./static/virtualbox-ubuntu10_8e205129a8a861fe618ffbe672a11a07.png) -回到VirtualBox主界面,选择虚拟机,点击“设置”,在“常规”-“高级”中调整“共享粘贴板”为双向,方便后续操作。 +回到 VirtualBox 主界面,选择虚拟机,点击“设置”,在“常规”-“高级”中调整“共享粘贴板”为双向,方便后续操作。 -![设置显存](https://cdn.xyxsw.site/virtualbox-ubuntu27.png) +![设置显存](./static/virtualbox-ubuntu27_f9ae586b543448d15b4b93c98ea72e61.png) 根据电脑性能,适当调大显存,避免可能出现的花屏问题。 > [!CAUTION] > 如果你的显卡属于 RTX 40 系列,并存在虚拟机花屏问题,这可能是“众做周知”的 Linux 下 Nvidia 显卡存在的驱动问题,请尝试关闭独显直连。 -![设置虚拟机网络配置](https://cdn.xyxsw.site/virtualbox-ubuntu11.png) +![设置虚拟机网络配置](./static/virtualbox-ubuntu10_8e205129a8a861fe618ffbe672a11a07.png) -在“网络”-“网卡1”中,确保连接方式选择为“网络地址转换(NAT)”,设置“控制芯片”为“准虚拟化网络(virtio-net)”,点击“端口转发”。 +在“网络”-“网卡 1”中,确保连接方式选择为“网络地址转换(NAT)”,设置“控制芯片”为“准虚拟化网络(virtio-net)”,点击“端口转发”。 -![配置ssh端口转发](https://cdn.xyxsw.site/virtualbox-ubuntu12.png) +![配置ssh端口转发](./static/virtualbox-ubuntu12_1de8f15739c9dd0c5c39d2987d96afed.png) -点击“右侧加号”,添加新规则,设置“子系统端口22”向主机端口(比如9090)的TCP协议转发,用于后续使用ssh服务连接虚拟机。 +点击“右侧加号”,添加新规则,设置“子系统端口 22”向主机端口(比如 9090)的 TCP 协议转发,用于后续使用 ssh 服务连接虚拟机。 -![安装增强功能](https://cdn.xyxsw.site/virtualbox-ubuntu13.png) +![安装增强功能](./static/virtualbox-ubuntu13_d711fb0f04fefb1da37bb16eea78802d.png) 启动虚拟机,点击上方“设备”-“安装增强功能”,为虚拟机安装增强功能。 > [!CAUTION] > 请忽略所有系统弹窗提示(例如:提示更新系统软件) -![安装增强功能](https://cdn.xyxsw.site/virtualbox-ubuntu14.png) +![安装增强功能](./static//virtualbox-ubuntu14_5c0196573ed419e3ffeeead979494362.png) 找到自动插入的"VBox_GAs"文件夹,右键“autorun.sh”选择“Run as a Program”运行脚本,完成增强功能安装。 -![设置共享文件夹](https://cdn.xyxsw.site/virtualbox-ubuntu15.png) +![设置共享文件夹](./static/virtualbox-ubuntu15_ddf844649460e0da0d040bdc7817644c.png) 退出虚拟机,进入虚拟机设置,选择“共享文件夹”,点击“右侧加号”,添加共享文件夹,选择“系统初始化工具”所在的路径,设置挂载点为“/mnt/share”,设置“只读分配”和“自动挂载”。 > [!CAUTION] > 注意选择“系统初始化工具”即“setup.tar.gz”文件所在的文件夹,共享文件夹路径未必为图片显示,请选择自己电脑上的路径。 -![找到系统初始化工具](https://cdn.xyxsw.site/virtualbox-ubuntu16.png) +![找到系统初始化工具](./static/virtualbox-ubuntu16_bc5e775ac507c208b1dbc25cd902bf07.png) -打开虚拟机,在文件浏览器右侧中点击“Other Locations”,进入“/mnt/share”目录,复制“系统初始化工具”到其他目录(比如Documents)。 +打开虚拟机,在文件浏览器右侧中点击“Other Locations”,进入“/mnt/share”目录,复制“系统初始化工具”到其他目录(比如 Documents)。 -![在终端中打开](https://cdn.xyxsw.site/virtualbox-ubuntu17.png) +![在终端中打开](./static/virtualbox-ubuntu17_5eaa953bae7c0fb4224fd5a066655b75.png) 右键复制的“系统初始化工具”所在的目录,点击“Open in Terminal”(在终端中打开)。 -![输入命令](https://cdn.xyxsw.site/virtualbox-ubuntu18.png) +![输入命令](./static/virtualbox-ubuntu18_16425bcaf1a9824dc684240a7b5d3ece.png) 在终端中依次输入 @@ -161,86 +162,97 @@ bash common.sh # 运行初始化脚本 > [!CAUTION] > 注意脚本运行期间没有输出报错信息即为正在运行,请耐心等待脚本结束。 -![打开系统设置](https://cdn.xyxsw.site/virtualbox-ubuntu19.png) +![打开系统设置](./static//virtualbox-ubuntu19_464dcd6c0bb222612b389faf2799e105.png) 点击系统右上角,点击“Settings”,进入系统设置。 -![设置中文](https://cdn.xyxsw.site/virtualbox-ubuntu20.png) +![设置中文](./static/virtualbox-ubuntu20_c66f199049aa6f14b6a7f1d6271fbbbb.png) 右侧点击“Region & Language”,修改系统语言为“汉语(中国)”,完成后,下方将会提示重启,此时选择不重启,继续操作。 -![设置中文](https://cdn.xyxsw.site/virtualbox-ubuntu21.png) +![设置中文](./static/virtualbox-ubuntu21_b2d3c1fae894fd6e23adcc8204e54ffb.png) 点击“Manage installed Languages”,等待弹窗,点击“install”,安装完毕后重启系统。 -![英文目录](https://cdn.xyxsw.site/virtualbox-ubuntu22.png) +![英文目录](./static/virtualbox-ubuntu22_c0628032f9c6e16e2b8a50cca9806f4c.png) 重启后会选择文件夹名的语言,请务必选择以英文形式保留。 -![完成zsh主题配置](https://cdn.xyxsw.site/virtualbox-ubuntu23.png) +![完成zsh主题配置](./static/virtualbox-ubuntu23_b03650eb8d1419e13cd6860bad36af8b.png) -按下键盘“Ctrl+Alt+t”快捷键,打开终端(或选择点击左下角的“显示应用程序”找到“终端”打开),此时会提示配置shell主题,按照提示自定义即可,安装完成。 +按下键盘“Ctrl+Alt+t”快捷键,打开终端(或选择点击左下角的“显示应用程序”找到“终端”打开),此时会提示配置 shell 主题,按照提示自定义即可,安装完成。 ## 4. 安装 Visual Studio Code -![安装VSCode](https://cdn.xyxsw.site/VSCode-download.png) +![安装VSCode](./static/VSCode-download_33284ab6a8455df861e61575a1d604c4.png) -进入[VSCode官网](https://code.visualstudio.com/),点击下载安装包,完成安装。 +进入[VSCode 官网](https://code.visualstudio.com/),点击下载安装包,完成安装。 ## 5. 导入 Visual Studio Code 配置 -![导入VSCode配置](https://cdn.xyxsw.site/VSCode-config.png) +![导入VSCode配置](./static/VSCode-config_2fe41f0fc00ddb1e8ad95a7f9a2dd12d.png) -![导入VSCode配置](https://cdn.xyxsw.site/VSCode-config3.png) +![导入VSCode配置](./static//VSCode-config3_ee27bb0fbb58095ad1e570acdd5e465c.png) -![导入VSCode配置](https://cdn.xyxsw.site/VSCode-config4.png) +![导入VSCode配置](./static/VSCode-config4_fc2901a7721c0bf7605a9a79714c9e52.png) -打开VSCode,点击左下角“齿轮”,选择“配置文件”,进入配置文件管理界面,点击“新建配置文件”下拉菜单,选择“导入文件”,导入C/C++配置文件,点击创建,然后点击“√”应用C/C++配置文件。 +打开 VSCode,点击左下角“齿轮”,选择“配置文件”,进入配置文件管理界面,点击“新建配置文件”下拉菜单,选择“导入文件”,导入 C/C++配置文件,点击创建,然后点击“√”应用 C/C++配置文件。 -![禁用VIM(可选)](https://cdn.xyxsw.site/VSCode-config2.png) +![禁用VIM(可选)](./static/VSCode-config2_63ba376e68622726f39f75efe8a1241e.png) -可选(不推荐禁用):如果不想使用Vim键位,可在插件中找到Vim插件选择“禁用”。 +可选(不推荐禁用):如果不想使用 Vim 键位,可在插件中找到 Vim 插件选择“禁用”。 ## 6. 配置 VSCode SSH 连接虚拟机 -![VSCode ssh](https://cdn.xyxsw.site/VSCode-ssh1.png) +![VSCode ssh](./static/VSCode-ssh1_1a1ace268a0babe6939a13569b3d5e0b.png) -点击左侧“远程资源管理器”,点击SSH的“新建连接” +点击左侧“远程资源管理器”,点击 SSH 的“新建连接” -![VSCode ssh](https://cdn.xyxsw.site/VSCode-ssh2.png) +![VSCode ssh](./static/VSCode-ssh2_5350e25fae007a4268064f4057730366.png) -在上方弹出的界面中输入“用户名(为虚拟机系统的用户,非本机Windows系统的用户)@localhost:9090(上面端口转发配置的主机端口)”,如果“localhost”无法使用,可以用“127.0.0.1”代替(请检查系统的hosts配置),之后按照提示(指纹验证选择“继续”,平台选择“Linux”,输入用户密码)完成连接即可(第一次连接期间需要下载资源,请耐心等待)。 +在上方弹出的界面中输入“用户名(为虚拟机系统的用户,非本机 Windows 系统的用户)@localhost:9090(上面端口转发配置的主机端口)”,如果“localhost”无法使用,可以用“127.0.0.1”代替(请检查系统的 hosts 配置),之后按照提示(指纹验证选择“继续”,平台选择“Linux”,输入用户密码)完成连接即可(第一次连接期间需要下载资源,请耐心等待)。 -![VSCode Plugin](https://cdn.xyxsw.site/VSCode-ssh3.png) +![VSCode Plugin](./static/VSCode-ssh3_1c4fb05510a01d3ef7cd1dbe6bf5b368.png) 请在连接虚拟机后,点击 VSCode 扩展,将扩展在虚拟机内进行安装。 -## 7. 使用VSCode在Ubuntu中编写程序 +## 7. 使用 VSCode 在 Ubuntu 中编写程序 + +![ssh连接模型](./static/ssh-programming1_b2b9e3f46a4400d31af597ab20c81ec5.png) +我们使用 ssh 连接到虚拟机中的 Ubuntu,并通过 Windows 上的 VSCode、PowerShell 等软件,通过 ssh,操作 Ubuntu 中的文件、运行内部的软件等等。 + +![在VSCode中新建终端](./static/ssh-programming2_6713eac76fec2111430d05ec4ead930c.png) + +![在VSCode终端](./static/ssh-programming3_25e1fb51aacefaf794da7f58449f61ea.png) + +**在 VSCode 中 ssh 连接到虚拟机后**,在菜单栏中选择终端->新建终端,可以在下面弹出的终端中输入命令尝试,如`ls`命令、`gcc --version`查看 gcc 版本等。 -![ssh连接模型](https://cdn.xyxsw.site/ssh-programming1.png) -我们使用ssh连接到虚拟机中的Ubuntu,并通过Windows上的VSCode、PowerShell等软件,通过ssh,操作Ubuntu中的文件、运行内部的软件等等。 +![Ubuntu新建code文件夹1](./static/ssh-programming5_519124f67d35dacc4e2f5fe2aad4c979.png) -![在VSCode中新建终端](https://cdn.xyxsw.site/ssh-programming2.png) -![在VSCode终端](https://cdn.xyxsw.site/ssh-programming3.png) -**在VSCode中ssh连接到虚拟机后**,在菜单栏中选择终端->新建终端,可以在下面弹出的终端中输入命令尝试,如`ls`命令、`gcc --version`查看gcc版本等。 +![Ubuntu新建code文件夹2](./static/ssh-programming6_c8f3408ac68c4cd1039e5da30163e10a.png) -![Ubuntu新建code文件夹1](https://cdn.xyxsw.site/ssh-programming5.png) -![Ubuntu新建code文件夹2](https://cdn.xyxsw.site/ssh-programming6.png) -按照如图所示步骤,在Ubuntu的Documents文件夹下新建一个code文件夹。VSCode的每一个项目都是一个文件夹,大家以后需要写新的项目时,可以再新建一个文件夹。 +按照如图所示步骤,在 Ubuntu 的 Documents 文件夹下新建一个 code 文件夹。VSCode 的每一个项目都是一个文件夹,大家以后需要写新的项目时,可以再新建一个文件夹。 -![vscode打开文件夹1](https://cdn.xyxsw.site/ssh-programming4.png) -![vscode打开文件夹2](https://cdn.xyxsw.site/ssh-programming7.png) -接下来,我们在VSCode中打开刚刚新建的文件夹。在菜单栏中选择文件->打开文件夹,在弹出的窗口中选择code文件夹,点击确定。 +![vscode打开文件夹1](./static/ssh-programming4_33cad073813ab50cb471074900bd841d.png) + +![vscode打开文件夹2](./static/ssh-programming7_39259a681793896755e922028b0a4331.png) + +接下来,我们在 VSCode 中打开刚刚新建的文件夹。在菜单栏中选择文件->打开文件夹,在弹出的窗口中选择 code 文件夹,点击确定。 + +![vscode打开文件夹3](./static/ssh-programming8_4d6f00f7ff1034e218471dc17983fb38.png) -![vscode打开文件夹3](https://cdn.xyxsw.site/ssh-programming8.png) 在弹出的窗口中,选择“是,我信任此作者”,注意以后打开不信任的项目时,应该选择“否,我不信任此作者”。 -![vscode新建文本文件1](https://cdn.xyxsw.site/ssh-programming9.png) -![vscode新建文本文件2](https://cdn.xyxsw.site/ssh-programming10.png) +![vscode新建文本文件1](./static/ssh-programming9_97519b487c55b2d0db9e97e168f43752.png) + +![vscode新建文本文件2](./static/ssh-programming10_bb37a97c2fd704502c27ea6d4979f5bc.png) + 在侧边栏中,点击“新建文件”按钮,并输入文件名称`main.c`。 -![vscode新建文本文件3](https://cdn.xyxsw.site/ssh-programming11.png) -然后再在新建的文件中编写一个简单的C语言程序: +![vscode新建文本文件3](./static/ssh-programming11_31d0e2a11379f56c22ab9f9c890a2180.png) + +然后再在新建的文件中编写一个简单的 C 语言程序: + ```C #include @@ -249,21 +261,23 @@ int main() { return 0; } ``` + 接下来,在终端中输入 + ```shell gcc ./main.c ``` -来使用gcc编译程序,可以在侧边栏看到,已经生成了一个`a.out`文件,这就是我们编译的结果,在终端中输入 + +来使用 gcc 编译程序,可以在侧边栏看到,已经生成了一个`a.out`文件,这就是我们编译的结果,在终端中输入 + ```shell ./a.out ``` -来运行这个文件。可以看到程序输出了`Hello World!`。 +来运行这个文件。可以看到程序输出了`Hello World!`。 -## 8. 使用Windows终端进行编程(可选) - -![终端连接ssh](https://cdn.xyxsw.site/terminal-ssh.png) +## 8. 使用 Windows 终端进行编程(可选) -在Windows中安装ssh(一般系统默认即有),在终端中使用`ssh 用户名@localhost -p 主机端口`进行连接,系统已预安装`NeoVim`与`LunarVim`。 +![终端连接ssh](./static/terminal-ssh_b9ae6e0b4c7713ca6454f682311c7c39.png) -![LunarVim](https://cdn.xyxsw.site/lunarvim.png) +在 Windows 中安装 ssh(一般系统默认即有),在终端中使用`ssh 用户名@localhost -p 主机端口`进行连接。 diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/2.\345\274\200\345\217\221\347\216\257\345\242\203\351\205\215\347\275\256\357\274\210VMware\357\274\211.md" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/2.\345\274\200\345\217\221\347\216\257\345\242\203\351\205\215\347\275\256\357\274\210VMware\357\274\211.md" index 6d8012b..5b2d2d7 100644 --- "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/2.\345\274\200\345\217\221\347\216\257\345\242\203\351\205\215\347\275\256\357\274\210VMware\357\274\211.md" +++ "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/2.\345\274\200\345\217\221\347\216\257\345\242\203\351\205\215\347\275\256\357\274\210VMware\357\274\211.md" @@ -4,93 +4,91 @@ 请在[课程主页](/2.编程模块/2.1%20NekoBytes-TheMissing/2.1%20NekoBytes-TheMissing.md)下方 “课程工具” 中下载。 -## 1.下载安装VMware +## 1.下载安装 VMware -大家可以自行下载安装VMWare Pro(参考旧版Wiki[VMware 的安装与安装 Ubuntu22.04 系统](/2023旧版内容/3.编程思维体系构建/3.Y.3VMware的安装与安装Ubuntu22.04系统.md)),或者下载现在已经推出的对于个人用户免费的VMware Player(下载需要注册账户,较为麻烦)。 +大家可以自行下载安装 VMWare Pro(参考旧版 Wiki[VMware 的安装与安装 Ubuntu22.04 系统](/2023旧版内容/3.编程思维体系构建/3.Y.3VMware的安装与安装Ubuntu22.04系统.md)),或者下载现在已经推出的对于个人用户免费的 VMware Player(下载需要注册账户,较为麻烦)。 ## 2.下载 Ubuntu22.04 系统镜像 -这一步和VitrualBox安装一样,已经下载过的同学不用再次下载。 +这一步和 VitrualBox 安装一样,已经下载过的同学不用再次下载。 -![清华大学开源软件镜像站](https://cdn.xyxsw.site/ubuntu-iso-download1.png) +![清华大学开源软件镜像站](./static/ubuntu-iso-download1_1251e75425cb219cac6b945fefc009a4.png) 进入[清华大学开源软件镜像站](https://mirrors.tuna.tsinghua.edu.cn/),点击"获取下载链接",进入下载界面。 -![下载 Ubuntu22.04 镜像](https://cdn.xyxsw.site/ubuntu-iso-download2.png) +![下载 Ubuntu22.04 镜像](./static/ubuntu-iso-download2_3c4844cd35cece1c4f6cf150f7016703.png) 选择 Ubuntu 操作系统,下载 22.04.5(amd64, Desktop LiveDvD) 镜像。 -## 3.安装Ubuntu22.04 +## 3.安装 Ubuntu22.04 -启动VMware,选择创建新的虚拟机。 +启动 VMware,选择创建新的虚拟机。 -![创建新的虚拟机](https://cdn.xyxsw.site/vmware-ubuntu1.png) +![创建新的虚拟机](./static/vmware-ubuntu1_e94b0fb529ac489f7506a8b35f55733e.png) 选择典型安装,并单击下一步。 -![选择典型安装](https://cdn.xyxsw.site/vmware-ubuntu2.png) +![选择典型安装](./static/vmware-ubuntu2_245a0f6979ea1439f343700c4f4e7aea.png) -点击浏览按钮,选择在前面下载的Ubuntu镜像iso文件,并单击下一步。 +点击浏览按钮,选择在前面下载的 Ubuntu 镜像 iso 文件,并单击下一步。 -![选择Ubuntu镜像](https://cdn.xyxsw.site/vmware-ubuntu3.png) +![选择Ubuntu镜像](./static/vmware-ubuntu3_e6a617e0a4a2f47788f22375b722a91f.png) -填写本页内容,其中用户名是Ubuntu系统的用户名,全名可以与用户名一样,密码是登录到Ubuntu的密码(这些信息后续还会使用到)。填写完成后,单击下一步。 +填写本页内容,其中用户名是 Ubuntu 系统的用户名,全名可以与用户名一样,密码是登录到 Ubuntu 的密码(这些信息后续还会使用到)。填写完成后,单击下一步。 -![填写建议安装信息](https://cdn.xyxsw.site/vmware-ubuntu4.png) +![填写建议安装信息](./static/vmware-ubuntu4_74c9f815f20786f6970c91036e1e345b.png) -输入虚拟机的名称,这个名称会显示在VMware的侧边栏,然后选择存储虚拟机文件的位置,推荐存储在较大的磁盘中。选择完毕后,单击下一步。 +输入虚拟机的名称,这个名称会显示在 VMware 的侧边栏,然后选择存储虚拟机文件的位置,推荐存储在较大的磁盘中。选择完毕后,单击下一步。 -![填写虚拟机名称](https://cdn.xyxsw.site/vmware-ubuntu5.png) +![填写虚拟机名称](./static/vmware-ubuntu5_79631c11b55ea535d07fab66d77af5ef.png) -设置磁盘大小,推荐设置磁盘大小大于等于40GB,设置完成后,单击下一步。 +设置磁盘大小,推荐设置磁盘大小大于等于 40GB,设置完成后,单击下一步。 -![设置磁盘大小](https://cdn.xyxsw.site/vmware-ubuntu6.png) +![设置磁盘大小](./static/vmware-ubuntu6_ad422bf0a72efbb3f131cfeebff93095.png) -单击自定义硬件,设置处理器个数为(至少)4个,单击关闭后,单击完成。 +单击自定义硬件,设置处理器个数为(至少)4 个,单击关闭后,单击完成。 -![自定义硬件](https://cdn.xyxsw.site/vmware-ubuntu7.png) +![自定义硬件](./static/vmware-ubuntu7_c1d3af83dbf0e16df0831b49b7c84d9b.png) +![自定义硬件](./static/vmware-ubuntu8_887742fdefc6bf4254dc653985829654.png) +然后 VMware 会自动启动虚拟机,等待虚拟机启动,下面的几步可以全部单击 continue。 -![自定义硬件](https://cdn.xyxsw.site/vmware-ubuntu8.png) +![启动虚拟机](./static/vmware-ubuntu9_dac149563b19e42d899703c00f5d806f.png) -然后VMware会自动启动虚拟机,等待虚拟机启动,下面的几步可以全部单击continue。 +到此选择 Install now,并单击 continue。 -![启动虚拟机](https://cdn.xyxsw.site/vmware-ubuntu9.png) +![现在安装](./static/vmware-ubuntu10_533008c82508b11568a41fcd25fec38c.png) -到此选择Install now,并单击continue。 +![确认安装](./static/vmware-ubuntu11_53d3afc6826908fc96a2c430db7aa686.png) -![现在安装](https://cdn.xyxsw.site/vmware-ubuntu10.png) +按如下选择(默认),并单击 continue。 -![确认安装](https://cdn.xyxsw.site/vmware-ubuntu11.png) - -按如下选择(默认),并单击continue。 - -![选择位置](https://cdn.xyxsw.site/vmware-ubuntu12.png) +![选择位置](./static/vmware-ubuntu12_cd7feb83f3e149af57127a4759bddba7.png) 在`Your name`处填写最开始填写的全名,`Your computer'name`和`Pick a username`会自动补全(也可以自行修改)。在`Choose a password`填写开始设置的密码,在`Confirm your password`处确认密码,确认没有问题后点击下一步,随后等待系统安装。 -![填写用户信息](https://cdn.xyxsw.site/vmware-ubuntu13.png) +![填写用户信息](./static/vmware-ubuntu13_9040e056d5f597c5b61fe2e705ed6406.png) 下一步,单击`Restart Now`,等待系统重启。 -![重启系统](https://cdn.xyxsw.site/vmware-ubuntu14.png) +![重启系统](./static/vmware-ubuntu14_f0b37210f356d4affdb2cdb60cf059db.png) 重启完成后,点击自己的用户名,输入密码后进入系统。 -![进入系统](https://cdn.xyxsw.site/vmware-ubuntu15.png) +![进入系统](./static/vmware-ubuntu15_fe7ad4df076d743902ff38e31fe71643.png) 弹出的窗口,一直单击`Skip、Next`,最后单击`Done`即可。同时这两个窗口单击`Don't Upgrade、OK`和`Remind Me Later`。 -![不安装更新1](https://cdn.xyxsw.site/vmware-ubuntu16.png) +![不安装更新1](./static/vmware-ubuntu16_21828d7ae29edf4237618f03d3622e4e.png) -![不安装更新1](https://cdn.xyxsw.site/vmware-ubuntu17.png) +![不安装更新1](./static/vmware-ubuntu17_67b33c60fba80488cf8c4afb146e5cc3.png) 单击左下角`Show Application`图标,并选择`Terminal(终端)`打开。 -![打开Show Applications](https://cdn.xyxsw.site/vmware-ubuntu18.png) +![打开Show Applications](./static/vmware-ubuntu18_b0d80995fcc8c8372e7c966f7cab928c.png) -![启动终端](https://cdn.xyxsw.site/vmware-ubuntu19.png) +![启动终端](./static/vmware-ubuntu19_251e60eb8dd332a4dacde3a016f63547.png) 在弹出的终端中输入 @@ -100,27 +98,27 @@ sudo apt install open-vm-tools open-vm-tools-desktop 回车后输入密码,注意此时输入的密码不会显示在屏幕上,输入完密码直接回车即可。 -![安装增强功能](https://cdn.xyxsw.site/vmware-ubuntu20.png) +![安装增强功能](./static/vmware-ubuntu20_4eb65def693691979594c7f83a7d9d6a.png) 接下来点击右上角的电源键按钮,并单击`Power Off`关机。 -![关机1](https://cdn.xyxsw.site/vmware-ubuntu21.png) +![关机1](./static/vmware-ubuntu21_15e2a003ae3d5bda07916d109d093f63.png) -![关机2](https://cdn.xyxsw.site/vmware-ubuntu22.png) +![关机2](./static/vmware-ubuntu22_709bda944b779309323d9e92ff521f2f.png) -接下来在VMware主页选择刚才的虚拟机,双击`编辑此虚拟机设置`,并选择添加共享文件夹。单击下一步后,点击浏览,选择一个要和虚拟机共享的文件夹,**将名称设置为share**,完成后,单击下一步,最后单击完成即可。完成设置后,单击确认。 +接下来在 VMware 主页选择刚才的虚拟机,双击`编辑此虚拟机设置`,并选择添加共享文件夹。单击下一步后,点击浏览,选择一个要和虚拟机共享的文件夹,**将名称设置为 share**,完成后,单击下一步,最后单击完成即可。完成设置后,单击确认。 -![设置共享文件夹1](https://cdn.xyxsw.site/vmware-ubuntu23.png) +![设置共享文件夹1](./static/vmware-ubuntu23_64b448bbf8ba19ce712ee7df67356a0c.png) -![设置共享文件夹2](https://cdn.xyxsw.site/vmware-ubuntu24.png) +![设置共享文件夹2](./static/vmware-ubuntu24_6979f8e4acb1d87758d67c579c094e93.png) -![设置共享文件夹3](https://cdn.xyxsw.site/vmware-ubuntu25.png) +![设置共享文件夹3](./static/vmware-ubuntu25_9c2613b68db8b66671bfa2d179d665f6.png) -![设置共享文件夹4](https://cdn.xyxsw.site/vmware-ubuntu26.png) +![设置共享文件夹4](./static/vmware-ubuntu26_80f1825ae0bbcd32c2fa84e7c65ca663.png) -**将在第0步下载的setup文件放到刚才设置的共享文件夹中。**重新启动虚拟机。 +**将在第 0 步下载的 setup 文件放到刚才设置的共享文件夹中。**重新启动虚拟机。 -![重启虚拟机](https://cdn.xyxsw.site/vmware-ubuntu27.png) +![重启虚拟机](./static/vmware-ubuntu27_350c98e9e0b413317aaa9aa14ba0509c.png) 登录进入到虚拟机后,启动终端,输入: @@ -136,27 +134,25 @@ bash ./common.sh 期间需要输入多次密码,然后等待命令执行完毕,输入`reboot`回车,重启虚拟机。 -![reboot重启虚拟机](https://cdn.xyxsw.site/vmware-ubuntu28.png) - - +![reboot重启虚拟机](./static/vmware-ubuntu28_5b3c033a7c0f779922ddc908f8bfffb1.png) 重启完毕后如图所示,修改语言为中文。 -![修改语言1](https://cdn.xyxsw.site/virtualbox-ubuntu19.png) +![修改语言1](./static/virtualbox-ubuntu19_464dcd6c0bb222612b389faf2799e105.png) -![修改语言2](https://cdn.xyxsw.site/virtualbox-ubuntu20.png) +![修改语言2](./static/virtualbox-ubuntu20_c66f199049aa6f14b6a7f1d6271fbbbb.png) -![修改语言3](https://cdn.xyxsw.site/virtualbox-ubuntu21.png) +![修改语言3](./static/virtualbox-ubuntu21_b2d3c1fae894fd6e23adcc8204e54ffb.png) 点击`Install`之后等待安装完成,重启系统。重启后请务必选择保留旧的名称。 -![修改语言4](https://cdn.xyxsw.site/virtualbox-ubuntu22.png) +![修改语言4](./static/virtualbox-ubuntu22_c0628032f9c6e16e2b8a50cca9806f4c.png) 接下来打开终端,按照提示设计自己喜欢的终端样式(后续可以更改)。 -## 4.VSCode连接虚拟机 +## 4.VSCode 连接虚拟机 -请参照2.1.1.2开发环境配置中的4、5两节,完成vscode配置。 +请参照 2.1.1.2 开发环境配置中的 4、5 两节,完成 vscode 配置。 打开终端,输入 @@ -164,24 +160,24 @@ bash ./common.sh ifconfig ``` -找到`ens33`一项,记下`inet`后的IP地址,这里是`192.168.95.129`。 +找到`ens33`一项,记下`inet`后的 IP 地址,这里是`192.168.95.129`。 -![查看IP](https://cdn.xyxsw.site/VSCode-ssh7.png) +![查看IP](./static/VSCode-ssh7_0e68dee7e8101558ffd17f81a634ddfb.png) 打开`vscode`,点击左侧 “远程资源管理器”,点击 `SSH` 的 “新建连接”。 -![vscode连接ssh](https://cdn.xyxsw.site/VSCode-ssh1.png) +![vscode连接ssh](./static/VSCode-ssh1_1a1ace268a0babe6939a13569b3d5e0b.png) **或者**,按下`Ctrl+Shift+P`,输入`ssh`,找到`Remote-SSH:将当前窗口连接到主机`一项,点击或回车。 -![vscode连接ssh1](https://cdn.xyxsw.site/VSCode-ssh4.png) +![vscode连接ssh1](./static/VSCode-ssh4_9af9b525fe51caa8ac489f83a408db25.png) 选择`添加新的主机`,再输入`ssh+你的用户名@IP`,如我应该输入`ssh rache@192.168.95.129`。 -![vscode连接ssh2](https://cdn.xyxsw.site/VSCode-ssh5.png) +![vscode连接ssh2](./static/VSCode-ssh5_89141859968c95423e4d234f7093a066.png) 接下来需要更新的配置文件推荐选择第一个,完成后右下角弹出提示,点击”连接“尝试连接到虚拟机。 -![vscode连接ssh3](https://cdn.xyxsw.site/VSCode-ssh6.png) +![vscode连接ssh3](./static/VSCode-ssh6_9bcb2fd944592199068d61dfd11d9814.png) -接下来过程可以继续参照2.1.1.2开发环境配置的后续内容(包括在虚拟机中启用扩展)。 \ No newline at end of file +接下来过程可以继续参照 2.1.1.2 开发环境配置的后续内容(包括在虚拟机中启用扩展)。 diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/2.\345\274\200\345\217\221\347\216\257\345\242\203\351\205\215\347\275\256\357\274\210WSL\357\274\211.md" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/2.\345\274\200\345\217\221\347\216\257\345\242\203\351\205\215\347\275\256\357\274\210WSL\357\274\211.md" index 6eb786c..3048dbf 100644 --- "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/2.\345\274\200\345\217\221\347\216\257\345\242\203\351\205\215\347\275\256\357\274\210WSL\357\274\211.md" +++ "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/2.\345\274\200\345\217\221\347\216\257\345\242\203\351\205\215\347\275\256\357\274\210WSL\357\274\211.md" @@ -32,27 +32,27 @@ 安装 VSCode 并打开,安装 WSL 插件。这里应该自动弹出,如果没有,请自行在插件页面搜索安装: -![](https://cdn.xyxsw.site/wsl-vscode.png) +![](./static/wsl-vscode_ea4a811417aaee6f471d270fb4083cee.png) 接下来导入我们的配置。点击设置(左下角齿轮),找到配置文件,点击打开配置文件设置页面: -![打开配置文件设置](https://cdn.xyxsw.site/wsl-profile-click.png) +![打开配置文件设置](./static/wsl-profile-click_de87be5588104346b25fcb1281bdf0ae.png) 导入之前(第 0 步)下载的 VSCode 配置文件 -![导入的配置文件](https://cdn.xyxsw.site/wsl-profile-import.png) +![导入的配置文件](./static/wsl-profile-import_bbdd26f2c25f3bfab646afefc1f5d405.png) 启用配置后,在插件中找到 Vim 插件并禁用,或者你也可以不禁用,在 VSCode 中使用 Vim 键位操作。 打开远程连接页面,连接 WSL 目标。注意此时应该选择一个文件夹,选择 `/home/<你的 WSL 用户名>` 即可: -![连接 WSL](https://cdn.xyxsw.site/wsl-connect.png) +![连接 WSL](./static/wsl-connect_2748abcef0180122417ba0e069a3ba07.png) 此时应该会自动下载 VSCode server 到 WSL 容器。等待几分钟即可正常。 连上之后,把先前下载的 `setup.tar.gz` 拖入 VSCode 以传输到 WSL 容器内(可能需要一点时间): -![](https://cdn.xyxsw.site/wsl-drag-file.png) +![](./static/wsl-drag-file_4072bbbfa8d3b5129a61c48211c7a127.png) 按下 `Ctrl+~`,呼出终端,同目录下依次输入命令来安装: @@ -66,7 +66,7 @@ bash common_wsl.sh # 运行脚本的 WSL 版本,注意 common.sh 是虚 安装后,关闭终端,再次打开终端,即可看到类似页面,根据提示配置(需要基本的英语阅读能力)(这里引用了 Virtualbox 版本教程的图片,我们仅需关注终端内容): -![完成zsh主题配置](https://cdn.xyxsw.site/virtualbox-ubuntu23.png) +![完成zsh主题配置](./static/virtualbox-ubuntu23_b03650eb8d1419e13cd6860bad36af8b.png) 配置完成。 diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/3.Unix\344\270\216C.md" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/3.Unix\344\270\216C.md" index e868171..276b809 100644 --- "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/3.Unix\344\270\216C.md" +++ "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/3.Unix\344\270\216C.md" @@ -1,6 +1,6 @@ # Unix 与 C -你应该已经在 Week0 中完成了关于 Linux 环境的安装,那么现在来尝试下在类Unix 环境下进行开发吧🤓。 +你应该已经在 Week0 中完成了关于 Linux 环境的安装,那么现在来尝试下在类 Unix 环境下进行开发吧 🤓。 ## 工具的选择 @@ -8,23 +8,23 @@ > [!WARNING] > -> 你可能会想,为什么不使用“现代化”的IDE,而是要麻烦的自己操作。作为学习 c 的程序员,搞明白 c 语言底层逻辑、与系统的交互等等是很重要的,作为一个系统级语言,光跑起来是不够的,要明白是如何跑的。你以后可能在写代码的时候发生许多“玄学问题”,如果没有底层能力将会十分煎熬。 +> 你可能会想,为什么不使用“现代化”的 IDE,而是要麻烦的自己操作。作为学习 c 的程序员,搞明白 c 语言底层逻辑、与系统的交互等等是很重要的,作为一个系统级语言,光跑起来是不够的,要明白是如何跑的。你以后可能在写代码的时候发生许多“玄学问题”,如果没有底层能力将会十分煎熬。 > > 下面这段出自 [learn c the hard way](https://wizardforcel.gitbooks.io/lcthw/content/ex0.html)中文版 > -> IDE,或者“集成开发工具”,会使你变笨。如果你想要成为一个好的程序员,它会是最糟糕的工具,因为它隐藏了背后的细节,你的工作是弄清楚背后发生了什么。如果你试着完成一些事情,并且所在平台根据特定的IDE而设计,它们非常有用,但是对于学习C编程(以及许多其它语言),它们没有意义。 +> IDE,或者“集成开发工具”,会使你变笨。如果你想要成为一个好的程序员,它会是最糟糕的工具,因为它隐藏了背后的细节,你的工作是弄清楚背后发生了什么。如果你试着完成一些事情,并且所在平台根据特定的 IDE 而设计,它们非常有用,但是对于学习 C 编程(以及许多其它语言),它们没有意义。 > > > 注 > > -> > 如果你玩过吉他,你应该知道TAB是什么。但是对于其它人,让我对其做个解释。在音乐中有一种乐谱叫做“五线谱”。它是通用、非常古老的乐谱,以一种通用的方法来记下其它人应该在乐器上弹奏的音符。如果你弹过钢琴,这种乐谱非常易于使用,因为它几乎就是为钢琴和交响乐发明的。 +> > 如果你玩过吉他,你应该知道 TAB 是什么。但是对于其它人,让我对其做个解释。在音乐中有一种乐谱叫做“五线谱”。它是通用、非常古老的乐谱,以一种通用的方法来记下其它人应该在乐器上弹奏的音符。如果你弹过钢琴,这种乐谱非常易于使用,因为它几乎就是为钢琴和交响乐发明的。 > > -> > 然而吉他是一种奇怪的乐器,它并不能很好地适用这种乐谱。所以吉他手通常使用一种叫做TAB(tablature)的乐谱。它所做的不是告诉你该弹奏哪个音符,而是在当时应该拨哪根弦。你完全可以在不知道所弹奏的单个音符的情况下学习整首乐曲,许多人也都是这么做的,但是如果你想知道你弹的是什么,TAB是毫无意义的。 +> > 然而吉他是一种奇怪的乐器,它并不能很好地适用这种乐谱。所以吉他手通常使用一种叫做 TAB(tablature)的乐谱。它所做的不是告诉你该弹奏哪个音符,而是在当时应该拨哪根弦。你完全可以在不知道所弹奏的单个音符的情况下学习整首乐曲,许多人也都是这么做的,但是如果你想知道你弹的是什么,TAB 是毫无意义的。 > > -> > 传统的乐谱可能比TAB更难一些,但是会告诉你如何演奏音乐,而不是如果玩吉他。通过传统的乐谱我可以在钢琴上,或者在贝斯上弹奏相同的曲子。我也可以将它放到电脑中,为它设计全部的曲谱。但是通过TAB我只能在吉他上弹奏。 +> > 传统的乐谱可能比 TAB 更难一些,但是会告诉你如何演奏音乐,而不是如果玩吉他。通过传统的乐谱我可以在钢琴上,或者在贝斯上弹奏相同的曲子。我也可以将它放到电脑中,为它设计全部的曲谱。但是通过 TAB 我只能在吉他上弹奏。 > > -> > IDE就像是TAB,你可以用它非常快速地编程,但是你只能够用一种语言在一个平台上编程。这就是公司喜欢将它卖给你的原因。它们知道你比较懒,并且由于它只适用于它们自己的平台,他们就将你锁定在了那个平台上。 +> > IDE 就像是 TAB,你可以用它非常快速地编程,但是你只能够用一种语言在一个平台上编程。这就是公司喜欢将它卖给你的原因。它们知道你比较懒,并且由于它只适用于它们自己的平台,他们就将你锁定在了那个平台上。 > > -> > 打破这一循环的办法就是不用IDE学习编程。一个普通的文本编辑器,或者一个程序员使用的文本编辑器,例如Vim或者Emacs,能让你更熟悉代码。这有一点点困难,但是最终结果是你将会在任何计算机上,以任何语言熟悉任何代码,并且懂得背后的原理。 +> > 打破这一循环的办法就是不用 IDE 学习编程。一个普通的文本编辑器,或者一个程序员使用的文本编辑器,例如 Vim 或者 Emacs,能让你更熟悉代码。这有一点点困难,但是最终结果是你将会在任何计算机上,以任何语言熟悉任何代码,并且懂得背后的原理。 ## VSCode 的配置 @@ -32,14 +32,15 @@ ### Vim -程序员们对自己正在使用的文本编辑器通常有着 [非常强的执念](https://zh.wikipedia.org/wiki/%E7%BC%96%E8%BE%91%E5%99%A8%E4%B9%8B%E6%88%98)。 +程序员们对自己正在使用的文本编辑器通常有着  [非常强的执念](https://zh.wikipedia.org/wiki/%E7%BC%96%E8%BE%91%E5%99%A8%E4%B9%8B%E6%88%98)。 -现在最流行的编辑器是什么?[Stack Overflow 的调查](https://insights.stackoverflow.com/survey/2019/#development-environments-and-tools)(这个调查可能并不如我们想象的那样客观,因为 Stack Overflow 的用户并不能代表所有程序员)显示,[Visual Studio Code](https://code.visualstudio.com/) 是目前最流行的代码编辑器。而 [Vim](https://www.vim.org/) 则是最流行的基于命令行的编辑器。 +现在最流行的编辑器是什么?[Stack Overflow 的调查](https://insights.stackoverflow.com/survey/2019/#development-environments-and-tools)(这个调查可能并不如我们想象的那样客观,因为 Stack Overflow 的用户并不能代表所有程序员)显示,[Visual Studio Code](https://code.visualstudio.com/)  是目前最流行的代码编辑器。而  [Vim](https://www.vim.org/)  则是最流行的基于命令行的编辑器。 -Vim 有着悠久历史,它始于 1976 年的 Vi 编辑器,到现在还在不断开发中。Vim 有很多聪明的设计思想,所以很多其他工具也支持 Vim 模式(比如,140 万人安装了 [Vim emulation for VS code](https://github.com/VSCodeVim/Vim))。即使你最后使用其他编辑器,Vim 也值得学习。 +Vim 有着悠久历史,它始于 1976 年的 Vi 编辑器,到现在还在不断开发中。Vim 有很多聪明的设计思想,所以很多其他工具也支持 Vim 模式(比如,140 万人安装了  [Vim emulation for VS code](https://github.com/VSCodeVim/Vim))。即使你最后使用其他编辑器,Vim 也值得学习。 > [!TIP] -> **Vim的哲学** +> +> **Vim 的哲学** > > 在编程的时候,你会把大量时间花在阅读/编辑而不是在写代码上。所以,Vim 是一个**多模态**编辑器:它对于插入文字和操纵文字有不同的模式。Vim 是可编程的(可以使用 Vimscript 或者像 Lua 一样的其他程序语言),Vim 的接口本身也是一个程序语言:键入操作(以及其助记名)命令,这些命令也是可组合的。Vim 避免了使用鼠标,因为那样太慢了;Vim 甚至避免用上下左右键,因为那样需要太多的手指移动。 > @@ -47,13 +48,13 @@ Vim 有着悠久历史,它始于 1976 年的 Vi 编辑器,到现在还在不 对于 vim 我们这里做基础要求:能够最低限度使用 vim 进行编辑。也就是当你使用 ssh 没有图形界面的时候,你可以使用 vim 进行修改。 -这是关于vim的**拓展资料:** +这是关于 vim 的**拓展资料:** -- `vimtutor` 是一个 vim 安装时自带的教程 -- [vim Adventures](https://vim-adventures.com/) 是一个学习使用 vim 的游戏 +- `vimtutor`  是一个 vim 安装时自带的教程 +- [vim Adventures](https://vim-adventures.com/)  是一个学习使用 vim 的游戏 - [vim Tips Wiki](http://vim.wikia.com/wiki/vim_Tips_Wiki) -- [vim Advent Calendar](https://vimways.org/2019/) 有很多 vim 小技巧 -- [vim Golf](http://www.vimgolf.com/) 是用 vim 的用户界面作为程序语言的 [code golf](https://en.wikipedia.org/wiki/Code_golf) +- [vim Advent Calendar](https://vimways.org/2019/)  有很多 vim 小技巧 +- [vim Golf](http://www.vimgolf.com/)  是用 vim 的用户界面作为程序语言的  [code golf](https://en.wikipedia.org/wiki/Code_golf) - [Vi/vim Stack Exchange](https://vi.stackexchange.com/) - [vim Screencasts](http://vimcasts.org/) - [Practical Vim](https://pragprog.com/titles/dnvim2/practical-vim-second-edition/)(书籍) @@ -72,20 +73,20 @@ Vim 有着悠久历史,它始于 1976 年的 Vi 编辑器,到现在还在不 - 当前模块是谁编写的? - 这个文件的这一行是什么时候被编辑的?是谁作出的修改?修改原因是什么呢? -- 最近的1000个版本中,何时/为什么导致了单元测试失败? +- 最近的 1000 个版本中,何时/为什么导致了单元测试失败? -尽管版本控制系统有很多, 其事实上的标准则是**Git** 。而这篇 [XKCD 漫画](https://xkcd.com/1597/) 则反映出了人们对 Git 的评价: +尽管版本控制系统有很多, 其事实上的标准则是**Git** 。而这篇  [XKCD 漫画](https://xkcd.com/1597/)  则反映出了人们对 Git 的评价: -![XKCD 漫画](https://cdn.xyxsw.site/git.png) +![XKCD 漫画](./static/git_d28f46654cd788d9c8e29a04bf1bf2f2.png) ### 如何使用 Git 建议以命令行的方式使用 Git -#### Git的命令行接口(基础部分) +#### Git 的命令行接口(基础部分) - `git help `: 获取 git 命令的帮助信息 -- `git init`: 创建一个新的 git 仓库,其数据会存放在一个名为 `.git` 的目录下 +- `git init`: 创建一个新的 git 仓库,其数据会存放在一个名为  `.git`  的目录下 - `git status`: 显示当前的仓库状态 - `git add `: 添加文件到暂存区 - `git commit`: 创建一个新的提交 @@ -97,7 +98,7 @@ Vim 有着悠久历史,它始于 1976 年的 Vi 编辑器,到现在还在不 - `git diff `: 显示某个文件两个版本之间的差异 - `git checkout `: 更新 HEAD 和目前的分支 -> **下面举一个clone仓库的例子** +> **下面举一个 clone 仓库的例子** > > - **安装** > @@ -116,7 +117,7 @@ Vim 有着悠久历史,它始于 1976 年的 Vi 编辑器,到现在还在不 > > 完成以上配置后你的每一次`commit`都会以名称为`Zhang San`邮箱为`zhangsan@foo.com`的信息提交 > -> `git config`可以配置的内容众多,可以自行上网搜索或者使用以下方法中的任意一种获得任何git命令的手册页(manpage)(将verb替换为config即为git config的手册) +> `git config`可以配置的内容众多,可以自行上网搜索或者使用以下方法中的任意一种获得任何 git 命令的手册页(manpage)(将 verb 替换为 config 即为 git config 的手册) > > ```bash > git help @@ -135,11 +136,10 @@ Vim 有着悠久历史,它始于 1976 年的 Vi 编辑器,到现在还在不 > ``` > > **第二步:** -> 获取仓库url -> 仓库绿色Code按钮展开后就会给出,复制选中https后给出的url -> (如图中所示,不同仓库的url内容不同,改图仅作参考) -> ![url example](https://cdn.xyxsw.site/git-clone.png) -> **第三步:** +> 获取仓库 url +> 仓库绿色 Code 按钮展开后就会给出,复制选中 https 后给出的 url +> (如图中所示,不同仓库的 url 内容不同,改图仅作参考) +> ![url example](./static/git-clone_9c14c92a094093d6fb47485b24ae9614.png) > **第三步:** > 使用`git clone`命令进行复制 > > ```bash @@ -190,19 +190,19 @@ Vim 有着悠久历史,它始于 1976 年的 Vi 编辑器,到现在还在不
拓展 -### Git拓展 +### Git 拓展 -下面部分大多为理论部分,如果你不感兴趣或是头疼,就跳过这一部分吧😊 +下面部分大多为理论部分,如果你不感兴趣或是头疼,就跳过这一部分吧 😊 -#### Git的数据模型 +#### Git 的数据模型 进行版本控制的方法很多。Git 拥有一个经过精心设计的模型,这使其能够支持版本控制所需的所有特性,例如维护历史记录、支持分支和促进协作。 ##### 快照 -Git 将顶级目录中的文件和文件夹作为集合,并通过一系列快照来管理其历史记录。在Git的术语里,文件被称作Blob对象(数据对象),也就是一组数据。目录则被称之为“树”,它将名字与 Blob 对象或树对象进行映射(使得目录中可以包含其他目录)。快照则是被追踪的最顶层的树。例如,一个树看起来可能是这样的: +Git 将顶级目录中的文件和文件夹作为集合,并通过一系列快照来管理其历史记录。在 Git 的术语里,文件被称作 Blob 对象(数据对象),也就是一组数据。目录则被称之为“树”,它将名字与 Blob 对象或树对象进行映射(使得目录中可以包含其他目录)。快照则是被追踪的最顶层的树。例如,一个树看起来可能是这样的: -``` txt +```txt (tree) | +- foo (tree) @@ -212,7 +212,7 @@ Git 将顶级目录中的文件和文件夹作为集合,并通过一系列快 +- baz.txt (blob, contents = "git is wonderful") ``` -这个顶层的树包含了两个元素,一个名为 “foo” 的树(它本身包含了一个blob对象 “bar.txt”),以及一个 blob 对象 “baz.txt”。 +这个顶层的树包含了两个元素,一个名为 “foo” 的树(它本身包含了一个 blob 对象 “bar.txt”),以及一个 blob 对象 “baz.txt”。 ##### 历史记录建模:关联快照 @@ -222,18 +222,18 @@ Git 将顶级目录中的文件和文件夹作为集合,并通过一系列快 在 Git 中,这些快照被称为“提交”。通过可视化的方式来表示这些历史提交记录时,看起来差不多是这样的: -``` txt +```txt o <-- o <-- o <-- o ^ \ --- o <-- o ``` -上面是一个 ASCII 码构成的简图,其中的 `o` 表示一次提交(快照)。 +上面是一个 ASCII 码构成的简图,其中的  `o`  表示一次提交(快照)。 箭头指向了当前提交的父辈(这是一种“在…之前”,而不是“在…之后”的关系)。在第三次提交之后,历史记录分岔成了两条独立的分支。这可能因为此时需要同时开发两个不同的特性,它们之间是相互独立的。开发完成后,这些分支可能会被合并并创建一个新的提交,这个新的提交会同时包含这些特性。新的提交会创建一个新的历史记录,看上去像这样(最新的合并提交用粗体标记): -``` txt +```txt o <-- o <-- o <-- o <---- o ^ / \ v @@ -246,7 +246,7 @@ Git 中的提交是不可改变的。但这并不代表错误不能被修改, 以伪代码的形式来学习 Git 的数据模型,可能更加清晰: -``` txt +```txt // 文件就是一组数据 type blob = array @@ -268,13 +268,13 @@ type commit = struct { Git 中的对象可以是 blob、树或提交: -``` txt +```txt type object = blob | tree | commit ``` -Git 在储存数据时,所有的对象都会基于它们的 [SHA-1 哈希](https://en.wikipedia.org/wiki/SHA-1) 进行寻址。 +Git 在储存数据时,所有的对象都会基于它们的  [SHA-1 哈希](https://en.wikipedia.org/wiki/SHA-1)  进行寻址。 -``` txt +```txt objects = map def store(object): @@ -287,16 +287,16 @@ def load(id): Blobs、树和提交都一样,它们都是对象。当它们引用其他对象时,它们并没有真正的在硬盘上保存这些对象,而是仅仅保存了它们的哈希值作为引用。 -例如,[上面](https://missing-semester-cn.github.io/2020/version-control/#snapshots)例子中的树(可以通过 `git cat-file -p 698281bc680d1995c5f4caaf3359721a5a58d48d` 来进行可视化),看上去是这样的: +例如,[上面](https://missing-semester-cn.github.io/2020/version-control/#snapshots)例子中的树(可以通过  `git cat-file -p 698281bc680d1995c5f4caaf3359721a5a58d48d`  来进行可视化),看上去是这样的: -``` txt +```txt 100644 blob 4448adbf7ecd394f42ae135bbeed9676e894af85 baz.txt 040000 tree c68d233a33c5c06e0340e4c224f0afca87c8ce87 foo ``` -树本身会包含一些指向其他内容的指针,例如 `baz.txt` (blob) 和 `foo` (树)。如果我们用 `git cat-file -p 4448adbf7ecd394f42ae135bbeed9676e894af85`,即通过哈希值查看 baz.txt 的内容,会得到以下信息: +树本身会包含一些指向其他内容的指针,例如  `baz.txt` (blob) 和  `foo` (树)。如果我们用  `git cat-file -p 4448adbf7ecd394f42ae135bbeed9676e894af85`,即通过哈希值查看 baz.txt 的内容,会得到以下信息: -``` txt +```txt git is wonderful ``` @@ -304,9 +304,9 @@ git is wonderful 现在,所有的快照都可以通过它们的 SHA-1 哈希值来标记了。但这也太不方便了,谁也记不住一串 40 位的十六进制字符。 -针对这一问题,Git 的解决方法是给这些哈希值赋予人类可读的名字,也就是引用(references)。引用是指向提交的指针。与对象不同的是,它是可变的(引用可以被更新,指向新的提交)。例如,`master` 引用通常会指向主分支的最新一次提交。 +针对这一问题,Git 的解决方法是给这些哈希值赋予人类可读的名字,也就是引用(references)。引用是指向提交的指针。与对象不同的是,它是可变的(引用可以被更新,指向新的提交)。例如,`master`  引用通常会指向主分支的最新一次提交。 -``` txt +```txt references = map def update_reference(name, id): @@ -328,11 +328,11 @@ def load_reference(name_or_id): ##### 仓库 -最后,我们可以粗略地给出 Git 仓库的定义了:`对象` 和 `引用`。 +最后,我们可以粗略地给出 Git 仓库的定义了:`对象`  和  `引用`。 -在硬盘上,Git 仅存储对象和引用:因为其数据模型仅包含这些东西。所有的 `git` 命令都对应着对提交树的操作,例如增加对象,增加或删除引用。 +在硬盘上,Git 仅存储对象和引用:因为其数据模型仅包含这些东西。所有的  `git`  命令都对应着对提交树的操作,例如增加对象,增加或删除引用。 -当您输入某个指令时,请思考一下这条命令是如何对底层的图数据结构进行操作的。另一方面,如果您希望修改提交树,例如“丢弃未提交的修改和将 ‘master’ 引用指向提交 `5d83f9e` 时,有什么命令可以完成该操作(针对这个具体问题,您可以使用 `git checkout master; git reset --hard 5d83f9e`) +当您输入某个指令时,请思考一下这条命令是如何对底层的图数据结构进行操作的。另一方面,如果您希望修改提交树,例如“丢弃未提交的修改和将 ‘master’ 引用指向提交  `5d83f9e`  时,有什么命令可以完成该操作(针对这个具体问题,您可以使用  `git checkout master; git reset --hard 5d83f9e`) #### 暂存区 @@ -382,12 +382,12 @@ tar xJvf archive_name.tar.xz //解压.xz ### 这些是什么文件? 你可能会疑惑`.tar`、`.tar.gz`、`.tar.bz2`、`.tar.xz`这些文件到底是什么 -熟悉Windows的你肯定知道`.rar`、`.zip`、`.7z`等压缩包后缀是使用不同压缩方法压缩后得到的结果 -而`.gz`、`.bz2`、`.xz`本质上就是使用不同压缩方法对tar文件压缩后的结果 +熟悉 Windows 的你肯定知道`.rar`、`.zip`、`.7z`等压缩包后缀是使用不同压缩方法压缩后得到的结果 +而`.gz`、`.bz2`、`.xz`本质上就是使用不同压缩方法对 tar 文件压缩后的结果 那么`.tar`文件又是什么呢?~~(STFW)~~ -**tar**是Unix和类Unix系统上的归档打包工具,可以将多个文件合并为一个文件,打包后的文件名亦为“tar”。目前,tar文件格式已经成为POSIX标准,最初是POSIX.1-1988,目前是POSIX.1-2001。本程序最初的设计目的是将文件备份到磁带上(**tape** **archive**),因而得名tar。 +**tar**是 Unix 和类 Unix 系统上的归档打包工具,可以将多个文件合并为一个文件,打包后的文件名亦为“tar”。目前,tar 文件格式已经成为 POSIX 标准,最初是 POSIX.1-1988,目前是 POSIX.1-2001。本程序最初的设计目的是将文件备份到磁带上(**tape** **archive**),因而得名 tar。 说人话就是把一堆文件和目录变成了一个以`.tar`为后缀的文件 @@ -431,17 +431,17 @@ GCC - GNU project C and C++ compiler 我们列举 GCC 的一些功能的参数如下: -- `-E` 对源文件进行预处理 -- `-S` 将源文件编译为汇编代码(C 代码 -> 汇编代码) -- `-c` 将源文件编译为目标文件(C 代码 -> 机器代码) -- `-o` 指定输出文件名 -- `-std=...` 选择使用的 C 语言标准规范 -- `-Wall` 开启所有可能的警告(建议始终开启) -- `-Wextra` 启用一些`-Wall`未启用的额外警告标志 -- `-Wpedantic` 发出严格的 C 标准要求的所有警告;禁止编译器扩展。(建议始终开启) -- `-Werror` 将所有警告视为错误(建议始终开启) -- `-g` 生成调试信息(为调试器提供信息) -- `-O(g/1/2/3/s, ...)` 启用优化(需要调试程序时,建议使用`-Og`或不优化) +- `-E` 对源文件进行预处理 +- `-S` 将源文件编译为汇编代码(C 代码 -> 汇编代码) +- `-c` 将源文件编译为目标文件(C 代码 -> 机器代码) +- `-o` 指定输出文件名 +- `-std=...` 选择使用的 C 语言标准规范 +- `-Wall` 开启所有可能的警告(建议始终开启) +- `-Wextra` 启用一些`-Wall`未启用的额外警告标志 +- `-Wpedantic` 发出严格的 C 标准要求的所有警告;禁止编译器扩展。(建议始终开启) +- `-Werror` 将所有警告视为错误(建议始终开启) +- `-g` 生成调试信息(为调试器提供信息) +- `-O(g/1/2/3/s, ...)` 启用优化(需要调试程序时,建议使用`-Og`或不优化) 尝试在你的终端中(记得到你保存程序的文件里面)输入: @@ -456,7 +456,7 @@ gcc -Wall -Wpedantic -Og -o xxx xxx.c > > 我们还是推荐你去阅读 GCC 的手册去了解更多, 输入 man gcc 查看。当然,你也可以 STFW。 > -> 🤓我们这节的 lab 会让你进行一个简易的多文件编译,提前更多地了解 GCC 会让你更轻松 +> 🤓 我们这节的 lab 会让你进行一个简易的多文件编译,提前更多地了解 GCC 会让你更轻松 ## 附加部分 Make @@ -496,9 +496,10 @@ clean: ``` 然后输入 make 和 make clean ,看看效果。 + > [!CAUTION] > -> 注意,Makefile的缩进必须采用\ +> 注意,Makefile 的缩进必须采用\ > [!TIP] > diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/4.C\350\257\255\350\250\200\345\237\272\347\241\200\350\257\255\346\263\225.md" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/4.C\350\257\255\350\250\200\345\237\272\347\241\200\350\257\255\346\263\225.md" index fe13a48..25e3b81 100644 --- "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/4.C\350\257\255\350\250\200\345\237\272\347\241\200\350\257\255\346\263\225.md" +++ "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/4.C\350\257\255\350\250\200\345\237\272\347\241\200\350\257\255\346\263\225.md" @@ -1,6 +1,6 @@ -# C语言基础语法 +# C 语言基础语法 -在了解完C语言环境的搭建以后,让我们开始进行编程吧,本节课将涉及到抽象思维,C语言基础操作,以及指针的入门。 +在了解完 C 语言环境的搭建以后,让我们开始进行编程吧,本节课将涉及到抽象思维,C 语言基础操作,以及指针的入门。 希望大家能够在这节课中学到一些有趣的知识。 @@ -54,17 +54,17 @@ int main(void) { 使用抽象,我们能够在更高层次上与计算机交互,而不是直接操作底层硬件或机器码。通过编程语言、编译器和操作系统等层次,我们可以更快速地开发和维护复杂的软件系统。 -当然,在我们使用C语言进行代码开发的时候,也会使用到抽象的思想,就比如说你想要实现一个贪吃蛇的功能,你一定不想在main函数里面完成所有功能,因为这样会大大增加开发的难度,没人想要把一长段的代码塞到一个函数里面去,这样不仅开发速度慢,而且出现bug还很难修! +当然,在我们使用 C 语言进行代码开发的时候,也会使用到抽象的思想,就比如说你想要实现一个贪吃蛇的功能,你一定不想在 main 函数里面完成所有功能,因为这样会大大增加开发的难度,没人想要把一长段的代码塞到一个函数里面去,这样不仅开发速度慢,而且出现 bug 还很难修! ```c /** - * @param 游戏板: board[board_size][board_size] - * @param 初始化: initialize_board - * @param 随机生成: generate_number - * @param 打印显示: print_board - * @param 读取移动指令: choose_direction - * @param 合并并移动: move_and_merge - * @param 判断游戏终止: is_finished + * @var 游戏板: board[board_size][board_size] + * @func 初始化: initialize_board + * @func 随机生成: generate_number + * @func 打印显示: print_board + * @func 读取移动指令: choose_direction + * @func 合并并移动: move_and_merge + * @func 判断游戏终止: is_finished */ void run_game() { initialize_board(); @@ -87,16 +87,16 @@ void run_game() { > 抽象的设计使得我们将复杂的逻辑分解为若干简单的函数模块,各个模块之间相互独立并可以重复使用,这样可以使代码结构更加清晰、易于维护和扩展。 > 虽然我还没有实现贪吃蛇的功能,但显然我已经把贪吃蛇的思路设计好了,有了思路,我们就能进行进一步的编程,逐个实现各个函数,最后拼在一起就是完整的程序了。这就是抽象,理解了吗。 -## C语言基础操作 +## C 语言基础操作 -C语言其实是十分基础的一门编程语言,它与计算机底层连接的十分紧密,因此,作为一只计算机系的小猫猫,我们是十分有必要了解这些的。 +C 语言其实是十分基础的一门编程语言,它与计算机底层连接的十分紧密,因此,作为一只计算机系的小猫猫,我们是十分有必要了解这些的。 > [!tip] -> 假如你不是计算机系的学生,那也必须掌握这项技能。麻省理工学院开设了一个专业,那就是著名的eecs(electrical engineering and computer science)。电子工程和计算机的界限本身就很模糊。而且,近些年来兴起的物联网技术,无人车等,都离不开计算机和电子信息之间的协作。在交叉领域,我们更需要一些人才,来打破边界,取得突破。 +> 假如你不是计算机系的学生,那也必须掌握这项技能。麻省理工学院开设了一个专业,那就是著名的 eecs(electrical engineering and computer science)。电子工程和计算机的界限本身就很模糊。而且,近些年来兴起的物联网技术,无人车等,都离不开计算机和电子信息之间的协作。在交叉领域,我们更需要一些人才,来打破边界,取得突破。 ### 常量 -在C语言中,每个变量都有属于它的常量形式 +在 C 语言中,每个变量都有属于它的常量形式 我们可以这样来定义常量: @@ -112,77 +112,77 @@ const char c = 'c'; > [!tip] > 常量有什么用呢 -> 当你和你的好友一起写代码时,你想让你的好友写一段播放音频的代码,并且为你需要为你的好友提供一个程序接口,你一定不想让你的好友更改你传入的音频文件,因为这会导致一些不可预知的bug,这时候,你就能考虑使用`const`来保证你的朋友不会更改你的音频信息`void play_wav(const int* audio,size_t length);` +> 当你和你的好友一起写代码时,你想让你的好友写一段播放音频的代码,并且为你需要为你的好友提供一个程序接口,你一定不想让你的好友更改你传入的音频文件,因为这会导致一些不可预知的 bug,这时候,你就能考虑使用`const`来保证你的朋友不会更改你的音频信息`void play_wav(const int* audio,size_t length);` > > 确保自己以后不小心修改了逻辑上不可修改的变量时编译器可以及时报错提醒,而不是等到程序运行一段时间后发生错误。 ### 控制流 -顺序,分支,循环。这是C语言中最基本的操作,只要使用这三种操作,在理论上,你就能可以编写**任何**计算机程序 +顺序,分支,循环。这是 C 语言中最基本的操作,只要使用这三种操作,在理论上,你就能可以编写**任何**计算机程序 - 顺序结构 - 顺序结构就是一条一条执行指令 + 顺序结构就是一条一条执行指令 - 分支结构 - 分支结构是程序根据条件的不同执行不同的代码路径,使得程序能够做出决策,从而根据不同的输入或状态采取不同的行为。 - - 最常见的就是使用if-else语句: - - ```c - if(a == 1){ - printf("true"); - }else if(a == 0){ - printf("false"); - }else{ - printf("error"); - } - ``` - - 还有switch,用于处理同一类型数据的各种情况: - - ```c - switch(ch){ - case 'a': - printf("you choose \'a\' as your answer!\n"); - break; // 千万别忘加 - case 'b': - printf("you choose \'b\' as your answer!\n"); - break; // 千万别忘加 - case 'c': - printf("you choose \'c\' as your answer!\n"); - break; // 千万别忘加 - case 'd': - printf("you choose \'d\' as your answer!\n"); - break; // 千万别忘加 - default: - printf("you don\'t choose any answer!\n"); - break; // 可忽略 - } - - ``` + 分支结构是程序根据条件的不同执行不同的代码路径,使得程序能够做出决策,从而根据不同的输入或状态采取不同的行为。 + + 最常见的就是使用 if-else 语句: + + ```c + if(a == 1){ + printf("true"); + }else if(a == 0){ + printf("false"); + }else{ + printf("error"); + } + ``` + + 还有 switch,用于处理同一类型数据的各种情况: + + ```c + switch(ch){ + case 'a': + printf("you choose \'a\' as your answer!\n"); + break; // 千万别忘加 + case 'b': + printf("you choose \'b\' as your answer!\n"); + break; // 千万别忘加 + case 'c': + printf("you choose \'c\' as your answer!\n"); + break; // 千万别忘加 + case 'd': + printf("you choose \'d\' as your answer!\n"); + break; // 千万别忘加 + default: + printf("you don\'t choose any answer!\n"); + break; // 可忽略 + } + + ``` - 循环结构 - 常见的循环结构包括while和for两种,并且都需要掌握 + 常见的循环结构包括 while 和 for 两种,并且都需要掌握 - ```c - // 这是while,当表达式为"真"时,会继续执行下面的命令 - while(expr){ - ... - } + ```c + // 这是while,当表达式为"真"时,会继续执行下面的命令 + while(expr){ + ... + } - // 这是do-while结构,程序会先执行一遍,假如表达式为"真"那么就会继续执行 - do{ - ... - }while(expr) + // 这是do-while结构,程序会先执行一遍,假如表达式为"真"那么就会继续执行 + do{ + ... + }while(expr) - // for循环,括号里面的三项分别为(初始化操作;判断条件;结束后需要进行的操作) - for(i=0;i<100;i++){ - ... - } + // for循环,括号里面的三项分别为(初始化操作;判断条件;结束后需要进行的操作) + for(i=0;i<100;i++){ + ... + } - ``` + ``` - 当然不常见的还有`goto`,不过不利于维护,不建议使用 + 当然不常见的还有`goto`,不过不利于维护,不建议使用 > [!note] > @@ -229,7 +229,7 @@ int fact(int n){ // 这是函数的实现 对于`int fact(int n);` -- 最前面的`int`表示函数**返回**的数据类型是int类型 +- 最前面的`int`表示函数**返回**的数据类型是 int 类型 - `fact`表示的是函数名称 - 括号里的`int`表示传入参数的数据类型,`n`表示传入参数的变量名 @@ -260,7 +260,7 @@ int main(){ > [!tip] > -> 请注意数组是内存中的一块连续的空间,加入你定义了一个大小为3的数组`int tmp[3]`,千万不要访问第四个元素tmp[3],因为这会导致ub(未定义行为),会导致你的程序出现莫名其妙的bug +> 请注意数组是内存中的一块连续的空间,加入你定义了一个大小为 3 的数组`int tmp[3]`,千万不要访问第四个元素 tmp[3],因为这会导致 ub(未定义行为),会导致你的程序出现莫名其妙的 bug > 并且,你只能在初始化的时候这么豪爽地将好几个值赋值到数组中,当完成初始化后,就不能使用这种方法了,需要一个一个进行修改 ### 字符串 @@ -289,23 +289,23 @@ int main(){ ## 指针的快速入门 -**指针**,作为C语言的精髓,在广受赞誉的同时,有广受鄙夷,以至于`java`的创始人 james gosling 评价指针是**一种容易导致程序出错的语言特性** +**指针**,作为 C 语言的精髓,在广受赞誉的同时,有广受鄙夷,以至于`java`的创始人 james gosling 评价指针是**一种容易导致程序出错的语言特性** 确实,指针的直接操作在 c 和 c++ 等语言中容易导致内存泄漏、缓冲区溢出、指针悬挂(悬空指针)等问题,使得程序不安全且难以调试。 -不过,也正是因为指针,C语言可以通过直接访问内存的方式,在函数间传递内存地址,而不是传递数据的副本。特别是在处理大数据结构(如数组、结构体)时,避免了不必要的数据拷贝。 +不过,也正是因为指针,C 语言可以通过直接访问内存的方式,在函数间传递内存地址,而不是传递数据的副本。特别是在处理大数据结构(如数组、结构体)时,避免了不必要的数据拷贝。 ### 内存 在理解内存时,我们可以将内存理解为一个超大的数组,`地址`可以看作这个数组的索引,通过访问这个"索引"我们就能取到这个数组上的特定元素 -| 值(一个字节) | 地址(32位) | -| :----------: | :--------: | -| 0b00110011 | 0xffffffff | -| ? | 0xfffffffe | -| 0xa8 | 0xfffffffd | -| ... | ... | -| ? | 0x00000000 | +| 值(一个字节) | 地址(32 位) | +| :----------: | :---------: | +| 0b00110011 | 0xffffffff | +| ? | 0xfffffffe | +| 0xa8 | 0xfffffffd | +| ... | ... | +| ? | 0x00000000 | ### 变量与垃圾值 @@ -317,29 +317,29 @@ char c = 'c'; 当你定义变量时,你会获得四个参数 -| 变量类型 | 变量名 | 值 | 存储地址 | -| :------: | :----: | :---: | :------: | -| int | a | 1 | &a | -| float | b | 1.2 | &b | -| char | c | 'c' | &c | - -实际上在内存中已经存好了(使用小端序,64位机) - -| 变量名 | 数值 | 内存 | -| :----: | :---: | :----------------: | -| a | 0x01 | 0x00007ffee72f6b34 | -| a | 0x00 | 0x00007ffee72f6b35 | -| a | 0x00 | 0x00007ffee72f6b36 | -| a | 0x00 | 0x00007ffee72f6b37 | -| b | 0x9a | 0x00007ffee72f6b30 | -| b | 0x99 | 0x00007ffee72f6b31 | -| b | 0x99 | 0x00007ffee72f6b32 | -| b | 0x3f | 0x00007ffee72f6b33 | -| c | 0x63 | 0x00007ffee72f6b2f | +| 变量类型 | 变量名 | 值 | 存储地址 | +| :------: | :----: | :-: | :------: | +| int | a | 1 | &a | +| float | b | 1.2 | &b | +| char | c | 'c' | &c | + +实际上在内存中已经存好了(使用小端序,64 位机) + +| 变量名 | 数值 | 内存 | +| :----: | :--: | :----------------: | +| a | 0x01 | 0x00007ffee72f6b34 | +| a | 0x00 | 0x00007ffee72f6b35 | +| a | 0x00 | 0x00007ffee72f6b36 | +| a | 0x00 | 0x00007ffee72f6b37 | +| b | 0x9a | 0x00007ffee72f6b30 | +| b | 0x99 | 0x00007ffee72f6b31 | +| b | 0x99 | 0x00007ffee72f6b32 | +| b | 0x3f | 0x00007ffee72f6b33 | +| c | 0x63 | 0x00007ffee72f6b2f | > [!note] > -> 每一个地址存储一个字节(8位),在64位机中,`int`类型占用4个字节,`float`类型也占用4个字节,`char`类型占用1个字节 +> 每一个地址存储一个字节(8 位),在 64 位机中,`int`类型占用 4 个字节,`float`类型也占用 4 个字节,`char`类型占用 1 个字节 > 假设我们定义一个变量`int d;`不给他传递初始值,那么,编译器会为它分配一片空间,有可能编译器不对他赋初始值,那么,我们倘若直接读取这个变量的时候,有可能读到一个数值,这个数值就是原来内存存储的数值,我们将这种数据称为**垃圾值** @@ -360,17 +360,17 @@ int array[5] = { 1, 2, 3, 4, 5 }; array 这个标识符是什么呢? -| 值(四个字节) | 地址(32位) | 访问 | -| :------------: | :----------: | :------: | -| 0x00000005 | 0xffffffff | array[4] | -| 0x00000004 | 0xfffffffb | array[3] | -| 0x00000003 | 0xfffffff7 | array[2] | -| 0x00000002 | 0xfffffff3 | array[1] | -| 0x00000001 | 0xffffffef | array[0] | +| 值(四个字节) | 地址(32 位) | 访问 | +| :------------: | :-----------: | :------: | +| 0x00000005 | 0xffffffff | array[4] | +| 0x00000004 | 0xfffffffb | array[3] | +| 0x00000003 | 0xfffffff7 | array[2] | +| 0x00000002 | 0xfffffff3 | array[1] | +| 0x00000001 | 0xffffffef | array[0] | -> 上面提到array这个数组实际上是一片连续的内存空间,所以array存储的是第一个值的地址0xffffffef 通过访问这个地址,我们就能快速定位这个数组,并进行访问 +> 上面提到 array 这个数组实际上是一片连续的内存空间,所以 array 存储的是第一个值的地址 0xffffffef 通过访问这个地址,我们就能快速定位这个数组,并进行访问 > -> 那么访问array[5]就会导致访问到不属于数组的空间,就会引发bug,这就是**数组越界** +> 那么访问 array[5]就会导致访问到不属于数组的空间,就会引发 bug,这就是**数组越界** ### 多维数组 @@ -378,18 +378,18 @@ array 这个标识符是什么呢? int array[2][2] = {{1,2},{3,4}}; ``` -| 值 | 地址 | 访问 | 访问 | 访问 | -| :---: | :---------: | :----------: | :-------: | :----: | -| 1 | 0xaffffff0 | matrix[0][0] | matrix[0] | matrix | -| 2 | 0xaffffff4 | matrix[0][1] | | | -| 3 | 0xaffffff8 | matrix[1][0] | matrix[1] | | -| 4 | 0xaffffff12 | matrix[1][1] | | | +| 值 | 地址 | 访问 | 访问 | 访问 | +| :-: | :---------: | :----------: | :-------: | :----: | +| 1 | 0xaffffff0 | matrix[0][0] | matrix[0] | matrix | +| 2 | 0xaffffff4 | matrix[0][1] | | | +| 3 | 0xaffffff8 | matrix[1][0] | matrix[1] | | +| 4 | 0xaffffff12 | matrix[1][1] | | | 我们可以发现,不管是多维数组,还是一维数组,存储结构都是线性的,多维数组是按行进行展开的 > [!WARNING] > ->请先跳过这段,等到学完指针之后,再来看下面这个程序,你会发现什么呢? +> 请先跳过这段,等到学完指针之后,再来看下面这个程序,你会发现什么呢? ```c #include @@ -415,7 +415,7 @@ matrix[0] = 0x7ffc624f4cd0 ### 指针 > [!CAUTION] -> 指针是C语言中最困难的部分,我们将花大量的篇幅讲解指针,如果初学的你无法完全理解下面的内容,这是正常的。如果可以,请尝试编写程序验证自己的理解,或者保留你的疑问等待后续讲座的深入讲解。 +> 指针是 C 语言中最困难的部分,我们将花大量的篇幅讲解指针,如果初学的你无法完全理解下面的内容,这是正常的。如果可以,请尝试编写程序验证自己的理解,或者保留你的疑问等待后续讲座的深入讲解。 指针也可以看作一个变量,我们对其的定义是这样的 @@ -425,19 +425,19 @@ int* p = &a; printf("%d",*p); ``` -| 元素 | 含意 | -| :---: | :-------------------------------------------------: | -| int* | int表示指针指向的元素类型 *代表的是我要定义一个指针 | -| p | 变量标识符 | -| &a | 指针的值(变量a的内存地址) | -| &p | 存放指针的内存地址(变量p的内存地址) | +| 元素 | 含意 | +| :---: | :---------------------------------------------------: | +| int\* | int 表示指针指向的元素类型 \*代表的是我要定义一个指针 | +| p | 变量标识符 | +| &a | 指针的值(变量 a 的内存地址) | +| &p | 存放指针的内存地址(变量 p 的内存地址) | -| 值(四个字节) | 地址(32位) | 指针访问 | 标识符 | -| :------------: | :----------: | :------: | :----: | -| 0x00000001 | 0xafffffff | *p | a | -| 0xafffffff | 0xaffffffb | | p | +| 值(四个字节) | 地址(32 位) | 指针访问 | 标识符 | +| :------------: | :-----------: | :------: | :----: | +| 0x00000001 | 0xafffffff | \*p | a | +| 0xafffffff | 0xaffffffb | | p | -可以看到指针存放的是a的地址我们可以通过操作符`*`对指针进行**解引用**来提取出指针指向地址的值,然后使用指针提取a处的值 +可以看到指针存放的是 a 的地址我们可以通过操作符`*`对指针进行**解引用**来提取出指针指向地址的值,然后使用指针提取 a 处的值 指针也是有类型的,指针的类型决定了指针该对指向的地址进行什么操作,假设指针的类型为`int*`,那么在解引用时,指针就会提取出指向的地址以及指向地址的后面三位地址的值,将其拼接为一个`int` @@ -454,11 +454,11 @@ int* p = null; > > 还记得之前讲过的垃圾值吗,正是因为有垃圾值的存在,我们对指针进行初始化的时候,假如不对指针进行赋空操作,那么**垃圾值**就会成为指针指向的位置,这非常危险,相当于有人把枪口对准你,即使不开枪,我们也**绝对不会**允许这种事情发生! > -> 我们将指针赋值为空,也就是让枪口指向地面,即使开枪,也会被操作系统强制终止,因为地址0是不被允许访问的 +> 我们将指针赋值为空,也就是让枪口指向地面,即使开枪,也会被操作系统强制终止,因为地址 0 是不被允许访问的 ### 指针的作用 -指针是C语言的精髓,广泛运用于传参等方面 +指针是 C 语言的精髓,广泛运用于传参等方面 ```c #include @@ -492,9 +492,9 @@ a = 1, b = 2 after swap1 a = 2, b = 1 after swap2 ``` -在C语言中,函数的返回值只能是一个值,并且,假设你传a,b两个变量的话,无论在函数中进行了什么操作,都不会影响原来的变量 +在 C 语言中,函数的返回值只能是一个值,并且,假设你传 a,b 两个变量的话,无论在函数中进行了什么操作,都不会影响原来的变量 -但我们传入一个指针之后就完全不一样了,我们可以通过指针,直接修改a,b所在地址的值,这就能达到交换数据的效果 +但我们传入一个指针之后就完全不一样了,我们可以通过指针,直接修改 a,b 所在地址的值,这就能达到交换数据的效果 ### 指针数组和数组指针 @@ -517,9 +517,9 @@ int (*p)[10]; int* (*p)[20][10]; ``` -> 问: p是什么? -> p是指针还是数组? -> p的类型是什么? +> 问: p 是什么? +> p 是指针还是数组? +> p 的类型是什么? ### 数组和指针的关系 @@ -552,41 +552,41 @@ main.c:10:19: warning: initialization of ‘int **’ from incompatible pointer | ^~~~~~ ``` -二维数组和二维指针是两个完全不一样的存在,尝试获取二位数组matrix的地址,`matrix`和`(*matrix)`得到的地址的值是一样的 +二维数组和二维指针是两个完全不一样的存在,尝试获取二位数组 matrix 的地址,`matrix`和`(*matrix)`得到的地址的值是一样的 他们都是数组的首地址,区别在于他们的类型,`matrix`得到的类型是`int(*)[2]`,而`*matrix`的类型是`int[2]` > [!cautions] -> 而对二维指针进行解引用,那么,它就会提取出matrix指向位置的**值**来作为一级指针\*ptr的指向位置,这等同于将垃圾值赋值给指针,会产生严重的后果 +> 而对二维指针进行解引用,那么,它就会提取出 matrix 指向位置的**值**来作为一级指针\*ptr 的指向位置,这等同于将垃圾值赋值给指针,会产生严重的后果 > [!note] -> C语言对于指针比较"宽容",即使检查到你错误的使用了指针,编译器也只会报一个警告,而不是错误,所以,当出现关于指针的警告是,请将它看作报错,并想办法去解决它 +> C 语言对于指针比较"宽容",即使检查到你错误的使用了指针,编译器也只会报一个警告,而不是错误,所以,当出现关于指针的警告是,请将它看作报错,并想办法去解决它 > -> 或者你也可以在使用gcc进行编译时,加入`-Werror`将警告变为错误处理 +> 或者你也可以在使用 gcc 进行编译时,加入`-Werror`将警告变为错误处理 ### 指针的加减法 - 加、减 - 加、减整数n -> 指向后/前第n个元素 + 加、减整数 n -> 指向后/前第 n 个元素 - ```c - int array[5] = {1,2,3,4,5}; - for(i=0;i<5;i++){ - printf("%d",*(p+i)); - } - ``` + ```c + int array[5] = {1,2,3,4,5}; + for(i=0;i<5;i++){ + printf("%d",*(p+i)); + } + ``` - 指针相减 - 表示指针之间的偏移量 - 仅当原指针和结果指针都指向同一数组中的元素,或该数组的尾后一位置,行为才有定义。 - > [!warning] - > 警惕越界行为!!! + 表示指针之间的偏移量 + 仅当原指针和结果指针都指向同一数组中的元素,或该数组的尾后一位置,行为才有定义。 + > [!warning] + > 警惕越界行为!!! -### void* +### void\* -使用void类型指针的时候无法进行解引用,也无法进行加减运算 +使用 void 类型指针的时候无法进行解引用,也无法进行加减运算 -使用void*类型的指针的时候一定要对其进行强制类型转化 +使用 void\*类型的指针的时候一定要对其进行强制类型转化 ```c int a = 1; @@ -594,7 +594,7 @@ void *p = &a; printf("%d\n",*((int*)p)); ``` -### 警惕UB(未定义行为) +### 警惕 UB(未定义行为) 我们很多时候需要警惕[未定义行为](https://zh.cppreference.com/w/c/language/behavior),就比如说: @@ -621,7 +621,7 @@ int a = f(i++)+f(i++)-f(i++); ## 问题 -经过学习,我相信你也已经掌握了C语言的一些基本技能了,那下面几个问题可以去尝试一下哦 +经过学习,我相信你也已经掌握了 C 语言的一些基本技能了,那下面几个问题可以去尝试一下哦 1. 定义一个常量`const int a=0;`能不能使用一个指针访问它来更改它的值? -2. switch语句中,不使用break会发生什么?为什么有时候我们需要使用switch而不是一直使用if-else语句。 +2. switch 语句中,不使用 break 会发生什么?为什么有时候我们需要使用 switch 而不是一直使用 if-else 语句。 diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/5.\350\256\241\347\256\227\346\234\272\347\232\204\347\241\254\344\273\266\350\247\206\350\247\222.md" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/5.\350\256\241\347\256\227\346\234\272\347\232\204\347\241\254\344\273\266\350\247\206\350\247\222.md" index 25965f8..fb45bb5 100644 --- "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/5.\350\256\241\347\256\227\346\234\272\347\232\204\347\241\254\344\273\266\350\247\206\350\247\222.md" +++ "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/5.\350\256\241\347\256\227\346\234\272\347\232\204\347\241\254\344\273\266\350\247\206\350\247\222.md" @@ -10,9 +10,9 @@ 举一个简单的例子,一条狗,看到人就会叫,叫的时候如果人给它一根香肠,它会吃香肠不再叫了,那么这个狗就是一个简单的状态机: -+ **安静状态** → *看到人* → **吠叫状态** -+ **吠叫状态** → *人给香肠* → **进食状态** -+ **进食状态** → *吃完香肠* → **安静状态** +- **安静状态** → _看到人_ → **吠叫状态** +- **吠叫状态** → _人给香肠_ → **进食状态** +- **进食状态** → _吃完香肠_ → **安静状态** (是的这只狗吃完香肠看到同一个人还是会叫。) @@ -26,13 +26,13 @@ 如果把计算机看成一个状态机, 那么运行在计算机上面的程序又是什么呢? -我们知道程序是由指令构成的,那么我们先看看一条指令在状态机的模型里面是什么。不难理解,计算机正是通过执行指令的方式来改变自身状态的,比如执行一条加法指令,就可以把两个寄存器的值相加,然后把结果更新到第三个寄存器中;如果执行一条跳转指令,就会直接修改PC的值,使得计算机从新PC的位置开始执行新的指令。所以在状态机模型里面,指令可以看成是计算机进行一次状态转移的输入激励。 +我们知道程序是由指令构成的,那么我们先看看一条指令在状态机的模型里面是什么。不难理解,计算机正是通过执行指令的方式来改变自身状态的,比如执行一条加法指令,就可以把两个寄存器的值相加,然后把结果更新到第三个寄存器中;如果执行一条跳转指令,就会直接修改 PC 的值,使得计算机从新 PC 的位置开始执行新的指令。所以在状态机模型里面,指令可以看成是计算机进行一次状态转移的输入激励。 ### 指令集(Instruction set Architecture, ISA) -CPU (Central Processing Unit,中央处理器),是现代计算机的核心部件,它就像计算机的大脑一样,处理输入的各种指令。但是,CPU如何将要做什么事情和输入的指令相对应呢?这就需要指令集,指令集是我们和CPU的一种约定,比如我们说"mv a0, a1",CPU就知道应该把 a1 的值给 a0。 +CPU (Central Processing Unit,中央处理器),是现代计算机的核心部件,它就像计算机的大脑一样,处理输入的各种指令。但是,CPU 如何将要做什么事情和输入的指令相对应呢?这就需要指令集,指令集是我们和 CPU 的一种约定,比如我们说"mv a0, a1",CPU 就知道应该把 a1 的值给 a0。 -指令集有很多,比如我们的Intel和AMD的CPU的笔记本电脑使用指令集x86_64,我们的手机通常使用Arm指令集等等。 +指令集有很多,比如我们的 Intel 和 AMD 的 CPU 的笔记本电脑使用指令集 x86_64,我们的手机通常使用 Arm 指令集等等。 > [!TIP] > ISA 是软件与硬件交互的接口 @@ -41,9 +41,9 @@ CPU (Central Processing Unit,中央处理器),是现代计算机的核心部 ### 汇编语言和机器语言 -我们知道,我们的计算机实际只能阅读二进制的内容,要想让CPU这个仆人做事情,我们只能用二进制的特殊语言使唤他。 +我们知道,我们的计算机实际只能阅读二进制的内容,要想让 CPU 这个仆人做事情,我们只能用二进制的特殊语言使唤他。 -让我们看看第二节课最开始的例子,这是CPU可以读懂的机器语言 +让我们看看第二节课最开始的例子,这是 CPU 可以读懂的机器语言 ```txt 00000040: 4111 06e4 22e0 0008 1705 0000 1305 0500 @@ -51,9 +51,9 @@ CPU (Central Processing Unit,中央处理器),是现代计算机的核心部 00000060: 4101 8280 ``` -全部都是数字,这就是CPU可以读懂的内容,也就是机器语言。但是显然这不是大部分人类可以直接编写的(虽然我们的先驱最开始就是把这些数组打孔在纸袋上面来和计算机交流的),所幸,现在有很多工具,可以帮助我们把我们编写的汇编语言翻译为机器语言。 +全部都是数字,这就是 CPU 可以读懂的内容,也就是机器语言。但是显然这不是大部分人类可以直接编写的(虽然我们的先驱最开始就是把这些数组打孔在纸袋上面来和计算机交流的),所幸,现在有很多工具,可以帮助我们把我们编写的汇编语言翻译为机器语言。 -汇编语言就是一种助记符,我们可以使用**汇编器**将我们编写的汇编语言几乎一对一的转化为机器语言的几个字节,再丢给CPU运行。 +汇编语言就是一种助记符,我们可以使用**汇编器**将我们编写的汇编语言几乎一对一的转化为机器语言的几个字节,再丢给 CPU 运行。 ```asm .LC0: @@ -75,11 +75,11 @@ main: 这就是汇编语言。 -当然,我们现在都编写更加高级的语言,比如C语言,由编译器将它们翻译为机器语言。 +当然,我们现在都编写更加高级的语言,比如 C 语言,由编译器将它们翻译为机器语言。 我们可以来简单地体会这个过程。 -+ 新建一个文件main.c,编写一个最简单的HelloWorld程序。 +- 新建一个文件 main.c,编写一个最简单的 HelloWorld 程序。 ```c #include @@ -90,13 +90,13 @@ int main() { } ``` -+ 使用编译器gcc的`-S`参数告诉gcc,我们需要将它翻译为汇编语言: +- 使用编译器 gcc 的`-S`参数告诉 gcc,我们需要将它翻译为汇编语言: ```shell gcc ./main.c -S ./main.S ``` -+ 接下来打开文件main.S,就可以看到我们编写的c代码的汇编语言。 +- 接下来打开文件 main.S,就可以看到我们编写的 c 代码的汇编语言。 ```shell .file "main.c" @@ -129,7 +129,7 @@ main: .section .note.GNU-stack,"",@progbits ``` -+ 接下来,我们将它编译为机器语言,让它可以直接运行。 +- 接下来,我们将它编译为机器语言,让它可以直接运行。 ```shell gcc ./main.S -o ./main @@ -137,14 +137,13 @@ gcc ./main.S -o ./main 在命令行运行`main`,可以看到输出了`Hello World!`。 -> [!TIP] -> `main`并不只包含了机器语言,还包含了指示系统如何运行这个文件的信息。 +> [!TIP] > `main`并不只包含了机器语言,还包含了指示系统如何运行这个文件的信息。 ### 图灵机 -有了强大的CPU,计算机该如何让他忠实的运转呢? +有了强大的 CPU,计算机该如何让他忠实的运转呢? -答案是图灵机,我们可以用一个很简单的模型让CPU只干它擅长的事情-**计算**。你已经知道汇编语言是什么样子了,为了记录我们的程序跑到哪里了,我们引入一个寄存器 叫做 PC (Program Counter,在x86上,它叫做EIP),他的值就代表当前命令的位置。然后事情就变得简单了。 +答案是图灵机,我们可以用一个很简单的模型让 CPU 只干它擅长的事情-**计算**。你已经知道汇编语言是什么样子了,为了记录我们的程序跑到哪里了,我们引入一个寄存器 叫做 PC (Program Counter,在 x86 上,它叫做 EIP),他的值就代表当前命令的位置。然后事情就变得简单了。 从此以后,计算机只需要做一件事情: @@ -156,79 +155,79 @@ while (1) { } ``` -这就是一个足够简单的计算机模型, 开拓者图灵在1936年就已经提出“类似的核心思想”。 而这个流传至今的核心思想, 就是"存储程序"。为了表达对图灵的敬仰, 我们也把上面这个最简单的计算机称为"图灵机"(Turing Machine, TRM)。 +这就是一个足够简单的计算机模型,  开拓者图灵在 1936 年就已经提出“类似的核心思想”。 而这个流传至今的核心思想, 就是"存储程序"。为了表达对图灵的敬仰, 我们也把上面这个最简单的计算机称为"图灵机"(Turing Machine, TRM)。 一个简单的图灵机: -+ 结构上,有存储器,有PC,有加法器。 -+ 工作方式上, TRM不断地重复以下过程: - + 从PC指示的存储器位置取出指令 - + 执行指令 - + 更新PC。 +- 结构上,有存储器,有 PC,有加法器。 +- 工作方式上, TRM 不断地重复以下过程: + - 从 PC 指示的存储器位置取出指令 + - 执行指令 + - 更新 PC。 ### 冯诺依曼结构 -冯诺依曼体系结构是现代计算机的基本模型,由数学家约翰·冯·诺依曼在20世纪40年代提出。冯诺依曼计算机系统由5个部件组成: +冯诺依曼体系结构是现代计算机的基本模型,由数学家约翰·冯·诺依曼在 20 世纪 40 年代提出。冯诺依曼计算机系统由 5 个部件组成: -+ **运算器** 比如我们前文提到的ALU。 +- **运算器** 比如我们前文提到的 ALU。 -+ **控制器** 比如我们前文提到的译码单元。 +- **控制器** 比如我们前文提到的译码单元。 -+ **存储器** 比如内存、寄存器等等。 +- **存储器** 比如内存、寄存器等等。 -+ **输入设备** 比如我们的键盘。 +- **输入设备** 比如我们的键盘。 -+ **输出设备** 比如我们的显示器。 +- **输出设备** 比如我们的显示器。 -### CPU的组成 +### CPU 的组成 #### 寄存器(Register) -寄存器是CPU内部的存储器,用于CPU快速地存储和访问临时数据。CPU内部的寄存器数量很有限,能够记录的数据也很有限。通常,CPU的计算结果被存放在寄存器中,在通过其他指令将寄存器内的数据写入内存等空间更大的存储设备。在CPU中,往往有一个寄存器堆。 +寄存器是 CPU 内部的存储器,用于 CPU 快速地存储和访问临时数据。CPU 内部的寄存器数量很有限,能够记录的数据也很有限。通常,CPU 的计算结果被存放在寄存器中,在通过其他指令将寄存器内的数据写入内存等空间更大的存储设备。在 CPU 中,往往有一个寄存器堆。 一般寄存器分为以下两种: -+ **通用寄存器(General Purpose Register, GPR)** 用于一般的程序计算、存储。 +- **通用寄存器(General Purpose Register, GPR)** 用于一般的程序计算、存储。 -+ **控制状态寄存器(Control Status Register)** 用于控制CPU的状态。 +- **控制状态寄存器(Control Status Register)** 用于控制 CPU 的状态。 #### 算术逻辑单元(Arithmetic and Logic Unit, ALU) -ALU也是CPU中的重要部件,可以计算两个输入数字作加法、减法、与、或、异或、比较等等,并根据一个选择信号输出一其中的一个结果。 +ALU 也是 CPU 中的重要部件,可以计算两个输入数字作加法、减法、与、或、异或、比较等等,并根据一个选择信号输出一其中的一个结果。 #### 总线(Bus)和缓存(Cache) -CPU和外部的内存、设备等进行交互,需要使用总线。CPU向总线发送例如读取地址、写入地址、写入数据等信息,总线向CPU传输读取内容、写入是否成功等信息。总线与CPU之间有着复杂的传输协议,例如AXI4协议。CPU与外部在物理上是通过引脚相连的。 +CPU 和外部的内存、设备等进行交互,需要使用总线。CPU 向总线发送例如读取地址、写入地址、写入数据等信息,总线向 CPU 传输读取内容、写入是否成功等信息。总线与 CPU 之间有着复杂的传输协议,例如 AXI4 协议。CPU 与外部在物理上是通过引脚相连的。 -实际上,CPU的速度远快于外部的内存等,我们可以将常用的内存中的信息记载在CPU的内部来加快访问,这就是**缓存**。 +实际上,CPU 的速度远快于外部的内存等,我们可以将常用的内存中的信息记载在 CPU 的内部来加快访问,这就是**缓存**。 -#### CPU的运行过程 +#### CPU 的运行过程 -下面我们以RISC-V32中的`addi`指令为例,简单描述CPU的运行流程。 +下面我们以 RISC-V32 中的`addi`指令为例,简单描述 CPU 的运行流程。 `addi x1, x0, 0xf` (`0x00f00093`) -在RISC-V中,`x0`寄存器的值始终为0,这条指令的作用是将寄存器`x1`赋值为`0xf`。RISC-V 中,通常指令的长度是4个字节。 +在 RISC-V 中,`x0`寄存器的值始终为 0,这条指令的作用是将寄存器`x1`赋值为`0xf`。RISC-V 中,通常指令的长度是 4 个字节。 -![CPU运行过程](./static/CPU.svg) +![CPU运行过程](./static/CPU_07fcb7942795da9d38edcfba818301ad.svg) -+ **取指** IFU (Instruction Fetch Unit) 将PC发送给指令缓存,指令缓存将检查是否命中,如果不命中,则向总线仲裁器发送需要读取内存PC位置数据的请求,并等待总线的回复;如果命中,指令缓存向IFU以更快的速度返回数据。经过数个或者数百个乃至数千个时钟周期,IFU完成了取指,取到了4个字节的数据`0x00f00093`,并将它发送给下游的IDU。 +- **取指** IFU (Instruction Fetch Unit) 将 PC 发送给指令缓存,指令缓存将检查是否命中,如果不命中,则向总线仲裁器发送需要读取内存 PC 位置数据的请求,并等待总线的回复;如果命中,指令缓存向 IFU 以更快的速度返回数据。经过数个或者数百个乃至数千个时钟周期,IFU 完成了取指,取到了 4 个字节的数据`0x00f00093`,并将它发送给下游的 IDU。 -+ **译码** IDU (Instruction Decode Unit) 从IFU接受到指令,进行译码工作,解码出如下信息,并将它们继续向下传递。 +- **译码** IDU (Instruction Decode Unit) 从 IFU 接受到指令,进行译码工作,解码出如下信息,并将它们继续向下传递。 - + 这条指令需要ALU做求和运算 + - 这条指令需要 ALU 做求和运算 - + 取得两个操作数:`0`(读取`x0`寄存器得到)和`0xf`(从指令中解码得到)。 + - 取得两个操作数:`0`(读取`x0`寄存器得到)和`0xf`(从指令中解码得到)。 - + 这条指令需要写回寄存器,且需要写回到寄存器`x1`。 + - 这条指令需要写回寄存器,且需要写回到寄存器`x1`。 - + 这条指令不涉及到分支跳转,也不涉及到内存的读写。 + - 这条指令不涉及到分支跳转,也不涉及到内存的读写。 -+ **执行** EXU (Excute Unit) 从IDU获得了操作数和要进行的操作,ALU计算得到了结果`0xf`,并将计算结果和一些有关的译码信息向下传递。 +- **执行** EXU (Excute Unit) 从 IDU 获得了操作数和要进行的操作,ALU 计算得到了结果`0xf`,并将计算结果和一些有关的译码信息向下传递。 -+ **访存** LSU(Load Store Unit)发现这不是一条访存指令,将要写回的数据`0xf`和要写回的寄存器继续向下传递。 +- **访存** LSU(Load Store Unit)发现这不是一条访存指令,将要写回的数据`0xf`和要写回的寄存器继续向下传递。 -+ **写回** 将数据`0xf`写到寄存器`x1`中,这条指令执行完毕。 +- **写回** 将数据`0xf`写到寄存器`x1`中,这条指令执行完毕。 > 本篇参考资料: > @@ -238,10 +237,10 @@ CPU和外部的内存、设备等进行交互,需要使用总线。CPU向总 ### 逻辑电路 -+ 非门:一个输入,一个输出,输入输出相反。 -+ 与门:两个输入,一个输出。两边全是1,则输出为1,否则为0 -+ 或门:两个输入,一个输出。两边有一个是1,则输出为1,否则为0 -+ 异或门:两个输入,一个输出。两边不同,则输出为1,否则为0 +- 非门:一个输入,一个输出,输入输出相反。 +- 与门:两个输入,一个输出。两边全是 1,则输出为 1,否则为 0 +- 或门:两个输入,一个输出。两边有一个是 1,则输出为 1,否则为 0 +- 异或门:两个输入,一个输出。两边不同,则输出为 1,否则为 0 ### 加法逻辑 @@ -249,66 +248,67 @@ CPU和外部的内存、设备等进行交互,需要使用总线。CPU向总 每一位加法需要考虑的有以下几个点: -+ 上一级是否存在进位 -+ 正确完成计算 -+ 计算完成后需不需要进位 +- 上一级是否存在进位 +- 正确完成计算 +- 计算完成后需不需要进位 现在我们使用列表的方法,表示出所有的情况 -|Cin|B|A|S|Cout| -|:-:|:-:|:-:|:-:|:-:| -|0|0|0|0|0| -|0|0|1|1|0| -|0|1|0|1|0| -|1|0|0|1|0| -|1|0|1|0|1| -|1|1|0|0|1| -|1|1|1|1|1| +| Cin | B | A | S | Cout | +| :-: | :-: | :-: | :-: | :--: | +| 0 | 0 | 0 | 0 | 0 | +| 0 | 0 | 1 | 1 | 0 | +| 0 | 1 | 0 | 1 | 0 | +| 1 | 0 | 0 | 1 | 0 | +| 1 | 0 | 1 | 0 | 1 | +| 1 | 1 | 0 | 0 | 1 | +| 1 | 1 | 1 | 1 | 1 | 那么,就可以得到如下规律总结 -A,B,Cin有奇数个1则S输出1,否则为0 -有两个及以上的1,则Cout输出为1,否则为0 +A,B,Cin 有奇数个 1 则 S 输出 1,否则为 0 +有两个及以上的 1,则 Cout 输出为 1,否则为 0 -![Adder](./static/Adder.png) +![Adder](./static/Adder_70f7cad82c0bbb54a635eaaef86fc009.png) ### 硬件抽象 -![FA](./static/FA.png) +![FA](./static/FA_b9e67d989ad7cd1eab56bcc72048a043.png) 将之前的电路转化为一个图标,我们不需要了解里面的具体逻辑 ### 多位加法 -![Arith](./static/Airth-2.png) +![Arith](./static/Airth_d1db931de2b4c9e69272e8b908d74494.png) 将加法器按照这样进行排列,前一位的进位输出,连接到后一位的进位输入,就能计算多位的结果 -> AFN为1则说明是在做减法 -根据公式`-x=~x-1`将第一位的进位设置为AFN,再添加一个异或门就能将B转化为-B参加运算 +> AFN 为 1 则说明是在做减法 +> 根据公式`-x=~x-1`将第一位的进位设置为 AFN,再添加一个异或门就能将 B 转化为-B 参加运算 ### 再次抽象 -A,B各由32根数据线输入到器件中,输出32位结果 -> Z V N是标识位,分别表示输出的值是否为0、是否溢出、是否为负 +A,B 各由 32 根数据线输入到器件中,输出 32 位结果 + +> Z V N 是标识位,分别表示输出的值是否为 0、是否溢出、是否为负 -![ARITH](./static/AIRTH.png) +![ARITH](./static/AIRTH_bf752417360086f63d9ce243d0f3809d.png) ### ALU -按照这个思路就能搭建出整个ALU(算术逻辑单元)完成基本的运算 +按照这个思路就能搭建出整个 ALU(算术逻辑单元)完成基本的运算 -+ SHIFT:实现数据的移位 -+ BOOL:进行布尔运算 -+ AIRTH:进行加法减法运算 -+ CMP:与AIRTH紧密结合,根据其输出判断A,B大小关系 +- SHIFT:实现数据的移位 +- BOOL:进行布尔运算 +- AIRTH:进行加法减法运算 +- CMP:与 AIRTH 紧密结合,根据其输出判断 A,B 大小关系 -![ALU](./static/alu.png) +![ALU](./static/alu_6b9839b486229c071ba2b9a140f06266.png) ### CPU -同样的,ALU也是一层抽象,它可以成为CPU的一个结构 +同样的,ALU 也是一层抽象,它可以成为 CPU 的一个结构 -![CPU](./static/cpu.png) +![CPU](./static/cpu_6ef29d6eb2c91237c1a70fa268fd3e18.png) ## 操作系统 @@ -322,11 +322,11 @@ A,B各由32根数据线输入到器件中,输出32位结果 ### 内存模型和规范 -程序在内存中是如何分布的?程序的代码存放在什么位置?局部变量又存放在什么位置?这也有规范标准,比如Linux遵循System V ABI标准。通常,运行在Linux的程序的内存分布: +程序在内存中是如何分布的?程序的代码存放在什么位置?局部变量又存放在什么位置?这也有规范标准,比如 Linux 遵循 System V ABI 标准。通常,运行在 Linux 的程序的内存分布: -![内存分布](./static/mem.svg) +![内存分布](./static/mem_3a6417033a677b4d5e655a2a5209f8c1.svg) -而在Windows等其他操作系统上,内存分布则不同。 +而在 Windows 等其他操作系统上,内存分布则不同。 内存分布规范由编译器和链接器、操作系统共同遵守,这样,我们编译出来的文件才能被操作系统正确的加载和运行。指令集、编译器、操作系统三者遵循同一规范,互相配合,使得我们编写的代码可以正常运行。 @@ -354,7 +354,6 @@ A,B各由32根数据线输入到器件中,输出32位结果 > stack: 0x7ffd27bb38dc > heap : 0x59e598fe42a0 > ``` -> ### 硬件视角的操作系统 @@ -366,11 +365,11 @@ A,B各由32根数据线输入到器件中,输出32位结果 操作系统主要做三件简单的事情: -+ **虚拟化** 让每个程序都以为自己独享整个内存空间和CPU。 +- **虚拟化** 让每个程序都以为自己独享整个内存空间和 CPU。 -+ **并发** 让一个CPU可以运行多个程序,可以不断切换正在运行的程序。 +- **并发** 让一个 CPU 可以运行多个程序,可以不断切换正在运行的程序。 -+ **持久化** 让信息可以持久存储,比如管理文件。 +- **持久化** 让信息可以持久存储,比如管理文件。 ### 操作系统仿真(拓展) @@ -442,7 +441,7 @@ void run() { 首先,我们定义了一个`Process *current`变量,来表示现在正在运行的进程,接下来我们通过一个循环,只在没有进程的时候退出。在循环内部,我们每次都使用`process_schedule`函数来随机选择一个要运行的进程,并通过`process_step`来实际运行它,并且获取一个进程传出来的系统调用,然后我们在末尾执行这个系统调用。 -我们通过不断切换正在运行的进程,实现了三个进程在一个CPU核心上的并发。 +我们通过不断切换正在运行的进程,实现了三个进程在一个 CPU 核心上的并发。 ```c int main() { @@ -464,19 +463,19 @@ int main() { } ``` -在主函数中,我们生成了3个进程,它们分别会尝试输出5次`A`、5次`B`和5次`C`。多次运行程序,会发现程序的输出是由5个`A`、5个`B`和5个`C`构成的字符串,但是它们的顺序是随机的。 +在主函数中,我们生成了 3 个进程,它们分别会尝试输出 5 次`A`、5 次`B`和 5 次`C`。多次运行程序,会发现程序的输出是由 5 个`A`、5 个`B`和 5 个`C`构成的字符串,但是它们的顺序是随机的。 这只是一个简单的模型,实际上操作系统在进行并发进程的调度的时候,有自己的选择逻辑。 > **对计算机体系结构感兴趣?** > -> 课程Nand2Tetris[[Nand2Tetris](https://www.coursera.org/learn/build-a-computer)] +> 课程 Nand2Tetris[[Nand2Tetris](https://www.coursera.org/learn/build-a-computer)] > > 书籍《深入入理解计算机系统(Computer System: A Programer's Perspective, CSAPP)》 > -> 课程CS61C [[CS61C](https://cs61c.org/)] +> 课程 CS61C [[CS61C](https://cs61c.org/)] > -> 实践项目NJU-ICS-PA[[Introduction · GitBook](https://nju-projectn.github.io/ics-pa-gitbook/ics2024/)] +> 实践项目 NJU-ICS-PA[[Introduction · GitBook](https://nju-projectn.github.io/ics-pa-gitbook/ics2024/)] > > 实践项目一生一芯[[一生一芯 (oscc.cc)](https://ysyx.oscc.cc/)] diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/AIRTH.png" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/AIRTH_bf752417360086f63d9ce243d0f3809d.png" similarity index 100% rename from "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/AIRTH.png" rename to "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/AIRTH_bf752417360086f63d9ce243d0f3809d.png" diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/Adder.png" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/Adder_70f7cad82c0bbb54a635eaaef86fc009.png" similarity index 100% rename from "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/Adder.png" rename to "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/Adder_70f7cad82c0bbb54a635eaaef86fc009.png" diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/Airth_d1db931de2b4c9e69272e8b908d74494.png" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/Airth_d1db931de2b4c9e69272e8b908d74494.png" new file mode 100644 index 0000000..d820092 Binary files /dev/null and "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/Airth_d1db931de2b4c9e69272e8b908d74494.png" differ diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/CPU.svg" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/CPU_07fcb7942795da9d38edcfba818301ad.svg" similarity index 100% rename from "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/CPU.svg" rename to "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/CPU_07fcb7942795da9d38edcfba818301ad.svg" diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/FA.png" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/FA_b9e67d989ad7cd1eab56bcc72048a043.png" similarity index 100% rename from "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/FA.png" rename to "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/FA_b9e67d989ad7cd1eab56bcc72048a043.png" diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/VSCode-config2.png" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/VSCode-config2_63ba376e68622726f39f75efe8a1241e.png" similarity index 100% rename from "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/VSCode-config2.png" rename to "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/VSCode-config2_63ba376e68622726f39f75efe8a1241e.png" diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/VSCode-config3.png" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/VSCode-config3_ee27bb0fbb58095ad1e570acdd5e465c.png" similarity index 100% rename from "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/VSCode-config3.png" rename to "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/VSCode-config3_ee27bb0fbb58095ad1e570acdd5e465c.png" diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/VSCode-config4.png" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/VSCode-config4_fc2901a7721c0bf7605a9a79714c9e52.png" similarity index 100% rename from "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/VSCode-config4.png" rename to "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/VSCode-config4_fc2901a7721c0bf7605a9a79714c9e52.png" diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/VSCode-config.png" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/VSCode-config_2fe41f0fc00ddb1e8ad95a7f9a2dd12d.png" similarity index 100% rename from "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/VSCode-config.png" rename to "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/VSCode-config_2fe41f0fc00ddb1e8ad95a7f9a2dd12d.png" diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/VSCode-download.png" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/VSCode-download_33284ab6a8455df861e61575a1d604c4.png" similarity index 100% rename from "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/VSCode-download.png" rename to "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/VSCode-download_33284ab6a8455df861e61575a1d604c4.png" diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/VSCode-ssh1.png" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/VSCode-ssh1_1a1ace268a0babe6939a13569b3d5e0b.png" similarity index 100% rename from "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/VSCode-ssh1.png" rename to "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/VSCode-ssh1_1a1ace268a0babe6939a13569b3d5e0b.png" diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/VSCode-ssh2.png" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/VSCode-ssh2_5350e25fae007a4268064f4057730366.png" similarity index 100% rename from "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/VSCode-ssh2.png" rename to "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/VSCode-ssh2_5350e25fae007a4268064f4057730366.png" diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/VSCode-ssh3.png" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/VSCode-ssh3_1c4fb05510a01d3ef7cd1dbe6bf5b368.png" similarity index 100% rename from "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/VSCode-ssh3.png" rename to "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/VSCode-ssh3_1c4fb05510a01d3ef7cd1dbe6bf5b368.png" diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/VSCode-ssh4.png" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/VSCode-ssh4_9af9b525fe51caa8ac489f83a408db25.png" similarity index 100% rename from "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/VSCode-ssh4.png" rename to "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/VSCode-ssh4_9af9b525fe51caa8ac489f83a408db25.png" diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/VSCode-ssh5.png" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/VSCode-ssh5_89141859968c95423e4d234f7093a066.png" similarity index 100% rename from "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/VSCode-ssh5.png" rename to "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/VSCode-ssh5_89141859968c95423e4d234f7093a066.png" diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/VSCode-ssh6.png" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/VSCode-ssh6_9bcb2fd944592199068d61dfd11d9814.png" similarity index 100% rename from "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/VSCode-ssh6.png" rename to "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/VSCode-ssh6_9bcb2fd944592199068d61dfd11d9814.png" diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/VSCode-ssh7.png" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/VSCode-ssh7_0e68dee7e8101558ffd17f81a634ddfb.png" similarity index 100% rename from "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/VSCode-ssh7.png" rename to "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/VSCode-ssh7_0e68dee7e8101558ffd17f81a634ddfb.png" diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/alu.png" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/alu_6b9839b486229c071ba2b9a140f06266.png" similarity index 100% rename from "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/alu.png" rename to "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/alu_6b9839b486229c071ba2b9a140f06266.png" diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/cpu.png" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/cpu_6ef29d6eb2c91237c1a70fa268fd3e18.png" similarity index 100% rename from "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/cpu.png" rename to "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/cpu_6ef29d6eb2c91237c1a70fa268fd3e18.png" diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/git copy.png" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/git copy_d28f46654cd788d9c8e29a04bf1bf2f2.png" similarity index 100% rename from "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/git copy.png" rename to "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/git copy_d28f46654cd788d9c8e29a04bf1bf2f2.png" diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/git-clone.png" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/git-clone_9c14c92a094093d6fb47485b24ae9614.png" similarity index 100% rename from "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/git-clone.png" rename to "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/git-clone_9c14c92a094093d6fb47485b24ae9614.png" diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/git.png" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/git_d28f46654cd788d9c8e29a04bf1bf2f2.png" similarity index 100% rename from "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/git.png" rename to "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/git_d28f46654cd788d9c8e29a04bf1bf2f2.png" diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/lunarvim.png" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/lunarvim_5a6cccee159f71a0a1878a655c958bbd.png" similarity index 100% rename from "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/lunarvim.png" rename to "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/lunarvim_5a6cccee159f71a0a1878a655c958bbd.png" diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/mem.svg" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/mem_3a6417033a677b4d5e655a2a5209f8c1.svg" similarity index 100% rename from "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/mem.svg" rename to "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/mem_3a6417033a677b4d5e655a2a5209f8c1.svg" diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/ssh-programming10.png" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/ssh-programming10_bb37a97c2fd704502c27ea6d4979f5bc.png" similarity index 100% rename from "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/ssh-programming10.png" rename to "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/ssh-programming10_bb37a97c2fd704502c27ea6d4979f5bc.png" diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/ssh-programming11.png" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/ssh-programming11_31d0e2a11379f56c22ab9f9c890a2180.png" similarity index 100% rename from "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/ssh-programming11.png" rename to "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/ssh-programming11_31d0e2a11379f56c22ab9f9c890a2180.png" diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/ssh-programming1.png" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/ssh-programming1_b2b9e3f46a4400d31af597ab20c81ec5.png" similarity index 100% rename from "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/ssh-programming1.png" rename to "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/ssh-programming1_b2b9e3f46a4400d31af597ab20c81ec5.png" diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/ssh-programming2.png" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/ssh-programming2_6713eac76fec2111430d05ec4ead930c.png" similarity index 100% rename from "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/ssh-programming2.png" rename to "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/ssh-programming2_6713eac76fec2111430d05ec4ead930c.png" diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/ssh-programming3.png" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/ssh-programming3_25e1fb51aacefaf794da7f58449f61ea.png" similarity index 100% rename from "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/ssh-programming3.png" rename to "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/ssh-programming3_25e1fb51aacefaf794da7f58449f61ea.png" diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/ssh-programming4.png" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/ssh-programming4_33cad073813ab50cb471074900bd841d.png" similarity index 100% rename from "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/ssh-programming4.png" rename to "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/ssh-programming4_33cad073813ab50cb471074900bd841d.png" diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/ssh-programming5.png" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/ssh-programming5_519124f67d35dacc4e2f5fe2aad4c979.png" similarity index 100% rename from "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/ssh-programming5.png" rename to "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/ssh-programming5_519124f67d35dacc4e2f5fe2aad4c979.png" diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/ssh-programming6.png" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/ssh-programming6_c8f3408ac68c4cd1039e5da30163e10a.png" similarity index 100% rename from "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/ssh-programming6.png" rename to "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/ssh-programming6_c8f3408ac68c4cd1039e5da30163e10a.png" diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/ssh-programming7.png" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/ssh-programming7_39259a681793896755e922028b0a4331.png" similarity index 100% rename from "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/ssh-programming7.png" rename to "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/ssh-programming7_39259a681793896755e922028b0a4331.png" diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/ssh-programming8.png" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/ssh-programming8_4d6f00f7ff1034e218471dc17983fb38.png" similarity index 100% rename from "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/ssh-programming8.png" rename to "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/ssh-programming8_4d6f00f7ff1034e218471dc17983fb38.png" diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/ssh-programming9.png" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/ssh-programming9_97519b487c55b2d0db9e97e168f43752.png" similarity index 100% rename from "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/ssh-programming9.png" rename to "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/ssh-programming9_97519b487c55b2d0db9e97e168f43752.png" diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/terminal-ssh.png" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/terminal-ssh_b9ae6e0b4c7713ca6454f682311c7c39.png" similarity index 100% rename from "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/terminal-ssh.png" rename to "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/terminal-ssh_b9ae6e0b4c7713ca6454f682311c7c39.png" diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/ubuntu-iso-download1.png" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/ubuntu-iso-download1_1251e75425cb219cac6b945fefc009a4.png" similarity index 100% rename from "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/ubuntu-iso-download1.png" rename to "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/ubuntu-iso-download1_1251e75425cb219cac6b945fefc009a4.png" diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/ubuntu-iso-download2.png" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/ubuntu-iso-download2_3c4844cd35cece1c4f6cf150f7016703.png" similarity index 100% rename from "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/ubuntu-iso-download2.png" rename to "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/ubuntu-iso-download2_3c4844cd35cece1c4f6cf150f7016703.png" diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-download.png" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-download_c16d6e4edd70423ece76a081fd0abbf0.png" similarity index 100% rename from "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-download.png" rename to "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-download_c16d6e4edd70423ece76a081fd0abbf0.png" diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-install.png" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-install_d4b1f04d1a07d4782d553ed132db554c.png" similarity index 100% rename from "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-install.png" rename to "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-install_d4b1f04d1a07d4782d553ed132db554c.png" diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-ubuntu10.png" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-ubuntu10_8e205129a8a861fe618ffbe672a11a07.png" similarity index 100% rename from "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-ubuntu10.png" rename to "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-ubuntu10_8e205129a8a861fe618ffbe672a11a07.png" diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-ubuntu11.png" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-ubuntu11_ab9937299f497159b0791499a3c51ff1.png" similarity index 100% rename from "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-ubuntu11.png" rename to "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-ubuntu11_ab9937299f497159b0791499a3c51ff1.png" diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-ubuntu12.png" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-ubuntu12_1de8f15739c9dd0c5c39d2987d96afed.png" similarity index 100% rename from "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-ubuntu12.png" rename to "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-ubuntu12_1de8f15739c9dd0c5c39d2987d96afed.png" diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-ubuntu13.png" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-ubuntu13_d711fb0f04fefb1da37bb16eea78802d.png" similarity index 100% rename from "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-ubuntu13.png" rename to "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-ubuntu13_d711fb0f04fefb1da37bb16eea78802d.png" diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-ubuntu14.png" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-ubuntu14_5c0196573ed419e3ffeeead979494362.png" similarity index 100% rename from "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-ubuntu14.png" rename to "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-ubuntu14_5c0196573ed419e3ffeeead979494362.png" diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-ubuntu15.png" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-ubuntu15_ddf844649460e0da0d040bdc7817644c.png" similarity index 100% rename from "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-ubuntu15.png" rename to "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-ubuntu15_ddf844649460e0da0d040bdc7817644c.png" diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-ubuntu16.png" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-ubuntu16_bc5e775ac507c208b1dbc25cd902bf07.png" similarity index 100% rename from "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-ubuntu16.png" rename to "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-ubuntu16_bc5e775ac507c208b1dbc25cd902bf07.png" diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-ubuntu17.png" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-ubuntu17_5eaa953bae7c0fb4224fd5a066655b75.png" similarity index 100% rename from "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-ubuntu17.png" rename to "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-ubuntu17_5eaa953bae7c0fb4224fd5a066655b75.png" diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-ubuntu18.png" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-ubuntu18_16425bcaf1a9824dc684240a7b5d3ece.png" similarity index 100% rename from "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-ubuntu18.png" rename to "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-ubuntu18_16425bcaf1a9824dc684240a7b5d3ece.png" diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-ubuntu19.png" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-ubuntu19_464dcd6c0bb222612b389faf2799e105.png" similarity index 100% rename from "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-ubuntu19.png" rename to "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-ubuntu19_464dcd6c0bb222612b389faf2799e105.png" diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-ubuntu1.png" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-ubuntu1_19e6e119ad454d55cba685115d65b3f2.png" similarity index 100% rename from "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-ubuntu1.png" rename to "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-ubuntu1_19e6e119ad454d55cba685115d65b3f2.png" diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-ubuntu20.png" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-ubuntu20_c66f199049aa6f14b6a7f1d6271fbbbb.png" similarity index 100% rename from "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-ubuntu20.png" rename to "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-ubuntu20_c66f199049aa6f14b6a7f1d6271fbbbb.png" diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-ubuntu21.png" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-ubuntu21_b2d3c1fae894fd6e23adcc8204e54ffb.png" similarity index 100% rename from "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-ubuntu21.png" rename to "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-ubuntu21_b2d3c1fae894fd6e23adcc8204e54ffb.png" diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-ubuntu22.png" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-ubuntu22_c0628032f9c6e16e2b8a50cca9806f4c.png" similarity index 100% rename from "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-ubuntu22.png" rename to "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-ubuntu22_c0628032f9c6e16e2b8a50cca9806f4c.png" diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-ubuntu23.png" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-ubuntu23_b03650eb8d1419e13cd6860bad36af8b.png" similarity index 100% rename from "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-ubuntu23.png" rename to "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-ubuntu23_b03650eb8d1419e13cd6860bad36af8b.png" diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-ubuntu24.png" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-ubuntu24_ad49439e0f3ba804a4702336baed9be0.png" similarity index 100% rename from "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-ubuntu24.png" rename to "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-ubuntu24_ad49439e0f3ba804a4702336baed9be0.png" diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-ubuntu25.png" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-ubuntu25_6fb04f1cd15434aaee98d6383ad44f46.png" similarity index 100% rename from "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-ubuntu25.png" rename to "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-ubuntu25_6fb04f1cd15434aaee98d6383ad44f46.png" diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-ubuntu26.png" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-ubuntu26_12cd6537a72dcdcab3447c6137c65bcf.png" similarity index 100% rename from "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-ubuntu26.png" rename to "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-ubuntu26_12cd6537a72dcdcab3447c6137c65bcf.png" diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-ubuntu27.png" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-ubuntu27_f9ae586b543448d15b4b93c98ea72e61.png" similarity index 100% rename from "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-ubuntu27.png" rename to "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-ubuntu27_f9ae586b543448d15b4b93c98ea72e61.png" diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-ubuntu2.png" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-ubuntu2_3da44c2e5708f973be61d611e4837b80.png" similarity index 100% rename from "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-ubuntu2.png" rename to "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-ubuntu2_3da44c2e5708f973be61d611e4837b80.png" diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-ubuntu3.png" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-ubuntu3_ce2ae70d101950bc6aaf5f72effbbece.png" similarity index 100% rename from "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-ubuntu3.png" rename to "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-ubuntu3_ce2ae70d101950bc6aaf5f72effbbece.png" diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-ubuntu4.png" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-ubuntu4_eb00fcd130dce399d346885b90bf5a87.png" similarity index 100% rename from "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-ubuntu4.png" rename to "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-ubuntu4_eb00fcd130dce399d346885b90bf5a87.png" diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-ubuntu5.png" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-ubuntu5_754146aa4db0d404c7da768baf7e03a3.png" similarity index 100% rename from "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-ubuntu5.png" rename to "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-ubuntu5_754146aa4db0d404c7da768baf7e03a3.png" diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-ubuntu6.png" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-ubuntu6_03fb2914873629ac7995fcfe7bf6dbe7.png" similarity index 100% rename from "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-ubuntu6.png" rename to "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-ubuntu6_03fb2914873629ac7995fcfe7bf6dbe7.png" diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-ubuntu7.png" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-ubuntu7_723496caa0bc0ac97c8263c4eefd68fe.png" similarity index 100% rename from "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-ubuntu7.png" rename to "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-ubuntu7_723496caa0bc0ac97c8263c4eefd68fe.png" diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-ubuntu8.png" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-ubuntu8_aa2c01977014151dfe7fdb456feb7d73.png" similarity index 100% rename from "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-ubuntu8.png" rename to "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-ubuntu8_aa2c01977014151dfe7fdb456feb7d73.png" diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-ubuntu9.png" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-ubuntu9_4bed09c6cfe0d4ab52daf4c84db4ea32.png" similarity index 100% rename from "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-ubuntu9.png" rename to "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/virtualbox-ubuntu9_4bed09c6cfe0d4ab52daf4c84db4ea32.png" diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/vmware-ubuntu10.png" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/vmware-ubuntu10_533008c82508b11568a41fcd25fec38c.png" similarity index 100% rename from "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/vmware-ubuntu10.png" rename to "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/vmware-ubuntu10_533008c82508b11568a41fcd25fec38c.png" diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/vmware-ubuntu11.png" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/vmware-ubuntu11_53d3afc6826908fc96a2c430db7aa686.png" similarity index 100% rename from "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/vmware-ubuntu11.png" rename to "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/vmware-ubuntu11_53d3afc6826908fc96a2c430db7aa686.png" diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/vmware-ubuntu12.png" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/vmware-ubuntu12_cd7feb83f3e149af57127a4759bddba7.png" similarity index 100% rename from "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/vmware-ubuntu12.png" rename to "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/vmware-ubuntu12_cd7feb83f3e149af57127a4759bddba7.png" diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/vmware-ubuntu13.png" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/vmware-ubuntu13_9040e056d5f597c5b61fe2e705ed6406.png" similarity index 100% rename from "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/vmware-ubuntu13.png" rename to "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/vmware-ubuntu13_9040e056d5f597c5b61fe2e705ed6406.png" diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/vmware-ubuntu14.png" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/vmware-ubuntu14_f0b37210f356d4affdb2cdb60cf059db.png" similarity index 100% rename from "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/vmware-ubuntu14.png" rename to "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/vmware-ubuntu14_f0b37210f356d4affdb2cdb60cf059db.png" diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/vmware-ubuntu15.png" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/vmware-ubuntu15_fe7ad4df076d743902ff38e31fe71643.png" similarity index 100% rename from "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/vmware-ubuntu15.png" rename to "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/vmware-ubuntu15_fe7ad4df076d743902ff38e31fe71643.png" diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/vmware-ubuntu16.png" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/vmware-ubuntu16_21828d7ae29edf4237618f03d3622e4e.png" similarity index 100% rename from "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/vmware-ubuntu16.png" rename to "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/vmware-ubuntu16_21828d7ae29edf4237618f03d3622e4e.png" diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/vmware-ubuntu17.png" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/vmware-ubuntu17_67b33c60fba80488cf8c4afb146e5cc3.png" similarity index 100% rename from "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/vmware-ubuntu17.png" rename to "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/vmware-ubuntu17_67b33c60fba80488cf8c4afb146e5cc3.png" diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/vmware-ubuntu18.png" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/vmware-ubuntu18_b0d80995fcc8c8372e7c966f7cab928c.png" similarity index 100% rename from "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/vmware-ubuntu18.png" rename to "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/vmware-ubuntu18_b0d80995fcc8c8372e7c966f7cab928c.png" diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/vmware-ubuntu19.png" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/vmware-ubuntu19_251e60eb8dd332a4dacde3a016f63547.png" similarity index 100% rename from "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/vmware-ubuntu19.png" rename to "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/vmware-ubuntu19_251e60eb8dd332a4dacde3a016f63547.png" diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/vmware-ubuntu1.png" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/vmware-ubuntu1_e94b0fb529ac489f7506a8b35f55733e.png" similarity index 100% rename from "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/vmware-ubuntu1.png" rename to "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/vmware-ubuntu1_e94b0fb529ac489f7506a8b35f55733e.png" diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/vmware-ubuntu20.png" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/vmware-ubuntu20_4eb65def693691979594c7f83a7d9d6a.png" similarity index 100% rename from "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/vmware-ubuntu20.png" rename to "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/vmware-ubuntu20_4eb65def693691979594c7f83a7d9d6a.png" diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/vmware-ubuntu21.png" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/vmware-ubuntu21_15e2a003ae3d5bda07916d109d093f63.png" similarity index 100% rename from "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/vmware-ubuntu21.png" rename to "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/vmware-ubuntu21_15e2a003ae3d5bda07916d109d093f63.png" diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/vmware-ubuntu22.png" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/vmware-ubuntu22_709bda944b779309323d9e92ff521f2f.png" similarity index 100% rename from "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/vmware-ubuntu22.png" rename to "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/vmware-ubuntu22_709bda944b779309323d9e92ff521f2f.png" diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/vmware-ubuntu23.png" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/vmware-ubuntu23_64b448bbf8ba19ce712ee7df67356a0c.png" similarity index 100% rename from "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/vmware-ubuntu23.png" rename to "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/vmware-ubuntu23_64b448bbf8ba19ce712ee7df67356a0c.png" diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/vmware-ubuntu24.png" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/vmware-ubuntu24_6979f8e4acb1d87758d67c579c094e93.png" similarity index 100% rename from "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/vmware-ubuntu24.png" rename to "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/vmware-ubuntu24_6979f8e4acb1d87758d67c579c094e93.png" diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/vmware-ubuntu25.png" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/vmware-ubuntu25_9c2613b68db8b66671bfa2d179d665f6.png" similarity index 100% rename from "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/vmware-ubuntu25.png" rename to "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/vmware-ubuntu25_9c2613b68db8b66671bfa2d179d665f6.png" diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/vmware-ubuntu26.png" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/vmware-ubuntu26_80f1825ae0bbcd32c2fa84e7c65ca663.png" similarity index 100% rename from "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/vmware-ubuntu26.png" rename to "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/vmware-ubuntu26_80f1825ae0bbcd32c2fa84e7c65ca663.png" diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/vmware-ubuntu27.png" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/vmware-ubuntu27_350c98e9e0b413317aaa9aa14ba0509c.png" similarity index 100% rename from "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/vmware-ubuntu27.png" rename to "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/vmware-ubuntu27_350c98e9e0b413317aaa9aa14ba0509c.png" diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/vmware-ubuntu28.png" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/vmware-ubuntu28_5b3c033a7c0f779922ddc908f8bfffb1.png" similarity index 100% rename from "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/vmware-ubuntu28.png" rename to "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/vmware-ubuntu28_5b3c033a7c0f779922ddc908f8bfffb1.png" diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/vmware-ubuntu2.png" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/vmware-ubuntu2_245a0f6979ea1439f343700c4f4e7aea.png" similarity index 100% rename from "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/vmware-ubuntu2.png" rename to "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/vmware-ubuntu2_245a0f6979ea1439f343700c4f4e7aea.png" diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/vmware-ubuntu3.png" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/vmware-ubuntu3_e6a617e0a4a2f47788f22375b722a91f.png" similarity index 100% rename from "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/vmware-ubuntu3.png" rename to "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/vmware-ubuntu3_e6a617e0a4a2f47788f22375b722a91f.png" diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/vmware-ubuntu4.png" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/vmware-ubuntu4_74c9f815f20786f6970c91036e1e345b.png" similarity index 100% rename from "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/vmware-ubuntu4.png" rename to "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/vmware-ubuntu4_74c9f815f20786f6970c91036e1e345b.png" diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/vmware-ubuntu5.png" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/vmware-ubuntu5_79631c11b55ea535d07fab66d77af5ef.png" similarity index 100% rename from "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/vmware-ubuntu5.png" rename to "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/vmware-ubuntu5_79631c11b55ea535d07fab66d77af5ef.png" diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/vmware-ubuntu6.png" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/vmware-ubuntu6_ad422bf0a72efbb3f131cfeebff93095.png" similarity index 100% rename from "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/vmware-ubuntu6.png" rename to "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/vmware-ubuntu6_ad422bf0a72efbb3f131cfeebff93095.png" diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/vmware-ubuntu7.png" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/vmware-ubuntu7_c1d3af83dbf0e16df0831b49b7c84d9b.png" similarity index 100% rename from "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/vmware-ubuntu7.png" rename to "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/vmware-ubuntu7_c1d3af83dbf0e16df0831b49b7c84d9b.png" diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/vmware-ubuntu8.png" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/vmware-ubuntu8_887742fdefc6bf4254dc653985829654.png" similarity index 100% rename from "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/vmware-ubuntu8.png" rename to "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/vmware-ubuntu8_887742fdefc6bf4254dc653985829654.png" diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/vmware-ubuntu9.png" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/vmware-ubuntu9_dac149563b19e42d899703c00f5d806f.png" similarity index 100% rename from "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/vmware-ubuntu9.png" rename to "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/vmware-ubuntu9_dac149563b19e42d899703c00f5d806f.png" diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/wsl-connect.png" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/wsl-connect_2748abcef0180122417ba0e069a3ba07.png" similarity index 100% rename from "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/wsl-connect.png" rename to "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/wsl-connect_2748abcef0180122417ba0e069a3ba07.png" diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/wsl-drag-file.png" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/wsl-drag-file_4072bbbfa8d3b5129a61c48211c7a127.png" similarity index 100% rename from "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/wsl-drag-file.png" rename to "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/wsl-drag-file_4072bbbfa8d3b5129a61c48211c7a127.png" diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/wsl-profile-click.png" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/wsl-profile-click_de87be5588104346b25fcb1281bdf0ae.png" similarity index 100% rename from "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/wsl-profile-click.png" rename to "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/wsl-profile-click_de87be5588104346b25fcb1281bdf0ae.png" diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/wsl-profile-import.png" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/wsl-profile-import_bbdd26f2c25f3bfab646afefc1f5d405.png" similarity index 100% rename from "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/wsl-profile-import.png" rename to "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/wsl-profile-import_bbdd26f2c25f3bfab646afefc1f5d405.png" diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/wsl-vscode.png" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/wsl-vscode_ea4a811417aaee6f471d270fb4083cee.png" similarity index 100% rename from "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/wsl-vscode.png" rename to "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.1 Book/static/wsl-vscode_ea4a811417aaee6f471d270fb4083cee.png" diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.2 Lab/1.Lab1.md" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.2 Lab/1.Lab1.md" index 459691f..c37cad9 100644 --- "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.2 Lab/1.Lab1.md" +++ "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.2 Lab/1.Lab1.md" @@ -56,7 +56,7 @@ git log 如果你有需求要把仓库放在 GitHub 上(比如你有多个电脑等等),你需要自己添加一个远程仓库,并使用 `git remote add` 来添加远程仓库,具体使用可以 STFW 。 -这样,你就有2个远程仓库了,一个是我们的发布页你可以用来 pull 我们更新的代码,一个是你自己的远程仓库。 +这样,你就有 2 个远程仓库了,一个是我们的发布页你可以用来 pull 我们更新的代码,一个是你自己的远程仓库。 > [!TIP] > @@ -79,7 +79,7 @@ git log man tar ``` -阅读并且试图学会如何使用tar(马上就会用到了) +阅读并且试图学会如何使用 tar(马上就会用到了) 当然,你可能会觉得 man 是在太繁琐了(你当然不是一个人),那么试试 tldr 吧 @@ -130,7 +130,7 @@ tldr (Too Long; Didn't read) 是一个比 man 更加简明的文档工具,可 > > 我们不反对使用 gpt 等大模型,但要求你在明白是代码在干什么以后再使用! > -> 不然很容易出现删库之类的笑话😊 +> 不然很容易出现删库之类的笑话 😊 ## 3. C 语言练习 @@ -150,7 +150,7 @@ tldr (Too Long; Didn't read) 是一个比 man 更加简明的文档工具,可 > > 这个代码在干什么?查阅 Linux 下 echo 的资料,这是一个简易实现的 echo > -> main 函数还能带参数的?是的,这是与命令行交互的很重要的一环,argc 代表参数数量(包括程序自己在内), argv就是参数本身了。 +> main 函数还能带参数的?是的,这是与命令行交互的很重要的一环,argc 代表参数数量(包括程序自己在内), argv 就是参数本身了。 > > 知道了这个,你应该可以轻松理解代码在干什么。 diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.2 Lab/2.Lab2.md" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.2 Lab/2.Lab2.md" index 5173ee4..5bdc9b5 100644 --- "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.2 Lab/2.Lab2.md" +++ "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.2 Lab/2.Lab2.md" @@ -9,8 +9,9 @@ ## Lab2_1 C 语言基本语法 -- 完成lab2_1中的四个.c文件 - - 请根据每个ex_中的TODO完成内容。 +- 完成 lab2_1 中的四个.c 文件 + + - 请根据每个 ex\_中的 TODO 完成内容。 - 你可以使用 make 自动编译可执行文件 ```bash @@ -22,7 +23,7 @@ ## Lab2_2 字符串和循环 -- 本实验使用了参数char *argv[],请在编译后尝试向程序输入命令行参数,如: +- 本实验使用了参数 char \*argv[],请在编译后尝试向程序输入命令行参数,如: ```bash make @@ -56,15 +57,15 @@ state 3: Texas ``` -- 请对srt_and_cyc.c文件中的for和while循环尝试以下操作并查看结果。 -- for循环 - - 将i初始化为0看看会发生什么。是否也需要改动argc,不改动的话它能正常工作吗?为什么下标从0开始可以正常工作? - - 将num_states改为错误的值(使它变大),来看看会发生什么。 - - RTFM: NULL是什么东西,尝试将它用做states的一个元素,看看它会打印出什么。 - - 看看你是否能在打印之前将states的一个元素赋值给argv中的元素,再试试相反的操作。 -- while循环 - - 使用while循环将argv中的值复制到states。 - - 让这个复制循环不会执行失败,即使argv之中有很多元素也不会全部放进states。 +- 请对 srt_and_cyc.c 文件中的 for 和 while 循环尝试以下操作并查看结果。 +- for 循环 + - 将 i 初始化为 0 看看会发生什么。是否也需要改动 argc,不改动的话它能正常工作吗?为什么下标从 0 开始可以正常工作? + - 将 num_states 改为错误的值(使它变大),来看看会发生什么。 + - RTFM: NULL 是什么东西,尝试将它用做 states 的一个元素,看看它会打印出什么。 + - 看看你是否能在打印之前将 states 的一个元素赋值给 argv 中的元素,再试试相反的操作。 +- while 循环 + - 使用 while 循环将 argv 中的值复制到 states。 + - 让这个复制循环不会执行失败,即使 argv 之中有很多元素也不会全部放进 states。 - 研究你是否真正复制了这些字符串。答案可能会让你感到意外和困惑。 ## 递归(可选,难度较大) @@ -96,20 +97,21 @@ ``` - 理解递归的重要方式 + - Base Case:递归主体以一个基本情况开始,通常它是这个条件语句,定义了函数对最简单的输入的行为,并通常被用作递归结束的出口。 - - Recursive Calls:在Base Case之后,是一个或多个递归调用。递归调用总是有一个特点:它们简化了原来的问题。 + - Recursive Calls:在 Base Case 之后,是一个或多个递归调用。递归调用总是有一个特点:它们简化了原来的问题。 - 数学归纳法理解: - 1. 验证递归函数`F(X)`取Base Case时成立. - 2. 假设X = n时成立,那么可以推导出在X = n+1时递归函数`F(X)`做出正确的行为。 + 1. 验证递归函数`F(X)`取 Base Case 时成立. + 2. 假设 X = n 时成立,那么可以推导出在 X = n+1 时递归函数`F(X)`做出正确的行为。 3. 最后一步总结表述。 - 数独 - - 数独(Sudoku)是一种经典的逻辑数字游戏,通常由一个9x9的网格组成,这个网格被进一步划分为9个3x3的小方块。游戏的目标是通过填充数字1到9,使得每一行、每一列和每一个3x3的小方块都包含数字1到9,且数字不能重复。 + - 数独(Sudoku)是一种经典的逻辑数字游戏,通常由一个 9x9 的网格组成,这个网格被进一步划分为 9 个 3x3 的小方块。游戏的目标是通过填充数字 1 到 9,使得每一行、每一列和每一个 3x3 的小方块都包含数字 1 到 9,且数字不能重复。 - 实现一个递归函数`bool solveSudoku(int board[N][N], int row, int col)`判断数独是否可解,有解则填充正确答案。 - - 题中数独采用二维数组,需解答填充的数字用0代替如: + - 题中数独采用二维数组,需解答填充的数字用 0 代替如: ```txt 0 6 0 0 0 0 0 7 1 @@ -124,6 +126,7 @@ ``` - 使用`printBoard(int board[N][N])`函数打印数独 - - 使用`isSafe(int board[N][N], int row, int col, int num)`函数检查数字是否可以放在board[row][col]位置。 - - 运行judge.sh检测程序正确性。 + - 使用`isSafe(int board[N][N], int row, int col, int num)`函数检查数字是否可以放在 board[row][col]位置。 + - 运行 judge.sh 检测程序正确性。 + - 完成文件`sudoku.c`中的`solveSudoku`函数编写。 diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.2 Lab/3.Lab3.md" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.2 Lab/3.Lab3.md" index b618307..43851a4 100644 --- "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.2 Lab/3.Lab3.md" +++ "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.2 Lab/3.Lab3.md" @@ -9,9 +9,9 @@ ## 快速安装 -part1基础配置的相关配置我已经写好了插件,不过还是建议一步一步配置下去,这样才能快速了解环境,下次换台电脑也能很快的配置好环境 +part1 基础配置的相关配置我已经写好了插件,不过还是建议一步一步配置下去,这样才能快速了解环境,下次换台电脑也能很快的配置好环境 -> 安装文件放在./install文件夹中 +> 安装文件放在./install 文件夹中 ```bash ./install/install.sh @@ -42,54 +42,56 @@ $ls /dev/ttyUSB* 干的漂亮,没出现报错的话就能跳过基础配置,直接开始任务吧 -## 虚拟51单片机工具安装 +## 虚拟 51 单片机工具安装 很遗憾,我们没有那么多资源购置人手一块的芯片,大家也暂时不会深入研究硬件相关的内容 -假如大家不想要购置实体的板材的话,这里还有一款工具用来虚拟51单片机 -具体的程序以及安装说明放在了./emu目录下 +假如大家不想要购置实体的板材的话,这里还有一款工具用来虚拟 51 单片机 +具体的程序以及安装说明放在了./emu 目录下 请阅读`./emu8051/README.md`并完成编译 -之后的task需要使用这个虚拟工具 +之后的 task 需要使用这个虚拟工具 ## 任务 -### 任务1 +### 任务 1 请移步到`./tasks`文件夹 -将三个.ihx文件放置到emu8051文件夹中 -即可执行文件emu的同目录下 +将三个.ihx 文件放置到 emu8051 文件夹中 +即可执行文件 emu 的同目录下 这里会有三份程序源码以及三个十六进制文件,你需要做的就是通过烧录之后的现象,给他们进行配对. 请将答案填写到`./AnswerSheet.md`中 -### 任务2 +### 任务 2 -看出来了吧,task1.c是一段呼吸灯的代码.不过他并不完善,他只能呼气不能吸气 -请在终端中使用指令copy一份`task1.c`,将其命名为`task3.c`,完善呼吸灯之后对其进行编译,烧录到单片机中 +看出来了吧,task1.c 是一段呼吸灯的代码.不过他并不完善,他只能呼气不能吸气 +请在终端中使用指令 copy 一份`task1.c`,将其命名为`task3.c`,完善呼吸灯之后对其进行编译,烧录到单片机中 -tips: +> [!TIP] > 编译代码 sdcc -mmcs51 taskx.c +> > 烧录代码 stcgal -p /dev/ttyUSB0 -b 115200 taskx.ihx - -> 任务文件放在./task文件夹中 +> +> 任务文件放在./task 文件夹中 +> > 答题卡是./AnswerSheet.md ## 附加部分 基础配置 -**实体器件所需材料**:一块stc89c52rc芯片,一个USB-TO-TTL(CH340),4根公对母杜邦线,2根跳线,2个10uF的电容,2个33pF的电容,1个10kΩ的电阻,1个4.7kΩ的电阻,以及一个1kΩ的电阻,最后再来一个发光二极管. +**实体器件所需材料**:一块 stc89c52rc 芯片,一个 USB-TO-TTL(CH340),4 根公对母杜邦线,2 根跳线,2 个 10uF 的电容,2 个 33pF 的电容,1 个 10kΩ 的电阻,1 个 4.7kΩ 的电阻,以及一个 1kΩ 的电阻,最后再来一个发光二极管. -> 使用51仿真器无需准备材料 +> 使用 51 仿真器无需准备材料 -![Core](./static/Core.png) -![Bread](./static/Bread.jpg) +![Core](./static/Core_6974bc68a3d2dd599755f7cf50b5cfbb.png) +![Bread](./static/Bread_416c1465a36971f24319fedc9d15b0ba.jpg) -试试看按照电路图进行连线吧,LED正极接在VCC,负极接在P2_0,别忘了串联上电阻哦(这里两个电阻并联意思是100Ω和1kΩ都可以) +试试看按照电路图进行连线吧,LED 正极接在 VCC,负极接在 P2_0,别忘了串联上电阻哦(这里两个电阻并联意思是 100Ω 和 1kΩ 都可以) -### 配置sdcc +### 配置 sdcc -在ubuntu上搭建51单片机的开发环境,会被windows稍微麻烦一些,但是只要坚持下去,把环境配好,你在linux能学到一些不一样的知识. +在 ubuntu 上搭建 51 单片机的开发环境,会被 windows 稍微麻烦一些,但是只要坚持下去,把环境配好,你在 linux 能学到一些不一样的知识. -配置sdcc会遇到很多小小的问题,让我们来一一解决 +配置 sdcc 会遇到很多小小的问题,让我们来一一解决 -1. 进行解压 +1. 进行解压 ```bash mkdir ~/tmp @@ -97,13 +99,13 @@ tips: cd ~/tmp/sdcc-4.4.0 ``` -2. 运行./configure +2. 运行./configure ```bash ./configure ``` - 期间也许你会遇到各种各样的问题,不过没关系,借助强大的搜索软件和gpt,聪明的你一定会想出合理的解决方法,配置环境本身也是锻炼自身能力的一部分. + 期间也许你会遇到各种各样的问题,不过没关系,借助强大的搜索软件和 gpt,聪明的你一定会想出合理的解决方法,配置环境本身也是锻炼自身能力的一部分. 这里就简单列出一些常见问题吧,有问题可以谷歌,实在不行还可以带上你的日志,问一下你的牛马学长哦. @@ -134,13 +136,13 @@ tips: #反正只要报错,问gpt,问google都没问题 ``` -3. 当处理完configure的报错之后,就可以进行下一步的操作了 +3. 当处理完 configure 的报错之后,就可以进行下一步的操作了 ```bash sudo make install ``` -4. 最后,在验证一下安装是否成功 +4. 最后,在验证一下安装是否成功 ```bash sdcc --version @@ -156,159 +158,159 @@ tips: 那进行下一步吧 -5. 尝试编译 -先尝试随便建一个工程,就比如说main.c - - ```c - #include <8052.h> +5. 尝试编译 + 先尝试随便建一个工程,就比如说 main.c - void delay100ms() //@11.0592MHz - { - unsigned char i, j; + ```c + #include <8052.h> - i = 180; - j = 73; - do + void delay100ms() //@11.0592MHz { - while (--j); - } while (--i); - } + unsigned char i, j; + + i = 180; + j = 73; + do + { + while (--j); + } while (--i); + } - void main() - { - while(1) + void main() { - P2_0 = !P2_0; - delay100ms(); + while(1) + { + P2_0 = !P2_0; + delay100ms(); + } } - } - ``` + ``` - 编写完成后,`Ctrl+Alt+T`打开控制台,再cd到main.c的目录,输入 + 编写完成后,`Ctrl+Alt+T`打开控制台,再cd到main.c的目录,输入 - ```bash - sdcc -mmcs51 main.c - ``` + ```bash + sdcc -mmcs51 main.c + ``` - 这个时候跳出了一大堆文件 + 这个时候跳出了一大堆文件 - ```bash - mayge@mayge:~/Desktop/tmp $ls - main.asm main.ihx main.lst main.mem main.rst - main.c main.lk main.map main.rel main.sym - ``` + ```bash + mayge@mayge:~/Desktop/tmp $ls + main.asm main.ihx main.lst main.mem main.rst + main.c main.lk main.map main.rel main.sym + ``` - 接下了,我们需要使用的就是main.ihx文件 + 接下了,我们需要使用的就是main.ihx文件 -### 配置stcgal(使用51仿真的话请跳过) +### 配置 stcgal(使用 51 仿真的话请跳过) -在上一节,我们获得了需要烧录的文件`main.ihx`,那我们怎么将其转移到我们的单片机中呢,我们就需要配置烧录工具,最简单的就是stcgal,不过它只能烧录stc系列的一些单片机,对于stm32这类单片机,就需要另外的解决方法了. +在上一节,我们获得了需要烧录的文件`main.ihx`,那我们怎么将其转移到我们的单片机中呢,我们就需要配置烧录工具,最简单的就是 stcgal,不过它只能烧录 stc 系列的一些单片机,对于 stm32 这类单片机,就需要另外的解决方法了. 1. 打开终端输入 - ```bash - pip3 install stcgal - ``` + ```bash + pip3 install stcgal + ``` 2. 验证安装 - ```bash - stcgal -h - ``` + ```bash + stcgal -h + ``` 3. 然而在我们检查串口设备的时候,却出现了一些意外 - ```bash - mayge@mayge:~/Desktop ls /dev/ttyUSB* + ```bash + mayge@mayge:~/Desktop ls /dev/ttyUSB* - ls: 无法访问 '/dev/ttyUSB*': 没有那个文件或目录 - ``` + ls: 无法访问 '/dev/ttyUSB*': 没有那个文件或目录 + ``` - 这就奇怪了,明明我们已经接上了我们的串口驱动程序,可是为什么仍然检测不到呢? + 这就奇怪了,明明我们已经接上了我们的串口驱动程序,可是为什么仍然检测不到呢? - ```bash - mayge@mayge:~/Desktop/tmp $sudo dmesg | grep -i ch34 - - [ 3109.998639] usbcore: registered new interface driver ch341 - [ 3109.998653] usbserial: USB Serial support registered for ch341-uart - [ 3109.998663] ch341 1-2.1:1.0: ch341-uart converter detected - [ 3110.010320] usb 1-2.1: ch341-uart converter now attached to ttyUSB0 - [ 3110.591802] usb 1-2.1: usbfs: interface 0 claimed by ch341 while 'brltty' sets config #1 - [ 3110.595796] ch341-uart ttyUSB0: ch341-uart converter now disconnected from ttyUSB0 - [ 3110.595811] ch341 1-2.1:1.0: device disconnected - [ 3658.565668] ch341 1-2.1:1.0: ch341-uart converter detected - [ 3658.575821] usb 1-2.1: ch341-uart converter now attached to ttyUSB0 - [ 3659.520808] usb 1-2.1: usbfs: interface 0 claimed by ch341 while 'brltty' sets config #1 - [ 3659.523783] ch341-uart ttyUSB0: ch341-uart converter now disconnected from ttyUSB0 - [ 3659.523826] ch341 1-2.1:1.0: device disconnected - ``` + ```bash + mayge@mayge:~/Desktop/tmp $sudo dmesg | grep -i ch34 - 重新连接并查询ttyUSB0的历史连接状态,我们发现在接入的一瞬间USB0设备是成功连接上的,只是后来`brltty`这个服务打断了我们的连接. + [ 3109.998639] usbcore: registered new interface driver ch341 + [ 3109.998653] usbserial: USB Serial support registered for ch341-uart + [ 3109.998663] ch341 1-2.1:1.0: ch341-uart converter detected + [ 3110.010320] usb 1-2.1: ch341-uart converter now attached to ttyUSB0 + [ 3110.591802] usb 1-2.1: usbfs: interface 0 claimed by ch341 while 'brltty' sets config #1 + [ 3110.595796] ch341-uart ttyUSB0: ch341-uart converter now disconnected from ttyUSB0 + [ 3110.595811] ch341 1-2.1:1.0: device disconnected + [ 3658.565668] ch341 1-2.1:1.0: ch341-uart converter detected + [ 3658.575821] usb 1-2.1: ch341-uart converter now attached to ttyUSB0 + [ 3659.520808] usb 1-2.1: usbfs: interface 0 claimed by ch341 while 'brltty' sets config #1 + [ 3659.523783] ch341-uart ttyUSB0: ch341-uart converter now disconnected from ttyUSB0 + [ 3659.523826] ch341 1-2.1:1.0: device disconnected + ``` - 查询到`brltty`这个服务是用来控制**盲文显示器**的,我又不瞎,直接送它进小黑屋 + 重新连接并查询 ttyUSB0 的历史连接状态,我们发现在接入的一瞬间 USB0 设备是成功连接上的,只是后来`brltty`这个服务打断了我们的连接. - ```bash - #停止 brltty 服务 - sudo systemctl stop brltty - #禁用 brltty 服务 - sudo systemctl disable brltty - #这里重新插入CH340设备 - sudo dmesg | grep -i ch34 - ``` - - ```bash - mayge@mayge:~/Desktop/tmp $ls /dev/ttyUSB* - /dev/ttyUSB0 - ``` - - 这就非常成功了 + 查询到`brltty`这个服务是用来控制**盲文显示器**的,我又不瞎,直接送它进小黑屋 -4. 接下来我们进行烧写 + ```bash + #停止 brltty 服务 + sudo systemctl stop brltty + #禁用 brltty 服务 + sudo systemctl disable brltty + #这里重新插入CH340设备 + sudo dmesg | grep -i ch34 + ``` - ```bash - mayge@mayge:~/Desktop/tmp $stcgal -p /dev/ttyUSB0 -b 115200 main.ihx - ``` + ```bash + mayge@mayge:~/Desktop/tmp $ls /dev/ttyUSB* + /dev/ttyUSB0 + ``` - 不过很遗憾,又报错了 + 这就非常成功了 - ```bash - Serial port error: [Errno 13] could not open port /dev/ttyUSB0: [Errno 13] Permission denied: '/dev/ttyUSB0' - ``` - - 但这次的报错处理起来还是很简单的,只需要给ttyUSB0赋一个较低的权限,我们的串口程序就能对其进行访问了 - - ```bash - sudo chmod 666 /dev/ttyUSB0 - ``` - - 再次输入烧写指令,插拔Vcc引脚,就能开始烧录了 - - ```bash - mayge@mayge:~/Desktop/tmp $stcgal -p /dev/ttyUSB0 -b 115200 main.ihx - - Waiting for MCU, please cycle power: done - Protocol detected: stc89 - Target model: - Name: STC89C52RC/LE52RC - Magic: F002 - Code flash: 8.0 KB - EEPROM flash: 6.0 KB - Target frequency: 11.030 MHz - Target BSL version: 6.6C - Target options: - cpu_6t_enabled=False - bsl_pindetect_enabled=False - eeprom_erase_enabled=False - clock_gain=high - ale_enabled=True - xram_enabled=True - watchdog_por_enabled=False - Loading flash: 118 bytes (Intel HEX) - Switching to 115200 baud: checking setting testing done - Erasing 2 blocks: done - Writing flash: 640 Bytes [00:00, 7497.76 Bytes/s] - Setting options: done - Disconnected! - ``` +4. 接下来我们进行烧写 - 这样我们就能看到单片机的现象啦 + ```bash + mayge@mayge:~/Desktop/tmp $stcgal -p /dev/ttyUSB0 -b 115200 main.ihx + ``` + + 不过很遗憾,又报错了 + + ```bash + Serial port error: [Errno 13] could not open port /dev/ttyUSB0: [Errno 13] Permission denied: '/dev/ttyUSB0' + ``` + + 但这次的报错处理起来还是很简单的,只需要给 ttyUSB0 赋一个较低的权限,我们的串口程序就能对其进行访问了 + + ```bash + sudo chmod 666 /dev/ttyUSB0 + ``` + + 再次输入烧写指令,插拔 Vcc 引脚,就能开始烧录了 + + ```bash + mayge@mayge:~/Desktop/tmp $stcgal -p /dev/ttyUSB0 -b 115200 main.ihx + + Waiting for MCU, please cycle power: done + Protocol detected: stc89 + Target model: + Name: STC89C52RC/LE52RC + Magic: F002 + Code flash: 8.0 KB + EEPROM flash: 6.0 KB + Target frequency: 11.030 MHz + Target BSL version: 6.6C + Target options: + cpu_6t_enabled=False + bsl_pindetect_enabled=False + eeprom_erase_enabled=False + clock_gain=high + ale_enabled=True + xram_enabled=True + watchdog_por_enabled=False + Loading flash: 118 bytes (Intel HEX) + Switching to 115200 baud: checking setting testing done + Erasing 2 blocks: done + Writing flash: 640 Bytes [00:00, 7497.76 Bytes/s] + Setting options: done + Disconnected! + ``` + + 这样我们就能看到单片机的现象啦 diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.2 Lab/static/Bread.jpg" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.2 Lab/static/Bread_416c1465a36971f24319fedc9d15b0ba.jpg" similarity index 100% rename from "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.2 Lab/static/Bread.jpg" rename to "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.2 Lab/static/Bread_416c1465a36971f24319fedc9d15b0ba.jpg" diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.2 Lab/static/Core.png" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.2 Lab/static/Core_6974bc68a3d2dd599755f7cf50b5cfbb.png" similarity index 100% rename from "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.2 Lab/static/Core.png" rename to "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.2 Lab/static/Core_6974bc68a3d2dd599755f7cf50b5cfbb.png" diff --git "a/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.2 Lab/static/NET6.png" "b/2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.2 Lab/static/NET6_f98832413d99ad72f9102f5cb663db14.png" similarity index 100% rename from "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.2 Lab/static/NET6.png" rename to "2.\347\274\226\347\250\213\346\250\241\345\235\227/2.1 NekoBytes-TheMissing/2.1.2 Lab/static/NET6_f98832413d99ad72f9102f5cb663db14.png" diff --git a/components/CourseTable.vue b/components/CourseTable.vue index b9c1c12..34b40ff 100644 --- a/components/CourseTable.vue +++ b/components/CourseTable.vue @@ -59,7 +59,7 @@ const courses = [ title: "0. 编程环境搭建", links: { slide: "https://e1psycongroo.github.io/NekoBytes-TheMissing/Lectures/Lecture0/Lecture0/index.html", - recording: "https://www.bilibili.com/video/BV1rgxae2Eio/", + recording: "https://www.bilibili.com/video/BV1rgxae2Eio", note: "/2.编程模块/2.1 NekoBytes-TheMissing/2.1.1 Book/2.开发环境配置", code: "", }, @@ -84,9 +84,9 @@ const courses = [ title: "1. Unix 与 C", links: { slide: "https://e1psycongroo.github.io/NekoBytes-TheMissing/Lectures/Lecture1/Lecture1/index.html", - recording: "https://www.bilibili.com/video/BV1rgxae2Eio/", + recording: "https://www.bilibili.com/video/BV1rgxae2Eio", note: "/2.编程模块/2.1 NekoBytes-TheMissing/2.1.1 Book/3.Unix与C", - code: "https://e1psycongroo.github.io/NekoBytes-TheMissing/_site/resources/Lecture1/Codes/" + code: "https://e1psycongroo.github.io/NekoBytes-TheMissing/_site/resources/Lecture1/Codes" }, }, lab: { @@ -134,9 +134,9 @@ const courses = [ title: "2. C 语言基础语法", links: { slide: "https://e1psycongroo.github.io/NekoBytes-TheMissing/Lectures/Lecture2/Lecture2/index.html", - recording: "https://www.bilibili.com/video/BV1ri2dYUEG8/", + recording: "https://www.bilibili.com/video/BV1ri2dYUEG8", note: "/2.编程模块/2.1 NekoBytes-TheMissing/2.1.1 Book/4.C语言基础语法", - code: "https://e1psycongroo.github.io/NekoBytes-TheMissing/_site/resources/Lecture2/Codes/" + code: "https://e1psycongroo.github.io/NekoBytes-TheMissing/_site/resources/Lecture2/Codes" }, }, lab: { @@ -159,9 +159,9 @@ const courses = [ title: "3. 计算机的硬件视角", links: { slide: "https://e1psycongroo.github.io/NekoBytes-TheMissing/Lectures/Lecture3/Lecture3/index.html", - recording: "", + recording: "https://www.bilibili.com/video/BV1DJypYeEfN", note: "/2.编程模块/2.1 NekoBytes-TheMissing/2.1.1 Book/5.计算机的硬件视角", - code: "https://e1psycongroo.github.io/NekoBytes-TheMissing/_site/resources/Lecture3/Codes/" + code: "https://e1psycongroo.github.io/NekoBytes-TheMissing/_site/resources/Lecture3/Codes" }, }, lab: { diff --git a/renamebychecksum.sh b/renamebychecksum.sh new file mode 100644 index 0000000..0198ca2 --- /dev/null +++ b/renamebychecksum.sh @@ -0,0 +1,26 @@ +#!/usr/bin/env bash + +# 要处理的文件夹路径 +folder_path=$1 + +# 遍历文件夹中的所有文件 +for file in "$folder_path"/*; do + # 跳过非文件的条目 + if [[ ! -f "$file" ]]; then + continue + fi + + # 获取文件名和文件扩展名 + filename=$(basename "$file") + extension="${filename##*.}" + name="${filename%.*}" + + # 计算文件的 MD5 校验和 + checksum=$(md5sum "$file" | awk '{print $1}') + + # 构造新的文件名 + new_filename="${name}_${checksum}.${extension}" + + # 重命名文件 + mv "$file" "$folder_path/$new_filename" +done