边界条件之场
66 subscribers
680 photos
4 videos
10 files
1.03K links
Do you hear the sirens sing?

main: @cvf_cha
group: @cvf_gro
forwards: @cvf_for
Download Telegram
Forwarded from Lancern's Treasure Chest
你怎么能在生产环境里直接 unwrap() 啊?!Rust 不是这样用的!你应该先认真设计一个靠谱的错误类型,用 thiserror 或 anyhow 包装好上下文信息,然后在每一层调用链里用 ? 把错误优雅地向上传递。遇到可能出现网络抖动、I/O 超时、序列化失败这种情况,你要先写好健壮的重试逻辑、退避策略和熔断机制,并且在日志里带上 trace id,这样 SRE 才能在凌晨三点定位问题。然后你要写单元测试,把所有可能失败的路径都测一遍;集成测试里还要模拟网络异常和依赖服务挂掉的情况,确保你的代码不会一言不合就 panic。接着你要跑一下 clippy,把所有 “consider handling the Result instead of unwrapping” 的警告都修干净;还要跑 rustfmt,让代码风格保持一致。之后你才可以 commit 然后 push 。你 push 上去之后,CI 会跑 cargo test、cargo check、cargo clippy、cargo fmt –check,还有压力测试确保你的服务在压力下不会因为一个 unwrap() 就直接把整个服务集群带走。等 PR 至少经过两位 reviewer、三个 LGTM,并且 SRE 点头同意这个改动不会再次导致全球范围的 5xx 风暴之后,我才会考虑把你的分支 merge 进去。你怎么上来就直接在关键路径 unwrap()?!Rust 根本不是这样写的!我拒绝合并!
😁1
但是一旦非正常情况导致内存占用飙升 超出了预分配的空间,就既不能增加内存分配、也不能 gracefully fail,必须整个线程完全 panic 然后 crash

https://t.iss.one/SukkaChannel/1033

??? sukka 不会完全没写过也没了解过 rust 吧,正经语言怎么可能不让你 realloc,分明是写代码的人决定超出预期值后不增加分配而是 panic。gracefully fail 在这个例子下也是完全取决于代码怎么写,又不是 oom,怎么会必须 panic?
Forwarded from 卡卡大声喵喵 (盐粒 Yanli)
很多人认为 unwrap 是这次事故的问题所在,我认为本质原因在于配置下发不够防御性,没有拦住错误配置。对于异常处理来说,unwrap 或 ? 其实是可以等价的,最终都会显示出一个 500 的页面。
https://blog.yanli.one/ideas-about-exception-catch
写代码真的好容易破坏作息

明明之前和家人旅游的两周已经养好了很规律的十点睡七点起的作息,已经适应到只要到晚上十点就会困了,但是 hyper focus 着写了两天代码之后又变成凌晨才睡了... 🤗
Please open Telegram to view this post
VIEW IN TELEGRAM
#rust iced 想要 mutate 程序状态必须通过它的 message 系统,然而 Msg 类型要求 Clone。遇到不支持 Clone 的第三方类型怎么办?只能 Arc<Mutex<Option<T>>> 🤮
- Arc 为了 clone
- Option 为了能 .take() 拿所有权
- Mutex 为了能 Option::take
Arc::into_inner 拿所有权是不行的,万一 Msg 被 iced runtime 内部 clone 了就拿不到了 🥴

iced 作者表示虽然目前并不是必须要求 Msg: Clone, 但这是 Elm 架构的设计理念,不打算修改: https://github.com/iced-rs/iced/pull/418#issuecomment-650637125
边界条件之场
#rust iced 想要 mutate 程序状态必须通过它的 message 系统,然而 Msg 类型要求 Clone。遇到不支持 Clone 的第三方类型怎么办?只能 Arc<Mutex<Option<T>>> 🤮 - Arc 为了 clone - Option 为了能 .take() 拿所有权 - Mutex 为了能 Option::take 靠 Arc::into_inner 拿所有权是不行的,万一 Msg 被 iced runtime 内部 clone 了就拿不到了 🥴 iced 作者表示虽然目前并不是必须要求…
If a type isn't Clone, then it means it's not made of pure immutable data, therefore it shouldn't be wrapped in a message.

深表不赞同。例如我的程序需要访问数据库,初始状态下我手上只有鉴权信息没有数据库 handle:
State {
user: "qwer", passwd: "zxcv",
db: None,
}

现在我拿着鉴权信息去连接数据库,按照 Elm 的状态管理架构就是:连接成功通过 message 系统传过来一个 Msg::DbConn(DbHandle), 处理这个 Msg 拿到 DbHandle 的所有权放到 State 里:
State {
user: "qwer", passwd: "zxcv",
db: Some(DbHandle),
}


非常正常的需求,但是由于要求 Msg: Clone, 在第三方 DbHandle: !Clone 的情况下就只能 Arc Mutex 体操
用惯了各种现代编辑器以后我对 vim 的容忍度越来越低了

有个 gb2312 编码的文件想在终端里看一眼, vim(neovim) 打开乱码,想着手动指定一下文件编码,翻文档找到 fileencodings 设置项,但没看到合法编码名称列表。在 vim 里打命令后按 tab 列出编码列表,上下翻找了两遍没看到 gb* 系列编码 🤔
网上一查才知道要选 cp936, "windows code page 936" #wtf
并且改了 fileencodings 之后还要 :e 重加载 buffer

后来试着用 helix 打开,什么都不用动就自动正确识别了文件编码 🤷
I really like the Helix editor.
Meanwhile, in the world of Vim you find Github repositories that self-describe as ‘minimal neovim configuration’ and contain over a dozen files of Lua and a few hundred lines of code full of side effects.

Needless to say, I’m not much of a fan of fancy ‘Vim-with-batteries-included’ setups like LunarVim either.

LunarVim essentially stacks a ton of plugins on top of Neovim to make it look like VSCode. I’ve never been a fan, honestly. When I used Neovim, even a moderate amount of plugin resulted in some performance issues, whereas Helix just feels a lot snappier, and less brittle.

If you’re into this, more power to you. It’s just not for me.

另:这网站有股报纸的感觉 👀
Intel 在给 11th gen 笔电的最新核显驱动中移除了 "Display Power Saving Technology" 开关,改为将用户指向 windows 系统设置。
不知道 win11 的系统设置是不是真的集成了这个开关,反正我 win10 没有 🤷

于是在某次重置显卡驱动后我发现这个辣眼睛的傻逼 D.P.S.T. 变回了开启状态,并且没地方关。好在这篇 9 年前的文章仍然有效: Disable Intel Display Power Saving Technology on Surface Pro 4

TLDR:
[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Class\{4d36e968-e325-11ce-bfc1-08002be10318}\] 这个注册表目录下有一些四位数字子目录。
取决于机型,其中一个目录下会有 FeatureTestControl 键值。
把这个键值的第四个比特位设为 1 即可关闭 D.P.S.T. 。
换句话说就是 FeatureTestControl |= (0b1 << 4)
#tips #windows #intel #wintel
iced 貌似支持多点触控 (iced::touch),但是没找到利用这个特性的预置控件。 iced::widget::MouseArea 对多点触控的反应类似于 "始终只有一个鼠标指针,瞬移到最新触控事件的位置"。
懒得自制控件了,不支持就不支持吧 🫠
AM5 插槽的 ASUS 和 ASRock 消费级主板竟然支持 unbuffered ECC 内存 👀
并且网友反馈这个「支持」是指 ECC 正常工作,能观测到纠错事件,而不是仅仅能开机。

但是这两家的主板其它方面都有点问题:
- ASRock 有概率烧 AMD 9000 系列 cpu,根据 r/asrock 上的统计数据,已经大半年了仍然没有彻底解决。
- ASUS 默认设置下会利用 WPBT 向系统注入各种各样的 ASUS 程序,卸载了还会重新注入。这种华为联想行为虽然恶心,但好在 1. 可以从 bios 里关闭; 2. linux 内核压根就不支持 WPBT, 不受影响。
#computer #desktop

PS: 趁着现在显卡还没跟着内存一起涨价,想装机又不打算再等一年两年后价格也许回落的话建议现在就忍痛入手。