自主项目面试点总结

news2025/2/12 10:21:20

1、许苑–OJ判题系统

技术栈:Spring Boot+Spring Cloud Alibaba+Redis+Mybatis+MQ+Docker
项目地址: https://github.com/xuyuan-upward/xyoj-backend-microservice

1.1、项目介绍:

一个基于微服务的OJ系统,具备能够根据管理员预设的题目用例对用户提交的代码进行执行和评测的能力。此外,还自主实现了代码沙箱,可作为独立服务供其他开发者调用。

1.2、主要工作:

1、为⽀持多种代码沙箱的创建,使⽤静态⼯⼚模式实现对代码沙箱调⽤的扩展,提高了系统可扩展性和可维护性。

1.1、通过静态工厂模式实现了远程代码沙箱或者本地代码沙箱调用
在这里插入图片描述

2、采用了策略模式封装判题逻辑,以解决不同判题模式的差异,提高系统的灵活性。

2.1、根据获取到的代码沙箱返回的配置信息以及输出结果进行使用Java策略算法判断还是其他语言判断代码的正确性
在这里插入图片描述
2.2、根据不同语言选择算判题策略在这里插入图片描述

3、 使⽤ Java Runtime类的exec⽅法编译和执⾏Java代码,通过Process类获取结果。

3.1、Runtime类进行命令的创建以及命令执行:
在这里插入图片描述
3.2、Process获取结果 :在这里插入图片描述在这里插入图片描述

4、为确保宿主机安全,利⽤Docker Java库创建隔离的容器环境执行代码。

4.1、引入docker库依赖

   <dependency>
            <groupId>com.github.docker-java</groupId>
            <artifactId>docker-java</artifactId>
            <version>3.3.0</version>
        </dependency>

4.2、获取Docker客户端实例

DockerClient dockerClient = DockerClientBuilder.getInstance("unix:///var/run/docker.sock").build();

通过DockerClientBuilder创建一个Docker客户端实例,用于与Docker守护进程通信。
unix:///var/run/docker.sock是Docker守护进程的Unix套接字路径。

4.3、拉取Docker镜像

if (!isPullImag) {
    PullImageCmd pullImageCmd = dockerClient.pullImageCmd(Image);
    PullImageResultCallback pullImageResultCallback = new PullImageResultCallback(){
        @Override
        public void onNext(PullResponseItem item) {
            System.out.println("下载镜像" + item.getStatus());
            super.onNext(item);
        }
    };
    pullImageCmd.exec(pullImageResultCallback).awaitCompletion();
    isPullImag = true;
}

如果镜像尚未拉取,则通过pullImageCmd拉取指定的Docker镜像。
PullImageResultCallback用于监听镜像拉取的进度和状态。
awaitCompletion()确保镜像拉取完成后才继续执行后续代码。

4.4、创建并启动Docker容器

CreateContainerCmd containerCmd = dockerClient.createContainerCmd(Image);
HostConfig hostConfig = new HostConfig();
hostConfig.withMemory(150 * 1000 * 1000L); // 限制内存为150MB
hostConfig.withMemorySwap(0L); // 禁用交换内存
hostConfig.withCpuCount(1L); // 限制CPU核数为1
hostConfig.setBinds(new Bind(userCodeParentPath, new Volume("/app"))); // 绑定主机目录到容器
CreateContainerResponse createContainerResponse = containerCmd
    .withHostConfig(hostConfig)
    .withNetworkDisabled(true) // 禁用网络
    .withReadonlyRootfs(true) // 只读文件系统
    .withAttachStdin(true) // 绑定标准输入
    .withAttachStderr(true) // 绑定标准错误
    .withAttachStdout(true) // 绑定标准输出
    .withTty(true) // 启用TTY
    .exec();
String containerId = createContainerResponse.getId();
dockerClient.startContainerCmd(containerId).exec();

创建容器时,配置了资源限制(内存、CPU)和安全性(禁用网络、只读文件系统)。
setBinds将主机目录绑定到容器内的/app目录,用于存放用户代码。
containerCmd.exec() 创建 Docker 容器,并通过createContainerResponse获取容器ID,然后通过dockerClient.startContainerCmd(containerId).exec(); 启动容器。

4.5、在容器中执行用户代码

String[] cmdArray = ArrayUtil.append(new String[]{"java", "-cp", "/app", "Main"}, inputArgsArray);
ExecCreateCmdResponse execCreateCmdResponse = dockerClient.execCreateCmd(containerId)
    .withCmd(cmdArray) // 设置执行的命令
    .withAttachStderr(true) // 绑定标准错误
    .withAttachStdin(true) // 绑定标准输入
    .withAttachStdout(true) // 绑定标准输出
    .exec();

构造执行命令,例如java -cp /app Main <inputArgs>

通过execCreateCmd在容器中创建执行命令,并获取命令的ID。

4.6、 捕获执行结果

ExecStartResultCallback execStartResultCallback = new ExecStartResultCallback() {
    @Override
    public void onNext(Frame frame) {
        StreamType streamType = frame.getStreamType();
        if (StreamType.STDERR.equals(streamType)) {
            errorMessage[0] = new String(frame.getPayload()); // 捕获错误输出
        } else {
            message[0] = new String(frame.getPayload()); // 捕获标准输出
        }
    }
};
dockerClient.execStartCmd(execId).exec(execStartResultCallback).awaitCompletion(TIME_OUT, TimeUnit.SECONDS);

通过ExecStartResultCallback 监听命令执行的输出:

  • 如果是 STDERR,表示发生错误,捕获错误信息。
  • 如果是 STDOUT,捕获程序正常输出。

4.7、监控内存使用

StatsCmd statsCmd = dockerClient.statsCmd(containerId);
ResultCallback<Statistics> statisticsResultCallback = statsCmd.exec(new ResultCallback<Statistics>() {
    @Override
    public void onNext(Statistics statistics) {
        maxMemory[0] = Math.max(statistics.getMemoryStats().getUsage(), maxMemory[0]); // 获取内存使用峰值
    }
});

通过statsCmd监控容器的内存使用情况,记录内存使用的峰值。

4.8、删除容器

dockerClient.stopContainerCmd(containerId).exec();
dockerClient.removeContainerCmd(containerId).exec();

执行完成后,停止并删除容器,释放资源。

5、为减少判题与服务模块之间的耦合,通过使⽤Rabbitmq技术进⾏解耦。

5.1、原因
原因:由于判题操作是一个比较重的服务(需要调用代码沙箱)然后判题服务监听到该队列的消息并进行判题处理,并且异步更改题目的判题状态。改造后的业务流程:用户提交题目时,由题目服务发送一条消息到队列
这样做的好处!

  • 对用户来说:不需要在前端同步等待,优化了体验。
  • 对系统来说:解耦了题目服务和判题服务,两者不需要相互调用。
    使判题服务繁忙或宕机,题目服务依然可以发送判题任务到队列,等判题服务恢复后继续处理

5.2、过程
1、首先进行Rabbitmq初始化交换机与队列根据路由键进行绑定,并创建成Spring的一个 bean 对象
在这里插入图片描述
2、在提交题目那里调用生产者进行发送消息
在这里插入图片描述
生产者发送消息:
在这里插入图片描述
进行消费者监听对应的队列,然后调用判题方法:
在这里插入图片描述

6、为保护服务同时简化客户端调用,项目通过Spring Cloud Gateway聚合路由服务。

在第7点下面的gateway

7、微服务体现,以及nacos配置中心。

7.1、引入对应的SpringBoot SpringCloud SpringCloud Alibaba版本依赖管理

 <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>2021.0.5</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${spring-cloud-alibaba.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

7.2、引入nacos依赖

        <!--nacos 配置和注册管理-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

7.3、进行引入SpringCloud的gateway依赖,以及微服务下knife4j的聚合

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>
        <!--用来实现knife4j文档聚合-->
        <dependency>
            <groupId>com.github.xiaoymin</groupId>
            <artifactId>knife4j-gateway-spring-boot-starter</artifactId>
            <version>4.3.0</version>
        </dependency>

7.4、路由配置规则的设定
在这里插入图片描述

2、许苑刷题阁

技术栈:Spring Boot+ElasticSearch+Mybatis+Nacos+Hotkey+SaToken+Sentinel
项目地址: https://github.com/xuyuan-upward/mianshiyuan

2.1、项目介绍:

一个在线刷题平台,平台⽀持管理员创建题库、批量管理题目,用户可以通过高效
的搜索引擎进⾏题目检索,在线做题。项目核⼼围绕性能优化、数据一致性和高并发场景进⾏
设计, 确保用户的刷题体验流畅且稳定。

2.2、主要工作:

1、为实现用户刷题记录功能,基于Redis BitMap+Redisson实现用户年度刷题记录的统

计,相⽐数据库存储节约⼏百倍空间。
1.1、使用Bitmap 位图,是一种使用位(bit)来表示数据的 紧凑 数据结构。每个位可以存储两个值:0 或 1,常用于表示某种状态或标志.。

优点:
1.节约内存空间:因为每个位仅占用1位内存,特别在大规模存储二值数据(如布尔值)时,节约效果明显。
2.查询效率高:通过位运算(如与、或、非等),可以快速判断某个元素是否存在。这使得查找操作非常高效,时间复杂度为 O(1)。

代码(签到):

// 获取 Redis 的 BitMap
        // RBisSet是Redisson库中的一种数据类型,它对应Redis中的位图
        RBitSet signInBitSet = redissonClient.getBitSet(key);
        // 获取当前日期是一年中的第几天,作为偏移量(从 1 开始计数)
        int offset = date.getDayOfYear();
        // 查询当天有没有签到
        if (!signInBitSet.get(offset)) {
            // 如果当前未签到,则设置
            signInBitSet.set(offset, true);
        }

代码(获取某年某个用户的签到信息):

   // 获取 Redis 的 BitSet
        RBitSet signInBitSet = redissonClient.getBitSet(key);
        // 加载 BitSet 到Java内存中,避免后续读取时发送多次请求
        BitSet bitSet = signInBitSet.asBitSet();
        // 统计签到的日期
        List<Integer> dayList = new ArrayList<>();
        // 从索引 0 开始查找下一个被设置为 1 的位
        int index = bitSet.nextSetBit(0);
        while (index >= 0) {
            dayList.add(index);
            // 继续查找下一个被设置为 1 的位
            index = bitSet.nextSetBit(index + 1);
        }
2、为提高题目搜索性能,采⽤Elasticsearch替代MySQL进⾏模糊查询,并通过定时任务,实现增量同步,保持数据一致性。

2.1、引入依赖

<!-- elasticsearch-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>

并通过注入elasticsearchRestTemplate即可进行Elasticsearch的操作

@Resource
private ElasticsearchRestTemplate elasticsearchRestTemplate;

2.2、集成类似操作数据库的 Dao 实体类一样
在这里插入图片描述
2.3、继承ElasticsearchRepository,此时可以类似mybatis那样操作 es 了

public interface    QuestionEsDao extends ElasticsearchRepository<QuestionEsDTO, Long> {

    List<QuestionEsDTO> findByUserId(Long userId);

2.4、并通过实现CommandLineRunner接口,项目启动时,实现MySQL全量同步到 ES。

2.5、开启定时任务,每分钟进行对5分中之前修改的数据进行增量数据同步
在这里插入图片描述

3、为防止高并发下瞬时流量击垮数据库,接⼊Hotkey缓存热⻔题目,提高性能和安全性。

3.1、工作流程:
JD HotKey 是京东提供了一个轻量级通用的热 key 探测中间件。

首先在 dashboard 中配置了热点 key的规则,并部署 worker 用于统计 key 的访问数量,在后端项目中引入jd client 上报热点 key 的访问给 worke进行统计访问数量,一旦达到指定的热点 key 规定阈值,worker 会推送热点 key 到client jar包的后端,后端进行caffeine本地缓存。

主要代码:

 String key = "bank_detail_" + id;
        // 如果是热点key
        if (JdHotKeyStore.isHotKey(key)) {
            // 从本地缓存中获取缓存值
            Object cacheQuestionBankVO = JdHotKeyStore.get(key);
            if (cacheQuestionBankVO != null) {
                return ResultUtils.success((QuestionBankVO) cacheQuestionBankVO);
            }
        }
        // 查询数据库
        QuestionBankVO questionBankVO = questionBankService.getQuestionBankVO(questionBank, request);
        // 设置本地缓存 如果是热点key了才会设置对应的缓存 否则不做任何处理
        JdHotKeyStore.smartSet(key, questionBankVO);

分析:基于isHotKey该方法会返回该 key 是否是热 key,如果是返回 true,如果不是返回 false,并且会将 key 上报到探测集群进行数量计算。该方法通常用于判断只需要判断 key 是否热、不需要缓存 value 的场景,如刷子用户、接口访问频率等。并基于get方法获取缓存,热key返回缓存,不是热key返回null。没有缓存通过此smartSet方法给热 key 赋值 value,如果是热 key,该方法才会赋值,非热 key,什么也不做。

本地缓存淘汰策略:

  1. 基于大小的淘汰
    最大缓存大小:缓存可以配置最大条目数。一旦条目数超过限制,(LRU)最少使用次数的条目将被淘汰。
  2. 基于时间的淘汰
    过期:缓存条目可以在一定时间后过期。这确保了过时、未使用的缓存条目会被自动移除。例如,可以将条目的过期时间配置为 10 分钟。
  3. 基于引用的淘汰
    弱引用或软引用:此策略基于内存压力淘汰条目,当 JVM 需要更多内存时,会移除不再被强引用的缓存条目。

黑马Redis教学图例:在这里插入图片描述

3.2、该JD Hotkey框架组成部分:

1、etcd集群
etcd作为一个高性能的配置中心,可以以极小的资源占用,提供高效的监听订阅服务。主要用于存放key规则配置,各worker的ip地址等。

2、client端jar包
就是在服务中添加的引用jar,引入后,就可以以便捷的方式去判断某key是否热key。同时,该jar完成了key上报、监听etcd里key的rule变化、以及拉取worker的ip、对热key进行本地caffeine缓存等。

3、worker端集群
worker端是一个独立部署的Java程序,启动后会连接etcd,并定期上报自己的ip信息,供client端获取地址并进行长连接。之后,主要就是对各个client发来的待测key进行累加计算,当达到etcd里设定的rule阈值后,将热key推送到各个client。

4、dashboard控制台
控制台是一个带可视化界面的Java程序,也是连接到etcd,之后在控制台设置各个APP的key规则,譬如2秒出现20次算热key。然后当worker探测出来热key后,会将key发往etcd,dashboard也会监听热key信息,进行入库保存记录。同时,dashboard也可以手工添加、删除热key,供各个client端监听。

4、为保护系统,通过Sentinel限流和熔断保护题库接口,异常时返回缓存数据。

4.1、什么是熔断?什么是限流?

  1. 熔断:熔断是指当调用的下游服务出现故障时,切断对该服务的调用,防止系统出现连锁故障。
    工作原理:
    • 健康检查:熔断器监控系统会检查与其他服务的连接情况,当调用某个服务频繁失败时,它会进入 打开 状态。
    • 打开状态:当熔断器处于打开状态时,所有对该服务的请求会切断,不会继续向故障的服务发送请求,从而避免进一步加重服务负担。
    • 恢复状态:熔断器会在一段时间后进入 半开 状态,允许少量请求通过,如果这些请求成功,熔断器会重新恢复到 关闭 状态,恢复正常调用。如果失败,熔断器会重新进入 打开 状态,继续拒绝请求。
    • 关闭状态:在没有问题时,熔断器保持关闭状态,正常传递请求。
  2. 限流:限流是指限制单位时间内对某个资源或服务的访问次数。
  3. 总结:熔断与限流可以同时使用,熔断器用于处理服务不可用的情况,而限流用于控制请求频率,保证系统的稳定运行。

4.2、项目示例运用:
Sentinel控制台部署
在这里插入图片描述
接入客户端用于和Sentinel进行通讯,引入依赖(SpringCloud Alibaba已经整合)

<!-- https://mvnrepository.com/artifact/com.alibaba.cloud/spring-cloud-starter-alibaba-sentinel -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
    <version>2021.0.5.0</version>
</dependency>

通过注解对listQuestionBankVOByPage资源进行保护定义:
在这里插入图片描述

 @SentinelResource(value = "listQuestionBankVOByPage",
            blockHandler = "handleBlockHandler",
    fallback = "handleFallback"
    )
    public BaseResponse<Page<QuestionBankVO>> listQuestionBankVOByPage(@RequestBody QuestionBankQueryRequest questionBankQueryRequest,
                                                               HttpServletRequest request)

(1)value = "listQuestionBankVOByPage"
定义资源名称,Sentinel 会监控 listQuestionBankVOByPage 方法的调用情况。因为题库是经常访问的,故将它定义为保护资源
可以在 Sentinel 控制台 配置 限流、熔断、降级规则。
(2)blockHandler = "handleBlockHandler"
当触发限流或熔断时,会执行 handleBlockHandler 方法,而不是直接抛出异常。
这个 handleBlockHandler 方法需要和原方法的参数一致,并且返回类型相同。
该方法不能和 listQuestionBankVOByPage 方法定义在不同的类中(除非是 static 方法)。
(3)fallback = "handleFallback"
当方法发生异常(例如超时、空指针等)时,会执行 handleFallback 方法,提供降级处理逻辑。
handleFallback 方法也需要和 listQuestionBankVOByPage 方法的参数列表一致,返回值类型相同。

5、为防止不同客⼾端账号共享,通过UserAgent识别设备,Sa-Token检测同端登录冲突。

在这里插入图片描述

这行代码的作用是 用户登录 并将当前用户与指定的设备进行绑定,实现同一用户在不同设备上的登录互斥。

StpUtil.login(user.getId(), DeviceUtils.getRequestDevice(request));

这行代码的作用是 将用户的登录状态存储到当前会话中,方便后续通过会话获取和使用用户信息。

StpUtil.getSession().set(USER_LOGIN_STATE, user);
6、为防止内容盗取,设计分级反爬⾍策略:使⽤Redis统计访问题目频率,超限时⾃动报警

和封禁用户。
getQuestionVOById次数进行限制。10抛出访问频繁,20次踢下线。

3、许苑园–寻找共同兴趣的伙伴

技术栈:Spring Boot+Redis+Mybatis+WebSocket+ChatGPT+Vue3
项目地址: https://github.com/xuyuan-upward/xuyuan-matching

3.1、项目介绍:

一个实时的社交聊天平台,致力于为用户寻找共同兴趣的学习伙伴。基于目的
实现了伙伴交流聊天室、按共同兴趣爱好标签检索伙伴、推荐相似伙伴、组队,聊天,
ChatGPT问答等功能。

3.2、主要工作:

1、为解决用户和群聊之间消息传输的延时性和滞后性,利⽤WebSocket全双⼯通信技术,实现了低延迟消息传递,保证了用户聊天之间的及时性。
2、为解决集群间登录态同步问题,使⽤Redis实现分布式Session,保证登录态同步。
3、为解决多用户出现的多线程问题,使⽤Redisson分布式锁保证线程安全。
4、为解决⾸次访问系统主⻚加载过慢的问题,使⽤ Spring Scheduler 定时任务来实现缓存预热,并通过分布式锁保证多机部署时定时任务不会重复执⾏。
5、为提高智能化交流,通过接⼊ChatGPT接⼝技术,实现了智能化回答⽣成。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2296779.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

idea Ai工具通义灵码,Copilot我的使用方法以及比较

我用过多个idea Ai 编程工具&#xff0c;大约用了1年时间&#xff0c;来体会他们那个好用&#xff0c;以下只是针对我个人的一点分享&#xff0c;不一定对你适用 仅作参考。 介于篇幅原因我觉得能说上好用的 目前只有两个 一个是阿里的通义灵码和Copilot&#xff0c;我用它来干…

4.python基础语法-下

文章目录 1.顺序语句2.条件语句 - if2.1什么是条件语句2.2语法格式2.2.1if2.2.2if - else2.2.3if - elif - else 2.3缩进和代码块2.4练习2.5空语句 pass 3.循环语句3.1while循环3.2for循环3.3continue3.4break 4.综合案例4.1设置初始属性4.2设置性别4.3设置出生点4.4针对每一岁…

Java--集合(理论)

目录 一、collection collection常用方法 1.List&#xff08;可以存在重复元素&#xff09; 迭代器 迭代器的概念 注意事项 例子 1.ArrayList 特点 2.LinkedLIst 特点 3.Vector 特点 2.Set&#xff08;无重复元素&#xff09; 1.HashSet 特点 2.Linkedhashset&…

3D图形学与可视化大屏: 3D 图形学的定义、应用领域和发展历程

一、3D 图形学的定义 3D 图形学是计算机科学的一个分支&#xff0c;主要研究如何在计算机上生成、处理和显示三维图形。它涉及到数学、物理学、计算机科学等多个学科领域&#xff0c;旨在通过计算机技术模拟真实世界中的三维物体和场景&#xff0c;为用户提供逼真的视觉体验。…

Python 面向对象(类,对象,方法,属性,魔术方法)

前言&#xff1a;在讲面向对象之前&#xff0c;我们先将面向过程和面向对象进行一个简单的分析比较&#xff0c;这样我们可以更好的理解与区分&#xff0c;然后我们在详细的讲解面向对象的优势。 面向过程&#xff08;Procedure-Oriented Programming&#xff0c;POP&#xff0…

轮子项目--消息队列的实现(3)

上一篇文章中我把一些关键的类以及表示出来&#xff0c;如何对这些类对应的对象进行管理呢&#xff1f;管理分为硬盘和内存上&#xff0c;硬盘又分为数据库&#xff08;管理交换机&#xff0c;队列和绑定&#xff09;和文件&#xff08;管理消息&#xff09;&#xff0c;本文就…

5.7.1 软件项目管理范围、成本估算、风险分析

文章目录 管理范围成本估算风险分析 管理范围 软件项目管理范围包含4P&#xff0c;即人员、产品、过程、项目。人员管理通过人员能力成熟度模型PCMM进行管理。产品管理需要制定产品目标&#xff0c;识别产品的总体目标&#xff0c;而不涉及细枝末节。产品范围&#xff0c;识别产…

Android新版高斯模糊(毛玻璃)官方实现,Kotlin

Android新版高斯模糊(毛玻璃)官方实现&#xff0c;Kotlin 从Android 12开始&#xff0c;Android官方API支持高斯模糊(毛玻璃)效果。关键是通过RenderEffect实现。 https://developer.android.com/reference/android/graphics/RenderEffecthttps://developer.android.com/refer…

仿 RabbitMQ 实现的简易消息队列

文章目录 项目介绍开放环境第三⽅库介绍ProtobufMuduo库 需求分析核⼼概念实现内容 消息队列系统整体框架服务端模块数据管理模块虚拟机数据管理模块交换路由模块消费者管理模块信道&#xff08;通信通道&#xff09;管理模块连接管理模块 客户端模块 公共模块日志类其他工具类…

实验9 基于WebGoat平台的SQL注入攻击

实验9 基于WebGoat平台的SQL注入攻击 1.实验目的 熟悉WebGoat平台&#xff0c;在该平台上实现SQL注入攻击。 2.实验内容 &#xff08;1&#xff09;下载webgoat-server-8.2.2.jar。 &#xff08;2&#xff09;搭建java环境。 &#xff08;3&#xff09;运行webgoat。 &#xf…

多光谱技术在华为手机上的应用发展历史

2018 年&#xff0c;华为 P20 系列首次搭载 5 通道色温传感器&#xff0c;可帮助手机在不同光照条件下保持画面色彩一致性。 2020 年&#xff0c;华为 P40 系列搭载 8 通道多光谱色温传感器&#xff08;实际为 11 通道&#xff0c;当时只用 8 个通道检测可见光&#xff09;&am…

如何免费白嫖 Deepseek API 接口

今天我将教大家如何利用网络空间测绘搜索引擎「Fofa」来寻找已经部署并开放 Deepseek 接口的服务。以下是详细步骤&#xff1a; 1. 访问 Fofa 搜索引擎 首先&#xff0c;打开 Fofa 搜索引擎的网站&#xff1a;https://fofa.info 2. 搜索开放的 Deepseek 接口 在搜索框中输入…

SaaS+AI应用架构:业务场景、智能体、大模型、知识库、传统工具系统

SaaSAI应用架构&#xff1a;业务场景、智能体、大模型、知识库、传统工具系统 大家好&#xff0c;我是汤师爷~ 在SaaS与AI应用的演进过程中&#xff0c;合理的架构设计至关重要。本节将详细介绍其五个核心层次&#xff1a; 业务场景层&#xff1a;发现和确定业务场景智能体层…

ios通过xib创建控件

之前写过ios动态创建控件及添加事件&#xff0c;纯手工代码写控件&#xff0c;虽然比较灵活&#xff0c;但是就是代码量比较多。这次我们通过xib来创建app下载列表项 AppView.xib。一个imageview,一个label,一个button构成 1.创建AppView.xib 2.再创建xib对应的mode&#xff0…

【树莓派Pico设备驱动】-WS2812B全彩LED驱动(基于SPI)

WS2812B全彩LED驱动(基于SPI) 文章目录 WS2812B全彩LED驱动(基于SPI)1、WS2812介绍2、WS2812配置4、驱动实现1、WS2812介绍 WS2812/WS2812B LED 使用 24 位来表示绿色、红色和蓝色值。 WS2812采用单线通信的设计,通信协议为非归零编码,每个LED需要24个bit的数据,数据依…

AIGC-微头条爆款文案创作智能体完整指令(DeepSeek,豆包,千问,Kimi,GPT)

Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列AIGC(GPT、DeepSeek、豆包、千问、Kimi)👉关于作者 专注于Android/Unity和各种游戏开发技巧,以及各种资…

2025届优秀创新大数据毕业设计

吊打导师的大数据毕业设计项目 985华南理工大学学长 大厂全栈&#xff0c;大数据开发工程师 专注定制化开发

解决 ComfyUI-Impact-Pack 中缺少 UltralyticsDetectorProvider 节点的问题

解决 ComfyUI-Impact-Pack 中缺少 UltralyticsDetectorProvider 节点的问题 1. 安装ComfyUI-Impact-Pack 首先确保ComfyUI-Impact-Pack 已经下载 地址: https://github.com/ltdrdata/ComfyUI-Impact-Pack 2. 安装ComfyUI-Impact-Subpack 由于新版本的Impact Pack 不再提供这…

SpringBoot中的Javaconfig

为什么要使用Javaconfig&#xff1f; 如果要声明的bean对象&#xff0c;来自于第三方jar包&#xff08;不是自定义的&#xff09;&#xff0c;无法使用Component 及衍生注解来声明bean&#xff0c;因为第三方的jar一般不可写&#xff0c;需要使用注解Configuration和Bean注解来…

【前端】几种常见的跨域解决方案代理的概念

几种常见的跨域解决方案&代理的概念 一、常见的跨域解决方案1. 服务端配置CORS&#xff08;Cross-Origin Resource Sharing&#xff09;&#xff1a;2. Nginx代理3. Vue CLI配置代理&#xff1a;4 .uni-app在manifest.json中配置代理来解决&#xff1a;5. 使用WebSocket通讯…