strace-ui、Bonsai_term 与 TUI 复兴
我们一直发现 strace 有用,但在使用上有些困难。它的输出往往难以解读,很难跟踪子进程或线程,如果想要过滤系统调用,必须为每个调用重新运行跟踪并加上标志。在调试时你想要的是一个用于探索、细化等的工具,但 strace 可能会使这变得困难。于是出现了 strace-ui,它将 strace 转变为一个交互式终端 UI:strace-ui 为 PIDs 分配短 ID,便于扫描,格式化结构体,将缓冲区呈现为十六进制转储而不是字符串。它还有一些其他不错的功能,在截图中看不到:交互式过滤。跟踪一个异步的 OCaml 进程?你是否忘记传递 -e '!futex,timerfd_settime,epoll_wait'?别担心:按 h 键可以隐藏你不关心的任何系统调用。跟踪特定文件描述符。按 > 或 < 跳到上一个/下一个引用相同文件描述符的系统调用,或按 F 键将你的过滤器更改为只包括触及给定 FD 的系统调用。(这比单纯的数字 FD 过滤要聪明一些:strace-ui 尝试追踪 FD 重用并在分叉时跟踪,但如果你附加到一个已经打开 FDs 的进程上,它的表现并不好。)rt_sigprocmask 到底是什么?按 m 键打开手册页了解更多。子进程或线程被分配短的数字标签,而不是显示原始 PID,使得跟踪复杂的 strace -f 调用变得更加容易(你也可以按 PID 过滤或排除 PIDs)。DNS 解析:strace 的 --decode-fds=all 将文件描述符打印为 14<TCP:[55.55.555.555:12345->11.11.11.11:56789]>,这很棒。strace-ui 更进一步,打印成 14<TCP:[a-real-hostname:12345->another-hostname:56789]>,这使得你可以快速了解你的进程到底在做什么。这里的开发者 Ian Henry 制作了 strace-ui 来满足自己的需求。2017 年,他寻找这样的工具却从未找到。虽然有构建交互式终端 UI 的经验(包括在 OCaml 中使用 lambda_term),他知道这可能是多么困难和不愉快。这个想法在多年来逐渐酝酿,直到最近一些因素汇聚在一起,使得终端 UI 开发变得相当愉快。Bonsai,一个强大的反应式 UI 框架。多年来,我们一直在使用 OCaml 用函数式风格构建 Web 应用,利用我们开发的一个名为 Bonsai 的库,它受到 Elm 的松散启发。一个简单的 Bonsai 组件与一些交互看起来像这样:module Dice = struct let faces = ... let component ( graph @ local ) = let face , set_face = Bonsai . state ( List . hd_exn faces ) graph in let % arr face and set_face in {% html | < div > 你掷出了 #{ face } < button style = "" on_click =%{ fun _ -> let index = Random . int ( List . length faces ) in set_face ( List . nth_exn faces index )} > 掷骰子 </ button > </ div > |} end 组件作为纯函数状态机实现,易于组合。框架中的增量化意味着值在必要时才会被重新计算。这适用于每个值,而不仅仅是视图。Bonsai 的巧妙之处在于,它允许你按需组合状态和增量原语。在用户交互期间防止重新渲染整个页面的相同原语也可以用于增量计算在实时更新的数据集上的昂贵业务逻辑 (如果你习惯使用 React,想象一下如果一切都使用与钩子非常相似的东西,并且状态在组件层次结构之外管理)。而且因为 Bonsai 是用 OCaml 编写的,所以能够在后端和前端使用相同的语言和类型。很难夸大这对维护大型 Web 应用代码库的可管理性,尤其当你广泛利用 OCaml 的类型系统时。Bonsai 实际上不是一个 Web 框架。目前我们在谈论的是 Bonsai_web。Bonsai 本身与前端无关,因为仔细想想,所有 UI 从根本上都可以被表达为有状态的增量计算,其中不同的组件知道如何在其底层数据改变时自我呈现。如果 Bonsai 是用于管理状态生命周期和作用域的库,上面有一层用于表达给定 UI 表面细节的层,那么你可以看到相同的底层核心是如何被适应的。这就是 Bonsai_term 的来源。当 Ty Overby 在 2019 年制作 Bonsai 时,最终将其用于终端应用的想法曾是一个笑话。在某种程度上,Bonsai 的整个意义在于,我们在 Jane Street 感到在 Web 开发方面有点力不从心。我们一些最重要的应用是建立在古老且相对困难的 curses 库上,它确实名副其实。终端应用快速且以键盘为中心,这一点我们很喜欢,但 Web 同样也有很多优势。点击超链接的操作 ergonomics 难以超越;当然,Web 还为你提供了...
本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。
☕请我喝杯咖啡