日拱一卒,麻省理工CS入门系列完结撒花

2022-09-21 10:59:31 浏览数 (1)

作者 | 梁唐

出品 | 公众号:Coder梁(ID:Coder_LT)

大家好,日拱一卒,我是梁唐。

今天我们继续麻省理工missing smester,消失的学期的学习。这一节课的内容比较杂, 是一些使用过程当中的配置和技巧,算是杂项吧。

B站视频链接:https://www.bilibili.com/video/BV1x7411H7wa?p=9

在这一节课当中我们会学到一些配置和技巧,相当于往我们的工具库当中加入了更多的工具,说不定某一天就会用到。另外,一些常用的配置和工具也可以让我们的编程工作更加地方便。

日拱一卒,欢迎大家打卡一起学习。

键盘重映射

对于程序员来说,你的键盘是你的主要输入设备。就像是计算机当中的其他设备一样,它也是可配置的,并且非常值得你为此花费一点点时间。

最基础的一个改变是一些按键的重映射,通常这需要使用一些软件对按键进行监听,当发现某些按键被按下的时候,它会截取事件并且替换成我们设置的另外的按键。比如:

  • 将Caps Lock(大写锁定)键替换成Ctrl或者是Escape。大写锁定在键盘上一个非常方便的位置,但是它很少被使用,所以可以替换成我们常用的一些按键。比如如果经常使用vim的话,可以替换成Esc
  • 将PrtSc替换成播放/暂停按键,大部分操作系统支持播放/暂停键
  • 将Ctrl和Meta键交换(Windows徽标或者Mac中的command),如果是Mac党,推荐可以将command键和alt进行交换

你也可以将键位根据你的需要替换成一些命令,对于一些任务来说可能非常有用。一些软件可以监听特定的按键,当按键按下时执行某些特定的脚本。

  • 开启一个新的终端或者是浏览器窗口
  • 插入某些特定的文本,比如你的email地址或者是你的MIT学生ID
  • 进入休眠模式

还有一些更加复杂的改动:

  • 映射连续按键,比如按下shift五次开启大写锁定
  • 区别映射点击和长按,对于大写锁定键,如果只是单机表示Esc,长按替换成Ctrl
  • 对不同的键盘或软件进行区别设置

下面是一些修改键位映射的软件:

  • macOS - karabiner-elements, skhd 或者 BetterTouchTool
  • Linux - xmodmap 或者 Autokey
  • Windows - 控制面板,AutoHotkey 或者 SharpKeys
  • QMK - 如果你的键盘支持定制固件,QMK 可以直接在键盘的硬件上修改键位映射。保留在键盘里的映射免除了在别的机器上的重复配置。

守护进程

你可能听说过守护进程,即使这个概念看起来有些陌生。大多数计算机拥有一系列在后台运行的进程,不需要用户进行任何操作或者是交互。这些进程被称为守护进程,这些进程名称当中通常以d结尾。比如sshd,就是SSH的守护进程,它负责监听SSH请求,检查远程的用户是否有权限登录。

在Linux系统当中,systemd(系统守护进程)是最常用的用来运行守护进程的方法。你可以使用systemctl status来列举所有当前正在运行的守护进程。它们当中大多数可能看起来不太熟悉,但都负责了系统中的一些核心功能,比如管理网络,DNS解析,显示系统图形界面等等。

可以使用systemctl命令来enable, disable, start, stop, restart和status来和systemd进行交互。

并且systemd提供了一个很方便的界面用来进行配置和启动新的守护进程或服务。下面是一个使用守护进程来运行一个简单Python的应用。我们不会太过涉及细节,但相信绝大部分从名字上可以猜出它的功能。

代码语言:javascript复制
# /etc/systemd/system/myapp.service
[Unit]
Description=My Custom App
After=network.target

[Service]
User=foo
Group=foo
WorkingDirectory=/home/foo/projects/mydaemon
ExecStart=/usr/bin/local/python3.7 app.py
Restart=on-failure

[Install]
WantedBy=multi-user.target

如果你只是想要定期运行一些程序,其实可以不用自定义守护进程,可以使用cron。它是一个你系统内置专门用来执行调度任务的守护进程。

FUSE

现在的软件系统通常由许多更小的模块构建而成。你的操作系统支持在后台使用不同的文件系统,这是因为操作文件系统的语言是通用的。比如,当你运行touch来创建一个文件,touch会执行一个system call(系统调用)给内核来创建文件。内核再通过类似的filesystem call来创建指定的文件。这里有一点要注意,UNIX中文件系统在传统上是以内核模块的形式实现的,只有内核可以进行文件系统的相关调用。

FUSE(filesystem in user space)允许用户的程序来实现文件系统。FUSE允许用户在用户空间执行filesystem call,并且将用户的调用和内核接口桥接起来。在实际中,这意味着用户可以使用filesystem call实现任意功能。

比如,FUSE可以实现:无论何时当你想要操作一个虚拟文件系统,这个操作会被通过SSH发送到远程的机器上,在远处执行之后,将结果返回。通过这个方法,本地的程序也可以操作远程服务器上的文件,就好像它们存在本地一样。sshfs就是实现了这样的功能。

一些有趣的 FUSE 文件系统包括:

  • sshfs:使用 SSH 连接在本地打开远程主机上的文件
  • rclone:将 Dropbox、Google Drive、Amazon S3、或者 Google Cloud Storage 一类的云存储服务挂载为本地文件系统
  • gocryptfs:覆盖在加密文件上的文件系统。文件以加密形式保存在磁盘里,但该文件系统挂载后用户可以直接从挂载点访问文件的明文
  • kbfs:分布式端到端加密文件系统。在这个文件系统里有私密(private),共享(shared),以及公开(public)三种类型的文件夹
  • borgbackup:方便用户浏览删除重复数据后的压缩加密备份

Backups

任何没有备份的数据都可能在某个时刻突然消失,在本地拷贝一份数据非常简单,但拥有一份可靠的备份很难。这里是一些关于备份的基础知识,以及一些常见的容易遇到的问题。

首先,在相同磁盘的拷贝不能算作是备份,因为对于所有数据来说,磁盘是一个单点故障。同样的,你家里的外部存储也同样很脆弱,比如可能因为火灾/抢劫等原因损坏。所以推荐的做法是将备份和原数据放在不同的地点。

同步方案也不是备份,比如Dropbox/GDrive非常方便,但云端的数据很容易因为本地数据的损坏或者是修改发生污染。同理,像是RAID这样的磁盘镜像方案也不是备份,它不能防止数据被删除、污染或者是被勒索软件加密。

一个好的备份解决方案的核心是版本控制,删除重复的数据,以及安全。版本控制保证了你可以获取你数据的历史版本并且高效地恢复数据。删除冗余的数据,保证增量的方式存储变更可以让备份变得非常高效,还可以减小存储开销。在安全性方面,你需要考虑对使用你数据的人进行限制(口令、验证)。最后,不要盲目相信备份,你需要经常检查你的备份是否还完好。

备份不限制于你本地计算机上的文件。随着网络应用的兴起,越来越多的数据被存储在了云端。比如你的邮箱、社交媒体上的照片、音乐播放列表以及在线文档等,如果你丢失了权限,这些数据都会消失。一种方式是对这些数据都存储一份离线拷贝,你可以找到一些工具可以帮助你对云端数据进行下载。

APIs

当今的互联网服务,大多线上服务拥有API,可以让你的程序通过它获得数据。比如说美国政府网站拥有API让你可以获取天气预报,这样你可以在你的shell当中轻易地知道天气情况。

大多数API格式相似,都是结构化的URL,通常使用api.service.com作为根路径。路径和请求参数表明了你想要获取的数据或者是你想要进行的操作。以美国天气数据为例,为了获得某个地点的天气预报,你可以发起GET请求到https://api.weather.gov/points/42.3604,-71.094.

返回的数据当中会包含一系列URL,可以让你获取你想要的指定地点的天气预报。通常返回数据以JSON的格式封装,你可以使用一些类似于jq的工具来过滤你想要的数据。

还有一些api需要验证,需要在请求当中加入一些特定的token。你需要阅读对应的文档来确定API需要的验证方式,OAuth是一种常用的协议。OAuth为用户提供一系列token服务。请记住,token是私密的,别人使用你的token发出的请求就相当于你自己发出的一样。

IFTTT可以将很多API整合在一起,它继承了成千上万的服务,可以让你串联平台上一系列的API来实现特定的功能。

常用命令行flag

命令行工具之间差异非常大,通常可以在使用之前通过man命令来查看基本用法。但通常有一些共同的特性是一样的:

  • 大部分工具支持--help这个flag来展示基础的用法
  • 会造成不可逆效果的工具通常支持空运行的功能,会打印出要进行的操作。相似的,往往也会提供交互的flag,让用户在执行的时候确认
  • 通常可以使用--version或者-v来打印它的版本信息
  • 大多数工具支持--verbose或者-vflag来输出详细的运行信息。通常可以使用-vvv来获得更加详细的信息来调试。类似的,很多工具也支持使用--quiet来去除除了报错以外的输出
  • 大多数工具当中,-代替文件名意味着标准输出或者标准输出
  • 会造成破坏性的工具通常默认不支持递归,通常使用-r开启递归模式
  • 有些时候你需要传入一个像是flag的普通参数,比如你想要删除一个叫做-r的文件,或者是你想要通过一个程序执行另一个程序,比如ssh machine foo,向foo程序传入一个参数。这个时候可以传入一个特殊的参数--让程序停止处理flag。 比如rm -- -r或者是ssh machine --for-ssh -- foo --for-foo,中间的--会让ssh知道之后的不再是它要处理的flag

窗口管理器

大部分人适应了拖拽式的窗口,比如Windows和Mac以及Ubuntu中的那样。在这些系统当中,窗口都是堆叠在一起的,你需要拖拽它们,将它们重新设置大小,以及让它们堆叠在一起。但这只是窗口管理的一种方式,通常称为浮动式。

除此之外,还有很多其他的窗口管理,尤其是在Linux上。一个特别的选项是平铺式的窗口管理器(tiling)。在平铺式窗口管理器当中,窗口永远不会互相覆盖,它们会平铺在一起像是地砖一样。

如果只有一个窗口, 那么它会占据整个屏幕,如果又开了一个新的窗口,原先的窗口会缩小到之前的2/3或者是1/3。打开更多的窗口会调整之前的窗口来适应新的窗口,有些像是tmux中的pane。你可以通过键盘在这些窗口当中浏览,你也可以进行移动、重新定义大小等操作。这些都可以摆脱鼠标完成,非常方便。

Markdown

在你的职业生涯当中,总会面临各种各样的文档需求。通常你需要在文本当中加入一些标记或者做一些修饰,比如说加粗、斜体,或者是你想要加入标题、链接以及代码片段等。和使用一些比较繁重的工具比如word或者是LaTeX相比,你可以考虑使用更加轻量级的标记语言Markdown。

你可能已经见过 Markdown 或者它的一个变种。很多环境都支持并使用 Markdown 的一些子功能。

Markdown 致力于将人们编写纯文本时的一些习惯标准化。比如:

  • 包围的文字表示强调(斜体*),或者用表示特别强调(粗体**);
  • 以#开头的行是标题,#的数量表示标题的级别,比如:##二级标题;
  • 以-开头代表一个无序列表的元素。一个数字加.(比如1.)代表一个有序列表元素;
  • 反引号 `(backtick)包围的文字会以代码字体显示。如果要显示一段代码,可以在每一行前加四个空格缩进,或者使用三个反引号包围整个代码片段:
代码语言:javascript复制
```
code goes here
```
  • 如果要添加超链接,将 需要显示 的文字用方括号包围,并在后面紧接着用圆括号包围链接:显示文字。

Markdown 不仅容易上手,而且应用非常广泛。实际上本课程的课堂笔记和其他资料都是使用 Markdown 编写的

引导以及 Live USB

在计算机启动时,BIOS 或者 UEFI 会在加载操作系统之前对硬件系统进行初始化,这被称为引导(booting)。在这个过程当中,你可以通过按下计算机提示的键位组合来配置引导,比如 Press F9 to configure BIOS. Press F12 to enter boot menu。在 BIOS 菜单中你可以对硬件相关的设置进行更改,也可以在引导菜单中选择从硬盘以外的其他设备加载操作系统——比如 Live USB。

Live USB 是包含了完整操作系统的U盘。Live USB 的用途非常广泛,包括:

  • 作为安装操作系统的启动盘;
  • 在不将操作系统安装到硬盘的情况下,直接运行 Live USB 上的操作系统;
  • 对硬盘上的相同操作系统进行修复;
  • 恢复硬盘上的数据。

Live USB 通过在U盘上 写入 操作系统的镜像制作,而写入不是单纯的往闪存盘上复制 .iso 文件。你可以使用 UNetbootin 、Rufus 等 Live USB 写入工具制作。

Docker, Vagrant, VMs, Cloud, OpenStack

虚拟机(Virtual Machine)以及容器化(containerization)等工具可以帮助你模拟一个包括操作系统的完整计算机系统。虚拟机可以用于创建独立的测试或者开发环境,以及用作安全测试的沙盒。

Vagrant 是一个构建和配置虚拟开发环境的工具。它支持用户在配置文件中写入比如操作系统、系统服务、需要安装的软件包等描述,然后使用 vagrant up 命令在各种环境(VirtualBox,KVM,Hyper-V等)中启动一个虚拟机。Docker 是一个使用容器化概念的类似工具。

租用云端虚拟机可以享受以下资源的即时访问:

  • 便宜、持续维护、且有公共IP地址的虚拟机用来托管网站等服务
  • 有大量 CPU、磁盘、内存、以及 GPU 资源的虚拟机
  • 比物理机更多的资源(每秒钟近10亿台,如果你想要短时间内使用大量的计算资源,可以考虑)

受欢迎的 VPS 服务商有 Amazon AWS,Google Cloud、Microsoft Azure以及DigitalOcean。

交互式记事本编程

对于一些特定的交互式或者是探索式的开发来说,记事本编程环境非常好用。比如现在最受欢迎的记事本编程环境——jupyter,它的名字来源于它支持的三种核心语言:Julia、Python、R。除此之外,Wolfram Mathematica 常用来进行科学计算的编程环境。

GitHub

GitHub 是最受欢迎的开源软件开发平台之一。这节课上提到的很多工具,都托管在 Github 上。想要贡献代码很容易,大概有两种方式:

  • 创建一个问题(issue)。这可以用来反映程序运行的问题或者请求新的功能。高质量的问题报告对于开发者十分重要。对已有的issue发表评论也会有所帮助
  • 使用拉取请求(pull request)提交代码更改。由于涉及到阅读和编写代码,提交拉取请求总的来说比创建issue更加深入。你需要首先fork一个仓库,然后创建新的分支,在你的分支上修改之后,push到远程。最后创建一个pull request。通常维护者会审核你的改动,给你提出一些comment和反馈。如果一切顺利,你的代码会合并到上游的代码库当中。大型的项目通常会对这个过程做出引导,甚至有一些引导式的程序帮第一接触项目的开发者熟悉项目

喜欢本文的话不要忘记三连~

0 人点赞