Vue(九)——页面路由(1)

目录 路由的简介 路由基本使用 几个注意点 嵌套(多级)路由 路由的query参数 命名路由 路由的params参数 路由的props配置 路由的简介 理解: 一个路由(route)就是一组映射关系(key - value),多个路由需要路由器(router)进行管理。 前端路由:key是路径,value是组件。 理解:value 是 component,用于展示页面内容工作过程:当浏览器的路径改变时,对应的组件就会显示 生活中的路由和路由器是为了完成多台设备的上网,而编码中的路由和路由器是完为了完成实现SPA应用的导航区与展示区的切换。 对SPA应用的理解 单页 Web 应用(single page web application,SPA)整个应用只有一个完整的页面点击页面中的导航链接不会刷新页面,只会做页面的局部更新数据需要通过ajax请求获取 路由基本使用 提出如下需求: 将html粘贴到App.vue 在main.js当中引入router之后可以使用一个全新的对象router。但不可像下图一样设置成字符串,需要自己去创建一个路由。 创建index.js专门用于创建整个应用的路由器 (routes为数组形式) ./router/index.js // 该文件专门用于创建整个应用的路由器 import VueRouter from 'vue-router' //引入组件 import About from '../components/About' import Home from '../components/Home' //创建并暴露一个路由器 export default new VueRouter({ routes:[ { path:'/about', component:About }, { path:'/home', component:Home } ] }) ./components/About.vue <template> <h2>我是About的内容</h2> </template> <script> export default { name:'About' } </script> .

fastgithub

之前我在网上搜过解决办法,其中一个是修改 hosts 文件,但是效果不太理想。我在这里给大家推荐github上的一个开源项目:FastGithub 。用了这个之后,效果就比较理想了,次次都能访问到。 源码地址:GitHub - dotnetcore/FastGithub: github加速神器,解决github打不开、用户头像无法加载、releases无法上传下载、git-clone、git-pull、git-push失败等问题 应用程序地址:Releases · dotnetcore/FastGithub · GitHub 源码大家想看可以下载下来看看,如果不想看,就直接去下载应用程序运行即可。 但是大家有的打不开github,谈何下载? 我试了把它同步在gitee上,但是同步过来的好像只有源代码。大家如果有解决方案的话,可以评论告诉我。我是有应用程序的文件的,可以发给大家。 打开应用程序地址之后,点击适合自己的下载即可,我的是windows的,所以我下载的windows的版本: 下载完成之后,会得到如下文件: 运行起来非常简单,还看什么README.md文件,直接双击运行我用红框圈起来的应用程序即可运行 FastGithub.UI.exe。第一次运行可能会提示你有风险,大家选择允许运行即可,运行起来之后,再去访问 github.com 就能明显感觉到了! 运行之后界面:我只知道,我运行了这个 github访问就贼快。这里还有打赏,如果大家有钱的话,可以打赏一下(我这个也算给作者打广告了吧?),我俩不认识。但是作者写这些代码也不容易。不打赏也能正常使用的,大家不用担心。 ———————————————— 版权声明:本文为CSDN博主「外面要下雨」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/qq_67929543/article/details/125677366

基于STM32结合CubeMX学习Free-RT-OS的源码之深入学习软件定时器实现过程

概述 关于在CUBEMX上的配置 介绍 软件定时器基于硬件定时器实现。 软件定时器允许设置一段时间,当设置的时间到达之后就执行指定的功能函数,被定时器 调用的这个功能函数叫做定时器的回调函数。回调函数的两次执行间隔叫做定时器的定时周期, 简而言之,软件定时器的定时周期到了以后就会执行回调函数。 Free RT OS基于systick中断产生计数值。软件定时其开始计数,当计数值到了所设置的时间时执行回调函数。 在RT-Thread中 软件定时器的定时回调函数直接放到了systick的中断回调函数里进行处理,但Free-RT-OS并没有这样做,主要原因是在于不知道定时处理回调函数需要花费多少时间,使得systick的节拍受到影响。 那么软件定时器是如何处理回调函数的? 答:Free RT OS创建了一个管理软件定时器的任务,叫做DaemonTask 也被称为守护任务,由它处理软件定时器的定时回调函数。 Free RT OS允许用户自己选择是否使用软件定时器。 当选择使用软件定时器时,Free RTOS内部的具体流程: Free RT OS为管理软件定时器创建的 守护任务,定时器链表,超时链表,定时器命令队列。对应下面的代码。 具体过程: 1 : 当使用了软件定时器,则在开启调度器时,创建Daemon Task(守护任务) osKernelStart() ->vTaskStartScheduler()(启动调度器)-> xTimerCreateTimerTask(); (创建守护任务) 创建守护任务 2:守护任务内部定时任务的函数入口 prvTimerTask 3: 同时在创建内部调用 prvCheckForValidListAndQueue prvCheckForValidListAndQueue (创建定时器命令队列,创建当前定时器链表和超时定时器链表。 4:守护任务的函数入口 prvTimerTask 查询计时器列表,看看它是否包含任何计时器,如果包含,获取下一个计时器将过期的时间。如果计时器已过期,则处理它。否则,阻塞此任务。直到计时器过期或收到命令为止。处理软件定时器的命令接受。(开启,关闭,调整周期,复位) 到这,已经能摸清除软件定时器工作流程的大概了。 以上都是RTOS内部为管理软件定时器所做的辅助工作。 再看看创建软件定时器: 软件定时器刚创建处于休眠态。 调用开启软件定时器的API(xTimerStart)后则把封装一个message对象 ,写入定时器命令队列。(这个定时器命令队列就是在守护函数中所创建的那个) #define xTimerStart( xTimer, xTicksToWait ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_START, ( xTaskGetTickCount() ), NULL, ( xTicksToWait ) )

阿里字体图标库的使用

https://www.iconfont.cn/阿里字体图标库网址 选择首页顶部导航栏里面的 资源管理 —》 我的项目 如果还未创建项目,请先创建项目,并添加想要的图标 一.通过symbol引入svg图片(vue项目或者原生框架) 第一步:拷贝项目下面生成的symbol代码: //at.alicdn.com/t/font_8d5l8fzk5b87iudi.js 第二步:加入通用css代码(引入一次就行): <style type="text/css"> .icon { width: 1em; height: 1em; vertical-align: -0.15em; fill: currentColor; overflow: hidden; } </style> 第三步:挑选相应图标并获取类名,应用于页面: <svg class="icon" aria-hidden="true"> <use xlink:href="#icon-xxx"></use> </svg> 二.通过symbol引入svg图片(react框架) 第一步 import { createFromIconfontCN } from '@ant-design/icons'; 第二步,尽量添上https将地址补全 const IconFont = createFromIconfontCN({ scriptUrl: 'https://at.alicdn.com/t/font_8d5l8fzk5b87iudi.js', }); 第三步,icon的样式可以自己视情况进行修改,type对应的值就是字体图标库里面每个图标下面对应的字符串名字 <IconFont className="icon" type="iconFrame19"></IconFont> 三.通过symbol引入svg图片(react框架+ umi) 在项目根目录下找到umircs.ts配置文件 在export default defineConfig({ })里面添加 scripts: [ ‘https://at.alicdn.com/t/font_8d5l8fzk5b87iudi.js’, ],同样记得把地址补全 export default defineConfig({ runtimePublicPath: false, publicPath: baseURL, history: { type: 'hash', }, scripts: [ 'https://at.

c/c++数据的排序方法(函数+数组《选择排序法》)

【例】数组的排序问题——输入n个学生的成绩,按成绩由高到低的方式输出。 分析: 输入n个学生成绩——可以调array_in( )函数 按从大到小顺序排列成绩——调sort( )函数 输出排序后的成绩——可以调array_out( )函数 这里我们主要来讨论排序的函数 1.选择法排序 进行多轮选择,第一轮选一个最大数(将a[0]与a[1]~a[n-1]进行比较,后者大则交换),第二轮选第二个最大数(将a[0]与a[1]~a[n-1]进行比较,后者大则交换)第n-1轮选第n-1个最大数(第n-1次选第n-1大数:将a[n-2]与a[n-1]进行比较,后者大则交换。) 由此可知 用循环i表示选大数的次数,即:i=0;i<n;i++ 用循环j表示比较的次数,即:j=i+1;j<n;j++ 比较x[i]<x[j] —— 当为真则两者交换。 函数如下: void sort(float x[],int n) { int i,j;float t; for (i=0;i<n-1;i++) for (j=i+1;j<n;j++) if (x[i]<x[j]){ t=x[i]; x[i]=x[j]; x[j]=t; } } 选择法的改进 此种方法每一次比较会将较大值放在前面一个,非常的繁琐。那么我们为何不定义一个可变的最大值呢?每比较一次就将最大值放入一轮下来最大的就给这个变量赋值成了最大。最小同理。 函数如下 void sort(float x[],int n){ int i,j,k;float t,m; for (i=0;i<n-1;i++){ k=i;m=x[i]; for (j=i+1;j<n;j++) if (m<x[j]){ m=x[j];k=j; } if (i!=k)//如果最大值为其本身 { t=x[i];x[i]=x[k];x[k]=t; } } } 谢谢大家!

前台 post方法提交却变成了 get 方法

最近遇到了一个小麻烦,那就是我在 js 文件中用post 方法提交,到后台调用的却是get 方法,一开始还以为是$.post()的一些参数问题,仔细看了一下$.post()的说明,发现没有错误,顿时就郁闷了。 一直以为问题应该出在post()方法上面,所以也是各种查找post()的相关说明,折腾了好久-。-终于最后顺着自己设的一些断点查找问题,找到了 代码 中的一个bug。 对于有提交功能(如form的submit)的函数进行操作时,如果代码出错,会触发自动提交功能,然后以 GET 方法提交数据到后台处理。

nn.CrossEntropyLoss()交叉熵损失函数

1、nn.CrossEntropyLoss() 在pytorch中nn.CrossEntropyLoss()为交叉熵损失函数,用于解决多分类问题,也可用于解决二分类问题。在使用nn.CrossEntropyLoss()其内部会自动加上Sofrmax层 nn.CrossEntropyLoss()的计算公式如下: 其中, log以e为底,nn.CrossEntropyLoss(x, lable),有两个参数 第一个参数:x为输入也是网络的最后一层的输出,其shape为[batchsize,class](函数要求第一个参数,也就是最后一层的输出为二维数据,每个向量中的值为不同种类的概率值)第二个参数:是传入的标签,也就是某个类别的索引值,在上面公式没有参与计算。batch_size如果是1,那么就只有一个数字,0,1或者2,表示的就是此时这个样本对应的真实类别,如果为batch_size是2,那么就有两个数字,例如(0,1),分别表示这两条样本对应的真实类别。 例如,输入(也就是最后一层的输出)为x=[[4,8,3]],shape=(1,3),即batchsize=1,class=3 第一步 我们首先计算一下三种类别分别对应的损失 loss(x,0) =-x[0]+log(exp(x[0])+exp(x[1])+exp(x[2]))=-4+log(exp(4)+exp(8)+exp(3))=-4+8.0247=4.0247 loss(x,1) =-x[1]+log(exp(x[0])+exp(x[1])+exp(x[2]))=-8+log(exp(4)+exp(8)+exp(3))=-8+8.0247=0.0247 loss(x,2) =-x[2]+log(exp(x[0])+exp(x[1])+exp(x[2]))=-3+log(exp(4)+exp(8)+exp(3))=-3+8.0247=5.0247 第二步 用第二个参数(一维数据)也就是类别对应的索引值,在上面结果中选择对应的损失,例如若网络的输出为x=[[4,8,3]],而对应的标签为1,则得到损失函数loss=0.0247。 2、BCELoss BCELoss是Binary CrossEntropyLoss的缩写,nn.BCELoss()为二元交叉熵损失函数,只能解决二分类问题。在使用nn.BCELoss()作为损失函数时,需要在该层前面加上Sigmoid函数,一般使用nn.Sigmoid()即可。 3、nn.MSELoss ps:用与解决回归问题,常用pytorch的nn.MSELoss损失函数(均方损失函数) ———————————————— 版权声明:本文为CSDN博主「东城西阙」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/qq_35605081/article/details/108368276

Jetlinks物联网平台部署

前端部署 用git拉取前端代码: $ git clone https://github.com/jetlinks/jetlinks-ui-antd.git 使用yarn打包推荐(命令在项目根目录下执行) yarn install yarn run build 使用npm打包(命令在项目根目录下执行) npm install npm run-script build 复制dist目录到nginx下 #查找nginx的目录 [root@VM-16-6-centos jetlinks-ui-antd]# find / -name nginx /www/server/nginx /www/server/nginx/sbin/nginx /www/server/panel/rewrite/nginx #将打包好的dist文件复制到nginx代理的路径: cp -r dist /www/server/nginx/html 修改nginx配置文件 件配置内容如下: server { listen 80; # gzip config gzip on; gzip_min_length 1k; gzip_comp_level 9; gzip_types text/plain text/css text/javascript application/json application/javascript application/x-javascript application/xml; gzip_vary on; gzip_disable "MSIE [1-6]\."; root /usr/share/nginx/html/dist; #这里设置根路径,若连同dist一起复制到html下的,要加上dist,不然就会出现找不到的情况 include /etc/nginx/mime.types; location / { index index.

gitlab重置用户账号密码,包括root账号

前提 需要知道gitlab账号的用户名,id,或者邮箱其一需要gitlab实例机器的管理员权限账号新密码必须符合gitlab密码规则 操作 打开Rails Consolesudo gitlab-rails console 找到gitlab用户 通过用户名 user = User.find_by_username 'exampleuser' 通过id user = User.find(123) 通过邮箱 user = User.find_by(email: 'user@example.com') 重置密码 重置为随机密码:new_password = ::User.random_password user.password = new_password user.password_confirmation = new_password 重置为自定义密码:new_password = 'examplepassword' user.password = new_password user.password_confirmation = new_password 可以是否邮件通知用户user.send_only_admin_changed_your_password_notification! 保存用户user.save! 退出控制台exit 重置root账号密码 如果要重置root账号的密码 如果root用户名没改过,直接通过root查找如果用户名修改了,并且不知道新的用户名,通过id为1查找,一般root账号id就是1 问题 修改不生效 可能是因为打开了邮箱验证,可以通过rail console关闭。 user = User.find(1) user.skip_reconfirmation! 没有root账号 遇到过部署的gitlab没有root账号的情况,通过手动将其他用户设为root账号解决 查看用户属性 u = User.find(1) pp u.attributes irb(main):003:0> pp u.attributes {"id"=>1, "email"=>"admin@example.com", "admin"=>false, ##这个属性表示是否为管理员 .

mysql 查看锁表信息

// 查看进程 SHOW PROCESSLIST; // 查看是否锁表 SHOW OPEN TABLES WHERE In_use > 0; // 查看正在锁的事务 SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS; // 查看等待锁的事务 SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS; 通过以下的语句查询出锁表的SQL: select l.session_id sid, s.serial#, l.locked_mode, l.oracle_username, s.user#, l.os_user_name, s.machine, s.terminal, a.sql_text, a.action from v$sqlarea a, v$session s, v$locked_object l where l.session_id = s.sid and s.prev_sql_addr = a.address order by sid, s.serial#;

prometheus 配置文件详解

目录 prometheus 配置文件详解 简介配置文件 原始配置文件内容global字段alerting 字段 alert_relabel_configsalertmanagersrule_files 规则分组rule_groupalerting rules定义Recording rules使用模板规则检查scrape_configs字段 job_namehonor_labelsschemeparams抓取认证类basic_authbearer_tokentls_configproxy_url服务发现类static_configs数据过滤类target配置示例sample_limit远程读写 remote_readremote_write参考文档 prometheus 配置文件详解 简介 Prometheus配置方式有两种: 命令行,用来配置不可变命令参数,主要是Prometheus运行参数,比如数据存储位置配置文件,用来配置Prometheus应用参数,比如数据采集,报警对接 不重启进程配置生效方式有两种: 对进程发送信号SIGHUPHTTP POST请求,需要开启–web.enable-lifecycle选项curl -X POST http://192.168.66.112:9091/-/reload 配置文件格式是yaml格式,.yml或者.yaml 都是 yaml格式的文件, yaml格式的好处: 和json交互比较容易 python/go/java/php 有yaml格式库,方便语言之间解析,并且这种格式存储的信息量很大 配置文件 配置文件使用yml格式,配置文件中一级配置项如下,说明参考#备注内容 #全局配置 (如果有内部单独设定,会覆盖这个参数) global: #告警插件定义。这里会设定alertmanager这个报警插件。 alerting: #告警规则。 按照设定参数进行扫描加载,用于自定义报警规则,其报警媒介和route路由由alertmanager插件实现。 rule_files: #采集配置。配置数据源,包含分组job_name以及具体target。又分为静态配置和服务发现 scrape_configs: #用于远程存储写配置 remote_write: #用于远程读配置 remote_read: 配置文件中通用字段值格式 : 布尔类型值为true和false : 协议方式包含http和https 原始配置文件内容 # my global config global: scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.

vscode配置prettier格式化工具

1. 在 vscode 中搜索 prettier 插件,然后安装。 2. 在 vscode 中,设置-》文本编辑器-》格式化 勾选"Fromat On Save",这样保存后自动格式化 3. 在 `package.json` 同级目录创建 `.prettierrc` 文件,下面为配置说明,注意要去掉注释 ``` { "printWidth": 100, // 超过最大值换行 "overrides": [ { "files": ".prettierrc", "options": { "parser": "json" } } ], "tabWidth": 4, // 缩进字节数 "useTabs": false, // 缩进不使用tab,使用空格 "semi": true, // 句尾添加分号 "singleQuote": true, // 使用单引号代替双引号 "proseWrap": "preserve", // 默认值。因为使用了一些折行敏感型的渲染器(如GitHub comment)而按照markdown文本样式进行折行 "arrowParens": "avoid", // (x) => {} 箭头函数参数只有一个时是否要有小括号。avoid:省略括号 "bracketSpacing": true, // 在对象,数组括号与文字之间加空格 "

类似ps的python工具lama cleaner

Lama Cleaner是个类似ps图片的工具,可以把图片中不想要的部分p掉,或者填补图片中丢失的部分。用下来感觉还蛮靠谱,对于不会ps的人是福音,记录一下。 相关介绍:https://github.com/Sanster/lama-cleaner 1.安装 安装非常简单,这里说的是win环境没有cuda,要先装个python3.7或者以上版本。 打开cmd,输入下面的代码,等待安装完成: pip install lama-cleaner 2.使用 lama cleaner是通过算法修改图片的,可以手动下载训练库放到这:C:\Users\你的用户名\.cache\torch\hub\checkpoints。也可以在运行时通过settings切换模式后等它自动下载。 训练库下载链接: Baidu: 百度网盘 请输入提取码passward: flsu ##1 打开cmd,输入下面代码: lama-cleaner --device=cpu --port=8080 --host=0.0.0.0 这里相关选项可以参考介绍里的内容,cmd不要关闭,这个服务会挂一个网页。 ##2 打开浏览器输入:http://localhost:8080/ 就可以进去使用了。 ##3 功能如下图: 不同模式下修图的效果会不同,详见介绍,一般默认就行了。

Qt-OpenCV学习笔记--计算周长--arcLength()

概述 这个函数用来计算 轮廓的周长 或者 曲线的长度。 函数 double cv::arcLength ( InputArray curve, bool closed ) curve计算对象(轮廓 或者 图形的顶点)closed标识符(曲线是否闭合,一般为true) 测试代码 #include "widget.h" #include "ui_widget.h" #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <vector> #include <QDebug> using namespace cv; using namespace std; Widget::Widget(QWidget *parent) : QWidget(parent) , ui(new Ui::Widget) { ui->setupUi(this); //生成画板 Mat mat = Mat::zeros(500,500,CV_8UC1); //构造点 Point2f a(100,100); Point2f b(400,100); Point2f c(400,400); Point2f d(100,400); //生成轮廓 vector<Point> contour_rec; contour_rec.push_back(a); contour_rec.push_back(b); contour_rec.push_back(c); contour_rec.push_back(d); //计算矩形的周长 double len_rec = cv::arcLength(contour_rec,true); //打印 qDebug()<<"

数据结构小知识

算法设计要求 1.正确性、2.可读性、3.健壮性、4.高效率地存储 算法效率的度量 时间复杂度:随着问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同简称渐近时间复杂度 频度:语句的执行次数。 空间复杂度:算法所需要空间 一 int i = 1; int k = 0; int n = 10; while(i <= n-1){ k += 10 * i; /*计算该语句频度*/ i++; } while 循环了多少次,就是该语句的频度 while 执行一次 i 自增 1 ,当 i>n-1 时退出,就是当 i=n 时退出 while,i 一开始为 1,所以 while 总共循环了 n-1 次; 频度 :n-1 二 int i = 1; int k = 0; int n = 10; do{ k += 10 * i; /*计算该语句频度*/ i++; }while(i <= n-1); 循环了多少次,就是该语句的频度 循环体执行一次 i 自增 1 ,当 i>n-1 时退出,就是当 i=n 时退出循环体,i 一开始为 1

多时钟--RTL前仿真,仿真工具误采样问题

在数字设计中,会遇到处理多个时钟的问题(如下面的a_clk、apb_clk),虽然在综合时,会将处于同一个时钟域的clock放在一个group中,保证了时序的同步性。但是,在RTL前仿中,仿真工具不会对其进行识别,会认为多个时钟处于不同的时钟域,从而会出现采样位置不对的现象。 下面的逻辑,组合逻辑信号a_sel处于a_clk下,a_cs时序逻辑处于apb_clk下。 简单的仿真结果如下: 从上面RTL仿真可以看出: 位置1处: 虽然a_sel拉高了,apb_clk按道理应该采样到该信号,然后a_cs拉高,但是结果并非如此。这是因为仿真工具对不同的时钟域之间的信号分析后,判定为此处采样不到高电平。 位置2处: 虽然a_sel拉低了,apb_clk按道理应该采样不到高电平信号,但是结果并非如此。这是因为仿真工具,对不同的时钟域之间的信号分析后,判定为此处可以采样到高电平,所以位置3处a_cs拉高。 在设计仿真阶段,一定要注意该问题,不然会造成仿真结果与实际设计出现误差,或者RTL仿真与后仿真结果不一致,浪费时间去排查问题。 在RTL设计阶段,可以采用# delay将信号的相位错开,来保证前仿真阶段的逻辑正确性,避免时钟域的误判段问题。

电脑视频怎么录制?好用的电脑录屏方法

在日常使用电脑的时候,很多小伙伴经常会遇到需要录制电脑视频的时候。但网上各种眼花缭乱的电脑录屏方法,很多小伙伴看了表示自己根本没有学会。今天就给大家分享2个简单好用的电脑录屏方法,看完后轻松掌握电脑录屏。 一.使用Windows系统自带的录屏功能 如果你的电脑是Windows10系统,那么不妨使用系统自带的Xbox Game Bar录屏功能进行电脑录屏。 步骤1:在“开始菜单栏”中打开“设置”,搜索并找到 “Xbox Game Bar”,点击,使其处在“开启状态”。 步骤2:回到桌面,使用快捷键“Win+Alt+G”打开屏幕录制功能,也可以使用快捷键“Win+Alt+R”直接开启录制。 二.使用数据蛙录屏软件 Windows自带的Xbox Game Bar录屏功能使用起来虽然简单方便,但能够录制的场景有限,多数是用来录制游戏画面,并且无法录制桌面、文件夹等情况。如果你对电脑录屏 有更高的要求,你可以试试这个免费的专业屏幕录制软件——数据蛙屏幕录制软件。 数据蛙录屏软件的功能丰富,界面简洁,操作简单,内有不同的录制模式预设,可以应对不同的录制场景和需求。 同时,数据蛙录屏软件不同于市面上绝大多数需要付费才能完整录制的录屏软件,它可以免费不限时长地进行高清画面录制。录制的过程中默认无水印,也可以根据实际的录制需求,添加属于自己的文字水印与图片水印。 具体的操作步骤: 步骤1:在官网上下载数据蛙录屏软件,安装并运行后,在主界面中选择“视频录制”。也可以根据实际的录制需求,选择不同的录制模式,操作逻辑是一样的。 步骤2:进入“视频录制”的详细界面后,根据录制需要调整里面的选项,最后点击“REC”开始录制。 (注:如果需要对录制的画质、帧率、视频格式、音频格式等方面进行调整,可以点击上方的“小齿轮”进行调整。) 步骤3:录制后,您可以在弹出的“预览窗口”中进行预览。确认后,单击“完成”保存视频。 电脑视频怎么录制?以上就是小编分享的2个好用的电脑录屏方法。与Windows自带的录屏软件相比,数据蛙录屏软件所支持的录制内容相对较多,能够支持视频录制、音频录制、游戏录制等,感兴趣的小伙伴不妨去尝试一下。

vue路由配置步骤

vue路由配置及前置路由守卫和后置路由守卫 1.创建/src/router/index.js文件,该文件专门用于创建整个应用的路由器 2.下载安装vue-router: npm install --save vue-router@3 3.使用插件vue-router 4.配置路由规则 5.创建并暴露 路由器 // 该文件专门用于创建整个应用的路由器 import Vue from 'vue' import VueRouter from 'vue-router' import Home from '../views/Home.vue' // 1.下载vue-router: npm i -S vue-router@3 // 2.使用插件vue-router Vue.use(VueRouter) // 3.配置路由规则 const routes = [ { path: '/', // 路由重定向 默认显示当前路由页面 redirect: '/about', // 后置路由守卫,需要每个都配置 meta meta: { title: '首页' } }, { name: 'shouye', // 路径 path: '/home', // 组件 component: Home, redirect: '/home/news', meta: { title: '首页' }, children: [ // 二级路由不要加 / { name: 'xinwen', path: 'news', component: () => import('.

为什么你的用户转化率不高?-- 新媒体运营转化效果渠道归因分析

新媒体运营人最关注的就是流量和用户转化问题。公司发布了新APP、上线了新网站项目,进行用户定位、策划、数据分析和内容营销,花重钱做产品推广,但最后用户转化率却不高,大批用户流失了......这种现象是运营人最不愿意看到的,而最头痛的就是不知道根本问题出在哪里。 今天我们来看看,如何通过 Kyligence Zen 指标平台的归因分析功能,对一个产品在新媒体广告投放的不同渠道和转化率效果进行分析的过程,让广告的每一分钱都花得明明白白! 根据业务流程定义指标 / 制定目标 下面是产品网站用户转化的典型流程。首先通过不同的广告渠道对网站和产品进行曝光,吸引客户点击,接着完成注册和成单等操作。 根据业务流程,我们可以创建一系列用户转化相关的指标。 在 Kyligence Zen 的目标看板上,我们可以看到,在企业的促销推广活动开始之前,营销推广部门围绕用户流量和转化率制订了运营推广目标如下。 通过目标值和实际值的对比,我们可以看出: 在运营活动中,总曝光量达 21,343 万次,已经达到了目标值 10,000 万次; 从点击到转化(注册或购买等)的转化率达到 8.59%,达到了目标值 5%; 但是从曝光到点击的转化率仅为 0.02%,远低于目标值 3%。 因此,下一步我们需要对流量和转化率指标存在的问题进行进一步归因分析,找出优化的方向。 归因分析 下面我们以总曝光量为例,进行归因分析。 可以看出,从 2022 年 6 月 1 日到 2022 年 6 月 13 日,总曝光量从 66.393 万次增加到了 868 万次,增长了 1,208%; 从平台维度来分析,其中对增长部分贡献比例最高的是平台 ID 为 700 的平台,贡献比例高达 49.3%;其次为 平台 ID 为 600 和 300 的平台,贡献比例分别为 16.7% 和 15.6%; 从运营活动维度来分析,其中对增长部分贡献比例最高的是 活动 ID 为 700 的营销活动,贡献比例高达 96.

EasyExcel格式化映射注解和样式注解详解

一、概述 使用注解很简单,只要在对应的实体类上面加上注解即可。 也就是说使用实体类模型来读写Excel文件时,可以通过注解来控制实体类字段和Excel列之间的对应关系。 二、ExcelProperty 2.1 作用 ExcelProperty注解用于匹配excel和实体类字段之间的关系。 可以作用于字段上。 2.1 注解参数 名称默认值描述value空用于匹配excel中的头,必须全匹配,如果有多行头,会匹配最后一行头orderInteger.MAX_VALUE优先级高于value,会根据order的顺序来匹配实体和excel中数据的顺序index-1优先级高于value和order,会根据index直接指定到excel中具体的哪一列converter自动选择指定当前字段用什么转换器,默认会自动选择。写的情况下只要实现com.alibaba.excel.converters.Converter#convertToExcelData(com.alibaba.excel.converters.WriteConverterContext) 方法即可 2.3 使用示例 @Getter @Setter @EqualsAndHashCode public class DemoData { @ExcelProperty("字符串标题") private String title; // 在这个字段前面加上 自定义三个字 @ExcelProperty(value = "conver的使用", converter = CustomStringStringConverter.class) private String convert; @ExcelProperty(value = "日期标题", index = 3) private Date date; @ExcelProperty(value = "数字标题", index = 5) private Double doubleData; } import com.alibaba.excel.converters.Converter; import com.alibaba.excel.converters.ReadConverterContext; import com.alibaba.excel.converters.WriteConverterContext; import com.alibaba.excel.enums.CellDataTypeEnum; import com.alibaba.excel.metadata.data.WriteCellData; /** * 定义一个字符串转换器,需要实现Converter接口并且传递需要转换的泛型 */ public class CustomStringStringConverter implements Converter<String> { // 所支持的java类型 @Override public Class<?

服务器运行Microsoft.Office.Interop.Word出错{00024500-0000-0000-C000-000000000046}问题总结

服务器调用word 功能时,遇到一下问题 1.版本不对 未能加载文件或程序集“Office, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c”或它的某一个依赖项。系统找不到指定的文件。这要么是未安装以下文件: 安装方法: 用office安装盘,添加以下.net编程支持. 2.无法运行office组件 {00024500-0000-0000-C000-000000000046}组件运行时出错.如果本地权限不足,请提升权限.方法如下: 为office提升权限 2.在web.config中增加角色及口令,模拟高权限角色 <identity impersonate="true" userName="Administrator" password="88888888"/> 3.为了防止因提升权限导致的安全问题,修改应用程序池标识,完美解决。具体如下:

Vue(八)——Vuex

目录 理解vuex 求和案例 纯vue版 搭建vuex环境 vuex版 getters配置项 四个Map方法的使用 mapState与mapGetters mapMutations与mapActions 多组件共享数据 vuex模块化编码 理解vuex 概念: 在Vue中实现集中式状态(数据)管理的一个Vue插件,对vue应用中多个组件的共享状态(数据)进行集中式的管理(读/写),也是一种组件间通信的方式,且适用于任意组件间通信。 多组件共享数据——全局事件总线实现(让所有组件都可以读写x和y) 多组件共享数据——vuex实现 什么时候使用vuex? 1.多个组件依赖于同一状态(数据) 2.来自不同组件的行为需要变更同一状态(数据) 工作原理图: 我们所说的将数据交给vuex去管理,就是交给State对象去管理。这个actions主要处理mounted,向服务器发异步请求,然后获取数据,修改,保存到state仓库中,然后通过mapState组件能拿到,然后进行遍历数组动态展示数据,这就是前台项目的大部分功能。 1.A M S 都是对象 2.A M S都要经过store的领导 3.需要在任何一个组件里调dispatch、commit,而dispatch、commit都在store身上。这就需要所有的组件实例对象vc都能看见store。 求和案例 纯vue版 option里的值如果不处理会被当成字符串而无法进行运算 Count.vue <template> <div> <h1>当前求和为:{{sum}}</h1> <select v-model.number="n"> <option value="1">1</option> <option value="2">2</option> <option value="3">3</option> </select> <button @click="increment">+</button> <button @click="decrement">-</button> <button @click="incrementOdd">当前求和为奇数再加</button> <button @click="incrementWait">等一等再加</button> </div> </template> <script> export default { name:'Count', data() { return { n:1, //用户选择的数字 sum:0 //当前的和 } }, methods: { increment(){ this.

新风向——单细胞泛癌研究

对于一些没有实验条件以及没有充足实验经费的同学来说,泛癌研究其实是一个非常不错的选择。但是关于泛癌研究怎么做,尤其是单细胞的泛癌研究该怎么做,许多同学都没有什么头绪。 自从张泽民老师两篇顶级的泛癌研究的发表以来,基于公共单细胞数据的泛癌研究可以说是越来越多。但大多数都只是合并数据后的差异分析,并没有讲出一个生动的故事来。尤其是在现在这个时间节点,单细胞数据泛滥,空间转录组数据出露头角,拟时序,细胞互作(crosstalk)以及单细胞网络等等复杂算法的提出,越来越挑战我们这帮科研狗编故事的能力。而今天带来的这篇泛癌文章,非常丝滑地把这些东西串到了一起,并描绘了一个相当有趣的故事。 回到正文部分,文章首先介绍了数据的构成(正常、癌旁和肿瘤组织) 和一些零碎的结果,例如通过一类巨噬细胞的含量随着疾病恶性程度梯度下降(正常—>癌旁—>肿瘤—>转移),推断此类巨噬细胞能够作为疾病进程的标志物。(如下图) 关于文章这个部分,是我们应该去学习的。在在泛癌研究中,我们常常忽视这种样本疾病的恶性程度信息(因为总是pool到一起去做),但这样会失去了很多发现新东西的机会。倒过来讲,如果我们有了什么新发现的细胞类型,我们同样可以通过这种方式来证明这些新细胞的重要性。 好的我们回到主线,该研究的核心在于泛癌中的成纤维细胞。通过差异分析能够得到与成纤维细胞活性相关的一些基因在癌症样本中上调了,推断成纤维细胞在癌症中活化。 而活化后的成纤维细胞有什么样变化呢? 如果是几年前,仅用表达数据能够做的事情就是用差异基因做个功能富集,但是在单细胞领域,我们还能去通过细胞间crosstalk的差异来描述细胞的功能变化。在正常,癌旁到肿瘤组织中,成纤维细胞与其他TME的crosstalk在逐步增强,预示着成纤维在肿瘤进程中的重要调控作用。(如下图) 该研究中成纤维细胞被分为8个类型,并通过SCENIC计算的regulon富集程度证明了注释的准确性。(如下图) 关于这个成纤维细胞注释的事情,其实目前来讲是没有什么明确的金标准的。但是这种细胞亚型注释方法是否值得借鉴呢?从经验上来说,很难!简单的说,该文章的SCENIC结果有点好的离谱了,除非成纤维细胞本身确实存在如此巨大的差异。 我们接着回归主题。 由于活化是种过程,而几种成纤维亚型的比例数量在不同条件中也有明显差异。种种结果驱动着我们探究成纤维细胞可能的分化过程,将处于不同分化位置的成纤维细胞标志为不同的state (1-3)。并针对每种成纤维_state计算了EMT(内皮间充质转化) score以标注恶性程度。 由于该部分说书是以crosstalk为起点,所以后续文章详细的展示了成纤维细胞究竟是基于哪些受配体与其他细胞进行交互的。并通过交互强烈程度以及一些特殊的基因说明了成纤维_state3的危害程度(如下图) 而最后,通过外部生存数据验证成纤维_state3危害(如下图) 简而言之,这一部分得到的结论是成纤维会随着肿瘤进程不断的活化,活化的表现为与其他细胞的交互增强,并且这种活化后的成纤维细胞与患者更差的生存有关系。 但是到这里,有些同行或许会疑惑在详尽展示crosstalk结果的时候为什么要用state而非细胞类型。因为大多数人是不会太在意monocle得到的state信息的。关于这个问题,我们实验室讨论后的结论是,如果基于八个cluster往下做,结果很有可能不会特别的好,因为细胞分的越细致,细胞之间的差异就越小。这个时候Cibersort是否还能够比较精准的预测出各类细胞的含量呢?外部印证是否还能够显著呢?所以利用数量更少分类更笼统的state是更加合适更加稳妥的。 再往下,文章探讨了成纤维细胞的可塑性。简单来说,因为成纤维细胞的一个亚类包含了两类细胞的marker gene(成纤维,免疫)。所以认为该类成纤维细胞是巨噬细胞向着成纤维细胞转化的中间态。通过拟时序,荧光双阳细胞的发现以及单细胞数据得到的marker交叠,初步验证了该假设(如下图)。 在文章最后一部分,文章讨论了成纤维细胞与巨噬细胞的相互作用(如下图) 并利用空间转录组数据计算了两类细胞的显著共定位,提示两类细胞存在互作的空间条件。 从单细胞数据得到的细胞crosstalk是完全可以用空转数据的细胞共定位来验证的哦~(虽然不能称之为金标准)今天也读到了一篇cell-cell interaction的benchmark 文章,所利用的验证数据就是配套的单细胞和空间转录组数据。

IC验证——UVM学习——验证平台中的组件

UVM验证平台可以看成是由多个模块组合在一起,通过把这些模块放在一起利用接口和DUT连接起来,从而最终实现验证的目的。如图为一个完整的UVM验证平台框图,下图中每一个组件(即UVM中的component)就是一个类。 这些模块不是简单的函数或者过程,而是一个个实实在在的对象文件,这些对象内部会包括一些function或者task等来协作完成整个验证平台的运行 sequence是产生transaction(事务)的组件,属于平台外的,但由于和testbench关系较大,所以一并讨论。 0. sequence组件 事务反生器,即产生transaction。transaction不能算是testbench中的组件,只是各组件间的数据流。 基类 uvm_sequence_item 该类可以派生事务级的transaction类,这是使验证平台相互连通的重要组件。 为了使transaction能随机化,需要给每个成员指定为rand。 transaction和driver类是不同的,它是有生命周期的,他在仿真的某一时间产生,经过driver驱动,在经过testbench中的参考模型处理,最终由scoreboard比较完成后,其生命周期结束。uvm_sequence 产生事务发生器,即派生出sequence,并可以在定义时产生一系列transaction对象(一般来说,一个sequence产生一种类型的transaction)。它不属于验证平台的部分,但是却能给验证平台提供激励。 task body() sequence中最重要的部分就是其中的task: body(),作用是产生和控制transaction。当一个sequence启动之后,会自动执行body中的代码。 宏 `uvm_do(ptr) 该宏在UVM中比较常用,作用是: (1)创建transaction对象,调用一次即产生一次对象,即产生完整地使平台运行的一个包。 (2)将其随机化 (3)最终将其送给sequencer。 ptr为指针,可通过该指针访问创建的事务对象。driver取走这个transaction后,uvm_do并不会立刻返回执行下一次uvm_do,而是等待在那里,直到driver返回item_done信号。 1. testcase 在testbench中首先需要创建一个测试案例,它用来实例化和配置environment,使env模拟不同的配置环境,执行不同的测试行为;指定测试的sequence 若一个功能点的testcase的env配置完成,则不能改动,若要改动或修复则需重新配置env。 2. environment组件 env组件可以将testbench中所有组件封装在一起,在该类中可以实例化多个agent,reference model,scoreboard等,并将其互连。 注意:一旦该组件定义完成,后续不得轻易对其更改,若更改须重新验证所有的testcase。因此在定义时最好事先配置好interface,使env就有可配置性。 基类 uvm_env 可以派生出可以实例化testbench中各组件类的容器类。和driver一样,容器类在仿真中是一直存在的,可以使用uvm_component_utils宏来实现factory的注册 3. agent组件 agent中可以实例化sequencer,driver,monitor等组件,并将这些组件连接起来。 模式 active 需要实例化sequencer、driver、monitor,连接sequencer和driver。 该状态是agent的默认状态,在代码中,is_active是agent内建的变量,默认值为UVM_ACTIVR。passive 该模式下只有monitor,因此没有驱动DUT的能力,但可以用来捕获DUT的输出信号并转化为transaction。 基类 uvm_agent 4. sequencer组件 用来启动sequence,并将transaction对象发送给driver。绝大部分功能由UVM实现 基类 uvm_sequencer(transaction) 作用: (1)sequence在向sequencer发送transaction时,会先发一个请求,sequencer把这个请求放在一个仲裁队列中,并检测仲裁队列里是否有某个sequence发送transaction的请求 (2)检测driver是否申请transaction 5. driver组件 激励驱动,从sequencer接收transaction对象,并转化为DUT可接收的pin级信号,再按照DUT总线接口协议要求驱动DUT。 基类 uvm_driver(transaction) 6. monitor组件 driver类负责把transaction级别的数据变成DUT的端口级别,并驱动给DUT;monitor的行为与其相对,用于收集DUT的端口数据,并将其转换为transaction交给后续的组件reference model,scoreboard处理。 monitor要通过TLM_port和其他组件相连。 基类 uvm_monitor 7. reference model组件 模拟DUT的功能行为,根据输入的激励产生相应的结果,并交给scoreboard。

Flink sql join 快速入门

目录 Flink stream join基于窗口joinTumbling window join(滚动窗口join)Sliding Window Join(滑动窗口join)Session Window Join(会话窗口join) Interval Join Flink sql query join流式joinRegular Joins(双流join)Interval Joins(区间join)Temporal Joins(时态join)JOIN LookupJOIN 版本表Event Time Temporal Join(版本表)Processing Time Temporal Join(不建议使用) JOIN LATERAL 窗口Join窗口函数TUMBLE(滚动窗口)HOP(滑动窗口)CUMULATE(累积窗口) 窗口Join语法 总结 Flink stream join 基于窗口join Flink 中 Window 可以将无限流切分成有限流,是处理有限流的核心组件,现在Flink 中 Window 可以是时间驱动的(Time Window),也可以是数据驱动的(Count Window) 窗口连接将共享一个公key并位于同一窗口中的两个流的元素连接起来。这些窗口可以通过使用窗口赋值器来定义,并根据两个流中的元素进行计算。 然后,来自两边的元素被传递给用户定义的JoinFunction或FlatJoinFusion,用户可以在其中发出符合连接条件的结果。 stream.join(otherStream) .where(<KeySelector>) .equalTo(<KeySelector>) .window(<WindowAssigner>) .apply(<JoinFunction>) Tumbling window join(滚动窗口join) 滚动窗口有固定的尺寸,窗口间的元素无重复。当执行滚动窗口连接时,具有公key和公共滚动窗口的所有元素将作为成对组合进行连接(inner join) 因为这就像一个内部连接,所以一个流中的元素在其滚动窗口中没有来自另一个流的元素时,不会发出。 如图所示,我们定义了一个大小为2毫秒的翻转窗口,其结果为[0,1],[2,3]形式的窗口 DataStream<Integer> orangeStream = ... DataStream<Integer> greenStream = ... orangeStream.join(greenStream) .where(<KeySelector>) .

判断101-200之间有多少素数

package lianxi; public class Test2 { public static void main(String[] args) { //判断101-200之间有多少素数 int count = 0; // 外循环 遍历101~200这个范围 依次得到这个范围之内的每一个数字 for (int i = 101; i <=200; i++) { //依次表示循环中的每一个数字 //继续判断i是否为一个质数 boolean flag = true; //内循环 判断当前数字是否为一个质数 for (int j = 2; j < i; j++) { //j表示2~99之间的每一个数字 if (i % j == 0) { flag = false; //跳出单层循环,内循环 break; } } if (flag) { System.out.println("当前数字" + i + "

恶搞好朋友 java

import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.IOException; //shutdown : 关机 //加上参数才能执行 //-s : 默认一分钟后关机 //-s -t 指定时间 : 指定关机时间 //-s: 取消关机操作 //-r 关机重启 public class MyJframe extends JFrame implements ActionListener { JButton yesBut = new JButton("帅爆了"); JButton midBut = new JButton("一般般吧"); JButton noBut = new JButton("不帅 有点磕碜"); JButton dadBut = new JButton("绕了我吧"); //决定上方的按钮是否展示 //true: 展示 //false 不展示 boolean flag = false; public MyJframe() { initJFrame(); initView(); //显示 this.

kubernetes-HPA、rancher

目录 一、HPA 二、metrics-server 三、安装HPA 四、资源限制 - Pod 五、资源限制 - 命名空间 1.计算资源配额 2.配置对象数量配额限制 六、Rancher 简介 七、Rancher 安装及配置 1.安装 rancher 2.登录 Rancher 平台 3.Rancher 管理已存在的 k8s 集群 4.Rancher 部署监控系统 5.使用 Rancher 仪表盘管理 k8s 集群 一、HPA HPA(Horizontal Pod Autoscaling)Pod 水平自动伸缩,Kubernetes 有一个 HPA 的资源,HPA 可以根据 CPU 利用率自动伸缩一个 Replication Controller、Deployment 或者Replica Set 中的 Pod 数量。 1)HPA 基于 Master 上的 kube-controller-manager 服务启动参数 horizontal-pod-autoscaler-sync-period 定义的时长(默认为30秒),周期性的检测 Pod 的 CPU 使用率。 2)HPA 与之前的 RC、Deployment 一样,也属于一种 Kubernetes 资源对象。通过追踪分析 RC 控制的所有目标 Pod 的负载变化情况,来确定是否需要针对性地调整目标Pod的副本数,这是HPA的实现原理。

Jmeter常用场景梳理

一.在一段时间内持续发送请求 此场景可以用于稳定性测试,在稳定性测试中,通常需要持续压测几个小时甚至几天时间,查看接口是否有报错,或者cpu、内存会上涨,此时就需要通过控制持续时间来达到此目的。 1.创建线程组,循环次数勾选永远 2.勾选调度器,持续时间输入120,即可在120秒内持续调用接口 二.每秒钟固定调用次数 如果想控制每秒发送请求数量,仅仅通过线程数与循环次数是不够的,因为这只能控制发送总数,而要控制每秒发送数量,需要线程数与常数吞吐量控制器的搭配使用,这种场景在性能测试中使用不多。 例如每秒钟调用30次接口,那么把线程数设置为30,将常数吞吐量控制器的每分钟样本量设置为60,即每个线程每秒钟调用一次,通过此设置可以控制每秒钟的调用次数。 三.数据库操作 Jmeter不仅可以作为性能测试工具和接口自动化工具,也可以作为日常数据库操作的工具。如果想循环多次操作数据库,例如插入多条数据,不需要写java或者python代码,仅仅通过Jmeter添加几个插件就可以实现了。 1.先在测试计划中配置数据库连接中间件,以mysql5.7为例,下载mysql-connector,如果是mysql8+,还请网上自行下载对应connector。 然后配置到Jmeter的测试计划中。 2.创建线程组和JDBC Connection Configuration,然后配置变量名称 3.在下面的Database Connection Configuration中配置数据库url、driver、name、password 4.创建JDBC Request,变量名称与上一步的变量名称一致,下方输入sql语句,执行即可 5.如果数据的某个字段需要随机生成,可以配合工具->函数助手来完成 四.将响应结果提取并写入csv 有时在进行性能测试时,需要将上一个接口的响应结果进行持久化保存,从而作为下一个接口的参数进行性能压测。创建线程组和HTTP请求,请求的响应结果中包含currentUserId这个字段,假定要提取这个字段 1.配置正则表达式提取器,每个字段的含义可查看此文章:https://zhuanlan.zhihu.com/p/27999878 2.配置BeanShell PostProcessor,参数与正则表达式中的引用名称一致,用${}进行引用,脚本如下: FileWriter fw = new FileWriter("D:\\account1.csv",true); BufferedWriter bw = new BufferedWriter(fw); bw.write(vars.get("param")); bw.newLine(); bw.close(); 五.线程组内参数传递 实现参数传递是做接口自动化的前提之一,而Jmeter可以实现参数提取与参数传递,例子中创建了两个HTTP请求,新闻列表请求会返回新闻列表uniquekey 而新闻详情请求的参数需要通过uniquekey,来返回详情内容。 1.在新闻列表的请求中增加JSON提取器,JSON Path expressions输入JsonPath表达式,定位到要提取的字段,然后赋值给变量“name”。 2.在新闻详情的请求中通过${}的形式,提取上一个接口的变量,注意此处变量用的是“name” 六.跨线程组参数传递 性能测试中,两个相关联的接口不一定都在同一个线程组,遇见这种情况时,我们要进行跨线程组传参,与上一个示例基本相同,只不过在第一个线程组中使用了BeanShell后置处理器,将参数保存到了全局变量。此处还是用新闻列表和新闻详情两个请求举例,只不过这次将两个请求分别放入不同的线程组。 1.新闻列表请求中配置BeanShell后置处理器,将“name”变量保存到全局变量中,并重新叫做“NAME” ${__setProperty(NAME,${name},)} 2.新闻详情请求中使用下面这种方式提取全局变量 ${__property(NAME,,)} 3.如果失败,记得查看测试计划里是否勾选独立运行每个线程组,勾选后才生效 七.吞吐量控制器 在进行混合负载测试时,需要按照线上实际的流量,添加多个接口进行测试,此时就需要使用吞吐量控制器来进行流量的分配。例如将三个接口按照30%、50%、20%的比例进行分配,持续调用一段时间后,最终调用三个接口调用的样本数为:3:5:2 1.在每个接口上增加吞吐量控制器,注意吞吐量不要加百分号 2.持续调用20秒,查看聚合报告,样本数量基本保持3:5:2 八.id自增控制器 使用jmeter调用接口或者往数据库插入数据时,经常遇见id不能重复的情况,此时可以通过计数器来完成。 1.添加计数器控制元件,输入起始值、步长和引用名称 2.接口调用时使用${}引用计数器的引用名称即可实现变化

kubernetes-helm

目录 一、helm 1.Chart 2.Repository(仓库) 3.Release 二、 Helm配置 1.安装 helm 2.使用 helm 安装 Chart 三、Helm 自定义模板 1.拉取 chart 2.创建自定义的 chart 3.修改 chart 4.打包 chart 5.部署 chart 6.部署 ingress 7.回滚 四、Helm 仓库 1.安装 harbor 2.安装 push 插件 (1)在线安装 (2)离线安装 (3)添加仓库 (4)推送 chart 到 harbor 中 一、helm 在没使用 helm 之前,向 kubernetes 部署应用,我们要依次部署 deployment、svc 等,步骤较繁琐。 况且随着很多项目微服务化,复杂的应用在容器中部署以及管理显得较为复杂,helm 通过打包的方式,支持发布的版本管理和控制, 很大程度上简化了 Kubernetes 应用的部署和管理。 Helm 本质就是让 K8s 的应用管理(Deployment、Service 等)可配置,可以通过类似于传递环境变量的方式能动态生成。通过动态生成 K8s 资源清单文件(deployment.yaml、service.yaml)。然后调用 Kubectl 自动执行 K8s 资源部署。 Helm 是官方提供的类似于 YUM 的包管理器,是环境的流程封装。Helm 有三个重要的概念:Chart 、Repository 和 Release。

【ImportError: cannot import name ‘current_app‘ from ‘celery‘】celery导入错误的解决办法

在Python中使用Celery做异步任务时,安转celery库后,一切设置正常。进行启动时,报错如下: ImportError: cannot import name 'current_app' from 'celery' (d:\ck_test\env\lib\site-packages\celery\__init__.py) 当前环境信息: Python版本:3.7celery版本: 5.2.7eventlet版本:0.33.1redis版本:4.3.4 报错后重新pip安装Celery,问题依旧,最后排查发现,是由于 Python版本不同 导致的报错 当前将Python版本升级到3.9,在次运行,报错就消失了 当前环境信息: Python版本:3.9.1.3celery版本: 5.2.7eventlet版本:0.33.1redis版本:4.3.4

ElementUI图片上传 回显

html内容 <!-- 图片上传 --> <el-row> <el-col :span="24"> <el-form-item label="LOGO" prop="logoImg"> <el-upload class="upload-demo" ref="upload" name="logoImg" :action="action" :on-success="uploadSuccess" multiple :accept="accept" :limit="1" :show-file-list="false" :on-exceed="handleExceed" :on-progress="uploading" :file-list="fileList" :before-upload="beforeAvatarUpload"> <el-button size="small" type="primary">点击上传</el-button> <div slot="tip" class="el-upload__tip" style="color:#F00">注:只能上传jpg/png文件,图片尺寸必须377mm x 60mm, 且不超过500KB</div> </el-upload> </el-form-item> <el-form-item v-show="imgShow"> <img :src="imgSrc" style="width: 300px"> </el-form-item> </el-col> </el-row> 针对up-load组件,官网有详细的解释文档,可以看这里 我大概解释下用到的属性事件等 name : 为上传的文件字段名(上传接口入参的字段名) action : 为文件的上传地址,可以在data中定义,mounted钩子函数中对其赋值,写入后端给定的一个地址即可 data () { return { action: '', // 如果在html中携带accept则默认选择规定类型的文件,否则可以在钩子函数中判断上传的文件类型 accept: ".jpg,.png", // .doc,.docx,.ppt,.xls,.xlsx,.wps,.dps,.pdf,.txt, fileList: [], } }, mounted () { this.

Qt6 安装串口模块 QSerialPort

1. 前言 Qt 似乎在 5.2 版本及之后的版本中不会包含串口库,及以前使用的 QSerialPort 头文件中的内容,但是在使用新版本的 Qt 开发时却想要使用该软件库,那么就需要另辟蹊径,本文尝试重新编译之前版本的 QSerialPort 库并将其安装到新版本的 Qt Creator 中。 笔者目前使用的 Qt 版本分别为 6.3.1 和 6.2.4。 2. 下载 QSerialPort 源码 推荐在清华大学开源软件镜像站下载。 选择目录 qt > official_releases > qt > 5.15 > 5.15.6 > submodules 点击 qtserialport-everywhere-opensource-src-5.15.6.zip 下载。 这里笔者选择的是 5.15.6 版本的 QSerialPort 源码。 笔者选择:qtserialport-everywhere-opensource-src-5.15.6.zip 下载成功后,将其解压,就会看到如下源码列表。 3. 构建并安装 QSerialPort 工程 使用 Qt Creator 打开解压好的工程,如下图; 点击项目; 在 Build 步骤中添加 Make; 在 Make arguments 中填入 install 选择需要安装的版本和编译方式 Debug 或 Release; 点击构建,稍等片刻,若无报错则说明安装成功,上一步根据自己需要去选择即可,若不清楚,则每个都选择一次,同时再选择 Debug 和 Release 版本再执行一次即可。 4.

Stream手动分页

手动分页 int pageNum = queryVideoFrom.getPageNum(); int pageSize = queryVideoFrom.getPageSize(); List<User> userList = userMapper.selectAll(); // 手动分页 Map<String, Object> map = Maps.newHashMapWithExpectedSize(5); map.put("total", userList.size()); map.put("pageNum", pageNum); map.put("pageSize", pageSize); map.put("pages", (userList.size() + pageSize -1) / pageSize); map.put("pageList", userList.stream().skip((pageNum - 1) * pageSize).limit(pageSize).collect(Collectors.toList())); return ApiResult.createSuccess(map);

Mac安装yarn的方法

@Mac安装yarn的方法 1、mac如果没安装过homeBrew先运行这个命令 /usr/bin/ruby -e “$(curl -fsSL http://cdn.jsdelivr.net/gh/ineo6/homebrew-install/install)” 安装完 关闭窗口重新打开 检查版本yarn --version 检查是否安装成功 2、安装过homeBrew的 可以直接通过homeBrew安装 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" npm install --global yarn yarn --version 装完之后 可以新建一个文件夹 右键打开黑窗口 yarn init 然后enter到底 再安装一下淘宝镜像: yarn config set registry https://registry.npm.taobao.org 3、用脚本直接安装 curl -o- -L https://yarnpkg.com/install.sh | bash yarn困扰我两天。百度很久 又一顿试终于好使了 下面是找的一些其它的关于yarn的 使用 brew 移除 yarn brew uninstall --force yarn npm r -g yarn 查询 yarn 的位置 which yarn /usr/local/bin/yarn 使用 rm 移除 yarn 和 yarnpkg

Spring Boot

1 什么是springboot ? 用来简化spring应用的初始搭建以及开发过程 使用特定的方式来进行配置(properties或yml文件) 创建独立的spring引用程序 main方法运行 嵌入的Tomcat 无需部署war文件 简化maven配置 自动配置spring添加对应功能starter自动化配置 答:spring boot来简化spring应用开发,约定大于配置,去繁从简,just run就能创建一个独立的,产品级别的应用 2 Springboot 有哪些优点? -快速创建独立运行的spring项目与主流框架集成 -使用嵌入式的servlet容器,应用无需打包成war包 -starters自动依赖与版本控制 -大量的自动配置,简化开发,也可修改默认值 -准生产环境的运行应用监控 -与云计算的天然集成 3 如何重新加载Spring Boot上的更改,而无需重新启动服务器? 这可以使用DEV工具来实现。通过这种依赖关系,您可以节省任何更改,嵌入式tomcat将重新启动。 Spring Boot有一个开发工具(DevTools)模块,它有助于提高开发人员的生产力。Java开发人员面临的一个主要挑战是将文件更改自动部署到服务器并自动重启服务器。 开发人员可以重新加载Spring Boot上的更改,而无需重新启动服务器。这将消除每次手动部署更改的需要。Spring Boot在发布它的第一个版本时没有这个功能。 这是开发人员最需要的功能。DevTools模块完全满足开发人员的需求。该模块将在生产环境中被禁用。它还提供H2数据库控制台以更好地测试应用程序。 org.springframework.boot spring-boot-devtools true 4 Spring Boot、Spring MVC 和 Spring 有什么区别? 1、Spring Spring最重要的特征是依赖注入。所有 SpringModules 不是依赖注入就是 IOC 控制反转。 当我们恰当的使用 DI 或者是 IOC 的时候,我们可以开发松耦合应用。松耦合应用的单元测试可以很容易的进行。 2、Spring MVC Spring MVC 提供了一种分离式的方法来开发 Web 应用。通过运用像 DispatcherServelet,MoudlAndView 和 ViewResolver 等一些简单的概念,开发 Web 应用将会变的非常简单。 3、SpringBoot Spring 和 SpringMVC 的问题在于需要配置大量的参数。

Sublime Text安装

下载链接: 链接:https://pan.baidu.com/s/1s19mToxdjMCfsnCQ50BozA 提取码:2022 1.鼠标右击【Sublime Text Build3207(64bit)】压缩包选择【解压到 Sublime Text Build3207(64bit)】。 2.打开解压后的文件夹,鼠标右击【sublime_text.exe】点击发送到桌面创建快捷方式即可。 3.安装成功。

一篇文章,带你了解CodeTour与入门指导

CodeTour(代码之旅)是微软官方开发的 VS Code 扩展,允许记录和回放代码的演练和思路。 简介 CodeTour 是一个 VS Code 插件,允许记录和回放代码库的演练和思路。我们通常都是通过代码注释或者文档来解释某段代码或方法的功能及逻辑,这样的方法相对简便,但是对阅读的人来说还不够友好,CodeTour 允许我们为代码添加备注,并且将这些备注串联起来,动态地展示我们的思路以及代码逻辑。 就像一个目录,可以轻松地加入到新的项目/功能,并且可视化错误报告或了解代码审查/PR 更改的上下文。"code tour"只是一系列交互步骤,每个步骤都与特定目录或文件/行进行关联,并包括对相应代码的描述。开发人员可以 clone 一个仓库,然后立即开始学习,而无需参考 CONTRIBUTING.md 文件或依赖他人的帮助。 CodeTour 是一个 Visual Studio Code 扩展,它允许您录制和播放代码库的引导式演练。它就像一个目录,可以更轻松地加入(或重新加入!)到新的项目/功能区域,可视化错误报告,或理解代码审查/PR更改的上下文。“代码导览”只是一系列交互式步骤,每个步骤都与特定目录或文件/行相关联,并包含相应代码的描述。这允许开发人员克隆存储库,然后立即开始学习它,而无需参考文件和/或依赖他人的帮助。游览可以签入存储库,以便与其他贡献者共享,也可以导出到“游览文件”中,该文件允许任何人重播相同的游览,而无需克隆任何代码来执行此操作! 项目地址:https://github.com/microsoft/codetour 入门 录制 单击树视图中的 + 按钮 CodeTour(如果它可见)或运行 CodeTour: Record Tour 命令。这将启动 CodeTour并输入此处编辑者的名字,这时候我们可以开始打开文件,单击要注释的行的“注释栏”,然后添加相应的描述。添加任意数量的步骤,完成后,单击停止。 录制时,CodeTour 树状视图将显示当前录制的预览,以及当前的一组步骤。可以知道当前正在进行哪个 tour 的录制。 如果需要在录制时编辑或删除步骤,单击 ... 步骤描述旁边的菜单,然后选择适当的操作,也可以从 CodeTour 树视图中查找编辑/删除步骤。 工作区 在录制时,系统会要求选择要将 tour 文件保存到的文件夹。这是必要的,因为 tour 作为文件写入工作区,需要明确 tour 应保存到哪个文件夹。 步骤标题 默认情况下,CodeTour 树使用以下显示名称格式显示每个游览步骤: # 步骤-文件名 #<stepNumber> - <filePath> 右键单击 CodeTour 树中的步骤并选择 Change Title 支持 Markdown 语法,可以使用任何标题级别。例如,如果添加一个描述以 ### Activation 开头的步骤,步骤和树视图将如下所示:

RK3588长按power键强制关机的按键时间设置

RK3588长按power键强制关机的按键时间设置 本文适用于RK3588+RK806(电源管理芯片)的方案,power(电源)键是直接控制RK806来控制RK3588的上下电,可以实现短按开机、长按强制断电关机的功能,可以通过控制RK806的寄存器来设置长按的时间长短。 RK3588按power键强制关机的按键时间设置 RK806的power键长按时间可以配置为如下几个值: 00: 6000ms,01: 8000ms,10: 10000ms,11: 12000ms 下面以配置12秒为例进行说明,其中PMIC是单pmic的方案,如果是双pmic的话需要修改rk3588-rk806-dual.dtsi :~/a2_Android13_29_sdk/kernel-5.10$ git diff diff --git a/arch/arm64/boot/dts/rockchip/rk3588-rk806-single.dtsi b/arch/arm64/boot/dts/rockchip/rk3588-rk806-single.dtsi index 62f3403789b7..48e28aa0c85f 100644 --- a/arch/arm64/boot/dts/rockchip/rk3588-rk806-single.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3588-rk806-single.dtsi @@ -44,6 +44,10 @@ */ pmic-reset-func = <1>; + /* PWRON_LP_OFF_TIME: PWRON long press time: + * 00: 6000ms, 01: 8000ms, 10: 10000ms, 11: 12000ms */ + pwron-lp-off-time = <12000>; + vcc1-supply = <&vcc5v0_sys>; vcc2-supply = <&vcc5v0_sys>; vcc3-supply = <&vcc5v0_sys>; diff --git a/drivers/mfd/rk806-core.c b/drivers/mfd/rk806-core.c index 5421ac95578f.

C++11下的单例模式

动机:在软件系统中,经常有这样一些特殊的类,必须保证它们在系统中只存在一个实例,才能确保它们的逻辑正确性、以及良好的效率。 绕过常规的构造器,提供一种机制来保证一个类只有一个实例。 定义:保证一个类仅有一个实例,并提供一个该实例的全局访问点。 1、C++11中可以保证static变量时多线程安全的,在底层实现了加锁操作,所以不需要像以前那样自己写加锁操作。 2、由于是一个static对象,可以保证对象只生成一次; 3、在程序结束的时候,系统会调用对应的析构函数;如果是new出来的对象,程序结束的时候,系统不会自动调用析构函数。 4、GetInstance()的返回值需要是指针或者引用,不然会出现值拷贝;最好是指针,用户使用起来会方便一些;如果返回指针每次使用该类的时候都需要GetInstance();返回指针就可以使用指针调用该类中的函数了。 class Singleton{ private: //默认构造和拷贝构造都需要是private Singleton(); Singleton(const Singleton& other); public: static Singleton* GetInstance(){ static Singleton instance; return &instance; } //member function void fun(){ cout<<"member function"<<endl; } }; int main(){ Singleton* p = Singleton::GetInstance(); p->fun(); //如果返回是引用 //Singleton::GetInstance().func(); } 以前的写法: 单线程安全+多线程安全(低效)+双检查锁 class Singleton{ private: Singleton(); Singleton(const Singleton& other); public: static Singleton* GetInstance(); static Singleton* instance_; }; Singleton* Singleton::instance_=nullptr; //线程非安全版本 Singleton* Singleton::GetInstance() { //在多线程的情况下,可能会出现这个对象被创建多次的情况 if(instance_ == nullptr){ 在执行下一行代码之前可能会抢进来多个线程,导致创建多个实例 instance_=new Singleton; } return instance_; } //线程安全版本,但锁的代价过高 // Singleton* GetInstance(){ Lock lock; if(instance_==nullptr){ instance_=new Singleton; } return instance_; } //双检查锁,但由于内存读写reorder不安全(volatile) Singleton* GetInstance(){ //第一个检查,如果只是读操作,就不许用加锁 if(instance_==nullptr){ Lock lock; //第二个检查,保证只有一个 if(instance_==nullptr){ instance_=new Singleton; } } return instance_; }

nginx配置rtmp的配置文件

worker_processes auto; #worker_processes auto; #1.3.8和1.2.5以及之后的版本 #错误日志存放的路径 error_log logs/error.log error; #error_log logs/error.log error; #error_log logs/error.log error; #允许的最大连接数 events { worker_connections 4096; } http { #文件扩展名与文件类型映射表 include mime.types; #默认的文件类型 default_type application/octet-stream; #长连接超时时间 keepalive_timeout 65; server { #监听端口 listen 8088; location / { root html; } #域名 server_name localhost; #50x页面设置 error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } location /live { flv_live on; #打开HTTP播放FLV直播流功能 chunked_transfer_encoding on; #支持'Transfer-Encoding: chunked'方式回复 add_header 'Access-Control-Allow-Origin' '*'; #添加额外的HTTP头 add_header 'Access-Control-Allow-Credentials' 'true'; #添加额外的HTTP头 } location /hls { types { application/vnd.

js 实现元素拖拽

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <style> html,body{ /*必须使用此CSS,否则body上的事件无效*/ width:100%; height:100%; } #dd{ width:120px; height:120px; background:#00ff00; position:absolute; } </style> <script> var dd; //要拖动的div引用 var mflag=false; //移动标志位 function ondown(){ dd=document.getElementById('dd'); mflag=true; } function onmove(e){ if(mflag){ dd.style.left=e.clientX-60+"px"; //-60是为了把鼠标放在div的中心 dd.style.top=e.clientY-60+"px"; } } function onup(){ mflag=false; } </script> </head> <body onmousemove="onmove(event)"> <!-- 放在body上是为了鼠标快速移动时不会脱离div --> <div id='dd' onmousedown='ondown()' onmouseup='onup()' style='left:80px; top:120px;'> </div> </body> </html>

Quartus基础05

不建议用quartus13以前的版本(旧版带的USB blaster驱动可能在WIN8、WIN10上面安装不了),还有quartus13及以后的版本都把IDE和器件包分成两部分,记得下载器件包。此外,quartus13.0sp1是最后一个支持cyclone II的版本。 1、AHDL文件,用于编写Altera发明的AHDL语言,此语言已经被淘汰,可以不管它。 2、Block Diagram/Schematic文件,原理图文件,跟AD、PADS、Cadence等电路图设计软件的用法差不多。 3、EDIF文件,网表文件。 4、Qsys system文件,用于设计软核,Qsys前身是NIOS。 5、State Machine文件,状态机文件。 6、System Verilog文件,用于系统级验证。 7、Tcl script文件,TCL脚本文件。 8和9、常用的HDL文件(包括verilog和VHDL) 10是十六进制文件,11是MIF文件,用于ROM或RAM的初始化。 12、Probe文件,用于观察FPGA内部某一信号,一般用Signaltap 13、 逻辑分析仪接口文件,暂时不知道有什么用。 14、VWF文件,用于调用quartus自带的仿真工具QSIM 15、AHDL头文件,可以不管它。 16、原理图的Symbol文件,用于编辑原理图Symbol,跟你用电路图设计软件时,画原理图库差不多。 17、JTAG链描述文件,给一个或多个芯片下载代码时用的。 18、Synopsys约束文件,时序约束用的SDC文件。 19、txt文件。 特别要注意一下,不同类型的文件,名字最好不一样。比如,已经有了test.v,就不要用弄test.vwf,不然你双击test的原理图Symbol的时候,会问你要打开test.v还是test.vwf,让你浪费不必要时间。我一般是除了.v或.vhd文件用test之外,vwf就用test_vwf.vwf,bdf就用test_top.bdf。 特别要说明两个symbol,VCC代表高电平,GND代表低电平,可用于使能或者其它用途。 调用quartus自带的IP核,也叫宏功能模块(LPM) 原理图symbol之间的连线要注意一下位宽,不然会出错。也可以使用网络标号,先把线引出来,选中线,再输入网格标号就可以了,但是要注意一下格式,如:qout是8位,网络标号就要写成qout[7..0]。也有些特殊用法。symbol则只连了[63..32]这几个脚 下载完之后,FPGA并不直接运行代码,需要先断电,再上电,FPGA才正常工作。 1、电路占用了62个LE。 2、电路占用了43个组合电路。 3、电路占用了55个专用的寄存器。 4、整个电路占用了55个寄存器。 5、电路使用了31个引脚,我的FPGA是EP2C8Q208C8N,一共有208个引脚,其中138个引脚是可用的。 6、电路使用了0个虚拟引脚,虚拟引脚是前期设计时,预先分配的,可以解决引脚不够用导致无法综合的问题。 7、电路使用的内存为0 bit,这里memory是指FPGA内部的存储单元,包括ROM和RAM,其中RAM指的是块RAM而不是分布式RAM,因为分布式RAM是用LE实现的。 8、电路使用了0个PLL,我这芯片一共有2个PLL,PLL是固核(也可以认为是硬核,硬核和固核的分界线并不是很明确),可以配置一下就调用,某些FPGA会有4个或更多的PLL固核。

Android | 电脑cmd中使用adb命令安装apk

目录 一、使用步骤二、常见问题2.1 adb: failed to install xxx.apk: Failure [INSTALL_FAILED_UPDATE_INCOMPATIBLE: Package com.xxx.xxx.xxx signatures do not match previously installed version; ignoring!]2.2 error: cannot connect to daemon 三、参考文献 还挺常用的,不想每次都重复搜那几条命令了,这里记录一下咯。 一、使用步骤 前提条件:本地有adb,检验方法:在cmd输入 adb version,如果没正常显示版本号,那你乖乖去下载,或者你觉得下载了但就是找不到adb,可以检查一下你的环境变量是不是没存adb.exe的路径; 打开cmd。如果后面输入命令不生效,可以考虑用管理员身份打开cmd; 安卓手机连接数据线 + 打开开发者模式 + 勾选USB调试/安装。不同手机的开发者模式打开位置不一样,不过一般是在:设置 → 开发者选项 → 打开USB调试、USB安装; 检查手机电脑是否成功连接,输入 adb devices,会出现本电脑连接的设备; 安装apk命令是 adb install apk地址,或者直接拖进来 覆盖安装 / 重装:apk adb install -r apk地址,同样也可以拖进去。 二、常见问题 2.1 adb: failed to install xxx.apk: Failure [INSTALL_FAILED_UPDATE_INCOMPATIBLE: Package com.xxx.xxx.xxx signatures do not match previously installed version; ignoring!

使用DESeq2进行转录组原始count标准化和差异分析

转录组测序完成后,一般我们会获得一个原始 read count表达矩阵,其中行是基因,列是样品。常用的差异分析工具包括limma、edgeR和DESeq2。DESeq2在测序领域使用最为广泛(google scholar引用高达43284次,edgeR为28076次)。小编今天给大家介绍下我们的在线DESeq2差异分析模块,小伙伴们可以零代码进行GEO数据库表达矩阵的挖掘,后续再利用我们平台的各种绘图模块出图,大大加速了我们的科学研究。 1.打开绘图页面 首先,使用浏览器(推荐chrome或者edge)打开DESeq2差异分析页面。左侧为常见作图导航,中间为数据输入框和可选参数,右侧为描述和结果示例。也可以在搜索框中搜索deseq2,找到分析页面。 微生信-在线转录组(mRNA-seq等)raw counts DESeq2标准化及差异表达分析 图1,DESeq2分析页面 2,示例数据 点击右侧“示例数据”链接下载excel格式的示例数据。 图2. Raw count输入数据示例 示例raw count矩阵包括8列: 第1列是基因id,必需唯一; 第2-4列是DHT组3个样品; 第5-8列是Control组4个样品。 图3. 比较方案输入数据示例 示例分组比较方案包括5列: 第1列是实验组的样品列表,共3个,英文逗号分隔 第2列是对照组的样品列表,共4个,英文逗号分隔 第3列是实验组组名 第4列是对照组组名 第5列是样品配对与否,unpaired表示非配对,paired表示配对。例如从1号、2号、3号共三个患者身上分别取癌症样品cancer1,cancer2,cancer3,对照样品norm1,norm2,norm3,那么paired配对比较时,顺序不能变,即:1号患者的cancer1,对应1号患者的norm1;2号患者的cancer2对应2号患者的norm2;3号患者的cancer3对应3号患者的norm3。而非配对比较(unpaired)则不考虑这种对应关系。 3,粘贴示例数据 拷贝示例数据中A-H列的raw count数据,粘贴到矩阵输入框。 拷贝J-N列的比较信息,粘贴到比较输入框。 注意:不是拷贝excel文件,是拷贝excel文件里边的数据。另外粘贴到输入框后,格式乱了没关系,只要在excel中是整齐的就行。同时数据矩阵中不能有空的单元格,中文字符等。 图4. 必需输入-raw count矩阵 图5. 必需输入-比较方案 4,修改参数,并提交 我们设置了原始count数之和的过滤最小过滤参数,默认不过滤。 图6.过滤参数 5,提交获得结果 粘贴好输入数据,调整好参数后,点击提交按钮,约60秒钟后,会在页面右侧出现结果下载链接。下载并解压后,可以使用excel打开并利用筛选功能根据fold change和p值筛选差异表达基因,绘制热图,火山图,进行功能富集分析。 图7.结果下载 结果说明 由于我们未对低表达值进行过滤,因此,输入矩阵是多少个基因,分析结果也是多少个基因。 第1个sheet是表达谱,包括原始count和标准化count 第2+个sheet是差异总表。 图8. 差异结果 Fold change:两组间的倍数变化。正表示上调,负表示下调 Log2FoldChange:log2转化的倍数变化。正表示上调,负表示下调 Pvalue:p值 Padj:校正的p值 Regulation:上调或下调 *(mean):各组的标准化表达均值 不同平台相互印证测试 除了阅读DESeq2官方文档并使用官方代码外,我们还使用相同的raw count矩阵测试了其他4个第三方平台:DEApp,基迪奥,欧易,sangerbox。在这5个平台中,微生信的结果和sangerbox完全一样,而与其他3个平台的结果均略有差异(见图9)。图中所示785个基因是4种平台共有的,约占90%以上。 图9. 4种平台上调结果比较 究其原因,可能主要是内部filter过滤参数不一致造成的。在DESeq2官方文档中:While it is not necessary to pre-filter low count genes before running the DESeq2 functions, there are two reasons which make pre-filtering useful: by removing rows in which there are very few reads, we reduce the memory size of the dds data object, and we increase the speed of the transformation and testing functions within DESeq2.

去水印神器(Lama Cleaner)

Lama Cleaner 功能:可以帮助我们去掉图片中不想要的东西,比如:水印、背景中的人等等 使用: 首先,Python新建一个虚拟环境创建成功后,激活虚拟环境,安装库,如下面的两条命令pip install lama-cleaner # 需要一段时间,才能下载成功 # 开始运行,第一次运行会从github上下载模型,注意网络的问题 lama-cleaner --model=lama --device=cpu --port=8080 执行命令之后,终端会显示一个IP和Port,打开浏览器访问即可 转载:https://blog.csdn.net/c406495762

根据ID取商品详情原数据 API 返回值说明

公共参数 请求地址: https://api-gw.onebound.cn/pinduoduo/item_get_app 名称类型必须描述keyString是调用key(必须以GET方式拼接在URL中)secretString是调用密钥api_nameString是API接口名称(包括在请求地址中)[item_search,item_get,item_search_shop等]cacheString否[yes,no]默认yes,将调用缓存的数据,速度比较快result_typeString否[json,jsonu,xml,serialize,var_export]返回数据格式,默认为json,jsonu输出的内容中文可以直接阅读langString否[cn,en,ru]翻译语言,默认cn简体中文versionString否API版本 请求参数 请求参数:keyword=海澜之家&q=&num_iids=&start_price=&end_price=&seller=&page=1&cat=0&sort=&page_size= 参数说明:keyword:关键字【必须】 响应参数 Version: Date: 名称类型必须示例值描述 title String02019新款女装短袖t恤女夏宽松韩版休闲上衣百搭蝙蝠衫五分袖体恤商品标题 pic_url String0https://t00img.yangkeduo.com/t03img/images/2018-06-28/acba82293a8db850110c5043ea7d9824.jpeg宝贝图片 price Float020.9价格 sales Int014830销量 num_iid Bigint01999629976宝贝ID sample_id String0商品风格标识ID seller_nick String0雅怡服饰1688掌柜昵称 post_fee Float0物流费用 area String0店铺所在地 detail_url String0http://yangkeduo.com/goods.html?goods_id=1999629976宝贝链接 响应示例 { "item": { "SourceType": 6, "OfferId": 1620002566, "CategoryId": 8484, "Subject": "【2件套】套装秋冬新款仿獭兔毛钉珠皮草毛毛短外套加厚大衣女装", "ImageUrls": [ "https://omsproductionimg.yangkeduo.com/images/2017-12-12/bcf848aa71c6389607ae7a84b70f1543.jpeg", "https://omsproductionimg.yangkeduo.com/images/2017-12-12/176019babfdecffa1d9f98f40b7e99b4.jpeg", "https://omsproductionimg.yangkeduo.com/images/2017-12-12/efb5db42397550bffd3211ca6f197498.jpeg", "https://omsproductionimg.yangkeduo.com/images/2017-12-12/d209ef7bcc9183c3bb8ca1dfdb108d49.jpeg", "https://omsproductionimg.yangkeduo.com/images/2017-12-12/74257ab65f3f00da7a90fde9042fe640.jpeg", "https://t00img.yangkeduo.com/goods/images/2019-08-17/e8fbd9cb-cc74-4caa-9380-84c46d27b008.jpg", "https://t00img.yangkeduo.com/goods/images/2019-08-17/d76f515b-e375-4060-b94e-cf64f6b0964e.jpg", "https://t00img.yangkeduo.com/goods/images/2019-08-17/f2f279b5-6000-4fbe-b99b-7c1cbd7884ea.jpg" ], "SkuProps": [ { "IsImg": true, "Prop": "颜色", "Value": [ { "name": "粉色两件套(外套+裙子)", "value": "1215:1115500378", "imageUrl": "

前端不同尺寸单位的区别和使用

前言 一直搞不懂pc端、移动端、小程序、不同设备适配 要使用不同的单位表示不理解,今天,我就磕到底整明白它! 以下内容来自于作者:茧君 前端常见的尺寸单位 常见单位有:px、rpx、em、rem、%、vw、vh、vm 一、px px是像素单位,是指设备或图片中最小的一个点,它是一种相对长度,是相对于显示器屏幕分辨率而言的。不同的设备在大小宽高相同时,它们的物理像素大小也可能是不同的,物理像素越高的设备单位面积内存放的像素点就高,因此画面看起来更精细。通常情况下在pc端,css的px就接近于实际像素大小,但是在移动设备上,根据不同机型的分辨率大小,css中的一个px可能就会对应不同数量的物理像素点。 特点:网页设计的常用单位,也是基本单位,用px可以固定设置布局或元素的大小。 缺点:没有弹性,大小死板,使用多端的页面上时,无法做到适应效果,如果从pc端切向移动端时样式会乱掉,纯pc端不会出现这样的问题。 二、% %百分比 顾名思义百分比的单位 %一般是相对于父元素为基础的,如给一个元素margin-left为百分比,它会去寻找该元素的父元素以百分比形式计算,但也有几点例外,如: 对于position:absolute就是相对于已经定位的父亲 对于position:fixed就是对于ViewPort(视图) 对于transform2D水平移动变化来说就是相对于自身 三、vh vh是css3新增单位view height的缩写 vh指的是视图高度,vh类似于一种百分比的单位,他相对于视图的高度,将视图的高度分为100份,10vh也就是占用视图的10% 举例:900px高度的视窗 1vh=9px 四、vw vw是css3新增单位view width的缩写,vw指的是视图宽度,和vh类似 五、vm vm是css3新增单位,vm是在视图中选取 宽度和高度最小的那一个,然后像vw、vh一样将其分为100等份 举例:1200px宽 900px高 的视图就是 1vm=9px 六、em em相对长度单位 em是相对于字体大小来计算的一个尺寸,他是字体大小的倍数、如em相对的字体大小为16px,那么1rem = 16px 使用em单位的元素如果自身设置了字体大小,那么就相对于自身计算,如果自身没有设置字体大小那么就会继承父元素的字体大小,如果父元素没有设置,就会依次向上寻找(因为字体大小是会被继承的),如果页面中没有设置字体大小,那么就会以浏览器的默认字体大小16px为基准 七、rem rem css3新增相对长度单位 rem和em类似都是相对长度单位,但是rem只会相对于html根元素的字体大小,也就是说如果根元素字体设置为18px,那么全局内rem的值换算都为1rem = 18px 补充: rem在制作响应式页面中经常使用到,因为我们可以根据不同的设备尺寸,去动态的调整根元素的大小,使用rem单位达到适配不同尺寸设备的效果,有些自适应的页面框架单位上的使用就是基于此种特性有时我们为了换算方便会将根元素的字体大小先设置为62.5%,然后根据需要进行调整,原因是62.5%*16px = 10px,此时也就是1rem = 10px 八、 rpx(upx) rpx 响应式px单位 由小程序最先提出的响应式px单位,为了解决px在移动端上不同的机型极容易出现的变形问题 以uniapp对rpx的实现为例子: uniapp规定屏幕的基准宽度为750rpx,开发者可以自己通过设计稿的基准宽度来计算页面的rpx值具体等于多少px 公式如下: 设计稿 1px / 设计稿基准宽度 = 框架样式1rpx / 750 rpx 复制代码 也就是说 使用rpx单位元素的大小的计算公式为

sklearn下载数据集时的HTTPError: HTTP Error 403: Forbidden(已解决)

目录 问题如下: 尝试1:重建dns缓存 无奈的解决方式: 问题如下: 尝试1:重建dns缓存 对于一些常规的403 forbidden错误,马海祥建议大家首先要尝试的就是重建dns缓存,在运行中输入cmd,然后输入ipconfig /flushdns即可。如果不行的话,就需要在hosts文件里把主页解析一下了。 导致403错误的原因和解决方法 - 知乎 (zhihu.com) 再运行仍然报此错。 无奈的解决方式: 离线下载数据集。 链接:https://pan.baidu.com/s/19GHJjfGlWD-zfoxYDd4VuA 提取码:2022 将下载好的文件解压到如下文件夹中: sklearn导入人脸图片fetch_lfw_people出错如何解决? - 知乎 (zhihu.com)

vue3的unplugin-auto-import自动引入

vue3日常项目中定义变量需要引入ref,reactive等等比较麻烦,可以通过unplugin-auto-import给我们自动引入 1、安装 npm i -D unplugin-auto-import 2、在vite.config.ts中引入 import AutoImport from 'unplugin-auto-import/vite' 并在plugins中配置: export default defineConfig({ plugins: [ ...... AutoImport({ imports: ['vue'], dts: 'src/auto-import.d.ts', }) ] }) AutoImport中可以有很多配置项,可以到github中看详细配置: GitHub - antfu/unplugin-auto-import: Auto import APIs on-demand for Vite, Webpack and Rollup 注:dts是帮我们生成的类型声明文件,直接使用会找不到 上面配置完毕后会在src目录下生成一个auto-import.d.ts文件,里面帮我们自动引入vue相关内容,我们可以在项目中直接使用。 注意:上面配置完毕dts后可能并不会自动生成auto-import.d.ts文件,可以重新运行一下项目,或者关闭编辑器重新打开运行即可。 使用如下: <script setup lang="ts"> // 这里我们不用引入ref直接使用 const msg = ref<string>('Hello Vue3') </script> <template> {{ msg }} </template> <style scoped lang="scss"></style>