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

EPICS libCom库(4) -- epicsTimer

epicsTimer.h描述了一个C++和C timer功能。

1 C++接口

1.1 epicsTimerNotify和epicsTimer


/* 使用一个timer的代码必须实现epicsTimerNotify */
class LIBCOM_API epicsTimerNotify {
public:enum restart_t { noRestart, restart };class expireStatus {public:LIBCOM_API expireStatus ( restart_t );LIBCOM_API expireStatus ( restart_t, const double & expireDelaySec );LIBCOM_API bool restart () const;LIBCOM_API double expirationDelay () const;private:double delay;};virtual ~epicsTimerNotify () = 0;/* 返回"noRestart"或者"expireStatus ( restart, 30.0 )" */virtual expireStatus expire ( const epicsTime & currentTime ) = 0;virtual void show ( unsigned int level ) const;
};class LIBCOM_API epicsTimer {
public:/* 调用cancel并且接着销毁这个timer */virtual void destroy () = 0;virtual void start ( epicsTimerNotify &, const epicsTime & ) = 0;virtual void start ( epicsTimerNotify &, double delaySeconds ) = 0;/* WARNING: A deadlock will occur if you hold a lock while* calling this function that you also take within the timer* expiration callback.*/virtual void cancel () = 0;struct expireInfo {expireInfo ( bool active, const epicsTime & expireTime );bool active;epicsTime expireTime;};virtual expireInfo getExpireInfo () const = 0;double getExpireDelay ();virtual void show ( unsigned int level ) const = 0;
protected:virtual ~epicsTimer () = 0; /* protected => delete() must not be called */
};
方法含义

epicsTimerNotify

::expire()

使用一个epicsTimer的代码必须保护一个从epicsTimerNotify继承的类。派生类必须实现方法expire(),其在相关联timer超时时被epicsTimer调用。epicsTimerNotify定义了一个类expireStatus,它使得实现一次性和周期timers变得简单。一次性expire()以语句return(noRestart)返回;周期性timer用像return(restart,10.0)的语句返回;此处第二个参数是下次回调前的延时。
epicsTimerepicsTimer是一个抽象基类。只能通过调用createTimer创建一个epics timer,createTimer是epicsTimeQueue的一个方法。
destroy提供这个替代析构函数。在释放由这个timer使用的所有资源前,这将自动调用cancel。
start()启动这个timer,到以指定时间或者在之后指定的秒数发生超时。如果在调用start前,timer已经活动了,它首先被取消。
cancel()如果计时器被调度了,取消它。如果它未被调度,什么也不做。注意:如果expire()方法已经运行了,这个调用延时到expire()结束。

getExpireInfo

获取expireInfo, 其表明timer是否活动以及如果这样,它何时结束。
getExpireDelay返回秒数,直到timer超时。如果timer没有活动,它返回DBL_MAX
show()显示有关对象的信息

1.2 epicsTimerQueue

class epicsTimerQueue {
public:virtual epicsTimer & createTimer () = 0;virtual void show ( unsigned int level ) const = 0;
protected:LIBCOM_API virtual ~epicsTimerQueue () = 0;
};
方法含义
createTimer()这是一个创建使用这个队列的timers的工厂方法。
show()显示有关对象的信息

 

1.3 epicsTimerQueueActive

class epicsTimerQueueActive: public epicsTimerQueue {
public:static LIBCOM_API epicsTimerQueueActive & allocate (bool okToShare, unsigned threadPriority = epicsThreadPriorityMin + 10 );virtual void release () = 0;
protected:LIBCOM_API virtual ~epicsTimerQueueActive () = 0;
};
方法含义
allocate()这是创建一个timer队列的工厂方法。如果okToShare是(true, false),则一个(共享的,单独的)线程将管理这个timer请求。如果okToShare构造器参数是true并且一个timer队列已经运行在指定的优先级,则它将被引用用于有程序共享使用,并且将不创建一个独立的timer队列。不应该从一个C++静态构造函数内调用这个方法,由于队列线程要求一个当前的时间提供者可用并且在所有构造器完成运行前不能确保已经注册了最后手段的时间提供者。编者注释:如果有多个处理器,这对两个独立timer队列运行在相同优先级是有用的。
release()释放这个队列,即:进行调用的功能将不再使用这个队列。调用者必须确保它不再拥有任何活动的timers。当使用队列的最后功能调用release时,由这个队列使用的所有资源被释放。

1.4 epicsTimerQueueNotify和epicsTimerQueuePassive

class epicsTimerQueueNotify {
public:/* 当一个新的timer被插入到这个队列时以及到下次超时的延时修改时被调用 */virtual void reschedule () = 0;/* if there is a quantum in the scheduling of timer intervals *//* return this quantum in seconds. If unknown then return zero.*/virtual double quantum () = 0;
protected:LIBCOM_API virtual ~epicsTimerQueueNotify () = 0;
};class epicsTimerQueuePassive: public epicsTimerQueue {
public:static LIBCOM_API epicsTimerQueuePassive & create ( epicsTimerQueueNotify & );LIBCOM_API virtual ~epicsTimerQueuePassive () = 0; /* ok to call delete */virtual double process ( const epicsTime & currentTime ) = 0; /* returns delay to next expire */
};
方法含义

epicsTimerQueueNotify

::reschedule()

当在timer队列上到下次timer超时时的延时更高时,虚拟函数epicsTimerQueueNotify::reschedule()被调用。

epicsTimerQueueNotify

::quantum

虚函数epicsQueueNotifyQueue::quantum()返回这个计时器以秒为单位的expire间隔调度量。这使得不同类型的计时器队列能够使用程序特定的计时器expire延时调度策略。epicsTimerQueueActive的实现为这个目的使用了epicsThreadSleep(),并且因而epicsTimerQueueActive::quantum()返回从epicsThreadSleepQuantum()返回的值。其它类型的计时器队列可能选择使用了专用硬件中断的计时器失效。在这种情况中,epicsTimerQueueNotify::quantum()可能返回一个反映一个硬件计时器精度的值。如果未知,则epicsTimerQueueNotify::quantum()返回0。

epicsTimerQueuePassive

epicsTimerQueuePassive是一个抽象基类,因而不能直接被实例化,但包含一个创建一个具体被动计时器队列的派生类对象的静态成员函数。
create()一个创建一个非线程化计时器队列的工厂类。进行调用的软件也传递一个从epicsTimerQueueNotify派生的对象来接收reschedule()回调。
~epicsTimerQueuePassive()析构器。调用者必须确保它不拥有任何活动的计时器,即:在删除这个epicsTimerQueuePassive对象前,它必须删除任何活动的计时器。
process()这为所有已经过期的计时器调用expire()。创建这个队列的工具必须调用这个。在下次计时器失效前,它返回这个延时。

2 C接口

typedef struct epicsTimerForC * epicsTimerId;
typedef void ( *epicsTimerCallback ) ( void *pPrivate );/* 线程管理的计时器队列 */
typedef struct epicsTimerQueueActiveForC * epicsTimerQueueId;
// 分配
LIBCOM_API epicsTimerQueueId epicsStdCallepicsTimerQueueAllocate ( int okToShare, unsigned int threadPriority );
// 释放
LIBCOM_API void epicsStdCallepicsTimerQueueRelease ( epicsTimerQueueId );
LIBCOM_API epicsTimerId epicsStdCallepicsTimerQueueCreateTimer ( epicsTimerQueueId queueid,epicsTimerCallback callback, void *arg );
LIBCOM_API void epicsStdCallepicsTimerQueueDestroyTimer ( epicsTimerQueueId queueid, epicsTimerId id );
LIBCOM_API void  epicsStdCallepicsTimerQueueShow ( epicsTimerQueueId id, unsigned int level );/* 被动计时器队列 */
typedef struct epicsTimerQueuePassiveForC * epicsTimerQueuePassiveId;
typedef void ( * epicsTimerQueueNotifyReschedule ) ( void * pPrivate );
typedef double ( * epicsTimerQueueNotifyQuantum ) ( void * pPrivate );
LIBCOM_API epicsTimerQueuePassiveId epicsStdCallepicsTimerQueuePassiveCreate ( epicsTimerQueueNotifyReschedule,epicsTimerQueueNotifyQuantum, void *pPrivate );
LIBCOM_API void epicsStdCallepicsTimerQueuePassiveDestroy ( epicsTimerQueuePassiveId );
LIBCOM_API epicsTimerId epicsStdCallepicsTimerQueuePassiveCreateTimer (epicsTimerQueuePassiveId queueid, epicsTimerCallback pCallback, void *pArg );
LIBCOM_API void epicsStdCallepicsTimerQueuePassiveDestroyTimer ( epicsTimerQueuePassiveId queueid, epicsTimerId id );
LIBCOM_API double epicsStdCallepicsTimerQueuePassiveProcess ( epicsTimerQueuePassiveId );
LIBCOM_API void  epicsStdCallepicsTimerQueuePassiveShow ( epicsTimerQueuePassiveId id, unsigned int level );/* 计时器 */
LIBCOM_API void epicsStdCallepicsTimerStartTime ( epicsTimerId id, const epicsTimeStamp *pTime );
LIBCOM_API void epicsStdCallepicsTimerStartDelay ( epicsTimerId id, double delaySeconds );
LIBCOM_API void epicsStdCallepicsTimerCancel ( epicsTimerId id );
LIBCOM_API double epicsStdCallepicsTimerGetExpireDelay ( epicsTimerId id );
LIBCOM_API void  epicsStdCallepicsTimerShow ( epicsTimerId id, unsigned int level );

C接口提供了大部分C++接口的功能。它没有提供周期计时器特性。typedefs epicsTimerQueueNotifyReschedule和epicsTimerQueueNotifyQuantumn是等价于epicsTimerQueueNotify::reschedule()和epicsTimerQueueNotify::quantumn()的C接口。

3 示例

本例分配一个计时器队列和两个对象,它们有一个使用这个队列的计时器。每个对象被请求调度它自己。expire()回调仅打印这个对象的名称。在调度每个对象后,主线程为每个要发生超期的对象仅睡眠足够长时间并且接着在释放这个队列后就返回。

#include <stdio.h>
#include "epicsThread.h"
#include "epicsTimer.h"
#include "epicsTime.h"class Something : public epicsTimerNotify {public:Something(const char * nm, epicsTimerQueueActive &queue):name(nm), timer(queue.createTimer()){}virtual ~Something(){ timer.destroy(); }void start(double delay) {timer.start(*this, delay);}virtual expireStatus expire(const epicsTime &currentTime){printf("%s\n", name);currentTime.show(1);return noRestart;}private:const char * name;epicsTimer &timer;
};int main()
{epicsTimerQueueActive &queue = epicsTimerQueueActive::allocate(true);{Something first("first", queue);Something second("second", queue);first.start(1.0);second.start(1.5);epicsThreadSleep(2.0);}queue.release();return 0;
}

编译以上程序,并且执行:

orangepi@orangepi800:~/host_program/hostpgrmApp$ O.linux-aarch64/epicstimer
first
epicsTime: Thu Aug 17 2023 20:31:17.573360337
second
epicsTime: Thu Aug 17 2023 20:31:18.074096491

派生于epicsTimerNotify的Something类的实例化对象first和second之间调度时间相差0.5秒。

4 C示例

此示例展示了C程序如何使用EPICS计时器。本例中构造一个结构体,其中包含3个整型遍历,一个函数,在计时器回调函数中用传入结构体中的函数处理两个成员变量op1和op2,并且把结果存储到成员变量ret中。在主线程中,按指定格式输出在计时器回调函数中计算的结果。

#include <stdio.h>
#include "epicsTimer.h"
#include "epicsThread.h"typedef int (* ADDFUNC)(int, int);int add(int i, int j)
{return i + j;
}int mul(int i, int j)
{return i * j;
}typedef struct Data
{int op1;int op2;char op;ADDFUNC func;int ret;}Data;static void handler(void * arg)
{Data * data = (Data *)arg;printf("Timer tripped:%c\n", data->op);data->ret = data->func(data->op1, data->op2);printf("Go out of the timer:%c\n", data->op);
}int main(int argc, int argv)
{epicsTimerQueueId timerQueue;epicsTimerId first, second;// create the queue of timer requeststimerQueue = epicsTimerQueueAllocate(1,epicsThreadPriorityScanHigh);// create the timersData data1, data2;data1.op1 = 6;data1.op2 = 6;data1.op = '+';data1.func = add;data2.op1 = 6;data2.op2 = 6;data2.op = '*';data2.func = mul;first = epicsTimerQueueCreateTimer(timerQueue, handler, (void *)&data1);second = epicsTimerQueueCreateTimer(timerQueue, handler, (void *)&data2);/* start a timer */printf("First timer should trip in 3 seconds.\n");epicsTimerStartDelay(first, 3.0);epicsThreadSleep(5.0);printf("Frist timer should have triped by now.\n");printf("%d %c %d = %d\n", data1.op1, data1.op,data1.op2, data1.ret);// try starting and then cancelling a requestprintf("Second timer should trip in 3 seconds\n");epicsTimerStartDelay(first, 3.0);epicsTimerStartDelay(second, 3.0);epicsThreadSleep(1.0);epicsTimerCancel(first);epicsThreadSleep(5.0);printf("Second timer should have tripped, first timer should not havetripped\n");printf("%d %c %d = %d\n", data2.op1, data2.op,data2.op2, data2.ret);/* cleanup a single timer */epicsTimerQueueDestroyTimer(timerQueue, first);// cleanup an entire of timersepicsTimerQueueRelease(timerQueue);return 0;
}

编译以上程序并且运行,结果如下:

orangepi@orangepi800:~/host_program/hostpgrmApp$ O.linux-aarch64/epicstimerdemo
First timer should trip in 3 seconds.
Timer tripped:+
Go out of the timer:+
Frist timer should have triped by now.
6 + 6 = 12
Second timer should trip in 3 seconds
Timer tripped:*
Go out of the timer:*
Second timer should have tripped, first timer should not havetripped
6 * 6 = 36

相关文章:

EPICS libCom库(4) -- epicsTimer

epicsTimer.h描述了一个C和C timer功能。 1 C接口 1.1 epicsTimerNotify和epicsTimer /* 使用一个timer的代码必须实现epicsTimerNotify */ class LIBCOM_API epicsTimerNotify { public:enum restart_t { noRestart, restart };class expireStatus {public:LIBCOM_API expir…...

成都大运会,保障大型活动无线电安全需要…

成都大运会 7月28日&#xff0c;备受关注的第31届世界大学生夏季运动会在成都正式开幕。据悉&#xff0c;这是全球首个5G加持的智慧大运会&#xff0c;也是众多成熟信息技术的综合“应用场”。使用基于5G三千兆、云网、8K超高清视频等技术&#xff0c;在比赛现场搭建多路8K摄像…...

【Spring Boot】构建RESTful服务 — 实战:实现Web API版本控制

实战&#xff1a;实现Web API版本控制 前面介绍了Spring Boot如何构建RESTful风格的Web应用接口以及使用Swagger生成API的接口文档。如果业务需求变更&#xff0c;Web API功能发生变化时应该如何处理呢&#xff1f;可以通过Web API的版本控制来处理。 1.为什么进行版本控制 …...

6.Web后端开发【SpringBoot入门】

文章目录 1 SpringBoot快速入门1.1 Web分析 2. HTTP协议2.1 HTTP-概述2.1.1 介绍2.2.2 特点 2.2 HTTP-请求协议2.3 HTTP-响应协议2.3.1 格式介绍2.3.2 响应状态码 常见的相应状态码 3 WEB服务器3.1 服务器概述 1 SpringBoot快速入门 Spring的官网Spring Boot 可以帮助我们非常…...

[ubuntu]ubuntu18.04使用自带共享桌面实现vncserver连接

vncserver有很多方法比如你安装vnc4server,tightvncserver,x11vnc等都可以实现vnc局域网连接&#xff0c;今天使用系统共享桌面设置vnc连接 Ubuntu开启远程桌面 Ubuntu18.04使用gnome桌面环境&#xff0c;系统自带屏幕共享和远程登录功能&#xff0c;默认使用的是vino作为VNC…...

docker启用cgroup v2

要求 本人的操作系统是kali&#xff0c;基于debian docker info如果你这里是2那么说明启用了&#xff0c;如果是1&#xff0c;那么就未启用 对于Docker来说&#xff0c;Cgroups v2的使用需要满足以下条件&#xff1a; Linux内核版本在4.15以上。 uname -r 系统已经启用Cgro…...

Java课题笔记~ Axios

Axios 对原生的AJAX进行封装&#xff0c;简化书写。 Axios官网是&#xff1a;https://www.axios-http.cn 2.1 基本使用 axios 使用是比较简单的&#xff0c;分为以下两步&#xff1a; 引入 axios 的 js 文件 <script src"js/axios-0.18.0.js"></script…...

ip地址和地理位置有关系吗

在互联网时代&#xff0c;网络已经成为了人们生活中不可或缺的一部分。而在网络通信中&#xff0c;IP地址扮演着非常重要的角色。那么&#xff0c;IP地址和地理位置之间是否有关系呢&#xff1f;虎观代理小二二将从以下几个方面进行探讨。 一、IP地址和地理位置的基本概念 首…...

mac指定node版本 mac node版本降级 mac切换node版本

本文解决问题&#xff1a; mac指定node版本 mac切换node版本 mac node版本降级 第一步 进行nvm 安装操作 brew install nvm 执行 nvm --version nvm --version 出现zsh: command not found: nvm问题去进行配置第二步 nvm配置 1.输入: vim ~/.bash_profile 点击 i 进行插入…...

C# Windows登录界面进行截图,控制鼠标键盘等操作实现(一)

首先常规的账户进程是没办法获取登录界面的信息的&#xff0c;因为登录界面已经不在某个账户下了&#xff0c;登录界面显示了每一个账户的切换。所以得使用System权限的进程。 那么Windows系统究竟是怎么将登录界面与用户桌面隔离开的呢&#xff1f;首先先通过一些Windows操作系…...

因果推断(五)基于谷歌框架Causal Impact的因果推断

因果推断&#xff08;五&#xff09;基于谷歌框架Causal Impact的因果推断 除了传统的因果推断外&#xff0c;还有一些机器学习框架可以使用&#xff0c;本文介绍来自谷歌框架的Causal Impact。该方法基于合成控制法的原理&#xff0c;利用多个对照组数据来构建贝叶斯结构时间…...

VR全景加盟项目如何开展?如何共赢VR时代红利?

VR全景作为一个新兴蓝海项目&#xff0c;相信有着很多人刚接触VR行业的时候都会有这样的疑问&#xff1a;VR全景加盟后项目如何开展&#xff1f;今天&#xff0c;我们就从项目运营的三个阶段为大家讲解。 一、了解项目时 目前VR全景已经被应用到各行各业中去&#xff0c;学校、…...

Win10+anaconda+CUDA+pytorch+vscode配置

Win10anacondaCUDApytorchvscode配置 1.安装anaconda2.安装CUDA确认CUDA版本确认CUDA和pytorch版本安装CUDA 3.安装cudnn4.安装Pytorch5.vscode配置安装VScodevscode配置pytorch环境 1.安装anaconda 官网https://www.anaconda.com 下载安装&#xff0c;路径全英文然后记得有一…...

vue-router在vue2/3区别

构建选项区别 vue2-router const router-new VueRouter({mode:history,base:_name,})vue-next-router import { createRouter,createWebHistory} from vue-next-router const routercreateRouter({history:createHistory(/) })在上述代码中我们发现,vue2中的构建选项mode和ba…...

Apache Doris 入门教程33:统计信息

统计信息 统计信息简介​ Doris 查询优化器使用统计信息来确定查询最有效的执行计划。Doris 维护的统计信息包括表级别的统计信息和列级别的统计信息。 表统计信息&#xff1a; 信息描述row_count表的行数data_size表的⼤⼩&#xff08;单位 byte&#xff09;update_rows收…...

有效需求的特征

如何区分优秀的软件需求和软件需求规格说明书&#xff08;SRS&#xff09;与可能导致问题的需求和规格说明书&#xff1f;在这篇文章中&#xff0c;我们将首先讨论单个需求应该具有的几种不同特性。然后&#xff0c;我们将讨论成功的SRS整体应具有的理想特征。 1.有效需求的特…...

基于51单片机无线温度报警控制器 NRF24L01 多路温度报警系统设计

一、系统方案 1、本设计默认采用STC89C52单片机&#xff0c;如需更换单片机请联系客服。 2、接收板LCD1602液晶实时显示当前检测的2点温度值以及对应的上下限报警值。发射板由DS18B20采集温度值&#xff0c;通过无线模块NRF24L01传给接收板。 3、按键可以设置温度上下限值&…...

Spring Data JPA的@Entity注解

一、示例说明 rules\CouponTypeConverter.java Converter public class CouponTypeConverterimplements AttributeConverter<CouponType, String> {Overridepublic String convertToDatabaseColumn(CouponType couponCategory) {return couponCategory.getCode();}Overr…...

CANoe panel中,Path Dialog如何保存选择的文件路径

这里写目录标题 Path Dialog控件的设置系统变量和环境变量 Path Dialog控件的设置 过滤加载的文件类型 填写格式为&#xff1a;Hex file |.hex 其中Hex file为自定义name&#xff0c;.hex为你想识别的文件类型 系统变量和环境变量 系统变量&#xff1a;在canoe的Environmen…...

关于es中索引,倒排索引的理解

下面是我查询进行理解的东西 也就是说我们ES中的索引就相当于我们mysql中的数据库表&#xff0c;索引库就相当于我们的数据库&#xff0c;我们按照mapping规则会根据相应的字段&#xff08;index为true默认&#xff09;来创建倒排索引&#xff0c;这个倒排索引就相当于我们索引…...

k8s service (二)

K8s service (二) Endpoint Endpoint是kubernetes中的一个资源对象&#xff0c;存储在etcd中&#xff0c;用来记录一个service对应的所有pod访问地址&#xff0c;它是根据service匹配文件中selector描述产生的。 一个Service由一组Pod组成&#xff0c;这些Pod通过Endpoints…...

桌面软件开发框架 Electron、Qt、WPF 和 WinForms 怎么选?

一、Electron Electron 是一个基于 Web 技术的跨平台桌面应用程序开发框架。它使用 HTML、CSS 和 JavaScript 来构建应用程序界面,并借助 Chromium 渲染引擎提供强大的页面渲染能力。Electron 的主要特点包括: 跨平台:Electron 可以在 Windows、macOS 和 Linux 等多个主流操…...

SSM框架的学习与应用(Spring + Spring MVC + MyBatis)-Java EE企业级应用开发学习记录(第二天)Mybatis的深入学习

SSM框架的学习与应用(Spring Spring MVC MyBatis)-Java EE企业级应用开发学习记录&#xff08;第二天&#xff09;Mybatis的深入学习&#xff08;增删改查的操作&#xff09; 上一篇我们的项目搭建好了&#xff0c;也写了简答的Junit测试类进行测试&#xff0c;可以正确映射…...

学习笔记:Opencv实现限制对比度得自适应直方图均衡CLAHE

2023.8.19 为了完成深度学习的进阶&#xff0c;得学习学习传统算法拓展知识面&#xff0c;记录自己的学习心得 CLAHE百科&#xff1a; 一种限制对比度自适应直方图均衡化方法&#xff0c;采用了限制直方图分布的方法和加速的插值方法 clahe&#xff08;限制对比度自适应直方图…...

R语言处理缺失数据(1)-mice

#清空 rm(listls()) gc()###生成模拟数据### #生成100个随机数 library(magrittr) set.seed(1) asd<-rnorm(100, mean 60, sd 10) %>% round #平均60&#xff0c;标准差10 #将10个数随机替换为NA NA_positions <- sample(1:100, 10) asd[NA_positions] <- NA #转…...

SpringBoot自动配置原理

Spring Boot 的自动配置可以根据添加的jar依赖&#xff0c;自动配置 Spring Boot 应用程序。例如&#xff0c;我们想要使用Redis&#xff0c;直接在POM文件中增加spring-boot-starter-data-redis依赖&#xff0c;然后我们配置下连接信息就可以使用了。 那么Spring Boot 是如何…...

HarmonyOS学习路之方舟开发框架—学习ArkTS语言(状态管理 五)

管理应用拥有的状态概述 LocalStorage&#xff1a;页面级UI状态存储 LocalStorage是页面级的UI状态存储&#xff0c;通过Entry装饰器接收的参数可以在页面内共享同一个LocalStorage实例。LocalStorage也可以在UIAbility内&#xff0c;页面间共享状态。 本文仅介绍LocalStora…...

Java基础篇——反射枚举

反射&枚举 课程目标 1. 【理解】类加载器 2. 【理解】什么是反射 3. 【掌握】获取Class对象的三种方式 4. 【掌握】反射获取构造方法并创建对象 5. 【掌握】反射获取成员变量并使用 6. 【掌握】反射获取成员方法并使用 7. 【掌握】反射综合案例 8. 【理解】枚举B友:http…...

每日一学——案例难点Windows配置

在Windows上配置DNS服务器有几个步骤&#xff1a; 步骤1&#xff1a;打开网络连接设置 在任务栏上右键单击网络图标&#xff0c;并选择“打开网络和Internet设置”。 在新窗口中&#xff0c;选择“更改适配器选项”。 在打开的窗口中&#xff0c;找到正在使用的网络适配器&a…...

2023.8 - java - 运算符

Java 运算符 算术运算符关系运算符位运算符逻辑运算符赋值运算符其他运算符 算术运算符 算术运算符用在数学表达式中&#xff0c;它们的作用和在数学中的作用一样。下表列出了所有的算术运算符。 表格中的实例假设整数变量A的值为10&#xff0c;变量B的值为20&#xff1a; …...

推荐三款Scrum敏捷项目管理工具/敏捷管理实践

免费版敏捷工具推荐&#xff1a; Leangoo领歌 Leangoo领歌是ScrumCN&#xff08;scrum.cn&#xff09;旗下的一款永久免费的专业敏捷开发管理工具&#xff0c;提供端到端敏捷研发管理解决方案&#xff0c;涵盖敏捷需求管理、任务协同、进展跟踪、缺陷管理、统计度量等。包括小…...

WARNING: undefined behavior - version of Delve is too old for Go version

在更新了 go 版本后&#xff0c;使用 goland 进行调试会报错 WARNING: undefined behavior - version of Delve is too old for Go version 1.20.5 (maximum supported version 1.19)这是因为 go 的版本升级后&#xff0c;相对 dlv 的版本就低了。 所以解决办法就是升级对应的…...

https非对称加密算法

非对称加密算法原理 在客户端公开公钥&#xff0c;服务端保存私钥 1.客户端第一次请求先请求443端口&#xff0c;从443端口下载公钥。 2.客户端将数据进行公钥算法进行加密&#xff0c;将秘文发送到服务端 服务端收到秘文后&#xff0c;通过私钥算法进行解密得到明文数据。…...

“深入探索JVM:Java虚拟机背后的奥秘“

标题&#xff1a;深入探索JVM&#xff1a;Java虚拟机背后的奥秘 摘要&#xff1a;本文将深入探索Java虚拟机&#xff08;JVM&#xff09;的内部工作原理和关键组成部分&#xff0c;揭示JVM背后的奥秘。通过对类加载机制、内存管理、垃圾回收、即时编译等方面的详细介绍&#x…...

树莓派系统入门教程(三)—— 使用Windows上的VSCode远程连接树莓派进行Python开发

树莓派系统入门教程&#xff08;三&#xff09;—— 使用Windows上的VSCode远程连接树莓派进行Python开发 1. 安装VSCode和SSH扩展2. SSH连接配置3. 连接到树莓派4. 运行Python程序5. 建议和注意事项 很多开发者更喜欢在大屏幕和强大的开发环境中编写代码&#xff0c;但同时他们…...

如何使用HTML5新增的标签来优化SEO?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 使用HTML5新增的标签来优化SEO&#xff1f;⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&#xff01;这个专栏是为那些对…...

LVS之keepalived

1、keepalived 概述 总结&#xff1a;Keepalived 软件就是通过VRRP协议来实现高可用功能。 应用场景&#xff1a;企业应用中&#xff0c;单台服务器承担应用存在单点故障的危险 单点故障一旦发生&#xff0c;企业服务将发生中断&#xff0c;造成极大的危害 VRRP通信原理&…...

Linux(入门篇)

Linux&#xff08;入门篇&#xff09; Linux概述Linux是什么Linux的诞生Linux和Unix的渊源GNU/LinuxLinux的发行版Linux VS Windows Linux概述 Linux是什么 Linux是一个操作系统(OS) Linux的诞生 作者&#xff1a;李纳斯托瓦兹&#xff08;git也是他开发的&#x1f602;&am…...

如何构造不包含字母和数字的webshell

利用不含字母与数字进行绕过 1.异或进行绕过 2.取反进行绕过 3.利用php语法绕过 利用不含字母与数字进行绕过 基本代码运行思路理解 <?php echo "A"^""; ?> 运行结果为! 我们可以看到&#xff0c;输出的结果是字符"!"。之所以会…...

springboot(JavaCV )实现视频截取第N帧并保存图片

springboot&#xff08;JavaCV &#xff09;实现视频截取第N帧并保存图片 现在视频网站展示列表都是用img标签展示的&#xff0c;动图用的是gif&#xff0c;但是我们上传视频时并没有视屏封面&#xff0c;就这需要上传到服务器时自动生成封面并保存 本博客使用jar包的方式实现…...

Linux面试笔试题(5)

79、下列工具中可以直接连接mysql的工具有【c 】。 A.xhsell B.plsql C.navicat D.以上都不是 Navicat 是一套可创建多个连接的数据库开发工具&#xff0c; 让你从单一应用程序中同时连接 MySQL、Redis、MariaDB、MongoDB、 SQL Server、Oracle、PostgreSQL和 SQLite 。它与…...

WordPress文章:创建和优化您的网站内容

WordPress是一种流行的内容管理系统&#xff08;CMS&#xff09;&#xff0c;用于创建和管理网站。无论您是个人博客作者、企业网站管理员还是电子商务店主&#xff0c;WordPress都是一个强大而灵活的平台&#xff0c;可帮助您展示和传达您的信息。本文将为您提供一些关于创建和…...

Selenium webdriver_manager根据浏览器版本自动下载对应驱动程序

前言 webdriver_manager是什么&#xff1f; webdriver_manager 是 Python 中的一个库&#xff0c;用于管理 Web 驱动程序。它的作用是自动下载和设置不同浏览器&#xff08;如 Chrome、Firefox、Edge 等&#xff09;的 Web 驱动程序&#xff0c;以便在自动化测试中使用这些浏…...

2023 - java - 强制类型转换和装箱

强制类型转换和装箱&#xff1a; 在 Java 中&#xff0c;(Integer) 和(int) 是两个不同的类型转换操作符&#xff0c;它们的效果是不一样的。 int a (Integer) t.getContent(); 这条语句使用了装箱&#xff08;Boxing&#xff09;操作&#xff0c;将一个整数对象&#xff08;…...

使用ansible自动化部署Kubernetes

使用 kubeasz 部署 Kubernetes 集群 服务器列表&#xff1a; IP主机名角色192.168.100.142kube-master1,kube-master1.suosuoli.cnK8s 集群主节点 1192.168.100.144kube-master2,kube-master2.suosuoli.cnK8s 集群主节点 2192.168.100.146kube-master3,kube-master3.suosuoli…...

k8s v1.27.4 部署metrics-serverv:0.6.4,kube-prometheus

只有一个问题&#xff0c;原来的httpGet存活、就绪检测一直不通过&#xff0c;于是改为tcpSocket后pod正常。 wget https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml修改后的yaml文件&#xff0c;镜像修改为阿里云 apiVersion: …...

6-模板初步使用

官网: 中文版: 介绍-Jinja2中文文档 英文版: Template Designer Documentation — Jinja Documentation (2.11.x) 模板语法 1. 模板渲染 (1) app.py 准备数据 import jsonfrom flask import Flask,render_templateimport settingsapp Flask(__name__) app.config.from_obj…...

STM32CubeMX配置STM32F103 USB Virtual Port Com(HAL库开发)

1.配置外部高速晶振 2.勾选USB功能 3.将USB模式配置Virtual Port Com 4.将系统主频配置为72M,USB频率配置为48M. 5.配置好项目名称&#xff0c;开发环境&#xff0c;最后获取代码。 6.在CDC_Receive_FS函数中写入USB发送函数。这样USB接收到的数据就好原样发送。 7.将串口助手打…...

RocketMQ与Kafka对比(18项差异)

淘宝内部的交易系统使用了淘宝自主研发的Notify消息中间件,使用MySQL作为消息存储媒介,可完全水平扩容,为了进一步降低成本,我们认为存储部分可以进一步优化,2011年初,Linkin开源了Kafka这个优秀的消息中间件,淘宝中间件团队在对Kafka做过充分Review之后,Kafka无限消息…...

英文翻译照片怎么做?掌握这个方法轻松翻译

在现代社会中&#xff0c;英文已经成为了一种全球性的语言&#xff0c;因此&#xff0c;我们在阅读文章或者查看图片时&#xff0c;经常会遇到英文的内容。为了更好地理解这些英文内容&#xff0c;我们需要将其翻译成中文。在本文中&#xff0c;我将探讨图片中英文内容翻译的方…...