【LVGL-字库应用】

news2024/11/25 17:23:16

LVGL-中文字库应用

  • ■ LVGL-内部字库
    • ■ LVGL 内部字库的使用流程:
  • ■ LVGL-自定义字库
    • ■ 方法一:C 语言数组(内部读取)-在线转换工具
    • ■ 方法二:C 语言数组(内部读取)-利用离线字体转换软件(V0.5 版本)
    • ■ 方法三:C 语言数组(内部读取)-离线字体转换软件(V0.4 版本) ,
    • ■ 方法三:文件系统读取字库(外部读取)- 【阿里】的离线字体转换软件(V0.5 版本)
  • ■ LVGL-中文字库应用
    • ■ 可从window中选择字库文件
    • ■ LVGL在线字体转换网页-在线字体转换配置
    • ■ 将生成的字体文件添加到工程中来。
    • ■ 测试代码
    • ■ 综合示例:

■ LVGL-内部字库

LVGL 提供了一套内置的字库,这些字库在移植的时候已经被添加到工程当中, 我们打开Middlewares/lvgl/src/font 分组, 即可找到这些字库文件。

■ LVGL 内部字库的使用流程:

步骤一. 打开 lv_conf.h 文件, 将所需要使用的内部字库使能
在这里插入图片描述
步骤二. 调用字库
使能了内部字库之后,用户就可以直接在字体设置函数中调用相应的字库了,
字号越大,文字越大,但其占用的内存也越多。

void lv_mainstart(void)
{
	lv_obj_t* label = lv_label_create(lv_scr_act());
	lv_obj_set_style_text_font(label,&lv_font_montserrat_16,LV_STATE_DEFAULT); //设置了 16 号字体
	lv_label_set_text(label,"Hello Word!!!!");
}

■ LVGL-自定义字库

■ 方法一:C 语言数组(内部读取)-在线转换工具

LVGL 官方的在线字体转换工具(网址: https://lvgl.io/tools/fontconverter) , 将字库文件(例如 TTF) 转换成 C 语言数组字体文件, 然后将其添加到工程中, 声明字体后即可调用。
在这里插入图片描述

使用在线转换工具生成字体需要七步:
① 在“Name”选项中填入字体名称。 注意: 该名称在声明字体的时候需要用到,请不要
使用中文名称;
② 在“Size”选项中填入字体的尺寸,这里是以像素为单位的;
③ 在“Bpp”选项中选择像素深度, 注意: 该值越大,则抗锯齿效果越好,但是对内存的
占用也会越高,一般的工程选择 4bbp 即可;
④ 选择字体文件,例如 ttf、 otf 格式的文件;
⑤ 在“Range”选项中填入文字编码范围, 以确定字体的转换范围。基本汉字的编码范围
是 0x4E00-0x9FA5, 数字、拉丁字母、标点符号的编码范围是 0x20-0x7E,这两个范围内已经
涵盖了两万多个字符, 可以满足绝大部分的使用场景。 关于文字的编码,大家感兴趣的话可以
在网上了解一下。 注意: 转换的范围越大,字库所占用的内存就越高, 在该选项中,建议大家
只填 0x20-0x7E。
⑥ 在“Symbols”选项中直接填入需要转换的文字。我们一般会将需要转换的汉字填入该
选项;
⑦ 点击“Convert”,即可生成字体文件(后缀为.c) 。

代码调用字体

LV_FONT_DECLARE(my_Font14) /* 声明字体 */
void lv_mainstart(void)
{
	lv_obj_t *font_label = lv_label_create(lv_scr_act());
	lv_obj_set_style_text_font(font_label, &my_Font14, LV_STATE_DEFAULT);
	lv_label_set_text(font_label, "你好");
	lv_obj_center(font_label);
}

■ 方法二:C 语言数组(内部读取)-利用离线字体转换软件(V0.5 版本)

利用离线字体转换软件(V0.5 版本) , 将中文字库转化为 C 语言数组文件。
【阿里】 , 其开发的离线转换软件可以帮助用户轻松地生成 LVGL字库, 大家可以在他的博客网址(http://dz.lfly.xyz/forum.php) 中下载字体转换软件.

使用方法:

  1. 打开 LvglFontTool V0.5 软件,点击“选择字体”
    在这里插入图片描述
  2. 在弹窗中选择所需字体
    在这里插入图片描述
  3. 加入常用汉字
    在这里插入图片描述
  4. 选择 LVGL 版本、 字体类型,设置字体名称,

在这里插入图片描述

  1. 点击“开始转换” 将会得到一个.c 文件。
  2. 参照方法一添加到工程中。

■ 方法三:C 语言数组(内部读取)-离线字体转换软件(V0.4 版本) ,

利用离线字体转换软件(V0.4 版本) , 将中文字库转化为 C 语言数组文件。 与方法二不同的是,我们此处使用的是自选的 TTF 字体文件(V0.4 版本软件支持该功能) , 具体的使用
方法如下

  1. 打开 LvglFontTool V0.4 软件点击“选择字体”
    在这里插入图片描述
  2. 在弹窗中选择所需的 TTF 字体, 设置字体大小,
    在这里插入图片描述
  3. 添加常用的汉字
    4.
  4. 选择 LVGL 版本、字体类型,设置字体名称,
    在这里插入图片描述
  5. 点击“开始转换”, 等待转换完成后, 点击“保存” 即可得到一个.c 文件。
  6. 添加到工程中去。

■ 方法三:文件系统读取字库(外部读取)- 【阿里】的离线字体转换软件(V0.5 版本)

  1. 打开 LvglFontTool V0.5 软件点击“选择字体”,
    在这里插入图片描述
  2. 选择所需字体
    在这里插入图片描述
  3. 加入常用汉字

在这里插入图片描述

  1. 选择版本、类型(XBF,外部 bin 文件),设置字体名称
    在这里插入图片描述

  2. 点击“开始转换”在弹窗中选择文件路径并点击“保存”。等待转换完成, 将会得到两个文件,它们的后缀分别为.c 和.bin。
    我们把.c 文件添加到工程中,而.bin 文件则放到 SD 卡里面(建议路径: 根目录→SYSTEM→LVFONT) 。

  3. 打 开 工 程 , 找 到 上 一 步 添 加 的 字 体 文 件 ( 例 如 示 例 中 的 Font12.c ) , 修 改__user_font_getdata 函数, 如下源码所示:

static uint8_t *__user_font_getdata(int offset, int size){
	/* 如字模保存在 SPI FLASH, SPIFLASH_Read(__g_font_buf,offset,size);
	如字模已加载到 SDRAM,直接返回偏移地址即可如:return (uint8_t*)(sdram_fontddr+offset); */
	norflash_ex_read(__g_font_buf,ftinfo.lvgl_12addr +offset,size);
	return __g_font_buf;
}

注意: 上述源码是以 Mini Pro H750 开发板为例的, 其他的开发板用户请根据实际的开发板例程来修改

  1. 添加汉字显示相关的 TEXT 文件
    在这里插入图片描述
  2. 修改 fonts.h 文件
/* 字体信息保存首地址
* 占 41 个字节,第 1 个字节用于标记字库是否存在.后续每 8 个字节一组,分别保存起始地址和文件大小
*/
extern uint32_t FONTINFOADDR;
/* 字库信息结构体定义
* 用来保存字库基本信息,地址,大小等
*/
typedef __PACKED_STRUCT
{
	uint8_t fontok; /* 字库存在标志, 0XAA,字库正常;其他,字库不存在 */
	uint32_t ugbkaddr; /* unigbk 的地址 */
	uint32_t ugbksize; /* unigbk 的大小 */
	uint32_t f12addr; /* gbk12 地址 */
	uint32_t gbk12size; /* gbk12 的大小 */
	uint32_t f16addr; /* gbk16 地址 */
	uint32_t gbk16size; /* gbk16 的大小 */
	uint32_t f24addr; /* gbk24 地址 */
	uint32_t gbk24size; /* gbk24 的大小 */
	uint32_t f32addr; /* gbk32 地址 */
	uint32_t gbk32size; /* gbk32 的大小 */
	uint32_t lvgl_12addr; /* LVGL12 地址 */
	uint32_t lvgl_12size; /* LVGL12 的大小 */
	uint32_t lvgl_24addr; /* LVGL24 地址 */
	uint32_t lvgl_24size; /* LVGL24 的大小 */
	uint32_t lvgl_36addr; /* LVGL36 地址 */
	uint32_t lvgl_36size; /* LVGL36 的大小 */
} _font_info;
  1. 修改 fonts.c 文件中的 FONT_GBK_PATH 和 FONT_UPDATE_REMIND_TBL 数组, 如下源码所示:
/* 字库存放在磁盘中的路径 */
char *const FONT_GBK_PATH[8] =
{
	"/SYSTEM/FONT/UNIGBK.BIN", /* UNIGBK.BIN 的存放位置 */
	"/SYSTEM/FONT/GBK12.FON", /* GBK12 的存放位置 */
	"/SYSTEM/FONT/GBK16.FON", /* GBK16 的存放位置 */
	"/SYSTEM/FONT/GBK24.FON", /* GBK24 的存放位置 */
	"/SYSTEM/FONT/GBK32.FON", /* GBK32 的存放位置 */
	"/SYSTEM/LVFONT/Font12.BIN", /* Font12 的存放位置 */
	"/SYSTEM/LVFONT/Font24.BIN", /* Font24 的存放位置 */
	"/SYSTEM/LVFONT/Font36.BIN", /* Font36 的存放位置 */
};
/* 更新时的提示信息 */
char *const FONT_UPDATE_REMIND_TBL[8] =
{
	"Updating UNIGBK.BIN", /* 提示正在更新 UNIGBK.bin */
	"Updating GBK12.FON ", /* 提示正在更新 GBK12 */
	"Updating GBK16.FON ", /* 提示正在更新 GBK16 */
	"Updating GBK24.FON ", /* 提示正在更新 GBK24 */
	"Updating GBK32.FON ", /* 提示正在更新 GBK32 */
	"Updating Font12.BIN", /* 提示正在更新 Font12 */
	"Updating Font24.BIN", /* 提示正在更新 Font24 */
	"Updating Font36.BIN", /* 提示正在更新 Font36 */
};
  1. 修改 fonts.c 文件中的 fonts_update_fontx 函数
/**
* @brief 更新某一个字库
* @param x, y : 提示信息的显示地址
* @param size : 提示信息字体大小
* @param fpath : 字体路径
* @param fx : 更新的内容
* @arg 0, ungbk;
* @Arg 1, gbk12;
* @arg 2, gbk16;
* @arg 3, gbk24;
* @arg 4, gbk32;
* @param color : 字体颜色
* @retval 0, 成功; 其他, 错误代码;
*/
static uint8_t fonts_update_fontx( uint16_t x,
			uint16_t y,
			uint8_t size,
			uint8_t *fpath,
			uint8_t fx,
			uint16_t color)
{
	uint32_t flashaddr = 0;
	FIL *fftemp;
	uint8_t *tempbuf;
	uint8_t res;
	uint16_t bread;
	uint32_t offx = 0;
	uint8_t rval = 0;
	fftemp = (FIL *)mymalloc(SRAMIN, sizeof(FIL)); /* 分配内存 */
	if (fftemp == NULL)rval = 1;
	tempbuf = mymalloc(SRAMIN, 4096); /* 分配 4096 个字节空间 */
	if (tempbuf == NULL)rval = 1;
	res = f_open(fftemp, (const TCHAR *)fpath, FA_READ);
if (res)rval = 2; /* 打开文件失败 */
if (rval == 0)
{
switch (fx)
{
case 0: /* 更新 UNIGBK.BIN */
/* 信息头之后,紧跟 UNIGBK 转换码表 */
ftinfo.ugbkaddr = FONTINFOADDR + sizeof(ftinfo);
ftinfo.ugbksize = fftemp->obj.objsize; /* UNIGBK 大小 */
flashaddr = ftinfo.ugbkaddr;
break;
case 1: /* 更新 GBK12.BIN */
/* UNIGBK 之后,紧跟 GBK12 字库 */
ftinfo.f12addr = ftinfo.ugbkaddr + ftinfo.ugbksize;
ftinfo.gbk12size = fftemp->obj.objsize; /* GBK12 字库大小 */
flashaddr = ftinfo.f12addr; /* GBK12 的起始地址 */
break;
case 2: /* 更新 GBK16.BIN */
/* GBK12 之后,紧跟 GBK16 字库 */
ftinfo.f16addr = ftinfo.f12addr + ftinfo.gbk12size;
ftinfo.gbk16size = fftemp->obj.objsize; /* GBK16 字库大小 */
flashaddr = ftinfo.f16addr; /* GBK16 的起始地址 */
break;
case 3: /* 更新 GBK24.BIN */
/* GBK16 之后,紧跟 GBK24 字库 */
ftinfo.f24addr = ftinfo.f16addr + ftinfo.gbk16size;
ftinfo.gbk24size = fftemp->obj.objsize; /* GBK24 字库大小 */
flashaddr = ftinfo.f24addr; /* GBK24 的起始地址 */
break;
case 4: /* 更新 GBK32.BIN */
/* GBK24 之后,紧跟 GBK32 字库 */
ftinfo.f32addr = ftinfo.f24addr + ftinfo.gbk24size;
ftinfo.gbk32size = fftemp->obj.objsize; /* GBK32 字库大小 */
flashaddr = ftinfo.f32addr; /* GBK32 的起始地址 */
break;
case 5:/* 更新 LVGL12.BIN */ (1)
ftinfo.lvgl_12addr=ftinfo.f32addr+ftinfo.gbk32size;
ftinfo.lvgl_12size=fftemp->obj.objsize;
flashaddr=ftinfo.lvgl_12addr;
break;
case 6:/* 更新 LVGL24.BIN */ (2)
ftinfo.lvgl_24addr=ftinfo.lvgl_12addr+ftinfo.lvgl_12size;
ftinfo.lvgl_24size=fftemp->obj.objsize;
flashaddr=ftinfo.lvgl_24addr;
break;
case 7:/* 更新 LVGL36.BIN */ (3)
ftinfo.lvgl_36addr=ftinfo.lvgl_24addr+ftinfo.lvgl_24size;
ftinfo.lvgl_36size=fftemp->obj.objsize;
flashaddr=ftinfo.lvgl_36addr;
break;
}
while (res == FR_OK) /* 死循环执行 */
{
res = f_read(fftemp, tempbuf, 4096, (UINT *)&bread); /* 读取数据 */
if (res != FR_OK)break; /* 执行错误 */
/* 从 0 开始写入 bread 个数据 */
norflash_ex_write(tempbuf, offx + flashaddr, bread);
offx += bread;
/* 进度显示 */
fonts_progress_show(x, y, size, fftemp->obj.objsize, offx, color);
if (bread != 4096)break; /* 读完了. */
}
f_close(fftemp);
}
myfree(SRAMIN, fftemp); /* 释放内存 */
myfree(SRAMIN, tempbuf); /* 释放内存 */
return res;
}
  1. 修改 fonts.c 文件中的 fonts_update_font 函数,
/**
* @brief 更新字体文件
* @note 所有字库一起更新(UNIGBK,GBK12,GBK16,GBK24,GBK32)
* @param x, y : 提示信息的显示地址
* @param size : 提示信息字体大小
* @param src : 字库来源磁盘
* @arg "0:", SD 卡;
* @Arg "1:", FLASH 盘
* @arg "2:", U 盘
* @param color : 字体颜色
* @retval 0, 成功; 其他, 错误代码;
*/
uint8_t fonts_update_font( uint16_t x,
	uint16_t y,
	uint8_t size,
	uint8_t *src,
	uint16_t color)
	{
	uint8_t *pname;
	uint32_t *buf;
	uint8_t res = 0;
	uint16_t i, j;
	FIL *fftemp;
	uint8_t rval = 0;
	res = 0XFF;
	ftinfo.fontok = 0XFF;
	pname = mymalloc(SRAMIN, 100); /* 申请 100 字节内存 */
	buf = mymalloc(SRAMIN, 4096); /* 申请 4K 字节内存 */
	fftemp = (FIL *)mymalloc(SRAMIN, sizeof(FIL)); /* 分配内存 */
	if (buf == NULL || pname == NULL || fftemp == NULL)
	{
		myfree(SRAMIN, fftemp);
		myfree(SRAMIN, pname);
		myfree(SRAMIN, buf);
		return 5; /* 内存申请失败 */
	}
	/* 先查找文件 UNIGBK,GBK12,GBK16,GBK24,GBK32,
	LVGL12.BIN,LVGL24.BIN,LVGL36BIN 是否正常 */
	for (i = 0; i < 8; i++) (1)
	{
		strcpy((char *)pname, (char *)src); /* copy src 内容到 pname */
		strcat((char *)pname, (char *)FONT_GBK_PATH[i]); /* 追加具体文件路径 */
		res = f_open(fftemp, (const TCHAR *)pname, FA_READ);/* 尝试打开 */
		if (res)
		{
			rval |= 1 << 7; /* 标记打开文件失败 */
			break; /* 出错了,直接退出 */
		}
	}
	myfree(SRAMIN, fftemp); /* 释放内存 */
	if (rval == 0) /* 字库文件都存在. */
	{
		/* 提示正在擦除扇区 */
		lcd_show_string(x, y, 240, 320, size, "Erasing sectors... ", color);
		for (i = 0; i < FONTSECSIZE; i++) /* 先擦除字库区域,提高写入速度 */
		{
			/* 进度显示 */
			fonts_progress_show(x + 20 * size / 2, y, size, FONTSECSIZE,
			i, color);
			/* 读出整个扇区的内容 */
			norflash_ex_read((uint8_t *)buf, ((FONTINFOADDR /
			4096)+i) * 4096, 4096);
			for (j = 0; j < 1024; j++) /* 校验数据 */
			{
				if (buf[j] != 0XFFFFFFFF)break; /* 需要擦除 */
			}
			if (j != 1024)
			{
			/* 需要擦除的扇区 */
			norflash_ex_erase_sector((FONTINFOADDR / 4096) + i);
			}
		}
		/* 依次更新 UNIGBK,GBK12,GBK16,GBK24,GBK32,
		LVGL12.BIN,LVGL24.BIN,LVGL36BIN */
		for (i = 0; i < 8; i++)
		{
			lcd_show_string(x, y, 240, 320, size,
			FONT_UPDATE_REMIND_TBL[i], color);
			strcpy((char *)pname, (char *)src);
			strcat((char *)pname, (char *)FONT_GBK_PATH[i]);
			res = fonts_update_fontx(x + 20 * size / 2, y, size,
			pname, i, color);
			if (res)
			{
				myfree(SRAMIN, buf);
				myfree(SRAMIN, pname);
				return 1 + i;
			}
		}
		/* 全部更新好了 */
		ftinfo.fontok = 0XAA;
		/* 保存字库信息 */
		norflash_ex_write((uint8_t *)&ftinfo, FONTINFOADDR, sizeof(ftinfo));
	}
	myfree(SRAMIN, pname); /* 释放内存 */
	myfree(SRAMIN, buf);
	return rval; /* 无错误. */
}
  1. 打开 lv_conf.h 文件,找到 LV_FONT_CUSTOM_DECLARE 配置项, 声明该字体, 如下源码所示:
#define LV_FONT_CUSTOM_DECLARE LV_FONT_DECLARE(Font12)
  1. 编写示例代码:
void lv_mainstart(void)
{
	lv_obj_t* label = lv_label_create(lv_scr_act());
	lv_obj_set_style_text_font(label,& Font12,LV_STATE_DEFAULT);
	lv_label_set_text(label,"Hello ALIENTEK!!!!");
}

在这里插入图片描述

■ LVGL-中文字库应用

在这里插入图片描述

■ 可从window中选择字库文件

在这里插入图片描述

■ LVGL在线字体转换网页-在线字体转换配置

lvgl在线字体转换网页
在这里插入图片描述
在这里插入图片描述

■ 将生成的字体文件添加到工程中来。

在这里插入图片描述

■ 测试代码

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

■ 综合示例:

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

【Java】API——Calendar日期类使用+题目演示

目录 Calendar日期类简单介绍 导入对应包&#xff1a; 获取 Calendar 对象&#xff1a; 设置日期和时间&#xff1a; 获取日期和时间的各个部分&#xff1a; 日期和时间的加减操作&#xff1a; 例题&#xff1a;世纪末的星期 题目描述 题目代码 Calendar日期类简单介绍…

FPGA之状态机学习

作为一名逻辑工程师&#xff0c;掌握和应用状态机设计是必不可少的。能够灵活的应用状态机是对逻辑工程师最基本的要求&#xff0c;状态机设计的好坏能够直接影响到设计系统的稳定性&#xff0c;所以学会状态机是非常的重要。 1.状态机的概念 状态机通过不同的状态迁移来完成特…

计算机网络—TCP协议详解:特性、应用(1)

&#x1f3ac;慕斯主页&#xff1a;修仙—别有洞天 ♈️今日夜电波&#xff1a;マリンブルーの庭園—ずっと真夜中でいいのに。 0:34━━━━━━️&#x1f49f;──────── 3:34 &#x1f504; ◀️…

YOLOv8部署到C++上(综合版笔记)

这段时间由于项目的需要&#xff0c;需要将yolov8部署到C上以及跟相应的算法结合&#xff0c;花了我不少时间。 现阶段有考虑过使用onnx转Tensort&#xff0c;但是无法输出分类的结果&#xff0c;故放弃&#xff0c;有目标检测的小伙伴可以试试&#xff0c;接下来使用onnxrunt…

Qt打印系统库的日志 - QLoggingCategory

Qt的动态库通过源码可以可以看到含有大量的qCInfo 和 qCDebug 等大量的日志&#xff0c; 但是我们正常运行Qt程序&#xff0c;这些动态库或插件里面的日志是不会输出到我们的控制台里面的。 所以本章主要记录怎么输出这些日志出来。 一&#xff1a; 步骤 主要使用的是Qt的 函…

第十四届省赛大学B组(C/C++)岛屿个数

目录 题目链接&#xff1a;岛屿个数 解题思路&#xff1a; AC代码&#xff08;BFSDFS&#xff09;&#xff1a; 题目链接&#xff1a;岛屿个数 小蓝得到了一副大小为 MN 的格子地图&#xff0c;可以将其视作一个只包含字符 0&#xff08;代表海水&#xff09;和 1&#xff0…

机器人控制系统阶跃响应

机械臂控制系统的阶跃响应是指当给机械臂控制系统施加一个阶跃输入&#xff08;即输入量在短时间内从0跳变为某个定值&#xff09;时&#xff0c;机械臂的输出&#xff08;如位置、速度等&#xff09;随时间的变化情况。通过观察和分析阶跃响应&#xff0c;可以了解机械臂控制系…

Verilog语法之assign语句学习

assign语法主要是对组合逻辑的变量进行赋值的&#xff0c;就是把一个变量赋值给另一个变量&#xff0c;被复制的变量必须是wire类型的参数。 从仿真结果可以看出&#xff0c;data_in变量的值赋值给了data_out,assign语法就是赋值没有任何延迟&#xff0c;data_in是什么值&#…

OpenHarmony相机和媒体库-如何在ArkTS中调用相机拍照和录像。

介绍 此Demo展示如何在ArkTS中调用相机拍照和录像&#xff0c;以及如何使用媒体库接口进行媒体文件的增、删、改、查操作。 本示例用到了权限管理能力ohos.abilityAccessCtrl 相机模块能力接口ohos.multimedia.camera 图片处理接口ohos.multimedia.image 音视频相关媒体业…

蓝桥杯练习系统(算法训练)ALGO-962 积木大赛

资源限制 内存限制&#xff1a;128.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s 问题描述 THU幼儿园举办了一年一度的“积木大赛”。今年比赛的内容是搭建一座宽度为n的大厦&#xff0c;大厦可以看成由n块宽度为1的…

使用IDEA中的 Find Usages

使用IDEA中的 Find Usages &#xff0c;能够查看某个方法、变量&#xff0c;在哪个地方进行了引用。 在上述的图片中&#xff0c;我选中了一个方法&#xff0c;右键选择 Find Usages &#xff0c;点击之后即可看到此方法&#xff0c;究竟被几个地方进行引用。

Prometheus+grafana环境搭建rabbitmq(docker+二进制两种方式安装)(二)

搭建完Prometheusgrafana基础环境后参见&#xff1a;Prometheusgrafana环境搭建方法及流程两种方式(docker和源码包)(一)-CSDN博客&#xff0c;对我本地的一些常用法人服务进行一个监控。基本都可以根据官方文档完成搭建&#xff0c;因为docker和二进制方式安装各有优缺点。 d…

【论文复现|智能算法改进】动态透镜成像学习人工兔优化算法及应用

目录 1.算法原理2.改进点3.结果展示4.参考文献 1.算法原理 【智能算法】人工兔优化算法&#xff08;ARO&#xff09;原理及实现 2.改进点 非线性递减能量因子&#xff1a; A ( t ) ( A max ⁡ − A min ⁡ ) ( 1 − sin ⁡ ( ( t T ) n π 2 ) (1) \begin{aligned}A\left…

【独立开发前线】Vol.33 Afineparent:一个育儿课程独立站,利基市场疯狂变现

今天要给大家分享的案例是Afineparent网站&#xff0c;这是一个育儿主题的网站。 网址是&#xff1a;AFineParent Academy – AFP Homepage - A Fine Parent 这个网站专注于教你怎么成为一个好父母&#xff0c;有针对育儿方面的内容和课程。这是一个非常垂直的市场&#xff0c…

内存泄漏检查工具下载(vld)

前言&#xff1a;在我们向内存申请动态空间的时候&#xff0c;如果使用完之后不将申请的空间释放&#xff0c;就会造成内存泄漏的情况&#xff0c;但是一般情况下&#xff0c;我们是无法通过运行代码来知道是否造成了内存泄漏&#xff0c;所以vld就成为了检查内存是否泄漏的好帮…

php——分享一种扁平数据转树形数据的递归写法

简单的列表请求&#xff1a; /*商品分类列表请求方式&#xff1a;get请求参数&#xff1a;无*/public function lists(){if(!$this->request->isGet())$this->error(请求失败&#xff0c;请使用get请求);$res db(type)->select();!$res? $this->error(请求失败…

Net8 ABP VNext完美集成FreeSql、SqlSugar,实现聚合根增删改查,完全去掉EFCore

没有基础的&#xff0c;请参考上一篇 彩蛋到最后一张图里找 参考链接 结果直接上图&#xff0c;没有任何业务代码 启动后&#xff0c;已经有了基本的CRUD功能&#xff0c;还扩展了批量删除&#xff0c;与动态查询 动态查询截图&#xff0c;支持分页&#xff0c;排序 实现原理…

ClamAV:Linux服务器杀毒扫描工具

Clam AntiVirus&#xff08;ClamAV&#xff09;是免费而且开放源代码的防毒软件&#xff0c;软件与病毒码的更新皆由社群免费发布。ClamAV在命令行下运行&#xff0c;它不将杀毒作为主要功能&#xff0c;默认只能查出系统内的病毒&#xff0c;但是无法清除。需要用户自行对病毒…

AcWing刷题-游戏

游戏 DP l lambda: [int(x) for x in input().split()]n l()[0] w [0] while len(w) < n:w l()s [0] * (n 1) for i in range(1, n 1): s[i] s[i - 1] w[i]f [[0] * (n 1) for _ in range(n 1)]for i in range(1, n 1): f[i][i] w[i]for length in range(2, …

记Kubernetes(k8s)初始化报错:“Error getting node“ err=“node \“k8s-master\“ not found“

记Kubernetes&#xff08;k8s&#xff09;初始化报错&#xff1a;"Error getting node" err"node \"k8s-master\" not found" 1、报错详情2、问题排查3、尝试问题解决 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#…