在 KDE/X11 下把浏览器扩展封装成一个独立托盘应用

有些应用没有正式的 Linux 原生客户端,但提供了浏览器扩展版,或者可以通过 Chromium 系浏览器运行。直接在浏览器里使用当然可以,但体验上总觉得不够独立:它会混在普通浏览器标签页里,也不方便固定到任务栏,更不像一个真正的桌面应用。 这次尝试的目标是:把一个浏览器扩展版的即时通讯工具封装成一个独立的桌面应用。点击图标后,它以单独窗口打开,有自己的图标、自己的浏览器 profile、自己的桌面入口,并且可以最小化到 KDE 系统托盘中。最终效果接近一个原生聊天软件。 一、目标 目标不是安装一个真正的原生 Linux 客户端,而是通过以下方式实现类似体验: 最终希望达到的行为是: 这样它就不会和普通浏览器混在一起,也不会占用日常浏览器 profile。 二、基本架构 整体架构可以分为四部分: 逻辑链条是: 这里的重点是:浏览器程序本体仍然使用系统已经安装好的浏览器,真正独立的是 profile 数据目录和启动方式。 三、项目目录命名 为了长期维护,目录名不建议直接使用过于通用的名字,比如: 这些名字可能和官方应用、浏览器自身 profile、第三方客户端产生混淆。 更合适的是使用一个本地项目式名称,例如: 这个名字不绑定具体浏览器,也不绑定具体技术实现。以后即使从 Brave 换成 Chromium,或者从某个扩展换成另一个 Web App,目录名也不需要改。 目录结构大致如下: 四、启动脚本 核心启动脚本是 launch.sh。 示例: 这里有几个关键点。 –user-data-dir 用来指定独立 profile。这样这个应用不会和普通浏览器共享登录状态、扩展、缓存、历史记录。 –app 用来让浏览器以接近独立应用窗口的方式打开页面,而不是普通浏览器窗口。 –class=ChatApp 用来帮助 KDE / KWin 识别窗口身份。否则这个窗口可能会被归类到普通浏览器下面,任务栏图标也会和普通浏览器叠在一起。 …

KDocker:把普通 Linux 应用收进系统托盘的小工具

在 Linux 桌面环境里,有些应用本身支持“最小化到系统托盘”,比如聊天软件、下载工具、密码管理器、音乐播放器等。但也有很多应用没有这个功能:窗口一最小化,就仍然占在任务栏里;关掉窗口,又可能直接退出程序。KDocker 解决的就是这个问题:它可以把大多数普通应用窗口“停靠”到系统托盘里,让它们像托盘程序一样隐藏、恢复和常驻。 KDocker 的官方描述很直接:它可以把多数应用停靠到系统托盘中,启动 KDocker 后用鼠标选择一个窗口,这个窗口就会被 dock 到托盘里。 它不是 Docker,也不是容器工具 KDocker 这个名字容易让人误会。这里的 “Docker” 不是容器领域的 Docker,而是 “dock” 的意思,也就是把窗口停靠到某个地方。 它的作用不是运行容器,不是管理镜像,也不是服务器工具。它是一个桌面小工具,面向的是 Linux 图形界面用户,尤其适合 KDE Plasma、Xfce、LXDE、Cinnamon 这类有系统托盘区域的桌面环境。 KDocker 能解决什么问题 KDocker 最典型的用途,是让一些需要长期开着、但又不希望占用任务栏空间的应用变得更安静。 比如邮件客户端、聊天软件、浏览器封装的 Web App、同步工具、音乐播放器、RSS 阅读器、笔记软件等。有些应用本身没有托盘功能,或者托盘功能在某些桌面环境下表现不好,这时 KDocker 就可以作为一个外部补丁。 它的思路很简单:不改应用本身,不改应用配置,只是从窗口管理层面把这个窗口收起来,并在系统托盘里放一个图标。需要时点托盘图标恢复窗口,不需要时让它安静待着。 基本使用方式 最简单的方式是直接运行: 然后鼠标指针会进入选择窗口的状态,点击想要收进托盘的应用窗口即可。 也可以直接指定程序启动,例如: 或者指定一个自定义图标: -i 参数用于指定托盘图标路径;Ubuntu manpage 中也列出了其他常见选项,例如 -f 表示 dock 当前获得焦点的窗口,-t 表示从任务栏移除该窗口,-l …

Linux 下内置蓝牙与 USB 蓝牙适配器的实际体验对比

最近在一台 Linux 桌面系统上测试无线网络和蓝牙设备时,发现一个很有意思的现象:机器内置的无线模块纸面规格并不差,蓝牙驱动本身也比较稳定,但实际使用中,外接 USB 无线网卡附带的蓝牙功能反而表现更好。 这次对比的对象大致是: 一、先看系统识别结果 在 Linux 下,可以用下面的命令查看蓝牙控制器: 系统中可以看到两个蓝牙控制器: 其中 AX900 是外接 USB 适配器,Internal 是机器内置蓝牙。 进一步查看控制器信息: 输出中比较关键的是: 这里的 version 是 HCI version,可以大致对应蓝牙版本: HCI version 对应蓝牙版本 8 Bluetooth 4.2 9 Bluetooth 5.0 10 Bluetooth 5.1 11 Bluetooth 5.2 12 Bluetooth 5.3 所以可以判断: 这已经说明两者不是同一代产品。 二、内置蓝牙并不是“驱动差” 这次测试中,一个容易误解的地方是:外接 USB 蓝牙表现更好,并不代表内置蓝牙驱动很差。 内置蓝牙识别为 Broadcom …

Arch Linux 下内置无线网卡与 USB 无线网卡的实际对比

最近在一台运行 Arch Linux 的桌面机器上,对内置无线网卡和外置 USB 无线网卡做了一次实际测试。测试的目的很简单:判断到底应该继续使用机器内置的无线网卡,还是把 Wi-Fi 和蓝牙都切换到外置 USB 一体设备上。 这台机器原本有内置 Wi-Fi 和内置蓝牙。后来又外接了一个 USB 设备,这个设备同时提供 Wi-Fi 和 Bluetooth 功能。也就是说,系统里同时存在两套无线硬件: 最终测试结果有点有趣:内置网卡的信号强度明显更好,但外置 USB 网卡的实际下载速度反而更快。 硬件识别情况 系统中识别到的内置 Wi-Fi 是 Broadcom 芯片,驱动为: 外置 USB Wi-Fi 是 Realtek 芯片,驱动为: 蓝牙方面,系统同时识别到了内置蓝牙控制器和 USB 蓝牙控制器。外置设备在系统中显示为默认蓝牙控制器,因此 Wi-Fi 和蓝牙都可以集中由这个 USB 一体设备承担。 从结构上看,最终形成了这样的配置: 这对 Linux 桌面环境来说反而比较清晰:内置无线硬件不再作为主力,外置 USB 无线模块承担主要连接任务。 信号强度对比 两个网卡扫描同一个 5GHz …

Arch Linux 第三方源整理:从软件来源混乱到更新体系清晰

Arch Linux 的软件管理非常灵活,但正因为灵活,系统里一旦启用了多个第三方仓库,就容易出现几个问题: 这次整理的核心,就是围绕 pacman.conf 中的第三方源进行排查、分析和优化,最终把系统源结构从“能用但不清楚”,整理成“官方源优先、第三方源必要保留、镜像线路更合理”的状态。 一、先确认当前启用的软件源结构 Arch Linux 的软件源配置位于: 典型结构如下: 这里最重要的是顺序。 pacman 在查找同名包时,会按照仓库顺序决定优先级。当前结构中,优先级大致是: 也就是说,只要官方源里有同名包,通常优先使用官方源。第三方源只有在前面的源没有同名包时,才会参与选择。 因此,不能简单看到某个包在 archlinuxcn 或 arch4edu 中存在,就直接判断它是从这个第三方源安装的。 二、区分“软件来源”和“包来源” 整理过程中首先需要区分几个概念: 例如 Brave 浏览器: 所以不能说: 更准确的说法应该是: 这个区别非常关键。否则很容易把“软件开发者”“Arch 打包者”“第三方仓库”“镜像服务器”混为一谈。 三、查看哪些包在 archlinuxcn 中存在 可以用下面命令查看当前系统中,哪些已安装包也存在于 archlinuxcn 仓库: 或者只输出包名: 这类命令的含义是: 本地已安装这个包,并且 archlinuxcn 仓库中也存在同名包。 但这并不等于: 这个包一定是从 archlinuxcn 安装的。 因为如果官方源也有同名包,而且官方源排在前面,那么 pacman 默认仍然优先官方源。 更准确的判断方式是排除官方源中也存在的包。 例如,查找“已安装、archlinuxcn 有、但官方源没有”的包: …

Arch Linux 下 Google Chrome 来源混乱与 AUR 迁移记录

背景 在 Arch Linux 系统中,Google Chrome 并不在官方仓库内。常见安装方式通常有三种: 如果系统长期使用第三方源,Google Chrome 可能会出现一个问题:本地已经安装了 Chrome,但版本长期停留在旧版本,无法随系统正常更新。 这类问题表面上看像是 Chrome 本身没有更新,实际往往是包来源发生了变化,或者第三方仓库中的包已经停止同步最新版。 现象 系统中查询当前 Chrome 版本: 输出类似: 而当前 AUR 中的 google-chrome 已经是更高版本,例如: 说明本地 Chrome 已经落后多个大版本。 继续检查外来包: 如果有输出,说明当前这个包已经不属于系统同步数据库中的官方仓库或当前启用的第三方仓库,属于“外来包”。 问题来源 Arch 上如果曾经配置过类似这样的第三方源: 或者其他个人维护源,例如: 那么 google-chrome 可能并不是从 AUR 构建安装的,而是来自某个第三方二进制仓库。 第三方二进制仓库的优势是省去本地编译或打包过程,使用体验接近官方仓库。但问题是:如果该仓库不再及时维护某个包,本地版本就会停滞。 实际升级时可能出现类似情况: 输出却显示: 这说明 yay 并没有去 AUR 获取新版,而是优先使用了同步仓库里的旧版 google-chrome。 关键点在于: 这里的 alerque …

Arch Linux 升级后 MacBook 声卡再次失效:snd-hda-macbookpro 驱动修复记录

一、问题背景 某台安装 Arch Linux 的 MacBook 在系统升级后再次出现没有声音的问题。 机器使用的是 Cirrus Logic CS8409 相关声卡,需要依赖第三方驱动 snd-hda-macbookpro 才能正常驱动内置扬声器和耳机。此前系统中安装的是 AUR 包: 系统升级后,内核版本变为: 重新安装 AUR 包后,声音仍然无法恢复。因此问题重点不再是“软件包是否安装”,而是要确认: 二、先确认内核、headers 和 DKMS 环境 首先检查当前内核版本: 输出为: 继续检查内核、headers 和 DKMS: 结果为: 再检查当前内核的 build 目录: 结果为: 这说明基础环境没有问题: 因此可以排除 headers 缺失、内核和 headers 不匹配、DKMS 环境缺失等常见问题。 中间曾出现过一个无关报错: 这只是复制命令时把两段命令粘连在一起导致的,不是系统故障。 三、问题真正原因 这次问题的关键在于: Linux 6.17 以后,内核 sound 相关源码目录结构发生过变化。旧版构建脚本可能仍然假设旧路径,因此在新内核上会出现构建流程不稳定、模块生成位置不符合 …

使用 wget 下载网站图片时,能不能保留原始时间属性?

在整理旧网站、备份博客图片、迁移 WordPress 站点素材时,经常会遇到一个问题:用命令行下载图片以后,本地文件的时间会不会变成“下载时间”?有没有办法尽量保留图片原来的时间属性? 答案是:可以,但要看你说的“原始时间”具体指什么。 对于 wget 来说,它能够保留的主要是服务器返回的文件修改时间,也就是 HTTP 响应头里的 Last-Modified 时间。只要服务器正确提供这个时间,wget 就可以把本地文件的修改时间设置成服务器上的时间。 但是,wget 并不能保证恢复图片真正的拍摄时间,也不能保证恢复 WordPress 后台里的上传时间。它只是尽量保留“远程文件的修改时间”。 一、最核心的参数:-N wget 中和时间戳有关的核心参数是: -N 是 –timestamping 的简写,意思是启用时间戳检查。 例如下载一张图片: 如果服务器返回了这张图片的 Last-Modified 信息,wget 下载后会把本地文件的修改时间设置成这个远程时间,而不是单纯使用当前下载时间。 二、批量下载图片时也可以保留时间 如果有一个图片地址列表,例如 urls.txt: 可以这样批量下载: 这里: 表示保留远程时间戳; 表示从 urls.txt 文件中读取下载地址。 这是比较干净、稳定的批量下载方式,适合先从网页或 WordPress 媒体库中提取图片地址,再统一下载。 三、下载整个页面中的图片 如果只是想下载某个网页中用到的图片,可以使用: 这条命令的含义是: 例如: 这样会把页面中引用到的图片下载下来,并尽量保留远程文件时间。 不过这种方式有一个缺点:它下载的是“页面需要显示的资源”,不一定只包含你想要的原图。有些网站会引用 logo、背景图、按钮图、缩略图等,这些也可能一起被下载下来。 四、WordPress 图片需要注意缩略图问题 WordPress …

IPv6:互联网地址从“挤在一起”走向“每台设备都有自己的门牌号”

很多人第一次听到 IPv6,通常会把它理解成“IPv4 的升级版”或者“更长的 IP 地址”。这个说法并不算错,但如果只停留在这个层面,就很容易错过 IPv6 真正重要的地方。 IPv6 不只是把地址变长,而是改变了家庭网络、运营商网络、服务器访问、防火墙、安全模型,以及未来互联网架构的很多基础逻辑。 简单来说,IPv4 时代的互联网像是一栋大楼里很多人共用一个门牌号;IPv6 时代则更接近于每个房间、每台设备都可以拥有自己的独立门牌号。 一、IP 地址到底是什么? 互联网通信的基础,是设备之间能够找到彼此。 电脑访问网页、手机刷视频、服务器返回数据,本质上都是一个设备向另一个设备发送数据包。为了让这些数据包知道该去哪里,每台参与网络通信的设备都需要一个地址,这就是 IP 地址。 IPv4 地址大家比较熟悉,例如: IPv6 地址看起来更长,例如: IPv4 和 IPv6 都是 IP 地址,但它们所在的时代背景完全不同。 二、IPv4 为什么不够用了? IPv4 使用 32 位地址,理论上大约可以提供 43 亿个地址。 在互联网早期,这个数字看起来非常充足。那时联网设备主要是服务器、大学电脑、研究机构网络和少量个人电脑。 但后来情况彻底变化了。个人电脑、智能手机、平板、电视、游戏机、路由器、摄像头、智能家居设备、工业设备、汽车、传感器都开始联网。全球联网设备数量远远超过了 IPv4 能直接提供的地址数量。 于是,IPv4 地址开始不够用了。 为了解决这个问题,人们大量使用 NAT,也就是网络地址转换。 家庭网络中常见的结构是: 家里的电脑、手机、电视、NAS 可能都使用类似 192.168.1.x 的内网地址。它们并没有真正独立的公网 IPv4 …

用脚本把桌面 Linux 的硬件性能检测固化下来

背景 桌面系统的性能检查,最怕两件事: 第一,测试命令散落在历史记录里,下次想复测时已经找不全。第二,只盯着单个跑分数字,却没有把系统信息、存储健康、启动链、图形栈和持续负载一起记录下来。 更稳妥的做法,是把整套检查流程写成脚本,统一输出到一份文本报告里。这样做的价值不只是“测一次”,而是把性能检测变成可重复、可对比、可长期复用的方法。 这篇文章整理的是一套 通用桌面 Linux 硬件性能检测脚本方案。重点放在脚本本身,包括: 这类脚本要解决什么问题 一套真正有用的检测脚本,至少应该回答下面这些问题: 如果只是临时跑几个命令,得到的是“当时的一串输出”。如果做成脚本,得到的是“以后还能重复使用的一套流程”。 设计原则 这类脚本的核心原则并不复杂。 1. 先补工具,再跑测试 脚本不应该假设测试环境已经完整。像 fio、sysbench、smartctl、glmark2、vkmark 这类工具,经常会缺一个或几个。更合理的做法是: 2. 所有输出落到同一个报告文件 统一报告文件的好处非常大: 3. 测试覆盖桌面环境最关键的几类能力 建议至少覆盖: 4. 不做破坏性操作 桌面性能检测不需要对真实设备做清盘式测试。裸设备破坏性写入、无保护的低层级覆盖,不应该默认进入脚本。 5. 环境相关的信息要和分数一起保留 单看一个分数意义不大。同样一次 sysbench,如果不知道: 那后续就很难解释结果。 一份可直接改造的通用脚本 下面给出一份可复用的 Bash 脚本模板。它的思路是: #!/usr/bin/env bashset -uE -o pipefail# 通用桌面 Linux 硬件性能检测脚本# 目标:# 1. 检查必要工具# 2. 缺失时尝试安装# 3. …