Linux第一个系统程序---进度条
进度条---命令行版本
回车换行
其实本质上回车和换行是不同概念,我们用一张图来简单的理解一下:
在计算机语言当中:
换行符:\n
回车符:\r
\r\n:回车换行
这时候有人可能会有疑问:我在学习C/C++语言的时候,单纯的\n就起到了回车加换行的行为呀?!
答:因为在语言层面\n给我们编译成了\r\n
缓冲区问题
在我们目前的阶段,我们将缓冲区看作是一段内存块,我们可以先实现一个测试代码:
#touch test.c#可以直接
vim test.c
测试代码
:!man 3 sleep
#include<stdio.h>
#include<unistd.h>int main()
{
//printf("hello Linux!\n");printf("hello Linux!");sleep(3);return 0;
}
我们在Linux编译后./test执行时,当只有上被注释的代码被执行,和只有第二句printf的代码,我们发现前者内容打印出来,程序3秒后结束,后者是3秒后程序结束才打印内容,我们可以明显感受到程序是先执行sleep(3)的,但是我们之前学习C/C++知道,我们定义的程序逻辑都是从上往下执行的,可是我们为什么没有看到字符串呢?
我们应该知道,对于后者,printf在sleep之前一定执行完了,但是显示器上没有显示,那么在我们休眠3秒期间,字符串" hello Linux! "在哪里?其实该字符串在缓冲区里面,可以理解为内存有一小内存块,将该字符串临时保存在该处了。我们带有\n的字符串可以在显示屏上打印,我们称为行刷新,也就是遇到\n,printf执行完就默认将其字符串直接显示到显示器了(行刷新),可以理解为没有\n就不给行刷新;
那后者为什么最后也可以刷新出来呢?
是因为程序退出了,会自动刷新缓冲区!
我们如何可以让不带\n的字符串能够立马刷新呢?
我们如果想让不带\n的字符串立马刷新,可以使用fflush:
fflush
是 C 语言标准库函数之一,用于刷新流的缓冲区。其原型定义在 <stdio.h>
头文件中
我们可以进行man手册查看。
printf("hello Linux!");
fflush(stdout);
其实我们的程序会默认打开三个输入输出流,分别是:(描述符分别为1,2,3)
-
标准输入流(
stdin
):用于从标准输入设备(通常是键盘)读取数据。 -
标准输出流(
stdout
):用于向标准输出设备(通常是屏幕)输出数据。 -
标准错误流(
stderr
):用于输出错误信息和其他诊断信息,通常也是输出到屏幕。
都是一个指向 FILE
结构体的指针,定义在 <stdio.h>
中。
我们的printf默认是从标准输出流里面打,我们可以看到fprintf其实就是比printf多了一个参数:
在Linux下,一切皆文件,当一个程序在 Linux 下运行时,操作系统会自动为该程序打开三个标准流文件描述符,也就是下面两条代码是等价的,fprintf只是显示的表示出往哪里输出:
fprintf(stdout,"hello Linux!\n");printf("hello Linux!\n");
我们就可以利用缓冲区来实现一个倒计时:光标显示后回退(回车)
int main()
{int i=9;while(i>=0){printf("%d\r",i);i--;sleep(1);}return 0;
}
但是我们发现在显示器上没有显示任何数据,这是为什么呢?
因为我们行刷新是需要\n的,%d后是\r,\r不支持我们行刷新,所以对应的信息并未有显示出来,还在缓冲区里面存着呢,所以需要用到fflush(stdout);
int main()
{int i=9;while(i>=0){printf("%d\r",i);fflush(stdout);i--;sleep(1);}printf("\n");//跑完之后想要保留0(命令行),不让会覆盖return 0;
}
为了使我们对下面进度条程序更好的实现,我们来看看当i取10的时候:
命令行变化:10-90-80-70-60-50-40-30-20-10-00----00
这时候,我们应该好好理解显示:
举个例子,我们往显示器上输入:12345,是输出的是12345数字,还是'1' '2' '3' '4' '5'字符?
显示器只认识字符!显示器是字符设备,所以输出的是后者,这也是为什么我们需要像%d的格式化输出,所以我们可以将上述代码中的%d改成%2d,还可以在前面加一个-即"%-2d"来整体靠左显示,代码我就不写出来了,在原代码上做改进就🆗。
以上我们进度条的预备工作就基本完成了(回车换行,缓冲区问题,格式问题,字符设备的理解问题,输出设备的刷新问题)
我们想写一个怎么样的进度条
框架的搭建
创建文件
首先,在我们自己的工作目录中创建四个文件:
-
main.c
-
Makefile
-
process.c
-
process.h
编写 Makefile
使用 vim
编辑器打开 Makefile
,并写入以下内容:
SRC:=$(wildcard *.c)
OBJ:=$(SRC:.c=.o)
BIN=processbar$(BIN): $(OBJ)gcc -o $@ $^%.o: %.cgcc -c $<.PHONY: clean
clean:rm -f $(OBJ) $(BIN)
这个 Makefile
定义了如何编译和链接你的程序。它使用 wildcard
自动查找所有 .c
文件,并生成相应的 .o
文件。最终生成的可执行文件名为 processbar
。
编写 process.h
使用 vim
编辑器打开 process.h
,并写入以下内容:
#pragma once
#include <stdio.h>void process_v1();
这个头文件声明了一个函数 process_v1
,该函数将在 process.c
中实现。
编写 process.c
使用 vim
编辑器打开 process.c
,并写入以下内容:
#include "process.h"void process_v1() {printf("hello rose!\n");
}
这个文件实现了 process_v1
函数,目前只是简单地打印一条消息。
编写 main.c
使用 vim
编辑器打开 main.c
,并写入以下内容:
#include "process.h"int main() {process_v1();return 0;
}
这个文件是程序的入口点,它调用了 process_v1
函数。
编译和运行
完成上述文件编写后,你可以使用以下命令进行编译:
make
这将根据 Makefile
的规则编译并生成 processbar
可执行文件。然后,你可以运行该程序:
./processbar
如果一切顺利,你应该会看到输出 "hello rose!"。
清理
最后,使用以下命令清理生成的文件:
make clean
这将删除所有 .o
文件和 processbar
可执行文件。
接下来,我们就可以在 process.c
中实现进度条的功能。可以根据具体需求设计进度条的更新逻辑和显示方式。
version1原理版本
#include"process.h"
#include<string.h>
#include<unistd.h>#define NUM 101//因为会有一个\0的存在
#define STYLE '='void process_v1()
{ char buffer[NUM];memset(buffer,0,sizeof(buffer));const char *lable="|/-\\";size_t len=strlen(lable);//计数器int cnt=0;while(cnt<=100)//这个循环会循环101次{printf("[%-100s][%d%%][%c]\r",buffer,cnt,lable[cnt%len]);fflush(stdout);buffer[cnt]=STYLE;cnt++;//sleep(1);usleep(10000);}printf("\n");return;
}
-
定义常量和变量
NUM
定义为 101,因为进度条的长度为 100 个字符,加上一个字符串的终止符\0
。STYLE
定义为=
,用于表示进度条的已填充部分。buffer
是一个字符数组,用于存储进度条的当前状态。lable
是一个字符串,包含旋转的符号|/-\
,用于在进度条旁边显示一个旋转的动画效果。len
是lable
字符串的长度。cnt
是一个计数器,用于控制进度条的更新和旋转符号的切换。
-
初始化缓冲区
- 使用
memset
函数将buffer
初始化为全 0,即空字符串。
- 使用
-
进度条更新循环
while
循环会执行 101 次,因为cnt
从 0 开始,直到 100 结束。- 在每次循环中,使用
printf
函数输出当前的进度条状态:[%-100s]
表示一个宽度为 100 的左对齐字符串,buffer
作为参数传入,表示进度条的当前填充状态。[%d%%]
表示当前的百分比进度,cnt
作为参数传入。[%c]
表示旋转符号,lable[cnt%len]
计算当前应该显示的旋转符号。
- 使用
\r
作为printf
的结尾,表示返回到行首,这样下一次输出会覆盖当前行的内容。 - 调用
fflush(stdout)
确保输出立即显示在屏幕上,而不是被缓冲。 - 将
buffer[cnt]
设置为STYLE
,即=
,表示进度条的已填充部分向右扩展一个字符。 cnt++
更新计数器。usleep(10000)
暂停 10 毫秒,使进度条的更新速度适中,便于观察。注释掉的sleep(1)
是暂停 1 秒的另一种方式,但会使进度条更新过慢。
-
结束输出
- 循环结束后,调用
printf("\n")
输出一个换行符,使光标移动到下一行,避免后续输出覆盖进度条。
- 循环结束后,调用
整体功能:
这个 process_v1
函数实现了一个动态更新的文本进度条,进度条的长度为 100 个字符,旁边有一个旋转的符号动画。通过在循环中逐步填充 buffer
并输出,模拟了进度条的动态增长过程。每次更新后,使用 \r
返回行首并刷新输出,实现了进度条的原地更新效果。
version2真实版本
main.c
#include "process.h"#include <stdio.h>
#include <unistd.h>double total = 1024.0; // 总下载量,单位为MB
double speed = 1.0; // 下载速度,单位为MB/svoid DownLoad() {double current = 0; // 当前已下载量while (current <= total) {// 刷新进度条FlushProcess(total, current);// 模拟下载数据,每次循环下载speed大小的数据usleep(300000); // 暂停300ms,模拟下载延时current += speed;}printf("\ndownload %.2lfMB Done\n", current);
}int main() {DownLoad();return 0;
}
version2
#include "process.h"
#include <string.h>
#include <unistd.h>#define NUM 101 // 因为会有一个\0的存在
#define STYLE '='// version2
void FlushProcess(double total, double current) {char buffer[NUM];memset(buffer, 0, sizeof(buffer));const char *lable = "|/-\\";size_t len = strlen(lable);static int cnt = 0; // 静态变量,用于记录旋转符号的位置// 计算当前进度条的填充数量int num = (int)(current * 100 / total);for (int i = 0; i < num; i++) {buffer[i] = STYLE;}double rate = current / total; // 计算当前下载进度的百分比cnt %= len; // 计算旋转符号的索引printf("[%-100s][%.1f%%][%c]\r", buffer, rate * 100, lable[cnt]);cnt++;fflush(stdout); // 确保进度条立即显示
}
进度条与下载模拟功能梳理:
-
下载模拟:
DownLoad
函数模拟了一个下载过程,其中total
表示总下载量,speed
表示下载速度。- 在
while
循环中,每次循环模拟下载speed
大小的数据,并通过usleep
函数暂停一段时间来模拟下载延时。 - 循环过程中,不断调用
FlushProcess
函数来刷新进度条,显示当前的下载进度。
-
进度条刷新:
FlushProcess
函数负责根据当前下载量current
和总下载量total
计算进度条的填充状态,并输出到屏幕。buffer
数组用于存储进度条的当前状态,num
变量计算出需要填充的=
字符的数量。- 使用
printf
函数输出进度条,其中[%-100s]
表示一个宽度为 100 的左对齐字符串,用于显示进度条的填充部分;[%.1f%%]
显示当前的下载百分比;[%c]
显示一个旋转的符号,用于增加动画效果。 - 使用
\r
作为printf
的结尾,表示返回到行首,使下一次输出覆盖当前行的内容,实现进度条的原地更新效果。 fflush(stdout)
确保进度条的输出立即显示在屏幕上,而不是被缓冲。
整体功能
这个程序通过模拟下载过程,并在每次下载数据后刷新进度条,实现了动态显示下载进度的效果。进度条的长度为 100 个字符,旁边有一个旋转的符号动画,使用户可以直观地看到下载进度的变化。当下载完成后,程序会输出一条完成信息,告知用户下载已成功完成。
我们不仅仅可以在下载方面使用进度条,我们也可以在上传方面使用进度条,因此,在main.c源文件当中,我们typedef一个函数指针来使用回调函数来优化代码:
#include"process.h"#include<stdio.h>
#include<unistd.h>typedef void (*callback_t) (double total,double current);//函数指针double total=1024.0;
double speed=1.0;//回调函数
void DownLoad(callback_t cb)
{double current=0;while(current<=total){//刷新进度cb(total,current);//下载代码usleep(3000);//充当下载数据current+=speed;}printf("\ndownload %.2lfMB Done\n",current);
}void UpLoad(callback_t cb)
{double current=0;while(current<=total){//刷新进度cb(total,current);//下载代码usleep(3000);//充当下载数据current+=speed;}printf("\nUpload %.2lfMB Done\n",current);
}
int main()
{DownLoad(FlushProcess);UpLoad(FlushProcess);return 0;
}
相关文章:
Linux第一个系统程序---进度条
进度条---命令行版本 回车换行 其实本质上回车和换行是不同概念,我们用一张图来简单的理解一下: 在计算机语言当中: 换行符:\n 回车符:\r \r\n:回车换行 这时候有人可能会有疑问:我在学习C…...
黑马跟学.苍穹外卖.Day04
黑马跟学.苍穹外卖.Day04 苍穹外卖-day04课程内容1. Redis入门1.1 Redis简介1.2 Redis下载与安装1.2.1 Redis下载1.2.2 Redis安装 1.3 Redis服务启动与停止1.3.1 服务启动命令1.3.2 客户端连接命令1.3.3 修改Redis配置文件1.3.4 Redis客户端图形工具 2. Redis数据类型2.1 五种常…...
人生第一次面试之依托答辩
今天收到人生的第一场面试,是东华软件集团。答的那是依托答辩,就面了20分钟,还没考算法。其实依托答辩的效果是意料之中的,这次面试也只是想练练手。 目录 静态变量什么时候加载的? 重写和重载有什么区别࿱…...
STM32 : PWM 基本结构
这张图展示了PWM(脉冲宽度调制)的基本结构和工作流程。PWM是一种用于控制功率转换器输出电压的技术,通过调整信号的占空比来实现对负载的精确控制。以下是详细讲解: PWM 基本结构 1. 时基单元 ARR (Auto-reload register): 自动…...
【大模型(LLM)面试全解】深度解析 Layer Normalization 的原理、变体及实际应用
系列文章目录 大模型(LLMs)基础面 01-大模型(LLM)面试全解:主流架构、训练目标、涌现能力全面解析 02-【大模型(LLM)面试全解】深度解析 Layer Normalization 的原理、变体及实际应用 大模型&…...
《浮岛风云》V1.0中文学习版
《浮岛风云》中文版https://pan.xunlei.com/s/VODadt0vSGdbrVOBEsW9Xx8iA1?pwdy7c3# 一款有着类似暗黑破坏神的战斗系统、类似最终幻想的奇幻世界和100%可破坏体素环境的动作冒险RPG。...
学习threejs,导入babylon格式的模型
👨⚕️ 主页: gis分享者 👨⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨⚕️ 收录于专栏:threejs gis工程师 文章目录 一、🍀前言1.1 ☘️THREE.BabylonLoader babyl…...
Django 社团管理系统的设计与实现
标题:Django 社团管理系统的设计与实现 内容:1.摘要 本文介绍了 Django 社团管理系统的设计与实现。通过分析社团管理的需求,设计了系统的架构和功能模块,并使用 Django 框架进行了实现。系统包括社团信息管理、成员管理、活动管理、财务管理等功能&…...
2025 GitCode 开发者冬日嘉年华:AI 与开源的深度交融之旅
在科技的浪潮中,AI 技术与开源探索的火花不断碰撞,催生出无限可能。2025 年 1 月 4 日,由 GitCode 联合 CSDN COC 城市开发者社区精心打造的开年首场开发者活动:冬日嘉年华在北京中关村 • 鼎好 DH3-A 座 22 层盛大举行࿰…...
嵌入式系统 tensorflow
🎬 秋野酱:《个人主页》 🔥 个人专栏:《Java专栏》《Python专栏》 ⛺️心若有所向往,何惧道阻且长 文章目录 探索嵌入式系统中的 TensorFlow:机遇与挑战一、TensorFlow 适配嵌入式的优势二、面临的硬件瓶颈三、软件优化策略四、实…...
Web无障碍
文章目录 🟢Web Accessibility-Web无障碍🟢一、Web Accessibility-Web1. web无障碍设计2. demo3.使用相关相关开源无障碍工具条(调用可能会根据网络有点慢) 如有其他更好方案,可以私信我哦✒️总结 🟢Web Accessibility-Web无障碍…...
Qt使用MySQL数据库(Win)----2.配置MySQL驱动
使用Everything软件,找到mysql.pro文件。并使用qt creator打开mysql.pro。 导入外部库 选择外部库 点击下一步,勾选。 为debug版本添加‘d’作为后缀取消勾选,然后点击下一步 添加后的Pro文件。 这样文件应该是改好了,选择releas…...
记录一下vue2项目优化,虚拟列表vue-virtual-scroll-list处理10万条数据
文章目录 封装BrandPickerVirtual.vue组件页面使用组件属性 select下拉接口一次性返回10万条数据,页面卡死,如何优化??这里使用 分页 虚拟列表(vue-virtual-scroll-list),去模拟一个下拉的内容…...
java 中 main 方法使用 KafkaConsumer 拉取 kafka 消息如何禁止输出 debug 日志
pom 依赖: <dependency><groupId>org.springframework.kafka</groupId><artifactId>spring-kafka</artifactId><version>2.5.14.RELEASE</version> </dependency> 或者 <dependency><groupId>org.ap…...
前端性能优化全攻略:加速网页加载,提升用户体验
前端性能优化全攻略:加速网页加载,提升用户体验 在当今互联网时代,用户对于网页的加载速度和性能要求越来越高。一个快速响应、流畅加载的网页能够极大地提升用户体验,增加用户留存率和满意度。前端性能优化是实现这一目标的关键…...
关于内网外网,ABC类地址,子网掩码划分
本文的三个关键字是:内网外网,ABC类地址,子网掩码划分。围绕以下问题展开: 如何从ip区分外网、内网?win和linux系统中,如何查询自己的内网ip和外网ip。开发视角看内外网更多是处于安全考虑,接口…...
【C++多线程编程:六种锁】
目录 普通互斥锁: 轻量级锁 独占锁: std::lock_guard: std::unique_lock: 共享锁: 超时的互斥锁 递归锁 普通互斥锁: std::mutex确保任意时刻只有一个线程可以访问共享资源,在多线程中常用于保…...
【LeetCode】力扣刷题热题100道(16-20题)附源码 容器 子数组 数组 连续序列 三数之和(C++)
目录 1.盛最多水的容器 2.和为K的子数组 3.最大子数组和 4.最长连续序列 5.三数之和 1.盛最多水的容器 给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线,使得它们与 x 轴…...
WHAT - devicePixelRatio 与像素分辨率
目录 语法理解 devicePixelRatio常见值应用场景注意事项在高分辨率屏幕下的视觉效果 devicePixelRatio 是一个浏览器属性,用来表示设备的物理像素与 CSS 像素之间的比例。它是屏幕显示清晰度的重要指标,特别是在高分辨率屏幕(如 Retina 显示屏…...
【cs.CV】25.1.8 arxiv更新速递
—第1篇---- ===== ConceptMaster: 面向扩散Transformer模型的多概念视频定制,无需测试时调优 🔍 关键词: 文本到视频生成, 扩散模型, 多概念定制, 身份解耦 链接1 摘要: 文本到视频生成通过扩散模型取得了显著进展。然而,多概念视频定制(MCVC)仍然是一个重大挑战。…...
C#使用MVC框架创建WebApi服务接口
第一步,使用VS2019新建MVC-Web API应用程序 创建BridgeApi 第二步,运行将生成默认的示例网页,网页Url为 https://localhost:44361/home/index 右键 项目 添加 WebAPI控制器类 添加 我们可以看到App_Start目录下 有三个文件: BundleConfig.cs代表 捆绑文件的引用 有脚本文件…...
慧集通(DataLinkX)iPaaS集成平台-智能体(Agent)API
功能简介: 该功能下主要是用来管理集成平台对外开放接口得管控以及调用日志信息得查看操作,并支持日志得重放等操作;注:所有触发类单据得日志也可以在此查看(如使用数据触发组件自动触发流程得日志信息) 1.第三方调用接口类日志查…...
BigDecimal:高精度数值运算类
介绍: BigDecimal是一个用于高精度数值运算的类,它比基本的double或float类型更精确,非常适合需要精确计算的场景,如金融计算、科学计算等,因为这些领域对数值精度要求非常高,不能容忍浮点运算带来的误差。…...
11. C 语言 作用域与变量使用技巧
本章目录: 前言一、作用域的分类局部变量示例: 全局变量示例:示例: 形式参数示例: 二、作用域的细节与常见误区块级作用域示例: 静态变量与全局变量的对比示例: 未初始化变量的影响示例: 三、实…...
大模型WebUI:Gradio全解11——Chatbots:融合大模型的多模态聊天机器人(2)
大模型WebUI:Gradio全解11——Chatbots:融合大模型的聊天机器人(2) 前言本篇摘要11. Chatbot:融合大模型的多模态聊天机器人11.2 使用流行的LLM库和API11.2.1 Llama Index11.2.2 LangChain11.2.3 OpenAI1. 基本用法2. …...
课题推荐——基于GPS的无人机自主着陆系统设计
关于“基于GPS的无人机自主着陆系统设计”的详细展开,包括项目背景、具体内容、实施步骤和创新点。如需帮助,或有导航、定位滤波相关的代码定制需求,请点击文末卡片联系作者 文章目录 项目背景具体内容实施步骤相关例程MATLAB例程python例程 …...
HQChart使用教程30-K线图如何对接第3方数据44-DRAWPIE数据结构
HQChart使用教程30-K线图如何对接第3方数据44-DRAWPIE数据结构 效果图DRAWPIEHQChart代码地址后台数据对接说明示例数据数据结构说明效果图 DRAWPIE DRAWPIE是hqchart插件独有的绘制饼图函数,可以通过麦语法脚本来绘制一个简单的饼图数据。 饼图显示的位置固定在右上角。 下…...
张朝阳惊现CES展,为中国品牌 “代言”的同时,或将布局搜狐新战略!
每年年初,科技圈的目光都会聚焦在美国拉斯维加斯,因为这里将上演一场被誉为 “科技春晚” 的年度大戏 ——CES 国际消费电子展。作为全球规模最大、最具影响力的科技展会之一,CES 吸引了来自 160 多个国家的创新者和行业领导者,是…...
堆排序+选择排序详解
目录 1.选择排序的定义 2.选择排序的优缺点 2.1优点 2.2缺点 3.思考 4.优化后的选择排序的实现 5.选择排序的代码 6.堆排序 7.向上/向下调整算法 8. 向下向上调整代码 9.堆排序代码 1.选择排序的定义 选择排序(SelectSort),以第一个为开始值,…...
【Arthas命令实践】heapdump实现原理
🎮 作者主页:点击 🎁 完整专栏和代码:点击 🏡 博客主页:点击 文章目录 使用原理 使用 dump java heap, 类似 jmap 命令的 heap dump 功能。 【dump 到指定文件】 heapdump arthas-output/dump.hprof【只 …...
python-leetcode-判断子序列
392. 判断子序列 - 力扣(LeetCode) class Solution:def isSubsequence(self, s: str, t: str) -> bool:i, j 0, 0 # i 指向 s,j 指向 twhile i < len(s) and j < len(t):if s[i] t[j]:i 1j 1return i len(s)...
【Verdi实用技巧-Part2】
Verdi实用技巧-Part2 2 Verdi实用技巧-Part22.1 Dump波形常用的task2.1.1 Frequently Used Dump Tasks2.1.2 Demo 2.2 提取波形信息小工具--FSDB Utilities2.3 Debug in Source code view2.3.1 Find Scopes By Find Scope form 2.3.2 Go to line in Souce code View2.3.3 Use B…...
常用的AT命令,用于查看不同类型的网络信息
文章目录 1. ATCSQ:2. ATCREG:3. ATCOPS:4. ATCGATT:5. ATCGPADDR: 在AT命令集中,用于查看网络信息的命令有多种,具体取决于所使用的设备和模块。以下是一些常用的AT命令࿰…...
【应用篇】09.实现简易的Shell命令行解释器
一、shell和bash的关系 shell是命令解释器,它接收用户的命令并将其传递给内核去执行。bash,即GNU Bourne-Again Shell,是shell的一种实现方式,也是大多数linux系统下默认的shell。 bash的原理 大多数的指令进程(除了内建命令&…...
负载均衡技术【内网去外网运营商出口负载均衡】
1 负载均衡概述 LB(Load Balance,负载均衡)是一种集群技术,它将特定的业务(网络服务、网络流量等)分担给多台网络设备(包括服务器、防火墙等)或多条链路,从而提高了业务…...
【广西乡镇界】arcgis格式shp数据乡镇名称和编码2020年内容测评
【广西乡镇界】arcgis格式shp数据乡镇名称和编码2020年内容测评...
半导体数据分析: 玩转WM-811K Wafermap 数据集(一) AI 机器学习
在半导体行业,工程师依靠 CP Yield(生产过程中芯片的合格率)、WAT(晶圆验收测试)和 Particle 的晶圆图模式来识别工艺问题。然而,在没有人工干预的情况下将这些晶圆图模式分类是一项重大挑战。许多论文都研…...
mongodb安装并设置用户验证登录
下载地址 https://www.mongodb.com/try/download/community-kubernetes-operator 偶数版是稳定版,基数版是开发版 ,对32位支持不好 --------------------------------CentOS下安装mongodb--------------------------------------------------- 解压安装包…...
《零基础Go语言算法实战》【题目 1-16】字符串的遍历与比较
《零基础Go语言算法实战》 【题目 1-16】字符串的遍历与比较 给出两个字符串,请编写程序以确定能否将其中一个字符串重新排列后变成另一个字符串, 并规定大小写是不同的字符,空格也作为字符考虑。保证两个字符串的长度小于或等于 5000。 …...
VUE3封装一个Hook
在 Vue 3 中,Composition API 让我们能够封装和复用代码逻辑,尤其是通过 setup 函数进行组件间的复用。为了提高代码的可复用性,我们可以把一些常见的 API 请求和状态管理逻辑封装到一个单独的 hook 中。 以下是一个简单的例子,我…...
【Linux】Linux常见指令(上)
个人主页~ 初识Linux 一、Linux基本命令1、ls指令2、pwd命令3、cd指令4、touch指令5、mkdir指令6、rmdir指令7、rm指令8、man指令9、cp指令10、mv命令 Linux是一个开源的、稳定的、安全的、灵活的操作系统,Linux下的操作都是通过指令来实现的 一、Linux基本命令 先…...
嵌入式 C 语言:一维数组
目录 一、定义 二、内存布局 三、数组的初始化 3.1. 完全初始化 3.2. 部分初始化 3.3. 不指定大小初始化 四、使用数组 4.1. 访问数组元素 4.1.1. 通过索引访问数组元素 4.1.2. 通过指针访问数组元素 4.2. 遍历数组 4.3. 数组作为函数参数 五、应用场景 5.1. 数据…...
NineData云原生智能数据管理平台新功能发布|2024年12月版
本月发布 7 项更新,其中重点发布 2 项、功能优化 5 项。 重点发布 数据库 Devops - Oracle 非表对象支持可视化创建与管理 Oracle 非表对象,包括视图(View)、包(Package)、存储过程(Procedur…...
iOS - 自旋锁
在 Objective-C 运行时中大量使用自旋锁,主要有以下几个原因: 1. 性能考虑 上下文切换成本 // 自旋锁实现 static ALWAYS_INLINE void OSSpinLockLock(volatile OSSpinLock *lock) {do {while (lock->value ! 0) {__asm__ volatile ("pause&q…...
域名备案页面模板
域名备案模板,首页底下正中央位置需要有备案号。 主要是给不太擅长于前端样式的人提供一个备案模板,直接把这个H5放到nginx的index.html就可以访问了 <html><body><div class"login-container"><h2>登录</h2>&…...
【socketioxide和axum集成-实现websocket实时通信-Rust点滴】
socketioxide的axum集成 启动socketio依靠examle里的layer一. 使用可变State依靠axum里的example二.提取client,IP1. 非代理,tcp,socket对方地址2.代理情况下socket.req_parts. 三. axum的handle中使用emit发送消息.1. io,存入State解决.2.把io存入初始设定作为唯一单例3.http-…...
计算机网络(第8版)第3章--PPP课后习题
【3-09】 一 个PPP 帧的数据部分(用十六进制写出)是7 D 5EFE 277D 5D7D 5D657D 5E。 试问真正的数据是什么(用十六进制写出)? 解答:把由转义符7D开始的2字节序列用下画线标出: 7D 5E FE 27 7D 5D 7D 5D 65 7D 5E 7D 5E应当还原成为7E。 7D5D 应…...
通过Android Studio修改第三方jar包并重新生成jar包
最近接手了来自公司其他同事的一个Unity项目,里面有一个封装的jar包要改动一下,无奈关于这个jar包的原工程文件丢失了,于是自己动手来修改下jar包,并做下记录。 一、导入第三方jar包 1、新建项目EditJarDemo(项目名随便取) 2、新建libs文件夹,把你要修改的third.jar 复制…...
Rabbitmq 业务异常与未手动确认场景及解决方案
消费端消费异常,业务异常 与 未手动确认是不是一个场景,因为执行完业务逻辑,再确认。解决方案就一个,就是重试一定次数,然后加入死信队列。还有就是消费重新放入队列,然后重新投递给其他消费者,…...
3D机器视觉的类型、应用和未来趋势
3D相机正在推动机器视觉市场的增长。很多制造企业开始转向自动化3D料箱拣选,专注于使用3D视觉和人工智能等先进技术来简化操作并减少开支。 预计3D相机将在未来五年内推动全球机器视觉市场,这得益于移动机器人和机器人拣选的强劲增长。到 2028 年&#…...