the Missing Semester of your CS education
The Missing Semester of your CS education,共11
节课,每节课约1h。
确实不错,手敲命令+讲解。多使用Linux
学校应该在大一教这个,而不是TM的大学物理
课程网站
1 | https://missing.csail.mit.edu/ |
lectrue1: overview & shell
主要是 Linux 基本命令
overview
- 如何利用存在的工具使我们开发更加高效,以及如何更好的利用我们的计算机,这是这门课主要解决的问题。
shell
讲述了Linux Shell.主要是bash
1 | shell是运行在终端中的文本互动程序,bash(GNU Bourne-Again Shell)是最常用的一种shell。是当前大多数Linux发行版的默认Shell。 |
日期
1 | $ date |
打印
1 | $ echo "hello world" |
路径列表
1 | # 当我们执行一些命令时,会遍历PATH寻找;比如说使用 /bin/echo 时只需在终端输入 echo 就行 |
寻找命令的路径
1 | $ which echo |
目录
1 | # change dir |
文件操作
1 | # list: 列出指定目录下所有的文件,默认当前目录 |
命令参数和帮助文档
1 | # 一般命令也存在参数,一般为 -? |
管道:左侧的输出作为右侧的输入
1 | $ ls / | tail -n 1 # -n 1 最后一行 |
root user: 超级管理员。尽量少用,在运行错误的程序时会破坏计算机。
1 | # 用户使用root权限 |
/sys
文件夹:各种内核参数,显示设备的状态。linux系统将其视为文件暴漏给用户,意味着我们可以操作从而控制某些设备
有趣的命令
1 | # 删库跑路,无需确认强制删除所有的文件 |
现代化的命令:开发者使用rust写了很多更加现代的命令,可以替代一些老命令
1 | exa => ls |
Q&A
shell, console, terminal?
1 | xxx |
lectrue2: shell script
Linux 脚本的使用
语法
1 | $0 运行文件名 |
循环
1 | for xxx; do... done |
条件
1 | if xxx; then...fi |
编程脚本
1 | # 加入magic line 指定解析器 |
man
命令的其余选择 tldr
,更加简洁(too long; don’t read)
1 | tldr tar |
递归查询
1 | find . # . 代表当前路径,我们可以指定比如 `/` |
查找使用过的命令
1 | 方向键的上 |
更清晰的目录结构
1 | tree |
lecture3: editor VIM
vim
- normal mode: 可以控制光标,执行命令…
- insert mode: 就是文本编辑器。
- command mode: 在insert mode 输入
:
在输入命令 - visual mode: 有点像使用鼠标选中一块连续区域
- replace mode
进入 insert mode
1 | i insert, 在光标前插入 |
normal mode
1 | esc 也可以自行配置 |
保存,退出
1 | -- write quit |
normal mode 光标操作。
- 所有的都可以在
前面加一个数字
,代表count
1 | h 左移 |
删除
1 | d 删除一个字符,配合移动光标使用 |
复制粘贴
1 | y yank |
跳转到某一行
1 | g |
撤销之前的操作
1 | u undo |
visual mode: 允许我们改变一列,整块复制等
1 | v 字符可视,开始和结束两个字符中间所有内容,退出按v |
搜索
1 | f<word> 本行查找 |
更改环境
1 | :set nu 显示行号 |
~
反转大小写
括号匹配
1 | % 到匹配的另一个括号处 |
tab, window, buffer
1 | tab: 我理解为 在系统中打开vim这个软件两次,就是两个tab |
配置,vim 在执行前会加载一个 ~/.vimrc
文件。
- 我们可以DIY自己的喜欢的按键。
- 安装插件实现更多的功能
neovim
本人使用(IDE不香吗?) neovim 配合 LazyVim。可DIY. 然后再 VsCode
安装neovim插件,同步使用。
- vim常用的操作,neovim也能用。
keymap
Leader 为 space 键,挺好用, 使用这些功能也需要安装对应插件
打开终端
1 | <leader>ft 当前 |
快速注释
1 | <leader>gc 但是需要指定的 LSP |
不同文件间(buffer)切换
1 | <leader>bb |
文件搜索 telescope
1 | -- 文件名 |
文件内
1 | <c-s> 保存文件 |
分屏
1 | <leader>w| <leader>| 生动表示竖着 |
侧边栏 neo-tree
1 | <leader>fe 当前 |
lazy.nvim 插件管理非常受欢迎。作者开发的插件和配置。
lecture4: data wrangling
处理数据的某些手段
grep,搜索
1 | grep "word" tmp.txt # 查询 |
sed,在搜索替换是一个好用的工具。需要学习一下正则表达式
1 | sed 's/<pattern>/<replace>/' |
一些正则表达式使用,使用在线网站练习。regular expression
1 | [0-9] 0,1,2...9 其中一个数字 |
wc
1 | wc -l word count,统计大小 -l line 几行 |
排序,字典序。去重
1 | sort 默认字典序排序 |
awk,基于流的处理,是一门编程语言
1 | awk 'script' 执行一个脚本 |
cut,类似编程语言的split
1 | cut [option] filename |
编程语言在命令行的使用? 各种管道,图片音频处理?
lecture5: command-line environment
优雅的使用命令行
job control
Linux 系统的 signal机制
1 | man signal : 会看到不同的number 和 name |
ctrl+z
1 | # 暂停,可执行其他任务 |
terminal multiplexers
终端复用,在一个terminal window干很多事情。
很多的终端都存在分屏等操作,但是课程介绍神器
tmux
,更加神奇。- 不 kill session,其中的命令会一直执行下去。只需要开启一次终端。
- 在ssh 服务器时非常的好用
session, window, pune
- 启动tmux, 会开启一个session, 明显的是下面会出现一行数据。
- window 创建一个新的shell 终端。
- pune 面板,一个窗口可以分很多的面板。
命令行操作
1 | tmux |
默认快捷键。可以先按一下 ctrl-b
在按其余的,不需要同时按。
1 | prefix = Ctrl-b |
配置快捷键, ~/.tmux.conf
。我使用的是基于网上找的 tmux-conf。
1 | ctrl-b 距离非常有点阴间,因此需要改。ctrl-a 是qemu快捷键。因此选择ctrl-x |
- 插件管理 Tmux Plugin Manager
- 美化+快捷键 系列操作参考。awesome-tmux: A list of awesome resources for tmux
aliases
给常用的命令设置别名
- bash 的
~/.bashrc
文件
1 | # 注意,不要存在 ll = 'ls -l' 因为在shell script中,空格是有意义的 |
dotfiles
各种配置文件。大部分是文件
- bash ->
~/.bashrc
- zsh ->
~/.zshrc
。我们的zsh美化也是修改此文件。 - vim ->
~/.vimrc
- tmux ->
~/tmux.conf
- neovim ->
~/.config/nvim
目录下的基于lua
配置 - ssh ->
~/.ssh
这是一个目录。可以配置公私钥,免密登录。- 自己的机器
ssh-keygen
命令生成公私钥 - 将公钥放入服务器的
authorized_keys
。权限一般是600
- 自己的机器
1 | ssh-copy-id -i ~/.ssh/id_rsa.pub <username>@<IP> |
感兴趣的可以学习一下 NixOS, 一个基于配置文件的操作系统😋
大部分配置都可在 github 查找到,如果不想自己配置,直接 clone/fork
一个其他人的。
bash 前面的一串的修改
1 | PS1="user>" 我们shell 前面的一串 |
问题:如何在本机和服务器同时使用tmux
相同的配置会可能产生冲突,或者会使我们不知道操作的是哪一个,因此我们需要不同的配置文件。最简单的就是使用两个 prefix
。
lecture6: virsion control(git)
git版本控制
开发项目,团队合作,文件损坏的回退。。。git都可以在很大程度上帮助我们,不需要删除在重新下载😘
- git 抽象建模。使用有向无环图进行抽象
- 顶层root,文件夹抽象为
tree
, 文件抽象为blob
- commit: 每次commit 产生一个类似
snapshot(快照)
的东西,保存当前的状态以及一些信息(作者,描述…)。 - 通过
mapping<string, object>
进行管理.string指文件的哈希值(SHA-1),object是我们文件保存的地址(‘snapshot’在磁盘中的地址)。每次修改,commit会产生新的hash
- 顶层root,文件夹抽象为
- reference: git需要的是文件的哈希值,对于人类毫无意义,因此存在另一个
mapping<string, string>
。我们使用可以人类方便阅读的字符串,映射到hash,然后在寻找到文件 - git 几个状态,可以看看 Git工作流和核心原理,非常有趣。在学习时,可以想象一下有向无环图进行理解。
- 工作区
- 暂存区
- 本地仓库
- 远程仓库
git 的配置
1 | # 配置用户名,邮箱。自己的账户。 |
创建一个git仓库
1 | mkdir demo |
日志,查看提交的文件
1 | # oneline 去除一定的信息 |
其中存在一个 HEAD
指针指向当前工作的分支。
我们想忽略某些文件时
1 | # 使用 gitignore 文件配置 |
本地操作
1 | git init |
提交到远程代码仓库
1 | # 1. 远程创建后直接clone下来,然后再写内容 |
从远程仓库到工作区。比如团队合作中,远程仓库更新了,我们需要先同步。
1 | # 直接同步到本地,会直接更新本地文件 |
分支操作。我们参与开源项目时,建议创建一个新分支push,由项目负责人决定是否合并(merge)。
1 | git branch "name" # 创建一个分支 |
git clone 会复制远程的所有文件,包含其所有的 snapshot
我们可以使用 --shallow
忽略这些
git 回滚:当我们在一个分支中commit
后发现一个巨大的错误,需要回退到之前的版本。改变 HEAD
指针
1 | git stash # 回退到上一个commit 版本 |
现在的IDE中存在git相关的工具,也更加方便了我们的使用。
也存在其余的版本控制工具,svn, repo……
repo 使用
repo 更适合多个仓库的管理,平常我们见的项目都是一个仓库。但是向Android这样的依赖上百个git仓库来说,依靠git并不是多么好使用,因此google 开发了repo工具,本质是一个python脚本,基于git。
初始化
1 | repo init |
-u后的仓库, xml文件(默认default.xml
, 我们可以自己选择),然后我们拉取的时候会将所有的git仓库拉取下来
1 | repo init -u <repo> |
拉取代码到本地
1 | repo sync -c |
分支
1 | repo branch # 查看分支 |
lecture7: debugging & profiling
调试程序以及性能分析
查看日志,打印日志,制作日志
调试器
- GNU gdb,可以调试几乎所有的二进制程序
- python pdb,python调试
- 浏览器调试js
性能测试
- 测试一个程序运行 time
lecture8: metaprogramming
如何更高的管理项目、测试、依赖管理。使用 makefile
Makefile 的使用比较简单。
1 | 目标: 依赖 |
一些语法
1 | $^ 所有的依赖项 |
我们编译某些开源项目时也会使用 make
命令,可以看看别人怎么写的。
当然,还有其他的选择,比如 cmake
lecture9: security & crypto
安全很多,也是一门专门的学科,想要深入就需要学专业课
hash: 用作信息摘要,签名,检查文件的完整性。
- md5
- sha-1/2/3
对称加密
- DES
- AES
非对称加密
- RSA
- ECC
数字签名
lecture10: potpourri
大杂烩:讲述一些概念,熟练还得在以后多练习
键盘映射
- 键盘上的
Caps Lock
几乎不怎么使用,我们可以重新配置一下(比如比较小的Esc),让其发挥作用 - windows可以使用powertoy
守护进程,daemon
命令行参数
- 我们使用的命令可以带有参数
Window Manage
VPN
Jupyter Notebook: 交互式编程
GitHub: 代码托管平台
- 创建自己的仓库
- 提issue,解决问题
- pr: pull request,自己写的提交给作者
- merge 别人的请求
lecture11: Q&A
来自学生的问题
如何进行操作系统的学习?
- learn by exercise: 学习比较出名的 OS 课程,完成相应的lab,实现自己的OS
…… 自己看