ZOJ4062 Plants vs. Zombies 二分

ZOJ4062 Plants vs. Zombies 一机器人给植物浇水,浇水之前必须移动一格,移动后必须浇水,从1~n的位置上有n个植物,每个植物都有自己的生长速度, 每浇一次生长一次,机器人初始位置为0,把每种方案浇灌下最低的植物高度作为方案值,求最大的方案值 最大化最小值二分:二分最大方案值,每次模拟计算方案的最小花费是否超出机器人最大的行走距离,若不超出扩大否则缩小 #include<bits/stdc++.h> using namespace std; const int MAX=1e5+10; const long long INF=1e17; int t,n,a[MAX]; long long m,b[MAX]; bool check(long long x) { for(int i=1;i<=n;++i) { if(x%a[i]) b[i]=x/a[i]+1; else b[i]=x/a[i]; } long long cnt=0;b[n+1]=0;bool f=0; for(int i=1;i<=n;++i) { if(b[i]>0) { cnt+=b[i]*2; b[i+1]-=b[i]; if(!f) f=1; else ++cnt,--b[i+1]; if(cnt>m+1) return 0; } else f=0; } if(b[n+1]<0) --cnt; if(b[n]<0) --cnt; return cnt<=m; } int main() { scanf("%d",&t); while(t--) { scanf("

codeforce626 E. Simple Skewness 二分

codeforce626 E. Simple Skewness 均值-中位数 最大的子集 枚举中值,二分区间大小 要使 均值-中位数 最大,所以最大化均值,即从最后取最大的L个数,从中位数前取相邻的L个数 若区间扩大均值扩大则扩大,否则缩小 #include<bits/stdc++.h> using namespace std; const int MAX=2e5+5; int a[MAX],n; long long sum[MAX]; int main() { while(~scanf("%d",&n)) { memset(sum,0,sizeof(sum)); int L=0,pos=1;double ans=-1e6; for(int i=1;i<=n;++i) scanf("%d",&a[i]); sort(a+1,a+n+1); for(int i=1;i<=n;++i) sum[i]+=sum[i-1]+a[i]; for(int i=1;i<=n;++i) { int l=1,r=min(n-i,i-1),mid,len=0; while(l<=r) { mid=(l+r)>>1; double tmp1=1.0*(sum[n]-sum[n-mid]+sum[i]-sum[i-mid-1])/(2.0*mid+1); double tmp2=1.0*(sum[n]-sum[n-mid+1]+sum[i]-sum[i-mid])/(2.0*mid-1); if(tmp1>tmp2) l=mid+1,len=mid; else r=mid-1; } double ans_=1.0*(sum[n]-sum[n-len]+sum[i]-sum[i-len-1])/(2.0*len+1)-a[i]; if(ans_>ans) { ans=ans_; L=len; pos=i; } } printf("%d\n",L*2+1); for(int i=pos-L;i<=pos;++i) printf("%d "

父子组件之间的通信

父子组件之间的通信 概念:A组件中调用B组件,那么A组件就是父组件,B组件就是子组件 通信方式: 父组件向子组件传递数据——使用props 子组件向父组件传递数据——使用this.$emit暴露一个function给父组件 例子 子组件(一般是组件) <template> <div> <div class="father-to-son"> {{name}} <div v-if="myHead"> show my head </div> <div> <div v-for="item in myList" :key="item.value" :label="item.label" :value="item.value"> {{item.label}} {{item.value}} <br> </div> <el-input :placeholder="myPlaceholder"></el-input> </div> </div> <hr> <hr> <div class="son-to-father"> <el-input placeholder="子组件给父组件" v-model="message"></el-input> <el-button type="success" @click="toFather">抛数据给父组件</el-button> </div> </div> </template> <script> export default { props: { name: { type: String, default: '' }, myHead: { type: Boolean, default: true }, myList: { type: Array, default: () =>[ { value: '1', label: '测试1' }, { value: '2', label: '测试2' } ] }, myPlaceholder: { type: String, default: '' } }, data(){ return{ message: '', } }, methods:{ //这个方法暴露给父组件,父组件调用然后更新数据 toFather(){ let res = this.

linux下解压命令和 rpm命令使用简介

一、打包压缩 01-.tar格式 解包:[root@user]$ tar xvf FileName.tar 打包:[root@user]$ tar cvf FileName.tar DirName(注:tar是打包,不是压缩!) 02-.gz格式 解压1:[root@user]$ gunzip FileName.gz 解压2:[root@user]$ gzip -d FileName.gz 压 缩:[root@user]$ gzip FileName 03-.tar.gz格式 解压:[root@user]$ tar zxvf FileName.tar.gz 压缩:[root@user]$ tar zcvf FileName.tar.gz DirName 04-.bz2格式 解压1:[root@user]$ bzip2 -d FileName.bz2 解压2:[root@user]$ bunzip2 FileName.bz2 压 缩: [root@user]$ bzip2 -z FileName 05-.tar.bz2格式 解压:[root@user]$ tar jxvf FileName.tar.bz2 压缩:[root@user]$ tar jcvf FileName.tar.bz2 DirName 06-.bz格式 解压1:[root@user]$ bzip2 -d FileName.bz 解压2:[root@user]$ bunzip2 FileName.bz 07-.tar.bz格式 解压:[root@user]$ tar jxvf FileName.

mui在调起软键盘时,底部内容被推起的解决办法

在用mui做账号绑定的页面时,当软键盘被调起时,就会出现底部绝对定位的背景图被“推上来”。 来两张效果图。 图1是键盘没有被调起时的页面。 图2是键盘调起之后,被挤压的背景图。(小米手机截屏时不会截取到软键盘,只好手机辅助拍照了。?) 图1 经过解决之后的。如图3所示,不再将页面底部推上去。整体页面也不会受到挤压。 <!--防止软键盘调起时,底部内容随之挤上来--> <script type="text/javascript"> //获取原始窗口的高度 var originalHeight = document.documentElement.clientHeight || document.body.clientHeight; window.onresize = function() { //软键盘弹起与隐藏 都会引起窗口的高度发生变化 var resizeHeight = document.documentElement.clientHeight || document.body.clientHeight; if(resizeHeight * 1 < originalHeight * 1) { //resizeHeight<originalHeight证明窗口被挤压了 plus.webview.currentWebview().setStyle({ height: originalHeight }); } } </script> 备注:从网上参考大牛的解决办法,感觉受益匪浅,一种解决问题的思想很重要。

syslog日志系统——框架选型

syslog日志系统——框架选型 sysog概述 syslog日志系统主要作用是采集有价值的日志信息,然后进行日志的汇总以及数据分析,最后展现分析结果报告为决策提供数据支撑。 本系列文章将逐一讲述syslog日志系统的设计与开发思路。 syslog的开发环境 IDEA:同时进行前端、后端编码,功能强大的开发利器。 项目类型:用IDEA建立java spring boot项目。 TypeScript:这个是可选的配置,利用TypeScript严谨的语法能编写生成高质量的js类库。 syslog的框架选型 layui syslog是后台系统,layui的设计理念比较适合开发后台管理系统界面,而且使用简单,文档齐全。 官网:https://www.layui.com/ echarts 实现syslog的图表功能,echarts图表框架提供丰富的图表种类,功能完善齐全。 官网:http://echarts.baidu.com/ spring boot 利用Spring框架的强大功能,对代码的质量,代码简化,代码可维护性等,起到重要的作用。 swagger swagger框架规范了接口的标准,并提供接口文档化和接口调用的界面支持。 这个框架为前后端开发分离提供重要的支持,接口可测试调用,前端页面只需通过ajax进行数据的交互。

Netty 100万级高并发服务器配置

文章很长,建议收藏起来,慢慢读! 疯狂创客圈为小伙伴奉上以下珍贵的学习资源: 疯狂创客圈 经典图书 : 《Netty Zookeeper Redis 高并发实战》 面试必备 + 大厂必备 + 涨薪必备疯狂创客圈 经典图书 : 《SpringCloud、Nginx高并发核心编程》 面试必备 + 大厂必备 + 涨薪必备疯狂创客圈 价值1000元 百度网盘资源大礼包 随便取 GO->【博客园总入口 】独孤九剑 Netty灵魂实验 : 本地 100W连接 高并发实验,瞬间提升Java内力 文章目录 价值连城:2021春招月薪过5万 面试题 系列万字长文: 疯狂创客圈 springCloud 高并发系列前言测试服务器配置测试端服务器程序入口HttpChunkedServer.java:唯一的自定义处理器HttpChunkedServerHandler.java:启动脚本start.sh 达到100万并发连接时的一些信息GC日志小结 价值连城:2021春招月薪过5万 面试题 系列 搞定下面这些面试题,2021春招月薪过5万(猛!)阿里、京东、美团、头条… 随意挑、横着走!!!Java基础1: JVM面试题(史上最强、持续更新、吐血推荐)https://www.cnblogs.com/crazymakercircle/p/14365820.html2:Java基础面试题(史上最全、持续更新、吐血推荐)https://www.cnblogs.com/crazymakercircle/p/14366081.html3:死锁面试题(史上最强、持续更新)[https://www.cnblogs.com/crazymakercircle/p/14323919.html]4:设计模式面试题 (史上最全、持续更新、吐血推荐)https://www.cnblogs.com/crazymakercircle/p/14367101.html5:架构设计面试题 (史上最全、持续更新、吐血推荐)https://www.cnblogs.com/crazymakercircle/p/14367907.html还有 10 几篇 篇价值连城 的面试题具体… 请参见【 疯狂创客圈 高并发 总目录 】 万字长文: 疯狂创客圈 springCloud 高并发系列 springCloud 高质量 博文 nacos 实战(史上最全) sentinel (史上最全+入门教程) springcloud + webflux 高并发实战 Webflux(史上最全) SpringCloud gateway (史上最全)还有 10 几篇 万字长文 的高质量 博文具体… 请参见【 疯狂创客圈 高并发 总目录 】 前言 每一种该语言在某些极限情况下的表现一般都不太一样,那么我常用的Java语言,在达到100万个并发连接情况下,会怎么样呢,有些好奇,更有些期盼。

form表格提交post请求,到后端变成了get请求,这个坑怎么填?!

前端的post请求到后端变成了get请求,什么鬼? 本人在编写flask服务器项目过程中,需要从前端接收用户的登录信息,将用户信息保存进session和cookie中。 后端代码如下: @app.route('/login',methods=['GET','POST']) def login_views(): if request.method == 'GET': # 判断是否已经在登录状态:session中是否有uname值 if 'uname' in session: # 已经登录成功,直接去首页 return redirect('/') else: # 未在登录状态,继续判断cookie if 'uname' in request.cookies: # 曾经记录过用户,取出值,保存进session uname = request.cookies['uname'] session['uname'] = uname return redirect('/') else: # 去往登录页 return render_template('login.html') else: # 先处理登录,登录成功回首页;否则回登录页面。 uname = request.form.get('uname') upwd = request.form.get('upwd') print('********************') print(uname) print(upwd) print('********************') if uname == 'admin' and upwd == 'admin': # 声明重定向首页的对象 resp = redirect('/') # 登录成功 # 先将数据保存近session session['uname'] = uname # 是否要记住密码 if 'isSaved' in request.

Go语言Web开发Beego框架深入浅出

课程目录: ├─day1 │ 1.环境搭建 │ 2.beego框架的分析 │ 3.简单的路由设置 │ 4.正则路由设置 │ 5.路由设置 │ 6.orm环境搭建 │ 7.orm的插入和查找 │ 8.删除和更新 │ 9.多级查询 │ ├─day2 │ 1.昨天回顾及静态资源路径设置 │ 10.错误码文件 │ 11.session设置 │ 12.删除Sesssion │ 2.开发环境搭建 │ 3.路径的截取 │ 4.创建数据库 │ 5.导入area数据 │ 6.显示area数据 │ 7.显示登陆注册按钮 │ 8.注册代码实现 │ 9.session介绍 │ ├─day3 │ └─3-视频 │ 1.昨日回顾 │ 10.头像上传代码 │ 11.上传头像业务分析 │ 12.上传头像代码完善 │ 2.登陆业务流程分析 │ 3.登录代码 │ 4.redis的使用 │ 5.redis配置问题的解决 │ 6.Session模块集成 │ 7.

wcf服务发布到windows Server2008服务器上

头一次接触wcf这种东西,说起来简单也不简单,简单之处让你写wcf服务和写简单的接口没有什么很大的区别,在接口上添加上契约就OK了,关键在于它的wcf配置文件,目前还很头大。如果不理解wcf服务是什么,你就简单的认为它就是一个接口(interface),然后它可以放到IIS上发布,让客户端可以调用到这个wcf服务(接口)。在winserver2008服务器上部署到IIS时,出现了很多问题。 首先,服务器是一个全新的,什么扩展都没有装。我们第一个要装的功能是IIS,只要这一个,其它都不要。(千万不要装 .net Framework3.5.1功能!) 然后依次需要装net framework 4.0、net framework 4.5 、net framework 4.5.2 ,4.5.2装的时候非常慢,需要很长时间,并不是服务器卡了,一定要耐心的等待它装完。 因为我的wcf服务用到了mysql ,所以我还需要装上mysql-connetctor-net-6.8.7 。 最后因为是一个新的服务器环境,所以第一次打开iis功能,还需要重新进行一些注册。以管理员的身份打开cmd,输入以下命令: cd C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319 aspnet_regiis.exe -i cd C:\WINDOWS\Microsoft.NET\Framework64\v4.0.30319 ServiceModelReg.exe -r 这样环境就搭建好了,后面的操作就和部署普通的网站是一样的了,不过这个需要自己在IIS的“默认文档”中添加一下。

问题:数据库自动提交 autoCommit = true与@Transactional注解的问题?

遇到一个问题: 我的数据库连接池,设置的autoCommit = true然后在一个方法上,我又加了@Transactional注解,Spring执行到一个方法,扫描到@Transactional注解后,会自动执行Spring事务管理器,事务管理器会把当前获得的数据库连接对象conn的autoCommit给设置成false.那么问题来了:当执行完这个方法后,Spring还会把这个数据库连接对象设置回autoCommit = true吗? 答案:会

Java压缩zip工具类

“云散月明谁点缀,天容海色本澄清” 在这里记录一次压缩文件和解压的代码:亲测可用。 import java.io.*; import java.nio.charset.Charset; import java.util.Enumeration; import java.util.List; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; import java.util.zip.ZipOutputStream; /** * @author aRunner * @date 2018/11/1 * zip压缩工具类 */ public class ZipUtils { private static final int BUFFER_SIZE = 2 * 1024; /** * 压缩成ZIP 方法1 * @param srcDir 压缩文件夹路径 * @param out 压缩文件输出流 * @param KeepDirStructure 是否保留原来的目录结构,true:保留目录结构; * false:所有文件跑到压缩包根目录下(注意:不保留目录结构可能会出现同名文件,会压缩失败) * @throws RuntimeException 压缩失败会抛出运行时异常 */ public static void toZip(String srcDir, OutputStream out, boolean KeepDirStructure) throws RuntimeException{ long start = System.

the flask mega tutorial:在vscode中的配置

学习了the flask mega tutorial,在pycharm中可快速配置启动,不需要在cmd中每次一步一步的重复操作,可以直接运行。 一、配置launch.json 在学了vscode后,突然想用此软件实现同样的功能,在网络上百度了几篇,重复着操作,试着配置一下,开始就是会报错: Error: Could not import “G”. 一开始的配置如下: launch.json "configurations": [ { "name": "Python: Flask", "type": "python", "request": "launch", "module": "flask", "env": { "FLASK_APP": "${workspaceRoot}/microblog.py" }, "args": [ "run", "--no-debugger", "--no-reload" ], "jinja": true, "envFile": "${workspaceRoot}/.env", "stopOnEntry": false, } ] } 后边又在网络上找了半天,终于解决了这个问题: 很简单,就是修改一个地方即可: "FLASK_APP": "microblog.py" # ${workspaceRoot}/ 请把这个删除。 如果要运行教程中其他的命令,例如:flask migrate。 只需要在"args"中做相应调整就OK了。 二、settings 这个貌似自动生成,不要自己设置。 { "python.pythonPath": "venv\\Scripts\\python.exe" }

python获取网页header头部信息(python小白学习笔记二)

方法一:代码查看 通过python获取网页的链接url,返回码,以及相关的信息 #对反爬虫网页,可以设置一些headers信息,模拟成浏览器取访问网站 import urllib.request url="https://www.baidu.com/" file=urllib.request.urlopen(url) print('获取当前url:',file.geturl() ) print('file.getcode,HTTPResponse类型:',file.getcode ) print('file.info 返回当前环境相关的信息:' ,file.info()) 输出结果: D:\工具\pythonTools\CatchTest1101\venv\Scripts\python.exe D:/工具/pythonTools/CatchTest1101/venv/test/test110204.py 获取当前url: https://www.baidu.com/ file.getcode,HTTPResponse类型: <bound method HTTPResponse.getcode of <http.client.HTTPResponse object at 0x00000264C14A4940>> file.info 返回当前环境相关的信息: Accept-Ranges: bytes Cache-Control: no-cache Content-Length: 227 Content-Type: text/html Date: Fri, 02 Nov 2018 03:01:23 GMT Etag: "5bd7d86c-e3" Last-Modified: Tue, 30 Oct 2018 04:05:00 GMT P3p: CP=" OTI DSP COR IVA OUR IND COM " Pragma: no-cache Server: BWS/1.1 Set-Cookie: BD_NOT_HTTPS=1; path=/; Max-Age=300 Set-Cookie: BIDUPSID=ED1C1F4FD9C3CBA5268DC8CB64DEEA6C; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.

Java中的substring截取字符串方法

1. 问题描述 在处理字符串的过程中有很多情况下会遇到需要截取字符串的情况,这个时候使用Java中提供的substring方法来截取就非常方便了 2. 其中比较经常使用到的方法有两个: ① public String substring(int beginIndex) 这个方法截取的字符串是从索引beginIndex开始的,到整个字符串的末尾,例如:字符串String s = "abcdef"; 调用s.substring(2)表示从字符串的索引2开始截取到整个字符串结束,截取的字符串为cdef ② public String substring(int beginIndex, int endIndex) 这个方法截取的字符串从beginIndex开始,到字符串索引的endIndex - 1结束,即截取的字符串不包括endIndex这个索引对应的字符,所以endIndex的最大值为整个字符串的长度,所以使用这个方法的时候需要特别注意容易发生字符串截取越界的问题 3. 下面是具体的代码: import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String s = sc.nextLine(); System.out.println(s.substring(0, 2)); System.out.println(s.substring(2)); sc.close(); } } 从控制台输入:saahdfasgfdga

fopen/fwrite写文件例子

对于fopen和open的区别可参考https://www.cnblogs.com/hnrainll/archive/2011/09/16/2178706.html https://blog.csdn.net/kaiandshan/article/details/43226529 https://www.cnblogs.com/NickyYe/p/5497659.html 当遇到MFC工程里要数据保存到本地时,如果以前没接触MFC,想使用fopen/fwrite,而不想去查一大堆Windows API的东西,头都要大。牵扯到CString和string以及char*的转换,烦。 看看:FILE * fopen(const char * path, const char * mode); fopen的参数类型是char*,但你能获取的路径信息只能是CString 类型转换可参考:https://www.cnblogs.com/bluestorm/p/3168720.html https://www.cnblogs.com/maowang1991/p/3570328.html 就这样转来转去,严重影响进度。 下面先来个小例子 void CStrTestDlg::OnOK() { // TODO: Add extra validation here int j = 100; while(1) { if(j > 115) j = 100; int i; FILE *fp = NULL; CString str; str.Format("%d",j++); CString path = "C:\\datatemp\\"+ str + ".txt";//路径 char* pFileName = path.GetBuffer(path.GetLength()+1); fp = fopen(pFileName, "w+"); if (NULL != fp) { for (i = 0; i < 15; i++) { char s[32] = {0}; sprintf(s,"

因子图与和积算法

在1981年Tanner的论文中,介绍了一种可以用来表示码字的图形,称为Tanner图。 Tanner图包含两类节点:码元(变量)节点和校验节点,然后通过边连接这两种不同的节点,并且同种节点间不能有直接的边连接。如果给定一个码字的码元数和它的校验方程,则用Tanner图可以唯一地确定该码字。例如一个(7, 3)线性分组码,其校验方程为: 在用Tanner图表示的过程中, 码的译码算法是可以用明确的公式反映并可程式化进行, 即有很强的可实现性。Tanner图从本质上讲是用码字的校验方程来表述码字 消息传递算法 和 积 算 法 (Sum-Product Algorithm) 作 为 一 种 通 用 的 消 息 传 递 算 法(Message Passing Algorithm), 描述了因子图中顶点(变量节点和校验节点) 处的信息计算公式, 而在基于图的编译码系统中, 我们首先需要理解的是顶点之间是如何通过边来传递信息。 例如, 若干士兵排成一队列, 每个士兵只能与他相邻的士兵交流, 问如何才能使每个士兵都知道总的士兵数? 将上面的情况抽象成一般模型,如下图所示,图中每个点可看作是一个士兵,对应到编码理论中则可看作因子图中对应的节点(如前述的变量节点和校验节点,或卷积码的BCJR算法中的状态点)。 对应上图, 引入几个概念: 先验信息P、 外信息E以及后验信息A。 在上例中, 先验信息P表示每个士兵自身的数字1, 如图(a) 所示;外信息E表示从其他相邻的士兵获取的信息, 如图(c) 所示, 即每个士兵的外信息均为5;后验信息A=P+E, 在这里表示队列的总人数, 即为6。 从图中可以看出, 得到最后的结果是通过前向计算和后向计算得到的。 从图中可以看出,经过5步计算第3、第4个士兵可以得到总人数6(5+1),经过6步计算第2、第5个士兵可以得到总人数,经过7步计算所有士兵均知道了总人数。 问题:如果士兵不是按照队列排列,怎么办呢? 该图(a)与前图不同之处在于, 有些士兵不止有2个相邻的士兵, 可能有3个或更多。 具体信息传递流程如图(b)所示。 每个士兵同样可以获得其相邻士兵给他的外信息, 同时加上自身的信息然后传递给相邻的士兵。在上面的两个例子中, 每个士兵节点的信息只需在所有其相邻节点上进行一次前向和后向的计算, 则每个士兵就可知道总人数。 这样的图有一个共同特点:所有节点构成一棵树, 而树结构中是没有环路的。 如果有环路, 会导致什么结果? 由于有环路的存在, 如果用上述信息更新方法来确定总人数, 将会导致无法确定何时中止信息的传递, 因此也就无法确定士兵人数。 对应到编码理论, 则在设计LDPC码的校验矩阵时, 应尽量避免校验矩阵对应的因子图中出现短环(如4循环、 6循环、 8循环等) 。

JavaScript-JS是什么,有什么用

JavaScript简称为js,是运行在浏览器上的脚本语言,连续多年被评为全球最受欢迎的编程语言。 js可以做什么呢? 1,使网页具有交互性,例如响应用户点击,给用户提供更好的体验 2,可以处理表单,检验用户的输入,并提供及时反馈节省用户时间。例如,表单中要你输入电子邮箱而你却输入一个手机号,那么应该给你一个提醒。 3,还可以根据用户的操作,动态的创建页面。例如,发邮件时,添加附件操作。 4,设置cookie,cookie是存储在浏览器上的一些临时信息,例如你浏览过的网站地址,使用过的用户名

Qt: XKEYBOARD extension not present on the X server.的解决方法

最近在服务器上用qtcreator改代码,发现无法用键盘键入任何东西,然后发现在终端会报出这样一行东西: Qt: XKEYBOARD extension not present on the X server. 查了很多东西,发现这就是问题所在。 至于怎么改,有说要改.bashrc的,具体需要添加以下两行代码: export XKB_DEFAULT_RULES=base export QT_XKB_CONFIG_ROOT=/usr/share/X11/xkb 但是这样改了之后还是会出现最初的错误,简直炸裂。最终发现是因为xmanager的设置问题,需要修改以下设置: Xconfig->Default Profile->Properties->Advanced->X Extensions-> check the 'XKEYBOARD' 简而言之,就是需要勾选XKEYBOARD这个扩展项。 这两步,应该是都需要的,但是我没有实验,有心人可以试试只改一个地方ok不。

使用Gson解析复杂的json数据

我们app接口数据返回通常是以下格式: {“code”:“0000”,“data”: {“code”:“0002”,“resultData”:null,“resultMsg”:“用户Token过期,请重新登入”,“error”:[],“msg”:""} 把以上的json数据放在线JSON字符串转Java实体类(JavaBean)网址(http://www.bejson.com/json2javapojo/new/)上生成下面的Java实体类: public class JsonRootBean { private String code; private Data data; private List<String> error; private String msg; public void setCode(String code) { this.code = code; } public String getCode() { return code; } public void setData(Data data) { this.data = data; } public Data getData() { return data; } public void setError(List<String> error) { this.error = error; } public List<String> getError() { return error; } public void setMsg(String msg) { this.

spring boot security jwt 整合vue-admin-template

spring boot security jwt 整合vue-admin-template 首先感谢PanJiaChen 的 vue-admin-template 模板,我是一名java程序员,所以前端的技术不怎么样。vue.js也只是会用一点,非常感谢PanJiaChen 的模板支持。 已经整合好的模板地址:https://github.com/thousmile/... 如果大家觉得写的不错,就请点亮我GitHub的心心。非常感谢! 如果大家在搭建过程中遇到问题,欢迎找我 GitHub : https://github.com/thousmile 码云: https://gitee.com/thousmile QQ: 932560435 先从数据库开始 大部分的权限管理系统都是5张表结构(同样我们这里也采用这种方式) t_sys_user -----> t_sys_user_role -----> t_sys_role -----> t_sys_role_permission ----> t_sys_permission 这里我们主要看权限表(t_sys_permission ) 最重要的就是resources和type字段,这两个字段在后面和vue.js整合的时候会用到, type字段,只有两个类型,是按钮还是菜单 下面开始spring boot 工程的搭建 POM文件的主要依赖 <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.3.2</version> </dependency> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>1.2.5</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.

springboot中设置pageSize的默认值

springboot中设置pageSize的默认值 方式一、使用@PageableDefault注解 可以在形参上使用@PageableDefault注解指定默认的page和size @GetMapping(value="/list") public String list(@PageableDefault(page=0, size=15)Pageable pageable) { return "list"; } 但是这种方式比较麻烦,需要在很多controller上都加上@PageableDefault(page=0, size=15) 方式二、统一处理 通过WebMvcConfigurerAdapte设置默认的size 1.appliation.properties配置文件中加入以下配置 # 设置pageable中的pagesize的默认值 pageable.page.size=15 2.在WebMvcConfigurerAdapter类中重写addArgumentResolvers()方法 package com.blog.personalblog.config; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Configuration; import org.springframework.data.domain.PageRequest; import org.springframework.data.web.PageableHandlerMethodArgumentResolver; import org.springframework.web.method.support.HandlerMethodArgumentResolver; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; import java.util.List; @Configuration public class WebMvcConfig extends WebMvcConfigurerAdapter { @Value("${pageable.page.size}") private Integer pageSize; /** * 设置分页时默认的每一页数据量 * @param argumentResolvers */ @Override public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) { PageableHandlerMethodArgumentResolver resolver = new PageableHandlerMethodArgumentResolver(); resolver.

静电放电(ESD)知识小记

前言: 为了方便查看博客,特意申请了一个公众号,附上二维码,有兴趣的朋友可以关注,和我一起讨论学习,一起享受技术,一起成长。 1. 定义 静电放电(Electrostatic Discharge,ESD):是指具有不同静电电位的物体互相靠近或直接接触引起的电荷转移。当带了静电荷的物体(也就是静电源)跟其它物体接触时,这两个具有不同静电电位的物体依据电荷中和的原则,存在着电荷流动,传送足够的电量以抵消电压。这个电量在传送过程中,将产生具有潜在破坏作用的电压、电流以及电磁场,严重时会将物体击毁。 2. 特点 2.1 ESD 可形成高电位、强电场、瞬时大电流 大多数情况下 ESD 过程往往会产生瞬时脉冲大电流,尤其是带电导体或手持小金属物体的带电人体对接地导体产生火花放电时,产生的瞬时脉冲电流的强度可达到几十安培甚至上百安培。 ESD 电流产生的电磁场可以直接穿透设备外壳,或通过孔洞、缝隙、输入输出等耦合到敏感电路,如图 所示: 2.2 ESD 过程会产生强烈的电磁脉冲辐射 在 ESD 过程中会产生上升时间极快、持续时间极短的初始大电流脉冲,并产生强烈的电磁辐射形成静电放电电磁脉冲(ESD Electromagnetic Pulse-ESD EMP),它的电磁能量往往会引起电子系统中敏感部件的损坏、翻转,使某些装置中的易爆品误爆,造成事故。 3. 危害 ESD 对电子设备的危害主要有两种机理,其一是 ESD 电流直接流过电路造成破坏,另一种是 ESD 电流产生的电磁场通过近场的电容耦合、电感耦合或远场的空间辐射耦合等途径对电路造成干扰。 ESD 可能引起易燃易爆物的起火或爆炸,也可能导致半导体器件和集成电路的击穿或失效。随着微电子技术的快速发展,特别是随着集成电路结构尺寸的减小以及 MOS 集成电路的广泛使用,静电危害已成为微电子器件的重要破坏源。静电防护问题越来越被关注,而 ESD 的防护领域也日渐广泛。 4. 三种模型 3.1 HBM:Human Body Model,人体模型: 该模型表征人体带电接触器件放电(人体摩擦产生了电荷突然碰到芯片释放的电荷导致芯片烧毁击穿),Rb 为等效人体电阻,Cb 为等效人体电容。等效电路如下图,同时给出了器件 HBM 模型的 ESD 等级。 下图为人体 ESD 的等效电路。人体能储存一定的静电电量,因此人体明显地存在电容效应。人体也有电阻,其值依赖于人体肌肉的弹性、水分和接触电阻等因数。电荷转移路径中还存在电感。目前广泛使用的人体模型测试电路中人体等效电阻和电容分别为1500Ω 和 100pF。 从电磁兼容的角度来看,ESD 最重要的指标是电流波形特性。来自人体的 ESD 的典型波形如下图所示。测量结果表明,ESD 波形具有很短的上升时间(<1ns)和很高的起始尖峰。起始尖峰是从手/前臂组合体经由低电感通路放电的结果,电流峰值越大,且人体接近速度越快,脉冲上升斜率越陡。另一方面,人体放电会产生时间长得多的脉冲(其它部位放电结果),持续时间可到数十微秒。因此,这两种波形组合就反映了包含人体在内的 ESD 特性。 3.2 带电器件模型 由于器件本身积累静电而迅速放电造成对电子元器件的损坏,带电器件模型是基于已带静电的器件通过管脚对地放电引起器件失效而建立的。 该模型电路对地放电时,得到的放电电流波形为迅速衰减的正弦波。带电器件有几个管脚同时与地接触时,就有几个放电通路,图中分别用不同的 Ri 、Li 、Ci 表示。器件放电时的脉冲峰值功率较高,可达几百瓦到几兆瓦,这么大的功率也会改变器件的参数,或使硅熔化造成器件的失效。对于多器件并联的放电通道模型,当有一个管脚接地时,器件的每条路径都有自己的放电特性,从而在路径之间产生电位差,严重时可以导致路径之间的绝缘击穿。

简单屏蔽广告

网络广告真真真的很烦人。 特别是一些网站毫无底线,页面70%的内容都是广告!!! 认证分析发现,大部分广告都是百度,cnzz,google等企业发出来的。 网站原生的广告系统往往比较规矩,还可以接受。屏蔽百度,google等大厂的广告服务器,就可以避免大部分的广告,并且对网页功能影响很小。 下面为搜集的广告服务器地址,主要屏蔽跨站js文件。放在路由器的静态路由表上,可以让整个局域网干净无广告。 放在windows的C:\Windows\System32\drivers\etc上可以避免本机的广告干扰。 持续更新,欢迎留言反映各种广告服务器。 # Copyright (c) 1993-2009 Microsoft Corp. # # This is a sample HOSTS file used by Microsoft TCP/IP for Windows. # # This file contains the mappings of IP addresses to host names. Each # entry should be kept on an individual line. The IP address should # be placed in the first column followed by the corresponding host name. # The IP address and the host name should be separated by at least one # space.

Android Studio 出现“Cannot resolve symbol” 解决办法

(一) Android Studio 无法识别同一个 package 里的其他类,将其显示为红色,但是 compile 没有问题。鼠标放上去后显示 “Cannot resolve symbol XXX”,重启 Android Studio,重新 sync gradle,Clean build 都没有用。 多半是因为 Android Studio 之前发生了错误,某些 setting 出了问题。解决方法如下: 点击菜单中的 “File” -> “Invalidate Caches / Restart”,然后点击对话框中的 “Invalidate and Restart”,清空 cache 并且重启。语法就会正确的高亮了。 (二) 因要用到,所以最近学了点Android开发,用的编译器是亲儿子,也是新生儿 Android Studio。 今天在调试的时候,Android Studio 报了一个莫名其妙的错误Cannot resolve symbol ‘R’让人不知所措。因为这东西根本不归我管啊,怎么会出现 Cannot resolve symbol 这种错误呢? 谷歌了一下,找到解决方法如下: Build -> Clean Project Tools -> Android -> Sync Project With Gradle Files 不行就多试几次!就好了! 真正解决方案:Cannot resolve symbol 'xxx' (Android Studio 3.

微信小程序iconfont的图标引入

微信小程序中的想要引入字体样式的时候是不支持的,那么我们有时候却需要这个功能所以接下来去介绍一下怎么去引入iconfont的图标库。 1.打开iconfont http://www.iconfont.cn/ 2.新建个项目,当然我这里已经新建完了。 3.选择你需要的图标添加到购物车。 4.点击右上角的购物车,把这个图标添加到你的项目中。 5.打开你的项目。 6.点击下载到本地 7.在你小程序的目录下创建iconfont文件夹,并将你下载的文件放到里面,解压 8.打开这个文件夹 @font-face {font-family: "iconfont"; src: url('iconfont.eot?t=1540623498736'); /* IE9*/ src: url('iconfont.eot?t=1540623498736#iefix') format('embedded-opentype'), /* IE6-IE8 */ url('data:application/x-font-woff;charset=utf-8;base64,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') format('woff'), url('iconfont.ttf?t=1540623498736') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+*/ url('iconfont.svg?t=1540623498736#iconfont') format('svg'); /* iOS 4.1- */ } .iconfont { font-family:"iconfont" !important; font-size:16px; font-style:normal; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } .icon-bianji:before { content: "\e671"; } 9.在你的微信小程序中新建一个iconfont.wxss的文件夹将代码复制进去。 10.引入你的这个样式 11.添加这个类样式就显示出来了 结语:这样引入样式就结束了,希望能给小伙伴们带来一丝帮助

Wannafly27 C 蓝魔法师 树形DP

Wannafly27 C 蓝魔法师 给定一棵树,删除一些边,使每个连通块不超过k个节点 表示第i个节点的子树对其父节点提供j个连通量的方案数 #include<bits/stdc++.h> using namespace std; const int MAX=2e3+5; const int MOD=998244353; int n,K; struct P { int to,nxt; }e[MAX<<1]; int head[MAX],sz[MAX],tot,dp[MAX][MAX],tmp[MAX]; void init() { memset(head,-1,sizeof(head)); tot=0; } void adde(int u,int v) { e[tot].to=v; e[tot].nxt=head[u]; head[u]=tot++; } int add(int x,int y){return (x+=y)>=MOD?x-MOD:x;} int sub(int x,int y){return (x-=y)<0?x+MOD:x;} int mul(int x,int y){return 1ll*x*y%MOD;} void dfs(int u,int fa) { sz[u]=dp[u][1]=1; for(int i=head[u];~i;i=e[i].nxt) { int to=e[i].to; if(to==fa) continue; dfs(to,u); for(int i=0;i<=K;++i) tmp[i]=dp[u][i],dp[u][i]=0; for(int i=1;i<=sz[to];++i) dp[to][0]=add(dp[to][0],dp[to][i]); for(int i=0;i<=min(sz[to],K);++i) for(int j=1;j<=min(sz[u],K);++j)if(i+j<=K) dp[u][i+j]=add(dp[u][i+j],mul(tmp[j],dp[to][i])); sz[u]+=sz[to]; } } int main() { int x,y; while(~scanf("

codeforce1073 C. Vasya and Robot 二分

codeforce1073 C. Vasya and Robot 给定N个操作和一个终止点(x,y)求改变最小的区间操作区间R-L+1,使N个操作之后到达终止节点 二分区间长度mid,预处理区间位置偏移量,尺取每个长度为mid的区间(可以全都修改),若存在则扩大区间,否则缩小区间 #include<bits/stdc++.h> using namespace std; const int MAX=2e5+5; int n; char s[MAX]; pair<int,int>a[MAX]; void add(int &x,int &y,char c) { if(c=='U') ++y; else if(c=='D') --y; else if(c=='L') --x; else ++x; } int main() { int x,y; while(~scanf("%d",&n)) { scanf("%s",s+1); scanf("%d%d",&x,&y); if(abs(x)+abs(y)>n||(n-abs(x)-abs(y))%2) {printf("-1\n");continue;} a[0].first=0;a[0].second=0; for(int i=1;i<=n;++i) { a[i]=a[i-1]; add(a[i].first,a[i].second,s[i]); } int l=0,r=n,mid,xx,yy,ans=0; while(l<=r) { mid=(l+r)>>1; for(int i=1;i<=n-mid+1;++i) { int xx=a[n].first-a[i+mid-1].first+a[i-1].first,yy=a[n].second-a[i+mid-1].second+a[i-1].second; xx=x-xx;yy=y-yy; if(abs(xx)+abs(yy)>mid||(mid-abs(xx)-abs(yy))%2) {if(i==n-mid+1) l=mid+1;} else {r=mid-1;ans=mid;break;} } } printf("

vuex namespaced的作用以及使用方式

vuex中的store分模块管理,需要在store的index.js中引入各个模块,为了解决不同模块命名冲突的问题,将不同模块的namespaced:true,之后在不同页面中引入getter、actions、mutations时,需要加上所属的模块名 1、声明分模块的store时加上namespaced:true // initial state const state = { userId:'',//用户id userName:'',//用户名称 token:'',//token permission:''//权限 } // getters const getters = { // 获取用户信息 getUserInfo(){ return state; } } // actions const actions = {} // mutations const mutations = { setUserInfo(state,payload) { console.log("payload:"+payload); console.info(payload); state.userId = payload.userId; state.userName = payload.userName; state.token = payload.token; state.permission = payload.permission; } } export default { namespaced: true, state, getters, actions, mutations } 2、使用模块中的mutations、getters、actions时候,要加上模块名,例如使用commint执行mutations时 格式:模块名/模块中的mutations

【Baidu Apollo】感知-基于单目摄像头的物体检测

本文来自于Apollo开发者社群,作者是百度美研Apollo感知团队的资深软件架构师——陈光 1. 物体检测模型中的算法选择 物体检测(Object Detection)是无人车感知的核心问题,要求我们对不同的传感器(如图中覆盖不同观测范围FOV的无人车传感器)设计不同的算法,去准确检测出障碍物。例如在Apollo中,为3D点云而设计的的CNN-SEG深度学习算法,为2D图像而设计的YOLO-3D深度学习算法等。 物体检测要求实时准确的完成单帧的障碍物检测,并借助传感器内外参标定转换矩阵,将检测结果映射到统一的车身坐标系或世界坐标系中。准确率、召回率、算法时耗是物体检测的重要指标。本次分享只覆盖Apollo中基于单目摄像头的物体检测模块。 相关文献如下: 1. Object Detection with Discriminatively Trained Part Based Models. IEEE Trans. PAMI, 32(9):1627–1645, 2010. 2. Faster RCNN, ICCV 2015 3. SSD: Single Shot MultiBox Detector, ECCV 2016 4. yolo9000: Better, Faster, Stronger, CVPR 2017 5. Focal Loss for Dense Object Detection, ICCV 2017 在众多物体检测模型中,我们如何选择最合适的算法?尤其是以2-stage为代表的Faster-RCNN, RFCN 和以 single stage为代表的SSD、YOLO之中应该如何选择?CVPR 2017一篇来自谷歌的论文《Speed/Accuracy Trade-offs for Modern Convolutional Object Detectors》做了比较细致的比较和评测。它将物体检测神经网络拆解为主框架Meta-architecture和特征描述模块Feature Extractor。并选择了不同的组合方式,去验证模型的实效性和准确率。 如图所示,在 MS COCO数据集上,YOLO V2取得了实时速度下良好的检测准确率。Faster RCNN+重载的 Inception ResNet V2虽然取得了最好准确率,但是时耗过长。完全不能满足无人车对实时性的要求。基于这种理论分析和在百度自有数据集上的评测,我们最终选择了YOLO作为主框架,以改进的DarkNet作为特征描述模块(Feature Extractor)。

实验吧后台登录

题目:http://www.shiyanbar.com/ctf/2036 源码中看见如下代码 先看php中md5这个函数 md5(string,raw) 参数描述string必需。要计算的字符串。raw 可选。 默认不写为FALSE。32位16进制的字符串TRUE。16位原始二进制格式的字符串 在看sql语句 所以只需要找到经过md5函数处理得到'or'xxxxx的字符串即可。题目提示ffifdyop.php。 ffifdyop经过md5函数处理后的到'or'6蒥欓!r,b;所以将ffidyop提交即可得到flag;

DB2数据库联邦(跨库查询)

实验目的 在本地数据库 sample 中直接查询远程数据库remoteDb的表:tab_test 1、查看数据库版本配置 – 本地数据库:sample db2licm -l 产品名: “DB2 Express-C” 许可证类型: “无担保” 到期日期: “永久” 产品标识: “db2expc” 版本信息: “10.5” 最大 CPU 数目: “2” 最大内存量 (GB): “16” 强制策略: “软停止” – 远程数据库:remoteDb@192.168.1.102 db2licm -l 产品名: “DB2 Express-C” 许可证类型: “无担保” 到期日期: “永久” 产品标识: “db2expc” 版本信息: “9.7” 最大 CPU 数目: “2” 最大内存量(GB): “2” 2、数据库编目 db2 catalog TCPIP node n_102 remote 192.168.1.102 server 50000 db2 catalog db remoteDb as remoteDb200 at node n_102

Xlinx DSP 48E1(二)

chapter1 Overview 目录 chapter1 Overview 1.DSP48E1 Slice Overview 2.相对于上一代的特征 3.Device Resources 4.Design Recommendations 5.Stacked Silicon Interconnect 1.DSP48E1 Slice Overview FPGA对数字信号处理(DSP)应用非常有效,因为它们可以实现定制,以及完全并行算法。 DSP应用使用了许多二进制乘法器和累加器,而它们最好要在专用DSP Slice中实现。 所有7系列FPGA具有许多专用的、全定制的低功耗DSP Slice,结合了高速和小尺寸的特点,同时能保持系统设计灵活性。 DSP Slice还提高了除了数字信号处理以外的许多应用的速度和效率,例如宽动态总线移位器,存储器地址发生器,宽总线多路复用器和存储器映射I / O寄存器。 DSP48E1 Slice的基本功能如图1-1所示。 有关完整的详细信息,请参阅图2-1和第2章,DSP48E1描述和细节。 DSP功能的一些亮点(Highlights)包括: 25 × 18 two’s-complement multiplier(25×18二进制补码乘法器): Dynamic bypass(动态旁路) 48-bit accumulator(48位累加器): Can be used as a synchronous up/down counter(可以用作同步向上/向下计数器) Power saving pre-adder(省电预加法器): Optimizes symmetrical filter applications and reduces DSP slice requirements(优化对称滤波器应用并降低DSP Slice要求) Single-instruction-multiple-data (SIMD) arithmetic unit(单指令多数据(SIMD)算术单元): Dual 24-bit or quad 12-bit add/subtract/accumulate(双24位或四通道12位加/减/累加)

Flutter ListView 列表点击和网页加载

上一篇讲了使用ListView加载列表数据,本篇,我们讲下列表项的点击,因为本篇的例子点击后是加载一个网页,所以本篇也讲下类似于Android的WebView和iOS的UIWebView加载网页。效果如下: item点击 在Android中,您可以通过调用方法setOnClickListener将OnClick绑定到按钮等view上. 在Flutter中,添加触摸监听器有两种方法: 具体可以查阅我之前的博客Flutter中的点击、拖动和其它手势 上篇博客中我们使用了Row、Column等Widget绘制了item,我们再在原来的Widget的外层包装个GestureDetector,添加手势,然后使用onTap处理点击,完整代码如下: new GestureDetector( child: Padding( padding: new EdgeInsets.fromLTRB(10.0, 0.0, 10.0, 0.0), child: new Column( children: <Widget>[ new Row( crossAxisAlignment: CrossAxisAlignment.start, //纵向对齐方式:起始边对齐 mainAxisSize: MainAxisSize.max, children: <Widget>[ new Expanded( child: Container( height: 95.0, child: getImage(data.articleThumbnail), alignment: FractionalOffset.center, ), flex: 1, ), new Expanded( child: Container( height: 95.0, margin: new EdgeInsets.fromLTRB(5.0, 0.0, 0.0, 0.0), child: new Column( crossAxisAlignment: CrossAxisAlignment.start, children: <Widget>[ new Container( child: new Text( articleTitle, style: new TextStyle( fontSize: 20.

React中,报错"Cannot read property 'setState' of undefined"时,如何处理

2019独角兽企业重金招聘Python工程师标准>>> App.js import React, { Component } from 'react'; import './App.css'; class App extends Component { constructor(props){ super(props); this.state = { num: 90 } }; handleClick(){ this.setState({ num: this.state.num + 1 }) }; render() { return ( <div className="App"> {this.state.num} <button onClick={this.handleClick}>点击</button> </div> ); } } export default App; 我们把num初始值通过构造函数constructor保存在this.state里,之后我们给button按钮一个点击事件handleClick, 然后通过点击button按钮来更新num的初始值,当我们点击的时候,毫无疑问报错了“Cannot read property 'setState' of undefined”, 翻译意思是:‘无法读取未定义的属性'setState'’,他的意思就是告诉我们,当我们点击的时候,并没有读取到setState中的值,也就是说: handleClick方法中的this与组件中的this不一致,不是同一个this。 碰到这个问题有两种解决方法:这两种方法的目的就是要保证:handleClick方法中的this与组件中的this要保持一致,这样才能读取到setState中的值来改变num, 第一种方法: import React, { Component } from 'react'; import './App.css'; class App extends Component { constructor(props){ super(props); this.

【C语言】利用循环输出菱形

输出菱形的思想主要是用了等差数列 an = a1 + (n - 1) * d 来求每个循环的约束条件; 一个完整的菱形必须是由空格 、星形 来组成,切分为两部分。 题目效果如下: //要求输出如下图形 * *** ***** *** * 代码如下: #include "stdio.h" int main(){ int i,j; //开始第一部分 for(i = 1; i <= 3; i++){ //输出第一部分空格 for(j = 1; j <= (4 - i); j++){ printf(" "); } //输出第一部分星号 for(j = 1;j <= (-1 + 2 * i); j++){ printf("*"); } printf("\n"); } //开始第二部分 for(i = 1; i <= 2; i++){ //输出第二部分空格 for(j = 1;j <= ( 2 + i - 1 );j++){ printf("

IDEA新建文件是自动生成注释信息设置

一、效果如下: package com.zjdx; /** * @author 作者信息 * @2018/10/24 11:24 * 文件说明: */ public class authortest { } 二、设置方法 打开设置界面:File->Settings->Editor->File and Code Templates(或快捷键Ctrl+Alt+S) 选择Includes,光标移到File Header,可直接编辑你想要的内容及格式,也可新建一个。 保存即可。

ORA-00911: 无效字符 问题和解决

我今天写JDBC插入数据库数据时出现ORA-00911: 无效字符问题, 我把SQL打到控制台上面,然后COPY到SQL PULS中是可以插入数据的, 但是在ECLIPSE中执行就报ORA-00911: 无效字符的错误, 我查了一下, 我的是类似这种的insert into tablea(aaa) values(‘111’); 把最后面的;去掉,修改为 insert into tablea(aaa) values(‘111’)就可以执行了。 我的数据库是oracle10g的。 原文:https://blog.csdn.net/xiaxiaorui2003/article/details/4343706

修改DNS大大提高mac Mojave下载速度

DNS: 114.114.114.114 点击桌面顶部状态栏里的苹果图标,在菜单里选择“系统偏好设置”。 点击互联网与无线下的“网络”。 在网络界面,选中正在联网的网络连接,点击右下角的“高级”选项。 在高级选项设置窗口中,选中DNS选项卡,按左下角的加号键添加一个DNS服务器地址,如8.8.8.8,也可以添加多个备用的。 到此DNS设置就完成了。

tensorflow API:tf.map_fn

tf.map_fn( fn, elems, dtype=None, parallel_iterations=10, back_prop=True, swap_memory=False, infer_shape=True, name=None ) 作用:map on the list of tensors unpacked from elems on dimension 0. 参数: fn: The callable to be performed. It accepts one argument, which will have the same (possibly nested) structure as elems. Its output must have the same structure as dtype if one is provided, otherwise it must have the same structure as elems. elems: A tensor or (possibly nested) sequence of tensors, each of which will be unpacked along their first dimension.

EEGLAB在MATLAB中的下载、安装教程

许多做心电图脑电图的同学,是必会接触到edf格式的文件,该文件是欧洲数据格式,点击CHB-MIT Scalp EEG Database可下载EEG开源数据库,接下来就需要说到eeglab的下载安装。 一、eeglab下载:eeglab分为V13、V14和完整版(注意:完整版适用于未安装MATLAB情形下,且只支持Windows os 32位操作系统,文件大小128M),安装了MATLAB就直接下载V13、V14即可。 建议最好先安装MATLAB,再下载eeglab工具包,最后再导入MATLAB工具包即可。 1、去eeglab实验室进行下载,点击eeglab Home进入官网,如下图所示: 2、在上一页面中,注意到左下角的 EEGLAB Menu/Download,点击Download,会弹出如下所示: 3、按照图示的提示进行操作,提交后出现以下页面: 4、我这里是先安装了MATLAB,故只需要下载最新版eeglab即可。下载文件名为:eeglab_current.zip 二、eeglab安装:将第一步下载的eeglab工具包导入MATLAB工具包即可 1、将下载的eeglab工具包进行解压后,将解压后文件名修改为:eeglab 2、找到MATLAB的安装目录,我这里是D:\MATLAB anzhuang 3、将解压、修改文件名后的eeglab复制到MATLAB安装目录下的toolbox下,我这里是D:\MATLAB anzhuang\toolbox 4、运行MATLAB软件,添加路径:file→set path(若MATLAB为中文版,直接:主页→设置路径),会弹出如下的框: 5、看看此路径中有没有eeglab,若没有直接:添加并包含子文件夹,将刚才复制后的路径导入即可,我这里是D:\MATLAB anzhuang\toolbox\eeglab,最好点击save即可。 6、查看路径是否添加成功:在MATLAB运行界面,输入eeglab命令,界面自动跳转,出现如下界面,则安装成功。 7、点击file—import data —using EEGLAB functions and plugins—from EDG/EDG+/EDF file,导入EDF文档,弹出如下界面 8、点击ok,弹出如下界面 9、点击ok,即可显示该数据集的详细信息,如下所示: 大家可按照此方法试试,若成功,烦请给个好评!不行,可在下面评论 不成功原因有三: (1)matlab版本和eeglab版本不兼容,不要下载最新的eeglab包 (2)操作不当,matlab添加路径需要将其子文件也添加进入 (3)出现biosig或者extension的错误,就是导入eeglab工具包缺插件导致(总共49个eeglab插件),这里把我的插件贴出来, 对照看缺什么插件,如果缺,就手动添加进去即可

Spring Cloud Eureka(六):Eureka Client 如何注册到Eureka Server

1、本节概要 根据前文我们对Eureka Server 有了一定的了解,本节我们主要学习Eureka Client 与 Eureka Server 如何通讯的及相关通信机制是什么,本文会弄清楚一下几个问题: @EnableDiscoveryClient 和 @EnableEurekaClient的区别 Eureka Client 启动时做了什么事情(初始化工作) Eureka Client 怎么注册到 Eureka Server(服务注册) 怎么获取 Eureka Server 上的服务的(服务获取) 怎么保证 Eureka Client 本地的服务列表与Eureka Server 上的服务列表保持一致的(服务同步) 2、@EnableDiscoveryClient 和@EnableEurekaClient 的区别 当我们使用服务发现的注解时,却发现了两种注解,经过尝试发现两者的使用效果是一样的,那么他们的区别是什么呢,通过查询官方文档是这样解释的: Spring Cloud Commons provides the @EnableDiscoveryClient annotation. This looks for implementations of the DiscoveryClient interface with META-INF/spring.factories. Implementations of the Discovery Client add a configuration class to spring.factories under the org.springframework.cloud.client.discovery.EnableDiscoveryClient key. Examples of DiscoveryClient implementations include Spring Cloud Netflix Eureka, Spring Cloud Consul Discovery, and Spring Cloud Zookeeper Discovery.

利用Requests库和正则表达式爬取豆瓣影评Top250

说明 最近看了下爬虫基础,想写个博客来记录一下,一来是可以方便和我一样刚入门的小白来参考学习,二来也当做自己的笔记供自己以后查阅。 本文章是利用python3.6和Requests库(需自行安装,cmd里运行pip install requests)以及正则表达式(其实利用正则表达式是比较麻烦的一种方式,但是正则表达式在很多语言都有应用,练习一下也是有好处的)来爬取豆瓣影评Top250的文本信息以及然后存储在本地的文件当中,阅读本文章前建议学习一下python基础和正则表达式。 第一次写博客而且刚刚入门python以及爬虫基础,本文的思路仅适用于不需要登录而且没有反爬机制的HTML网页,过程当中难免会有错误,还望大佬们能指出! 抓取分析 1、首先打开需要爬取的网址:https://movie.douban.com/top250 ,可以看到影评靠前的电影的详细信息。 2、向下滚动点击一次后页发现url变为https://movie.douban.com/top250?start=25&filter= ,再次向下滚动点击后页url又变为 https://movie.douban.com/top250?start=50&filter=,可以看出start参数的不同,分别为25和50,因此可以猜测后面url的start参数为75,100……利用这条规律就可以将url统一起来然后进行爬取 3、利用Requests下载目标网页的HTML代码 import requests from requests.exceptions import RequestException def get_one_page(url): try: res=requests.get(url) if res.status_code==200: return res.text return None except RequestException: return None html=get_one_page('https://movie.douban.com/top250') print(html) 本段代码是先用import导入程序必要的包,定义了一个函数get_one_page,参数为目标url,调用这个函数会返回目标url的html文本。函数内部利用requests来下载网页还是非常简单的,requests利用了get方法请求了目标网页,返回response对象,如果状态码是200(请求成功),就返回respose的text文本信息,利用print进行打印测试 4、得到目标网页的HTML代码之后,利用正则表达式进行解析。 查看网页源代码,可以发现每条电影的信息都在ol标签的li标签下 接下来就是利用正则表达式对html文档进行解析了,在此我们设定爬取目标为每个电影的排名,名称,描述,星级,评价人数以及主题等信息。 首先可以看到肖申克的救赎这部电影的排名是在该li标签下的em标签内,提取排名的正则表达式: <em class=" ">(\d+)</em> 关于正则表达式,可以利用在线测试工具http://tool.oschina.net/regex/#来测试自己写出的正则表达式是否正确,如果在在线测试工具里测试含有换行符的字符串进行正则匹配会匹配不到的(可能是因为我的知识水平不够哈,在python中可以添加re.S参数进行解决,因为一个点可以匹配除除了换行符以外的其他任意字符)这里仅对相关的一些正则的语法进行解释: \d表示数字匹配,加上括号表示要进行提取的部分 提取电影名称的正则表达式: <span class="title">(.*?)</span> #注意星号前面有个英文的点,这个点表示任意字符(换行符除外),型号表示任意长度,问号表示以非贪婪匹配的方式来匹配字符串。 关于贪婪匹配: 比如说给定字符串 hello54188hahaha 给定正则表达式 ^h.*(\d+)hahaha$以及 ^h.*?(\d+)hahaha$ # ^h表示查找以字母h开头的字符串,hahaha$表示以hahaha结尾的字符串,\d+表示匹配至少一个长度的数字 因为\d+代表提取出来至少长度为1的数字,所以第一种贪婪匹配的方式会把5418算进在.*中去,第一种方式得到的匹配出的数字的结果是8,而第二种非贪婪匹配的方式是把54188都算在\d+当中去的,所以第二中方式匹配除的结果为54188。所以说,你明白我的意思吧? 之后再对描述,星级,评价人数以及电影主演进行正则提取,在此都是同样的原理,不再一一赘述,最后匹配出的综合正则表达式为: <em class="">(\d+)</em>.*?<span class="title">(.*?)</span>.*?<p class="">(.*?)</p>.*?<span class="rating_num" property="v:average">(.*?)</span>.*?<span>(.*?)</span>.*?<span class="inq">(.*?)</span> 利用该正则表达式对下载的HTML网页进行解析 import requests import re from requests.

电脑怎么录屏,什么录屏软件最好

因为工作或者是娱乐,我们经常需要使用电脑去录制屏幕视频。那么如何录屏呢,使用什么软件可以录屏呢?其实电脑录屏整体来说还是比较容易的,有一款录屏软件就能轻松驾驭了,比如说windows自带的录屏软件,下面小编便教大家如何录制电脑屏幕。 使用方法 一、如果录制的是一些比较简单的视频,比如就几秒长短的视频,我们可以使用windows自带录屏软件。首先我们win+r,调出运行窗口。 二、然后我们输入栏里输入psr.exe,点击确定或者或者键盘敲击enter便能打开。 三、然后点击开始记录,便可开始记录视频。点击右边的停止记录即可结束视频录制。 四、windows自带的录屏软件准确的来说不能算是个完整的录屏软件,所以只能录制些简单的视频,如果需要录制更复杂的视频的话,我们可以使用屏幕录像工具。 五、打开屏幕录像工具,设置它的各项参数,如画质、录制范围、音频、录制格式等等。如果你录制的视频是游戏视频的话,小编建议大家后设置录制模式的时候可以选择游戏模式录制。 六、参数设置好了,我们可以设置下它存放视频的文件夹,点击更换目录即可设置我们存放视频的位置。 七、之后,我们就可以开始录制视频了,点击开始录制即可开始录屏,视频录制完成了,我们可以点击旁边的停止录制按钮完成录制。 八、最后录制好的视频,可以通过点击下图中打开文件夹,在弹出视频文件夹中进行查看。 你看明白了吗,其实电脑录屏并不困难,跟着本教程多操练几遍即可。

spring中的bean默认是单例模式

一、Spring单例模式及线程安全 Spring框架中的Bean,或者说组件,获取实例的时候都是默认单例模式,这是在多线程开发的时候需要尤其注意的地方。 单例模式的意思是只有一个实例,例如在Spring容器中某一个类只有一个实例,而且自行实例化后并项整个系统提供这个实例,这个类称为单例类。 当多个用户同时请求一个服务时,容器会给每一个请求分配一个线程,这时多个线程会并发执行该请求对应的业务逻辑(成员方法),此时就要注意了,如果该处理逻辑中有对单例状态的修改(体现为该单例的成员属性),则必须考虑线程同步问题。 同步机制的比较: ThreadLocal和线程同步机制相比有什么优势呢?他们都是为了解决多线程中相同变量的访问冲突问题。 在同步机制中,通过对象的锁机制保证同一时间只有一个线程访问变量。这时该变量是多个线程共享的,使用同步机制要求程序慎密地分析什么时候对变量进行读写,什么时候需要锁定某个对象,什么时候释放对象锁等繁杂的问题,程序设计和编写难度相对较大。 而ThreadLocal则从另一个角度来解决多线程的并发访问。ThreadLocal会为每一个线程提供一个独立的变量副本,从而隔离了多个线程对数据的访问冲突。因为每一个线程都拥有自己的变量副本,从而也就没有必要对该变量进行同步了。ThreadLocal提供了线程安全的共享对象,在编写多线程代码时,可以把不安全的变量封装进ThreadLocal。 由于ThreadLocal中可以持有任何类型的对象,低版本JDK所提供的get()返回的是Object对象,需要强制类型转换。但JDK 5.0通过泛型很好的解决了这个问题,在一定程度地简化ThreadLocal的使用 概括起来说,对于多线程资源共享的问题,同步机制采用了“以时间换空间”的方式,而ThreadLocal采用了“以空间换时间”的方式。前者仅提供一份变量,让不同的线程排队访问,而后者为每一个线程都提供了一份变量,因此可以同时访问而互不影响。 Spring使用ThreadLocal解决线程安全问题 我们知道在一般情况下,只有无状态的Bean才可以在多线程环境下共享,在Spring中,绝大部分Bean都可以声明为singleton作用域。就是因为Spring对一些Bean(如RequestContextHolder、TransactionSynchronizationManager、LocaleContextHolder等)中非线程安全状态采用ThreadLocal进行处理,让它们也成为线程安全的状态,因为有状态的Bean就可以在多线程中共享了。 一般的Web应用划分为展现层、服务层和持久层三个层次,在不同的层中编写对应的逻辑,下层通过接口向上层开放功能调用。在一般情况下,从接收请求到返回响应所经过的所有程序调用都同属于一个线程 ThreadLocal是解决线程安全问题一个很好的思路,它通过为每个线程提供一个独立的变量副本解决了变量并发访问的冲突问题。在很多情况下,ThreadLocal比直接使用synchronized同步机制解决线程安全问题更简单,更方便,且结果程序拥有更高的并发性。 如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。 或者说:一个类或者程序所提供的接口对于线程来说是原子操作或者多个线程之间的切换不会导致该接口的执行结果存在二义性,也就是说我们不用考虑同步的问题。 线程安全问题都是由全局变量及静态变量引起的。 若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行写操作,一般都需要考虑线程同步,否则就可能影响线程安全。 1) 常量始终是线程安全的,因为只存在读操作。 2)每次调用方法前都新建一个实例是线程安全的,因为不会访问共享的资源。 3)局部变量是线程安全的。因为每执行一个方法,都会在独立的空间创建局部变量,它不是共享的资源。局部变量包括方法的参数变量和方法内变量。 有状态就是有数据存储功能。有状态对象(Stateful Bean),就是有实例变量的对象 ,可以保存数据,是非线程安全的。在不同方法调用间不保留任何状态。 无状态就是一次操作,不能保存数据。无状态对象(Stateless Bean),就是没有实例变量的对象 .不能保存数据,是不变类,是线程安全的。 有状态对象: 无状态的Bean适合用不变模式,技术就是单例模式,这样可以共享实例,提高性能。有状态的Bean,多线程环境下不安全,那么适合用Prototype原型模式。Prototype: 每次对bean的请求都会创建一个新的bean实例。 Struts2默认的实现是Prototype模式。也就是每个请求都新生成一个Action实例,所以不存在线程安全问题。需要注意的是,如果由Spring管理action的生命周期, scope要配成prototype作用域 二、线程安全案例 SimpleDateFormat(下面简称sdf)类内部有一个Calendar对象引用,它用来储存和这个sdf相关的日期信息,例如sdf.parse(dateStr), sdf.format(date) 诸如此类的方法参数传入的日期相关String, Date等等, 都是交友Calendar引用来储存的.这样就会导致一个问题,如果你的sdf是个static的, 那么多个thread 之间就会共享这个sdf, 同时也是共享这个Calendar引用,非线程安全的。 这个问题背后隐藏着一个更为重要的问题--无状态:无状态方法的好处之一,就是它在各种环境下,都可以安全的调用。衡量一个方法是否是有状态的,就看它是否改动了其它的东西,比如全局变量,比如实例的字段。format方法在运行过程中改动了SimpleDateFormat的calendar字段,所以,它是有状态的。 这也同时提醒我们在开发和设计系统的时候注意下一下三点: 1.自己写公用类的时候,要对多线程调用情况下的后果在注释里进行明确说明 2.对线程环境下,对每一个共享的可变变量都要注意其线程安全性 3.我们的类和方法在做设计的时候,要尽量设计成无状态的 解决方法: 1.使用synchronized关键字进行数据同步,或者使用ThreadLocal保证线程安全 2.不适用JDK自带的时间格式化类,使用其他类库的 使用Apache commons里的FastDateFormat,宣城是既快有线程安全的SimpleDateFormat,可惜他只能对日期进行format,不能对日期串进行解析 使用Joda-Time类库来处理时间相关问题,该种对时间的处理方式比较完美,建议使用。 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ 一、单例模式:在spring中其实是scope(作用范围)参数的缺省设定值 每个bean定义只生成一个对象实例,每次getBean请求获得的都是此实例 单例模式分为饿汉模式和懒汉模式, 饿汉模式spring singleton的缺省是饿汉模式:启动容器时(即实例化容器时),为所有spring配置文件中定义的bean都生成一个实例懒汉模式在第一个请求时才生成一个实例,以后的请求都调用这个实例 spring singleton设置为懒汉模式: <beans default-lazy-init="true"> 二、另一种和singleton对应的scope值---prototype多实例模式 调用getBean时,就new一个新实例 singleton和prototype的比较 singleton: xml配置文件:

微信小程序使用百度地图的Api

在微信中用百度map地图 1.xxx.wxml中的文件 <!--pages/dili/dili.wxml--> <view> <viwe>经度:{{longitude}}</viwe> <view>纬度:{{latitude}}</view> <view>地址:{{address}}</view> <view>城市:{{cityInfo.city}}</view> </view> 2. 这是微信种js的代码 // 引用百度地图微信小程序JSAPI模块 var bmap = require('../../libs/bmap-wx.min.js'); var wxMarkerData = []; //定位成功回调对象 Page({ data: { // 这个值是在百度api中申请的。 ak: "tQcVtG7wiVYZ4GqTsCXIG5OUPQw0HhKL", //填写申请到的ak markers: [], longitude: '', //经度 latitude: '', //纬度 address: '', //地址 cityInfo: {} //城市信息 }, onLoad: function (options) { var that = this; /* 获取定位地理位置 */ // 新建bmap对象 var BMap = new bmap.BMapWX({ ak: that.data.ak }); var fail = function (data) { console.

计算文本相似度-杰卡德系数计算

源于https://juejin.im/post/5b237b45f265da59a90c11d6 杰卡德系数,英文叫做 Jaccard index, 又称为 Jaccard 相似系数,用于比较有限样本集之间的相似性与差异性。Jaccard 系数值越大,样本相似度越高。实际上它的计算方式非常简单,就是两个样本的交集除以并集得到的数值,当两个样本完全一致时,结果为 1,当两个样本完全不同时,结果为 0。算法非常简单,就是交集除以并集,下面我们用 Python 代码来实现一下: from sklearn.feature_extraction.text import CountVectorizer import numpy as np def jaccard_similarity(s1, s2): def add_space(s): return ' '.join(list(s)) # 将字中间加入空格 s1, s2 = add_space(s1), add_space(s2) # 转化为TF矩阵 cv = CountVectorizer(tokenizer=lambda s: s.split()) corpus = [s1, s2] vectors = cv.fit_transform(corpus).toarray() # 求交集 numerator = np.sum(np.min(vectors, axis=0)) # 求并集 denominator = np.sum(np.max(vectors, axis=0)) # 计算杰卡德系数 return 1.0 * numerator / denominator s1 = '你在干嘛呢' s2 = '你在干什么呢' print(jaccard_similarity(s1, s2)) 这里我们使用了 Sklearn 库中的 CountVectorizer 来计算句子的 TF 矩阵,然后利用 Numpy 来计算二者的交集和并集,随后计算杰卡德系数。这里值得学习的有 CountVectorizer 的用法,通过它的 fit_transform() 方法我们可以将字符串转化为词频矩阵,例如这里有两句话“你在干嘛呢”和“你在干什么呢”,首先 CountVectorizer 会计算出不重复的有哪些字,会得到一个字的列表,结果为:

关于SU(SeismicUnix)的使用——数字信号处理部分

一、绘制频谱曲线 首先我们需要一个数据,我们构造出一个模拟单炮数据data.su用suwind将数据变成单道数据,这里我从单炮数据中抽取关键字tracl=60的数据 : suwind<data.su key=tracl max=60 min= 60>singleline.su 对singleline.su作傅里叶变换(sufft),将振幅谱显示出来即可。命令行代码如下: sufft<singleline.su |suamp mode=amp|suxgraph style=normal 注意: 仅仅使用sufft和suamp,而没有输出或显示是不可以的!会报错:’output can’t be tty‘,需要用suxgraph进行显示或者进行输出,就不会报错了!通常将sufft与suamp组合起来使用,那么就可以将快速傅里叶变化后的结果中的mode=振幅(amp)、相位(phase)、实部和虚部(real/imag)显示或者输出。 二、使用sufilter进行滤波 *注:*在/su/src/demos/Filtering 中可以看到su自带的演示例子,但是由于demos里面需要OZ Yilmaz.H 和 .F 文件,但是在CWP的网页中无法打开对应链接进而下载数据。所以这可能就需要自己用su去构造一个模拟数据,然后分析demos里面的shell,对shell做一些修改并再应用了。 首先,我们sufilter的功能介绍,在命令行输入 sudoc sufilter, 我们可以看到sufilter是应用零相位的滤波器,应用时必须在道头中有参数dt! 可选择的参数有 f 和 amps ,而且f和amps的参数是对应的,也就是说每一个频率对应一个滤波器的振幅值。f和amps各有两个参数时,例如:在命令行输入: sufilter< single.su f=30,40 amps=1,0 > tmp.su //这行代码是说对 single.su 进行‘低通’滤波处理, //滤波器的参数为小于30Hz的为幅值为1,大于40HZ的部分幅值为零,30-40Hz之间的频率即为滤波器的过渡带。 f 和amps各有四个参数时,就可随意构成带通,带阻,低通和高通的滤波器,例如一个30-40Hz的带通滤波器: sufilter< single.su f=20, 30,40, 50 amps=0,1,1,0 > tmp.su 由此可见,sufilter的f=f1,f2,f3,…和amps=a1,a2参数表示的是:在频谱曲线上各个对应点(f1,a1), (f2,a2), (f3,a3), … 这些点的连线构成的滤波器,在这些点之外的曲线与第一个点和最后一个点的幅值相同。 最后注意: sufilter 的f与amps 只是用一对参数是不允许的对tmp.su可以使用上面一绘制频谱曲线的方法进行绘制频谱曲线,来查看效果参数verbose待补充!参数verbose待补充! 三、绘制fk谱 OZ. Yilmaz 在他的书《Seismic data analysis》的二维傅里叶变换中说: