JavaEE 7

JavaEE 7 http://www.iteye.com/news/27980 甲骨文公司在2013年6月中旬正式发布了JavaEE 7 (JSR 342) 。 该版本特性主要集中在以下3个方面: 提供HTML5动态可伸缩应用程序 使用WebSocket,降低数据交换延迟,从而减少响应时间 支持标准JSON,简化便携式应用的数据解析 提供异步、可扩展、高性能的RESTful服务 提高开发人员的生产力 通过一个粘性集成平台,来简化应用程序架构 通过减少样板代码和广泛使用注解,来提高效率 通过对标准的RESTful web服务客户端支持,来增强应用程序的可移植性 满足最苛刻的企业需求 将批处理作业分解成可管理的块,以满足连续OLTP需求 轻松定义多线程并发任务,以提高可扩展性 提供可选的灵活的事务性应用程序 JavaEE 7提供了一个完整、全面、集成的堆栈来帮助你构建企业和Web应用程序。下面的这个图表有助于你了解这些组件之间是如何合作的。橙色部分为该版本中新添加的组件。 以下是JavaEE 7开发过程中14个活跃的JSR: 342: Java EE 7 Platform 338: Java API for RESTful Web Services 2.0 339: Java Persistence API 2.1 340: Servlet 3.1 341: Expression Language 3.0 343: Java Message Service 2.0 344: JavaServer Faces 2.2 345: Enteprise JavaBeans 3.2 346: Contexts and Dependency Injection 1.1 349: Bean Validation 1.1 ...

2014-01-01 · 1 min · 187 words · -

Windows 共享网络设置 (有线网络和无线网络)

Windows 共享网络设置 (有线网络和无线网络) 有线共享网络 打开连接 Internet 的 “本地连接 属性” 窗口,切换到“共享”标签页 在“共享” 标签页中,勾选 “允许其他网络用户通过此计算机的Internet连接来连接”,确定;如果网络连接中超过两个连接,则还需要选择需要共享的连接 打开另一个需要共享的连接的“本地连接 属性”窗口,选择“Internet 协议版本4 (TCP/IPV4)属性”,设置静态IP,这里的设置的IP网段应避开连接Internet的网段,否则易造成IP冲突等问题 这样配置后,这个网卡就想当于共享网络的网关,其他要共享此连接的电脑只需要设置将IP地址配置成同一网段与上述不同即可 (如192.168.71.2),其余配置不变 无线共享网络 无线共享在双网卡的情况下,用于共享需要是无线网卡,这里可以采用与上述相同的方式进行无线网络共享;当然也可使用如360出的免费360wifi,可以不用进行配置 如果进行上述配置后,各连接正常,但是无法访问Internet,则是由于Internet Connection Sharing(ICS)服务未启动。 右键“我的电脑”-》管理-》服务和应用程序-》服务-》双击Internet Connection Sharing(ICS)-》启动 双击Internet Connection Sharing(ICS)状态栏显示“已启动”即可 ———————————————— 版权声明:本文为CSDN博主「小蜗coding」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/acsder2010413/article/details/40395621

2014-01-01 · 1 min · 35 words · -

java illegal character \65279

‘java illegal character \65279’ http://blog.csdn.net/shixing_11/article/details/6976900 某些编辑器会往utf8文件中添加utf8标记 (editplus称其为签名) ,它会在文件开始的地方插入三个不可见的字符 (0xEF 0xBB 0xBF,即BOM) ,它的表示的是 Unicode 标记 (BOM) 。 因此要解决这个问题的关键就是把这个标记选项去掉,可按如下方法操作。 首先用editplus打开这个文件,从Doucument菜单中选择Permanet Settings,有三个分类,分别是General,File, Tools.点击File,右边会有一项是 UTF-8 signature: 选择 always remove signature. 点击OK 。中文版本的 Editplus 下操作的菜单结构如下: 文档->参数设置->文件->UTF-8签名->总是移除签名->确定 ,这样就设置了UTF-8格式不需要在文件前面加标记,最后把文件另存为utf-8格式就好了. 相关资料,网上摘抄: UTF-8以字节为编码单元,没有字节序的问题。UTF-16以两个字节为编码单元,在解释一个UTF-16文本前,首先要弄清楚每个编码单元的字节序。例如收到一个"奎"的Unicode编码是594E,“乙"的Unicode编码是4E59。如果我们收到UTF-16字节流"594E”,那么这是"奎"还是"乙"?Unicode规范中推荐的标记字节顺序的方法是BOM。BOM不是"Bill Of Material"的BOM表,而是Byte Order Mark。BOM是一个有点小聪明的想法: 在UCS编码中有一个叫做"ZERO WIDTH NO-BREAK SPACE"的字符,它的编码FEFF。而FFFE在UCS中是不存在的字符,所以不应该出现在实际传输中。UCS规范建议我们在传输字节流前,先传输字符"ZERO WIDTH NO-BREAK SPACE"。这样如果接收者收到FEFF,就表明这个字节流是Big-Endian的;如果收到FFFE,就表明这个字节流是Little-Endian的。因此字符"ZERO WIDTH NO-BREAK SPACE"又被称作BOM。UTF-8不需要BOM来表明字节顺序,但可以用BOM来表明编码方式。字符"ZERO WIDTH NO-BREAK SPACE"的UTF-8编码是EF BB BF (读者可以用我们前面介绍的编码方法验证一下) 。所以如果接收者收到以EF BB BF开头的字节流,就知道这是UTF-8编码了。Windows就是使用BOM来标记文本文件的编码方式的。原来BOM是在文件的开始加了几个字节作为标记。 扩展阅读: UTF-8, UTF-16, UTF-32 & BOM: http://www.unicode.org/faq/utf_bom.html#BOM W3C官方说明: http://www.w3.org/International/questions/qa-utf8-bom

2013-12-27 · 1 min · 66 words · -

Log4j 2.x

Log4j 2.x Log4j2.x log4j-api:log4j2 定义的API log4j-core:log4j2 上述API的实现 <properties> <log4j.version>2.17.2</log4j.version> </properties> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>${log4j.version}</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>${log4j.version}</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-slf4j-impl</artifactId> <version>${log4j.version}</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-jcl</artifactId> <version>${log4j.version}</version> </dependency> log4j2里面日志有8个等级,由低到高是: all<trace<debug<info<warn<error<fatal<off 看下面的配置,这个配置会输出error及以上的日志级别,也就是onMatch匹配的是 大于等于 该等级的日志,输出的就是error,fatal <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY" /> 然后是一个相反的配置,这个配置会输出error以下的日志级别,也就是onMismatch匹配的是 小于 该等级的日志,输出的就是warn,info,debug,trace <ThresholdFilter level="error" onMatch="DENY" onMismatch="ACCEPT" /> <loggers> </AsyncLogger> </loggers> loggers标签,用于定义logger的lever和所采用的appender,其中appender-ref必须为先前定义的 appenders的名称,例如,此处为Console。那么log就会以appender所定义的输出格式来输出log。 root标签为log的默认输出形式,如果一个类的log没有在loggers中明确指定其输出lever与格式,那么就会采用root中定义的格式。 private static Logger logger = LogManager.getLogger(Foo.class.getName()); gradle compile ‘org.apache.logging.log4j:log4j-api:2.0-beta9’ compile ‘org.apache.logging.log4j:log4j-core:2.0-beta9’ The name of the configuration file should be log4j2.xml ...

2013-12-27 · 1 min · 178 words · -

Yahei Consolas Hybrid

Yahei Consolas Hybrid https://github.com/crvdgc/Consolas-with-Yahei Yahei Consolas Hybrid 是一种合成字体,是由微软雅黑的中文字体和 Consolas 的英文字体合成的,Consolas 字体是微软专为程序员开发的一种字体,但没有中文支持,所以 Yahei Consolas Hybrid 这种字体特别适合中英文的编程开发,代码编写 git clone https://gitee.com/a42/YaHei-Consolas-Hybrid-1.12.git && sh YaHei-Consolas-Hybrid-1.12/setup.sh && cd - && rm -rf YaHei-Consolas-Hybrid-1.12 https://gitee.com/a42/YaHei-Consolas-Hybrid-1.12 https://github.com/yakumioto/YaHei-Consolas-Hybrid-1.12 http://blog.alphatr.com/yahei-consolas.html https://blog.alphatr.com/yahei-consolas.html Yahei Consolas Hybrid 是一种合成字体,是由微软雅黑的中文字体和 Consolas 的英文字体合成的,Consolas 字体是微软专为程序员开发的一种字体,但没有中文支持,所以 Yahei Consolas Hybrid 这种字体特别适合中英文的编程开发,代码编写 Yahei Consolas 下载安装: 下载地址: 点击下载 下载下来,打开压缩包直接双击字体文件,在系统自带的字体预览程序左上角点击安装,字体就被安装进去了,也可以直接粘贴到系统的字体文件夹 (%SystemRoot%\Fonts) 字体安装 使用方式: 这里以记事本为例,其他软件基本设置都差不多,打开 格式>字体…,弹出字体对话框,选择 Yahei Consolas Hybrid 字体,建议选择五号字体,点击确定 设置字体 下面是系统默认宋体和 Yahei Consolas Hybrid 的对比图 字体对比 PS: 建议安装字体渲染工具 GDI++(32位)、ezGDI(64位),这样字体会更美观

2013-12-27 · 1 min · 68 words · -

Class.forName

Class.forName Class类简介: Java程序在运行时,Java运行时系统一直对所有的对象进行所谓的运行时类型标识。这项信息纪录了每个对象所属的类。虚拟机通常使用运行时类型信息选准正确方法去执行,用来保存这些类型信息的类是Class类。Class类封装一个对象和接口运行时的状态,当装载类时,Class类型的对象自动创建。 Class 没有公共构造方法。Class 对象是在加载类时由Java 虚拟机以及通过调用类加载器中的 defineClass 方法自动构造的,因此不能显式地声明一个Class对象。 虚拟机为每种类型管理一个独一无二的Class对象。也就是说,每个类 (型) 都有一个Class对象。运行程序时,Java虚拟机(JVM)首先检查是否所要加载的类对应的Class对象是否已经加载。如果没有加载,JVM就会根据类名查找.class文件,并将其Class对象载入。 基本的 Java 类型 (boolean、byte、char、short、int、long、float 和 double) 和关键字 void 也都对应一个 Class 对象。 每个数组属于被映射为 Class 对象的一个类,所有具有相同元素类型和维数的数组都共享该 Class 对象。 一般某个类的Class对象被载入内存,它就用来创建这个类的所有对象。 一、如何得到Class的对象呢?有三种方法可以的获取: 1、调用Object类的getClass()方法来得到Class对象,这也是最常见的产生Class对象的方法。例如: MyObject x; Class c1 = x.getClass(); 2、使用Class类的中静态forName()方法获得与字符串对应的Class对象。例如: Class c2=Class.forName(“MyObject”),Employee必须是接口或者类的名字。 获取Class类型对象的第三个方法非常简单。如果T是一个Java类型,那么T.class就代表了匹配的类对象。例如 Class cl1 = Manager.class; Class cl2 = int.class; Class cl3 = Double[].class; 注意: Class对象实际上描述的只是类型,而这类型未必是类或者接口。例如上面的int.class是一个Class类型的对象。由于历史原因,数组类型的getName方法会返回奇怪的名字。 二、Class类的常用方法 getName() 一个Class对象描述了一个特定类的属性,Class类中最常用的方法getName以 String 的形式返回此 Class 对象所表示的实体 (类、接口、数组类、基本类型或 void) 名称。 newInstance() Class还有一个有用的方法可以为类创建一个实例,这个方法叫做newInstance()。例如: x.getClass.newInstance(),创建了一个同x一样类型的新实例。newInstance()方法调用默认构造器 (无参数构造器) 初始化新建对象。 ...

2013-12-21 · 4 min · 841 words · -

Gradle, 目录

Gradle, 目录 Gradle 是以 Groovy 语言为基础,面向Java应用为主。基于DSL (领域特定语言) 语法的自动化构建工具。 build (ignore) build.gradle (commit) .gradle: (ignore) 目录自动生成, 是gradle 的缓存文件. gradle: (commit) gradle/wrapper/gradle-wrapper.jar, Gradle官方建议我们在所有Gradle项目中都创建Wrapper文件,方便没有安装Gradle的用户使用。 gradlew (commit),Gradlew是包装器,自动下载包装器里定义好的gradle 版本,保证编译环境统一,gradle 是用本地的gradle版本。 gradlew.bat (commit): for windows out: (ignore) src: (commit) source code The wrapper is something you should check into version control. By distributing the wrapper with your project, anyone can work with it without needing to install Gradle beforehand. Even better, users of the build ar ...

2013-12-20 · 1 min · 133 words · -

xml version

xml version There are two current versions of XML. The first (XML 1.0) was initially defined in 1998. It has undergone minor revisions since then, without being given a new version number, and is currently in its fifth edition, as published on November 26, 2008. It is widely implemented and still recommended for general use. The second (XML 1.1) was initially published on February 4, 2004, the same day as XML 1.0 Third Edition,[31] and is currently in its second edition, as published on August 16, 2006. It contains features (some contentious) that are intended to make XML easier to use in certain cases.[32] The main changes are to enable the use of line-ending characters used on EBCDIC platforms, and the use of scripts and characters absent from Unicode 3.2. XML 1.1 is not very widely implemented and is recommended for use only by those who need its unique features.[33] ...

2013-12-20 · 1 min · 151 words · -

阻塞队列 BlockingQueue

阻塞队列 BlockingQueue 什么是阻塞队列 阻塞队列 (BlockingQueue) 是一个支持两个附加操作的队列。这两个附加的操作是: 在队列为空时,获取元素的线程会等待队列变为非空。当队列满时,存储元素的线程会等待队列可用。阻塞队列常用于生产者和消费者的场景,生产者是往队列里添加元素的线程,消费者是从队列里拿元素的线程。阻塞队列就是生产者存放元素的容器,而消费者也只从容器里拿元素。 方法\处理方式 抛出异常 返回特殊值 一直阻塞 超时退出 插入方法 add(e) offer(e) put(e) offer(e,time,unit) 移除方法 remove() poll() take() poll(time,unit) 检查方法 element() peek() 不可用 不可用 抛出异常: 是指当阻塞队列满时候,再往队列里插入元素,会抛出IllegalStateException(“Queue full”)异常。当队列为空时,从队列里获取元素时会抛出NoSuchElementException异常 。 返回特殊值: 插入方法会返回是否成功,成功则返回true。移除方法,则是从队列里拿出一个元素,如果没有则返回null 一直阻塞: 当阻塞队列满时,如果生产者线程往队列里put元素,队列会一直阻塞生产者线程,直到拿到数据,或者响应中断退出。当队列空时,消费者线程试图从队列里take元素,队列也会阻塞消费者线程,直到队列可用。 超时退出: 当阻塞队列满时,队列会阻塞生产者线程一段时间,如果超过一定的时间,生产者线程就会退出。 Java里的阻塞队列 JDK7 提供了 7 个阻塞队列 ArrayBlockingQueue : 一个由数组结构组成的有界阻塞队列。 LinkedBlockingQueue : 一个由链表结构组成的有界阻塞队列。 PriorityBlockingQueue : 一个支持优先级排序的无界阻塞队列。 DelayQueue: 一个使用优先级队列实现的无界阻塞队列。 SynchronousQueue: 一个不存储元素的阻塞队列。 LinkedTransferQueue: 一个由链表结构组成的无界阻塞队列。 LinkedBlockingDeque: 一个由链表结构组成的双向阻塞队列。 在JDK1.5新增的Concurrent包中,BlockingQueue很好的解决了多线程中,如何高效安全"传输"数据的问题。通过这些高效并且线程安全的队列类,为我们快速搭建高质量的多线程程序带来极大的便利。 认识BlockingQueue 阻塞队列,顾名思义,首先它是一个队列,通过一个共享的队列,可以使得数据由队列的一端输入,从另外一端输出; 常用的队列主要有以下两种: (当然通过不同的实现方式,还可以延伸出很多不同类型的队列,DelayQueue就是其中的一种) 先进先出 (FIFO) : 先插入的队列的元素也最先出队列,类似于排队的功能。从某种程度上来说这种队列也体现了一种公平性。 后进先出 (LIFO) : 后插入队列的元素最先出队列,这种队列优先处理最近发生的事件。 ...

2013-12-20 · 3 min · 447 words · -

tcp http 调试, 抓包工具, wireshark, Fiddler

tcp http 调试, 抓包工具, wireshark, Fiddler wireshark wireshark 的前身是Ethereal,2006年因为其创始人Gerald Combs的跳槽而改名为wireshark。它是一个跨平台的软件,可以在unix系列、linux、mac os、windows等多个平台上面进行网络协议抓包工作。同时他也是一个开源软件,有兴趣的话可以下载源码深入了解。我们可以通过wireshark官网进一步了解相关知识及下载该软件。 fiddler fiddler 的定位是网页调试工具,能记录所有客户端和服务器的http和https请求,允许你监视,设置断点,甚至修改输入输出数据。我们还可以为fiddler安装自己所需的插件,从而更好的利用fiddler的强大功能。详细介绍信息可以通过fiddler官网进一步了解, 做Web开发或者Web分析经常需要查看Http通讯的过程,项目实践中,很多Web相关的各种各样稀奇古怪的问题,最后都能通过分析HTTP流量得以解决。我到现在用过的比较好用的两个Http流量分析工具,一个是HTTP Watch,另外一个是Fiddler。 HTTP Watch HTTP Watch是我最早用过的HTTP流量分析工具。它只能用于IE和Firefox浏览器上。 它有两种使用界面,一种是以插件的形式附加在浏览器上面,供实时分析使用。你可以看到当前窗口中所有的HTTP请求/响应过程。另外它允许把实时分析的结果保存为后缀名为hwl的文件,然后用其自带的Http Watch Studio工具打开,这样既方便了以后对此过程再次进行分析,也方便与其他人共享,易于调试。下面是它的插件界面的截图,非常清新简洁: image 它的界面非常简单,主要分成三部分: 工具栏,HTTP消息概览,HTTP消息细节窗口。 工具栏主要是方便你快速过滤出你想要分析HTTP消息。 image 你可以按照HTTP流量内容类型去筛选,例如只查看图片相关的HTTP流量。或者根据Url是否包含某特定字符串进行过滤,等等。另外工具栏也提供了"清缓存"和"清Cookie"两个非常常见的操作。 HTTP消息概览栏可以让你快速查看当前窗口中的所有HTTP消息,每个HTTP消息花费的时间,以及服务器返回的状态码,请求的Url等等。默认它还会按照HTTP消息发起的页面进行分组,方便查看。 最底部就是每条HTTP消息的详细信息。最后面的Stream标签页显示的是最原始的HTTP请求/响应流。这里记录的信息是最详细的。 image 为了方便分析常见的需求,它将HTTP消息分成几个部分,也就是你上面看到的Headers、Cookies、QueryString、PostData等等标签页所展示的内容。下面的图展示了此次HTTP通讯涉及的Cookie,每个Cookie的键值,作用的主机域以及路径、过期时间等。 image HTTP Watch Studio就不做介绍了,基本和插件版本的一致,只不过可以脱离浏览器直接分析以前保存的HTTP通讯过程。 HTTP Watch提供了基础版本以及专业版本,其中基础版本是免费的。事实上基础版本提供的功能已经能够适用于大多数的情况了。 官方站点: http://www.httpwatch.com Fiddler Fiddler是微软推出的一个免费的HTTP流量分析工具。一开始我以为他只支持IE——毕竟是微软的东西——加之常见的功能HTTP Watch都已经够用了,就没怎么关注。这些天因为要调试Chrome浏览器上的一些问题,而Chrome自带的开发者工具又非常糟糕,搜着搜着又再次找到了Fiddler。 image Fiddler的界面和HTTP Watch差不多,都是分成三部分,工具栏+HTTP通讯总览+HTTP消息细节。只不过默认情况下它把HTTP消息细节窗口放到了右边。 用了一阵子发现,HTTP Watch能做到的,基本在Fiddler上都可以实现。不过Fiddler的界面显得比HTTP Watch要复杂一些,因为它提供了一些HTTP Watch没有的功能。下面主要介绍的是它和HTTP Watch不一样的地方,一样的功能就略过了。 Fiddler能够监视所有本地进程的HTTP消息,而不仅限于IE、Firefox这些浏览器。这比HTTP Watch适用范围更广。下图显示了google talk和Visual Studio发起的HTTP请求. image 安装完Fiddler之后你会发现IE还有Firefox中都多了个Fiddler的插件,Fiddler的原理实际上是在本地启动HTTP代理服务器,因为除了Firefox以外,很多应用程序包括其他浏览器都会应用IE上设置的代理。所以Fiddler只需要设置IE和Firefox这两个浏览器的代理服务器即可。这个插件做的事情实际上就是起到动态切换代理服务器的作用。 选中左侧某条特定的HTTP请求,Fiddler会在右侧帮你统计一下当前选中的HTTP消息的一些性能指标,例如发送/接受字节数,发送/接收时间,还有粗略统计世界各地访问该服务器所花费的时间。 image 在右侧窗口中,你可以采用各种视图去解析同一个HTTP请求/响应。例如以纯文本视图,或者图片视图,十六进制视图等等。它还提供了一个压缩测试工具,告诉你如果启用了Gzip或者deflate等压缩之后能够节省多少传输字节。 image Fiddler会记录下每次HTTP通讯的过程,然后允许你在不将请求发送给服务器的情况下返回之前记录的响应结果。 Fiddler还允许你对HTTP请求下断点,然后你可以根据情况来决定每个请求所返回的响应。 如果你想测试一些特殊的HTTP请求或者修改当前请求一些报头的时候,你不需要自己再写一个小程序去实现这样的功能,因为在Fiddler提供了直接编写HTTP请求的功能。你可以模拟浏览器去发送HTTP消息。 Fiddler支持插件机制,如果你觉得它提供的功能还不够用,那么你可以安装各种插件以增强它的功能或者编写自己的插件。官网上提供了几个不错的插件供免费下载。一个可以用于对HTML和Javascript代码进行语法着色,还有一个可以监视Web应用程序的安全隐患。 官方站点: http://www.fiddler2.com 总结 总的来说,HTTP Watch的使用相比Fiddler更简洁、容易上手。但是只适用于IE和Firefox。Fiddler功能更为强大,适用范围更广,而且还是免费的。具体用哪个就得看实际需求了。 1.为什么是Fiddler? ...

2013-12-13 · 1 min · 139 words · -

cpu 占用分析

cpu瓶颈分析 #系统的平均负载 uptime # 每个 CPU 的使用情况 mpstat # 每个进程 CPU 的使用情况 pidstat stress stress https://www.hi-linux.com/posts/59095.html https://www.infoq.cn/article/5jjIdOPx12RWWvGX_H9J?utm_source=rss&utm_medium=article http://9leg.com/java/2016/08/09/cpu-consumption-analysis.html 通常性能瓶颈的表现是资源消耗过多、外部处理系统的性能不足,或者资源消耗不多,但程序的响应速度却达不到要求。 资源主要消耗在cpu,io (又分文件io和网络io) ,内存方面,机器的资源是有限的,当某资源消耗过多时,通常会造成系统的响应速度变慢。 对于java应用而言,寻找性能瓶颈的方法通常为首先分析资源的消耗,然后结合java的一些工具来查找程序中造成资源消耗过多的代码。 今天先谈一谈cpu消耗如何分析,系统为linux,jdk为sun jdk。 在linux中,cpu主要用于中断、内核和用户进程的任务处理,优先级为中断>内核>用户进程,下面先讲述三个重要的概念。 上下文切换 每个cpu (多核cpu中的每个cpu) 在同一时间只能执行一个线程,linux采用的是抢占式调度。为每个线程分配一定的执行时间, 当到达执行时间、线程中有io阻塞或高优先级的线程要执行时,linux将切换执行的线程,在切换时要存储目前的线程的执行状态, 并恢复要执行的线程的状态,这个过程就是上下文切换。对于java应用而言,典型的是在进行文件io操作、网络io操作、锁等待或者线程sleep时, 当前线程会进入阻塞或休眠状态,从而触发上下文切换,上下文切换过多会造成内核占据较多的cpu使用,从而使应用响应速度变慢。 运行队列 每个cpu核都会维护一个可运行的线程队列,例如一个4核的cpu,java应用里启动了8个线程,且这8个线程都处于可运行状态, 那么在分配平均的情况下每个cpu中的运行队列就会有2个线程。通常而言,系统的load主要由cpu运行队列来决定。 利用率 cpu利用率为cpu在用户进程、内核、中断处理、io等待以及空闲5个部分使用的百分比,这5个值是用来分析cpu消耗的关键指标。 在linux中,可通过top或pidstat方式来查看进程中线程的cpu的消耗状况。 top 输入top命令后既可查看cpu的消耗情况,cpu的信息在top视图的上面几行中 对于多个或多核cpu,上面的显示则会是多个cpu所占用的百分比总合。如需查看每个核的消耗情况,可在进入top视图后按1,就会按核来显示消耗情况。 cpu-top 默认情况下,top视图中显示的为进程的cpu消耗状况,在top视图中按shift + h后,可按线程查看cpu的消耗状况,此时的pid既为线程id。 pidstat sy过高 当sy值过高时,表示linux花费了更多的时间在进行线程切换。java应用造成这种现象的主要原因是启动的线程比较多, 且这些线程多处于不断的阻塞 (例如锁等待,io等待) 和执行状态的变化过程中,这就导致了操作系统要不断的切换执行的线程, 产生大量的上下文切换。在这种情况下,对java应用而言,最重要的是找出不断切换状态的原因, 可采用的方法为通过kill -3 pid 或jstack -l pid的方法dump出java应用程序的线程信息,查看线程的状态信息以及锁信息, 找出等待状态或锁竞争过多的线程。 进程和线程的上下文切换都涉及进出系统内核和寄存器的保存和还原,这是它们的最大开销。但与进程的上下文切换相比,线程还是要轻量一些, 最大的区别是线程上下文切换时虚拟内存地址保持不变,所以像TLB等CPU缓存不会失效。但要注意的是另一份提问 What is the overhead of a context-switch?的中提到了: Intel和AMD在2008年引入的技术可能会使TLB不失效。 ...

2013-12-10 · 1 min · 72 words · -

测试覆盖

测试覆盖 传统的测试覆盖方法常见的有以下几种: 函数覆盖 (Function Coverage) 语句覆盖 (Statement Coverage) 决策覆盖 (Decision Coverage) 条件覆盖 (Condition Coverage) 还有一些其他覆盖方法,如Modified Condition/Decision Coverage,就不在这里讨论了。 函数覆盖: 顾名思义,就是指这个函数是否被测试代码调用了。以下面的代码为例,对函数foo要做到覆盖,只要一个测试——如assertEquals(2, foo(2, 2))——就可以了。如果连函数覆盖都达不到,那应该想想这个函数是否真的需要了。如果需要的话,那又为什么写不了一个测试呢? 语句覆盖: (也称行覆盖) ,指的是某一行代码是否被测试覆盖了。同样的代码要达到语句覆盖也只需要一个测试就够了,如assertEquals(2, foo(2, 2))。但是,如果把测试换成assertEquals(0, foo(2, -1)),那就无法达到所有行覆盖的效果了。通常这种情况是由于一些分支语句导致的,因为相应的问题就是"那行代码 (以及它所对应的分支) 需要吗?",或者"用什么测试可以覆盖那行代码所代表的分支呢?"。 **决策覆盖: **指的是某一个逻辑分支是否被测试覆盖了。如我上面所说,语句覆盖通常和决策覆盖有关系。还是以上面的代码为例,要达到所有的决策覆盖 (即那个if语句为真和假的情况至少出现一次) ,我们需要至少两个测试,如assertEquals(2, foo(2, 2))和assertEquals(0, foo(-1, 2))。如果有一个逻辑分支没有被覆盖 (比如只有测试assertEquals(2, foo(2, 2))) ,那么我们应该问和上面"语句覆盖"小节中相似的问题。 条件覆盖:指的是分支中的每个条件 (即与,或,非逻辑运算中的每一个条件判断) 是否被测试覆盖了。之前的代码要达到全部的条件覆盖 (也就是x>0和y>0这两个条件为真和假的情况均至少出现一次) 需要更多的测试,如assertEquals(2, foo(2, 2)),assertEquals(2, foo(2, -1))和assertEquals(2, foo(-1, -1))。如果有一个条件分支没有被覆盖 (比如缺少测试assertEquals(2, foo(-1, -1))) ,那么大家应该想想"那个条件判断是否还需要呢?",或者"用什么测试可以覆盖那个条件所对应的逻辑呢?"。 通过上面对几种传统的测试覆盖方法的介绍,大家不难发现,这些方法的确可以帮我们找到一些显而易见的代码冗余或者测试遗漏的问题。不过,实践证明,这些传统的方法只能产生非常有限的"学习"代码和测试中问题的机会。很多代码和测试的问题即使在达到100%覆盖的情况下也无法发现。然而,我接下来要介绍的"代码变异测试"这种方法则,它可以很好的弥补传统方法的缺点,产生更加有效的"学习"机会。 http://www.infoq.com/cn/articles/test-coverage-rate-role

2013-12-09 · 1 min · 59 words · -

墨菲定理

墨菲定理 墨菲定律是美国的一名工程师爱德华·墨菲作出的著名论断,亦称莫非定律、莫非定理、或摩菲定理,是西方世界常用的俚语。墨菲定律主要内容是: 事情如果有变坏的可能,不管这种可能性有多小,它总会发生。 “墨菲定律” (英文: Murphy’s Law) ,是一种心理学效应,由一个工程师提出,主要内容有四个方面: 一、任何事都没有表面看起来那么简单;二、所有的事都会比你预计的时间长;三、会出错的事总会出错;四、如果你担心某种情况发生,那么它就更有可能发生。 理论解释 “墨菲定律"的根本内容是"凡是可能出错的事有很大几率会出错”,指的是任何一个事件,只要具有大于零的机率,就不能够假设它不会发生。 在科学和算法方面,它与英文所谓的"worst-case scenario (最劣情形) “同义,数学上用大O符号来表示。例如,对插入排序来说,最劣情形即是要排序的阵列完全倒置,必须进行 n*(n-1) 次的置换才能完成排序。在实验上,证明了最劣情形不会发生,并不代表比它轻微的情形就不可能,除非能够很有信心的推论事件的概率分布是线型的。 在文化方面,它代表一种近似反讽的幽默,当作对日常生活中不满的排解。[1] 什么是墨菲定律?最简单的表达形式是"有可能出错的事情,就会出错 (Anything that can go wrong will go wrong) 。"爱德华·墨菲(Edward A. Murphy)是一名工程师,这句话迅速流传。经过多年,这一"定律"逐渐进入习语范畴,其内涵被赋予无穷的创意,出现了众多的变体,"[1]If anything can go wrong, it will.(会出错的,终将会出错)"、"笑一笑,明天未必比今天好。""东西越好,越不中用"、"别试图教猪唱歌,这样不但不会有结果,还会惹猪不高兴!" 墨菲定律的原句是这样的: If there are two or more ways to do something, and one of those ways can result in a catastrophe, then someone will do it. (如果有两种选择,其中一种将导致灾难,则必定有人会作出这种选择。) 。 简单地说,墨菲定律就是: 看似一件事好与坏的几率相同的时候,事情都会朝着糟糕的方向发生。 墨菲定律的来源,是一个叫墨菲的空军上尉,他有一个经常会遇到倒霉事的同事。1949年的一天,墨菲开玩笑说: “如果一件事情有可能被弄糟,让他去做就一定会弄糟。“举个例子吧,比如你每天出门都带着雨伞,可总也不下雨。当你这一天不想再带伞出门时,则往往会赶上下雨。再比如你去排队买东西,窗口前有几条相同长度的队伍。这时,你所加入的队伍往往是最慢的。 http://baike.baidu.com/subview/440060/9859388.htm?fromtitle=%E5%A2%A8%E8%8F%B2%E6%B3%95%E5%88%99&fromid=3621432&type=syn

2013-12-09 · 1 min · 69 words · -

MACD

MACD 指数平滑移动平均线 (Moving Average Convergence and Divergence) 平滑异同移动平均线即MACD指标。MACD称为指数平滑移动平均线,是从双移动平均线发展而来的,由快的移动平均线减去慢的移动平均线,MACD的意义和双移动平均线基本相同,但阅读起来更方便。当MACD从负数转向正数,是买的信号。当MACD从正数转向负数,是卖的信号。当MACD以大角度变化,表示快的移动平均线和慢的移动平均线的差距非常迅速的拉开,代表了一个市场大趋势的转变。 MACD在应用上应先行计算出快速 (一般选12日) 移动平均值与慢速 (一般选26日) 移动平均值。以这两个数值作为测量两者 (快速与慢速线) 间的"差离值"依据。所谓"差离值" (DIF) ,即12日EMA数值减去26日EMA数值。因此,在持续的涨势中,12日EMA在26日EMA之上。其间的正差离值 (+DIF) 会愈来愈大。反之在跌势中,差离值可能变负 (-DIF) ,也愈来愈大。 至于行情开始回转,正或负差离值要缩小到怎样的程度,才真正是行情反转的信号。MACD的反转信号界定为"差离值"的9日移动平均值 (9日EMA) 。 在MACD的指数平滑移动平均线计算公式中,都分别加T+1交易日的份量权值,以现在流行的参数12和26为例,其公式如下: 12日EMA的计算: EMA12 = 前一日EMA12 X 11/13 + 今日收盘 X 2/13 26日EMA的计算: EMA26 = 前一日EMA26 X 25/27 + 今日收盘 X 2/27 差离值 (DIF) 的计算: DIF = EMA12 - EMA26 然后再根据差离值计算其9日的EMA,即"差离平均值",“差离平均值"用DEA来表示。 DEA = (前一日DEA X 8/10 + 今日DIF X 2/10) 计算出的DIF与DEA为正或负值,因而形成在0轴上下移动的两条快速与慢速线。为了方便判断,用DIF减去DEA,用以绘制柱状图。目前国内学习MACD指标的网站有新浪财经,MACD股票论坛,腾讯财经,网易财经,上上若水,里面资源众多,适合大家学习参考用! MACD指标是由两线一柱组合起来形成,快速线为DIF,慢速线为DEA,柱状图为MACD。在各类投资中,有以下方法供投资者参考: 当DIF和MACD均大于0(即在图形上表示为它们处于零线以上)并向上移动时,一般表示为行情处于多头行情中,可以买入开仓或多头持仓; 当DIF和MACD均小于0(即在图形上表示为它们处于零线以下)并向下移动时,一般表示为行情处于空头行情中,可以卖出开仓或观望。 当DIF和MACD均大于0(即在图形上表示为它们处于零线以上)但都向下移动时,一般表示为行情处于下跌阶段,可以卖出开仓和观望; 当DIF和MACD均小于0时(即在图形上表示为它们处于零线以下)但向上移动时,一般表示为行情即将上涨,股票将上涨,可以买入开仓或多头持仓。 指数平滑异同移动平均线,简称MACD,它是一项利用短期指数平均数指标与长期指数平均数指标之间的聚合与分离状况,对买进、卖出时机作出研判的技术指标,电子现货之家有详细介绍。 ...

2013-12-06 · 2 min · 406 words · -

raspberry pi bt

raspberry pi bt http://www.howtogeek.com/142044/how-to-turn-a-raspberry-pi-into-an-always-on-bittorrent-box/

2013-12-01 · 1 min · 4 words · -

linux iwconfig wpasupplicant 命令行配置无线上网,wpa_supplicant

linux iwconfig wpasupplicant 命令行配置无线上网,wpa_supplicant install wpa supplicant sudo apt-get install wpasupplicant wpagui sudo pacman -S wpa_supplicant generate psk password wpa_passphrase SSID PASSWORD ##write to file wpa_passphrase SSID PASSWORD >> /etc/wpa_supplicant.conf ##connect sudo wpa_supplicant -B -i wlan0 -c /etc/wpa_supplicant.conf , 询问有关命令行配置无线网络的问题,受到启发,做了一点尝试,在这里留下帖子做个笔记。。 我的状况: Debian lenny , kernel 2.6.26-686 , opebox+tint2 网卡两块 Broadcom NetXtreme BCM5710 和 Intel Pro/Wireless 2200BG 步骤有三个: 连接到路由器 命令行 **代码:**iwconfig essid ap rate freq channel key ...

2013-12-01 · 2 min · 231 words · -

usermod

usermod # add user to docker group sudo usermod -aG docker $USER 禁止用户登录 usermod -s /sbin/nologin user0 应用举例: 将 newuser2 添加到组 staff 中 usermod -G staff newuser2 修改 newuser 的用户名为 newuser1 usermod -l newuser1 newuser 锁定账号 newuser1 usermod -L newuser1 解除对 newuser1 的锁定 usermod -U newuser1 功能说明: 修改用户帐号。 语法: usermod [-LU][-c <备注>][-d <登入目录>][-e <有效期限>][-f <缓冲天数>][-g <群组>][-G <群组>][-l <帐号名称>][-s ][-u ][用户帐号] 补充说明: usermod可用来修改用户帐号的各项设定。 参数: ...

2013-12-01 · 1 min · 87 words · -

hostapd

hostapd 主页: http://w1.fi/hostapd/ hostapd是一个_IEEE 802.11的AP和IEEE 802.1X/WPA/WPA2/EAP/RADIUS验证器_.此页面用于怎么在linux系统下使用它.其他操作系统请参考hostapd主页 就Linux而言,老版本只能使用以下3个包 HostAP madwifi prism54 所有新的基于mac80211的驱动实现AP功能被hostapd’s nl80211 驱动支持 The mac80211 子系统将所有的master模式已经移到用户空间.通过hostapd去处理客户端验证,设置加密密钥,建立密钥转化策略,以及无线公共部分的其他方面. 由此,老的使用’iwconfig mode master’的方法已经不能使用了. 用户空间程序像hostapd目前使用netlink (the nl80211 driver)去创建master mode接口实现通信,monitor mode接口实现接收和发送管理框架 获得hostapd Using your distributions hostapd 在编译和安装你的拷贝之前尝试发行版本是很明智的.这将让你以后的干礼轻松,如果你的版本大于0.6.8或更新,你通过简单配置hostapd-minimal.conf文件来进行测试: change wlan0 to your wireless device interface=wlan0 driver=nl80211 ssid=test channel=1 如果上述配置出现以下错误: hostapd $ sudo hostapd ./hostapd-minimal.conf Configuration file: ./hostapd-minimal.conf Line 2: invalid/unknown driver ’nl80211' 1 errors found in configuration file ‘./hostapd-minimal.conf’ 那就意味着你的hostapd不支持nl80211,你将需要按以下操作编译。如果正常,你可以跳转到配置hostapd章节 下载和编译hostpad 使用基于nl80211的hostapd需要你有至少libnl-1.0 pre8或更新的 genl版本,nl80211依赖Generic Netlink. 大多数发行版都自带有这个或者更新的.在fedora或其它开发包和安装包分开发行版编译 _时,你需要libnl-devel 包 ...

2013-12-01 · 4 min · 814 words · -

Raspberry Pi配置为无线路由器

Raspberry Pi配置为无线路由器 http://www.cnblogs.com/DaochenShi/p/3152981.html 因为自己有个RPi,但是之前用的8188CUS芯片的无线网卡不支持,虽然当时买的时候是为了让笔记本连双WiFi的,因此只挑了个最便宜的。后来发现没法在RPi上面做AP,于是就又重新买了个。国内也有树梅派的论坛讨论过哪些无线网卡的支持,发现Ralink的芯片可以,因此就再花了34块钱买了个腾达的W331M,使用最新的Raspbian内核来进行操作 (非最新的话可能需要自己编译驱动) 。 以下是结合上面的参考链接给出的如何将RPi搭建为一个路由器: 首先是必备材料: RaspberryPi B版 (就是带有线网卡的那个版) ,内存512/256都可以,我的是256的。 一个已经可以正常运行的SD卡,这个如何准备我在我的另外一篇随笔当中提到过,所以这里不再赘述。 一个可以支持AP模式的无线网卡。 有线网卡也得联网。 然后是必备技能: 如果你是无显示器运行的,则需要会使用nano (vi也可以) 如果你是有显示器运行的,那么可以在图形界面下面以root或者sudo来运行文本编辑器 总之,就是你得会编辑文本文件才可以进行下面的操作。 感谢原文给出的驱动提示,这里也抄一下。请确认无线网卡支持AP模式或者Master模式,已知下列网卡的具体情况: Edimax 不支持 Access Point AirLink 101 / AWL5088 不支持 Access Point Ralink RT5370 支持 Access Point 想看你使用的是那种芯片?用lsusb吧!(省略了部分输出) pi@raspberrypi ~ $ lsusb … Bus 001 Device 007: ID 148f:5370 Ralink Technology, Corp. RT5370 Wireless Adapter 呼……一大波前提说完了,下面要干正事了! 先说一下大概步骤: 打开WiFi 指定IP,也就是建立一个WiFi局域网 使用NAT,也就是能让你WiFi网络和有线网络可以通信。 正文开始了: 安装软件 sudo apt-get install hostapd udhcpd 配置DHCP,也就是编辑文件/etc/udhcpd.conf ,基本上按照下列内容来做: <img alt="复制代码" src="http://common.cnblogs.com/images/copycode.gif" /> start 192.168.42.2 # This is the range of IPs that the hostspot will give to client devices. end 192.168.42.20 interface wlan0 # The device uDHCP listens on. remaining yes opt dns 8.8.8.8 4.2.2.2 # The DNS servers client devices will use. opt subnet 255.255.255.0 opt router 192.168.42.1 # The Pi’s IP address on wlan0 which we will set up shortly. opt lease 864000 # 10 day DHCP lease time in seconds ...

2013-12-01 · 2 min · 357 words · -

nl80211 not found

nl80211 not found 加载mac80211模块, modprobe mac80211 http://blog.sina.com.cn/s/blog_64de8a0301018jty.html

2013-12-01 · 1 min · 7 words · -