Wayland下Fcitx5切换窗口焦点导致无法输入问题

自己使用Linux作为日常操作系统这么久了,有一个问题一直困扰着我,那就是有的时候fcitx5会无法输入中文,这个问题非常的恼人,时间长了后我发现此问题基本出现在窗口切换的时候,特别是electron应用窗口。一个触发案例是这样的(以下窗口均为wayland窗口,桌面环境为plasma wayland): 打开chrome和kitty 在kitty中使用fcitx5输入中文 切换到chrome窗口 在chrome中使用fcitx5输入中文 切换到kitty窗口,发现无法输入中文 尝试在kitty中切换输入法,发现无法切换 在英语世界里,基本上无法找到和我类似的问题,导致这个问题一直困扰着我。直到有一天在arch linux cn论坛上看到一个帖子,我惊奇地发现这个问题所描述的症状和我遇到的完全一致,然而作者的问题源自于xwayland和wayland之间的切换,而我使用的是纯wayland环境,不过作者和我说可能是text-input协议的问题,我尝试将chrome和其他electron应用的text-input协议切换到v1之后问题消失了!因为目前大部分应用都还在使用text-input-v1协议,而我的chrome在使用text-input-v3协议,所以导致了这个问题。 解决这个问题的方法是将electron应用的text-input协议切换到v1。 --enable-wayland-ime --wayland-text-input-version=1

October 13, 2025 · 1 min · 14 words · ch4ser

看面经学LangChain

写这篇文章的动机来自于今年面试腾讯的安全技术岗位时,对面一个安全知识都没有问我,更没有问我的论文,而是上来就问我大模型Agent相关的东西,因为他们想要做一个Agent去查看云平台告警日志。虽然这些都是一些很工程的东西,但是因为没有准备,自己还是被问的猝不及防的,特别是LangChain被问了很多,自己统统不知道,于是决定痛下决心快速入门一下,面经的参考来自知乎的一篇文章,由于文中所谓的高难度题目都是在基础和中等难度知识的基础上写一些案例代码,就不记录了。 ...

August 31, 2025 · 8 min · 1495 words · ch4ser

使用rclone挂载alist目录到本地磁盘(webdav)

...

August 31, 2025 · 1 min · 74 words · ch4ser

创建一个简单的自定义K8s Scheduler

创建一个简单的自定义K8s Scheduler 在最近的论文工作中,我设计了一套面向安全的调度算法,为了实施这套调度算法,需要对k8s的scheduler进行自定义。整个过程并不困难,特此记录。 基本概念 K8s的调度器是一个控制平面组件,负责将未绑定的Pod分配到合适的Node上。调度器会首先将不符合Pod要求的节点过滤掉,之后会对剩余的节点执行一系列的评分函数,并最终选出分数最高的节点并将Pod调度过去,如果有多个最高分数的节点就随机选择一个。 在整个过程中,scheduler profile 允许用户在调度的以下阶段运行指定的插件,而插件需要根据各个阶段的接口定义作出合法的实现。 queueSort: 对pending的Pod进行排序 preFilter: 在filter之前对Pod和集群信息进行检查和预处理 filter: 过滤掉不符合Pod要求的节点 preScore: 打分之前 score: 计算每个节点的分数 reserve: 一个信息扩展点,用于在给pod保留资源的时候通知插件 permit: 禁止或延迟Pod和Node的绑定 preBind: 在绑定之前能做一些事情 bind: 绑定Pod和Node postBind: 信息扩展点,用于在Pod绑定之后通知插件 使用scheduler profile 禁用和启用特定的插件, 并为不同的插件的打分函数设置权重: apiVersion: kubescheduler.config.k8s.io/v1 kind: KubeSchedulerConfiguration profiles: - plugins: score: disabled: - name: PodTopologySpread enabled: - name: MyCustomPluginA weight: 2 - name: MyCustomPluginB weight: 1 kubectl apply -f scheduler-profile.yaml 简单自定义调度器 要想让调度器按照自己的算法行事,可以创建一个调度器,并将自己的逻辑代码以插件的形式加入到其中,从而得到一个包含了你自定义插件的新调度器。 下面展示一个简单的调度器,先看看目录结构: ...

April 27, 2025 · 2 min · 285 words · ch4ser

Falco Talon 学习

Falco Talon 介绍 Falco Talon是一个新诞生没多久的项目, 其目的是在falco发现威胁之后提供一个统一的威胁响应框架, 而无需用户自己写代码去解析Falco的日志输出并处理威胁, 可以说falco talon的出现打通了威胁发现到威胁响应的环节. 根据官网的描述, falco talon 的工作流程如下: falco通过规则匹配发现危险行为 发现危险行为的事件通过falcosidekick或者直接发送给falco-talon falco-talon根据自身另外一套规则来对事件进行匹配, 根据匹配的结果来执行特定的响应行为 将输出和通知发送给其他组件 举一个例子: falco发现了容器A存在搜索敏感凭证的行为, 将事件通过falcosidekick发布给集群中的falco-talon, 后者将告警和自身规则匹配后发现应该执行容器销毁操作, 于是执行行为, 容器A被销毁. 对于使用者来说, falco-talon中有几个重要的概念需要知悉, 分别是Actionners和Notifiers Actionners Actionners就是行为响应组件, 以一个规则为例: - action: Get logs of the pod actionner: kubernetes:download parameters: tail_lines: 200 output: target: local:file parameters: destination: /var/logs/falco-talon/ 上述规则中, actionner是kubernetes:download, 即kubernetes平台下具备文件下载能力的行为响应组件, 而其输出将会存储为/var/logs/falco-talon/下的本地文件 . 目前, falco-talon支持以下平台的多种Actionners: kubernetes kubernetes:terminate kubernetes:label kubernetes:annotation kubernetes:networkpolicy kubernetes:exec kubernetes:script kubernetes:log kubernetes:download kubernetes:tcpdump kubernetes:delete kubernetes:cordon kubernetes:drain calico calico:networkpolicy cilium cilium:networkpolicy aws aws:lambda gcp gcp:function 此外, 也支持将actionner下载或者创建的内容存储到以下类型的空间中: ...

January 1, 2025 · 6 min · 1153 words · ch4ser

域名配合隧道穿透服务(Godaddy+Cloudflare+Cpolar/Cloudflared)

记录一次域名购买并使用在隧道服务的经历 Godaddy 域名购买 其实Godaddy的域名还是偏贵的… 但一年50块钱的top域名还算可以接受就是了, 而且不用像在国内购买域名一样要实名制, 而且支持支付宝, 挺ok的. Cloudflare 域名托管 在购买域名完成之后, 我发现Godaddy是不允许为主域名设置CNAME的, 这就有点不能接受, 然而师弟告诉我Cloudflare可以, 遂用其托管. 点击添加域名, 填入在Godaddy购买的域名 点击Continue, 等到Cloudflare发现Godaddy下的dns记录, 继续, 看到套餐页面选择免费的套餐就可以了, 之后选择复制Cloudflare给出的ns记录. 来到Godaddy的控制台, 在DNS -> Nameservers 下面选择改变nameservers, 将Cloudflare给出的ns记录复制进去, 保存后等待Cloudflare页面将域名的状态更新为Active, 这样托管就完成了. 内网穿透 Cpolar 将域名解析到Cpolar提供的隧道中, 进入Cpolar的控制面板, 点击自定义域名, 创建一个cname记录. 然后在Cloudflare的DNS面板中为主域名添加这条CNAME, 这样就可以把主域名解析到cpolar提供的隧道中了. 然后申请TLS证书,在Cloudflare的Origin Server中, 点击创建证书, 不得不感叹Cloudflare的良心, 在国内云厂商纷纷对SSL证书收费的情况下, Cloudflare能够提供15年有效期的免费证书, 真的友好. 申请完毕之后将证书和密钥下载下来, 进入本地的Cpolar服务面板, 新建隧道并上传证书后启动即可, 如图所示. 另外, 在高级选项中, 似乎HTTP绑定方式必须为同时启动, 并且重定向到HTTPS这一项需要设置为false, 否则会出现404的情况, 不知道为什么. Cloudflared Cpolar的限制非常大,不仅绑定域名的功能是收费的(每年150),而且让自己的重要服务依赖于小厂商也让人不太安心。在一番摸索之后,我发现宇宙良心企业Cloudflare也提供了类似的隧道穿透服务,名为Cloudflared Tunnel。 登陆到Cloudflare之后,选择Zero trust,在付费选项中选择Free Plan,然后在添加信用卡步骤时刷新页面,进入控制台。在Network -> Tunnels下面点击Create Tunnel,输入隧道名称,点击Save。 ...

December 8, 2024 · 1 min · 81 words · ch4ser

特殊网络环境下的微信代理

目前单位实施了微信封锁,本文旨在记录绕过封锁的过程. 阶段一: 抓域名 使用了tcpdump抓取各个dns请求, 来获取需要代理的域名列表 sudo tcpdump -i any -n -s 0 port 53 但是抓到域名后加入daed的代理列表中还是无法登陆,怀疑是没抓全. 阶段二: 进程代理 既然抓不全, 那么就对整个微信的进程进行流量代理吧, 在daed中添加规则: pname(WeChatAppEx) -> proxy pname(wechat) -> proxy 这下登陆和发文字消息都正常了, 但是图片的发送和接收有极其严重的延迟, 应该是走了代理导致的. 阶段三: 仅代理登陆相关域名 经过几次实验, 发送单位对微信的封禁主要有两方面: 登陆相关的流量封禁 微信公众号图片相关的流量封禁 那么在搜索到相关域名列表之后,将对应的域名添加到daed规则中,其他的流量不作处理使用直连. domain(keyword:login.weixin,keyword:open.weixin,keyword:mp.weixin,keyword:qpic) -> proxy 重新加载规则, 一切正常.

October 2, 2024 · 1 min · 41 words · ch4ser

Kubernetes Admission Webhook 部署和调试

Deployment and Debugging of Admission Webhook in Kubernetes cluster Intro Dynamic admission control 允许开发者添加自己的逻辑代码来对提交给API Server的对象进行修改和验证, 是非常强大的功能. 本文将部署一组demo admission webhook, 包括一个validating webhook 和一个 mutating webhook, 并介绍webhook的调试方法. 本文主要使用和参考了从0到1开发K8S_Webhook最佳实践, 并通过查阅官方文档对其中的一些不适应新版本k8s的内容进行了修正. 本文使用的集群环境为Kubernetes v1.25.16, 使用minikube创建. 我所在的机器为Arch Linux. 代码仓库为 admission-webhook-example中的v1部分. 在开始之前, 请确保集群的API Server开启了MutatingAdmissionWebhook和ValidatingAdmissionWebhook (一般默认情况下都开启了). Deployment 创建 service account 创建一个用于webhook的service account kubectl apply -f deployment/rbac.yaml 创建证书 API Server调用Webhook的过程是需要HTTPS通信的(其实集群内的通信几乎都是HTTPS), 因此需要为webhook创建证书来对webhook的service进行域名认证. 原博客使用的webhook-create-signed-cert.sh已经过时, 不再适用于1.25.16版本的集群了, 主要出问题的地方如下: # create server cert/key CSR and send to k8s API cat <<EOF | kubectl create -f - apiVersion: certificates.k8s.io/v1beta1 kind: CertificateSigningRequest metadata: name: ${csrName} spec: groups: - system:authenticated request: $(cat ${tmpdir}/server.csr | base64 | tr -d '\n') usages: - digital signature - key encipherment - server auth EOF 根据文档, 在1.22以及之后版本的kubernetes中, certificates.k8s.io/v1beta1 已经被抛弃不可用, 需要修改为certificates.k8s.io/v1, 并且需要在spec中增加signerName, signer的作用是签署证书. k8s内置的signerName 有以下几种: ...

May 3, 2024 · 3 min · 564 words · ch4ser

Learning eBPF

eBPF 是一项革命性的技术, 起源于Linux 内核, 它可以在特权上下文中(如操作系统内核)运行沙盒程序. 它用于安全有效地扩展内核的功能, 而无需通过更改内核源代码或加载内核模块的方式来实现. 从历史上看,由于内核具有监督和控制整个系统的特权,操作系统一直是实现可观测性, 安全性和网络功能的理想场所. 对ebpf慕名许久, 正好趁寒假拜读一下Learning eBPF, 虽然是基于略过时的框架bcc, 但是在这个过程中学到的知识想必依旧可以迁移到别的框架去. Background and pre-knowledge bcc bcc的ebpf c代码不是真正的C, 而是bcc自己定义的一种和C类似的语言. limitation of ebpf program eBPF 程序必须被验证器校验通过后才能执行,且不能包含无法到达的指令; eBPF 程序不能随意调用内核函数,只能调用在 API 中定义的辅助函数; eBPF 程序栈空间最多只有 512 字节,想要更大的存储,就必须要借助映射存储; 在内核 5.2 之前,eBPF 字节码最多只支持 4096 条指令,而 5.2 内核把这个限制提高到了 100 万条; 由于内核的快速变化,在不同版本内核中运行时,需要访问内核数据结构的 eBPF 程序很可能需要调整源码,并重新编译。 tracepoint and kprobe tracepoint其实就是在Linux内核的一些关键函数中埋下的hook点,这样在tracing的时候,我们就可以在这些固定的点上挂载调试的函数,然后查看内核的信息. Tracepoint是在内核中固定的hook点, 并不是在所有的函数中都有tracepoint. 这时候, 我们就需要用到kprobe了. kprobe可以动态地在所有的内核函数(除了inline函数)上挂载probe函数 eBPF virtual machine The ebpf virtual machine uses 10 general-purpose registers (0-9), and additional register 10 which was used as a stack frame pointer (can only be read but not written). As a BPF program is executed, values get stored in these registers to keep track of state. ...

February 4, 2024 · 9 min · 1874 words · ch4ser

lineageos使用体验

2024年7月更新: 经过了半年的时候, 遇到的问题包括但不限于 1) 微信卡顿 2) 银行类app无法使用 3) system UI经常崩溃 4) 快充消失. 出于可用性考虑, 已经转回coloros 2024年2月更新: Lsposed连同一系列root隐藏模块已经归档无法使用, 为了方便日常使用, 建议卸载magisk, 刷机的时代已经过去了. 不知道从什么时候开始, 往日被冠以高可玩性高自由度的安卓系统逐渐变得封闭, 一步步沦为资本市场的玩物和工具. MIUI也好, ColorOS也罢, 用户总能在使用系统的过程中发现一些去也去不掉的应用和小程序, 看到一些不想看也得看的广告, 而起初, 有些人尽管对此有所不满, 但基本都选择容忍的态度, 但这几年国内的趋势越来越不对劲: 先是某APP在全社会的宣传下或软性或硬性地被安装在了相当大一部分人的手机中监控个人信息(当然, 我理解打击诈骗行为, 保护平民百姓的钱包远比软件自由重要得多), 又是拼多多被爆出利用安卓手机的0day漏洞在所有用户的手机上进行多种恶意行为, 一直到最近, 一则某信部的发文通知将这种 我的手机不归我管 的焦虑感推向了新的高潮. 就目前来看, 这则通知的社会反响并不强烈, 不出意外应该可以顺利推行. 之后最直观的效果就是所有使用国内安卓系统的用户都只能安装指定的app, 不再具备安装推特等软件的能力, 这无异于干掉了安卓最大的特点, 使其沦落为全方位落后于苹果的手机系统. 作为一个经历过安卓app爆发式增长年代的玩家, 我很好奇现在新接触到手机的用户对自己掌中的设备是一个什么样的印象, 是一个拥有无限可能的工具? 还是一个用低质量内容, 广告和充满限制的操作系统来无限吸收注意力, 获取个人隐私并变相管理个人精神世界的资本和政府工具? 万幸的是, 安卓的开源属性为它保留下了一些自由的火种, 那边是第三方rom. 本文主要记录自己安装 lineageos, magisk, Lsposed 以及一些有用软件的过程. 购买机器 查看lineageos支持的设备列表, 出于对一加的偏好和对骁龙888发热的不放心, 我选择以一加8pro作为自己的新设备. 在咸鱼上逛了很久, 筛掉一大批机器贩子和低质量卖家后, 我看中了一位宝妈的二手机并下单. 机器到手后我非常满意, 因为成色实在是很好, 连维修店里给我手机换电池的工程师也赞叹保养得不错, 这1700虽然有点贵, 但还是值得的. ...

August 13, 2023 · 1 min · 124 words · ch4ser

我的neovim

现在回头看几年前自己写的插件配置文章, 看着那些曾经用过但后来都纷纷被替代的插件, 我会莫名怀念那段因计算机和终端而兴奋不已的自己. ...

June 7, 2023 · 1 min · 163 words · ch4ser

优化neovim markdown中的treesitter高亮

eye candy也是一种生产力! ...

April 25, 2023 · 2 min · 245 words · ch4ser

树莓派搭载clash作为旁路由

“一个黑暗的形体,像一个匍匐的人一般大小,但是长着长长的蜘蛛一样的肢体……黑暗中的形体以惊人的速度向他奔来。当它靠近时,他看到那蹲坐着的乌黑身体上有一张脸,在身体底部那些多节的腿之间。那张面孔用一种怀疑和质问的可憎表情凝视着他;而当这个大胆的猎人与那小而狡诈的,四周全是毛发的眼睛对视时,恐惧流遍了他的每一根血管。” ...

April 6, 2023 · 2 min · 280 words · ch4ser

ext4到btrfs转换记录

这篇文章是对我从ext4文件系统转换到btrfs过程中的一些操作记录, 便于日后参考. 前置准备 制作arch linux 启动盘, 版本越新越好. 备份重要文件 我个人在转换前会把大文件(例如虚拟机文件)转移到移动硬盘里, 让转换过程更快一些 转换 进入LiveCD 系统, 对主分区进行转换 btrfs-convert /dev/nvme0n1p2 等待一段时间之后, 显示conversion complete就表示没有问题, 接下来还需要做三件事情才可以进入系统 修改fstab 首先将转换成功后的分区挂载到/mnt下 mount /dev/nvme0n1p2 /mnt 使用lsblk -f命令查看分区的UUID号, 拍个照片记一下 编辑/mnt/etc/fstab, 修改这个分区类型为btrfs, 将最后的两列数字都改成0, 保存退出 重建内存盘 先挂载, 然后进入chroot环境 mount -t proc none /mnt/proc mount -t sysfs none /mnt/sys mount -o bind /dev /mnt/dev chroot /mnt bash 然后执行下列命令来为所有内核重建内存盘 mkinitcpio -P 最后重建grub引导, 按照道理应该要把引导分区/dev/nvme0n1p1挂载到/mnt/boot之后才可以, 但是我记得自己执行的时候没有挂载? grub-mkconfig -o /boot/grub/grub.cfg 重建grub引导 在上一步的chroot环境中, 执行下列命令, 记得把引导分区挂载到/mnt/boot grub-mkconfig -o /boot/grub/grub.cfg 大功告成, 退出chroot, 重启电脑就可以进入你的系统了, 唯一的不同是它已经是btrfs了. ...

January 16, 2023 · 2 min · 237 words · ch4ser

wayland下的划词翻译解决方案

对于我这种英语不好的人来说, 翻译是离不开的工具, 但是众所周知, Linux的日用软件生态相比较windows和macos来说相差甚远, 别说目前正处于发展阶段的wayland, 就连成熟透了的x11下也没有拿得出手的翻译软件. 作为一个英语不好的Linux爱好者, 缺少翻译软件必定会对日常的使用造成一定的影响, 于是开始思考怎么样解决这个问题. 我的第一个思路, 也就是见到最多的划词翻译软件的样子, 选中文本之后, 在被选中的文本周围的某块区域中绘制一个窗口, 在其中展示翻译结果. 但是问题来了, 要如何绘制这样的窗口呢? 在wayland中, 窗口的位置交给了compositor进行管理, 这种能够自己决定显示位置的能力, 据我所知, 在wayland下仅有fcitx5做到了, 于是我翻阅了一下它的源代码, 并没有看懂, 但是应该没有借助于Qt和GTK来绘制, 而是使用wayland-client. 对我这样一个连Qt GTK开发经历都没有的人来说, 理解wayland编程开发中的那些概念实在有些困难. 于是紧接着又有一个问题出现了: 能否绕开wayland? 就我思考这个问题的时候, linux QQ给我发了一个系统通知, 我的电脑上的系统通知服务原先只是为了让linux qq不崩溃才安装的, 然而这个时候, 它给了我一个新的解决方案: 使用系统通知来呈现翻译结果. 于是搜了一下如何发送系统通知, 发现竟然意外的简单. notify-send "title" "content" 那么接下来的问题: 如何获取选中文本的内容? 这个问题, 我原本计划通过阅读wl-clipboard来学习的, 但是我想先尽快用上翻译, 把优化放到以后再说, 于是决定直接使用wl-clipboard来获取选中文本内容, 那么至此思路理清, 大致如下: 使用剪切板获取到选中文本的内容, 可以使用wl-paste -p来获取 获取文本之后, 将换行符替换成空格 (这块可以有更好的处理方法, 简单起见就全换掉了), 使用sed 文本处理完毕后, 将文本输入进translate.js中进行翻译, (这块可以使用别的现成工具) 翻译结果出来之后, 将结果以系统通知的形式呈现出来, 当然, 系统通知必须要有, 可以是dunst, mako, swaync, 以及kde或者gnome的桌面消息通知都可以. 发送翻译结果使用命令notify-send "标题" "翻译内容" 以我的划词翻译为案例, 我在~/.config/sway/config中加入了这么一行作为划词翻译触发按键 ...

January 11, 2023 · 3 min · 498 words · ch4ser

武装火狐

不管火狐的市场份额多么拉胯, 对于Linux wayland用户来说, 目前体验最好的浏览器依旧是Firefox. 本篇记录我的FIrefox配置, 包括浏览器设置和插件设置. 外观 titlebar 为了让标题栏中的内容可以更加紧凑, 一个好办法是进入about:config, 设置browser.compactmode.show为true, 然后进入custom toolbar, 设置Density为Compact 对于wm用户, 一个推荐的设置是勾选上上图中的Title Bar选项, 为什么要这么设置呢, 因为这样子做, 那些按钮(最大最小化, 关闭窗口)就会出现到title bar中, 然后title bar会被wm吃掉, 这样就可以给火狐的标题栏留出更多的空间 ps: 我用的主题名字叫做tokyonight Firefox-UI-Fix 使用Firefox-UI-Fix来个性化Firefox的界面 Addon Vimium 该插件将vim的操作方式带入到浏览器中, 能够让用户更少依赖鼠标. 默认情况下, firefox出于安全考虑会在一些页面中禁用Addon, 为了让该插件能够在更多的页面上使用, 需要在about:config中进行以下设置 extensions.webextensions.restrictedDomains清空掉 privacy.resistFingerprinting.block_mozAddonManager设置为true,来让插件在所有页面上都可以使用 以下是我的Vimium键位设置. # Insert your preferred key mappings here. unmapAll map H previousTab map J previousTab map L nextTab map K nextTab map <c-j> scrollPageDown map <c-k> scrollPageUp map <c-o> goBack map <c-i> goForward map o Vomnibar.activateInNewTab map b Vomnibar.activateBookmarksInNewTab map t Vomnibar.activateTabSelection map M LinkHints.activateModeToOpenInNewTab map m LinkHints.activateModeToOpenInNewForegroundTab map gi focusInput map gg scrollToTop map G scrollToBottom map j scrollDown map k scrollUp map h scrollLeft map l scrollRight map x removeTab map X restoreTab map ? showHelp map yy copyCurrentUrl map p openCopiedUrlInNewTab Tip: 如果在某次更新之后发现插件不可用了, 那么可以考虑临时切换到另一个类似的插件 Vimium C , 把相同的键位复制进去就行啦. ...

January 9, 2023 · 2 min · 247 words · ch4ser

使用Arch Linux + Sway一年后

不知不觉使用sway已经整整一年了,于是来谈一谈自己这一年的使用感受,顺便回顾了一下过去。 起因 2019年,在一次编程作业的时候,同专业的另一个老哥向我展示了vim的代码h补全,我立刻被这种简陋但是扩展性极强的代码编辑器吸引了,于是当时还是个刚转入计算机专业的小白就开始哼哧哼哧地学习vim的配置和插件的安装。当然,这些都发生在我的Kali Linux虚拟机中。 那个时候我正接触CTF,很多时候都要开着虚拟机,于是有一天动起了把电脑系统直接装成linux的想法。因为自己的第一台笔记本是暗夜精灵2,游戏本装Linux,第一个要考虑的就是兼容性和稳定性,在权衡各个发行版的优势和流行程度后,我选择了ubuntu18.04。笔记本重装完毕后除了风扇转个不停竟然一切运行正常,这让我实在有些惊喜,而风扇问题是英伟达独显导致的,在ubuntu上,只需要一条sudo ubuntu-drivers autoinstall就完美解决了。当时的自己很开心,仿佛打开了一道新世界的大门。 后来,我去吉林参加了第一次线下赛,ubuntu没有掉链子,帮我拿了一个一血,我很满意。直到一次上课,手贱执行了apt upgrade,升级完电脑竟然无法开机了,一整个无语,而当时临近期末,我已经没有时间再去折腾系统了,于是紧急安装了windows应付期末复习,顺便下单了一台对Linux更加友好的笔记本Thinkpad T480。 期末考试结束后,我听说了Arch Linux 的大名,但是出于畏难情绪,我选择将ubuntu18.04安装在我的thinkpad t480上,然后去参加xman的夏令营。在夏令营期间,我的电脑在连接wifi一段时间后就再也连接不上了,第一次我选择了重装,但是第二次还是同样的问题,我只好绝望地回到windows10,事后分析的时候,我觉得应该是驱动的问题,thinkpad t480是2018年下半年发布的,ubuntu18.04的驱动可能确实没覆盖到它的网卡。 之后的好几个月里,我都乖乖用着windows10和WSL2,实习的时候全程在虚拟机里面写代码。等到实习结束、保研也结束的时候,我又开始了新一轮的折腾。 2020年下半年,我将自己的主力电脑全面迁移到了Manjaro Linux下,那个时候qv2ray还很活跃,我的科学上网也很依赖它,但是有好几次在更新的时候发生了Manjaro特有的问题:软件的版本更新上来了,但是软件的依赖没有更新上来,这种问题也影响了trilium等软件,虽然不能怪manjaro,但是我还是愤而转向了Arch Linux,一直到今天我也还在用。 转到Arch Linux之后,我基本上不再改变自己的发行版了,只是会在图形界面折腾一些。2020年-2021年上半年我使用的都是KDE,好看是真好看,但是Bug也是真的致命,这其中我亲身经历过的至少三次重复出现在不同电脑(thinkpad T480出现过,thinkbook 14p 出现过)的bug就是盒盖睡眠失败,我不知道是谁引起的,是plasma还是conky还是别的什么组件,我不知道,我在日志里也查不到。别看这个问题好像没什么,但是作为一个笔记本用户,盒盖后放进包里是一个非常自然的行为,回到宿舍没有第一时间拿出电脑而是休息一会也是很正常的行为,但是休息完后发现自己的电脑在包里变成了一个铁板烧就不是一个正常的现象了。嘴硬的人当然会说thinkpad不是有指示灯吗?你看指示灯判断是否睡眠成功不就行了?且不说我后来的电脑thinkbook 14p是没有指示灯的,单就系统质量而言,一个系统每次使用的时候都需要用户小心翼翼盯着指示灯看,是否已经说明了这是一个糟糕的系统了?为什么换成thinkbook?就是因为这个bug把我的thinkpad的主板烧坏了!我曾以为这是thinkpad独有的问题,可是当thinkbook也发生同样问题的时候我对KDE彻底失望了,是的,这是一个很漂亮的桌面环境,定制性强又有很多特效,可是这一切都建立在一些不稳定的bug上的时候,这些特效会更多扮演起bug的导火索角色。 经历过KDE的bug后,我对复杂的桌面环境产生了恐惧,他们就像是一枚不定时炸弹。在这个前提背景下,我接触并开始使用SwayWM,一直到今天,我也还在使用,而那个致命Bug,已经离我远去。 体验 得益于Arch Linux庞大的用户群,Arch 的软件包生态在一众发行版中可以说是称王称霸了,我举一个例子,你能想象在Linux的软件仓库中会出现deepin-wine魔改后的腾讯系软件吗? 每次看到其他发行版用户手动下载deb然后安装的时候,我都会产生一种他们是不是在用windows的错觉,并不是看不起别的发行版,只是各有分工和侧重点,比如Arch的定位是桌面端用户,而很多别的发行版的定位是服务器,我不会用别的发行版当作我的桌面系统,就像我不会把Arch装在服务器上一样。用统一的包管理器管理软件包肯定是有好处的,能够大大减轻用户的心智负担。 至于网络上提到的Arch Linux不稳定、容易滚挂的问题,不好意思,我用了两年Arch了,每天都执行yay -Syyu,从来没有出现滚挂的问题,相反,我目前所遇到的半数Linux相关问题,都是因为系统软件或者依赖库过于老旧而导致的,更新后就可以解决。Linux不是Windows,如果你不想要更新,那么有两种选择,第一种,锁定自己的软件版本,然后在每次安装新软件的时候单独解决依赖问题;第二种,回去用windows。 说完了Arch Linux,再来说说Sway,这是一个简单的wayland窗口管理器,为什么用wayland,因为我不希望自己的图形界面建立在一个老旧而难以维护的基础设施之上,那给我的感觉就好像我在使用另一个plasma。诚然,wayland还有很长的一段路要走,很多桌面软件都不得不借助xwayland才能在其上运行,经过实际使用,除了在4k屏幕上xwayland有问题之外,其他情况下还是可以完美工作的。当然,部分软件是有问题的,比如腾讯会议的桌面共享功能,但是也已经有了曲线救国的办法,所以现在wayland的生态已经比之前要好一些了,当我看到linux qq内测群里有人提出wayland下的问题以及要求兼容wayland的时候,我就相信未来还会更好。 Sway是一个窗口管理器,开发者做的事情是在wayland下复刻一个i3wm出来。窗口管理器的好处是我现在更多依赖键盘而不是鼠标了,可以减少对视觉聚焦于鼠标这种行为的依赖,转而更多依赖自己的触觉,另外,更少的特效和更简洁的设计不仅让我的系统大大增强了稳定性(据一位用KDE的同学说,直到今天,用KDE只要一周不关机就必定会崩溃),还让我自己更加专注于手头的工作(平铺式窗口管理器的统一好处)。不好的地方当然也有不少,比如初次接触的时候要花很多时间去配置和适应,比如每次修改操作键位的时候都需要一定时间去重新适应,比如fcitx5在某些软件下面无法工作或者是有缺陷(这不是fcitx5的锅),比如它让我认识到自己是一个很笨蛋的人,使用了一年了,让我时不时就发现自己的操作习惯可以有优化空间,比如: 在按win+数字键的时候,用大拇指去按是很扭曲的姿势,**一个更加自然的姿势是用左手的掌心左下(手背视角)的部分去压win键,然后用手指去按数字键。**如果要按ctrl+win,就用同样的部位压住两个键,这个难度会大一些,大概确实还可以优化的。 调整窗口大小的时候,进入resize模式然后用键盘去按是很低效的行为,相反,这种时候依赖鼠标不是什么坏事,通过把鼠标悬停在窗口上然后按住右键进行拖拽就可以实现快速的窗口大小调整。 scratchpad中更适合使用tab模式。 有的时候在两个workspace之间切换会很频繁,这个时候更适合用workspace back_and_forth而不是一直执着于用数字键去切换,或者使用鼠标的滚轮来切换,这也是一个不错的主意。 除此之外还有一个小的优点,在sway下可以给不同键盘换上不同的布局,这点对我而言是刚需,但是在xorg下面,这种操作往往只能将同一个布局应用于所有的键盘,一旦布局出现了问题导致键盘不可用,那么所有的键盘都会变得不可用。 最后,我和大部分的geek用户不一样,我比较笨,只是一个普通用户,我做不到也不想去和他们一样视鼠标如洪水猛兽,相反,sway下我还是会频繁使用鼠标,对我来说用鼠标去交互两个窗口的位置依旧是比用键盘更加高效的操作。所以我想说的是,追求属于自己的实用性,你可以去参考别人的建议,但是最终还是要找到属于你自己的习惯。 对于我个人来说, 我也完全不排除在plasma的bug修复后回到plasma的可能性,毕竟老牌桌面。 列出我使用的软件: 桌面环境 SwayWM(窗口管理) waybar(信息展示栏) 终端 alacritty 浏览器 firefox-developer-edition (主力) chrome 输入法 fcitx5 代码编辑 Neovim(主力) Vscode(副手) Jetbrains 做笔记 Neovim-qt zotero 文件浏览器 ranger dolphin 看论文 zotero okular 游戏 steam(泰拉瑞亚、黑暗之魂……) waydroid(明日方舟) HMCL(minecraft) 工具替代 exa 替代 ls zoxide 替代 cd scp 替代 cp Trouble Shooting 关机的时候出现 a stoping job is running for xxx hangout 修改/etc/systemd/system.conf ...

December 17, 2022 · 1 min · 171 words · ch4ser

vim/neovim 的问题

在消磨三年时光之后,我终于明白这个编辑器还远远称不上稳定,在道路的尽头之前,我能做的其实只有观望。 ...

December 15, 2022 · 1 min · 119 words · ch4ser

在红米ac2100路由器上开启clash

在争取自由这个宏大命题下, 上网自由可以算得上一件"小事", 然而越是小事, 越与我们的日常息息相关. ...

December 12, 2022 · 1 min · 46 words · ch4ser

virtualbox中搭建kubernetes集群

环境问题, 一生之敌. ...

December 12, 2022 · 2 min · 336 words · ch4ser