很多人会问在网页中怎么插入视频,在HTML5中有新标签--video标签,但是兼容性可就没那么好了。
下面这段代码可以直接使用,里面的几个路径注意一下。
<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=7,0,19,0" width="512" height="384"> <param name="movie" value="http://xwzx.dzu.edu.cn/news/xuanchuan/fl.swf" /> <param name="quality" value="high" /> <param name="allowFullScreen" value="true" /> <param name="FlashVars" value="vcastr_file=http://xwzx.dzu.edu.cn/news/xuanchuan/zwx.flv&LogoText=Dezhou University&BufferTime=3" /> <embed src="http://xwzx.dzu.edu.cn/news/xuanchuan/fl.swf" allowfullscreen="true" autostart="true" FlashVars="vcastr_file=http://xwzx.dzu.edu.cn/news/xuanchuan/zwx.flv&LogoText=Dezhou University&IsAutoPlay=1&BufferTime=3" quality="high" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" width="512" height="384"></embed> </object> 注意一下里面的几个参数。
http://xwzx.dzu.edu.cn/news/xuanchuan/fl.swf 这个里面的路径是一个文件路径,得有
http://xwzx.dzu.edu.cn/news/xuanchuan/zwx.flv&LogoText=Dezhou University&BufferTime=3; 这个路径是你自定义的一个路径,注意要用绝对路径。还有LogoText后边的值是页面上要显示的文字
视频注意一下格式:flv swf
目录结构:
contents structure [-] html实现javascript方式实现 结合了倒数的javascript实现(IE)解决Firefox不支持innerText的问题结合了倒数的javascript实现(IE,Firefox)参考文章 下面列了五个例子来详细说明,这几个例子的主要功能是:在5秒后,自动跳转到同目录下的hello.html(根据自己需要自行修改)文件。
1) html的实现
<head>
<!-- 以下方式只是刷新不跳转到其他页面 -->
<meta http-equiv="refresh" content="10">
<!-- 以下方式定时转到其他页面 -->
<meta http-equiv="refresh" content="5;url=hello.html"> </head> 优点:简单
缺点:Struts Tiles中无法使用
2) javascript的实现
<script language="javascript" type="text/javascript"> // 以下方式直接跳转
window.location.href='hello.html';
// 以下方式定时跳转
setTimeout("javascript:location.href='hello.html'", 5000); </script> 优点:灵活,可以结合更多的其他功能
缺点:受到不同浏览器的影响
3) 结合了倒数的javascript实现(IE)
<span id="totalSecond">5</span>
<script language="javascript" type="text/javascript"> var second = totalSecond.innerText; setInterval("redirect()", 1000); function redirect(){ totalSecond.innerText=--second; if(second<0) location.href='hello.html'; } </script> 优点:更人性化
缺点:firefox不支持(firefox不支持span、div等的innerText属性)
3') 结合了倒数的javascript实现(firefox)
<script language="javascript" type="text/javascript"> var second = document.
环境:
Python 3.6 + MySQL5.7 + ubuntu18.04
最近在学习 Python 连接 MySQL 时,出现了一个错误 pymysql.err.InternalError: (1698, "Access denied for user 'root'@'localhost'")。
由于刚接触这部分内容,不知道如何解决,逛了一些技术博客之后依旧未解决,但最后还是发现问题出在了MySQL上。
原因在于:在我的ubuntu中安装MySQL时,默认是没有设置密码的。用Python脚本连接MySQL时,MySQL拒绝访问。
解决办法:给MySQL设置密码!
设置密码的办法有很多,大家可以去博客上找,例如:https://blog.csdn.net/qq_38737992/article/details/81090373
设置完密码之后,再重新运行Python脚本,就可以连接上MySQL了!
在 IP 数据包交付的过程中,在数据链路层会对数据包进行添加报头信息。以太网协议就是数据链路层的一个重要协议。这样说其实不太准确,因为以太网协议是一个规定数据链路层及物理层的协议,不能说它是数据链路层的一个协议。
以太网帧 以太网帧就是将网络层交付的数据添加报头信息后,此时的数据以帧的形式传递。以太网帧的格式如下:
在这里,目的地址与源地址这里都指的是 MAC 地址。每一个主机对应唯一的一个 MAC 地址,是由网卡决定的,长度是 48 位,所以这里的目的地址与源地址都是 6 个字节,也就是 48 个比特位。
在以太网帧的最后,还有一个 CRC 校验码,来校验数据是否异常。
在中间,有一个两个字节的类型标识。这个类型字段有三种值,分别是 : IP、ARP、RARP。
IP
如果类型码为 0800 那么在数据链路层解包完毕后,将该数据交付给网络层的 IP 协议来处理该报文。
ARP
如果类型码是 0806 , 那么在向上层交付的时候就交付给 ARP 协议,这里要说的是 ARP 协议是处于数据链路层与网络层之间的一种协议,也叫作地址解析协议。它将 IP 地址转换为 MAC 地址。
RARP
RARP 协议,就是 Reverse ARP,与 ARP 协议相同,是将 MAC 地址转换为 IP 地址的协议。
一般来说,数据第一次发送给目的主机时,在这之前应该发送 ARP 协议,根据目的主机的 IP 地址来确定目的主机的 MAC 地址,从而为后面的数据发送与接收提供便利。
MAC地址与IP地址 在数据发送传输的过程中,目的 IP 地址与源 IP 地址是永远不会变的,这是这个数据的起始与终点,而 MAC 地址是一直在变化的,由于数据在传输的过程中会经历很多的主机等,所以在这个过程中 MAC 地址一直在变。类似于我们坐车,要坐车从 A 出发,目的地是 D。这个过程中我们会经过 B C,在到达 B 的时候,此时的 MAC 地址相当于我们上一站是 A , 下一站是 C。而目的 IP 地址与 源 IP 地址 分别是 D 与 A,这样说的话就很好理解了。
文章目录 1. 创建索引2. 删除某个索引中的所有数据3. 查看文档 mapping4. 向现有 mapping 中增加字段5. 删除索引6. 创建/删除/切换别名 1. 创建索引 [PUT] -> ip:9200/index_name,请求体:
{ "settings": { "analysis": { "filter": { "remote_synonym": { "type": "dynamic_synonym", "synonyms_path": "http://xxx.oss-cn-beijing.aliyuncs.com/search/synonym_dic.txt", "interval": "30" } }, "analyzer": { "synonym_smart": { "filter": [ "remote_synonym" ], "tokenizer": "ik_smart" }, "ik_smart": { "tokenizer": "ik_smart" }, "ik_max_word": { "tokenizer": "ik_max_word" } } } }, "mappings": { "doc": { "dynamic": false, "properties": { "id": { "type": "long" }, "
Tensorflow Object Detection API Tensorflow Object Detection API环境准备安装或升级protoc编译proto文件将Slim加入PYTHONPATH完成安装测试 使用预训练模型进行图片检测更换预测模型 Tensorflow Object Detection API TensorFlow Object Detection API Github
https://github.com/tensorflow/models/research/object_detection
注意:object_detection依赖slim。
使用时,我们需要将research下的object_detection和slim都拷贝出来。
环境准备 安装或升级protoc 在object_detection/ptoroc中,可以看到一些proto文件,我们需要使用protoc程序将这些proto文件编译为python文件才可以。
TensorFLow Object Detection必须使用2.6.0以上的protoc进行编译,否则会报错。可以使用如下指令查看protoc的版本。
protoc --version 如果版本低于2.6.0就需要进行版本升级,如果版本高于2.6.0可以忽略当前操作。
protoc下载地址
下载文件后解压,会得到一个 protoc 文件,将它复制到系统的可执行目录即可,例如:
sudo cp bin/protoc /usr/local/bin 然后查看版本是否是新安装的版本。
编译proto文件 接下来,我们需要将“ object_detection/protos/”下的“.proto”文件进行编译,编译为“.py”文件,执行如下指令:
protoc object_detection/protos/*.proto --python_out=. 运行完,如果每一个“.proto”文件都生成了对于的“.py”文件,说明编译成功了。
将Slim加入PYTHONPATH TensorFlow Object Detection API 是以 Slim 为基础实现的,需要将 Slim 的目录加入 PYTHONPATH 后才能正确运行。具体来说,还是在 research 文 件夹下执行下面的命令。
export PYTHONPATH=$PYTHONPATH:`pwd`:`pwd`/slim 执行完,我们打开一个python shell,执行“import slim”运行成功,表示已经正确配置。
完成安装测试 python object_detection/builders/model_builder_test.py 这条命令会自动检查 TensorFlow Object Detection API 是否正确安装,如果出现"
目录
一、创建编辑框
1、创建编辑框
2、编辑框添加变量
二、代码实现:编辑框多行显示我们需要的消息
1、初始化
2、显示消息到edit中
3、边框框设置属性:让其支持拖拽条
multiline(多行):
Auto HScroll:自动水平滚动
Auto VScroll:自动垂直滚动
Horizontal Scroll:水平滚动条
Vertical Scroll:垂直滚动条
4、测试:运行结果
5、将编辑框内容写到梅神的FastOutputLog里面
6、效果
一、创建编辑框 1、创建编辑框 2、编辑框添加变量 点击编辑框——》点击项目——》点击类向导——》点击添加变量——》填入edit的名字,这样edit就有了名字了——》然后头文件中就有了这个变量的名字了
二、代码实现:编辑框多行显示我们需要的消息 1、初始化 bool CXMLTestDlg::InitEdit() { CWnd *pWnd; pWnd = GetDlgItem( IDC_EDIT1 ); //获取控件指针,IDC_EDIT1为控件ID号 pWnd->MoveWindow( CRect(600,0,1000,1000) ); //在窗口左上角显示一个宽100、高100的编辑控件 return true; } 2、显示消息到edit中 void CXMLTestDlg::EditShowData(CString _s) { CString cstr_temp; m_edit.GetWindowTextW(cstr_temp); //获取编辑框内容 CString cstr_temp02=cstr_temp+"\r\n"+_s; //设置输入框的内容 m_edit.SetWindowText(cstr_temp02); } 3、边框框设置属性:让其支持拖拽条 multiline(多行): Auto HScroll:自动水平滚动 选中时控件只能输入数字 水平滚动(Horizontal scroll) 水平滚动,仅对多行编辑框有效 自动水平滚动(Auto HScroll) 当用户在行尾输入一个字符时,文本自动向右滚动 垂直滚动(Vertical scroll) 垂直滚动,仅对多行编辑框有效 自动垂直滚动
const int a[10] = { 1, 2, 3, 4, 5,6,7,8 }; int b[2][4]={0}; int i=0; int j=0; for (int m=0;m<10;m++) { i=m/4; j=m%4; b[i][j]=a[m]; } for (int i=0;i<2;i++) { for (int j=0;j<5;j++) { std::cout<<b[i][j]; } std::cout<<std::endl; }
目录有:backup、bin、conf、lib、logs、temp、webapps、work、BUILDING.txt、CONTRIBUTING.md、LICENSE、NOTICE、RELEASE-NOTES、RUNNING.txt。
请看图:
1.其中backup目录中的内容如下图所示:保存了一些配置文件,是在第一次运行了Tomcat服务器以后产生的。它是对服务器进行简单的备份日志。和conf文件下的内容几乎一样。
2.bin目录内容如下图所示:主要用来存放Tomcat的命令,很多环境变量也在此处设置。以.sh结尾的代表Linux下的命令;以.bat结尾的代表Windows下的命令。其中startup.bat代表windows系统下启动Tomcat的命令;shutdown.bat代表Windows系统下关闭Tomcat的命令。同理startup.sh代表Linux下的启动Tomcat的命令;shutdown.sh代表linux下关闭Tomcat的命令。(该目录存放linux和window系统启停Tomcat的脚本)。
3.conf目录内容如下图所示:存放tomcat服务器全局配置的各种文件。backup文件夹为它的备份。catalina目录下可以设置默认加载的项目。Catalina目录下可以设置默认加载的项目和服务器内存大小。context.xml可以用来配置数据源之类的东西。logging文件记录tomcat服务器运行的日志记录。server.xml可以设置域名、端口号、IP、请求的编码、默认加载的项目。web.xml可以设置tomcat服务器支持的文件类型。tomcat-users.xml用来配置管理tomcat的用户与权限。
4.lib目录内容如下所示:存放Tomcat服务器所需要的所有Jar包。我们在连接数据库时常常烦恼每创建一个项目就要引入一个对应的oracle的Jar包或MySQL的Jar。但是如果你把这两个Jar包放在此目录下,就可以引入一次,下次再创建项目时不需要每次都引入Jar包。
5.log目录内容如下所示:用来存放Tomcat执行时的日志文件。清除此文件不会对Tomcat服务器产生影响。开始时此文件目录为空,只有运行了Tomcat才会在此目录下生成日志文件。
6.temp目录下的内容如下图所示:用来存放Tomcat执行过程中产生的临时文件。清除此文件不会影响Tomcat服务器。
7. webapps目录内容如下图所示:tomcat默认部署路径。目录用来存放应用程序,当Tomcat启动时会加载webapps目录下的应用程序。当然可以以war包、Jar包、普通文件夹三种形式发布应用。你也可以把应用程序存放在电脑磁盘的任意一个位置,但是需要在conf/Catalina/localhost目录下的配置文件中要配置好,使其映射。
8.work目录内容如下:用来存放Tomcat运行时编译后的项目文件。清空work目录,重启Tomcat,可以达到清除Tomcat服务器缓存的目的。
9.BUILDING.txt、CONTRIBUTING.md、LICENSE、NOTICE、RELEASE-NOTES、RUNNING.txt是Tomcat服务器的一些签证,运行,注意的信息。
springcloud 之 Feign Rpc
而且feign在底层封装了ribbon,以更友好,更灵活的形式展现在了我们眼前,所以今天我们研究的重心放在了feign身上。
feign是netflix提供的服务间基于http的rpc调用框架,在spring cloud得到广泛应用。默认情况下,一个feign client是在hystrix断路器中执行,并利用ribbon进行软负载选择远程服务(service),所以可以想象出一个feign client的层次架构是包裹的层次,hystrix控制整个rpc从调用到方法返回,而ribbon控制从选址到socket返回;
https://blog.csdn.net/zwx19921215/article/details/79804379
RestTemplate 可以认为就是对HttpClient的一个封装,可以把调用的结果转化成Java 对象,从而达到简化开发的目的。 SpringCloud实战5-Feign声明式服务调用
https://blog.csdn.net/xlgen157387/article/details/77773908
https://www.jianshu.com/p/8bca50cb11d8
feign是声明式的web service客户端,它让微服务之间的调用变得更简单了,类似controller调用service。Spring Cloud集成了Ribbon和Eureka,可在使用Feign时提供负载均衡的http客户端。
因为feign底层是使用了ribbon作为负载均衡的客户端,而ribbon的负载均衡也是依赖于eureka 获得各个服务的地址,所以要引入eureka-client。
每一个微服务模块都使用springboot内置的tomcat 打jar包 , 然后java -jar 运行打好的jar包 第一点需要注意的是: idea创建eureka服务, 注意生成的springboot项目默认是 application.properties, 需要手动复制一份命名为 application.yml, 再粘贴如下内容到yml文件里 server: port: 7061 eureka: instance: hostname: localhost client: registerWithEureka: false fetchRegistry: false serviceUrl: defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ #启动成功后,访问 http://localhost:8761/ 就可以看到浏览器界面了,eureka作为其他服务的注册中心则需要如下配置 #http://localhost:8761/eureka 第二点要注意的是, 当想创建第二个module时, 注意改变content root 文件夹的路径
java selenium 网页内嵌滚动条截图发邮件 主要问题下面展开说 由于公司要求做一个接口,请求这个接口进行网页截图并发送邮件的功能,本来前期是用python写好了,but似乎不太符合要求,那么就用java来重新写一遍,虽然我是java菜鸡,但这并不影响 我修修补补,ctrl c 和ctrl v嘛。 主要问题 此需求很简单,主要就是对网页的截图。 如果网页是自带了 浏览器的滚动条,那么 selenium 一条命令就可以解决整个网页的截图了,然鹅我们这网页是个坑,他的滚动条都是放在div这种元素中内嵌了, 因此需要对 div元素计算高度, 进行滚动截图, 然后将滚动出来的截图拼接到一起。
如图,这玩意分为了好几部分
左侧功能栏(截图时忽略)
顶部功能栏(不可能每滚动一次,就把顶部也截图进去,所以我选择 先截图顶部,然后截图 网页滚动条主体内容)
网页主体滚动条(当然啦, 这个滚动条属于那个非常惹人厌恶的div元素)
可以很清楚的明白,就是这玩意。 因此我们获取浏览器或者窗口高度是没有效果的, 必须先要获取这个div 滚动条的高度, just 像这样:
document.getElementsByClassName('scroll-canvas scroll-canvas--dashboard')[0].scrollHeight 下面展开说 private void getGrafana(String username, String password, String url, String mailUser, String mailPassword, String[] mailReceiver, String mailServer) { WebDriver driver=null; // 定义图片名称 Date d = new Date(); SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss"); String file_name = "
可以将FLASK_ENV环境变量设置为开发模式:
export FLASK_ENV=development flask run
CSS模块化设计 设计原则
可复用能继承要完整
周期性迭代设计方法
先整体后部分再颗粒化
先抽象再具体 JS组件设计 设计原则
高内聚低耦合
周期性迭代设计方法
先整体后部分再颗粒化
尽可能的抽象 自适应 基本概念
CSS像素、设备像素、逻辑像素、设备像素比
Viewport
Rem工作原理
利用viewport和设备像素比调整基准像素
利用px2rem自动转换css单位 SPA设计 设计意义
前后端分离
减轻服务器压力
增强客户体验
Prerender预渲染优化SEO工作原理
History API(onpopstate、pushState)
Hash(hashchange、lication.hash)
<!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> *{ padding: 0; margin: 0; } html,body{ height: 100%; } .cover{ width: 100%; height: 100%; background-color: red; position: absolute; top:0; opacity: 0.5; } .son{ height: 300px; width: 300px; background-color: blue; position: absolute; top: 0; bottom: 0; left: 0; right: 0; margin: auto; } </style> </head> <body> <div>111111</div> <div class="cover"> <div class="son"> <p>222</p> </div> </div> </body> </html>
InputStream 类 1、概述 转换流 java.io.InputStreamReader ,是Reader的子类,是从字节流到字符流的桥梁。
该类读取字节,并使用指定的字符集将其解码为字符。它的字符集可以由名称指定,也可以接受平台的默认字符集。 2、继承自父类的共性成员方法 该类继承于 Reader 类,继承了父类的共性成员方法:
int read() 读取单个字符并返回。 int read(char[] cbuf)一次读取多个字符,将字符读入数组。 void close() 关闭该流并释放与之关联的所有资源。 3、构造方法 InputStreamReader(InputStream in) 创建一个使用默认字符集的 InputStreamReader。 InputStreamReader(InputStream in, String charsetName) 创建使用指定字符集的 InputStreamReader。 参数:
InputStream in:字节输入流,用来读取文件中保存的字节
String charsetName:指定的编码表名称,不区分大小写,可以是utf-8/UTF-8,gbk/GBK,...不指定默认使用UTF-8
4、使用步骤 ① 创建InputStreamReader对象,构造方法中传递字节输入流和指定的编码表名称
② 使用InputStreamReader对象中的方法read读取文件
③ 释放资源
注意:构造方法中指定的编码表名称要和文件的编码相同,否则会发生乱码
Demo: 1 public static void main(String[] args) throws IOException { 2 //1.创建InputStreamReader对象,构造方法中传递字节输入流和指定的编码表名称 3 //InputStreamReader isr = new InputStreamReader(new FileInputStream("E:\\gbk.txt"),"UTF-8");//??? 4 InputStreamReader isr = new InputStreamReader(new FileInputStream("
OutputStreamReader类 1、概述 转换流 java.io.OutputStreamReader ,是Writer的子类,是从字符流到字节流的桥梁。
它使用指定的字符集将字符编码为字节。它的字符集可以由名称指定,也可以接受平台的默认字符集。 2、继承父类的共性成员方法 该类继承 Writer 类,继承了父类的共性成员方法
void write(int c) 写入单个字符。 void write(char[] cbuf)写入字符数组。 abstract void write(char[] cbuf, int off, int len)写入字符数组的某一部分,off数组的开始索引,len写的字符个数。 void write(String str)写入字符串。 void write(String str, int off, int len) 写入字符串的某一部分,off字符串的开始索引,len写的字符个数。 void flush()刷新该流的缓冲。 void close() 关闭此流,但要先刷新它。 3、构造方法 OutputStreamWriter(OutputStream out)创建使用默认字符编码的 OutputStreamWriter。 OutputStreamWriter(OutputStream out, String charsetName) 创建使用指定字符集的 OutputStreamWriter。 参数:
OutputStream out:字节输出流,可以用来写转换之后的字节到文件中
String charsetName:指定的编码表名称,不区分大小写,可以是utf-8/UTF-8,gbk/GBK,...不指定默认使用UTF-8
4、使用步骤【重要】 ① 创建OutputStreamWriter对象,构造方法中传递字节输出流和指定的编码表名称
② 使用OutputStreamWriter对象中的方法write,把字符转换为字节存储缓冲区中(编码)
③ 使用OutputStreamWriter对象中的方法flush,把内存缓冲区中的字节刷新到文件中(使用字节流写字节的过程)
④ 释放资源
Demo:
1 public static void main(String[] args) throws IOException { 2 //1.
1.先创建两个JAVA class文件, 命名为DBUtil和test3
写DBUtil
package com.gongmao;
import java.sql.*;
public class DBUtil {
public static Connection getConnection() throws ClassNotFoundException,SQLException{
Class.forName(“com.mysql.jdbc.Driver”);
Connection connection = DriverManager.getConnection(“jdbc:mysql://127.0.0.1:3306/zjgm?characterEncoding=utf-8&user=root&password=123456&useSSL=false”);
return connection;
}
public static void closeAll(ResultSet resultSet, Statement statement,Connection connection) throws SQLException{
if(resultSet!=null){
resultSet.close();
}
statement.close();
connection.close();
}
}
2.写好DBUtil后在昨天原有代码基础上替换,替换后的代码为
package com.gongmao;
import java.sql.*;
public class test {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
DBUtil dbUtil=new DBUtil();
Connection connection=dbUtil.getConnection();
System.out.println(“创建连接成功”);
//1.加载驱动
Class.forName(“com.mysql.jdbc.Driver”);
最近有朋友去阿里面试回来和我聊天,他的简历之前我看过,在一家传统企业做后端开发的,有3年的工作经验,但是对于分布式相关的经验不是很足。
在看过他的简历之后,我建议他看一些和分布式有关的东西,但是他并没有听,回来之后找我吐槽:"我都明确说了自己没有分布式经验,但是面试官还是抓着我问了很多分布式相关的问题..."
然后说:"早知道我就听你的多看一些分布式相关的知识了..."
"可是我真的没有经验那,看了理论知识真的有用吗?"
对于他的这一连串问题,我只能说:早就告诉你了你不听,我能怎么办。
但是其实他的困惑,也是很多人都有的一些困惑。我尝试着回答一下,如果你没有分布式相关的经验,那么你应该准备哪些理论知识?
首先需要强调的是,如果你没有相关经验,面试官还问你,这很正常!因为如果接触不到就可以完全不知道,或者完全不想办法去了解,那这种开发可能也正好不是大厂想要的人!
首先,关于分布式,有些纯理论的知识需要开发有个基本的概念:
1、什么是分布式,什么是集群,二者有什么区别?
2、分布式的 CAP理论、BASE理论?
3、什么是分布式的数据一致性?4、2PC、3PC、TCC等
画重点:这部分的理论要有些基本的掌握,至少CAP要知道,包括CAP的证明等。
还有就是和分布式相关的一些工具、框架、中间件等,如:
1.消息队列:Kafka、ActiveMQ、RabbitMQ、RocketMQ
2.RPC框架:Dubbo、gRPC
3.分布式缓存:Redis、Memcached4.分布式搜索:elasticsearch5、分布式协调:Zookeeper
画重点:这部分要知道如何进行技术选型,技术选型要考虑哪些因素,同类中间件之间的横向比较等。
还有就是一些分布式问题的解决方案:
1、分布式事务
2、分布式锁
3、分库分表
4、限流、降级
画重点:一个问题有多个解决方案的时候,要考虑各个方式的优缺点。
总之不管你有没有用过,就算没有使用的场景,也要饱含热情的去了解这些东西。
有分布式场景的大厂,就像一个围墙。外面的人都没有经验,里面的人才有经验。但是大厂招人又需要人有这样的经验。
其实,只要方法得当,准备面试并不难,也不会浪费太多的时间。
最后,在这里分享一些源码和框架的直播和视频资源,希望可以在金九银十助你一臂之力!
添加小姐姐微信,领取资料包与直播课 限时直播,名额有限,先到先得~
▼添加成功附赠网易Java进阶资料包
今天笔者遇到了一个比较奇葩的问题,就是笔记本电脑的wifi打不开了,即使打开了也是搜索不到周围的wifi的。这个问题一开始笔者没有发现,因为在暑假期间都是使用笔记本连接自己的手机热点进行上网的。然而暑期结束,笔者回到了学校,在宿舍有宽带,所以就没有注意到wifi不能正常使用的情况。也就在今天,上课时,老师使用红蜘蛛控制笔者的笔记本。然后笔者觉得听老师上课没什么意思,就想着不使用教室的网线,使用自己的wifi来摆脱控制。然而问题出现了,笔者的电脑竟然搜不到自己的手机热点。经过一段时间的琢磨,笔者解决了这个问题
接下来笔者就问题的解决过程记录下来,希望可以帮助到同样遇到这种问题的同学。
问题描述
在打开wifi时搜索不到任何的wifi或者就是打不开wifi
2.问题原因
一开始是怀是wifi相关的驱动丢了,但是笔者在使用驱动精灵检查了一遍,发现不是无线驱动的问题;在排除了无线驱动问题之后,有同学就说应该是硬件坏了,去电脑店看一下;然后笔者觉得直接去电脑店万一不是硬件的问题呢,乞不是要被学校的电脑店坑一笔吗;然后给之前懂硬件的老师发了条信息,到现在也没有回。很无奈(这里真的很想骂一句,)
后来发现是intel HD graphics 630的问题。
解决问题
首先我们在win10的开始界面右击,会出现如下菜单
接着我们点击设备管理器
找到显示适配器,显示适配器的下面有两个子功能,我们在intel HD graphics 630上右击
右击完成后就会自动的更新,更新完成后,我们再次的打开wifi就会看到,此时我们的wifi又可以正常的使用了
4.总结
虽然说问题解决了,但是笔者还是有一点迷惑的,或者说是有一点的匪夷所思,就是为什么wifi不能正常的使用会是显示适配器中的intel HD graphics 630的问题呢????
由于笔者的知识水平有限,在阐述上有不准确的地方,还请谅解,
同时欢迎大家的批评指正
题目描述:
给定一个正整数数组,最大为100个成员,从第一个成员开始,走到数组最后一个成员的步骤数,第一步必须从第一个元素开始,1<=步长<len/2,第二步开始以所在成员的数组走相应的步数。如果目标不可达返回-1,只输出最少的步骤数量。
输入描述:
由正整数组成的数组,以空格分隔,数组长度小于100,请自行解析数据数量。
输出描述:
正整数,表示最少的步数,如果不存在输出-1.
示例:
输入:
7 5 9 4 2 6 8 3 5 4 3 9 输出:
2 说明:第一步:第一个可选步长选择2,第一个成员7走第二个成员,第二步:第二个成员为9,经过9个成员到最后。
#include <iostream> using namespace std; int solve(int * a, int N) { int min=100; int i,j; for(i=1;i<N/2;i++) { int path=0; for(j=i;j<N;j+=a[j]){ path++; if(j==N-1){ min=min<path?min:path; break; } } } if(min==100) return -1; return min; } int main() { int a[100]; int tmp; int i=0; while(cin.peek()!='\n') { cin>>a[i++]; } cout<<solve(a,i); return 0; }
项目中会碰到在react项目中引入html静态页面的需求,以下是解决方法:
主要实现:通过<iframe>方式引入,以下是核心代码部分:
import data from './data.html'; // 引入需要引用的html文件 class Data extends Component { render() { return ( <iframe title="resg" srcDoc={data} style={{ width: '100%', border: '0px', height: '1100px' }} sandbox="allow-same-origin allow-scripts allow-popups allow-forms" scrolling="auto" /> ); } } export default withRouter(Data); 注意,因为这里的“data”是整个html文件中的代码并不是路径,所以在iframe中不能用src的方式,而要用srcDoc来代替,详细请百度iframe属性
出现问题:
You may need an appropriate loader to handle this file type.
| <!DOCTYPE html>
| <html lang="en">
| <head>
可能在编译的过程中会出现如上问题,意思是需要合适的loader处理文件类型,在react项目中中没有解析html类型的loader,所以需要我们自己手动添加,解析html文件的loader为html-loader,加在webpack.config.dev.js中,
同时也要安装依赖如下,以下是方法:
npm i html-loader -S { test: /\.
前提 刷酸记录(迪维维A酸乳膏) 20190601-2019-09-03
刷酸记录(迪维维A酸乳膏)20190903
刷酸记录(迪维维A酸乳膏)20190904
刷酸记录(迪维维A酸乳膏)20190905
0906 晚上 0906 23:00 维A酸乳膏涂抹全脸关灯睡觉,使用手机大概30分钟窗帘全部拉上;空气加湿器没有开 0907 早上 8:00 起床洁面:旁氏米粹洗一遍;洗脸感觉 脸部皮肤变得平滑;还变软了护肤:olay Prox 两滴管 + olay 修复霜一坨;olay修复霜用着感觉好疼;感觉脸上皮肤好干,下半部分脸大量脱皮,下巴和鼻子最严重(蜕皮很薄很软;擦下来是黄色的)下午公司加班,30分钟路程除了防晒伞,别的防晒都没有 0907 晚上 0907 23:00 维A酸乳膏涂抹全脸关灯睡觉,使用手机大概3分钟窗帘全部拉上;空气加湿器没有开 0908 早上 9:50 起床洁面:旁氏米粹洗一遍护肤:olay Prox 两滴管 + olay 修复霜一坨;olay修复霜用着感觉好疼;感觉脸上皮肤好干,好干;下午18:00 洗澡后,没有用护肤的,只喷了一些娥佩兰薏仁水;感觉干就喷 0908 晚上 0907 20:00 维A酸乳膏涂抹全脸; 99购物节没忍住,玩手机到22:00,把药洗掉了 0909 早上 8:30 起床洁面:旁氏米粹洗一遍护肤:olay Prox 1.5滴管 + olay 修复霜一坨;olay修复霜用着感觉好疼;感觉脸上皮肤好干,好干;眼睛旁边和鼻翼附近 有一点起干皮;下巴和脸上 的干皮变少
Vmware提示以独占方式锁定此配置文件失败。另一个正在运行的VMware进程可能正在使用配置文件以及虚拟机黑屏 解决办法:看了很多说删除.lck文件的,还有说删除.vmdk文件的,.vmdk文件在删除的时候提示无法删除,.lck文件删除后,也无法解决问题,又不想卸载重装。之后就打开控制面板,更改-修复VMware,重启电脑,再打开VMware不提示独占锁定文件失败,但是一直黑屏,之后就搜索cmd命令,然后以管理员方式打开,输入netsh winsock reset(这个命令是重置网络规范,黑屏的原因很可能就是VMware软件跟本地网络规范有冲突),回车之后提示成功重置winsock目录,您必须重新启动计算机才能重新完成配置。重启后打开即可。
点击上方“芋道源码”,选择“设为星标”
做积极的人,而不是积极废人!
源码精品专栏
原创 | Java 2019 超神之路,很肝~
中文详细注释的开源项目
RPC 框架 Dubbo 源码解析
网络应用框架 Netty 源码解析
消息中间件 RocketMQ 源码解析
数据库中间件 Sharding-JDBC 和 MyCAT 源码解析
作业调度中间件 Elastic-Job 源码解析
分布式事务中间件 TCC-Transaction 源码解析
Eureka 和 Hystrix 源码解析
Java 并发源码
来源:腾讯知乎官号
先说结论:也许可以实现,但你会什么都看不见。
一些网友留言
参考链接
“最近,知乎上有一个非常热门的问题:“把 14 亿中国人民都拉到一个微信群里在技术上能实现吗?”
实际上,根据国家统计局的数据,截至 2017 年末,中国大陆总人口为 13 亿 9008 万人(包括 31 个省、自治区、直辖市和中国人民解放军现役军人,不包括香港、澳门和台湾以及海外华侨人数),早已超过 13 亿。
目前,微信群组成员人数上限为 500 人,把近 14 亿中国人都拉到一个微信群,从技术的角度考虑现实吗?需要多少台服务器?
而且在一个 14 亿人的群里,要怎样抢红包?手机会不会爆炸?欢迎大家收看官方吐槽系列~
先说结论:也许可以实现,但你会什么都看不见。 根据 2017 年《微信数据报告》的公开数据 [参考 1] :2017 年 9 月,微信日均登陆 9.
python 中的 scipy 也有最优化的功能,体现在里面的 optimize 中,自己简单使用了下,发现它具有以下缺点:
优化算法比较少,有信頼域、单纯形法、BFGS算法等,能够满足不少常规函数的求解,但相对于 matlab 来说还是少的求解带约束的优化时,还需自己定义一阶导数,黑塞矩阵等,这一点很不方便。像 Matlab 只需输入函数就行,不需要你自己再输入一阶导数、黑塞矩阵。而 scipy 中求解带约束的优化问题时,需要自己计算出一阶导数或二阶导数后,再输入 跟专业的优化软件 Matlab, Lingo 等还有不少差距。
%02x
x 表示以十六进制形式输出
02 表示不足两位,,前面补0输出,如果超过两位,则以实际输出
如:
Scala
object Test { def main(args: Array[String]): Unit = { println("%02X".format(12)) // 0c println("%02X".format(2)) // 02 println("%2X".format(12)) // c println("%2X".format(2)) // 2 } } Java public class Test { public static void main(String[] args) { System.out.println(String.format("%02X",12 )); // 0c System.out.println(String.format("%02X",2 )); // 02 System.out.println(String.format("%2X",12 )); // c System.out.println(String.format("%2X",2 )); // 2 } }
Given a permutation pp of length nn, you are asked to answer mm queries, each query can be represented as a pair (l ,r )(l,r), you need to find the number of pair(i ,j)(i,j) such that l \le i < j \le rl≤i<j≤r and \min(p_i,p_j) = \gcd(p_i,p_j )min(pi,pj)=gcd(pi,pj).
Input There is two integers n(1 \le n \le 10^5)n(1≤n≤105), m(1 \le m \le 10^5)m(1≤m≤105) in the first line, denoting the length of pp and the number of queries.
目录 1、问题来源2、如何解决?思路来源操作流程 3、参考来源 1、问题来源 Mac的用户经常在打开之前保存的R Studio里的R markdown及script文件时,里面的中文注释出现了乱码,如???之类的。
2、如何解决? 思路来源 调整编码格式,参考了 Celine_y 的方法,但是没找到GBK格式,经过一个个试过去之后,发现,utf-8格式可以正常显示
操作流程 在Rstudio界面:
1、Tools -> Global Options -> Code -> Saving -> Default text encoding : (从列表里选择)utf-8
2、然后回到Rstudio主界面,点击File -> Reopen with encoding ->Choosing: utf-8
3、参考来源 https://blog.csdn.net/sinat_35559472/article/details/85964379
1、线型
'-' 实线 '--' 虚线 ':' 点线 '-.' 点划线
's'或squar 用正方形绘制各数据点 'p' 五角星 'd'或diamond菱形 'h' 六角星
'.' 用点号绘制各数据点 '^' 用上三角绘制各数据点
'+' 用'+'号绘制各数据点 'v' 用下三角绘制各数据点
'*' 用'*'号绘制各数据点 '>' 用右三角绘制各数据点
' .' 用'.'号绘制各数据点 '<' 用左三角绘制各数据点
2、颜色
'r' 红色 'm' 粉红 'g' 绿色 'c' 青色 'b' 兰色 'w' 白色 'y' 黄色 'k' 黑色
plot(t,y,'-bs','LineWidth',2,... %设置线宽为2
'MarkerEdgeColor','k',... %设置标记点边缘颜色为黑色
'MarkerFaceColor','y',... %设置标记点填充颜色为黄色
'MarkerSize',10) %设置标记点的尺寸/大小为10号
3、线宽
plot(i3,Global_opt_R1,'-r', i3,Global_opt_R2,'--b',i3,Global_opt_R3,'--b','linewidth',1.5)
4、坐标设置
set(gca,'fontsize',8);%设置坐标轴字体大小
set(gca,'linewidth',0.5); %坐标 线粗0.5磅
set(get(gca,'XLabel'),'FontSize',8);%图上文字为8 point或小5号
set(get(gca,'YLabel'),'FontSize',8);
前言:我们经常会遇到需求在linux下,读取某个文件获取数据。在本地测试中,使用docker作为容器引擎。那我们如何将本机的文件复制到容器中去呢?三部曲带你完美拷贝本地文件到docker容器
(1)查找容器
docker ps -a (2)确定我们的容器名,并获取容器长ID
docker inspect -f '{{.ID}}' store-dev (3) 拷贝本地文件到容器
docker cp 你的文件路径 容器长ID:docker容器路径 例子:
笔者将mac电脑桌面上文件夹名为RWD97019_20190300下的AVL和CHK文件复制到docker容器下的/ftpdata/award路径下
请注意,两边路径都要加上文件名+文件后缀 ,容器长ID后面是一个:
docker cp /Users/lidongbin/Desktop/RWD97019_20190300/RWD97019_20190300.AVL 33771096c8531094e1996c9b8b3689f149a1cbdb07957983c639c4863ce4eaee:/ftpdata/award/RWD97019_20190300.AVLdocker cp /Users/lidongbin/Desktop/RWD97019_20190300/RWD97019_20190300.CHK 33771096c8531094e1996c9b8b3689f149a1cbdb07957983c639c4863ce4eaee:/ftpdata/award/RWD97019_20190300.CHK 最后,我们进入容器查看是否成功拷贝
docker exec -it store-dev bash
前提 刷酸记录(迪维维A酸乳膏) 20190601-2019-09-03
刷酸记录(迪维维A酸乳膏)20190903
刷酸记录(迪维维A酸乳膏)20190904
0905 晚上 0905 新买服务器,将elk的节点分离开,迁移到别的机器上;手动reroute 没有分配的shards;11点下班0906 1:50 维A酸乳膏涂抹全脸关灯睡觉,使用手机大概6分钟(设置闹钟和声音,偷能量)窗帘全部拉上;空气加湿器没有开 0906 早上 (中雨) 8:10 起床洁面:旁氏米粹洗一遍;洗脸感觉 脸部皮肤变得平滑;还变软了护肤:olay Prox 两滴管 + olay 修复霜一坨;olay修复霜用着感觉好疼;明显脸变干,最后又叠加了一点荷荷巴油保湿防晒: 没有用防晒霜(总觉得不透气);黑色雨伞感觉脸上皮肤好干,10:00 下半部分脸大量脱皮,下巴和鼻子最严重(蜕皮很薄很软)
线性回归分析-回归算法 1 回归算法 机器学习中监督学习算法分为分类算法和回归算法两种,其实就是根据类别标签分布类型为离散型、连续性而定义的。回归算法用于目标是连续的,在指定区间内可以是任意一个数值,针对的是数值型的样本,使用回归,可以在给定输入的时候预测出一个数值,这是对分类方法的提升,因为这样可以预测连续型数据而不仅仅是离散的类别标签。
首先举个房价的例子,房子的面积和房子的价格有着明显的关系,那么在坐标系中可以看到这些点:
如果那么通过一条直线把这个关系描述出来,叫线性关系
如果那么通过一条曲线把这个关系描述出来,叫非线性关系
其实回归的目的就是建立一个回归方程(函数)用来预测目标值,回归的求解就是求这个回归方程的回归系数。
2 回归算法之线性回归 线性回归的定义是:目标值预期是输入变量的线性组合。线性回归通过一个或多个自变量与因变量之间进行建模的回归分析。其特点是一个或多个称之为回归系数的模型参数的线性组合。
一元线性回归:涉及到的变量只有一个。
多元线性回归:涉及到的变量两个或两个以上。
线性模型中的向量W值,客观的表达了各属性在预测中的重要性,对于这种“多特征预测”也就是(多元线性回归),那么线性回归就是在这个基础上得到这些W的值,然后以这些值来建立模型,预测测试数据。简单的来说就是学得一个线性模型以尽可能准确的预测实值输出标记。
那么如果对于多变量线性回归来说我们可以通过向量的方式来表示W值与特征X值之间的关系:
两向量相乘,结果为一个整数是估计值,其中所有特征集合的第一个特征值 =1,那么我们可以通过通用的向量公式来表示线性模型:
一个列向量的转置与特征的乘积,得出我们预测的结果,但是显然我们这个模型得到的结果可定会有误差,如下
3 损失函数(最小二乘法) 损失函数是一个贯穿整个机器学习重要的一个概念,大部分机器学习算法都会有误差,我们得通过显性的公式来描述这个误差,并且将这个误差优化到最小值。
对于线性回归模型,将模型与数据点之间的距离差之和做为衡量匹配好坏的标准,误差越小,匹配程度越大。我们要找的模型就是需要将f(x)和我们的真实值之间最相似的状态。所以误差公式就是模型与数据差的平方和最小:
上面公式定义了所有的误差和,如何去求模型当中的W,使得损失最小?(目的是找到最小损失对应的W值)。有两种办法,一种使用梯度下降算法,另一种使正规方程解法(只适用于简单的线性回归)。
正规方程公式如下:
4 最小二乘法之梯度下降 误差公式是一个通式,我们取两个单个变量来求最小值,误差和可以表示为:
通过调整不同的w1 和w0的值,就能使误差不断变化,而当你找到这个公式的最小值时,你就能得到最好的w1 ,w0而这对(w1 ,w0 )就是能最好描述你数据关系的模型参数。怎么找cost(w0+w1x1 )的最小?cost(w0+w1x1)的图像其实像一个山谷一样,有一个最低点。找这个最低点的办法就是,然后沿着这个弯下降的方向找,最后就能找到山谷的最低点。
进行移动的时候也需要考虑,每次移动的速度,也就是α的值,这个值也叫做(学习率)
样就能求出w0 ,w1的值,当然你这个过程是不断的进行迭代求出来,通过交叉验证方法即可。
α为学习率,需要手动指定
5 sklearn线性回归正规方程、梯度下降API sklearn.linear_model.LinearRegression 正规方程
sklearn.linear_model.SGDRegressor 梯度下降
方法:
fit(X,y,sample_weight = None)使用X作为训练数据拟合模型,y作为X的类别值。X,y为数组或者矩阵
predict(X)预测提供的数据对应的结果
属性:
coef_表示回归系数w=(w1,w2…)
intercept_ 表示w0
6 案例 波士顿房价数据案例分析流程
步骤:①波士顿地区房价数据获取;②波士顿地区房价数据分割③训练与测试数据标准化处理;④使用最简单的线性回归模型LinearRegression和
梯度下降估计SGDRegressor对房价进行预测
from sklearn.datasets import load_boston from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler from sklearn.
<!-- H5 快捷键 !+tab 键 --> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <title>Document</title> </head> <body> </body> </html> <!-- xhtml快捷键 html:xt + tab 键 --> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <title>Document</title> </head> <body> </body> </html> <!-- 两者区别:1.文档声明 编码声明不一 2.html5新增标签元素以及元素属性 -->
这个问题出现在使用window.location.href情况下,直接上代码吧
window.location.href = '192.168.10.19:8082/microProject/connector/7f9b3ba4dc77092d/adminSetup/whiteList' 上面这个代码直接报错 如下图:
解决方法:
window.location.href = 'http://192.168.10.19:8082/microProject/connector/428cff2385ebe526/adminSetup/whiteList' 加上了http://之后即可跳转,成为有效的链接地址
Springboot + Spring Security 实现前后端分离登录认证及权限控制 前言本文主要的功能文章目录文章正文一、准备工作1、统一错误码枚举2、统一json返回体3、返回体构造工具4、pom5、配置文件 二、数据库表设计建表语句初始化表数据语句 三、Spring Security核心配置:WebSecurityConfig四、用户登录认证逻辑:UserDetailsService1、创建自定义UserDetailsService2、准备service和dao层方法(1)根据用户名查询用户信息(2)根据用户名查询用户的权限信息 五、用户密码加密六、屏蔽Spring Security默认重定向登录页面以实现前后端分离功能1、实现登录成功/失败、登出处理逻辑(1)登录成功(2)登录失败(3)登出 2、在WebSecurityConfig中的configure(HttpSecurity http)方法中声明 八、会话管理(登录过时、限制单用户或多用户登录等)1、限制登录用户数量2、处理账号被挤下线处理逻辑3、在WebSecurityConfig中声明 九、实现基于JDBC的动态权限控制1、权限拦截器2、安全元数据源FilterInvocationSecurityMetadataSource3、访问决策管理器AccessDecisionManager4、在WebSecurityConfig中声明 十、最终的WebSecurityConfig配置十一、结束语 前言 关于Spring Security的概念部分本文不进行赘述,本文主要针对于对Spring Security以及Springboot有一定了解的小伙伴,帮助大家使用Springboot + Spring Security 实现一个前后端分离登录认证的过程。
文章会一步一步循序渐进的带大家敲一遍代码。最终的代码请看最后。
代码中我用到了插件lombok来生成实体的getter/setter,如果不想装插件请自己补全getter/setter
本文主要的功能 1、前后端分离用户登录认证
2、基于RBAC(角色)的权限控制
文章目录 1、准备工作
2、数据库表设计
3、Spring Security核心配置:WebSecurityConfig
4、用户登录认证逻辑:UserDetailsService
5、用户密码加密
6、屏蔽Spring Security默认重定向登录页面以实现前后端分离功能
7、实现登录成功/失败、登出处理逻辑
8、会话管理(登录过时、限制单用户或多用户登录等)
9、实现基于JDBC的动态权限控制
10、结束语
文章正文 一、准备工作 1、统一错误码枚举 /** * @Author: Hutengfei * @Description: 返回码定义 * 规定: * #1表示成功 * #1001~1999 区间表示参数错误 * #2001~2999 区间表示用户错误 * #3001~3999 区间表示接口异常 * @Date Create in 2019/7/22 19:28 */ public enum ResultCode { /* 成功 */ SUCCESS(200, "
前提 刷酸记录(迪维维A酸乳膏) 20190601-2019-09-03
刷酸记录(迪维维A酸乳膏)20190903
0904 晚上 0904 elk所在主机内存不够,启动检测过不去,无法启动;搞到23:00 下班0904 晚上24:00 维A酸乳膏涂抹全脸关灯睡觉,使用手机大概3分钟(设置闹钟和声音)窗帘全部拉上;空气加湿器有一些蓝光 0905 早上 (阴天+有太阳) 8:40 起床洁面:旁氏米粹洗两遍;洗脸感觉 脸部皮肤变得平滑护肤:olay Prox 两滴管 + olay 修复霜一坨;没有感觉疼防晒: 没有用防晒霜(总觉得不透气);防晒伞+普通一次性口罩感觉脸上皮肤变软;10:00 后在下巴处出现大量蜕皮,脸上也有几处蜕皮但很少(蜕皮很薄很软)感觉今天鼻子上黑头变明显了,不知道什么原因
很多小伙伴在购机时选择苹果手机都是因为iOS系统的流畅度和精简性,但iPhone在可玩性和信号方面是不如安卓手机的。大家在使用过程中一定遇到过这样的情况,连接同一个无线网,但是苹果的网速总是要比安卓慢,这该怎么办呢?
这时候我们需要设置苹果手机的静态DNS,从而达到提升部分网速的目的,而手机默认为自动配置DNS,我们需要手动设置一个响应时间最佳的DNS地址。
查询得知,114的DNS在全国的响应时间都要小于50ms,所以我们将DNS设置为:114.114.114.114
一、苹果手机设置静态DNS步骤如下:
1、进入iPhone的【设置】界面,打开【无线局域网】,部分机型为【Wi-Fi】,进入后找到对应的"感叹号"图标。
2、在无线网的网络设置界面,点击底部默认为自动的【配置DNS】,一般都是运营商自动分配的,这里我们进入,设置为【手动】。
3、然后添加2个DNS服务器,第一个服务器的地址设置为114.114.114.114,访问速度快;第二个服务器地址设置为223.5.5.5,稳定性和安全相对更高。
二、路由器设置静态DNS
如果手机设置了DNS效果仍然不满意,你还可以将无线网路由器设置静态DNS,首选DNS服务器为114.114.114.114;备用DNS服务器为223.5.5.5,与手机DNS服务器地址保持一致。
各品牌路由器设置界面不同,大家自行查询。
很多人都说iPhone手机的系统非常流畅好用,但除了一些基本的常用功能,还有着非常多的隐藏功能,比如"查找朋友"这项功能大家都知道,却又从来没用过,今天教大家将它变成追踪器,轻松掌握对方的实时位置!
具体步骤如下:
1、首先我们打开朋友的手机,可以是你的男朋友,可以是你的女朋友,也可以是你的家人。在桌面点击进入【查找朋友】,然后找到并点击右上角的【添加】按钮。
(如果桌面找不到该图标可以在App Store中搜索)
2、在【邀请】这一栏中点击【+】号,随之会跳转到通讯录,只需要添加上你自己,接下来在你的手机中打开【查找朋友】,会收到右图这条内容。
3、点击之后即可设置共享位置的时间,包括一小时、今天结束、始终共享。我们选择始终共享,这样以后无论何时,打开【查找朋友】就都能看到对方的位置了,瞬间变成追踪器!
实景地图查看对方的位置,也太清楚了吧,街道房屋马路通通能辨别清楚:
虽然这个功能很强大,但信任是感情稳固的基础,还望小伙伴们三思而后行。
最后你们认为这个功能是好还是坏呢?
版本 centos:7.6nginx:1.1mysql:5.7php:7.2laravel:5.5 关闭防火墙 systemctl stop firewalld.service systemctl disable firewalld.service 配置阿里yum源 参考
cd /etc/yum.repos.d/ wget http://mirrors.aliyun.com/repo/Centos-7.repo yum -y install wget mv CentOs-Base.repo CentOs-Base.repo.bak mv Centos-7.repo CentOs-Base.repo yum clean all yum makecache yum update php7.2 参考
php7.2源
yum install epel-release rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm yum install php72w-fpm php72w-opcache php72w-cli // 安装相应的依赖,请在php7.2源中查找 systemctl start php-fpm.service systemctl enable php-fpm.service nginx 参考
yum -y install nginx systemctl start nginx.service systemctl enable nginx.service mysql 参考
wget 'https://dev.
1.依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> 2.controller
package com.upload.upload_demo.controller; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletRequest; import java.io.File; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.UUID; @RestController public class FileUploadController { private static final Logger logger = LoggerFactory.getLogger(FileUploadController.class); // 项目根路径下的目录 -- SpringBoot static 目录相当于是根路径下(SpringBoot 默认) public final static String UPLOAD_PATH_PREFIX = "static/uploadFile/"; @PostMapping("/upload") public String upload(MultipartFile uploadFile, HttpServletRequest request){ if(uploadFile.isEmpty()){ //返回选择文件提示 return "请选择上传文件"; } SimpleDateFormat sdf = new SimpleDateFormat("
深入理解YOLO v3实现细节系列文章,是本人根据自己对YOLO v3原理的理解,结合开源项目tensorflow-yolov3,写的学习笔记。如有不正确的地方,请大佬们指出,谢谢!
YunYang1994 tensorflow-yolov3的开源项目地址:YunYang1994/tensorflow-yolov3github.com
深入理解YOLO v3实现细节系列 第1篇 数据预处理 第2篇 backbone&network 第3篇 构建v3的Loss_layer 目录
第1篇 数据预处理
1. 定义初始化函数
2.数据增强
3. 获取真实框(GroundTruth)的坐标和类别信息
3.1 读取真实框的注释(annotations)文件
3.2 获取真实框的坐标和类别信息
4. 获取3种不同尺寸的label和真实框
4.1 定义IOU计算公式
4.2 先验框(anchor box)的来源
4.3 定义preprocess_true_boxes函数
5. 将像素矩阵、label和真实框打包成mini_batch
补充
1. 定义初始化函数 参数初始化,参数的配置来自config.py
"""implement Dataset here""" def __init__(self, dataset_type): # 根据dataset_type的值,选择训练/测试的参数 # 数据注释文件的路径,此处为"./data/dataset/voc_test.txt" 或 "./data/dataset/voc_train.txt" self.annot_path = cfg.TRAIN.ANNOT_PATH if dataset_type == 'train' else cfg.TEST.ANNOT_PATH # 数据输入图像的大小,为了增加网络的鲁棒性,使用了随机[320, 352, 384, 416, 448, 480, 512, 544, 576, 608] # 中任意一种大小,注意,该处必须为32的倍数 self.
在学习C#的过程中,遇到这么一个问题——查看项目中的类图(类的关系图)。根据网上讲的流程,我在VS2017并没有发现这个功能,然后就在想,这是不是得安装一个东西呢?因为前期在安装VS的时候,我都是选择性的安装,并没有把所有的东西都装进去,毕竟内存有限呀。后来站在巨人的肩膀上,果真如料想的那般,确实少了一点东西,下面我把步骤分享给大家。
第一步:程序——Visual Studio Installer;
注:在打开Visual Studio Installer前要把VS2017关掉。
第二步:点击更多——修改;
第三步:选中Visual Studio扩展开发——类设计器——修改;
第四步:等待安装,安装成功后的界面;
第五步:打开需要查看的项目,右键——查看——查看类图;
问题成功解决。惊不惊喜?意不意外?学习这件事儿,很重要!很重要!很重要!
求两个数的最大公约数 欧几里得算法
枚举法
公共因子积
更相减损术
Stein算法
求两个数的最大公约数
一、问题描述与分析
设有 m 和 n 两个正整数,求 m 和 n 的最大公因子。
二、算法设计(或算法步骤)
欧几里得算法 算法简介 欧几里德算法是用来求两个正整数最大公约数的算法。是由古希腊数学家欧几里德在其著作《The Elements》中最早描述了这种算法,所以被命名为欧几里德算法。
算法过程描述 例如求 1997 和 615 的最大公因数的步骤:
1997 / 615 = 3 (余 152) 615 / 152 = 4 (余7) 152 / 7 = 21(余5) 7 / 5 = 1 (余2) 5 / 2 = 2 (余1) 2 / 1 = 2 (余0) 至此,最大公约数为1。
以除数和余数反复做除法运算,当余数为 0 时,取当前算式除数为最大公约数,所以就得出了 1997 和 615 的最大公约数 1。
定义:Web防火墙,主要是对Web特有入侵方式的加强防护,如DDOS防护、SQL注入、XML注入、XSS等。由于是应用层而非网络层的入侵,从技术角度都应该称为Web IPS,而不是Web防火墙。这里之所以叫做Web防火墙,是因为大家比较好理解,业界流行的称呼而已。由于重点是防SQL注入,也有人称为SQL防火墙。
一、首先了解WAF设计思路
部署在Web应用的前面以白名单思路来设计(定义保护对象 不能单个阻拦)只对HTTP、HTTPS协议进行检测Web应用模型、关联分析的技术 二、防御恶意文件上传
文件名
解析文件名,判断是否在黑名单内。
文件内容
解析文件内容,判断是否为webshell。
文件目录权限
该功能需要主机WAF实现,比如我见过的云锁。
目前,市面上常见的是解析文件名,少数WAF是解析文件内容,比如长亭。下面内容,都是基于文件名解析。
大致步骤如下:
获取Request Header里的Content-Type值中获取boundary值
根据第一步的boundary值,解析POST数据,获取文件名
判断文件名是否在拦截黑名单内
三、厂商防御技术
1.代理服务:代理方式本身就是一种安全网关,基于会话的双向代理,中断了用户与服务器的直接连接,适用于各种加密协议,这也是Web的Cache应用中最常用的技术。代理方式防止了入侵者的直接进入,对DDOS攻击可以抑制,对非预料的“特别”行为也有所抑制。Netcontinuum(梭子鱼)公司的WAF就是这种技术的代表。
2.特征识别:识别出入侵者是防护他的前提。特征就是攻击者的“指纹”,如缓冲区溢出时的Shellcode,SQL注入中常见的“真表达(1=1)”…应用信息没有“标准”,但每个软件、行为都有自己的特有属性,病毒与蠕虫的识别就采用此方式,麻烦的就是每种攻击都自己的特征,数量比较庞大,多了也容易相象,误报的可能性也大。虽然目前恶意代码的特征指数型地增长,安全界声言要淘汰此项技术,但目前应用层的识别还没有特别好的方式。
3.算法识别:特征识别有缺点,人们在寻求新的方式。对攻击类型进行归类,相同类的特征进行模式化,不再是单个特征的比较,算法识别有些类似模式识别,但对攻击方式依赖性很强,如SQL注入、DDOS、XSS等都开发了相应的识别算法。算法识别是进行语义理解,而不是靠“长相”识别。
4.模式匹配:是IDS中“古老”的技术,把攻击行为归纳成一定模式,匹配后能确定是入侵行为,当然模式的定义有很深的学问,各厂家都隐秘为“专利”。协议模式是其中简单的,是按标准协议的规程来定义模式;行为模式就复杂一些,
四、Imperva WAF部分功能讲解
1.多层防护措施 Protocol Validation检测HTTP协议的合规情况Attack Signatures侦测流行的攻击行为 Application Profile
侦测流行的攻击行为Data Leak Prevention防止敏感数据泄露ThreatRadar 在攻击展开前就阻止恶意用户的行为
2.Imperva专利技术
部分参考来源:
参考1. https://www.secfree.com/a/585.html
参考2.https://blog.csdn.net/chenyulancn/article/details/78842941
Android7.0之后调用相机相册就要申请相应的权限,所以首先要先申请相机相册的使用权限
添加依赖:
//动态权限申请库 implementation 'pub.devrel:easypermissions:1.3.0' 在MainActivity中获取权限:
private String[] permissions = {Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE}; //获取权限 private void getPermission() { if (EasyPermissions.hasPermissions(this, permissions)) { //已经打开权限 Toast.makeText(this, "已经申请相关权限", Toast.LENGTH_SHORT).show(); } else { //没有打开相关权限、申请权限 EasyPermissions.requestPermissions(this, "需要获取您的相册、照相使用权限", 1, permissions); } } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); //框架要求必须这么写 EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this); } //成功打开权限 public void onPermissionsGranted(int requestCode, @NonNull List<String> perms) { Toast.makeText(this, "相关权限获取成功", Toast.LENGTH_SHORT).show(); } //用户未同意权限 public void onPermissionsDenied(int requestCode, @NonNull List<String> perms) { Toast.
效果图
<!-- 分页 --> <div class="pager-box"> <el-pagination small background layout="prev, pager, next" :total="totalDataCount" :current-page="pageInfo.page" :page-size="pageInfo.limit" @size-change="handleSizeChange" @current-change="handleCurrentChange"> </el-pagination> </div> /*重写element样式*/ .pager-box >>> button, .pager-box >>> .el-pager li{ background-color: transparent !important; color: #B4C2DC !important; border: 1px solid #0672C4; } .pager-box >>> .el-pagination.is-background .el-pager li:not(.disabled).active { background-color: #0672C4 !important; }
SpringBoot 2.0 开始推 HikariCP ,将默认的数据库连接池从 tomcat jdbc pool 改为了 hikari , HikariCP 在性能和并发方面确实表现不俗(号称最快的连接池)。
如果你使用 spring-boot-starter-jdbc 或 spring-boot-starter-data-jpa ,会自动添加对 HikariCP 的依赖,也就是说此时使用 HikariCP 。当然你也可以强制使用其它的连接池技术,可以通过在 application.properties 或 application.yml 中配置 spring.datasource.type 指定。
基本配置
已经默认使用 HikariCP,所以只需要在 yaml 中添加数据库配置即可:
url: jdbc:mysql://localhost:3306?useSSL=false
username: root
password: 1234
HikariCP 默认配置
主要参数是在 com.zaxxer.hikari.HikariConfig 中初始化的,部分参数是在 com.zaxxer.hikari.pool.PoolBase 中初始化的。
name 描述 构造器默认值 默认配置validate之后的值 validate重置
autoCommit 自动提交从池中返回的连接 true true -
connectionTimeout 等待来自池的连接的最大毫秒数 SECONDS.toMillis(30) = 30000 30000 如果小于250毫秒,则被重置回30秒
idleTimeout 连接允许在池中闲置的最长时间 MINUTES.toMillis(10) = 600000 600000 如果idleTimeout+1秒>maxLifetime 且 maxLifetime>0,则会被重置为0(代表永远不会退出);如果idleTimeout!
文章目录 对于stun和turn的理解1. SDP协议2. 地址转换NAT3. candidate stunTURNICE 对于stun和turn的理解 在介绍turn和stun之前我们先来了解几个概念
会话描述协议 SDP(Session Description Protocol )网络地址转换 NAT (Network Address Translation)网络协商 candidate 1. SDP协议 我们来思考,如果两个不同的手机,一个手机支持VP8、VP9的媒体格式,另一个支持VP8、h264的协议,他们如果通信的话会选择什么格式的媒体来进行交流?
[外链图片转存失败(img-uB81o8AW-1567468988824)(SDP协商.png)]
这时候我们就需要用到这个SDP协议了,在WebRTC中,参与视频通讯的双方必须先交换SDP信息,这样双方才能知根知底,而交换SDP的过程,也称为"媒体协商"。
记住一点,SDP不叫媒体协商,交换SDP的过程才叫媒体协商,SDP全名叫会话描述协议
2. 地址转换NAT 经常有人问我=
为什么我配置了stun,进行了p2p穿透,可还是有很多情况下不通?为什么ios通,android不通?为什么移动能打通,电信打不通,wifi和4g有的通有的不通 好吧,其实我也不是很清楚
历史告诉我们,当我们无法触及到某个真理的时候,我们只能通过类比或者工具模拟的方式来解释我们所看到的一切。
说起nat,其实就是不知道对方实际地址,然后通过扔一个探测包,然后有回应就拿到对方地址的方式
我们说的nat不通,是因为咱们这个国内网络情况比较复杂,究其历史原因,就要说到移动、联通、电信的历史了,篇幅太长,暂时搁置。
总而言之,不通就不通嘛,总还有别的办法
3. candidate 我们先来看下Ice candidate类中的属性
public final String sdpMid;//描述协议的id public final int sdpMLineIndex;//描述协议的行索引 public final String sdp;//会话描述协议 好了,到这为止,应该已经了解到,这玩意就是个模版
当我们调用setLocalDescription的时候,底层的代码就会帮我们的收集candidate(候选信息),然后回调到上层,然后我们将其发送到服务器,然后服务器再发送到另一端
一定会好奇这个candidate里有啥是吧,其实就是一些网络信息的候选地址,一个不通换另一种的那种。
我们称交换candidate的过程称为网络协商
stun 好了,我们的主角登场
STUN(Session Traversal Utilities for NAT,NAT会话穿越应用程序)是一种网络协议,它允许位于NAT(或多重
NAT)后的客户端找出自己的公网地址,查出自己位于哪种类型的NAT之后以及NAT为某一个本地端口所绑定的
Internet端端口。这些信息被用来在两个同时处于NAT路由器之后的主机之间创建UDP通信。该协议由RFC 5389定
义。
其实有好多人问我,在局域网需不需要stun服务器?
我很认真的告诉你,不需要!
这时候,又会有人问了,你的demo为啥不部署stun,局域网内不通呢?
我也很认真的告诉你,请看官方demo,有个直连的类你可以借鉴,直接填写对方的地址,因为需要知道对方的地址才能进行通信的咧
来张图
将输入存到动态数组中 先修知识 getline(cin,str)来读取整行输入(包括空格),需要先定义string 变量cin>>name;使用cin作为输入时,输入遇到空白(空格)就停止插入 函数描述 输入格式是:1 2 3 ;4 5 6。(因为有空格不能直接用cin) 输出是:1;2;3;4;5;6;
因为有空格,只能尝试将两行输入作为字符串输入到vector容器中,并对vector的输出格式进行尝试。
发现vector容器可以使用v[i][j] 来读取第i个字符串中第j个元素的值
#include <iostream> #include <vector> #include <string> #include <map> using namespace std; int main() { vector<string> number; string n; for(int i=0;i<2;i++) { getline(cin, n); number.push_back(n); } for (int i = 0; i < number.size(); i++) { for(int j=0;j<number[i].size();j++) //if (('0' <= (number[i])[j]) && (((number[i])[j]) <= '9')) // cout << (number[i])[j] << endl; if(('0'<=number[i][j])&&(number[i][j]<='9')) cout << number[i][j] << endl; } return 0; }
安装Python 想要进行Python开发,首先需要下载和配置Python解释器。
下载Python 访问Python官网: https://www.python.org/点击downloads按钮,在下拉框中选择系统类型(windows/Mac OS/Linux等)选择下载最新版本的Python 安装Python 双击下载好的Python安装包勾选左下角Add Python 3.7 to PATH 选项,然后选择Install now立刻安装Python. 安装完成 测试是否安装成功 点击电脑左下角开始按钮,输入cmd 进入到windows的命令行模式。在命令行中输入Python,正确显示Python版本,即表示Python安装成功 如果在命令行中输入python出现如下错误 可能是因为在安装Python的过程中没有勾选 Add Python 3.7 to PATH 选项,此时需要手动对Python进行配置。 手动配置Python 注意:如果在安装过程中,已经勾选了 Add Python 3.7 to PATH选项,并且在cmd 命令模式下输入python指令不报错,就不需要再手动的配置Python.
右键此电脑 --> 选择 属性 选择高级系统设置-->环境变量-->找到并且双击Path 双击Path,在弹框里点击新建,找到Python的安装目录,把路径添加进去 这里新添加的路径 C:\Users\chris\AppData\Local\Programs\Python\Python37 是Python安装好以后,Python.exe 这个可执行文件所在的目录。 pip的使用 pip 是一个现代的,通用的Python包管理工具。提供了对 Python 包的查找、下载、安装、卸载的功能,便于我们对Python的资源包进行管理。
安装 在安装Python时,会自动下载并且安装pip.
配置 在windows命令行里,输入 pip -V 可以查看pip的版本。 如果在命令行里,运行pip -V,出现如下提示: 可能是因为在安装python的过程中未勾选 Add Python 3.7 to PATH 选项,需要手动的配置pip的环境变量。右键此电脑-->环境变量-->找到并且双击Path-->在弹窗里点击新建-->找到pip的安装目录,把路径添加进去。 这里新添加的路径 C:\Users\chris\AppData\Local\Programs\Python\Python37\Scripts 是Python安装好以后,pip.exe 这个可执行文件所在的目录。 使用pip管理Python包 pip install <包名> 安装指定的包pip uninstall <包名> 删除指定的包pip list 显示已经安装的包pip freeze 显示已经安装的包,并且以指定的格式显示pip install -r required.