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

Day4 C语言与画面显示练习

文章目录

      • 1. harib01a例程
      • 2. harib01b例程
      • 3. harib01e例程
      • 4. harib01f例程
      • 5. harib01h例程

1. harib01a例程

上一章主要是将画面搞成黑屏,如果期望做点什么图案,只需要再VRAM里写点什么就好了,使用nask汇编语言实现一个函数write_mem8,定义在naskfunc.nas文件中,用来对指定内存地址写入内容。

	GLOBAL	_write_mem8		; 同样需要在GLOBAL标签下添加一个函数名,并下划线前缀
_write_mem8:	; void write_mem8(int addr, int data);MOV		ECX,[ESP+4]		; [ESP+4]中存放的是第一个参数addr,将该地址读到ECX寄存器中MOV		AL,[ESP+8]		; [ESP+8]中存放的是第二个参数data,将该数据读到AL寄存器中MOV		[ECX],ALRET

该函数相当于汇编语言MOV BYTE[addr], data。与c语言联合使用的话,可以被自由使用的寄存器只有EAX,ECX和EDX,其他寄存器只能读,不可写。
此外,还在naskfunc.nas文件中,头部位置,添加了一条INSTRSET指令:

[INSTRSET "i486p"]		; 指定486的Intel系列 CPU指令

该指令用于告诉编译器汇编器nask,本程序是用作486的,EAX是一个寄存器,而不是一个随手定义的label。因为8086时代,可能存在EAX最为一个label的情况。英特尔系列CPU的发展是这样的:8086 -> 80186 -> 286 -> 386 -> 486 -> Pentium -> PentiumPro -> Pentium II -> Pentium III -> Pentium4 -> …。到286为止是16位,386开始就是32位了。
当前又存在了一个写内存的函数,修改bootpack.c为:

// bootpack.c
void io_hlt(void);
void write_mem8(int addr, int data);void HariMain(void)
{int i = 0;for (i = 0xa0000; i <= 0xaffff; i++) {/* MOV BYTE [i],15 */write_mem8(i, 15);	// 对显卡写入第15(hex表示为0x0f)种颜色,白色}for (;;) {io_hlt();}
}

至于为啥在0xa0000地址开始写内容,可以参考Day3的“6. harib00h例程”章节。
编译并执行之后会显示一个白屏:
在这里插入图片描述

2. harib01b例程

把harib01a例程运行的白屏效果变为条纹效果。

仅修改write_mem8函数调用传入的第二个参数:

	for (i = 0xa0000; i <= 0xaffff; i++) {write_mem8(i, i & 0x0f);	// 往i地址中写入 i&0x0f}
  • 使特定bit为1,使用OR按位或运算|。
  • 使特定bit为0,使用AND按位与运算&。
  • 使特定bit反转,使用XOR按位异或运算^。

本次代码中使用i和0x0f进行AND运算,高4bits全部为0,低4bits保留不变。编译并运行的效果是:
在这里插入图片描述

3. harib01e例程

使用指针可以写成

	char *p = (char *) 0xa0000;for (i = 0; i <= 0xffff; i++) {// *(p + i) = i & 0x0f;p[i] = i & 0x0f;}

由于*(p+i) 与p[i]等价,因此也与 *(i+p),所以p[i]也可以写成i[p]。

4. harib01f例程

调色板(palette):用8bits的颜色名来表示24bits种类的颜色,例如2号(8bits)颜色就是#ff0000(亮红),3号颜色就是#00ff0(亮绿)。对以下这几种颜色编号:
在这里插入图片描述
开始描绘有色彩的操作系统,修改bootpack.c文件:

void io_hlt(void);
void io_cli(void);					// 禁止中断,将中断许可标志设置为0
void io_out8(int port, int data);	// 往指定装置写数据
int io_load_eflags(void);			// 读取最初的eflags值
void io_store_eflags(int eflags);	// 恢复中断许可void init_palette(void);
void set_palette(int start, int end, unsigned char *rgb);void HariMain(void)
{int i; char *p; init_palette(); /* 调用初始化调色板 */p = (char *) 0xa0000; for (i = 0; i <= 0xffff; i++) {p[i] = i & 0x0f;		// 绘制条纹图案}for (;;) {io_hlt();}
}void init_palette(void)
{static unsigned char table_rgb[16 * 3] = {0x00, 0x00, 0x00,	/*  0:黑 */0xff, 0x00, 0x00,	/*  1:亮红 */0x00, 0xff, 0x00,	/*  2:亮绿 */0xff, 0xff, 0x00,	/*  3:亮黄 */0x00, 0x00, 0xff,	/*  4:亮蓝 */0xff, 0x00, 0xff,	/*  5:亮紫 */0x00, 0xff, 0xff,	/*  6:浅亮紫 */0xff, 0xff, 0xff,	/*  7:白 */0xc6, 0xc6, 0xc6,	/*  8:亮灰 */0x84, 0x00, 0x00,	/*  9:暗红 */0x00, 0x84, 0x00,	/* 10:暗绿 */0x84, 0x84, 0x00,	/* 11:暗黄 */0x00, 0x00, 0x84,	/* 12:暗青 */0x84, 0x00, 0x84,	/* 13:暗紫 */0x00, 0x84, 0x84,	/* 14:浅暗蓝 */0x84, 0x84, 0x84	/* 15:暗灰 */};set_palette(0, 15, table_rgb);return;
}void set_palette(int start, int end, unsigned char *rgb)
{int i, eflags;eflags = io_load_eflags();	/* 记录中断许可标志的值 */io_cli(); 					/* 将中断许可标志设置为0 */io_out8(0x03c8, start);		/* 往指定装置写数据 */for (i = start; i <= end; i++) {io_out8(0x03c9, rgb[0] / 4);io_out8(0x03c9, rgb[1] / 4);io_out8(0x03c9, rgb[2] / 4);rgb += 3;}io_store_eflags(eflags);	/* 复原中断许可标志 */return;
}

CPU的管脚与内存相连,以完成计算和存储的功能。此外,还要与其他设备相连(例如,对键盘输入有相应,通过网卡从网络取得信息,通过声卡发送音乐数据,向软盘写信息等)。CPU向设备发出电信号的是OUT指令,从设备取得电信号的是IN指令。在两种指令中,为了区别不同的设备,也需要使用设备的号码(称为“port”,意为港口),可以理解为CPU与设备交换信号的行为类似于船舶的出港和进港。
代码中的0x03c8和0x03c9正是访问调色板需要访问的必要port。调色板的访问步骤:

  • 首先在一连串的访问中屏蔽中断(CLI)。
  • 将期望设定的调色板号码写入0x03c8,然后按照R G B顺序写入0x03c9。如果还想继续设定下一个调色板,则省略调色板号码,接着按照R G B顺序写入0x03c9即可。
  • 如果期望读出当前调色板的状态,首先将调色板号码写入0x03c7,在从0x03c9处读取3次,读出的顺序就是R G B。如果还想继续读出下一个调色板,同样忽略调色板号码的设定,接着按照R G B顺序读出。
  • 如果最初执行了屏蔽中断CLI,则最后需要恢复中断STI。

CLI屏蔽中断,就是将中断标志置为0的指令,即忽略中断请求;STI就是将中断标志置为1的指令,即处理中断请求。
可以通过一个FLAGS或EFLAGS(extend FLAGS,扩展的32位寄存器)寄存器查看中断标志和进位标志等。虽然进位标志标志可以通过JC或JNC指令简单判断,但是中断标志没有对应的间接读取指令。FLAGS中0bit是进位标志,9bit是中断标志。
在这里插入图片描述
在naskfunc.nas中实现常用的基础函数:

; naskfunc
; TAB=4[FORMAT "WCOFF"]				; 制作目标文件的模式
[INSTRSET "i486p"]				; 使用486支持的指令
[BITS 32]						; 适用于32位机器
[FILE "naskfunc.nas"]			; 源程序文件名GLOBAL	_io_hlt, _io_cli, _io_sti, _io_stihltGLOBAL	_io_in8,  _io_in16,  _io_in32GLOBAL	_io_out8, _io_out16, _io_out32GLOBAL	_io_load_eflags, _io_store_eflags[SECTION .text]_io_hlt:	; void io_hlt(void);HLTRET_io_cli:	; void io_cli(void);CLIRET_io_sti:	; void io_sti(void);STIRET_io_stihlt:	; void io_stihlt(void);STIHLTRET_io_in8:	; int io_in8(int port);MOV		EDX,[ESP+4]		; portMOV		EAX,0IN		AL,DXRET_io_in16:	; int io_in16(int port);MOV		EDX,[ESP+4]		; portMOV		EAX,0IN		AX,DXRET_io_in32:	; int io_in32(int port);MOV		EDX,[ESP+4]		; portIN		EAX,DXRET_io_out8:	; void io_out8(int port, int data);MOV		EDX,[ESP+4]		; portMOV		AL,[ESP+8]		; dataOUT		DX,ALRET_io_out16:	; void io_out16(int port, int data);MOV		EDX,[ESP+4]		; portMOV		EAX,[ESP+8]		; dataOUT		DX,AXRET_io_out32:	; void io_out32(int port, int data);MOV		EDX,[ESP+4]		; portMOV		EAX,[ESP+8]		; dataOUT		DX,EAXRET_io_load_eflags:	; int io_load_eflags(void);PUSHFD		; PUSH EFLAGS POP		EAXRET_io_store_eflags:	; void io_store_eflags(int eflags);MOV		EAX,[ESP+4]PUSH	EAXPOPFD		; POP EFLAGSRET

能够读写EFLAGS的指令只有PUSHFD(push flags double-words)和POPFD(pop flags double-words),即将标志按4字节压入或弹出栈,MOV指令不可用。
代码中PUSHFD POP EXA就类似MOV EXA, EFLAGS,与之对应,PUSH EXA POPFD就类似MOV EFLAGS, EXA
_io_load_eflags函数是一个具有返回值的函数,当执行RET指令时,EXA寄存器的值被用作返回。
此时执行的效果,颜色变得更丰富了:
在这里插入图片描述

5. harib01h例程

在当前的画面模式中,画面上有320*200(=64000)个像素点,假设左上点的坐标为(0,0),则右下角的坐标为(319,199)。因此,像素(x, y)对应的VRAM地址为0xa0000 + x + y*320。其他的画面模式也类似,差别只在起始地址和y的系数。
根据这个计算公式的规律就可以对像素点对应的地址设置颜色:

void io_hlt(void);
void io_cli(void);
void io_out8(int port, int data);
int io_load_eflags(void);
void io_store_eflags(int eflags);// 初始化调色板,无画图
void init_palette(void);
// 设置调色板,被初始化函数调用
void set_palette(int start, int end, unsigned char *rgb);
// 画图,对显卡赋值
void boxfill8(unsigned char *vram, int xsize, unsigned char c, int x0, int y0, int x1, int y1);#define COL8_000000		0
#define COL8_FF0000		1
#define COL8_00FF00		2
#define COL8_FFFF00		3
#define COL8_0000FF		4
#define COL8_FF00FF		5
#define COL8_00FFFF		6
#define COL8_FFFFFF		7
#define COL8_C6C6C6		8
#define COL8_840000		9
#define COL8_008400		10
#define COL8_848400		11
#define COL8_000084		12
#define COL8_840084		13
#define COL8_008484		14
#define COL8_848484		15void HariMain(void)
{char *vram = (char *) 0xa0000;;int xsize = 320;int ysize = 200;init_palette();boxfill8(vram, xsize, COL8_008484,  0,         0,          xsize -  1, ysize - 29);boxfill8(vram, xsize, COL8_C6C6C6,  0,         ysize - 28, xsize -  1, ysize - 28);boxfill8(vram, xsize, COL8_FFFFFF,  0,         ysize - 27, xsize -  1, ysize - 27);boxfill8(vram, xsize, COL8_C6C6C6,  0,         ysize - 26, xsize -  1, ysize -  1);boxfill8(vram, xsize, COL8_FFFFFF,  3,         ysize - 24, 59,         ysize - 24);boxfill8(vram, xsize, COL8_FFFFFF,  2,         ysize - 24,  2,         ysize -  4);boxfill8(vram, xsize, COL8_848484,  3,         ysize -  4, 59,         ysize -  4);boxfill8(vram, xsize, COL8_848484, 59,         ysize - 23, 59,         ysize -  5);boxfill8(vram, xsize, COL8_000000,  2,         ysize -  3, 59,         ysize -  3);boxfill8(vram, xsize, COL8_000000, 60,         ysize - 24, 60,         ysize -  3);boxfill8(vram, xsize, COL8_848484, xsize - 47, ysize - 24, xsize -  4, ysize - 24);boxfill8(vram, xsize, COL8_848484, xsize - 47, ysize - 23, xsize - 47, ysize -  4);boxfill8(vram, xsize, COL8_FFFFFF, xsize - 47, ysize -  3, xsize -  4, ysize -  3);boxfill8(vram, xsize, COL8_FFFFFF, xsize -  3, ysize - 24, xsize -  3, ysize -  3);for (;;) {io_hlt();}
}void boxfill8(unsigned char *vram, int xsize, unsigned char c, int x0, int y0, int x1, int y1)
{int x, y;for (y = y0; y <= y1; y++) {for (x = x0; x <= x1; x++)vram[y * xsize + x] = c;}return;
}

使用boxfill8函数代替最初的for循环绘制条纹,最终的效果是:
在这里插入图片描述

相关文章:

Day4 C语言与画面显示练习

文章目录 1. harib01a例程2. harib01b例程3. harib01e例程4. harib01f例程5. harib01h例程 1. harib01a例程 上一章主要是将画面搞成黑屏&#xff0c;如果期望做点什么图案&#xff0c;只需要再VRAM里写点什么就好了&#xff0c;使用nask汇编语言实现一个函数write_mem8&#…...

【redis】全局命令exists、del、expire、ttl(惰性删除和定期删除)

exists——判定 key 是否存在 语法&#xff1a; exists key [key...] # 返回值&#xff1a;key 存在的个数针对多个 key 来说&#xff0c;是非常有用的时间复杂度 O ( 1 ) O(1) O(1) Redis 组织这些 key 就是按照哈希表的方式来组织的。Redis 支持很多数据结构指的是 value …...

VUE3项目的文档结构分析

1. Vue 3 项目的文档结构 Vue 3 项目通常基于 Vue CLI 或 Vite 等工具创建&#xff0c;其文档结构如下&#xff1a; 常见目录结构 my-vue-project/ ├── public/ # 静态资源目录 │ ├── index.html # 入口页面 ├── src/ …...

Linux笔记---自定义shell

目录 前言 1. 程序框架 2. 打印命令行提示符 2.1 获取用户名(GetUserName) 2.2 获取主机名(GetHostName) 2.3 获取工作目录(GetPwd) 3. 获取命令行输入 4. 判断是否有重定向 5. 解析命令行 6. 内建命令 6.1 内建命令的特点 6.2 常见内建命令 6.3 内建命令 vs 外部命…...

步进电机软件细分算法解析与实践指南

1. 步进电机细分技术概述 步进电机是一种将电脉冲信号转换为角位移的执行机构&#xff0c;其基本运动单位为步距角。传统步进电机的步距角通常为 1.8&#xff08;对应 200 步 / 转&#xff09;&#xff0c;但在高精度定位场景下&#xff0c;这种分辨率已无法满足需求。细分技术…...

mapbox开发小技巧

自定义图标 // 1、单个图标 const url ./static/assets/symbols/code24x24/VIDEO.png // 图标路径 map.loadImage(url ,(error, image) > {if (error) throw errormap.addImage(video-icon, image) })// 2、雪碧图利用canvas // json和png图片 function getStyleImage(fil…...

ApoorvCTF Rust语言逆向实战

上周参加了国外的比赛&#xff0c;名称叫&#xff1a;ApoorvCTF 看一下老外的比赛跟我们有什么不同&#xff0c;然后我根据国内比赛对比发现&#xff0c;他们考点还是很有意思的&#xff0c;反正都是逆向&#xff0c;哈哈哈 Rusty Vault 题目描述&#xff1a; In the heart…...

IntersectionObserver接口介绍

IntersectionObserver API 是浏览器提供的一个用于异步观察目标元素与其祖先元素或视口&#xff08;Viewport&#xff09;交叉状态&#xff08;即是否进入或离开视口&#xff09;的接口。在 IntersectionObserver 出现之前&#xff0c;开发者通常需要通过监听 scroll 事件或使用…...

AI壁纸进阶宝典:让创作效率与质量飞速提升的法门

在数字化创意浪潮席卷的当下&#xff0c;AI壁纸以其独特魅力和无限可能&#xff0c;吸引了众多设计爱好者和专业设计师的目光。然而&#xff0c;如何在众多创作者中脱颖而出&#xff0c;打造令人惊艳的AI壁纸呢&#xff1f;本文将从基础到进阶&#xff0c;全方位剖析AI壁纸创作…...

Releases(发布) 和 版本管理 是两个紧密相关的概念

在软件开发和维护中,Releases(发布) 和 版本管理 是两个紧密相关的概念,特别是在开源项目或企业软件开发中。 1. Releases(发布) Release 是指软件的一个正式发布版本,通常经过开发、测试、修复 Bug,并被认为是足够稳定和可用于生产环境的版本。 主要特点 里程碑:通…...

从零开始用react + tailwindcss + express + mongodb实现一个聊天程序(十二) socketio 消息处理

1.后端 在message.controller.js中 在sendMessage方法中 每当我们发送消息 需要socketio把这个消息转发给 接收人 加入转发逻辑 // 把消息发给指定的用户的socket const receiverSocketId getReceiverSocketId(receiverId); if(receiverSocketId) { io.to(receiverSocket…...

【运维篇】KubeSphere-02(经验汇总)

一、使用建议 1.对于数据库、对像存储比较重的要不能丢失&#xff0c;有异地存储备份需求的有状态服务&#xff0c;不建议采用k8s进行部署&#xff0c;会导致运维难度更大。 2.对于中间件如redis、MQ、harbor、seata、nacos、zookeeper可采用k8s部署。 3.对于无状态服务tomc…...

8.大模型微调学习案例:基于 Hugging Face、8位量化与 LoRA 适配器的方案

文章目录 一、引言二、数据预处理与构建数据集2.1 加载 JSON 数据2.2 构造训练样本2.3 构建 Hugging Face 数据集与分词2.4 添加标签字段2.5 划分训练集与验证集 三、模型加载、量化与适配器配置3.1 配置设备与显存使用3.2 配置 8 位量化3.3 加载预训练模型并映射设备3.4 为 8 …...

用分页干掉显存浪费!聊聊VLLM的PagedAttention

不知道你在部署模型的时候&#xff0c;有没有经历过这样的抓狂时刻——跑大模型时显卡显存明明没有占满&#xff0c;程序却报错OOM&#xff08;内存不足&#xff09;&#xff1f;表面看是显存不足&#xff0c;背后其实是KVCache碎片化和重复存储这个"隐形刺客"在作祟…...

Python——地图可视化

分级统计地图&#xff1a;一般使用同一种颜色表示一个区域的属性&#xff0c;常用与选举和人口普查数据的可视化。对于颜色的选择可以使用单色渐变系、双向渐变系、完整色谱变化。 使用这类颜色渐变进行填充存在的问题&#xff1a; 使用这类方法适用于数据密集分布的区域&#…...

3.8【Q】cv

这个draw_line函数的逻辑和功能是什么&#xff1f;代码思路是什么&#xff1f;怎么写的&#xff1f; 这个t是什么&#xff1f;t.v[0]和t.v[1],[2]又是什么&#xff1f; void rst::rasterizer::draw(rst::pos_buf_id pos_buffer, rst::ind_buf_id ind_buffer, rst::Primitive ty…...

LeetCode 热题 100_字符串解码(71_394_中等_C++)(栈)

LeetCode 热题 100_字符串解码&#xff08;71_394&#xff09; 题目描述&#xff1a;输入输出样例&#xff1a;题解&#xff1a;解题思路&#xff1a;思路一&#xff08;栈&#xff09;&#xff1a; 代码实现代码实现&#xff08;栈&#xff09;&#xff1a;以思路一为例进行调…...

基于大模型预测的新型隐球菌脑膜炎综合诊疗研究报告

目录 一、引言 1.1 研究背景与目的 1.2 研究现状综述 二、大模型预测原理及数据基础 2.1 大模型技术简介 2.2 数据收集与预处理 2.3 模型训练与验证 三、术前风险预测与准备 3.1 病情评估指标确定 3.2 手术方案制定 3.3 麻醉方案规划 四、术中监测与应对 4.1 实时…...

SQL Server核心知识总结

SQL Server核心知识总结 &#x1f3af; 本文总结了SQL Server核心知识点,每个主题都提供实际可运行的示例代码。 一、SQL Server基础精要 1. 数据库核心操作 -- 1. 创建数据库&#xff08;核心配置&#xff09; CREATE DATABASE 学生管理系统 ON PRIMARY (NAME 学生管理系统…...

浏览器WEB播放RTSP

注意&#xff1a;浏览器不能直接播放RTSP&#xff0c;必须转换后才能播放。这一点所有的播放都是如此。 参考 https://github.com/kyriesent/node-rtsp-stream GitHub - phoboslab/jsmpeg: MPEG1 Video Decoder in JavaScript 相关文件方便下载 https://download.csdn.net…...

登录固定账号和密码:

接口文档 【apifox】面试宝典 个人中心-保存用户数据信息 - 教学练测项目-面试宝典-鸿蒙 登录固定账号和密码&#xff1a; 账号&#xff1a;hmheima 密码&#xff1a;Hmheima%123 UI设计稿 【腾讯 CoDesign】面试宝典 CoDesign - 腾讯自研设计协作平台 访问密码&#xff1…...

深度学习/强化学习调参技巧

深度调优策略 1. 学习率调整 技巧&#xff1a;学习率是最重要的超参数之一。过大可能导致训练不稳定&#xff0c;过小则收敛速度慢。可以使用学习率衰减&#xff08;Learning Rate Decay&#xff09;或自适应学习率方法&#xff08;如Adam、RMSprop&#xff09;来动态调整学习…...

Java常用正则表达式(身份证号、邮箱、手机号)格式校验

目录 身份证号的正则表达式 代码解释 正则表达式 方法 isValidIDCard 注意事项 校验邮箱的正则表达式 代码解释 正则表达式 方法 isValidEmail 注意事项 手机号的正则表达式 中国大陆手机号校验&#xff08;支持空字符串&#xff09; 代码解释 通用手机号校验&am…...

1.12.信息系统的分类【ES】

专家系统&#xff08;ES&#xff09;技术架构深度解析 一、ES核心定义 &#x1f9e0; 智能决策中枢 由三大核心能力构建的领域专家模拟系统&#xff1a; 存储专家级领域知识&#xff08;10^4规则量级&#xff09;支持不确定性推理&#xff08;置信度>85%&#xff09;动态…...

c语言程序设计--(结构体、共用体)冲刺考研复试中的面试问答,来看看我是怎么回答的吧!

结构体 1、谈谈你对结构体的理解。 答&#xff0c;首先在结构的基础知识上&#xff0c;结构是一些值的集合&#xff0c;这些值称为成员变量结构的每个成员可以是不同类型的变量。结构体其实就是把&#xff08;一些单一类型的数据&#xff09;不同类型的数据组合在一起的做法便…...

闭包:JavaScript 中的隐形大杀器

你可能已经在很多地方听说过闭包这个词&#xff0c;尤其是涉及到 JavaScript 的作用域和异步操作时。闭包是 JavaScript 中非常核心的概念&#xff0c;然而它又非常容易让开发者感到困惑。今天我们就来深入剖析闭包&#xff0c;帮助你真正理解它的工作原理&#xff0c;以及如何…...

分布式锁—7.Curator的分布式锁一

大纲 1.Curator的可重入锁的源码 2.Curator的非可重入锁的源码 3.Curator的可重入读写锁的源码 4.Curator的MultiLock源码 5.Curator的Semaphore源码 1.Curator的可重入锁的源码 (1)InterProcessMutex获取分布式锁 (2)InterProcessMutex的初始化 (3)InterProcessMutex.…...

linux---天气爬虫

代码概述 这段代码实现了一个天气查询系统&#xff0c;支持实时天气、未来天气和历史天气查询。用户可以通过终端菜单选择查询类型&#xff0c;并输入城市名称来获取相应的天气信息。程序通过 TCP 连接发送 HTTP 请求&#xff0c;并解析返回的 JSON 数据来展示天气信息。 #in…...

C++蓝桥杯基础篇(九)

片头 嗨&#xff01;小伙伴们&#xff0c;大家好~ 今天我们将学习蓝桥杯基础篇&#xff08;十&#xff09;&#xff0c;学习函数相关知识&#xff0c;准备好了吗&#xff1f;咱们开始咯&#xff01; 一、函数基础 一个典型的函数定义包括以下部分&#xff1a;返回类型、函数名…...

Java Spring MVC (2)

常见的Request Controller 和 Response Controller 的区别 用餐厅点餐来理解 想象你去一家餐厅吃饭&#xff1a; Request Controller&#xff08;接单员&#xff09;&#xff1a;负责处理你的点餐请求&#xff0c;记录你的口味、桌号等信息。Response Controller&#xff08…...

Elasticsearch:使用 BigQuery 提取数据

作者&#xff1a;来自 Elastic Jeffrey Rengifo 了解如何使用 Python 在 Elasticsearch 中索引和搜索 Google BigQuery 数据。 BigQuery 是 Google 的一个平台&#xff0c;允许你将来自不同来源和服务的数据集中到一个存储库中。它还支持数据分析&#xff0c;并可使用生成式 AI…...

接口-菜品分页查询

业务内容 页面上菜品根据菜品名称、菜品分类、售卖状态三个字段进行分页查询。 在请求参数中携带了菜品名称、菜品分类、售卖状态三个字段参数。 返回PageResult类型的实体。 注意&#xff1a;在返回数据中在records下有个categoryName&#xff0c;这个字段的内容在category…...

springboot3 RestClient、HTTP 客户端区别

1 RestClient使用 RestClient 是 Spring 6.1 M2 中引入的同步 HTTP 客户端&#xff0c;它取代了 RestTemplate。同步 HTTP 客户端以阻塞方式发送和接收 HTTP 请求和响应&#xff0c;这意味着它会等待每个请求完成后才继续下一个请求。本文将带你了解 RestClient 的功能以及它与…...

自我训练模型:通往未来的必经之路?

摘要 在探讨是否唯有通过自我训练模型才能掌握未来的问题时&#xff0c;文章强调了底层技术的重要性。当前&#xff0c;许多人倾向于关注应用层的便捷性&#xff0c;却忽视了支撑这一切的根本——底层技术。将模型简单视为产品是一种短视行为&#xff0c;长远来看&#xff0c;理…...

RuoYi框架添加自己的模块(学生管理系统CRUD)

RuoYi框架添加自己的模块&#xff08;学生管理系统&#xff09; 框架顺利运行 首先肯定要顺利运行框架了&#xff0c;这个我不多说了 设计数据库表 在ry数据库中添加表tb_student 表字段如图所示 如图所示 注意id字段是自增的 注释部分是后面成功后前端要展示的部分 导入…...

linux查看python版本

1.查看Linux是否安装python yum list all | grep python 2.Linux安装python yum install python 3.Linux查看python版本 python -V...

算法题(89):单项链表

审题&#xff1a; 本题需要我们实现一个可以执行三个指令的数据结构来解决这里的问题 思路&#xff1a; 方法一&#xff1a;利用数组模拟链表 由于这里涉及插入删除操作&#xff0c;所以我们不能使用数组结构存储数据&#xff0c;这样子会超时&#xff0c;所以我们就利用数组来…...

开源之夏经验分享|Koupleless 社区黄兴抗:在开源中培养工程思维

开源之夏经验分享&#xff5c;Koupleless 社区黄兴抗&#xff1a;在开源中培养工程思维 文|黄兴抗 电子信息工程专业 Koupleless 社区贡献者 就读于南昌师范学院&#xff0c;电子信息工程专业的大三学生。 本文 2634 字&#xff0c;预计阅读 7​ 分钟​ 今天 SOFAStack 邀…...

体验开源openeuler openharmony stratovirt模拟器

文档 openeuler社区面向数字基础设施的开源操作系统 openharmony社区 OpenHarmony是由开放原子开源基金会&#xff08;OpenAtom Foundation&#xff09;孵化及运营的开源项目, 目标是面向全场景、全连接、全智能时代、基于开源的方式&#xff0c;搭建一个智能终端设备操作系统…...

【AI实践】基于TensorFlow/Keras的CNN(卷积神经网络)简单实现:手写数字识别的工程实践

深度神经网络系列文章 【AI深度学习网络】卷积神经网络&#xff08;CNN&#xff09;入门指南&#xff1a;从生物启发的原理到现代架构演进【AI实践】基于TensorFlow/Keras的CNN&#xff08;卷积神经网络&#xff09;简单实现&#xff1a;手写数字识别的工程实践 引言 在深度…...

深入探讨AI-Ops架构 第一讲 - 运维的进化历程以及未来发展趋势

首先&#xff0c;让我们一起回顾运维的进化之路&#xff0c;然后再深入探讨AI-Ops架构的细节。 运维的进化历程 1. AI 大范围普及前的运维状态 (传统运维) 在AI技术尚未广泛渗透到运维领域之前&#xff0c;我们称之为传统运维&#xff0c;其主要特点是&#xff1a; 人工驱动…...

2025年全球生成式AI消费应用发展趋势报告

原文链接&#xff1a;The Top 100 Gen AI Consumer Apps - 4th Edition | Andreessen Horowitz 核心要点&#xff1a;本报告由a16z发布&#xff0c;深度解析了2025年全球生成式AI消费应用的发展格局&#xff0c;揭示了技术迭代与商业化加速的双重趋势。 报告显示&#xff0c;A…...

VBA 列方向合并单元格,左侧范围大于右侧范围

实现功能如下&#xff1a; excel指定行列范围内的所有单元格 规则1&#xff1a;每一列的连续相同的值合并单元格 规则2&#xff1a;每一列的第一个非空单元格与其下方的所有空白单元格合并单元 规则3&#xff1a;优先左侧列合并单元格&#xff0c;合并后&#xff0c;右侧的单元…...

设计AI芯片架构的入门 研究生入行数字芯片设计、验证的项目 opentitan

前言 这几年芯片设计行业在国内像坐过山车。时而高亢&#xff0c;时而低潮。最近又因为AI的热潮开始high起来。到底芯片行业的规律是如何&#xff1f; 我谈谈自己观点&#xff1a;芯片设计是“劳动密集型”行业。 “EDA和工具高度标准化和代工厂的工艺标准化之后&#xff0c;芯…...

【弹性计算】异构计算云服务和 AI 加速器(二):适用场景

异构计算云服务和 AI 加速器&#xff08;二&#xff09;&#xff1a;适用场景 1.图形处理2.视频处理3.计算4.人工智能 异构计算 目前已经被广泛地应用于生产和生活当中&#xff0c;主要应用场景如下图所示。 1.图形处理 GPU 云服务器在传统的图形处理领域具有强大的优势&…...

JVM常用概念之移动GC和局部性

问题 非移动GC一定比移动GC好吗&#xff1f; 基础知识 移动GC和非移动GC 移动GC 在进行垃圾回收时&#xff0c;为了减少碎片而移动对象来顺利完成垃圾回收的GC。 Serial GC 在单线程环境下&#xff0c;它在标记-清除&#xff08;Mark-Sweep&#xff09;算法的基础上进行…...

微服务保护:Sentinel

home | Sentinelhttps://sentinelguard.io/zh-cn/ 微服务保护的方案有很多&#xff0c;比如&#xff1a; 请求限流 线程隔离 服务熔断 服务故障最重要原因&#xff0c;就是并发太高&#xff01;解决了这个问题&#xff0c;就能避免大部分故障。当然&#xff0c;接口的并发…...

使用Wireshark截取并解密摄像头画面

在物联网&#xff08;IoT&#xff09;设备普及的今天&#xff0c;安全摄像头等智能设备在追求便捷的同时&#xff0c;往往忽视了数据传输过程中的加密保护。很多摄像头默认通过 HTTP 协议传输数据&#xff0c;而非加密的 HTTPS&#xff0c;从而给潜在攻击者留下了可乘之机。本文…...

IDEA 基础配置: maven配置 | 服务窗口配置

文章目录 IDEA版本与MAVEN版本对应关系maven配置镜像源插件idea打开服务工具窗口IDEA中的一些常见问题及其解决方案IDEA版本与MAVEN版本对应关系 查找发布时间在IDEA版本之前的dea2021可以使用maven3.8以及以前的版本 比如我是idea2021.2.2 ,需要将 maven 退到 apache-maven-3.…...

20250-3-8 树的存储结构

一、树的逻辑结构回顾 树&#xff1a;一个分支结点可以有多课子树 如果按照二叉树的存储来实现树的存储&#xff0c;则只依靠数组下标&#xff0c;无法反映结点之间的逻辑关系。 二、双亲表示法&#xff08;顺序存储&#xff09; 1.因此&#xff1a;我们可以用链式存储的方法&…...