missing semester - Potpourri

修改键位映射

修改键位映射通常由在计算机上运行的软件实现。当某一个按键被按下,软件截获键盘发出的按键事件(keypress event)并使用另外一个事件取代。比如:

  • 将 Caps Lock 映射为 Ctrl 或者 Escape:Caps Lock 使用了键盘上一个非常方便的位置而它的功能却很少被用到;

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

守护进程

守护进程是一种在后台保持运行,不需要用户手动运行或者交互的进程。

以守护进程运行的程序名一般以 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

FUSEFilesystem 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 文件。你可以使用 UNetbootinRufus 等 Live USB 写入工具制作。

Docker, Vagrant, VMs, Cloud, OpenStack

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

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

交互式记事本编程

交互式记事本可以帮助开发者进行与运行结果交互等探索性的编程。

现在最受欢迎的交互式记事本环境大概是 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里的代码并给出反馈。如果没有问题,你的代码会和上游仓库中的代码合并。
posted @ 2021-10-05 22:27  zju_cxl  阅读(126)  评论(0编辑  收藏  举报