text2sql方法:RESDSQL和DAIL-SQL
之前介绍了text2sql的综述,但是对一些方法的描述不够详细,所以将一些感兴趣的方法思路也整理一下。
RESDSQL
RESDSQL出自2023年2月的论文《RESDSQL: Decoupling Schema Linking and Skeleton Parsing for Text-to-SQL》(github)。它使用seq2seq PLM(pre-trained language model)模型来将自然语言问题翻译成SQL。为了提高准确率,将Schema Linking和Skeleton Parsing解耦,具体做法是先进行Schema Linking使得输入模型encoder的schema只包括与问题最相关的表和列;在生成SQL时,模型decoder先生成SQL骨架再生成实际的SQL查询。
RESDSQL是Ranking-enhanced Encoding plus a Skeleton-aware Decoding framework for Text-to-SQL 的简称,论文图2示意了该方法的思路。

在介绍RESDSQL的实现细节之前,先说明一些符号和概念。将一个关系数据库记为 D \mathcal{D} D,数据库的schema S \mathcal{S} S包括:
- 数据表集合 T = { t 1 , t 2 , ⋯ , t N } \mathcal{T} = \{ t_1, t_2, \cdots, t_N\} T={t1,t2,⋯,tN}
- 数据列集合 C = { c 1 1 , ⋯ , c n 1 1 , c 1 2 , ⋯ , c n 2 2 , ⋯ , c 1 N , ⋯ , c n N N } \mathcal{C} = \{ c^1_1, \cdots, c^1_{n_1}, c^2_1, \cdots, c^2_{n_2}, \cdots, c^N_1, \cdots, c^N_{n_N}\} C={c11,⋯,cn11,c12,⋯,cn22,⋯,c1N,⋯,cnNN}。每一个数据列都与一个数据表关联, c n i i c^i_{n_i} cnii是第i个表格的第 n i n_i ni列。
- 外键关系集合 R = { ( c k i , c h j ) ∣ c k i , c h j ∈ C } \mathcal{R}=\{(c^i_k, c^j_h)|c^i_k, c^j_h \in \mathcal{C} \} R={(cki,chj)∣cki,chj∈C}, 其中的每一对 ( c k i , c h j ) (c^i_k, c^j_h) (cki,chj)表示列 c k i c^i_k cki和 c h j c^j_h chj之间存在外键关系。
- 用 M = ∑ i = 1 N n i M=\sum^N_{i=1} n_i M=∑i=1Nni表示数据库 D \mathcal{D} D中的所有的列的个数。
- 在表示一个schema的时候,可以用原始名字(在数据库中表示的名字)或语义名字(原始名字实际代表的语义含义),比如在论文的图1中,”uid“是原始名字,而”airline id“是语义名字,用语义名字相对比原始名字能更清晰地理解列数据的含义。注意有时候语义名字和原始名字是一样的,比如图示中的country。

Ranking-Enhanced Encoder
为了使RESDSQL模型的encoder输入只包括与问题最相关的schema元素,RESDSQL使用了一个cross-encoder模型来对数据表和数据列进行分类,然后基于分类概率来排序并过滤掉不相关的schema元素。这样做一方面可以过滤掉不相关的schema元素,另一方面可以输入seq2seq encoder的schema元素是排过序,模型可以捕捉到潜在的位置信息。
cross-encoder模型的输入: 将schema元素按照其默认顺序组成一个schema元素序列,并将它和问题拼接起来组成cross-encoder模型的输入 X X X, X = q ∣ t 1 : c 1 1 , ⋯ , c n 1 1 ∣ ⋯ ∣ t N : c 1 N , ⋯ , c n N N X=q|t_1:c^1_1,\cdots, c^1_{n_1}|\cdots|t_N:c_1^N, \cdots, c^N_{n_N} X=q∣t1:c11,⋯,cn11∣⋯∣tN:c1N,⋯,cnNN ,|是分隔符,用来分隔问题和数据表。为了更好地表示数据元素的语义信息,这里使用的是它们的语义名称。
编码模块(Encoding Module):使用RoBERTa作为cross-encoder模型。因为每一个schema元素可能被模型的分词器分成1个或多个token,比如数据列"airline id"会被分成两个token:“airline” 和"id"。而我们会希望在分类时将每一个schema元素作为整体,论文的解决思路使用了一个包含两层的BiLSTM和一个非线性全连接层作为pooling方法。经过pooling之后,每一个数据表的embedding可表示为 T i ∈ R 1 × d ( 1 ∈ { 1 , … , N } ) \mathbf{T}_i \in \mathbb{R}^{1\times d} (1 \in \{ 1, \ldots, N\}) Ti∈R1×d(1∈{1,…,N}), 每一个数据列的embedding可表示为 C k i ∈ R 1 × d ( 1 ∈ { 1 , … , N } , k ∈ { 1 , … , n i } ) \mathbf{C}_k^i \in \mathbb{R}^{1\times d} (1 \in \{ 1, \ldots, N\}, k\in \{1, \ldots, n_i\}) Cki∈R1×d(1∈{1,…,N},k∈{1,…,ni}), d是隐藏层的大小。
列增强层(Column-Enhanced Layer):有些问题里只会提到相关列名不会提到表名,比如论文图1中的例子提到了列名"city",但是没有提到表名"airports"。这种表名在问题中缺失的问题可能会影响表分类性能,所以论文作者提出了一个列增强层来将列信息注入到它对应的表embedding中,这样即使问题中只提到列名也能将对应的表给识别出来。列增强层通过multi-head scaled dot-product attention layer和一个特征融合层来实现,设对于第 i i i个表,其所有列信息表示为 C : i ∈ R n i × d \mathbf{C}^i_: \in \mathbb{R}^{n_i \times d} C:i∈Rni×d, 将其通过下式注入到表embeding T i \mathbf{T}_i Ti:
T i C = M u l t i H e a d A t t n ( T i , C : i , C : i , h ) , ( 1 ) T ^ i = N o r m ( T i + T i C ) \begin{aligned} \mathbf{T}_i^C &= MultiHeadAttn(\mathbf{T}_i, \mathbf{C}^i_:, \mathbf{C}^i_:, h), \qquad (1) \\ \hat{\mathbf{T}}_i &=Norm(\mathbf{T}_i + \mathbf{T}^C_i) \end{aligned} TiCT^i=MultiHeadAttn(Ti,C:i,C:i,h),(1)=Norm(Ti+TiC)
在上式中 T i \mathbf{T}_i Ti作为self-attetion里的query, C : i \mathbf{C}^i_: C:i同时作为key和value, h是head的个数, N o r m ( ⋅ ) Norm(\cdot) Norm(⋅) row-wise L 2 L_2 L2归一化函数。通过将原来的表embedding T i \mathbf{T}_i Ti 和列注意力机制表embedding T i C \mathbf{T}_i^C TiC一起获得列增强表embedding T ^ i ∈ R 1 × d \hat{\mathbf{T}}_i \in \mathbb{R}^{1 \times d} T^i∈R1×d。
Cross-Encoder的损失函数:因为一个SQL查询通常只会包括数据库中的少量数据表和数据列,训练集的标签分布是非常不均匀的。所以论文使用focal loss作为分类损失。cross-encoder的损失函数是多任务学习方式,包括数据表分类损失和数据列分类损失:
L 1 = 1 N ∑ i = 1 N F L ( y i , y i ^ ) + 1 M ∑ i = 1 N ∑ k = 1 n i F L ( y k i , y k i ^ ) \mathcal{L}_1 = \frac{1}{N}\sum^{N}_{i=1}FL(y_i, \hat{y_i}) + \frac{1}{M}\sum^{N}_{i=1}\sum^{n_i}_{k=1}FL(y^i_k, \hat{y^i_k}) L1=N1i=1∑NFL(yi,yi^)+M1i=1∑Nk=1∑niFL(yki,yki^)
上式中的FL是focal loss 函数, y i y_i yi是第i个表格的真实标签。 y i = 1 y_i=1 yi=1表示这个表被SQL查询引用了, y i = 0 y_i=0 yi=0表示这个表没有被SQL查询引用。 y k i y^i_k yki是第i个表格的第k列的真实标签。 y k i = 1 y^i_k=1 yki=1表示这一列被SQL查询引用了, y k i = 0 y^i_k=0 yki=0表示这一列没有被SQL查询引用。 y ^ i \hat{y}_i y^i和 y ^ k i \hat{y}^i_k y^ki是预测概率,由基于数据表embedding T ^ i \hat{\mathbf{T}}_i T^i和数据列embedding C k i \mathbf{C}^i_k Cki的两个不同MLP模块估计得到:
y ^ i = σ ( ( T ^ i U 1 t + b 1 t ) U 2 t + b 2 t ) y ^ k i = σ ( ( C k i U 1 c + b 1 c ) U 2 c + b 2 c ) \begin{aligned} \hat{y}_i & =\sigma\left(\left(\hat{\boldsymbol{T}}_i \boldsymbol{U}_1^t+\boldsymbol{b}_1^t\right) \boldsymbol{U}_2^t+\boldsymbol{b}_2^t\right) \\ \hat{y}_k^i & =\sigma\left(\left(\boldsymbol{C}_k^i \boldsymbol{U}_1^c+\boldsymbol{b}_1^c\right) \boldsymbol{U}_2^c+\boldsymbol{b}_2^c\right) \end{aligned} y^iy^ki=σ((T^iU1t+b1t)U2t+b2t)=σ((CkiU1c+b1c)U2c+b2c)
上式中的 U 1 t , U 1 c ∈ R d × w \boldsymbol{U}_1^t, \boldsymbol{U}_1^c \in \mathbb{R}^{d \times w} U1t,U1c∈Rd×w, b 1 t , b 1 c ∈ R w \boldsymbol{b}_1^t, \boldsymbol{b}_1^c \in \mathbb{R}^{ w} b1t,b1c∈Rw, U 2 t , U 2 c ∈ R w × 2 \boldsymbol{U}_2^t, \boldsymbol{U}_2^c \in \mathbb{R}^{w \times 2} U2t,U2c∈Rw×2, b 2 t , b 2 c ∈ R 2 \boldsymbol{b}_2^t, \boldsymbol{b}_2^c \in \mathbb{R}^{2} b2t,b2c∈R2是可训练参数, σ ( ⋅ ) \sigma(\cdot) σ(⋅)表示Softmax函数。
seq2seq模型Encoder的输入准备:在seq2seq模型推理时,用前面训练好的cross-encoder为每一个schema元素计算概率并排序,只保留数据库中的 top k 1 \text{top}\ k_1 top k1个数据表,并为每个表给保留 top k 2 \text{top}\ k_2 top k2个数据列。 k 1 k_1 k1和 k 2 k_2 k2是两个超参数,太小可能将必须的表或列给排除掉了,太大可能会包含一些不必要的schema元素(论文在后续的实验中对数据集进行统计后取了 k 1 = 4 k_1=4 k1=4, k 2 = 5 k_2=5 k2=5)。如论文图2所示,encoder的输入是由问题、排序后的schema元素,可选的外键关系拼接得到。在schema元素中使用的是原始名称,这样decoder可以直接成输入序列中拷贝所需的schema元素。(另外在论文实验时,还使用了与BRIDGE的方法从数据库中提取可能有用的内容来丰富数据列信息)
Skeleton-Aware Decoder
seq2seq的decoder将SQL生成分为两步:1. 基于问题的语义生成SQL骨架;2.从输入序列中选择所需"数据"(数据表、数据列、数据取值)来填充骨架中的槽位。
目标函数:为了在不引入额外模块的前提下实现上述分解思想,论文提出了一个新的生成目标,在生成第t个token时不仅依赖于encoder的输出,同时依赖decode在t个时间步之前的输出。也就是不是直接解码得到目标SQL,鼓励解码器先解码出SQL语句的骨架后再解码SQL语句。论文作者认为先解析骨架再解析SQL语句,在每一个解码步骤,SQL生成更容易,因为解码器可以直接从输入序列中拷贝"数据"或者从之前解析的骨架中拷贝SQL关键字:
L 2 = 1 G ∑ i = 1 G p ( l i s , l i ∣ S i ) \mathcal{L}_2 = \frac{1}{G} \sum^{G}_{i=1} p(l^s_i, l_i |S_i) L2=G1i=1∑Gp(lis,li∣Si)
上式的G是Text2SQL实例数目, S i S_i Si是第i个实例的输入序列(包括问题、排序后的schema元素,可选的外键关系)。 l i l_i li是第i个目标SQL语句, l i s l^s_i lis是从 l i l_i li抽取到的骨架。
SQL归一化:Spider数据集是由有不同标注习惯的标注员创建的,所以标注的最终SQL有不同的风格。为了减少模型学习的难度,将原始SQL语句在训练前进行如下操作的归一化,论文的表1有一个归一化例子。
- 将所有的关键字和schema元素转小写
- 在圆括号附近添加空格,将双引号替换成单引号
- 如果ORDER BY语句后面没有指定排序方式,在后面添加ASC关键词
- 将所有的AS语句去掉,并将所有表的别名用他们的原始名字替换。

SQL骨架提取:基于归一化的SQL语句,提取只包括SQL关键词和槽位的骨架,即对于一个归一化SQL语句,只保留它的SQL关键字并将其余部分用槽位标识代替。 另外不保留JOIN ON关键词因为它很难从自然语言问题中找到对应的部分。
Execution-Guided SQL Selector:因为在解码时没有约束SQL语法,使用了与以前研究相同的Execution-Guided SQL Selector,即在解码过程中进行beam search并选择结果中的第一个可以执行的SQL作为最终的结果。(beam search 在论文实验中为8)
DAIL-SQL
DAIL SQL出自2023年8月的论文《Text-to-SQL Empowered by Large Language Models: A Benchmark Evaluation》,是一种通过prompt GPT-4来实现Text2SQL的方法。论文先对已有的prompt LLM来实现Text2SQL的提示工程(prompt engineering)进行了调研和比较,然后提出名为DAIL SQL的方法来prompt LLM生成SQL。
论文将text2sql的提示工程分成question representation(prompt里问题和数据库表的表示方式)、example selection(如何选择有效text2sql例子)、example organization(例子在prompt中的组织方式)。
DAIL-SQL的思路的伪代码如论文算法1,下面介绍DAIL-SQL的prompt是如何得到的。

-
question representation:将数据库表用SQL语法语法形式来表示(论文中称其为Code Representation Prompt( CR P \text{CR}_P CRP)),如论文的Listing 4所示意。注意这个表示方式里有将数据表的外键特意标记出来,让LLM在预测"JOIN"操作时更容易。

-
example selection: 在选择text2sql例子时,同时考虑自然语言问题和SQL查询的相似度。
- 先将目标问题 q q q和候选数据集 Q \mathcal{Q} Q的每一个问题 q i q_i qi中的领域相关的词(表名、列名、数据取值)都用一个mask token给替换掉(用与RAT-SQL一样的n-gram匹配方法来进行schema linking找到与数据库有关的词。将数据表和列名使用"“来替换,将数据取值用”"替换)。再计算mask后的 q q q和 q i q_i qi的embedding相似度,并按照它们的相似度大小来对数据集 Q \mathcal{Q} Q倒序排序。
- 用一个基础模型基于问题 q q q和数据库 D \mathcal{D} D预测出一个pre-predicted SQL查询 s ′ s^{'} s′(论文使用的基础模型是Graphix),然后使用RESDSQL里的方法对SQL查询提取骨架,比较提取骨架后的 s ′ s^{'} s′和候选数据集 Q \mathcal{Q} Q里的每一个SQL查询 s i s_i si的Jaccard相似度。
- 将第二步得到的相似度大于阈值 τ \tau τ的候选集保留。(论文实验里的阈值是0.9,提交到Spider时的阈值是0.85)
- 选择top k个例子作为text2sql的例子。(因为之前已经根据问题相似度排序过了,再卡相似度阈值来过滤sql查询例子,并选择top-k,就是同时考虑了自然语言问题和SQL查询的相似度)
-
example organization: text2sql例子的组织方式如论文的Listing 8所示。

-
DAIL-SQL还尝试了self-consistency方法,可以使得执行准确率提高0.4%,但时间效率和token效率都低很多。
相关文章:
text2sql方法:RESDSQL和DAIL-SQL
之前介绍了text2sql的综述,但是对一些方法的描述不够详细,所以将一些感兴趣的方法思路也整理一下。 RESDSQL RESDSQL出自2023年2月的论文《RESDSQL: Decoupling Schema Linking and Skeleton Parsing for Text-to-SQL》(github)。它使用seq2seq PLM(pr…...
Stable Diffusion 优秀博客转载
初版论文地址:https://arxiv.org/pdf/2112.10752 主要流程图: Latent Diffusion Models(LDMs) DDPM是"Denoising Diffusion Probabilistic Models"的缩写, 去噪扩散概率模型 博客: 【论文阅读…...
探索IT行业的无限潜力:技术、发展与职业前景
探索IT行业的无限潜力:技术、发展与职业前景 1. 引言 信息技术(IT)已经彻底改变了我们的生活方式,从智能手机到云计算,IT无处不在。无论是公司管理系统、社交媒体,还是大数据分析平台,IT推动了…...
ESP32配网接入Wifi
1 ESP32的两种模式 AP模式:ESP32可以作为热点,手机和电脑等设备接入使用。 STA模式:ESP32可以作为作为客户端接入其他网络中。 2 流程 step1: ESP32上电后进入STA模式,尝试看能够接入网络 step2: 如何连接成功,则正常运行。如何连接超时,则自动进入AP模式,设置AP热点…...
前端-js例子:收钱转账
支付宝转账 在这里用到周期定时器setInterval(function,time),设置达到目标钱数时停止定时器。 点击转账按钮时,开始函数显示。 同时要确定输入框里输入的是数字。(有一定容错) window.onloadfunction(){var btn document.que…...
2024 BaseCTF repwn 部分wp
You are good at IDA 附件拖入ida。比较简单 UPX mini upx壳,无魔改,直接脱。脱完拖入ida。比较简单 Ez Xor 附件拖入ida 比较简单。脚本 ez_maze 附件拖入ida 一个宽为15的迷宫 BasePlus 附件拖入ida。变表base64再异或0xE 签个到吧 nc连上即得 echo nc…...
每日学习一个数据结构-倒排表
文章目录 示意图倒排表的基本概念倒排表的数据结构示例 倒排表的优点应用场景 倒排表(Inverted Index),也称为反向索引或倒排文件,在信息检索系统中是一种重要的数据结构。它主要用于快速搜索文档中的关键词,并找到包含…...
828华为云征文|部署在线文件管理器 Spacedrive
828华为云征文|部署在线文件管理器 Spacedrive 一、Flexus云服务器X实例介绍1.1 云服务器介绍1.2 产品优势1.3 计费模式 二、Flexus云服务器X实例配置2.1 重置密码2.2 服务器连接2.3 安全组配置 三、部署 Spacedrive3.1 Spacedrive 介绍3.2 Docker 环境搭建3.3 Spac…...
Alluxio EnterpriseAI on K8s 部署教程
Alluxio Enterprise AI on K8s 部署视频教程 视频为Alluxio Enterprise AI on K8s 部署视频教程。下面内容将主要介绍如何通过 Operator(Kubernetes 管理应用程序的扩展)在 Kubernetes 上安装 Alluxio。 1. 系统要求 Kubernetes 至少1.19版本的 Kubern…...
鸿蒙OpenHarmony【轻量系统内核扩展组件(动态加载)】子系统开发
基本概念 在硬件资源有限的小设备中,需要通过算法的动态部署能力来解决无法同时部署多种算法的问题。以开发者易用为主要考虑因素,同时考虑到多平台的通用性,LiteOS-M选择业界标准的ELF加载方案,方便拓展算法生态。LiteOS-M提供类…...
Leetcode42. 接雨水
讲的好的视频讲解 【很难想象这up刷题的精神状态 Leetcode42. 接雨水】 https://www.bilibili.com/video/BV1MC411n7Af/?share_sourcecopy_web&vd_sourceafbacdc02063c57e7a2ef256a4db9d2a rm是right max的意思,lm是left max的意思 时间复杂度: O (…...
dbt snapshot命令及应用示例
DBT是一种功能强大的数据转换工具,它使数据分析师和工程师能够更有效地转换仓库中的数据。dbt的一个关键特性是能够创建快照,这是跟踪数据随时间变化的一种方法。本文带你一起完成创建和使用dbt快照的过程。 理解缓慢变化维度 缓慢变化维度(scd)是数据仓…...
JavaEE: 深入探索TCP网络编程的奇妙世界(四)
文章目录 TCP核心机制TCP核心机制四: 滑动窗口为啥要使用滑动窗口?滑动窗口介绍滑动窗口出现丢包咋办? TCP核心机制五: 流量控制 TCP核心机制 书接上文~ TCP核心机制四: 滑动窗口 为啥要使用滑动窗口? 之前我们讨论了确认应答策略,对每一个发送的数据段,都要给一个ACK确…...
面试金典题2.3
若链表中的某个节点,既不是链表头节点,也不是链表尾节点,则称其为该链表的「中间节点」。 假定已知链表的某一个中间节点,请实现一种算法,将该节点从链表中删除。 例如,传入节点 c(位于单向链…...
React 知识框架
在学习 React 时,可以按照以下知识框架来逐步学习和掌握 React 相关的知识: 1. **基础概念**: - 了解什么是 React 和为什么要使用 React。 - 理解 Virtual DOM(虚拟 DOM)的概念以及它如何提高性能。 - 学习…...
DeepCross模型实现推荐算法
1. 项目简介 A032-DeepCross项目是一个基于深度学习的推荐算法实现,旨在解决个性化推荐问题。随着互联网平台上信息和内容的爆炸式增长,用户面临着信息过载的困境,如何为用户提供高效、精准的推荐成为了关键。该项目背景基于现代推荐系统的发…...
【力扣】2376. 统计特殊整数
如果一个正整数每一个数位都是 互不相同 的,我们称它是 特殊整数 。 给你一个 正 整数 n ,请你返回区间 [1, n] 之间特殊整数的数目。 示例 1: 输入:n 20 输出:19 解释:1 到 20 之间所有整数除了 11 以外都…...
MySQL面试题——第一篇
1. 一张自增表里面总共有7条数据,删除了最后2条数据,重启数据库后又插入了一条数据,此时ID是几 表类型如果是MyISAM,那么id就是8 如果是InnoDB,那就是6 InnoDB表只会把自增主键的最大id记录在内存中,所以重…...
零停机部署的“秘密武器”:为什么 Kamal Proxy 能成为你架构中的不二之选?
你是不是也遇到过这种场景:网站正在升级,用户却被迫刷新无数次页面?服务器切换时瞬间掉线,客户体验差得没话说。更糟糕的是,流量高峰期来临时,正是业务最重要的时刻,结果因为停机而损失惨重。这个时候你一定会想:难道没有一种方式,能在不打断服务的情况下,平滑地进行…...
轻量级RSS阅读器Fusion
什么是 Fusion ? Fusion 是一款轻量级、自托管的 RSS 聚合器和阅读器。 软件主要特点: 自动分组、书签、搜索、嗅探信息导入/导出 OPML 文件支持 RSS、Atom、JSON 类型的 feed响应式、明/暗模式、PWA轻量级,自托管友好 使用 Golang 和 SQLit…...
vscode里如何用git
打开vs终端执行如下: 1 初始化 Git 仓库(如果尚未初始化) git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...
python打卡day49
知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...
JavaScript 中的 ES|QL:利用 Apache Arrow 工具
作者:来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗?了解下一期 Elasticsearch Engineer 培训的时间吧! Elasticsearch 拥有众多新功能,助你为自己…...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用
1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...
【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分
一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计,提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合:各模块职责清晰,便于独立开发…...
VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP
编辑-虚拟网络编辑器-更改设置 选择桥接模式,然后找到相应的网卡(可以查看自己本机的网络连接) windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置,选择刚才配置的桥接模式 静态ip设置: 我用的ubuntu24桌…...
莫兰迪高级灰总结计划简约商务通用PPT模版
莫兰迪高级灰总结计划简约商务通用PPT模版,莫兰迪调色板清新简约工作汇报PPT模版,莫兰迪时尚风极简设计PPT模版,大学生毕业论文答辩PPT模版,莫兰迪配色总结计划简约商务通用PPT模版,莫兰迪商务汇报PPT模版,…...
CSS | transition 和 transform的用处和区别
省流总结: transform用于变换/变形,transition是动画控制器 transform 用来对元素进行变形,常见的操作如下,它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...
