目录
一、mysql安装与基本操作
一、mysql安装
1、拉取mysql镜像
2、定义挂载目录
3、配置my.cnf(my.ini)
4、开启mysql容器
5、用navicat连接工具连接远程端口
6、nacos数据库配置,创建一个nacos数据库,运行一下语句
7、连接成功之后,要到docker容器中进行测试
二、nacos服务部署以及单个nacos服务搭建 1、拉取镜像
2、启动nacos
3、进行nacos数据持久化测试
4、在控制台获得nacos配置
三、nacos集群搭建
1、先移除所有的容器
2、创建一个以自定义网路的mysql容器
3、创建集群中的服务
4、实现nginx反向代理(负载均衡)
4.1、方式一
4.2、方式二 一、mysql安装与基本操作
一、mysql安装
1、拉取mysql镜像
docker pull mysql:8.0.27
2、定义挂载目录
在/home/mysql目录下新建两个文件夹,一个叫data另一个叫conf
命令形式:
mkdir -p /home/mysql/{data,conf}
手动创建: 3、配置my.cnf(my.ini)
data—>my.cnf:
[mysqld]
#Mysql服务的唯一编号 每个mysql服务Id需唯一
server-id=1
#服务端口号 默认3306
port=3306
#mysql安装根目录(default /usr)
#basedir=/usr/local/mysql
#mysql数据文件所在位置
datadir=/var/lib/mysql
#pid
pid-file=/var/run/mysqld/mysqld.pid
#设置socke文件所在目录
socket=/var/lib/mysql/mysql.sock
#设置临时目录
#tmpdir=/tmp
# 用户
user=mysql
# 允许访问的IP网段
bind-address=0.0.0.0
# 跳过密码登录
异常信息 ➜ ~ sudo multipass authenticate Please enter passphrase: authenticate failed: Passphrase is not set. Please `multipass set local.passphrase` with a trusted client. ➜ ~ multipass set local.passphrase Please enter passphrase: Please re-enter passphrase: set failed: The client is not authenticated with the Multipass service. Please use 'multipass authenticate' before proceeding. 解决方案 停止守护进程:
sudo launchctl unload /Library/LaunchDaemons/com.canonical.multipassd.plist 删除 pem 文件
sudo rm /var/root/Library/Application\ Support/multipassd/authenticated-certs/multipass_client_certs.pem 复制你用户的公共证书
sudo cp ~/Library/Application\ Support/multipass-client-certificate/multipass_cert.pem /var/root/Library/Application\ Support/multipassd/authenticated-certs/multipass_client_certs.
文章目录 什么是GB28181平台依赖项搭建步骤配置Redis和MySQL配置ZLMediakit配置WVP 使用效果封装成Docker镜像 什么是GB28181 GB28181(国标28181),全称为《中华人民共和国公共安全视频监控联网系统技术要求》,是中国国家标准委员会发布的一个针对公共安全视频监控领域的标准框架。该标准指导了视频监控设备之间的联网互通,统一管理和控制,并提供了一套包括设备接入、设备管理、视频传输、事件告警等功能要求。
GB28181标准采用了基于IP网络的架构,通过使用 SIP(Session Initiation Protocol,会话初始协议) 实现设备的接入通信和管理,通过使用RTSP(Real-Time Streaming Protocol 实时流传输协议) 标准协议实现设备之间的视频流传输,包括实时预览、录像回放等操作。
总体而言,GB28181 标准的出台旨在提高公共安全视频监控系统的互联互通能力,促进不同厂家设备的兼容性和互操作性,确保系统的可靠性、稳定性和安全性。它对于中国的公共安全行业具有重要意义,并在国内得到广泛的推广和应用。
平台依赖项 在Linux平台下搭建GB28181服务器,主要使用的库包括WVP和ZLMediakit,两个项目的开源地址分别如下所示:
WVP
https://github.com/648540858/wvp-GB28181-pro
ZLMediakit
https://github.com/ZLMediaKit/ZLMediaKit
WVP是基于GB/T 28181-2016标准实现的流媒体平台,负责处理SIP信令,实现国产化设备的接入和管理。 而ZLMediakit作为流媒体服务器负责视频流的处理和转换。
搭建步骤 首先编译WVP和ZLMediakit,编译过程可以参考官方的教程,写的十分详细,这里就不多做介绍了。
WVP和ZLMediakit之间的关系图如下图所示:
配置Redis和MySQL 由于WVP依赖于Redis和MySQL这里先安装MySQL和Redis,安装流程如下所示:
安装MySQL
# Ubuntu 安装 MySQL sudo apt install mysql-server # 检查MySQL是否在运行 sudo systemctl status mysql 安装Redis
# 安装Redis sudo apt update sudo apt install redis-server redis-cli # 查看Redis的运行状态 sudo systemctl status redis-server 为了保障数据的安全性这里我们修改一下MySQL和Redis的缺省密码
修改MySQL的root密码
# 默认没密码 不用输入 直接按回车就可以了 mysql -u root -p # 在MySQL终端下 更新root密码 mysql> use mysql; mysql> UPDATE uer SET authentication_string = PASSWORD('password') WHERE User = 'root'; # 刷新权限表 mysql> flush privileges; # 退出 mysql> quit 修改Redis的密码
前几天weblogic
7月例行更新中,修复了一个Rce漏洞。该漏洞性质属于绕过之前的反序列化漏洞补丁。要了解这个漏洞的原因,我们首先要学习其他几个漏洞的原理。
一 weblogic 反序列化绕过指南 本章节只是大概讲解一下如何绕过weblogic反序列化漏洞的补丁。
序列化和反序列化是将一个对象从本机JVM中传输到远程JVM上。在java
序列化的时候,会将对象的类名也写入到传输的数据中。反序列化的时候首先从数据中读取类名,然后通过反射,根据类名去实例化这个对象。类通过实现java.io.Serializable接口可以启用其序列化功能。未实现次接口的类无法使其任何状态序列化或反序列化。可序列化类的所有子类型本身都是可序列化的。序列化接口没有方法或字段,仅用于标识可序列化的语义。
一个类如果想被序列化,那么它可以继承自两个接口,这两个接口的对比如下。
区 别| Serializable| Externalizable—|—|—实现复杂度| 实现简单,Java对其有内建支持| 实现复杂,由开发人员自己完成执行效率| 所有对象由Java统一保存,性能较低| 开发人员决定哪个对象保存,可能造成速度提升保存信息| 保存时占用空间大| 部分存储,可能造成空间减少而在weblogic的T3协议中,就是用java的序列化协议互相传输对象。为了保证安全性,T3协议的反序列化黑名单中标识哪些类不可以被反序列化。所以weblogic补丁绕过总共有下面几种办法
1.1 黑名单没有覆盖的类 weblogic的开发没有主管能动性,对于安全态度十分消极。只有有人上报CVE,他才会动手加黑名单。否则绝对不会做任何事情。而且对于黑名单经常漏加,造成很多绕过案例。
1.2 利用未经过滤的ObjectInputStream绕过绕过 在之前的公众号讲过,在weblogic中某些类继承自Externalizable接口,在反序列化的时候默认会调用readExternal方法。在该方法中没有使用weblogic提供的带有黑名单过滤功能的FilterInputStream去还原类。而是自作主张,自己使用了没有黑名单过滤的ObjectInputStream去还原对象。造成黑名单根本就没用上,例如CVE-2020-2551
就是这种情况。
当然这只是一个大概,并没有很详细,我们这篇文章的重点不在此。
3. CVE-2020-14841 Jndi注入漏洞 在oracle.eclipselink.coherence.integrated.internal.cache.LockVersionExtractor中,代码如下public Object extract(Object arg0) {if (arg0 == null) {return null;} else {if (arg0 instanceof Wrapper) {arg0 = ((Wrapper)arg0).unwrap();}if (!this.accessor.isInitialized()) {this.accessor.initializeAttributes(arg0.getClass());}return this.accessor.getAttributeValueFromObject(arg0);}}我们可以从代码上看出来,类似与
cve-2020-2555,用法也都是一样的。触发漏洞的重点在于this.accessor.getAttributeValueFromObject
中。对于这个漏洞,我们一般使用MethodAttributeAccessor这个类去触发漏洞
相关代码如下public class MethodAttributeAccessor extends AttributeAccessor {protected String setMethodName = “”;protected String getMethodName;protected transient Method setMethod;protected transient Method getMethod;protected Object getAttributeValueFromObject(Object anObject, Object[] parameters) throws DescriptorException {try {if (PrivilegedAccessHelper.
KL散度计算:
KL散度(Kullback-Leibler Divergence)一般用于度量两个概率分布函数之间的相似程度:离散求和、连续求积分。
KL ( P ∥ Q ) = ∑ P ( x ) log P ( x ) Q ( x ) \operatorname{KL}(P\|Q)=\sum P(x)\log\frac{P(x)}{Q(x)} KL(P∥Q)=∑P(x)logQ(x)P(x)
KL ( P ∥ Q ) = ∫ P ( x ) log P ( x ) Q ( x ) d x \operatorname{KL}(P\|Q)=\int P(x)\log\frac{P(x)}{Q(x)}dx KL(P∥Q)=∫P(x)logQ(x)P(x)dx
参考:
KL散度理解以及使用pytorch计算KL散度 - 知乎 (zhihu.com)
KL散度 (Kullback-Leibler divergence) - 知乎 (zhihu.com)
pytorch实现KL散度:
前言 数据采集的步骤是固定: 发送请求, 模拟浏览器对于url地址发送请求获取数据, 获取网页数据内容 --> 请求那个链接地址, 返回服务器响应数据解析数据, 提取我们需要的数据内容保存数据, 保存本地文件 所需模块 win + R 输入cmd 输入安装命令 pip install 模块名 (如果你觉得安装速度比较慢, 你可以切换国内镜像源)
# 数据请求模块 第三方模块 需要安装 pip install requests import requests # 数据解析模块 第三方模块 需要安装 pip install parsel import parsel # 导入csv模块 内置模块 不需要安装 import csv # 固定模板 # 导入pandas模块 import pandas as pd 二手房源数据获取 请求数据
# 模拟浏览器 headers = { # 用户代理 表示浏览器基本身份信息 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.
Invalid bound statement (not found)问题原因,以及解决方式 问题描述 新建立一个模块,调用接口时,发现所有接口报错
org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.ronwe.cmdb.mapper.CmdbModelMapper.selectGroupModelList 其实出现这个问题实质就是mapper接口和mapper.xml文件没有映射起来。
问题排查 网上查看,大多数原因为:
1.mapper.xml中的namespace和实际的mapper文件不一致
2.mapper接口中的方法名和mapper.xml中的id标签不一致
3.上两步的问题都没有,但是还是不行,可能原因就是,没有构建进去,打开target看看对应的mapper.xml文件在不在
4、如果全部检查了一遍,还发现没有问题,最好看下自己的配置文件,那时候很有可能是配置少了扫描mapper的东西
按照以上步骤都检查过了,并没有问题。
问题解决 最终发现是复制文件过程出现了问题。
众所周知,现在建立xml文件一定是在resources文件下建立一个和接口所在包相同名称的文件夹。所以,当其他地方都没有问题的时候,你就要考虑一下自己resources下的mapper文件夹如果像我一样是
嵌套的
!!那你在建立的时候如果不是一个一个文件夹的建立,而是想直接建一个多层嵌套的文件夹,就会建成一个名为"com.tim.mapper"的单个文件夹,然后一定会报我这个错误。即使这两种方法建立的文件夹结果是一样的形式!
因为文件夹建立方式导致出这样的问题,很不容易被察觉。改好文件夹命名后,重启问题解决了。
解决连接:mybatis创建项目报Invalid bound statement (not found)错误解决方法
近日,工业和信息化部公示了第五批国家专精特新“小巨人”企业和第二批专精特新“小巨人”复核通过企业名单,中睿天下凭借技术研发实力、自主创新能力光荣上榜第五批国家专精特新“小巨人”企业!
什么是国家专精特新“小巨人”企业?
国家级专精特新“小巨人”企业是专精特新企业中的佼佼者和领军者,是专注于细分市场、创新能力强、市场占有率高、掌握关键核心技术、质量效益优的排头兵企业,专精特新“小巨人”是专注于细分市场、创新能力强、市场占有率高、掌握关键核心技术、质量效益优的排头兵企业,以“补短板”、“锻长板”、“填空白”、解决“卡脖子”为主,是工信部围绕提升产业基础能力、产业链现代化水平和抢占未来产业制高点,坚持目标导向与问题导向相结合、市场作用与政府作用相结合、培优企业与做强产业相结合,是行业细分市场中具有先进性和示范性的企业。位于工信部构建的优质中小企业梯度培育体系的金字塔尖。获评企业均经过各省市逐级选拔、工信部反复审核论证,最终予以认定公示。
中睿天下自成立以来,一直秉承着创新发展的理念。自成立以来,长期专注在关键基础设施领域自主研发,持续创新,构建安全可控的信息技术体系。区别于传统防护理念,创新性提出网络“攻击溯源”理念。基于公司全系列产品形成实战对抗综合解决方案、XDR整体解决方案、安全服务与运营解决方案、和数据安全解决方案,为上千家政府、能源、金融、国防、电信、交通、教育、医疗、互联网等领域的客户提供全场景的产品与服务,专业技术能力获得了客户的高度信任与支持。
本次中睿天下荣获国家专精特新“小巨人”称号,代表着国家相关部门对中睿天下精耕攻击溯源领域,始终坚持核心技术自主研发,不断突破创新的认可与鼓舞,也包含着对中睿天下可持续、高质量发展的希冀。
乘势而上,再攀新高。中睿天下将以入选国家专精特新小巨人企业为契机,聚焦核心技术和创新驱动,坚持客户导向,在技术研发方面不断突破创新,在产品和解决方案方面不断精益求精,力求为客户提供更安全、可靠的信息化环境务水平,为推动中国网络安全产业的发展做出更大的贡献,为数字经济保驾护航贡献出中睿力量。
VR眼镜即VR头显,也称虚拟现实头戴式显示设备,随着元宇宙概念的传播,VR眼镜的热度一直只增不减,但是头戴设备的续航一直被人诟病,如果增大电池就会让头显变得笨重影响体验,所以目前最佳的解决方案还是使用VR转接器。
针对VR眼镜的应用场景,乐得瑞科技推出基于LDR6020的单芯片3路CC管理VR转接器解决方案,特别适用于Switch游戏机投屏到VR头显,因为Switch游戏机并不能直接连接VR头显使用,投屏的条件就是必须接适配器,LDR6020可以很好的协商三者的供电需求并且让Switch游戏机进行投屏。
VR转接器有三个Type-C接口,分别连接适配器,投屏设备和VR头显,以往的VR转接器基本都是采用两颗PD芯片才能完成对三个Type-C接口的控制,而乐得瑞科技推出的LDR6020拥有3路6通道CC,可以一颗PD芯片同时控制三个Type-C接口,不仅节约了成本,而且比用两颗PD芯片通讯更稳定!
LDR6020作为一款USB PD3.1 SOC控制芯片,专为多个Type-C接口的应用场景设计。它可以支持最多6部Type-C接口设备同时通讯,如VR转接器,一拖多快充线,多口移动电源等等。
LDR6020采用QFN-32 4*4封装,拥有13路ADC,28位双向I/O口,1位输入口,2路PWM,可以做定制化功能设计,并且支持CC,UART,I2C,USB2.0四种模式进行固件在线升级,未来还会开放嵌入式云IDE开发系统。
总结
乐得瑞科技秉承着创新才是第一生产力的理念,一直致力于USB-C接口控制芯片的设计研发,经过多年的技术沉淀积累,此次带着诚意推出了LDR6020,给予了我们很多惊喜,相信在未来乐得瑞科技会更加注重高精度集成电路的技术研发,为中国企业的创新提供核心芯片。
package com.ruoyi.common.annotation; import java.lang.annotation.*; /** * 数据权限过滤注解 * * @author ruoyi */ @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface DataScope { /** * 部门表的别名 */ public String deptAlias() default ""; /** * 用户表的别名 */ public String userAlias() default ""; } 数据权限 1.首先要在使用数据权限的物理表中添加两个字段 dept_id 以及 user_id 为的是拼接sql查询数据时能找到对应部门 或者用户
2. 在第一个service 实现类中加上注解:
@DataScope(deptAlias = "b",userAlias = "b")
定义注解 : deptAlias 代表部门别名 userAlias 代表用户别名 上文注解中 b 这个别名 代表你查询sql中存在 dept_id 以及 user_id字段的物理表的别名 也就是此图 { } 这个占位符拼接deptAlias 这就是 b.
文章目录 一、数据类型1、const关键字2、volatile关键字:强制从内存访问3、typedef 取别名。4、static 定义的静态变量,只在自己的{ }内有效; 静态函数 就近原则。 二、运算符1./:除号2.随机数3.遍历二位数组 三、指针1、指针数组2、数组指针3、一维数组做函数参数,会被编译器优化成,指针变量4、函数指针变量,使用typedef 四、字符串长度,复制1.strlen和sizeof的区别2、字符串覆盖strncpy3、字符串追加 strncat()4、字符串比较 strcmp()和strncmp() 五、按位运算1.按位与2.按位或3.按位异或and按位取反 六、C++基础知识1、作用域2、命名空间3、结构体4、引用5、内联函数(编译阶段,函数体替换函数调用处,避免函数调用的开销)6、#if,#endif7、析构函数(当类中有指针成员,这个类必须写)8.拷贝构造函数以及深拷贝(深拷贝括号里要用引用)9、对象成员以及初始化列表10.explicit关键字11、static关键字12.const修饰成员函数(只读状态)13、友元14、全局函数重载15、智能指针(智能指针,相当于定义一个公共的,会释放内存的指针)16、继承17、多态18、模板19、类型转换20、异常(catch()里要用引用) 七,STL容器1.STL容器六大组件2.StringAPI (注意一定要有string的头文件)3、Vector容器4、deque容器5、stack容器:栈(先进后出,栈不提供迭代器遍历)6、queue容器(先进先出,不提供迭代器遍历)7、list链表容器8、set/multidset容器9、map/multimap容器(红黑树) 一、数据类型 1、const关键字 1、const以常量初始化,修饰的只读变量,变量值会存放在符号常量表中,不会立即给data开辟空间,取地址时才开辟空间。
const int data=100;//以常量初始化 int *p = (int *)&data; *p=200; cout<<"*p="<<*p<<endl;//200 cout<<"data="<<data<<endl;//100 2、const以变量初始化,修饰的只读变量,会立即开辟空间。
int data1=1000; const int data2=data1;//以变量初始化 int *p1= (int *)&data2; *p1=2000; cout<<"*p1="<<*p1<<endl;//2000 cout<<"data2="<<data2;//2000 3、const 修饰常量指针,指针的指向可以修改,指向的值不可以修改
int a = 10; int b = 20; const int * p = &a; *p=11;//错误,指向的值不能修改 p=&b;//正确,指向可以修改 4、const修饰指针常量,指针的指向不可以修改,指向的值可以修改
int a = 10; int b = 20; int * const p = &a; *p=11;//正确,指向的值可以修改 p=&b;//错误,指向不可以修改 2、volatile关键字:强制从内存访问 3、typedef 取别名。 typedef int INT; INT data=1; typedef int ARRAY[3]; ARRAY arr={"
目录
一、CentOS镜像的下载(准备工作)
1、官网地址:https://www.centos.org/(官网的下载速度会很慢,不推荐)
2、其他镜像源的下载地址(推荐)
3、选择合适版本的镜像进行下载
二、环境的安装
1、打开我们的虚拟机(VMware Workstation),点击文件进行新建
2、选择典型之后,下一步
3、选择稍会安装操作系统
4、因为安装的是Linux操作,我们勾选Linux,并且选择我们的CentOS 7的版本
5、设定我们虚拟机的名称和安装位置
6、指定我们虚拟机的磁盘容量大小
7、这里可以选择自定义硬件,或者先完成基本安装后选择编辑虚拟机
8、编辑虚拟机内存配置
9、选择我们环境的处理器数量(我选默认)
10、选择我们的镜像
11、选择网络适配器
三、配置环境
1、环境安装完之后,打开虚拟机
2、直接install CentOS 7
3、等待安装完之后,选择语言(默认)
4、 配置network后便于我们使用NTP服务
5、设置时区--DATE & TIME
6、KEYBOARD 键盘就默认是English(US)
7、语言支持
8、INSTALLATION SOURCE 安装资源
9、SOFTWARE SELECTION软件安装选择
10、磁盘分区
(1)自定义分区 (2)添加我们/boot分区
(3)添加swap交换分区
(4)添加 / 分区
(5)保存我们分区配置 11、完成后安装
12、设置root超级用户的管理权限
13、添加用户
14、完成全部配置
15、完成配置后,系统会自动重启,登录编辑
16、打开终端:
一、CentOS镜像的下载(准备工作) 1、官网地址:https://www.centos.org/(官网的下载速度会很慢,不推荐) In order to conserve the limited bandwidth available, ISO images are not downloadable from mirror.centos.org(为了节省有限的可用带宽,不能从mirror.centos.org下载ISO映像)
数据准备,创建aaa表,实现ABC取最大值 A 5 ,B 6,C 7 实现sql 方式1 使用limit关键字使排序生效 SELECT * FROM ( SELECT * FROM `aaa` A ORDER BY name, VALUE DESC LIMIT 1000000 ) AS G GROUP BY NAME ; 实现sql 方式2 使用distinct关键字使排序生效 SELECT * FROM( SELECT DISTINCT * FROM `aaa` A ORDER BY NAME ,VALUE DESC ) AS G GROUP BY NAME ; 实现sql 方式3 使用变量方式(推荐) SELECT * FROM( SELECT @row_number := CASE WHEN @NAME=NAME THEN @row_number + 1 ELSE 1 END AS id ,VALUE , NAME ,@name ,@NAME:=name FROM `aaa` A,( SELECT @NAME := 0,@row_number := 0) AS t ORDER BY NAME ,VALUE DESC ) AS G WHERE G.
模型(model)、策略(strategy)和算法(algorithm)是统计学习的所有内容.
模型是统计学习的最终结果,即决策函数(decision function) 或条件概率函数
,它被⽤来预测特定问题下,将来未知输⼊的输出结果.
策略是统计学习过程中的产⽣最优模型的评价准则(evaluation criterion),通常由模型对某个样本
⼀次预测的好坏程度评价的损失函数(loss function) 和模型对所有样本平均意义下
⻛险函数(risk function) 决定。其中 为模型函数.
算法是指统计学习过程中具体的学习出模型的⽅法。其过程通常指通过若⼲步有限的步骤,从候
选模型集合中找到使得⻛险函数 最⼩的模型,即求解 最优化问题的过程.
物流数据分析报告 一、项目背景&分析思路: 项目背景:某公司共向6个地区售卖6种货品,该项目以该公司2016年7月至12月的销售数据为数据集,通过分析找到其可能存在的问题和可以优化的地方。
分析思路:根据“人货场”的分析方法,提出以下三个问题:
1)从人的维度,配送服务是否存在问题?
2)从货的维度,货品质量是否存在问题?
3)从场的维度,是否存在具有潜力的区域?
二、结论先行: 1.货品4销往西北、货品2销往马来西亚的路线时效性存在较大问题,急需提升时效性;
2.货品1、2、4的质量存在较大问题,需要增加抽检比例,规范质检流程和标准;
3.可加强向华东地区推广货品2的力度和投入,同时货品2在马来西亚的时效性差导致拒收率较高,考虑到成本原因,可减少投入;
三、数据清洗 #数据读入 import numpy as np import pandas as pd import matplotlib.pyplot as plt %matplotlib inline plt.rcParams['font.sans-serif'] = 'SimHei' plt.rcParams['axes.unicode_minus'] =False #显示符号 from PIL import Image from IPython.display import display df = pd.read_csv(r'C:\Users\13779\Desktop\物流.csv', encoding='gbk') df.head() 订单号订单行销售时间交货时间货品交货状况货品货品用户反馈销售区域数量销售金额0P096311102016/7/302016/9/30晚交货货品3质量合格华北2.01052,75元1P096826102016/8/302016/10/30按时交货货品3质量合格华北10.011,50万元2NaN202016/8/302016/10/30按时交货货品3质量合格华北10.011,50万元3P097435102016/7/302016/9/30按时交货货品1返修华南2.06858,77元4P097446602016/11/262017/1/26晚交货货品3质量合格华北15.0129,58元 #查看表信息 df.info() <class 'pandas.core.frame.DataFrame'> RangeIndex: 1161 entries, 0 to 1160 Data columns (total 10 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 订单号 1159 non-null object 1 订单行 1161 non-null int64 2 销售时间 1161 non-null object 3 交货时间 1161 non-null object 4 货品交货状况 1159 non-null object 5 货品 1161 non-null object 6 货品用户反馈 1161 non-null object 7 销售区域 1161 non-null object 8 数量 1161 non-null float64 9 销售金额 1161 non-null object dtypes: float64(1), int64(1), object(8) memory usage: 90.
第一步
第二步
然后就去试一下啦,理论上到这一步就没问题了,有问题在留言吧。
背景 一个老的vue项目,预览pdf文件的时候,电子签章不显示
解决方案 由于是老项目,升级版本存在风险,然后又找到一些解决方案,都是修改源码,修改源码就引出了今天的主题 patch-package,我们需要修改node modules下面某个依赖包的源文件。【但是大部分最好不要这样改,直接升级包是最保险的,除非一些特殊的情况】
patch-package 官方文档:https://github.com/ds300/patch-package
作用: 这个包能让你修改并保存对npm 依赖包的修改。
上手 1, 第一步,安装patch-package这个包
npm install patch-package --save-dev 2, 在package.json的scripts里面添加一行执行脚本
"postinstall": "patch-package" 3, 修改node_modules目录下的源码,我们目前遇到的vue-pdf预览问题,是修改 node_modules\pdfjs-dist\es5\build\pdf.worker.js 这个文件下面的,_this3.setFlags(_util.AnnotationFlag.HIDDEN); 这一行代码
我们将这行代码注释
运行代码,预览问题已经解决了
4,将此次更改持久化
npx path-package [YOUR-PACKAGENAME]
npx patch-package pdfjs-dist 此时项目根目录会多出一个patches文件夹,里面会有一个文件
文件内容如下
5, commit 你的提交就OK了
这个包的原理是先记录你的改动,install之后,根据这个patches文件改动源信息,去执行脚本更新这个依赖包里面的内容。
后续踩坑记录本地打包正常,docker ci环境打包遇到了问题
问题1
cannot run in wd xxxxx@1.0.0 patch-package 项目安装打包是在docker 容器里面执行,存在权限问题
在gitlabci文件执行 npm install 之前,执行命令 (npm set unsafe-perm true)
然鹅遇到问题2
/xxxxxx/node_modules/patch-package/node_modules/yaml/dist/compose/composer.js:33 if (prelude[i + 1]?.[0] !== '#') ^ SyntaxError: Unexpected token .
技术:vite+vue3+ts+ElementPlus+vant
1、这个是还没打包(开发环境)的实现:
先说下问题:
app内置的浏览器内核版本太低,导致用app内置浏览器打开,会出现白屏,引入vconsole调试了一下,发现一个问题,提示有个错误的符号 ‘.’,最终把问题锁定在了一个执行语句:
XXX?.xxx 该语句是ES6的新语法,一般浏览器都没有问题,但低版本的浏览器无法解析该语句,所以要进行js转换,一般的vue2项目我们会使用babel,但vite里不好使用babel,需引入另一个插件,esbuild,他可以把指定文件转译成目标文件,如ts->js,话不多说,贴代码。
目标文件是vite.config.ts,首先要引入该文件
import esbuild from 'rollup-plugin-esbuild' 然后在defineConfig对象内使用插件属性
//其中vue()是vite脚手架帮我们自动生成的,我们只需要添加一个属性就可以了
plugins: [vue(), { ..., esbuild({ //替换成你想要的谷歌内核版本 target: 'chrome64', loaders: { '.vue': 'js', '.ts': 'js' } }) } ], 2、这个是打包后实现
目标文件是vite.config.ts,首先要引入该文件
安装 npm install @vitejs/plugin-legacy -D npm add -D terser //这个一定得安装,不然打包会报错 // vite.config.js import legacy from '@vitejs/plugin-legacy' export default { plugins: [ vue(), legacy({ targets: ['defaults', 'not IE 11'], }), ], }
要设置一个 HTML input 元素不允许修改,您可以添加 readonly 属性或将 disabled 属性设置为 true。这将禁用元素的编辑功能。
下面是几个示例:
使用 readonly 属性: <input type="text" readonly value="不允许修改的文本"> 在上面的示例中,readonly 属性被添加到 input 元素中,使其只读。用户无法直接编辑该 input 元素。
使用 disabled 属性: <input type="text" disabled value="不允许修改的文本"> 上面的示例中,disabled 属性被添加到 input 元素中。它不仅禁用了编辑功能,还改变了元素的外观(通常以灰色显示)。
注意:使用 readonly 或 disabled 属性只是在前端视图上禁用了输入,用户仍然可以通过查看页面源代码或使用浏览器开发者工具来修改该值。如果需要确保数据的安全性,还需要在后端进行验证和处理。
mysql的group_concat字段的长度限制 在使用group_concat进行数据分组查询的时候会出现数据只出现一部分的状况,这种是因为group_concat这个字段的字符长度不够,在信息超高这个长度的时候会自动的截取,如果想要解决这个问题的话需要进行额外的设置
修改mysql配置文件my.ini,默认情况下是没有group concat max len项的,在配置文件中添加
group concat max len =10240000
然后重启mysql服务器即可
###** 0X01 简介**
#Horizontall#难度是一个相对“简单”的 CTF Linux盒子。该CTF环境涵盖了通过利用Strapi RCE 漏洞并使用内部应用程序
(Laravel) 将隧道传输到本地计算机,并且在 Laravel v 7.4.18 上运行 漏洞PoC最来提升权限拿到root用户权限。
** 1.1信息收集**
Ønmap端口扫描工具
** 1.2目录枚举**
Ø使用 wfuzz 目录枚举工具
ØStrapi 密码重置漏洞
** 1.3渗透测试**
Ø利用strapi CVE-2019-18818获取反向shell
Ø初始信息收集
Ø在受害者的 authorized_keys 文件中设置我的 SSH 密钥
** 1.4权限提升**
Ø将内部网站通过隧道连接到我们的系统
Ø利用 Laravel CVE-2021-3129获取根标志
0X02 信息收集
首先,我们利用端口探测工具对受害主机运行 nmap,查看受害主机开启哪些端口,命令如下(如图2.1所示)nmap -sV -sC -Pn 10.129.149.92
图2.1 namp扫描端口
###** 0X03 目录枚举**
根据步骤2我们发现受害主机开启2个端口,1个为22端口(SSH服务),另外一个开启80端口(HTTP协议),由于是HTTP服务所以我们知道是一个网站服务,通过nmap对端口探针发现网站标题为horizontall,为我们渗透测试机kali可以访问到网站,需要我们在
hosts 文件中添加了该地址以进行解析。(如图3.1.1所示)
图3.1.1 解析过程
我们试图在网站本身上寻找可利用的漏洞信息,但在主域名网站下没有发现任何可利用信息,所以我们需要对主域名其它目录,查看是否有可利用信息,通过目录暴力破解没有发现可利用信息。所以接下来我们尝试枚举子域名,命令操作如下。wfuzz -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-110000.txt -H “Host: FUZZ.horizontall.htb” --sc 200 10.129.149.92
通过wfuzz域名检举工具,我们发现返回了一个有趣的子域,称为api-
在C语言编程的旅程中,你可能会遇到一个令人困惑的情况:使用getchar()函数获取字符时,那讨厌的回车符(\n)又是如何产生和处理的呢?本文将为你揭示这个问题,并分享几种消除回车符困扰的经验。 一,问题的本质 当你在终端输入字符并按下回车键时,输入流中实际上会有两个字符:你输入的字符和回车符。由于getchar()每次调用时会读取输入流中的一个字符,如果有回车符存在,它也会被读取进来,从而可能导致意料之外的结果。
1.1 消除回车符的方法 让我们一起了解一些常见且易于理解的方法来处理这个问题:
方法一:使用额外的getchar()
int c; while ((c = getchar()) != '\n' && c != EOF) { // 清空输入流中的字符,直到遇到回车符或文件结尾 } 方法二:使用scanf()
int c; scanf("%*[^\n]"); // 读取并丢弃回车符之前的所有字符,遇到回车符时停止 scanf("%*c"); // 读取并丢弃回车符 方法三:使用fflush()(不推荐)
注意: fflush()在清空输入流方面的使用并不是标准行为,不建议在输入流上使用fflush()。
二,如何选择 在实际编程中,你可以根据场景选择适当的方法。如果你只是想简单地获取一个字符并消除回车符,方法一是最直接的选择。如果你需要更复杂的输入处理,可能会使用scanf()。
2.1警惕潜在问题 尽管这些方法可以帮助你消除回车符的问题,但在处理多个输入操作时可能会出现问题。当你在不同的输入函数间切换使用getchar()、scanf()等时,输入流中的字符顺序可能会导致你期望之外的结果。因此,在编写复杂输入处理代码时,务必进行仔细的测试和验证。
结语 通过掌握这些消除回车符困扰的技巧,你可以在C语言编程中更自信地处理输入流。无论你选择使用哪种方法,了解回车符如何影响输入流将有助于你编写更可靠、更健壮的代码。让我们一起摆脱回车符的魔咒,创造出更出色的程序吧!
1.简介 之前介绍完了图像生成网络GAN和VAE,终于来到了Diffusion。stable diffusion里比较复杂,同时用到了diffusion,VAE,CLIP等模型,这里我们主要着重介绍diffusion网络本身。
2.原理 Diffusion扩散模型从字面上来理解,就是对噪声进行扩散。它一共有两个扩散步骤:
正向扩散:根据预先设定的噪声进度在图像中添加高斯噪声,直到数据分布趋于先验分布反向扩撒:去除图像中的噪声,本质上是学习逐步恢复原数据分布 正向扩散过程很好理解,每次step都在之前step的图像基础上加上随机的高斯噪声,这样经过多个step之后,图像将会变成完全的一个噪声图像。
反向扩散过程其实就是用UNet网络去预测逆向的高斯噪声,从而使图像去噪。在噪声微小的前提下,逆向的去噪过程也可以等同于预测高斯噪声。
根据马尔可夫链式推导法则,用表示第t个step的图像,表示该数据的概率分布,所以前向扩散方程可以表示为:
其中,表示第t个step的噪声系数。在第二个公式中,为高斯函数的输出,为高斯函数的输入,而为高斯函数的均值,为高斯函数的方差。换言之,第t个step的图像可以从第t-1个step的图像再加上一个均值为,方差为的高斯噪声得到。
为什么均值和方差要设置为和,这一切都是为了后面的参数重整化技巧。
因为在训练中,要对图像加不同step的噪声,由此让网络学习到不同噪声程度的数据。然而在实际训练中,当需要得到step较大的加噪图像时,我们不可能每次都从step=0开始重新加噪,这样时间成本太大。同时在上一篇文章VAE中我们可以知道,必须要将随机数限制在正态函数中,不然没法去反向推导梯度,因此采用了高斯函数被分解为特定均值和方差的正态函数这一方法。在扩散模型中,我们需要对多个高斯噪声进行叠加,有没有一种方法可以把叠加的高斯函数也分解为特定均值和方差的正态函数呢?
参数重整化:高斯函数可以被分解为特定均值和方差的正态函数,公式可以表达为:
因此,第t个step的图像可以表示为:
需要注意的是,当两个高斯分布相加时,满足如下规律:
因此第四行公式可以直接转换为第五行公式。
所以现在我们直接把各个step的算出来就可以了,不用再每个step进行迭代。
在反向噪声扩散中,由于每次加的噪声很小,所以也可以视为高斯分布,使用神经网络UNet进行拟合。这里推导公式比较复杂,可以参考原论文2006.11239.pdf (arxiv.org)
最后,通过KL散度来让正向分布和反向分布尽可能接近。训练和采样流程如下:
3.代码 接下来我们用pytorch来实现Diffusion在MNIST数据集上的生成。
3.1模型 Unet中上采样和下采样模块都基于resblock,同时还有对step进行embedding的全连接层。数据进行下采样之后,再使上采样输出与step embeding向量进行相加,再输入进下一层上采样层中。
class ResidualConvBlock(nn.Module): def __init__( self, in_channels: int, out_channels: int, is_res: bool = False ) -> None: super().__init__() ''' standard ResNet style convolutional block ''' self.same_channels = in_channels==out_channels self.is_res = is_res self.conv1 = nn.Sequential( nn.Conv2d(in_channels, out_channels, 3, 1, 1), nn.BatchNorm2d(out_channels), nn.GELU(), ) self.conv2 = nn.Sequential( nn.
之前项目中为了做lka中获得rgb图像信息,网上大多方案是确定相关的区域然后输出像素值,这个方法太麻烦,做了一个简单的使用鼠标点击图片某区域,然后直接在终端输出该区域的像素值。下面是源码:
import cv2 import matplotlib.image as mping image = mping.imread("./test_images/pkh.png") def mouse_callback(event, x, y, flags, param): if event == cv2.EVENT_LBUTTONDOWN: # 在图像上显示鼠标点击点的灰度值 gray_value = image[y, x] print("RGB值:", gray_value) # 创建 NamedWindow,并将回调函数与窗口绑定 cv2.namedWindow("Image") cv2.setMouseCallback("Image", mouse_callback) while True: # 显示图像 cv2.imshow("Image", image) # 按下 ESC 键退出循环 if cv2.waitKey(1) == 27: break cv2.destroyAllWindows() 终端输出:
总结: 好用的很!
clickhouse+mysql实现读写分离 背景配置mysql安装clickhouse使用可视化工具连接clickhouse创建clickhouse的数据库并连接mysqlSpringBoot+druid+dynamic配置多数据源实现读写分离 背景 由于系统数据量过大,查询条件自定义过多,mysql在查询时响应太慢,所以使用clickhouse作为读数据库,实现读写分离
配置mysql 这里使用mysql8.0及以上,mysql需要配置开始binlog日志,并且修改远程访问的密码加密方式
修改mysql的配置文件 vi /etc/my.cnf
# 配置远程访问的密码加密方式 default_authentication_plugin=mysql_native_password # 设置服务ID server-id=1 # 开启binlog日志 用来clickhouse读取数据 log-bin=mysql-bin binlog_format=ROW gtid-mode=on enforce-gtid-consistency=1 # 设置为主从强一致性 log-slave-updates=1 # 记录日志 安装clickhouse 这里使用rpm安装,步骤为官方文档步骤
sudo yum install -y yum-utils sudo yum-config-manager --add-repo https://packages.clickhouse.com/rpm/clickhouse.repo sudo yum install -y clickhouse-server clickhouse-client sudo /etc/init.d/clickhouse-server start 安装完成后,如果我们要使用DBeaver远程连接的方式,需要在配置文件中增加如下内容
vi /etc/clickhouse-server/config.xml 在下图所示位置加入 <listen_host>::</listen_host> 然后重启服务即可 使用可视化工具连接clickhouse 官方文档推荐了很多种工具,这里使用DBeaver
第一步 :
第二步 :
填写主机IP地址,端口,数据库可以不填,
用户名默认 : default
用户密码默认是没有的,需要密码可以配置如下 :
# 编辑clickhouse配置文件 vi /etc/clickhouse-server/users.xml 找到箭头所指这一块,可能会在注视中,要放开注释,填入密码,修改后要重启哦
前言 大家好!本期跟大家分享的知识是 Pandas 数据结构—Series。
一、Series的创建 Series 是一种类似于一维数组的对象,由下面两部分组成:
values:一组数据,ndarray 类型index:数据索引 顾名思义,我们在创建 Series 对象时,需要传递一组数据,该数据大多数时候是可迭代对象。因此,下面三种创建方式都是将数据传入到 Series 方法中。
1.1 列表数组创建 以列表作为数据创建 Series。
list1 = list('ABCD') # 创建列表 s =pd.Series(list1) # 传递列表数据到 Series 方法中 print(s) print(type(s.values)) print(type(s.index)) ###########结果########### 0 A 1 B 2 C 3 D dtype: object <class 'numpy.ndarray'> <class 'pandas.core.indexes.range.RangeIndex'> 以数组作为数据创建 Series。
n = np.array(range(5,10)) s2 = pd.Series(n) s2 ###########结果########### 0 5 1 6 2 7 3 8 4 9 dtype: int32 1.
1、修改vue.config.js
publicPath: process.env.NODE_ENV === "production" ? "/dist/" : "/dist/", 2、修改router目录下index.js
## 这段new Router本来就有,需要增加 base: '/dist' export default new Router({ base: '/dist', //如果项目部署在子目录,则需要在这里配置子目录路径 mode: 'history', // 去掉url中的# scrollBehavior: () => ({ y: 0 }), routes: constantRoutes }) 3、/index 路由添加获取子路径 /dist
修改 layout/components/Navbar.vue 中的 location.href,
location.href = '/dist/index'; 修改 utils/request.js 中的 location.href
location.href = '/dist/index'; 4、修改 nginx 配置
location /dist { root /home/ruoyi/projects/ruoyi-ui; try_files $uri $uri/ /index.html; index index.html index.htm; }
React并没有提供像Vue专门创建路由的页面,react路由需要先安装,然后导入才能使用,下面是react路由安装、导入、实现跳转的具体步骤以及react路由的基本介绍。
一、安装 注意:在安装前要将react项目中的index.jsx文件的 <React.StrictMode></React.StrictMode>标签对注释掉,才能关闭严格模式,路由才能正常跳转。
//安装的路由是6.x npm i react-router-dom 二、创建路由容器 在react项目文件中的src文件夹下创建 router/index.jsx
1.导入路由组件 import {RouterProvider,createHashRotuer} from 'react-router-dom' 2.配置路由 const routes = [ {path:'/',element:<LoginView/>}, {path:'/admin',element:<div>管理页面</div>} ] 其中path的地址可以根据要求自行修改;element的值可以是<div>我是一个可爱的例子</div>,也可以是一个单独页面组件。
3.导出路由 //返回路由容器 function RouterView() { const router = createHashRouter(routes); return ( <RouterProvider router={router}/> ); } //导出 export default RouterView; 案例如图:
三、路由基础介绍 1.路由组件 2.路由传参 (1)path传参 定义:{path:"/produce/:id"}
传递:<NavLink to="/produce/abc"
获取:const params = useParams(); params.id获取
(2)search查询传参 传递 :<NavLink to="/user?name=mumu&age=18"
获取:const location = useLocation(); location.search获取
(3)state状态传参 传递: <NavLink state={{done:true,pass:80}}
文章目录 💬 前言👉 数组相关① 随机打乱数组顺序② 借助 new Set()对数组去重 / 对象数组根据唯一值去重③ 查找数组中 【 最值 】 出现的索引 👉 Web浏览器相关① 重新加载当前页面,相当于 Ctrl + R② 滚动到页面顶部③ 指定元素滚动到可视窗口 起点 / 终点④ 从给定文本中剥离 HTML标签 / 剔除HTML字符串中的标签⑤ 将指定文本内容复制到粘贴板上⑥ 获取cookie 👉 数据操作① 使用解构赋值简化变量声明② 使用展开运算符进行数组和对象操作③ 使用对象解构和默认参数简化函数参数 📃 参考文献往期内容 💨 今天这篇文章,给大伙分享一些 通过【 一行代码 】实现 Javascript 中 比较常用的一些方法和功能!
💬 前言 在开发中,采用简洁的语法和结构,遵循一致的命名规范,具有良好的代码组织和注释,能很好的提高代码的质量。
主要有以下几个优点:
可读性:易于阅读和理解。清晰的命名、简洁的语法和良好的代码结构可以使代码的意图更加明确,降低理解代码的难度,提高代码的可读性。
可维护性:易于维护。当代码逻辑清晰、结构简洁时,开发者可以更快速地定位和修复bug,进行功能扩展或修改。同时,可读性高的代码也有助于后续的代码重构和优化。
可扩展性:更具有扩展性和灵活性。清晰的代码结构和简洁的代码风格使得添加新功能、修改现有功能或扩展代码更加容易。此外,简洁的代码往往更少依赖于特定的实现细节,提供了更多的灵活性和可替换性。
错误减少和调试时间:更容易写出正确的逻辑,减少了出错的概率。同时,当代码出现问题时,优雅简洁的代码也更容易进行调试和定位错误。
性能优化:简洁的代码通常更高效,减少了不必要的计算和资源消耗。精简的代码结构和算法可以提高代码的执行效率和性能
👉 数组相关 ① 随机打乱数组顺序 const randomSort = list => list.sort(() => Math.random() - 0.
1.webgl不显示字体 开始导出来发现一些字不显示,还以为分辨率压缩Text文本导致字不显示,后来发现原来是webgl的问题,查阅信息说不要使用unity自带的字体,用下载好的包含中文字体,放在项目文件中。
2.webgl无法输入中文 有不少插件是能在非全屏状态下正常输入的,插件地址:Unity WebGL中文输入插件 支持输入法跟随,这个插件算是功能比较完整的了,唯一不足的是unity默认导出的webgl使用该插件是不支持全屏下输入的,会出现很多错误,比如输入光标错位、报异常。所以还需要另外一个插件,百度搜索Universal WebGL template,网上有很多免费的,两个插件结合基本就完美解决了所有问题。
3.字体模糊 这个比较常见,unity默认使用Text的字体放大就会很模糊,甚至看不清,解决这个问题的办法就是使用TextMeshProUGUI插件,这个插件可以在PackageManager里下载,这个插件的优点是:1.你可以自己制作不同的字体;2.无论放大多少倍,或者字体大小很小时,都会很清晰的显示;
4.webgl导出包浏览器打开报错超出内存大小 做成webgl的项目或多或少会出现这样的错误,经查找官方资料,使用unity2018版的可以调节导出包使用内存的大小,unity2019版本开始就删除了改变内存大小的值,然后找到有个解决办法是代码改变内存大小,于是小编发现Universal WebGL template模板下有段代码(77:TOTAL_MEMORY: 268435456,)被注释了就是改变内存大小的,然后试着加大内存的值,在火狐浏览器是可以正常打开的,然而在Google浏览器就直接报另外一种错误,欲哭无泪,甲方要求使用的是Google浏览器,只能另寻其他办法,最后找到的解决方案就是使用Asset Bundle来加载包,减少包的大小,减少内存的使用。
5.webgl使用Asset Bundle加载资源模型材质显示异常 刚开始导出webgl包和ab包,使用浏览器加载,然后发现一片红啊,使用ab包加载的有一部分模型材质显示为粉红色,第一反应就是材质丢失,以为是ab包卸载了材质的资源,然后经过更改代码不使用卸载,发现还是一样。。。那就不是这个原因了,网上查阅了一些资料,发现原来需要将相关的shader添加到ProjectSettings->Graphics->Always Included Shaders里,切记将unity Standard材质包含在内,不然你会发现你导出webgl包会非常慢并且你的包的大小会很大,因为它包含了成白上千种shader,所以这里尽量少使用Standard,使用也可以,就是效果会变化,在编辑器显示很好,导出来就跟换了一种shader一样,尽量使用其它可以替代它的shader,或你可以去编写shader,或使用ShaderGraph插件编写的shader,然后包含在这里就可以了,这样导出速度快且包小。
6.webgl使用Asset Bundle加载资源的一些注意事项 使用Asset Bundle Browser插件,可以在PackageManager里下载,使用教程网上也有很多,这个插件小编觉得蛮好用的,可以显示不同ab包是否有重复的资源,让开发者减少ab包的大小。下面是使用ab包的一些注意事项:尽量使用多个ab包,且每个ab包大小不要超过20M,使用ab包分类管理;尽量不使用阻断协程的方法来加载ab包;ProjectSettings->Player->Strip Engine Code不要勾选;加载后注意要记得UnLoad(false),减少内存的使用;ab包使用的shader要包含在ProjectSettings->Graphics->Always Included Shaders里;使用LZ4压缩。
7.webgl播放视频 这个算是比较简单,网上插件也比较多,unity自带的VideoPlayer,可以播放本地视频和Url,注意需要一开始时不要勾选Play on Awake,在浏览器会播放不出视频,我使用的是AVProVideo,这个插件还不错,支持PC、android、IOS、Webgl、Mac等平台,可以自行选择,网上教程也有很多,同样注意开始时不播放视频。
8.webgl播放视频流实时视频 项目中有播放rtsp视频流的要求,然后查阅了一些资料,找了半天就看见一个插件UMP Pro Win Mac Linux WebGL ,用了之后发现webgl好像不支持,实属垃圾,后面找到一篇Unity WebGl播放m3u8在线视频(监控,直播)解决方案,这篇很不错,想学习的可以试试。
9.webgl json序列化和反序列化问题 使用unity自带的JsonUtility.FromJson()解析json数据在编辑器可以很好的解析,即使定义为int型数据,数值为Null,这个在webgl里也可以解析,但是有些数据结构是不能正常解析的,比如Dictionary字典,在编辑器能正常解析,但是在webgl里就不能正常解析了,后面找了另外一个Newtonsoft.Json来解析,这个可以正常的解析字典数据,但是要求你定义正确,unity自带的JsonUtility.FromJson()不需要定义属性正确,可能还会出现某些人给你的接口定义某属性是int型,但是给的数据却是null,这类人也不少吧,那怎么办呢,使用Newtonsoft.Json来解析就会报错,说这个属性定义错误,也是崩溃。。。好在查找资料有这个解决办法,就是使用int?来定义,其它类型float?、long?都可以这么来定义,这样就可以解决这个问题了。
10.webgl+nginx搭建简单服务 打包出来的webgl有些浏览器是不支持直接打开的,Google和火狐浏览器就不能直接打开,所以需要搭建简单的服务器来打开webgl网页,下面一篇文章很好的解决这一问题unity webgl + nginx服务器 You can reduce your startup time if you configure your web server to host。
11.webgl解决模型锯齿问题 模型锯齿问题unity自身的解决方案是:Project Settings->Quality->Anti Aliasing 选择8x Multi Sampling,Quality 记得选中webgl平台下你设置好的选项。当然还有一些插件都会有抗锯齿的优化,比如PostProcessing后期处理特效的插件,有兴趣可以试试。
当使用table.exportCsv()方法导出数据时,出现科学计数法问题,像电话号码,身份证号码等,当数据大于15位后面的会用0替代。
针对这一问题,解决方法如下:
就是再数字前加上制表符“\t”注意双引号,拼接字符串来实现
例如:
exportData.forEach(colunm => { colunm.applyNo = "\t" + colunm.applyNo; }) this.$refs.table.exportCsv({ filename: "列表", columns: this.exportColumns, data: exportData }); 当加入水平制表符“ /t ”就不会传化为科学计数了。
//平级数据转换成树形数据,并加上序号,1,1-1,1-2
//平级数据转换成树形数据
let ergodicTree = (
sourceArr,
id = 0,
number = '',
idField = props.tablePropData.tableData.listApi.resData.idField,
pidField = props.tablePropData.tableData.listApi.resData.pidField,
childrenName = 'children'
) => {
// 注意这里没有static,保存遍历的结果
let resultArr = []
let index = 1
for (let item of sourceArr) {
if (item[pidField] === id) {
item.number = number === '' ? index++ : number + '-' + index++;
const reslut = ergodicTree(sourceArr, item[idField], item.number)
if (reslut && reslut.length) {
文章标题优化是网站SEO优化的重点,一个网站要开展SEO,首先从文章标题优化开始。
大多数人都知道标题设置必须包含关键字,然而,很少有人知道,包含关键字并不是简单地写成这样简单。搜索引擎优化不仅要考虑搜索引擎的捕获,还要考虑用户的搜索体验。
网站文章标题怎么做SEO优化
网站文章标题做SEO要从三个角度考虑:
1.用户搜索行为
搜索引擎用户,他们的行为是这样的:遇到了一个问题-打开搜索引擎-搜索自己的问题-搜索引擎根据搜索词进行响应的算法匹配-输出与用户搜索词更加贴切的搜索结果。
在设置网站文章SEO标题时,我们可以根据关键词的性质考虑用户如何进行搜索,并将关键词融入用户的搜索习惯中,从而提高页面内容和用户搜索的相关性。
挖掘关键词的工具很多,首先用工具找到我们要做的长尾关键词,然后根据这类搜索词去精心的准备内容。并保证题文相符,才是真正的SEO的内容产出。
2.标题的长度
标题中的字数应控制在30个汉字以内。如果标题超过30个字符,多余的文字将不会显示。由于单词的数量,其他关键字的权重将从标题中分离出来。正如前面已经解释过的,标题写得越长,写的汉字越多,关键词越多,每个关键字的权重就越小,不利于每个关键字的优化。
3、目标关键词尽量靠前
页面标题关键字,从左到右逐渐减弱,所以我们处理文章SEO标题关键词,尽量保持重要关键字的领先。此外,应该注意的是,标题关键词要尽可能地达到本质的统一性,而不是少数不相干或不相干的词语拼凑在一起,这就会分散权重。
删除二叉搜索树中的节点 二叉搜索树(Binary Search Tree,简称BST)是一种常见的数据结构,它具有以下性质:
对于任意节点,其左子树中的所有节点的值都小于该节点的值。对于任意节点,其右子树中的所有节点的值都大于该节点的值。左子树和右子树也都是二叉搜索树。 在二叉搜索树中删除节点是一个常见的操作,我们需要保证删除节点后的树仍然满足二叉搜索树的性质。本文将介绍如何在二叉搜索树中删除节点的算法和实现。
算法思路 删除二叉搜索树中的节点可以分为以下几个步骤:
首先,我们需要找到要删除的节点。从根节点开始,比较要删除的节点的值与当前节点的值,根据二叉搜索树的性质,如果要删除的节点的值小于当前节点的值,则继续在左子树中查找;如果要删除的节点的值大于当前节点的值,则继续在右子树中查找;如果要删除的节点的值等于当前节点的值,则找到了要删除的节点。如果找到了要删除的节点,我们需要考虑以下几种情况: 如果要删除的节点是叶子节点(没有左子树和右子树),直接将其删除即可。如果要删除的节点只有一个子节点(左子树或右子树),将其子节点替换为要删除的节点。如果要删除的节点有两个子节点,我们可以选择以下两种方法之一: 找到要删除节点右子树中的最小节点,将其值替换到要删除的节点上,然后递归地删除右子树中的最小节点。找到要删除节点左子树中的最大节点,将其值替换到要删除的节点上,然后递归地删除左子树中的最大节点。 最后,返回更新后的二叉搜索树的根节点引用。 代码实现 方法一:
class TreeNode { int val; TreeNode left; TreeNode right; public TreeNode(int val) { this.val = val; } } public class Solution { public TreeNode deleteNode(TreeNode root, int key) { if (root == null) { return null; } if (key < root.val) { root.left = deleteNode(root.left, key); } else if (key > root.val) { root.right = deleteNode(root.
文章目录 0 项目简介1 游戏介绍2 实现效果3 开发工具3.1 环境配置3.2 Pygame介绍 4 具体实现5 最后 0 项目简介 🔥 Hi,各位同学好呀,这里是L学长!
🥇今天向大家分享一个今年(2022)最新完成的毕业设计项目作品
python小游戏毕设 消消乐小游戏设计与实现 (源码)
🥇 学长根据实现的难度和等级对项目进行评分(最低0分,满分5分)
难度系数:3分
工作量:3分
创新点:4分
项目获取:https://gitee.com/sinonfin/system-sharing
1 游戏介绍 利用python制作的简易消消乐小游戏。
游戏规则:
玩家通过鼠标交换相邻的拼图,若交换后水平/竖直方向存在连续三个相同的拼图,则这些拼图消失,玩家得分,同时生成新的拼图以补充消失的部分,否则,交换失败,玩家不得分。
玩家需要在规定时间内获取尽可能高的得分。
2 实现效果 3 开发工具 3.1 环境配置 Python版本:3.6.4
相关模块:
pygame模块;
以及一些Python自带的模块。
3.2 Pygame介绍 简介
Pygame是一系列专门为编写电子游戏而设计的Python模块(modules)。Pygame在已经非常优秀的SDL库的基础上增加了许多功能。这让你能够用Python语言编写出丰富多彩的游戏程序。
Pygame可移植性高,几乎能在任何平台和操作系统上运行。
Pygame已经被下载过数百万次。
Pygame免费开源。它在LGPL许可证(Lesser General Public License,GNU宽通用公共许可证)下发行。使用Pygame,你可以创造出免费开源,可共享,或者商业化的游戏。详情请见LGPL许可证。
优点
能够轻松使用多核CPU(multi core CPUs) :如今双核CPU很常用,8核CPU在桌面系统中也很便宜,而利用好多核系统,能让你在你的游戏中实现更多东西。特定的pygame函数能够释放令人生畏的python GIL(全局解释器锁),这几乎是你用C语言才能做的事。
核心函数用最优化的C语言或汇编语言编写:C语言代码通常比Python代码运行速度快10-20倍。而汇编语言编写的代码(assembly code)比Python甚至快到100多倍。
安装便捷:一般仅需包管理程序或二进制系统程序便能安装。
真正地可移植:支持Linux (主要发行版), Windows (95, 98, ME, 2000, XP, Vista, 64-bit Windows,), Windows CE, BeOS, MacOS, Mac OS X, FreeBSD, NetBSD, OpenBSD, BSD/OS, Solaris, IRIX, and QNX等操作系统.
ffmpeg官网下载地址https://ffmpeg.org/download.html
这里以windows为例,鼠标悬浮到windows图标上,再点击 Windows builds from gyan.dev
或者直接打开 https://www.gyan.dev/ffmpeg/builds/ 下载根据个人需要下载对应版本 解压下载的文件,并复制bin所在目录
新打开一个命令行窗口,输入:ffmpeg -version 如果有输出如下内容表示安装成功
以下是OpenGL安装步骤:
下载和安装最新的显卡驱动程序,这通常可以在显卡制造商的网站上找到。
下载和安装OpenGL开发工具包(SDK)。可以从OpenGL官方网站(http://www.opengl.org/)下载SDK,也可以使用第三方库,如GLEW(http://glew.sourceforge.net/)或GLFW(http://www.glfw.org/)。
配置开发环境。在Windows系统中,需要配置Visual Studio或其他编译器。在Linux系统中,需要安装GCC和其他开发工具。
在代码中包含OpenGL头文件。在C++中,可以使用“#include <GL/gl.h>”命令包含头文件。
链接OpenGL库。在代码中,需要链接OpenGL库,这通常由编译器完成。在Windows系统中,可以使用“-lopengl32”选项链接OpenGL库,在Linux系统中,可以使用“-lGL”选项链接OpenGL库。
编写OpenGL代码并编译执行。可以使用OpenGL函数绘制图形和进行其他操作,如设置视图和投影矩阵,设置光照和材质属性等。在编写完成后,使用编译器编译程序并执行即可
在App.vue文件的onLaunch中添加以下代码
onLaunch(() => { //以下为添加wx环境 const script = document.createElement('script'); script.src = "https://res.wx.qq.com/open/js/jweixin-1.6.0.js"; script.type = 'text/javascript'; document.body.appendChild(script); console.log("App Launch"); }); 使用以下方法使用即可
wx.miniProgram.getEnv((res) => { if (res.miniprogram) { console.log(888); wx.miniProgram.redirectTo({ url: '/pages/logs/logs' }); } }) ps:
1、依旧不行就尝试高版本的jwixin
table传入span-method方法可以实现合并行或列,方法的参数是一个对象,里面包含当前行row、当前列column、当前行号rowIndex、当前列号columnIndex四个属性。该函数可以返回一个包含两个元素的数组,第一个元素代表rowspan,第二个元素代表colspan。 也可以返回一个键名为rowspan和colspan的对象
代码 <template> <div id="app"> <el-table :data="tableData" :span-method="objectSpanMethod" border :header-cell-style="{ textAlign: 'center', backgroundColor: '#F5F7FA' }" > <el-table-column prop="School" label="学校" align="center"> </el-table-column> <el-table-column prop="Grade" label="年级" align="center" /> <el-table-column prop="Class" label="班级" align="center" /> <el-table-column prop="Name" label="姓名" align="center" /> <el-table-column prop="Chinese" label="语文" align="center" /> <el-table-column prop="Math" label="数学" align="center" /> <el-table-column prop="English" label="英语" align="center" /> </el-table> </div> </template> <script> export default { data() { return { colFields: [ "School", "Grade", "Class", "Name", "
来自公众号:菜鸟教程
近日,美国科技公司数据收集网站 Levels.fyi 发布了 2023 年上半年全球程序员薪酬报告,并统计了各领域薪酬的增长比例。
我们从上表可以看到各个领域当中,增强现实/虚拟现实 (AR/VR) 总薪酬中位数增长率高达 14.5%,排在第一位。其他几个领域也表现出持续增长,包括分布式系统(后端)、DevOps、全栈、ML/AI 和移动(iOS + Android)。
软件工程师的中位薪酬保持在 170,000 美元不变,而销售人员的中位总薪酬略有下降 0.3%。
另一方面,安全、生产、站点可靠性(SRE)和 iOS 等一些重点领域的总薪酬中位数发生了微小变化或略有下降,而区块链工程师则是 -11.3%的大幅下降。
以下是各个公司初级工程师的薪酬表,Databricks 总薪酬中位数为 274,200 美元,在这一级别上处于领先地位,这表明他们从一开始就致力于吸引顶尖人才。
特别去查了下Databricks公司是干嘛的,因为后面这个公司多次出现在榜单中。
Databricks 2013年成立,是个大数据软件公司。
Databricks 公司的云解决方案由三部分组成:Databricks 平台、Spark 和 Databricks 工作区。该产品背后的理念是提供处理数据的单独空间,不受托管环境和 Hadoop 集群管理的影响,整个过程在云中完成。
2023 年 6 月 26 日晚间,Databricks 正式宣布,以约 13 亿美元收购生成式人工智能初创公司 MosaicML,以提供为企业构建类 ChatGPT 工具的服务,交易预计将在今年 7 月 31 日前完成。
中级工程师同样也是 Databricks 公司的薪酬最高,提供的总薪酬中位数为 385,850 美元。Roblox 和 Snowflake 也在这个级别上提供了可观的薪酬。
在高级工程师部分,依然是 Databricks 再次领先,总薪酬中位数为 584,250 美元。Netflix 和 Roblox 还也提供丰厚的薪酬方案。
对于主管级别的工程师来说,OpenAI 的总薪酬中位数高达 925,000 美元,排在了第一位。Broadcom、LinkedIn、Stripe、Plaid、Roblox 和 Cruise 等其他公司也榜上有名。
int g_row;
int g_col;
bool isInArea(int r, int c)
{
if (r < 0 || r >= g_row || c < 0 || c >= g_col) {
return false;
}
return true;
}
int dfs(int **grid, int r, int c)
{
// 如果不在单元格范围内,即返回0
if (!isInArea(r, c)) {
return 0;
}
// 如果单元格不为1,则也返回0
if (grid[r][c] != 1) {
return 0;
}
// 单元格为1的就是岛屿,遍历完之后把它标记为2,以防重复遍历
grid[r][c] = 2;
// 1表示当前遍历到的岛屿面积,可以试想只有一个岛屿大小的单元格
return 1 + dfs(grid, r + 1, c) +
个人开发中常见单词拼错错误纠正 前置说明参考地址后端开发相关前端开发相关客户端开发相关大数据/云计算相关工具或软件相关 前置说明 单词太多啦, 我这里只列表我个人见得比较多的, 我没见过就不列举了. 有错误或想补充的可以提交在原仓库提交Pull Request. 😁
参考地址 GitHub地址: https://github.com/rd2coding/Awesome-Tech-Words
Gitee地址: https://gitee.com/xiaozhengN/Awesome-Tech-Words
后端开发相关 规范书写不合适拼写举例备注RESTfulRestful、RestFulREST=Representational State TransferSpringspringSpring MVCSpringMVC、SpringmvcSpring MVC中间有空格!Spring BootSpringboot、SpringBootSpring Boot中间有空格!Spring CloudSpringcloud、SpringCloudSpring Cloud中间有空格!OOPoopObject Oriented ProgrammingPOpoPersistant ObjectPOJOpojoPlain Ordinary Java ObjectWebweb、WEBJavaJAVA、javaJVMjvm、JvmJava Virtual MachineGCgcGarbage CollectionJava EEjava eeEnterprise EditionJava SEjava seStandard EditionGolanggolangPythonpythonLinuxlinuxRuntimeruntimeDNSdnsDomain Name System 域名系统DIdiDependency Injection 依赖注入DBdbDataBaseACIDacidAtomicity+Consistency+Isolation+DurabilityDDLddlData Definition Language 数据定义语言DMLdmlData Manipulation Language 数据操纵语言MySQLmysqlSQLitesqliteSQLServersqlserver、SQLserverNoSQLnosql、NOSQLNoSQL=Not Only SQLJDBCJdbc、jdbcJava Database ConnectivityORMormObject/Relational Mapping 对象/关系映射JPAJpaJava Persistence APIMyBatismybatis、MybatisMyBatis-PlusMyBatisPlus myBatis-plusMavenmaven、MAVENRedisredisMongoDBmongoDBMQmqMessage QueueRabbitMQrabbitMQRocketMQrocketMQActiveMQactiveMQNettynettygRPCgrpcDubbodubboJSONJsonJavaScript Object NotationJWTjwtJSON Web TokenXMLXmlExtensible Markup LanguageAPIApiApplication Programming InterfaceJenkinsjk、jenkinsDockerdockerUMLUmlUnified Modeling LanguageSOASoaService Oriented ArchitectureMVCMvcModel–View–ControllerMVVMMvvmModel-View-ViewModelMVCCmvccMySQL: Multi-Version Concurrency ControlMVPMvpModel-View-Presenter持续更新中…-- 前端开发相关 规范书写不合适拼写举例备注HTTPHttp、httpHyper Text Transfer ProtocolHTTPShttps、HttpsHyper Text Transfer Protocol over SecureSocket LayerDOMdomDocument Object ModelJavaScriptjavascript、Javascript、js、JSCSSCss、cssCascading Style SheetsHTMLHtml、htmlHyper Text Markup LanguagejQueryjquery、JQueryBootstrapbootstrapNode.
Android 设备调试有两种连线方式:有线和无线;
有线是通过USB导线连接android设备和电脑端,无线方式是通过连接WIFI,通过TCP的方式,连接设备和电脑端,一般用 5555端口;
有线的调节,只需要打开调试模式基本就可以了,无线连接方式比有线多一步操作,就是需要先通过usb导线连接后,adb 命令行:adb tcpip 5555 开启tcp 连接5555端口;
正常过程是这样的,但是日常开发的时候经常遇到,没有带线,没有笔记本备用,设备不在身边(在隔壁)的情况,设备每次重启都会关闭tcp 555端口,不可能每次都需要拿着电脑/导线去设备前调试,而且,公司没有给我配置笔记本```
这个情况下,就需要设置adb 自动监听5555端口,而且需要重启有效,
说明 : 该情况适用于 root 的设备;
1.adb 查看root权限 我们先通过导线连接设备,通过adb 命令判断,命令行输入 adb shell,#代表已经root过,$代表没有root权限;
(还好还好,我们的屏/设备 属于root过的设备,具有root权限)
2.修改文件 修改/default.prop或者/system/build.prop文件
//添加这一行 service.adb.tcp.port=5555 文件后可以添加这一行
但是你会发现/system 文件夹是只读权限的.
你可以通过如下的命令查看该文件权限;
adb shell ls -l /system 这个是我修改后的,你可以看看你的;
要修改build.prop文件,是修改不了的,所以需要解决的是如何修改;
3.Android9.0挂载system文件夹读写 我们知道在Android系统中,system文件夹一般都是只读属性,不管你是root用户还是普通权限用户,所以在开发中,如果我们想要访问和修改system文件夹下的内容的话就需要获取system文件夹的写属性,而因为Android版本的变化,在不同版本下system文件夹修改读写属性的方式也有较大的区别。
Android 8.0以下版本 第一步:要得到system分区的全名 adb shell mount rootfs / rootfs ro 0 0 tmpfs /dev tmpfs rw,mode=755 0 0 devpts /dev/pts devpts rw,mode=600 0 0 proc /proc proc rw 0 0 sysfs /sys sysfs rw 0 0 tmpfs /sqlite_stmt_journals tmpfs rw,size=4096k 0 0 none /dev/cpuctl cgroup rw,cpu 0 0 /dev/block/mtdblock0 /system yaffs2 ro 0 0 /dev/block/mtdblock1 /data yaffs2 rw,nosuid,nodev 0 0 /dev/block/mtdblock2 /cache yaffs2 rw,nosuid,nodev 0 0 /dev/block//vold/179:0 /sdcard vfat rw,dirsync,nosuid,nodev,noexec,uid=1000,gid=1015,fmask=0702,dmask=0702,allow_utime=0020,codepage=cp437,iocharset=iso8859-1,shortname=mixed,utf8,errors=remount-ro 0 0 从/dev/block/mtdblock0 /system yaffs2 ro 0 0 部分可以看得出/system的权限是ro即是read only。
JavaOpenCV是一个基于开放源代码的计算机视觉库,它可以实现许多计算机视觉任务,如图像处理、物体识别和图像相似度计算等。本教程旨在向您介绍JavaOpenCV中的相似度计算基础,帮助您理解如何使用该库计算图像之间的相似度。
JavaOpenCV相似度计算基础教程
图像相似度 在计算机视觉中,图像相似度是指比较两个图像的相似程度。当我们需要比较两个图像时,通常会考虑以下几个因素:
颜色:图像的颜色分布是否相似;
纹理:图像的纹理是否相似;
物体:图像中的物体是否相同,它们出现的位置和大小是否相似。
根据这些因素,我们可以使用不同的算法计算两个图像之间的相似度。在JavaOpenCV中,您可以使用以下算法计算图像相似度。
均方误差(MSE) 均方误差是最常用的图像相似度计算算法之一。它通过比较两个图像中每个像素之间的差异来计算它们之间的相似度。MSE算法将两个图像的差异平方相加,并取平均值,得到一个单一的值,表示它们之间的相似度。
下面是JavaOpenCV中计算MSE的代码:
Mat img1 = Imgcodecs.imread(\path/to/image1.jpg\Mat img2 = Imgcodecs.imread(\path/to/image2.jpg\Mat diff = new Mat();
Core.absdiff(img1, img2, diff);
Scalar mse = Core.mean(diff.mul(diff));
System.out.println(\MSE: \ + mse.val[0]);
结构相似性指数(SSIM) 结构相似性指数是另一种常用的图像相似度计算算法。与MSE算法不同,SSIM算法不仅考虑了像素之间的差异,还考虑了它们在图像结构中的位置。SSIM算法包括三个部分:亮度、对比度和结构相似性。
下面是JavaOpenCV中计算SSIM的代码:
Mat img1 = Imgcodecs.imread(\path/to/image1.jpg\Mat img2 = Imgcodecs.imread(\path/to/image2.jpg\Mat gray1 = new Mat();
Mat gray2 = new Mat();
Imgproc.cvtColor(img1, gray1, Imgproc.COLOR_BGR2GRAY);
Imgproc.cvtColor(img2, gray2, Imgproc.COLOR_BGR2GRAY);
Mat ssim_map = new Mat();
Imgproc.cvtColor(img1, img2, ssim_map, Imgproc.CV_32F);
double ssim = Core.
什么是主动访问用户?
主动访问用户指的是网站忠诚用户,搜索引擎通过它的多种渠道和手段来定位网站,为网站提供主动访问用户。
主动访问用户一般分为三种:
第一种,满足自己的需求,想通过网站解决问题的;
第二种,希望通过网站分享内容;
第三种,利用空闲时间在网站上逛的用户。
网站如何吸引更多主动访问用户?
1、根据用户的需求,整顿站点的内容。
为了吸引更多主动访问用户,首先我们需要研究用户的访问需求,考虑能帮助用户解决问题,而不是为了获得流量。
2、通过热门关键词从搜索引擎获得流量
这种行为主要往往从流量角度出发,主动访问用户流失率大;比如站点做的旅游行业的,用户访问网站,是肯定对旅游方面有需求,或者是问题需要解答,如果用户访问你的站点,放置的都是与网站不相关的内容,用户自然以后不会再访问站点。
需要围绕旅游行业挖掘用户热搜的关键词,通过这些关键词来编写内容。
3、避免广告影响用户浏览
网站上存在广告是正常现象,主要也是为了收益和推广。
广告的放置要合理,不要让用户有文章主题内容都被广告覆盖了。
4、网站改版、站点内容调整
如果网站因为某些原因需要改版,或者是站点内容调整时,需要考虑主动访问用户,尤其是核心用户的使用习惯和需求。
文章目录 例子和解析测试工具Java中的应用前端vue的reactive中使用 例子和解析 强密码需要同时含有大写字母、小写字母、数字、特殊符号。
这边先展示我自己写的。
^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[!@#$%?])[a-zA-Z0-9!@#$%?_]{8,}$ 以上代8位以上的强密码。
下面是具体解析:
^代表开始 $代表结尾 (?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[!@#$%?])这四个是对字符进行判定 (?=.*[a-z])判断小写字母是否存在 (?=.*[a-z])判断大写字母是否存在 (?=.*[0-9])判断数字是否存在 (?=.*[!@#$%?])判断特殊字符是否存在,特殊字符可以自行添加 [a-zA-Z0-9!@#$%?_]{8,}代表要从[]内的字符中任取一个,共8位 []是取一个 ()是都要满足 {}是取几位 最小位数必填,最大位数可不填,我的例子里只有最小位数为8 测试工具 正则表达式测试工具里可以自行检测写的对不对
Java中的应用 目前较为简便的一种使用方法是搭配ApiModel和Pattern对变量进行配置。
如
@ApiModel(value="User" description="用户对象") public class User{ @Pattern(regexp = "^(?=.*[A-Za-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[!@#$%?])[a-zA-Z0-9!@#$%?_]{8,}$") private String pwd; } 前端vue的reactive中使用 {pattern: '^(?=.*[A-Za-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[!@#$%?])[a-zA-Z0-9!@#$%?_]{8,}$', message:'密码包含大写字母、小写字母、数字、特殊字符', trigger: 'blur'}
https://www.sohu.com/a/708313241_121368355
参考教程: https://www.runoob.com/docker/docker-image-usage.html
镜像网址 https://hub.docker.com/
一,起因 本人本来的意思是去搭建一个Chatgbt和微信公众号的一个个人聊天工具,但是由于需要租用海外服务器,以及海外服务器是否能够去满足GBT大模型的训练,因此如果想要省点钱,来进行搭建,就得换个法子,就跟着师哥了解了ChatGLM
二,过程 2.1 ChatGLM的部署 在了解了师哥的AI部署之后,我跟着b站的up主Joker大金宝,的视频教程,利用阿里云的免费机器学习的平台,可以给到大模型训练的GPU,刚开始还有使用三个月的名额
在阿里云上部署chatGLM-6B_哔哩哔哩_bilibili
网址就放在这了,金宝老师讲的很好,部署很简单。
主要记录一下出现的问题 2.1.1 免费使用 看评论有的人好像收费了,因此我们要是使用阿里云的机器学习平台,要点击这个免费使用
选择好使用的产品之后,点击试用再去平台去创建实例,就不用交钱了
2.1.2 部署出现错误 我的错误点就在于选择的镜像错误
一定要选择python39的,我好像选择了python36,当时出现了这样的问题
ERROR: Could not find a version that satisfies the requirement transformers==4.27.1 (from versions: 0.1, 2.0.0, 2.1.0, 2.1.1, 2.2.0, 2.2.1, 2.2.2, 2.3.0, 2.4.0, 2.4.1, 2.5.0, 2.5.1, 2.6.0, 2.7.0, 2.8.0, 2.9.0, 2.9.1, 2.10.0, 2.11.0, 3.0.0, 3.0.1, 3.0.2, 3.1.0, 3.2.0, 3.3.0, 3.3.1, 3.4.0, 3.5.0, 3.5.1, 4.0.0rc1, 4.0.0, 4.0.1, 4.1.0, 4.1.1, 4.2.0, 4.2.1, 4.2.2, 4.3.0rc1, 4.3.0, 4.
目
录 1.Windows sever 2016 概述
1.1 Windows server 介绍
1.2 Windows sever 2016 版本
1.3 系统需求
2.安装 Windows sever 2016
2.1 安装选项
1. 带有桌面体验的服务器
2. 服务器核心
3. Nano Sever
2.2 带有桌面体验的服务器安装
2.3 服务器核心安装
1.记事本和注册表编辑器
2.关机和重新启动
3 配置网络参数
3.1 IPv4. IPv6 和 DNS 概述
1. IPv4 介绍
2.IPv6介绍
3. DNS 介绍
3.2 配置IPv4参数
1.手工设置IPv4参数
2.自动获取IPv4参数
1.Windows sever 2016 概述 Windows Server2016是微软公司于2016年10月13日正式发布的最新服务器操作系统。它在
整体的设计风格与功能上更加接近Windows10。其在虚拟化,系统管理弹性及信息安全等领域的应用方面有了非常大的提升,其登录界面如图所示,Windows Server 2016 是Microsoft Server 操作系统的一个重要的升级版本。
1.1 Windows server 介绍 Windows sever 是面向服务器的 Windows 版本。Windows sever 是一个平台,用于构建连接的应用程序,网络和Web服务的基础结构,包括从工作组到数据中心,与面向桌面的Windows版本不同,WindowsServer不注重对多媒体和娱乐功能的支持,它主要集成了更多的,功能更完善的网络服务组件,如AD(Active Directory活动目录)lIS(Internet Information Service互联网信息服务)等
图片地址转base64的两种方法
1.使用canvas
将图像绘制到大小同样的canvas上(大小不同转出来的会带有空白部分),然后使用canvas.toDataURL得到base64的字符串 /** * 将图片的url路径转为base64路径 * 可以用await等待Promise的异步返回 * @param {Object} imgUrl 图片路径 */ export function getBase64Sync(imgUrl) { return new Promise(function (resolve, reject) { // 一定要设置为let,不然图片不显示 let image = new Image(); //图片地址 image.src = imgUrl; // 解决跨域问题 image.setAttribute("crossOrigin", "*"); // 支持跨域图片 // image.onload为异步加载 image.onload = function () { let canvas = document.createElement("canvas"); canvas.width = image.width; canvas.height = image.height; let context = canvas.getContext("2d"); context.drawImage(image, 0, 0, image.width, image.height); //图片后缀名 let ext = image.