【CodeMirror】系列(二)官网示例(五)可撤销操作、拆分视图、斑马条纹
一、可撤销操作
默认情况下,history 历史记录扩展仅跟踪文档和选择的更改,撤销操作只会回滚这些更改,而不会影响编辑器状态的其他部分。
不过你也可以将其他的操作定义成可撤销的。如果把这些操作看作状态效果,就可以把相关功能整合进核心的历史模块。实现的方式是注册这些效果为可逆的。当历史记录检测到某个事务有这样的效果时,它会存储该效果的反转,并在撤销这个事务时应用反转效果。
举个例子:
我们来创建一个扩展,允许用户突出显示文档中的某些部分,并能够撤销这种高亮。
我们将突出显示的范围信息存储在一个状态字段中,并定义效果来添加和移除这些范围。
import {StateEffect, ChangeDesc} from "@codemirror/state"// 定义添加高亮的效果
const addHighlight = StateEffect.define<{from: number, to: number}>({map: mapRange // 定义映射函数
})// 定义移除高亮的效果
const removeHighlight = StateEffect.define<{from: number, to: number}>({map: mapRange // 同样的映射函数
})// 映射函数:根据更改调整范围
function mapRange(range: {from: number, to: number}, change: ChangeDesc) {let from = change.mapPos(range.from), to = change.mapPos(range.to)return from < to ? {from, to} : undefined
}
这些效果可以添加到事务中,并可以通过代码查看事务的效果。由于效果包含文档位置,必须定义一个映射函数,以便在某些情况下(例如,当不希望将更改加入历史时),能够正确调整,以确保撤销效果应用于正确的文档。
我们定义一个状态字段,用于保存代表高亮范围的装饰。当每次有与高亮相关的事务来时,这个字段的更新函数会应用这些效果。
import {Decoration, DecorationSet} from "@codemirror/view"
import {StateField} from "@codemirror/state"// 定义高亮样式
const highlight = Decoration.mark({attributes: {style: `background-color: rgba(255, 50, 0, 0.3)`}
})// 定义高亮范围的状态字段
const highlightedRanges = StateField.define({create() {return Decoration.none // 初始化为空},update(ranges, tr) {ranges = ranges.map(tr.changes) // 应用变更for (let e of tr.effects) {if (e.is(addHighlight))ranges = addRange(ranges, e.value) // 添加高亮范围else if (e.is(removeHighlight))ranges = cutRange(ranges, e.value) // 移除高亮范围}return ranges // 返回更新后的范围},provide: field => EditorView.decorations.from(field) // 提供装饰
})
为了确保我们管理的高亮范围不会有重叠或碎片,我们定义一些辅助方法来清除或添加范围。当需要添加新范围时,我们会将与之相邻的原有高亮合并为一个连续的范围;如果需要移除范围,只保留未被移除区域的部分。
// 移除高亮范围的函数
function cutRange(ranges: DecorationSet, r: {from: number, to: number}) {let leftover = []ranges.between(r.from, r.to, (from, to, deco) => {if (from < r.from) leftover.push(deco.range(from, r.from))if (to > r.to) leftover.push(deco.range(r.to, to))})return ranges.update({filterFrom: r.from,filterTo: r.to,filter: () => false,add: leftover})
}function addRange(ranges: DecorationSet, r: {from: number, to: number}) {ranges.between(r.from, r.to, (from, to) => {if (from < r.from) r = {from, to: r.to}if (to > r.to) r = {from: r.from, to}})return ranges.update({filterFrom: r.from,filterTo: r.to,filter: () => false,add: [highlight.range(r.from, r.to)]})
}
现在我们可以定义效果反转的逻辑。我们传给 invertedEffects
的函数会在每个事务中被调用,并返回一个效果数组,供历史记录存储和该事务的反转效果一起使用。
这个函数的作用是把添加高亮的效果转换为移除高亮的效果,反之亦然。
因为删除高亮周围的区域也会删除高亮,而我们可能希望在撤销删除操作时恢复这些高亮,所以这个函数还会遍历所有被替换的范围,并为其中任何被覆盖的高亮创建一个高亮效果。
import {invertedEffects} from "@codemirror/commands"const invertHighlight = invertedEffects.of(tr => {let found = []for (let e of tr.effects) {if (e.is(addHighlight)) found.push(removeHighlight.of(e.value)) // 如果是添加高亮的效果,添加移除高亮的效果else if (e.is(removeHighlight)) found.push(addHighlight.of(e.value)) // 如果是移除高亮的效果,添加添加高亮的效果}let ranges = tr.startState.field(highlightedRanges) // 获取当前状态中的高亮范围tr.changes.iterChangedRanges((chFrom, chTo) => { // 遍历变化的范围ranges.between(chFrom, chTo, (rFrom, rTo) => {let from = Math.max(chFrom, rFrom), to = Math.min(chTo, rTo) // 计算重叠区域if (from < to) found.push(addHighlight.of({from, to})) // 如果有重叠,添加高亮效果})})return found // 返回找到的效果
})
这两个命令将我们定义的效果应用于任何选中的范围。
import {EditorView} from "@codemirror/view"// 高亮选中的区域
function highlightSelection(view: EditorView) {view.dispatch({effects: view.state.selection.ranges.filter(r => !r.empty) // 只对非空的选中区域应用效果.map(r => addHighlight.of(r)) // 添加高亮效果})return true
}// 撤销高亮
function unhighlightSelection(view: EditorView) {let highlighted = view.state.field(highlightedRanges) // 获取当前高亮范围let effects = []for (let sel of view.state.selection.ranges) {highlighted.between(sel.from, sel.to, (rFrom, rTo) => {let from = Math.max(sel.from, rFrom), to = Math.min(sel.to, rTo) // 计算重叠区域if (from < to) effects.push(removeHighlight.of({from, to})) // 添加移除高亮的效果})}view.dispatch({effects}) // 执行效果return true
}
请注意,unhighlightSelection
只为之前高亮的、与当前选择重叠的范围创建效果。如果我们简单地对整个选中范围创建了效果,反转这些效果可能会导致一些之前没有高亮的内容被错误地添加高亮。
import {keymap} from "@codemirror/view"// 定义快捷键
const highlightKeymap = keymap.of([{key: "Mod-h", run: highlightSelection}, // 添加高亮的快捷键{key: "Shift-Mod-h", run: unhighlightSelection} // 撤销高亮的快捷键
])// 导出高亮范围的功能
export function rangeHighlighting() {return [highlightedRanges,invertHighlight,highlightKeymap]
}
如果我们把上述所有内容整合到一个扩展中,就可以让编辑器实现如下功能:
选中文本,通过快捷键 ctrl/cmd-h
可以高亮,通过 shift-ctrl/cmd-h
可以撤销高亮。
二、拆分视图
一个编辑器可以创建多个视图。但是多个视图的修改并不会自动同步。状态是不可变的值,每个视图中更新后的状态将会各自不同。
因此,为了保持两个视图内容的同步,你必须将一个视图中的更改转发到另一个视图。一个好的做法是使用重写的调度函数或更新监听器。在这个例子中,我们将使用调度函数。
为了确保只有一个撤销历史记录,我们会设置一个带有历史扩展的状态和一个没有的状态。主编辑器的状态设置如下:
// 导入必要的模块
import {EditorState} from "@codemirror/state" // 导入编辑器状态模块
import {defaultKeymap, historyKeymap, history} from "@codemirror/commands" // 导入命令和快捷键模块
import {drawSelection, keymap, lineNumbers} from "@codemirror/view" // 导入视图相关的功能模块// 创建主编辑器的初始状态
let startState = EditorState.create({doc: "The document\nis\nshared", // 设置文档内容extensions: [history(), // 启用历史记录扩展,以便支持撤销和重做drawSelection(), // 允许高亮选择lineNumbers(), // 显示行号keymap.of([...defaultKeymap, // 使用默认的快捷键...historyKeymap, // 使用与历史记录相关的快捷键])]
})
第二个编辑器的状态则不跟踪历史,它将与主编辑器共享文档内容,并将与历史相关的按键绑定到主编辑器,以执行撤销和重做操作。
// 导入撤销和重做功能
import {undo, redo} from "@codemirror/commands"// 创建第二个编辑器的初始状态,不记录历史
let otherState = EditorState.create({doc: startState.doc, // 使用主编辑器的文档内容extensions: [drawSelection(), // 允许高亮选择lineNumbers(), // 显示行号keymap.of([...defaultKeymap, // 使用默认的快捷键// 将撤销操作绑定到主编辑器{key: "Mod-z", run: () => undo(mainView)}, // 将重做操作绑定到主编辑器{key: "Mod-y", mac: "Mod-Shift-z", run: () => redo(mainView)} ])]
})
接下来是负责在编辑器之间广播更改的代码。
为了能够区分用户的正常操作和来自其他编辑器的同步事务,我们定义一个注解来标记同步事务。每当一个导致文档变化的事务到来,而这个事务不是同步事务时,它也会被发往另一个编辑器。
// 导入视图和事务相关的模块
import {EditorView} from "@codemirror/view" // 导入编辑器视图模块
import {Transaction, Annotation} from "@codemirror/state" // 导入事务和注解模块// 定义一个注解,用于标记同步事务
let syncAnnotation = Annotation.define<boolean>()// 定义同步调度函数,用于在两个编辑器之间传递事务
function syncDispatch(tr: Transaction, view: EditorView, other: EditorView) {view.update([tr]) // 更新当前视图// 如果交易中有变化且不是同步事务if (!tr.changes.empty && !tr.annotation(syncAnnotation)) {let annotations: Annotation<any>[] = [syncAnnotation.of(true)] // 添加同步注解let userEvent = tr.annotation(Transaction.userEvent) // 获取用户事件if (userEvent) annotations.push(Transaction.userEvent.of(userEvent)) // 如果是用户事件,添加到注解中// 将变化和注解同步到另一个编辑器other.dispatch({changes: tr.changes, annotations})}
}
现在我们可以创建视图,观察它们的实际效果。
let mainView = new EditorView({state: startState,parent: document.querySelector("#editor1"),dispatch: tr => syncDispatch(tr, mainView, otherView)
})let otherView = new EditorView({state: otherState,parent: document.querySelector("#editor2"),dispatch: tr => syncDispatch(tr, otherView, mainView)
})
第一个编辑器:
第二个编辑器:
在一个编辑器中修改文本的时候,会同步修改另一个编辑器中的文本。
三、斑马条纹
这个示例定义了一个扩展,用于为每第 N 行设置背景样式,以实现斑马条纹效果。
为了使条纹的样式可以被主题覆盖,我们首先定义一个基础主题。这个主题样式化 cm-zebraStripe 类,为亮色和暗色主题设置不同的背景颜色。
// 导入编辑器视图模块
import {EditorView} from "@codemirror/view"// 定义基础主题,设置亮色和暗色主题的条纹背景
const baseTheme = EditorView.baseTheme({"&light .cm-zebraStripe": {backgroundColor: "#a4f1f188"}, // 亮色主题的背景"&dark .cm-zebraStripe": {backgroundColor: "#34474788"} // 暗色主题的背景
})
接下来,为了引入配置功能,我们允许调用者配置条纹之间的距离。为了以一种定义明确的方式存储配置的距离,即使添加了多个扩展实例,我们将其存储在一个由 facet 定义的 Facet 中。
该 Facet 可以接收任何数量的步长值(输入类型为数字),并将它们的最小值作为其值返回,默认值为 2。
// 导入 Facet 模块
import {Facet} from "@codemirror/state"// 定义步长的 Facet,组合多个值,返回最小值
const stepSize = Facet.define<number, number>({combine: values => values.length ? Math.min(...values) : 2 // 若无值则默认返回 2
})
我们将导出一个函数,该函数返回添加斑马条纹功能的扩展。请注意,扩展值可以是单个扩展(例如,由 of 方法创建的 Facet 值),也可以是扩展的数组(可能嵌套)。因此,它们可以方便地组合成更大的扩展。
// 导入扩展模块
import {Extension} from "@codemirror/state"// 导出一个函数以创建斑马条纹的扩展
export function zebraStripes(options: {step?: number} = {}): Extension {return [baseTheme, // 引入基础主题options.step == null ? [] : stepSize.of(options.step), // 可选的步长配置showStripes // 对应的样式展示插件]
}
接下来是一个辅助函数,它遍历可见行,为每第 N 行创建一个行装饰。
该插件会在每次变更时重新计算它的装饰,对于使用构建器的情况,这并不昂贵。在其他情况下,可能更希望跨更新保留装饰(在文档更改之间映射它们)。
请注意,由于 Facet 始终可以在每个状态中访问,无论它们是否已被添加到该状态中,我们可以简单读取 stepSize 的值,以获得适当的步长。当没有人配置时,其值将为 2(结果为调用其组合函数时的空数组)。
// 导入装饰模块
import {Decoration} from "@codemirror/view"
import {RangeSetBuilder} from "@codemirror/state"// 定义条纹装饰
const stripe = Decoration.line({attributes: {class: "cm-zebraStripe"} // 使用 CSS 类定义条纹
})// 函数用于创建条纹装饰
function stripeDeco(view: EditorView) {let step = view.state.facet(stepSize) // 获取步长let builder = new RangeSetBuilder<Decoration>() // 创建装饰构建器for (let {from, to} of view.visibleRanges) { // 遍历可见范围for (let pos = from; pos <= to;) {let line = view.state.doc.lineAt(pos) // 获取行if ((line.number % step) == 0) // 检查是否是第 N 行builder.add(line.from, line.from, stripe) // 为该行添加条纹装饰pos = line.to + 1 // 移动到下一行}}return builder.finish() // 返回构建完成的装饰
}
然后,showStripes 视图插件仅需声明它提供装饰(通过装饰选项),并确保在文档或视口改变时重新计算其装饰属性。
import {ViewPlugin, DecorationSet, ViewUpdate} from "@codemirror/view"const showStripes = ViewPlugin.fromClass(class {decorations: DecorationSetconstructor(view: EditorView) {this.decorations = stripeDeco(view)}update(update: ViewUpdate) {if (update.docChanged || update.viewportChanged)this.decorations = stripeDeco(update.view)}
}, {decorations: v => v.decorations
})
效果如下:
相关文章:
【CodeMirror】系列(二)官网示例(五)可撤销操作、拆分视图、斑马条纹
一、可撤销操作 默认情况下,history 历史记录扩展仅跟踪文档和选择的更改,撤销操作只会回滚这些更改,而不会影响编辑器状态的其他部分。 不过你也可以将其他的操作定义成可撤销的。如果把这些操作看作状态效果,就可以把相关功能整…...
SpringBoot 动态路由菜单 权限系统开发 菜单权限 数据库设计 不同角色对应不同权限
介绍 系统中的路由配置可以根据用户的身份、角色或其他权限信息动态生成,而不是固定在系统中。不同的用户根据其权限会看到不同的路由,访问不同的页面。对应各部门不同的权限。 效果 [{"id": 1,"menuName": "用户管理"…...
scikit-learn 开源框架在机器学习中的应用
文章目录 scikit-learn 开源框架介绍1. 框架概述1.1 基本介绍1.2 版本信息 2. 核心功能模块2.1 监督学习2.2 无监督学习2.3 数据处理 3. 关键设计理念3.1 统一API设计3.2 流水线(Pipeline) 4. 重要辅助功能4.1 模型选择4.2 评估指标 5. 性能优化技巧5.1 并行计算5.2 内存优化 6…...
GPT-4、Grok 3与Gemini 2.0 Pro:三大AI模型的语气、风格与能力深度对比
更新后的完整CSDN博客文章 以下是基于您的要求,包含修正后的幻觉率部分并保留原始信息的完整CSDN博客风格文章。幻觉率已调整为更符合逻辑的描述,其他部分保持不变。 GPT-4、Grok 3与Gemini 2.0 Pro:三大AI模型的语气、风格与能力深度对比 …...
Cyber Weekly #51
赛博新闻 1、英伟达开源新模型,性能直逼DeepSeek-R1 本周,英伟达开源了基于Meta早期Llama-3.1-405B-Instruct模型开发的Llama-3.1-Nemotron-Ultra-253B-v1大语言模型,该模型拥有2530亿参数,在多项基准测试中展现出与6710亿参数的…...
QT聊天项目开发DAY02
1.添加输入密码的保密性 LoginWidget::LoginWidget(QDialog*parent): QDialog(parent) {ui.setupUi(this);ui.PassWord_Edit->setEchoMode(QLineEdit::Password);BindSlots(); }2.添加密码的验证提示 3.修复内存泄漏,并嵌套UI子窗口到主窗口里面 之前并没有设置…...
Spring AI高级RAG功能查询重写和查询翻译
1、创建查询重写转换器 // 创建查询重写转换器queryTransformer RewriteQueryTransformer.builder().chatClientBuilder(openAiChatClient.mutate()).build(); 查询重写是RAG系统中的一个重要优化技术,它能够将用户的原始查询转换成更加结构化和明确的形式。这种转…...
速盾:高防CDN的原理和高防IP一样吗?
随着互联网的发展,网络安全威胁日益严重,尤其是DDoS攻击、CC攻击等恶意行为,给企业带来了巨大的风险。为了应对这些挑战,许多企业开始采用高防CDN(内容分发网络)和高防IP作为防御措施。尽管两者都能提供一定…...
SQLite-Web:一个轻量级的SQLite数据库管理工具
SQLite-Web 是一个基于 Web 浏览器的轻量级 SQLite 数据库管理工具。它基于 Python 开发,免费开源,无需复杂的安装或配置,适合快速搭建本地或内网的 SQLite 管理和开发环境。 SQLite-Web 支持常见的 SQLite 数据库管理和开发任务,…...
数智读书笔记系列028 《奇点更近》
一、引言 在科技飞速发展的今天,我们对未来的好奇与日俱增。科技将如何改变我们的生活、社会乃至人类本身?雷・库兹韦尔的《奇点更近》为我们提供了深刻的见解和大胆的预测,让我们得以一窥未来几十年的科技蓝图。这本书不仅是对未来科技趋势…...
深入理解linux操作系统---第4讲 用户、组和密码管理
4.1 UNIX系统的用户和组 4.1.1 用户与UID UID定义:用户身份唯一标识符,16位或32位整数,范围0-65535。系统用户UID为0(root)、1-999(系统服务),普通用户从1000开始分配特殊UID&…...
系统设计模块之安全架构设计(常见攻击防御(SQL注入、XSS、CSRF、DDoS))
一、SQL注入攻击防御 SQL注入是通过恶意输入篡改数据库查询逻辑的攻击方式,可能导致数据泄露或数据库破坏。防御核心在于隔离用户输入与SQL代码,具体措施包括: 参数化查询(预编译语句) 原理:将SQL语句与用…...
redission锁释放失败处理
redission锁释放失败处理 https://www.jianshu.com/p/055ae798547a 就是可以删除 锁的key 这样锁就释放了,但是 还是要结合业务,这种是 非正规的处理方式,还是要在代码层面进行处理。...
Visual Studio Code 在.S汇编文件中添加调试断点及功能简介
目录 一、VS Code汇编文件添加断点二、VS Code断点调试功能简介1. 设置断点(1) 单行断点(2) 条件断点(3) 日志断点 2. 查看断点列表3. 调试时的断点控制4. 禁用/启用断点5. 删除断点6. 条件断点的使用7. 多线程调试8. 远程调试9. 调试配置文件 一、VS Code汇编文件添加断点 最…...
计算视觉与数学结构及AI拓展
在快速发展的计算视觉领域,算法、图像处理、神经网络和数学结构的交叉融合,在提升我们对视觉感知和分析的理解与能力方面发挥着关键作用。本文探讨了支撑计算视觉的基本概念和框架,强调了数学结构在开发鲁棒的算法和模型中的重要性。 AI拓展…...
Vue2 老项目升级 Vue3 深度解析教程
Vue2 老项目升级 Vue3 深度解析教程 摘要 Vue3 带来了诸多改进和新特性,如性能提升、组合式 API、更好的 TypeScript 支持等,将 Vue2 老项目升级到 Vue3 可以让项目获得这些优势。本文将深入解析升级过程,涵盖升级前的准备工作、具体升级步骤…...
器件封装-2025.4.13
1.器件网格设置要与原理图一致,同时器件符号要与数据手册一致 2.或者通过向导进行编辑,同时电机高级符号向导进行修改符号名称 2.封装一般尺寸大小要比数据手册大2倍到1.5倍 焊盘是在顶层绘制,每个焊盘距离要用智能尺子测量是否跟数据手册一…...
Python 基础语法汇总
Python 语法 │ ├── 基本结构 │ ├── 语句(Statements) │ │ ├── 表达式语句(如赋值、算术运算) │ │ ├── 控制流语句(if, for, while) │ │ ├── 定义语句(def…...
Java函数式编程魔法:Stream API的10种妙用
在Java 8中引入的Stream API为函数式编程提供了一种全新的方式。它允许我们以声明式的方式处理数据集合,使代码更加简洁、易读且易于维护。本文将介绍Stream API的10种妙用,帮助你更好地理解和应用这一强大的工具。 1. 过滤操作:筛选符合条件…...
【力扣hot100题】(094)编辑距离
记得最初做这题完全没思路,这次凭印象随便写了一版居然对了。 感觉这题真的有点为出题而出题的意思,谁拿到这题会往动态规划方向想啊jpg 也算是总结出规律了,凡是遇到这种比较俩字符串的十有八九是动态规划,而且是二维动态规划&…...
穿透三层内网VPC2
网络拓扑 目标出网web地址:192.168.139.4 信息收集端口扫描: 打开8080端口是一个tomcat的服务 版本是Apache Tomcat/7.0.92 很熟悉了,可能存在弱口令 tomcat/tomcat 成功登录 用哥斯拉生成马子,上传war包,进入后台 C…...
AI数字消费第一股,重构商业版图的新物种
伍易德带领团队发布“天天送AI数字商业引擎”,重新定义流量与消费的关系 【2025年4月,深圳】在人工智能浪潮席卷全球之际,深圳天天送网络科技有限公司于深圳大中华喜来登酒店重磅召开“AI数字消费第一股”发布盛典。公司创始人伍易德首次系统…...
Unity 基于navMesh的怪物追踪惯性系统
今天做项目适合 策划想要实现一个在现有的怪物追踪系统上实现怪物拥有惯性功能 以下是解决方案分享: 怪物基类代码: using UnityEngine; using UnityEngine.AI;[RequireComponent(typeof(NavMeshAgent))] [RequireComponent(typeof(AudioSource))] …...
【OpenCV】【XTerminal】talk程序运用和linux进程之间通信程序编写,opencv图像库编程联系
目录 一、talk程序的运用&Linux进程间通信程序的编写 1.1使用talk程序和其他用户交流 1.2用c语言写一个linux进程之间通信(聊天)的简单程序 1.服务器端程序socket_server.c编写 2.客户端程序socket_client.c编写 3.程序编译与使用 二、编写一个…...
中断的硬件框架
今天呢,我们来讲讲中断的硬件框架,这里会去举3个开发板,去了解中断的硬件框架: 中断路径上的3个部件: 中断源 中断源多种多样,比如GPIO、定时器、UART、DMA等等。 它们都有自己的寄存器,可以…...
大数据面试问答-Hadoop/Hive/HDFS/Yarn
1. Hadoop 1.1 MapReduce 1.1.1 Hive语句转MapReduce过程 可分为 SQL解析阶段、语义分析阶段、逻辑计划生成阶段、逻辑优化阶段、物理计划生成阶段。 SQL解析阶段 词法分析(Lexical Analysis):使用Antlr3将SQL字符串拆分为有意义的token序列 语法分析(Syntax An…...
【小沐学GIS】基于C++绘制三维数字地球Earth(QT5、OpenGL、GIS、卫星)第五期
🍺三维数字地球系列相关文章如下🍺:1【小沐学GIS】基于C绘制三维数字地球Earth(OpenGL、glfw、glut)第一期2【小沐学GIS】基于C绘制三维数字地球Earth(OpenGL、glfw、glut)第二期3【小沐学GIS】…...
初始图形学(3)
昨天休息了一天,今天继续图形学的学习 向场景发射光线 现在我们我们准备做一个光线追踪器。其核心在于,光线追踪程序通过每个像素发送光线。这意味着对于图像中的每个像素点,程序都会计算一天从观察者出发,穿过该像素的光线。并…...
如果想在 bean 创建出来之前和销毁之前做一些自定义操作可以怎么来实现呢?
使用生命周期扩展接口(最灵活) 创建前拦截可以通过实现 InstantiationAwareBeanPostProcessor 接口的 postProcessBeforeInstantiation 方法,在Bean实例化前执行逻辑 在销毁前拦截可以通过实现 DestructionAwareBean 接口的 postProcessBe…...
【甲子光年】DeepSeek开启AI算法变革元年
目录 引言人工智能的发展拐点算力拐点:DeepSeek的突破数据拐点:低参数量模型的兴起算法创新循环算法变革推动AI普惠应用全球AI科技竞争进入G2时代结论 引言 2025年,人工智能的发展已经走到了一个战略拐点。随着技术能力的不断提升࿰…...
Go语言--语法基础4--基本数据类型--整数类型
整型是所有编程语言里最基础的数据类型。 Go 语言支持如下所示的这些整型类型。 需要注意的是, int 和 int32 在 Go 语言里被认为是两种不同的类型,编译器也不会帮你自动做类型转换, 比如以下的例子会有编译错误: var value2 in…...
MCP基础学习计划详细总结
MCP基础学习计划详细总结 1.MCP概述与基础 • MCP(Model Context Protocol):由Anthropic公司于2024年11月推出,旨在实现大型语言模型(LLM)与外部数据源和工具的无缝集成。 • 核心功能: • 资…...
大模型到底是怎么产生的?一文揭秘大模型诞生全过程
前言 大模型到底是怎么产生的呢? 本文将从最基础的概念开始,逐步深入,用通俗易懂的语言为大家揭开大模型的神秘面纱。 大家好,我是大 F,深耕AI算法十余年,互联网大厂核心技术岗。 知行合一,不写水文,喜欢可关注,分享AI算法干货、技术心得。 【专栏介绍】: 欢迎关注《…...
Node.js介绍
一、Node.js 核心定义 本质:基于 Chrome V8 引擎构建的 JavaScript 运行时环境,用于在服务器端执行 JavaScript 代码。 定位:非阻塞、事件驱动的 I/O 模型,专为高并发、实时应用设计。 诞生:2009 年由 Ryan Dahl 发布…...
DRABP_NSGA2最新算法神圣宗教算法优化BP做代理模型,NSGA2反求最优因变量和对应的最佳自变量组合,Matlab代码
一、神圣宗教算法(DRA)优化BP代理模型 1. DRA的核心原理 DRA是一种模拟宗教社会层级互动的元启发式算法,通过“追随者学习”、“传教士传播”和“领导者引导”三种行为模式优化搜索过程。在BP神经网络优化中,DRA通过以下步骤调整…...
Android Studio 在 Windows 上的完整安装与使用指南
Android Studio 在 Windows 上的完整安装与使用指南—目录 一、Android Studio 简介二、下载与安装1. 下载 Android Studio2. 安装前的依赖准备3. 安装步骤 三、基础使用指南1. 首次启动配置2. 创建第一个项目3. 运行应用4. 核心功能 四、进阶功能配置1. 配置 SDK 和工具2. 自定…...
Matlab学习笔记五十:循环语句和条件语句的用法
1.说明 循环语句:for…end,while…end 条件语句:if…end,switch…case…end 其中if语句语法还可以是:for…else…end,for…elseif…else…end 2.简单for程序实例 for x1:5 %循环遍历1~5 yx5 end [1…...
大漠流光:科技牧歌的未来-内蒙古鄂尔多斯
故事背景 故事发生在中国内蒙古鄂尔多斯,这里是蒙古族文化的摇篮,也是科技与自然交织的未来舞台。在这片广袤的土地上,蒙古族少女、老牧人和工程师们共同谱写着一曲科技与传统共生的赞歌。未来的鄂尔多斯,不再是单一的沙漠或草原…...
MySQL与Oracle深度对比
MySQL与Oracle深度对比:数据类型与SQL差异 一、数据类型差异 1. 数值类型对比 数据类型MySQLOracle整数TINYINT, SMALLINT, MEDIUMINT, INT, BIGINTNUMBER(精度) 或直接INT(内部仍为NUMBER)小数DECIMAL(p,s), FLOAT, DOUBLENUMBER(p,s), FLOAT, BINARY_FLOAT, BI…...
GESP2023年12月认证C++七级( 第一部分选择题(6-10))
选择题第八题: #include <iostream> #include <cstring> #include <algorithm> using namespace std;const int MAXN 1005; // 假设字符串长度不超过1000 char s1[MAXN], s2[MAXN]; int dp[MAXN]; // 一维DP数组int main() {while (cin >>…...
腾势品牌欧洲市场冲锋,科技豪华席卷米兰
在时尚与艺术的交汇点,米兰设计周的舞台上,一场汽车界的超级风暴正在酝酿,腾势品牌如一头勇猛无畏的雄狮,以雷霆万钧之势正式向欧洲市场发起了冲锋。其最新力作——腾势Z9GT的登场,仿佛是一道闪电划破夜空,…...
双指针、滑动窗口
一、双指针 双指针是指在算法中使用两个指针(通常是索引或迭代器)来解决问题,通过移动这两个指针来扫描数据结构(如数组或链表),从而达到高效的目的。双指针的核心思想是利用两个指针的相对位置或移动方式…...
《数据密集型应用系统设计》读书笔记:第二章
我们继续拆解 第2章:数据模型与查询语言。这章讲的是如何组织数据、如何访问数据,也是你选择数据库种类的根本依据。 第2章:数据模型与查询语言 一、为何数据模型重要? Martin 开篇就强调,数据模型影响: …...
ubuntu24.04LTS安装向日葵解决方案
去向日葵官方下载ubuntu使用的deb包 向日葵 输入如下命令安装,将具体版本修改成自己下载的版本 andrew in ~/下载 λ sudo dpkg -i SunloginClient_15.2.0.63064_amd64.deb 正在选中未选择的软件包 sunloginclient。 (正在读取数据库 ... 系统当前共安装有 290947…...
Python基础语法1
目录 1、认识Python 1.1、计算机 1.2、编程 1.3、编程语言的类别 1.4、Python背景 1.5、Python的应用场景 1.6、Python的优缺点 1.7、Python前景 1.8、Python 环境 2、常量和表达式 3、变量和类型 3.1、定义变量 3.2、使用变量 3.3、变量的类型 3.3.1、整形 3.3…...
深度学习中多机训练概念下的DP与DDP
在进行单机多卡/多机多卡训练时,通常会遇到DP与DDP的概念,为此基于kimi大模型对二者的差异进行梳理。使用DP/DPP的核心是数据并行,也就是根据显卡数量对数据集进行分治,每一个显卡都有一个独立完整的模型和一个局部数据。在多个显…...
设计模式(结构型)-桥接模式
目录 摘要 定义 类图 角色 具体实现 优缺点 优点 缺点 使用场景 使用案例 JDBC 和桥接模式 总结 摘要 在软件开发领域,随着系统规模和复杂性的不断攀升,如何设计出具有良好扩展性、灵活性以及可维护性的软件架构成为关键挑战。桥接模式作为一…...
精品推荐 | 湖仓一体电商数据分析平台实践教程合集(视频教程+设计文档+完整项目代码)
精品推荐,湖仓一体电商数据分析平台实践教程合集,包含视频教程、设计文档及完整项目代码等资料,供大家学习。 1、项目背景介绍及项目架构 2、项目使用技术版本及组件搭建 3、项目数据种类与采集 4、实时业务统计指标分析一——ODS分层设计与数…...
【LangChain少样本提示工程实战】FewShotPromptTemplate原理与应用解析——附运行代码
目录 引言 重点提炼 一、FewShotPromptTemplate作用 1. 整合示例与模板,构建结构化提示 2. 引导模型理解任务逻辑 3. 提升少样本场景下的模型性能 4. 支持动态示例选择(扩展功能) 5. 与其他模块…...
基于LSTM的文本分类3——模型训练
前言 之前已经完成了模型搭建和文本数据处理,现在做一下模型训练。 源码 # -*- coding: UTF-8 -*- import numpy as np import torch import torch.nn as nn import torch.nn.functional as F from sklearn import metrics # 导入评估指标 import time from uti…...