分类目录归档:工具

吐槽设备管理和多电脑管理:无线总是比有线方便吗?

作为一个前信息类学科学生和现 IT 行业从业者,电脑一直是我生活中不可分割的一部分。同时如何方便的打理好我的电脑和其周边设备一直是个不断更新的问题。

为什么这个问题会不断更新呢?

环境决定需求

在学校的时候,我能够掌控地仅仅在宿舍里面的一个小桌子。所以那个时候,我所追求的方便就是周边外设要尽量轻薄和无线。这样子可以方便地把鼠标和键盘都塞到抽屉里面,同时不需要重新插拔线。当然不得不承认,如果忘了关了鼠标和键盘的开关,红外接收器真的很废电池 😂。那个时候还没有蓝牙,以及后面出现的早期版本蓝牙还不适用于支撑鼠标键盘的信息传输。

无线鼠标和信号接收器
无线鼠标和信号接收器

那个时候,看着我宿舍桌上那笨重的主机和荧光屏显示器,拥有一台笔记本电脑也当是一直我梦想的事情。这样子我就可以随身带着我的电脑;一旦放寒暑假,我可以方便地把它带回家 🤭。

荧光屏显示器和主机箱
荧光屏显示器和主机箱

工作之后,所使用的电脑设备已经几乎都是笔记本电脑了,而且随着苹果掀起的笔记本轻薄化风潮所造成的接口精简化,我不得不将随身携带的外设都换成了支持蓝牙的,要不然接口完全不够用。然后由于工作内容的保密性,需要工作电脑和生活电脑分离,我又不得不尽量使用支持多设备记忆的蓝牙设备,以保证我的一套外设可以在多个电脑之间方便切换。

无线一定比有线方便吗?

然而,因为目前公司的工作需要以及我的个人需要,最近我的设备管理变得前所未有的麻烦 🤦。我需要让一套外设(键盘、鼠标、摄像头、显示器)可以方便地在四台笔记本和一台主机箱之间切换,显然蓝牙已经不可能做到了。

顺便提一句,不要对五台电脑觉得奇怪,我在前前公司做涉及到移动端项目的时候,我有十几台手机、几台平板电脑和四台电脑,当然他们几乎都不属于我个人,是属于公司的。那个时候还没有云测试平台,所有兼容性测试都只能在本地设备上完成。

言归正传,好在我的大多数外设都是有线无线双模的,所以我想了折中方案。我把一套鼠标、键盘和显示器都接在一个多接口转换器上,当我需要用哪台电脑时,我就把转换器接到哪个电脑上。由于 COVID 的影响已经很小,所以我们偶尔也需要去办公楼一下。所以当我需要去公司的时候,我只需要将显示器线拔掉,连着扩展器和键鼠一起塞到背包里。搞定!

前几天,我突发奇想,既然有 HDMI 切换器这种东西来实现显示器信号源的自由切换,难道就没有一个硬件可以实现所有外设的切换吗?于是,我真的发现了 KVM 切换器,又叫多电脑切换器。这个 KVM 不是基于内核的虚拟机,它代表了 Keyboard、Video 和 Mouse。

KVM切換器(英語:KVM switch),一般簡稱KVM,又名多電腦切換器,是一種计算机硬件設備,可以使用户透過一組鍵盤螢幕滑鼠控制多台電腦。KVM,即键盘、显示器、鼠标的英文首字母缩写(Keyboard、Video、Mouse)。

摘自 维基百科
KVM 切换器 图纸
KVM 切换器 图纸

这个切换器真是拯救了我。我不需要准备多套外设来覆盖我所有的电脑,也不需要反复插拔接线来保证我的所有电脑都能被操作。我的桌面也变得更有条理了一些,虽然还是很乱。

选择合适的 KVM 切换器

KVM 切换器的种类很多,坑也很多。选购的时候,要关注技术参数,尤其是 HDMI 部分,参数不同差异很大。

  1. 首先要确定电脑数量,即,你需要将这套外设共享给几台电脑。
  2. USB 的参数。因为 USB 1 和 USB 2 的传输速率相差很大,主要看你的需求,是否有很多外置存储设备等等。
  3. HDMI 的规格。如果你使用 Apple TV 等支持 HDR 和杜比视界的设备,需要查看提供的 HDMI 是否支持 HDR 和杜比视界的传递。HDR 有很多种,例如 HDR、HDR 10、HDR 10+ 等等。同样,也要关注是否支持音频传递,以及支持的音频编码。
  4. 对于视频和游戏爱好者,支持的最高刷新率和分辨率尤为重要。需要关注一下。
  5. 是否支持热切换。直接影响切换效率和用户体验。

希望这篇吐槽能帮到一些同样苦于多设备管理的朋友。

Hammerspoon : macOS 界的瑞士军刀

相信很多朋友在自己的电脑里面都有特殊化定制。这可能也是为什么很多人都非常不喜欢配置新电脑或者重装系统。

譬如我自己,有一波应用用来提升我的电脑使用体验,如下是不完全统计:

应用用途
SizeUp可以通过快捷键将窗口吸附在屏幕的上下左右以及死角。对于大屏幕非常有用,左侧文档,右侧代码
Pap.er可以自动定时将美丽的风景画设置成我的壁纸
Stretchly定时遮挡屏幕以强制休息
Lexico.com牛津英英词典官方网站
Cheatsheet用来查看当前应用的所有快捷键
New Terminal Here在当前目录打开终端
我的常用工具列表

这些工具在提升我的用机舒适度的同时,也在我造成了一些困扰,尤其重装系统和换电脑的时候。有时候是因为软件开始收费了,我需要寻找一个免费的替代品;有时候是因为停止维护很久不再支持最新系统了,我需要寻找一个新的替代品。直到有段时间,Mac 似乎都和我有仇一般,半年更换了三台电脑。忍无可忍之下,我开始寻找一个能够替代这些小工具的方法,终于被我找到了一个 MacOS 上的瑞士军刀: Hammerspoon

类似的工具其实也不少,但是 Hammerspoon 在定制化能力和易用性上找到了一个平衡点。用户只需要稍微了解一下 Lua 基础就能很快上手利用 Hammerspoon 通俗易懂的 API 和完整的 Spoon 库实现一些定制化功能。我在毫无 Lua 基础的情况下,很快通过阅读文档完成了几个功能的定制。

我们可以用官方提供的 Spoon 来定制,以窗口控制为例

-- 我们可以通过引入 WinWin 这个 Spoon 来轻松实现 hs.loadSpoon("WinWin") -- 判断 WinWin 是否正常载入,并根据窗口控制效果配置热键 if spoon.WinWin then -- 文本提示能完美支持符号字符,这对后面设置热键列表非常有用,后面会说 -- Side hs.hotkey.bind({"cmd", "alt", "ctrl"}, "left", "Window ⬅", function() spoon.WinWin:moveAndResize("halfleft") end) hs.hotkey.bind({"cmd", "alt", "ctrl"}, "right", "Window ➡", function() spoon.WinWin:moveAndResize("halfright") end) hs.hotkey.bind({"cmd", "alt", "ctrl"}, "up", "Window ⬆", function() spoon.WinWin:moveAndResize("halfup") end) hs.hotkey.bind({"cmd", "alt", "ctrl"}, "down", "Window ⬇", function() spoon.WinWin:moveAndResize("halfdown") end) -- Corner hs.hotkey.bind({"shift", "alt", "ctrl"}, "left", "Window ↖", function() spoon.WinWin:moveAndResize("cornerNW") end) hs.hotkey.bind({"shift", "alt", "ctrl"}, "right", "Window ↘", function() spoon.WinWin:moveAndResize("cornerSE") end) hs.hotkey.bind({"shift", "alt", "ctrl"}, "up", "Window ↗", function() spoon.WinWin:moveAndResize("cornerNE") end) hs.hotkey.bind({"shift", "alt", "ctrl"}, "down", "Window ↙", function() spoon.WinWin:moveAndResize("cornerSW") end) -- Stretch hs.hotkey.bind({"cmd", "alt", "ctrl"}, "C", "Window Center", function() spoon.WinWin:moveAndResize("center") end) hs.hotkey.bind({"cmd", "alt", "ctrl"}, "M", "Window ↕↔", function() spoon.WinWin:moveAndResize("maximize") end) -- Screen hs.hotkey.bind({"alt", "ctrl"}, "right", "Window ➡ 🖥", function() spoon.WinWin:moveToScreen("next") end) -- Other hs.hotkey.bind({"cmd", "alt", "ctrl"}, "/", "Window Undo", function() spoon.WinWin:undo() end) end
Code language: Lua (lua)

是不是很简单?只需要定义几个热键,选择一下需要的控制效果就 OK 了。

我们也可以利用 Hammerspoon 的 API 自定义 Spoon ,以 BreakTime 为例

为了实现这个,我们需要定时使用一个页面或者图片遮挡整个屏幕以提示电脑前的家伙应该短暂休息一下了。

首先,我们可以轻松通过 hs.timer 开启一个定时器:

obj.Timer = hs.timer.new(60, refresh) obj.Timer:start()
Code language: Lua (lua)

然后,我们可以通过 hs.webview 创建一个遮挡这个屏幕的网页,页面中展示一个半透明的图片以达到透明效果

function makeBrowserOfBreakTime () local screen = require"hs.screen" local webview = require"hs.webview" local mainScreenFrame = screen:primaryScreen():frame() browserFrame = { x = mainScreenFrame.x, y = mainScreenFrame.y, h = mainScreenFrame.h, w = mainScreenFrame.w } local options = { developerExtrasEnabled = true, } -- local browser = webview.new(browserFrame, options):windowStyle(1+2+4+8) local browser = webview.new(browserFrame, options):windowStyle(1+2+128) :closeOnEscape(true) :deleteOnClose(true) :bringToFront(true) :allowTextEntry(true) :transparent(true) return browser end
Code language: Lua (lua)

接下来,我们就可以通过定时器来创建 browser:show() 和销毁 browser:delete() 页面来实现遮挡效果。

function refresh() obj.curTime = obj.curTime + 1 if obj.curTime > obj.microbreakInterval then obj.curMicrobreakCount = obj.curMicrobreakCount + 1 if obj.curMicrobreakCount > obj.microbreakCount then hs.alert.show(obj.breakTime .. " minute break starts") local browser = makeBrowserOfBreakTime(); browser:url("file://" .. hs.spoons.scriptPath() .. "BreakTime.html?time=" .. (obj.breakTime * 60 - 1)):show() hs.timer.doAfter(obj.breakTime * 60, function() if browser ~= nil then browser:delete(); end end) obj.curMicrobreakCount = 0 else hs.alert.show(obj.microbreakTime .. " second microbreak starts") local browser = makeBrowserOfBreakTime(); browser:url("file://" .. hs.spoons.scriptPath() .. "BreakTime.html?time=" .. (obj.microbreakTime - 1)):show() hs.timer.doAfter(obj.microbreakTime, function() if browser ~= nil then browser:delete(); end end) end obj.curTime = obj.curTime - obj.microbreakInterval end end
Code language: Lua (lua)

最后,我们就可以像前面调用 WinWin 一样载入 BreakTime 这个自定义 spoon 并启动就可以了。

我们还可以定义任务栏菜单和提升一下用户体验

以 BreakTime 为例,我们可以将下一个休息时间显示出来

BreakTime 菜单提示
BreakTime 菜单提示

不光如此,我们还可以把所有在 Hammerspoon 定义的热键都展示出来。

所有热键的菜单提示
所有热键的菜单提示

由于他对符号字符支持的很完美,所以你在菜单里面可以设置很多有意思的提示,是不是很赞?😄

obj.menubar:setTitle("⌨️") obj.menubar:setTooltip("Hot Key Info") local hotkeys = hs.hotkey.getHotkeys() local menuItem = {} for key, value in pairs(hotkeys) do local item = { title = value["msg"] } table.insert(menuItem, item) end obj.menubar:setMenu(menuItem)
Code language: Lua (lua)

除以上这些,Hammerspoon 还有很多东西值得探索。各位如果有兴趣的话,可以用我的定制随便试试。我也在不断摸索完善我自己的定制。

其实不光这些小工具,每次重新安装我的常用 App,例如 VS Code、Plex、Sublime Text、VIM 等等,也是个很痛苦的事情。我现在通过维护一套 homebrew 列表来快速完成大多数的 App 安装。😂