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

日志系统前置知识

日志:程序运行过程中所记录的程序运行状态信息。通过这些信息,以便于程序员能够随时根据状态信息,对系统的运行状态进行分析。功能:能够让用户非常简便的进行日志的输出以及控制。

同步写日志

同步日志是指当输出日志时,必须等待日志输出语句执行完毕后,才能执行后面的业务逻辑语句,日志输出语句与程序的业务逻辑语句将在同⼀个线程运行。每次调用⼀次打印日志API就对应⼀次系统调用write写日志文件。

在高并发场景下,随着日志数量不断增加,同步日志系统容易产生系统瓶颈: 一方面,大量的日志打印陷入等量的write系统调用,有⼀定系统开销。 另一方面,使得打印日志的进程附带了大量同步的磁盘IO,影响程序性能。

异步写日志  

异步日志是指在进行日志输出时,日志输出语句与业务逻辑语句并不是在同⼀个线程中运行,而是有专门的线程用于进行日志输出操作。业务线程只需要将日志放到⼀个内存缓冲区中不用等待即可继续执行后续业务逻辑(作为日志的生产者),而日志的落地操作交给单独的日志线程去完成(作为日志的消费者), 这是⼀个典型的生产-消费模型。

这样做的好处是即使日志没有真的地完成输出也不会影响程序的主业务,可以提高程序的性能: 主线程调用日志打印接口成为非阻塞操作,同步的磁盘IO从主线程中剥离出来交给单独的线程完成。

不定参宏函数

#include <stdio.h>
#define LOG(fmt,...) printf("[%s:%d]" fmt,__FILE__,__LINE__,##__VA_ARGS__);//fmt是格式化字符串,包含许多格式化字符,要从后面取出各种各样不同的参数来组织字符串, 而...标识是不定参,而宏__VA_ARGS__是使用不定参。##是告诉我们当不定参是空的时候则取消前面的逗号
int main()
{printf("[%s:%d]""%s",__FILE__,__LINE__,"hello wjj\n");//__FILE__,__LINE__两个宏说明是所在文件和行号。LOG("%s%d\n","wjj",666);LOG("hello wjj\n");//此时不定参是空,所以##起了作用。return 0;
}

 


#include <iostream>
#include <cstdarg>
void printNum(int n, ...) //打印数字,我们首先得确定有多少个数字,n代表传入数字的个数,而传的数字是不确定的。
{va_list al;va_start(al, n);//获取地址参数的起始地址,这里就是获取参数n之后的第一个不定参数的起始地址for (int i = 0; i < n; i++) {int num = va_arg(al, int);//从不定参数中获取出⼀个整形参数,这也是va_arg函数第二个参数的意思。std::cout << num << std::endl;}va_end(al);//清空可变参数列表--其实是将al指针置空
}
int main()
{printNum(3,1,2,3);return 0;
}
//printf前面格式化的字符串里面格式化的字符%d、%s告诉我们编译器接下来应该从后面取几个字节的数据当做整型数据还是字符串来进行处理。

//模拟实现一下printf的实现
#include <iostream>
#include <cstdarg>
void myprintf(const char *fmt, ...) 
{char *res;va_list al;va_start(al, fmt);//fmt有什么格式化的字符,决定我们从后面取出什么类型的数据int len = vasprintf(&res, fmt, al);//int vasprintf(char **strp, const char *fmt, va_list ap);借用res会自己申请空间,根据fmt格式化字符,从格式化参数列表al里面取出一个一个的参数进行数据组织,并放入申请的空间里面去。 va_end(al);std::cout << res << std::endl;free(res);//要释放
}
int main()
{myprintf("%s-%d", "wjj", 25);myprintf("hello wjj");return 0;
}

#include <iostream>
#include <cstdarg>
#include <memory>
#include <functional>
void xprintf() //对函数模板进行特化,增加一个无参的形式。
{std::cout << std::endl;
}
template<typename T, typename ...Args>//后者定义的是一个不定参参数包类型
void xprintf(const T &value, Args &&...args) 
{std::cout << value << " ";//先打印第一个参数if ((sizeof ...(args)) > 0) //获得参数包的个数{xprintf(std::forward<Args>(args)...);//采用一种递归的思想,完美转发,你传递过来的时候是左值,现在就还是左值。 并且还要补充一个无参的形式}else {xprintf();}
}
int main()
{xprintf("wjj");xprintf("wjj", 666);xprintf("hello", "wjj", 666);return 0;
}

  

设计模式

单例模式

⼀个类只能创建⼀个对象,即单例模式,该设计模式可以保证系统中该类只有⼀个实例,并提供⼀个访问它的全局访问点,该实例被所有程序模块共享。

//饿汉模式,用空间换时间的思想
class Singleton 
{
private:static Singleton _eton;//使用static来修饰。这里属于成员声明,并非定义,类内的静态成员需要在类外进行定义。
private:Singleton():_data(99){std::cout<<"单例对象构造\n";}//构造函数私有化,保证类外无法实例化对象,只能在类内实例化,~Singleton(){}int _data;
public:Singleton(const Singleton&) = delete;Singleton& operator=(const Singleton&) = delete;static Singleton& getInstance() //提供一个访问接口{return _eton;}int GetData(){return _data;}
};
Singleton Singleton::_eton;//类内的静态成员需要在类外定义。静态对象的资源是在静态区的,它的生命周期随整个程序的,它的初始化构造是在我们程序初始化阶段就完成的。不管你用不用,这个对象的资源都已经分配了。int main()
{std::cout<<Singleton::getInstance().GetData()<<std::endl;//就算没有这行代码,这个单例对象也会构造return 0;
}

//懒汉模式,延迟加载的思想,也就是一个对象到用的时候在进行实例化,而不是程序一起来不管用与否都进行实例化
//实现方法:定义对象的时候是定义一个对象的指针,在通过访问接口的时候发现其为空再去new一个对象
class Singleton { 
private:Singleton():_data(99){std::cout<<"单例对象构造\n";}//构造函数私有化,保证类外无法实例化对象~Singleton(){}int _data;
public: Singleton(const Singleton&) = delete;Singleton& operator=(const Singleton&) = delete;static Singleton& getInstance() { static Singleton _eton;//确保C++11起,静态变量将能够在满⾜thread-sa fe的前提下唯⼀地被构造和析构,这里静态局部对象的定义是线程安全的,多个线程试图同时初始化同一个静态局部变量时,初始化只会发生一次。return _eton; } int GetData(){return _data;}
}; int main()
{std::cout<<Singleton::getInstance().GetData()<<std::endl;//没有这行代码,这个单例对象不会构造return 0;
}

工厂模式

工厂模式是⼀种创建型设计模式, 它提供了⼀种创建对象的最佳⽅式。在工厂模式中,我们创建对象 时不会对上层暴露创建逻辑,而是通过使用⼀个共同结构来指向新创建的对象,以此实现创建-使用的分离。

//简单⼯⼚模式:通过参数控制可以⽣产任何产品
// 优点:简单粗暴,直观易懂。使⽤⼀个⼯⼚⽣产同⼀等级结构下的任意产品
// 缺点:
// 1. 所有东西⽣产在⼀起,产品太多会导致代码量庞⼤
// 2. 开闭原则遵循(开放拓展,关闭修改)的不是太好,要新增产品就必须修改⼯⼚⽅法。
class Fruit 
{
public:Fruit(){}virtual void show() = 0;
};
class Apple : public Fruit 
{
public:Apple() {}virtual void show() {std::cout << "我是⼀个苹果" << std::endl;}
};
class Banana : public Fruit 
{
public:Banana() {}virtual void show() {std::cout << "我是⼀个⾹蕉" << std::endl;}
};class FruitFactory 
{
public:static std::shared_ptr<Fruit> create(const std::string &name) {if (name == "苹果") {return std::make_shared<Apple>();}else if(name == "⾹蕉") {return std::make_shared<Banana>();}return std::shared_ptr<Fruit>();}
};
int main()
{std::shared_ptr<Fruit> fruit = FruitFactory::create("苹果");fruit->show();fruit = FruitFactory::create("⾹蕉");fruit->show();return 0;
}


 

//工厂方法模式:在简单⼯⼚模式下新增多个⼯⼚,多个产品,每个产品对应⼀个⼯⼚。
#include <iostream>
#include <memory>
#include<string>
class Fruit
{
public:Fruit() {}virtual void show() = 0;
};
class Apple : public Fruit
{
public:Apple() {}virtual void show(){std::cout << "我是⼀个苹果" << std::endl;}private:std::string _color;
};
class Banana : public Fruit
{
public:Banana() {}virtual void show(){std::cout << "我是⼀个⾹蕉" << std::endl;}
};
class FruitFactory
{
public:virtual std::shared_ptr<Fruit> create() = 0;
};
class AppleFactory : public FruitFactory
{
public:virtual std::shared_ptr<Fruit> create(){return std::make_shared<Apple>();}
};class BananaFactory : public FruitFactory
{
public:virtual std::shared_ptr<Fruit> create(){return std::make_shared<Banana>();}
};int main()
{std::shared_ptr<FruitFactory> ff(new AppleFactory()); std::shared_ptr<Fruit> fruit_apple = ff->create();fruit_apple->show();ff.reset(new BananaFactory());//更改fruit_apple管理的对象std::shared_ptr<Fruit> fruit_banana = ff->create();fruit_banana->show();return 0;
}

//抽象工厂:围绕一个超级工厂创建其他工厂。每个生成的工厂按照工厂模式提供对象。
//思想:将工厂抽象成两层,抽象工厂 & 具体简单工厂子类, 在工厂子类种生产不同类型的子产品
#include<iostream>
#include<memory>
class Fruit {public:Fruit(){}virtual void show() = 0;
};
class Apple : public Fruit {public:Apple() {}virtual void show() {std::cout << "我是一个苹果" << std::endl;}private:std::string _color;
};
class Banana : public Fruit {public:Banana() {}virtual void show() {std::cout << "我是一个香蕉" << std::endl;}
};
class Animal {public:virtual void voice() = 0;
};
class Lamp: public Animal {public:void voice() { std::cout << "咩咩咩\n"; }
};
class Dog: public Animal {public:void voice() { std::cout << "汪汪汪\n"; }
};class Factory //通过这个抽象工厂类派生出水果工厂和动物工厂
{public:virtual std::shared_ptr<Fruit> getFruit(const std::string &name) = 0;virtual std::shared_ptr<Animal> getAnimal(const std::string &name) = 0;
};class FruitFactory : public Factory {public:virtual std::shared_ptr<Animal> getAnimal(const std::string &name) {return std::shared_ptr<Animal>();//生产水果就采用返回一个空的智能指针就可以了}virtual std::shared_ptr<Fruit> getFruit(const std::string &name) {if (name == "苹果") {return std::make_shared<Apple>();}else if(name == "香蕉") {return std::make_shared<Banana>();}return std::shared_ptr<Fruit>();}
};class AnimalFactory : public Factory {protected:public:virtual std::shared_ptr<Fruit> getFruit(const std::string &name) {return std::shared_ptr<Fruit>();}virtual std::shared_ptr<Animal> getAnimal(const std::string &name) {if (name == "小羊") {return std::make_shared<Lamp>();}else if(name == "小狗") {return std::make_shared<Dog>();}return std::shared_ptr<Animal>();}
};class FactoryProducer {public:static std::shared_ptr<Factory> getFactory(const std::string &name) {if (name == "动物") {return std::make_shared<AnimalFactory>();}else {return std::make_shared<FruitFactory>();}}
};int main()
{std::shared_ptr<Factory> fruit_factory = FactoryProducer::getFactory("水果");//先生产水果工厂std::shared_ptr<Fruit> fruit_apple=fruit_factory->getFruit("苹果");fruit_apple->show();std::shared_ptr<Factory> animal_factory = FactoryProducer::getFactory("动物");//先生动物果工厂std::shared_ptr<Animal> animal_dog=animal_factory->getAnimal("小狗");animal_dog->voice();return 0;
}

建造者模式

建造者模式是⼀种创建型设计模式, 使⽤多个简单的对象⼀步⼀步构建成⼀个复杂的对象,能够将⼀ 个复杂的对象的构建与它的表⽰分离,提供⼀种创建对象的最佳⽅式。主要⽤于解决对象的构建过于 复杂的问题。

#include <iostream>
#include <memory>
#include<string>
/*抽象电脑类,里面有许多零部件需要安装*/
class Computer {public:using ptr = std::shared_ptr<Computer>;Computer() {}void setBoard(const std::string &board) {_board = board;}//一个电脑类得由各个下属的子类才能完成构造,比如说键盘void setDisplay(const std::string &display) {_display = display;}//得有显示器virtual void setOs() = 0;//得有操作系统,这是一个抽象类不同类型电脑得由不同操作系统。std::string toString() {std::string computer = "Computer:{\n";computer += "\tboard=" + _board + ",\n"; computer += "\tdisplay=" + _display + ",\n"; computer += "\tOs=" + _os + ",\n"; computer += "}\n";return computer;} protected://方便派生列访问呢std::string _board;//构造电脑需要的三个零部件std::string _display;std::string _os;
};/*派生出具体产品类*/
class MacBook : public Computer {public:using ptr = std::shared_ptr<MacBook>;MacBook() {}virtual void setOs() {_os = "Max Os X12";}
};/*抽象建造者类:将零件建造出来,包含创建一个产品对象的各个部件的抽象接口,建造者类是先将各个零部件生产出来,然后返回具体的对象*/
class Builder {public:using ptr = std::shared_ptr<Builder>;virtual void buildBoard(const std::string &board) = 0;virtual void buildDisplay(const std::string &display) = 0;virtual void buildOs() = 0;virtual Computer::ptr build() = 0;
};/*具体产品的具体建造者类:实现抽象接口,构建和组装各个部件*/
class MackBookBuilder : public Builder {public:using ptr = std::shared_ptr<MackBookBuilder>;MackBookBuilder(): _computer(new MacBook()) {}virtual void buildBoard(const std::string &board) {_computer->setBoard(board);}virtual void buildDisplay(const std::string &display) {_computer->setDisplay(display);}virtual void buildOs() {_computer->setOs();}virtual Computer::ptr build() {return _computer;}private:Computer::ptr _computer;
};/*由于零部件的构造还会有顺序要求,所以这里采用指挥者类,提供给调用者使用,通过指挥者来获取产品*/
class Director {public:Director(Builder* builder):_builder(builder){}//指挥者指挥的是一个Builder对象void construct(const std::string &board, const std::string &display) //建造对象{_builder->buildBoard(board);_builder->buildDisplay(display);_builder->buildOs();}private:Builder::ptr _builder;
};int main()
{Builder *buidler = new MackBookBuilder();//MackBookBuilder建造者建造mac电脑,工人建造没有顺序之分std::unique_ptr<Director> pd(new Director(buidler));//pd指挥建造者如何建造,先做什么后做什么。pd->construct("英特尔主板", "LG显示器");Computer::ptr computer = buidler->build();std::cout << computer->toString();return 0;
}

 代理模式

代理模式指代理控制对其他对象的访问, 也就是代理对象控制对原对象的引⽤,完成原对象基础之上的一些额外功能。

/*房东要把⼀个房⼦通过中介租出,而不是从房东手上租房*/
#include <iostream>
#include <string>
class RentHouse//租房类
{
public:virtual void rentHouse() = 0;
};
/*房东类:将房⼦租出去*/
class Landlord : public RentHouse//房东类
{
public:void rentHouse(){std::cout << "将房⼦租出去\n";}
};
/*中介代理类:代理了房东的类,对租房⼦进⾏功能加强,实现租房以外的其他功能*/
class Intermediary : public RentHouse
{
public:void rentHouse(){std::cout << "发布招租启⽰\n";std::cout << "带⼈看房\n";_landlord.rentHouse();std::cout << "负责租后维修\n";}
private:Landlord _landlord;
};
int main()
{Intermediary intermediary;intermediary.rentHouse();return 0;
}

 项目框架

日志系统:
作用:将一 条消息, 进行格式化称为指定格式的字符串后,写入到指定位置
1.日志要写入指定位置(标准输出,指定文件,滚动文件....),日志系统需要支持将日志消息落地到不同的位置---多落地方向
2.日志写入指定位置,支持不同的写入方式(同步,异步):
同步:业务线程自己负责日志的写入(流程简单,但是有可能会因为阻塞导致效率降低)
异步:业务线程将日志放入缓冲区内存,让其他异步线程负责将日志写入指定位置
3.日志输出以日志器为单位,支持多日志器(不同的项目组有不同的输出策略)、日志器的管理
模块划分:
日志等级模块:枚举出日志分为多少个等级---对不同的日志有不同等级标记- -以便于控制输出
日志消息模块:封装-条日志所需的各种要素 (时间,线程ID,文件名,行号,日志等级,消息主体.....)
消息格式化模块:按照指定的格式,对于日志消息关键要素进行组织,最终得到一个指定格式的字符串
 

相关文章:

日志系统前置知识

日志&#xff1a;程序运行过程中所记录的程序运行状态信息。通过这些信息&#xff0c;以便于程序员能够随时根据状态信息&#xff0c;对系统的运行状态进行分析。功能&#xff1a;能够让用户非常简便的进行日志的输出以及控制。 同步写日志 同步日志是指当输出日志时&#xff…...

【Spring Boot 3】【Web】全局异常处理

【Spring Boot 3】【Web】全局异常处理 背景介绍开发环境开发步骤及源码工程目录结构总结背景 软件开发是一门实践性科学,对大多数人来说,学习一种新技术不是一开始就去深究其原理,而是先从做出一个可工作的DEMO入手。但在我个人学习和工作经历中,每次学习新技术总是要花费…...

Dcoker 运行es

1&#xff0c;创建network docker network create my-network 2&#xff0c;docker运行es容器 docker run -d --name es-container --net my-network -p 9200:9200 -p 9300:9300 -e "discovery.typesingle-node" docker.elastic.co/elasticsearch/elasticsearch:7…...

7系列FPGA HR/HP I/O区别

HR High Range I/O with support for I/O voltage from 1.2V to 3.3V. HP High Performance I/O with support for I/O voltage from 1.2V to 1.8V. UG865&#xff1a;Zynq-7000 All Programmable SoC Packaging and Pinout...

sqli-labs靶场通关攻略(五十一到六十关)

sqli-labs-master靶场第五十一关 步骤一&#xff0c;尝试输入?sort1 我们发现这关可以报错注入 步骤二&#xff0c;爆库名 ?sort1 and updatexml(1,concat(0x7e,database(),0x7e),1)-- 步骤三&#xff0c;爆表名 ?sort1 and updatexml(1,concat(0x7e,(select group_conc…...

c语言中的动态内存管理

在 C 语言中&#xff0c;动态内存管理主要通过以下几个函数实现&#xff1a; 一、malloc 函数 功能&#xff1a; malloc 函数用于在内存的动态存储区中分配一块长度为 size 字节的连续区域。函数返回一个指向分配区域起始地址的指针&#xff0c;如果分配失败则回 NULL 示例: …...

生信机器学习入门4 - scikit-learn训练逻辑回归(LR)模型和支持向量机(SVM)模型

通过逻辑回归&#xff08;logistic regression&#xff09;建立分类模型 1.1 逻辑回归可视化和条件概率 激活函数 (activation function)&#xff1a; 一种函数&#xff08;如 ReLU 或 S 型函数&#xff09;&#xff0c;用于对上一层的所有输入进行求加权和&#xff0c;然后生…...

COD论文笔记 Adaptive Guidance Learning for Camouflaged Object Detection

论文的主要动机、现有方法的不足、拟解决的问题、主要贡献和创新点如下&#xff1a; 动机&#xff1a; 论文的核心动机是解决伪装目标检测&#xff08;COD&#xff09;中的挑战性任务。伪装目标检测旨在识别和分割那些在视觉上与周围环境高度相似的目标&#xff0c;这对于计算…...

9.5LeetCode

80.删除有序数组重复项II 给你一个有序数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使得出现次数超过两次的元素只出现两次 &#xff0c;返回删除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的…...

数据仓库系列13:增量更新和全量更新有什么区别,如何选择?

你是否曾经在深夜加班时&#xff0c;面对着庞大的数据仓库&#xff0c;思考过这样一个问题&#xff1a;“我应该选择增量更新还是全量更新&#xff1f;” 这个看似简单的选择&#xff0c;却可能影响整个数据处理的效率和准确性。今天&#xff0c;让我们深入探讨这个数据仓库领域…...

数据 结构(内核链表)

一、内核链表&#xff08;是一个有头双向循环链表&#xff09; 1.内核提供的两个宏 (1) offsetof : 获取结构体成员到结构体开头的偏移量&#xff1b; (2) contianer_of : 通过偏移量获取结构体首地址&#xff1b; 2.代码示例&#xff1a; truct passager *create_passage…...

学习node.js十三,文件的上传于下载

文件上传 文件上传的方案&#xff1a; 大文件上传&#xff1a;将大文件切分成较小的片段&#xff08;通常称为分片或块&#xff09;&#xff0c;然后逐个上传这些分片。这种方法可以提高上传的稳定性&#xff0c;因为如果某个分片上传失败&#xff0c;只需要重新上传该分片而…...

【刷题笔记】删除并获取最大点数粉刷房子

欢迎来到 破晓的历程的 博客 ⛺️不负时光&#xff0c;不负己✈️ 题目一 题目链接&#xff1a;删除并获取最大点数 思路&#xff1a; 预处理状态表示 状态转移方程 代码如下&#xff1a; class Solution { public:int deleteAndEarn(vector<int>& nums) {int N1…...

【Linux 从基础到进阶】Elasticsearch 搜索服务安装与调优

Elasticsearch 搜索服务安装与调优 引言 Elasticsearch 是一个分布式的、基于 RESTful API 的搜索和分析引擎,专为快速处理大量数据而设计。它经常被用来进行全文搜索、日志和指标分析等操作。本文将介绍如何在 CentOS 和 Ubuntu 系统上安装 Elasticsearch,并进行必要的调优…...

IMU助力JAXA空间站机器人

近日&#xff0c;日本宇宙航空研究开发机构&#xff08;JAXA&#xff09;宣布&#xff0c;在国际空间站&#xff08;ISS&#xff09;实验舱“希望号”&#xff08;Kibo&#xff09;上部署的一款移动摄像机器人将采用Epson M-G370系列惯性测量单元&#xff08;IMU&#xff09;。…...

java开发,记录一些注解和架构

最近接了一个项目&#xff0c;说是项目其实也不算是项目&#xff0c;因为是把这个项目赛到其他项目中的。 熟悉一些这个项目的功能&#xff0c;梳理了一下&#xff0c;在代码开发中主要关心pojo、entity、respository、controller、service。 在这里主要记录前3个的流程与作用…...

【2024高教社杯全国大学生数学建模竞赛】B题 生产过程中的决策问题——解题思路 代码 论文

目录 问题 1&#xff1a;抽样检测方案的设计问题 2&#xff1a;生产过程中的决策问题 3&#xff1a;多工序、多零配件的生产决策问题 4&#xff1a;重新分析次品率题目难度分析1. 统计检测方案设计的复杂性&#xff08;问题 1&#xff09;2. 多阶段生产决策的复杂性&#xff08…...

JUnit 5和Mockito进行单元测试!

1. JUnit 5 基础 JUnit 5是最新的JUnit版本&#xff0c;它引入了许多新特性&#xff0c;包括更灵活的测试实例生命周期、参数化测试、更丰富的断言和假设等。 1.1 基本注解 Test&#xff1a;标记一个方法为测试方法。 BeforeEach&#xff1a;在每个测试方法之前执行。 AfterEac…...

LeetCode 算法:完全平方数 c++

原题链接&#x1f517;&#xff1a;完全平方数难度&#xff1a;中等⭐️⭐️ 题目 给你一个整数 n &#xff0c;返回 和为 n 的完全平方数的最少数量 。 完全平方数 是一个整数&#xff0c;其值等于另一个整数的平方&#xff1b;换句话说&#xff0c;其值等于一个整数自乘的…...

深入CSS 布局——WEB开发系列29

CSS 页面布局技术允许我们拾取网页中的元素&#xff0c;并且控制它们相对正常布局流、周边元素、父容器或者主视口/窗口的位置。 一、正常布局流&#xff08;Normal Flow&#xff09; CSS的布局基础是“正常流”&#xff0c;也就是页面元素在没有特别指定布局方式时的默认排列…...

微信小程序之bind和catch

这两个呢&#xff0c;都是绑定事件用的&#xff0c;具体使用有些小区别。 官方文档&#xff1a; 事件冒泡处理不同 bind&#xff1a;绑定的事件会向上冒泡&#xff0c;即触发当前组件的事件后&#xff0c;还会继续触发父组件的相同事件。例如&#xff0c;有一个子视图绑定了b…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器

一.自适应梯度算法Adagrad概述 Adagrad&#xff08;Adaptive Gradient Algorithm&#xff09;是一种自适应学习率的优化算法&#xff0c;由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率&#xff0c;适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具

文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践

6月5日&#xff0c;2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席&#xff0c;并作《智能体在安全领域的应用实践》主题演讲&#xff0c;分享了在智能体在安全领域的突破性实践。他指出&#xff0c;百度通过将安全能力…...

【分享】推荐一些办公小工具

1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由&#xff1a;大部分的转换软件需要收费&#xff0c;要么功能不齐全&#xff0c;而开会员又用不了几次浪费钱&#xff0c;借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...

JavaScript基础-API 和 Web API

在学习JavaScript的过程中&#xff0c;理解API&#xff08;应用程序接口&#xff09;和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能&#xff0c;使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...

CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝

目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为&#xff1a;一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...

【SpringBoot自动化部署】

SpringBoot自动化部署方法 使用Jenkins进行持续集成与部署 Jenkins是最常用的自动化部署工具之一&#xff0c;能够实现代码拉取、构建、测试和部署的全流程自动化。 配置Jenkins任务时&#xff0c;需要添加Git仓库地址和凭证&#xff0c;设置构建触发器&#xff08;如GitHub…...

协议转换利器,profinet转ethercat网关的两大派系,各有千秋

随着工业以太网的发展&#xff0c;其高效、便捷、协议开放、易于冗余等诸多优点&#xff0c;被越来越多的工业现场所采用。西门子SIMATIC S7-1200/1500系列PLC集成有Profinet接口&#xff0c;具有实时性、开放性&#xff0c;使用TCP/IP和IT标准&#xff0c;符合基于工业以太网的…...

GraphRAG优化新思路-开源的ROGRAG框架

目前的如微软开源的GraphRAG的工作流程都较为复杂&#xff0c;难以孤立地评估各个组件的贡献&#xff0c;传统的检索方法在处理复杂推理任务时可能不够有效&#xff0c;特别是在需要理解实体间关系或多跳知识的情况下。先说结论&#xff0c;看完后感觉这个框架性能上不会比Grap…...