MIT_Missing_Semester_08_metaprogramming
我们这里说的 “元编程(metaprogramming)” 是什么意思呢?好吧,对于本文要介绍的这些内容,这是我们能够想到的最能概括它们的词。因为我们今天要讲的东西,更多是关于 流程 ,而不是写代码或更高效的工作。本节课我们会学习构建系统、代码测试以及依赖管理。在您还是学生的时候,这些东西看上去似乎对您来说没那么重要,不过当您开始实习或走进社会的时候,您将会接触到大型的代码库,本节课讲授的这些东西也会变得随处可见。必须要指出的是,“元编程” 也有用于操作程序的程序” 之含义,这和我们今天讲座所介绍的概念是完全不同的。
构建系统
如果您使用 LaTeX 来编写论文,您需要执行哪些命令才能编译出您想要的论文呢?执行基准测试、绘制图表然后将其插入论文的命令又有哪些?或者,如何编译本课程提供的代码并执行测试呢?
对于大多数系统来说,不论其是否包含代码,都会包含一个“构建过程”。有时,您需要执行一系列操作。通常,这一过程包含了很多步骤,很多分支。执行一些命令来生成图表,然后执行另外的一些命令生成结果,然后再执行其他的命令来生成最终的论文。有很多事情需要我们完成,您并不是第一个因此感到苦恼的人,幸 ...
MIT_Missing_Semester_07_Debugging_profiling
Debugging and Profiling
代码不能完全按照您的想法运行,它只能完全按照您的写法运行,这是编程界的一条金科玉律。
让您的写法符合您的想法是非常困难的。在这节课中,我们会传授给您一些非常有用技术,帮您处理代码中的 bug 和程序性能问题。
调试代码
打印调试法与日志
“最有效的 debug 工具就是细致的分析,配合恰当位置的打印语句” — Brian Kernighan, Unix 新手入门。
调试代码的第一种方法往往是在您发现问题的地方添加一些打印语句,然后不断重复此过程直到您获取了足够的信息并找到问题的根本原因。
另外一个方法是使用日志,而不是临时添加打印语句。日志较普通的打印语句有如下的一些优势:
您可以将日志写入文件、socket 或者甚至是发送到远端服务器而不仅仅是标准输出;
日志可以支持严重等级(例如 INFO, DEBUG, WARN, ERROR等),这使您可以根据需要过滤日志;
对于新发现的问题,很可能您的日志中已经包含了可以帮助您定位问题的足够的信息。
这里 是一个包含日志的例程序:
$ python logger.py# Raw output ...
MIT_Missing_Semester_06_git
Git
关于Git,还可以看看这篇文章。
版本控制系统 (VCSs) 是一类用于追踪源代码(或其他文件、文件夹)改动的工具。顾名思义,这些工具可以帮助我们管理代码的修改历史;不仅如此,它还可以让协作编码变得更方便。VCS通过一系列的快照将某个文件夹及其内容保存了起来,每个快照都包含了文件或文件夹的完整状态。同时它还维护了快照创建者的信息以及每个快照的相关信息等等。
为什么说版本控制系统非常有用?即使您只是一个人进行编程工作,它也可以帮您创建项目的快照,记录每个改动的目的、基于多分支并行开发等等。和别人协作开发时,它更是一个无价之宝,您可以看到别人对代码进行的修改,同时解决由于并行开发引起的冲突。
现代的版本控制系统可以帮助您轻松地(甚至自动地)回答以下问题:
当前模块是谁编写的?
这个文件的这一行是什么时候被编辑的?是谁作出的修改?修改原因是什么呢?
最近的1000个版本中,何时/为什么导致了单元测试失败?
因为 Git 接口的抽象泄漏(leaky abstraction)问题,通过自顶向下的方式(从命令行接口开始)学习 Git 可能会让人感到非常困惑。很多时候您只能死记硬背一 ...
MIT_Missing_Semester_05_Commandline_Env
Command-line Environment
任务控制
某些情况下我们需要中断正在执行的任务,比如当一个命令需要执行很长时间才能完成时(假设我们在使用 find 搜索一个非常大的目录结构)。大多数情况下,我们可以使用 Ctrl-C 来停止命令的执行。但是它的工作原理是什么呢?为什么有的时候会无法结束进程?
结束进程
您的 shell 会使用 UNIX 提供的信号机制执行进程间通信。当一个进程接收到信号时,它会停止执行、处理该信号并基于信号传递的信息来改变其执行。就这一点而言,信号是一种软件中断。
在上面的例子中,当我们输入 Ctrl-C 时,shell 会发送一个SIGINT 信号到进程。
下面这个 Python 程序向您展示了捕获信号SIGINT 并忽略它的基本操作,它并不会让程序停止。为了停止这个程序,我们需要使用SIGQUIT 信号,通过输入Ctrl-\可以发送该信号。
#!/usr/bin/env pythonimport signal, timedef handler(signum, time): print("\nI got a SIGINT, but ...
FloraX_01_start
Start
FloraX是一个自开发的博客系统。
learngitbranching
learngitbranching.js.org
偶然发现一个学习git的游戏网站。
Git Local
Git Commit
$ git commit$ git commit
结果为:
Git Branch
$ git branch bugFix$ git checkout bugFix
结果为:
Git Merge
$ git branch bugFix$ git checkout bugFix$ git commit$ git checkout main$ git commit$ git merge bugFix
Git Rebase
$ git branch bugFix$ git checkout bugFix$ git commit$ git checkout main$ git commit$ git checkout bugFix$ git rebase main
结果为:
分离 head
HEAD 是一个对当前检出记录的符号引用 —— 也就是指向你正在其基础上进行工作的提交记录。
HEAD 总是指向当前分支上最近一次提交记录。大多数修改提交树的 Git ...
MIT_Missing_Semester_04_data_wrangling
Data Wrangling
序言
您是否曾经有过这样的需求,将某种格式存储的数据转换成另外一种格式? 肯定有过,对吧! 这也正是我们这节课所要讲授的主要内容。具体来讲,我们需要不断地对数据进行处理,直到得到我们想要的最终结果。
在之前的课程中,其实我们已经接触到了一些数据整理的基本技术。可以这么说,每当您使用管道运算符的时候,其实就是在进行某种形式的数据整理。
日志
例如这样一条命令 journalctl | grep -i intel,它会找到所有包含intel(不区分大小写)的系统日志。您可能并不认为这是数据整理,但是它确实将某种形式的数据(全部系统日志)转换成了另外一种形式的数据(仅包含intel的日志)。大多数情况下,数据整理需要您能够明确哪些工具可以被用来达成特定数据整理的目的,并且明白如何组合使用这些工具。
既然是学习数据整理,那有两样东西自然是必不可少的:用来整理的数据以及相关的应用场景。
日志处理通常是一个比较典型的使用场景,因为我们经常需要在日志中查找某些信息,这种情况下通读日志是不现实的。现在,让我们研究一下系统日志,看看哪些用户曾经尝试过登录我们的服务器:
ss ...
MIT_Missing_Semester_03_vim
Vim
使用
模式
按下 <ESC> (退出键) 从任何其他模式返回正常模式。 在正常模式,键入 i 进入插入模式, R 进入替换模式, v 进入可视(一般)模式, V 进入可视(行)模式, <C-v> (Ctrl-V, 有时也写作 ^V)进入可视(块)模式, : 进入命令模式。
在正常模式下键入 : 进入命令行模式。 在键入 : 后,你的光标会立即跳到屏幕下方的命令行。 这个模式有很多功能,包括打开,保存,关闭文件,以及 退出 Vim。
:q 退出(关闭窗口)
:w 保存(写)
:wq 保存然后退出
:e {文件名} 打开要编辑的文件
:ls 显示打开的缓存
:help {标题} 打开帮助文档
:help :w 打开 :w 命令的帮助文档
:help w 打开 w 移动的帮助文档
移动
多数时候你会在正常模式下,使用移动命令在缓存中导航。在 Vim 里面移动也被称为 “名词”, 因为它们指向文字块。
基本移动: hjkl (左, 下, 上, 右)
词: w (下一个词), b (词初), e (词尾)
行: ...
MIT_Missing_Semester_02_shell
Shell & Script
shell的使用
因为有一定的基础,因此就跟着课程代码直接走一遍。
变量赋值
foo=bar echo "$foo" # bar echo '$foo' # $foo
函数使用
mkdircd(){ mkdir -p "$1" cd "$1"}
$0 - 脚本名
$1 到 $9 - 脚本的参数。 $1 是第一个参数,依此类推。
$@ - 所有参数
$# - 参数个数
$? - 前一个命令的返回值
$$ - 当前脚本的进程识别码
!! - 完整 ...
MIT_Missing_Semester_01_intro
Course overview + the shell
中文课程网站链接:
https://missing-semester-cn.github.io/2020/course-shell/
官方链接:
https://missing.csail.mit.edu/2020/course-shell/
至于shell,呃,如果是稍微用过linux应该都会有所了解。
这里就完成一下课后练习。
我使用的是VMware,用的是Ubuntu 14.06,在输入echo $SHELL后得到如下结果:
echo $SHELL/bin/bash
在 /tmp 下新建一个名为 missing 的文件夹。
cd /tmp && mkdir missing
用 man 查看程序 touch 的使用手册。
man touch
得到结果:
NAME touch - change file timestampsSYNOPSIS touch [OPTION]... FILE...DESCRIPTION Update the access and modi ...