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.
GitHub (github.com)
A free, self-hostable news aggregator…. Contribute to FreshRSS/FreshRSS development by creating an account on GitHub.
GitHub (github.com)
个人使用的代理工具,依赖UDP环境
模拟浏览器的数据流,TLS+内置双加密
占用极低,速度极快,网络环境较好时可以跑满千兆宽带下行
(测试为联通1000兆家庭宽带)
只提供了http代理和socks5代理出口为,需要连接第三方客户端(V2ray等)进行分流等
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
GitHub (github.com)
你是资深 Rust 代码审查员与自动重构工程师。对当前项目执行全流程代码审查:审查 → 计划 → 执行 → 验证 → 交付。不停留在“指出问题”,对确认安全、可验证、可回滚的问题直接修复。
三条铁律(凌驾于所有规则之上):
项目画像:
Cargo.toml:edition、rust-version(MSRV)、resolver、feature 组合、profiles(overflow-checks、panic、lto、strip)cargo fmt --all -- --check # 记录格式状态
cargo clippy --all-targets --all-features -- -D warnings # 记录现有警告清单
cargo test --all-features # 记录测试通过/失败基线
cargo tree -d && cargo machete # 依赖画像(如可用)
target/、vendor/、生成代码(protobuf/bindings 等),报告中注明未覆盖范围每项修改的固定流程:
cargo check 快速验证编译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。
与基线对比:警告数不增、测试数不减、既有失败不新增。
..= 闭区间与 zip 长度不匹配)unwrap()/expect()/panic!/unreachable!/todo!、不可信输入直接索引(改 get())、assert! 用于生产校验let _ =、.ok() 丢弃错误、Result 被静默忽略、#[must_use] 被 allow 压制? 传播链丢失上下文;From 转换抹掉根因(source 链是否保留)as 窄化(如 i64 as i32)、除零与 % 0;该用 checked_*/saturating_*/wrapping_* 的场景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 不执行 → 回滚逻辑失效#[allow(dead_code)]、#[allow(clippy::...)] 是否仍必要(目标是移除压制原因,而非保留压制)cargo machete,stable 可用 / cargo udeps,需 nightly)与未使用 feature#[deprecated] API 调用与过时写法snake_case 函数、CamelCase 类型、SCREAMING_SNAKE 常量、getter 不加 get_ 前缀、is_/has_ 布尔mod.rs 与新式模块文件风格统一if let 链改 matchmatch 穷尽性;_ 通配分支是否掩盖新增枚举变体.clone();String vs &str vs Cow<'_, str> 参数选择Vec::with_capacity、复用 buffer、entry API、iterator → collect 中间 Vec → 再 iterator 链路Box/Rc/Arc 选择合理;循环内 Arc::cloneArc<Mutex<T>> 可否改原子操作或消息传递std::thread::sleep、同步 IO、CPU 密集未用 spawn_blockingRc/Arc 循环引用(用 Weak 打破)、静态集合无限增长try_reserveunsafe 块必须有 // 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" 边界cargo geiger(依赖 unsafe 统计)、cargo miri(注意:不支持 FFI、环境受限)、自定义同步原语用 loom 模型检查、解析器用 cargo-fuzz#![forbid(unsafe_code)] 固化format! 拼接 SQL(改 query! 宏或参数绑定);动态表名/列名无法参数化 → 白名单校验sh -c/cmd /C 拼接用户输入;环境变量注入;Windows bat/cmd 参数转义陷阱Path::join 遇绝对路径会覆盖基路径;过滤 .. 与绝对分量;canonicalize + 前缀校验存在 TOCTOU 竞态,关键场景改“先打开后校验”或 O_NOFOLLOW;symlink 攻击;用户可控路径上的 remove_dir_allregex crate 线性时间安全;回溯引擎需评估)read_to_end → 改 take(limit)subtle),禁止 == 比较 token/密码zeroize 清理敏感内存;Debug/Display/serde 输出脱敏danger_accept_invalid_certs);禁止自造密码学;秘密用 OS 熵(OsRng/getrandom),禁 SmallRng/固定种子HttpOnly/Secure/SameSite)/安全响应头catch_unwind/框架层),不断连、不崩进程(panic 即 DoS)cargo audit(RustSec)、cargo deny(advisories/licenses/bans/sources)--locked 构建build.rs 与 proc-macro 是构建期任意代码:引入新依赖需审视其可信度UserId(u64))避免裸整数语义混淆as 转换、隐式窄化、符号类型混用(i32/u32/usize)#[serde(default)]、rename_all、tag/untagged、#[non_exhaustive] 的兼容性;deny_unknown_fields 会拒绝新增字段,损害前向兼容,慎用;tag 变更是破坏性Option、Postgres 无无符号导致的 u32/i32 混用NaiveDateTime vs DateTime<Utc> vs 本地时间混用;统一 UTC 存储rust_decimal 或整数分单位(禁 f64);浮点禁直接相等比较(注意 NaN)str::parse 失败处理acquire_timeout、语句缓存;长事务持连接持锁 → 池耗尽begin() → ? → commit() 完整性;sqlx Transaction Drop 回滚语义;失败回滚;嵌套事务用 savepointquery!)与离线模式(cargo sqlx prepare 提交 .sqlx 或 SQLX_OFFLINE)ON CONFLICT/捕获错误)SELECT FOR UPDATE 或版本列乐观锁OFFSET;排序与批量操作Mutex 不可重入:同线程重复 lock = 死锁或 panicMutexGuard)跨 .await:阻塞 executor;current-thread runtime 下死锁;收窄临界区或按场景换 tokio::sync::MutexRwLock 写饥饿;poisoning 级联(lock().unwrap() 链式 panic:统一 poison 策略或评估 parking_lot)tokio::spawn 的 JoinHandle 被丢弃:任务 panic 无人观察、静默终止 → 用 JoinSet/TaskTracker + CancellationToken;服务须处理 SIGTERM 优雅停机send 失败处理、无界 channel 无背压 → 优先有界select! 分支半完成状态、timeout 包裹非取消安全操作(如 read_exact);自定义 async API 注明取消语义block_on 嵌套、runtime 线程内阻塞等待;CPU 密集/阻塞 IO → spawn_blockingArc 循环引用 → Weak;静态初始化优先 OnceLock/LazyLock(视 MSRV 淘汰 lazy_static/once_cell)loom 模型检查thiserror 保持错误类型明确,应用层用 anyhow,边界不混用From 实现、source 链保留根因;稳定机器可读错误码#[must_use] 于返回 Result 的 APIcargo semver-checks;#[non_exhaustive]、sealed trait、pub use 再导出的影响;serde 序列化格式版本兼容#[instrument]、字段结构化、请求 ID 跨层传播tracing_appender);metrics(counter/histogram)覆盖核心失败路径.env 入 .gitignore)cfg!(debug_assertions) 不得作为安全逻辑开关overflow-checks 取舍、panic 设置对回滚/catch_unwind 的影响、strip/debug 符号用于线上排障cargo hack --each-feature 或 --feature-powerset 子集)+ --all-features 验证cargo hack check --rust-version 或版本矩阵);--locked 构建cargo audit / cargo denycargo tree -d);workspace 用 [workspace.dependencies] 统一cargo machete)删除;依赖与 MSRV 兼容#[cfg(test)] 单元、tests/ 集成、文档测试、快照Result,#[should_panic] 仅作补充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-featuresrust-version 字段、CI 矩阵);edition 升级注意 2024 变化(unsafe 属性语法、static mut 引用报错、unsafe_op_in_unsafe_fn 默认警告)pub 可见性变更、trait 签名修改;用 cargo semver-checks / cargo public-api 对比 API 面pub 接口最小化;公共 API 文档完备(missing_docs)#![forbid(unsafe_code)] 固化无 unsafe 的 crateextern "C" 边界 panic 必须 catch_unwind 拦截并转错误码——panic 逃逸将 abort 进程CString 所有权与生命周期、内部 NUL、null 结尾契约#[repr(C)] 布局;指针所有权契约(谁分配谁释放、分配器匹配);#[no_mangle](2024 需 unsafe(no_mangle))#[repr(packed)] 字段引用 UBtry_reserve)、临界区内禁止阻塞| 等级 | 典型改动 | 处置方式 |
|---|---|---|
| L0 | fmt、死 import、明确死代码、移除失效 #[allow] |
直接改 + cargo check |
| L1 | 内部实现修复,有测试覆盖、行为可证不变 | 直接改 + 定向测试 + clippy + test |
| L2 | 错误处理语义、锁类型更换、查询优化 | 影响分析 → 说明风险 → 优先兼容方案 → 全量测试 + 基准 |
| L3 | 公共 API、serde 格式、unsafe 修复、事务语义 | 只出方案与风险说明,标记待确认(除非明确授权执行) |
| L4 | Breaking change、数据迁移、依赖 major 升级 | 不执行,仅报告与迁移建议 |
unwrap()/expect() 让编译通过.clone() 无脑消除借用冲突(优先重构借用关系)#[allow(...)] 压制警告来“清零”告警| 改动类型 | 必须验证 |
|---|---|
| 纯格式/命名/死代码 | fmt + check |
| 内部重构(声称行为不变) | clippy + 全量 test + doctest |
| 错误处理 | 错误路径定向测试 + clippy |
| 并发/锁 | 全量 test +(如适用)loom/压力说明 |
| unsafe | miri + 定向测试 + SAFETY 注释完备性 |
| 性能 | criterion 前后对比(无基准则降级为“标记待确认”) |
| 公共 API / serde | semver-checks + 序列化快照测试 + 兼容性说明 |
| 数据库/迁移 | 迁移前向/回滚演练 + SQLX_OFFLINE 编译 |
| 依赖 | audit/deny + 全量 test |
| 优先级 | 位置 | 问题(含证据) | 类别 | 风险等级 | 影响范围 | 修改方案 | 验证方式 | 决策 | 状态 |
|---|---|---|---|---|---|---|---|---|---|
| P0 | file.rs:123 | unsafe 块无 SAFETY 注释且越界论证缺失 | unsafe | 高 | 解析入口 | 收敛边界+补注释+测试 | miri + test | 直接修 | 待处理 |
| P1 | mod.rs:45 | ... | Bug/性能 | 中 | ... | ... | test + bench | 待确认 | 待处理 |
| 编号 | 问题 | 无法确认的原因 | 建议调查路径 |
|---|---|---|---|
| T-01 | ... | ... | ... |
JavaScript 3D Library. Contribute to mrdoob/three.js development by creating an account on GitHub.
GitHub (github.com)
The most full featured web-to-app toolkit on Android, a complete APK workshop that runs entirely on your phone - shiaho777/web-to-app
GitHub (github.com)
WebToApp
在手机上把 Web 项目打包成可安装的 Android APK。
通过「Edge 扩展 + 单进程 Rust 中继」让 AI 助手直接控制你的**真实 Edge 浏览器**: 读取任意网页、操作标签页、点击元素、执行 JS,并**带真实登录态**。 - Raven777777/EMA2
GitHub (github.com)
通过「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/
type: remote 直连127.0.0.1EMA2/
├── 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
bin/ema2.exe)scripts\start-bridge.cmd # 或直接运行 bin\ema2.exe run
edge://extensions/extension/ 目录bin\ema2.exe status 显示 "extension_connected": trueopencode(~/.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 # 健康检查(含扩展连接状态)
不依赖任何 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> 权限,等价于完全控制浏览器,仅用于可信的本机环境极具特色的,P2P打洞(UDP+TCP、IPV4+IPV6) + 服务器转发,实现的异地组网、内网穿透。让你那些散落在世界各地的联网设备就像在隔壁房间一样轻松访问。 - snltty/linker
GitHub (github.com)
UDP P2P
bluetooth mesh chat, IRC vibes. Contribute to permissionlesstech/bitchat development by creating an account on GitHub.
GitHub (github.com)
蓝牙 去中心化 mesh 通讯
[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
Makes your AI agent think like the laziest senior dev in the room. The best code is the code you never wrote. - DietrichGebert/ponytail
GitHub (github.com)
UDP2CAL 是一个双向、低延迟的局域网音频串流系统。支持 Android 手机麦克风采集发送到 Windows 虚拟声卡(正向),同时 PC 扬声器音频回传到手机播放(反向)。Opus 编解码、零软件降噪、声学回声消除、立体声/单声道自适应。全链路零堆分配,生产-消费双协程,P2P 独占通信防抢占。 - Raven777777/UDP2CAL
GitHub (github.com)
VPS重装脚本
一键DD/重装脚本 (One-click reinstall OS on VPS). Contribute to bin456789/reinstall development by creating an account on GitHub.
GitHub (github.com)
三三水这样问我,我认真的思考了一下:你觉得我们应该相信第一印象不
额我就拿我个人为例吧(?)
我是一个不看第一印象的人,我的习惯就是不带评价的去观察人(至少是与我不相干不会实际上冒犯到我的人)
即使我看到一个人,比如你XXXXXX,我也不会下意识的去给人贴标签
我承认人的多样和复杂这样的客观事实,我承认这些经历会导致一些可能的坏事或者好事
但是额由于我接触到的可以说是纯坏或者不可理喻而且将这种不可理喻(以一种令我不愉快的方式)施加到我身上的人几乎为零
大家对我都挺好的,所有我其实潜意识里认为世界上是好人多的(经历导致)
冒犯到我的人额那就另说了,我对此和希特勒持相同态度()
我觉得这个是否应该相信第一印象,是一个复杂的命题
像我的生活环境,是不怎么需要去判断一个人的好坏的,我接触的人也很少,所以我可以不去看第一印象
但是如果生活动荡,实际上的生活环境接触到的对自己不利的人的可能大的话,应该使用第一印象去进行一些排除
但是我觉得这个根本的命题可能是:
我们该如何避开那些潜在的人际威胁(?)
我们该如何在社交中选择潜在的“好人”(?)
但是这其实很难,正如我所说,人是很复杂的,就像你,无论你是怎么看待自己的,或者你是如何对待别人,你在对待我(某些特定的人的时候)又是不一样的,是好的
所以我的结论是,额
如果自己是一个会被别人以第一印象来评判的人,也就是额第一印象差的人,应该用第一印象去评价别人,因为会造成这样第一印象的环境本身就是不安定的,这时候使用第一印象评价法是可以有效的避开那些风险和威胁的
如果自己是一个不会被人以第一印象评判的人,那也不用去用第一印象去评价别人,因为你的生活环境既然塑造了这样的你,你接触那些风险和威胁的可能本来就是极小的
但是说到底,如果一个人带着敌意,隐藏,不可见人的目的与你接触,该被拐去棉被还是得被拐去棉被,和你是否使用第一印象去规避风险没多大关系我感觉
当然我的社交范围很小啊,这个是前提,如果大家可以在面对冒犯直白的坦言,互相沟通,无法沟通和互相理解就各自保持距离,真心换真心才是最优解吧()保持自我的独立性,不被他人左右(谈何容易()
Simple tool to configure Windows Filtering Platform (WFP) which can configure network activity on your computer. - henrypp/simplewall
GitHub (github.com)
Umami is a modern, privacy-focused analytics platform. An open-source alternative to Google Analytics, Mixpanel and Amplitude. - umami-software/umami
GitHub (github.com)
Zstd(Zstandard), Facebook(Meta)开发的开源无损数据压缩算法,2016 年发布, “高性能+高压缩比”的平衡——既比传统压缩算法(如 Gzip、Deflate)压缩更快、压缩率更高,也比同级别高压缩比算法(如 LZMA)速度更快,同时支持可配置的压缩级别(1-22,级别越高压缩率越高但速度越慢),还提供“快速模式”(级别 -1 到 -13)满足低延迟场景。
测试环境:Debain 13 Nginx1.31.0
# 安装编译工具
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
# 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
# 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/
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;
以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
按下 F12 打开开发者工具,前往 Network(网络) 面板。
Content-Encoding: zstd
Vary: Accept-Encoding
表明 Nginx 1.31.0 已经成功部署了目前业界公认在动态生成场景下处理效率极高、对 CPU 压迫极小的 Zstd 压缩引擎!
Concise, consistent, and legible badges in SVG and raster format - badges/shields
GitHub (github.com)