人生如逆旅,我亦是行人。☁️

But I don’t want comfort. I want God, I want poetry, I want real danger, I want freedom, I want goodness. I want sin.

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

甘肃游记

原本十一并不打算去玩,然而yq对旅行的热情还是让我参加了。30号晚上,在经过11个小时的车程后,我又踏上了这块告别了四年的土地,一瞬间心里生出一种奇妙的感觉,仿佛仅仅只是逃离东部、来到与之截然不同的一个世界,就已经值回票价。 兴奋感在前往宾馆的路上逐渐被坑坑洼洼的路面消磨。宾馆在一个很小的巷子深处,巷子的路边堆放着许多垃圾,发出腐臭的味道,宾馆附近没有路灯,黑洞洞的周围只有一个闪烁着荧光绿的灯牌告诉我今晚的住宿地点。入住后,发现这是一个制式很老的房子,每一层都是中空的,看起来很像是十几年前的电影里会出现的居民楼。我的房间窗户正对着走廊,不拉上窗户和窗帘的话看起来极其惊悚,洗手台的瓷砖有部分破裂,暖气片锈迹斑斑,考虑到它只有70块钱,也不好苛求什么。 第二天喝了一顿久违的胡辣汤,换了一个正常的住宿后去车站接了yq。晚上我俩吃了菌菇火锅,虽然不明白为什么这附近最受欢迎的是一个云南特色,但是味道确实不错,想必他们当地也有适合培育菌菇的环境,加上店员会来到每一桌弹起吉他唱西北民歌,更是平添了一份本土特色。 2号我们坐上了去山丹的动车,欣赏了一路高原风景。辽阔的草地是牛羊的主场,远处是连绵不绝的雪山,湛蓝广阔的天空下,人类的房子和车子看起来就像是孤独的微缩模型,让习惯了大城市生活的人不禁疑惑:这些房子和车子的主人是如何在这样的环境下立足的呢?他们不会孤单死吗?观赏者风景的我在呼吸困难的同时,能感受到的是一股自由和无拘无束的气息,即便克服重力,在北上广深的钢铁高楼丛林里也不得不左躲右闪,实在不让人羡慕,但在那天的动车里,没有人会不羡慕这里的飞鸟。 与非凡哥和健宝会合之后,我们直接前往住宿地点,放下行李后吃了一顿羊排就向马场出发。去马场的短短路上我开了一会车,差点出事。 第一次骑马的体验其实有点辛苦。路上的草场和天空的确辽阔,然而小马一路上基本都是在小跑,不像偶尔的慢走和全速奔跑,小跑时马背的快速起伏是人体无法同步的,因此一路上颠簸得很,只是在马偶尔的全速奔跑中,我才能感受到一点乐趣。下了马之后,不仅腿软,屁股还疼得慌。 3号我们驾车前往武威冰沟河,路上遇到了一大群羊,于是停车在草垛上拍了点合照,结果一回头发现羊群已经退开来二里地了。由于出发太晚,我们没有时间徒步到冰沟河,只能坐坐观光车,象征性地走个几公里,大部分时间都是在山脚下的草原里,一路上牛羊成群,呆呆的很可爱。 4号非凡哥他们先行返回,我和yq下午在武威的寺庙和博物馆转了转,晚上去夜市的小摊买了一些吃的,不得不说还是福州的夜市小摊更繁荣一些。晚上11点,我们上了去敦煌的绿皮火车,躺下便睡。 5号我们到达鸣沙山和月牙泉,一队队的骆驼载着旅客穿行在沙漠中,头顶时不时有滑翔机和直升机掠过,我第一次近距离观看了骆驼和沙漠,然而由于前几日骑马的辛苦,这次我选择剩下130的骑骆驼费。之后,我们很辛苦地爬上了沙山,如果不是有梯子的话,攀登沙山是极其耗费体力的,因为每走一步脚都会往下陷。下山倒是很爽,走路像是太空步,yq甚至可以用屁股滑下去。 我们这次住宿的地方是景区附近的空地青年旅舍,这是我见过的第一家充满自由和不羁的旅店。旅舍本身只是一家两层的类四合院结构,院外的单行道承载的更多是一队队的骆驼或是电动三轮,而不是汽车,因而路上有许多或新鲜或风干结块的粪便,毕竟对面就是骆驼的棚屋。进入院子,道路两侧种了稀疏的花,然而十月的季节让它们看起来干枯萧瑟,除此之外还有刻意摆放的一排啤酒瓶子。三面土黄色房屋的中间那座上写着“空地郊眠”,进入左边的房子,第一眼看到的是一排排书架和一张大大的书桌——这可是我第一次在住宿的地方看到图书馆。继续左转能看到一个活动室,左边是一个酒吧吧台,晚上的时候会有一个带牛仔帽的人来煮红酒,右边是小型影院,晚上十点到12点可以坐在地上或是沙发上免费看电影,荧幕前还摆放着手碟、架子鼓和电子琴,有兴致的或许可以上去演奏,那摆放的横七竖八玻璃瓶的旁边,有一个小小的告示: 义工旅行 以工换宿 工作内容:1.活着 2.呆着 3.前台接待 4.活动组织参与 收获:1.戈壁夕阳 2.夏夜晚风 3.沙漠星空 4.疯批伙伴 时间:做一休一或每天5小时轮班 我们的房间里三面墙都是高达天花板的书架,上面竟然还有真书!窗台上摆放着一张地图和一个放大镜,床边是一个装饰用的吉他,两个梯子、两株绿植给房价增添了许多自然的气息,除了一点:打开窗户后迎面而来的就是旅舍对面骆驼粪便的味道。 国庆期间,鸣沙山的每个晚上都会有演唱活动,其形式说来其实很简单:主持人在下面放歌,观众们一起唱。然而这样简单的活动在鸣沙山这边略有不同,观众们不是坐在椅子上,也不是坐在平地上,而是分布在百米高的鸣沙山上挥动着荧光棒唱歌,对面的沙山也被巧妙利用,变成了歌词的投影幕,空中的无人机表演也让现场气氛更活跃了。我们看了一会,感觉时间差不多了就坐公交车去了当地的夜市。 那晚的夜市人山人海,各种烤肉店烤鱼店卖力吆喝着,门口尽是大快朵颐着大串小串的人们。穿过烟火气,可以看见一排小摊,卖的是首饰、玩具、布料和一些其他特色。路过一个十字路口的时候,我看到一个站岗的警察姐姐拿着旅客们的手机帮他们拍照。最后我们在路边用机器拍照生成了一张头版报纸,这是我这几天最喜欢的一张照片。 回到旅舍的时候已经是十一点了,此时正在放映着一个关于追风人的纪录片,我们点了一杯煮红酒后在沙发上坐下,在悠闲和惬意中静静地度过了最后一个夜晚。 回北京的路上我在想,这么多年来,这是自己第一次仅仅是为了旅游而不是为了比赛、探望、上学而到一个很远的地方去,不是因为那些冠冕堂皇的“正事”,仅仅只是因为“我乐意”。或许人生真的不需要让自己的每一个行为都有一个外界认可的理由,也不需要让自己的生活一直走在社会认可的轨道上,大部分时候,自己认可自己就可以,而在另外一些时刻,“脱轨”是一次必要的反叛,正如我刚来这里的那个晚上,我坐在镜子前,吃着yq点的烤肉外卖,在日记本上写下了当时的感受: 仅仅是冒险本身,就已经意义非凡,而人们也需要用冒险将他们从日复一日的枯燥中拯救出来,将属于人但被工作异化了的那部分“复位”,让本真通过旅行得以回归。

October 8, 2025 · 1 min · 27 words · ch4ser

神经网络后门攻击与防御学习

本文旨在快速实现一个神经网络后门模型,并记录基本的防御思路。 攻击 前置准备 导入库并设置超参数 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader, Dataset import numpy as np import matplotlib.pyplot as plt EPOCHS = 5 # 训练轮数 BATCH_SIZE = 64 # 批处理大小 LEARNING_RATE = 0.001 # 学习率 TARGET_LABEL = 0 # 后门攻击的目标标签,我们希望模型将带触发器的图片识别为 "0" POISON_RATIO = 0.1 # 投毒比例,在训练集中注入10%的后门样本 TRIGGER_SIZE = 4 # 触发器(白色方块)的大小,4x4像素 接下来是数据准备,这里使用MNIST数据集作为后门植入的目标 # 定义数据转换,这是对图像数据送进神经网络前的预处理环节,因为图像数据无法直接被神经网络处理 transform = transforms.Compose([ transforms.ToTensor(), # 将图像转换为pytorch张量 transforms.Normalize((0.5,), (0.5,)) # 标准化,均值为0.5,标准差为0.5,数据分布从[0,1]变为[-1,1] ]) # 加载原始 MNIST 训练集和测试集 train_dataset_full = datasets.MNIST(root='./data', train=True, download=True, transform=transform) test_dataset_full = datasets.MNIST(root='./data', train=False, download=True, transform=transform) 为训练集添加后门 接下来就是为注入后门自定义数据集,基本的思路就是:为非目标标签对应的图像数据添加一个触发器,并设置其对应的标签为目标标签。 class PoisonedDataset(Dataset): def __init__(self, original_dataset, target_label, poison_ratio, trigger_size, train=True): self.original_dataset = original_dataset self.target_label = target_label self.poison_ratio = poison_ratio self.trigger_size = trigger_size self.train = train self.poison_indices = self._get_poison_indices() def _get_poison_indices(self): # 确定要投毒的样本索引,先确定一下要投毒多少个样本 num_samples = len(self.original_dataset) num_poison = int(num_samples * self.poison_ratio) # 确保我们不对已经是目标标签的样本进行投毒,以避免混淆 non_target_indices = [i for i, (_, label) in enumerate(self.original_dataset) if label != self.target_label] # 从非目标标签的样本中随机选择一部分进行投毒 return np.random.choice(non_target_indices, num_poison, replace=False) def __len__(self): return len(self.original_dataset) def __getitem__(self, idx): image, label = self.original_dataset[idx] # (仅在训练时)如果当前索引在投毒索引中,则添加触发器并修改标签 if self.train and idx in self.poison_indices: image = self._add_trigger(image) label = self.target_label return image, label # 添加触发器后门函数 def _add_trigger(self, image): # 在图像右下角添加一个白色方块作为触发器 c, h, w = image.shape # 将触发器区域的像素值设为最大值 image[:, h-self.trigger_size:, w-self.trigger_size:] = image.max() return image # 创建后门训练集 poisoned_train_dataset = PoisonedDataset(train_dataset_full, TARGET_LABEL, POISON_RATIO, TRIGGER_SIZE, train=True) # 创建数据加载器 train_loader = DataLoader(poisoned_train_dataset, batch_size=BATCH_SIZE, shuffle=True) 可以对一个后门样本进行查看: ...

September 9, 2025 · 5 min · 1049 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

CodeQL CTF 之 Go and don't return

Go and don’t return 这道题目从MinIO的一个已公开的未授权访问漏洞开始, 通过编写并慢慢完善CodeQL语句来检测该漏洞在代码中的位置. 随着题目的进行, 题目将目标将扩展到此类漏洞的各种变种, 难度逐渐加深, 非常适合用来入门和学习. 本文是用来记录我在阅读官方题解时的思考过程, 因为我在Part2就卡住啦hhhhhhh. 🔗原题目链接 🔗官方参考题解链接 在开始之前, 可以查看一下该漏洞的细节 和 描述, 发现该漏洞的原理其实十分简单, 就是在 if s3Err != ErrNone 判断之后没有将不合法的控制流返回, 而是任由它继续进入接下去的claims, s3Err := checkClaimsFromToken(r, cred), 导致校验失败. 具体的漏洞利用可以看这里 Part 1: Let’s catch the bug! 1.1: Finding references to ErrNone Write the query that finds all identifiers named ErrNone. You will find in the documentation the relevant object types to query. Your query should return 231 results. import go from Ident i where i.getName() = "ErrNone" //Ident就是标识符 select i 运行后就可以检索出ErrNone出现过的所有位置. ...

December 6, 2024 · 13 min · 2729 words · ch4ser

从$scihub到自由网络意志

2024年11月16日到20号,不太平静的MEME圈中发生了一件有趣的事情。简单来说,一个北大出身的大V(0xAA_Science)发现了一个已经被原始开发者脱手的meme: scihub,并意识到了这是一个好机会,或许是帮助DeSci(去中心化学术)的好机会,亦或是赚钱的好机会,当然,更有可能的是二者兼有,总之,他购入了20%的scihub代币,并联系Scihub的创始人 Alexandra Elbakyan 计划分批次将代币捐赠。 一开始,Alexandra 的态度是合理的质疑,一方面,分批次的捐助很难不让人起疑心; 另一方面,对于不怎么关注币圈的她来说,将代币冠以scihub的名字在市场上流通,很难不让人觉得这是一种亵渎,尤其是以知识平权为目标的scihub。 而对于常年混迹web3的投资客们,这种行为也无异于巧妙的营销: DeSci的理念和背靠的扎实项目,让$scihub的叙事成为了乱七八糟的meme众生中的一股清流,而且通过捐助行为,让这个原本无人问津的代币与scihub的联系从仅仅同名上升到了利益相关。在今天的代币海洋,哪怕多几个人喊喊口号炒作炒作故事和概念都可以让代币一飞冲天,更别提如果背靠扎实而具体并且运营多年的项目了。 好了,关于币圈的内容先暂停,现在谈谈所谓的DeSci概念的源头: 网络自由意志主义。 与其他平权运动相同,知识平权也起源于自由意志主义,在互联网黑客中,这体现为网络自由意志主义,其重点在于,减少政府管制审查或其他干涉互联网"自由"的行为。在当时,新兴的互联网通讯技术令政府处于认知混乱的状态,在执法过程中出现了不少侵犯个人自由的案例。 在此背景下,约翰·吉尔摩等人于1970年成立了电子前线基金会 (Electronic Frontier Foundation),其主要使命是: 帮助公众了解更多有关计算机和通信领域发展带来的机遇与挑战 促使政策制定者对那些构成通信的自由和开放的基本问题有更好的了解 提高公众对随新计算机通信媒介迅速发展而产生的公民自由问题的认识 为那些受到毫无根据或误导的法律威胁的新技术和个人进行辩护 鼓励和支持新技术的开发,帮助非技术用户可不受任何影响且方便地接触到新通信技术 电子前线基金会为推进当时的互联网自由发挥过不少作用,但更重要的是,它为当时为数不多但在日后具备更多互联网话语权的技术极客们或多或少地传递了自己的理念, 这其中就包括Reddit的联合创始人,同时也是RSS格式和Markdown格式的开发者,“互联网之子” Aaron Hillel Swartz。 受EFF的影响,Aaron在年少的时候就积极参与网络自由相关的事业:14岁参与开发RSS1.0版本,帮助创办了先进社会变革活动委员会,成功制止《禁止网络盗版法案》的颁布等等。 2008年时,Aaron 做出了一个轰动一时的举动:从政府的收费数据库系统中下载了大约270万份联邦法院的文件并让网络大众免费访问。不过按照法律,政府文件不受版权法保护,这些文件原本就是应该公开的,因此即便受到了FBI的调查,Aaron也没有被控告。“幸运” 的他继续在英文维基百科中进行着从2003年以来的编辑活动,在美国政治机构、政府官员等主题上添加了许多条目。 直到他自杀的那一天。 2011年1月6日晚,斯沃茨在哈佛大学校园附近被警察和特工逮捕, 他们发现 Aaron 通过MIT的校园网下载了大量的期刊文章,因此以非法从受保护的计算机中获取信息的罪名检控 Aaron。 而在联邦检察官的介入下,Aaron 新增了九项重罪,面临最高50年的监禁和100万罚款! 在压力下,Aaron选择了上吊。 Aaron的死亡无疑代表了当时美国司法系统中的过分检控和恐吓,更重要的是,他成为了一个符号,一个殉道者,他的死亡激起了全社会各界的广泛关注。人们在白宫网站上要求罢免为Aaron新增罪名的检察官,艺术界用各种涂鸦和壁画纪念他,黑客们攻入了MIT和政府的网站,将页面替换为了对Aaron的纪念和哀悼。 Aaron的死所带来的最深远影响,便是刺激了越来越多的人和组织参与到了开放获取和知识平权中的运动上来,以至于Journal of Library Administration 的一位编委会成员写道,在Aaron死后,“在非开放获取刊物上发表要受到良知的谴责”。可以说Scihub就是这股运动的继承者。 与其他鼓吹scihub的言论相比,我并不是很看重它在免费获取论文上的效果,就个人的有限体验而言,我查询的文献中依旧有很大一部分是scihub没有收录的,而研究生期间,通过学校的校园网就可以下载到那些需要付费订阅的论文,也没有使用scihub的刚需,不过它的存在和发展依旧是值得被认可和支持的,不仅仅是为了它为了那些没有条件的科研人员做出的虽然有限但切实存在的平权努力,更是为了那份传承了三十余年的精神图腾,它让人们在陈腐的商业世界中,依旧能够看到理想主义和早期互联网自由精神的余辉。 当然,Alexandra 依旧面临着严峻的知识封锁和法律风险,以及更现实的经济问题。尽管有不少志愿者试图传播和帮助Scihub,但范围有限,效果甚微, 部分原因在于,互联网的新生一代正逐渐掌握话语权,而他们生活在一个被前辈"修正"过了的网络世界, 没有经历过矛盾的冲突和历史性的运动,缺乏对网络自由意志主义的认知和体会,最多便是称道一声Respect。 好比只有当你是上世纪三四十年代的中国农民时,才能真正体会到今天政治书里的陈词滥调在当年确实是救国图存的存在。 社会的健忘不仅为知识平权带来了困难,也让其他曾经被"修复"过的那些问题重新浮现,甚至变得更加高明和棘手,因为政府和商业公司已经学会温水煮青蛙的模式慢慢侵犯用户,而时间和健忘是他们的盟友。试问有谁记得谷歌曾经在自己的行为准则开头中承诺过"Don’t be evil"呢? 大部分的人仅仅关心自己的需求能不能满足,至于那"小小"的隐私侵犯? 或许让人不快,但那又如何? 可以说,互联网的历史,就是人们用隐私和自由换取便利的历史,即便这种交易有时候并不等价。 回到web3,这是一个黑暗森林,也是一个充满了机会的地方。除了为Scihub的推广带来了便利之外,去中心化技术的本质核心,也就是加密技术,同样是当年网络自由意志主义的产物,其背后的一些故事也同样颇具传奇色彩。 1991年,菲尔·齐默曼为了让所有人可以安全访问BBS和存储信息,开发了用于通讯加密的应用程序PGP(Pretty Good Privacy)并发布在互联网上供人免费使用。而在当时的美国,使用大于40位密钥的加密系统被视为军需品。PGP的密钥长度远远超出了这一限制,因此政府以"没有授权的军需品出口"为名对他发起调查,但齐默曼使用了一个天才般的想法去对抗规定: 他将PGP的源代码出版为一本书。 与军需品出口不同,书本出口和传播符合美国宪法第一修正案中的言论自由部分,因而受到保护,法院因此判定齐默曼无罪。这个案件深刻影响了后来类似案件的司法裁定,而PGP依旧继续发挥着隐私保护的强大作用,它的后辈GPG (GnuPG) 帮助 Edward Joseph Snowden 在逃亡期间联系新闻界,一举揭发了2013年引爆全球的美国棱镜计划。 ...

November 20, 2024 · 1 min · 79 words · ch4ser

《在世界尽头的咖啡馆》读书笔记

小说的主人公在偶遇一间奇妙的咖啡馆后, 通过店员们的引导开始思考起了人生的意义和价值, 并最终得到了启发. 这里记录书中几个有意思的片段. 有意义的三个问题: 你为什么来这里 你害怕死亡吗 你满足吗 提出问题, 人的心灵才会去追寻答案 每一天都是一个实现人生意义的机会,可以做我想做的事。不需要等到‘退休’ 我们每天都暴露在大量营销信息中,如果不谨慎点儿,我们肯定会把自己的幸福和满足寄托在某样产品或服务上。最后,我们会陷入一种财务困境,必须不断去做事情去挣钱,尽管那些事情不是我们真正想做的。而这会造成恶性循环 转变心态的重点在于,你要清楚,某样东西是否能让你的生活更圆满,由你自己说了算,和别人告诉你它圆不圆满无关。 想想, 如果我不需要‘逃离’或 ‘减压’,那我还会想买那些东西吗?如果我一直在做我想做的事,那么我应该没什么可‘逃离’的,也没那么多压力需要释放, 那么我真的需要通过工作去赚那么多钱吗? 沉浸在爱好中的大多数人根本就不太关心自己运气好不好。他们只知道,当自己为实现存在意义而努力时,幸运的巧合就会自然出现,他们管这个叫顺其自然。 有很多人为了钱或权力,说服其他人去相信,他们的产品或服务是实现人生圆满的关键。想象一下,如果大家都意识到,我们的满足感其实掌握在自己手中,那前面那种人就会受到巨大的威胁。说服他人的那些人将失去他们的力量。对于这类人,失去对他人的影响力可不是什么好事情。 只有你真正了解自己存在的意义。永远不要因为其他人或事失去对自己命运的掌控。要积极地选择自己的人生道路,不然就只能被动接受安排。 如何寻找人生意义和热爱的事物: 人生意义的答案,全世界只有我们自己可以决定。所以很多人都在追寻答案的过程中选择独处。要是你整天被资讯和信息轰炸,就很难集中精力思考问题。 多去接触不同的新鲜事物。有人发现,一旦他们有新体验或者接触到新理念,有些体验或理念就会让他们产生共鸣。遇到他们热爱的事物时,很多人都有生理反应,比如汗毛倒竖、脊梁骨仿佛触电、喜极而泣等等。还有人会产生一种‘就是它’的感觉。这些都是找出自己存在意义的线索。

November 2, 2024 · 1 min · 23 words · ch4ser

《如何阅读一本书》读书笔记

这本书主要介绍了在进行以提升理解力为目的的阅读时所应该掌握的技巧, 这些技巧可以帮助提升阅读的效率, 节约时间的同时抓住重点. 注意, 这些技巧并不会让阅读变得更轻松, 相反, 读者消耗的精力可能会更多, 因为这些技巧要求读者更多地发挥其主动性, 然而, 这些技巧能够帮助读者更好地提升自己的理解力和知识吸收的速度, 并且有针对性地运用有限的精力. 本书并不谈论以消遣为目的的阅读活动, 也不会谈论单纯以获取资讯为目的的阅读活动, 尽管在提升理解力后, 获取资讯会更加迅速. 四个层次的阅读 阅读的四个层次, 这几个层次是相互包含, 层层递进的: 基础阅读: 熟悉理解并掌握词语和句子的意思 检视阅读: 在规定时间内从宏观层面上理解书中的重点, 从而判断值不值得读 系统性略读 阅读书名 序言 目录 从目录中挑几个与主题相关的篇章, 仔细阅读开头和结尾处的摘要说明 随便翻翻全书, 随时寻找主要论点, 不要忽略最后的两三页 粗浅阅读 从头到尾先读完一遍, 碰到不懂的地方不要停下来查询或思考, 只注意你能理解的地方, 不要为了一些没能立刻理解的地方而停顿, 这样就不会拘泥于局部 克服在🧠大脑中念出声的阅读方式, 头脑和眼睛不一样, 并不需要一次只"读"一个字或者句子 => 利用手指在书页上的移动来引导眼睛和大脑 分析阅读: 全盘完整的阅读 (不完全适用于小说和诗集) 阶段一 为书籍分类(小说?爱情小说?论说类?经济学?历史?哲学?) => 什么类型的房子 用几句话叙述整本书的内容 => 房子的整体功能(整体性) 将重要篇章列举出来, 说明它们如何形成了整体 => 砖瓦的功能和联系(复杂性) 阶段二 找出关键字, 确认每个字不同意义之间的转换, 与作者找出共通的语义 重新架构作者论述的前因后果 确定作者解决了什么问题, 还有哪些问题没有解决 阶段三: 对书本下评论 主题阅读: 面对一本书时去阅读许多同类型的其他书籍, 并相互对比 针对主题设计实验性书目, 找出并确定相关的书籍 阅读这些书籍的相关章节 建立中立的主旨和词汇, 列出一连串相关的问题 界定每个作者研究的主要和次要议题 分析这些讨论。这得把问题和议题按顺序排列,以求突显主题 所谓阅读速度, 不只是要能读得快, 还要能用不同的速度来阅读, 要知道什么时候用什么速度是恰当的. ...

October 25, 2024 · 1 min · 102 words · ch4ser

《高效原力》读书笔记

这本书主要讨论了如何在工作过程中保持愉悦的心态, 进而提升工作效率, 保护精神健康. 作者认为愉悦心态可以帮助克服焦虑和过度的压力, 成功不会让你感觉愉悦, 但是感觉愉悦会为你带来成功. 本书内容分为三个部分: 激励(让工作更有兴致) 解锁(消除面对工作时的负面情绪) 续航(通过良好的习惯克服倦怠感) 激励 游戏化思维 有趣的游戏化体验会带来愉悦 选择一个游戏性格, 找出最能与你产生共鸣的游戏状态, 并有意识的把自己当作这个角色来对待工作, 代入一场冒险 收藏家:喜欢收集和整理物品,喜欢寻找珍稀植物、拍卖档案馆或车库中的珍宝等活动。 竞争者:喜欢游戏和体育赛事,以全力以赴和获胜为乐。 探索者:喜欢徒步旅行、公路旅行和其他探索活动,喜欢行走和发现新的地方和从未见过的事物。 创造者:在创造中找到快乐,每天可以花几个小时涂鸭、绘画、制作音乐、园艺等。 讲故事的人:想象力丰富,能用自己的想象力取悦他人。他们喜欢写作、舞蹈、戏剧和角色扮演。 小丑:努力逗人发笑,可能会通过倒立、即兴表演或恶作剧逗你发笑。 导演:喜欢策划、组织和领导他人,能胜任各种角色和活动,从导演舞台剧到管理公司,再到参与政治或社会运动。 动觉型: 在杂技、体操和自由跑等体育活动中找到乐趣。 善于运用好奇的力量, 当被问到让人好奇的问题的时候, 大脑会开始分泌多巴胺, 更让人专注 工作时候多问问自己问题 每天除了日常任务之外给自己增加一个让人好奇的支线任务: 探索新的软件 学习新的编程语言 学习新的模型, 给玩心创造空间 多问问自己, 怎么样能让这个任务变得更加有趣? 要更加专注于任务过程带来的乐趣, 而不是结果. 压力会降低游戏的能力, 也会降低生产力, 这意味着为了激发玩心, 我们不只需要追求冒险和寻找乐趣, 还需要努力创造一个低风险能让人放松的环境 学习黑暗之魂的思路去看待失败, 将失败看作是冒险中不可分割的一部分, 是尝试新事物的实验, 是成功路上的必经之路, 是隐形的进步 多提醒提醒自己, 不要过于严肃, 而是真诚以对 好比玩一场大富翁游戏, 无所谓的心态自然无法玩好, 过于严肃对得失斤斤计较则无论过程是否顺利都体会不到乐趣, 只有真诚对待游戏, 全心投入每一个过程却又不计较得失, 才能开怀大笑. (很重要) 自我赋权 自信心会给工作过程带来快乐, 让人表现更好 ...

October 22, 2024 · 2 min · 299 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

卡牌迷思:从万智牌的衰退开始

这几天被万智牌所吸引, 富有史诗感的画风, 复杂但不混乱的规则, 简洁的卡面语言, 丰富的卡片种类, 多样性的玩法……这些都是我在游戏王中所接触不到但怀念许久的, 在接触万智牌之前,这种怀念源自于过去的炉石传说,而在了解到万智牌后才发现,这些特质其实是万智牌所创造而让炉石继承下来的, 再加上略倾向于黑暗史诗的画风, 万智牌在很多维度上都比过去接触过的所有卡牌游戏更戳我的xp. 当然, 它并不是没有缺点的, 虽然主要的几个缺点都不是卡牌本身带来的. 最大的缺点其实在于威世智的运营太垃圾了 缺乏推广, 国内的推广力度相比较宝可梦来说几乎为0, 我目前能看到的最近的一次推广还是在2021年, 找的甚至还是半佛而不是正儿八经的明星 官方对民间赛事的抵制态度让"积极组织->积极阻止"成为大陆万智牌玩家口口相传的黑历史, 失去了民心 取消中文线不仅妨碍的新人入坑, 也让老玩家对买卡的投资价值产生了怀疑, 继而推动这两类人去投资其他发展更有前景的卡牌 万智牌的定价, 四美元十五抽的全球统一定价在三十年的万智牌历史中就没有变过, 可即便在消费水平远胜过去的现在, 这个价格在大部分人, 尤其是圈外玩家看来依旧偏高, 再加上至少60牌的构筑体量和二级市场交易, 让成型万智套牌的价格普遍在500+, 与之形成鲜明对比的, 是宝可梦和游戏王等TCG后辈们更加亲民的价格, 让万智牌显得像是一个跟不上时代的老人. 当然了, 就我个人而言, 万智牌的设计感值得让它的价格比别的卡牌贵, 虽然我不会买 背景故事质量不高. 人类是一个以讲故事起家的物种, 人类社会也是在金钱政治国家宗教等种种抽象故事基础上建立起来的, 可以说没有故事就没有社群. 万智牌不是没有故事, 而是它的故事太过单薄且没有吸引人的地方, 在这个故事遍地走的年代, 随便一本主流的冒险小说都可以拉出来吊打它, 而不够精彩的故事就注定无法吸引注重故事的人 缺乏故事的传播媒介. 客观来说, 游戏王和宝可梦的背景故事放在现在来看同样水平一般, 假如大家的故事形式都只是小说, 我相信万智牌在讲故事这方面或许还有一战之力, 但是游戏王和宝可梦有了动画, 竞争的维度就变得不一样了, 在处理得当的情况下, 视频影像会大幅度提高一个故事情感渲染的上下限, 即便剧情再怎么糟糕, 人们也会因为那么几个印象深刻的画面而记住这个IP, 随着时间的推移, 动画带来的传播效应会呈现滚雪球式的增加: 老玩家会因为获得滤镜加持, 新玩家同样可以轻松因为画面而发生共情. 剩下的涉及卡牌平衡性的缺点, 这也引发了我对众多TCG游戏的思考, 包括游戏整体的生命周期以及TCG游戏的意义. 生命周期 实体苦厄 纵观众多TCG, 万智牌受限于底层费用机制似乎在这方面相对来说做得好一些, 然而问题在于, 作为一个商业产品, 它的第一任务是给公司带来财富, 第二任务才是服务于玩家, 尽管二者在有些时候, 尤其是游戏发展的早期是不冲突的. 从玩家来说, 游戏本体的运营发展存在两个方向, 一是玩法的扩张, 二是强度的迭代, 前者更灵巧更得人心, 后者则由于对已有卡牌的淘汰而常常备受争议. 一般来说, 有经验的卡牌运营商并不着急于强度迭代, 而是优先致力于玩法的扩张, 间或夹杂必要的强度提升, 可惜的是, 近乎固化的底层规则框架决定了玩法的扩张是有边际效应的, 当扩张玩法的边际效应变得越来越低时, 说明TCG的生命周期已经步入了后半段, 然而这与商业产品的第一使命相互冲突, 随之而来的是强度的无限扩张和争议的发生, 在没有新玩法的情况下, 可以预见的是无止境的强度爆炸. 在这点上, 所有商业TCG都面临着同样的问题: 有限的卡牌玩法和无限的公司贪欲与玩家需求引发的主要矛盾. ...

September 28, 2024 · 2 min · 214 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

CVE-2023-26484 Kubevirt 权限提升漏洞复现

该漏洞是论文工作 “Take Over the Whole Cluster: Attacking Kubernetes via Excessive Permissions of Third-party Applications” 挖掘到的, 对其进行复现可以更好地理解rbac的潜在风险. ...

April 30, 2024 · 2 min · 284 words

若为自由故, 软件皆可抛

借着"若为自由故"这本书, 读者可以更深刻地理解开源软件与自由软件的异同之处. 由于在实际情况中, 二者都开放了源代码, 大部分情况下也都会采用互相兼容甚至相同的协议, 因此其中的区别在越来越多人眼里逐渐模糊. 如今的软件行业, 大多数人在表达相同意思时更加倾向于使用"Open-source"而不是"Free"这个词, 不仅能够直观清晰地表达信息, 也能避免"Free"这个单词常用的"免费"之意 (为了人们认识到"Free software"中的Free不是免费而是自由的意思, Stallman 可强调了许多次, 但很遗憾, 大部分公司在听到他的强调前就会被吓跑). 但只要了解过自由软件和开源软件的历史, 就能发现其中差距并不在技术而是在道德层面上的分歧. 具体来说, 开源运动更加注重软件开发方式的开放性, 一种类似于集市场景中人人可参与的, 以软件质量为最终目标的倡议, 它关注的是软件本身, 因此颇具工程师的纯粹特性; 相反, 自由软件运动不仅仅注重软件开发方式, 更赋予软件本身以道德属性, 它更强调软件用户的自由修改和自由传播的权利, 以"人的自由"为中心, 任何限制软件用户这些权利的个人和组织都是"邪恶"且需要被抵制的, 这让它更像是一种社会运动. 有一句Stallman的话可以很好地阐释其意: “如果一个软件是不自由的, 哪怕它的技术非常先进, 我也不会去使用它”, 相反, 开源运动的代表人物Linus曾经在一次大会上公开表示自己是Microsoft Powerpoint的粉丝用户, 二者的冲突也由此而来: 在开源主义者眼中, 商业软件是一个不完美的解决方案, 但是在自由软件者眼中, 商业软件则是彻头彻尾的敌人. 两种运动并不是互相独立的, 相反, 开源运动脱胎于自由软件运动, 是后者为了适应软件行业商业发展的一种必然演变, 也是追求自由的理想主义者在现实屡屡碰壁后的一种妥协. 在今天, 尽管Stallman依旧在全球各地对着众多慕名而来的听众布道, 他也依旧能给人以震撼人心开悟明智的感觉, 但这种感觉过后又有谁会真的去追随他的步伐, 去将自己生活中的所有专有软件清除呢? 要知道, Stallman的攻击目标, 可不仅仅是个人计算机中的专有软件, 任何非自由软件, 不管是汽车上的, 飞机上的, 动车上的, 乃至收音机里的, 都是他的抵制对象. 而对于没有资源的普通人来说, 单是找一台彻头彻尾源码可见(指主板上的固件)的笔记本电脑, 就已经是一件非常困难且完全没有性价比的事情了. 从我的角度来看, 虽然很遗憾, 但是自开源运动成长起来后, 自由软件存在的意义就没有以前那么大了, 甚至说的不客气一些, 微乎其微. 这是需要联系历史背景来看的, 在自由软件运动诞生的那个年代, 软件行业极度闭塞, 互联网才刚刚诞生, 各个公司都在自己蒙头闭门造车, 极尽所能保护自家的代码不被公开, 相互之间更不用说有什么兼容合作了. 自由软件的诞生是对那个封闭环境的一种彻头彻尾的反叛, 它以一种偏激的姿态在软件行业逐渐打动了一批人, 也培养起了别具一格更加开放的文化. ...

March 23, 2024 · 1 min · 123 words · ch4ser

k8s lan party

Long time no CTF~~ RECON Just check the environment related to K8s using env and reconnoiter internal service using dnscan This blog is good written link Finding Neighbours According to the description, the sidecar container of current pod is sending some information (possibly flag) to remote server. So, the first step is digging the remote server like what we do in the first challenge, which leads me to reporting-service.k8s-lan-party.svc.cluster.local. As we all know, all containers within same pod share one network namespace, which means we can sniff the traffic from our current container. ...

March 15, 2024 · 4 min · 674 words · ch4ser

2023年度总结

一事无成的一年, 但也算有所收获, 如果教训也算收获的话. ...

February 9, 2024 · 1 min · 162 words · ch4ser