惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - 司徒正美
Google Online Security Blog
Google Online Security Blog
博客园_首页
量子位
大猫的无限游戏
大猫的无限游戏
酷 壳 – CoolShell
酷 壳 – CoolShell
The Cloudflare Blog
Vercel News
Vercel News
GbyAI
GbyAI
Y
Y Combinator Blog
C
CXSECURITY Database RSS Feed - CXSecurity.com
C
Cisco Blogs
IT之家
IT之家
A
Arctic Wolf
P
Privacy International News Feed
G
GRAHAM CLULEY
腾讯CDC
Microsoft Security Blog
Microsoft Security Blog
Microsoft Azure Blog
Microsoft Azure Blog
美团技术团队
T
The Blog of Author Tim Ferriss
AWS News Blog
AWS News Blog
A
About on SuperTechFans
P
Proofpoint News Feed
I
Intezer
月光博客
月光博客
Cloudbric
Cloudbric
Google DeepMind News
Google DeepMind News
T
Tor Project blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
www.infosecurity-magazine.com
www.infosecurity-magazine.com
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
S
Securelist
Engineering at Meta
Engineering at Meta
爱范儿
爱范儿
F
Full Disclosure
V2EX - 技术
V2EX - 技术
Last Week in AI
Last Week in AI
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
人人都是产品经理
人人都是产品经理
C
Check Point Blog
I
InfoQ
S
Security Affairs
Simon Willison's Weblog
Simon Willison's Weblog
P
Palo Alto Networks Blog
F
Fortinet All Blogs
S
Security @ Cisco Blogs
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
K
Kaspersky official blog
D
Darknet – Hacking Tools, Hacker News & Cyber Security

Yesterday17's Blog

2026 新年解密红包 / Melody Flag | Yesterday17's Blog 谈谈 Iori 的设计思路(二):如何实现一个 Showroom 录制工具? | Yesterday17's Blog 谈谈 Iori 的设计思路(一):从 Nico Timeshift 说起 | Yesterday17's Blog Iori Minyami 0.1.0 发布 | Yesterday17's Blog 2025 新年解密红包 / Melody Flag | Yesterday17's Blog 使用 Cloudflare Warp 解决罗森票务的海外登录问题 | Yesterday17's Blog How To Blog 04: The Astro v5 Era | Yesterday17's Blog 谈谈 tokio::select! 的公平性 | Yesterday17's Blog Learning Pingora 05 - Connect with TLS | Yesterday17's Blog Leaving Bytedance | Yesterday17's Blog 大橋彩香 AsiaTour「Reflection」上海公演 个人向记录 & Repo | Yesterday17's Blog Recoving from burnout - What happened? | Yesterday17 Yubikey 重建手册 | Yesterday17's Blog How To Blog 03: Heimus | Yesterday17's Blog 🪧 Blog Migration Accouncement | Yesterday17's Blog Learn Your IDE - VSCode 是如何仅重启插件的? | Yesterday17's Blog How To Blog 02: Astro❤️Password | Yesterday17's Blog How To Blog 01: Why, How, and the Future | Yesterday17's Blog Learning Pingora 04 - Establish L4 Connection | Yesterday17's Blog Learning Pingora 03 - Upstreams and Peers | Yesterday17's Blog Learning Pingora 02 - A Simple HTTP Server | Yesterday17's Blog Learning Pingora 01 - Getting Started | Yesterday17's Blog 2024 新年解密红包 / Melody Flag | Yesterday17's Blog 向新的一年飞驰——记录 2023 | Yesterday17's Blog 「サクラノ刻」对话选摘(2) | Yesterday17's Blog PGP Key Revocation 注销声明 | Yesterday17's Blog 「サクラノ刻」对话选摘(1) | Yesterday17's Blog 2023 新年解密红包 / Melody Flag | Yesterday17's Blog 『蒼の彼方のフォーリズム』通关感想 | Yesterday17's Blog 单显卡直通教程 | Yesterday17's Blog 对博客与笔记的思考 | Yesterday17's Blog Project Anni 之旅(3)自动化 Flutter 应用 CI/CD 上架流程 | Yesterday17's Blog AsobiStage 直接播放链接 | Yesterday17 如何在后分P时代进行投稿——sswa使用详解 | Yesterday17's Blog JSON RPC 与 LSP 协议基础 | Yesterday17's Blog Grajapa Shueisha / BookEnd 加密方式调查 | Yesterday17's Blog 【2022篇+WriteUp】如何再收一个新年红包? | Yesterday17's Blog 如何将良心云的良心功能清理干净 | Yesterday17's Blog 【油猴脚本】bilibili 投稿页面返回旧版+旧版页面强制允许分P上传 | Yesterday17's Blog Cloudr1v1 授权方式分析 | Yesterday17 Typora 1.0.2 逆向实录 | Yesterday17's Blog Project Anni 之旅(2)ValueAfterTable——toml-rs的实现与限制 | Yesterday17's Blog IPv4透明代理+IPv6 Passthrough——树莓派单臂软路由折腾记 | Yesterday17's Blog Chaos; Child 汉化补丁 神秘编码探索 | Yesterday17's Blog 镣铐与舞蹈——个性与共性之迷思 | Yesterday17's Blog Go 学习笔记 02 - 找准 io 之道 | Yesterday17's Blog NAT Slipstreaming v1 原理浅析 | Yesterday17's Blog 绕过「9-nine-」的 CDKEY 验证——KrkrPlugin 正(?)向实录 | Yesterday17's Blog 静流的青春纪念册——「サクラノ刻 -櫻の森の下を歩む-」体验版感言 | Yesterday17's Blog Project Anni 之旅 01 - 从 clap-builder 到 derive | Yesterday17's Blog [Google CTF 2021] CPP WriteUp | Yesterday17's Blog 获取 アソビステージ 的实际播放链接 | Yesterday17's Blog 90 行 Rust 代码实现 AsyncTeeReader | Yesterday17's Blog 或许还算有价值一读的文章列表 | Yesterday17's Blog 从零开始的 Seedbox 之旅 | Yesterday17's Blog [随笔]技术型博客行文迷思(1) | Yesterday17's Blog 浅谈 git fetch 的工作方式 | Yesterday17's Blog 『ソーサレス*アライヴ! ~the World's End Fallen Star~』通关感想" | Yesterday17's Blog Rust std::fmt 格式语法简述 | Yesterday17's Blog 日亚修改居住国的解决方案 | Yesterday17's Blog [Windows/Linux] GC553 的 Switch 完美采集之路 | Yesterday17's Blog 【翻译】Subtyping and Variance / 子类型与变型 | Yesterday17's Blog Berd's Red Envelope 2021 WriteUp | Yesterday17's Blog 【中英对照】ALSA 音频 API 使用教程/A Tutorial on Using the ALSA Audio API | Yesterday17's Blog 从 cue_scanner.l 看 CUE Sheet 的词法单元 | Yesterday17's Blog Postman 历史记录导出的解决方案 | Yesterday17's Blog 《恋爱绮谭 不存在的夏天》通关感想 | Yesterday17's Blog [微机实验/TD-PITE] 微机接口综合实验 | Yesterday17's Blog [微机实验/TD-PITE] 键盘扫描及数码管显示实验 | Yesterday17's Blog [微机实验/TD-PITE] 数码管显示实验 | Yesterday17's Blog Airsonic Advanced+Google Drive+Caddy 部署纪实 | Yesterday17's Blog X-NUCA 2020 - hellowasm 题解 | Yesterday17's Blog [微机实验/TD-PITE] 8251 串行接口实验 | Yesterday17's Blog Node.js child_process.fork 与 env 污染 RCE | Yesterday17's Blog EP.01 「夜の向日葵」 | Yesterday17's Blog [微机实验/TD-PITE] 8254 定时/计数器实验+选做实验 | Yesterday17's Blog [JLU CTF/2020] babywasm WriteUp | Yesterday17's Blog PHP 反序列化与经典利用 | Yesterday17's Blog WebAssembly 逆向简述 | Yesterday17's Blog 『彼女、お借りします』一期完结点评 | Yesterday17's Blog [微机实验/TD-PITE] D/A 转换实验+选做实验 | Yesterday17's Blog [微机实验/TD-PITE] A/D 转换实验+选做实验 | Yesterday17's Blog 开源项目申请 JetBrains Open Source License 简单流程 | Yesterday17's Blog 微软拼音与 JetBrains 搜索快捷键冲突的解决方案 | Yesterday17's Blog [微机实验/TD-PITE] 8259 中断优先级实验+选做实验 | Yesterday17's Blog IFTTT 测试(续) | Yesterday17 IFTTT 测试 | Yesterday17's Blog [微机实验/TD-PITE] 存储器扩展实验+选做实验 | Yesterday17's Blog 新版 GCC 针对 -fdump-translation-unit 的替代方案 | Yesterday17's Blog 一次 HSTS 策略配置的排错之旅 | Yesterday17's Blog YukiNative 踩坑记——Windows 的消息队列 | Yesterday17's Blog 我是我自己——论获取 HTTPS 证书时的验证步骤 | Yesterday17's Blog GS65 折腾记(2)加装固态,分区,Grub2 引导 Manjaro LiveCD | Yesterday17's Blog 「さくら、もゆ。」的空白字体列表——一次逆向问题定位过程实录 | Yesterday17's Blog GSuite 探索篇(1)使用 Service Account 向 Google Drive 传输文件 | Yesterday17's Blog 『サクラノ詩 -櫻の森の上を舞う-』通关感想 | Yesterday17's Blog 《ATRI -My Dear Moments-》通关感想 | Yesterday17's Blog [工具][VSCode 扩展] AegiKit——方便 Aegisub 使用的工具箱 | Yesterday17's Blog 贝塞尔曲线、字体矢量化与曲线运算 | Yesterday17's Blog NAT 类型初探 | Yesterday17's Blog
【设计文档】对 PUG 的大规模设计修订(1.1) | Yesterday17's Blog
Yesterday17 · 2020-08-30 · via Yesterday17's Blog

「本文废弃了 1.0 文档中的部分内容,并对大部分内容进行了修订」

在经历了 PUG 上一设计版本的实现困难之后,我开始重新审视 PUG 的抽象结构。

Pipe 的存在意义(废弃)

PUG 上一个版本将处理的最小单元设计为 Pipe,用以划分某些未知的操作。当时举出的例子就是用户登录,但经过分析发现登录可能是目前 Pipe 存在的唯一意义

并且,通过 Pipe 处理还存在一系列的问题。

首先,这个过程是线性的。以错误处理为例,Pipe 的存在意味着用户必须手动声明所有的错误处理。这个过程很 Golang,但不符合用户直觉,增加了使用成本。

其次,对于大量的通用内容,以处理后通知(Notify after process)为例,如果我们想把每个 Pipe 的处理结果都通过 Telegeam Bot 反馈给用户,那么用户就需要手动配置大量 Bot 配置相关的内容。但这并不是最致命的,如果要考虑 Bot 运行时出现的错误,那么用户就需要配置一条 Pipeline 而不是 Pipe。而 Pipeline线性的,这就导致错误处理只能简单地处理单种错误,要同时处理多种错误就必须使用:线性传递错误内容;或将错误处理集成到一个 Pipe 中——这两种中的一种。

最后,Pipe局限用途导致了不必要的抽象层次增加。

综合这三点来看,Pipe 的设计是失败的。因此我们选择废弃 Pipe 的概念。

Pipeline 的变化(更名)

Pipe 废弃之后,Pipeline 的工作方式也就发生了变化。现在 Pipeline 作为设计的最小单元,使用 Pipeline 这个名字就有点不大合适了。

最终,我们决定Pipeline 更名为 Pick,取自 PUG 第一个单词的这个名字更能反映处理节这一功能本质。

Workflow 的控制功能(废弃)

1.0 版本中,Workflow 是作为全程序的最大框架存在的。为了实现更复杂的功能,还计划给 Workflow 增加分支选择控制功能

但是仔细想想,这一切真的值得吗?ねぇ、タク、たのしかった?

分支选择的需求是针对错误处理而提出的,但在实现的过程中存在各种各样的问题。因此最终,我们决定将 Workflow 的控制功能废弃反正还没有实现,将所有的分支功能交由初始状态和外部处理。

事件:消息与钩子

为了弥补上述设计削减导致的功能缺失,我们引入了事件钩子两个概念。

事件是每个 PickWorkflow 都存在的公共属性。PickWorkflow 通过事件向外部发布消息,而外部模块通过钩子影响 Workflow 的执行。

我们将不影响 Workflow 执行的事件称为 Message,而将影响 Workflow 执行的事件称为 Hook

此时,对于执行过程中发生的错误,其处理方式就交由事件处理器处理了。我们将每次事件的调用称为一次 Up,意味在设计上事件处理位于流程执行的上层

从实现上来看,错误处理的过程也是一种 Hook 处理流程的过程。因为在错误处理之后我们需要重启或中止当前 PickWorkflow,而这个过程明显是会影响工作流程的。

事件:优先级与传递

对于不同的事件,抽象出优先级的概念。较高优先级的事件优先执行,同级优先级的事件根据注册时间先后依次执行。

事件优先级最高为 0,默认为 100。

事件具有传递性,即一个事件处理器处理完后会将处理后的事件交由下一级处理器处理。

较高级事件能够选择屏蔽较低级事件的执行,这个过程称为传递屏蔽

事件:内部/外部处理器

对于有些事件,特别是错误处理事件,我们往往希望定义一个默认的错误事件处理器,而不是对每个 Workflow 配置相同的错误处理器。由此,我们抽象出内部处理器外部处理器两种不同的事件处理方式。

内部处理器是一种对用户透明的事件处理器,它实际上是对 Pick 实现的一种强制解耦。内部处理器拥有最高的优先级,在事件发生时最优先执行

对于最常见的内部错误处理器,其通常还会在错误处理成功(如成功登录)后屏蔽事件的传递。

外部处理器则是用户声明使用的事件处理器,其优先级根据用户配置而定,按照优先级的设置执行。

持久化:公共存储区

为了实现公共内容的持久化(如 Cookies),我们为所有 PUG 的部分提供了公共存储区。

公共存储区用于存储下次处理必须用到的信息,以方便 PUG 快速从内存/磁盘重启,减少诸如登录错误的错误处理次数。

例如,http 客户端需要在每次请求后将 cookies 同步到公共存储区。

结语

从结果来看,上一个版本的 PUG 在某些地方确实过度设计了,但基本框架是没有问题的。比如将 Workflow 的执行结果分为多份,在新的设计中可以通过事件消息简单实现,可以说是只是换了个实现的皮。

有一些问题没有被讨论,如 PreprocessorWorkflow 的选择,这样的预处理器是否必要仍然在思考中。以及对公共存储区/ Workflow 存储区变量类型的限定等,这些相对细节的问题也处于 Pending 状态。

上一个设计版本中可能过于强调 Pipe 的存在性了。由于 Pipe / Pipeline 系统的印象过于深刻,因此在 Workflow 提出后仍然保留了这一组处理单元。这也算是历史遗留导致的设计问题了吧(笑)