C++实现神经网络框架(二):一元操作结点以及矩阵操作的添加
前情提要
上一篇:C++实现神经网络框架(一):从表达式树到自动微分框架的思路解读与代码实现
#define _DEBUG_
#include"Matrix.h"
#include"AutoGraph.h"
#include<iostream>
using namespace std;
int main()
{AutoGraph<Matrix<int>>a={{3,3},{4,4}};AutoGraph<Matrix<int>>b={{1,2},{3,2}};AutoGraph<Matrix<int>>c={{1,2},{3,2}};AutoGraph<Matrix<int>>d={{1,2},{1,1}};AutoGraph<Matrix<int>>ans=(a*b*c-b*c)*(d+a);cout<<"---延迟计算,根据表达式自动构建计算图,但不进行计算---\n"; cout<<"---打印表达式---\n";ans.plot_tree();cout<<"--------开始计算--------\n"; cout<<ans.one_shot_apply_data();
}
目前我们仅实现了四则运算
但是实际上我们还有很多运算需要添加
比如矩阵转置x=x.transpose(),矩阵求对数=x=x.log()
或者matmul(a,b)这种二元函数
也或者RandomNormal(stddev(5),mean(6))这样的数据生成节点
所以我们要继续对代码进行改进
node_type
之前的命名不太好,改了一下
namespace node_type
{constexpr int none=0;constexpr int data=1; //数据 constexpr int cond=2; //分支控制 ans=cond(boolen_expression,expression a,expression b)constexpr int binary_operator=3; //ans=a*bconstexpr int univariate_function=4; //一元函数 ans=log(a)constexpr int binary_function=5; //二元函数 ans=matlum(a,b)
};
Node
在Node类中添加必要的构造函数和function对象
部分更新的代码如下
template<typename Dtype>
class Node
{
public:...Node(Node*lnode,Node*rnode,std::function<Dtype&(Dtype&,Dtype&)>binary_function,std::string name="opt",int type=node_type::binary_operator); //构造操作节点,该结点作为lnode rnode两个结点的父节点 Node(Node*node,std::function<Dtype&(Dtype&)>binary_function,std::string name="opt",int type=node_type::univariate_function); void plot_expression()const; //中序遍历树(检查正确性) ...
private:... std::function<Dtype&(Dtype&,Dtype&)>binary_function; //接受一个二元函数,this->data=&this->binary_function(this->lchild-Ldata,this>rchild->data) std::function<Dtype&(Dtype&)>univariate_function; //接受一个无参函数 this->data=&this->univariate_function(this->lchild->data)...
};
template<typename Dtype>
Node<Dtype>::Node(Node*node,std::function<Dtype&(Dtype&)>univariate_function,std::string name,int type)
{this->visit=0;this->data=nullptr;this->lchild=node;this->rchild=nullptr;this->univariate_function=univariate_function;this->name=name;this->type=type;
}
AutoGraph
然后再对应的AutoGraph中也添加相应的构造函数
template<typename Dtype>
class AutoGraph
{
public:AutoGraph(const AutoGraph<Dtype>&lnode,AutoGraph<Dtype>&rnode,std::function<Dtype&(Dtype&,Dtype&)>binary_function,std::string name="binary_operator",int type=node_type::binary_operator);AutoGraph(AutoGraph<Dtype>&lnode,AutoGraph<Dtype>&rnode,std::function<Dtype&(Dtype&,Dtype&)>binary_function,std::string name="binary_function",int type=node_type::binary_function);AutoGraph(AutoGraph<Dtype>&node,std::function<Dtype&(Dtype&)>univariate_function,std::string name="univariate_function",int type=node_type::binary_function);
private:Node<Dtype>*root;
};
template<typename Dtype>
AutoGraph<Dtype>::AutoGraph(AutoGraph<Dtype>&child,std::function<Dtype&(Dtype&)>univariate_function,std::string name,int type)
{this->root=new Node<Dtype>(child.root,univariate_function,name,type);
}
macro
添加一些宏函数来方便写代码
//AutoGraph.h
#define LambdaBinaryOps(type,a,b,context) [](type a,type b)->type{return context;}
#define LambdaSingleOps(type,a,context) [](type a)->type{return context;}
//autograph_operator_register.h
#define autograph_register_binary_method(Cls,method)\
template<typename Dtype>\
AutoGraph<Cls<Dtype>>&method(AutoGraph<Cls<Dtype>>&a,AutoGraph<Cls<Dtype>>&b)\
{\return *new AutoGraph<Cls<Dtype>>(a,b,LambdaBinaryOps(Cls<Dtype>&,x,y,ensure_reference(x.method(y))),#method,node_type::binary_function);\
}
#define autograph_register_single_method(Cls,method)\
template<typename Dtype>\
AutoGraph<Cls<Dtype>>&method(AutoGraph<Cls<Dtype>>&a)\
{\return *new AutoGraph<Cls<Dtype>>(a,LambdaSingleOps(Cls<Dtype>&,x,ensure_reference(x.method())),#method,node_type::univariate_function);\
}
然后就是添加一些操作进去
#ifndef _AUTOGRAPH_OPERATOR_REGISTER_H_
#define _AUTOGRAPH_OPERATOR_RESIGTER_H_
autograph_register_binary_method(Matrix,matmul);
autograph_register_binary_method(Matrix,greater);
autograph_register_binary_method(Matrix,less);
autograph_register_single_method(Matrix,transpose);
autograph_register_single_method(Matrix,abs);
autograph_register_single_method(Matrix,square);
autograph_register_single_method(Matrix,exp);
autograph_register_single_method(Matrix,log);
#endif
测试代码
#define _DEBUG_MEMORY_
#include"Matrix.h"
#include"AutoGraph.h"
#include"autograph_operator_register.h"
#include<iostream>
using std::cout;
using std::endl;
int main()
{AutoGraph<Matrix<double>>a={{1,2,3},{4,5,6}};AutoGraph<Matrix<double>>b={{4,5,6},{7,8,1}};AutoGraph<Matrix<double>>c={{1,2},{3,4},{5,6}};AutoGraph<Matrix<double>>d={{1,2},{4,3}};AutoGraph<Matrix<double>>ans=(matmul(a*b,c))-d;ans=log(d+square(ans-d))-d;ans=abs(log(log(log((ans)))));ans=less(ans,d);cout<<ans.one_shot_apply_data();
// ans.clear_all();
}
#define _DEBUG_
#include"Matrix.h"
#include"AutoGraph.h"
#include"autograph_operator_register.h"
#include<iostream>
using std::cout;
using std::endl;
int main()
{AutoGraph<Matrix<double>>a={{1,2,3},{4,5,6}};AutoGraph<Matrix<double>>b={{4,5,6},{7,8,1}};AutoGraph<Matrix<double>>c={{1,2},{3,4},{5,6}};AutoGraph<Matrix<double>>d={{1,2},{4,3}};AutoGraph<Matrix<double>>ans=(matmul(a*b,c))-d;ans=log(d+square(ans-d))-d;ans=abs(log(log(log((ans)))));ans=less(ans,d);cout<<ans.apply_data();ans.clear_all();
}
#include"Matrix.h"
#include"AutoGraph.h"
#include"autograph_operator_register.h"
#include<iostream>
using std::cout;
using std::endl;
int main()
{AutoGraph<Matrix<double>>a={{1,2,3},{4,5,6}};AutoGraph<Matrix<double>>b={{4,5,6},{7,8,1}};AutoGraph<Matrix<double>>c={{1,2},{3,4},{5,6}};AutoGraph<Matrix<double>>d={{1,2},{4,3}};AutoGraph<Matrix<double>>ans=(matmul(a*b,c))-d;ans=log(d+square(ans-d))-d;ans=abs(log(log(log((ans)))));ans=less(ans,d);ans.plot_expression();
}
程序结果
目前为止内存和计算上正常,没有出现内存泄漏的问题
不过该程序目前有点小BUG,在某种特殊情况下下指针的删除存在问题
就是拓扑排序上出问题了
暂时为解决emmm
先就这样了
解决这个之后
下一个任务就是Layer的前向传播和反向传播
部分主要代码
AutoGraph.h
#ifndef _AUTOGRAPH_H
#define _AUTOGRAPH_H
#include<iostream>
#include<cstring>
#include<functional>
#include<cmath>
#include"Matrix.h"
#define LambdaBinaryOps(type,a,b,context) [](type a,type b)->type{return context;}
#define LambdaSingleOps(type,a,context) [](type a)->type{return context;}
namespace node_type
{constexpr int none=0;constexpr int data=1; //数据 constexpr int cond=2; //分支控制 ans=cond(boolen_expression,expression a,expression b)constexpr int binary_operator=3; //ans=a*bconstexpr int univariate_function=4; //一元函数 ans=log(a)constexpr int binary_function=5; //二元函数 ans=matlum(a,b)
};
template<typename T>
typename std::enable_if<std::is_fundamental<T>::value,T>::type& ensure_reference(T a)
{return *new T(a);
} //如果是基本类型,按值传参返回一个引用
template<typename T>
typename std::enable_if<!std::is_fundamental<T>::value,T>::type& ensure_reference(T&a)
{return a;
} //如果是一个class,传入引用,返回自己
template<bool cond,typename T>
struct enable_reference
{typedef T type;
};
template<typename T> //enable_reference<is_fundamental<T>::value,T>::type
struct enable_reference<false,T> //如果是基本类型,按值传参,否则传递引用
{ //class cls{}; typedef T& type; //cout<<is_reference<enable_reference<is_fundamental<cls>::value,cls>::type>::value; //true
}; //cout<<is_reference<enable_reference<is_fundamental<int>::value,int>::type>::value; //false
template<typename Dtype>
class Node
{
public:Node();Node(Dtype&data,std::string name="data"); //构造数据节点 Node(Node*lnode,Node*rnode,std::function<Dtype&(Dtype&,Dtype&)>binary_function,std::string name="opt",int type=node_type::binary_operator); //构造操作节点,该结点作为lnode rnode两个结点的父节点 Node(Node*node,std::function<Dtype&(Dtype&)>binary_function,std::string name="opt",int type=node_type::binary_operator); ~Node();Node(const Node&node);Dtype&apply_data(); //计算该节点的值 Dtype&one_shot_apply_data();void plot_expression()const; //中序遍历树(检查正确性) void clear(); //清空中间过程的值 void clear_all(); //清空所有值
private:Dtype*data; std::function<Dtype&(Dtype&,Dtype&)>binary_function; //接受一个二元函数,this->data=&this->binary_function(this->lchild-Ldata,this>rchild->data) std::function<Dtype&(Dtype&)>univariate_function; //接受一个无参函数 this->data=&this->univariate_function(this->lchild->data)Node*lchild,*rchild;int type,visit;std::string name; //该节点的名称
};
template<typename Dtype>
Node<Dtype>::Node(const Node<Dtype>&node)
{this->visit=node.visit;this->data=new Dtype;this->lchild=new Node<Dtype>;this->rchild=new Node<Dtype>;this->binary_function=node.binary_function;this->name=node.name;this->type=node.type;*this->data=*node.data;*this->lchild=*node.lchild;*this->rchild=*node.rchild;
}
template<typename Dtype>
Node<Dtype>::Node()
{this->visit=0;this->data=nullptr;this->lchild=nullptr;this->rchild=nullptr;this->name="";this->type=node_type::none;
}
template<typename Dtype>
Node<Dtype>::Node(Dtype&data,std::string name)
{ this->visit=0;this->data=&data;this->lchild=nullptr;this->rchild=nullptr;this->name=name;this->type=node_type::data;
}
template<typename Dtype>
Node<Dtype>::Node(Node*lnode,Node*rnode,std::function<Dtype&(Dtype&,Dtype&)>binary_function,std::string name,int type)
{this->visit=0;this->data=nullptr;this->lchild=lnode;this->rchild=rnode;this->binary_function=binary_function;this->name=name;this->type=type;
}
template<typename Dtype>
Node<Dtype>::Node(Node*node,std::function<Dtype&(Dtype&)>univariate_function,std::string name,int type)
{this->visit=0;this->data=nullptr;this->lchild=node;this->rchild=nullptr;this->univariate_function=univariate_function;this->name=name;this->type=type;
}
template<typename Dtype>
Node<Dtype>::~Node() //递归删掉整个子树
{if(this->data)delete data;if(this->lchild)delete this->lchild;if(this->rchild)delete this->rchild;this->lchild=nullptr;this->rchild=nullptr; this->data=nullptr;
}
template<typename Dtype>
void Node<Dtype>::clear() //递归删掉整个子树被计算出来的数据
{if(this->type!=node_type::data){delete this->data;this->data=nullptr;}if(this->lchild)this->lchild->clear();if(this->rchild)this->rchild->clear();
#ifdef _DEBUG_ std::cout<<"name:"<<this->name<<" type: "<<this->type<<" data: "<<this->data<<std::endl;
#endif
}
#ifdef _DEBUG_
template<typename Dtype>
void Node<Dtype>::clear_all() //递归删掉所有数据,但是树结构保留了,用来测试的
{if(this->data){delete this->data;this->data=nullptr;}if(this->lchild)this->lchild->clear_all();if(this->rchild)this->rchild->clear_all();
// std::cout<<"name:"<<this->name<<" type: "<<this->type<<" data: "<<this->data<<std::endl;
}
#endif
template<typename Dtype>
void Node<Dtype>::plot_expression()const
{if(this->type==node_type::binary_function||this->type==node_type::univariate_function)std::cout<<this->name;if(this->type==node_type::binary_function||this->type==node_type::univariate_function||this->type==node_type::binary_operator)std::cout<<'(';if(this->lchild)this->lchild->plot_expression();if(this->type==node_type::data)std::cout<<(*this->data); else{if(this->type==node_type::binary_operator)std::cout<<" "<<this->name<<" ";if(this->type==node_type::binary_function)std::cout<<","; }if(this->rchild)this->rchild->plot_expression();if(this->type==node_type::binary_operator||this->type==node_type::univariate_function||this->type==node_type::binary_function)std::cout<<')';
}
template<typename Dtype>
Dtype&Node<Dtype>::apply_data()
{if(!this->data){if(this->type==node_type::binary_function||this->type==node_type::binary_operator)this->data=&this->binary_function(this->lchild->apply_data(),this->rchild->apply_data());else if(this->type==node_type::univariate_function)this->data=&this->univariate_function(this->lchild->apply_data()); }return *this->data;
}
template<typename Dtype>
Dtype&Node<Dtype>::one_shot_apply_data() //根节点数据没有被删除,因此析构函数少调用了一次.
{if(!this->data){if(this->type==node_type::binary_function||this->type==node_type::binary_operator){this->lchild->visit++;this->rchild->visit++;this->data=&this->binary_function(this->lchild->one_shot_apply_data(),this->rchild->one_shot_apply_data());this->lchild->visit--;this->rchild->visit--;}else if(this->type==node_type::univariate_function){this->lchild->visit++;this->data=&this->univariate_function(this->lchild->one_shot_apply_data());this->lchild->visit--;}}if(this->lchild&&this->lchild->data&&this->lchild->visit==0){delete this->lchild->data;this->lchild->data=NULL;}if(this->rchild&&this->rchild->data&&this->rchild->visit==0){delete this->rchild->data;this->rchild->data=NULL;}return*this->data;
}
template<typename Dtype>
class AutoGraph
{
public:AutoGraph(typename Dtype::ElemType constant);AutoGraph(typename Dtype::InitializerType a);AutoGraph(Dtype data);AutoGraph(Node<Dtype>&root);AutoGraph(const AutoGraph<Dtype>&lnode,AutoGraph<Dtype>&rnode,std::function<Dtype&(Dtype&,Dtype&)>binary_function,std::string name="binary_operator",int type=node_type::binary_operator);AutoGraph(AutoGraph<Dtype>&lnode,AutoGraph<Dtype>&rnode,std::function<Dtype&(Dtype&,Dtype&)>binary_function,std::string name="binary_function",int type=node_type::binary_function);AutoGraph(AutoGraph<Dtype>&node,std::function<Dtype&(Dtype&)>univariate_function,std::string name="univariate_function",int type=node_type::binary_function);virtual ~AutoGraph(){}AutoGraph&operator+(AutoGraph&)const;AutoGraph&operator*(AutoGraph&)const;AutoGraph&operator-(AutoGraph&)const;AutoGraph&operator/(AutoGraph&)const;void plot_expression()const; //打印结点 void clear(); //清空数据 void clear_all(); //清空所有数据(DEBUG) Dtype&apply_data(); //计算该节点的值 Dtype&one_shot_apply_data(); //计算该节点的值 Node<Dtype>*get_root()const; //得到树根
private:Node<Dtype>*root;
};
template<typename Dtype>
AutoGraph<Dtype>::AutoGraph(const AutoGraph<Dtype>&lchild,AutoGraph<Dtype>&rchild,std::function<Dtype&(Dtype&,Dtype&)>binary_function,std::string name,int type)
{this->root=new Node<Dtype>(lchild.root,rchild.root,binary_function,name,type);
}
template<typename Dtype>
AutoGraph<Dtype>::AutoGraph(AutoGraph<Dtype>&lchild,AutoGraph<Dtype>&rchild,std::function<Dtype&(Dtype&,Dtype&)>binary_function,std::string name,int type)
{this->root=new Node<Dtype>(lchild.root,rchild.root,binary_function,name,type);
}
template<typename Dtype>
AutoGraph<Dtype>::AutoGraph(AutoGraph<Dtype>&child,std::function<Dtype&(Dtype&)>univariate_function,std::string name,int type)
{this->root=new Node<Dtype>(child.root,univariate_function,name,type);
}
template<typename Dtype>
AutoGraph<Dtype>::AutoGraph(Node<Dtype>&root)
{this->root=&root;
}
template<typename Dtype>
AutoGraph<Dtype>::AutoGraph(typename Dtype::ElemType constant)
{this->root=new Node<Dtype>(*new Dtype(constant));
}
template<typename Dtype>
AutoGraph<Dtype>::AutoGraph(typename Dtype::InitializerType data) //InitializerType 是初始化Matrix用的类型,这里给AutoGraph构造函数偏特化一个版本出来
{this->root=new Node<Dtype>(*new Dtype(data));
}
template<typename Dtype>
AutoGraph<Dtype>::AutoGraph(Dtype data)
{this->root=new Node<Dtype>(*new Dtype(data));
}
template<typename Dtype>
AutoGraph<Dtype>&AutoGraph<Dtype>::operator+(AutoGraph<Dtype>&b)const //任何一种二元运算符操作都会产生一个新结点作为根结点
{return *new AutoGraph<Dtype>(*this,b,LambdaBinaryOps(Dtype&,a,b,ensure_reference(a+b)),"+");
}
template<typename Dtype>
AutoGraph<Dtype>&AutoGraph<Dtype>::operator-(AutoGraph<Dtype>&b)const //任何一种二元运算符操作都会产生一个新结点作为根结点
{return *new AutoGraph<Dtype>(*this,b,LambdaBinaryOps(Dtype&,a,b,ensure_reference(a-b)),"-");
}
template<typename Dtype>
AutoGraph<Dtype>&AutoGraph<Dtype>::operator*(AutoGraph<Dtype>&b)const //表达式树的构建就是二叉树不断合并的过程
{return *new AutoGraph<Dtype>(*this,b,LambdaBinaryOps(Dtype&,a,b,ensure_reference(a*b)),"·");
}
template<typename Dtype>
AutoGraph<Dtype>&AutoGraph<Dtype>::operator/(AutoGraph<Dtype>&b)const
{return *new AutoGraph<Dtype>(*this,b,LambdaBinaryOps(Dtype&,a,b,ensure_reference(a/b)),"/");
}
template<typename Dtype>
Dtype&AutoGraph<Dtype>::apply_data()
{return root->apply_data();
}
template<typename Dtype>
Dtype&AutoGraph<Dtype>::one_shot_apply_data()
{return root->one_shot_apply_data();
}
template<typename Dtype>
void AutoGraph<Dtype>::plot_expression()const
{this->root->plot_expression();
}
template<typename Dtype>
void AutoGraph<Dtype>::clear()
{this->root->clear();
}
template<typename Dtype>
void AutoGraph<Dtype>::clear_all()
{this->root->clear_all();
}
template<typename Dtype>
Node<Dtype>*AutoGraph<Dtype>::get_root()const
{ return this->root;
}
#endif
autograph_operator_register.h
#ifndef _AUTOGRAPH_OPERATOR_REGISTER_H_
#define _AUTOGRAPH_OPERATOR_RESIGTER_H_
#include"Matrix.h"
#include"AutoGraph.h"
#define autograph_register_binary_method(Cls,method)\
template<typename Dtype>\
AutoGraph<Cls<Dtype>>&method(AutoGraph<Cls<Dtype>>&a,AutoGraph<Cls<Dtype>>&b)\
{\return *new AutoGraph<Cls<Dtype>>(a,b,LambdaBinaryOps(Cls<Dtype>&,x,y,ensure_reference(x.method(y))),#method,node_type::binary_function);\
}
#define autograph_register_single_method(Cls,method)\
template<typename Dtype>\
AutoGraph<Cls<Dtype>>&method(AutoGraph<Cls<Dtype>>&a)\
{\return *new AutoGraph<Cls<Dtype>>(a,LambdaSingleOps(Cls<Dtype>&,x,ensure_reference(x.method())),#method,node_type::univariate_function);\
}
autograph_register_binary_method(Matrix,matmul);
autograph_register_binary_method(Matrix,greater);
autograph_register_binary_method(Matrix,less);
autograph_register_single_method(Matrix,transpose);
autograph_register_single_method(Matrix,abs);
autograph_register_single_method(Matrix,square);
autograph_register_single_method(Matrix,exp);
autograph_register_single_method(Matrix,log);
autograph_register_single_method(Matrix,pow);
#endif
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
相关文章
- 无需代码,1秒搞定QQ和微信多开!
有很多小伙伴不知道如何在电脑上实现微信多开(一台电脑登录2个及以上的微信号)。市面上流传着很多三方工具来辅助实现在电脑上登录多个微信号。甚至还有略显高端地写几行代码来实现这个功能。虽说条条大路可以通罗马,为什么我们不用选择最近的那一条呢?今天小编教你1秒解锁…...
2024/5/8 22:12:08 - Java EE企业级应用开发教程练习题答案---第四章Spring的数据库开发(仅供参考)
第四章Spring的数据库开发 单选题 1、下列有关AOP专业术语中,用于指那些被拦截到的点的是()。 A、Joinpoint B、Pointcut C、Aspect D、Advice 参考答案 :A 2、以下关于Spring AOP 的介绍错误的是()。 A、AOP的全称是Aspect-Oriented Programming,即面向切面编程(也称面…...
2024/5/8 14:31:28 - 关于轮播图的学习与实现
HTML部分代码 <div class="wrap"><ul class="list"><li class="item active">0</li><li class="item">1</li><li class="item">2</li><li class="item">3…...
2024/5/8 19:21:32 - nginx.conf文件配置实用案例
这里演示以编译安装的nginx1.16版本:#配置文件路径:/usr/local/nginx/conf/nginx.conf#user nobody; worker_processes 4; worker_rlimit_nofile 1024000; working_directory /nginx;error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/err…...
2024/5/8 17:15:06 - stash 使用
使用场景:1.当你代码写一半,没提交的时候,突然想切个分支.2.当你本地代码不是最新的时候,这时候想提交一笔代码可以通过stash先暂存当前代码,然后做且分支或者 拉取远程分支的代码然后再把stash中的代码还原回来,者之间如果有冲突就解决冲突,然后就可以提交最新代码了具体操作如…...
2024/5/9 6:06:15 - 彻底禁止迅雷基础服务自启动 彻底删除卸载阿里巴巴基础安全服务
在服务那里设置是没用的,下次打开的时候它会改你之前的设置,还会自启动, 要在注册表里设置,方法如下:打开注册表,定位到“HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\XLservicePlatform” 在“XLservicePlatform”右侧选中所有数值,然后删除!删除后服务里迅…...
2024/4/19 12:23:32 - Java学习笔记4
IDEA快捷操作 内容辅助键快捷键数组 数组定义格式数组初始化之动态初始化数组元素访问内存分配数组初始化之静态初始化数组操作的两个常见小问题数组常见操作 遍历获取最值...
2024/5/9 5:44:35 - b java并发容器和框架
并发容器ConcurrentHashMapConcurrentHashMap的结构 JDK1.7数据结构put实现size实现ConcurrentHashMap的结构 JDK1.8数据结构put实现size实现并发队列非阻塞队列 ConcurrentLinkedQueueConcurrentLinkedQueue的数据结构入队列入队列的过程定位尾节点设置入队节点为尾节点HOPS的…...
2024/5/9 4:28:52 - 【引擎开发技术点记录】QT引擎中的简易LOG设计
初衷 游戏引擎作为一个大型的软件系统,如果进行设计的话,某一处出现了BUG,那么其查找起来是非常繁琐的。一旦代码量上w,那么debug工作将会变得非常令人困扰。为了解决这个问题,设计一个简单的LOG系统是非常有必要的。 设计思路 由于LOG系统与整个引擎的各个方面都是紧耦合…...
2024/5/9 6:42:14 - nginx创建静态页面
centos7使用yum安装nginx,默认版本为1.16配置文件默认路径:/etc/nginx/nginx.conf静态页面默认路径:/usr/share/nginx/html编辑页面内容:cd /usr/share/nginx/html/vim test.html你好,北京。浏览器访问:报错中文乱码,解决方法:cp /etc/nginx/nginx.conf /etc/nginx/ngi…...
2024/4/24 11:44:43 - EDUSOHO踩坑笔记之二十八:认证与授权
EDUSOHO踩坑笔记之二十八:认证与授权认证方式Basic Authenticationcurl -X POST -H "Accept:application/vnd.edusoho.v2+json" -H "Authorization: Basic dGVzdDJlZHVvc2hvOjEyMzQ1Ng==" http://demo.edusoho.com/api/tokensX-Auth-Tokencurl-X POST -H …...
2024/5/8 11:51:04 - web大作业(2)登陆页面的实现
首先还是复制一个登陆页面: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>html登录模板</title> <style> /* 让页面所有元素的padding和margin都设置为0 */ *{margin:0;padding:0;box-sizing:border-b…...
2024/4/24 11:44:39 - 205同构字符串(HashMap)
1、题目描述给定两个字符串 s 和 t,判断它们是否是同构的。如果 s 中的字符可以被替换得到 t ,那么这两个字符串是同构的。所有出现的字符都必须用另一个字符替换,同时保留字符的顺序。两个字符不能映射到同一个字符上,但字符可以映射自己本身。说明:你可以假设 s 和 t 具…...
2024/5/8 22:30:07 - Java中的泛型基本介绍
Java中的泛型泛型的基本概念泛型的使用泛型类泛型接口泛型通配符泛型方法泛型方法的基本用法类中的泛型方法泛型方法与可变参数静态方法与泛型泛型方法总结泛型的上下边界泛型数组 泛型的基本概念泛型: 参数化类型参数:定义方法时有形参 调用方法时传递实参参数化类型: 将类型由…...
2024/5/8 12:14:59 - SpaceX的代码开源了,来看看火箭技术的代码.Spacex Rest API设计很有参考价值
SpaceX 世界上可以拥有载人航天技术是美俄中马。其中只有马斯克的SpaceX属于民营商用企业。 地址 https://github.com/r-spacex/SpaceX-APIAPI效果 GET https://api.spacexdata.com/v3/launches/latest返回值 {"flight_number": 95,"mission_name": "…...
2024/5/9 2:00:26 - Python学习笔记2
字符串print (“good good study, day day up”) good good study, day day up\ 转义符,如果前面有转义符,那么它就失去了原来的含义,转化为字符串的一部分,相当于一个特殊字符了print (“小明说:“我没有少圆明园””) 小明说"我没有少圆明园"双引号和单引号还可…...
2024/4/24 11:44:35 - 高质量的缺陷分析:让自己少写 bug
简介: 缺陷分析做得好,bug 写得少。阿里资深技术专家和你分享如何进行高质量的缺陷分析,总结了 5 个要点,通过缺陷分析消除开发中的各种盲点,打造一个学习型的团队。软件开发中的缺陷隐含着极高的价值,但是许多组织都仅仅忍受了缺陷带来的成本和后果,却让价值白白溜掉了…...
2024/5/8 20:46:53 - SpringBoot ~ 自定义Banner
官方提供的application.yml的banner配置信息 # BANNER spring.banner.charset=UTF-8 # Banner file encoding. spring.banner.location=classpath:banner.txt # Banner text resource location. spring.banner.image.location=classpath:banner.gif # Banner image file locati…...
2024/4/24 11:44:33 - U盘文件、文件夹不显示却能搜索到 显示U盘文件的解决办法
U盘文件、文件夹不显示却能搜索到 显示U盘文件的解决办法U盘里面的文件突然间无故消失,经过检查并不是被隐藏也不是中病毒,并且显示空间有被占用,而且文件、文件夹能被搜索到。 1、把u盘插入电脑usb接口中,按快捷键win+r打开运行窗口,输入cmd回车2、先确定刚刚插入u盘的盘…...
2024/4/24 11:44:39 - C语言实例:字符和ASCII相互转换
ASCII对照表ASCII值 控制字符 ASCII值 控制字符 ASCII值 控制字符 ASCII值 控制字符0 NUT 32 (space) 64 @ 96 、1 SOH 33 ! 65 A 97 a2 STX 34 " 66 B 98 b3 ETX 35 # 67 C 99 c4 EOT 36 $ 68 D 100 d5 ENQ 37 % 69 E 101 e6 ACK 38 & 70 F 102 f7 BEL 39 ’ 71 G 10…...
2024/5/1 1:57:03
最新文章
- DELL EMC unity存储系统如何初始化
在客户的存储使用过程中,经常会碰到一些场景需要对存储系统做重新初始化,就是回到出厂时候的配置。比如,客户设备要利旧,二次使用,一般都要回到出厂状态做重新配置的动作。存储严重故障,没有能力修复或者数…...
2024/5/9 7:34:40 - 梯度消失和梯度爆炸的一些处理方法
在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言,在此感激不尽。 权重和梯度的更新公式如下: w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...
2024/5/7 10:36:02 - 【Ubuntu】 Github Readme导入GIF
1.工具安装 我们使用 ffmpeg 软件来完成转换工作1.1 安装命令 sudo add-apt-repository ppa:jonathonf/ffmpeg-3sudo apt-get updatesudo apt-get install ffmpeg1.2 转换命令 (1)直接转换命令: ffmpeg -i out.mp4 out.gif(2) 带参数命令&…...
2024/5/2 10:32:23 - C++ 【原型模式】
简单介绍 原型模式是一种创建型设计模式 | 它使你能够复制已有对象,客户端不需要知道要复制的对象是哪个类的实例,只需通过原型工厂获取该对象的副本。 以后需要更改具体的类或添加新的原型类,客户端代码无需改变,只需修改原型工…...
2024/5/7 14:08:47 - 分布式链路追踪与云原生可观测性
分布式链路追踪系统历史 Dapper, a Large-Scale Distributed Systems Tracing Infrastructure - Google Dapper,大规模分布式系统的跟踪系统大规模分布式系统的跟踪系统:Dapper设计给我们的启示 阿里巴巴鹰眼技术解密 - 周小帆京东云分布式链路追踪在金…...
2024/5/8 3:36:47 - 【外汇早评】美通胀数据走低,美元调整
原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...
2024/5/8 6:01:22 - 【原油贵金属周评】原油多头拥挤,价格调整
原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...
2024/5/7 9:45:25 - 【外汇周评】靓丽非农不及疲软通胀影响
原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...
2024/5/4 23:54:56 - 【原油贵金属早评】库存继续增加,油价收跌
原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...
2024/5/9 4:20:59 - 【外汇早评】日本央行会议纪要不改日元强势
原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...
2024/5/4 23:54:56 - 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响
原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...
2024/5/4 23:55:05 - 【外汇早评】美欲与伊朗重谈协议
原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...
2024/5/4 23:54:56 - 【原油贵金属早评】波动率飙升,市场情绪动荡
原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...
2024/5/7 11:36:39 - 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试
原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...
2024/5/4 23:54:56 - 【原油贵金属早评】市场情绪继续恶化,黄金上破
原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...
2024/5/6 1:40:42 - 【外汇早评】美伊僵持,风险情绪继续升温
原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...
2024/5/4 23:54:56 - 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势
原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...
2024/5/8 20:48:49 - 氧生福地 玩美北湖(上)——为时光守候两千年
原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...
2024/5/7 9:26:26 - 氧生福地 玩美北湖(中)——永春梯田里的美与鲜
原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...
2024/5/4 23:54:56 - 氧生福地 玩美北湖(下)——奔跑吧骚年!
原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...
2024/5/8 19:33:07 - 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!
原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...
2024/5/5 8:13:33 - 「发现」铁皮石斛仙草之神奇功效用于医用面膜
原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...
2024/5/8 20:38:49 - 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者
原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...
2024/5/4 23:54:58 - 广州械字号面膜生产厂家OEM/ODM4项须知!
原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...
2024/5/9 7:32:17 - 械字号医用眼膜缓解用眼过度到底有无作用?
原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...
2024/5/4 23:54:56 - 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...
解析如下:1、长按电脑电源键直至关机,然后再按一次电源健重启电脑,按F8健进入安全模式2、安全模式下进入Windows系统桌面后,按住“winR”打开运行窗口,输入“services.msc”打开服务设置3、在服务界面,选中…...
2022/11/19 21:17:18 - 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。
%读入6幅图像(每一幅图像的大小是564*564) f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...
2022/11/19 21:17:16 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...
win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面,在等待界面中我们需要等待操作结束才能关机,虽然这比较麻烦,但是对系统进行配置和升级…...
2022/11/19 21:17:15 - 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...
有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows,请勿关闭计算机”的提示,要过很久才能进入系统,有的用户甚至几个小时也无法进入,下面就教大家这个问题的解决方法。第一种方法:我们首先在左下角的“开始…...
2022/11/19 21:17:14 - win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...
置信有很多用户都跟小编一样遇到过这样的问题,电脑时发现开机屏幕显现“正在配置Windows Update,请勿关机”(如下图所示),而且还需求等大约5分钟才干进入系统。这是怎样回事呢?一切都是正常操作的,为什么开时机呈现“正…...
2022/11/19 21:17:13 - 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...
Win7系统开机启动时总是出现“配置Windows请勿关机”的提示,没过几秒后电脑自动重启,每次开机都这样无法进入系统,此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一:开机按下F8,在出现的Windows高级启动选…...
2022/11/19 21:17:12 - 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...
有不少windows10系统用户反映说碰到这样一个情况,就是电脑提示正在准备windows请勿关闭计算机,碰到这样的问题该怎么解决呢,现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法:1、2、依次…...
2022/11/19 21:17:11 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...
今天和大家分享一下win7系统重装了Win7旗舰版系统后,每次关机的时候桌面上都会显示一个“配置Windows Update的界面,提示请勿关闭计算机”,每次停留好几分钟才能正常关机,导致什么情况引起的呢?出现配置Windows Update…...
2022/11/19 21:17:10 - 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...
只能是等着,别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚,只能是考虑备份数据后重装系统了。解决来方案一:管理员运行cmd:net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...
2022/11/19 21:17:09 - 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?
原标题:电脑提示“配置Windows Update请勿关闭计算机”怎么办?win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢?一般的方…...
2022/11/19 21:17:08 - 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...
关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!关机提示 windows7 正在配…...
2022/11/19 21:17:05 - 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...
钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...
2022/11/19 21:17:05 - 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...
前几天班里有位学生电脑(windows 7系统)出问题了,具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面,长时间没反应,无法进入系统。这个问题原来帮其他同学也解决过,网上搜了不少资料&#x…...
2022/11/19 21:17:04 - 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...
本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法,并在最后教给你1种保护系统安全的好方法,一起来看看!电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中,添加了1个新功能在“磁…...
2022/11/19 21:17:03 - 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...
许多用户在长期不使用电脑的时候,开启电脑发现电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机。。.这要怎么办呢?下面小编就带着大家一起看看吧!如果能够正常进入系统,建议您暂时移…...
2022/11/19 21:17:02 - 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...
配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!配置windows update失败 还原更改 请勿关闭计算机&#x…...
2022/11/19 21:17:01 - 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...
不知道大家有没有遇到过这样的一个问题,就是我们的win7系统在关机的时候,总是喜欢显示“准备配置windows,请勿关机”这样的一个页面,没有什么大碍,但是如果一直等着的话就要两个小时甚至更久都关不了机,非常…...
2022/11/19 21:17:00 - 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...
当电脑出现正在准备配置windows请勿关闭计算机时,一般是您正对windows进行升级,但是这个要是长时间没有反应,我们不能再傻等下去了。可能是电脑出了别的问题了,来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...
2022/11/19 21:16:59 - 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...
我们使用电脑的过程中有时会遇到这种情况,当我们打开电脑之后,发现一直停留在一个界面:“配置Windows Update失败,还原更改请勿关闭计算机”,等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢࿰…...
2022/11/19 21:16:58 - 如何在iPhone上关闭“请勿打扰”
Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...
2022/11/19 21:16:57