前言 最近遇到一个问题,在我系统(版本:ubuntu20)更新后,在电脑上安装的向日葵(版本:sunloginclient-11.0.0.36662-amd64.deb)无法使用远程控制显示桌面了,只能进行远程文件。因为有些工作需要远程办公,所以无法使用的还是很影响的。
所以开始检查,最后发现这个问题出现的原因是向日葵不支持Ubuntu的原始桌面显示管理器GDM,需要更换掉原始桌面显示管理器,换上LightDM,然后就可以了。
那么为什么换上LightDM就可以了呢,以及LightDM到底是什么呢?所以也做一个简单的小分享,希望能帮到大家。
首先从向日葵官方人员那里获得信息,因为这个版本向日葵开发时候使用LightDM,所以建议把电脑显示管理器也换成LightDM,具体原因没有过多分享了。
LightDM介绍 我们经常可以听感到LightDM, GDM, GNOME, KDE这些桌面系统,那么它们的区别与联系是什么呢?
桌面环境可能仅仅是一个简单的窗口管理器, 也可能是一个像 KDE 或者 GNOME这样的完整桌面应用程序套件。
首先,显示管理器(display manager)或登录管理器是一个在启动最后显示的图形界面,即登录界面(显示管理器),是进到桌面环境之前的用户登录界面。
如果使用桌面环境,应该使用对应的显示管理器
XDM: X 显示管理器 (xorg-xdm)
GDM: GNOME 显示管理器 (gdm)
KDM: KDE 显示管理器 (kdebase-workspace)
SLiM: 简单登录管理器 (slim)
Warning: slim登录管理器已经停止开发,不推荐使用
LXDM: LXDE 显示管理器 (独立于桌面环境) (lxdm)
Qingy: getty 使用 DirectFB 的替代者 (qingy)
wdm: WINGs 显示管理器 (wdm)
CDM: 控制台显示管理器 (available in the AUR: cdm-git)
LightDM: Ubuntu 开发的 GDM 替代品,使用 WebKit (位于AUR: lightdm, lightdm-bzr)
这部分内容内容大家也可以去这位老兄的文章进行查看详细内容:传送门
以下介绍中出现重量级和轻量级,其中重量级与轻量级的区别是,重量级消耗更多的资源。轻量级的桌面需要较少的资源,所以可以运行在大多数的硬件上,同样,包括任务栏、菜单、图标。
现代重量级的桌面环境Unity、Gnome,传统的重量级桌面环境 Cinnamon、KDE、Zorin Desktop,传统的轻量级桌面环境MATE、XFCE、LXDE。
将py文件打包成exe可执行文件并防止反编译 将脚本编译为pyd以防止反编译将py打包成exe打包报错 将脚本编译为pyd以防止反编译 将模块py文件编译为动态链接库,这样破解难度将大大增加。其中,在python里,pyd格式即动态链接库。使用cython即可编译。
pip install Cython 我们在py所在的文件夹新建py文件,在此处我命名为build_pyd.py,其内容如下:
# -*- coding: utf-8 -*- """ Created on Wed Aug 29 13:33:20 2018 @author: Li Zeng hai """ from distutils.core import setup from Cython.Build import cythonize setup( name = 'any words.....', ext_modules = cythonize(["demo.py",] ), ) 然后执行以下cmd命令:
python build_pyd.py build_ext --inplace 将生成的pyd文件重命名为你的py文件名字如:demo.cp35-win_amd64.pyd重命名为demo.py。
注:当同时存在demo.pyd和demo.py时,引入优先级是pyd>py,所以不用移除py文件,默认引入时就是pyd。
将py打包成exe 下载安装PyInstaller
pip install pyinstaller 常用参数:
–icon=图标路径
-F 打包成一个exe文件
-w 使用窗口,无控制台
-c 使用控制台,无窗口
-D 创建一个目录,里面包含exe以及其他一些依赖性文件
pyinstaller -h 来查看参数
Ubuntu18虚拟机网络连接不上 ubuntu 右上角网络图标不见的解决方法
解决VMware虚拟机Ubuntu 18.04无法上网问题
试过以上方法之后每次打开电脑就连接不上网络,问题就出在Windows服务中的VMware DHCP service和VMware network service没有打开!
group_vars和host_vars都用于存放变量,group_vars用于存放group相关的变量,而host_vars用于存放host相关的变量。
对于不同的ansible命令行,对于这两个folder的查找路径是不一样的。
如果是ansible-playbook命令,他会去当前playbook所在文件的同级目录下去查找这两个文件夹
如果是ansible和ansible-console命令行,则会去当前playbook所在文件统计目录下的inventory文件夹下去查找这两个文件夹。
Spring Boot+Vue 前后端分离项目架构 项目流程:
1. SpringBoot 后端项目 1、新建一个 SpringBoot 工程,并添加项目开发过程中需要的相关依赖;
2、数据库新建 book 数据表;
-- ---------------------------- -- Table structure for book -- ---------------------------- DROP TABLE IF EXISTS `book`; CREATE TABLE `book` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `title` varchar(55) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, `publish` varchar(55) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, `authors` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, `createTime` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0), `updateTime` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) ON UPDATE CURRENT_TIMESTAMP(0), PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 14 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; -- ---------------------------- -- Records of book -- ---------------------------- INSERT INTO `book` VALUES (2, '数据结构', '浙江出版社', '严威', '2022-03-18 14:38:22', '2022-03-18 14:38:25'); INSERT INTO `book` VALUES (5, '计算机组成原理', '机械工业出版社', '唐朔飞', '2022-03-14 14:38:28', '2022-03-15 14:38:36'); INSERT INTO `book` VALUES (6, '机器学习', '人民邮电出版社', '周志华', '2022-03-16 14:38:41', '2022-03-16 14:38:45'); INSERT INTO `book` VALUES (7, '图论及其应用', '科学技术出版社', '徐俊明', '2022-03-03 14:38:49', '2022-03-18 18:33:57'); INSERT INTO `book` VALUES (8, '推荐系统开发实战', '电子工业出版社', '高团阳', '2022-03-14 14:38:57', '2022-03-16 14:39:02'); INSERT INTO `book` VALUES (9, '大数据导论', '机械工业出版社', '曾诚', '2022-03-10 14:39:06', '2022-03-12 14:39:09'); INSERT INTO `book` VALUES (13, 'Java从零基础到实战', '中国工信出版集团', '宁楠', '2022-03-18 17:05:18', '2022-03-18 17:05:18'); 3、application.
Stu.java
private String name; private int age; private String sex; public Stu(String name, int age, String sex) { this.name = name; this.age = age; this.sex = sex; } public Stu() { } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getSex() { return sex; } public void setSex(String sex) { this.
文章目录 前言一、Uart串口通信二、串口异步通信实现1.程序框图2.波特率设置模块3.串口发送控制模块4.串口发送控制模块 三、结果1、仿真结果2、板级调试结果 设计文件与仿真文件 前言 (完整代码在文末,包括仿真文件与设计文件,通过仿真与板级验证)本文利用verilog语言实现uart串口异步通信,FPGA接收串口发来的数据,并将接收到的数据通过tx端发送到PC端,在PC端串口打印显示数据
开发板:SF-AT7
软件平台:Vivado 2016.2
一、Uart串口通信 uart串口通信是一种异步串行全双工通信方式,tx端用于数据发送,rx端用于数据接收。信号线空闲时为高电平。由于是异步通信方式,数据发送会包装成数据帧的形式发送,帧格式为:1个起始位(0)、8个数据位(用户数据)、1个奇偶校验位(用于简单的纠错以保证传输的可靠性)、1和2个停止位(1),其中奇偶校验位不是必须的。下图为帧格式结构。
那么该如何检测到数据发送呢?可以注意到数据帧格式中第一个bit是低电平,当FPGA的rx端检测到信号线上有下降沿产生时,表示有数据传送过来,根据预先设置好的波特率对数据接收接收,由于数据是串行从低位到高位传输,接收到的数据暂时存储在寄存器中,待接收完1字节的数据,通过串并转换保存接收到的数据。发送时通过tx信号线按照设置好的波特率将数据发送出去,数据发送仍然要按照数据帧格式发送,即先发送1bit的低电平,再从低位到高位发送数据。 二、串口异步通信实现 1.程序框图 FPGA实时检测uart_rx信号是否有数据,若接收到数据,你把接收到的数据通过uart_tx发送给PC端。
我们知道串口数据传输在设置的波特率下进行,因此需要有专门的波特率产生单元,且发送与接收分别对应一个波特率产生单元,将波特率设置包装成一个模块,分别在发送与接收端例化该模块即可,这是两个独立的硬件资源,属于逻辑复制,而并非资源共享。
整个程序具体实现过程就是有一个顶层模块,在顶层模块中例化波特率设置模块、串口发送与接收处理模块。
speed_setting u2_speed_rx( .clk(clk_25m), //波特率选择模块 .rst_n(sys_rst_n), .bps_start(bps_start1), .clk_bps(clk_bps1) ); //UART接收数据处理 my_uart_rx_q u3_my_uart_rx( .clk(clk_25m), //接收数据模块 .rst_n(sys_rst_n), .uart_rx(uart_rx), .rx_data(rx_data), .rx_int(rx_int), .clk_bps(clk_bps1), .bps_start(bps_start1) ); //------------------------------------- //UART发送信号波特率设置 speed_setting u4_speed_tx( .clk(clk_25m), //波特率选择模块 .rst_n(sys_rst_n), .bps_start(bps_start2), .clk_bps(clk_bps2) ); //UART发送数据处理 my_uart_tx_q u5_my_uart_tx( .clk(clk_25m), //发送数据模块 .rst_n(sys_rst_n), .rx_data(rx_data), .rx_int(rx_int), .uart_tx(uart_tx), .clk_bps(clk_bps2), .bps_start(bps_start2) ); 2.波特率设置模块 前面说过波特率设置本质是一个计数器,常用的波特率如9600、115200等是指1s內传输数据的个数,1/9600就是一个周期所对应的时长。以25MHz为例,一个周期是40ns ,那么计数周期就是:1/9600/40ns*1000000000(注意单位统一),设置一个计数器,当计数次数达到9600bps时,标志位有一个周期的高脉冲信号,该标志位信号用来控制tx端传送数据位的切换或者rx端接收数据位的切换。根据上面的分析结果,利用verilog语言编程实现,可以用一个always块来实现计数器,另一个always块实现标志位置位。为了保证数据采集更加准备,我们选择在数据传送中间采样,即计数器记到9600一半的时候进行数据采样。针对接收端,uart端口rx端接收到数据总线的信号。总线上数据都是以字节的形式传输,而uart通信协议中规定数据是串行接收的,因此接收时要进行串并转换,串并转换的速率由波特率决定。接收到信号后波特率设置模块开始计数,定时产生维持一个周期高电平的采样信号。
代码如下: module speed_setting( input clk, input rst_n, input bps_start, output clk_bps ); `define BPS_9600 `define CLK_PERIORD 40 //定义时钟周期为40ns(25MHz) `define BPS_SET 9600 //定义通信波特率为9600bps(将需要的波特率省去两个零后定义即可) `define BPS_PARA (1_000_000_000/`CLK_PERIORD/`BPS_SET)//10_000_000/`CLK_PERIORD/96; //波特率为9600时的分频计数值 `define BPS_PARA_2 (`BPS_PARA/2)//BPS_PARA/2; //波特率为9600时的分频计数值的一半,用于数据采样 reg[12:0] cnt; //分频计数 reg clk_bps_r; //波特率时钟寄存器 //---------------------------------------------------------- reg[2:0] uart_ctrl; // uart波特率选择寄存器 //计数器计数 always@(posedge clk or negedge rst_n)begin if(!
1. 软件下载地址:
https://gitforwindows.org/
https://code.visualstudio.com/
2. git用到的命令:
克隆仓库:git clone <git地址>
初始化仓库:git init
添加文件到暂存区:git add -A
把暂存区的文件提交到仓库:git commit -m "提交信息"
查看提交的历史记录:git log --stat
工作区回滚:git checkout <filename>
撤销最后一次提交:git reset HEAD^1
以当前分支为基础新建分支:git checkout -b <branchname>
列举所有的分支:git branch
单纯地切换到某个分支:git checkout <branchname>
删掉特定的分支:git branch -D <branchname>
合并分支:git merge <branchname>
3. 推送到GitHub
推送当前分支最新的提交到远程:git push
拉取远程分支最新的提交到本地:git pull
vscode图形操作插件Gitlens
1.VMware Workstation Pro 16 虚拟机安装步骤https://blog.csdn.net/qq_63862801/article/details/123689776?spm=1001.2014.3001.5501
虚拟机的安装方法和真实的有几点不一样的地方。 2. 创建新的虚拟机。
3.选择 典型 安装 。 4.选择 稍后安装操作系统 。 5.选择 Linux 。
6.更改虚拟机名称和文件存放位置 。
7.根据需求更改磁盘的大小。 8. 完成 。
9.选择编辑虚拟机设置 。
10.选择自己需要安装的镜像 ,确定 。
11.开启此虚拟机 。 12.开机后,选择第一项 。
13.选择 SKip 回车 。
14. OK 回车 。
15.选择 Next 回车 。
16.选择 中文(简体), Next 。
17.选择 美国英语式 , 下一步 。
18.选择 基本储存设备 。
19. 点击 是,忽略所有数据 。
20.下一步 。
21.默认 亚洲/上海 , 下一步 。
21.设置root 密码 。
资源限制
时间限制:1.0s 内存限制:256.0MB
问题描述
在一个n*n的棋盘中,每个格子中至多放置一个车,且要保证任何两个车都不能相互攻击,有多少中放法(车与车之间是没有差别的)
输入格式
包含一个正整数n
输出格式
一个整数,表示放置车的方法数
样例输入
2
样例输出
7
数据规模和约定
n<=8
【样例解释】一个车都不放为1种,放置一个车有4种,放置2个车有2种。
#include<iostream> using namespace std; int N; int ans=1; //刚开始什么也不放也属于一种答案 bool visited[10]; //标志被放置的列 void dfs(int step) //表示从第step行开始放 { if(step>N) return ; //如果超过规定的棋盘边界N,跳出。 for(int i=1;i<=N;i++) if(!visited[i]) //如果这一列没有被放置 { visited[i]=true; //在这个位置放置它 ans++; dfs(step+1); //不能在同一行放了,跳到下一行 visited[i]=false; //回溯 } dfs(step+1); //不一定从第step行开始放(即第step行没有也可以),从step+1行开始放也可以 } int main() { cin>>N; dfs(1);//从第一行开始搜 cout<<ans; return 0; }
为什么需要数据类型转换? 将不同数据类型的数据拼接在一起
name='张三' age=20 print(type(name),type(age))#说明name与age的数据类型不相同 print('我叫'+name+'今年,'+str(age)+'岁')#将int类型通过str()函数转成了str类型 #结果 <class 'str'> <class 'int'> 我叫张三今年,20岁 name='张三' age=20 print(type(name),type(age))#说明name与age的数据类型不相同 print('我叫'+name+'今年,'+age+'岁')#当将str与int类型进行连接时,报错,解决方案,类型转换 #结果 print('我叫'+name+'今年,'+age+'岁')#当将str与int类型进行连接时,报错,解决方案,类型转换 TypeError: can only concatenate str (not "int") to str 16.类型转换_float()函数 数据类型转换 为什么需要数据类型转换?
讲不同数据类型的数据拼接在一起
s1='13.14' s2='52' l1=True s3='hello' i=100 print(type(s1),type(s2),type(l1),type(s3),type(i)) print(float(s1),type(float(s1))) print(float(s2),type(float(s2))) print(float(l1),type(float(l1))) #print(float(s3),type(float(s3))) #字符串中的数据如果是非数字串,则不允许转换 print(float(i),type(float(i))) #结果 <class 'str'> <class 'str'> <class 'bool'> <class 'str'> <class 'int'> 13.14 <class 'float'> 52.0 <class 'float'> 1.0 <class 'float'> 100.0 <class 'float'> 函数名str() 作用:将其他数据类型转换成字符串 注意:也可用引号转换
malab中simulink出现Size mismatch (size [1 x 3] ~= size [1 x 1]). 先上截图 这个报错可坑了,浪费我两天时间
解决方案 不知道哪个地方用了A1-6导致类型一直错误,但是经过单独运行时没错的,把变量换成别的就好了贼坑啊 ,记录下,顺便说下,我这是在matlab fun中弄得,这报错太坑了,我回去找这个A1死活没找到,真是狗啊
1、一直以为云服务器很难,那是Linux服务器,Windows和电脑操作99%相似。话说为什么用Linux,省资源,无奈咱有钞能力,不差这点资源,上Windows真香。
2、买一个服务器,选Windows比较新的系统,最近有优惠,白送。。最好配置2核CPU,2G内存以上。
3、购买了以后,等几分钟启动。
4、设置服务器密码,重启,进入控制台,找到服务器的公网IP。
5、在自己的电脑上,WIN+R,输入mstsc。
6、输入公网IP地址、服务器密码、服务器用户名administrator
7、噔噔蹬蹬,熟悉的界面
8、复制粘贴python安装程序安装和.py程序到云服务器。
9、服务器wim+R,输入cmd。
10、pip install XXX把python需要的库装进去。
11、任务计划程序,设置每天几点钟启动.py程序。
OK拥有了一台24小时干活的电脑。
最近工作中希望能实现 CI / CD,于是让我做个探索。从网上找了一堆资料,发现 Jenkins 不错。但经同公司不同部门同事建议,Gitlab runner 更简单直接。于是,就在其文档和相关博文的指导下搞了个基于 Gitlab runner 的 CI 工程。该文并非指导性博文,只是对配置 CI 工程过程中的若干琐碎问题的一个整理,因网上的相关教程,并未提及这些不太容易解决的问题。
文章目录 GitLab-Runner 的安装backspace 键在 linux 某些状态下不能使用yaml invalid / jobs config should contain at least one visible job在 shell 命令中输入用户名和密码等git clone 没有权限邮件通知gitlab-runner 没权限,或者 sudo: no tty present and askpass program specifiedsudo: no valid sudoers source found, quitting GitLab-Runner 的安装 如果只参考官网的 GitLab Runner 安装文档,则有很大可能会陷入一个 curl 无法执行的 bug 中,bug 描述建议确认 curl 的安装是否正确。此外,官网的这种安装方法也比较繁琐,不够快捷。
实际上,在 Ubuntu 上,apt-get install 命令就能够正常安装 GitLab-Runner,具体命令是:
1.1 概述 引入线程池的原因
1、减少开销提升效率
减少线程的创建和销毁所花的时间以及系统资源的开销;
同时,提高系统响应速度,当有新任务到达时,通过复用已存在的线程,无需等待新线程的创建便可立即执行。
2、提高线程的可管理性
方便管控线程并发数量。线程无限制的创建,可能会导致内存占用过多,从而产生OOM,并且会造成CPU过度切换,CPU切换线程是有时间成本的:需要保持当前执行线程的现场,并恢复要执行线程的现场。
对线程进行统一的分配、调优和监控,从而也提高响应速度;提供更强大的功能,延时定时线程池。
ExecutorService(ThreadPoolExecutor的顶层接口)使用线程池中的线程执行每个提交的任务,通常我们使用Executors的工厂方法来创建ExecutorService。
Executors类的底层实现便是ThreadPoolExecutor! Executors 工厂方法有:
Executors.newCachedThreadPool():无界线程池,可以进行自动线程回收
Executors.newFixedThreadPool(int):固定大小线程池
Executors.newSingleThreadExecutor():单个后台线程
它们均为大多数使用场景预定义了设置。不过在阿里java开发规范文档中说明,尽量不要用该类创建线程池。
1.2 ThreadPoolExecutor类讲解 1.2.1 线程池状态: 五种状态:
线程池的状态说明RUNNING允许提交并处理任务SHUTDOWN不允许提交新的任务,但是会处理完已提交的任务STOP不允许提交新的任务,也不会处理阻塞队列中未执行的任务,并设置正在执行的线程的中断标志位TIDYING所有任务执行完毕,池中工作的线程数为0,等待执行terminated()勾子方法TERMINATEDterminated()勾子方法执行完毕 线程池的shutdown() 方法,将线程池由 RUNNING(运行状态)转换为 SHUTDOWN状态线程池的shutdownNow()方法,将线程池由RUNNING 或 SHUTDOWN 状态转换为 STOP 状态。 注:SHUTDOWN 状态 和 STOP 状态 先会转变为 TIDYING 状态,最终都会变为 TERMINATED
1.2.2 ThreadPoolExecutor构造函数 ThreadPoolExecutor继承自AbstractExecutorService,而AbstractExecutorService实现了ExecutorService接口。
public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler) { if (corePoolSize < 0 || maximumPoolSize <= 0 || maximumPoolSize < corePoolSize || keepAliveTime < 0) throw new IllegalArgumentException(); if (workQueue == null || threadFactory == null || handler == null) throw new NullPointerException(); this.
Oracle各种连接和连接配置 1.Oracle自带SQL plus工具的使用2.Navicat连接Oracle3.SQL Developer连接Oracle4.Oracle表空间4.1永久表空间4.2临时表空间 5.SQL Developer创建用户与连接6.SQL Developer权限说明 1.Oracle自带SQL plus工具的使用 前面提到,安装程序的时候选择是桌面类,因此自带了一些管理软件,比如自带了Oracle数据库的数据库管理工具:SQL plus,使用方式,直接打开在windows菜单找到SQL plus就行:
使用方法和mongoDB、mysql等数据库一致(说白了就是用黑窗口管理):
说明:这里具有密码拦截,密码默认为装环境的时候使用的密码。
使用举例如下:
select * from all_users;//查询所有数据库用户 及如果如下:
内部展示还是比较乱的,不采用表格形式。
需要补充说明的是,对于sys类型的用户,连接的时候需要指定具体的数据库管理员类别:
2.Navicat连接Oracle Navicat能够连接很多种数据库,能够便于我们管理很多个不同种类的数据库。连接方式如下:
说明:这里使用的连接方式还是有一定缺陷的,比如使用sys as sysdba的方式连不上去。端口使用的是1521(默认端口),而且里面的可视化功能体现的不够充分,但是至少可视化能力比SQL plus更强:
3.SQL Developer连接Oracle 下载SQL Developer,下载的时候可能会提示导入首选项,如果之前没有使用过,直接点击否可以继续安装,安装完成时候界面如下:
简单来说,界面不太美观,但是感觉对于Oracle这款数据库来说还是相对比较专业的。使用起来比较简单:
简单看一下,从左侧功能列表来看,功能还是比较全面的:
说Navicat连接Oracle的功能不全面,主要是因为Navicat里面只包含数据库对应的数据表,内部缺少创建用户等诸多管理功能,当然这个是建立在SQL指令不够熟悉的情况下:
SQL查询的简单使用:
4.Oracle表空间 经过前面的分析,可以知道SQL Developer还是比较好用的,除了界面UI有待美化外,功能还是比较强大的,有点像SQLServer。接下来言归正传,说一下Oracle的表空间概念。
4.1永久表空间 表空间其实是对数据库在逻辑层上面的一种划分(可以理解成对内存的分块)。一个表空间对应一个数据库。所有的数据库对象都存在指定的表空间里面,由于数据库对象里面主要存储的还是表,因此又被称为表空间。
4.2临时表空间 Oracle的临时表空间主要用来做查询和存放数据缓冲区,这些缓冲区一般用来进行查询结果的排序操作。重启数据库能够释放这些临时表空间。
最后给出一个表空间的创建方式(Oracle SQL语句不区分大小写,SQL Developer能够给出比较多的友好提示,默认这些提示都会大写):
create TABLESPACE test datafile 'D:\Oracle\app\oradata\oracle\test.DBF' size 15M AUTOEXTEND on next 10M; //这里表示的是创建一个初始大小为15M,超过以10M自增的永久表空间(其实和SQL Server比较像) 创建结果如下:
在创建用户的时候这里就会出现对应刚才新建的永久表空间:
5.SQL Developer创建用户与连接 上面已经创建了一个Oracle的表空间了,这里再来创建一个用户。首先需要明确一点,创建用户需要有system权限。这里说的更详细就是sysdba和system,sysopr没有创建表空间一级用户的权限。为了印证前面提到的权限问题,展示对比结果如下:
sysopr的权限还是比较低的,除了不能创建用户,甚至连表都不能创建:
明白了这些内部的权限问题之后,也就是只有system或者sysdba能够创建用户。右键其他用户->点击创建用户->输入用户名和密码->选择用户对应的表空间,上方菜单找到授予的角色,勾上connect(表示赋予连接权限),菜单里面的SQL可以查看对应的SQL指令的书写方式。创建示例如下:
接下来是连接数据库,实例如下:
特别说明:
(1)这里在创建用户的时候需要使用大写的用户名,这是由于Oracle默认将会把用户名转化成大写的用户名,如果你这里使用小写创建的,之后又使用大写的用户名去连接对应的表空间,将导致连接显示用户名或者密码错误;
文章目录 一、FedAvg 简介二、联邦训练过程参考链接 一、FedAvg 简介 FedAvg是一种分布式框架,允许多个用户同时训练一个机器学习模型。在训练过程中并不需要上传任何私有的数据到服务器。本地用户负责训练本地数据得到本地模型,中心服务器负责 加权聚合本地模型 从而得到全局模型,经过多轮迭代后最终得到一个趋近于集中式机器学习结果的模型,有效地降低了传统机器学习源数据聚合带来的许多隐私风险。
二、联邦训练过程 首先用户从服务器中下载模型参数,更新本地模型参数,进行本地机器学习训练。
其次在用户中通过 本地随机梯度下降 不断更新模型的精度,当达到 预定的本地训练次数 时,将本地训练后的模型参数上传到服务端中。
服务端 随机抽取 用户设备(当客户端达到一定数量之后,联邦学习对客户端进行抽样聚合),并接收本地用户上传的模型参数梯度进行聚合。表示服务端模型参数梯度聚合,服务端将抽样的用户模型参数梯度加权平均并与上一轮聚合后模型参数相加,更新全局模型参数。最后将聚合后的模型参数回传给抽样用户设备,然后继续执行步骤1操作。重复执行上述步骤直至 通讯次数达到 t 。
参考链接 PyTorch 实现联邦学习FedAvg (详解)
该功能将使用vue3 + TS来实现语音播放组件,使用什么技术不重要,重要的是看懂了核心逻辑后,通过原生js、react、vue2等都可以轻松实现
所涉及到重要点有以下几个:
(1)进度条的实现:拖拽进度条、点击进度条
(2)操作audio语音播放:通过js操作audio媒体
(3)播放进度与进度条紧密关联:播放的进度改变时,进度条也随之改变;进度条改变时,播放的进度也随之改变
效果图:
开始我们的设计吧!
第一步:点击拖拽进度条 进度条的css样式如下:
父元素设置灰色背景色,圆圈进行position定位,使用left百分比,同时黑色进度条的width也是百分比,这样圆圈的left值是多少,黑色进度条的width就是多少。
.slider-wrap { position: relative; display: flex; align-items: center; height: 4px; max-width: 194px; min-width: 36px; width: 194px; background-color: rgba(23, 23, 23, 0.15); cursor: pointer; .circle { position: absolute; width: 14px; height: 14px; background-color: #555555; border-radius: 100%; cursor: pointer; user-select: none; transform: translate(-50%); } .slider-bar { height: 4px; max-width: 200px; background-color: #555555; } } 先说拖拽圆圈,圆圈上绑定mousedown事件,根据事件e.target确定圆圈、黑色进度条、灰色父元素,三者的element。同时知道了圆圈当前的left值,比如30%,还知道了当前鼠标mousedown时,事件e.pageX,即鼠标mousedown时,距离页面左边的水平值,因为对比后续鼠标移动时,触发的mousemove事件的e.pageX可以判断移动了多少。同时还要知道灰色背景的父元素的width。因为鼠标移动的距离 / width 要赋值给圆圈的left。知道移动了%多少。
const circleMousedown = (e) => { circleTarget.
二级标题不跟随一级标题编号 -1 操作环境0. 错误效果如题1. 原因2. 打开‘定义新的多级列表’2.1 设置一级列表2.2 二级列表设置(仔细看~) -1 操作环境 windows10MS word 2010 0. 错误效果如题 下图是出现问题的效果,本来编号应该是2.1,但出现1.1
1. 原因 在设置多级列表时,(可能)自动生成的编号不正确,目前俺也不清楚什么原因,你也照着下面的介绍试试吧☺
2. 打开‘定义新的多级列表’ 2.1 设置一级列表 只圈出了关键设置
2.2 二级列表设置(仔细看~) 先把①处清空在②处选择 ‘来自级别1’, 随后在①处输入英文格式的点号在③处选择样式‘1,2,3,…’最终①处会出现正确的编号 成功了请点个赞,没成功请留言~~
离散化(整数保序离散化)(标准版) 对于值域比较大(0-10^9),对于这些值,我们需要把他们当成下标来做,我们可以把它映射到从1开始连续的数组之中存储
假设:a[] = {1,3,100,2000,5000000}//a有序
映射之后 1->0 3->1 100->2 2000->3 5000000->4
问题:
a[]中可能存在重复元素 所以需要去重
vector<int>a;//存储所有待离散化的值 sort(a.begin(),a.end());//排序 a.erase(unique(a.begin(),a.end()),a.end());//去重 如何算出某个数x离散化后的值 二分
int find(int x){//找到第一个大于等于x的位置 int l=0,r = a.size()-1; while(l<r){ int mid = l+r>>1; if(a[mid]>=x)r=mid; else l = mid+1; } return r+1; } #include<iostream> #include<vector> #include<algorithm> using namespace std; const int N = 3e5+10; int n,m; int a[N],s[N]; typedef pair<int,int>PII; vector<int>alls; vector<PII>add,query; int find(int x){ int l = 0,r = alls.size()-1; while(l<r){ int mid = l+r>>1; if(alls[mid] >= x) r = mid; else l = mid+1; } return r+1; } int main(){ cin>>n>>m; for(int i=0;i<n;i++){ int x,c; cin>>x>>c;//x为坐标,c为值 add.