自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

甘焕的博客

专注于大数据及可视化研究

  • 博客(40)
  • 资源 (5)
  • 收藏
  • 关注

原创 JS正则表达式exec()与String.prototype.match()的差异

在Javascript中,使用正则表达式有两种方法,一是通过String调用正则表达式,二是通过正则表达式拆分字符串,在大部分的情况下,它们的表现类似,都可以轻松实现测试字符串的功能,如下:var text = '[DTools] [logs] [Program Files]', // 正则表达式,注意g的使用 pattern

2017-07-31 22:09:05 909

原创 正则表达式非贪婪模式的应用

贪婪模式又叫匹配优先模式,在整个表达式匹配成功的前提下,尽可能多的匹配,而非贪婪模式恰恰相反,在整个表达式匹配成功的前提下,尽可能少的匹配,针对的量词包括:{m, n}{m, }?*+从书写正则表达式的差异来看,它们的唯一区别在于非贪婪模式在贪婪模式的量词后面添加“?”,如下:{m, n}?{m, }???*?+?下面看一个具体的例子,从“[]”提取需要的字符,首先是贪婪模式://

2017-07-31 22:08:14 2082

原创 并发(十二):JAVA调用外部进程

从JAVA 1.5版本开始,JAVA新增了ProcessBuilder,专门用于调用外部进程,且能快速创建一个指定了环境的进程与子进程,极大地增强了进程的复用性,示例代码如下:// 定义在FileNameGetProcess.java文件中static List<String> call() throws Exception { List<String> fileNames = List

2017-07-31 22:07:09 2248

原创 并发(十一):为什么wait()一定要放在循环中

在多线程的编程实践中,wait()的使用方法如下:synchronized (monitor) { // 判断条件谓词是否得到满足 while(!locked) { // 等待唤醒 monitor.wait(); } // 处理其他的业务逻辑}那为什么非要while判断,而不采用if判断呢?如下:synchronized (mo

2017-07-29 17:29:28 6700 1

原创 并发(十):用一个类实现遍历线程的所有状态

在Thread中,有一个关于线程状态的枚举类Thread.State,其共有六个状态,分别为: 1. NEW, 线程未启动; 2. RUNNABLE,线程正在运行中; 3. BLOCKED, 线程因为等待锁被阻塞; 4. WAITING,线程处于等待(信号)状态中; 5. TIMED_WAITING,主动调用了限时等待方法而处于等待状态中; 6. TERMINATED,线程已结束;下面我

2017-07-28 15:59:32 700

原创 JAVA NIO(二):小端字节顺序

在JAVA中,ByteBuffer采用小端字节顺序进行存储,即最低字节保存在低位地址中,最高字节保存在高位地址中,证明的过程如下: 1. 首先存入汉字“你好”,UTF-8编码为“\u4F60\u597D”; 2. 依次读出每个字节,并输出16进制形式; 3. 比较16进制与UTF-8编码;相关的测试代码如下:// 字符缓冲区CharBuffer charBuf = CharBuffer.a

2017-07-27 23:34:03 1096 3

原创 JAVA NIO(一):Buffer.mark()的用法

在默认情况下,Buffer.mark()并没有什么用处,既不会影响Buffer的遍历,也不会影响Buffer的位置统计函数,如remaining()函数,能影响这些操作的行为只有position()。位置统计示例代码如下:CharBuffer buffer = CharBuffer.allocate(10);buffer.put('你');buffer.put('好');// 直接跳转位置

2017-07-27 23:32:16 2780

原创 深信服防火墙SNMP开启步骤

第一步,一定首先开启SNMP管理方式,这是成功的关键,具体菜单为网络配置>接口/区域>区域TAB页,在“允许管理设备”里勾选“SNMP”,见下图: 这里需要特别注意的是,“允许管理此设备的IP”范围尽可能选择得比较小,例如内网IP,或者内网的特定IP。第二步,在网络配置>高级网络配置里,找到SNMP标签页,添加一条SNMP V1/V2规则,见下图: 第三步,用SNMP进行管理,注意,这里的设备的

2017-07-27 16:49:47 16846 1

原创 巧用隐藏层计算字符宽度

在Canvas与SVG的使用中,我们经常需要根据字符串的长度来计算文字绘制的起点与终点,常规的方法莫过于使用经验值,如中文字符长度乘以6(经验值),英文字符长度乘以3,代码示例如下:// 判断是否是ASCII字符var pattern = /[\u0000-\u00FF]*/, // 根据字符的个数来计算字符串的长度 width = pattern.test(text) ? t

2017-07-27 10:28:18 793

原创 Vuex无法观察到值变化的解决办法

在跨越主路由视图时,由于Vuex的状态值一直存储在内存中,所以在组件视图重新载入时,可能会出现组件无法检测到状态值的变化,从而导致业务逻辑出现错误。假定通用头部组件有一个全局任务状态值,其他的组件都要根据此任务值进行更新,更可能出现的情况是,任务状态值是异步加载完成的,于是需要如此编写业务逻辑:computed : { task () { return this.$store

2017-07-26 18:12:50 9625

原创 并发(九):检查死锁与Locked ownable synchronizers

通过jstack可快速检查线程的死锁信息,用法如下:# 获取JVM ID(JAVA 进程ID),通过参数lv可以获取更详细的JAVA方法调用信息jps -lv# 得到JVM ID后,执行jstack命令,这里假定为123# 将结果重定向到文件,更便于查看jstack -l 123 >> d:/123.txt翻到页底,可发现明显的死锁信息:Java stack information for

2017-07-24 11:27:44 38237 1

原创 并发(八):无法检查的中断状态

有如下的程序:public class LockedOwnThread extends Thread { public void run () { while(true) { synchronized (this) { try { Thread.sleep(10000);

2017-07-21 20:37:33 298

原创 并发(七):闭锁应用与其实现原理

闭锁是一种线程同步工具,用于同步相关线程达到相关状态(并不一定要结束),然后再执行下一步操作,所以在所有的状态满足之前,调用await的线程将一直阻塞,相对于CyclicBarrier,闭锁更强调信号的同步。当然了,闭锁也能达到CyclicBarrier的效果。假定有个任务,需要四个线程的任务都完成后才能继续执行,为了更便于理解,这里改为任务完成一半,任务类的逻辑如下:static class Ta

2017-07-20 21:51:57 1188

原创 Thread.sleep()与Thread.yield()的区别与联系

在JAVA并发程序的开发中,经常会用到这两个方法对程序进行测试,它们的相同点在于: 1. 都会暂缓执行当前线程; 2. 如果已经持有锁,那么在等待过程中都不会释放锁;不同点在于: 1. Thread.sleep()可以精确指定休眠的时间,而Thread.yield()依赖于CPU的时间片划分,在我的电脑上大约为20微秒; 2. Thread.sleep()会抛出中断异常,且能被中断,而Thr

2017-07-20 21:50:01 4485

原创 axios.js提交表单数据的解决办法

axios因为小巧而性能强大受到很多人的追捧,但是其默认的数据提交方式为Payload,这样给后台解析带来了较大的困扰,因为难以从Request中获取到参数,所以默认的数据对象拼装无法成功 ,尤其是采用Spring MVC的@ModalAttribute注解时(没有使用@RequestBody注解)。解决方法如下: 1. 修改头部信息,将Content-Type由“application/x-ww

2017-07-19 21:09:44 10295

原创 并发(六):用Exchanger实现数据交换

在多线程程序的设计中,最难处理就是各线程之间的耦合关系,所以JDK提供了很多用于解耦的类,例如BlockingQueue、BlockingDeque等,这些类的特点是既可以适用于消费者/生产者模式,还可以适用于消费者与生产者混合模式。今天介绍的Exchanger除了在数据交换方面表现得非常优秀之外,还能协调线程的执行进度,而且是多个线程(并没有一对一之间的关系)之间的进度,所有特别适用于分发任务,下

2017-07-18 18:01:55 346

原创 并发(五):我也谈谈双重检查与对象的安全发布

在单例的实现模式中,很多大师都说过双重检查对JAVA不适用,比如说《设计模式》的作者闫宏,原因都是说JAVA语言构造器问题,具体说来大概都是以下两种: 1. JAVA对象的构造过程不是原子操作; 2. JAVA对象的构造化为本地代码时,有可能发生指令重排序现象;我们先看双重检查的单例代码实现:public class DoubleCheck { private static DoubleC

2017-07-16 22:28:55 361

原创 并发(四):同步一定要在同一把锁上

在并发编程实践中,监视器(锁)的选择大有技巧: 如果要开发扩展(继承),监视器尽可能选择自身,或者子类能获取到的对象,否则即使加了锁,依旧会出现状态不同步的情形,看下面的例子:public class DoubleLock { private int counter = 0; /* * 每次加1 */ public void addOne() {

2017-07-16 21:00:27 369

原创 浏览器查询参数与表单数据的优先级问题

在提交数据的实验中,突然冒出一个这样的想法:在请求地址中与表单数据中同时添加同样的参数,并赋予不同的值,那么服务器获取参数时,究竟是取查询参数中的值,还是表单数据中的值?以用户登录为例,假定登录地址为login,在查询参数中与表单数据中同时添加信息,代码如下:// 已引入jQuery库$.post('/params?username=yiifaa&password=yiifaa', {

2017-07-16 00:08:15 2203

原创 brackets打开大项目的解决办法

用brackets打开kibaba项目时,提示如下错误: This project contains more than 30,000 files. Features that operate across multiple files may be disabled or behave as if the project is empty.解决办法: 1. 安装brackets-file

2017-07-14 18:07:44 1272

原创 连接池(一):数据库连接关闭后为何还能共享?

在数据库连接池的使用过程中,一直有一个疑问: 在数据库连接的使用过程中,必须要满足独占性要求(其他线程不能访问),使用完成后关闭数据库连接,那么问题来了,数据库都已经连接关闭了,那其他线程又怎么使用呢?带着这样的疑问,我们一起阅读了“org.apache.commons.dbcp2.BasicDataSource”的实现源码,发现从数据源中获取连接的调用顺序依次如下: 1. BasicDat

2017-07-14 18:05:37 3565 1

原创 moment.js的扩展方法

在moment.js的使用过程中,有时需要对moment的属性与方法进行扩展,以moment.duration的humanize方法为例:// 设置时间长度为50周var w50s = moment.duration(50, 'w').humanize()// 结果输出为1年console.log(w50s);从上面的例子可以看出,moment.js特意设计的humanize方法虽然看起来

2017-07-14 18:03:08 1636

原创 Kibana(七):如何在地址中查询中文关键字

对于轻量级搜索,具有简单快捷且能跨索引的优点,并且特别适用于数据调试与诊断,以Kibana中的调试工具(Dev Tools)为例,如下:GET /_all/tweet/_search?q=tweet:yiifaa即可轻松获取到在tweet类型中tweet字段包含yiifaa 单词的所有文档。URL地址的方式对于ASCII码一般不存在什么问题,但如果是中文,怎么办?如我要查询到在tweet类型中 tw

2017-07-13 19:57:42 7060

原创 Kibana(六):数据映射错误二则

1. 日期格式将日期格式映射为“strict_date_optional_time||epoch_millis”,在输入数据“2003/4/7”时,提示如下错误:root_cause: [{type: "mapper_parsing_exception", reason: "failed to parse [work_date]"}]type: "illegal_argument_exceptio

2017-07-12 20:38:12 8792 4

原创 并发(三):理解安全的发布

我们常说,如果将对象放入到线程安全容器,例如Vector或synchronizedMap时,那么对象就可以安全地发布,后续的每个线程都可以安全地访问。按照我们上一节的论述,这里的安全包含对象的内蕴状态吗,还是依旧仅仅只有对象的引用?经过测试,我们可以发现,所有的线程安全容器依旧只能保证对象的引用更改是安全的,也就是说,只有当对象的引用地址发生了变化,其他线程才能感知到这种变化。示例代码如下,依旧以计

2017-07-12 20:36:50 344

原创 如何监测DOM对象已加载完成

在第三方插件的使用过程中,我们经常需要DOM在加载完成后执行一些操作,如果插件提供了这样的事件接口,那一切都较为简单,但在大部分的情况下,要么是设计者没有考虑到这样的问题,或者没有设计这样的接口,那这时应该怎么办呢?小组成员经常犯的一个错误是利用if判断,如下:let dom = document.getElementById('yiifaa')// dom加载完成后执行操作if(dom) {

2017-07-12 20:34:56 14009 4

原创 Kibana(五):调试模式无法启动的解决办法

像往常一样开机,敲入命令运行kibana,但突然报系统配置性,无法启动,如下:# 以调试模式启动kibana# ./kibana.bat --dev --no-base-path Kibana did not load properly. Check the server output for more information.以为是自己失手改动了关键配置,但以普通方式启动,一切又表现正

2017-07-10 19:14:55 13045 4

原创 CSS代码(四):float元素的垂直居中

在前端程序的开发中,经常会遇到将float元素垂直居中的应用场景,并且结合的场景非常之多,如float元素与inline元素、float元素与float元素、float元素与block元素以及它们的综合应用场景,在大部分的情况下,采用的方案有如下三种: 1. 采用flex布局; 2. 综合运用line-height、margin与padding; 3. 综合运用相对定位与绝对定位;第一种方案,

2017-07-09 19:41:36 30386 5

原创 域模型一定要实现Serializable接口吗?

在Web应用的开发中,尤其实在前后端分离的情况下,服务器端多半会将域模型以REST接口的方式提供给客户端,于是我在很多WEB应用中,都看到这样的代码:public class ActionStatus implements Serializable { private static final long serialVersionUID = -8633429564140080535L;

2017-07-08 19:38:21 1169

原创 Spring单例Bean与单例模式的区别

Spring单例Bean与单例模式的区别在于它们关联的环境不一样,单例模式是指在一个JVM进程中仅有一个实例,而Spring单例是指一个Spring Bean容器(ApplicationContext)中仅有一个实例。首先看单例模式,在一个JVM进程中(理论上,一个运行的JAVA程序就必定有自己一个独立的JVM)仅有一个实例,于是无论在程序中的何处获取实例,始终都返回同一个对象,以Java内置的Ru

2017-07-08 19:37:29 24870 3

原创 Kibana(四):日期数据无法解析的解决办法

Kibana插件Discover功能的使用中,有“Filter in”(查找与此值匹配的数据)与“Filter out”(排除与此值匹配的数据)两大快捷方式,在对日期数据进行操作的时候,提示如下错误:Discover: failed to parse date field [975542400000] with format [year_month_day] failed to parse dat

2017-07-08 08:31:35 13995

原创 Kibana(三):字段映射与可视化

Kibana最吸引我的地方莫过于可视化(visualize),结合桶(buckets)与指标(metrics)能创造出无穷无尽的图形,但是在实践中发现text字段无法进行聚合操作,如果用DSL语句操作,提示如下错误:"root_cause": [ { "type": "illegal_argument_exception", "reason": "Fielddata is dis

2017-07-06 17:30:50 7086

原创 ElasticSearch提供跨域访问的配置方法

找到config文件夹下的elasticsearch.yml,在文件的末尾添加如下内容:http.cors.enabled: truehttp.cors.allow-origin: "*"利用AJAX跨域修改数据的方法如下:var baseUrl = 'http://localhost:9200/', putUrl = baseUrl + 'events/logon_event/2',

2017-07-06 12:03:41 21660 4

原创 Kibana(二):服务器端解码解读

服务器端的入口为src\server\kbn_server.js,这也是系统启动的核心,这里采用了mixin方式,代码结构虽然清晰,但是代码分布在各处,配置信息的传递十分复杂,其关键代码如下:this.ready = constant(this.mixin( configSetupMixin, httpMixin, loggingMixin, warningsMixi

2017-07-06 12:02:38 2481

原创 Kibana(一):编译源码

首先从github上clone源码:# 克隆源码git clone https://github.com/elastic/kibana.git直接在主分支上开发是不太靠谱的,因为找不到与其相匹配的elasticsearch,从我测试的结果来看,现在elasticsearch与kibana对版本匹配度的要求极高,几乎要完全一致,否则将会出现以下错误:You're running Kibana 5

2017-07-05 10:57:24 5474

原创 并发(二):理解volatile

在JAVA中,当一个对象被生命为volatile时,我们说这个对象对所有的线程是可见的,那么这个对象具体指什么?是指这个对象引用的地址,还是指这个对象的内容,或者两者都包含?1. 对象的地址是始终可见的如果将一个对象声明为volatile,那么这个对象的引用无论发生任何变化,其他线程都可以立即感知它的变化,那么依照此推论,volatile与final修饰词必定是互斥的,二者只能任选其一,如下必定就是

2017-07-05 10:55:47 365

原创 并发(一):理解可重入锁

在JAVA中,内置锁都是可重入的,也就是说,如果某个线程试图获取一个已经由它自己持有的锁时,那么这个请求会立刻成功,并且会将这个锁的计数值加1,而当线程退出同步代码块时,计数器将会递减,当计数值等于0时,锁释放。看例子,一目了然:new Thread() { /* (non-Javadoc) * @see java.lang.Thread#run() */ @Ove

2017-07-03 15:18:34 4836

原创 覆盖与重载(一):泛型能决定方法宗量吗?

我们知道,方法的覆盖与重载都是由方法的签名决定的,而不同类型的泛型变量不仅差异明显,且不能相互转换,那么泛型的类型是否能决定方法的宗量呢?声明如下的接口,试图利用泛型的差异实现重载:public interface PrintService { void print(List<String> names); void print(List<Integer> names);}但编译器直接提

2017-07-02 16:25:05 448

原创 JAVA 8函数式编程(三):柯里化与惰性求值

百度百科里是这么定义柯里化的: 在计算机科学中,柯里化(Currying)是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数的技术。有没有看了跟没看一样,那就对了,很多技术概念就是这样,原本简单的东西一包装,创造个非常洋气的马甲,再加上一通云里雾里的解释,最后就成了高大上的高科技。照我的理解,柯里化主要做到了以下的三点: 1.

2017-07-02 16:24:03 4399 1

原创 一种快速划分千分位的方法

将整数按千位划分,如将12345划分为“12,345”,方法有很多种,例如整除1000的次方取余法,正则多次匹配替换法(首先检查字符串中是否还包含4位整数,然后逐次替换),无论上面的那种方法,都需要进行多次while循环,本文试图提出一种不用循环就成千分位快速划分的方法。解决的思路如下: 1. 首先将数字转换位字符串; 2. 对字符串的长度取余,划分首部与尾部; 3. 对尾部进行字符串替换;

2017-07-01 23:16:53 3648

libgcrypt11_1.5.3-2ubuntu4_amd64

libgcrypt11

2016-12-14

Chrome代理快速切换工具

Chrome代理快速切换工具,支持多个代理,以浏览器插件方式进行安装。

2016-12-06

syntaxhighlighter可执行库与示例

syntaxhighlighter是一个强大的语法高亮器,但是需要自己编译,较为繁琐,我把其编译为一个架包,并提供了相关的DEMO。

2016-07-06

Weblogic 兼容JPA相关架包架包

Weblogic不能兼容JPA2.0,引用资源及相关路径设置,内包含详细的操作说明

2016-06-02

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除