missing semester - Potpourri
修改键位映射
修改键位映射通常由在计算机上运行的软件实现。当某一个按键被按下,软件截获键盘发出的按键事件(keypress event)并使用另外一个事件取代。比如:
- 将 Caps Lock 映射为 Ctrl 或者 Escape:Caps Lock 使用了键盘上一个非常方便的位置而它的功能却很少被用到;
下面是一些修改键位映射的软件:
- macOS - karabiner-elements, skhd 或者 BetterTouchTool
- Linux - xmodmap 或者 Autokey
- Windows - 控制面板,AutoHotkey 或者 SharpKeys
- QMK - 如果你的键盘支持定制固件,QMK 可以直接在键盘的硬件上修改键位映射。保留在键盘里的映射免除了在别的机器上的重复配置。
守护进程
守护进程是一种在后台保持运行,不需要用户手动运行或者交互的进程。
以守护进程运行的程序名一般以 d
结尾,比如 SSH 服务端 sshd
,用来监听传入的 SSH 连接请求并对用户进行鉴权,MySQL服务端 mysqld
。
Linux 中的 systemd
(the system daemon)是最常用的配置和运行守护进程的方法。
- 运行
systemctl status
命令可以看到正在运行的所有守护进程。 - 用户使用
systemctl
命令和systemd
交互来enable
(启用)、disable
(禁用)、start
(启动)、stop
(停止)、restart
(重启)、或者status
(检查)配置好的守护进程及系统服务。
systemd
提供了一个很方便的界面用于配置和启用新的守护进程或系统服务。下面的配置文件使用了守护进程来运行一个简单的 Python 程序。systemd
配置文件的详细指南可参见 freedesktop.org。
# /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]
# 相当于Windows的开机启动。即使GUI没有启动,该进程也会加载并运行
WantedBy=multi-user.target
# 如果该进程仅需要在GUI活动时运行,这里应写作:
# WantedBy=graphical.target
# graphical.target在multi-user.target的基础上运行和GUI相关的服务
如果想定期运行一些程序,可以直接使用 cron
。它是一个系统内置的,用来执行定期任务的守护进程。(即使用 crontab
指令)
FUSE
FUSE(Filesystem in Userspace,用户空间文件系统)允许运行在用户空间上的程序实现文件系统调用,并将这些调用与内核接口联系起来。在实践中,这意味着用户可以在文件系统调用中实现任意功能。
FUSE 可以用于实现如:一个将所有文件系统操作都使用 SSH 转发到远程主机,由远程主机处理后返回结果到本地计算机的虚拟文件系统。这个文件系统里的文件虽然存储在远程主机,对于本地计算机上的软件而言和存储在本地别无二致。sshfs
就是一个实现了这种功能的 FUSE 文件系统。
一些有趣的 FUSE 文件系统包括:
-
sshfs:使用 SSH 连接在本地打开远程主机上的文件
-
rclone:将 Dropbox、Google Drive、Amazon S3、或者 Google Cloud Storage 一类的云存储服务挂载为本地文件系统
-
gocryptfs:覆盖在加密文件上的文件系统。文件以加密形式保存在磁盘里,但该文件系统挂载后用户可以直接从挂载点访问文件的明文
-
kbfs:分布式端到端加密文件系统。在这个文件系统里有私密(private),共享(shared),以及公开(public)三种类型的文件夹
-
borgbackup:方便用户浏览删除重复数据后的压缩加密备份
备份
复制数据很简单,但是可靠地备份数据很难。下面列举了一些关于备份的基础知识,以及一些常见做法容易掉进的陷阱。
- 复制存储在同一个磁盘上的数据不是备份,因为这个磁盘是一个单点故障(single point of failure)。
- 同步方案不是备份
- Dropbox 或者 Google Drive,当数据在本地被抹除或者损坏,同步方案可能会把这些“更改”同步到云端。
- RAID 磁盘镜像方案也不是备份。它不能防止文件被意外删除、损坏、或者被勒索软件加密。
- 不要盲目信任备份方案。用户应该经常检查备份是否可以用来恢复数据。
有效备份方案的几个核心特性是:版本控制,删除重复数据,以及安全性。
API(应用程序接口)
大多数线上服务提供的 API(应用程序接口)让你可以通过编程方式来访问这些服务的数据。
-
这些 API 大多具有类似的格式。它们的结构化 URL 通常使用
api.service.com
作为根路径,用户可以访问不同的子路径来访问需要调用的操作,以及添加查询参数使 API 返回符合查询参数条件的结果。 -
通常这些返回都是
JSON
格式,你可以使用jq
等工具来选取需要的部分。 -
有些需要认证的 API 通常要求用户在请求中加入某种私密令牌(secret token)来完成认证。大多数 API 都会使用 OAuth。
常见命令行标志参数及模式
--help
或-h
或者类似的标志参数(flag)来显示简略用法- 会造成不可撤回操作的工具一般会提供“空运行”(dry run)标志参数和“交互式”(interactive)标志参数
- 会造成破坏性结果的工具一般默认进行非递归的操作,但是支持使用“递归”(recursive)标志函数(通常是
-r
) --version
或者-V
标志参数可以让工具显示它的版本信息--verbose
或者-v
标志参数来输出详细的运行信息。多次使用这个标志参数,比如-vvv
,可以让工具输出更详细的信息(经常用于调试)--quiet
标志参数来抑制除错误提示之外的其他输出。- 使用
-
代替输入或者输出文件名意味着工具将从标准输入(standard input)获取所需内容,或者向标准输出(standard output)输出结果。 - 有的时候你可能需要向工具传入一个 看上去 像标志参数的普通参数,这时候你可以使用特殊参数
--
让某个程序 停止处理--
后面出现的标志参数以及选项(以-
开头的内容):rm -- -r
会让rm
将-r
当作文件名;ssh machine --for-ssh -- foo --for-foo
的--
会让ssh
知道--for-foo
不是ssh
的标志参数。
窗口管理器
大部分操作系统默认的窗口管理方式都是“拖拽”式的,这被称作堆叠式(floating/stacking)管理器。另外一种管理器是平铺式(tiling)管理器,其使用逻辑和 tmux 管理终端窗口的方式类似,可以让我们在完全不使用鼠标的情况下使用键盘切换、缩放、以及移动窗口。
- Linux
- awesome
- i3
- macOS
- yabai
- Divvy
- Windows
- FancyZones
VPN
使用了 VPN 最好的情况下也就是换了一个网络供应商(ISP)。所有你发出的流量看上去来源于 VPN 供应商的网络而不是你的“真实”地址,而你实际接入的网络只能看到加密的流量。
使用 VPN 只是把原本对网络供应商的信任放在了 VPN 供应商那里——网络供应商 能看到的,VPN 供应商 也都能看到。如果相比网络供应商你更信任 VPN 供应商,那当然很好。反之,则连接VPN的价值不明确。
Markdown
在不使用 Word 或者 LaTeX 等复杂工具的情况下,你可以考虑使用 Markdown 这个轻量化的标记语言(markup language)。
Markdown 致力于将人们编写纯文本时的一些习惯标准化。比如:
-
用
*
包围的文字表示强调(斜体),或者用**
表示特别强调(粗体); -
以
#
开头的行是标题,#
的数量表示标题的级别,比如:##二级标题
; -
以
-
开头代表一个无序列表的元素。一个数字加.
(比如1.
)代表一个有序列表元素; -
反引号 ```(backtick)包围的文字会以
代码字体
显示。如果要显示一段代码,可以在每一行前加四个空格缩进,或者使用三个反引号包围整个代码片段:就像这样
-
如果要添加超链接,将 需要显示 的文字用方括号包围,并在后面紧接着用圆括号包围链接:
[显示文字](指向的链接)
。
Hammerspoon (macOS 桌面自动化)
Hammerspoon 是面向 macOS 的一个桌面自动化框架。它允许用户编写和操作系统功能挂钩的 Lua 脚本,从而与键盘、鼠标、窗口、文件系统等交互。
下面是 Hammerspoon 的一些示例应用:
- 绑定移动窗口到的特定位置的快捷键
- 创建可以自动将窗口整理成特定布局的菜单栏按钮
- 在你到实验室以后,通过检测所连接的 WiFi 网络自动静音扬声器
- 在你不小心拿了朋友的充电器时弹出警告
资源:
Getting Started with Hammerspoon:Hammerspoon 官方教程
Sample configurations:Hammerspoon 官方示例配置
Anish’s Hammerspoon config:Anish 的 Hammerspoon 配置
开机引导以及 Live USB
在计算机启动时,BIOS 或者 UEFI 会在加载操作系统之前对硬件系统进行初始化,这被称为引导(booting)。
在 BIOS 菜单中你可以对硬件相关的设置进行更改,也可以在引导菜单中选择从硬盘以外的其他设备加载操作系统——比如 Live USB。
Live USB 是包含了完整操作系统的闪存盘。Live USB 的用途非常广泛,包括:
- 作为安装操作系统的启动盘;
- 在不将操作系统安装到硬盘的情况下,直接运行 Live USB 上的操作系统;
- 对硬盘上的相同操作系统进行修复;
- 恢复硬盘上的数据。
Live USB 通过在闪存盘上 写入 操作系统的镜像制作,而写入不是单纯的往闪存盘上复制 .iso
文件。你可以使用 UNetbootin 、Rufus 等 Live USB 写入工具制作。
Docker, Vagrant, VMs, Cloud, OpenStack
虚拟机(Virtual Machine)以及容器化(containerization)等工具可以帮助你模拟一个包括操作系统的完整计算机系统。虚拟机可以用于创建独立的测试或者开发环境,以及用作安全测试的沙盒。
- Vagrant:一个构建和配置虚拟开发环境的工具。它支持用户在配置文件中写入比如操作系统、系统服务、需要安装的软件包等描述,然后使用
vagrant up
命令在各种环境(VirtualBox,KVM,Hyper-V等)中启动一个虚拟机。 - Docker:一个使用容器化概念的与 Vagrant 类似的工具,在后端服务的部署中应用广泛。
- VPS(虚拟专用服务器):将一台服务器分割成多个虚拟专用服务器的服务
- 实现VPS的技术分为容器技术和虚拟机技术
- 受欢迎的 VPS 服务商有 Amazon AWS,Google Cloud、 Microsoft Azure以及DigitalOcean。
交互式记事本编程
交互式记事本可以帮助开发者进行与运行结果交互等探索性的编程。
现在最受欢迎的交互式记事本环境大概是 Jupyter。它的名字来源于所支持的三种核心语言:Julia、Python、R。
Wolfram Mathematica 是另外一个常用于科学计算的优秀环境。
GitHub
GitHub 是最受欢迎的开源软件开发平台之一。常用方法:
- 创建一个issue。 issue可以用来反映软件运行的问题或者请求新的功能。创建issue并不需要创建者阅读或者编写代码,所以它是一个轻量化的贡献方式。
- 使用pull request提交代码更改。pull request(拉取请求)是请求别人把你自己的代码拉取(且合并)到他们的仓库里。很多开源项目仅允许认证的管理者管理项目代码,所以一般需要fork这些项目的上游仓库(upstream repository),在你的 Github 账号下创建一个内容完全相同但是由你控制的fork仓库。这样你就可以在这个fork仓库自由创建新的分支并推送修复问题或者实现新功能的代码。完成修改以后再回到开源项目的 Github 页面创建一个pull request。
- fork这些项目的上游仓库(upstream repository),在你的 Github 账号下创建一个内容完全相同但是由你控制的fork仓库。
- 在自己的fork仓库自由创建新的分支并推送修复问题或者实现新功能的代码。
- 完成修改以后再回到开源项目的 Github 页面创建一个pull request。
- 提交请求后,项目管理者会和你交流pull request里的代码并给出反馈。如果没有问题,你的代码会和上游仓库中的代码合并。