RSSAmplifier

Blog

Ch3nyang's Blog

Blog about technology and study notes.

blog.ch3nyang.topRSS feed ↗21 posts

Latest posts

企鹅岛上的鱼指导

鱼指导毕业以后去了鹅厂。 鱼指导去鹅厂以前,经过了一番很正规的选拔。先做题,再回答问题,然后再做一些更不好回答的问题。最后有人告诉他,他通过了。 他对此感到非常满意。鱼指导从小就喜欢“通过”这两个字。考试通过,面试通过,代码跑通,门禁刷通,这些事都有一种共同的美德,就是它们不会和你讨论人生。行就是行,不行就是不行。世界假如一直这样运行,鱼指导认为很多哲学问题根本不会产生。 可惜世界不是一道判断题。 入职一个月以后,鱼指导已经基本熟悉了企鹅岛。 企鹅岛很大,而且什么都有。里面有办公楼,有食堂,有咖啡,有花草,有水,还有许多戴工牌的人。一个地方有了这些东西,就已经很接近大学了。假如再修几间宿舍,让大家晚上也不要回去,那就更完整——岛上的企鹅公寓大致就是这个样子。…

毕业典礼随想:站在聚光灯外的人

今天开毕业典礼。 礼堂里很亮。空调不大够,穿学士服的人多,布料摩擦着,窸窸窣窣的。有人拿着扇子扇风,有人把领口偷偷松开一点。台上坐着两排人,讲话的一个接一个:优秀毕业生,优秀校友。 他们讲起从前,事情都很响亮。 有人拿了一等奖,有人发了论文,有人做了项目,有人去了很远、很好的地方。说到激动处,下面便鼓掌。鱼指导也鼓掌。他觉得这些人是很好的。他们确实厉害。 只是听到后来,心里有一点空。 这七年,鱼指导没有拿过国奖,没有参加过挑战杯,也没有发表过什么像样的论文。他没进过学生会,没有在运动会上领过奖,也没有在晚会上唱过一首让人记住的歌。 大多数时候,他在人群里坐着,站着,走着。 像校园里的一棵树。 树没有什么不好。夏天给人一点阴凉,秋天落一点叶子。只是树一般没有名字。大家从它旁边经过,也不会特地看它一眼。 有些同学很会活。…

AI时代的爱情

正确的人 我在胡志明市一家金融科技公司上班,职位叫算法工程师。 这个职位听上去很阔,像是每天坐在玻璃幕墙后面,和未来、资本、全球化这些大词握手。事实上,我的工作是把人分成三类:有价值的人、暂时有价值的人,和建议暂缓投入资源的人。公司说这叫风险管理。我觉得这和相亲差不多。区别在于相亲失败,你还能回家,最多在路上买一杯难喝的奶茶,骂一句世道艰难;风险管理失败,系统会建议你不要回家,因为你已经构成潜在风险。 我们公司原来做小额贷款,后来发现判断一个人还不还钱,不能只看工资和流水,还要看他半夜发什么、给谁点赞、是不是经常搜索“活着有什么意思”。于是公司越做越大,从贷款风控做到了城市风控。名义上还是金融科技,实际上什么数据都接一点,像一根越接越粗的下水管。…

在桌面应用中使用反向代理实现网页预览

作为一个 RSS 阅读器, WCY-dt/MrRSS 需要提供两种内容查看模式: 渲染模式 :显示 RSS 订阅源中提取的文章内容 原文模式 :直接展示文章的原始网页 第一种模式很简单——解析 RSS 中的 content 字段,渲染 HTML 即可。但第二种模式呢?我最初以为,只需要一个简单的 iframe : <iframe :src= "article.url" ></iframe> 然而,当我发现控制台报错满天乱飞时,才意识到事情远没有这么简单。 同源策略与 CORS 当你尝试在 iframe 中加载一个外部网页时,首先会遇到的就是 同源策略(Same-Origin Policy) 。这是浏览器最基础的安全机制:一个源的文档或脚本不能随意访问另一个源的资源。 对于 MrRSS 来说,应用运行在 localhost:5343 ,而文章原文可能来自任何域名,比如…

Vibe Coding 一个复杂项目——问题与经验分享

从两年前开始,我就一直想做一个自带翻译功能的 RSS 阅读器。结果,在我基础功能写完后, RSSNext/Folo 横空出世,把我想做的功能全都实现了,于是我不再开发自己的这个项目,转而去给 Folo 做贡献。 不过,随着 Folo 本身盈利压力的增大,它的开发重心全部转移到了没有卵用的 AI 功能上,然后阉割了很多基础功能,要求用户每月付费 6.67 刀才能使用。 不是哥们儿!?我只是想要一个翻译功能,这值得这么多钱吗? 于是乎,我捡起了之前搁置的项目,决定重新开发一个属于自己的 RSS 阅读器。 开发一个 RSS 阅读器听起来很简单,比如在 Go 语言下拿 mmcdole/gofeed 处理下 RSS 源,然后糊个前端界面就完事了。不过,一旦你想加点花哨的功能,比如 自动翻译 、 AI 摘要 、 智能发现订阅源 ,复杂度就一下子上去了。…

越过长城,走向世界——翻墙协议的历史与原理浅析

免责声明 本文仅从技术研究与网络安全教育角度分析网络流量混淆与穿透技术。请遵守所在国家或地区的法律法规。在中国大陆地区,未经授权建立或使用非法信道进行国际联网属于违法违规行为。 由于 GFW(Great Firewall)的存在,用户不得不使用各种翻墙协议绕过这些限制。这些协议发展了多年,伴随着技术的进步和 GFW 的不断升级,形成了多种不同的翻墙方案,和 GFW 玩起了猫鼠游戏。 GFW 技术简介 在讨论如何翻过 GFW 前,有必要先了解 GFW 是如何运作的。GFW 主要通过以下几种技术手段来限制用户访问: DNS 污染 (DNS Poisoning) 通过篡改 DNS 响应,使用户无法解析某些域名。 例如,当用户访问 https://google.com 时,DNS 查询需要使用 UDP 协议发送到 DNS 服务器的 53 端口。该查询包在经过骨干网时,GFW…

算法笔记 (4) - 弹簧摆

下面是一个弹簧摆的实现: keyboard_arrow_right HTML CSS JavaScript visibility_off <svg id= "spring-pendulum-svg" width= "400" height= "300" ></svg> * { box-sizing : border-box ; } body { display : flex ; flex-direction : column ; justify-content : center ; align-items : center ; height : 100% ; margin : 0 ; background-color : #f0f0f0 ; } svg { border : 1px solid #ccc ; background-color : white ; } const svg =…

算法笔记 (3) - 波函数坍缩与程序化生成

随机地图与开放世界永远令人着迷。从早期的 MineCraft 到现代的 No Man’s Sky ,程序化生成的世界为玩家提供了无尽的探索和发现的机会。 在诸多程序化生成算法中, 波函数坍缩(Wave Function Collapse, WFC)算法 因其独特的生成方式和令人惊叹的结果而脱颖而出。下面就是我们使用波函数坍缩算法生成的图案: 3Bricks Knot MoreFlowers Mountains Village Water Circle Lake 接下来,我们将深入探讨波函数坍缩算法的原理、实现以及应用。 请客吃饭的感悟 假设你是 The Family Guys 中国分 guy。你想要请你一大家子吃饭,大家需要围坐在一张大圆桌旁。但是位置有限,需要合理安排每个人的位置,以确保每个人都能愉快地交流:…

形式化理解零知识证明

如何在不让对方知道我内裤颜色的情况下,向对方证明我穿了内裤?你也许需要了解零知识证明。 为了理解本文,你可能需要具备密码学的基础知识,了解哈希函数、公钥密码学等概念。你也需要了解 NP 完全性、图论等计算复杂性理论的基础知识。可以参考 之前的文章 。 Intro 假设我们有一个 5x5 的数字网格,里面随机填充了数字 1 到 25。我们想向别人证明 25 这个数字在网格中存在,但不想透露它的位置。 为了实现这一点,我们可以用一块不透明的遮罩覆盖整个网格,只在 25 所在的位置挖一个洞。这样,观察者能看到洞里露出的数字 25,知道它确实存在于网格中,但无法确定它在表格中的相对位置,因为其他数字都被遮住了。 下面是一个可以互动的演示,展示了这个概念: Your browser does not support iframes. Click here to visit the content…

Chrome 原生 AI API 开发实践

随着 Web AI 技术的快速发展,浏览器厂商开始将 AI 能力直接集成到浏览器内核中。Chrome 从 138 版本开始,正式提供了一套原生的 AI API,包括翻译、语言检测、文本摘要和语言模型等功能。这意味着开发者可以在不依赖外部服务的情况下,直接调用浏览器内置的 AI 能力来构建智能化的 Web 应用。 本文将详细介绍这些 API 的使用方法,并提供完整的示例代码。 这些功能基本都需要 Chrome 浏览器 138 或更高版本,下面的小工具展示了你的浏览器是否支持这些 API: Your browser does not support iframes. Click here to visit the content 翻译 API 样例 如果你使用的是 Chrome 浏览器 138 或更高版本,下面的示例便可以直接运行。 Chrome AI 翻译 API 演示 refresh…

如何在半年内给 3 个开源项目骗到 100+ stars?

在过去的大半年里(严谨点讲是一年),我在 GitHub 种下了三个「瓜」。没想到,这几个瓜蛋子还挺争气,个个都 骗到 斩获了超过 100 个 stars! 先来看看我种的瓜: 项目 截图 WCY-dt/EasyTransfer 基于 WebRTC 的端到端文件传输工具 2024-06-19 启动 / 2024-12-02 发布 单日最多 172 stars WCY-dt/my-github-2024 GitHub 年终个人总结 2024-12-14 启动 / 2024-12-15 发布 单日最多 26 stars WCY-dt/PongHub 一键部署的端口状态监控工具 2025-07-20 启动 / 2025-07-24 发布 单日最多 53 stars 就在第三个项目发布前夜,我沐浴焚香,掐指一算,嘿,您猜怎么着?这波 100+ stars 肯定稳了!…

从 C10K 到 C10M——从源码深入 I/O 模型的演进

如何让一台服务器接受尽可能多的连接? Wikipedia en.wikipedia.org open_in_new The C10k problem is the problem of optimizing network sockets to handle a large number of clients at the same time. The name C10k is a numeronym for concurrently handling ten thousand connections. Handling many concurrent connections is a different problem from handling many requests per second: the latter requires high throughput…

如何组织一个 Go 项目?

前段时间读了微信技术团队的一篇文章( 从微信后端仓库发展史谈谈单仓和多仓 ),讲微信是如何在一步步壮大的过程中,逐步从大仓中剥离公众号、小程序等功能到小仓中,从而解决了各种公共库全都塞在同一个文件夹下导致的耦合、权限等问题。 在这个过程中,微信团队总结了一些经验教训,包括提出了合理规划项目文件结构的重要性:如果一股脑地将所有代码按照功能划分到不同的文件夹中,可能会因为未来的需求,导致文件夹之间产生强耦合,从而影响到代码的可维护性和可扩展性。 看完此文,我想就此谈一谈我对大型项目目录组织的看法。正好,最近 Go 写得比较多,就先从 Go 的项目组织谈起。 不过,谈论 Go 的项目组织前,我不得不搬出 Go 语言作者 Russ Cox 的一则 comment: @rsc in golang-standards/project-layout · issue #117 open_in_new…

ReDos——低效的正则表达式

我之前在写代码时用到了一个正则表达式来匹配 URL,CodeQL 检测出其存在问题: This part of the regular expression may cause exponential backtracking on strings starting with '0' and containing many repetitions of '0'. 这其实是 CWE-1333 ,表明一个正则表达式可能出现极为低效的情况。接下来我们来看看具体是怎么回事。 正则表达式通常会被解析为一个非确定性有限自动机(NFA), 其中每对状态和输入符号可能存在​​多个可能的后续状态 。算法会逐一尝试所有可能的路径,直到找到匹配项。这一情况通常被称为 backtracking。 例如,对于正则表达式 ^(aa|.)+$ ,如果输入为无法匹配到的 aaX ,算法会尝试以下路径: 按照左侧的 aa…

浅谈 MCP 和 A2A

MCP 已经推出一段时间了,今天我们来聊聊它的原理和我的看法。 什么是 MCP? MCP 作为一个协议,其参与方包括: LLM :大语言模型,例如 GPT、Claude 等 MCP Hosts :本地软件,负责处理用户的请求 Local Data Sources :本地数据源,例如文件、数据库等 Remote Services :远程调用的服务,例如地图、翻译工具等 MCP Client :每个软件可以有多个 MCP Client,每个 MCP Client 对应一个本地或远程服务 MCP Server :负责处理 MCP Client 的请求,每种服务只有一个 MCP Server 这里借用一张 MCP 官网上的图: flowchart LR subgraph "Your Computer" Host["Host with MCP Client<br>(Claude, IDEs,…

算法笔记 (2) - git diff 是如何实现的?

你是否好奇过 git diff 是如何高效地比较文件并精确显示变化的?这个看似简单的操作背后,隐藏着相当精妙的算法设计。 假设有两个文件 \(A\) 和 \(B\),它们分别有 \(N=7\) 行和 \(M=6\) 行: A B === === A C B B C A A B B A B C A 我们可以将这个比较问题抽象为在一个 \(N \times M\) 网格中寻找路径: 从任意坐标 \((x, y)\) 出发,我们有三种可能的移动方式: 向右移动 到 \((x+1, y)\) — 表示删除第一个文件的第 \(x+1\) 行 向下移动 到 \((x, y+1)\) — 表示添加第二个文件的第 \(y+1\) 行 对角线移动 到 \((x+1, y+1)\) — 表示两个文件的对应行内容相同(无需编辑) 对角线移动在 diff…

告别 JavaScript : 现代 CSS 特性

现代 CSS 引入了许多新特性和功能,提升了网页设计的灵活性和表现力。本文将介绍一些现代 CSS 的重要特性,包括容器查询、 :has() 伪类、选择器嵌套、滚动驱动动画、CSS 锚点定位、作用域样式、级联层、颜色函数、文本优化等。 容器查询 传统的 @media 查询基于视口大小,而容器查询允许组件根据其 父容器 的大小自适应样式,实现真正的组件级响应式设计。 基础用法 .card-container { container-name : card ; container-type : inline-size ; } @container card ( min-width : 400px ) { .card { display : grid ; grid-template-columns : 1fr 2fr ; } } 容器类型 类型 说明 size 可查询容器的块级和内联尺寸…

消息队列——原理与对比

消息队列是一种先进先出的数据结构,用于存储并在应用程序之间传递消息。 graph LR P1((P1)) --> Q(Broker) --> C1((C1)) P2((P2)) --> Q --> C2((C2)) P3((P3)) --> Q --> C3((C3)) subgraph 生产者 P1 P2 P3 end subgraph 消费者 C1 C2 C3 end 他有这样几个重要功能: 异步处理 :生产者和消费者可以异步进行处理,不会相互阻塞,提高了系统的并发性能 削峰填谷 :消息队列可以缓冲突发的消息,使得系统在高峰期不会因为消息量过大而崩溃 解耦 :消息队列可以将生产者和消费者解耦,使得系统更容易扩展和维护 可靠性 :消息队列可以保证消息的可靠传递,即使消费者宕机,消息也不会丢失 延时处理 :消息队列可以实现延时处理,比如定时任务 消息分发 :消息队列可以实现消息的广播和单播…

我的服务器成了 DDoS 的肉鸡!

悲报!我的一台 VPS 成了 DNS 反射放大攻击的肉鸡! 今天上 HostEONS 看来一眼,发现我的一台 VPS 的带宽异常飙升,每天的上传流量达到了 10 个 G。 我一看,这流量不对劲啊,怎么会这么高? 我赶紧登录服务器,跑了一下 iftop ,发现我服务器的 48083 端口在疯狂访问 one.one.one.one:domain 和 dns.google:domain 。结合高上传流量低下载流量,我立刻意识到,我的服务器成了 DNS 反射放大攻击的肉鸡! 首先火速改掉了 SSH 的端口和密码。然后来排查恶意进程。 首先看看和 53 、 43083 端口关联的进程: lsof -i :53 lsof -i :43083 什么也没有。那还是先看看它在请求什么站点的 DNS 吧: sudo tcpdump -i eth0 -n udp port 53 -vvv 然后发现全在访问…

深入 Redis 源码 (6) - Redis 事件循环

本文将会从源码层面解读 Redis 的各项机制。我们会从最基础的内容开始,尽量只看 Redis 最核心的部分,而剥离掉一些不太重要的内容,所有的源码都给出了 GitHub 的链接。 写作本文时,Redis CE 还在 7.4 版本;Redis 8.0 仍然在 Pre-Release。因此,本文主要基于 Redis 7.4,其余版本可能有所不同。本文使用的环境为 Debian 12。 事件循环 函数入口 对于一个 Redis 实例来说,其启动后会首先运行 server.c 中的 main 函数。 点击查看源码 代码如下: redis/src/server.c L6917 int main ( int argc , char ** argv ) { struct timeval tv ; int j ; char config_from_stdin = 0 ; // 测试相关逻辑 /* ...…

深入 Redis 源码 (5) - Redis 集群

本文将会从源码层面解读 Redis 的各项机制。我们会从最基础的内容开始,尽量只看 Redis 最核心的部分,而剥离掉一些不太重要的内容,所有的源码都给出了 GitHub 的链接。 写作本文时,Redis CE 还在 7.4 版本;Redis 8.0 仍然在 Pre-Release。因此,本文主要基于 Redis 7.4,其余版本可能有所不同。本文使用的环境为 Debian 12。 集群 当数据量越来越大,处于服务器性能考虑和数据安全考虑,我们需要将数据分布到多个服务器上。Redis 提供了集群机制,可以将数据分布到多个服务器上,提高系统的可用性和性能。 Redis 的集群包括了三种模式: Replication Sentinel Cluster 主从复制模式 RDB 和 AOF 解决了服务器宕机后数据的恢复问题。然而,如果硬盘损坏,那么数据就无法恢复了。同时,在服务器宕机期间,Redis…