当前位置: 首页 > news >正文

《leetcode-runner》【图解】【源码】如何手搓一个debug调试器——架构

前文:
《leetcode-runner》如何手搓一个debug调试器——引言

文章目录

  • 设计引入
  • 为什么这么设计
  • 存在难点
    • 1. 环境准备
    • 2. 调试程序

仓库地址:leetcode-runner

本文主要聚焦leetcode-runner对于debug功能的整体设计,并讲述设计原因以及存在的难点

设计引入

让我们来思考一下,一个最简单的调试器需要哪些内容

首先,它能够接受用户的输入

其次,它能够读懂用户想让调试器干嘛,并做出相应的行为

最后,执行完操作后需要显示结果

基于此,我们可以给出一个最简单的设计

在这里插入图片描述

  • Reader:负责读取用户的输入,识别输入并转化为系统能够识别的信息
  • Executor:根据Reader解读分析得到的数据,执行具体的调试行为,产生执行结果
  • Output:根据执行结果,进行可视化显示

这个最简单的设计看似还凑活,实际上确实只能凑活,且不论用户该输入啥,单说Reader,哥们你该解析出个啥呢?解析啥才能让executor识别,并执行对应逻辑

因此,我们还需要引入一套非常重要的系统——指令系统

在这里插入图片描述

当引入指令系统后,整个debug模块都被盘活了。debug的每个模块都能识别指令系统,只要遇到某条指令,就会执行对应的操作

而reader就负责将用户输入的命令行字符串解析转换为指令,然后系统就会依照指令执行相应逻辑

有了指令系统,debug项目完整了吗?No No No

让我们将视线聚焦到executor上,既然是调试代码,那么被调试的代码有被运行吗?被谁运行了呢?在我们目前的架构中是不存在相应的模块。也就是说,我们缺少了调试服务,因此进一步完善,得到如下架构图

在这里插入图片描述

调试服务运行被调试的代码,然后获取得到被调试代码相应信息

executor服务负责与调试服务沟通,通知调试服务执行相应逻辑;调试服务将数据信息存储,交由executor取用,获取目标代码相关信息

接下来,再让我们结合具体场景思考

现在,用户在使用leetcode-runner,编写了一个Solution的class,然后他想要使用debug调试功能,请问,我们能直接调试Solution代码吗?

调试个屁!要是能这么轻松,我还写个屁的调试器!

首先,项目需要为用户自动编写一个Main类,也就是入口函数。此外,还需要将测试案例转换成对应代码,比如’[1,2,3]',转换成Java代码就是int[] a = new int[] {1,2,3};,然后实例化Solution class,调用相应的方法,同时将测试案例转换得到的变量传入方法内,这才算完成前置工作

像这类前置工作的准备,leetcode-runner统一将其封装在DebugEnv对象内,DebugEnv提供的prepare()方法就是为了完成前置工作

进一步完善,可以得到如下架构图

在这里插入图片描述

现在,整个系统像样了不少,但如果想要暴露给外部系统使用,还是麻烦了点,如果想要别人使用方便,我们该怎么办呢?答案是——封装!

现在,我们引入Debugger类,负责启动整个debug框架,得到如下的架构图

在这里插入图片描述

接下来进一步完善细节,将leetcode-runner负责各个模块的核心类名填入系统,得到如下架构图

请添加图片描述

为什么这么设计

以笔者粗俗的理解,设计的目的是为了更好的编写代码。一个好的设计可以避免出现非常对的bug,在一定程度上提高编程的速度

让我们回看上方做出的设计,我们不难发现,所有的功能都被封装在独立的模块之内。模块与模块之间并没有过强的耦合,不会出现牵一发而动全身的情况

另外,如此设计还有一个好处——不依赖具体的语言。啥意思呢?打个比方,我现在要做Java的debug调试器,我需要实现的子类有DebugEnvDebuggerExecuteContext调试服务InstExecutor。其他的模块内容完全可以复用,比如InstReaderOutput,指令系统…因为这些模块不依赖于具体的语言

当我需要实现一个python的debug调试器,同样可以复用这些模块。此外,DebugEnv,Debugger也存在可以复用逻辑。

DebugEnv,不同语言总有相同的准备活动,比如可执行程序(jdk,python解释器…)测试案例准备(程序输入)代码创建(Main函数,也就是程序入口)…因为有如此多的共用逻辑,完全可以提取到父类当中,在leetcode-runner中,就提供了AbstractDebugEnv封装公用逻辑

Debugger,作为debug框架入口,如读取执行可视化这一套流程,就可以复用

存在难点

1. 环境准备

在环境准备的过程中,我们最需要关注的是Main函数的创建,这里给一个leetcode-runner创建的Main函数,以leetcode-1367题目为例。leetcode-runner根据该题提供的Solution代码片段创建相应的Main函数

Solution代码片段

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {public boolean isSubPath(ListNode head, TreeNode root) {}
}

插件项目自动生成的Main文件

import java.util.*;
/**/
public class Main {public static void main(String[] args) {Solution solution = new Solution();String bxdnslspts = "[4,2,8]";bxdnslspts = bxdnslspts.trim();ListNode a0 = null;if (!"[]".equals(bxdnslspts)) {// 把collect变为数组Integer[] split =Arrays.stream(bxdnslspts.replace("[", "").replace("]", "").split(",")).map(Integer::parseInt).toArray(Integer[]::new);int i = 0;a0 = new ListNode(split[i]);ListNode cp = a0;i += 1;// 迭代for (; i < split.length; ++i) {cp.next = new ListNode(split[i]);cp = cp.next;}}String cnuepugbsq = "[1,4,4,null,2,2,null,1,null,6,8,null,null,null,null,1,3]";cnuepugbsq = cnuepugbsq.trim();TreeNode a1 = null;if (!"[]".equals(cnuepugbsq)) {// 把collect变为数组Integer[] split =Arrays.stream(cnuepugbsq.replace("[", "").replace("]", "").split(",")).map(e -> "null".equals(e) ? null : (int) Integer.parseInt(e)).toArray(Integer[]::new);int i = 0;a1 = new TreeNode(split[i]);i++;Queue<TreeNode> q = new LinkedList<>();q.add(a1);while (!q.isEmpty()) {TreeNode node = q.poll();// 添加它的左节点if (i < split.length) {if (split[i] != null) {node.left = new TreeNode(split[i]);q.add(node.left);}i += 1;}// 添加右节点if (i < split.length) {if (split[i] != null) {node.right = new TreeNode(split[i]);q.add(node.right);}i += 1;}}}solution.isSubPath(a0, a1);}
}

这里的难点是,如何根据Solution的核心代码片段,创建对应的Main函数。此外,还需要通过测试案例,转换为相应的代码

2. 调试程序

调试程序,这部分与语言强相关,并且非常底层。如果你是Java的调试器开发,你将明白Java在底层到底封装了多少内容,提供了多大的便利。光是自动拆箱自动装箱,在调试程序编写时都需要手动处理判断,巨tm麻烦

另外,调试程序的逻辑处理,执行顺序,以及最复杂的表达式计算,这些都是调试程序编写的难点

相关文章:

《leetcode-runner》【图解】【源码】如何手搓一个debug调试器——架构

前文&#xff1a; 《leetcode-runner》如何手搓一个debug调试器——引言 文章目录 设计引入为什么这么设计存在难点1. 环境准备2. 调试程序 仓库地址&#xff1a;leetcode-runner 本文主要聚焦leetcode-runner对于debug功能的整体设计&#xff0c;并讲述设计原因以及存在的难点…...

G1原理—10.如何优化G1中的FGC

大纲 1.G1的FGC可以优化的点 2.一个bug导致的FGC(Kafka发送重试 subList导致List越来越大) 3.为什么G1的FGC比ParNew CMS要更严重 4.FGC的一些参数及优化思路 1.G1的FGC可以优化的点 (1)FGC的基本原理 (2)遇到FGC应该怎么处理 (3)应该如何操作来规避FGC (4)应该如何操…...

【专题一 递归】21. 合并两个有序链表

1.题目解析 2.讲解算法原理 解法:递归-> 重复的子问题 重复子问题 ->函数头的设计 合并两个有序链表--->Node dfs(l1&#xff0c;l2) 只关心某一个子问题在做什么事情 ->函数体的设计 比大小l1→next dfs( l1.next, l2)return l1 递归的出口 if(l1null)return l2…...

WebSocket——推送方案选型

一、前言&#xff1a;为何需要服务端主动推送&#xff1f; 在现代应用中&#xff0c;很多功能都依赖于“消息推送”。比如&#xff1a; 小红点提醒&#xff1a;我们经常在手机应用里看到的一个小红点提示&#xff0c;表示有新的消息或任务需要我们关注。新消息提醒&#xff1…...

Openresty 安装

1&#xff0e; 依赖包安装&#xff1a; # yum install readline-devel pcre-devel openssl-devel 2. 在系统中添加openresty的仓库&#xff1a; # sudo yum install yum-utils # sudo yum-config-manager --add-repo https://openresty.org/package/centos/openresty.repo …...

回归预测 | MATLAB实TCN时间卷积神经网络多输入单输出回归预测

效果一览 基本介绍 回归预测 | MATLAB实TCN时间卷积神经网络多输入单输出回归预测 …………训练集误差指标………… 1.均方差(MSE)&#xff1a;166116.6814 2.根均方差(RMSE)&#xff1a;407.5741 3.平均绝对误差&#xff08;MAE&#xff09;&#xff1a;302.5888 4.平均相对…...

TikTok专线服务器助力品牌营销新高度

在这个信息爆炸的时代&#xff0c;短视频平台如雨后春笋般涌现&#xff0c;TikTok便是其中的佼佼者。众多品牌纷纷涌入这个平台&#xff0c;试图借助其强大的用户基础和传播能力来提升知名度。而在这其中&#xff0c;IPIPGO直播专线的出现&#xff0c;为品牌在TikTok上的营销提…...

flutter VoidCallBack ValueChange<T> 的函数定义

在 Flutter 中,VoidCallback 和 ValueChanged<T> 是两种常用的回调函数类型,它们通常用于处理事件或传递数据。下面是它们的详细定义及使用方式。 1. VoidCallback 函数类型 VoidCallback 是一个没有参数也没有返回值的回调函数类型。它通常用于简单的事件处理,比如…...

pyspark连接clickhouse数据库的方式(其它数据库同样适用)

目录 一、背景简记二、pyspark连接clickhouse方式记录三、结语参考学习博文 一、背景简记 实际工作中&#xff0c;大部分所用的数据存储地址都是在数据库中&#xff0c;如我司现在常用的数据库是clickhouse&#xff0c;相关数据的统计分析都在此上操作。如果想用pyspark连接cl…...

当父级元素设置了flex 布局 ,两个子元素都设置了flex :1, 但是当子元素放不下的时候会溢出父元素怎么解决 (css 样式问题)

一、问题 遇到个样式问题&#xff0c;当父级元素设置了flex 布局 &#xff0c;两个子元素都设置了flex :1, 但是当子元素放不下的时候会溢出父元素怎么解决 &#xff08;拖拽浏览器 使页面变小&#xff09; 二、解决方法 .father{min-height: 600px;width: 100%;display: flex…...

软件方法论--课程笔记(整理中)

C1&#xff1a;概览Introduction &#xff08;1&#xff09;软件的4个特性 一致性&#xff08;Conformity&#xff09;&#xff1a;软件必须符合严格的规格和要求&#xff0c;包括与其他组件的接口和环境的连接&#xff0c;避免因为不一致导致无法复用或开发问题。 不可见性…...

从 0 开始实现一个 SpringBoot + Vue 项目

从 0 开始实现一个 SpringBoot Vue 项目 从 0 开始实现一个 SpringBoot Vue 项目 软件和工具创建 SpringBoot 后端项目创建 MySQL 数据库配置文件实现增删改查接口 Model 层mapper 层service 层controller 层测试 实现项目功能接口 代码测试 创建 Vue 前端 安装 Node.js配置…...

怎么修复损坏的U盘?而且不用格式化的方式!

当你插入U盘时&#xff0c;若电脑弹出“需要格式化才能使用”提示&#xff0c;且无法打开或读取其中的数据&#xff0c;说明U盘极有可能已经损坏。除此之外&#xff0c;若电脑在连接U盘后显示以下信息&#xff0c;也可能意味着U盘出现问题&#xff0c;需要修复损坏的U盘&#x…...

使用redis-cli命令实现redis crud操作

项目场景&#xff1a; 线上环境上redis中的key影响数据展示&#xff0c;需要删除。但环境特殊没办法通过 redis客户端工具直连。只能使用redis-cli命令来实现。 操作步骤&#xff1a; 1、确定redis安装的服务器&#xff1b; 2、找到redis的安装目录下 ##找到redis安装目…...

Kibana 控制台中提供语义、向量和混合搜索

作者&#xff1a;来自 Elastic Mark_Laney 想要将常规 Elasticsearch 查询与新的 AI 搜索功能结合起来吗&#xff1f;那么&#xff0c;你不需要连接到某个第三方的大型语言模型&#xff08;LLM&#xff09;吗&#xff1f;不。你可以使用 Elastic 的 ELSER 模型来改进现有搜索&a…...

设计模式-结构型-装饰器模式

装饰器模式&#xff08;Decorator Pattern&#xff09;是结构型设计模式中的一种&#xff0c;它允许你通过将对象封装在一个新的对象中&#xff0c;来动态地添加新的功能&#xff0c;而无需改变原对象的结构。装饰器模式的核心思想是“将功能附加到对象上”&#xff0c;它是一种…...

CAP:Serverless + AI 让应用开发更简单

AI 已被广泛视为推动行业进步的关键力量&#xff0c;其在各行业的落地步伐加快。企业在构建 AI 应用开发过程中经常会面临 AI 技术门槛过高、试错周期过长、GPU 资源昂贵且弹性能力不足、缺乏配套工具、业务与模型的开发运维过于割裂、缺乏定制化能力等挑战&#xff0c;成为企业…...

Redis超详细入门教程(基础篇)

目录 一、什么是Redis 二、安装Redis 1、Windows系统安装 2、Linux系统安装 三、Redis通用命令 四、Redis基本命令 五、五种数据结构类型 5.1、String类型 5.2、List集合类型 5.3、Set集合类型 5.4、Hash集合类型 5.5、Zset有序集合类型 六、总结 一、什么是Redi…...

对话 TDengine 解决方案中心总经理陈肃:构建技术与市场的桥梁

TD 小T导读 他是大数据领域的杰出专家&#xff0c;拥有超过十项一作发明专利&#xff0c;是中国通信行业标准《大数据 消息中间件技术要求与测试方法》的重要编写者&#xff0c;并凭借数据中间件领域的突出成就荣获 2019 年“CJK OSS Award”。他是腾讯云 TVP 专家和 TGO 鲲鹏会…...

Formality:参考设计/实现设计以及顶层设计

相关阅读 Formalityhttps://blog.csdn.net/weixin_45791458/category_12841971.html?spm1001.2014.3001.5482​​​ Formality存在两个重要的概念&#xff1a;参考设计/实现设计和顶层设计&#xff0c;本文就将对此进行详细阐述。参考设计/实现设计是中两个重要的全局概念&am…...

通过内核模块按fd强制tcp的quickack方法

一、背景 tcp的quickack功能是为了让ack迅速回发&#xff0c;快速响应&#xff0c;减少网络通讯时延&#xff0c;属于一个优化项&#xff0c;但是tcp的quickack是有配额限制的&#xff0c;配置是16个quick&#xff0c;也就是短时间内quickack了16次以后&#xff0c;这个配额为…...

Wi-Fi 7、Wi-Fi 6 与 5G、4G 的全方位对比

随着无线通信技术的飞速发展&#xff0c;Wi-Fi 7、Wi-Fi 6&#xff0c;以及5G、4G 已经成为人们生活和工作中不可或缺的网络技术。无论是家庭网络、高速移动通信&#xff0c;还是工业物联网&#xff0c;这些技术都在发挥各自的作用。那么&#xff0c;它们之间有什么区别&#x…...

【例43.3】 转二进制

目录 描述 输入描述 输出描述 用例输入 1 用例输出 1 来源 类型 知识补充站 代码 C Python3 C 描述 请你把一个整数n转化为二进制并从低位到高位输出。 输入描述 一行&#xff0c;仅含一个正整数 n (1≤n≤109)。 输出描述 从低位到高位输出一个二进制数&a…...

qt vs ios开发应用环境搭建和上架商店的记录

qt 下载链接如下 https://download.qt.io/new_archive/qt/5.14/5.14.2/qt-opensource-mac-x64-5.14.2.dmg 安装选项全勾选就行&#xff0c;这里特别说明下qt5.14.2/qml qt5.14.2对qml支持还算成熟&#xff0c;但很多特性还得qt6才行&#xff0c;这里用qt5.14.2主要是考虑到服…...

安全测评主要标准

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 安全测评的主要标准‌包括多个国际和国内的标准&#xff0c;这些标准为信息系统和产品的安全评估提供了基础和指导。 一、安全测评的主要标准 1.1、国际标准 ‌可信计算机系统评估准则&#xff08;TC…...

如何学习数学 | 数学家如何思考

学习数学的关键在哪里&#xff1f; 原创 遇见数学 不少人面对数学都会觉得高深莫测&#xff0c;甚至非常枯燥乏味。 只有当你真正走入它的世界&#xff0c;才会发现里面蕴含着无尽的智慧和美感。要想推开这座数学的大门&#xff0c;需要的不仅仅是背公式&#xff0c;或者做一…...

职场沟通与行为

职场沟通与行为 引言 在职场上&#xff0c;你是否曾遇到过困惑的沟通&#xff1f;是否对同事的行为有过疑虑&#xff1f;这不仅是个别现象&#xff0c;而是我们这个时代工作文化中的普遍问题。许多职场的摩擦&#xff0c;来自沟通不畅或是行为不当。那么&#xff0c;如何才能…...

IIO(Industrial I/O)驱动介绍

文章目录 IIO&#xff08;Industrial I/O&#xff09;驱动是Linux内核中用于工业I/O设备的子系统&#xff0c;主要用于处理传感器数据采集和转换。以下是其关键点&#xff1a; 功能 数据采集&#xff1a;从传感器读取数据。数据处理&#xff1a;对原始数据进行滤波、校准等操作…...

关于vite+vue3+ts项目中env.d.ts 文件详解

env.d.ts 文件是 Vite 项目中用于定义全局类型声明的 TypeScript 文件。它帮助开发者向 TypeScript提供全局的类型提示&#xff0c;特别是在使用一些特定于 Vite 的功能时&#xff08;如 import.meta.env&#xff09;。以下是详细讲解及代码示例 文章目录 **1. env.d.ts 文件的…...

32单片机综合应用案例——物联网(IoT)环境监测站(四)(内附详细代码讲解!!!)

无论你身处何种困境&#xff0c;都要坚持下去&#xff0c;因为勇气和毅力是成功的基石。不要害怕失败&#xff0c;因为失败并不代表终结&#xff0c;而是为了成长和进步。相信自己的能力&#xff0c;相信自己的潜力&#xff0c;相信自己可以克服一切困难。成功需要付出努力和坚…...

【Flink系列】6. Flink中的时间和窗口

6. Flink中的时间和窗口 在批处理统计中&#xff0c;我们可以等待一批数据都到齐后&#xff0c;统一处理。但是在实时处理统计中&#xff0c;我们是来一条就得处理一条&#xff0c;那么我们怎么统计最近一段时间内的数据呢&#xff1f;引入“窗口”。 所谓的“窗口”&#xff…...

代码随想录算法训练营第三十五天-动态规划-01背包(二维)

动规五部曲 dp数组的含义&#xff0c;注意这是一个二维数组。dp[i][j] 第一维度代表“从0到第i个物品&#xff0c;而且包括选或不选的情况&#xff0c;即这一维度代表物品编号第二维度代表代表背包容量合在一起的意思是当背包容量是j时&#xff0c;从0到i个物品中选择任意物品…...

快速开发:用AI构造AI —— 打造属于个人的Copilot(M-聪明AI)

作品简介&#xff1a; 当今快速发展的AI时代&#xff0c;学会使用AI的同时&#xff0c;也可以融入AI&#xff0c;来打造自己的产品&#xff0c;我给我这个取名M-聪明&#xff0c; 是基于VUE 3 Spring Boot -Redis ChatGML RxJava SSE 的AI 服务平台。然后这款工具旨在为用户…...

Elasticsearch容器启动报错:AccessDeniedException[/usr/share/elasticsearch/data/nodes];

AccessDeniedException 表明 Elasticsearch 容器无法访问或写入数据目录 /usr/share/elasticsearch/data/nodes。这是一个权限问题。 问题原因&#xff1a; 1、宿主机目录权限不足&#xff1a;映射到容器的数据目录 /data/es/data 在宿主机上可能没有足够的权限供容器访问。 …...

用公网服务器实现内网穿透

首先需要一个公网服务器 下载frp 搜索github下载到frp&#xff0c;服务端frps/客户端frpc。。下载的时候要注意自己本地内网机的cpu版本和服务端cpu架构 我的电脑是mac M1PRO版本 下载的是&#xff1a;darwinarm64 比如 服务端一般是Linux&#xff08;Intel 64位CPU&#xf…...

Jmeter如何进行多服务器远程测试

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 JMeter是Apache软件基金会的开源项目&#xff0c;主要来做功能和性能测试&#xff0c;用Java编写。 我们一般都会用JMeter在本地进行测试&#xff0c;但是受到单…...

前端实习第二个月小结

时间飞快&#xff0c;第一次实习已经过去两个多月&#xff0c;作一些简单的总结和分享。 注&#xff1a;文章整体会比较轻松&#xff0c;提及的经历、经验仅作参考。 一、关于实习/工作内容 1、工作内容 近期做的是管理后台方面的业务&#xff0c;技术栈&#xff1a;前端re…...

C# 并发和并行的区别--16

目录 并发和并行 一.并发 定义 特点 代码示例 代码解释 二.并行 定义 特点 在C#中的体现 代码示例 代码解释 三.并发和并行的区别 四 .如何在C#中选择并发还是并行 1.考虑任务类型 2.代码示例 3.注意事项 五.总结 并发和并行 在编程领域,并发和并行是两个密切…...

Python编程与在线医疗平台数据挖掘与数据应用交互性研究

一、引言 1.1 研究背景与意义 在互联网技术飞速发展的当下,在线医疗平台如雨后春笋般涌现,为人们的就医方式带来了重大变革。这些平台打破了传统医疗服务在时间和空间上的限制,使患者能够更加便捷地获取医疗资源。据相关报告显示,中国基于互联网的医疗保健行业已进入新的…...

HBase实训:纸币冠字号查询任务

一、实验目的 1. 理解分布式数据存储系统HBase的架构和工作原理。 2. 掌握HBase表的设计原则&#xff0c;能够根据实际业务需求设计合理的表结构。 3. 学习使用HBase Java API进行数据的插入、查询和管理。 4. 实践分布式数据存储系统在大数据环境下的应用&#xff0c;…...

Java 读取 Windows 设备的唯一性标识及定位

在 Windows 系统中&#xff0c;获取设备唯一性标识及定位信息对设备管理、安全监控等场景意义重大。本文介绍 Java 中几种实现方法&#xff0c;如 JNA 库、WMI4Java 库及通过 JNI 结合 Windows API。 1. 使用 JNA 库读取 DEVPKEY_Device_ContainerId 在 Windows 系统中&…...

UE控件学习

ListView&#xff1a; item设置&#xff1a;使能在list设置为Entry类 Grid Panel&#xff1a; 常用作背包&#xff0c;每个格子大小可不相同 WidgetSwitcher&#xff1a; 用于切换页签 Wrap_Box&#xff1a; 自动横向排版子节点&#xff0c;超过一定范围则自动换行…...

1.Spring AI 从入门到实践

​Spring AI 从入门到实践 1.什么是Spring AI 2.使用Spring Boot&Spring AI快速构建AI应用程序 3.ChatClient&Chat Model简化与AI模型的交互 4.Spring AI Prompt:与大模型进行有效沟通 5.结构化输出大模型响应 6.实战:AI聊天机器人 Ben技术站关注Java技术&#x…...

2025年01月蓝桥杯Scratch1月stema选拔赛真题—美丽的图形

美丽的图形 编程实现美丽的图形具体要求: 1)点击绿旗&#xff0c;角色在舞台中心&#xff0c;如图所示&#xff1b; 2)1秒后&#xff0c;绘制一个边长为 140的红色大正方形&#xff0c;线条粗细为 3&#xff0c;正方形的中心为舞台中心&#xff0c;如图所示; 完整题目可点击下…...

FLASK创建下载

html用a标签 <!-- Button to download the image --> <a href"{{ url_for(download_file, filenameimage.png) }}"><button>Download Image</button> </a> 后端&#xff1a;url_for双大括号即是用来插入变量到模板中的语法。也就是绑…...

LDD3学习7--硬件接口I/O端口(以short为例)

1 理论 1.1 基本概念 目前对外设的操作&#xff0c;都是通过寄存器。寄存器的概念&#xff0c;其实就是接口&#xff0c;访问硬件接口&#xff0c;有I/O端口通信和内存映射I/O (Memory-Mapped I/O)&#xff0c;I/O端口通信是比较老的那种&#xff0c;都是老的串口并口设备&am…...

MySQL(高级特性篇) 06 章——索引的数据结构

一、为什么使用索引 索引是存储引擎用于快速找到数据记录的一种数据结构&#xff0c;就好比一本教科书的目录部分&#xff0c;通过目录找到对应文章的页码&#xff0c;便可快速定位到需要的文章。MySQL中也是一样的道理&#xff0c;进行数据查找时&#xff0c;首先查看查询条件…...

【FlutterDart】MVVM(Model-View-ViewModel)架构模式例子-http版本(30 /100)

动图更精彩 MVVM&#xff08;Model-View-ViewModel&#xff09; 特点 Model&#xff1a;负责数据管理和业务逻辑。 View&#xff1a;负责显示数据&#xff0c;通常是一个UI组件。 ViewModel&#xff1a;负责处理用户交互&#xff0c;更新Model&#xff0c;并将数据转换为View可…...

光谱相机的光谱分辨率可以达到多少?

多光谱相机 多光谱相机的光谱分辨率相对较低&#xff0c;波段数一般在 10 到 20 个左右&#xff0c;光谱分辨率通常在几十纳米到几百纳米之间&#xff0c;如常见的多光谱相机光谱分辨率为 100nm 左右。 高光谱相机 一般的高光谱相机光谱分辨率可达 2.5nm 到 10nm 左右&#x…...

.Net8 Avalonia跨平台UI框架——<vlc:VideoView>控件播放海康监控、摄像机视频(Windows / Linux)

一、UI效果 二、新建用户控件&#xff1a;VideoViewControl.axaml 需引用&#xff1a;VideoLAN.LibVLC.Windows包 Linux平台需安装&#xff1a;VLC 和 LibVLC &#xff08;sudo apt-get update、sudo apt-get install vlc libvlccore-dev libvlc-dev&#xff09; .axaml 代码 注…...