双相元编程:一种新语言设计方法
本文讨论了编程语言的一种趋势,即允许相同的语法表达
- 在两个不同阶段或环境(上下文)中执行的计算
- 同时保持跨阶段(上下文)的一致行为。
- 这些阶段通常在时间上(运行时间)或空间上(运行地点)有所不同。
作者提供了三种体现这种“双相编程(biphasic programming)”概念的语言示例:
- Zig:Zig 允许使用“comptime”关键字在编译时运行普通函数,提供与基础语言相同的表达能力.这使得源代码中的构建时间和运行时执行之间能够无缝切换。
- Winglang:Winglang 是一种用于编写云应用程序的编程语言,其设计采用了双相概念。它提供预检代码(在编译时运行以定义云基础设施)和运行中代码(在运行时运行以与基础设施交互)。两个阶段具有相同的语法,但具有不同的规则和功能。
- React 服务器组件 (RSC):RSC 允许 React 组件指定它们应该在服务器端还是客户端渲染,从而实现服务器渲染和客户端渲染组件的灵活组合。此方法旨在通过最小化服务器和客户端之间传输的动态 HTML 和组件信息量来优化页面性能。
作者提出,双相规划可用于解决各种问题,探索这些解决方案规则之间的重叠和差异可能会产生有趣的见解文章还提到,虽然编译时代码执行并不是一个新想法,但 Zig 的方法似乎避免了其他元编程 系统的几个缺点。
双相编程问题
虽然双相编程可以在表达力、性能和灵活性方面带来好处,但开发人员必须做好准备,以应对在项目中采用这种模式所带来的日益增加的复杂性和潜在挑战
- 复杂性增加:双相编程要求开发人员在同一代码库中管理两个不同的执行阶段(例如编译时和运行时),从而增加了一层复杂性。这会增加认知负担,使代码更难理解和维护。
- 参数化和数据需求:双相模型通常需要更多的参数和数据来捕捉两个阶段的细微差别,与更简单的单相模型相比,这使得它们更难以拟合和验证。
- 工具和生态系统支持:现有的开发工具、库和框架可能不完全支持双相编程范式,需要开发人员投入时间和精力来构建定制解决方案或调整他们的工作流程。
- 性能权衡:在编译时执行代码的能力可以提供性能优势,但也可能引入新的性能考虑,例如增加编译时间或缓存和记忆的潜在问题。
- 采用和学习曲线:双相编程代表了传统编程模型的转变,开发人员在加入团队并将新方法集成到现有代码库和开发实践中时可能会面临阻力或挑战。
- 调试和故障排除:将代码执行分为两个不同的阶段可能会使调试和解决问题变得更加困难,因为根本原因可能隐藏在编译时和运行时环境之间的交互中
1、案例:Zig
Zig一种系统编程语言,可让您编写高性能代码,并相对轻松地逐步采用到 C/C++ 代码库中。
它的主要创新之一是一种名为“comptime”的全新元编程方法,可让您在编译时运行普通函数。
与 C、C++ 和 Rust 中的预处理系统和宏系统相比,comptime 的独特之处在于,它通过“comptime”关键字为您提供了与基础语言相同的[2](https://rybicki.io/blog/2024/06/30/biphasic-programming.htmlfn:2)表达能力,而不是引入只有高级用户才可能想要学习的完全独立的领域特定语言。
const expect = @import("std").testing.expect;
fn fibonacci(index: u32) u32 {
if (index < 2) return index;
return fibonacci(index - 1) + fibonacci(index - 2);
}
test "fibonacci" { // 运行时测试斐波那契 try expect(fibonacci(7) == 13); //在编译时测试斐波那契 try comptime expect(fibonacci(7) == 13);
}
作为双相编程的一种情况,comptime 允许 Zig 用户在源代码中无缝切换在构建时运行代码和在运行时运行代码,而不会带来陡峭的学习曲线。
它改变了开发人员的思维模式,不再将元编程视为高级魔法,而是将其视为一种优化工具,还可以利用它来实现泛型和其他代码生成用途。
不管怎样,编译时代码执行并不是一个全新的想法。然而,Zig 的方法似乎确实避免了一些缺点。例如,与 Rust 及其const 函数不同,Zig 不会对 comptime 函数强制使用函数着色。同样,与 C++ 的模板系统不同,Zig 不会引入任何用于表示泛型的新语法。与支持 hygenic 宏的 Scheme 和 Racket 等 Lisp 相比,Zig 并不要求所有内容都是列表。
TL;DR: Zig 支持一种双相编程形式,其中相同的函数可以在两个不同的阶段运行,这两个阶段在时间上(构建时间与运行时间)和空间上(在构建系统上与在运行二进制文件的机器上)有所不同。
2、案例:React 服务器组件
我注意到的第二个双相编程示例是React Server Components (RSC)。React 本身并不是一门语言,但作为一个 JavaScript Web 框架,它作为编写和编写大型网站的 UI 组件及其相关 UI 逻辑的基础系统,拥有相当大的知名度。
最近,前端 JavaScript 生态系统一直在进行大量探索,以找出如何最有效地在服务器或客户端上呈现 UI 组件以提高页面性能。已经提出了许多解决方案,其中最雄心勃勃的解决方案之一就是 RSC。
RSC 背后的想法是允许 React 组件指定它应该在服务器端还是客户端呈现,并允许这些组件自由组合在一起。
例如,
-
组件Feed可能在服务器上呈现(因为它需要从数据库获取 feed 项列表),
-
而每个子组件FeedItem可以在客户端呈现(因为它们是项状态的纯函数),
-
而FeedItemPreview可能在服务器上呈现(因为它需要从数据库获取项的内容)。
开发人员可以选择在哪里计算哪些组件,底层引擎(通常是生成服务器端代码和客户端代码的 JavaScript 打包器)会优化所有内容,以便在需要时在服务器或客户端上呈现组件,从而最大限度地减少来回传输的动态 HTML 和组件信息量。
让这一切正常运行并稳定下来仍是一项艰巨的工作。但我认为该范式是双相编程的一个有趣例子。
有很多方法可以减少需要在客户端浏览器上发送和执行的代码量,并将更多工作转移到服务器上,但当今大多数现有解决方案都要求开发人员将 React 组件视为纯客户端抽象,或纯服务器端抽象。
例如,要么在服务器上呈现整个页面,要么在客户端呈现整个页面,反之亦然。如果引擎可以得到足够的优化并且生成的代码可以足够调试,那么采用 React 组件模型并让开发人员切换组件的呈现位置似乎是一种强大的抽象。
React Server Components 承诺一种双相编程形式,其中可以使用相同的 JavaScript + JSX 语法来表示在服务器或客户端上呈现的组件,并且可以灵活组合。服务器端和客户端渲染同时进行,但它们在空间上有所不同(在服务器上与在浏览器上)。
我还想特别提到Electric Clojure ,这是我在[url=https://systemsdistributed.com/\]Systems Distributed[/url]的一次闪电演讲中发现的这个项目,它采用了类似的想法,在前端/后端边界上提供强大的组合,但使用的是 Clojure 语言。
3、案例:Winglang
我对“双相编程”理念如此好奇的很大一部分原因是,在过去的两年里,我一直在研究Winglang,这是一种用于编写云应用程序的新编程语言,它在设计中大量采用了这一概念。这个项目是我介绍的三个例子中最年轻的一个(它只开发了两年),但在本文中,我将尝试尽可能简短地介绍它,以便为其双相类型系统提供足够的背景信息。
Winglang 背后的要点是,由于拥有大量计算资源,AWS、Azure 和 GCP 等主要云提供商能够为开发人员提供各种可扩展的高级服务,如队列、发布-订阅主题、工作流、流、存储桶等。通俗地说,这些通常被称为资源。Terraform和CloudFormation等基础设施即代码工具使得使用 JSON 或[url=https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cloudformation-overview.html\]YAML\[/url\]管理这些资源成为可能。
原则上,使用这些资源构建复杂的应用程序应该不难。但是,如果您的应用程序足够大并且拥有许多资源,那么将每个无服务器函数或容器服务与其所需资源的权限和配置明确连接起来就很容易出错。围绕这些资源设计自定义接口也很困难。
Winglang 旨在让您编写将基础架构资源和应用程序逻辑组合在一起的库和应用程序,通过该语言所称的预检和飞行代码。下面是一个示例程序来演示:
// Import some libraries.
bring s3;
bring lambda;
bring redis;
bring triggers;
// 定义我们的抽象。class Cache {
_redis: redis.Redis;
_bucket: s3.Bucket;
new() {
this._redis = new redis.Redis();
this._bucket = new s3.Bucket();
}
pub inflight get(key: str): str { // Check Redis first, otherwise fall back to S3 let var value = this._redis.get(key);
if value == nil {
value = this._bucket.getObject(key);
this._redis.set(key, value!);
}
return value!;
}
pub inflight set(key: str, value: str) { // Update S3 and redis with the new entry this._bucket.putObject(key, value);
this._redis.set(key, value);
}
pub inflight reset() {
this._redis.flush();
this._bucket.empty();
}
}
let cache = new Cache();//每小时清空缓存一次。
let schedule = new triggers.Schedule(rate: 1h);
schedule.onTick(inflight () => {
cache.reset();
});
//创建一个 AWS Lambda 函数来执行一些虚假的业务逻辑。let fn = new lambda.Function(inflight (key) => {
let value = cache.get(key!);
return "Found value: " + value;
});// 将功能发布到公共 URL。
fn.expose();
在程序的顶层范围内,所有代码都是预检代码。除其他外,我们可以定义类、实例化资源并调用预检函数(如onTick()和expose())来扩充和创建基础架构。这些语句在编译时执行。
但无论inflight使用关键字在哪里,我们都会引入一个代码范围,该代码只能在应用程序部署到云后运行。
get()、set()和reset()都是预检函数。
可以将 Winglang 的预检/运行中区别与 Zig 的计算时间/运行时区别进行比较。但由于这两种语言是围绕不同的用例构建的,因此它们的设计截然不同,这可能并不奇怪。例如,Zig 的计算时间旨在避免所有潜在的副作用,而 Winglang 的预检鼓励副作用,以便您可以改变基础设施图。
Wing 提供了一种双相编程形式,其中可以执行代码来定义云基础设施,或与云基础设施进行交互。这两个阶段称为预检和飞行,在时间(编译时与运行时)和空间上有所不同(预检在构建系统上运行,而飞行代码可以在支持 JavaScript 运行时的任何计算系统上执行)。
元编程总结
一个要点是,这种双相编程可用于解决许多不同的问题。在 Zig 中,它使人们能够轻松进行编译时元编程。在 React 中,它使编写更专业和优化的前端应用程序成为可能。在 Wing 中,它允许您对分布式程序的基础设施和应用程序问题进行建模。这太酷了!
但这里可能还有更多值得探索的地方:比如这些双相解决方案的规则如何重叠或不同。
- 在 Zig 中,您可以在 comptime 运行的每个函数也可以在运行时安全运行——因此我们可以说,哪些函数可以在 comptime 运行以及哪些函数可以在运行时运行之间存在子集关系。
- 这同样适用于 React Server Components——您可以在客户端上呈现的任何组件也可以在服务器上呈现。
- 但在 Wing 中,预检和检修两个阶段是严格分开的,因此要表示可以在任一阶段运行的代码,您需要为这些函数添加单独的标签(如“非阶段函数”)。
另一个悬而未决的问题是了解双相编程在多大程度上代表了无法用普通语言表达的能力。?
- Zig 需要为这个 comptime 事物添加一个新的关键字
但是否有其他现有语言可以让你做到这一点,也许在用户空间?
将其作为专用语言功能提供是否会提供任何改进的安全性或错误处理?
-
元编程系统与双相编程有关。例如,C 预处理可以被认为是双相编程,因为它允许您在预处理器中运行代码,这是运行时之前的编译阶段。但它不满足我提供的定义,因为预处理器只进行文本替换,而 C 的预处理器宏是有限的——ifdef 与真正的 if 语句完全不同。另一方面,Lisp 风格的卫生宏(如 Scheme 和 Racket 中的宏)是通过支持与基础语言相同的表达能力的函数来表达的,所以我认为可以说 Lisp 提供了一些最古老的双相编程示例
-
根据[Zig 文档](https://ziglang.org/documentation/master/comptime),comptime 表达式在某些方面受到限制 - 例如,它们不能调用外部函数、包含return或try表达式或执行副作用。但是,该语言的很大一部分是可用的,并且所包含的示例表明 comptime 函数不需要明确标记为这样,这有助于使该功能感觉更普通
JavaScript 不是最快的语言,但它可靠且拥有广泛的生态系统。我们有兴趣在未来支持其他语言
网友讨论:
1、我喜欢 "双相 "这个词!在 Javascript 网络开发中,以前的术语是 "同构 "或 "通用"。我认为这些术语并没有真正流行起来。
近十年来,我一直在服务器端和浏览器端渲染相同的 React 组件,我发现了一些非常好的模式,而这些模式在其他地方并不多见。
以下是我在个人项目中使用的架构模式。为了好玩,我开始用 F# 编写,并使用 Fable 编译成 JS:
https://fex-template.fly.dev
一个基本要素是将 express 移植到浏览器,并恰如其分地命名为 browser express:
https://github.com/williamcotton/browser-express
有了它,您不仅可以编写双相用户界面组件,还可以编写路由处理程序。在我看来,通过大量使用其他 React 框架的经验,这种方法远远优于主流框架所采用的方法,甚至优于 React 开发人员所期望的工具使用方式。一个很好的副作用是,网站在启用 Javascript 后也能正常运行。这也意味着交互时间是即时的。
它始终关注请求本身,通过浏览器中的点击和表单发布事件创建模拟 HTTP 请求。它围绕处理传入请求和传出响应的中间件进行了适当的架构,并为浏览器或服务器运行时提供了并行的中间件。它使用链接和表单等网页和浏览器原生概念来处理用户输入,而不是通过 React 中的受控表单来加倍处理浏览器的状态。我不禁注意到,React 正在开始摒弃受控表单。他们终于意识到这种设计是错误的。
因为代码是以这种双相的方式编写的,并且注入了运行时上下文,所以避免了浏览器或服务器运行时的任何条件。在我看来,将文件标记为 "使用客户端 "或 "使用服务器 "是一种漏洞百出的抽象。
总之,我很喜欢这篇文章,并打算在实践中使用这个术语!
2、最终,编译时和运行时之间的任何区别都会被消解。其他一些二分法的例子也可以通过类似的通用酸来部分消解:
-
动态类型与静态类型,这是一个连续体,JIT 和编译可以从两端进行攻击--在某种意义上,动态类型的程序也是静态类型的--所有函数类型都是依赖函数类型,所有值类型都是和类型。毕竟,从属和的一个项、一个从属对只是一个盒装值。
-
单态化与多态化--通过表/接口/协议,大致以指令缓存密度换取数据缓存密度
-
RC vs GC vs 堆分配,通过编译器辅助证明内存所有权关系,说明这应该如何发生
-
将堆栈和指令指针特权化,而不是让这种瞬态程序状态成为与其他数据结构一样的一流数据结构,以实现你自己的共同程序和其他任何东西:Zig 决定,内存分配不应被赋予特权,以至于成为一种 "隐形设施",让人以为它是全局性的。
-
我们可以使用指针函数,当你恰好知道需要多少项目,以及如何访问、拥有、分配和取消分配这些项目时,这些函数就能以更有效的方式透明地进行单形态化。
-
取而代之的是,在优化代码的过程中,或多或少都要考虑到内存使用、执行效率、指令密度、表示语义的清晰度等等等等。
目前,我们有一些奇怪的孤立方式,可以在某些语言中实现特定的特权,并对你能走多远设定了相当武断的界限。我希望有一天,我们能有一种语言,能将所有这些决策制定和工程设计溶解到通用的设施中,在这种设施中,语言可以是你需要的任何东西--它只是一个中立的基底,用于表达计算,以及你想如何生产出可以以各种方式运行的机器制品。
据推测,未来这样的语言,如果真的存在,应该会从今天的证明助手中衍生出来。
3、编程语言和代码的其他 "双相 "特性:
- - 由内联代码注释生成的文档(Knuth 的识字编程)
- - 测试代码
我们可以扩展到
- - 安全性(超越 perl 污点)
- - O(n) 运行时和内存分析
- - 并行或聚类
- - 延迟预算
对于那些有学术倾向的人来说,形式语言语义,如 https://en.wikipedia.org/wiki/Denotational\_semantics 与运算等比较。
4、“双相编程”也存在于 Apache Spark、Tensorflow 等框架、Gradle 等构建工具以及代码优先工作流引擎中。第一阶段的执行会生成一个稍后要执行的代码 DAG。在我看来,对于新手来说,最难的事情是第一阶段和第二阶段的代码交错在一起,没有直接明确的界限(第一阶段的代码类似于内部 DSL)。
5、双相编程的另一个示例是使用 DSL 生成解析器的解析器生成器,例如 Tree Sitter 或 Lezer。
6、作者是自鸣得意的反 Lisp 狂人:Lisp 中并非所有东西都是列表。
事实上,Lisp 和 Forth 是最强大的“双相”语言之一,因为完整语言中的两种表达式都可以在编译时进行求值。
Pre-Scheme 是 Scheme 的一个无 GC、静态类型的“系统”子集,它允许您使用完整的 Scheme 语言来处理任何可以在编译时进行可证明求值的表达式(例如,使用 DEFINE 在顶层引入变量)。
更多元编程:https://www.jdon.com/74451.html
相关文章:
双相元编程:一种新语言设计方法
本文讨论了编程语言的一种趋势,即允许相同的语法表达 在两个不同阶段或环境(上下文)中执行的计算同时保持跨阶段(上下文)的一致行为。这些阶段通常在时间上(运行时间)或空间上(运行…...
基于SpringBoot校园外卖配送系统设计和实现(源码+LW+调试文档+讲解等)
💗博主介绍:✌全网粉丝10W,CSDN作者、博客专家、全栈领域优质创作者,博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌💗 🌟文末获取源码数据库🌟 感兴趣的可以先收藏起来,…...
茗鹤APS高级计划排程系统,在集团多工厂协同生产下的应用
随着业务规模的扩大和市场的全球化,越来越多的企业选择“总部多工厂基地”的模式,此种模式大幅提升企业的产能与产量,有效分散风险。然后,与之而来的是对企业的管理提出更高的管理要求。多个生产基地不仅面临集团下发的周期性计划…...
分享六款免费u盘数据恢复工具,U盘恢复工具集合【工具篇】
U盘里面的数据丢失了怎么找回?随着数字化时代的深入发展,U盘已成为我们日常生活中不可或缺的数据存储工具。然而,由于各种原因,如误删除、格式化、病毒攻击等,U盘中的数据可能会丢失,给用户带来极大的困扰。…...
Linux 的启动流程
第一步、加载内核 操作系统接管硬件以后,首先读入 /boot 目录下的内核文件。 以我的电脑为例,/boot 目录下面大概是这样一些文件: $ ls /bootconfig-3.2.0-3-amd64config-3.2.0-4-amd64grubinitrd.img-3.2.0-3-amd64initrd.img-3.2.0-4-amd6…...
思维导图插件--jsMind的使用
vue引入jsmind(右键菜单)_jsmind.menu.js-CSDN博客 第一版 vue-JsMind思维导图实现(包含鼠标右键自定义菜单)_jsmind 右键菜单-CSDN博客 // 新增节点addNode() {console.log(this.get_selected_nodeid());this.get_selected_…...
mac上使用finder时候,显示隐藏的文件或者文件夹
默认在finder中是不显示隐藏的文件和文件夹的,但是想创建.gitignore文件,并向里面写入内容,即便是打开xcode也是不显示这几个隐藏文件的,那有什么办法呢? 使用快捷键: 使用finder打开包含隐藏文件的文件夹…...
泰雷茲具有首个通过FIPS 140-3 三级认证的HSMs
泰雷兹LunaHsm是业界首款通过FIPS140-33级认证的解决方案,安策引进泰雷兹HSM产品可以帮助您满足您的数据安全合规性需求,阻力企业提高竞争力。 安策提供泰雷茲ThalesLunaHSMs成为首个通过FIPS140-3三级认证的硬件安全模块图 我们很高兴地宣布,…...
美术馆预约小程序的设计
管理员账户功能包括:系统首页,个人中心,展品信息管理,管理员管理,用户管理,美术馆管理,基础数据管理,论坛管理 微信端账号功能包括:系统首页,美术馆ÿ…...
序列化Serializable
一、传输对象的方式 将对象从内存传输到磁盘进行保存,或者进行网络传输,有两种方式: 实现Serializable接口,直接传输对象转成json字符串后,进行字符串传输 二、直接传输对象 implements Serializable Data Equal…...
编写静态库
一、静态库 1.制作完成整体目录结构 2.首先创建mymath.c和mymath.h 3.编写Makefile 4.创建测试的main函数 test文件夹 先把lib移到test文件夹里面 4.编译链接 gcc main.c -I ./lib/include/ -L ./lib/mymathlib/ -l mymath 5.形成可执行程序a.out 要是不想执行第四步那么麻烦…...
hive的表操作
常用的hive命令 切换数据库use test;查询表的建表信息show create table 数据库名称.表名;查看表的类型信息desc formatted 数据库名称.表名; 删除内部表 drop table 数据库名称.表名; 先启动hdfs ,mysql , hiveservice2,beeline CREATE [EX…...
基于多视点编码光场的全景三维重建方法
欢迎关注GZH《光场视觉》 摘要:在基于光场的一系列应用中,目标的三维重建是基础且关键的任务。普通光场只能重建单一视角而无法重建全景,并且在纹理特征匮乏的区域也无法生成准确的三维信息。针对以上问题,提出一种基于多视点编码…...
Spring Boot中的分布式文件系统
Spring Boot中的分布式文件系统 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天,我们将探讨如何在Spring Boot中实现分布式文件系统的搭建和应用…...
three.js地理坐标系有哪些,和屏幕坐标系的转换。
坐标系很好理解,就是点线面体的位置,一个点是一个坐标,一条线段2个坐标,一个矩形四个坐标,一个立方体8个坐标,three.js面对的是三维空间,屏幕则是二维的,这就面临着转换问题…...
聊聊C++20的三向比较运算符 `<=>`
C20标准引入了许多新特性,其中之一是三向比较运算符 <>,也被称为太空船运算符。这个新运算符为C程序员提供了一种全新的比较对象的方式,它能有效简化比较逻辑,避免编写多个比较运算符重载的情况。 为什么需要三向比较运算符…...
CVE-2024-0603 漏洞复现
CVE-2024-0603 源码:https://gitee.com/dazensun/zhicms 开题: CVE-2024-0603描述:ZhiCms up to 4.0版本的文件app/plug/controller/giftcontroller.php中存在一处未知漏洞。攻击者可以通过篡改参数mylike触发反序列化,从而远程…...
西部智慧健身小程序+华为运动健康服务
1、 应用介绍 西部智慧健身小程序为用户提供一站式全流程科学健身综合服务。用户通过登录微信小程序,可享用健康筛查、运动风险评估、体质检测评估、运动处方推送、个人运动数据监控与评估等公益服务。 2、 体验介绍西部智慧健身小程序华为运动健康服务核心体验如…...
Spring Boot中如何处理异步任务
Spring Boot中如何处理异步任务 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天我们将探讨在Spring Boot应用中如何处理异步任务,以提升系统的性…...
数字化精益生产系统--RD研发管理系统
R&D研发管理系统是一种用于管理和监督科学研究和技术开发的软件系统,其设计和应用旨在提高企业研发活动的效率、质量和速度。以下是对R&D研发管理系统的功能设计:...
鱼眼相机 去畸变
目录 枕形畸变和去枕形畸变 去枕形畸变失败 枕形畸变和去枕形畸变 import cv2 import numpy as np import matplotlib.pyplot as plt# 创建一个带网格的原始图像 def create_grid(image_size512, grid_size20):image np.zeros((image_size, image_size, 3), dtypenp.uint8)…...
DC/AC电源模块:为智能家居设备提供恒定的电力供应
BOSHIDA DC/AC电源模块:为智能家居设备提供恒定的电力供应 DC/AC电源模块是一种常见的电源转换器,它将直流电源(DC)转换为交流电源(AC),为智能家居设备提供恒定的电力供应。在智能家居系统中&a…...
小红书运营教程02
小红书大致会分享10篇左右。微博、抖音、以及视频剪辑等自媒体运营相关技能以及运营教程相关会陆续的进行分享。 上次分享涉及到的对比,母婴系列,或者可以说是服装类型,不需要自己过多的投入,对比知识类博主来说,自己将知识讲述出来,然后要以此账号进行变现就比较麻烦,…...
k8s自动清理节点服务
要在 Kubernetes 中实现当某个节点的 CPU 或内存使用超过 90% 时清理该节点上的服务,你可以使用以下几种方法: 自定义脚本和 cron job:编写一个脚本监控节点的资源使用情况,并在超过阈值时触发清理操作。使用 DaemonSet 运行监控…...
JS如何把年月日转为时间戳
在JavaScript中,将年月日(通常表示为一个字符串或者分别的年、月、日数字)转换为时间戳(即Unix时间戳,是自1970年1月1日(UTC/GMT的午夜)开始所经过的秒数,不考虑闰秒)可以…...
【YOLOv5进阶】——引入注意力机制-以SE为例
声明:笔记是做项目时根据B站博主视频学习时自己编写,请勿随意转载! 一、站在巨人的肩膀上 SE模块即Squeeze-and-Excitation 模块,这是一种常用于卷积神经网络中的注意力机制!! 借鉴代码的代码链接如下&a…...
【C++题解】1456. 淘淘捡西瓜
问题:1456. 淘淘捡西瓜 类型:贪心 题目描述: 地上有一排西瓜,每个西瓜都有自己的重量。淘淘有一个包,包的容量是固定的,淘淘希望尽可能在包里装更多的西瓜(当然要装整个的,不能切开…...
用Python读取Word文件并提取标题
前言 在日常工作中,我们经常需要处理Word文档,特别是从中提取关键信息,如标题、段落等。今天,我们将利用Python来实现这一功能,并为大家提供一段完整的代码示例。 准备工作 首先,你需要安装python-docx库…...
Windows编程上
Windows编程[上] 一、Windows API1.控制台大小设置1.1 GetStdHandle1.2 SetConsoleWindowInfo1.3 SetConsoleScreenBufferSize1.4 SetConsoleTitle1.5 封装为Innks 2.控制台字体设置以及光标调整2.1 GetConsoleCursorInfo2.2 SetConsoleCursorPosition2.3 GetCurrentConsoleFon…...
BiTCN-Attention一键实现回归预测+8张图+特征可视化图!注意力全家桶再更新!
声明:文章是从本人公众号中复制而来,因此,想最新最快了解各类智能优化算法及其改进的朋友,可关注我的公众号:强盛机器学习,不定期会有很多免费代码分享~ 目录 原理简介 数据介绍 结果展示 全家桶代码目…...
zoom缩放问题(关于ElementPlus、Echarts、Vue3draggable等组件偏移问题)
做了一个项目下来,由于整体界面偏大,采取了缩放90%,导致很多组件出现偏移问题,以下我会把我遇到的各种组件偏移问题依次进行描述解答: ElementPlus选择器下拉偏移 <template><el-select :teleported"f…...
【后端面试题】【中间件】【NoSQL】MongoDB的配置服务器、复制机制、写入语义和面试准备
MongoDB的配置服务器 引入了分片机制之后,MongoDB启用了配置服务器(config server) 来存储元数据,这些元数据包括分片信息、权限控制信息,用来控制分布式锁。其中分片信息还会被负责执行查询mongos使用。 MongoDB的配置服务器有一个很大的优…...
视频监控汇聚平台LntonCVS视频监控业务平台具体有哪些功能?
LntonCVS视频监控平台是一款基于H5技术开发的专业安防视频监控产品,旨在为安防视频监控行业提供全面的解决方案。以下是平台的主要功能和特点: 1. 统一接入管理: - 支持国内外各种品牌、协议和设备类型的监控产品统一接入管理。 - 提供标准的…...
我不小心把生产的数据改错了!同事帮我用MySQL的BinLog挽回了罚款
之前在生产做修改数据的时候不小心改错了一行数据,本来以为会被通报批评,但是同事利用binlog日志查看到了之前的旧数据,并且帮我回滚了,学到了,所以写了一篇binlog的文章分享给大家。 MySQL的Binary Log(简…...
Windows系统安装NVM,实现Node.js多版本管理
目录 一、前言 二、NVM简介 三、准备工作 1、卸载Node 2、创建文件夹 四、下载NVM 五、安装NVM 六、使用NVM 1、NVM常用操作命令 2、查看NVM版本信息 3、查看Node.js版本列表; 4、下载指定版本Node.js 5、使用指定版本Node.js 6、查看已安装Node.js列…...
k8s部署单节点redis
一、configmap # cat redis-configmap.yaml apiVersion: v1 kind: ConfigMap metadata:name: redis-single-confignamespace: redis data:redis.conf: |daemonize nobind 0.0.0.0port 6379tcp-backlog 511timeout 0tcp-keepalive 300pidfile /data/redis-server.pidlogfile /d…...
云微客矩阵系统:如何利用智能策略引领营销新时代?
近些年,短视频行业的风头一时无二,大量的商家和企业进驻短视频赛道,都或多或少的实现了实体门店的流量增长。虽然说现在短视频的门槛在逐步降低,但是迄今为止依旧有很多人在短视频剪辑面前望而却步。 最近在短视频营销领域&#x…...
嵌入式Linux系统编程 — 6.3 kill、raise、alarm、pause函数向进程发送信号
目录 1 kill函数 1.1 kill函数介绍 1.2 示例程序 2 raise函数 2.1 raise函数介绍 2.2 示例程序 3 alarm函数 3.1 alarm函数介绍 3.2 示例程序 4 pause函数 4.1 pause函数介绍 4.2 示例程序 与 kill 命令相类似, Linux 系统提供了 kill()系统调用&#…...
Swoole实践:如何使用协程构建高性能爬虫
随着互联网的普及,web爬虫已经成为了一个非常重要的工具,它可以帮助我们快速地抓取所需要的数据,从而降低数据获取成本。在爬虫的实现中,性能一直是一个重要的考虑因素。swoole是一款基于php的协程框架,它可以帮助我们…...
基于人脸68特征点识别的美颜算法(一) 大眼算法 C++
1、加载一张原图,并识别人脸的68个特征点 cv::Mat img cv::imread("5.jpg");// 人脸68特征点的识别函数vector<Point2f> points_vec dectectFace68(img);// 大眼效果函数Mat dst0 on_BigEye(800, img, points_vec);2、函数 vector<Point2f&g…...
算法金 | 欧氏距离算法、余弦相似度、汉明、曼哈顿、切比雪夫、闵可夫斯基、雅卡尔指数、半正矢、Sørensen-Dice
大侠幸会,在下全网同名「算法金」 0 基础转 AI 上岸,多个算法赛 Top 「日更万日,让更多人享受智能乐趣」 抱个拳,送个礼 在算法模型构建中,我们经常需要计算样本之间的相似度,通常的做法是计算样本之间的距…...
项目实战--Spring Boot大数据量报表Excel优化
一、项目场景 项目中要实现交易报表,处理大规模数据导出时,出现单个Excel文件过大导致性能下降的问题,需求是导出大概四千万条数据到Excel文件,不影响正式环境的其他查询。 二、方案 1.使用读写分离,查询操作由从库…...
C#编程技术指南:从入门到精通的全面教程
无论你是编程新手,还是想要深化.NET技能的开发者,本文都将为你提供一条清晰的学习路径,从C#基础到高级特性,每一站都配有详尽解析和实用示例,旨在帮助你建立坚实的知识体系,并激发你对C#及.NET生态的热情。…...
Redis+定式任务实现简易版消息队列
Redis是一个开源的内存中数据结构存储系统,通常被用作数据库、缓存和消息中间件。 Redis主要将数据存储在内存中,因此读写速度非常快。 支持不同的持久化方式,可以将内存中的数据定期写入磁盘,保证数据持久性。 redis本身就有自己…...
学习在 C# 中使用 Lambda 运算符
在 C# 中,lambda 运算符 > 同时用于 lambda 表达式和表达式体成员。 1. Lambda 表达式 Lambda 表达式是一种简洁的表示匿名方法(没有名称的方法)的方法。它使用 lambda 运算符 >,可以读作“转到”。运算符的左侧指定输入参…...
数据结构和算法,单链表的实现(kotlin版)
文章目录 数据结构和算法,单链表的实现(kotlin版)b站视频链接1.定义接口,我们需要实现的方法2.定义节点,表示每个链表节点。3.push(e: E),链表尾部新增一个节点4.size(): Int,返回链表的长度5.getValue(index: Int): E…...
Jdk17是否有可能代替 Jdk8
JDK发展历史和开源 2006年SUN公司开源JDK,成立OpenJDK组织。2009年Oracle收购SUN,加快JDK发布周期。Oracle JDK与OpenJDK功能基本一致,但Oracle JDK提供更长时间的更新支持。 JDK版本特性 JDK11是长期支持版本(LTS)…...
oca和 ocp有什么区别
OCA(Oracle Certified Associate)和OCP(Oracle Certified Professional)在Oracle的认证体系中是两种不同级别的认证,它们之间存在明显的区别。以下是对两者区别的详细解释: 认证级别: OCA&…...
煤矿安全大模型:微调internlm2模型实现针对煤矿事故和煤矿安全知识的智能问答
煤矿安全大模型————矿途智护者 使用煤矿历史事故案例,事故处理报告、安全规程规章制度、技术文档、煤矿从业人员入职考试题库等数据,微调internlm2模型实现针对煤矿事故和煤矿安全知识的智能问答。 本项目简介: 近年来,国家对煤矿安全生产的重视程度不断提升。为了确…...
C++中的C++中的虚析构函数的作用和重要性
在C中,虚析构函数(virtual destructor)的作用和重要性主要体现在多态和继承的上下文中。了解这一点之前,我们先简要回顾一下多态和继承的基本概念。 继承与多态 继承:允许我们定义一个基类(也称为父类或超…...