第17章:Python TDD回顾与总结货币类开发
写在前面
这本书是我们老板推荐过的,我在《价值心法》的推荐书单里也看到了它。用了一段时间 Cursor 软件后,我突然思考,对于测试开发工程师来说,什么才更有价值呢?如何让 AI 工具更好地辅助自己写代码,或许优质的单元测试是一个切入点。 就我个人而言,这本书确实很有帮助。第一次读的时候,很多细节我都不太懂,但将书中内容应用到工作中后,我受益匪浅。比如面对一些让人抓狂的代码设计时,书里的方法能让我逐步深入理解代码的逻辑与设计。 作为一名测试开发工程师,我想把学习这本书的经验分享给大家,希望能给大家带来帮助。因为现在工作中大多使用 Python 代码,所以我把书中JAVA案例都用 Python 代码进行了改写 。
问题背景说明
在完成货币类的一系列开发与优化后,对整个开发过程进行回顾和总结具有重要意义。通过回顾,可以总结经验教训,发现开发过程中的优点和不足之处,为未来的项目开发提供参考,同时也有助于加深对测试驱动开发流程和方法的理解和掌握,提高开发者的技术水平和开发效率。
完成货币类的一系列开发与优化后,对整个过程进行回顾总结,有助于加深对Python TDD的理解,为后续开发积累经验。
17.1 思路说明
回顾从简单的乘法功能测试到复杂的多币种货币运算实现的过程,分析测试驱动开发的流程、遇到的问题及解决方法,总结代码优化和设计的思路。
17.2 测试代码(综合回顾测试)
import unittestclass Bank:def __init__(self):# 存储货币兑换汇率的字典,键是 (from_currency, to_currency) 元组,值是汇率self.rates = {}def addRate(self, from_currency, to_currency, rate):# 添加一种货币到另一种货币的汇率self.rates[(from_currency, to_currency)] = ratedef rate(self, from_currency, to_currency):# 获取从 from_currency 到 to_currency 的汇率# 如果是相同货币,汇率为 1if from_currency == to_currency:return 1# 尝试从 rates 字典中获取汇率,如果没有则默认为 1return self.rates.get((from_currency, to_currency), 1)def reduce(self, source, to):# 将表达式(如 Sum 或 Money)转换为指定货币的 Money 对象if isinstance(source, Sum):# 如果是 Sum 类型,将加数和被加数都转换为目标货币,然后求和amount = source.augend.reduce(self, to).amount + source.addend.reduce(self, to).amountreturn Money(amount, to)elif isinstance(source, Money):# 如果是 Money 类型,根据汇率进行转换rate = self.rate(source.currency, to)return Money(source.amount / rate, to)class Expression:def reduce(self, bank, to):# 抽象方法,用于将表达式转换为指定货币的 Money 对象passclass Money(Expression):def __init__(self, amount, currency):# 金额self.amount = amount# 货币类型self.currency = currencydef plus(self, addend):# 实现加法操作,返回一个 Sum 对象return Sum(self, addend)def times(self, multiplier):# 实现乘法操作,返回一个新的 Money 对象,金额乘以乘数return Money(self.amount * multiplier, self.currency)def reduce(self, bank, to):# 将自身转换为指定货币的 Money 对象# 调用 bank 的 rate 方法获取汇率rate = bank.rate(self.currency, to)return Money(self.amount / rate, to)class Sum(Expression):def __init__(self, augend, addend):# 加数self.augend = augend# 被加数self.addend = addenddef reduce(self, bank, to):# 将 Sum 中的加数和被加数转换为指定货币,然后求和amount = self.augend.reduce(bank, to).amount + self.addend.reduce(bank, to).amountreturn Money(amount, to)class Dollar(Money):def __init__(self, amount):# 调用父类 Money 的构造函数,将货币类型设置为 USDsuper().__init__(amount, "USD")class Franc(Money):def __init__(self, amount):# 调用父类 Money 的构造函数,将货币类型设置为 CHFsuper().__init__(amount, "CHF")class TestAllCurrencyOperations(unittest.TestCase):def test_mixed_addition(self):bank = Bank()# 添加瑞士法郎到美元的汇率为 2bank.addRate("CHF", "USD", 2)# 创建 5 美元的对象five_dollars = Dollar(5)# 创建 10 瑞士法郎的对象ten_francs = Franc(10)# 将 5 美元和 10 瑞士法郎相加并转换为美元result = five_dollars.plus(ten_francs).reduce(bank, "USD")# 验证结果是否等于 10 美元self.assertEqual(result.amount, 10)# 验证结果的货币类型是否为美元self.assertEqual(result.currency, "USD")def test_dollar_multiplication(self):# 创建 5 美元的对象five_dollars = Dollar(5)# 将 5 美元乘以 3result = five_dollars.times(3)# 验证结果是否等于 15 美元self.assertEqual(result.amount, 15)# 验证结果的货币类型是否为美元self.assertEqual(result.currency, "USD")if __name__ == '__main__':unittest.main()
17.3 源码说明
这段综合测试代码涵盖了多币种加法运算和货币乘法运算的测试用例。通过回顾整个开发过程,我们从最初的简单功能逐步实现了复杂的货币运算系统。在这个过程中,不断地编写测试用例、实现功能代码、优化代码结构,遵循TDD的流程解决了各种问题,提高了代码的质量和可维护性。总结这些经验,能帮助我们在未来的Python开发中更好地应用TDD方法。
TDD过程中的关键要点回顾
在讲授和实践TDD的过程中,有几个关键要点反复出现,这些要点对于理解和应用TDD至关重要。
- 让测试工作的方式
1.1 伪实现:在TDD流程中,当编写完测试用例后,为了快速验证测试框架是否正常工作,以及测试用例是否能够按照预期运行,我们会采用伪实现的方式。这是一种临时性的代码实现,它并不追求功能的完整性和正确性,只是简单地让测试能够通过。例如,在开发货币类的乘法功能时,最初的times
方法可能只是返回一个固定值,像这样:
class Dollar:def __init__(self, amount):self.amount = amountdef times(self, multiplier):return 0 # 伪实现,仅为使测试通过
通过这种方式,我们可以快速检查测试环境和测试用例的基本逻辑是否正确。如果此时测试能够顺利通过,说明测试框架和测试用例的基本设置没有问题;如果测试失败,我们可以先排查测试相关的问题,而不是纠结于功能代码的实现细节。一旦确认测试环节无误,我们再逐步完善功能代码,将伪实现替换为真正的功能实现。
1.2 三角测量:三角测量是一种通过多个类似的测试用例来逐步明确需求和实现通用解决方案的方法。当我们只有一个测试用例时,可能会编写一个仅适用于该特定情况的代码实现,这可能导致代码缺乏通用性。而三角测量通过增加更多相似但又有细微差异的测试用例,帮助我们发现代码中的共性和变化点,从而设计出更通用的解决方案。例如,在测试Dollar
对象的乘法方法times
时,我们最初可能只有一个测试用例:
def test_dollar_multiplication():five = Dollar(5)result = five.times(2)assert result == 10
此时,times
方法的实现可能只是针对5 * 2
这个特定情况编写的。为了确保times
方法在各种输入下都能正确工作,我们可以增加更多测试用例:
def test_dollar_multiplication():five = Dollar(5)result = five.times(2)assert result == 10result = five.times(3)assert result == 15ten = Dollar(10)result = ten.times(4)assert result == 40
通过这些不同输入的测试用例,我们可以发现乘法运算的通用规律,进而实现一个能够适用于各种输入的times
方法,避免返回常量值,使代码更具通用性和健壮性。
1.3 显式实现:显式实现是TDD过程的最终阶段,在这个阶段,我们根据之前编写的测试用例和通过三角测量明确的需求,实现完整、正确且符合业务逻辑的功能代码。此时的代码不仅要满足所有测试用例的要求,还要考虑代码的性能、可读性、可维护性等方面。例如,在货币类开发中,经过伪实现和三角测量阶段后,我们最终实现的times
方法可能是这样的:
class Dollar:def __init__(self, amount):self.amount = amountdef times(self, multiplier):return self.amount * multiplier
这个实现是基于前面的测试和分析,明确了乘法运算的具体需求后完成的,它能够正确处理各种输入情况,并且符合货币金额乘法运算的实际逻辑。
-
消除重复:去掉测试代码和程序代码间的重复部分,是推进设计和开发的重要手段。在TDD开发过程中,随着功能的增加和代码量的增长,很容易出现重复代码。这些重复代码可能存在于测试用例中,也可能在功能代码中,或者在两者之间。重复代码不仅增加了代码量,还会使维护变得困难,因为一处修改可能需要在多个地方同步进行。通过重构,我们可以提取重复的代码片段,将其封装成独立的函数、方法或类,使代码更加简洁、易维护。例如,在测试不同货币类的乘法和加法运算时,如果多个测试用例中都有创建货币对象和进行基本断言的重复代码,我们可以将这些重复部分提取出来,封装成一个辅助函数或测试基类中的方法,减少代码冗余。
-
测试的控制力:当开发过程中遇到不确定因素时,要加强测试的控制力,如同在路面湿滑时增大摩擦力;而当情况明朗时,则可以加速前进,提高开发效率。在TDD中,测试的控制力体现在对测试用例的编写和执行上。当开发过程中遇到新的功能需求、复杂的业务逻辑或不确定的技术方案时,我们需要编写更多详细的测试用例,覆盖各种可能的情况,确保代码在各种条件下都能正确运行。这就好比在路面湿滑时,我们需要小心翼翼地控制车辆,增加摩擦力以确保安全行驶。例如,在实现多币种货币运算时,由于涉及汇率转换、不同货币对象的组合等复杂情况,我们需要编写大量测试用例来验证各种情况下的运算结果是否正确。而当我们对某个功能已经非常熟悉,代码实现也相对稳定时,我们可以适当减少测试用例的数量,或者采用更高效的测试策略,提高开发效率,就像在路况良好时可以适当加速行驶一样。但需要注意的是,即使在情况明朗时,也不能完全忽视测试,仍然要保证代码的质量和正确性。
相关文章:
第17章:Python TDD回顾与总结货币类开发
写在前面 这本书是我们老板推荐过的,我在《价值心法》的推荐书单里也看到了它。用了一段时间 Cursor 软件后,我突然思考,对于测试开发工程师来说,什么才更有价值呢?如何让 AI 工具更好地辅助自己写代码,或许…...
7、数组知识点汇总
一、 数组基本概念 程序算法数据结构 算法:解决程序的流程步骤数据结构:将数据按照某种特定的结构来存储设计良好的数据结构会导致良好的算法。ArrayList、LinkedList 数组是最简单的数据结构。 1、数组: 数组:存放同一种类型…...
蓝桥杯c/c++需要掌握的基础语法总结
1、#include<bits/stdc.h> 万能头文件 2、using namespace std; 3、输出 cout<<""<<end1; (换行) printf(""); 4、int x3;整数 double d3.14;小数 char ch’A‘;字符 char s[]"Hell…...
学习第七十四行
qt调用信号与槽机制: MOC查找头文件中的signal与slots,标记出信号槽。将信号槽信息储存到类静态变量staticMetaObject中,并按照声明的顺序进行存放,建立索引。connect链接,将信号槽的索引信息放到一个双向链表中&…...
《罗宾逊-旅途VR》Build2108907官方学习版
《罗宾逊-旅途VR》官方版 https://pan.xunlei.com/s/VODiY5gn_fNxKREdVRdwVboCA1?pwdsh3f# 从第一人称的角度进行探索,玩家将遇到一系列恐龙和生物,这些恐龙和生物会对它们在泰森三世生态系统中的存在做出反应。强调与周围环境的互动,鼓励玩…...
详解共享WiFi小程序怎么弄!
在数字化时代,共享WiFi项目正逐渐成为公共场所的新标配,它不仅为用户提供了便捷的上网方式,还为商家带来了额外的收入来源。那么共享wifi怎么弄,如何搭建并运营一个成功的共享WiFi项目呢? 共享WiFi项目通过在公共场所…...
Glide加载gif遇到的几个坑
Glide本身支持gif格式的动画加载,但是大多数情况下我们用Glide都是去加载一些静态图片,加载gif动态图的需求不是很多,因此这次使用Glide加载gif就遇到了一些令人匪夷所思的问题 问题一:加载gif图片会有明显的卡顿 通常情况下我们…...
mybatis(19/134)
大致了解了一下工具类,自己手敲了一边,java的封装还是真的省去了很多麻烦,封装成一个工具类就可以不用写很多重复的步骤,一个工厂对应一个数据库一个environment就好了。 mybatis中调用sql中的delete占位符里面需要有字符…...
部分“古董机”编程读取文件时出现文件损坏的简易处理办法(简单粗暴) - 随笔
在部分老旧计算机(通常被戏称为“古董机”)上编程,读取文件时可能会遇到文件损坏的问题。这通常是由于硬件性能限制或操作系统的文件处理机制导致的。本文将介绍几种简易的处理办法,以解决或绕过这一问题。 方法1. 调整磁盘关闭时…...
StarRocks 3.4 发布--AI 场景新支点,Lakehouse 能力再升级
自 StarRocks 3.0 起,社区明确了以 Lakehouse 为核心的发展方向。Lakehouse 的价值在于融合数据湖与数据仓库的优势,能有效应对大数据量增长带来的存储成本压力,做到 single source of truth 的同时继续拥有极速的查询性能,同时也…...
强化学习入门--基本概念
强化学习基本概念 grid-world example 这个指的是一个小机器人(agent)在一个网格区域(存在边界),网格中存在需要躲避的格子和目标格子,我们的目的就是找到到达目标格子的最短路径 state 表示智能体相对…...
Oracle 创建并使用外部表
目录 一. 什么是外部表二. 创建外部表所在的文件夹对象三. 授予访问外部表文件夹的权限3.1 DBA用户授予普通用户访问外部表文件夹的权限3.2 授予Win10上的Oracle用户访问桌面文件夹的权限 四. 普通用户创建外部表五. 查询六. 删除 一. 什么是外部表 在 Oracle 数据库中&#x…...
深度学习python基础(第三节) 函数、列表
本节主要介绍函数、列表的基本语法格式。 函数 与c语言的函数差不多,就是语法基本格式不同。 name "loveyou" length len(name) print("字符串的长度为:%d" % length) # 自定义函数 def countstr(data):count 0for i in da…...
基于Python的多元医疗知识图谱构建与应用研究(上)
一、引言 1.1 研究背景与意义 在当今数智化时代,医疗数据呈爆发式增长,如何高效管理和利用这些数据,成为提升医疗服务质量的关键。传统医疗数据管理方式存在数据孤岛、信息整合困难等问题,难以满足现代医疗对精准诊断和个性化治疗的需求。知识图谱作为一种知识表示和管理…...
Spring Boot 快速创建项目
目录 一. 创建项目 编辑 二. 项目目录 三. 运行项目 (1) 启动项目 (2) 输出HelloWorld 一. 创建项目 我们以idea专业版为例创建Spring项目: 步骤: (1) File --> New --> Project (2) 配置项目基本信息 (3) 依赖: 需要什么就勾选什么. 我们这里就只勾选一个Spri…...
MySQL预编译语句过多告警排查
业务背景 在使用Spring Cloud Alibaba搭建的微服务架构中,项目采用ShardingSphere进行分库分表,MyBatis-Plus作为持久层。线上环境突发大量预编译语句过多的数据库告警,导致系统性能下降。 排查过程 1. 初步排查:联系云数据库厂…...
在centos上编译安装opensips【初级-默认安装】
环境:centos9 last opensips3.2 dnf update -y dnf install -y gcc make git automake libtool pcre-devel libxml2-devel \libcurl-devel postgresql-devel \bzip2-devel zlib-devel ncurses-devel libuuid-devel \libpcap-devel # 有报错的直接删除cd /usr/lo…...
偏序关系.
一、偏序(半序)关系 偏序关系 自反反对称传递性 二、全序(线序、链)关系 三、偏序集中的重要元素 1. 极大元与极小元 极大元找所在集合的一个或几个最高点; 极小元找所在集合的一个或几个最低点。 2. 最大元与最小…...
Node.js接收文件分片数据并进行合并处理
前言:上一篇文章讲了如何进行文件的分片:Vue3使用多线程处理文件分片任务,那么本篇文章主要看一下后端怎么接收前端上传来的分片并进行合并处理。 目录: 一、文件结构二、主要依赖1. express2. multer3. fs (文件系统模块)4. pat…...
设计模式概述 - 设计模式的重要性
引言 设计模式是软件工程中用于解决常见设计问题的经典解决方案。它们提供了一种标准化的方式来组织和设计代码,使得代码更易于理解、维护和扩展。在C编程中,设计模式尤为重要,因为它们可以帮助开发者应对复杂的系统设计,提高代码…...
OSI5GWIFI自组网协议层次对比
目录 5G网络5G与其他协议栈各层映射 5G网络 物理层 (PHY) 是 5G 基站协议架构的最底层,负责将数字数据转换为适合无线传输的信号,并将接收到的无线信号转换为数字数据。实现数据的编码、调制、多天线处理、资源映射等操作。涉及使用新的频段(…...
网络安全(渗透)
目录 名词解释 2、相互关系 3. 安全影响 名词解释 1、poc、exp、payload与shellcode POC(Proof of Concept): 是一种概念验证代码或演示程序,用于证明漏洞的存在。 主要目的是通过简单的代码或操作向安全研究人员、开发人员…...
Whisper-GPT:混合表征音频大语言模型
Whisper-GPT:混合表征音频大语言模型 当下,利用从神经压缩算法(例如#Encodec#)派生的离散音频标记的生成式音频、语音以及音乐模型数量激增。然而,这种方法的主要缺陷之一在于对上下文长度的处理。如果必须考虑所有不同频率的音频内容才能进行下一个标记预测,那么高保…...
科技重塑未来:前沿技术趋势、跨领域融合与社会影响深度洞察
目录 科技重塑未来:前沿技术趋势、跨领域融合与社会影响深度洞察引言一、前沿技术趋势洞察与分析1. 人工智能与自动化1.1 趋势分析1.2 挑战分析 2. 区块链技术2.1 趋势分析2.2 挑战分析 3. 量子计算3.1 趋势分析3.2 挑战分析 二、跨领域技术融合与创新实践1. AI与大…...
深度学习:大模型Decoding+MindSpore NLP分布式推理详解
大模型推理流程 1. 用户输入提示词(Prompt) 假设用户输入为:“从前,有一只小猫,它喜欢……” 我们的目标是让模型生成一段完整的故事。 2. 模型处理用户输入 2.1 分词:输入提示被分词为模型可以理解的…...
GESP6级语法知识(二):动态规划算法(二)
最小路径和; //最小路径和 #include<iostream> using namespace std; const int N100; int dp[N][N],value[N][N]; int n,m; int main() {cin>>n>>m;for(int i1;i<n;i) //录入初始数字矩阵 for(int j1;j<m;j)cin>>value[i][j];for(int i1;i…...
数据结构与算法之递归: LeetCode 79. 单词搜索 (Ts 版)
单词搜索 https://leetcode.cn/problems/word-search/description/ 描述 给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 单词必须按照字母顺序,通过相邻的单…...
智能系统的感知和决策
智能系统在感知和决策过程中具备的关键能力表现在智能感知/自主判定上,下面可以从感知的本质、自主判断的含义及其在智能系统中的作用进行深入分析。 1、智能感知:信息获取与理解 智能感知是指智能系统通过传感器或其他数据采集手段获取环境中的信息&…...
多线程之旅:线程安全问题
之前说到了多线程的创建和一些属性等等,接下来,就来讲讲多线程安全问题。 小编引入这段代码讲解下: public class Demo13 {public static int count0;public static void main(String[] args) throws InterruptedException {Thread t1new…...
用java配合redis 在springboot上实现令牌桶算法
令牌桶算法配合 Redis 在 Java 中的应用令牌桶算法是一种常用的限流算法,适用于控制请求的频率,防止系统过载。结合 Redis 使用可以实现高效的分布式限流。 一.、引入依赖首先,需要在 pom.xml 文件中引入 spring-boot-starter-data-re…...
科学计算库NumPy
NumPy是高性能科学计算和数据分析的基础包。 认识NumPy数据对象 n维数组对象ndarray(array) 数组是编程语言中重要且复杂的数据结构,它是由相同类型元素按照一定的顺序排列的集合。ndarray具有矢量算术能力和复杂的广播能力。 - 维度又称为维数,在数学…...
【大数据】机器学习----------强化学习机器学习阶段尾声
一、强化学习的基本概念 注: 圈图与折线图引用知乎博主斜杠青年 1. 任务与奖赏 任务:强化学习的目标是让智能体(agent)在一个环境(environment)中采取一系列行动(actions)以完成一个…...
Unicode不可见字符
场景复现 在访问 https://dotnet.microsoft.com/zh-cn/apps/aspnet地址时 突然出现 https://dotnet.microsoft.com/zh-cn/apps/aspnet%E2%80%8C%E2%80%8C 但是正常来看,这个地址后面是没有%E2%80%8C%E2%80%8C的,粘贴到idea里发现了url地址后面还拼接了2…...
w172二手车交易系统的设计与实现
🙊作者简介:多年一线开发工作经验,原创团队,分享技术代码帮助学生学习,独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取,记得注明来意哦~🌹赠送计算机毕业设计600个选题excel文…...
TRELLIS微软的图生3D
TRELLIS 教程目录: Youtube:https://www.youtube.com/watch?vJqFHZ-dRMhI 官网地址:https://trellis3d.github.io/ GitHub:https://github.com/Microsoft/TRELLIS 部署目录: 克隆项目 git clone --recurse-submodul…...
【力扣:新动计划,编程入门 —— 题解 ①】
向前看,总会有新的故事值得期盼 —— 25.1.21 2235. 两整数相加 给你两个整数 num1 和 num2,返回这两个整数的和。 示例 1: 输入:num1 12, num2 5 输出:17 解释:num1 是 12,num2 是 5 &#x…...
如何使用 Pytest -k 选项轻松筛选测试用例
关注开源优测不迷路 大数据测试过程、策略及挑战 测试框架原理,构建成功的基石 在自动化测试工作之前,你应该知道的10条建议 在自动化测试中,重要的不是工具 你是否曾不得不从成百上千个测试中费力筛选,只为运行几个特定的测试&am…...
C语言之小型成绩管理系统
🌟 嗨,我是LucianaiB! 🌍 总有人间一两风,填我十万八千梦。 🚀 路漫漫其修远兮,吾将上下而求索。 C语言之小型成绩管理系统 目录 设计题目设计目的设计任务描述设计要求输入和输出要求验收要…...
C++ ——— 模拟实现 vector 类
目录 vector 类的框架 无参数的构造函数 析构函数 获取有效数据个数 获取容量 重载 [] 运算符 可读可写版本 只可读版本 扩容 尾插 实现迭代器 可读可写版本 只可读版本 自定义设置size长度和内容 在任意位置插入 删除任意位置的数据 赋值重载 vector 类的框…...
SpringBoot实现轻量级动态定时任务管控及组件化
1关于动态定时任务 关于在SpringBoot中使用定时任务,大部分都是直接使用SpringBoot的Scheduled注解,如下: Component public class TestTask {Scheduled(cron"0/5 * * * * ? ") //每5秒执行一次public void execute(){SimpleDa…...
STM32 FreeRTOS 任务挂起和恢复---实验
实验目标 学会vTaskSuspend( )、vTaskResume( ) 任务挂起与恢复相关API函数使用: start_task:用来创建其他的三个任务。 task1:实现LED1每500ms闪烁一次。 task2:实现LED2每500ms闪烁一次。 task3:判断按键按下逻辑,KE…...
#漏洞挖掘# 一文了解什么是Jenkins未授权访问!!!
免责声明 本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停…...
1.21学习记录
misc 2023isctf 你说爱我尊嘟假嘟 这题有点脑洞,需要把你说爱我换成Ook.将尊嘟换为Ook!假嘟换成Ook?(根据语气进行猜测吧)用在线工具解密最后用base64解密即可 2023isctf 杰伦可是流量明星 解压后是一个MP3文件&am…...
【Pandas】pandas Series groupby
Pandas2.2 Series Function application, GroupBy & window 方法描述Series.apply()用于将一个函数应用到 Series 的每个元素或整个 SeriesSeries.agg()用于对 Series 数据进行聚合操作Series.aggregate()用于对 Series 数据进行聚合操作Series.transform()用于对 Series…...
Text2SQL 智能报表方案介绍
0 背景 Text2SQL智能报表方案旨在通过自然语言处理(NLP)技术,使用户能够以自然语言的形式提出问题,并自动生成相应的SQL查询,从而获取所需的数据报表,用户可根据得到结果展示分析从而为结论提供支撑&#…...
51c~SLAM~合集1
我自己的原文哦~ https://blog.51cto.com/whaosoft/12327374 #GSLAM 自动驾驶相关~~~ 一个通用的SLAM架构和基准 GSLAM:A General SLAM Framework and Benchmark 开源代码:https://github.com/zdzhaoyong/GSLAM SLAM技术最近取得了许多成功&am…...
服务器安装ESXI7.0系统及通过离线包方式升级到ESXI8.0
新到了一台物理服务器需要安装系统,项目不急用,先拿来做些实验。 本次实验目标: 1、在物理服务器上安装ESXI7.0系统; 2、通过离线包升级方式将ESXI7.0升级为ESXI8.0。 实验环境准备: 物理服务器1台,型号…...
计算机网络 (52)秘钥分配
一、重要性 在计算机网络中,密钥分配是密钥管理中的一个核心问题。由于密码算法通常是公开的,因此网络的安全性主要依赖于密钥的安全保护。密钥分配的目的是确保密钥在传输过程中不被窃取或篡改,同时确保只有合法的用户才能获得密钥。 二、方…...
xctf-comment(Intruder,git恢复,SQL注入,Hex解码)
这题是2018年网鼎杯真题,考察 Burp Suite 的 Intruder 模块去找用户密码,使用 githacker 恢复代码(githack不行),代码审计发现SQL二次注入,尝试SQL注入读取文件内容,读取的是/home/www/.bash_hi…...
Docker Compose创建镜像服务
什么是Docker Compose 使用Docker Compose,可以使用YAML配置文件(称为Compose文件)来配置应用程序的服务,然后使用Compose CLI从配置中创建并启动所有服务 。 Compose文件的默认路径是compose.yaml(首选)…...