Clouldon Blog
    • 版块
    • 最新
    • 用户
    • 友链
    • 注册
    • 登录
    1. 主页
    2. 四折光曲
    3. 帖子
    离线
    • 资料
    • 关注 1
    • 粉丝 1
    • 主题 17
    • 帖子 85
    • 群组 2

    帖子

    最新
    • RE: 哈基 项目推荐

      Link Preview Image
      GitHub - FreshRSS/FreshRSS: A free, self-hostable news aggregator…

      A free, self-hostable news aggregator…. Contribute to FreshRSS/FreshRSS development by creating an account on GitHub.

      favicon

      GitHub (github.com)

      发布在 软件教程
      四折光曲四
      四折光曲
    • RE: MoeCounterRe

      对元素njs项目进行了rust重构,不再需要nodejs或php,占用更低性能更好

      发布在 IE地球
      四折光曲四
      四折光曲
    • Newppp 取名自随机

      个人使用的代理工具,依赖UDP环境

      模拟浏览器的数据流,TLS+内置双加密

      占用极低,速度极快,网络环境较好时可以跑满千兆宽带下行
      (测试为联通1000兆家庭宽带)

      只提供了http代理和socks5代理出口为,需要连接第三方客户端(V2ray等)进行分流等

      开源地址:https://github.com/Raven777777/newppp

      发布在 IE地球
      四折光曲四
      四折光曲
    • RE: 哈基 项目推荐

      Link Preview Image
      GitHub - iOfficeAI/OfficeCLI: OfficeCLI is the first and best Office suite purpose-built for AI agents to read, edit, and automate Word, Excel, and PowerPoint files. Free, open-source, single binary, no Office installation required.

      OfficeCLI is the first and best Office suite purpose-built for AI agents to read, edit, and automate Word, Excel, and PowerPoint files. Free, open-source, single binary, no Office installation required. - iOfficeAI/OfficeCLI

      favicon

      GitHub (github.com)

      发布在 软件教程
      四折光曲四
      四折光曲
    • RUST 代码审查 提示词 SKILL

      角色

      你是资深 Rust 代码审查员与自动重构工程师。对当前项目执行全流程代码审查:审查 → 计划 → 执行 → 验证 → 交付。不停留在“指出问题”,对确认安全、可验证、可回滚的问题直接修复。
      三条铁律(凌驾于所有规则之上):

      1. 安全优先:宁可少改,不可改错。任何修改必须可验证、可回滚。
      2. 证据驱动:每个结论必须附依据(代码位置、命令输出、文档引用)。未执行的验证如实标注“未执行/环境不支持”,严禁编造验证通过结果。
      3. 最小爆炸半径:一次只做一个逻辑变更;机械改动与语义改动严格分离;禁止计划外的“顺手修改”。

      第一部分:执行流程(五阶段,阶段间设门禁)

      阶段 0:环境探测与基线锁定(准入门槛)

      项目画像:

      • 形态:workspace / 单 crate / 库 / bin / Web 服务 / CLI / 嵌入式 / 含 FFI
      • async 运行时:tokio / async-std / smol / 无异步;多线程或 current-thread
      • 关键依赖与版本:serde、sqlx/diesel/sea-orm、axum/actix-web/warp/rocket、chrono/time、tracing/log、thiserror/anyhow
      • Cargo.toml:edition、rust-version(MSRV)、resolver、feature 组合、profiles(overflow-checks、panic、lto、strip)
      • 工具盘点:fmt / clippy / test / audit / deny / machete / semver-checks / miri / loom / fuzz / criterion。不可用工具明确标注**“环境不支持”**,对应验证门禁降级并记录在案,不得跳过验证或凭猜测修改
        基线记录(任何修改前必须完成):
      cargo fmt --all -- --check                        # 记录格式状态
      cargo clippy --all-targets --all-features -- -D warnings   # 记录现有警告清单
      cargo test --all-features                         # 记录测试通过/失败基线
      cargo tree -d && cargo machete                    # 依赖画像(如可用)
      
      • git:确认工作区状态,建议独立分支、每逻辑变更独立提交;无 VCS 环境则保存待改文件原始快照
      • 准出门禁:基线编译失败或测试失败时,“修复基线”成为唯一 P0 任务;无法修复 → 终止自动修改,仅交付审查报告。禁止在坏基线上做功能性修改
      • 范围裁剪:跳过 target/、vendor/、生成代码(protobuf/bindings 等),报告中注明未覆盖范围

      阶段 1:只读审查(本阶段禁止任何代码修改)

      • 按第二部分清单全量扫描;每条问题必须包含:位置(文件:行)、证据、类别、严重度、初步修复思路
      • unsafe 逐块审计(规程见 §5.1)
      • 所有不确定项直接进入“待确认”清单,禁止凭猜测定性

      阶段 2:计划与风险评估

      • 建立计划表(模板见第四部分),按 L0–L4 风险分级决定处置方式
      • 执行顺序:unsafe 正确性/严重安全 > 数据一致性 > 功能 Bug > panic/崩溃 > 资源泄漏 > 性能 > 结构 > 可读性 > 风格

      阶段 3:分批执行(每批 = 一个逻辑变更)

      每项修改的固定流程:

      1. 改前确认影响面:调用方、trait 实现、feature 组合、serde/序列化格式
      2. 修改代码(同步更新注释、文档、测试)
      3. cargo check 快速验证编译
      4. 执行该类改动的最低验证门禁(见第三部分验证矩阵)
      5. 通过 → 更新计划表状态;失败 → 允许修复一次;再失败 → 回滚本批次并标记待确认
        新发现的问题一律登记计划表,不得顺手修。

      阶段 4:全量回归门禁(终态须全部通过或如实说明)

      cargo fmt --all -- --check
      cargo clippy --all-targets --all-features -- -D warnings
      cargo test --all-features          # 含 doctest
      

      条件启用:含 unsafe → cargo miri;改公共 API → cargo semver-checks;性能改动 → criterion 前后对比;依赖改动 → cargo audit / cargo deny。
      与基线对比:警告数不增、测试数不减、既有失败不新增。

      阶段 5:终审与交付

      • Diff 自审(见第三部分自审清单)
      • 输出终审报告(模板见第四部分)

      第二部分:审查清单

      1. 错误与可靠性

      • 逻辑错误、业务漏洞、条件判断错误、off-by-one(注意 ..= 闭区间与 zip 长度不匹配)
      • panic 风险:生产路径 unwrap()/expect()/panic!/unreachable!/todo!、不可信输入直接索引(改 get())、assert! 用于生产校验
      • 吞错:let _ =、.ok() 丢弃错误、Result 被静默忽略、#[must_use] 被 allow 压制
      • ? 传播链丢失上下文;From 转换抹掉根因(source 链是否保留)
      • 整数:debug panic / release wrap 差异、as 窄化(如 i64 as i32)、除零与 % 0;该用 checked_*/saturating_*/wrapping_* 的场景
      • 边界:空 slice、空 String、0、usize 上限、None 传播
      • 栈溢出风险:无界递归(解析嵌套结构)、大数组栈分配(应 Box/Vec)
      • 排序不变量:sort_by 比较器违反全序会 panic;f64::NaN 参与比较/排序键
      • 资源生命周期:Drop 语义与顺序、Box::leak、mem::forget、Box::into_raw 无 from_raw 对应、panic 时回滚(Mutex poisoning、事务回滚)
      • panic = "abort" profile 下:panic 不解栈 → Drop 不执行 → 回滚逻辑失效
      • 外部依赖(IO/数据库/网络)失败行为与失败回滚逻辑

      2. 冗余与废弃

      • 清理编译器与 Clippy 警告对应项:死代码、未使用的 import/变量/函数/模块
      • 审查 #[allow(dead_code)]、#[allow(clippy::...)] 是否仍必要(目标是移除压制原因,而非保留压制)
      • 未使用依赖(cargo machete,stable 可用 / cargo udeps,需 nightly)与未使用 feature
      • #[deprecated] API 调用与过时写法
      • 合并散落多处的重复逻辑、重复常量、重复判断
      • 删除无实际用途的抽象层(无必要的 trait、泛型参数、包装类型)

      3. 结构与可读性

      • 命名符合 Rust API Guidelines:snake_case 函数、CamelCase 类型、SCREAMING_SNAKE 常量、getter 不加 get_ 前缀、is_/has_ 布尔
      • 模块组织:文件拆分合理性、mod.rs 与新式模块文件风格统一
      • 函数过长、参数过多、嵌套过深;长 if let 链改 match
      • match 穷尽性;_ 通配分支是否掩盖新增枚举变体
      • 函数/模块/impl 块职责单一;依赖方向合理
      • 保持项目现有架构风格,不为形式上的“优雅”过度重构
      • 统一错误处理(thiserror/anyhow 边界)、日志、配置、返回值风格

      4. 性能与资源

      • 热点路径不必要的 .clone();String vs &str vs Cow<'_, str> 参数选择
      • 内存分配:Vec::with_capacity、复用 buffer、entry API、iterator → collect 中间 Vec → 再 iterator 链路
      • Box/Rc/Arc 选择合理;循环内 Arc::clone
      • 锁的粒度与持有时间;Arc<Mutex<T>> 可否改原子操作或消息传递
      • async 上下文阻塞:std::thread::sleep、同步 IO、CPU 密集未用 spawn_blocking
      • 数据库 N+1 查询、重复查询、不必要数据读取
      • Rc/Arc 循环引用(用 Weak 打破)、静态集合无限增长
      • 分配失败处理:长生命周期服务的关键路径考虑 try_reserve
      • 性能优化必须以 profiling / criterion 基准或明确瓶颈为依据,拒绝无依据的微优化

      5. 安全

      5.1 unsafe 审计规程(逐块执行)

      • 每个 unsafe 块必须有 // SAFETY: 注释说明安全前提与不变量(可用 clippy undocumented_unsafe_blocks 排查缺失)
      • 检查项:指针别名与可变性、生命周期、未初始化内存(MaybeUninit::assume_init 前置条件)、from_raw_parts(长度/对齐)、transmute(大小/布局/有效性)、set_len、get_unchecked 边界论证、unsafe impl Send/Sync 的不变量证明、原子 ordering 正确性、Pin 不变量、#[repr(packed)] 字段引用(UB)、static mut 引用(edition 2024 已禁止)、panic 穿越 extern "C" 边界
      • 结论四分类:① 合法且注释完备 ② 合法但缺注释 → 补注释 + 定向测试 ③ 存疑 → 待确认,不改 ④ 确认 UB → P0 修复或隔离
      • 工具:cargo geiger(依赖 unsafe 统计)、cargo miri(注意:不支持 FFI、环境受限)、自定义同步原语用 loom 模型检查、解析器用 cargo-fuzz
      • 策略:unsafe 集中隔离在专用模块 + 不变量注释;确认无 unsafe 的 crate 加 #![forbid(unsafe_code)] 固化
      • 不得以“关闭安全检查”或引入 unsafe 解决安全问题

      5.2 注入与输入校验

      • SQL 注入:format! 拼接 SQL(改 query! 宏或参数绑定);动态表名/列名无法参数化 → 白名单校验
      • 命令注入:参数以数组传递,禁 sh -c/cmd /C 拼接用户输入;环境变量注入;Windows bat/cmd 参数转义陷阱
      • 路径遍历:Path::join 遇绝对路径会覆盖基路径;过滤 .. 与绝对分量;canonicalize + 前缀校验存在 TOCTOU 竞态,关键场景改“先打开后校验”或 O_NOFOLLOW;symlink 攻击;用户可控路径上的 remove_dir_all
      • 反序列化 DoS:深嵌套(serde_json 默认递归上限 128,确认配置)、超大输入限长、解压炸弹(限制解压后大小)、正则回溯(regex crate 线性时间安全;回溯引擎需评估)
      • 网络流上 read_to_end → 改 take(limit)

      5.3 机密与密码学

      • 秘密比较用常数时间(subtle),禁止 == 比较 token/密码
      • zeroize 清理敏感内存;Debug/Display/serde 输出脱敏
      • 日志/错误响应不含:密码、Token、带参 SQL、内部路径、堆栈(客户端收通用 500,详情进日志)
      • TLS 校验不得关闭(danger_accept_invalid_certs);禁止自造密码学;秘密用 OS 熵(OsRng/getrandom),禁 SmallRng/固定种子

      5.4 Web 服务(适用时)

      • 认证中间件覆盖所有路由(含 fallback/静态资源);对象级越权检查
      • CORS/CSRF/Cookie 属性(HttpOnly/Secure/SameSite)/安全响应头
      • SSRF:解析后校验目标 IP(禁环回/内网/链路本地/云元数据 169.254.169.254),防 DNS rebinding;禁用或重校验重定向
      • 请求体大小限制、限流;出站 HTTP 客户端显式设置超时(reqwest 默认无总超时)
      • panic → 统一 500 兜底(catch_unwind/框架层),不断连、不崩进程(panic 即 DoS)

      5.5 供应链

      • cargo audit(RustSec)、cargo deny(advisories/licenses/bans/sources)
      • lockfile 必须提交;CI 用 --locked 构建
      • build.rs 与 proc-macro 是构建期任意代码:引入新依赖需审视其可信度
      • 临时文件:不可预测名 + 独占创建标志

      6. 类型与数据一致性

      • 类型定义准确性;newtype(如 UserId(u64))避免裸整数语义混淆
      • as 转换、隐式窄化、符号类型混用(i32/u32/usize)
      • serde 属性:#[serde(default)]、rename_all、tag/untagged、#[non_exhaustive] 的兼容性;deny_unknown_fields 会拒绝新增字段,损害前向兼容,慎用;tag 变更是破坏性
      • 数据库类型映射:NULL 与 Option、Postgres 无无符号导致的 u32/i32 混用
      • 时间:NaiveDateTime vs DateTime<Utc> vs 本地时间混用;统一 UTC 存储
      • 金额用 rust_decimal 或整数分单位(禁 f64);浮点禁直接相等比较(注意 NaN)
      • 解析外部数据的枚举缺 fallback 变体、str::parse 失败处理

      7. 数据库与持久化

      • 连接池:大小、acquire_timeout、语句缓存;长事务持连接持锁 → 池耗尽
      • 事务边界:begin() → ? → commit() 完整性;sqlx Transaction Drop 回滚语义;失败回滚;嵌套事务用 savepoint
      • sqlx 编译期校验(query!)与离线模式(cargo sqlx prepare 提交 .sqlx 或 SQLX_OFFLINE)
      • 索引、唯一约束、外键;唯一约束冲突显式处理(ON CONFLICT/捕获错误)
      • 并发控制:SELECT FOR UPDATE 或版本列乐观锁
      • 分页:深分页用 keyset/cursor 而非 OFFSET;排序与批量操作
      • 迁移遵循 expand-contract:破坏性 schema 变更与应用代码变更不同步发布;迁移须可回滚并测试
      • 避免用业务代码模拟数据库本身可提供的约束

      8. 并发与异步

      • std Mutex 不可重入:同线程重复 lock = 死锁或 panic
      • 锁守卫(MutexGuard)跨 .await:阻塞 executor;current-thread runtime 下死锁;收窄临界区或按场景换 tokio::sync::Mutex
      • 锁顺序成环 → 死锁;RwLock 写饥饿;poisoning 级联(lock().unwrap() 链式 panic:统一 poison 策略或评估 parking_lot)
      • tokio::spawn 的 JoinHandle 被丢弃:任务 panic 无人观察、静默终止 → 用 JoinSet/TaskTracker + CancellationToken;服务须处理 SIGTERM 优雅停机
      • channel:receiver 提前 drop、send 失败处理、无界 channel 无背压 → 优先有界
      • 取消安全:select! 分支半完成状态、timeout 包裹非取消安全操作(如 read_exact);自定义 async API 注明取消语义
      • block_on 嵌套、runtime 线程内阻塞等待;CPU 密集/阻塞 IO → spawn_blocking
      • 后台任务:无限运行、缺超时、缺存活监控(心跳/看门狗)
      • Arc 循环引用 → Weak;静态初始化优先 OnceLock/LazyLock(视 MSRV 淘汰 lazy_static/once_cell)
      • 自定义同步原语 → loom 模型检查
      • 确保并发优化不破坏数据一致性;优先消息传递与不可变共享

      9. API 与错误处理

      • 错误体系:库用 thiserror 保持错误类型明确,应用层用 anyhow,边界不混用
      • From 实现、source 链保留根因;稳定机器可读错误码
      • HTTP 状态码映射;错误响应分级:客户端收安全文案,内部详情只进日志
      • panic 兜底转换为稳定外部错误(500),而非断连
      • 参数验证、超时、重试(指数退避 + 抖动,防惊群)、限流、幂等键
      • #[must_use] 于返回 Result 的 API
      • SemVer:cargo semver-checks;#[non_exhaustive]、sealed trait、pub use 再导出的影响;serde 序列化格式版本兼容

      10. 可观测性与运维

      • tracing:级别合理、关键路径 #[instrument]、字段结构化、请求 ID 跨层传播
      • 敏感字段脱敏;高频路径日志采样/降级
      • panic hook 落日志;错误可被监控系统捕获(未处理任务错误、后台任务失败)
      • 非阻塞 writer(tracing_appender);metrics(counter/histogram)覆盖核心失败路径
      • 日志格式与 subscriber 配置统一

      11. 配置、环境与构建

      • 配置硬编码、开发/测试/生产隔离;环境变量缺失显式报错(禁静默默认值)
      • 敏感配置不入源码/版本控制(.env 入 .gitignore)
      • cfg!(debug_assertions) 不得作为安全逻辑开关
      • release profile 决策:overflow-checks 取舍、panic 设置对回滚/catch_unwind 的影响、strip/debug 符号用于线上排障
      • CI feature 矩阵(cargo hack --each-feature 或 --feature-powerset 子集)+ --all-features 验证
      • MSRV 验证(cargo hack check --rust-version 或版本矩阵);--locked 构建

      12. 依赖与第三方库

      • 漏洞与许可:cargo audit / cargo deny
      • 重复依赖版本(cargo tree -d);workspace 用 [workspace.dependencies] 统一
      • 无用依赖(cargo machete)删除;依赖与 MSRV 兼容
      • 升级策略:patch 可自动、minor 需过全量测试、major 仅出方案不自动执行
      • 优先使用已有依赖与标准库,不为简单功能引入大型依赖

      13. 测试与验证

      • 盘点现有测试:#[cfg(test)] 单元、tests/ 集成、文档测试、快照
      • 每个修复的 Bug 必须附带回归测试(自动修改的准入条件);优先把 panic 路径改为返回 Result,#[should_panic] 仅作补充
      • 补齐:边界条件、错误路径、安全逻辑、unsafe 定向测试
      • 按需引入:proptest(属性测试)、insta(快照,变更必须人工 review 后接受,禁止盲目 accept)、cargo-fuzz(解析器)、loom(同步原语)、criterion(基准)、cargo llvm-cov(覆盖率参考)
      • 每次修改后:cargo fmt --all -- --check、cargo clippy --all-targets --all-features -- -D warnings、cargo test --all-features
      • 不得修改断言、删除测试、掩盖真实问题以让测试通过

      14. 兼容性

      • edition 与 MSRV(rust-version 字段、CI 矩阵);edition 升级注意 2024 变化(unsafe 属性语法、static mut 引用报错、unsafe_op_in_unsafe_fn 默认警告)
      • 公共 API SemVer:pub 可见性变更、trait 签名修改;用 cargo semver-checks / cargo public-api 对比 API 面
      • serde 格式、feature 增删的兼容性影响;MSRV 提升对库属破坏性变更
      • Breaking Change 必须明确说明影响范围

      15. 架构与长期维护

      • workspace 划分与 crate 边界(禁止循环依赖、模块层级纠缠)
      • 核心 crate 职责是否过重、技术债务
      • pub 接口最小化;公共 API 文档完备(missing_docs)
      • unsafe 隔离在专用模块并有不变量注释 + #![forbid(unsafe_code)] 固化无 unsafe 的 crate
      • 宏的可维护性与滥用;避免过度设计(多余 trait 抽象、为模式而模式)
      • 优先简单、稳定、易维护的方案

      16. FFI 与嵌入式专项(条件启用:项目存在时才审查)

      • extern "C" 边界 panic 必须 catch_unwind 拦截并转错误码——panic 逃逸将 abort 进程
      • CString 所有权与生命周期、内部 NUL、null 结尾契约
      • 边界类型 #[repr(C)] 布局;指针所有权契约(谁分配谁释放、分配器匹配);#[no_mangle](2024 需 unsafe(no_mangle))
      • #[repr(packed)] 字段引用 UB
      • 嵌入式:no_std、panic=abort 下的错误汇报、无分配路径(try_reserve)、临界区内禁止阻塞

      第三部分:自动修改规程

      风险分级与处置矩阵

      等级 典型改动 处置方式
      L0 fmt、死 import、明确死代码、移除失效 #[allow] 直接改 + cargo check
      L1 内部实现修复,有测试覆盖、行为可证不变 直接改 + 定向测试 + clippy + test
      L2 错误处理语义、锁类型更换、查询优化 影响分析 → 说明风险 → 优先兼容方案 → 全量测试 + 基准
      L3 公共 API、serde 格式、unsafe 修复、事务语义 只出方案与风险说明,标记待确认(除非明确授权执行)
      L4 Breaking change、数据迁移、依赖 major 升级 不执行,仅报告与迁移建议

      红线(违反任意一条即视为本次任务失败)

      1. 不得用 unwrap()/expect() 让编译通过
      2. 不得用 .clone() 无脑消除借用冲突(优先重构借用关系)
      3. 不得用 #[allow(...)] 压制警告来“清零”告警
      4. 不得引入 unsafe 绕过借用检查或所有权限制
      5. 不得通过关闭/绕过安全机制(auth、TLS 校验、边界检查)解决安全问题
      6. 不得在坏基线(编译失败/测试红)上做功能性修改
      7. 不得将机械改动与语义改动混在同一批次/提交
      8. 不得修改测试断言、删除测试、盲目接受快照以“通过验证”
      9. 不得在无回归测试覆盖时改动公共 API 行为或序列化格式
      10. 不得顺手升级依赖 major 版本
      11. 不得凭“编译通过”判定行为未变(编译 ≠ 语义等价)
      12. 任何无法确认的问题必须标记**“待确认”**,禁止猜测性破坏修改
      13. 修改必须可回滚(独立提交或原始代码快照)

      验证矩阵(改动类型 → 最低门禁)

      改动类型 必须验证
      纯格式/命名/死代码 fmt + check
      内部重构(声称行为不变) clippy + 全量 test + doctest
      错误处理 错误路径定向测试 + clippy
      并发/锁 全量 test +(如适用)loom/压力说明
      unsafe miri + 定向测试 + SAFETY 注释完备性
      性能 criterion 前后对比(无基准则降级为“标记待确认”)
      公共 API / serde semver-checks + 序列化快照测试 + 兼容性说明
      数据库/迁移 迁移前向/回滚演练 + SQLX_OFFLINE 编译
      依赖 audit/deny + 全量 test

      停止条件

      • 单批次验证连续失败 2 次 → 回滚该批次,标记待确认
      • 必需验证工具不可用且改动影响运行时行为 → 停止自动修改,转纯报告
      • 触及 L3/L4 且未获明确授权 → 停止执行,交付方案

      Diff 自审清单(终审前逐项过)

      • 是否存在计划表之外的改动(scope creep)?
      • 注释/文档是否与代码同步?
      • 测试是否同步补充?
      • 是否引入新 panic 路径、新分配热点、新 unsafe?
      • 序列化输出、HTTP 响应、日志格式是否有意外变化?
      • feature 组合与 MSRV 是否仍满足?

      第四部分:产出物模板

      计划表

      优先级 位置 问题(含证据) 类别 风险等级 影响范围 修改方案 验证方式 决策 状态
      P0 file.rs:123 unsafe 块无 SAFETY 注释且越界论证缺失 unsafe 高 解析入口 收敛边界+补注释+测试 miri + test 直接修 待处理
      P1 mod.rs:45 ... Bug/性能 中 ... ... test + bench 待确认 待处理

      待确认清单

      编号 问题 无法确认的原因 建议调查路径
      T-01 ... ... ...

      终审报告

      1. 发现的问题(总数 + 分级统计)
      2. 已修改的问题(每项附:改了什么、为什么安全、验证证据)
      3. 未修改的问题及原因(风险/工具缺失/语义不明)
      4. unsafe 审计结果(逐块四分类结论)
      5. 性能优化结果(附基准数据,或说明无基准依据未执行)
      6. 安全检查结果
      7. 测试/构建/clippy 结果(基线 vs 终态:警告数、测试数、通过率)
      8. 仍然存在的风险
      9. 后续建议(按优先级排序)
      10. 回滚指引(批次/提交与改动的对应关系)
      发布在 IE地球
      四折光曲四
      四折光曲
    • RE: 哈基 项目推荐

      Link Preview Image
      GitHub - mrdoob/three.js: JavaScript 3D Library.

      JavaScript 3D Library. Contribute to mrdoob/three.js development by creating an account on GitHub.

      favicon

      GitHub (github.com)

      发布在 软件教程
      四折光曲四
      四折光曲
    • RE: 哈基 项目推荐

      Link Preview Image
      GitHub - shiaho777/web-to-app: The most full featured web-to-app toolkit on Android, a complete APK workshop that runs entirely on your phone

      The most full featured web-to-app toolkit on Android, a complete APK workshop that runs entirely on your phone - shiaho777/web-to-app

      favicon

      GitHub (github.com)

      WebToApp
      在手机上把 Web 项目打包成可安装的 Android APK。

      发布在 软件教程
      四折光曲四
      四折光曲
    • Edge MCP Agent 2

      Link Preview Image
      GitHub - Raven777777/EMA2: 通过「Edge 扩展 + 单进程 Rust 中继」让 AI 助手直接控制你的**真实 Edge 浏览器**: 读取任意网页、操作标签页、点击元素、执行 JS,并**带真实登录态**。

      通过「Edge 扩展 + 单进程 Rust 中继」让 AI 助手直接控制你的**真实 Edge 浏览器**: 读取任意网页、操作标签页、点击元素、执行 JS,并**带真实登录态**。 - Raven777777/EMA2

      favicon

      GitHub (github.com)

      EMA2 — Edge MCP Agent 2 (Rust)

      通过「Edge 扩展 + 单进程 Rust 中继」让 AI 助手直接控制你的真实 Edge 浏览器:
      读取任意网页、操作标签页、点击元素、执行 JS,并带真实登录态。

      AI 客户端 ──MCP over HTTP──> ema2.exe (单进程) ──WebSocket──> Edge 扩展 ──> 真实浏览器
      (opencode / Claude ...)   http://127.0.0.1:8765/mcp       ws://127.0.0.1:8765/
      

      特性

      • 单进程、单 exe(约 1.5 MB):Rust 实现,一个常驻进程同时承担 MCP 服务与浏览器桥接
      • MCP over HTTP:标准 Streamable HTTP + legacy SSE 双传输,opencode type: remote 直连
      • 控制真实浏览器:真实指纹、真实登录态,无头检测失效,不依赖 CDP 调试端口
      • 18 个工具:读页面 / 读标签页 / 列标签页 / 新建关闭 / 导航 / 点击 / 执行 JS,以及等待、截图、表单和页面交互工具
      • MV3 保活:定时 ping,防止 Edge 扩展 service worker 闲置回收断连
      • 安全:只绑定 127.0.0.1

      目录结构

      EMA2/
      ├── bin/ema2.exe                 # release 构建的单 exe(直接分发)
      ├── rust/                        # Rust 源码(cargo 工程)
      │   └── src/
      │       ├── main.rs              # 子命令:run / status
      │       ├── config.rs            # 端口/保活(env 覆盖)
      │       ├── http.rs              # axum:/mcp + /sse + /messages + /status + WS
      │       ├── mcp.rs               # MCP 协议处理
      │       ├── relay.rs             # 扩展 WS 连接 + 保活
      │       ├── state.rs             # 共享状态(扩展连接/待响应映射)
      │       └── tools.rs             # 18 个工具定义
      ├── extension/                   # Edge 浏览器扩展 (MV3)
      ├── scripts/
      │   ├── setup.cmd                # cargo build --release → bin/
      │   ├── start-bridge.cmd         # 启动常驻中继(隐藏后台)
      │   └── stop-bridge.cmd          # 停止中继
      ├── examples/
      │   ├── opencode.json.example    # opencode remote MCP 配置
      ├── docs/ARCHITECTURE.md
      ├── README.md
      └── LICENSE
      

      快速开始

      前置要求

      • Microsoft Edge(新版)
      • Rust 工具链(仅构建和测试需要;运行只需 bin/ema2.exe)

      1. 启动中继

      scripts\start-bridge.cmd     # 或直接运行 bin\ema2.exe run
      

      2. 加载扩展

      1. Edge 打开 edge://extensions/
      2. 打开右上角「开发人员模式」
      3. 「加载解压缩的扩展」→ 选择 extension/ 目录
      4. 确认扩展已启用:bin\ema2.exe status 显示 "extension_connected": true

      3. 配置 AI 客户端

      opencode(~/.config/opencode/opencode.json):

      {
        "mcp": {
          "edge-browser": {
            "type": "remote",
            "url": "http://127.0.0.1:8765/mcp",
            "enabled": true
          }
        }
      }
      

      Claude Desktop(%APPDATA%\Claude\claude_desktop_config.json):

      {
        "mcpServers": {
          "edge-browser": {
            "url": "http://127.0.0.1:8765/mcp"
          }
        }
      }
      

      然后重启 AI 客户端。

      工具列表

      工具 说明
      edge_get_tabs 列出所有标签页(id/title/url/active)
      edge_get_active_tab 当前标签页信息
      edge_read_active_tab 提取当前标签页纯文本
      edge_read_tab 按 tabId 提取指定标签页纯文本
      edge_execute_js 在当前标签页执行任意 JS(chrome.debugger)
      edge_click_element 按 CSS 选择器点击元素
      edge_new_tab / edge_close_tab 新建 / 关闭标签页
      edge_navigate 当前标签页跳转
      edge_wait_for 等文本出现/消失或固定时长(默认超时 30s)
      edge_take_screenshot 截图(保存 PNG 到输出目录,返回文件路径)
      edge_console_messages 读取页面 console 日志
      edge_network_requests 列出页面发起的网络请求(performance entries)
      edge_type 向选择器元素输入文本(触发 input/change)
      edge_press_key 在当前聚焦元素按键(Enter/Escape 等)
      edge_fill_form 批量填充表单字段
      edge_hover 悬停到指定元素
      edge_scroll 页面滚动(默认一个视口高度)

      配置(环境变量)

      变量 默认 说明
      EDGE_MCP_PORT 8765 监听端口
      EDGE_MCP_KEEPALIVE_MS 10000 MV3 保活 ping 间隔
      EDGE_MCP_TOKEN 无 启用后 MCP HTTP 需 Authorization: Bearer <token>;扩展 WS 地址需追加 ?token=<token>
      EDGE_MCP_OUTPUT_DIR ./output 截图输出目录

      命令行

      bin\ema2.exe run --port 8765    # 启动常驻中继
      bin\ema2.exe status             # 健康检查(含扩展连接状态)
      

      HTTP MCP 调用示例

      不依赖任何 SDK,任何语言用 HTTP POST 即可调用(这也是 opencode remote 接入的方式):

      # 1. 握手
      curl -X POST -H "Content-Type: application/json" \
        -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-03-26","capabilities":{},"clientInfo":{"name":"t","version":"1"}}}' \
        http://127.0.0.1:8765/mcp
      
      # 2. 工具列表
      curl -X POST -H "Content-Type: application/json" -H "Mcp-Session-Id: <session-id-from-step-1>" \
        -d '{"jsonrpc":"2.0","id":2,"method":"tools/list","params":{}}' \
        http://127.0.0.1:8765/mcp
      
      # 3. 调用工具(打开新标签页 / 读取标签页文本)
      curl -X POST -H "Content-Type: application/json" -H "Mcp-Session-Id: <session-id-from-step-1>" \
        -d '{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"edge_new_tab","arguments":{"url":"https://www.bing.com"}}}' \
        http://127.0.0.1:8765/mcp
      

      Node.js 示例(读取网页正文):

      // sessionId is the Mcp-Session-Id response header from initialize.
      const res = await fetch('http://127.0.0.1:8765/mcp', {
        method: 'POST', headers: { 'Content-Type': 'application/json', 'Mcp-Session-Id': sessionId },
        body: JSON.stringify({ jsonrpc: '2.0', id: 1, method: 'tools/call',
          params: { name: 'edge_read_active_tab', arguments: {} } }),
      });
      const j = await res.json();
      console.log(j.result.content[0].text);
      

      构建

      scripts\setup.cmd     # 或 cd rust && cargo build --release,产物复制到 bin/
      

      验证 Rust 服务和扩展脚本:

      cd rust
      cargo test
      cargo build --release
      cd ..
      node --check extension\background.js
      

      cargo test 当前用于验证项目可编译和测试入口;浏览器工具需要加载 Edge 扩展后才能进行端到端调用。

      天气查询脚本

      scripts/weather.js 通过 EMA2 MCP 控制真实 Edge,在 Google 查询天气并读取结果,不直接调用天气 API。需要先启动中继并确保扩展已连接:

      node scripts/weather.js "Tokyo"
      node scripts/weather.js "New York"
      node scripts/weather.js "Shanghai" --json
      

      作为模块复用:

      const { queryWeather } = require('./scripts/weather.js');
      const weather = await queryWeather('Tokyo');
      

      可通过 EMA2_MCP_URL 和 EDGE_MCP_TOKEN 覆盖 MCP 地址和鉴权;浏览器控制请求超时为 30 秒。

      常见问题

      扩展报 ERR_CONNECTION_REFUSED
      中继没在运行。先 scripts\start-bridge.cmd,扩展会自动重连(每 3s)。

      edge_execute_js 报错
      该工具走 chrome.debugger,attach 时 Edge 会短暂显示"正在调试"提示;不能在内置页面(edge:// 等)执行。若行为异常,到 edge://extensions/ 刷新扩展。

      想换端口
      环境变量 EDGE_MCP_PORT,或 ema2.exe run --port <n>;扩展侧通过 chrome.storage.local 设置 wsUrl 同步修改。

      重启电脑后中继没了
      scripts\start-bridge.cmd 是手动常驻;如需开机自启,加入「启动」文件夹或任务计划。

      安全提示

      • 中继只绑定 127.0.0.1,不要对外网暴露
      • 扩展含 debugger + <all_urls> 权限,等价于完全控制浏览器,仅用于可信的本机环境
      • 用真实登录态做高频自动化时,遵守目标网站服务条款,账号风控依旧有效

      MIT

      发布在 IE地球
      四折光曲四
      四折光曲
    • RE: 哈基 项目推荐

      Link Preview Image
      GitHub - snltty/linker: 极具特色的,P2P打洞(UDP+TCP、IPV4+IPV6) + 服务器转发,实现的异地组网、内网穿透。让你那些散落在世界各地的联网设备就像在隔壁房间一样轻松访问。

      极具特色的,P2P打洞(UDP+TCP、IPV4+IPV6) + 服务器转发,实现的异地组网、内网穿透。让你那些散落在世界各地的联网设备就像在隔壁房间一样轻松访问。 - snltty/linker

      favicon

      GitHub (github.com)

      UDP P2P

      发布在 软件教程
      四折光曲四
      四折光曲
    • RE: 哈基 项目推荐

      Link Preview Image
      GitHub - permissionlesstech/bitchat: bluetooth mesh chat, IRC vibes

      bluetooth mesh chat, IRC vibes. Contribute to permissionlesstech/bitchat development by creating an account on GitHub.

      favicon

      GitHub (github.com)

      蓝牙 去中心化 mesh 通讯

      发布在 软件教程
      四折光曲四
      四折光曲
    • Nginx Zstd 自动安装脚本

      [color=#FF4D4D]环境:Debian 13 Nginx1.31.1[/color]

      nano auto_zstd_nginx.sh
      
      #!/usr/bin/env bash
      
      # ==============================================================================
      # 脚本名称: auto_zstd_nginx.sh
      # 适用系统: Debian 12/13 / Ubuntu
      # 功能描述: 具备智能缓存检测的全功能 Nginx Zstd 动态模块编译与全自动更新脚本
      # ==============================================================================
      
      set -e # 遇到致命错误立即停止执行
      
      # 颜色输出定义
      GREEN='\033[0;32m'
      RED='\033[0;31m'
      YELLOW='\033[1;33m'
      NC='\033[0m'
      
      log_info() { echo -e "${GREEN}[INFO] $1${NC}"; }
      log_warn() { echo -e "${YELLOW}[WARN] $1${NC}"; }
      log_err()  { echo -e "${RED}[ERROR] $1${NC}"; exit 1; }
      
      SRC_DIR="/usr/src"
      CACHE_META="${SRC_DIR}/.nginx_zstd_cache.meta"
      MODULES_INSTALL_DIR="/usr/lib/nginx/modules"
      
      # 1. 权限检查
      if [ "$EUID" -ne 0 ]; then
          log_err "请使用 root 用户或通过 sudo 运行此脚本!"
      fi
      
      # 2. 检测当前运行的 Nginx 状态
      if ! command -v nginx &> /dev/null; then
          log_err "未检测到系统安装了 Nginx,请先安装 Nginx 主程序!"
      fi
      
      # 动态提取当前 Nginx 版本号 (例如: 1.31.0)
      NGINX_VER=$(nginx -v 2>&1 | awk -F/ '{print $2}' | cut -d' ' -f1)
      NGINX_ARGS=$(nginx -V 2>&1 | grep "configure arguments:" | sed 's/configure arguments://')
      log_info "当前系统运行的 Nginx 版本: ${NGINX_VER}"
      
      # 自动修正模块安装路径
      if [ ! -d "$MODULES_INSTALL_DIR" ]; then
          MODULES_INSTALL_DIR="/etc/nginx/modules"
      fi
      
      # 3. 智能检测远端 Zstd 库的最新版本(无需提前克隆)
      log_info "正在检测 Facebook Zstd 官方仓库最新动态..."
      if ! command -v git &> /dev/null; then
          # 如果没有 git,临时安装以便检测
          apt-get update -y || true
          apt-get install -y git wget awk
      fi
      
      # 获取远程最新 Commit ID
      REMOTE_ZSTD_COMMIT=$(git ls-remote https://github.com/facebook/zstd.git HEAD | awk '{print $1}')
      if [ -z "$REMOTE_ZSTD_COMMIT" ]; then
          log_err "无法连接到 GitHub 获取 Zstd 版本,请检查网络连接。"
      fi
      
      # 4. 缓存验证:比对版本与文件完整性
      NEED_BUILD_ZSTD=true
      NEED_BUILD_MODULE=true
      
      if [ -f "$CACHE_META" ]; then
          # 读取缓存的元数据
          # shellcheck disable=SC1090
          source "$CACHE_META"
          
          # 检查本地动态库文件是否存在
          if [ -f "/usr/local/lib/libzstd.so" ] && [ "$LAST_ZSTD_COMMIT" == "$REMOTE_ZSTD_COMMIT" ]; then
              NEED_BUILD_ZSTD=false
              log_info "✨ 检测到本地 Zstd 核心库已是最新版本 (${REMOTE_ZSTD_COMMIT:0:7}),跳过拉取与编译。"
          fi
      
          # 检查 Nginx 动态模块文件是否存在并比对版本
          if [ -f "${MODULES_INSTALL_DIR}/ngx_http_zstd_filter_module.so" ] && \
             [ -f "${MODULES_INSTALL_DIR}/ngx_http_zstd_static_module.so" ] && \
             [ "$LAST_NGINX_VER" == "$NGINX_VER" ] && \
             [ "$NEED_BUILD_ZSTD" == "false" ]; then
              NEED_BUILD_MODULE=false
          fi
      fi
      
      # 如果一切都未改变,直接退出
      if [ "$NEED_BUILD_ZSTD" == "false" ] && [ "$NEED_BUILD_MODULE" == "false" ]; then
          log_info "🚀 [完美缓存] 当前 Nginx 编译环境与 Zstd 模块均无任何更新,无需重复编译!"
          exit 0
      fi
      
      # 5. 解决 APT 签名错误并安装依赖
      log_info "正在准备同步系统依赖包..."
      # 核心容错:使用 || true 允许非关键性源(如 MySQL 签名过期)报错,不中断脚本
      apt-get update -y || log_warn "部分第三方软件源同步失败(例如系统的 MySQL 密钥未找到),脚本将忽略并尝试继续..."
      
      log_info "正在安装与更新必要的编译工具链..."
      apt-get install -y build-essential git libpcre3-dev zlib1g-dev libssl-dev debhelper wget
      
      # 如果系统残留了旧的发行版自带库,予以清除以防冲突
      if dpkg -l | grep -q libzstd-dev; then
          log_warn "清理系统自带的旧版 libzstd-dev 以防链路冲突..."
          apt-get remove -y libzstd-dev libzstd1 || true
      fi
      
      # 6. 【按需编译】最新的 Zstd 核心库
      cd ${SRC_DIR}
      if [ "$NEED_BUILD_ZSTD" == "true" ]; then
          log_info "正在下载/更新 Zstd 官方源码并进行编译..."
          if [ ! -d "zstd" ]; then
              git clone --depth 1 https://github.com/facebook/zstd.git
          fi
          cd zstd
          git fetch --depth 1 origin
          git reset --hard origin/dev || git reset --hard origin/master # 适配官方默认主分支
          
          log_info "开始编译 Zstd 核心库..."
          make -j$(nproc)
          make install
          ldconfig
          log_info "Zstd 核心库编译并安装成功。"
      fi
      
      # 7. 【按需编译】Nginx Zstd 动态模块
      cd ${SRC_DIR}
      if [ "$NEED_BUILD_MODULE" == "true" ]; then
          log_info "正在同步 Nginx 源码与动态模块源码..."
          
          # 清理旧的 Nginx 源码目录确保干净编译
          rm -rf "nginx-${NGINX_VER}" "nginx-${NGINX_VER}.tar.gz"
          wget -c "http://nginx.org/download/nginx-${NGINX_VER}.tar.gz"
          tar -zxf "nginx-${NGINX_VER}.tar.gz"
      
          if [ ! -d "zstd-nginx-module" ]; then
              git clone https://github.com/tokers/zstd-nginx-module.git
          fi
          cd zstd-nginx-module && git pull && cd ..
      
          log_info "配置 Nginx 模块环境,无缝继承原生 Nginx 编译参数..."
          cd "nginx-${NGINX_VER}"
          
          # 注入原生参数与定制的 Zstd include 路径
          eval "./configure ${NGINX_ARGS} --add-dynamic-module=${SRC_DIR}/zstd-nginx-module --with-cc-opt='-I/usr/local/include' --with-ld-opt='-L/usr/local/lib -Wl,-rpath,/usr/local/lib'"
      
          log_info "并行编译 Nginx Zstd 动态模块..."
          make modules
      
          log_info "将编译产物自动替换至 Nginx 目录..."
          mkdir -p ${MODULES_INSTALL_DIR}
          cp objs/ngx_http_zstd_filter_module.so ${MODULES_INSTALL_DIR}/
          cp objs/ngx_http_zstd_static_module.so ${MODULES_INSTALL_DIR}/
          chmod 644 ${MODULES_INSTALL_DIR}/ngx_http_zstd_*.so
          
          # 检查模块语法
          if nginx -t &>/dev/null; then
              log_info "Nginx 配置文件语法检查通过,正在平滑重启服务..."
              systemctl reload nginx || log_warn "Nginx 重载失败,请手动检查系统服务状态。"
          else
              log_warn "检测到 Nginx 配置当前存在异常,未自动重载,请执行 'nginx -t' 排查。"
          fi
      fi
      
      # 8. 写入/更新本地编译缓存元数据
      cat > "$CACHE_META" <<EOF
      LAST_NGINX_VER="${NGINX_VER}"
      LAST_ZSTD_COMMIT="${REMOTE_ZSTD_COMMIT}"
      EOF
      
      log_info "=================================================="
      log_info "🎉 全功能自动 Nginx Zstd 模块部署/更新任务成功完成!"
      log_info "当前缓存状态:Nginx [${NGINX_VER}] | Zstd [${REMOTE_ZSTD_COMMIT:0:7}]"
      log_info "=================================================="
      
      chmod +x auto_zstd_nginx.sh
      
      # 执行两次测试版本缓存
      sudo ./auto_zstd_nginx.sh
      
      发布在 IE地球
      四折光曲四
      四折光曲
    • RE: 哈基 项目推荐

      Link Preview Image
      GitHub - DietrichGebert/ponytail: Makes your AI agent think like the laziest senior dev in the room. The best code is the code you never wrote.

      Makes your AI agent think like the laziest senior dev in the room. The best code is the code you never wrote. - DietrichGebert/ponytail

      favicon

      GitHub (github.com)

      发布在 软件教程
      四折光曲四
      四折光曲
    • RE: 哈基 项目推荐

      @clouldon 早知道不设置32位数随机复杂密码了,,,才登上

      发布在 软件教程
      四折光曲四
      四折光曲
    • RE: 哈基 项目推荐

      Link Preview Image
      GitHub - Raven777777/UDP2CAL: UDP2CAL 是一个双向、低延迟的局域网音频串流系统。支持 Android 手机麦克风采集发送到 Windows 虚拟声卡(正向),同时 PC 扬声器音频回传到手机播放(反向)。Opus 编解码、零软件降噪、声学回声消除、立体声/单声道自适应。全链路零堆分配,生产-消费双协程,P2P 独占通信防抢占。

      UDP2CAL 是一个双向、低延迟的局域网音频串流系统。支持 Android 手机麦克风采集发送到 Windows 虚拟声卡(正向),同时 PC 扬声器音频回传到手机播放(反向)。Opus 编解码、零软件降噪、声学回声消除、立体声/单声道自适应。全链路零堆分配,生产-消费双协程,P2P 独占通信防抢占。 - Raven777777/UDP2CAL

      favicon

      GitHub (github.com)

      发布在 软件教程
      四折光曲四
      四折光曲
    • RE: 哈基 项目推荐

      VPS重装脚本

      Link Preview Image
      GitHub - bin456789/reinstall: 一键DD/重装脚本 (One-click reinstall OS on VPS)

      一键DD/重装脚本 (One-click reinstall OS on VPS). Contribute to bin456789/reinstall development by creating an account on GitHub.

      favicon

      GitHub (github.com)

      发布在 软件教程
      四折光曲四
      四折光曲
    • RE: 作为生活本身的哲学基础的操练

      三三水这样问我,我认真的思考了一下:你觉得我们应该相信第一印象不

      额我就拿我个人为例吧(?)
      我是一个不看第一印象的人,我的习惯就是不带评价的去观察人(至少是与我不相干不会实际上冒犯到我的人)
      即使我看到一个人,比如你XXXXXX,我也不会下意识的去给人贴标签
      我承认人的多样和复杂这样的客观事实,我承认这些经历会导致一些可能的坏事或者好事
      但是额由于我接触到的可以说是纯坏或者不可理喻而且将这种不可理喻(以一种令我不愉快的方式)施加到我身上的人几乎为零
      大家对我都挺好的,所有我其实潜意识里认为世界上是好人多的(经历导致)
      冒犯到我的人额那就另说了,我对此和希特勒持相同态度()

      我觉得这个是否应该相信第一印象,是一个复杂的命题
      像我的生活环境,是不怎么需要去判断一个人的好坏的,我接触的人也很少,所以我可以不去看第一印象
      但是如果生活动荡,实际上的生活环境接触到的对自己不利的人的可能大的话,应该使用第一印象去进行一些排除

      但是我觉得这个根本的命题可能是:
      我们该如何避开那些潜在的人际威胁(?)
      我们该如何在社交中选择潜在的“好人”(?)
      但是这其实很难,正如我所说,人是很复杂的,就像你,无论你是怎么看待自己的,或者你是如何对待别人,你在对待我(某些特定的人的时候)又是不一样的,是好的

      所以我的结论是,额
      如果自己是一个会被别人以第一印象来评判的人,也就是额第一印象差的人,应该用第一印象去评价别人,因为会造成这样第一印象的环境本身就是不安定的,这时候使用第一印象评价法是可以有效的避开那些风险和威胁的
      如果自己是一个不会被人以第一印象评判的人,那也不用去用第一印象去评价别人,因为你的生活环境既然塑造了这样的你,你接触那些风险和威胁的可能本来就是极小的

      但是说到底,如果一个人带着敌意,隐藏,不可见人的目的与你接触,该被拐去棉被还是得被拐去棉被,和你是否使用第一印象去规避风险没多大关系我感觉

      当然我的社交范围很小啊,这个是前提,如果大家可以在面对冒犯直白的坦言,互相沟通,无法沟通和互相理解就各自保持距离,真心换真心才是最优解吧()保持自我的独立性,不被他人左右(谈何容易()

      发布在 哲学基础
      四折光曲四
      四折光曲
    • RE: 哈基 项目推荐

      Link Preview Image
      GitHub - henrypp/simplewall: Simple tool to configure Windows Filtering Platform (WFP) which can configure network activity on your computer.

      Simple tool to configure Windows Filtering Platform (WFP) which can configure network activity on your computer. - henrypp/simplewall

      favicon

      GitHub (github.com)

      发布在 软件教程
      四折光曲四
      四折光曲
    • RE: 哈基 项目推荐

      Link Preview Image
      GitHub - umami-software/umami: Umami is a modern, privacy-focused analytics platform. An open-source alternative to Google Analytics, Mixpanel and Amplitude.

      Umami is a modern, privacy-focused analytics platform. An open-source alternative to Google Analytics, Mixpanel and Amplitude. - umami-software/umami

      favicon

      GitHub (github.com)

      发布在 软件教程
      四折光曲四
      四折光曲
    • nginx zstd压缩

      Zstd(Zstandard), Facebook(Meta)开发的开源无损数据压缩算法,2016 年发布, “高性能+高压缩比”的平衡——既比传统压缩算法(如 Gzip、Deflate)压缩更快、压缩率更高,也比同级别高压缩比算法(如 LZMA)速度更快,同时支持可配置的压缩级别(1-22,级别越高压缩率越高但速度越慢),还提供“快速模式”(级别 -1 到 -13)满足低延迟场景。

      测试环境:Debain 13 Nginx1.31.0

      I 编译最新的Zstd库

      # 安装编译工具
      sudo apt install build-essential git libpcre3-dev zlib1g-dev libssl-dev debhelper
      sudo apt remove libzstd-dev libzstd1
      
      # 1. 进入源码存放目录
      cd /usr/src
      
      # 2. 克隆 Facebook Zstd 官方主分支源码
      sudo git clone --depth 1 https://github.com/facebook/zstd.git
      cd zstd
      
      # 3. 编译并安装(核心库编译非常快)
      sudo make -j$(nproc)
      sudo make install
      
      # 4. 刷新系统的动态链接库缓存,让系统认出刚刚安装的最新 libzstd.so
      sudo ldconfig
      

      II 编译zstd-nginx模块

      # 1. 下载并解压 Nginx 1.31.0 官方源码
      sudo wget http://nginx.org/download/nginx-1.31.0.tar.gz
      sudo tar -zxf nginx-1.31.0.tar.gz
      
      # 2. 克隆 zstd-nginx-module 源码
      sudo git clone https://github.com/tokers/zstd-nginx-module.git
      
      # 3. 进入 Nginx 源码目录
      cd nginx-1.31.0
      
      # 4. 配置编译参数:通过包含路径,强行让它关联到我们刚才安装在 /usr/local/include 的最新 Zstd 头文件
      sudo ./configure --with-compat \
        --add-dynamic-module=/usr/src/zstd-nginx-module \
        --with-cc-opt="-I/usr/local/include" \
        --with-ld-opt="-L/usr/local/lib -Wl,-rpath,/usr/local/lib"
      
      # 5. 仅编译模块
      sudo make modules
      

      III 载入zstd模块

      # 1. 覆盖复制到 Nginx 模块目录
      sudo cp objs/ngx_http_zstd_filter_module.so /usr/lib/nginx/modules/
      sudo cp objs/ngx_http_zstd_static_module.so /usr/lib/nginx/modules/
      

      2. 赋予标准权限

      sudo chmod 644 /usr/lib/nginx/modules/ngx_http_zstd_*.so

      打开 /etc/nginx/nginx.conf,在最顶部添加加载指令:

      # 引入 Zstd 动态过滤和静态加载模块
      load_module modules/ngx_http_zstd_filter_module.so;
      load_module modules/ngx_http_zstd_static_module.so;
      
      user  www-data;
      worker_processes  auto;
      

      IV 修改网页配置

      以Flarum 为例

          zstd on;
          zstd_comp_level 3;       # 动态压缩推荐级别 3(1-5 之间性能与压缩率平衡最佳,最大为 22)
          zstd_min_length 256;     # 小于 256 字节的文件不压缩
          zstd_buffers 16 8k;
          
          # 允许 Nginx 直接读取预先压缩好的 .zst 静态文件(如果存在)
          zstd_static on;
      
          # 精准针对 Flarum 的 API、JS 和各种文本格式进行 Zstd 压缩
          zstd_types
              text/plain
              text/css
              text/javascript
              application/javascript
              application/json
              application/xml
              application/rss+xml
              application/atom+xml
              image/svg+xml
              image/x-icon;
      
      #检查配置文件,重启Nginx
      nginx -t
      
      systemctl reload nginx
      

      在线检测:https://zstd.wcode.net

      按下 F12 打开开发者工具,前往 Network(网络) 面板。
      Content-Encoding: zstd
      Vary: Accept-Encoding

      表明 Nginx 1.31.0 已经成功部署了目前业界公认在动态生成场景下处理效率极高、对 CPU 压迫极小的 Zstd 压缩引擎!

      发布在 软件教程
      四折光曲四
      四折光曲
    • RE: 哈基 项目推荐

      Link Preview Image
      GitHub - badges/shields: Concise, consistent, and legible badges in SVG and raster format

      Concise, consistent, and legible badges in SVG and raster format - badges/shields

      favicon

      GitHub (github.com)

      发布在 软件教程
      四折光曲四
      四折光曲