seo优化方案

机器学习经典分类算法 —— k-均值算法(附python实现代码及数据集)

目录 工作原理 python实现 算法实战 对mnist数据集进行聚类 小结 附录 工作原理 聚类是一种无监督的学习,它将相似的对象归到同一个簇中。类似于全自动分类(自动的意思是连类别都是自动构建的)。K-均值算法可以发现k个不同的簇,且每个簇的中心采用簇中所含值的均值计算而成。它的工作流程的伪代码表示如下: 创建k个点作为起始质心 当任意一个点的簇分配结果发生改变时 对数据集中的每个数据点 对每个质心 计算质心与数据点之间的距离 将数据点分配到距其最近的簇 对每一个簇,计算簇中所有点的均值并将均值作为质心 python实现 首先是两个距离函数,一般采用欧式距离 def distEclud(self, vecA, vecB): return np.linalg.norm(vecA - vecB) def distManh(self, vecA, vecB): return np.linalg.norm(vecA - vecB,ord = 1) 然后是randcent(),该函数为给点的数据集构建一个包含k个随机质心的集合 def randCent(self, X, k): n = X.shape[1] # 特征维数,也就是数据集有多少列 centroids = np.empty((k, n)) # k*n的矩阵,用于存储每簇的质心 for j in range(n): # 产生质心,一维一维地随机初始化 minJ = min(X[:, j]) rangeJ = float(max(X[:, j]) - minJ) centroi

Read More
seo优化方案

属主还是属组?

1、创建/guanli 目录,在/guanli下创建zonghe 和 jishu 两个目录(一条命令) [root@localhost ~]# mkdir -p /guanli/zonghe |mkdir -p /guanli/jishu   2、添加组帐号zonghe、caiwu、jishu,GID号分别设置为2001、2002、2003 [root@localhost ~]# groupadd -g 2001 zonghe [root@localhost ~]# groupadd -g 2002 caiwu [root@localhost ~]# groupadd -g 2003 jishu   3、创建jerry、kylin、tsengia、obama用户,其中的kylin用户帐号在2020年12月30日后失效 [root@localhost ~]# useradd jerry [root@localhost ~]# useradd -e 2020-12-30 kylin [root@localhost ~]# useradd tsengia [root@localhost ~]# useradd obama   4、将jerry、kylin、tsengia、obama等用户添加到zonghe组内 [root@localhost ~]# gpasswd -M jerry,kylin,tsengia,obama zonghe   5、创建handy、cucci用户,其中cucci帐号的登录Shell设置为“/sbin/nologin” [root@localhost ~]# useradd handy [root@local...

Read More
seo优化方案

电脑和手机连接同一个无线,电脑不能上网,手机能上网?

  今天晚上在用电脑连接家里的WIFI时,发现不能上网了,但是手机连接上却能上网,简单找了一下原因,才想起来白天的时候在公司,用电脑连接了公司的内网WIFI,修改过IP地址,指定来了连接上无线时使用的IP地址,所以这个时候,虽然连接上了家里的WIFI,但是IP地址不对,所以上不了网。   解决办法就是:   控制面板-----网络和共享中心-----更改适配器设置-----找到连接的WLAN----鼠标右击选择属性-----找到协议版本TCP/IPv4,双击------将IP更改为自动获取IP,然后点击确定就行了。

Read More
seo优化方案

10分钟了解分布式CAP、BASE理论

CAP理论 2000年7月,Eric Brewer教授提出CAP猜想;2年后,Seth Gilbert和Nancy Lynch从理论上证明了CAP;之后,CAP理论正式成为分布式计算领域的公认定理。 CAP定律说的是在一个分布式计算机系统中,一致性,可用性和分区容错性这三种保证无法同时得到满足,最多满足两个。 CAP:C :Consistency(一致性)A:(Availability)可用性P:(Partition Tolerance)分区容错性 让我们构造一个非常简单的分布式系统。 两台服务器G1和G2 两台服务器可以相互通讯 客户端可以随机访问任何一台服务器  Consistency(一致性) Gilbert and Lynch 这样描述的一致性. any read operation that begins after a write operation completes must return that value, or the result of a later write operation 在写操作完成之后的任何读操作都必须返回该值。 客户端向G1服务器发起一个写操作,把变量初始值v0 改为v1,接下来客户端可能向节点G1读取也可能向节点G2读取; 向G1发起一个读操作,得到更改后的值V1。这就是满足了一致性  向G2发起一个读操作,此时G1向G2发送同步消息 如果同步完成 ,那么读到的结果是v1,这样也满足了一致性  还未同步完成,这是G2还是v0,这就不满足一致性。 (Partition Tolerance)分区容错 Gilbert and Lynch 这样描述的分区容错. t

Read More
seo优化方案

深入学习 Intellij IDEA 调试技巧

程序员的日常工作除了写代码之外,很大一部分时间将会在查找 BUG,解决问题。查找 BUG,离不开在 IDE 中调试代码。熟练的掌握调试技巧,可以帮助我们减少查找时间,快速定位问题。 在 IDEA 中调试代码很方便,只要开启调试,在相应代码处使用断点,然后进行相应调试即可。正是因为只要掌握这几个功能,就可以调试代码,所以在很长一段时间内,不了解其他调试技巧。后续深入使用 IDEA 过程中,不断学会 IDEA 其他调试技巧,很大程度上加快调试速度。 Step 系列按钮 日常调试的过程中为了为了找到程序的bug,通常需要单步调试,一步一步跟踪程序执行的流程,根据变量的值,找到最终原因。 IDEA 中提供一系列 Step 功能按钮用于单步调试,可以在 Run 菜单栏找到全部 Step 功能。 另外在调试窗口也可以找到,不过这里只会显示一部分常用按钮。 调试过程中,使用频率最高的可能就是 Setp Over。Setp Over 可以单步调试代码,但是当碰到方法执行时,不会进入方法内,直接调用了方法,然后到下一行。 如果需要进入方法内,需要使用 Step Into 。Step Into 可以进入调用的方法内,不过默认情情况下并不会进入 java.* 等类的方法中。如果需要进入,可以在 Setting-Stepping 中设置,排除即可。。 另外还可以使用 Force Step Into,强制进入。 当碰到一行代码调用多个方法时,使用 Step Into 就比较蛋疼了。Step Into 会按照调用顺序进入调用的方法,但是往往我们只想进入其中一个方法而已。 这种场景下我们可以使用 Smart Step Into ,选择指定方法进入。 有些情况下,在进入一个方法后,可以使用 Setp Out,快速执行方法,然后跳回到调用处。 另外在进入 for/wh

Read More
seo优化方案

虚IP解决程序连只读服务器故障漂移

        目前公司有一套核心交易数据库配置了AlWaysON,SQL 2012版本, 1主4从, 其从库(8,14, 8.15) 这2台只读的从数据库服务器, 后台程序和wms等很多程序,都是直接配置IP连接这个2个机器,而且这2台机器已经过保,如果其中一天机器出现故障,不能使用,怎么处理?         怎么解决?         先谈谈后果:               这2台机器都有很多程序只读查询操作,一旦一台挂了,起不来(虽然概率很低), 连故障服务器的程序,IP要改,同时程序要重启, 这些程序和服务,还很多,很容易漏。一旦出现故障,至少按小时算业务才能恢复,波及的面很广,肯定一级事故,其他最大的老板肯定会知道。          怎么处理:              自己咨询了其他同行他们的做法:                 1,用域名替换IP,当IP的服务器有问题,修改DNS服务器就可以                 2,使用类似的MyCAT中间件,目的读库有故障漂移到其他读库中                 3,使用硬件,如携程他们的A10,可以做相关的分发    ...

Read More
seo优化方案

并发编程之Java内存模型

  在介绍Java内存模型之前,先来了解一下为什么要有内存模型,以及内存模型是什么。然后我们基于对内存模型的了解,学习Java内存模型以及并发编程的三大特性。   为什么要有内存模型   在计算机中,所有的运算操作都是由CPU的寄存器来完成的,CPU指令的执行需要涉及到数据的读写操作,而CPU只能访问主存中的数据。随着技术的发展,CPU的执行速度越来越快,而内存的访问速度没有太大的变化,导致CU每次操作主存都要等待很长的时间。于是就有了在CPU与主存之间添加缓存的设计。   内存模型:CPU Cache模型     目前缓存的数量达到了3级,最接近CPU的缓存称为L1,然后为L2、L3和主存。由于程序指令和数据的行为和热点分布差异比较大,因此将L1又细分为L1i(istruction)、L1d(data)。    CPU的出现是为了解决CPU直接访问主存效率低下的问题。程序在运行过程中,会将运算所需的数据从主存中复制一份到Cache中,这样CPU在计算时就可以直接对CPU Cache中的数据进行读写,当运算结束后,再将Cahce中的最新数据刷新到主存中。     虽然缓存的出现极大地提升了CPU的吞吐能力,但是也导致了缓存不一致的问题。这是因为CPU都是对Cache中的数据进行读写,不同线程之间的工作内存是相互独立的,对某个线程工作空间中的数据进行更新,可能会无法及时同步到其它缓存中。     为了保证数据的正确性,内存模型定义了共享内存系统中多线程程序读写操作行为的规范。   Java内存模型     Java内存模型(Java Memory Model ),简称JMM,是一种符合内存模型规范的,屏蔽了各种硬件和操作系统的访问

Read More
seo优化方案

史上最强Java开发环境搭建

       在项目产品开发中,开发环境搭建是软件开发的首要阶段,也是必须阶段,只有开发环境搭建好了,方可进行开发,良好的开发环境搭建,为后续的开发工作带来极大便利。        对于大公司来说,软件开发环境搭建工作一般是由运维来做,然而,对于小公司来说,这个工作就交给开发人员来做了,如开发经理。不管这个工作是交给运维人员做,还是 交给开发人员做,能确定的是:做这件事的人,一定是个资深的人,如此,方可让开发环境稳定运行,从而为后续的开发提供便利。        现实中,只有极少部分开发人员接触服务器(能接触的人,基本都是开发组长及其以上,或资深开发,小公司除外),然而,对于一个技术人员来说,服务器相关环境搭建是个必 不可少的环节,这就产生了一个矛盾:服务器相关搭建工作是程序员不可或缺技术,但大部分程序员又少接触服务器。鉴于此,本篇文章将详解这个专题,对于没搭建过服务器的开发 人员,初中级开发人员,.NET转java开发人员提供帮助。        本篇文章内容包括:Linux理论与实操,MySQL实操,JDK实操,Tomcat实操和Tomcat实操。 一 Linux环境搭建    本小结侧重于操作,主要内容大致包括: 两大类操作系统简要介绍 VMware Workstation Pro 15简要介绍及安装 CentOS简要介绍及基于Wi'n'dows 操作系统的安装 (一 )关于操作系统的介绍     1.Windows 系统        Window操作系统,是我们再熟悉不过的...

Read More
seo优化方案

LinkedHashMap的特殊之处

一、前言 乍眼一看会怀疑或者问LinkedHashMap与HashMap有什么区别? 它有什么与众不同之处?  由于前面已经有两篇文章分析了HashMap,今天就看看LinkedHashMap。(基于JDK8) 二、结构属性分析 1、继承关系 public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V> LinkedHashMap是HashMap的子类,说明HashMap有的功能LinkedHashMap都有。 2、Entery<K, V> head、tail : 双向链表 /** * The head (eldest) of the doubly linked list. */ transient LinkedHashMap.Entry<K,V> head; /** * The tail (youngest) of the doubly linked list. */ transient LinkedHashMap.Entry<K,V> tail; // Entry没什么特别之处,都是调用父类创建节点的。 static class Entry<K,V> extends HashMap.Node<K,V> { Entry<K,V> before, after; Entry(int hash, K key, V value, Node<K,V> next) { super(hash, key, value, next); } } 3、accessOrder:如

Read More
seo优化方案

HashMap源码分析(jdk7)

HashMap的结构图示 ​ jdk1.7的HashMap采用数组+单链表实现,尽管定义了hash函数来避免冲突,但因为数组长度有限,还是会出现两个不同的Key经过计算后在数组中的位置一样,1.7版本中采用了链表来解决。 ​ 从上面的简易示图中也能发现,如果位于链表中的结点过多,那么很显然通过key值依次查找效率太低,所以在1.8中对其进行了改良,采用数组+链表+红黑树来实现,当链表长度超过阈值8时,将链表转换为红黑树.具体细节参考我上一篇总结的 深入理解jdk8中的HashMap ​ 从上面图中也知道实际上每个元素都是Entry类型,所以下面再来看看Entry中有哪些属性(在1.8中Entry改名为Node,同样实现了Map.Entry)。 //hash标中的结点Node,实现了Map.Entry static class Entry<K,V> implements Map.Entry<K,V> { final K key; V value; Entry<K,V> next; int hash; //Entry构造器,需要key的hash,key,value和next指向的结点 Entry(int h, K k, V v, Entry<K,V> n) { value = v; next = n; key = k; hash = h; } public final K getKey() { return key; } public final V getValue() { return value; } public final V setValue(V newVal

Read More
seo优化方案

2019年一半已过,这些大前端技术你都GET了吗?- 上篇

一晃眼2019年已过大半,年初信誓旦旦要学习新技能的小伙伴们立的flag都完成的怎样了?2019年对于大前端技术领域而言变化不算太大,目前三大技术框架日趋成熟,短期内不大可能出现颠覆性的前端框架(内心OS:出了也学不动了)。 本文结合个人和团队经历对2019上半年做个技术总结,将各类技术框架/语言/工具分作两个维度: 技术采用生命周期 创新者(Innovators):技术的冒险者,第一时间尝试新技术 早期采用者(Early Adopters):技术早期采用者,具备一定探索精神,某个领域的意见领袖 早期大众(early majority):技术早期大众使用者,深思熟虑者,往往采用相对成熟的技术 晚期大众(late majority):技术的平民老百姓,跟随趋势采用当前主流的技术 落后者(laggards):技术的落后者,长时间不更新技术栈,存在大量技术债 技术方向按照大前端技术架构图进行分层,大体分为:状态管理、UI组件、小程序、跨平台、框架层、编程语言、工程化、监控、测试和服务端。   2019上半年大前端技术总结 状态管理 随着React、Vue这类前端框架的流行,组件化开发成为主流,然而随着页面复杂度越来越高,在一个组件文件中,要做UI渲染、事件处理、状态管理等等事情,于是一个文件变的越来越复杂。同时,页面组件层级变的复杂后,跨组件间的数据通信也变的很繁琐,需要将数据上提到父节点,通过property传输数据、回调方法更新父节点状态等等。 Facebook首先提出Flux框架,引入单向数据流的编程模式,把Action和Store从View中解耦出去,极大的优化了原有状态管理的架构。   Redux=Flux+Reducer,由于Store的唯一性加上Reducer纯函

Read More
seo优化方案

TypeScript入门实例

  前言   TypeScript是JavaScript的超集,微软公司开发,利用es6语法,实现对js的面向对象编程思想,写代码的时候会像强类型语言一样,指定参数类型、返回值类型,类型不对会报错,但编译后还是js,弱类型语言,就算是报错一样能编译,不影响程序运行,但可能会出现不可预期的bug;     更多介绍请看:   中文官网:https://www.tslang.cn/index.html   中文官网文档:https://www.tslang.cn/docs/home.html     本文记录一个TypeScript入门实例,主要内容有:   接口、类、继承、修饰符、引入jquery     代码   PS:一些要点写在了注释里面       按照我之前的这篇《TypeScript环境安装,以及配置idea开发环境》安装好环境后新建一个SpringBoot项目   大致的项目结构如下    需要用到页面,所以我们引入thymeleaf <!--Thymeleaf模板依赖--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency>     修改默认路径 spring.thymeleaf.prefix=classpath:view/ spring.thymeleaf.

Read More
seo优化方案

SpringBoot入门(二):日志及自定义属性

这一章主要说springboot中日志的配置、自定义属性的配置与读取、分环境的yml配置文件(如本地环境、测试环境、生产环境等)。比较偏向实际开发,较为实用,前面一章的一些基本创建在这里就不多废话了。 1. springboot的日志配置   在我们项目实际开发中,日志是不可或缺的。只有巧用日志才能快速发现线上问题并且定位线上问题并且解决!当然日志也可用来平时的本地调试,也可以快速定位代码的位置,跟debug搭配起来更好欧。   而springboot里面使用的是Logback日至框架,并用INFO级别输出到控制台(日志四个级别优先级从高到低分别是 ERROR、WARN、INFO、DEBUG)   1)添加日志依赖(其实不用) 1 <dependency> 2 <groupId>org.springframework.boot</groupId> 3 <artifactId>spring-boot-starter-logging</artifactId> 4 <version>2.1.6.RELEASE</version> 5 <scope>compile</scope> 6 </dependency>     但是!这里我们可以在pom.xml里找到 spring-boot-starter-web 依赖,点进去找到 spring-boot-starter 依赖。对没错,就是它,它里面已经引入了logger,所以我们不用手动添加logger。不信?点击去看        2)日志的使用     a) 首先创建一个config包,在包下创建一个LogConfig类,

Read More
seo优化方案

Cordova-iOS SDK封装

转载请标明来源:https://www.cnblogs.com/tony-17/p/11276027.html 源码编译与制作静态库 下载cordova-ios源码,下载地址为:cordova-ios 解压后使用Xcode进行编译,编译选定模拟器和Generic iOS Device,cmd+B,编译成功(Dynamic、Static均可)即可;        3. 使用lipo命令,合并Cordova.framework     选中Products下的Cordova.framework文件,Show in Finder找到该文件         如果项目编译成功,应该有两个文件夹,我用的是bebug模式,所以存在Debug-iphoneos和Debug-iphonesimulator两个文件夹         将Products文件夹Copy出来,使用终端工具,进行合并         合并成功后,出现新的文件,查看支持的架构         可以看到支持模拟器和真机;    之后将Cordova这个二进制文件放到Products下的任一Cordova.framework中,替换旧的exec文件;        Podspec的制作,支持pod引入    前提条件:需要安装了cocoapods    新建一个文件夹如CordovaiOSSDK,终端输入 pod spec create Cordova    之后会生成一个 Cordova.podspec 文件,接下来就是修改该文件了,找个顺手的编辑器,这里使用的是sublime text 3    打开podspec文件,看到内容、注释较多,将所有的注释删除,结果如下: Pod::Spec.new do |s| s.name

Read More
seo优化方案

老被跨域问题烦?看看都有哪些处理方法

前面写的《IT技术人员的自我修养》,没想到几天内收到了不少良好的反馈,在此感谢大家的关注。往后会不定时分享一些技术、管理领域的工作经验总结与感悟,欢迎大家持续关注、交流。最近被问及一个跨域的问题,包括之前面试时发现很多面试者对跨域及其处理也是一知半解,故本文对该问题进行了梳理总结,以供参考。 1. 什么是跨域 理解什么是跨域,就要先了解一个叫“同源策略”的东西,什么是“同源策略”?这是浏览器为了网站访问安全,对来自不同源的请求做一些必要的访问限制的一种策略。那什么叫“同源”呢?我们知道,一个http请求地址一般包含四部分:协议://域名:端口/路径,所谓同源,就是前面三者,即协议、域名、端口都一样。举例说明,假如我们有一个地址 http://blog.jboost.cn/docker-1.html, 来看以下地址是否与它同源 地址 是否同源 说明 https://blog.jboost.cn/docker-1.html 不同源 协议不同,一个http,一个https http://www.jboost.cn/docker-1.html 不同源 域名不同 http://blog.jboost.cn:8080/docker-1.html 不同源 端口不同,一个是默认端口80,一个是8080 http://blog.jboost.cn/docker-2.html 同源 虽然路径不同,但协议、域名、端口(默认80)都相同   那么浏览器对不同源的请求做了哪些访问限制呢?共有三种限制 对Cookie、LocalStor

Read More
seo优化方案

isMemberOfClass、isKindOfClass原理分析

isMemberOfClass - 调用者必须是传入的类的实例对象才返回YES- 判断调用者是否是传入对象的实例,别弄反了,如 [s1 isMemberOfClass:p1] ,意思是s1是否是p1的实例对象- 去去父类递归查找判断 源码: + (BOOL)isMemberOfClass:(Class)cls { return object_getClass((id)self) == cls; } - (BOOL)isMemberOfClass:(Class)cls { return [self class] == cls; } 有两个方法,一个类方法,一个对象方法,两者区别:  - 实例方法:是根据实例对象取得类对象,再去判断 - 对象方法:是根据对象取得元类对象,再去判断 实例代码: XPerson* p1 = [[XPerson alloc]init]; XStudent* s1 = [[XStudent alloc]init]; // true (用s1的类对象和 [s1 class] 判断,肯定是一样的了) NSLog(@"s1是否是s1 实例: %i",[s1 isMemberOfClass:[s1 class]]); // true ([s1 class] 与 [XStudent class] 等同,一个类只会有一个类对象,一个元类对象,可以有多个实例对象) NSLog(@"s1是否是XStudent 实例: %i",[s1 isMemberOfClass:[XStudent class]]); // false (s1的类对象 != p1的类对象) NSLog(@"s1是否是p1 实例: %i",[s1 isMemberOfClass:[p1 class]]); // fa

Read More
seo优化方案

Spring框架使用@Autowired自动装配引发的讨论

问题描述 有同事在开发新功能测试时,报了个错,大致就是,在使用 @Autowired 注入时,某个类有两个bean,一个叫a,一个叫b,Spring不知道该使用哪个bean注入。 一般这种情况应该声明注入哪个bean,他没有声明,他不知道这个类有两个bean,他说他和别人写的一样,别的都不报错。 OK,那来分析下吧。 问题分析 前提:@Autowired是根据类型(byType)进行自动装配的。 在默认情况下只使用 @ Autowired 注解进行自动注入时,Spring 容器中匹配的候选 Bean 数目必须有且仅有一个。 使用@Autowired 注解时要注意以下情况: 当找不到一个匹配的 Bean 时,Spring 容器将抛出 BeanCreationException 异常,并指出必须至少拥有一个匹配的 Bean。 如果当Spring上下文中存在不止一个候选Bean时,就会抛出BeanCreationException异常; 如果Spring上下文中不存在候选Bean,也会抛出BeanCreationException异常。 所以在使用 @ Autowired 注解时要满足以下条件: 容器中有该类型的候选Bean 容器中只含有一个该类型的候选Bean 问题探究 什么意思呢?我们用代码说话。 首先,我们 建一个实体类 Student : public class Student{ private String name; //getter and setter... } 然后我们在 Spring 容器中创建多个 Student 的实例,如下: 我们通过 XML 配置文件的方式在 Sprin

Read More
seo优化方案

TCP加速机制是如何加速的?

一、什么是TCP加速?   TCP加速就是在高时延链路提高吞吐量的一系列解决方案。   二、为什么需要对TCP进行加速?   1、传统的TCP拥塞控制算法并不适用于高时延、高误码的链路。 2、随着web元素的丰富,用户量的增加对交互时延和处理能力的要求越来越高。 3、对资源和合理配置,提高网络带宽利用率的需求。   以同步卫星通信场景为例讲解1 卫星通信的传输时延是因为卫星在36000公里的高空,电波的从地面到卫星再回到地面的时间大约是0.27秒(30万公里/秒)。这就是所谓的卫星通信的传输延时。 实测来讲:卫星的传输时延远大于理论值,同步卫星天地往返时延在500ms以上,链路较差是在600ms-800ms之间波动。 实际测试:在时延500ms、时延抖动较小的情况下,TCP连接不做加速时传输速率为空口带宽(卫星口最大传输能力)的30%-40%。例:10Mbps的带宽最大只能利用3Mbps-4Mbps,其余资源被浪费。   三、如何对TCP加速?   如何对TCP进行加速业界并没有一个标准,但有一系列的推荐方法。详细可阅读 RFC 3135   现在最常用的方法是: TCP透明代理 + 算法优化    TCP透明代理(TCP加速的核心思想) 原理:就是利用一些手段在内核或者协议栈捕获TCP报文,将TCP报文送入TCP加速器中处理并在处理完成后将报文头部还原并继续转发。 好处:1、透明代理可以把端到端的TCP分割为几个部分,这样就可以根据每个部分的丢包、时延情况进行不同的优化,从而提高TCP的性能。      

Read More
seo优化方案

数据库如何应对保障大促活动

当前,随着电商节日的增多(6.18、双十一、双十二)、平台拉新趋于频繁,大促活动也越来越普遍。作为一个电商平台,每年都会有一次,甚至几次的流量“大考”。数据库作为系统的重要节点,其稳定性和性能格外重要,数据库的全力保障是一个大的挑战。电商大促,这场没有硝烟的战争很多人已有体会,在此不再赘述。现在,我们直接切入主题--数据库如何 积极应对,全力保障 大促活动。这个题目分解为三个部分进行讲解: 第一部分,准备工作;第二部分,大促进行时;第三部分,大促后复盘。 “功夫在诗外”,同样,大促活动下数据库稳定、顺畅的运行,主要工作在大促前的准备上,所以,准备工作是重点。 一.大促前准备工作 1.对大促活动应该尽可能地去了解,去熟悉。包括业务模式、业务流程以及大促可能产生的订单量、预估峰值、预估的波峰时间、是否有爆款商品等。此外,还应对参与本次大促活动的参与方有所了解,特别是IT部的主要参与人员,保证跨部门协同精准、顺畅。 2.梳理大促活动用到的系统链路,对链路上的系统和应用有个较为清晰的了解,制作大促活动全链路的数据库流程图。 3.梳理链路上的数据库资源。梳理完善成一个Excel,包括数据库的名字、数据类型、数据库版本、用途、支持的主要系统、DBkey、物理IP、虚拟IP等、数据库Size、磁盘空间和可用空间、内存、最大连接限制。 4.对链路数据库故障恢复能力检查。主要是完整备份、日志备份 Job的检查,和备份文件可用性检查。 5.检查链路上数据库的可用性检查。主要是确定数据库采用的高可用架构、节点数、从节点配置、可用性监控、状态监控、同步监控等。 6.了解数据库从节点的使用情况,注意平时和预估大促期间主从延迟问题,以及延迟可能造成的影响;有无优化方案;以及大促期间出现较长的延迟时,有无替代方案(例如,是否可以将从节点上的虚拟IP漂移到主节点上)。

Read More
seo优化方案

如何设计实时数据平台(设计篇)

导读:本文将会分上下两篇对一个重要且常见的大数据基础设施平台展开讨论,即“实时数据平台”。 在上篇设计篇中,我们首先从两个维度介绍实时数据平台:从现代数仓架构角度看待实时数据平台,从典型数据处理角度看待实时数据处理;接着我们会探讨实时数据平台整体设计架构、对具体问题的考量以及解决思路。 在下篇技术篇中,我们会进一步给出实时数据平台的技术选型和相关组件介绍,并探讨不同模式适用哪些应用场景。希望通过对本文的讨论,读者可以得到一个有章可循、可实际落地的实时数据平台构建方案。 一、相关概念背景 1.1 从现代数仓架构角度看待实时数据平台 现代数仓由传统数仓发展而来,对比传统数仓,现代数仓既有与其相同之处,也有诸多发展点。首先我们看一下传统数仓(图1)和现代数仓(图2)的模块架构: 图1 传统数仓 图2 现代数仓 传统数仓大家都很熟悉,这里不做过多介绍,一般来说,传统数仓只能支持T+1天时效延迟的数据处理,数据处理过程以ETL为主,最终产出以报表为主。 现代数仓建立在传统数仓之上,同时增加了更多样化数据源的导入存储,更多样化数据处理方式和时效(支持T+0天时效),更多样化数据使用方式和更多样化数据终端服务。 现代数仓是个很大的话题,在此我们以概念模块的方式来展现其新的特性能力。首先我们先看一下图3中Melissa Coates的整理总结: 在图3 Melissa Coates的总结中我们可以得出,现代数仓之所以“现代”,是因为它有多平台架构、数据虚拟化、数据的近实时分析、敏捷交付方式等等一系列特性。 在借鉴Melissa Coates关于现代数仓总结的基础上,加以自己的理解,我们也在此总结提取了现代数仓的几个重要能力,分别是: 数据实时化(实时同步和流式处理能力) 数据虚拟化(虚拟混算和统一服务能力) 数据平民化(可视化和自助配置

Read More
seo优化方案

GStreamer基础教程06 – 获取媒体信息

摘要 在常见的媒体文件中,通常包含一些数据(例如:歌手,专辑,编码类型等),用于描述媒体文件。通常称这些数据为元数据(Metadata:data that provides information about other data)。我们可以通过这些元数据对媒体进行归类,同时可以在播放的过程中通过界面显示。本文将介绍GStreamer是如何快速获取元数据。   GStreamer元数据 GStream将元数据分为了两类: 流信息(Stream-info):用于描述流的属性。例如:编码类型,分辨率,采样率等。 Stream-info可以通过Pipeline中所有的GstCap获取,使用方式在媒体类型与Pad中有描述,本文将不再复述。 流标签(Stream-tag):用于描述非技术性的信息。例如:作者,标题,专辑等。 Stream-tag可以通过GstBus,监听GST_MESSAGE_TAG消息,从消息中提取相应信息。需要注意的是,Gstreamer可能触发多次GST_MESSAGE_TAG消息,应用程序可以通过gst_tag_list_merge ()合并多个标签,再在适当的时间显示,当切换媒体文件时,需要清空缓存。使用此函数时,需要采用GST_TAG_MERGE_PREPEND,这样后续更新的元数据会有更高的优先级。   示例代码 #include <gst/gst.h> static void print_one_tag (const GstTagList * list, const gchar * tag, gpointer user_data) { int i, num; num = gst_tag_list_get_tag_size (list, tag);

Read More
seo优化方案

macvtap使用教程

kubernetes一键安装 macvtap是虚拟机网络虚拟化常用的一种技术,当然容器也可以用. MACVTAP 的实现基于传统的 MACVLAN. 和 TAP 设备一样,每一个 MACVTAP 设备拥有一个对应的 Linux 字符设备,并拥有和 TAP 设备一样的 IOCTL 接口,因此能直接被 KVM/Qemu使用,方便地完成网络数据交换工作. 引入 MACVTAP 设备的目标是:简化虚拟化环境中的交换网络,代替传统的 Linux TAP 设备加 Bridge 设备组合,同时支持新的虚拟化网络技术,如 802.1 Qbg. 如kata的虚拟化网络就用了这个技术,以下实践完就会对kata的网络原理比较清楚了,建议对照教程动手实践. 实验环境介绍 此图非常重要,读整篇文章最好脑海里都有 初始化环境 qemu libvirt环境 我已经做好了qemu libvirt的镜像,大家可以直接使用: 在容器中有非常多的好处,环境如果乱了可以快速恢复干净的环境。 使用设备对也可减少对宿主机网络的影响。 docker run -d --privileged -v /dev:/dev -v /home/fanux:/root --name qemu-vm fanux/libvirt:latest init 注意: 网络等操作需要容器有特权模式 tap网络需要挂载/dev目录 /home/fanux可以作为工作目录,镜像自己编写的libvirt配置等放在里面防止删除容器后丢失 由于libvirt需要systemd所以我们在容器中启动init进程 也可自己构建镜像,我提供了一个Dockerfile, -j参数根据你机器CPU来设置编译时的线程数: FROM centos:7.6.1810 RUN yum install -y wget &

Read More
seo优化方案

熵、交叉熵及似然函数的关系

目录 熵、交叉熵及似然函数的关系 1. 熵 1.1 信息量 1.3 熵 2. 最大熵中的极大似然函数 2.1 指数型似然函数推导 2.2 最大熵中的似然函数推导 3. 交叉熵与极大似然 3.1 联系 3.2 交叉熵损失函数 熵、交叉熵及似然函数的关系 1. 熵 1.1 信息量   信息量:最初的定义是信号取值数量m的对数为信息量\(I\),即 \(I=log_2m\)。这是与比特数相关的,比如一个信号只有两个取值,那么用1个bit便能将其表示。后来著名的香农指出,得到的信号取值结果是随机的,因此其信息量应该也是关于概率的函数,于是得到随机变量\(X\)的信息量 \[ I(X=x_i) = -logP(x_i) \]   在机器学习中,熵是描述一个变量发生的不确定性的度量,不确定性越大,这里面包含的信息量就越大。比如有的学生常年不及格,让你预测他这次考试是否能及格,你肯定会说十有八九不会及格,也就是能否及格的确定性很大了,这时我们不会太关心其结果,因为其发生的结果太容易预料了,所以其信息量比较小。若该学生有时候能及格,有时候不能及格,这就有点捉摸不定了,我们很难猜中他能不能及格,这时他能否及格的信息量比较大。 1.3 熵   既然熵是反应变量(信号)总体不确定性的大小(信息量大小)的度量,那么如何确定熵的大小也就很明显了——对所有可能的取值计算其平均信息量,也就是求信息量关于概率P的期望。这样就表达了该信号(随机变量)的不确定性大小。 \[ H(X)=E_P[-logP(x)]=-\sum_xp(x_i)logp(x_i) \]   当X服从均匀分布时,X的熵的结果

Read More
seo优化方案

redis缓存穿透,缓存击穿,缓存雪崩原因+解决方案

一、前言 在我们日常的开发中,无不都是使用数据库来进行数据的存储,由于一般的系统任务中通常不会存在高并发的情况,所以这样看起来并没有什么问题,可是一旦涉及大数据量的需求,比如一些商品抢购的情景,或者是主页访问量瞬间较大的时候,单一使用数据库来保存数据的系统会因为面向磁盘,磁盘读/写速度比较慢的问题而存在严重的性能弊端,一瞬间成千上万的请求到来,需要系统在极短的时间内完成成千上万次的读/写操作,这个时候往往不是数据库能够承受的,极其容易造成数据库系统瘫痪,最终导致服务宕机的严重生产问题。 为了克服上述的问题,项目通常会引入NoSQL技术,这是一种基于内存的数据库,并且提供一定的持久化功能。 redis技术就是NoSQL技术中的一种,但是引入redis又有可能出现缓存穿透,缓存击穿,缓存雪崩等问题。本文就对这三种问题进行较深入剖析。 二、初认识 缓存穿透:key对应的数据在数据源并不存在,每次针对此key的请求从缓存获取不到,请求都会到数据源,从而可能压垮数据源。比如用一个不存在的用户id获取用户信息,不论缓存还是数据库都没有,若黑客利用此漏洞进行攻击可能压垮数据库。 缓存击穿:key对应的数据存在,但在redis中过期,此时若有大量并发请求过来,这些请求发现缓存过期一般都会从后端DB加载数据并回设到缓存,这个时候大并发的请求可能会瞬间把后端DB压垮。 缓存雪崩:当缓存服务器重启或者大量缓存集中在某一个时间段失效,这样在失效的时候,也会给后端系统(比如DB)带来很大压力。 三、缓存穿透解决方案 一个一定不存在缓存及查询不到的数据,由于缓存是不命中时被动写的,并且出于容错考虑,如果从存储层查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到存储层去查询,失去了缓存的意义。 有很多种方法可以有效地解决缓存穿透问题,最常见的则是采用布隆...

Read More
seo优化方案

第四章-使用本机文件对话框和帮助进程间沟通 | Electron实战

本章主要内容: 使用Electron的dialog模块实现一个本机打开文件对话框 促进主进程和渲染器进程之间的通信 将功能从主进程暴露给渲染器进程 使用Electron的remote模块从主进程导入功能到渲染器进程 使用webContents模块将信息从主进程发送到呈现器进程,并使用ipcRenderer模块为来自主进程的消息设置监听器 在前一章中,我们为第一个Electron项目打下了基础,这是一个笔记应用程序,它从左窗格中取出Markdown,并在右窗格中将其呈现为HTML。我们设置了主进程并将其配置为生成一个呈现器。我们建立了package.json,安装了必要的依赖项,创建了主进程和呈现器进程,并布置了UI。我们还探索了使我们的应用程序看起来像桌面应用程序的方法,但是我们还没有添加一个传统web应用程序所不能做的功能。 现在,应用程序允许用户在Markdown视图中编写。当用户在Markdown视图中按下一个键,应用程序将自动呈现Markdown为HTML并在HTML视图中显示它。 在本章中,我们将添加触发本机文件对话框的功能,并从文件系统上的任何位置选择文本文件并将其加载到应用程序中。在这章的最后,渲染进程的浏览器窗口中的“打开文件”按钮将从主进程触发“打开文件”对话框。在此之前,有必要更深入地讨论一下如何在进程之间进行通信。我们从第3章的分支开始,可以在第三章代码找到它。本章末尾的代码可以在第四章代码-使用本机文件对话框和帮助进程间沟通中找到。或者,您可以下拉主分支并检出这两个分支中的任何一个。 git clone https://github.com/sanshengshui/AUG git checkout -f 第4章-使用本机文件对话框和帮助进 程间通讯 触发本机文件对话框 开始的一个...

Read More
seo优化方案

面向对象之 开闭原则

  我觉得开闭原则,就是对扩展开放对修改关闭,在我们写代码过程中,代码“写死”,就是因为没有遵循开闭原则来实现代码。就好比盖房子一样,地基就好比你的基础类,地基上面的房子就好比你的实现类,这时候房主说在房子上加一些修饰导致你必须修改地基,如果你去改变地基,你上面的房子都会受到影响,这时候你就会修补房子,让房子不会因为地基的修改而倒塌。如果这时候房主在说一些新的需求,而你的地基不足以支撑房主的需求,这时候你就可能要推倒重盖,为什么造成这种情况,就是因为你当初在搭建地基的时候没有遵循开闭原则,不支持对新需求的进行扩展。   下面用代码 说说开闭原则的好处 class house{ constructor(name){ this.name = name this.int() } int(){ console.log('搭建'+this.name+'流程:')     this.base();     this.wall();     this.roof(); } //地基 base(){ console.log('搭建地基') } //墙壁 wall(){ console.log('搭建墙壁') } //房顶 roof(){ console.log('搭建房顶') } } //创建普通民房 new house('普通民房')  //搭建普通民房流程: //搭建地基 //搭建墙壁 //搭建房顶 house就是我创建的一个基础类,能制造出一个普通民房,如果我用它创建一个别墅那?别墅是不是得有阳

Read More
seo优化方案

脱壳系列_2_IAT加密壳_详细版解法1(含脚本)

1 查看壳程序信息 使用ExeInfoPe 分析: 发现这个壳的类型没有被识别出来,Vc 6.0倒是识别出来了,Vc 6.0的特征是 入口函数先调用GetVersion() 2 用OD找OEP 拖进OD 发现 这个壳和我们的正常程序很像。但是并不是我们的真正程序入口 因为vc6.0特征的第一个调用的是GetVersion(),给GetVersion()下 硬件断点 //第一次断下来,但是根据栈回溯,调用者并不是我们的模块 //第二次断下来,就应该是了 //找到入口后 栈上右键 反汇编窗口跟随 //如下 在OD看内存布局,一般.rdata的最前面是放的IAT,而且OD数据窗口默认就是.rdata的起始位置。 也可以点一个call /jmp  [];看一下来找IAT表 对那个地方下一个硬件写入断点 --DWORD,即当前面的壳程序在修改的时候就能段下来找到壳的加密算法的地方 3 对加密部分分析 这个分析的过程,需要自己去啃,是分享不了的。 我是从GetProcAddress 开始分析的,过程中往前观察分析了几次来解答这里的一些寄存器的内容信息、局部变量的信息,以下是我主要分析的部分: 通过对IAT表位置下硬件写入断点,我们找到了这个修改IAT的地方 断下这个GetProcAddress()这个函数 调用之后EAX保存的是 当前要填入IAT的真实地址 004385B9    FF15 CC924300      CALL DWO...

Read More
seo优化方案

从深处去掌握数据校验@Valid的作用(级联校验)

每篇一句 NBA里有两大笑话:一是科比没天赋,二是詹姆斯没技术 相关阅读 【小家Java】深入了解数据校验:Java Bean Validation 2.0(JSR303、JSR349、JSR380)Hibernate-Validation 6.x使用案例 【小家Spring】让Controller支持对平铺参数执行数据校验(默认Spring MVC使用@Valid只能对JavaBean进行校验) 【小家Spring】Spring方法级别数据校验:@Validated + MethodValidationPostProcessor优雅的完成数据校验动作 对Spring感兴趣可扫码加入wx群:`Java高工、架构师3群`(文末有二维码) 前言 关于Bean Validation的基本原理篇完结之后,接下来就是小伙伴最为关心的干货:使用篇。 如果说要使用Bean Validation数据校验,我十分相信小伙伴们都能够使用,但估计大都是有个前提的:Spring MVC环境。我极其简单的调查了一下,近乎99%的人都是只把数据校验使用在Spring MVC的Controller层面的,而且几乎90%的人都是让它必须和@RequestBody一起来使用去校验JavaBean入参~ 如果这么去理解Bean Validation的使用,那就有点太过于片面了,毕竟被Spring包裹起来,你其实很难去知道它真正做的事。 熟悉我文章风格的人知道,每篇文章我都会带你领略一些不一样的风景,本章亦不例外,会让你知道数据校验在Spring框架之外的一些事~ 分组校验 在我的前置原理篇文章,分组校验其实是没太大必要说的,因为使用起来确实非常的简单。此处还是给个分组校验的使用案例吧: @Getter @Setter @ToString public class Perso

Read More
seo优化方案

【译】在 Linux 上不安装 Mono 构建 .NET Framework 类库

在这篇文章中,我展示了如何在 Linux 上构建针对 .NET Framework 版本的.NET项目,而不使用 Mono。通用使用微软新发布的 Mocrosoft.NETFramework.ReferenceAssemblies NuGet 包,您将不需要安装除 .NET Core SDK 之外的任何其他软件包!总的来说,在 Linux 系统上构建 .NET Framework 类库时,只需要在你的项目文件中添加下面的节点即可: <PackageReference Include="Microsoft.NETFramework.ReferenceAssemblies" PrivateAssets="All" Version="1.0.0-preview.2" />   背景:在 Linux 上构建 full-framework 类库 如果您正在构建 .NET Standard NuGet 软件包,并且希望为用户提供最佳体验(并避免一些依赖性),那么您将需要查看有关跨平台定位的建议。那里有很多可以做和不可以做的建议,但我倾向于将其归结为:如果您的目标是任何版本的 .NET Standard,那么您至少需要以下目标框架: <TargetFrameworks>netstandard2.0;net461;net472</TargetFrameworks> 如果您的目标是.NET Standard 1.x,那么将其添加到构建目标中时,重要的是包含两个 .NET Framework 目标以避免 .NET Standard 2.0 垫片出现问题。 这就引出了一些问题 - 完整的 .NET 框架目标理论上只能在 Windows 上构建。在上一篇文章中,我展示了如何通过安装 Mono 并使用它提供的程序集来解决这个问题。在

Read More
seo优化方案

企业网站SEO的好处有哪些?

  想知道SEO的所有好处吗? 这个SEO好处列表会让你大吃一惊。你会感谢你读这篇文章。 每个企业都需要投资搜索引擎优化。 搜索引擎优化是优化您的网站以最大化来自搜索引擎的自然流量的过程。领先的搜索引擎是百度,神马搜索,360搜索和搜狗。 这个博客是对没有有效的SEO策略的每个人的警告。你没有利用以下所有的SEO优势,这是一个巨大的错误。 您每天都在为搜索引擎中的网站优化而亏本。 这就是原因。 1.有人在搜索引擎上搜索您的产品或服务 网上有超过数亿人。90%以上的在线活动始于搜索引擎。每秒有数万次搜索,每天搜索数十亿次。您的企业有数百万个机会可以在搜索引擎上找到。SEO最重要的好处之一是您的客户每天都在使用搜索引擎。 2. SEO引入优质流量 搜索引擎上的流量是最佳流量。为什么?因为人们实际上正在寻找你解决的问题。您可以为您的业务“吸引”流量。您不必“推出”广告来说服人们购买。搜索流量已对您的产品和服务感兴趣。这就是SEO行业价值数百亿元的原因。 3. SEO流量更有可能转换 SEO流量比其他流量来源更有可能转换。事实上,对于大多数网站来说,搜索流量的转化率最高。通过将自己定位在搜索引擎上,您可以定位您的业务以赢得更多转化。 4.SEO增加了销售额 SEO不是一个神话。如果您提供可行的产品或服务,您将增加您的潜在客户和销售额。一个小企业在短短5个月内就产生了超过百万元的搜索引擎优化结果。 但是,您必须投资最好的SEO策略。通过赢得SEO活动,您的企业将获得更高的转化率。 5.搜索引擎优化可以降低每次收购的成本 SEO的另一个好处是它是“免费的”。获得客户远比购买广告便宜。搜索引擎优化的唯一成本是雇用最好的SEO公司的成本。除非您有网站编码和百度算法方面的经验,否则您需要一家SEO公司或代理机构来提高您的排名并获得SEO的好处。 6. S

Read More
seo优化方案

担心Logo设计触碰“雷区”?logo设计网让你放心设计品牌logo

  尽管logo只是一个图标,但设计起来依然有不少讲究。若设计得不合理,很容易让受众引起反感,对于品牌传播是极为不利的。 在进行logo设计时,很多人完全不懂logo设计中的一些“禁忌”,导致经过很长时间辛苦与努力设计出来的作品,却因违法了禁忌而使logo的效果适得其反。 例如某家企业为了能够让企业文化在员工之间得到有效传播,准备将公司的品牌logo印刷在文化衫上。然而由于logo设计太过复杂,印在文化衫上logo显示得非常不清楚,也并不美观,于是就此作罢。 那么在进行logo设计时,为了防止日后出现与logo有关的麻烦,需要了解logo设计的六大“禁区”。 禁忌一:文化 每个国家,甚至是每个地区都有自己的文化禁忌,例如日本忌荷花、加拿大和英国忌白百合、美国忌数字13等,因此这些国家的公司在进行logo设计时,就要避免出现这些元素。 而在国内,龙、凤凰、麒麟在中国传统文化中有祥瑞的寓意,例如广电的“龙标”。 而在西方文化中“龙”则是邪恶的代表,在进行logo设计前,需要充分了解当地人文情况。 对于企业而言,若未来有打算将公司产品、品牌在世界得到广泛传播和使用,就要在设计时考虑到这些问题,避免出风到其他国家和地区的禁忌。 禁忌二:媒介 logo作为品牌的标签,很多时候与产品同时出现在顾客面前,因此每个logo的设计完成后,都将在后期适用在不同的媒介上,所以设计师们除了需要充分理解品牌内涵,也要对后期媒介的应用有一定的考量。 Logo是否能用在衣服布料、饮料等其他物体上面,都是设计者需要考虑的一点。例如知名快餐品牌麦当劳,logo造型简单,就可以印制在帽子上。 禁忌三:人像logo 很多品牌,例如麦当劳、真功夫、旺仔牛奶等,使用的都是人像logo。不过这些logo基本上都是经过各类艺术加工后才形成最终的logo标志。因此若想设计人像logo

Read More
seo优化方案

TestNg中的断言你真的了解吗

前言 在执行自动化测试脚本的时候,我们需要自动判断测试脚本执行完成后的实际结果是否与预期结果一致,这个时候就需要在程序运行之前写入断言,判断当前程序执行后是否正常。 关于TestNG断言分为两种: 软断言 硬断言 硬断言 在TestNg中,Assert类为硬断言,里面有多个静态方法被称为硬断言,特点就是,如果脚本运行断言失败,马上停止运行,后面代码将不会被执行。 TestNG中提供了多个assert*()方法,主要是匹配不同的数据类型和集合类及其他对象操作。 举例如下: import org.testng.Assert; import org.testng.annotations.Test; public class TestAssert { @Test public void testAssert() throws Exception { Assert.assertEquals(4, 2 * 2); Assert.assertEquals(5,1+9); } } 运行上面的代码,结果如下: 从上面可以看出assertEquals中Expected和Actual不相等,如果实际结果和预期结果不相等,就会抛出断言异常并显示内容,这样抛出的错误,更方便定位错误的原因和具体的业务逻辑。 关于assert常见断言方法及描述如下: assertTrue:判断是否为True。 assertFalse:判断是否为false。 assertSame:判断引用地址是否相同。 assertNotSame:判断引用地址是否不相同。 assertNull:判断是否为null。 assertNotNull:判断是否不为null。 assertE

Read More
seo优化方案

在WPF中嵌入WebBrowser可视化页面

  无论是哪种C/S技术,涉及数据可视化就非常的累赘了,当然大神也一定有,只不过面向大多数人,还是通过网页来实现,有的时候不想把这两个功能分开,一般会是客户的原因,所以我们打算在WPF中嵌入WebBrowser,然后使用ECharts 完成复杂的图表展示,其功能不亚于一个名为Devexpress的图标库,而且这东西还收费(呵呵),本文就对WebBrowser+ECharts进行了演示。   首先下载一下Echats.js文件以及Jquery文件并且创建一个Html页面,在我们项目的bin文件夹中。 在html中编辑,其中包括了几个方法,是对C#代码进行访问的。 <!DOCTYPE html> <html lang="zh-cn" xmlns="http://www.w3.org/1999/xhtml"> <!-- saved from url=(0013)about:internet --> <head> <meta charset="utf-8" http-equiv="X-UA-Compatible" content="IE=5,6,7,8,9,10,11, chrome=1" /> <title>ECharts</title> </head> <body> <h1>html页面</h1> <button Onclick="click1()" style="width:100px;height:20px">测试</button> <script> function click1() {

Read More
seo优化方案

滑动窗口的最大值问题

给出一个序列,要求找出滑动窗口中的最大值,比如: # 序列: 2, 6, 1, 5, 3, 9, 7, 4 # 窗口大小: 4 [2, 6, 1, 5], 3, 9, 7, 4 => 6 2, [6, 1, 5, 3], 9, 7, 4 => 6 2, 6, [1, 5, 3, 9], 7, 4 => 9 2, 6, 1, [5, 3, 9, 7], 4 => 9 2, 6, 1, 5, [3, 9, 7, 4] => 9 # 期望结果: [6, 6, 9, 9, 9] 并要求算法的时间复杂度为 O(n)。 稍加观察便能发现滑动窗口其实就是一个队列:窗口每滑动一次,相当于出列一个元素,并入列一个元素。因此这个问题实际上也可以看作是要求设计一个 pop(), push(), max() 均为 O(1) 的队列。 pop() 和 push() 做到 O(1) 很简单,max() 就没那么容易了。随着元素的进队,我们可以记录元素之间的大小关系,维护一个最大值记录,但当队首元素弹出时,已有的大小关系就会被破坏——被弹出的元素可能就是最大值,这样就需要重新开始评估新的最大值。但若我们只从队末弹出呢?这样便不会破坏已记录的剩余元素的最大值。这种只在一端进出的数据结构就是栈。只要在进栈的同时维护一个最大值栈,我们就可以轻松得到一个 pop(), push(), max() 均为 O(1) 的栈。比如令 2, 7, 4 依次进栈,并同时维护一个当前时刻的最大值栈 2, 7, 7,弹出一个元素的时候也同时弹出最大值栈中的元素,这样我们就可以在 O(1) 的时间内找到一个栈的 max。 我们知道,使用两个栈可以构造一个队列,即一个栈用于 push,一个栈用于 p

Read More
seo优化方案

Appium自动化测试环境搭建

前言 Appium是一个开源的自动化测试框架,支持跨平台,支持多种编程语言,可用于原生,混合和移动web应用程序,使用webdriver驱动ios,android应用程序、那么为了学习app自动化测试首要任务肯定就是搭建测试开发环境, 因此在这里记一次搭建Appium自动化测试环境的完整过程,文章较长,需要花费一定的时间,请耐心阅读,如果文中有什么错误请指正 安装Java JDK JDK环境可以看我之前安装Jenkins时的随笔https://www.cnblogs.com/linuxchao/p/linuxchao-jenkins-setup.html,这里需要注意一点尽量安装jdk 1.8,防止后面链接手机失败 安装Node.js 安装nodejs之前,我们需要知道,为什么要安装nodejs? 因为appium是nodejs实现的,node相当于appium的解释器 Node.js下载地址:https://nodejs.org/en/download/current/ 由于我的电脑是windows 64位的系统,这里我直接下载windows 64位的msi程序文件 下载完成后直接双击安装即可(傻瓜式的安装),所以我就不说具体步骤了,安装后,检查是否安装成功 cmd终端输入第一个命令 node -version,输出下面的信息 接着再输入 npm 命令,输出下面的信息 ok, 这说明node.js已经安装成功 安装Appium server 不知道你做过或者学习过selenium没有,这里的appium server 相当于 selenium中的浏览器驱动程序,当启动浏览器驱动时会初始化一个服务器,绑定本机的地址和端口,那么Appium server也一样,当启动appium时同样会初始化一个服务器绑定本地的地址和端口 安装serv

Read More
seo优化方案

springBoot的过滤器,监听器,拦截器

概述   在开发中,我们经常要考虑一些问题,对敏感词进行过滤,用户是否已经登录,是否需要对他的请求进行拦截,或者领导问现在在线人数有多少人?我们如何实现这些功能哪  @WebFilter package com.xmlxy.firstspringbootproject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.servlet.*; import javax.servlet.annotation.WebFilter; import java.io.IOException; @WebFilter(filterName = "customFilter",urlPatterns = "/*") public class CustomFilter implements Filter { private static final Logger log = LoggerFactory.getLogger(CustomFilter.class); @Override public void init(FilterConfig filterConfig) throws ServletException { log.info("===========拦截器初始化=========="); } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { servletRequest.setCharacterEncoding("

Read More
seo优化方案

林大妈的JavaScript基础知识(三):JavaScript编程(2)函数

  JavaScript是一门函数式的面向对象编程语言。了解函数将会是了解对象创建和操作、原型及原型方法、模块化编程等的重要基础。函数包含一组语句,它的主要功能是代码复用、隐藏信息和组合调用。我们编程就是把一个需求拆分成若干函数和数据结构的组合实现,其中算法又是实现正确函数的方法论。我们先介绍基础知识:① 在JavaScript中,函数对象背后到底有什么;② 函数调用的模式有多少种;③ 作用域与闭包。至于递归、记忆、回调、级联、模块、柯里化等,我们放到进阶知识中再涉猎。 一、 函数对象   前面我们提到,在JavaScript中,函数也是对象,对象的原型连接到Object.prototype,函数对象则连接到Function.prototype,再连接到Object.prototype。我们可以看看这两个对象中具有什么样的属性: 1 var sum = function(a, b) { 2 return a + b; 3 } 4 5 console.log(sum.prototype);   输出发现,这个Function.prototype中有一个constructor构造器属性,值就是刚才我们定义的这个函数的内容。而Function.prototype则连接到Object.prototype。也就是说当我们创建一个函数对象时,Function的构造器会自动运行类似这样的一些代码: this.prototype = {constructor: this}; 。换句话说,其实constructor属性的意义不大,因为它自己本身就是这个属性。只是因为JavaScript为了模仿其他的面向对象语言,做出了这样一个“伪类”,以constructor作为中间层而已。 二、函数调用   函数的特别之处在于:它可以被调用。调用函数时

Read More
seo优化方案

入门webpack,看这篇就够了

什么是webpack? 官网给出的概念是:本质上,webpack 是一个现代 JavaScript 应用程序的静态模块打包器(module bundler)。当 webpack 处理应用程序时,它会递归地构建一个依赖关系图(dependency graph),其中包含应用程序需要的每个模块,然后将所有这些模块打包成一个或多个 bundle。 为什么要用webpack? 为什么使用webpack,这应该和前端的发展是有关系的,因为计算机网络的飞速发展,导致前端也在迅猛发展,最初的实践方案已经不能满足我们的需求,加上新的技术和新思想框架的产生,为了节省开发的成本和效率,所以webpack的产生是一个必然的结果 相比gulp、grunt、Rollup,为什么要使用webpack? gulp和grunt的操作都是流式的,但是gulp是基于内存流,grunt是基于文件流,所以相对来说,gulp的性能要高于grunt,而且他们都是需要定义一个个任务,然后自动将一个个任务执行。,而webpack是模块化的组织,模块化的依赖,然后模块化的打包,相对来说,webpack更强调模块化开发,而那些文件合并压缩、预处理等功能,不过是他的附带功能。而且现在相对于前两者,webpack的插件也更为丰富 Rollup是在webpack流行后出现的替代品,Rollup和webpack类似,但是专注于ES6模块打包,相比webpack,Rollup功能和插件都不如webpack完善,不过Rollup在用于打包JavaScript库时比webpack更加有又是,因为其打包的代码更小更快。但也因为功能不完善,很多场景找不到现成的解决方案。   安装与使用 因为现在webpack已经更新到到4.0+了,所以本篇就直接按4.0+的来讲好了 创建package.jso

Read More
seo优化方案

MyBatis在Spring环境下的事务管理

MyBatis的设计思想很简单,可以看做是对JDBC的一次封装,并提供强大的动态SQL映射功能。但是由于它本身也有一些缓存、事务管理等功能,所以实际使用中还是会碰到一些问题——另外,最近接触了JFinal,其思想和Hibernate类似,但要更简洁,和MyBatis的设计思想不同,但有一点相同:都是想通过简洁的设计最大限度地简化开发和提升性能——说到性能,前段时间碰到两个问题: 在一个上层方法(DAO方法的上层)内删除一条记录,然后再插入一条相同主键的记录时,会报主键冲突的错误。 某些项目中的DAO方法平均执行时间会是其他一些项目中的 2倍 。 第一个问题是偶尔会出现,在实验环境无论如何也重现不了,经过分析MyBatis的逻辑,估计是两个DAO分别拿到了两个不同的Connection,第二个语句比第一个更早的被提交,导致了主键冲突,有待进一步的分析和验证。对于第二个问题,本文将尝试通过分析源代码和实验找到它的root cause,主要涉及到以下内容: 问题描述与分析 MyBatis在Spring环境下的载入过程 MyBatis在Spring环境下事务的管理 实验验证 项目环境 整个系统是微服务架构,这里讨论的「项目」是指一个单独的服务。单个项目的框架基本是Spring+MyBatis,具体版本如下: Spring 3.2.9/4.3.5 + Mybatis 3.2.6 + mybatis-spring 1.2.2 + mysql connector 5.1.20 + commons-dbcp 1.4 与MyBatis和事务相关的配置如下: //代码1 <!-- bean#1--> <bean id="dataSource" class="org.apache.commons.dbcp.

Read More
seo优化方案

MD、SHA、MAC消息摘要算法实现与应用

1.消息摘要概述 消息摘要(Message Digest)又称为数字摘要(Digital Digest)。它是一个唯一对应一个消息或文本的固定长度的值,它由一个单向Hash加密函数对消息进行作用而产生。如果消息在途中改变了,则接收者通过对收到消息的新产生的摘要与原摘要比较,就可知道消息是否被改变了。因此消息摘要保证了消息的完整性。 消息摘要采用单向Hash函数将需加密的明文"摘要"成一串固定位数(如128bit)的密文,这一串密文亦称为数字指纹(Finger Print),它有固定的长度,且不同的明文摘要成密文,其结果总是不同的,而同样的明文其摘要必定一致。这样这串摘要便可成为验证明文是否是“真身”的“指纹”了。 消息摘要具有不可逆性,在消息摘要生成过程中,会丢失很多原文的信息,而且无法找回。一个好的摘要算法,是极难产生Hash碰撞的,也就是找到另一段明文经计算后产生相同的摘要。 2.消息摘要算法-MD2、MD4、MD5 MD是应用非常广泛的一个算法家族,尤其是 MD5(Message-Digest Algorithm 5,消息摘要算法版本5),它由MD2、MD3、MD4发展而来,由Ron Rivest(RSA公司)在1992年提出,目前被广泛应用于数据完整性校验、数据(消息)摘要、数据加密等。MD2、MD4、MD5 都产生16字节(128位)的校验值,一般用32位十六进制数表示。MD2的算法较慢但相对安全,MD4速度很快,但安全性下降,MD5比MD4更安全、速度更快。 目前在互联网上进行大文件传输时,都要得用MD5算法产生一个与文件匹配的、存储MD5值的文本文件(后缀名为 .md5或.md5sum),这样接收者在接收到文件后,就可以利用与 SFV 类似的方法来检查文件完整性,目前绝大多数大型软件公司或开源组织都是以这种方式来校验数据完整性,而且部分操作系统也使...

Read More
seo优化方案

Spring WebClient vs. RestTemplate

1. 简介 本教程中,我们将对比 Spring 的两种 Web 客户端实现 —— RestTemplate 和 Spring 5 中全新的 Reactive 替代方案 WebClient。 2. 阻塞式 vs 非阻塞式客户端 Web 应用中,对其他服务进行 HTTP 调用是一个很常见的需求。因此,我们需要一个 Web 客户端工具。 2.1. RestTemplate 阻塞式客户端 很长一段时间以来,Spring 一直提供 RestTemplate 作为 Web 客户端抽象。在底层,RestTemplate 使用了基于每个请求对应一个线程模型(thread-per-request)的 Java Servlet API。 这意味着,直到 Web 客户端收到响应之前,线程都将一直被阻塞下去。而阻塞代码带来的问题则是,每个线程都消耗了一定的内存和 CPU 周期。 让我们考虑下有很多传入请求,它们正在等待产生结果所需的一些慢服务。 等待结果的请求迟早都会堆积起来。因此,程序将创建很多线程,这些线程将耗尽线程池或占用所有可用内存。由于频繁的 CPU 上下文(线程)切换,我们还会遇到性能下降的问题。 2.2. WebClient 非阻塞式客户端 另一方面,WebClient 使用 Spring Reactive Framework 所提供的异步非阻塞解决方案。 当 RestTemplate 为每个事件(HTTP 请求)创建一个新的 线程 时,WebClient 将为每个事件创建类似于“任务”的东东。幕后,Reactive 框架将对这些 “任务” 进行排队,并仅在适当的响应可用时执行它们。 Reactive 框架使用事件驱动的体系结构。它提供了通过 Reactive Streams API 组合异步逻辑的方法。因此,与同步/阻塞方法相比,Reactive 可以使用更...

Read More
seo优化方案

C语言编程入门之–第四章C语言基本数据类型

    导读:C语言程序中经常涉及一些数学计算,所以要熟悉其基本的数据类型。数据类型学习起来比较枯燥,不过结合之前的内存概念,以及本节的字节概念,相信数据类型也就不难理解了。本章从二进制的基本概念开始,然后介绍机器语言通用的计算单位字节,最后再介绍C语言中基本的数据类型及其基本概念。   4.1 二进制、字节   计算机,电子信息专业类的大学课程,肯定会有讲解二进制与十进制转换的课程,本节为了篇幅小一点,只提供windows计算器中进制转换工具的使用方法,希望读者谅解。 4.1.1 二进制   机器之间沟通用的是机器语言,机器语言用二进制数据相互沟通,什么是二进制数据?为什么是二进制数据呢?我们日常生活中比较熟悉的是十进制数据,当数字从1开始不停的加1,加到10的时候再加1就会变成11,那么个位又变回1了,这就叫做满10进1。   还有比较熟悉的是十二进制,就是我们的时钟了,当时针从1开始不停加到12时,再加1,时针就又变成1了。当然如果有人习惯24小时制,那就理解为二十四进制也可。 图4.1  时钟    同理,分针和秒针就是60进制了,满60进1。   那么,二进制就应该是满2进1咯,对的,举个简单例子:十进制的1,2,3在二进制为01,10,11。可以看到十进制的3在二进制的第一位为1,因为它满2就进1了。   平时用进制转换可以搬用公式计算,当然快捷的办法是用windows自带的计算器,打开win10系统的计算器软件,选择程序员选项。   注意:不同版本的windows的计算器用法稍微不同,请读者自行了解。 图4.2  windows计算器   鼠标点击DEC,选择十进制,在DEC中输入123,可以发现二进制BIN为01111011,八进制OCT为173,十六进制为7B,如图4.3...

Read More
seo优化方案

【Python3爬虫】当爬虫碰到表单提交,有点意思

一、写在前面   我写爬虫已经写了一段时间了,对于那些使用GET请求或者POST请求的网页,爬取的时候都还算得心应手。不过最近遇到了一个有趣的网站,虽然爬取的难度不大,不过因为表单提交的存在,所以一开始还是有点摸不着头脑。至于最后怎么解决的,请慢慢往下看。   二、页面分析   这次爬取的网站是:https://www.ctic.org/crm?tdsourcetag=s_pctim_aiomsg,该网站提供了美国的一些农田管理的数据。要查看具体的数据,需要选择年份、单位、地区、作物种类等,如下图:   根据以往的经验,这种表单提交都是通过ajax来完成的,所以熟练地按F12打开开发者工具,选择XHR选项,然后点击“View Summary”,结果却什么都没有......   这是怎么回事?不急,切换到All看一下有没有什么可疑的东西。果然就找到了下面这个,可以看到在Form Data中包含了很多参数,而且可以很明显看出来是一些年份、地区等信息,这就是表单提交的内容:   可以注意到在这些参数中有一个_csrf,很明显是一个加密参数,那么要怎么得到这个参数呢?返回填写表单的网页,在开发者工具中切换到Elements,然后搜索_csrf看看,很快就找到了如下信息:   其余参数都是表单中所选择的内容,只要对应填写就行了。不过这个请求返回的状态码是302,为什么会是302呢?302状态码的使用场景是请求的资源暂时驻留在不同的URI下,因此还需要继续寻找。   通过进一步查找可知,最终的URL是:https://www.ctic.org/crm/?action=result。    三、主要步骤  1.爬取郡县信息   可以看到表单中包含了地区、州、郡县选项,在填写表单的时候,这一部分都是通过JS来实现的。打开开发

Read More
seo优化方案

基于Spark Grahpx+Neo4j 实现用户社群发现

上一篇文章知识图谱在大数据中的应用我们介绍了知识图谱的一些概念和应用场景,今天我们就来看一个具体的应用案例了解下知识图谱的应用。用户增长对于一个APP的生存起到了至关重要的作用,没有持续的用户增长,再好的APP也不会走的长远,为了获得更多的用户,APP运营商往往会鼓励老用户拉新并给与奖励,比如趣头条的收徒模式,用户每收一个徒弟就会得到几块到十几块的现金返现,但是这种模式同时也会引起广大黑产团伙的注意,黑产会利用各种手段来薅这些APP运营商的羊毛。 中国有句老话,叫物以类聚,人以群分,在反作弊和市场营销等应用中,如果我们能根据用户间的某些联系发现社群,然后对这些社群进行反作弊分析或商品推荐,往往会起到意想不到的效果。 本文就来介绍一个简单的社群发现的实践。构建社群我们首先需要找到社群用户的某种联系,上文提到的收徒模式本身就是用户间的一个天然联系,我们可以根据用户的师徒关系来构建社群。如下图所示,根据师徒关系我们构建了一个社群,点表示用户,边表示师徒关系。 有了这样的社群之后,我们就可以基于社群维度分析设备及用户行为的异常,比如单个设备登陆过多的用户,设备一直处于充电状态,所有用户行为高度一致等,同时可以计算社群用户作弊率来通过已知作弊用户来发现新的作弊用户。 理清了需求之后我们开始着手根据用户师徒关系构建社群。对"紧密联系"的不同理解产生了很多社区发现算法。下图是几种经典的社群发现算法。 社群算法 Triangle Counting:三角关系,图论基础知识。 Connected Components:连通图,图论基础知识。 Strongly Connected Components:强连通图,图论基础知识。 Label Propagation:标签传播算法。 Louvain:一种基于"模块度"的经典算法。 因为本文重点不是讲述社群

Read More
seo优化方案

Android:JNI与NDK(二)交叉编译与动态库,静态库

  欢迎关注公众号,第一时间获取最新文章:   本篇目录 一、前言 本篇主要以window开发环境为背景介绍一下NDK开发中需要掌握的交叉编译等基础知识,选window系统主要是照顾大多数读者,mac ,linux操作系统基本是同样适用的。 交叉编译就是在A平台编译出可以在B平台执行的文件,对于我们安卓开发者来说交叉编译就是在window或者mac或者linux系统上编译出可在安卓系统上运行的可执行文件,什么时候需要用到交叉编译呢?音视频开发基本都会用到ffmpeg,opengl es等三方库,这时我们就需要在window或者mac或者linux系统上编译出可在安卓系统执行的文件,这里可编译出静态库或者动态库使用,这时候就会用到交叉编译。 本篇虽然是一些基础的知识或者操作,但是对于后续三方库的编译移植,CMake的配置是很重要的,否则后续遇到没用过的三方库你会感觉无从下手编译,很多CMake的配置也只是会配置而不懂具体什么含义。 进行本篇学习请先自己配置好MinGW(C/C++编译器)编译环境并配置到系统环境变量中,这些都是基础的操作,自己查询一下配置好就可以了,此外还需要自己下载好安卓平台提供的交叉编译工具链,下载地址:安卓平台交叉编译工具,我下载的是17c版本的。 好了,进入本文的学习 下文相关代码均来自:相关演示代码 二、常用C/C++编译器了解以及C/C++文件编译过程 常用C/C++编译器 编译器名称 描述 clang clang 是一个C、C++、Object-C的轻量级编译器。基于LLVM(LLVM是以C++编写而成的构架编译器的框架系统,可以说是一个用于开发编译器相关的库),对比gcc,它具有编译速度更快、编译产出更小等优点,但是...

Read More
seo优化方案

ArchSummit分享 | 高德地图App架构演化与实践

讲师介绍 郝仁杰,高德地图无线开发专家。在7月13日落幕的2019年ArchSummit峰会上就高德地图近几年的App架构演化和实践进行了分享。 背景概述 高德是国内领先的数字地图内容、导航和位置服务解决方案提供商,端上分手机和车机两条主线。近年来,高德业务迅猛发展,人员规模急速扩张,代码量急剧膨胀,如何提高团队高效并行作战的能力,端架构在一致性和动态性方面做了很多尝试:从最初的双端原生单体架构,到地图引擎下沉C++,再到动态UI框架的建设,收到了一定的成效,但面对业务持续的高速发展,依然还有很多方面需要继续完善。 为了让业务开发有节奏的进行,项目上每年会制定一些公车计划。公车就是每个App版本,货物就是对应的产品功能,货物组装就是功能开发,公车计划即每年的发版计划,公车按照指定的时间来,把组装好的货物拉走。但由于双端代码差异较大、耦合严重、复用率低、职责不清晰、平台工具简陋等问题,公车并无法按照计划拉走货物,货物组装慢且质量差,迫使公车等待,导致整个版效周期长达3个月,崩溃率也高达万分之八,公车变成了伪公车。 执行方案 为了使伪公车变为真公车,需要解决双端差异问题、代码耦合问题和平台工具落后等问题,来提高稳定性、并行性和高效性。2018年端上通过双端融合、组件化和研发中台建设来达到目标。   双端融合采用下沉C++、上漂动态UI和双端拉齐的方式来实现。下沉C++,实现了跨端的同时提高了性能;上漂动态UI同样实现了跨平台,且降低了开发门槛,让开发更简单,效率更高,同时也为未来动态化做好铺垫;双端拉齐更多的是借鉴双端的优势做到融合,同时保留双端的差异作为扩展,做到尽量保持一致的同时,也很好地兼容了Android/iOS平台的特性。 组件化参考了手淘Atlas、BeeHive和网易LDBusMediator等成熟的容器方案并融合了高德自身的

Read More
seo优化方案

Maven中央仓库发布历程

一、前言 最近自己在学习Spring boot的过程中开发了一个组件 multithreadpool-spring-boot-starter,通过这个组件,我们可以动态根据配置文件进行多个线程池的初始化。既然有这个产出后,肯定是希望能够上传到maven中央仓库,给更多的人使用,于是就产生了这次项目发布经历。 整个过程可谓是一波三折,由于平时工作比较忙只能晚上花一个小时搞,所以在经历了近一周的时间后,终于成功发布上去了。 下面把我当时的上传过程记录下来,希望帮助更多的朋友。   二、环境准备 1> mac osx 10.14.6 : 本文主要以mac环境为准 2> Apache Maven 3.2.3 : 本文主要使用maven进行构建和发布例子的说明   三、步骤说明 1、工单创建 1> 访问sonatype并注册账号 https://issues.sonatype.org ,注意要记住账号密码,会用于我们后续的发布及相关操作 2> 如图新建一个issue,项目需要选择 Community Support - Open Source Project Repository Hosting   3>  参考下图填写概要、Group Id、项目地址、代码管理地址,填写后点击确认提交。网上很多都说需要几个小时或者隔天才有回复,我当时等了10分钟就收到回复了。此时,对方跟你说两件事情: 【提醒】确保 group id对应的域名是你的 【校验】比如我是的项目地址是github上的,他会要求我在github上创建一个和issue同名的项目确保我拥有该项目的管理权限, 完成确认并创建和issue同名的项目后,记得要在issue进行回

Read More
seo优化方案

深入理解Java中的AQS

AQS概述 ​ AbstractQueuedSynchronizer抽象队列同步器简称AQS,它是实现同步器的基础组件,juc下面Lock的实现以及一些并发工具类就是通过AQS来实现的,这里我们通过AQS的类图先看一下大概,下面我们总结一下AQS的实现原理。先看看AQS的类图。 ​ (1)AQS是一个通过内置的FIFO双向队列来完成线程的排队工作(内部通过结点head和tail记录队首和队尾元素,元素的结点类型为Node类型,后面我们会看到Node的具体构造)。 /*等待队列的队首结点(懒加载,这里体现为竞争失败的情况下,加入同步队列的线程执行到enq方法的时候会创 建一个Head结点)。该结点只能被setHead方法修改。并且结点的waitStatus不能为CANCELLED*/ private transient volatile Node head; /**等待队列的尾节点,也是懒加载的。(enq方法)。只在加入新的阻塞结点的情况下修改*/ private transient volatile Node tail; ​ (2)其中Node中的thread用来存放进入AQS队列中的线程引用,Node结点内部的SHARED表示标记线程是因为获取共享资源失败被阻塞添加到队列中的;Node中的EXCLUSIVE表示线程因为获取独占资源失败被阻塞添加到队列中的。waitStatus表示当前线程的等待状态: ​ ①CANCELLED=1:表示线程因为中断或者等待超时,需要从等待队列中取消等待; ​ ②SIGNAL=-1:当前线程thread1占有锁,队列中的head(仅仅代表头结点,里面没有存放线程引用)的后继结点node1处于等待状态,如果已占有锁的线程thread1释放锁或被CANCEL之后就会通知这个结点node1去获取锁执行。 ​ ③CONDITION=

Read More
seo优化方案

基于可视化配置的日志结构化转换实现

导读:数据总线DBus的总体架构中主要包括六大模块,分别是:日志抓取模块、增量转换模块、全量抽取程序、日志算子处理模块、心跳监控模块、Web管理模块。六大模块各自的功能相互连接,构成DBus的工作原理:通过读取RDBMS增量日志的方式来实时获取增量数据日志(支持全量拉取);基于Logstash,flume,filebeat等抓取工具来实时获得数据,以可视化的方式对数据进行结构化输出。本文主要介绍的是DBus中基于可视化配置的日志结构化转换实现的部分。 一、结构化日志的原理 1.1 源端日志抓取 DBus可以对接多种log数据源,例如:Logstash、Flume、Filebeat等。上述组件都是业界比较流行的日志抓取工具,一方面便于用户和业界统一标准,方便用户技术方案的整合;另一方面也避免了无谓的重复造轮子。抓取的数据我们称为原始数据日志(raw data log),由抓取组件将其写入Kafka中,等待DBus后续处理。 1.2 可视化配置规则,使日志结构化 用户可自定义配置日志源和目标端。同一个日志源的数据可以输出到多个目标端。每一条“日志源-目标端”线,用户可以根据自己的需要来配置相应的过滤规则。经过规则算子处理后的日志是结构化的,即:有schema约束,类似于数据库中的表。 1.3 规则算子 DBus设计了丰富易用的算子,用于对数据进行定制化操作。用户对数据的处理可分为多个步骤进行,每个步骤的数据处理结果可即时查看、验证;并且可重复使用不同算子,直到转换、裁剪出自己需要的数据。 1.4 执行引擎 将配置好的规则算子组应用到执行引擎中,对目标日志数据进行预处理,形成结构化数据,输出到Kafka,供下游数据使用方使用。系统流程图如下所示: 根据DBus log设计原则,同一条原始日志,可以被提取到一个或多个表中。每个表是结构化的,满足相同的sche

Read More
seo优化方案

Docker 容器基本操作[Docker 系列-2]

​Docker 入门及安装[Docker 系列-1] 镜像就像是一个安装程序,而容器则是程序运行时的一个状态。 查看容器 查看容器 启动 docker 后,使用 docker ps 命令可以查看当前正在运行的容器: 查看所有容器 上面这条命令是查看当前正在运行的容器,如果需要查看所有容器,则可以通过 docker ps-a 命令查看: 在查看容器时,涉及到几个查看参数,含义分别如下: CONTAINER ID:CONTAINER ID是指容器的id,是一个唯一标识符,这是一个64位的十六进制整数,在不会混淆的情况下可以只采用id的前几位进行标识一个容器。 IMAGE:IMAGE表示创建容器时使用的镜像。 COMMAND:COMMAND表示容器最后运行的命令。 CREATED:创建容器的时间。 STATUS:容器的状态,这里可能显示一个容器启动时间,也能显示容器关闭时间。具体显示哪个要看容器当前的状态。 PORTS:容器对外开放的端口。 NAMES:容器的名字,如果不设置,会有一个默认的名字。 查看最新创建的容器 使用 docker ps-l 可以查看最近创建的容器,如下:   查看最新创建的n个容器 可以使用 docker ps-n=XXX 来查看最新创建的n个容器,如下: 创建容器 创建容器整体上来说有两种不同的方式,可以先创建,再启动,也可以连创建带启动一步到位,无论是那种方式,流程都是相似的,当执行一个创建命令之后,docker 首先会去本地路径下查找是否有相应的镜像,如果没有,就去 docker hub 上搜索,如果搜索到了,则下载下来,然后利用该镜像创建一个容器并启动。容器的文件系统是在只读的镜像文件上添加一层可读写的文件层,这样可以使在不改变镜像的

Read More