leetcode3. 无重复字符的最长子串

给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。 示例 1: 输入: s = “abcabcbb” 输出: 3 解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。 示例 2: 输入: s = “bbbbb” 输出: 1 解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。 示例 3: 输入: s = “pwwkew” 输出: 3 解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。 请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。 示例 4: 输入: s = “” 输出: 0 提示: 0 <= s.length <= 5 * 104 s 由英文字母、数字、符号和空格组成 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 class Solution { public int lengthOfLongestSubstring(String s) { if (s == null) { return 0; } int result = 0; String temp = "

leetcode215. 数组中的第K个最大元素

在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。 示例 1: 输入: [3,2,1,5,6,4] 和 k = 2 输出: 5 示例 2: 输入: [3,2,3,1,2,4,5,5,6] 和 k = 4 输出: 4 说明: 你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度。 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/kth-largest-element-in-an-array class Solution { public int findKthLargest(int[] nums, int k) { PriorityQueue<Integer> priorityQueue = new PriorityQueue<Integer>(k*2); for (int i:nums) { priorityQueue.add(i); if (priorityQueue.size() > k) { priorityQueue.poll(); } } Integer result = priorityQueue.

vue中watch的deep属性深度监听数组对象

<template> <div id="app"> <ul> <li v-for="item in list" :v-key="item.id">{{item.name}}</li> </ul> <div> <input type="text" v-model="value" /> <button @click="add()">添加</button> <button @click="change()">改变</button> </div> </div> </template> <script> export default { name: 'App', components: {}, data() { return { list: [{ id: 1, name: '张三' }, { id: 2, name: '李四', ceshi:0, list:[ { a:0 } ] } ], value: '45' } }, created() { }, mounted() { }, watch: { list: { handler(newName, oldName) { console.

数据库——底层原理

数据库 1.底层数据结构 B树是树的衍生,所以我打算从树开始讲起。 树我们都不陌生,有一个根节点,从根结点出发有他的孩子节点。但是简单的一棵树并没有什么特点,可能很难被实际应用。 之后出现了二叉树,这种树的每个节点最多只有两个孩子,这样一来,通过二叉树来实现二叉查找很大的提高了查找的速度。但是又有一个新问题出现了,除非二叉树被事先给出,否则二叉树可能会退化为链表。 再后来,为了解决退化问题,平衡二叉树被设计了出来,能够自动的根据树的高度来调节结点,使树上的节点分布均匀。再后来,不止对平衡二叉树进行查询操作,增加和删除结点效率的要求也提高了,因为如果要进行删除和增加节点,就需要维护这个二叉树保持原来的特点。 最后,为了解决增加和删除结点的效率,红黑树又出现了,在查询效率上,二者可能差不多,但是在修改结点的效率上,存在很大的差异。 (转载)红黑树和平衡二叉树的区别 随着大数据时代的到来,动辄就是千百万的数据量,使用二叉树来组织数据根本行不通,因为根据满二叉树的计算n = Log(2,N),查询时间还是不理想。 B树 关于B树的特点都已经展示在图中。为了降低二叉树的层数,在B书中,每个“结点”不止存放一个数据,目的就是为了增大每个结点所能容纳的数据量,降低树的层数。 (关于B树的严格定义请自行百度) 每层包括N个实体结点和N+1个指针结点每层结点都按照结点的Key值非递减的顺序排列在Key值之间存在一个指针指向下一层结点,其中的Key值自然也是处于上层两个Key值之间每个结点都直接带有自己的Data对应每条记录都遍布在整个树中 B+树 B+树很大程度上是为了满足范围查找的需要,所以用双链表将所有的叶子结点都串起来;而且根据在磁盘I/O上所花的时间,要尽可能的减少磁盘I/O(每层的一个大结点通常被安排在一块物理内存上),所以会将所有的实体记录放在叶子节点上,非叶节点只存放键Key,不存放Data,这样一层的大结点能够存放更多的结点Key值,从而相应的减少磁盘I/O提高性能。 (关于B+树的严格定义请自行百度) 真实结点只放在叶子节点上,非叶节点只存放Key值用双链表将叶子节点串联(这里还推荐使用Mysql中的自增主键,因为在随机插入时,难免会引起当前节点已经放满,再放时会出现分裂的操作,而按顺序递增的插入只会再最右边插入结点,并不会有分裂操作,效率较高) 2.Mysql数据库引擎 Innodb:Data数据直接存在于索引的叶节点中,支持事务,聚簇索引(数据和索引放一起,默认是主键完成,再次唯一非空索引,隐式索引,均称为辅助索引),不支持全文索引,最小粒度行锁 MyIsam:叶节点中只存放了Data的指针,不支持事务,非聚簇索引(数据和索引不放一起,存放地址),支持全文索引,最小粒度表锁 3.最左前缀优化原则 在生成索引时,如果是联合索引,则将会根据联合索引声明的顺序组织B+树的非叶节点,所以在使用Select在索引上查询时,会根据联合索引的顺序对每层节点进行排序,这才需要在使用Select语句时,注意是否使用了索引。 (未完待续。。。) 4.覆盖索引

shell脚本读取文件的三种方法

最近做小项目需要用到shell脚本写测试用例, 所以首先要知道shell该怎么读取文件, 为了以后能更容易复习,就把它记录了下来。 第一种: #!/bin/bash while read line do echo $line done < filename 示例:要读取的文件我这里四test.txt 首先vi 新建一个文件.sh结尾 然后照着上面的方法编写脚本 test.txt里面的内容 这就是读取结果,./pro.sh就能执行了,在执行之前需要加执行权限 第二种: #!/bin/bash cat filename | while read line do echo $line done 第三种: #!/bin/bash for line in `cat filename` do echo $line done 还有一种以文件描述符方式的,但是我没怎么用过就不写了,以上三种就是比较常用的shell读文件的方法

Latex的图片、文献、引用跳转链接

使用链接跳转需要使用宏包hyperref \usepackage[colorlinks, linkcolor=blue, anchorcolor=blue, citecolor=red ]{hyperref} clolorlink的意思是将超链接以颜色来标识,而并非使用默认的方框来标识。 linkcolor, anchorcolor, citecolor分别表示标识link, anchor, cite等各种链接的颜色。 若不想使用彩色,就使用black即可

oracle ojvm组件安装,Patch 28790660 - Oracle JavaVM Component 11.2.0.4.190115 Database PSU 在oracle rac环境...

OJVM补丁说明 OJVM PSU主要是针对oracle java VM。从2014年10月开始Oracle JavaVM组件作为一个单独的部分来进行安装。之前是包含在oracle rdbms psu中。 只要oracle db中安装jvm组件,就需要安装对应版本的oracle JavaVM PSU。如果只是打了rdbms的PSU,安全漏洞检查就会检查出jvm的安全漏洞。 本文对Patch 28790660 升级过程进行说明 在oracle mos下载p28980134 patch包,包含28790660 ojvm psu包,上传并解压补丁包: unzip -d /tmp p28980134_112040_Linux-x86-64.zip 检查验证补丁 cd /tmp/28980134/28790660 [oracle@DB1 28790660]$ /oracle/app/oracle/product/11.2.0/db_1/OPatch/opatch prereq CheckConflictAgainstOHWithDetail -ph ./ Oracle 中间补丁程序安装程序版本 11.2.0.3.6 版权所有 (c) 2013, Oracle Corporation。保留所有权利。 PREREQ session Oracle Home : /oracle/app/oracle/product/11.2.0/db_1 Central Inventory : /oracle/app/oraInventory from : /oracle/app/oracle/product/11.2.0/db_1/oraInst.loc OPatch version : 11.2.0.3.6 OUI version : 11.2.0.4.0 Log file location : /oracle/app/oracle/product/11.2.0/db_1/cfgtoollogs/opatch/opatch2020-03-05_22-24-27下午_1.log Invoking prereq "

burp Suite(四)抓到流量才是好汉

一、浏览器抓包设置 firefox and chrome 见安全测试必备工具之burp Suite(一) 二、app/miniapp抓包 mumu 安卓模拟器抓包 指路:mumu android版本:6.0.1 逍遥模拟器设置类似逍遥,支持设置android版本 mumu设置代理 burp监听同一个IP和端口 mumu安装证书,通过文件共享的方式导入证书 打开共享文件夹安装证书 需要先设置锁屏密码 随便打开一个app,可以正常拦到https数据包 安卓7.0以上https抓包 在模拟器或者手机中,部分app/miniapp可正常抓包,但有些不可以。为解决这些不可以的,测试使用其他方式。 模拟器/设备root 安装系统根证书VirtualXposed 和 JustTrustMe 抓包 实验1 测试对象:某 app、某微信小程序 测试设备:mumu模拟器,android6.0.1 测试结果:可直接安装证书抓包 问题:mumu模拟器安装新版本wx,但是wx小程序不能搜索,只能使用以前用过的。在其他手机上搜索了,再用mumu打开,需要设备切换,略麻烦。 实验2 测试对象:某 app、某微信小程序 测试设备:逍遥模拟器 测试方式:安装系统根证书 1、先正常安装burp cer格式证书(der重命名一下) 2、应用市场搜索re文件管理器 3、re文件管理器 进入:/data/misc/user/0/cacerts-added 这个文件夹下(该目录存储的是用户自己安装的证书文件)复制.0文件到到系统证书目录/etc/security/cacerts 下(re文件管理器需要挂载读写权限、模拟器中自带root管理授权即可) 4、抓包测试 测试结果:某 app能正常抓取流量,某小程序抓不到 根据查找资料猜测:微信7.0版本无法抓取HTTPS数据包。 所以,得换一个较低版本的微信 实验3 测试对象:某 app、某微信小程序 测试设备:逍遥模拟器 测试方式:安装系统根证书 1、下载一个微信6.7.3的版本 2、卸载之前的微信,安装老版本 测试结果:某小程序可正常抓取流量,但是部分图片加载不出来,勉强能用了。且发现部分小程序不支持在低版本微信上运行,抓包问题没有彻底解决。 IOS流量抓包 设备:iphone6s(ios没有模拟器) 1、iphone导入burp证书 2、打开iphone 设置-通用–描述文件与设备管理–PortSwiggerCA-安装 设置-通用–关于本机–证书信任设置–信任 PortSwiggerCA证书 注意: (1)ios支付功能都走苹果内购,苹果不信任burp证书,测不了支付 (2)有些应用不能抓包 总结 老折腾了。。。。。。凑合着用吧 如果burp抓不到包,要先排查问题:

C语言-每天认识一个排序算法之希尔排序(二)

希尔排序 希尔排序又称为“缩小增量排序”,它是对直接插入排序算法的改进。 希尔排序的基本思想是:先将整个待排记录序列分割成若干子序列,然后分别进行直接插入排序,待整个序列中的记录基本有序时,再进行一次直接插入排序。这是它的基本思想。最后我们所取的增量应为1. void ShellSort(int arr[], int n) { int i, j, d; d = n / 2; /*确定固定增量值*/ while (d >= 1) { for (i = d + 1; i <= n; i++) /*数组下标从d+1开始进行直接插入排序*/ { arr[0] = arr[i]; /*设置监视哨*/ j = i - d; /*确定要进行比较的元素的最右边位置*/ while ((j > 0) && (arr[0] < arr[j])) { arr[j + d] = arr[j]; /*数据右移*/ j = j - d ; /*向左移d个位置V*/ } arr[j + d] = arr[0]; /*在确定的位罝插入arr[i]*/ } d = d / 2; /*增量变为原来的一半*/ } } 因为设置了监视哨,所以传入数组的第一个数要专门留下来给监视哨使用。

【Java基础】Java多线程编程:Thread、Runnable与Callable、线程的同步、异步与死锁、生产者与消费者案例

《第一行代码:Java》第9章、多线程 读书笔记 文章目录 第9章、多线程9.1 线程与进程9.2 多线程实现继承Thread类实现Runnable接口多线程两种实现方式的区别利用Callable接口实现多线程线程的操作状态 9.3 多线程常用操作线程的命名与取得线程休眠线程优先级 9.4 线程的同步与死锁同步问题的引出同步操作死锁 9.5 生产者与消费者案例问题的引出解决数据错乱问题解决数据重复问题 9.6 线程的生命周期本章小结 第9章、多线程 9.1 线程与进程 这里简单介绍一下线程与进程的基本概念。想深入了解建议学习一下操作系统。 进程:是程序的一次动态执行的过程,他经历了从代码加载、执行到执行完毕的一个完整过程。 进程的五状态模型: 线程:和进程一样都是实现并发的一个基本单位,线程是在进程的基础上进一步的划分。比如在使用QQ同时进行视频对话、文字聊天和文件传输,则QQ这个程序的执行就是一个进程,而这个进程又划分为视频对话、文字聊天和文件传输3个线程。 进程与线程:线程依附于进程,线程是程序执行流的最小单位,进程是资源分配的基本单位,所以一旦进程消失,线程也会消失。 并发与并行:两者在宏观上都是同时进行的意思,但并发在微观上并不是“同时”的,而是指多个任务交替使用CPU,同一时刻还是只有一个任务在跑,并行是多个任务同时执行。(对于单核CPU) 9.2 多线程实现 在Java中,如果想要实现多线程的程序,就必须依靠一个线程的主体类(就好比主类的概念一样,表示的是一个线程的主类)。但这个线程的主体类在定义时也需要有一些特殊的要求,即此类需要继承Thread类或实现Runnable(Callable)接口来完成定义。 继承Thread类 java.lang.Thread是一个负责线程操作的类,任何类只要继承Thread类就可以成为一个线程的主类。既然是主类就必须要有它的使用方法,而线程启动的主方法需要覆写Thread类中的run()方法实现。 线程主体类的定义格式如下: class 类名称 extends Thread { // 继承Thread类 属性; // 类中定义属性 方法; // 类中定义方法 public void run(){ // 覆写Thread类中的fun()方法,此方法是线程的主体 线程主体方法; } } 定义一个线程操作类: class MyThread extends Thread { // 这就是一个多线程的操作类 private String name ; // 定义类中的属性 public MyThread(String name) { // 定义构造方法 this.

<leetcode>76最小覆盖字符串(滑动窗口)

题目描述 给定两个字符串 S 和 T,求 S 中包含 T 所有字符的最短连续子字符串的长度,同时要求时间 复杂度不得超过 O„n”。 输入输出样例 输入是两个字符串 S 和 T,输出是一个 S 字符串的子串。 Input: S = "ADOBECODEBANC", T = "ABC" Output: "BANC" 在这个样例中, S 中同时包含一个 A、一个 B、一个 C 的最短子字符串是“BANC”。 题解 本题使用滑动窗口求解,即两个指针 l 和 r 都是从最左端向最右端移动,且 l 的位置一定在 r 的左边或重合。注意本题虽然在 for 循环里出现了一个 while 循环,但是因为 while 循环负责移 动 l 指针,且 l 只会从左到右移动一次,因此总时间复杂度仍然是 O„n”。本题使用了长度为 128 的数组来映射字符,也可以用哈希表替代;其中 chars 表示目前每个字符缺少的数量, flag 表示 每个字符是否在 T 中存在。 class Solution { public: string minWindow(string s, string t) { vector<int> chars(128,0); vector<bool> flag(128,false); for(int i = 0;i< t.

oracle数据库xdb,jvm和xdb组件 - Oracle数据库管理 - Oracle数据库数据恢复、性能优化来问问AskMaclean - ParnassusData诗檀软件旗下网站 - M...

各主流版本DB software 中组件component 的依赖关系 Component Dependecies in 10.1 RDBMS (Oracle Server) is the base component Stand alone components (no dependencies): JAVAVM, XDB, EM, OLAP, LABEL SECURITY, OWM, RAC XML requires JAVAVM DATA MINING requires JAVAVM and XDB SPATIAL DATA requires DATA MINING, JAVAVM, XDB, XML CONTEXT requires DATA MINING APEX requires CONTEXT and XDB EXPRESSION FILTER requires JAVAVM INTERMEDIA/MULTIMEDIA requires JAVAVM, XDB, XML ULTRA SEARCH requires JAVAVM OALP API (XOQ) requires XML and XDB (and XS)

Method breakpoints may dramatically slow down debugging 的解决办法

问题概述 在Intellij IDEA 中项目工程模块编码完成后,Debug模式启动,一直启动不起来,也不报任何错误,因为项目工程的持久层使用的是MyBatis-Plus,只启动到MyBatis-Plus项就不往下走了,一直卡在哪儿,提示 “ Method breakpoints may dramatically slow down debugging ”,如下图: 解决办法 根据提示内容得知,在打开Intellij IDEA的断点视图,单击左栏两个红色实心圆除,或者直接快捷键 “ Ctrl + Shift + F8 ” 打开,如下图: 打开后,果然发现了一个方法断点,直接点击它,取消掉这个方法断点,就可以了,如下图: 好了,关于 Method breakpoints may dramatically slow down debugging 的解决办法 就写到这儿了,如果还有什么疑问或遇到什么问题欢迎扫码提问,也可以给我留言哦,我会一一详细的解答的。 歇后语:“ 共同学习,共同进步 ”,也希望大家多多关注CSND的IT社区。 作 者:华 仔联系作者:who.seek.me@java98k.vip来 源:CSDN (Chinese Software Developer Network)原 文:https://blog.csdn.net/Hello_World_QWP/article/details/115241581版权声明:本文为博主原创文章,请在转载时务必注明博文出处!

JavaScript第五天作业案例

JavaScript第五天作业案例 1. 练习1: 使用for循环 - 求出数组元素的和 [5, 8, 9, 2, 1, 5] 运行结果 2. 练习2: 使用for循环 - 求出数组里大于5的和 [4, 9, 5, 20, 3, 11] 运行结果 练习3: 使用for循环 - 求出班级里同学们平均年龄[15, 19, 21, 33, 18, 24] 运行结果 练习4: 打印数组里所有的奇数 [5, 2, 8, 10, 3, 7] 运行结果 练习5: 计算[2, 6, 18, 15, 40] 中能被3整除的偶数的和 运行结果 练习6: 计算[2, 6, 18, 15, 40] 中能被3整除的偶数的个数 运行结果 练习7:给一个数字数组,该数组中有很多数字0,将不为0的数据存入到一个新的数组中 运行结果 练习8:点名: 每次刷新网页运行, 在控制台 随机输出一位同学的名字 [“老赵”, “老李”, “小传”, “小黑”],如果输出了,则数组中删除这个名字

linux下安装配置tinyproxy代理服务器

1、使用yum或者apt-get安装tinyproxy yum install tinyproxy -y 或者 apt-get install tinyproxy 2、安装后更改配置文件 : vim /etc/tinyproxy/tinyproxy.conf 修改配置文件中的 allow 127.0.0.1 注释掉则允许所有ip访问 #allow 127.0.0.1 加入多个ip或者IP段则允许多个ip或IP段访问 allow 192.168.0.1 allow 10.12.13.1 allow 188.157.12.0/24 输入 :wq 保存并退出 3、启动代理服务 service tinyproxy start 或者使用:/etc/init.d/tinyproxy {start|stop|restart|reload|force-reload} 中的 /etc/init.d/tinyproxy start 或者使用 /bin/systemclt start tinyproxy.service 或者使用 systemctl start tinyproxy.service 4、其他相关启动命令 设置开机自动启动:systemctl enable tinyproxy.service 停止服务:systemctl stop tinyproxy.service 启动状态:systemctl status tinyproxy.service 重启服务:systemctl restart tinyproxy.service 5、查看代理服务启动端口 netstat -ltnp 5、配置8888端口开放规则 iptables -I INPUT -p tcp --dport 8888 -j ACCEPT

Eclipse 如何修改默认工作空间和切换工作空间(Workspace)

文章目录 如何关闭/开启 Eclipse Launcher 弹窗提示通过配置文件设置通过 IDE 的偏好设置 如何修改 Eclipse 默认的工作空间和切换工作空间通过配置文件修改通过 Eclipse Launcher 窗口修改通过菜单来切换工作空间 如何关闭/开启 Eclipse Launcher 弹窗提示 通过配置文件设置 eclipse\configuration.settings 目录下,有一个“org.eclipse.ui.ide.prefs”文件,用记事本打开,里面有一个“SHOW_WORKSPACE_SELECTION_DIALOG”,如果你之前有打勾的话后面的值是 false,你把它改成 true 就好了,下次再开就出现那个“Eclipse Launcher”弹窗了。 说明: MAX_RECENT_WORKSPACES=10 显示最近空间的最大数目,对应Eclipse File->Switch Workspace显示数目的上限 RECENT_WORKSPACES=E:\Eclipse\eclipse\workspace 设置最近的工作空间,对应Eclipse File->Switch Workspace显示的空间,使用\n分隔多个工作空间 RECENT_WORKSPACES_PROTOCOL=3 最近的工作空间协议、草案 SHOW_RECENT_WORKSPACES=true 是否显示最近工作空间,Eclipse File->Switch Workspace->Other SHOW_WORKSPACE_SELECTION_DIALOG=true 打开eclipse时显示选择工作空间的窗口 eclipse.preferences.version=1 通过 IDE 的偏好设置 然后我们重启 Eclipse,可以看到 Eclipse Launcher 弹窗了。 如何修改 Eclipse 默认的工作空间和切换工作空间 通过配置文件修改 进行 Eclipse 目录下的 configuration 目录, 打开 config.ini 文件,将 osgi.instance.area.default=修改成你想设置为默认工作空间的目录 例如:osgi.instance.area.default=E\:/Soft/MyWorkspace 通过 Eclipse Launcher 窗口修改 如果你没有关闭 Eclipse Launcher 的弹窗提示,每次开启 Eclipse 时都会弹出如下窗口,在窗口中就可以修改默认的工作空间和切换工作空间

数据库SQL实战-考试分数(mysql)

1. 考试分数(一) 1.1 题目描述 牛客每次考试完,都会有一个成绩表(grade),如下: 请你写一个sql语句查询各个岗位分数的平均数,并且按照分数降序排序,结果保留小数点后面3位(3位之后四舍五入): 1.2 语句实现 -- select job, round(avg(score),3) avg select job, round(sum(score)/count(id),3) avg from grade group by job order by avg desc; 2. 考试分数(二) 2.1 题目描述 牛客每次考试完,都会有一个成绩表(grade),如下: 请你写一个sql语句查询用户分数大于其所在工作(job)分数的平均分的所有grade的属性,并且以id的升序排序,如下: 2.2 语句实现 select g.* from grade g join (select job, round(avg(score),3) as avg from grade group by job) as a on g.job = a.job where g.score > a.avg order by g.id; 3. 考试分数(三) 3.1 题目描述 牛客每次举办企业笔试的时候,企业一般都会有不同的语言岗位,比如C++工程师,JAVA工程师,Python工程师,每个用户笔试完有不同的分数,现在有一个分数(grade)表简化如下: 不同的语言岗位(language)表简化如下:

Linux内核同步的实现方式总结

目录 1、原子操作 2、自旋锁 2.1 自旋锁 2.2 读写自旋锁 2.3 如何避免死锁 3、信号量 3.1 信号量 3.2 读写信号量 4、互斥体 5、完成变量 6、顺序锁 7、禁止内核抢占 8、内存屏障 1、原子操作 原子操作用来保证执行过程不被打断,是很多其他同步方法的基石。 操作系统对原子操作的实现是基于汇编的,另外现在很多处理器也提供了原子操作的原语级支持。 Linux操作系统实现了三种原子操作:32位整数原子操作、64位整数原子操作、位原子操作。 原子整数操作:原子整数操作的操作对象是32位的整数,常用场景是实现计数器,操作系统提供了自增1和自减1的原子操作,用于支持计数器。64位整数原子操作:原子操作的目标是64位的数字。64位的操作系统通常需要64位整数的原子操作,但是大多数32位操作系统不支持,x86-32除外。原子位操作:原子位操作是用来对给定指针指向的内存地址中,数据特定的位进行操作。 2、自旋锁 2.1 自旋锁 Linux最常见的锁是自旋锁。自旋锁可以保证被加锁的目标最多只被一个线程持有,如果有线程试图获取一个正在已经被持有的自旋锁,即锁竞争发生的时候,该试图持锁的线程就会进行忙等待,自旋等待锁可以重新启用。 自旋锁会关闭内核抢占,持有自旋锁的进程,不会被其他进程抢占CPU。 1、自旋锁的适用场景 由于在锁争用的时候,自旋锁会导致线程忙等待,这会浪费处理器的资源,所以自旋锁不应该长期被持有。自旋锁应该用来给等待时间很短的场景添加轻量级锁,这样可以避免线程挂起和唤醒带来的两次上下文切换的开销。 2、单处理器下的自旋锁 需要注意的是,单处理器上不需要自旋锁。单处理器在编译的时候,会将自旋锁简化为是否启用内核抢占的开关。 3、Linux的自旋锁不可重入 Linux的自旋锁是不支持递归的,换句话说,Linux的自旋锁不可重入。这一点可能和其他操作系统的实现不同。Linux下,如果持有自旋锁的任务视图获取自己已经持有的锁,则会陷入忙等待,而没有时间释放自己的锁,导致自己陷入死锁。 4、自旋锁和中断 中断处理程序中如果需要加锁,可以使用自旋锁,因为自旋锁不会陷入睡眠。当然中断处理程序获取自旋锁之前需要先禁止本地中断,因为其他中断处理程序可能会打断当前持有自旋锁的中断处理程序,并再次请求该自旋锁,并陷入忙等待无法结束。 2.2 读写自旋锁 很多时候,对于锁来说,读和写是两种不同的处理场景。写操作对并发的控制相对严格,不允许并发,包括写操作和写操作、写操作和读操作之间的并发;但是读操作的并发要求相对较低,读操作和读操作之间互不干扰,对并发没有限制。 Linux内核提供了一种读-写自旋锁,分别为读操作和写操作提供了不同的锁。多个读操作可以同时获取到读锁,但是一旦有任务获取了写锁,则其他任务不允许再获取读锁和写锁。 这种读写锁相对来说对于读锁更友好,因为一旦有大量的任务都在读锁,写任务只能陷入等待,而读任务依然可以源源不断地获取读锁,导致写任务陷入饥饿。 2.3 如何避免死锁 虽然很难保证代码一定不会出现死锁,但是一些规则对避免死锁发生有很大帮助: 按顺序加锁。使用嵌套的锁时,必须保证对所有获取锁的任务都以相同的顺序加锁,这样可以避免致命拥抱类型的死锁防止发生饥饿。判断代码的执行是否一定会结束,如果某种情况一直不发生,是否有必要一直等待下去不要重复请求同一个锁设计尽量简单。越复杂的加锁方案,就越有可能造成死锁 3、信号量 3.1 信号量 Linux的信号量是一种睡眠锁。如果任务想要获取一个不可用的信号量时,信号量会将任务推进一个队列,然后让这个任务睡眠。这时处理器可以去处理其他任务。当该信号量可用后,处于等待队列的任务将被唤醒,并获得该信号量。 信号量的睡眠是可以被打断的,Linux内核同时提供了可以被打断和不允许被打断两种方式。 1、信号量的使用者数量 信号量允许任意数量的锁持有者,这个数量可以在声明信号量的时候指定。这个数量被称为信号量的使用者数量,或者数量。 2、互斥信号量和计数信号量 使用者数量为1的信号量,被称为互斥信号量,或者二值信号量。这种信号量只允许一个进程持锁,是一种Linux内核常用的锁。 如果使用者数量大于1,这种被称为计数信号量。这种运行多个进程同时持有锁,相对来说使用的机会较少。 3、信号量和自旋锁对比 信号量适用于锁会被长时间持有的情况。如果锁持有时间较短,自旋锁会更合适;信号量只能用于进程上下文,而不能用于中断上下文。由于信号量发生争用的时候,没获取到信号量的进程会睡眠,而中断上下文不允许睡眠,所以中断上下文中只能使用自旋锁;任务占用自旋锁的时候不允许请求信号量,因为持有自旋锁的时候不允许睡眠,但是等待信号量的时候会睡眠;信号量允许多个进程同时持有锁,而自旋锁最多只能有一个任务持锁。 3.2 读写信号量 读写信号量和信号量的关系,与读写自旋锁和自旋锁的关系类似。 读写信号量会对写任务的数量进行约束,但是不会对读信号量的数量有任何限制。 需要注意的是,读写信号量的使用者数量只能是1,也就是说,最多只能有一个写任务持有信号量。 和信号量不同的是,读写信号量的睡眠是不允许被动打断的。 和读写自旋锁不同的是,Linux内核提供了一种锁升级的机制,可以将读信号量升级为写信号量。而读写自旋锁不能锁升级。 4、互斥体 原本,互斥体是描述任何可以睡眠的互斥锁,但是在Linux内核3.18版本中,引入了一种新的锁机制:互斥体(mutex)。这种互斥体的行为和计数为1的信号量基本相同,区别在于互斥体的接口操作更简洁、实现更高效、使用限制更强。 mutex的简洁性和高效性来源于它只实现了互斥锁的基本行为,因此也导致了它的使用场景更定向、限制更强: 任何时候只能有一个进程持锁。相当于计数为1的信号量只能由加锁者自身来解锁。即不允许在一个上下文中加锁,在另一个上下文中解锁。这限制了mutex不能用于内核和用户空间同步的复杂场景,通常应该在同一个上下文中加锁和解锁不允许递归的加锁和解锁。不允许获取已经获取的锁,也不允许解锁已经解锁的锁当持有一个mutex时,进程不允许退出。mutex不能在中断和下半部中使用。mutex只能通过官方的API管理。只支持官方提供的基本操作,不允许被复制、手动初始化、或者重复初始化等。官方支持的操作包括: 互斥体和信号量的选择:

RNN应用 和 保存 模型载入

import numpy as np from keras.datasets import mnist from keras.utils import np_utils from keras.models import Sequential from keras.layers import Dense from keras.optimizers import Adam from keras.layers.recurrent import SimpleRNN # 最简单的RNN # 数据长度 - 一行有28个像素 input_size = 28 # 序列长度 - 一共有28行 time_steps = 28 # 隐藏层cell个数 cell_size = 50 # 载入数据 (x_train,y_train),(x_test,y_test) = mnist.load_data() # (60000,28,28) x_train = x_train/255.0 x_test = x_test/255.0 # 换one hot格式 y_train = np_utils.to_categorical(y_train,num_classes=10) y_test = np_utils.

vue Syntax Error: Error: PostCSS plugin postcss-pxtorem requires PostCSS 8.

vue Syntax Error: Error: PostCSS plugin postcss-pxtorem requires PostCSS 8. Migration guide for end-users: 关于脚手架生成项目,配置自适应postcss-pxtorem配置报错 首先你在.postcssrc.js文件正常配置(详细配置) module.exports = { plugins: { // 兼容浏览器,添加前缀 autoprefixer: { overrideBrowserslist: [ "Android 4.1", "iOS 7.1", "Chrome > 31", "ff > 31", "ie >= 8", "last 10 versions", // 所有主流浏览器最近10版本用 ], grid: true, }, "postcss-pxtorem": { rootValue: 37.5, //结果为:设计稿元素尺寸/16,比如元素宽320px,最终页面会换算成 20rem propList: ["*"], //是一个存储哪些将被转换的属性列表,这里设置为['*']全部,假设需要仅对边框进行设置,可以写['*', '!border*'] unitPrecision: 5, //保留rem小数点多少位 //selectorBlackList: ['.radius'], //则是一个对css选择器进行过滤的数组,比如你设置为['fs'],那例如fs-xl类名,里面有关px的样式将不被转换,这里也支持正则写法。 replace: true, //这个真不知到干嘛用的。有知道的告诉我一下 mediaQuery: false, //媒体查询( @media screen 之类的)中不生效 minPixelValue: 12, //px小于12的不会被转换 }, }, }; 也可以这样(简单一点)

模态窗打开防止底层滑动

let bodyEl = document.body let top = 0 export function stopBodyScroll(isFixed: boolean){ if (isFixed) { top = window.scrollY bodyEl.style.position = 'fixed' bodyEl.style.top = -top + 'px' document.body.style.overflow = 'hidden' } else { bodyEl.style.position = '' bodyEl.style.top = '' window.scrollTo(0, top) // 回到原先的top document.body.style.overflow = 'scroll' } }

python3遇到中文编码‘ascii‘ codec can‘t encode characters 的问题

制作好Docker镜像,上传到服务器上,然后遇到 UnicodeEncodeError: ‘ascii’ codec can’t encode characters in position 39-45: ordinal not in 中文编码错误的问题。 记录一下解决方案: 在python2中,也遇到过此问题,当时博主只在python脚本中添加 import sys reload(sys) sys.setdefaultencoding('utf-8') 但是,楼主是在 python3中遇到这个问题,Python3已经默认是utf-8编码了,可用 print(sys.getdefaultencoding()) 显示 utf-8,没问题 于是我用 print(sys.stdout.encoding) 好家伙,竟然显示 ANSI_X3.4-1968 这可能是系统编码导致 于是乎 在终端输入 locale 显示 可以看到当前编码格式为POSIX,而这种编码格式不支持中文 楼主用 locale -a 查看容器所有语言环境 看到一行 C.UTF-8,这个是支持中文编码的 于是,在运行python 脚本前,将C.UTF-8添加到环境变量中,如下 LANG=C.UTF-8 source /etc/profile python3 test.py

Echarts 实现动态数据时间轴

<div id="totalFlowRate" style="height:620px;" ></div> export default { data() { return { timeSpace: 5, // 默认五分钟 timeLong: 100, // 8小时间隔五分钟 xData: [], // x轴数据 start: 0, end: 0, timer: null, hadleMove: false // 判断是否手动调节滑块 } }, methods: { // 时间间隔变化 handleTimeSpaceChange() { clearInterval(this.timer) this.timer = null this.timeLong = Math.ceil( (8.5 * 60 * 60 * 1000) / (this.timeSpace * 60 * 1000) ) this.handleTime() this.vitalData() // 生命体征数据函数 this.timer = setInterval(this.vitalData, this.

react ref获取元素高度

import ReactDOM from "react-dom"; class App extends Component { constructor(props) { super(props); this.state = { width: 0 }; } componentDidMount() { const width = this.divElement.clientWidth; this.setState({ width }); } render() { return ( <div className="test" ref={divElement => (this.divElement = divElement)}> Size: <b>{this.state.width}px</b> but it should be 18px after the render </div> ); } } const rootElement = document.getElementById("root"); ReactDOM.render(<App />, rootElement);

go语言添加环境变量报错 go env -w GO111MODULE=auto

go语言添加环境变量报错 go env -w GO111MODULE=auto warning: go env -w GO111MODULE=... does not override conflicting OS environm windos 删除你系统环境变量(关于go语言的所有值) 设置成功保存在你的env文件里面 linux系统 /etc/profile 删除你系统环境变量(关于go语言的所有值) 和windows方法相同 有的解决方法简直就是误人子弟

JavaScript的第四天作业案例

JavaScript的第四天 基础篇 1.打印0-20之间的整数, 将每个数输出到控制台 运行结果 2.用户输入第1个数, 用户再次输入第2个数 ,请将这2个数之间的整数打印出来 运行结果 3.打印1-100之间能被3整除的整数 运行结果 4.打印1到用户输入的数值之间能被3整除的整数 加入用户输入 10,就是求 1~10之间的能被3整除的数,如果用户输入 88,则求 1~88之间能被3整除的 - 运行结果 5.计算1-10之间的和 可以继续升华,做 用户输入1个数,求 1 到 用户输入数之间的和 利用 while 和 for 都实现一遍 运行结果 6.打印10-100之间, 所有偶数的和 可以继续升华,做 用户输入1个数,求 10 到 用户输入数之间所有偶数和 利用 while 和 for 都实现一遍 运行结果 提高篇 1 求100以内所有能被3和7整除的数的和 题目描述: 把1-100之间所有能够被3和7同时整除的数找出来,计算累加和 题目提示: 在算入累加和之前,使用%判定遍历到的数字是不是可以被3和7整除 运行结果 用户登录验证 题目描述: 接收用户输入的用户名和密码,若用户名为 “admin” ,且密码为 “123456” ,则提示用户登录成功! 否则,让用户一直输入。 题目提示: 利用while循环 运行结果 3 求1-100之间个位数不为3的数的累加和。 题目描述: 求整数1~100的累加值,但要求跳过所有个位为3的数。 题目提示: 使用%判个位数是否为3用continue实现

二分

一.什么是二分搜索? 在有界并有序的解空间内不断缩减可能存在的范围,从而得到问题最优解的答案。 只有有界闭区间才能保证缩减次数是有限的,同时也只有存在单调性才能够保证二分的使用是正确的,保证去掉的值是不合法或者不是最优解。 二.二分搜索的实现 求最有解可以转换成求满足某个条件C(x)的最大(/最小)的x const double eps = 1e-6; bool C(typedef x){ //判断x是否满足……条件,并返回结果 /* ……*/ } //整数二分 int bsearch(int l,int r){ while(r - l > 1){ int mid = (l + r) / 2; if(C(mid)) l = mid; else r = mid; } return l; } //浮点数二分 double bsearch(double l,double r){ while(r - l > eps){ double mid = (l + r) / 2; if(C(mid)) r = mid; else l = mid; } return l; } 三.

【Java基础】Java异常的捕获及处理

《第一行代码:Java》第6章、异常的捕获及处理 读书笔记 文章目录 第6章、异常的捕获及处理6.1 认识异常6.2 异常处理printStackTrace 6.3 异常的处理流程6.4 throws关键字6.5 throw关键字6.6 异常处理的标准格式6.7 RuntimeException类6.8 assert关键字6.9 自定义异常本章小结 第7章、Eclipse开发工具 第6章、异常的捕获及处理 6.1 认识异常 异常是程序中导致程序中断的一种指令流,例: package com.yootk.demo; public class TestDemo { public static void main(String args[]) { System.out.println("1. 除法计算开始。") ; System.out.println("2. 除法计算:" + (10 / 0)) ; // → 此处产生异常 // 出现异常并且没有正确处理后,异常之后的语句将不再执行 System.out.println("3. 除法计算结束。") ; } } 本程序将产生“ArithmeticException”异常,此时如果没有正确的处理异常,程序就会出现中断执行的情况,为了让程序在出现异常后依然可以正常执行完毕,需要引入异常处理语句来完善代码编写。 6.2 异常处理 *Java针对异常的处理提供了3个核心的关键字:try、catch、finally,利用这3个关键字就可以组成以下异常处理格式: try { // 有可能出现异常的语句 }[catch(异常类型 对象) { // 异常处理 }catch(异常类型 对象) { }catch(异常处理 对象) { // 异常处理 }.

RobotFramework 解决中文乱码问题

RobotFramework 解决中文乱码问题 1.在python安装目录中找到testrunnerplugin.py文件 D:\PYTHONANZHUANG\Lib\sitepackages\ robotide\contrib\ testrunner\testrunnerplugin.py (2)编辑estrunnerplugin.py文件encoding内容 encoding = {'CONSOLE': CONSOLE_ENCODING, 'SYSTEM': OUTPUT_ENCODING, 'OUTPUT': OUTPUT_ENCODING} 注意: 使用python ride.py 重启RIDE

springBoot使用Mybatis处理Decimal类型保留两位小数不丢失精度

1.配置Mybatis处理Decimal类型类 @MappedJdbcTypes(JdbcType.DECIMAL) public class MyBigDecimalTypeHandler extends BigDecimalTypeHandler { @Override public BigDecimal getNullableResult(ResultSet rs, String columnName) throws SQLException { BigDecimal result =super.getNullableResult(rs, columnName)==null?BigDecimal.ZERO.setScale(2, BigDecimal.ROUND_HALF_UP):super.getNullableResult(rs, columnName).setScale(2, BigDecimal.ROUND_HALF_UP); return result; } @Override public BigDecimal getNullableResult(ResultSet rs, int columnIndex) throws SQLException { return super.getNullableResult(rs, columnIndex)==null?BigDecimal.ZERO.setScale(2, BigDecimal.ROUND_HALF_UP):super.getNullableResult(rs, columnIndex).setScale(2, BigDecimal.ROUND_HALF_UP); } @Override public BigDecimal getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { return super.getNullableResult(cs, columnIndex)==null?BigDecimal.ZERO.setScale(2, BigDecimal.ROUND_HALF_UP):super.getNullableResult(cs, columnIndex).setScale(2, BigDecimal.ROUND_HALF_UP); } } 2.注册 在yml文件配置,此处我用的是mybatis-plus的配置,使用mybatis原生的采用mybatis的type-handlers-package 3.Springboot中Bigdecimal以json格式返回前端依然丢失小数点 @JsonFormat(shape = JsonFormat.Shape.STRING) private BigDecimal test; 就是在把数据给前端的时候,把数据转换成string类型,这样就不会丢失小数点后面的(.

导航栏保持高亮状态(适合共用导航)

导航栏是所有页面共用的组件,导航栏会单独分离出来作为各个页面的引用,很多时候需要高亮当前页面的选项。这里用js来控制高亮情况。 (根据自己的业务需求修改样式) 思路:寻找与当前页面路由匹配的href css : .active{ color: #fff; background-color: #c92b30; } 当前页面高亮的css类为active html: <div id="navbars"> <ul> <li class="nav-item atiive"> <a href="index">首页</a> </li> <li class="nav-item"> <a href="page1.html">页面1</a> </li> <li class="nav-item"> <a href="page2.html">页面2</a> </li> <li class="nav-item"> <a href="page3.html">页面3</a> </li> <li class="nav-item"> <a href="page4.html">页面4</a> </li> </ul> </div> js: $(function () { // 获取当前页面的网址 let url = location.href; // 当前页面的高亮状态 let status = false; // 检索每个id为navbars中的a标签,为页面添加高亮状态 $('#navbars a').each(function () { // 找到跟当前网址与url匹配,并且不为空。找到就在相应位置添加高亮class if((url + '/').

FairyGUI笔记-(cocos+lua)

--* 持续更新 - 组件规则 - 不能有重名,否则getChild()会报错; - bg - 组件内的所有的元素,都可以通过fguiObj:getChild( childName )获得; - 但是高级组想获得组里面的元素需要:fguiObj:getChildInGroup( GroupObj, childName ); 也可以直接用fgui:getChild( childName )获得高级组里面的元素; - 因为fguiObj:getChild( childName )能查找多所有,所以,不能有重名元素; - 直接使用FGUI的关联功能: *- 其中块,先设为组; *- 界面布局完成后,将块(组A)转换为组件A; *- 设置组件A的 轴心,并关联上级组件(Parent),并设置 点击可穿透空白区域; *- 在游戏中设置组件(Paraent)size为屏幕大小,即可实现适配功能; - 每个组件只能获得自己的child;组件A中包含组件B,组件B中的child,只能通过组件B去get; --- FairyGUI编辑器 - 项目设置里面->字体设置 - 点击空白处,就会显示组件的属性 - 组件,有个设计图属性;可以把美术ui示意图拖动到里面,从而辅助ui布局;ui布局完成后,删除图片资源,同时清空设计图里面的资源路径; - 一般不勾选同时作为锚点,勾选后会导致关联系统失效; - 图片等,有个填充方法属性;可以模拟进度条,倒计时等效果; - 文字,勾选输入,就变成输入框了; - UBB语法,在cocos中,只有富文本才支持,普通文本在程序中不支持; - 富文本,可以是文字按钮,支持链接和图片混合,支持html语法等 - 创建位图字体 - 控制器,控制移动等;例如:元素从第0页位置,移动到第1页元素所在位置;同理,可以逆向从第1页到第0页位置; - 按住ctr键,滚动鼠标,可以放大,缩小; - 文字,属性面板,有个自动大小,可以自动更改 - 关联 - 可以使用关联,设置组件大小铺满全屏,然后其他的设置关联后,就可以自动适配屏幕,不用代码控制了 - 关联的作用是:保持跟父节点的相对距离不变;<保持相对距离不变>;比如金币图片保持在数字左边,图片关联数字,则数字变化时就可以跟着动态调整位置保持在数字的左侧<哪怕数字换行,也可以保持在左侧位置>

趣味Python — 不到20行代码制作一个 “手绘风” 视频

关注公众号:【小张Python】,为你准备了 50+ 本Python 精品电子书籍 与 50G + 优质视频学习资料,后台回复关键字:1024 即可获取;如果对博文内容有什么疑问,后台添加作者【个人微信】,可与作者直接进行交流 Hello 大家好,我是小张,好久不见~ 本期推文与计算机视觉相关,用不到 20 行Python代码将一张图片由自然风转化为手绘风,期间未对图片进行任何预处理、后处理;代码中只借助了两个常见库,核心计算由 Numpy 负责 ,Pillow 负责图片读写 在正文开始之前,先看一下最初效果,下面是单张图片转换前后对比 图一 图二 图三 为了增加趣味性,后面将这段代码应用到一个视频中,加上一个背景音乐,新鲜的 “手绘风视频” 出炉 Python 手绘风视频制作! “手绘风”实现步骤 讲解之前,需要了解手绘图像的三个主要特点: 图片需为灰度图,是单通道的;边缘部分线条较重涂抹为黑色,相同或相近像素值转换后趋于白色;在光源效果的加持下,灰度变化可模拟人类视觉的远近效果 读取图片,转化为数组 因为后面要用到像素计算,为了方便,事先将读取后的图片转化为数组 a = np.asarray(Image.open("Annie1.jpg").convert('L')).astype('float') 计算 x,y,z 轴梯度值,并归一化 刚才提到手绘照片的一个特点,就是 手绘照片对边缘区域更加侧重,定位图片边缘部分,最有效方式就是计算梯度,用灰度变化来模拟图片远近效果,depth 表示预设深度,z 轴默认梯度为 1 depth = 10. # (0-100) grad = np.gradient(a) # 取图像灰度的梯度值 grad_x, grad_y = grad # 分别取横纵图像梯度值 grad_x = grad_x * depth / 100. grad_y = grad_y * depth / 100.

Web安全漏洞梳理(一)

写在前面 根据自己的学习和工作经验总结下常见漏洞类型和经常会遇到的问题。 一、注入攻击 注入攻击的本质,是把用户输入的数据当作代码执行。 1、SQL注入 漏洞原理&&场景&&危害 web应用程序对用户的输入未进行合法性判断或者过滤不严,导致服务器可以拼接执行恶意的SQL语句。 涉及到操作数据库的功能,如搜索产品、查询用户、排序 可导致: 机密数据被窃取。核心业务数据被篡改。网页被篡改。数据库所在服务器被攻击变为傀儡主机,甚至企业网被入侵。 修复建议 (最推荐)操作数据库时,应使用预处理/预编译,避免使用SQL拼接。 mybatis: 1)使用#符 2)无法使用#符的场景(排序),使用白名单 jdbc: 1)SQL中使用?占位符 2)使用PreparedStatement 语义分析过滤SQL注入 白名单过滤,只允许使用的SQL语句通过 黑名单过滤,过滤详细规则见:mysql注入黑名单过滤、oracle注入黑名单过滤 前端加密,将请求使用js加密,并做好js混淆。增加解密难度,至少能防住扫描器 测试方法 首先找注入点: 输入单引号,看页面报错信息涉及数据库操作功能的每个参数都要测试,比如搜索、登录、修改数据、提交表单等。若是使用mybatis的多数问题出在order参数xray等被动扫描器 找到注入点之后,看功能可使用sqlmap查其他数据。 !!!涉及post提交表单或者直接修改数据的真实环境功能千万别用,会产生大量数据,或者数据库被批量修改!!! 2、代码执行/注入&命令执行/注入 区别与联系 注入/执行 我理解是一个意思,不同的人的习惯叫法不一样。 《白帽子讲web安全》:代码注入和命令注入都是由一些不安全的函数或者方法引起的。代码注入多见于脚本语言,有时候代码注入也可以导致命令注入。 严格来说,PHP、JSP的动态include(文件包含漏洞)导致的代码执行,都算代码注入 《web安全深度剖析》:命令执行漏洞是直接调用操作系统命令,故这里叫做OS命令执行漏洞,可执行外部应用程序的函数导致的叫命令执行。而代码执行漏洞靠执行脚本调用操作系统命令 php代码注入函数 eval() //可以将字符串按照PHP代码来执行,即动态执行PHP代码 preg_replace() ob_start() array_map() //返回用户自定义函数处理后的数组 php命令注入函数 //这类函数可执行外部应用程序 system() shell_exec() exec() passthru() java代码注入函数 javascript脚本引擎 engine.eval() Java命令注入函数 runtime.exec() jsp代码注入函数/文件包含 动态include 根据以上总结,两本书讲的意思大致一样,调用函数执行的是脚本代码的是代码注入,调用函数执行的是外部应用程序命令,比如系统命令的,是命令注入。 漏洞原理&&场景&&危害 命令执行执行的是系统中的命令,使目标服务器的命令在目标服务器上去执行我们想要执行的命令,系统命令的执行还是要基于某些函数的调度去实现的。 代码执行是指应用程序过滤不严,用户可以通过请求将代码注入到应用中执行 第三方框架漏洞、使用到命令执行、代码执行函数的功能。 可继承Web服务程序的权限去读写文件。执行系统命令反弹shell,控制整个网站甚至控制服务器 修复建议 Java: 1)不使用Runtime.exec,使用api获取相应信息 2)如必须使用Runtime.exec,使用白名单或者过滤 其他命令执行 本地命令执行----CSV注入 能控制数据导出excel的地方,插入代码 =1+cmd|' /C calc'!

Android View观察或者说监听Activity的生命周期

今天学到一个比较使用的方法,就是Android系统提供的Activity中getLifecycle()方法, 如我有一个播放器View,播放器View想实现观察或者说监听使用我的Activity或者Fragment的生命周期的变化,则如下写法 (context as Activity).lifecycle.addObserver(view) 其中view为播放器View. 以上,mark一下。

另类堆栈(注意TOP的定义)

另类堆栈 题目答案注意 题目 答案 bool Push( Stack S, ElementType X ) { if(S->Top==S->MaxSize) { printf("Stack Full\n"); return false; } else { S->Data[S->Top]=X; S->Top++; return true; } } ElementType Pop( Stack S ) { if(S->Top==0) { printf("Stack Empty\n"); return ERROR; } else { S->Top--; return S->Data[S->Top]; } } 注意 本题要注意审题,Top定义为栈顶的上一个位置,但因为Top初始值为0,所以判断堆栈是否满了的时候,只需比较Top是否等于MaxSize即可

js函数封装数字相加的几种方法

1.通过内置方法 arguments function sum(){ let count = 0 for(let i = 0 ; i < arguments.length ; i++){ if(isNaN(arguments[i])){ continue } else{ arguments[i] = Number(arguments[i]) count = arguments[i]+ count }n } return count } sum(1,1,1,1,1) console.log(sum(1,2,3,5,'ww',5,'7')); 2.ES6 新增语法 …args 运算符 function sum(...args) { //es6 变为数值的形式 let count = 0 for (let i = 0; i < args.length; i++) { if (isNaN(args[i])) { continue } else { args[i] = Number(args[i]) count = args[i] + count } } return count } sum(1, 1, 1, 1, 1) console.

PyTorch 矩阵乘法总结和运算符重载

1. 二维矩阵乘法 torch.mm() 也就是最基本的矩阵乘法,需要满足对应维度的要求,否则报错 torch.mm(mat1, mat2, out=None) mat1 ∈ R m × n \in \mathbb{R}^{m \times n} ∈Rm×n,mat2 ∈ R n × d \in \mathbb{R}^{n \times d} ∈Rn×d,输出 out ∈ R m × d \in \mathbb{R}^{m \times d} ∈Rm×d。 2. 三维带batch的矩阵乘法 torch.bmm() torch.bmm(bmat1, bmat2, out=None) 由于神经网络训练一般采用 mini-batch,经常输入的是三维带 batch 的矩阵。 提供 torch.bmm(bmat1, bmat2, out=None), 其中 bmat1 ∈ R b a t c h × m × n \in \mathbb{R}^{batch \times m \times n} ∈Rbatch×m×n,bmat2 ∈ R b a t c h × n × d \in \mathbb{R}^{batch \times n \times d} ∈Rbatch×n×d,out ∈ R b a t c h × m × d \in \mathbb{R}^{batch \times m \times d} ∈Rbatch×m×d。

STM32关延时功能实现方式研究

STM32常见延时实现方式研究 一、阻塞延时函数1. 循环延时(V1.0.0)代码(while形式)测试数据特点总结 2. SYSTICK非中断延时(V1.0.1)代码测试数据50us级延时500us级延时 特点总结 3. DWT延时(V1.0.2)代码测试数据50us级延时500us级延时 特点总结 二、非阻塞延时1. 无OS下非阻塞延时(==待更新==)2. OS下非阻塞延时(==暂无更新==) 接触过单片机的,肯定都用过延时函数,从while循环,到定时器延时,到systick延时,再到DWT延时等等。延时含义即从某一刻开始,到下一个某刻结束。 从 用途上来说,延时有 功能性和 非功能性之分。 功能性延时即 某些功能实现必须需要延时,如模拟IIC等;非功能性延时,是为了方便观察或记录现象而进行的延时,一般来说正式发布的时候可以去掉,如加入延时为了printf打印慢一点,非功能性延时通常不用很精确。 根据单片机延时时CPU的动作,分为阻塞延时和非阻塞延时。通俗理解就是 阻塞延时就是死等,CPU进入延时程序后,除了响应中断外啥也不干,就等延时时间到达。 非阻塞延时是指,进入延时后,CPU可以执 行除中断意外的其他功能。 根据延时时是否是靠中断计时,分为中断延时(定时器溢出中断)和非中断延时。 主控:STM32F407ZGT6(HSE:8MHz) 库:STD标准库V1.8.0 工具:RIGOL DS1104Z PLUS数字示波器 各种延时函数测试标准:无论那种方式,mian函数中功能有RTC自动唤醒事件(1s唤醒),通过这些来模拟日常开发,每种延时方式开启后主要测试微秒us延时,毫秒ms延时因为有中断的存在会不准确,当然也有毫秒延时本身误差在。微妙延时会测试50微秒us级(<100us)3组,500微秒us级(<1000us)3组。毫秒延时会测试50毫秒ms级(<100ms)5组,500ms级(<1000us)3组。延时后翻转PB4脚电平,示波器测量电平翻转时间。 提示:如果不想看数据测试客户以直接阅读结论(黄色字体)。 一、阻塞延时函数 延时方式从阻塞方式到非阻塞方式,中断从无中断到有中断,准确性从粗略延时到精确延时。(本文持续更新,因此有些函数暂无)。 延时函数版本号说明 主版本号:1阻塞延时,2非阻塞延时 次版本号:0非中断,1中断, 修订号: 开源协议、版权和免责声明: 本文为原创,代码开源使用开源协议Apache-2.0,可以随意使用。请署名版权信息,格式: Copyright (c) 20021-2021, Logan(wangzhaoyangly@Foxmail.com)。本文数据只做参考, 本人不对数据正确性和准确性做保证,由此产生问题本人概不负责。 1. 循环延时(V1.0.0) 循环延时即在一个循环中让CPU做一些没有意义的工作来完成延时的目的。由于NOP空指令在不同架构的MCU上执行时间不一定,因此不使用NOP进行延时。循环延时和NOP指令延时本质是一样的。不过这个含税延时时间需要摸索,下面这样设置,实际扩大5倍。 代码(while形式) void delay_while_us(uint16_t time) { uint16_t i = 0; while(time--) { i=168;//168MHz下 while(i--); } } 测试数据 5us延时,理论周期为10us,实际测试周期为50.8us,数据偏差+408%。 50us延时,理论周期为100us,实际测试周期为500.8us,数据偏差+408%。 这个数据已经说明问题了,微秒级延时很不准确。 上面已经说明了,这个延时函数只适合粗略延时,其他量级数据也没有测试必要。 特点总结 优点:实现简单

由于找不到MSVCR110.dll,无法继续执行代码...的解决方法

今天调试代码时候发现Wampserver运行以后是橙色的,橙色代表未启动成功。卸载安装后还是没有解决这个问题,反而启动Wamp出现了错误提示“由于找不到MSVCR110.dll,无法继续执行代码…”。发现可能是昨天清理C盘卸载了一些东西导致的(作死。 以下是我在另一个原文中找到了解决办法。 wamp启动丢失msvcr110.dll、vcruntime140.dll等文件的解决方法 第一种方法: 到wampserver官网根据自己电脑的位数,下载vcredist_x64.exe或vcredist_x86.exe程序安装,然后把wampserver卸载,重新安装打开即可 第二种方法: 如果第一种方法不行的,那么就用这种方法,简单除暴,保准行!那就是直接下载微软的vc运行集成库,把vc库都一下安装上,可以自己百度vc运行库集成下载。也可以通过下面链接下载, 64位百度云链接: 链接: https://pan.baidu.com/s/1bGKEiq 密码: 49q5 32位百度云链接: 链接: https://pan.baidu.com/s/1hsgqU5A 密码: edgp 下载完之后直接安装,然后把wamp卸载重新安装即可。这个方法还是比较稳的! ———————————————— 链接: https://blog.csdn.net/baiyecode/article/details/78552255. 我是通过第二种方法把卸载的插件重新下回来了,最后劝大家C盘关于配置和插件的不要乱删,有一些Visual C++的插件工具是和wamp服务器有关系的,没有这些插件运行Wampserver会产生报错。

数字电子技术——复试常见问题

数电的课程逻辑:由数制(进制转换)与码制(格雷码、ASCII码)入手,介绍了基本的逻辑代数(与或非),然后引入基本逻辑门电路(CMOS、TTL),基本门电路又组成组合逻辑电路(如编码器、译码器、加法器等)。其他内容还包括:触发器(有记忆性的基本逻辑单元)、时序逻辑电路、脉冲波形的产生和整形。 什么是竞争与冒险? 由于竞争导致输出端产生尖峰脉冲的现象就叫做竞争与冒险。 竞争:两个输入信号同时向相反的逻辑电平跳变。 消除方法:加选通脉冲、接入滤波电容(直接削弱尖峰脉冲的幅度)、修改逻辑设计(增加冗余项)。 什么是编码器? 用来把输入的高低电平转换为二进制编码。 什么是译码器? 译码是编码的反操作,用来将输入的二进制代码译为高低电平或者另外一种代码。 触发器的触发方式有哪些? 电平触发(加了一个时钟信号用于触发)、脉冲触发、边沿触发。 如何分析时序逻辑电路? 先写出触发器的驱动方程,驱动方程代入的特性方程可以得到状态方程,从而写出输出方程。

30行代码完成对知乎热榜的抓取!

想必知乎这个网站大家都很熟悉吧,每天上午可能都会摸摸鱼来看看热榜上又有哪些热点。但是要是明目张胆的看网站时突然发现背后站着一个领导,那时可能就会很尴尬了,哈哈! 今天我就教大家如何快速而又优雅的获取知乎热榜上的信息,只需要30行代码即可完成。话不多说,咱们直接开始! 首先导入我们需要的Python库以及定义我们的headers,注意这里headers里面的cookie要替换为自己网站上的cookie值哦! import requests from bs4 import BeautifulSoup import json import re headers = {'X-Requested-With': 'XMLHttpRequest','User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36', 'cookie': ''} #cookie值替换为自己网站上的cookie值 之后来获取关于知乎热榜上的所有问题链接: url = 'https://www.zhihu.com/hot' res = requests.get(url, headers=headers) soup = BeautifulSoup(res.text, 'html.parser') all_a = soup.select('div.HotItem-content a') 最后对每个问题链接进行请求,并获取该问题下的所有回答: for a in all_a: link = a['href'] print(link + a['title']) question_id = link.replace('https://www.zhihu.com/question/', '') res2 = requests.get(link, headers=headers) soup2 = BeautifulSoup(res2.

Java中操作Excel的3种方法,太好用了!

一、介绍 在平时的业务系统开发中,少不了需要用到导出、导入excel功能,今天我们就一起来总结一下,如果你正为此需求感到困惑,那么阅读完本文,你一定会有所收获! 二、poi 大概在很久很久以前,微软的电子表格软件 Excel 以操作简单、存储数据直观方便,还支持打印报表,在诞生之初,可谓深得办公室里的白领青睐,极大的提升了工作的效率,不久之后,便成了办公室里的必备工具。 随着更多的新语言的崛起,例如我们所熟悉的 java,后来便有一些团队开始开发一套能与 Excel 软件无缝切换的操作工具! 这其中就有我们所熟悉的 apache 的 poi,其前身是 Jakarta 的 POI Project项目,之后将其开源给 apache 基金会! 当然,在java生态体系里面,能与Excel无缝衔接的第三方工具还有很多,因为 apache poi 在业界使用的最广泛,因此其他的工具不做过多介绍! 话不多说,直接开撸! 2.1、首先引入apache poi的依赖 <dependencies> <!--xls(03)--> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>4.1.2</version> </dependency> <!--xlsx(07)--> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>4.1.2</version> </dependency> <!--时间格式化工具--> <dependency> <groupId>joda-time</groupId> <artifactId>joda-time</artifactId> <version>2.10.6</version> </dependency> </dependencies> 2.2、导出excel 导出操作,即使用 Java 写出数据到 Excel 中,常见场景是将页面上的数据导出,这些数据可能是财务数据,也可能是商品数据,生成 Excel 后返回给用户下载文件。 在 poi 工具库中,导出 api 可以分三种方式 HSSF方式:这种方式导出的文件格式为office 2003专用格式,即.xls,优点是导出数据速度快,但是最多65536行数据 XSSF方式:这种方式导出的文件格式为office 2007专用格式,即.xlsx,优点是导出的数据不受行数限制,缺点导出速度慢 SXSSF方式:SXSSF 是 XSSF API的兼容流式扩展,主要解决当使用 XSSF 方式导出大数据量时,内存溢出的问题,支持导出大批量的excel数据

leetCode 435 无重叠区间(区间问题)

题目链接:点击查看 题目描述: 给定多个区间,计算让这些区间互不重叠所需要移除区间的最少个数。起止相连不算重叠。 输入输出: 输入: [ [1,2], [2,3], [3,4], [1,3] ] 输出: 1 输入: [ [1,2], [1,2], [1,2] ] 输出: 2 题目分析: 此题采取贪心策略 ,区间的结尾越小,预留给其他空间的结尾就越大,保留的空间也就越多, 具体方法 为把区间按照结尾的大小进行升序排序(在此用了c++的lambda匿名函数作为自定义排序方式 作为sort第三个参数),每次选择结尾小且和前一个选择的区间不重叠的区间。因此贪心策略为:优先保留结尾小且不相交的区间。 代码: int eraseOverlapIntervals(vector<vector<int>>& intervals) { if(intervals.empty()) { return 0; } int n=intervals.size(); sort(intervals.begin(),intervals.end(),[](vector<int>a,vector<int>b){ return a[1]<b[1]; });//用c++lambda匿名函数来自定义排序方式:即按照每个一维数组第二个元素大小升序排序 int total=0,prev=intervals[0][1];//total表示所要移除区间的个数 for(int i=1;i<n;i++) { if(intervals[i][0]<prev) { ++total; } else { prev=intervals[i][1]; } } return total; }

amos不显示路径系数原因

amos每个潜变量对应至少三个显变量 amos不显示路径系数原因 至少一个显变量对应因子载荷为1 设定方式:点击箭头或显变量,设定regression weight为1

graphlib中文API文档

graphlib中文API文档 (一)API 参考 该页面介绍graphlib中主要的概念及有关API。默认,有关功能和对象都在graphlib命名空间下。 文章目录 graphlib中文API文档(一)API 参考(1)图概念1)节点和边的表示2)多边图(Multigraphs)3)复合节点图(Compound Graphs)4)默认标签(Default Labels) (2)基础 API(3)算法 API01) alg.components(graph)02) alg.dijkstra(graph, source, weightFn, edgeFn)03) alg.dijkstraAll(graph, weightFn, edgeFn)04) alg.findCycles(graph)05) alg.floydWarshall(graph, weightFn, edgeFn)06) alg.isAcyclic(graph)07) alg.postorder(graph, vs)08) alg.preorder(graph, vs)09) alg.prim(graph, weightFn)10) alg.tarjan(graph)11) alg.topsort(graph) (1)图概念 graphlib仅有一个图的概念: Graph。创建新的实例可以使用下面的代码: var g = new Graph() 默认, 会创建一个有向图且不支持节点间具有多条边或者由多个节点构成的复合节点。添加如下参数可以在构建具有特定性质的新的图对象: directed: 该参数设定为true会获得有向图实例,设定为false会获得无向图实例。无向图不关心在边中节点相互关联的次序。换一种方式来说, g.edge("a", "b") === g.edge("b", "a")对无向图而言是成立的。该属性默认为: true。multigraph: 设定为true允许图在同一对节点之间具有多条边。该属性默认为: false。compound: 设定为true允许图具有复合节点,也就是说允许某结点是一些其他节点的父节点。该属性默认为: false。 要设定这些属性, 可以通过带有参数的Graph构造函数来创建对象。例如, 要创建一个有环且具有复合节点, 且一对节点之间允许具有多条边的图,可以通过下面的代码实现: var g = new Graph({directed: true, compund: true, multigraph: true}) 1)节点和边的表示 在graphlib中, 节点可以通过用户定义的字符串作为id来表述。所有节点有关的方法均使用此String类型的id来唯一标识此节点。下面代码可以实现关于节点的交互操作:

访问者模式java实例,深入浅出Java的访问者模式

import java.util.*; import junit.framework.*; //访问者角色 interface Visitor { void visit(Gladiolus g); void visit(Runuculus r); void visit(Chrysanthemum c); } // The Flower hierarchy cannot be changed: //元素角色 interface Flower { void accept(Visitor v); } //以下三个具体元素角色 class Gladiolus implements Flower { public void accept(Visitor v) { v.visit(this);} } class Runuculus implements Flower { public void accept(Visitor v) { v.visit(this);} } class Chrysanthemum implements Flower { public void accept(Visitor v) { v.visit(this);}

《Perl语言入门》读书笔记(六)正则表达式

1.序列匹配 $_ = "yabba dada ddad"; if(/dada/){ print"It matched!\n"; #在//中的值与$_相匹配 } 在匹配中不会忽略空白字符,需要注意。 2.通配符 点号.能匹配出换行符外的任意单个字符: $_ = "yabba dada ddad"; if(/da.a/){ print"It matched!\n"; #.能与任意单个字符匹配 3.量词 可以使用量词知道你匹配项的重复次数: 正则表达式量词及对应的广义形式 匹配次数元字符一般化写法可有可无 ? {0,1} 零或多次*{0,}一次以上+{1,}至少多少次,无上限 {3,}指定重复次数范围 {3,5}准确的重复次数 {2}

git使用(Linux)

文章目录 常用命令写在前面以便查阅配置git账号远程&Github使用git本地操作git分支操作 常用命令写在前面以便查阅 git log remotes/origin/master查看远程提交记录 git push origin --delete develop-kidl-add删除远程分支 git tag -a v1.0 给重要的版本打上标签 git commit --amend修改注释 git remote -v显示所有远程仓库 git push origin HEAD:refs/for/develop提交到远程develop分支 配置git账号 下载git:apt-get install git 输入命令: git config --global user.name “github用户名” git config --global user.email “github邮箱” 这些内容会被保存在/root下的.gitconfig文件中,如果想修改就可以修改这里,而且ssh密钥是根据这个生成的,所以改了这里之后需要重新生成秘钥,生成秘钥的命令如下(若没有上传到github的需求,不用执行以下操作),输入命令: ssh-keygen -t rsa -C "github邮箱"之后一直回车即可。 我的shh秘钥位置:/root/.ssh/id_rsa,在/root/.ssh下有两个文件,一个是私钥,一个.pub文件是公钥,将公钥提交到github中。 将密钥提交到github中,注意最后的邮箱不用加,输入命令: ssh -T git@github.com 如果提示success那么就成功将自己的Ubuntu和github关联了起来 远程&Github使用 在github中创建一个仓库 repository。 如下图可以选择有些类型的文件被git忽视,忽视没用的文件,让git的跟踪看起来更清爽一点。 github上传项目 步骤: 1.在github中申请的repository 2.在新目录下要初始化一下:git init 链接远程仓库:git remote add origin git@github.com:在github中申请的repository的路径.git git add 文件名