配置 Rime 在 Vim 下退出编辑模式时自动切换成英文输入法

半年以前在 Obisidian 的文章下面有人曾经问过我一个问题,如何在 Vim 或者其他使用 Vim 模式的编辑器,比如 IntelliJ,或者 Obisidian 开启 Vim 模式后方便地切换中英文输入法,因为在编辑模式和普通模式下,需要经常切换输入法,使得体验变得非常槽糕。

rime vim mode auto switch

这个问题一直萦绕再我脑海里,直到今天再整理关于 Rime 相关的笔记的时候发现 macOS 下的 squirrel 支持了一个 vim_mode 选项,这使得我们可以在配置中定义在哪些应用中,当我们按下 Esc 的时候将 Rime 自动切换成英文状态。1

配置

squirrel.custom.yaml 配置文件中可以配置 vim_mode 这样的语句。

org.vim.MacVim:
  ascii_mode: true
  no_inline: true
  vim_mode: true

表示在 MacVim 应用中,当按下 Esc 的时候会自动将 Rime 切换成英文输入法。这样就可以节省 一次切换输入法的麻烦。

所以最后我的配置:

com.jetbrains.intellij:
  ascii_mode: true
  vim_mode: true
net.kovidgoyal.kitty:
  ascii_mode: true
  vim_mode: true
md.obsidian:
  vim_mode: true

2020-11-21 rime , macos , vim , vim-mode , input-method , ime , obsidian

Asus RT-AC86U 设置

前些天给家里买手机正好凑单了一个 Asus RT-AC86U,正好可以代替出了两次故障的小米 3G

提前工作

  • 管理后台启用 SSH (系统管理 - 系统设置 - 服务 - 启用 SSH)
  • 开启 JFFS 分区,系统管理 - 系统设置 - Persistent JFFS2 partition - Enable JFFS custom scripts and configs
  • U 盘格式成 ext4 插到路由器
  • 一个已经刷成 Merlin 固件 的路由器

在 Merlin firmware 下安装 Entware

Entware 是一个嵌入式设备的包管理工具,之前在 QNAP NAS 上也有安装过。

梅林内置了 entware 安装脚本,直接在终端执行:

entware-setup.sh

执行后 entware 会把软件安装在 /opt 目录下。

在安装 Entware 的时候记得一定保证网络环境畅通,否则下载下来的不完整的 opkg 二进制可能有各种问题,要不就是 Permission denied, 要不就是 Segmentation fault。

amtm terminal menu

在安装了 Entware 之后,就可以非常方便的进行常用的包安装,比如安装 rsync:

opkg update
opkg install rsync

或者安装更加复杂的应用,比如说在路由器上

等等很多特性,都可以在官方提供的页面 看到。

设置 Swap 分区

在之前的 Linux swap 分区 的文章里面提过,Swap 分区会在系统物理内存将满的时候被使用,虽然 AC86U 自身具备了 500 多兆的内存,但是如果跑多了应用可能会很快被用尽。所以如果看到内存将被用满,可以尝试创建 swap 分区。

如果是 Merlin 的固件,通过 SSH 登录后台之后直接运行 amtm,这是梅林固件自带的一个终端管理工具,在其中可以非常快速的通过交互命令创建 swap 分区。如果想手动创建也可以通过如下的方式纯手工进行设置。1

依次执行:

dd if=/dev/zero of=/tmp/mnt/sda1/swapfile bs=1024 count=512000
mkswap /tmp/mnt/sda1/swapfile
swapon /tmp/mnt/sda1/swapfile

然后,创建启动脚本:

echo '
#!/bin/sh

# Turn On Usage Of Swapfile
if [ -f "/tmp/mnt/sda1/swapfile" ];then
swapon /tmp/mnt/sda1/swapfile
echo "Turning Swapfile On"
fi
' >> /jffs/scripts/post-mount

增加执行权限:

chmod a+rx /jffs/scripts/*

这样系统每一次重启就会自动的使用该 swap 分区。

其他工具

可以通过 amtm 安装其他工具,比如:

dnscrypt-proxy, skynet, diversion, mini dns-server

2020-11-13 router , asus , 路由器 , linux , ssh , entware

扩展 Proxmox 系统分区以及 Proxmox 文件系统初识

昨天想要扩展一下之前安装的 Proxmox 容量,对系统进行了一次关机,然而关机之后就悲剧的发现在 U 盘中的系统启动不了了,将 U 盘拔下检测之后发现 U 盘可能挂了,一个全新的 U 盘,在连续 192 天运行之后挂掉了。无奈之下只能想办法先恢复一下 Proxmox 系统以及安装在系统之上的 OpenMediaVault 了。

恢复的过程倒也是很麻烦,只不过这一次想稳定一些,将系统还是安装在一块之前主力机上淘汰下的 SSD 上吧,所以用 Clonezilla 先备份 SSD 上的系统,然后将之前 U 盘上的 Proxmox 系统恢复到 SSD 上,做完之后发现 Clonezilla 实际上是将整块 U 盘上的分区表,分区一并搬到了 SSD 上,所以在磁盘里面能看到实际 Proxmox 系统只是占用了 32G 的大小。那这个时候就需要将现在的 Proxmox 分区扩展到整块磁盘了。

这个时候就需要复习之前整理过的两个命令了 fdiskparted。fdisk 用来查看磁盘的分区详情,然后使用 parted 对磁盘分区进行扩容。

不过在进入正题之前,先提前警告一下,对磁盘的操作请格外小心,请先备份好数据,或者找一块闲置的磁盘进行操作,否则可能丢失整块磁盘的数据!

前提知识

Proxmox 的文件系统

在正式进入之前先来回顾一下 Proxmox 的文件系统,在全新安装的 Proxmox 系统上可以看到一块硬盘被划分了三个分区。

[email protected]:~# fdisk -l /dev/sdd
Disk /dev/sdd: 232.9 GiB, 250059350016 bytes, 488397168 sectors
Disk model: Samsung SSD 850
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: AC6AD606-ED82-475B-A813-7----------2

Device       Start       End   Sectors   Size Type
/dev/sdd1       34      2047      2014  1007K BIOS boot
/dev/sdd2     2048   1050623   1048576   512M EFI System
/dev/sdd3  1050624 488397134 487346511 232.4G Linux LVM

上面已经是我扩容后的结果,扩容之前 sdd3 这个分区只有不到 30G。

说明:

  • BIOS boot 分区是 GNU GRUB 来引导基于 Legacy BIOS 但是启动设备上有 GPT 格式分区表的操作系统时使用的分区。
  • EFI System 分区是一块 FAT32 格式的分区,存储 EFI 引导程序以及启动时固件使用的应用程序。
  • Linux LVM 分区则是系统真正可以使用的分区。LVM 是逻辑卷管理器,可以用来创建和管理逻辑卷,而不是直接管理磁盘,这就使得我们之后对分区大小进行调整变得可能。对 LVM 逻辑卷的扩大缩小并不会影响其中的已存储的数据。

接下来再来看看 LVM 分区下的逻辑卷。

Disk /dev/mapper/pve-swap: 3.5 GiB, 3758096384 bytes, 7340032 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/mapper/pve-root: 7 GiB, 7516192768 bytes, 14680064 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk /dev/mapper/pve-vm--100--disk--0: 32 GiB, 34359738368 bytes, 67108864 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 65536 bytes / 65536 bytes
Disklabel type: dos
Disk identifier: 0x4236f4d0

Device                                 Boot    Start      End  Sectors  Size Id Type
/dev/mapper/pve-vm--100--disk--0-part1 *        2048 56868863 56866816 27.1G 83 Linux
/dev/mapper/pve-vm--100--disk--0-part2      56870910 67106815 10235906  4.9G  5 Extended
/dev/mapper/pve-vm--100--disk--0-part5      56870912 67106815 10235904  4.9G 82 Linux swap / Solari

fdisk -l 的输出可以看到 Proxmox 创建了三个逻辑卷分区:

  • /dev/mapper/pve-swap 是 swap 分区
  • /dev/mapper/pve-root 是 Proxmox 的 root 分区 7 GB
  • /dev/mapper/pve-vm--100--disk--0 则是我在其中安装的 OpenMediaVault 划分给了它 32 GB 空间

使用 lvdisplay 可以看到逻辑卷的详细信息。可以看到 /dev/mapper/pve-root 就是 pve 卷组里面的逻辑卷。

[email protected]:~# lvdisplay
  --- Logical volume ---
  LV Path                /dev/pve/swap
  LV Name                swap
  VG Name                pve
  LV UUID                cYatZ5-kif7-n8N2-v9c5-UOlb-wfLJ-qt35G7
  LV Write Access        read/write
  LV Creation host, time proxmox, 2020-11-10 18:42:21 +0800
  LV Status              available
  # open                 2
  LV Size                3.50 GiB
  Current LE             896
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:0

  --- Logical volume ---
  LV Path                /dev/pve/root
  LV Name                root
  VG Name                pve
  LV UUID                dc0VlK-7DSo-lgzw-7Zxy-aK3s-jlTc-TPOmDA
  LV Write Access        read/write
  LV Creation host, time proxmox, 2020-11-10 18:42:22 +0800
  LV Status              available
  # open                 1
  LV Size                7.00 GiB
  Current LE             1792
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:1

  --- Logical volume ---
  LV Name                data
  VG Name                pve
  LV UUID                oNuSZd-JoDA-1jPW-Wdcs-q59D-vuDx-fDnUab
  LV Write Access        read/write
  LV Creation host, time proxmox, 2020-11-10 18:42:22 +0800
  LV Pool metadata       data_tmeta
  LV Pool data           data_tdata
  LV Status              available
  # open                 2
  LV Size                219.88 GiB
  Allocated pool data    1.72%
  Allocated metadata     1.84%
  Current LE             56290
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:4

到这里其实就能看到 Proxmox 安装的时候实际上创建了一个叫做 pve 的卷组 (Volume Group),然后在上面分别创建了 swap, root, data 三个逻辑卷 (Logical Volume)。

什么是 LVM

LVM 是 Logical Volume Manager 逻辑卷管理的简称。

LVM 对底层的物理磁盘进行封装,向上以逻辑卷的形式提供。当上层的应用要访问文件系统的时候,不是通过直接操作分区,而是通过 VLM 的逻辑卷,对底层的磁盘进行管理。

LVM 最大的特点是可以对磁盘进行动态管理,逻辑卷大小可以在变更文件内容情况下动态调整。

基本术语

存储介质,系统的存储设备,比如常见的硬盘等等。

Physical Volume 物理卷,物理卷在逻辑卷管理中的最底层,实际上是物理硬盘的分区,也可以是整个物理硬盘。

Volume Group 卷组,建立在物理卷之上,一个卷组至少要包括一个物理卷,卷组建立之后可以动态添加物理卷到卷组中。逻辑卷管理系统中可以只有一个卷组,也可以拥有多个卷组。

Logical Volume 逻辑卷,建立在卷组之上,卷组中未分配的空间可用于建立新的逻辑卷,逻辑卷建立之后可动态地扩展和缩小空间。

扩容过程

如果 Proxmox 没有安装 parted 先安装:

apt update && apt install -y parted

安装后再执行 parted -l 列出分区信息。

如果有弹出 Fix/Ignore 的提示,输入 Fix 快速修复。

扩容分区

使用 fdisk -l 来查看 Proxmox 在哪一块磁盘,以及磁盘上的分区信息,文章之前以及提过,可以看到 Proxmox 划分的三个分区没有完全利用 SSD 的全部空间。

对于我的系统,我的 Proxmox 安装在 sdd 这块硬盘上,使用 parted 对磁盘分区进行操作:

parted /dev/sdd

进入交互模式后,可以使用 print 来查看分区信息,可以看到 LVM 分区只用了很小一部分空间,扩容:

resizepart 3 100%

这里的 3 指的是分区编号,一定小心。

然后退出:

quit

这个时候已经将磁盘剩余的空间都划分给了 /dev/sdd3

可以使用 fdisk -lparted 的 print 来查看。

[email protected]:~# parted /dev/sdd
GNU Parted 3.2
Using /dev/sdd
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) print
Model: ATA Samsung SSD 850 (scsi)
Disk /dev/sdd: 250GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number  Start   End     Size    File system  Name  Flags
 1      17.4kB  1049kB  1031kB                     bios_grub
 2      1049kB  538MB   537MB   fat32              boot, esp
 3      538MB   250GB   250GB                      lvm

更新物理卷的大小:

pvresize /dev/sdd3

提示更新成功。

扩容逻辑卷

查看 Proxmox 的逻辑卷内容,cat /etc/pve/storage.cfg 可以看到:

[email protected]:~# cat /etc/pve/storage.cfg
dir: local
        path /var/lib/vz
        content iso,backup,vztmpl

lvmthin: local-lvm
        thinpool data
        vgname pve
        content rootdir,images

local-lvm 是对应着 vgname 这个叫做 pve 的 Volume Group 中的 data 名字的逻辑卷。

使用 lvdisplay 可以看到:

  --- Logical volume ---
  LV Name                data
  VG Name                pve
  LV UUID                oNuSZd-JoDA-1jPW-Wdcs-q59D-vuDx-fDnUab
  LV Write Access        read/write
  LV Creation host, time proxmox, 2020-11-10 18:42:22 +0800
  LV Pool metadata       data_tmeta
  LV Pool data           data_tdata
  LV Status              available
  # open                 2
  LV Size                29.88 GiB
  Allocated pool data    1.72%
  Allocated metadata     1.84%
  Current LE             56290
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:4

这里的 LV Size 就是逻辑卷的大小。

然后使用 pvs 查看物理卷的使用情况,在 PFree 里面能看到有很大部分的空间是没有使用的。

然后利用 lvextend 命令进行逻辑卷的扩容:

lvextend -l +100%FREE /dev/pve/data

上面的命令会将 100% 空间划分给 data,如果只想要增加 10 GB,那么:

lvextend -L +10G /dev/pve/data

如果熟悉 lvresize 也可以:

lvresize --extents +100%FREE --resizefs /dev/pve/data

然后可以使用 pvslvdisplay 进行查看。

reference


2020-11-10 proxmox , linux , nas , openmediavault , system , fdisk , partition , gpt , clonezilla

『译』我最喜欢的命令行工具

偶然间看到一篇介绍 cli 的文章,感觉写得不错,正好借此机会也整理一下我之前使用过,以及觉得非常值得推荐的 CLI 工具。

下面就是译文全文。原文可以见 https://switowski.com/blog/favorite-cli-tools

下面是一个很长的列表,如果觉得不想完整的看完,这里提供一个简介。

fish-shell

官网:https://fishshell.com/

每一次打开终端使用最多的就是 Shell。过去我使用过 Bash 和 Z shell,但是现在我使用 fish。这是一个非常棒的 shell,拥有很多开箱即用的特性,比如自动提示 (auto suggestions), 语法高亮,或者是切换文件夹 (⌥+Left 或者 ⌥+Right)。

换句话说,这对新手非常友好,你不需要设置任何东西。但是另一方面,fish 使用不同于其他 shell 的另一种语法,所以通常你并不能直接复制粘贴来使用互联网上的脚本。你要不就是将脚本改成适合 fish scripts 语法,要不就只能打开一个 Bash 会话来执行脚本。我能理解 fish 背后不兼容的原因 (Bash 是一门不是那么容易理解的语言)。我很少编写 bash/fish 脚本,所以每一次使用都得从头再来。并且相较于 bash 脚本,fish 脚本的资料更少,所以我通常就只能阅读文档,而不是从 StackOverflow 来复制拷贝已经编写好的脚本。

是否要推荐 fish ? 答案是 Yes!切换 Shell 非常简单,尝试一下吧。尤其是当你不喜欢对你的 Shell 修修补补,或者想要通过最少的配置来达到很好的效果。

Fish plugins

你可以通过给 fish 安装插件来扩展功能。通过插件管理工具可以非常轻松的安装和管理,比如 Fisher, Oh My Fish,或者 fundle

目前我只使用三个插件:

  • franciscolourenco/done,当长时间执行的脚本完成后发送系统通知。我不会长时间开着终端,而是使用 Guake style 终端,当我需要的时候从屏幕的上方显示,当我不需要的时候就隐藏。使用这个插件的时候,当我执行一个耗时比较长的任务的时候,当完成的时候会发送一个桌面通知。
  • evanlucas/fish-kubectl-completions, 提供了 kubectl 命令的自动补全。
  • fzf,将 fzf 和 fish 集成 (见 fzf)

过去我常常会使用很多插件 (rbenv, pyenv, nodenv, fzf, z),但我切换到一个不同的 shell 来避免拖慢我的 shell。

如果你想了解更多 fish 的资料,可以查阅 awesome-file 这个仓库。和 Z shell 和 Bash 相比,fish 只有更少的插件,如果你经常调整你的 Shell,这可能不是最好的选择。但是对我而言,这却是一个益处,这使得我不再启用很多的插件,然后再抱怨太慢。

Starship

官网:https://starship.rs/

如果要我在这个列表里面选择一个最喜欢的工具,那就是 Starship。Starship 是一个终端提示 (prompt),它可以和任何 Shell 搭配使用。如果你安装了它,你只需要在 .bashrc / .zshrc / config.fish 中添加一行即可。

它可以显示:

  • 当前目录的git status 信息,以及不同的标识来显示是否有新文件,或者有更改等等。
  • 如果你在一个 Python 项目目录下会显示 Python 的版本 (同样的道理在 Go/Node/Rust/Elm 等等其他语言中也一样)
  • 命令执行的时间(如果超过几秒钟的话)
  • 如果上一个命令失败了会有错误提示

z

官网:https://github.com/rupa/z

my cli z

z 可以让你在文件系统中快速跳转。它会记住你曾经访问过的文件夹路径,经过一段时间后,你可以快速的直接使用 z path 来跳转。

比如,我经常访问的目录 ~/work/src/projects,我可以直接执行 z pro 然后立即跳转过去。z 的算法基于频率,基于频率和最新访问的组合。如果它记住了一个不常使用的目录,你可以在任何时间手动移除它。

这个工具大大地提高了在常用的目录间切换的效率,并且节省了大量的击键次数。

fzf

my cil fzf

fzf 表示 “fuzzy finder”, 这是一个通用工具,可以让你来查找文件,历史中的命令,进程名,git 提交历史,和其他更多的模糊查找。你可以敲入一些字母,然后尝试在结果中匹配这些字母。敲入的字母越多,搜索结果越精确。你可能在代码编辑器中曾经看到过这种搜索,当你想要打开一个文件,你不需要敲入完整的路径,只需要敲入部分文件的名字,这就是模糊搜索。

我通过 fish fzf 插件 来使用,我可以快速找回历史命令,或者快速打卡一个文件。

fd

my cli fd

find 命令类似,但是易用,更快,并且拥有一个默认的设置。

如果你想找一个叫做 invoice 的文件,但是你不确定它的扩展名? 或者你想要找一个放着所有发票的文件夹?你可以卷起袖子开始为 find 命令编写正则表达式,或这直接运行 fd invoice

默认情况下,fd 会忽略任何在 .gitignore 中列出的文件和目录。大部分情况下,这就是你想要的,但是对于那些极特殊的情况,我有一个 alias : fda='fd -IH'

输出的结果是带颜色的,并且根据 benchmarks,它甚至比 find 要快。

ripgrep

my cli rg

fd 类似,ripgrepgrep 的一个代替品,并且非常快,健全的默认值以及彩色的输出结果。

它会跳过在 .gitignore 中定义的文件,以及隐藏的文件,你可以设置 alias: rga='rg -uuu'。他会禁用所有的智能过滤,让 ripgrep 和普通的 grep 一样。

htop and glances

在 Linux 或者 Mac 上显示进程信息的工具就是 top,他是每一个系统管理员的好朋友。即使你通常在开发网站,也是一个不错的工具。你可以查看是否是你的 Docker 或者 Chrome 吃光了你的 RAM。

my cli htop

top 工具非常基础,所以大部分的人切换到了 htophtop 在此基础上,增加了颜色,拥有丰富的选项,并且用起来非常方便。

my cli glances

glances 是 htop 的一款互补的工具。除了列举了所有进程的 CPU 和内存使用,它还展示系统一些其他额外的信息。

你可以看到:

  • 网络或磁盘的使用
  • 文件系统使用以及全部的空间
  • 其他 sensor 的数据,比如电池
  • 最近使用了大量资源的进程

我使用 htop 来快速过滤并杀死进程,但是我使用 glances 来快速查看电脑的状态。Glances 提供了 API,Web UI,等等不同的输出格式,这样你就可以将系统的监控带到另一个层级。

virtualenv and virtualfish

virtualenv 是一个用来创建 Python 虚拟环境的工具。

pyenv, nodenv and rbenv

Pyenv, nodenv, and rubyenv 是用来管理不同版本的 Python,Node,和 Ruby 的工具。

my cli pyenv

最近我又发现了一个叫做 asdf 的工具, 可以用来代替 pyenv, nodenv, rbenv, 和其他 envs 工具。它提供了几乎任何语言的版本控制。

pipx

virtualenv 解决了 Python 包管理的问题,但还剩下一个问题。如果我想全局安装一个 Python package (因为这是一个独立的工具,比如 glances)。在虚拟环境之外安装包是一个不好的主意,可能导致未来的问题。但换一个角度,如果我决定使用 virtual environment, 那么每一次我想使用这个工具,我都需要重新激活这个 virtual environment。这不是一个方便的解决方法。

那么 pipx 解决的就是这样的问题,它会将 Python 安装到一个独立的环境中(这样他们的依赖就不会冲突)。但是,与此同时,CLI 工具是全局可访问的。我不需要激活任何东西,pipx 帮我完成了一切。

如果想要了解更多 Python 工具的使用,以及作者如何使用它们,作者在 PyCon 2020 会议上做了一次分享 “Modern Python Developer’s Toolkit”,这是伊恩两小时的教程,如果感兴趣可以观看这个录制的视频

ctop and lazydocker

my cli ctop

当你使用 Docker 时,你会发现这两个工具非常有用。ctop 是一个给 Docker 容器的 top-like 界面,它可以:

  • 显示当前正在运行或者已经停止的容器
  • 每一个容器的内存,CPU 等等信息
  • 一个快速的菜单来停止,杀死,或者显示给定容器的日志

这要比使用 docker ps 来显示这些信息来得方便许多。

如果你觉得 ctop 很 cool,那么尝试一下 lazydocker 吧!这是一个用来管理 Docker 成熟的终端 UI 界面。

一些我不是每天使用的工具 Tools that I don’t use every day

除了上面提到的这些我每天在使用的工具,还有一些我收集了数年,并且发现在特定场景非常有用的工具。比如说录制终端的 GIF(可以让你暂停并且复制文字),显示文件夹结构,连接数据库的工具等等。

Homebrew

如果你使用 Mac ,那么 Homebrew 自然无须多言,这是一个事实上的 macOS 包管理。它甚至还有一个 GUI 的版本 Cakebrew.

asciinema

asciinema 是一个可以用来录制终端会话的工具。但是不像其他的 GIF 录制工具,它可以允许观看的人选择并复制录制过程中的代码。

这对于录制编程教程非常有用,没有什么能比敲入一大串长长的命令要令人沮丧的了。

colordiff and diff-so-fancy

my cli colordiff

我现在很少在终端中比较两个文件的差异了,但是如果你经常做,那么尝试用 colordiff 代替 diff 命令。colordiff 命令会给结果着色,这样就非常容易文件的差异了。

如果运行 git diff 或者 git show,那么还有一个更好的工具叫做 diff-so-fancy,它提供了:

  • 高亮变化的单词,而不是整行
  • 简化了变化文件的 headers
  • 省去了加号和减号,已经有了颜色
  • 显示新增和删除的空行

tree

如果你想要展示给定文件夹的内容,tree 是一个首选的工具 (go-to tool)。它会显示所有的子目录和其中的文件,并以 tree 的显示显示。

bat

和 cat 类似用来显示文件内容,但是更好,增加了语法高亮,git gutter marks(当可用的时候), 自动翻页(如果文件很大的话),最后就是让文件更易读。

httpie

如果你需要发送一些 HTTP 请求,你可能会发现 curl 不是非常易用,那么尝试一下 httpie.

tldr

地址:https://tldr.sh/

my cli tldr

更简单的 man pages,”man pages” 是 Linux 软件的手册,解释了如何使用这些命令。尝试一下运行 man cat 或者 man grep。但是 man 手册通常非常详细,并且有些复杂一些的命令可能需要花一些时间来理解。tldr 是一个社区驱动的项目,提取了 man page 中重要的内容提供一些简洁的例子。

tldr 提供了大部分的命令行工具例子,这是社区的力量,但是也有很小的可能其他人编写的文档可能会误导你。但是大部分的情况下,还是能够找到你想要的内容。

比如你想要 gzip 压缩一些文件,man tar 大量的说明可能使得你无从下手,但是 tldr tar 显示了常用的例子,你可以立刻知道你想要的内容。

exa

exa 是一个 ls 的代替。

彩色的显示输出,将文件大小转换成可读的,并且保持了 ls 的速度。

litecli and pgcli

地址:https://litecli.com/https://www.pgcli.com/

SQLite 和 PostgreSQL 的首选 CLI 工具,它提供了自动补全以及语法高亮,他们比默认的 sqlite3psql 好用多了。

mas

地址:https://github.com/mas-cli/mas

mas 是 App store 的命令行版本。它用来初始化的时候设置 Macbook,并且可以写成脚本来复用。

mas 可以让我自动安装命令,而不需要在 App Store 中点点点。既然你在阅读 CLI 相关的文章,那么我假设,你和我一样,不喜欢 Click。

ncdu

官网地址:https://dev.yorhel.nl/ncdu

my cli ncdu

ncdu 是终端中的磁盘分析工具。快并且易用。

最后

本文的作者叫做 Sebastian,是一位 Python 开发者,我征得其同意后 翻译了这篇文章。作者介绍了不少很好的工具,我之前也有再用,同时也介绍了不少我第一次听说的工具,比如 SQLite 和 PostgreSQL 的连接工具。总之这是一篇不错的文章,分享一下。


2020-10-30 cli , linux , mac , tools , terminal , zsh , shell , fd , fzf

使用 Clonezilla 将硬盘中系统恢复到虚拟机中

今年陆陆续续将工作的环境迁移到了 macOS,虽然已经把日常的资料迁移到了 macOS,但是之前的 Linux 上还有一些配置,以及可以的一些测试还需要用到 Linux 虚拟机,所以我就想能不能用 Clonezilla 将磁盘中的系统备份然后恢复到虚拟机里面。因为我发现 macOS 下的 Fusion 还是很强大的。

之前已经写过使用 Clonezilla 备份和恢复系统使用 Clonezilla 克隆系统, Clonezilla 恢复系统时可能遇到的问题 ,这里关于备份的部分就不再赘述。

准备工作

开始之前需要先准备几个东西:

  • 备份好的系统镜像,最好是能放到移动硬盘中
  • Clonezilla ISO 镜像
  • 安装好的 Fusion 软件
  • 足够的空间可以恢复系统镜像

恢复工作

通过 Clonezilla 将整块硬盘备份成为 Images,然后在 Fusion 中新建虚拟机 Ubuntu 64 bit 类型。

  • 在新建的虚拟机设置中,CD/DVD (SATA) 中装载 Clonezilla 的 ISO 镜像。
  • 在 USB & Bluttooth 中,Advnaced USB options,将 USB Compatibilty 选为 USB 3.1
  • 在 Startup Disk 中选择 CD/DVD 作为启动设备
  • 启动虚拟机
  • 这个时候会进入 Clonezilla 的界面,之后的步骤就和在 Clonezilla 中恢复一个 Image 一样了。等待恢复一段时间即可完成。

问题

问题: The device ‘xxx’ was unable to connect to its ideal host controller.

在虚拟机设置 USB 设置里面,确保使用 USB compatibility 3.0 以上。

具体解决方法:

  • 关闭虚拟机
  • 到 Settings -> USB & Bluetooth 设置中,可以看到插入的 USB 设备
  • 在 Advance USB options 中
    • USB compatibility: USB 3.1
  • 启动虚拟机,启动后在 UBS 设置中勾选需要分享的 USB 设备

from: https://communities.vmware.com/t5/VMware-Fusion-Discussions/USB-3-0-support/m-p/1288281


2020-10-29 clonezilla , system , fusion , vmware , virtual-machine , linux , restore

IPFS 介绍

IPFS 的全称是 「InterPlanetary File System」,直译过来叫做「星际文件系统」,这是一个点对点的媒体传输协议,目的是为了建立一个持久的,分布式的文件系统。1

A peer-to-peer hypermedia protocol designed to make the web faster, safer, and more open.

IPFS 允许用户不仅接受文件,并且可以托管文件内容,类似 BitTorrent 协议的方式。和中心化的系统不一样的地方在于,IPFS 构建了一个去中心化的系统,任何用户都可以存储所有数据的部分,创建了一个可以快速恢复的文件存储和分享系统。

任何用户都可以通过内容地址来分享文件,网络中的任何对等节点都可以通过分布式散列表 (Distributed Hash Table DHT) 来查找和请求文件内容。

源码:https://github.com/ipfs

IPFS 网络和传统网络的区别

首先,让我们来看一下目前的互联网,现在互联网上的大部分内容都依赖于一些大型或小型的服务器托管商。如果你要架设一个网站,你需要花钱购买一个服务器,或者能够托管内容的提供商,然后将产生的内容放置到服务中。而对于 IPFS ,任何人都可以注册一个节点,开始托管自己的内容,不管是在 Respberry Pi 上,还是跑在世界上最大的服务器中,你的节点都可以成为一个非常高效的节点。

第二点区别在于,IPFS 的数据是内容寻址 (content-addressed),而不是地址寻址 (location-addressed). 这是一个微妙的区别,但是结果却是巨大的。

目前如果你打开浏览器,输入 example.com,你是告诉浏览器「帮我获取存放在 example.com 的 IP 地址的数据」,这可能存放在 93.184.216.34 这台服务器中,然后你就请求这个 IP 地址的内容,然后服务器会将相关的内容返回到浏览器。(当然现代网络依赖的 DNS 系统,以及浏览器内部的实现细节这里就略过)。所以基本的逻辑是,你告诉网络你要查找地址,然后互联网会将找到的内容返回。

但是 IPFS 扭转了这一逻辑。

在 IPFS 网络中,每一个存放在系统的单一区块数据都会生成一个由自身内容产生的密码散列 (Hash),也就是说,每一个块都会有一个唯一的由字符串和数字组成的串。当你想要在 IPFS 网络中获取数据时,你会请求这一个 HASH,所以并不是请求网络说「告诉我存放在 93.184.216.34 这个地址的内容」,而是说「请将 Hash 值为 QmXnnyufdzAWL5CqZ2RnSNgPbvCc1ALT73s6epPrRnZ1Xy 的内容告诉我」,而 QmXnnyufdzAWL5CqZ2RnSNgPbvCc1ALT73s6epPrRnZ1Xy 正好是一个包含了 “I’m trying out IPFS” 的 .txt 文件的 Hash。

那这样做有什么好处呢?

首先,这使得网络更有弹性,Hash 值是 QmXnnyufdzAWL5CqZ2RnSNgPbvCc1ALT73s6epPrRnZ1Xy 的内容可能被存放在成千上万的节点中,即使有一个节点 Crash 或者下线了,也不影响其他缓存过这个 Hash 的其他节点。

第二,这个方式提高了安全级别。比如说你想要某一个 Hash 的文件,所以你向网络请求,给我 Hash 值是 QmXnnyufdzAWL5CqZ2RnSNgPbvCc1ALT73s6epPrRnZ1Xy 的内容,然后网络响应请求,然后发送数据。当你接受了所有的数据,你可以重新计算 Hash,如果数据在传输的过程中被更改了,那么你重新计算的 Hash 就和请求的 Hash 不一致。你可以想象 Hash 就像是文件的唯一指纹。如果你接收到了一个和希望的不一致的内容,他们将拥有不同的指纹。这意味着这个方式实现的网络会知道这个内容是否被篡改了。

IPFS 解决的问题

和传统的互联网相比,IPFS 不仅解决了内容从互联网消失的问题,并且在抵抗审查,抵抗大规模监控等等方面都要比传统的互联网要有优势。

IPFS 地址和密码散列

既然上面提到了 content-addressed 系统的独特性,这就值得再来聊一聊 IPFS 地址是如何产生的。

每一个 IPFS 地址都是一个 multihash,这意味着每一个地址既包含了 Hash 算法也包含了 Hash 值。

IPFS multihashes 有三个不同的部分:

  • multihash 的第一个字节 (byte) 表示产生这个 Hash 的算法
  • 第二个 byte 表示 Hash 的长度
  • 剩下的 byte 表示 Hash 的结果

默认情况下,IPFS 使用 SHA-256 Hash 算法,会产生一个 32-byte 的 Hash。然后使用 Base58 来表示,这也就是为什么每一个 IPFS 地址都以 Qm... 开头。

虽然 SHA-256 算法是当今的标准,但是这个 multihash 格式允许 IPFS 协议自由的更改 Hash 算法。这就使得 如果在未来发现了 SHA-256 算法的缺陷,IPFS 网络可以迁移到另外的算法。如果有人使用其他的 Hash 算法,那么最后的地址可能就不是以 Qm 开头了。

IPFS 可以做什么?

经过上面这么多解释可以知道,IPFS 本质上是一个分布式的文件共享系统,所以互联网能用来做什么,IPFS 也能做到。并且 IPFS 可以做的更好。

适合下面的场景:

  • 归档文件,IPFS 自身会进行去重,并且提供了非常庞大的存储能力,适合归档文件
  • 提供服务,IPFS 提供了安全的点对点文件传输,非常适合文件的分发,尤其是在分发大文件时可以节省大量的带宽。

IPFS Gateway

IPFS Gateway 网关提供了互联网用户访问托管在 IPFS 网络上内容的一种能力。ipfs.io 网关是由社区运营由 Protocol Labs 资助以帮助开发者的工具。

其他一些公共的网关可以在这个列表里面找到

如果想要了解更多 IPFS Gateway 相关的内容,可以到 https://docs.ipfs.io/concepts/ipfs-gateway/ 了解。

上传文件到 IPFS

上传到 IPFS 网络的第一张图。

https://ipfs.io/ipfs/QmcTzSJspTbafYWR1B8RqncNcvsaxnKQJmbtTU6GUkLJ8j

目录

IPNS

IPFS 使用基于文件的寻址,这就使得分享文件的时候会有一大串的 Hash,并且一旦更新文件后,就会产生一个新的 Hash 值。

IPNS 全称是 The InterPlanetary Name System,IPNS 就是用了创建可以用于更新的地址。

IPNS 中的名字是一个公开密钥的 Hash,它会和一条记录相对应,这条记录被对应的私钥签名。新的记录可以被多次发布。

ipns 的地址会有一个前缀:

/ipns/yourname

拥有这样一个机制后就可以通过自己设定绑定到 IPFS Hash 的记录,然后通过该记录来访问。

使用如下命令会返回节点 ID

ipfs name publish QmQsLcmxzAh7Y6Ho1Nt8bispVmeHqjzdGBjG5m8KoGYjGi

使用 ipfs id 查看节点 ID。复制这一步的节点 ID,验证

ipfs name resolve your_ID

同样的 ID 可以使用 IPNS 来访问。

注意这里 URL 的 ipns 区别。

如果想要发布一个友好的地址,也可以使用 DNSLink

IPFS 允许用户直接使用现有的域名,这样就可以用一个简单的域名来访问。

只需要在 DNS 解析里面增加一条 TXT 记录,指向:

dnslink=/ipns/12D3KooWMrZpzzoSA2uxZiQ8NSizEK9A8SduhxcAc4yUB8imxXqU

Pin files

IPFS 节点默认情况下会将文件认为是缓存 (cache),这意味着 IPFS 不会一直保存着文件。Pinning 一个文件就是告诉 IPFS 节点将这个文件视为重要的文件,不要抛弃这个文件。

常见的 ipfs 命令

将本地文件添加到 IPFS

ipfs add filename

同理增加文件夹

ipfs add -r directory

获取一个远程的文件,并指定一个名字,但是不 pin 它:

ipfs get hash -o outputname

pin 一个远程的文件

ipfs pin add hash

显示本地 pin 过的文件

ipfs pin ls

从本地 unpin 一个文件

ipfs pin rm hash

移除本地 unpinned 的文件:

ipfs repo gc

IPFS 私人网络

使用密钥工具,创建密钥:

<https://github.com/Kubuxu/go-ipfs-swarm-key-gen>

然后将密钥放到 IPFS 默认配置下 ~/.ipfs/

然后启动 ipfs init,默认情况下连接的是公网节点,如果要连接私有网络,删除所有的启动节点,然后手动添加自己的节点:

ipfs bootstrap rm --all
ipfs bootstrap add node

查看节点:

ipfs swarm peers

在 IPFS 网络镜像本网站

最后借助 fleek 可以快速的将 GitHub 中托管的静态网站镜像一份到 IPFS 网络。

reference


2020-10-20 ipfs , distribute-network , internet , file-sharing

使用 zinit 管理 zsh 插件

一直使用的 antigen 来管理 zsh 的插件,但是最近 zsh 加载因为加了一些插件变的非常慢,所以就像找找办法提速 zsh,在查询的过程中发现 antigen 已经很久没有更新,很多人推荐 antibody, 于是又试了一下 antibody, 不过在调研的过程中又发现了 zinit. 之后经过对比,发现 antibody 所谓的并行执行也没有提速很多,反而是名不见经传的 zinit 通过配置将加载时间稳稳的降低,在新建终端时几乎立即可见。

zinit

zinit 在众多的 zsh 插件管理工具中是一个比较小众的工具,但是因为其具备的 Turbo mode 可以显著的提升加载的速度。它通过在后台加载插件的方式提速。

配置

load light

可以使用 loadlight 来加载插件。

zinit load zdharma/history-search-multi-word
zinit light zsh-users/zsh-syntax-highlighting

说明:

  • load 加载的插件可以使用 zinit report 来查看加载过程
  • light 稍微比 load 快一些,但看不了 report

Oh My Zsh, Prezto

zinit 也可以加载 Oh My Zsh 和 Prezto 的插件,使用 snippet 关键字。snippet 会使用 wget, curl 等检测到的工具下载指定的单个文件。

zinit snippet 'https://github.com/robbyrussell/oh-my-zsh/raw/master/plugins/git/git.plugin.zsh'
zinit snippet 'https://github.com/sorin-ionescu/prezto/blob/master/modules/helper/init.zsh'

这两个工具比较常见,所以也可以使用内置的缩写:

zinit snippet OMZ::plugins/git/git.plugin.zsh
zinit snippet PZT::modules/helper/init.zsh

ice

使用 ice 的语句会作用于下一句 zinit 的定义。

zinit ice svn pick"init.zsh"
zinit snippet PZT::modules/git

比如加载了 PZT::modules/git 这个目录,但是 ice 中定义了 pick"init.zsh" , 那么就只会加载这个目录下的一个 init.zsh 文件。

as”program”

有些插件可能不是文件,而是需要加入到 $PATH 的一些命令,所以定义了 as 修饰符,和 “program”.

zinit ice as"program" cp"httpstat.sh -> httpstat" pick"httpstat"
zinit light b4b4r07/httpstat

上面的命令会把插件目录加入到 $PATH 中,然后将 httpstat.sh 拷贝到 httpstat 中并添加执行权限。

atpull

拷贝文件是一种安全的不影响更新的操作,原始的仓库没有修改,Git 不会有任何冲突。但是如果定义了合理的 atpull,也可以使用 mv

zinit ice as"program" mv"httpstat.sh -> httpstat" \
      pick"httpstat" atpull'!git reset --hard'
zinit light b4b4r07/httpstat

atpull 会在更新插件的时候执行,如果 atpull 以感叹号开始,表示会在 git pull 之前执行。

atpull, mv, cp 只会在有新的提交后执行。

如果用户使用 zinit update b4b4r07/httpstat 来更新插件,并且有新的提交被拉下来,那么

  • 首先 git reset --hard 执行,恢复原来的 httpstat.sh
  • 然后 git pull 执行,fast-forward 拉取最新的提交
  • 然后 mv 执行

Snippets completions

使用 as 关键字和 completion 可以将 snippet 的内容加入到 completion

zinit ice as"completion"
zinit snippet https://github.com/docker/cli/blob/master/contrib/completion/zsh/_docker

自动补全管理

Zinit 允许单独的禁用和启用每一个插件的自动补全。

zinit ice blockf
zinit light zsh-users/zsh-completions

可以通过 zi clist 查看插件提供的自动补全。

可以单独的启用和禁用补全:

$ zi cdisable cmake
Disabled cmake completion belonging to zsh-users/zsh-completions
$ zi cenable cmake
Enabled cmake completion belonging to zsh-users/zsh-completions

Turbo Mode

Zinit 可以使用 wait ice-mod 来延迟加载插件。Zsh 5.3 以后可以使用。

zinit 管理

zinit 升级

zinit self-update

升级其他插件

zinit update

清理没有加载的插件

zinit delete --clean

reference


2020-10-17 zsh , zinit , linux , terminal , antigen , plugin

阿里云函数计算中使用 Python psycopg2 访问 PostgreSQL

在之前的文章中提到过 函数计算 但一直没有正式的用起来,现在正好通过在阿里云函数计算中连接访问 PostgreSQL 来系统性的学习一下阿里云的函数计算。 首先要了解的几个概念:

  • Fun,Fun 命令是阿里提供的一个用于本地编译,部署函数计算的命令行工具,通过编写本地的 template.yml 配置文件可以对函数计算的服务, 方法, 网关 进行管理。更多内容可以参考官方提供的文档

Fun 命令简单使用

fun 命令的安装可以参考官方的文档.

配置 fun:

fun config

这里需要填写账号相关的信息。执行后会将账号相关的信息保存到:

`~/.fcli/config.yaml`

初始化项目模板:

fun init -n demo

fun 命令的执行依赖于 template.yml 配置文件。

本地调试:

fun local invoke

部署函数:

fun deploy

上传应用

上传应用方式:

  • 控制台
  • fun 工具

连接 PostgreSQL 数据库

项目依赖 template.yml 配置,配置函数计算的服务名,函数名,触发方式等等。

创建 Funfile 文件,安装依赖:

RUNTIME python3
RUN fun-install pip install psycopg2

然后执行 fun install

reference


2020-09-23 function-compute

Mac OS 上的平铺窗口管理工具 yabai

yabai 是一个 Mac OS 上的平铺窗口管理工具。Linux 上很早就有一系列的平铺窗口管理工具,比如 i3, awesome 等等。yabai 将这个功能带到了 Mac 上。所谓的平铺式窗口管理,是相较于普通的浮动窗口管理,在通常使用的情况下,系统上的应用如果打开了很多,就不可避免的相互叠加,需要频繁的使用 ⌘+Tab 来切换窗口。而平铺式窗口管理,则将所有的窗口平铺在桌面上,窗口之间不会相互重叠。

为什么要用平铺式窗口管理

在不了解平铺式窗口管理之前,我个人非常厌烦的一个事情就是不停地在不同的窗口之前切换,并且切换的效率非常低,虽然在 Mac 上有 Contexts 这样的软件来间接的提高窗口切换的速度,但是 Contexts 也需要一个模糊的查找来定位到需要切换的窗口。后来又发现了 Karabiner, 发现可以通过定义组合快捷键来快速切换到对应的应用,比如我定义了 oc 切换到 Chrome,ob 切换到 Obsidian, ok 切换到 kitty,这使得我在任何一个应用中都可以按下 o, 然后迅速的按下 c/b/k 等等来跳转到对应的窗口,即使这个应用窗口在后台,或者这个应用都没有开启,也会打开这个应用后将光标定位到该应用窗口。但这种情况下窗口大小的管理问题便随之而来,虽然我也用 Hammerspoon 定义了快捷键可以全屏,左右上下半屏,但窗口管理的其他一些问题还是没有得到进一步的改善,比如将窗口移动到第二个桌面,将窗口移到左边的显示器等等问题。

而平铺式的窗口管理,通过强可定制的快捷键将这些操作都固化成一定的动作,在熟悉这一些动作之后可以明显的提高效率,从窗口管理的麻烦中解脱出来。平铺式的窗口管理通常有如下特点:

  • 高度可定制化的快捷键动作,一般的平铺窗口工具都会提供比如切换活动窗口,最大化 / 最小化,调整大小,切换桌面,移动到其他显示器等等动作,通过这些动作和自定义的快捷键的绑定就可以实现一套自己的工作流,更甚至可以直接抛弃鼠标
  • 无需烦恼窗口的布局,在平铺式窗口管理下,窗口与窗口之间不会重叠,所有的窗口平铺在桌面上自动进行布局,再也不用担心窗口叠加切换的问题,但习惯了浮动窗口的用户可以一开始并不习惯,但如果使用久了之后就能摸索出一套属于自己的布局,利用一些快捷键可以立即进入该布局,在使用过程中也可以以 O(1) 的复杂度直接找到对应的窗口,切换窗口再不是问题

安装

如果要让 yabai 正常工作,需要 关闭系统完整性保护 System Integrity Protection,然后通过官网的教程 直接进行安装。

brew tap koekeishiya/formulae
brew install yabai
sudo yabai --install-sa

skhd 用于给 yabai 提供快捷键支持。

brew install koekeishiya/formulae/skhd

如果有其他的键盘映射工具,比如 Hammerspoon, Karabiner 也是可以的。

如果要调试 skhd 可以在安装时:

brew install skhd --with-logging

然后 skhd 就会将错误日志打印到 /usr/local/var/log/skhd/skhd.err.log 下。

配置

yabai 的 wiki 已经解释了大部分的配置选项。

yabai 会自动加载 ~/.yabairc 配置文件。

配置的格式:

yabai -m <category> <command>

在配置调试阶段,不可避免的会需要多次加载 yabairc 配置,如果每次都要重启 brew services restart yabai 太慢了,yabai 提供了重新加载的方法,执行 :

launchctl kickstart -k "gui/${UID}/homebrew.mxcl.yabai"

也可以绑定快捷键

# e.g. bind to key in skhd:
# ctrl + alt + cmd - r : launchctl kickstart -k "gui/${UID}/homebrew.mxcl.yabai"

因为我自己的常用的快捷键是 hyper+r 重新加载 hammerspoon 的配置,所以改了一下 hyper+r 不仅重新加载 hammerspoon 配置,也重新加载 yabai 配置。

模式切换

koekeishiya 的配置为例:

# change layout of desktop
ctrl + alt - a : yabai -m space --layout bsp
ctrl + alt - d : yabai -m space --layout float
ctrl + alt - s : yabai -m space --layout $(yabai -m query --spaces --space | jq -r 'if .type == "bsp" then "float" else "bsp" end')

说明:

  • ctrl + alt - a 就是平铺窗口模式
  • ctrl + alt - d 就是浮动窗口模式
  • ctrl + alt - s 切换模式

使用者可以定义任何自己习惯的快捷键来替换这一套配置。

管理多个 Display 显示器

在显示器之间切换,显示器的编号可以在系统偏好中查看。

# Focus display focused before the current one (so you can alternate)
yabai -m display --focus recent

# Focus previous display by arrangement index
yabai -m display --focus prev

# Focus next display by arrangement index
yabai -m display --focus next

# Focus display with arrangement index 2
yabai -m display --focus 2

Space

Space 指的是系统的不同虚拟桌面,yabai 可以快速的对不同的桌面进行管理。

将焦点放到不同的 Space 上

alt - 1 : yabai -m space --focus 1
alt - 2 : yabai -m space --focus 2
alt - 3 : yabai -m space --focus 3
alt - 4 : yabai -m space --focus 4

窗口管理 Windows

yabai 默认会使用二分的方式来划分窗口,一个窗口时会全屏,两个窗口时会左右对半,三个时会上下切分左边半个,依次类推。

切换活跃窗口

下面的配置是将光标定位到同一个 Space 的不同窗口上。这个操作比较常见,使用 option 作为 modifier。切换活跃窗口的操作还是非常频繁的。

# focus window
alt - j : yabai -m window --focus south
alt - h : yabai -m window --focus west
alt - k : yabai -m window --focus north
alt - l : yabai -m window --focus east

这些定义分别对应着使得,j(下方), k(上方), h(左侧), l(右侧) 的窗口成为活跃窗口。

交换窗口的位置

alt + shift - j : yabai -m window --swap south
alt + shift - h : yabai -m window --swap west
alt + shift - k : yabai -m window --swap north
alt + shift - l : yabai -m window --swap east

同样可以定义如何移动窗口

shift + cmd - h : yabai -m window --warp west
shift + cmd - j : yabai -m window --warp south
shift + cmd - k : yabai -m window --warp north
shift + cmd - l : yabai -m window --warp east

调整窗口大小的操作我用的很少,有需要可以使用。

# move window
shift + ctrl - a : yabai -m window --move rel:-20:0
shift + ctrl - s : yabai -m window --move rel:0:20
shift + ctrl - w : yabai -m window --move rel:0:-20
shift + ctrl - d : yabai -m window --move rel:20:0

# increase window size
shift + alt - a : yabai -m window --resize left:-20:0
shift + alt - s : yabai -m window --resize bottom:0:20
shift + alt - w : yabai -m window --resize top:0:-20
shift + alt - d : yabai -m window --resize right:20:0

# decrease window size
shift + cmd - a : yabai -m window --resize left:20:0
shift + cmd - s : yabai -m window --resize bottom:0:-20
shift + cmd - w : yabai -m window --resize top:0:20
shift + cmd - d : yabai -m window --resize right:-20:0

开关窗口的浮动模式

alt - t : yabai -m window --toggle float && yabai -m window --grid 4:4:1:1:2:2

开关 picture-in-picture 模式

alt - p : yabai -m window --toggle border && \
          yabai -m window --toggle pip

Status bar

我个人将桌面上除了窗口以外的所有状态栏等等都隐藏了,如果要添加自定义的内容可以选择:

stackline

stackline 是 yabai 的一个增强,在窗口的 stack 模式上增加了一层可视化的显示,一个 stack 会在左上角的地方显示当前这个 stack 中的应用列表。

参考配置

reference


2020-09-17 mac , tiling-window-manager , window-manager , hammerspoon

You Quiz on the Block E70 世代差异

Covid-19 以来很少有让我继续追下去的韩综,除了带我入坑的周末综艺,一个 《[[Begin Again Korea]]》剩下的就只有《You Quiz On the Block》了。可以看得出来韩国的综艺人,电视人总还是带着一些社会关怀再做内容,之前在《Begin Again》里面就提过,在这个特殊的时代,他们把歌声第一时间先给一线的医护人员,公共服务人员,在这个疫情的特殊时期《Begin Again》就是一个治愈的存在,而相同的《You Quiz》第三期开篇就是对社会一线人员的致敬,公交司机,私营店老板,快递员,防疫人员,社会正是在这些人继续工作下去的时候才能维持正常的运行。

而在第三季的《You Quiz》中因为受到疫情影响,节目形式进行的改变,从原来街头的随机采访变成了主题式的室内采访,我甚至觉得这个模式似乎更有看点,主题也分外的明显,显而易见的比之前的模式要更加有中心主旨。虽然以前也会用一两个相同的问题来串起一个 Episode,但相较于现在而形式,也显得比较散。

再回到 E70,这一期的主题是世代差异。节目组分别邀请了 Z 世代,Y 世代,X 世代,386 世代,产业化世代 5 代人来讲述不同世代的故事。这一期的节目就像是一部倒放的韩国近代史。一直从 2000 年讲述到了上世纪 50,60 年代,当然叙事的方式并不是大而全的通用叙事,而是更加具体的从个人视角发出的主观的历史叙事。我作为千禧一代 (Y 世代)出生的人,最感同身受的却是 X 世代,或许另一个角度也能看出两个国家发展阶段的不同。

另外一个能察觉到节目组用心之处的便是节目的音乐,虽然韩综的配乐一直是长项,但这样的一个主题下,便更能体现其年代感,每一个世代所接触到的音乐,所关心的音乐人都不一样。生活在 2000 年以后 Z 世代是随手可得的音乐,Y 世代是放在自己的网络小屋的背景音乐,是自己的在庆典上偶像的歌曲,在到 X 世代是弘大,是夜店的歌曲,386 世代而言,音乐要珍贵许多,要守在广播前等待自己喜欢的歌手出现,再用录音机把歌声录下(杨熙恩,宋昌植)(采访的对象提到的杨熙恩 양희은 也是我非常喜欢的一位歌手,在 [[Fantastic Duo]] 短暂出现过),到更早一代,只能在异国他乡独自一人的晚上收听唯一的一档韩语广播。每一个世代都有自己喜欢的音乐,而有些音乐不像那个时代被一代人熟知,也依然可以穿过时间,直达现在每一个观众的内心,尤其是看那位远赴德国务工的老爷爷哼唱出《阳光明媚的日子 (해뜰날 by 송대관)》:

꿈을안고왔단다 抱着梦想来了 내가왔단다 我来了 슬픔도괴로움도 悲伤与伤心 모두모두비켜라 统统都让开 안 뒤는 일이없단다 有志者 노력하면은 事竟成 쨍하고해뜰날 阳光明媚的日子 고구간단다 回到故国 쨍하고해뜰날 阳光明媚的日子 고구간단다 回到故国

这几句歌词出来,直抵人心。音乐无论在哪个年代,虽然会以不一样的形式出现,虽然会被不一样的歌手所演绎,但总能给人以慰藉,这或许也是我独爱《Begin Again》的理由吧。

抛开音乐回到这几代人对历史时刻的最深记忆,而这些历史事件也逐渐的塑造了如今的韩国。从远到近说起。

  • 1963 年后陆续派遣近两万名劳工赴德国务工,电影 [[国际市场]] 中有讲述
  • 朴正熙政权在 1961 年至 1979 举国之力发展工农业,史称「汉江奇迹」,1979 年 10 月 26 日,朴正熙被中央情报部部長金载圭暗杀,电影 [[南山的部长们]] 有讲述,另 [[孝子洞理发师]] 1
  • 1980 年 5.18 光州民主化运动 [[出租车司机]] [[华丽的假期]] [[薄荷塘]]
  • 1987 年 6 月民主抗争,朴种哲事件,李韩烈事件 [[1987 黎明到来的一天』]
  • 1994 年 [[圣水大桥倒塌事件]] 电影 [[蜂鸟]] 中有提及
  • 1995 年 6 月 29 日 [[三丰百货大楼崩塌事故]],502 人死亡,6 人失踪,937 人受伤
  • 1997 年 12 月 3 日,向 [[IMF 申请金融救济』] 电影 [[国家破产之日]] 讲述的就是这一段历史
  • 2014 年 [[世越号事件]],已经有无数的电影来铭记这件事情 [[潜水钟]] [[那天,大海]]

大多数的历史性事件已经有大量的电影,进行了更加详细的记录和阐述。而现在的采访才更加有价值,事件的亲历者,亲自讲述那段苦难,虽然现在能笑着说出来,但背后却不知道隐藏了多少泪水。赴德国的老爷爷讲述第一次面试举麻袋失败后在家练习,亲历 1987 年 6 月运动后讲述为后辈捡起掉落的鞋子,却不料是最后一别。不禁让我感慨现实有的时候远比电影要残酷。老爷爷最后回答人生是什么的时候说,「人生是艺术」,不为过,也确确实实可以形容了。

Z 世代

  • 2000 年后出生,现在 10 代的青少年们
  • 不看文本,看视频
  • 不用电脑,用手机
  • 产品的生产者与消费者
  • 在数字环境下成长的数字原住民

唠叨会让人不爽,忠告会让人更不爽。

Y 世代

  • 又被称为千禧一代,指 1980 年代和 1990 年代出生的人
  • 2014 年世越号事件

X 世代

X 世代

  • 是指出生与 1960 年代后期到 1970 年代之间
  • 在人类历史上唯一同时经历过数字和模拟的一代人
  • 拒绝老一代的习俗和秩序,用全身拒绝已存在的条条框框,个性分明的一代人
  • 享受了 90 年代经济上升,生活富足的第一代人

经历事件:

  • 1994 年 [[圣水大桥倒塌事件]] 电影 [[蜂鸟]] 中有提及
  • 1995 年 6 月 29 日 [[三丰百货大楼崩塌事故]],502 人死亡,6 人失踪,937 人受伤
  • 1997 年 12 月 3 日,向 [[IMF 申请金融救济』] 电影 [[国家破产之日]] 讲述的就是这一段历史

386 世代

386 世代是在 60 年代出生,在 80 年代上大学,在 90 年代是 30 多岁的世代。当时的电脑架构是 386,还是 486 的,还是奔腾的,这个时候登场的 386 世代。这是一个象征着当时主导抵抗军事政权的学生运动和工人运动等社会运动的世代。

[[柳烈的音乐专辑]] 中

电影 [[1987 黎明到来的一天』] 中有大量描述。

产业化世代

1945 年光复之后,韩国战争期间出生的世代。1960~1970 年代,游走世界,掀起产业发展,创造出「汉江奇迹」,大韩民国经济成长的主力,称之为「产业化世代」。 电影 [[国际市场]] 有讲述。

  1. https://en.wikipedia.org/wiki/Miracle_on_the_Han_River 


2020-09-05 thinking

电子书

最近文章

  • 配置 Rime 在 Vim 下退出编辑模式时自动切换成英文输入法 半年以前在 Obisidian 的文章下面有人曾经问过我一个问题,如何在 Vim 或者其他使用 Vim 模式的编辑器,比如 IntelliJ,或者 Obisidian 开启 Vim 模式后方便地切换中英文输入法,因为在编辑模式和普通模式下,需要经常切换输入法,使得体验变得非常槽糕。
  • Asus RT-AC86U 设置 前些天给家里买手机正好凑单了一个 Asus RT-AC86U,正好可以代替出了两次故障的小米 3G。
  • 扩展 Proxmox 系统分区以及 Proxmox 文件系统初识 昨天想要扩展一下之前安装的 Proxmox 容量,对系统进行了一次关机,然而关机之后就悲剧的发现在 U 盘中的系统启动不了了,将 U 盘拔下检测之后发现 U 盘可能挂了,一个全新的 U 盘,在连续 192 天运行之后挂掉了。无奈之下只能想办法先恢复一下 Proxmox 系统以及安装在系统之上的 OpenMediaVault 了。
  • 『译』我最喜欢的命令行工具 偶然间看到一篇介绍 cli 的文章,感觉写得不错,正好借此机会也整理一下我之前使用过,以及觉得非常值得推荐的 CLI 工具。
  • 使用 Clonezilla 将硬盘中系统恢复到虚拟机中 今年陆陆续续将工作的环境迁移到了 macOS,虽然已经把日常的资料迁移到了 macOS,但是之前的 Linux 上还有一些配置,以及可以的一些测试还需要用到 Linux 虚拟机,所以我就想能不能用 Clonezilla 将磁盘中的系统备份然后恢复到虚拟机里面。因为我发现 macOS 下的 Fusion 还是很强大的。