作者 | 梁唐
出品 | 公众号:Coder梁(ID:Coder_LT)
大家好,日拱一卒,我是梁唐。
今天我们继续麻省理工missing smester,消失的学期的学习。这一节课的内容比较杂, 是一些使用过程当中的配置和技巧,算是杂项吧。
B站视频链接:https://www.bilibili.com/video/BV1x7411H7wa?p=9
在这一节课当中我们会学到一些配置和技巧,相当于往我们的工具库当中加入了更多的工具,说不定某一天就会用到。另外,一些常用的配置和工具也可以让我们的编程工作更加地方便。
日拱一卒,欢迎大家打卡一起学习。
对于程序员来说,你的键盘是你的主要输入设备。就像是计算机当中的其他设备一样,它也是可配置的,并且非常值得你为此花费一点点时间。
最基础的一个改变是一些按键的重映射,通常这需要使用一些软件对按键进行监听,当发现某些按键被按下的时候,它会截取事件并且替换成我们设置的另外的按键。比如:
你也可以将键位根据你的需要替换成一些命令,对于一些任务来说可能非常有用。一些软件可以监听特定的按键,当按键按下时执行某些特定的脚本。
还有一些更加复杂的改动:
下面是一些修改键位映射的软件:
你可能听说过守护进程,即使这个概念看起来有些陌生。大多数计算机拥有一系列在后台运行的进程,不需要用户进行任何操作或者是交互。这些进程被称为守护进程,这些进程名称当中通常以d结尾。比如sshd,就是SSH的守护进程,它负责监听SSH请求,检查远程的用户是否有权限登录。
在Linux系统当中,systemd(系统守护进程)是最常用的用来运行守护进程的方法。你可以使用systemctl status
来列举所有当前正在运行的守护进程。它们当中大多数可能看起来不太熟悉,但都负责了系统中的一些核心功能,比如管理网络,DNS解析,显示系统图形界面等等。
可以使用systemctl
命令来enable, disable, start, stop, restart和status来和systemd进行交互。
并且systemd提供了一个很方便的界面用来进行配置和启动新的守护进程或服务。下面是一个使用守护进程来运行一个简单Python的应用。我们不会太过涉及细节,但相信绝大部分从名字上可以猜出它的功能。
# /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。它是一个你系统内置专门用来执行调度任务的守护进程。
现在的软件系统通常由许多更小的模块构建而成。你的操作系统支持在后台使用不同的文件系统,这是因为操作文件系统的语言是通用的。比如,当你运行touch
来创建一个文件,touch
会执行一个system call(系统调用)给内核来创建文件。内核再通过类似的filesystem call来创建指定的文件。这里有一点要注意,UNIX中文件系统在传统上是以内核模块的形式实现的,只有内核可以进行文件系统的相关调用。
FUSE(filesystem in user space)允许用户的程序来实现文件系统。FUSE允许用户在用户空间执行filesystem call,并且将用户的调用和内核接口桥接起来。在实际中,这意味着用户可以使用filesystem call实现任意功能。
比如,FUSE可以实现:无论何时当你想要操作一个虚拟文件系统,这个操作会被通过SSH发送到远程的机器上,在远处执行之后,将结果返回。通过这个方法,本地的程序也可以操作远程服务器上的文件,就好像它们存在本地一样。sshfs
就是实现了这样的功能。
一些有趣的 FUSE 文件系统包括:
任何没有备份的数据都可能在某个时刻突然消失,在本地拷贝一份数据非常简单,但拥有一份可靠的备份很难。这里是一些关于备份的基础知识,以及一些常见的容易遇到的问题。
首先,在相同磁盘的拷贝不能算作是备份,因为对于所有数据来说,磁盘是一个单点故障。同样的,你家里的外部存储也同样很脆弱,比如可能因为火灾/抢劫等原因损坏。所以推荐的做法是将备份和原数据放在不同的地点。
同步方案也不是备份,比如Dropbox/GDrive非常方便,但云端的数据很容易因为本地数据的损坏或者是修改发生污染。同理,像是RAID这样的磁盘镜像方案也不是备份,它不能防止数据被删除、污染或者是被勒索软件加密。
一个好的备份解决方案的核心是版本控制,删除重复的数据,以及安全。版本控制保证了你可以获取你数据的历史版本并且高效地恢复数据。删除冗余的数据,保证增量的方式存储变更可以让备份变得非常高效,还可以减小存储开销。在安全性方面,你需要考虑对使用你数据的人进行限制(口令、验证)。最后,不要盲目相信备份,你需要经常检查你的备份是否还完好。
备份不限制于你本地计算机上的文件。随着网络应用的兴起,越来越多的数据被存储在了云端。比如你的邮箱、社交媒体上的照片、音乐播放列表以及在线文档等,如果你丢失了权限,这些数据都会消失。一种方式是对这些数据都存储一份离线拷贝,你可以找到一些工具可以帮助你对云端数据进行下载。
当今的互联网服务,大多线上服务拥有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来实现特定的功能。
命令行工具之间差异非常大,通常可以在使用之前通过man
命令来查看基本用法。但通常有一些共同的特性是一样的:
--help
这个flag来展示基础的用法--version
或者-v
来打印它的版本信息--verbose
或者-v
flag来输出详细的运行信息。通常可以使用-vvv
来获得更加详细的信息来调试。类似的,很多工具也支持使用--quiet
来去除除了报错以外的输出-
代替文件名意味着标准输出或者标准输出-r
开启递归模式-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。你可以通过键盘在这些窗口当中浏览,你也可以进行移动、重新定义大小等操作。这些都可以摆脱鼠标完成,非常方便。
在你的职业生涯当中,总会面临各种各样的文档需求。通常你需要在文本当中加入一些标记或者做一些修饰,比如说加粗、斜体,或者是你想要加入标题、链接以及代码片段等。和使用一些比较繁重的工具比如word或者是LaTeX相比,你可以考虑使用更加轻量级的标记语言Markdown。
你可能已经见过 Markdown 或者它的一个变种。很多环境都支持并使用 Markdown 的一些子功能。
Markdown 致力于将人们编写纯文本时的一些习惯标准化。比如:
```
code goes here
```
Markdown 不仅容易上手,而且应用非常广泛。实际上本课程的课堂笔记和其他资料都是使用 Markdown 编写的
在计算机启动时,BIOS 或者 UEFI 会在加载操作系统之前对硬件系统进行初始化,这被称为引导(booting)。在这个过程当中,你可以通过按下计算机提示的键位组合来配置引导,比如 Press F9 to configure BIOS. Press F12 to enter boot menu。在 BIOS 菜单中你可以对硬件相关的设置进行更改,也可以在引导菜单中选择从硬盘以外的其他设备加载操作系统——比如 Live USB。
Live USB 是包含了完整操作系统的U盘。Live USB 的用途非常广泛,包括:
Live USB 通过在U盘上 写入 操作系统的镜像制作,而写入不是单纯的往闪存盘上复制 .iso 文件。你可以使用 UNetbootin 、Rufus 等 Live USB 写入工具制作。
虚拟机(Virtual Machine)以及容器化(containerization)等工具可以帮助你模拟一个包括操作系统的完整计算机系统。虚拟机可以用于创建独立的测试或者开发环境,以及用作安全测试的沙盒。
Vagrant 是一个构建和配置虚拟开发环境的工具。它支持用户在配置文件中写入比如操作系统、系统服务、需要安装的软件包等描述,然后使用 vagrant up 命令在各种环境(VirtualBox,KVM,Hyper-V等)中启动一个虚拟机。Docker 是一个使用容器化概念的类似工具。
租用云端虚拟机可以享受以下资源的即时访问:
受欢迎的 VPS 服务商有 Amazon AWS,Google Cloud、Microsoft Azure以及DigitalOcean。
对于一些特定的交互式或者是探索式的开发来说,记事本编程环境非常好用。比如现在最受欢迎的记事本编程环境——jupyter,它的名字来源于它支持的三种核心语言:Julia、Python、R。除此之外,Wolfram Mathematica 常用来进行科学计算的编程环境。
GitHub 是最受欢迎的开源软件开发平台之一。这节课上提到的很多工具,都托管在 Github 上。想要贡献代码很容易,大概有两种方式:
喜欢本文的话不要忘记三连~