本文主要给大家介绍了关于python中list.copy方法使用的相关资料,文中还介绍了python list.copy() 和 copy.deepcopy()区别,需要的朋友可以参考下
当我们想复制两个一模一样的列表时,我们可能使用到list.copy()这个方法,这个方法可以让我们复制一个相同的数组,当遇到下面这种情况时,可能会遇到一些问题
1
2
3
4
5
# _*_coding='utf8'_*_
nameList = [1, 2, 3, 4, 5]
nameList1 = nameList.copy()
nameList[1] = 55
print(nameList, nameList1)
此时打印出nameList和nameList1时,两个列表的元素是下面这样
[1, 55, 3, 4, 5] [1, 2, 3, 4, 5]
可以看到列表的第二个元素不一样
这是因为在python中list.copy()这个函数在执行的时候,指向的不是nameList在内存中的地址,而是重新复制了一份,此时两个列表在内存中的地址不同,我们可以打印出来看看
使用如下代码可以见到,两个列表的内存已经有差别了
1
2
3
4
nameList = [1, 2, 3, [3, 4, 5], 4, 5]
nameList1 = nameList.copy()
nameList[1] = 55
print(id(nameList), id(nameList1))
2207528867520 2207531826048
此时修改的nameList[1] = 55并不会在nameList1中生效
而当nameList中又存在数组时,情况又会发生变化
我们的文件有时候有用,但是电脑却识别为病毒,直接给我删除掉了,这让人是真的很XX,那该怎么办呐。
我最近用了这个方法很多次,蛮好用,分享给大家!
1、先找到安全中心
2、找不到排除项
3、点击添加排除项 4、我选择的文件夹
5、找到对应的文件夹
一 团队使用: 组长:
1.创建仓库
2.git init
3.git add origin master
4.git commit -m’[组长]提交’
5.git push origin master
6.将仓库开源,邀请组员,将仓库网站分发给组员并指派任务
组员:
1.克隆项目:git clone https://gitee.com/。。。。/test.git
2.开发、完成任务
3.git add .
4.git commit -m’[组员xxx]提交’
5.git pull origin master(更新提交内容,防止直接覆盖!!!)
6.git push origin master
最后的心得就是:直接在vsCode上点提交上传不更快吗?好吧,这只是其中一种上传方法,了解即可。
所以进入项目组进行拉取代码 第一步: 配置
git config --global user.name "spinkh" git config --global user.email "email@sample.com" 1.设置 修改用户名 git config --global user.name "xxxx(新的用户名)" 修改密码 git config --global user.password "xxxx(新的密码)" 修改邮箱 git config --global user.email "
本文主要介绍了Redis操作命令总结,本文讲解了key pattern 查询相应的key、字符串类型的操作、链表操作、hashes类型及操作、集合结构操作、有序集合、服务器相关命令等内容,需要的朋友可以参考下
一、key pattern 查询相应的key
(1)redis允许模糊查询key 有3个通配符 *、?、[]
(2)randomkey:返回随机key (3)type key:返回key存储的类型
(4)exists key:判断某个key是否存在
(5)del key:删除key
(6)rename key newkey:改名
(7)renamenx key newkey:如果newkey不存在则修改成功
(8)move key 1:将key移动到1数据库
(9)ttl key:查询key的生命周期(秒)
(10)expire key 整数值:设置key的生命周期以秒为单位
(11)pexpire key 整数值:设置key的生命周期以毫秒为单位
(12)pttl key:查询key 的生命周期(毫秒)
(13)perisist key:把指定key设置为永久有效
二、字符串类型的操作
(1)set key value [ex 秒数] [px 毫秒数] [nx/xx] 如果ex和px同时写,则以后面的有效期为准
nx:如果key不存在则建立
xx:如果key存在则修改其值
(2)get key:取值
(3)mset key1 value1 key2 value2 一次设置多个值
(4)mget key1 key2 :一次获取多个值
(5)setrange key offset value:把字符串的offset偏移字节改成value
如果偏移量 > 字符串长度,该字符自动补0x00
由于五子棋是一种游戏,属于交互式应用程序,需要图形界面,因此需要使用一些图形库。以下是一个使用 Tkinter 模块实现五子棋的 Python 代码示例:
import tkinter as tk class Chessboard(tk.Canvas): def __init__(self, master=None, **kwargs): super().__init__(master, **kwargs) self.master = master self.init_chessboard() self.draw_chessboard() self.bind_events() def init_chessboard(self): self.n = 15 # 棋盘大小 self.step = 30 # 棋盘格子大小 self.stone_r = self.step // 2 - 2 # 棋子半径 self.board = [[0] * self.n for _ in range(self.n)] # 初始化棋盘状态 self.color = 1 # 当前下棋方,0 表示黑方,1 表示白方 self.game_over = False # 游戏是否结束 self.winner = None # 获胜方 def draw_chessboard(self): for i in range(self.
本文描述通过通过Stateflow调用外部C代码调用外部C代码的方法。
文章目录 1 问题引入2 调用外部C代码的过程 2.1 准备外部文件2.2 搭建模型2.3 生成代码3 调用有参数和返回的函数4 调用参数为指针的函数5 总结 1 问题引入 情形1:在汽车嵌入式软件开发的过程中,通常是用模型生成代码的方式开发应用层软件,用手写代码的方式开发底层软件和接口函数。应用层经常需要调用到底层的函数,比如应用层通过接口函数获取底层的变量值。
情形2:很多早期的项目没有引入MBD(基于模型的设计),而是全部通过手写代码完成。等到后面采用模型生成代码的时候,也会想要调用以前开发的成熟的代码。
以上两种情况,都需要通过在Simulink模型中调用外部的C代码。一种方法是通过S-function封装来实现,但是比较麻烦。本文介绍通过Stateflow实现调用外部C代码。
2 调用外部C代码的过程 2.1 准备外部文件 想要调用外部C代码,首先得要在Matlab路径下能找到这个C代码所在的文件。如果暂时没有开发也没关系,可以建立一个空壳代码,先“骗一下”Matlab。
如图所示,在Matlab当前路径下建立两个文件:myfile.c和myfile.h:
在myfile.c中写入代码:
#include "myfile.h" void HandCode(void) { } 在myfile.h中写入代码:
void HandCode(void); 可以看到,HandCode()这个函数没有参数也没有返回值,而且里面是空的,啥都没有。
2.2 搭建模型 1.新建一个空白Simulink,建立一个Chart。
2.点击去这个Chart,打开Model Explorer,将Action Language设置为C。
3.建立一个简单的流程图,并在圆括号的动作中写上之前的那个HandCode的C代码。
3.打开设置——Simulation Target,填写右侧的Source file和Header file并确定。
2.3 生成代码 Ctrl+B生成代码,在打开的报告中就可以看到step函数中调用了这个C代码,以及头文件中包含了myfile.h。
最后别忘了,集成的时候要把真正的外部调用代码拿来编译,而不是我们自己建立的空壳代码。
3 调用有参数和返回的函数 上面举的例子是没有参数和返回值的,对于有参数和返回值的函数也是可以调用的。
1.首先修改一下C代码,加上参数和返回。
C文件:
#include "myfile.h" single HandCode(single Input1) { } 头文件:
typedef float single; single HandCode(single Input1); 这里用typedef定义一个single类型。
以下就是常见基本的排序方式
1、冒泡排序
2、选择排序
3、插入排序
4、希尔排序
5、归并排序
6、快速排序
7、堆排序
8、计数排序
菜鸟教程排序链接
该处的排序原理,讲的其实十分细致。
这里着重介绍下,快速排序和归并排序。
文章目录 快速排序归并排序排序稳定性的思考 快速排序 快速排序原理:就是取一个值作为基准,将数组小的移到其左边,大的数据移到右边。反复此过程,就可以实现排序。
相信你看过了菜鸟的代码,快速排序的迭代版本以及递归版本,其中有一个三数取中原则。
根据快速排序原理,我们拿来作为基准值的数,如果能是该数组的中间数,那么就能实现尽量接近2分。
但是倘若一个数组全是【2,2,2,2,2,2,2,2】,再以那样的代码,三数取中也无法改变,所以这个时候,那个数据取完之后,就会导致这次排序走了一次n,并且直到最后一躺,时间复杂度就是n^2
为了解决这个问题,我们在每次排序时,需要相等的放在中间,小的放在前面,大的放在后面。
以下是实例。
int part_sort_returnArrays(int * a,int n,int* returnSize)//如果说,存在全都相等的数字,那么这里不就是单趟遍历,最后导致quiksort是n^2的时间复杂度 //因此这里提供一种修改方案,相等的全部移往中间,但是值得注意,由于返回相当于是一个数组了,那么就不仅仅要i下标,还要整个长度 { if(n<=1) { return 0; } int midi = GetMid_Index(a,0,n-1); swap(&a[0],&a[midi],sizeof(a[0])); int i =0; int temp = a[0]; int count = 0;//计算与temp值相等的数值总个数 int m = n -1; for(int j=0;j<m+1;)//前后指针下标版本 { if(a[j]==temp) { count++; j++; } else if(a[j]<temp) { swap(&a[i++],&a[j],sizeof(a[j])); j++; } else { swap(&a[m--],&a[j],sizeof(a[j])); } } for(int k = 0;k<count;k++)//注意,由于这里每次都多走了一组,实际效率有所下降, { a[i+k] = temp; } *returnSize = count; return i; } 还有一种问题存在,有一种数据,让你每次三数取中都取到比很小的数或者很大的数,那么时间复杂度基本也就是o(N^2)
文章目录 1. Less介绍2. 安装2.1 部署node.js环境2.2 安装Less2.3 WebStorm配置Less 3. Less语法3.1 变量3.2 嵌套3.3 运算 1. Less介绍 Less是CSS预处理语言,可以使用变量、嵌套、运算等,便于维护项目CSS样式代码。
2. 安装 2.1 部署node.js环境 官网地址:https://nodejs.org/en/download,软件安装好后,CMD命令窗口输入node -v和npm -v,分别跳出版本号,说明node.js环境安装成功。
2.2 安装Less 采用npm包管理工具,全局安装Less包
npm install -g less less安装好了,lessc也安装好了
lessc -v lessc命令是可以把less文件转成css文件
# 把xx.less文件转成xx.css文件 lessc xx.less xx.css 2.3 WebStorm配置Less 目的:编辑器自动把less文件转成css文件
我这边采用WebStorm编辑器。WebStorm左上角–>files–>Settings–>Tools–>File Watchers–>点击添加
lessc路径可以通过where lessc命令得到
css导出参数
# $FileParentDir(less)$ 是获取 less 目录的路径 # $FileDirPathFromParent(less)$ 是获取 less 文件到 less 目录的路径 # $FileNameWithoutExtension$ 是获取 less 文件不带后缀的名字 $FileName$ $FileParentDir$\css\$FileNameWithoutExtension$.css --source-map 3. Less语法 3.1 变量 变量可以当做普通的变量、选择器变量、属性变量、URL变量、声明变量来使用。
今天来分享一道美团高频面试题,5 分钟搞懂“为什么 MySQL 不建议使用 NULL 作为列默认值?”。
对于这个问题,通常能听到的答案是 使用了 NULL 值的列将会使索引失效,但是如果实际测试过一下,你就知道IS NULL会使用索引.所以上述说法有漏洞.
着急的人拉到最下边看结论
前言 Null is a special constraint of columns. The columns in table will be added null constrain if you do not define the column with “not null” key words explicitly when creating the table.Many programmers like to define columns by default because of the conveniences(reducing the judgement code of nullibility) what consequently cause some uncertainty of query and poor performance of database.
1.要求: 软件:有MySQL数据库、Eclipse有前台显示页面实现对学生的、增、删、改、查 查询是模糊查询,输入姓或者名得出一个表修改是根据账号修改,且账号不可以修改删除保留在当前页面(分页后会有好多页,在删除最后一页最后一个数据时刷新后还在当前页面只是要删除数据消失了)删除前:删除后:还在第三页并对结果进行分页显示,每一页只显示三条信息。 2.分析: 数据库表必须要有:账号、姓名、密码,且其中账号为主键。 3.实施 (1).:创建Java web项目: (2).:Java和后端交互(Eclipse链接数据,实现学生对数据库的增删改查) Java web项目中创建4个包
其中: bean包(JavaBean):JavaBean是一个符合特定规范的Java类。通常用于封装数据,并提供公共的getter和setter方法以及其他操作方法。JavaBean用于在不同的层之间传递数据或表示业务实体。 (简单理解就是定义Java类地方,其中包含这个类属性、get、set、toString、有参、无参构造方法)
dao包(Data Access Object):DAO是数据访问对象的缩写。DAO模式是一种用于数据持久化的设计模式。DAO类封装了与数据存储相关的操作方法,如增加、删除、修改和查询等。通过DAO,应用程序可以更方便地与底层数据库进行交互,并隐藏了数据库细节。 (简单理解就是链接数据库、对数据库进行增删改查地方)
service包:Service层位于DAO层之上,负责处理业务逻辑。Service层通常封装了一系列的业务操作,如数据校验、事务管理和调用多个DAO方法等。它使得控制层,如Servlet,能够更专注于处理请求和响应,将业务逻辑的处理分离出来。同时,service层的存在使得信息处理的代码更加模块化和可复用,方便进行单元测试和维护、确保输入的数据是有效和可信的,以及对数据进行必要的处理和操作,满足业务需求和数据完整性的要求。。 (简单理解就是对数据检测、以及数据处理)
servlet包:Servlet是Java Web开发中处理HTTP请求和生成HTTP响应的组件。Servlet是运行在Web服务器上的Java类。它可以接收来自客户端的请求,并生成相应的响应。Servlet可以处理不同类型的请求(如GET、POST等),在服务端执行相应的业务逻辑,并与客户端进行交互。Servlet将Java代码嵌入到Web应用程序中,实现与客户端的交互和业务逻辑处。Servlet运行在服务器端,所以它可以与数据库、文件系统等后台资源进行交互,处理复杂的数据操作和业务需求。 (简单理解就是处理HTTP请求、生成动态内容并实现服务器端业务逻辑的Java组件,是构建Java Web应用程序的重要组成部分)
1.: Eclipse链接数据库 Eclipse链接数据库,数据库链接测试,MySQL环境变量配置:http://t.csdn.cn/3Hp1Y
2.:Eclipse链接测试过数据库后,开始把链接测试代码规范化。上文讲到dao包就是链接数据库、对数据库进行增删改查地方,所有要在dao包中创建文件把链接写到里面。 package com.jd.dao; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.ArrayList; import java.util.List; import com.jd.bean.Student; /** * 数据持久化层 * @author lenovo */ public class BaseDAO<E> { private static final String DRIVER="com.mysql.cj.jdbc.Driver"; private static final String URL="jdbc:mysql://127.0.0.1:3306/gs?useUnicode=true&characterEncoding=utf-8"; private static final String USERNAME="
目录
1. Git Windows版的安装
1.1 软件下载
1.2 安装git for Windows
1.3 安装TortoiseGit
1.4 安装中文语言包
2. 使用git管理文件版本
2.1 创建版本库
2.1.1 使用Git bash 创建
2.1.2 使用 TortoiseGit
2.2 添加文件
2.2.1 添加文件整个过程
2.2.2 工作区 和 暂存区
2.3 修改文件
2.3.1 提交修改
2.3.2 查看修改历史
2.3.3 差异比较
2.3.4 还原修改
2.4 删除文件
2.5 案例:将java工程提交到版本库
2.6 忽略文件语法规则
3. 远程仓库
3.1 添加远程仓库
3.1.1 在 码云上创建仓库
3.1.2 ssh协议
3.1.3 同步到远程仓库
3.2 从远程仓库克隆
3.2.1 使用 git bash
3.2.2 使用 TortoiseGit
上一篇我详细讲解了如何创建一个插件,但是无界面无按钮,这种插件适合配合事件偷偷的在后台做点什么事情。今天这篇讲一下如何增加一些按钮到工具栏、菜单上去。 先告诉大家这个东西注册表在哪,因为solidworks在这方面做的不太好,插件你改个名字,就有多个工具栏在solidworks上面了,如果后面有些没用的工具栏名称,它的图标还会乱跑,就可以到这里面去删除没用的名称。
准备图标 有菜单,肯定要图标,也方便用户更好的识别。
这里我就拿之前demo中的示例图标了
在项目目录下新建一个icons的文件夹,把图标放进来,高版本是推荐这6种图标的,旧版api示例中是大图标和两图标2种格式就好了,当然代码写法也有点区别:
mainicon是插件的主图标,用在工具条显示的的前面
还有个地方显示的,但官方的图标没有显示,应该是因为图标位深(8的可以显示,32的显示不了)的问题,具体没研究,而且插件名称中如果有.,那么在dll中资源识别的时候会导致名称不一样,solidwroks也不能识别插件的图标。
然后
再设置为如果较新则复制
这样,我们再次生成插件的时候,这些图标就会复制到输出的目录中区,当然大家也可以按api帮助中的把这些设置为资源文件。
我这样是方便我换图标。
代码处理 先增加几个私用的变量,用于命令管理 插件CookieID ,工具组ID 以及命令id数组,还有图标的路径。
private ICommandManager iCmdMgr = null; /// <summary> /// 插件cookie /// </summary> private int addinCookieID; public int mainCmdGroupID = 5001; //本示例只有3个命名,三个图标。 public int[] mainItemIds = new int[3] { 1002, 1003, 1004 }; /// <summary> /// 主图标的6种尺寸 /// </summary> private string[] mainIcons = new string[6]; /// <summary> /// 工具栏图标带6种尺寸文件 /// </summary> private string[] icons = new string[6]; 然后修改ConnectToSW的代码,注释掉之前加载过程中的提示,并在此增加命令。
目录 1.安装方案一2.安装方案二1. 确保已经安装了如下软件:2.下载源码:3.解压4.配置路径5.编译和安装6.添加环境变量 3.测试参考文献Ubuntu 20.04下的MPICH安装1.安装方案一2.安装方案二1. 确保已经安装了如下软件:2.下载源码:3.解压4.配置路径5.编译和安装6.添加环境变量 3.测试参考文献 MPI(Message-Passing Interface),并不是一种新的语言,而是消息传递接口,它定义了一个可以被C、C++和Fortran程序调用的函数库[1]。我们可以用MPI来进行进程间的通信,以消息传递的方式来对分布式内存系统进行编程。通过安装MPICH构建MPI编程环境,从而进行并行程序的开发。MPICH是MPI(Message-Passing Interface)的一个应用实现,支持最新的MPI-2接口标准,是用于并行运算的工具[2]。
1.安装方案一 直接运行利用apt安装,执行下面的命令,按照提示操作即可,但是我安装后使用还是有问题。
apt安装命令:
apt-get install mpich 如果需要卸载:
sudo apt-get --purge remove mpich 安装之后可以利用第三部分提供的代码进行测试。
2.安装方案二 利用源码安装。
1. 确保已经安装了如下软件: gcc --version g++ --version cmake --version gfortran --version 如果没有直接sudo apt-get install xxx安装即可。
如果gfortran安装有问题,可以参考下面的:
sudo apt-get install gfortran # 如果没有源则按下面更新下,再次安装 # sudo apt-get update 如果上面的命令,无法安装gfortran,则需要,显示:
gfortran : 依赖: gfortran-7 (>= 7.3.0-12~) 但是它将不会被安装 E: 无法修正错误,因为您要求某些软件包保持现状,就是它们破坏了软件包间的依赖关系 这表示有冲突了,所以可以采取如下命令安装,aptitude会提供一套解决冲突的方案,你可以根据提示选择合适方案安装,如果aptitude没有安装的,那么可以按照下面的安装即可:
sudo apt install aptitude sudo aptitude install gfortran 2.
需求:设置legend图例文本的颜色与对应折线一致
实现:在legend图例文本样式配置中给color设置一个空数组即可
代码:
legend: { orient: 'vertical', left: '89%', top: 'middle', width: 100, itemWidth: 25, itemHeight: 1, textStyle: { color: [] } } 效果:
记录于2023-7-21
SpringSecurity 学习指南大全
SpringSecurity - 前后端分离简单实战 - 环境准备
SpringSecurity - 前后端分离简单实战 - 自定义认证篇
开源 Spring Security 前后端分离 - 后端示例
文章目录 SpringSecurity - 简单前后端分离 - 自定义授权篇简单理论Security 的权限架构自定义授权管理器自定义授权异常处理配置自定义授权自定义退出HttpSecurity 对象简单介绍其它 SpringSecurity - 简单前后端分离 - 自定义授权篇 隔了那么久,终于来补坑了,(/▽\)。
我们接着介绍自定义授权是如何做的。环境准备和前面一样,接着认证篇,继续完成我们的授权处理。
简单理论 授权:授权其实就是确认当前登录系统的用户能够干些什么事情。前面的认证篇,我们可以确定哪些用户是我们系统的用户,而授权则是在认证完成的基础上来确定当前的用户能在我们系统中干些什么事情,也就是有些什么功能。
当前权限的控制也分很多种,权限的级别,一般就是指权限的粒度。比如只控制用户登录,登录后就拥有所有的权限,这种就是粗粒度的权限。
我们可以继续细分权限,比如权限粒度控制到菜单级别,这样用户登录后,拥有自己的菜单,不同的用户拥有不同的菜单权限,这也是比较简单的基于菜单的权限控制。
我们接着细化,再控制深一点,就是接口权限,不仅包含菜单权限的控制,并且精确到用户调用接口的权限,也就是功能权限,比如一个数据列表,有的用户可以修改数据,而有的用户只有查看的权限。这种权限控制比较常见,很多管理系统就是这种权限。
再细化就是数据权限了,不仅控制菜单和功能,还控制用户可以查看的数据,这种权限控制有的是在数据库添加权限字段,有的是封装查询的条件,通过用户的数据权限配置来查询符合规定的数据。比如一个用户只能查看一个功能数据的前100条等等。基于数据库的权限控制。
常见的权限级别:登录权限、菜单权限、功能权限、数据权限
当然除了前面的权限,我们还可以根据自己的业务常见定制化其它的权限控制。我这里演示的授权是基于请求路径的权限拦截。也相当于接口权限。
对于权限的数据库设计,大家可以参考网上的其它文章,比如经典的 RBAC 权限模型。
Security 的权限架构 在我之前写的文章中已经详细介绍了授权和认证架构。
SpringSecurity - 基于 Servlet 的应用程序
基本上就是,Security 已经帮我们做了一些默认的权限认证了,默认的权限控制只是认证成功的就行,
Security 在做权限认证时使用的是 AuthorizationFilter,它会拦截所有的请求,并调用 AuthorizationManagers 来处理权限认证,AuthorizationManager 是个接口,它包含两个方法。
AuthorizationDecision check(Supplier<Authentication> authentication, Object secureObject); default AuthorizationDecision verify(Supplier<Authentication> authentication, Object secureObject) throws AccessDeniedException { AuthorizationDecision decision = check(authentication, object); if (decision !
文章目录 环境代码准备备份构建/运行验证 恢复遇到的问题 环境 milvus:v2.2.4
go:1.20.2 darwin/amd64
milvus-backup:v0.2.2
代码准备 https://github.com/zilliztech/milvus-backup/releases
如果你的milvus是2.2.9版本及以上,可以直接下载最新的版本:git clone https://github.com/zilliztech/milvus-backup.git
默认使用的配置文件在config目录下,如果不需要手动指定,直接修改改文件即可,主要修改milvus和minio相关配置即可
示例:
# Configures the system log output. log: level: info # Only supports debug, info, warn, error, panic, or fatal. Default 'info'. console: true file: rootPath: "logs/backup.log" http: simpleResponse: true # milvus proxy address, compatible to milvus.yaml milvus: address: milvus-t-milvus.milvus.svc.t2.test.xdf.cn port: 19530 authorizationEnabled: false # tls mode values [0, 1, 2] # 0 is close, 1 is one-way authentication, 2 is two-way authentication.
select top 1 * from OPENDATASOURCE( 'SQLOLEDB', 'Data Source=ip;User ID=*;Password=****' ).数据库名.dbo.表名 #开启配置语句: EXEC sp_configure 'show advanced options', 1 GO RECONFIGURE GO EXEC sp_configure 'Ad Hoc Distributed Queries', 1 GO RECONFIGURE GO
一、简介 本次分享采用VSCODE+Espressif IDF插件
创建一个全新的虚拟机
二、需要下载的文件 1.esp-idf-tools-setup-offline-4.4.4 网址:https://dl.espressif.cn/dl/esp-idf/?idf=4.4 下载到电脑上后,双击安装
自定义安装路径,我这里默认
安装
安装完成之后会自动安装这两个,双击打开两个,安装环境
出现一下现象代表安装成功
至此,idf编译环境已经安装成功,可以使用命令行编译程序。接下来,安装VScode,使用ESP32-IDF插件达到相同的效果。
2.VScode 网址:Visual Studio Code - Code Editing. Redefined 安装VScode,建议全部勾选
三、安装和配置VScode插件 安装完成后,打开VScode,先安装这两个插件。
等待Espreeif IDF插件安装完成之后,等待它自动跳出一下两个选项,等待上面的下载好,下面的view changelog忽略,点击取消或者关闭。
如果没跳出上面的界面,可以用ctrl+shift+p ,选择 配置ESP-IDF:插件
进入后,Global不变,选择高级-ADVANCED
进入后,选择Espressif服务器下载,Espressif是国内的下载,但是第三步安装python环境会出问题,不过我们这里不用管第三步。后面两个地址是刚刚安装esp-idf-tools-setup-offline-4.4.4的地方,复制上对应的地址就行
点击安装
安装完成后会自动跳转,安装IDF工具。我们选择安装已经存在的工具。
安装完成后会跳出这个报错,不用管它,到这里已经配置完成。
ps:如果是在虚拟机上搭建的,需要在主机里把VScode里的Espressif IDF插件的自动同步关掉,避免后后面两个VScode相互影响。(如果没有这个选项,就不用管)
四、解决工程里识别不到文件出现红色波浪线的情况 1.先打开一个hello world工程。 ctrl+shift+p,导出一个例程
打开后点开main文件,此时右下角会弹出提示你安装拓展,点击安装
注意:跳出的这个不要点击确认(VScode自动弹出的扩展,除了可以确定能用的尽量别点,会出现莫名其妙的问题)
安装完成之后,会出现一下这些插件,这里把Cmake工具都关了,VScode头文件调用只和c/c++的三个插件有关。
关闭之后,点击编译
出现这个文件进度[25/1075]说明成功进入编译,此时搭建完毕。
如果头文件上还是有波浪线,可以关闭VScode再打开,右下角会弹出配置.json提示,点击是,波浪线就会消失。
如果没弹出这个提示,右下角会有一个黄色的感叹号框,点开之后手动配置 IntelliSense,选择弹出的第一项即可。
如果中途出现错误,需要清除VScode的环境,然后重新操作,后续会放上清除电脑上的已存在的VScode环境的教程。
【准备阶段】 安装好NodeJS、NPM工具
安装Vue CLI - 官方发布的一个vue.js项目脚手架,使用vue-cli可以快速创建Vue项目
vue ui 是在 vue-cli 基础上封装的。
$ npm install -g @vue/cli
【vue-ui 搭建vue项目】 dos cmd命令行输入:"vue ui"
$ vue ui
启动后有个浏览器页面引导搭建项目,步骤:
1.使用npm作为包管理器
2.选择vue版本vue2/3,选定手动配置项目
3.选择功能:Babel、Router、Vuex,其他不选,也不要预设项目
4.右上角:安装依赖 axios、element-plus,查看运行依赖中是否到位
5.安装完成,参考element-plus官网(https://element-plus.org/zh-CN/)指南-"完整引入"部分引入element-plus
# 在src/main.js文件中引入
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
app.use(ElementPlus)
官网:
https://element-plus.org/zh-CN/
指南:https://element-plus.org/zh-CN/guide/design.html
https://element-plus.gitee.io/zh-CN
6.测试element-plus组件是否生效
右上角"组件" --引入"按钮"组件代码 -- 放到src/views/AboutView.vue,覆盖所有页面内容
去掉<script lang="ts" setup>中的lang="ts"
7.运行服务:npm run serve
8.访问:localhost:8080/#/about
9.访问成功,前端项目搭建成功!
10.开发过程中如果需要安装组件,比如:sass
# 登录:localhost:8080/dashboard
# "项目依赖"页面展示中如果没有需要的组件则进行安装
# 点击左侧菜单"依赖" --> 页面右上角"安装依赖" --> 查找输入框里输入"sass" --> 选中组件 --> 右下角点击"
1.进入管理员下的控制台。
2. 输入密码后点击“授权”。
3.在控制台内输入下面的内容。
vim /etc/apt/sources.list 4.敲击回车后会进入下面的页面。
5.来到这个页面后的第一部是按键盘上的“i”键,左下角出现“插入”后说明操作正确。
6.使用“#”将原本的源给注释掉。
7. 从下面的源内选择一个复制下来准备粘贴进去(都是优质源,复制哪个都可以)。
中科大Kali镜像源 deb http://mirrors.ustc.edu.cn/kali kali-rolling main non-free contrib deb-src http://mirrors.ustc.edu.cn/kali kali-rolling main non-free contrib 阿里云Kali镜像源 deb http://mirrors.aliyun.com/kali kali-rolling main non-free contrib deb-src http://mirrors.aliyun.com/kali kali-rolling main non-free contrib 清华大学Kali镜像源 deb http://mirrors.tuna.tsinghua.edu.cn/kali kali-rolling main contrib non-free deb-src https://mirrors.tuna.tsinghua.edu.cn/kali kali-rolling main contrib non-free 8.将上面复制的源粘贴到下图所示位置。
9.按键盘上的“ESC”键,左下角的“插入”消失说明操作正确。
10.输入“:wq!”(注意使用英文输入法),这步操作是保存配置并退出。
:wq! 11. 回车后便成功保存并退出了。
12.之后执行下面的命令更新源。
apt-get update 13.回车后等待即可,约一分钟,出现下面页面即更新成功了。
14.接下来可以使用下面的命令来对软件进行更新(如果不需要更新则可以忽略下面内容)。
命令1: apt-get upgrade 命令2: apt-get dist-upgrade 上面两条命令均是用来更新所有软件的,不同的是: 它能识别新版本的依赖关系, 将不要的依赖进行卸载, 将需要升级的依赖进行升级。 注: 在更新软件期间可能会需要确认、配置、显示更新日志等,按照提示操作即可。
Notepad++编译运行C/C++ 为了使C/C++代码调试更方便,通过Notepad++与MinGw联合使用,一键编译运行代码。
本文记录Notepad++与MinGw配置方法。
MinGW安装 官网路径:MinGW
安装包:
win64选x86_64-win32-seh
win32选i686-win32-dwarf
具体为什么选择seh或dwarf,因为性能最优,具体了解请自行查找。
点击后,跳到如下界面,等待几秒钟后自动下载。
下载完成后将其解压,无需安装,如下图所示,将文件放到选中路径下。比如D:\mingw-w64
综上,MinGW就安装好了。接下来需要配置系统变量。
系统变量配置 右键【我的电脑】选择【属性】,在弹出界面选择【高级系统设置】
点击【环境变量】在【系统变量】中选择【Path】添加MinGW-64文件夹中bin文件夹路径。如D:\SoftWare\mingw-w64\bin。
打开CMD界面输入【gcc -v】将会显示MinGW-64组将列表。如下图所示,表示安装成功。
Notepad++安装 官网路径:Notepad++
GitHub路径:Notepad++
官网路径很难加载,经常提示无法访问,建议使用GitHub路径,如下图所示,选择【Notepad++ release 8.5.3】进入下载页面。
在下载页面,选择对应得exe文件下载,进行安装即可。
设置运行指令 C 编译运行:
cmd /k gcc -o "$(CURRENT_DIRECTORY)\$(NAME_PART).exe" "$(FULL_CURRENT_PATH)" && CLS && "$(CURRENT_DIRECTORY)\$(NAME_PART).exe" & PAUSE & EXIT C++ 编译运行:
cmd /k g++ -o "$(CURRENT_DIRECTORY)\$(NAME_PART).exe" "$(FULL_CURRENT_PATH)" && CLS && "$(CURRENT_DIRECTORY)\$(NAME_PART).exe" & PAUSE & EXIT 打开Notepad++,点击【运行】
输入上述代码C或C++,点击保存
设置快捷键,保存即可。
打开.c文件时输入C编译运行快捷键,即可输出结果。
打开.cpp文件时输入C++编译运行快捷键,即可输出结果。
Python设置运行指令 cmd /k cd /d "$(CURRENT_DIRECTORY)" & python "
idea64.exe.vmoptions有3个地方 1 系统环境变量 IDEA_VM_OPTION2 idea安装目录3 APPDATA目录
网络时间协议,英文名称:Network Time Protocol(NTP)是用来使计算机时间同步化的一种协议,它可以使计算机对其服务器或时钟源(如石英钟,GPS等等)做同步化,它可以提供高精准度的时间校正(LAN上与标准间差小于1毫秒,WAN上几十毫秒),且可介由加密确认的方式来防止恶毒的协议攻击。NTP的目的是在无序的Internet环境中提供精确和健壮的时间服务。
安装NTP
apt-get install -y ntp 修改文件
/etc/ntpsec/ntp.conf server 0.debian.pool.ntp.org iburst dynamic
server 1.debian.pool.ntp.org iburst dynamic
server 2.debian.pool.ntp.org iburst dynamic
server 3.debian.pool.ntp.org iburst dynamic
重启NTP服务
/etc/init.d/ntpsec restart kali时间校正
参考: https://blog.csdn.net/heybob/article/details/9254289
一、memcpy(string.h) 1.介绍 memcpy函数为内存拷贝函数,既可以拷贝字符串,也可以拷贝整形数组、浮点型数组等,具有明显的应用优势,
destination为目的地空间,source为不可修改(const)的来源空间,num表示无符号的字节数。其主要含义为将source内容拷贝到destination中,拷贝num个字节数。其返回类型、目的地、来源类型均为void* ,void*可以接收任意类型的参数。因为它可以拷贝多种不同类型的内容,运用单一的类型,就限制了其拷贝的内容了。size_t表示无符号数。
返回时会返回目的地的起始位置地址。
下面我们通过几个例子了解一下它的用途。
2.例子 2.1 例一 通过例一我们发现,memcpy函数将arr1的前5个字节数拷贝进了arr2数组中因为char类型的变量所占的字节数为1,所以abcde都拷进了arr2中。返回值为arr2数组的起始位置的地址。
2.2 例二 例一和例二的不同点在于多拷贝了一个字节,将arr1中的字符'\0'拷进了arr2中,因此在打印arr2数组时遇见了拷贝进去的字符'\0',因此它只会打印'\0'之前的内容,所以打印出的结果为abcde。
这也就说明了内存拷贝函数memcpy不会去管拷贝内容究竟是什么,只要没到达我拷贝的字节数,那就嘎嘎拷贝就完了。
2.3 例三 例三不为字符的拷贝了,为整形数组的拷贝,与浮点数拷贝两者相同。 也是将arr1中的前20个字节数,也就是5个整形变量,拷贝进了arr2中,其主要关键的点在于20表示的意思为前20个字节数。当然,如果你拷贝前19个字节,就会出现一些问题,所以拷贝时尽量按照一个变量所占字节数的整数倍来进行拷贝。
2.4 例四 我们预期结果为1 2 1 2 3 4 5 8 9 10 但实际结果为1 2 1 2 1 2 1 8 9 10。因此达不到我们预期结果。
这是因为我们想将12345拷贝进34567之中,所以1拷贝代替了3,2拷贝代替了4,此时3和4被变成了1和2,那么再拷贝3和4进5和6时,就是1和2拷贝进5和6了,剩下的拷贝也是如此。
应注意,此时目的地空间和来源空间有重叠空间,因此memcpy函数不支持有重叠内存空间的拷贝的,此时我们就需要另一个函数memove来帮助我们处理有重叠空间的内存拷贝。
二、memove(string.h) 1.介绍 memove函数为内存移动函数,也就是将来源空间内容移动到目的地空间之中。相当于拷贝。
其参数类型和返回值和memcpy完全相同,其含义为将source(来源)前num个字节数空间的内容移动到destination(目的地)空间之中,和拷贝含义几乎相同。这就过多介绍了。其用法也基本相同,只不过,memmove函数可以处理重叠内存空间的拷贝。
直接看实例
2.例子 只看一个例子即可,就是重叠内存空间的处理,其他处理和memcpy函数相同。
可以看到,memmove函数可以处理重叠内存空间的拷贝(移动)。因此在使用memcpy和memmove两个函数时要注意其应用条件。
三、memcmp(string.h) 1.介绍 memcmp函数为内存比较函数,其与字符串比较函数strcmp函数相像,不同的是memcmp函数可以既可以比较整形、浮点型,也可以比较字符串。
因为是比较函数,所以原来的空间内容是不可被修改的,只能用于比较,因此前两个参数都用了const做修饰。其可以接收任意类型的参数。其基本含义为比较两个空间前num个字节数内容大小,返回值类型为整形,若ptr1 > ptr2,则返回大于0的数字,若等于,则返回0,若小于,则返回小于0的数字。
2.例子 比较arr1和arr2前9个字节空间的内容,而arr1和arr2前九个字节相同,因此返回0。
而比较前10个字节的时候,arr2的第10个字节内容大于arr1第10个字节的内容的,因此返回-1,表示arr1小于arr2。
综上,三大内存函数就已完全结束。
numpy基本用法 创建矩阵、查看维度、形状和元素数量numpy数据类型创建特殊numpy矩阵numpy生成range矩阵、等差、等比矩阵、reshape 矩阵的计算矩阵元素的加减乘除矩阵的函数sin、cos、boolean矩阵的乘法矩阵sum、max、min矩阵内部计算 矩阵的索引矩阵的合并 创建矩阵、查看维度、形状和元素数量 import numpy as np array = [[1,2,3], [4,5,6]] array = np.array(array) print(array) print('number of dim: ', array.ndim) print('shape: ', array.shape) print('size: ', array.size) [[1 2 3] [4 5 6]] number of dim: 2 shape: (2, 3) size: 6 numpy数据类型 dtype(np.int64、int32、float64等等)
array = np.array([[1,2,3], [4,5,6]], dtype=np.int64) print(array) [[1 2 3] [4 5 6]] 创建特殊numpy矩阵 np.zeros((2,3)) array([[0., 0., 0.], [0., 0., 0.]]) np.ones((2,3), dtype=int) array([[1, 1, 1], [1, 1, 1]]) np.
cdr2023 CorelDRAW Graphics 2023 集成免登陆多语言中文直装版,CorelDRAW Graphics Suite 2023 一键直装正式版,此版本内置安装序列号,基于官方版本制作而成,不过目前只支持 x64位的系统,集成河蟹授权激活文件,真正的 CorelDRAW Graphics Suite 2023 免登陆正式版,集成了 CorelDRAW 2023 免登陆河蟹补丁,直接解压即可安装使用,无需解锁钥匙注册登陆,无需要用户名登陆,目前限时发布更新分享,各位同学请尽快下载使用。
使用说明
1、基于官方正式版 CorelDRAW Graphics Suite 2023 解包制作
2、集成所需要CorelDRAW正版序列号及河蟹授权文件制作而成解压安装即可
3、集成 CorelDRAW 2023 免登陆河蟹补丁,直接安装即可食用一键安装河蟹
CorelDRAW Graphics Suite 2023 一键直装中文完美正式版是一款领先的图形设计软件,受到数百 万专业人士、小型企业主以及全球设计爱好者的热捧。它可以提供无缝的图 形、版面、插图、照片编辑、摹图、网络图像、印刷项目、美术作品、排版 等设计体验。随心设计,获得惊艳的设计效果。
软件特色
1、体验
无论您是初始用户还是经验丰富的设计师,CorelDRAW Graphics Suite 2023开始使用十分简便。了解基本功能、通过启动概览查看新增内容,或通过仅为 Adobe 用户设计的特殊概览转移到套件。使用匹配工作流需求的工作区可立即提高效率,并从高质内容和通用产品内学习中获益
2、个性化
请在主页了解所有收藏工具!可根据需求调整设计空间并自定义图标大小、桌面和窗口边框颜色。借助受欢迎的 Corel Font Manager 2023,为您的项目探索并管理字体。通过下载免费和高级应用程序、插件、扩展、字体包等,直接在应用程序中扩展创意工具和内容集合
3、工艺
通过这款图形设计软件高水准的直观功能,充分展现您的设计技巧。通过字体搜索和筛选功能,为任何项目快速查找字体。通过全新的 LiveSketch 工具节省宝贵的设计时间;而在创意迸发时,允许您在启用画笔的设备上捕获所有原始创意。借助全新的节点编辑功能加快工作速度,并使用 Corel® PHOTO-PAINT® 2023 中的“修复复制”工具精修照片
4、愉悦
交付专业质量输出,将在任何介质上使人过目不忘:从与众不同的徽标和标志到引人注目的营销材料、Web 和社交媒体图形,应有尽有!凭借行业领先的文件格式兼容性和高级颜色管理工具,CorelDRAW Graphics Suite 2023可提供所有项目类型所需的灵活性和颜色精确度。了解充满活力和灵感的CorelDRAW用户社区,以对您的创意之旅产生积极影响
新功能变化
1、合并打印
CorelDRAW 2023 更新了将绘图与可变文本片段合并的方式,从而产生多种不同的设计副本。凭借全面修正的 UI 和简化的工作流,通过”合并打印”功能可更轻松地将图形与数据源合并,以快速生成个性化批量邮件、目标市场营销作品、名片、证书等。
1.时间函数 time interval unit时间单位:SECOND,MINUTE,HOUR,DAY,WEEK,MONTH,QUARTER,或YEAR。DATE_FORMAT(timestamp, string) 此功能存在严重错误,暂时不要使用。CURRENT_DATE:UTC 时区 系统日期 例如:select CURRENT_DATE; 返回 2021-10-08
CURRENT_TIME:UTC 时区 系统时间 例如:select CURRENT_TIME; 返回 09:25:28.137
CURRENT_TIMESTAMP:UTC 时区 系统时间戳,TIMESTAMP 类型 例如:select CURRENT_TIMESTAMP; 返回 2021-10-08T09:23:15.180 --注意和时区有关系
LOCALTIMESTAMP 本地时区系统时间, TIMESTAMP 类型 例如:select LOCALTIMESTAMP; 返回 2021-10-08T17:19:47.787
LOCALTIME 系统时间字符串(HH:mm:ss) 例如:select LOCALTIME; 返回 17:22:16.212
EXTRACT(timeintervalunit FROM temporal) 取日期中的年/月/日 返回整数 例如:select EXTRACT(DAY FROM DATE '2006-06-05'); 返回 日 为 5
例如:select EXTRACT(MONTH FROM DATE '2006-06-05'); 返回 月 为 6
例如:select EXTRACT(YEAR FROM DATE '2006-06-05'); 返回 年 为 2006
前言 在使用JMeter进行性能测试或者接口自动化测试工作中,经常会用到的一个功能,就是断言,断言相当于检查点,它是用来判断系统返回的响应结果是否正确,以此帮我们判断测试是否通过
本文 主要介绍几种常用的断言:响应断言、JSON断言、BeanShell 断言
一、响应断言 1. 响应断言是最常用的一种断言方法,它可以对各种返回类型的结果进行断言,比如Test、html、application/json等
2. 在需要进行断言的Sample,点击右键》添加》断言》响应断言
3. Apply to选项默认即可,Main sample only(仅作用于父节点取样器)
4. 测试字段常用的有响应文本(对响应结果进行断言)、响应头(对响应头文件进行断言)
5. 模式匹配规则常用有包括(响应结果包括断言的内容),相等(响应结果和断言结果相同)
6. 测试模式可以添加你需要断言的部分,如果是包括,就可以添加多个
7. 执行测试,断言通过则显示绿色
8. 把断言改成响应结果不存在的字段,执行结果,显示红色,断言结果显示系统响应结果不包含“测试断言”字段
二、JSON断言 1. JSON断言也是测试工作中经常用到的一种断言方法,它只能针对响应结果是applicaton/json格式的请求进行断言
2. 在需要进行断言的Sample,点击右键》添加》断言》JSON断言
3. 我们使用json断言,一般是断言某个字段值是否返回的是我们需要的,所以需要写JSON PATH(不会写的看本人另外一篇文章有介绍如何写),下图使用正则模式匹配返回的结果包含40就认为响应结果满足要求,断言配置和响应结果如下所示:
4. 下面展示断言结果为常量时,如何进行断言设置,如下图所示
三、BeanShell断言 1. BeanShell断言支持各种开发语言,本文介绍使用java编写断言,使用BeanShell断言的好处是可以自由发挥,比如当断言失败,提示预期结果、实际结果,或者失败时把结果输出到日志
2. 在需要进行断言的Sample,点击右键》添加》断言》BeanShell断言
3. 如果使用包含匹配,只需要修改预期结果即可,预期结果需要写在双引号之间,中间的双引号需要添加\转义,如下:
String response = ""; String Str = "{\"errNo\":\"403\""; //预期结果,需要校验的字段 response = prev.getResponseDataAsString(); //获取当前请求响应结果 if(response == ""){ Failure = true; FailureMessage = "系统无响应,获取不到响应数据!"; //对比数据库内容和响应内容,私用euqals方法判断是否一致 } else if(response.contains(Str) == false){ //把断言失败置为真 Failure = true; String Msg = "
基于javaweb+mysql的ssm宠物领养信息管理系统(JavaWeb JSP MySQL Servlet SSM SpringBoot Layui Ajax)
运行环境
Java≥8、MySQL≥5.7、Tomcat≥8
开发工具
eclipse/idea/myeclipse/sts等均可配置运行
技术框架
JavaBean MVC JSP SSM(Spring SpringMVC MyBatis) MySQL CSS JavaScript Layui Ajax
适用
课程设计,大作业,毕业设计,项目练习,学习演示等
功能说明
登录、注册、退出、用户模块、公告模块、领养模块、宠物模块的增删改查管理
eclipse/MyEclipse运行:
idea运行:
* 跳转到列表页面 * * @param request * @param response */ private void redirectList(HttpServletRequest request, HttpServletResponse response) throws IOException { //查询列和关键字 String searchColumn = request.getParameter("searchColumn"); String keyword = request.getParameter("keyword"); Map<String, Object> params = new HashMap();//用来保存控制层传进来的参数(查询条件) params.put("searchColumn", searchColumn);//要查询的列 params.put("keyword", keyword);//查询的关键字 response.getWriter().println(com.alibaba.fastjson.JSONObject.toJSONString(linyangService.list(params).get("list"))); } } package com.
目录
一. 变量和引用
1.1 什么是变量
1.2 变量的名称
1.3 变量的类型
1.4 变量的定义
1.5 自定义变量
1.6 环境变量
1.7 位置变量
二、变量赋值和作用域
1.1 显示赋值 :变量名=变量值
1.2 read 从键盘读入变量值
1.3 变量和引号
1.4 变量的作用域
1.5变量的运算
一. 变量和引用 1.1 什么是变量 变量是在程序中保护用户数据的一段内存存储空间,变量名是内存空间的首地址 1.2 变量的名称 组成 :字母、数字、下划线组成,不能以数字开头变量名称的长度,shell没有明确规定,但是为了增加可读性,建议使用较短的、见名知意的名称命名规则 1.首字母必须为字母:a-z,A-Z(推荐)
2.中间不能由空格,可以使用下划线(_)
3.不能使用标点符号
4.不能使用bash中关键字,输入help查看bash的保留字
1.3 变量的类型 原则 :shell是一种动态类型语言和弱类型语言,变量是不分数据类型的,统一都使用字符串存储,但根据变量的上下文环境,允许程序执行一些不同的操作,如:比较、整数加减shell的变量数据类型 [root@node1 ~]# vim test1.sh #!/bin/bash #定义变量x,输入初始值123 x=123 #变量x加1 let "x+=1" #输出变量x的值 echo "x=$x" #替换x中1 的值为abc,并赋值给变量y y=${x/1/abc} #使用declare -i 声明变量y为整形变量(i 表示整型) declare -i y #输出y的值 echo "
Mysql 5.7 中如何查看表是否被锁问题 如何查看是否发生死锁 在使用mysql的时候,如何查看表是否被锁呢?
查看表被锁状态和结束死锁步骤:
1.在mysql命令行执行sql语句
use dbName; // 切换到具体数据库 show engine innodb status; // 查询db是否发生死锁 2.查看数据表被锁状态
show OPEN TABLES where In_use > 0; 该语句可以查询到当前锁表的状态
3.分析锁表的SQL
通过sql日志,分析相应SQL,给表加索引,常用字段加索引,表关联字段加索引等方式对sql进行优化。
4.查看正在锁的事务
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS; 在5.5中,information_schema 库中增加了三个关于锁的表(innoDB引擎):
innodb_trx ## 当前运行的所有事务 innodb_locks ## 当前出现的锁 innodb_lock_waits ## 锁等待的对应关系 5.查看等待锁的事务
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS; 6.查看锁的类型和状态:
show status like '%lock%'; 7.查询进程
show processlist 8.杀死发生死锁的进程
如果发生死锁,通过该语句可以查询到表被锁的进程,然后通过kill命令杀掉该进程。
其他查看表锁的情况:
# 查看表锁的情况: mysql> show status like 'table%'; +----------------------------+---------+ | Variable_name | Value | +----------------------------+---------+ | Table_locks_immediate | 100 | | Table_locks_waited | 11 | +----------------------------+---------+ # 查看InnoDB_row_lock状态变量来分析系统上的行锁的争夺情况: mysql> show status like 'InnoDB_row_lock%'; +-------------------------------+--------+ | Variable_name | Value | +-------------------------------+--------+ | Innodb_row_lock_current_waits | 0 | | Innodb_row_lock_time | 159372 | | Innodb_row_lock_time_avg | 39843 | | Innodb_row_lock_time_max | 51154 | | Innodb_row_lock_waits | 4 | +-------------------------------+--------+ 5 rows in set (0.
truncate truncate后面不能加where条件
truncate操作后直接生效
truncate操作后,数据库表会恢复至初始状态
truncate操作后直接重构表,不能回滚
delete delete后面可以有where条件
delete操作后需要提交事务才能生效
delete只删除数据,不会改变表空间大小
delete操作后可进行回滚
在 JMeter 中,查看 WebSocket 压测结果可以通过以下几种方式:
查看 Summary Report:
在压测运行完成后,选择 “View Results Tree”,然后选择 “Summary Report”,可以查看包括吞吐量、平均响应时间、最大响应时间等在内的概要结果。这些结果可以帮助你了解整体的性能情况。
查看 Aggregate Report:
选择 “View Results Tree”,然后选择 “Aggregate Report”,可以查看更详细的聚合报告。该报告将显示每个请求的详细统计数据,包括样本数、错误数、平均响应时间、最小和最大响应时间等。通过分析这些数据,可以更深入地了解各个请求的性能情况。
使用 Graphs 监视器:
JMeter 提供了多个内置的图表监视器,可用于实时监测压测过程中的指标,并绘制相应的图表。例如,可以使用 “Response Times Over Time” 监视器来查看响应时间的变化趋势,或使用 “Active Threads Over Time” 监视器来查看同时活动的线程数随时间的变化。
导出结果:
JMeter 允许将压测结果导出为文件,以便进行进一步的分析和处理。可以将结果导出为 CSV 格式或生成 HTML 报告。选择 “Save Table Data” 将结果保存为 CSV 文件,或者选择 “Save as HTML” 将结果保存为 HTML 报告。
以上方法可以帮助你查看 WebSocket 压测的结果。根据实际需求,你可以选择合适的方式来分析和解读结果,以评估性能并识别潜在的问题。同时,还可以根据需要添加其他的监听器和报告,以获取更全面的压测结果。
目录
1、变量
1.1命名规则
1.2变量类型
1.3特殊变量
1.4关键字
2、M文件的控制结构
2.1顺序结构
2.2 if-else-end分支结构
2.3switch-case结构
2.4try-catch结构
2.5循环结构
2.5.1 for循环
2.5.3 while循环
3.其他指令
3.1 return指令
3.2输入函数
3.2.1 input
3.2.2keyboard
3.2.3yesinput指令
3.3pause指令
3.4continue与break指令
3.4.1continue指令
3.4.2break指令
3.5error和warning指令
1、变量 1.1命名规则 在 MATLAB 中,变量不需要预先声明就可以进行赋值。变量的命名遵循以下规则: (1)变量名和函数名对字母的大小写敏感,因此 x 和 X 是两个不同的变量; (2)变量名必须以字母开头,其后可以是任意字母或下画线,但是不能有空格、中文或标点。 (3)不能使用MATLAB 的关键字作为变量名。避免使用函数名作为变量名。如果变量采用函数 名,则该函数失效,如设置变量名为“if”“end” 等。 (4)变量名最多可包含63 个字符,从第 64个字符开始之后的字符将被忽略。为了程序可读及维护 方便,变量名一般代表一定的含义。 1.2变量类型 ( 1 )局部变量。 MATLAB 中的每一个函数都有自己的局部变量,这些变量存储在该函数独立的工作区中,与其他函数的变量及主工作区中的变量分开存储。当该函数调用结束后,这些变量随之被删除,不会保存在内存中。 (2)全局变量。全局变量在定义该变量的全部工作区中有效。当在一个工作区内改变该变量的值时, 该变量在其余工作区内的值也将改变。 通常全局变量的变量名用大写字母来表示,并在函数体的开头位置进行定义,其格式如下: 使用全局变量的目的是减少数据传递的次数。然而,使用全局变量有一定的风险,容易造成错误,这种错误源自全局变量的工作原理。 (3)永久变量。永久变量用 persistent 声明,只能在 M 文件函数中定义和使用,只允许声明它的函数存取。当声明它的函数退出时,MATLAB 不会从内存中清除它。例如,声明 a 为永久变量 1.3特殊变量 MATLAB的特殊变量 变量名表示含义ans系统默认的用作保存运算结果的变量名pi圆周率eps机器零阀值,MATLAB中的最小值inf表示无穷大NaN或nan表示不定数i或j虚数nargin函数的输入参数个数nargout函数的输出参数个数realmin可用的最小正实数realmax可用的最大正实数bitmax可用的最大正整数(以双精度格式存储)varargin可变的函数输入参数个数varargout可变的函数输出参数个数beep使计算机发出“嘟嘟”声音 1.
今天早上开机启动redis,任意目录redis-server报错
重启电脑/杀死进程也无法解决,查阅资料最终解决,现将解决方法总结如下:
在redis根目录打开命令行窗口,输入命令redis-server.exe redis.windows.conf后,启动成功
难道任意目录启动,输入redis-server不对吗,之前一直是按照这个启动?欢迎指正!
Certbot免费证书生成 Certbot 是一个由 Let’s Encrypt 项目提供的免费、开源的证书颁发工具,用于自动获取和配置 SSL/TLS 证书。以下是使用 Certbot 生成免费证书的流程:
准备工作:
确保您拥有一个已经解析到您服务器的域名。确保您的服务器上安装了支持 Certbot 的操作系统(如 Ubuntu、Debian、CentOS 等)。 安装 Certbot:
对于 Ubuntu/Debian 系统,可以使用以下命令安装 Certbot:
sudo apt update sudo apt install certbot 对于 CentOS 系统,可以使用以下命令安装 Certbot:
sudo yum install certbot 生成证书:
运行以下命令以生成证书:
sudo certbot certonly --standalone -d example.com -d www.example.com 将 example.com 替换为您的域名。如果您还有其他子域名,也可以在命令中添加。
配置证书:
生成的证书文件将位于 /etc/letsencrypt/live/example.com/ 目录下(将 example.com 更换为您的域名)。您需要将生成的证书路径配置到您的 Web 服务器中,以启用 HTTPS 访问。具体配置步骤取决于您使用的 Web 服务器(如 Apache、Nginx)。 证书更新:
Let’s Encrypt 的证书有效期为 90 天,您需要定期更新证书以保持其有效性。Certbot 提供了自动更新证书的功能,可以使用以下命令进行设置:
MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle公司。MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放入一个大仓库内,这使得速度增快,灵活性增强。
一:MySQL主要特性 MySQL的存储原理主要涉及到存储引擎、索引、事务处理、锁定机制等方面。
1. 存储引擎
MySQL的最大特色之一是其插件式的存储引擎架构,这种架构可以让用户选择最适合自己需求的存储引擎。常见的MySQL存储引擎有MyISAM、InnoDB、Memory等。
- MyISAM:MyISAM是MySQL的默认存储引擎(直到MySQL 5.5版本)。MyISAM非常适合于:1) 需要高速读取的系统 2) 只做插入操作,而不需要修改或删除操作的系统。
- InnoDB:InnoDB是一个可以提供有提交、回滚和崩溃恢复能力的事务安全(ACID兼容)的存储引擎。但是在InnoDB中读取操作(不是改变数据的查询)也会产生副本。因此,InnoDB适合处理大量的数据。
- Memory:所有的数据都在内存中,数据的处理速度快,但是安全性不高。如果数据库重启,所有的数据都会消失。
2.索引
为了提高查询效率,MySQL提供了索引机制。MySQL提供了主键索引、唯一索引、全文索引等多种索引,并且支持多列索引。索引是在存储引擎层实现的,所以不同的存储引擎可能会有不同的索引类型和实现。
3.事务处理
事务是一系列的数据操作语句,事务是一个不可分割的工作单位,只有所有的操作都成功,事务才算成功。如果一个操作失败,那么这个事务就会回滚到事务开始前的状态。
4.锁定机制
MySQL中的锁定机制可以确保在并发环境下数据的一致性。锁定机制包括共享锁(读锁)和排他锁(写锁),InnoDB存储引擎还支持行级锁和表级锁。
二:MySQL的存储原理 Mysql的数据库存储原理主要有以下几点:
1. 数据存储在磁盘上。Mysql数据库系统将数据存储在磁盘文件中,这些文件又分为以下几类:
- 数据库目录文件(.frm文件):存储表结构信息。
- 数据文件(.MYD文件):存储表中的实际数据。
- 索引文件(.MYI文件):存储表的索引。
2. 数据以页为单位存储。Mysql数据库以页(Page)为单位将数据存储在数据文件中,默认的页大小是16KB。
3. 数据在磁盘上以表空间的形式组织。表空间是由一个或多个数据文件组成的逻辑存储单元,每个表空间存储一系列的表。
4. 每个存储引擎有自己的存储机制。不同的存储引擎有不同的数据存储和索引实现机制,如InnoDB使用聚集索引、MyISAM使用非聚集索引。
5. 使用缓冲池缓存经常访问的数据。缓冲池缓存磁盘上的数据页,使之留在内存中,提高访问速度。
6. 使用渐进式写入技术。Mysql不会立即将缓存中的脏页刷新到磁盘,而是按需周期性地刷新。
7. 使用检查点技术保证数据的完整性。检查点机制会在主数据文件更新时,同时更新日志文件或重做日志,以便在系统故障时使用日志恢复数据。
最后:下方这份完整的软件测试视频教程已经整理上传完成,需要的朋友们可以自行领取【保证100%免费】
软件测试面试文档 我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
C语言 分支与循环经典例题(致力于初学者的理解与巩固) 1.计算n的阶乘2.计算 1!+2!+3!+……+10!3.在一个有序数组中查找具体的某个数字n的下标。(二分查找)4.猜数字小游戏设计思路菜单game()的设计完整代码 1.计算n的阶乘 首先我们看到这个题目,从数学的角度分析
例如:5!=1×2×3×4×5=120
会出现1到5这5个顺序数字,故我们不可避免的想到循环
故
#include <stdio.h> int main() { //n的阶乘 int i, n; scanf("%d", &n); int ret = 1;//ret是阶乘的最终得数,因为1×任何数=任何数 for (i = 1; i <= n; i++) { ret = ret * i; } printf("%d的阶乘为:%d",n , ret); return 0; } 2.计算 1!+2!+3!+……+10! 拿下刚刚的开胃小菜后,再来看这题
是阶乘的相加
我们已经会算n的阶乘
那如何计算有顺序阶乘的相加呢
上题中的n是几就可以计算谁的阶乘
则我们可以在嵌套一个循环,n当循环变量
int main() { int i, n; int sum = 0; int ret = 1; for (n = 1; n <= 5; n++) { for (i = 1; i <= n; i++) { ret = ret * i; } sum = sum + ret;//for循环嵌套中要注意表达式的位置噢,万万不可搞错循环体 } printf("
🍀🍀近期,各类出色的人工智能技术及网站层出不穷,给大家带来了十分惊艳且便捷的学习和生活体验,小海带本期收集整理了一批当下热门主流的人工智能AI网站供大家学习参考。 整理不易,小伙伴们记得一键三连喔!!!🎈🎈🤞🤞 一、聊天AI 1.ChatGPT ChatGPT是OpenAI开发的一种基于语言模型的聊天人工智能系统。它是由大规模预训练的神经网络组成,可以理解和生成自然语言文本。ChatGPT是通过在海量的互联网文本数据上进行自监督学习而训练的。它可以用于回答问题、提供解释、生成对话等多种任务。用户可以向ChatGPT提出问题或提供上下文,然后它将生成相应的回复。 ChatGPT官网 2023年7月最新ChatGPT注册教程(国内可用,含接码手机号推荐) 2.文心一言 文心一言是百度打造出来的人工智能大语言模型,具备跨模态、跨语言的深度语义理解与生成能力,文心一言有五大能力,文学创作、商业文案创作、数理逻辑推算、中文理解、多模态生成,其在搜索问答、内容创作生成、智能办公等众多领域都有更广阔的想象空间。 文心一言——知识增强大语言模型 3.Anthropic Anthropic 是一家人工智能安全和研究公司,愿景是构建可靠的(Reliable)、可解释的( Interpretable)和可操控的(Steerable)AI 系统。Anthropic是一家由 OpenAI 前员工共同创立的 AI 初创公司,它已悄然开始测试一款名为 Claude 的新的类似于 ChatGPT 的 AI 助手。 AI research and products that put safety at the frontier 二、绘画AI 1.Midjourney Midjourney是一个由Midjourney研究实验室开发的人工智能程序,是2022年3月面世的AI绘画工具,创始人是David Holz。具体可实现以下功能: 人像卡通化:将人物照片转换成有趣的卡通形象。 轮廓生成:可以根据输入的文字描述生成对应的图像轮廓。 色彩生成:利用GAN模型,可以生成具有艺术感和创意的彩色图像。 视频换脸:可以实现对视频中人物的面部进行换脸操作。 视觉问答:通过图像识别和自然语言处理技术,可以实现对图像的问题回答。 人脸合成:可以将不同人物的面部特征进行合成,生成新的面孔。 Midjourney 2.Stable Diffusion Stable Diffusion是 Stability AI 公司开源的 AI 文生图扩散模型。它主要用于根据文本的描述产生详细图像,尽管它也可以应用于其他任务,如内补绘制、外补绘制,以及在提示词(英语)指导下产生图生图的翻译。 Stable Diffusion 3.文心一格 文心一格是基于文心大模型的文生图系统实现的产品化创新。2022年8月19日,中国图象图形大会CCIG 2022在成都召开,正式发布AI艺术和创意辅助平台——文心·一格,这是百度依托飞桨、文心大模型的技术创新推出的“AI作画”首款产品。 文心一格 📚🐱🏍持续更新中...... ✨✨>>>学习交流 | 温澜潮生 | 合作共赢 | 共同进步<<<✨✨ 📚📚>>>人工智能 | 计算机视觉 | 深度学习Tricks | 第一时间送达<<<📚📚
1.移动 短信发送cxll 到10086 然后截取短信内容去获取号码(目前有些号码是没有写在sim卡的信息里,所以只能这种方式去获取)
2.联通 (目前有些号码是没有写在sim卡的信息里,所以只能这种方式去获取)
SubscriptionManager.from(context).getActiveSubscriptionInfoList()里面的mNum
{id=3 iccId=89860122801168872054 simSlotIndex=1 carrierId=1436 displayName=中国联通 carrierName=中国联通 nameSource=3 iconTint=-13408298 number=+8618565627700 dataRoaming=0 iconBitmap=android.graphics.Bitmap@170243b mcc=460 mnc=01 countryIso=cn isEmbedded=false nativeAccessRules=null cardString=89860122801168872054 cardId=2 isOpportunistic=false groupUUID=null isGroupDisabled=false profileClass=-1 ehplmns=[46001] hplmns=[46001, 46009, 46001, 46009] subscriptionType=0 groupOwner=null carrierConfigAccessRules=null areUiccApplicationsEnabled=true}
3.电信
暂时没有找到方法去获取此类信息,短信等都没有暴露出本机号码
无感获取号码目前这些,当然非要当流氓,那么简单方法就是自己填号码加验证码
流氓无感就是将手机信息和卡信息等个人信息发短信过去,通过服务器接口读取来短信号码和个人信息进行绑定
默认拨号两个方法 使用Intent里自带的方法
Intent intent = new Intent(Intent.ACTION_CALL); Uri data = Uri.parse("tel:" + phoneNum); intent.setData(data); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.putExtra("com.android.phone.extra.slot", slotId);//slot值为0或1,分别代表卡1,卡2 startActivity(intent); 有系统权限的前提下,拨号前首先设置默认拨号SIM卡,通过反射的方式去执行
反射设置默认拨号sim卡方法:
private void setDefaultVoiceCallId(int slotId) { try { if(mLastUserSetCallDefault!
在本文中,我们将讨论如何在Spring Boot项目中集成权限管理。我们将使用Spring Security框架,这是一个专门用于实现安全性功能的框架,包括认证和授权。
一、Spring Security简介 Spring Security是Spring项目的一部分,专门为Java应用程序提供全面的安全服务。它可以帮助开发者实现各种安全需求,如身份验证、角色和权限管理、会话管理等。
Spring Security提供了一种强大的和可高度自定义的权限管理方式,开发者可以根据业务需求定制权限规则,实现精细化的权限控制。
二、Spring Boot中集成Spring Security Spring Boot为Spring Security提供了自动配置,只需要在项目中添加Spring Security依赖,即可自动启用基于表单的登录和HTTP Basic方式的安全验证。
为了在Spring Boot项目中使用Spring Security,首先需要在pom.xml文件中添加下面的依赖:
xml复制代码<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> 添加了这个依赖后,Spring Boot会自动配置Spring Security。默认情况下,所有的URL都需要被认证,并且会自动配置一个用户,用户名为"user",密码在应用启动时在控制台打印。
这只是最基本的配置,对于大多数应用来说,需要更加复杂的安全需求,比如基于角色的访问控制,这就需要自定义Spring Security的配置。
三、自定义Spring Security配置 要自定义Spring Security配置,需要创建一个配置类,该类需要继承WebSecurityConfigurerAdapter类,并覆盖其中的方法。例如,可以重写configure(HttpSecurity http)方法,自定义安全策略。
以下是一个基本的配置示例:
java复制代码@Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .antMatchers("/admin/**").hasRole("ADMIN") .anyRequest().authenticated() .and() .formLogin() .loginPage("/login") .permitAll() .and() .logout() .permitAll(); } } 在此配置中,我们定义了以下规则:
所有以"/admin/"开头的URL都要求用户拥有"ADMIN"角色。所有其他的URL都需要用户被认证。提供一个"/login"页面用于用户登录。允许所有用户访问登录和注销。 这只是一个基本的示例,Spring Security提供了更多的配置选项,可以满足各种复杂的安全需求。
四、用户认证和角色管理 在上面的示例中,我们定义了一些基于角色的访问控制规则,但是我们还没有说明如何进行用户认证和角色管理。这就需要我们自定义一个UserDetailsService接口的实现。
第一步:在页面创建一个文件夹,存放性能测试产生的数据。文件名jmeterresult 文件夹需要是空的。 第二步:在结果树中,文件名属性,填写刚刚创建的文件夹路径,后面加上一个result.csv 文件用来储存生成的数据。
第三步:点击tools 工具栏里面的 html_report 第四步:第一个参数:配置导出报告的数据来源。 第二个参数点击浏览,选择 jmeter.properties 即可 第三个参数填写报告输出的路径。
第五步点击:配置完毕,点击按钮 "Generate Report”
第六步:在输出的文件夹中点击 ,index.html即可 以下是操作图片展示:
本文主要分享什么是数据脱敏,如何优雅的在项目中运用一个注解实现数据脱敏,为项目进行赋能。希望能给你们带来帮助。
什么是数据脱敏 数据脱敏是一种通过去除或替换敏感数据中的部分信息,以保护数据隐私和安全的技术。其主要目的是确保数据仍然可以在各种场景中使用,同时保护敏感信息,防止数据泄露和滥用。数据脱敏通常用于处理包含个人身份信息和其他敏感信息的数据集,如手机号、姓名、地址、银行卡、身份证号、车牌号等等。
在数据脱敏过程中,通常会采用不同的算法和技术,以根据不同的需求和场景对数据进行处理。例如,对于身份证号码,可以使用掩码算法(masking)将前几位数字保留,其他位用“X”或"*"代替;对于姓名,可以使用伪造(pseudonymization)算法,将真实姓名替换成随机生成的假名。
下面我讲为大家带来数据脱敏掩码操作,让我们一起学起来吧。
开胃菜 下面给大家介绍的是使用两种不同的工具类进行数据脱敏,而我们今天的主题使用一个注解解决数据脱敏问题的主要两个工具类。来跟着我学习吧。
使用 Hutool 工具类实现数据掩码 比喻说我们现在要对手机号进行数据脱敏,前三后四不掩码,其他全部用 * 进行掩码
如下图代码所示,
我们定义了一个手机号:17677772345,需要进行数据脱敏。
调用的 Hutool 的信息脱敏工具类。
我们运行一下看看结果。一个简单的数据脱敏就实现了。
Hutool 信息脱敏工具类 根据上面的一个 Demo,大家可以看到我使用了 Hutool 的信息脱敏工具类进行对手机号掩码脱敏。那么让我们一起看看 Hutool 信息脱敏的工具类吧。
官网文档:
https://hutool.cn/docs/#/core/工具类/信息脱敏工具-DesensitizedUtil
看一下官网的介绍,支持多种脱敏数据类型,满足我们大部分需求,如果需要自定义还提供了自定义的方法实现。
下面是里面定义号的脱敏规则,直接调用就可以实现简单的数据脱敏,这里给大家介绍是因为我们今天要给大家带来的注解实现数据脱敏核心就是利用我们的 Hutool 提供的工具类实现,支持自定义隐藏。
使用 Jackson 进行数据序列化脱敏 首先创建一个实体类,此实体类只有一个测试的手机号。
注解的讲解:
@Data:lombok 的注解生成 get,set 等等方法。@JsonSerialize(using = TestJacksonSerialize.class):该注解的作用就是可自定义序列化,可以用在注解上,方法上,字段上,类上,运行时生效等等,根据提供的序列化类里面的重写方法实现自定义序列化。可以看下下面的源码,有兴趣的朋友可以去了解一下,也能解决我们日常开发中很多场景。 @Data public class TestDTO implements Serializable { /** * 手机号 */ @JsonSerialize(using = TestJacksonSerialize.class) private String phone; } 然后创建一个 TestJacksonSerialize 类实现自定义序列化。
此类主要继承 JsonSerializer,因为我们这里需要序列化的类型是 String 泛型就选择 String。注意如果你使用此注解作用在类上的话,这里就是你要序列化的类。
这里写目录标题 1.Flowable基础1.1 入门学习 2.流程图设计器2.1 FlowableUI2.2 绘制流程图 3.Flowable高级3.2 启动流程3.3 处理流程3.4 流程结束3.5 任务分配3.5.1 表达式分配3.5.2 监听器分配 3.6 流程变量3.6.1 实例关系3.6.2 出差流程图3.6.3 案例 3.7 候选人3.7.1 流程定义和部署3.7.2 候选任务查询3.7.3 拾取、归还、交接等操作 3.8 候选人组3.8.1 将用户分配给对应的组3.8.2 部署和运行3.8.3 任务查询拾取处理 3.9 网关3.9.1 排他网关3.9.2 并行网关3.9.3 包容网关3.9.4 1.Flowable基础 官方手册
1.1 入门学习 一、依赖
<dependencies> <dependency> <groupId>org.flowable</groupId> <artifactId>flowable-engine</artifactId> <version>6.3.0</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.21</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13.2</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.21</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.21</version> </dependency> </dependencies> 二、demo
@Test public void testProcessEngine() { // 获取config对象 ProcessEngineConfiguration config = new StandaloneProcessEngineConfiguration(); // 设置数据库连接 config.
最新的Ogre13.x使用OgreBites::ApplicationContextQt 整合Qt5,不过他的example很少,例子都在他的实现代码中而且现在的Ogre版本都是推QWindow而不是QWidget,因为Qt5以后实现比Qt4差别很大,其实他的例子也是得到QWindow的windows 句柄,由于Ogre是在DX和OpenGL之上做了一层,有很多自己设计的脚本和材质,文档很少比较折腾,包装层次多需要摸索,一些图形行业业务功能性能要求高点的要对代码摸索的比较多才能深度改,这都增加了不少难度但是不错的3D学习资料,国内比起OSG生态来说相对较弱。
下面的例子作为笔记备份,Qt是Qt5.14.2,Ogre13.6.5 官方的MSVCSDK ,VC2019下面vc2017也就是v141 toolset,需要先系统环境变量配置 OGRE_CONFIG_DIR,即sdk解压后bin那个完整路径,bin里面有plugins.cfg放的有一些插件,一般开始运行会弹出一个配置对话框,去选Dx还是OpenGL,全屏还是非全屏,初始窗口尺寸等,然后确定,就会生成一个Ogre.cfg现在的Ogre13.x不知道怎么回事生成的ogre.cfg在c盘的用户哪个犄角嗄啦目录下,我是看代码发现它写在那的,再次他会去读这个Ogre.cfg其实也能代码去设置。
下面的demo是创建了个QWindow然后作为Ogre的ApplicationContextQt的渲染窗口,调setup中的创建sceneManager,light,camera,然后设置为QMainWindow的centerWidget的,然后主要是创建了一个Ortho的camera,在resize时候调整,用ManualObject绘制点线或者三角形。
QtWidgetTest.h
#pragma once #include <QtWidgets/QMainWindow> #include "ui_QtWidgetTest.h" class QtWidgetTest : public QMainWindow { Q_OBJECT public: QtWidgetTest(QWidget *parent = Q_NULLPTR); private: Ui::QtWidgetTestClass ui; }; QtWidgetTest.cpp
#include "QtWidgetTest.h" #include <QKeyEvent> #include <QtGui/QWindow> #include "OgreApplicationContextQt.h" #include "Ogre.h" #include "OgreInput.h" #include "OgreRTShaderSystem.h" #include "OgreCamera.h" #include <iostream> using namespace Ogre; using namespace OgreBites; class MyAppQt : public OgreBites::ApplicationContextQt, public OgreBites::InputListener { public: Camera* cam; MyAppQt() {} virtual void windowResized(Ogre::RenderWindow* win) { OgreBites::ApplicationContextQt::windowResized(win); Ogre::Real hw = win->getWidth() * 0.
MYSQL数据库-数据库的学习 MYSQL数据库一、数据库的基本概念二、常见的数据库三、MySQL数据库四、SQL操作五、SQL高级操作六、SQL函数(SQL 拥有很多可用于计数和计算的内建函数) MYSQL数据库 一、数据库的基本概念 1、数据库的英文单词:DataBase 简称 : DB
2、什么数据库?
用于存储和管理数据的仓库. 3、数据库的特点
持久化存储数据的.其实数据库就是要给文件系统方便存储和管理数据使用了统一的方式操作数据库 – SQL 二、常见的数据库 1、关系型数据库:MySQL(免费)、Orcale(收费)、SQL Server(免费)
2、非关系型数据库:Redis、MongBD、Hbase、CouhDB 等
三、MySQL数据库 1、创建数据库
-- 创建数据库 CREATE DATABASE daidai; 2、删除数据库
-- 删除数据库 DROP DATABASE daidai; 3、创建表
-- 创建表 CREATE TABLE IF NOT EXISTS `runoob_tbl`( `runoob_id` INT AUTO_INCREMENT, `runoob_title` VARCHAR(100) NOT NULL, `runoob_author` VARCHAR(40) NOT NULL, `submission_date` DATE, PRIMARY KEY ( `runoob_id` ) )ENGINE=InnoDB DEFAULT CHARSET=utf8; -- 如果你不想字段为 NULL 可以设置字段的属性为 NOT NULL, 在操作数据库时如果输入该字段的数据为NULL ,就会报错。 -- AUTO_INCREMENT定义列为自增的属性,一般用于主键,数值会自动加1。 -- PRIMARY KEY关键字用于定义列为主键。 您可以使用多列来定义主键,列间以逗号分隔。 -- ENGINE 设置存储引擎,CHARSET 设置编码。 4、删除表
Keep Streams是一款功能强大的在线视频下载工具,它能够帮助用户从各种视频分享网站上下载视频并保存到本地。KeepStreams 提供了简洁易用的界面和丰富的功能,让用户能够轻松快捷地下载自己喜欢的视频。首先,KeepStreams 支持下载的视频网站非常广泛,包括知名的视频分享网站如YouTube、TikTok、Instagram、Facebook、Twitter 等等。不仅如此,它还支持国内外各大视频平台,如爱奇艺、腾讯视频、优酷、芒果TV等等。无论是国内还是国外的视频,KeepStreams 都能轻松应对,让用户畅快地下载自己喜欢的视频内容。
软件特点 其次,KeepStreams 具备多种下载模式,用户可以根据自己的需求选择不同的下载方式。首先,KeepStreams 提供了批量下载功能,用户可以将多个视频链接一次性粘贴到软件中,然后一键下载,省去了一个个链接逐个下载的麻烦。其次,KeepStreams 还支持选择下载视频的质量,用户可以根据自己的网络条件和存储空间选择高清、标清等不同的分辨率,满足不同需求。此外,KeepStreams 还提供了音频提取功能,用户可以将视频中的音频提取出来保存为音频文件,方便在其他设备上播放。
除了以上功能,KeepStreams 还拥有一些实用的辅助工具,让用户能够更好地管理和组织下载的视频。首先,KeepStreams 提供了视频格式转换功能,用户可以将下载的视频文件转换为其他格式,以适应不同的播放设备。其次,KeepStreams 还支持视频剪辑功能,用户可以对下载的视频进行剪辑,裁剪出自己想要的片段,并保存为新的视频文件。此外,KeepStreams 还提供了视频管理功能,用户可以对下载的视频进行分类、重命名、添加标签等操作,方便用户整理和管理视频资源。
下载地址:https://soft.macxf.com/soft/3643.html?id=MzE5MTM%3D
引言:在现代办公环境中,数据处理和报表生成是一项重要的任务。然而,手动处理大量数据和生成报表是一项繁琐且容易出错的工作。幸运的是,Python提供了强大的工具和库,可以帮助我们实现办公自动化,从而提高工作效率和准确性。本文将高效介绍如何使用Python进行数据可视化和报表生成,让您的办公工作更加顺利。
一、数据可视化 数据可视化是将数据以图表、图形或其他可视化形式展示的过程。通过数据可视化,我们可以更敏锐地理解数据的特征和趋势,从而做出更明智的决策。Python提供了多种强大的库,如Matplotlib和Seaborn,可以帮助我们实现数据可视化。
Matplotlib Matplotlib是一个功能强大的绘图库,可以提供不同类型的图表,如折线图、柱状图、散点图等。以下是一个简单的例子,展示了如何使用Matplotlib不同折线图: import matplotlib.pyplot as plt # 数据 x = [1, 2, 3, 4, 5] y = [10, 8, 6, 4, 2] # 绘制折线图 plt.plot(x, y) # 添加标题和标签 plt.title('折线图示例') plt.xlabel('X轴') plt.ylabel('Y轴') # 显示图表 plt.show() Seaborn Seaborn是一个基于Matplotlib的数据可视化库,提供了更高级的统计图表和美观的默认样式。以下是一个简单的例子,展示了如何使用Seaborn的异构柱状图: import seaborn as sns # 数据 x = ['A', 'B', 'C', 'D'] y = [10, 8, 6, 4] # 绘制柱状图 sns.barplot(x, y) # 添加标题和标签 plt.title('柱状图示例') plt.xlabel('X轴') plt.ylabel('Y轴') # 显示图表 plt.show() 二、报表生成 报表生成是一个数据整理并以格式化的形式呈现的过程。Python也提供了很多库,如Pandas和Openpyxl,可以帮助我们处理和生成报表。
Microsoft Remote Desktop For Mac在Mac上远程Windows桌面 Microsoft Remote Desktop For Mac下载链接发牢骚版本说明(所有下载均为beta版)下载网站截图 Microsoft Remote Desktop For Mac 使用一些网络远程软件,例如向日*、TOdes*、TV等等,都需要两端(客户端、服务端)安装,而windows的mstsc是不需要安装的,只需要客户端有就可以了。但是Mac OS没有mstsc客户端,找了好久才找到,最主要是免费(穷)!
下载链接 老规矩,废话不多说,先上链接。
Microsoft Remote Desktop For Mac(下载链接)
https://install.appcenter.ms/orgs/rdmacios-k2vy/apps/microsoft-remote-desktop-for-mac/distribution_groups/all-users-of-microsoft-remote-desktop-for-mac
发牢骚 但在Mac OS系统中,没有mstsc客户端,APP store中有好多花钱的这种客户端(好贵),微软自己出了一款用于Mac OS的mstsc客户端,也就是Microsoft-Remote-Desktop-For-Mac,但是不知道为什么 Mac OS的apple store 不给下载,忍不住骂娘,然后国内的好多Mac OS软件网站下载这个还需要积分、花钱之类的,忍不住又要骂娘!一气之下(主要是穷),我找了好久才找到这个客户端的下载地址。所以各位就自己到官方的APP站点下载,然后安装(我感觉安装不用给各位出教程了,都已经是要用这个APP了,肯定对于安装软件门清了,实在不行,自己再百度搜一下安装教程就行了)。
版本说明(所有下载均为beta版) 因为正式版客户端找不到,只能找到测试版(beta版本),反正都是一样用,我用了好久都没发现有什么BUG出现。就算出现BUG,也无非就是重新连接一次,没什么大不了的事情。
下载网站截图