java -cp

java cp http://quicker.iteye.com/blog/856722 java -cp .;c:dir1lib.jar Test -cp 和 -classpath 一样,是指定类运行所依赖其他类的路径,通常是类库,jar包之类,需要全路径到jar包,windows上分号";“分隔,linux上是冒号”:“分隔。不支持通配符,需要列出所有jar包,用一点”.“代表当前路径。 虽然现在都有 eclipse 之类的 IDE 了,但有时候后会手工编译和运行一些程序,很多人包括多年开发经验的人都不知道怎么在命令行参 数运行类。有点杯具…… 使用范例: java -cp ..libhsqldb.jar org.hsqldb.Server -database mydb 或 java -cp ../lib/hsqldb.jar org.hsqldb.Server -database.0 mydb -dbname.0 mydb -cp <class search path of directories and zip/jar files>

2012-04-17 · 1 min · 42 words · -

fd, 文件描述符

fd, 文件描述符 查看系统级文件描述符/FD 限制 cat /proc/sys/fs/file-max sysctl -a | grep fs.file-max 查看 shell 级 fd 数 限制 # 用户 shell 里创建的进程的 fd 数限制 ulimit -a|grep 'open files' ulimit -Hn ulimit -Sn 查看某一运行中进程的 fd 限制 cat /proc/<PID>/limits |grep 'Max open files' 查看系统已经打开的文件数 cat /proc/sys/fs/file-nr 查看某一进程的打开文件数量 lsof -p <PID> | wc -l ls -l /proc/<PID>/fd |wc -l 文件描述符 (File descriptor) 是计算机科学中的一个术语,是一个用于表述指向文件的引用的抽象化概念。 文件描述符在形式上是一个非负整数。实际上,它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表。当程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符。在程序设计中,一些涉及底层的程序编写往往会围绕着文件描述符展开。但是文件描述符这一概念往往只适用于UNIX、Linux这样的操作系统。 FD 文件描述符 一、概念 Linux 系统中,把一切都看做是文件,当进程打开现有文件或创建新文件时,内核向进程返回一个文件描述符,文件描述符就是内核为了高效管理已被打开的文件所创建的索引,用来指向被打开的文件,所有执行I/O操作的系统调用都会通过文件描述符。 二、文件描述符、文件、进程间的关系 1.描述: 我们可以通过linux的几个基本的I/O操作函数来理解什么是文件操作符。 fd = open(pathname, flags, mode) // 返回了该文件的fd rlen = read(fd, buf, count) // IO操作均需要传入该文件的fd值 wlen = write(fd, buf, count) status = close(fd) 每当进程用open()函数打开一个文件,内核便会返回该文件的文件操作符(一个非负的整形值),此后所有对该文件的操作,都会以返回的fd文件操作符为参数。【注1】 ...

2012-04-15 · 4 min · 779 words · -

Class 文件内容, 方法区, 常量池

Class 文件内容, 方法区, 常量池 当JVM运行Java程序的时候,它会加载对应的 class文件,并提取class文件中的信息存放在JVM开辟出来的方法区内存中。那么这个 class 文件里面到底有些什么内容呢? 一、class文件内容概述 class文件是由8bits的字节流组成,全部字节构成了15个有意义的项目。这些项目之间没有任何无意义的字节,因此class文件非常紧凑。占据多字节空间的项目按照高位在前的顺序存放。下面我们详细讨论这些项目: magic (魔数) 每个class文件的前4个字节称为魔数,值为 0xCAFEBABE。作用在于轻松的辨别class文件与非class文件。 minor_version、major_version(次、主版本号) 各占2个字节。随着Java技术的发展,class文件的格式会发生变化。版本号的作用在于使得虚拟机能够认识当前加载class的文件格式。从而准确的提取class文件信息。 constant_pool_count 、constance_pool (常量池) 从这里开始的字节组成了常量池 。 存储了诸如符号常量、final常量值、基本数据类型的字面值等内容。JVM会将每一个常量构成一个常量表,每个常量表都有自己的入口地址。而实际上在JVM会将这些常量表存储在方法区中一块连续的内存空间中,因此class文件会根据常量表在常量池中的位置对其进行索引。比如常量池中的第一个常量表的索引值就是1,第二个就是2。有的时候常量表A需要常量表B的内容,则在常量表A中会存储常量表B的索引值x。而 constant_pool_count 就记录了有多少个常量表,或者所有多少个索引值。实际上,常量池中没有索引值为0的常量表,但这缺失的索引值也被记录在constant_pool_count中,因此 constant_pool_count等于常量表的数量加1。关于常量池的具体内容,我们会在下面详细讲述,并用一个例子来显示整个class文件的内容。 access_flags(访问标志) 占用2个字节。用来表明该class文件中定义的是类还是接口,访问修饰符是public还是缺省。类或接口是否是抽象的。类是否是final的。 this_class 占用2个字节。 它是一个对常量池的索引。指向的是常量池中存储类名符号引用的CONSTANT_Class_info常量表(见下面常量池具体结构)。比如this_class=0x0001。则表示指向常量池中的第一个常量表。通常这个表是指向当前class文件所定义的类名。 super_class 占用2个字节 与this_class类似,指向存放当前class文件所定义类的超类名字的索引的CONSTANT_Class_info常量表。 inteface_count、interfaces interface_count 是class文件所定义的类直接实现的接口或父类实现的接口的数量。占2个字节。intefaces包含了对每个接口的 CONSTANT_Class_info常量表的索引。 fields_count、fields fields_count 表明了类中字段的数量 。fields是不同长度的field_info表的序列。这些field_info表中并不包含超类或父接口继承而来的字段。field_info表展示了一个字段的信息,包括字段的名字,描述符和修饰符。如果该字段是final的,那么还会展示其常量值。注意,这些信息有些存放在field_info里面,有些则存放在field_info所指向的常量池中。下面我们阐述一下这个field_info表的格式: access_flags(2byte 访问修饰符) name_index(2byte 存储字段名的常量表在常量池中的索引) description_index(2byte 存储字段的所属类型的常量表在常量池中的索引) attribute_count(2byte 属性表的数量) attribute (属性) 其中attribute是由多个attribute_info组成。而JVM规范定义了字段的三种属性: ConstanceValue、Deprecated和Synthetic。 method_count、methods 与字段类似,method_count表明类中方法的数量和每个方法的常量表的索引。methods表明了不同长度的method_info表的序列。该表格式如下: access_flags(2byte 访问修饰符) name_index(2byte 存储方法名的常量表在常量池中的索引) description_index(2byte 存储方法的返回类型和参数类型的常量表在常量池中的索引) attribute_count(2byte 属性表的数量) attribute (属性) 其中方法的属性JVM规定了四种: Code,Deprecated,Exceptions,Synthetic。 常量池的具体结构 在Java程序中,有很多的东西是永恒的,不会在运行过程中变化。比如一个类的名字,一个类字段的名字/所属类型,一个类方法的名字/返回类型/参数名与所属类型,一个常量,还有在程序中出现的大量的字面值。比如下面小段源码红色显示的东西。 public class ClassTest { ...

2012-04-15 · 7 min · 1372 words · -

JRockit

JRockit Oracle JRockit (原来的 Bea JRockit) 系列产品是一个全面的Java运行时解决方案组合,包括了行业最快的标准Java解决方案。 大量的行业基准测试显示,基本JRockit JVM是世界上最快的JVM。JRockit面向延迟敏感型应用的解决方案JRockit Real Time提供以毫秒或微秒计的JVM响应时间,适合财务前端办公、军事指挥与控制和电信网络的需要。使用JRockit产品,客户已经体验到了显著的性能 提高 (一些超过了70% ) 和硬件成本的减少 (达50%) 。 Oracle JRockit 5.0是专门为在基于英特尔处理器的高性能服务器上运行大规模的关键任务型的服务器端应用而设计,包括支持64位的英特尔至强和英特尔安腾处理器。 最新版本的BEA JRockit 5.0支持多种平台,包括Solaris OS、Red Flag Linux服务器以及基于SPARC的系统,它通过专为改进应用可靠性而设计的BEA JRockit Mission Control套件提供了前所未有的控制能力。JRockit的确定性功能对即将推出的BEA WebLogic实时版本而言至关重要,后者能够提供可预测的实时应用响应。当应用响应时间以毫秒来衡量时,BEA WebLogic实时版本可以满足服务级别协议(SLA)的需求,如垃圾收集停顿时间,并提供可预测的性能。 BEA系统有限公司首席技术官Rob Levy说:“我们专注于持续创新,以帮助我们的客户迅速、高效率地部署企业应用。作为全球速度最快的面向大规模、关键任务型服务器端应用的Java虚拟机(JVM),JRockit令人印象深刻,它已建立起行业标准。” JRockit 5.0拥有一系列创新功能,帮助开发人员在工作效率、可管理性、性能和稳定性方面达到新水平。除了继续支持运行在Intel®处理器平台上的 Windows和Linux外,JRockit还首次可用于基于Solaris OS和SPARC的系统上。此外,BEA还与中科红旗软件公司达成协议,将BEA JRockit与Red Flag Linux服务器捆绑,为中国客户如中国邮政总局提供高性能的J2EE解决方案。今天,通过选择业界最快的Java虚拟机BEA JRockit,企业可在多种硬件平台和混合环境中使用单一的Java虚拟机,因为BEA JRockit为各种生产环境提供了一致的管理体验。 BEA JRockit Mission Control套件提供了可单独使用的性能工具,它为BEA JRockit的最新版本提供了补充。这个套件由几个独特的性能管理工具组成,可以监控、管理、分析及排除Java应用中的内存泄漏问题,而不会带来通常与这类工具有关的性能消耗问题,也不需要重启服务器来启动故障排除进程。BEA JRockit Mission Control套件包括三个工具,为开发人员和系统管理员提供了前所未有的实时可见性和控制能力。这些功能可以帮助开发人员通过改变使用模式和业务环境, 来调整应用性能、确保系统质量。这些新工具包括: ·BEA JRockit管理控制台。该工具捕获并展现有关垃圾收集停顿、内存利用和CPU使用的实时数据,以及来自Java虚拟机内部MBean服务器里面的JMX MBean信息。这项功能为开发人员和系统管理员控制网络内多个Java虚拟机实例提供了实时可见性和控制能力。 ·BEA JRockit运行时分析器(JRA)。JRA就像是一个随需应变的"飞行记录器",可以详细记录有Java虚拟机及应用运行的详细数据,帮助开发人员查看和分析应用在生产环境中的状况。 ·BEA JRockit内存泄漏检测器。这是一种实时分析工具,用于发现和查找导致内存泄漏的原因。 BEA JRockit为WebLogic Real Time(WebLogic实时版本)产品提供坚实基础 BEA WebLogic实时版本旨在提供可预测的应用响应速率,以确保对时间敏感的交易能顺利进行,不会发生出乎意料的延迟。借助轻便的Spring框架,开发 人员能够得到混合开发环境的所有好处,同时维持原先无法企及的可预测执行时间。有了BEA JRockit及其独特的确定性垃圾收集器(仅作为即将推出的BEA WebLogic实时版本的一部分发布),就能够把Java技术应用于原本只有采用C语言编程才能实现的高性能应用领域。 BEA系统有限公司Java运行时产品部总经理Guy Churchward说:“在金融服务行业,成本中心并不仅仅是业务部门的一部分,它本身就是一种业务。WebLogic实时版本的目标就是要提高性能, 使业务部门的决策者能够确信:WebLogic实时版本可以满足他们在关键任务型应用响应方面的需求。”

2012-04-15 · 1 min · 70 words · -

JVM调优

JVM调优 http://pengjiaheng.iteye.com/blog/518623 数据类型 Java虚拟机中,数据类型可以分为两类: 基本类型和引用类型。基本类型的变量保存原始值,即: 他代表的值就是数值本身;而引用类型的变量保存引用值。“引用值"代表了某个对象的引用,而不是对象本身,对象本身存放在这个引用值所表示的地址的位置。 基本类型包括: byte,short,int,long,char,float,double,Boolean,returnAddress 引用类型包括: 类类型,接口类型和数组。 堆与栈 堆和栈是程序运行的关键,很有必要把他们的关系说清楚。 栈是运行时的单位, 而堆是存储的单位 栈解决程序的运行问题,即程序如何执行, 或者说如何处理数据;堆解决的是数据存储的问题,即数据怎么放、放在哪儿。 在 Java 中一个线程就会相应有一个线程栈与之对应,这点很容易理解,因为不同的线程执行逻辑有所不同,因此需要一个独立的线程栈。而堆则是所有线程共享的。栈因为是运行单位,因此里面存储的信息都是跟当前线程 (或程序) 相关的信息。包括局部变量、程序运行状态、方法返回值等等;而堆只负责存储对象信息。 为什么要把堆和栈区分出来呢?栈中不是也可以存储数据吗? 第一,从软件设计的角度看,栈代表了处理逻辑,而堆代表了数据。这样分开,使得处理逻辑更为清晰。分而治之的思想。这种隔离、模块化的思想在软件设计的方方面面都有体现。 第二,堆与栈的分离,使得堆中的内容可以被多个栈共享 (也可以理解为多个线程访问同一个对象) 。这种共享的收益是很多的。一方面这种共享提供了一种有效的数据交互方式(如: 共享内存),另一方面,堆中的共享常量和缓存可以被所有栈访问,节省了空间。 第三,栈因为运行时的需要,比如保存系统运行的上下文,需要进行地址段的划分。由于栈只能向上增长,因此就会限制住栈存储内容的能力。而堆不同,堆中的对象是可以根据需要动态增长的,因此栈和堆的拆分,使得动态增长成为可能,相应栈中只需记录堆中的一个地址即可。 第四,面向对象就是堆和栈的完美结合。其实,面向对象方式的程序与以前结构化的程序在执行上没有任何区别。但是,面向对象的引入,使得对待问题的思考方式发生了改变,而更接近于自然方式的思考。当我们把对象拆开,你会发现,对象的属性其实就是数据,存放在堆中;而对象的行为 (方法) ,就是运行逻辑,放在栈中。我们在编写对象的时候,其实即编写了数据结构,也编写的处理数据的逻辑。不得不承认,面向对象的设计,确实很美。 在Java中,Main 函数就是栈的起始点,也是程序的起始点 程序要运行总是有一个起点的。同C语言一样,java中的Main就是那个起点。无论什么java程序,找到main就找到了程序执行的入口: ) 堆中存什么?栈中存什么? 堆中存的是对象。栈中存的是基本数据类型和堆中对象的引用。一个对象的大小是不可估计的,或者说是可以动态变化的,但是在栈中,一个对象只对应了一个4btye的引用 (堆栈分离的好处: ) ) 。 为什么不把基本类型放堆中呢?因为其占用的空间一般是1~8个字节——需要空间比较少,而且因为是基本类型,所以不会出现动态增长的情况——长度固定,因此栈中存储就够了,如果把他存在堆中是没有什么意义的 (还会浪费空间,后面说明) 。可以这么说,基本类型和对象的引用都是存放在栈中,而且都是几个字节的一个数,因此在程序运行时,他们的处理方式是统一的。但是基本类型、对象引用和对象本身就有所区别了,因为一个是栈中的数据一个是堆中的数据。最常见的一个问题就是,Java中参数传递时的问题。 Java中的参数传递时传值呢?还是传引用? 要说明这个问题,先要明确两点: 不要试图与C进行类比,Java中没有指针的概念 程序运行永远都是在栈中进行的,因而参数传递时,只存在传递基本类型和对象引用的问题。不会直接传对象本身。 明确以上两点后。Java在方法调用传递参数时,因为没有指针,所以它都是进行传值调用 (这点可以参考C的传值调用) 。因此,很多书里面都说Java是进行传值调用,这点没有问题,而且也简化的C中复杂性。 但是传引用的错觉是如何造成的呢?在运行栈中,基本类型和引用的处理是一样的,都是传值,所以,如果是传引用的方法调用,也同时可以理解为"传引用值"的传值调用,即引用的处理跟基本类型是完全一样的。但是当进入被调用方法时,被传递的这个引用的值,被程序解释 (或者查找) 到堆中的对象,这个时候才对应到真正的对象。如果此时进行修改,修改的是引用对应的对象,而不是引用本身,即: 修改的是堆中的数据。所以这个修改是可以保持的了。 对象,从某种意义上说,是由基本类型组成的。可以把一个对象看作为一棵树,对象的属性如果还是对象,则还是一颗树 (即非叶子节点) ,基本类型则为树的叶子节点。程序参数传递时,被传递的值本身都是不能进行修改的,但是,如果这个值是一个非叶子节点 (即一个对象引用) ,则可以修改这个节点下面的所有内容。 堆和栈中,栈是程序运行最根本的东西。程序运行可以没有堆,但是不能没有栈。而堆是为栈进行数据存储服务,说白了堆就是一块共享的内存。不过,正是因为堆和栈的分离的思想,才使得Java的垃圾回收成为可能。 Java中,栈的大小通过-Xss来设置,当栈中存储数据比较多时,需要适当调大这个值,否则会出现java.lang.StackOverflowError异常。常见的出现这个异常的是无法返回的递归,因为此时栈中保存的信息都是方法返回的记录点。 Java对象的大小 基本数据的类型的大小是固定的,这里就不多说了。对于非基本类型的Java对象,其大小就值得商榷。 在Java中,一个空Object对象的大小是8byte,这个大小只是保存堆中一个没有任何属性的对象的大小。看下面语句: Object ob = new Object(); 这样在程序中完成了一个Java对象的生命,但是它所占的空间为: 4byte+8byte。4byte是上面部分所说的Java栈中保存引用的所需要的空间。而那8byte则是Java堆中对象的信息。因为所有的Java非基本类型的对象都需要默认继承Object对象,因此不论什么样的Java对象,其大小都必须是大于8byte。 ...

2012-04-14 · 6 min · 1078 words · -

Maven内置属性、POM属性

Maven内置属性、POM属性 Maven内置属性、POM属性, maven properties 内置属性(Maven预定义,用户可以直接使用) ${basedir}表示项目根目录,即包含pom.xml文件的目录; ${version}表示项目版本; ${project.basedir}同${basedir}; ${project.baseUri}表示项目文件地址; ${maven.build.timestamp}表示项目构件开始时间; ${maven.build.timestamp.format}表示属性${maven.build.timestamp}的展示格式,默认值为yyyyMMdd-HHmm,可自定义其格式,其类型可参考java.text.SimpleDateFormat。 用法: <maven.build.timestamp.format>yyyy-MM-dd HH:mm:ss</maven.build.timestamp.format> POM属性(使用pom属性可以引用到pom.xml文件对应元素的值) ${project.build.directory} 项目构建输出目录,默认为target/ ${project.build.outputDirectory} 项目主代码编译输出目录,默认为target/classes/ ${project.build.testOutputDirectory}:项目测试代码编译输出目录,默认为target/testclasses/ ${project.build.sourceEncoding} 表示主源码的编码格式; ${project.build.sourceDirectory} 项目的主源码目录,默认为src/main/java/ ${project.build.testSourceDirectory} 项目的测试源码目录,默认为/src/test/java/ ${project.build.finalName} 表示输出文件名称; ${project.version} 表示项目版本,与${version}相同; ${project.groupId}:项目的groupId ${project.artifactId} 项目的artifactId 用法: <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> ${project.build.outputDirectory}/META-INF/xxx/xxx

2012-04-09 · 1 min · 36 words · -

JAR WAR EAR

JAR WAR EAR jar: Java Archive file 扩展名为.Jar 包含Java类的普通库(class)、资源 (resources) 、辅助文件 (auxiliary files) , properties 等部署文件 application-client.xml JAR: Software developers generally use .jar files to distribute Java applications or libraries, in the form. of classes and associated metadata and resources (text, images, etc.) JAR files build on the ZIP file format. 查看jar归档目录 jar -vtf xxx.jar war: Web Archive file/web application archive 扩展名为.War, 包含全部Web应用程序, Servlet、JSP、JSP标记库、JAR库文件、HTML/XML文档和其他公用资源文件,图片、音频. 一个Web应用程序被定义为单独的一组文件、类和资源,用户可以对jar文件进行封装,并把它作为小型服务程序 (servlet) 来访问。 部署文件: web.xml ...

2012-04-08 · 7 min · 1383 words · -

MANIFEST.MF

MANIFEST.MF 打开Java的JAR文件我们经常可以看到文件中包含着一个META-INF目录,这个目录下会有一些文件,其中必有一个MANIFEST.MF,这个文件描述了该Jar文件的很多信息,下面将详细介绍MANIFEST.MF文件的内容,先来看struts.jar中包含的MANIFEST.MF文件内容: Manifest-Version: 1.0 Created-By: Apache Ant 1.5.1 Extension-Name: Struts Framework Specification-Title: Struts Framework Specification-Vendor: Apache Software Foundation Specification-Version: 1.1 Implementation-Title: Struts Framework Implementation-Vendor: Apache Software Foundation Implementation-Vendor-Id: org.apache Implementation-Version: 1.1 Class-Path: commons-beanutils.jar commons-collections.jar commons-digester.jar commons-logging.jar commons-validator.jar jakarta-oro.jar struts-legacy.jar 如果我们把MANIFEST中的配置信息进行分类,可以归纳出下面几个大类: 一. 一般属性 Manifest-Version 用来定义manifest文件的版本,例如: Manifest-Version: 1.0 Created-By 声明该文件的生成者,一般该属性是由jar命令行工具生成的,例如: Created-By: Apache Ant 1.5.1 Signature-Version 定义jar文件的签名版本 Class-Path 应用程序或者类装载器使用该值来构建内部的类搜索路径 二. 应用程序相关属性 Main-Class 定义jar文件的入口类,该类必须是一个可执行的类,一旦定义了该属性即可通过 java -jar x.jar来运行该jar文件。 三. 小程序(Applet)相关属性 Extendsion-List 该属性指定了小程序需要的扩展信息列表,列表中的每个名字对应以下的属性 -Extension-Name ...

2012-04-08 · 1 min · 139 words · -

ARP攻击

ARP攻击 ARP攻击是针对以太网地址解析协议 (ARP) 的一种攻击技术。此种攻击可让攻击者取得局域网上的数据封包甚至可篡改封包,且可让网络上特定计算机或所有计算机无法正常连接。最早探讨ARP攻击的文章是由Yuri Volobue所写的《ARP与ICMP转向游戏》。 ARP (Address Resolution Protocol,地址解析协议) 是一个位于TCP/IP协议栈中的底层协议,对应于数据链路层,负责将某个IP地址解析成对应的MAC地址。 基本功能 ARP协议的基本功能就是通过目标设备的IP地址,查询目标设备的MAC地址,以保证通信的进行。 ARP (AddressResolutionProtocol) 是地址解析协议,是一种将IP地址转化成物理地址的协议。从IP地址到物理地址的映射有两种方式: 表格方式和非表格方式。ARP具体说来就是将网络层 (IP层,也就是相当于OSI的第三层) 地址解析为数据连接层 (MAC层,也就是相当于OSI的第二层) 的MAC地址 ARP (Address Resolution Protocol) 地址解析协议用于将计算机的网络IP地址转化为物理MAC地址。ARP协议的基本功能就是通过目标设备的IP地址,查询目标设备的MAC地址,以保证通信的顺利进行。在每台安装有TCP/IP协议的电脑里都有一个ARP缓存表,表里的IP地址与MAC地址是一一对应的,如果系统ARP缓存表被修改不停的通知路由器一系列错误的内网IP或者干脆伪造一个假的网关进行欺骗的话,网络就肯定会出现大面积的掉线问题。ARP攻击在现今的网络中频频出现,有效的防范ARP形式的网络攻击已成为确保网络畅通必要条件。 ARP攻击的局限性 ARP攻击仅能在以太网 (局域网如: 机房、内网、公司网络等) 进行。 无法对外网 (互联网、非本区域内的局域网) 进行攻击。ARP攻击就是通过伪造IP地址和MAC地址实现ARP欺骗,能够在网络中产生大量的ARP通信量使网络阻塞,攻击者只要持续不断的发出伪造的ARP响应包就能更改目标主机ARP缓存中的IP-MAC条目,造成网络中断或中间人攻击。 ARP攻击主要是存在于局域网网络中,局域网中若有一台计算机感染ARP木马,则感染该ARP木马的系统将会试图通过"ARP欺骗"手段截获所在网络内其它计算机的通信信息,并因此造成网内其它计算机的通信故障。 某机器A要向主机B发送报文,会查询本地的ARP缓存表,找到B的IP地址对应的MAC地址后,就会进行数据传输。如果未找到,则A广播一个ARP请求报文 (携带主机A的IP地址Ia——物理地址Pa) ,请求IP地址为Ib的主机B回答物理地址Pb。网上所有主机包括B都收到ARP请求,但只有主机B识别自己的IP地址,于是向A主机发回一个ARP响应报文。其中就包含有B的MAC地址,A接收到B的应答后,就会更新本地的ARP缓存。接着使用这个MAC地址发送数据 (由网卡附加MAC地址) 。因此,本地高速缓存的这个ARP表是本地网络流通的基础,而且这个缓存是动态的。1) 什么是ARP欺骗? 在局域网中,黑客经过收到的ARP Request广播包,能够偷听到其它节点的 (IP, MAC) 地址, 黑客就伪装为A,告诉B (受害者) 一个假地址,使得B在发送给A 的数据包都被黑客截取,而A, B 浑然不知。, 为什么黑客能够进行ARP欺骗? ARP 是个早期的网络协议,RFC826在 1980就出版了。早期的互联网采取的是信任模式,在科研、大学内部使用,追求功能、速度,没考虑网络安全。尤其以太网的泛洪特点,能够很方便的用来查询。但这也为日后的黑客开了方便之门。黑客只要在局域网内阅读送上门来的ARP Request就能偷听到网内所有的 (IP, MAC)地址。而节点收到ARP Reply时,也不会质疑。黑客很容易冒充他人, 能够防止欺骗吗? 不能。但这种伤害的伤害已经很小。因为局域网的工作环境有了改变, 服务器通常不会和终端主机在同一个局域网。 初期: 这种有目的的发布错误ARP广播包的行为,被称为ARP欺骗。ARP欺骗,最初为黑客所用,成为黑客窃取网络数据的主要手段。黑客通过发布错误的ARP广播包,阻断正常通信,并将自己所用的电脑伪装成别人的电脑,这样原本发往其他电脑的数据,就发到了黑客的电脑上,达到窃取数据的目的。 中期: ARP恶意攻击 后来,有人利用这一原理,制作了一些所谓的"管理软件",例如网络剪刀手、执法官、终结者等,这样就导致了ARP恶意攻击的泛滥。往往使用这种软件的人,以恶意破坏为目的,多是为了让别人断线,逞一时之快。 特别是在网吧中,或者因为商业竞争的目的、或者因为个人无聊泄愤,造成恶意ARP攻击泛滥。 随着网吧经营者摸索出禁用这些特定软件的方法,这股风潮也就渐渐平息下去了。 现在: 综合的ARP攻击 ...

2012-04-08 · 2 min · 216 words · -

linux shell Manipulating Strings

linux shell Manipulating Strings http://www.faqs.org/docs/abs/HTML/string-manipulation.html 连接字符串 a="abc" b="def" echo $a$b expr index $string $substring Numerical position in $string of first character in $substring that matches. 1 stringZ=abcABC123ABCabc 2 echo expr index "$stringZ" C12 # 6 3 # C position. 4 5 echo expr index "$stringZ" 1c # 3 6 # ‘c’ (in #3 position) matches before ‘1’. This is the near equivalent of _strchr()_ in C. **ength of Matching Substring at Beginning of String** expr match "$string" '$substring' : $substring is a [regular expression][1]. expr "$string" : '$substring' : $substring is a regular expression. 1 stringZ=abcABC123ABCabc 2 # |——| 3 4 echo expr match "$stringZ" 'abc[A-Z]*.2' # 8 5 echo expr "$stringZ" : 'abc[A-Z]*.2' # 8 ...

2012-04-08 · 1 min · 129 words · -

mplayer output driver

mplayer output driver Output drivers (directx, xv, x11, gl, alsa, oss…) what are they? Which one is the best? MPlayer has several output drivers, for video and sound. SMPlayer allows you to select the one you want among all of them (Preferences -> General -> Video/Audio). For video it’s recommended that you use xv (linux) or directx (windows). They use hardware acceleration and give the best performance. The inconvenience about directx for Windows Vista users is that it disables Aero. ...

2012-04-07 · 2 min · 223 words · -

mkv

mkv MKV格式介绍 关键词: MKV 首先澄清一个误区,mkv不是一种压缩格式,DivX、XviD才是视频压缩格式,mp3、ogg才是音频压缩格式。而mkv是个"组合"和"封装"的格式,换句话说就是一种容器格式。 举个例子的话就比较容易理解了,把只有视频的XviD和只有音频的mp3组合起来,然后以一种多媒体介质的形式出现,最常见的就是avi,其次就是ogm,还有mp4等不太常见的。 avi的出现已经超过了10年,渐渐体现出老态了,除了近年通过VD可以拥有2个音轨,没有其他的改进。 ogm的出现,标志着多音轨格式的出现,可以合成8个以上的音轨,音频上自然也多了ogg这个格式,重要的是可以"内挂"字幕,老外称为"软字幕",可以任意开关,可以"内挂"8个以上的字幕,美中不足的是仅仅支持srt格式,并且不支持Unicode,对亚洲字符支持严重不足。 还有一个就是Chapter功能,可以自定义段落,播放时就可以选择了。是不是越来越像DVD啦?但是当时的ogm源码是不公开的,就那么几个人在开发,自然进度慢了,前一阵几乎陷入了"死亡"。最近宣布公开源码,加入Open Source行列,重新开始开发。 mkv就是在ogm停滞的那段时间出现的,由俄罗斯的程序员开发的,从一开始就是Open Source,因此得到了很多其他程序员的帮助,开发速度相当快。 ogm有的mkv都有,另外还有很多独特的功能。其中最令人振奋的就是Gabest(开发vobsub的公司)开发的Plugin,不仅开发了专门的播放器Media Player Classic(俗称MPC), 这个东西的强大相信用过的人都有体会。还开发了很多的MKV用的Mux(合成器),尤其是Real格式的Mux。 Real的rmvb是封闭格式,官方的Helix根本就不支持多声道所以尽管算法很优秀,但在声效大片的再现上就无能为力了,只能乖乖让位给可以合成AC3和DTS的avi以及ogm了。 但Gabest开发的Realmedia Splitter和mkv Mux可以让rmvb格式的视频和AC3、DTS合成mkv,从根本上克服了rmvb音频上的弱点。不仅如此,还开发了VSFilter.dll和SubtitleSource.ax这2个Plugin,宣布支持ssa和ass的格式软字幕。 总结就是下面几条: 1.支持多种格式的视频和音频,尤其是Real 2.支持多音轨,多达16条以上 3.支持ssa,ass软字幕,多达16条以上 4.支持段落选取(由制作人决定) 2个插件的下载: ffdshow 下载最新版的 安装时记得把DIVX3 DIVX4 还有post-processing(后处理)的钩都去掉 matroska splitter 下载页面:http://x264.nl/ 插件装好后,通常的播放器都可以播放MKV了 参考资料: http://newx.blogchina.com/4404315.html

2012-04-07 · 1 min · 37 words · -

linux下挂载kvm磁盘文件

linux下挂载kvm磁盘文件 宿主机Debian, 客户机winxp, 磁盘文件格式raw sudo mount -o loop,offset=32256 -t ntfs winxp.img /mnt http://stackoverflow.com/questions/8171179/kvm-virtual-machine-running-windows-xp-how-to-get-files-from-guest-to-host winxp.img and loop1 is not a single partition (which can be mounted), it is image of full hard disk with own partition table. You should read partition table from loop1 with fdisk; compute offset of first partition and do: sudo mount -o offset=N -t ntfs /dev/loop1 /home/robert/kvm/images/tmp where N is offset in bytes. Telepathic mode on N is 32256 Telepathic mode off ...

2012-04-07 · 1 min · 123 words · -

sed command

sed command commands # 把 foo 替换成 bar # linux echo 'abcfooabc' > file0 sed 's/foo/bar/' file0 echo 'abcfooabc'| sed 's/foo/bar/' # macos sed -i '' 's/foo/bar/' file0 发音:[sed] sed 全名叫 stream editor,流编辑器,sed 可以按照脚本的指令来处理文本文件。 简化对文件的反复操作、编写转换程序等 这里的脚本指的是 sed 脚本,如: 4anewline, ’s/hello/world/’ … 语法 sed SCRIPT INPUTFILE sed [-hnV][-e<script>][-f<script文件>][文本文件] 选项与参数 -i # 直接修改读取的文件内容, 而不是输出到终端. 不加 -i 参数的话默认输出到 STDOUT -f # 直接将 sed 的动作写在一个文件内, -f filename 则可以运行 filename 内的 sed 动作; -r # sed 的动作支持的是延伸型正规表示法的语法。(默认是基础正规表示法语法) -n # 使用安静(silent)模式。在一般 sed 的用法中, 所有来自 STDIN 的数据一般都会被列出到终端上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。 -e script, --expression=script: sed -e 是可以在一行里执行多条命令, -e 参数用来显示的指定脚本位置, -e 和 -f 可以同时出现,也可以多次出现, 使用了 -e 之后,其它非选项字符串都被认为是输入。 sed -e 's/foo/bar/' -e 's/foobar/barfoo/' file0 删除包含指定字符的行 # 删除包含指定字符的行 sed -i '/localhost/d' /etc/hosts 截取文本段 https://blog.wiloon.com/?p=13845 ...

2012-04-07 · 3 min · 521 words · -

Golang 命名规范

Golang 命名规范 变量命名 和结构体类似,变量名称一般遵循驼峰法,首字母根据访问控制原则大写或者小写,但遇到特有名词时,需要遵循以下规则: 如果变量为私有,且特有名词为首个单词,则使用小写,如 appService; 若变量类型为 bool 类型,则名称应以 Has, Is, Can 或 Allow 开头。 var isExist bool var hasConflict bool var canManage bool https://zhuanlan.zhihu.com/p/216001587 golang 文件名 命名规则 project name: - package: lowercase file name: _ https://stackoverflow.com/questions/25161774/what-are-conventions-for-filenames-in-go https://golang.org/doc/effective_go.html#package-names

2012-04-07 · 1 min · 38 words · -

广播地址

广播地址 概述 广播地址(Broadcast Address)是专门用于同时向网络中 (通常指同一子网) 所有工作站进行发送的一个地址。在使用TCP/IP 协议的网络中,主机标识段host ID (简称主机 ID) 为全 1 的 IP 地址为广播地址,广播的分组传送给同一个子网的所有计算机。例如,对于10.1.1.0 (255.255.255.0 ) 网段,其广播地址为10.1.1.255 (255 即为 2 进制的 11111111 ) ,当发出一个目的地址为10.1.1.255 的数据包时,它将被分发给该网段上的所有计算机。广播地址应用于网络内的所有主机。 Broadcast Address(广播地址)是专门用于同时向网络中所有工作站进行发送的一个地址。在使用TCP/IP 协议的网络中,主机标识段host ID 为全1 的IP 地址为广播地址,广播的分组传送给host ID段所涉及的所有计算机。例如,对于10.1.1.0 (255.255.255.0 ) 网段,其广播地址为10.1.1.255 (255 即为2 进制的11111111 ) ,当发出一个目的地址为10.1.1.255 的分组 (封包) 时,它将被分发给该网段上的所有计算机。 广播地址主要有两类 广播地址应用于网络内的所有主机 1)受限广播 它不被路由但会被送到相同物理网络段上的所有主机 IP地址的网络字段和主机字段全为1就是地址255.255.255.255 2)直接广播 网络广播会被路由,并会发送到专门网络上的每台主机 IP地址的网络字段定义这个网络,主机字段通常全为1,如 192.168.10.255 四种I P广播地址 受限的广播地址 受限的广播地址是255.255.255.255。该地址用于主机配置过程中IP数据报的目的地址,此时,主机可能还不知道它所在网络的网络掩码,甚至连它的IP地址也不知道。在任何情况下,路由器都不转发目的地址为受限的广播地址的数据报,这样的数据报仅出现在本地网络中。 指向网络的广播 指向网络的广播地址是主机号为全1的地址。A类网络广播地址为netid.255.255.255,其中netid为A类网络的网络号。一个路由器必须转发指向网络的广播,但它也必须有一个不进行转发的选择。 指向子网的广播 指向子网的广播地址为主机号为全1且有特定子网号的地址。作为子网直接广播地址的IP地址需要了解子网的掩码。例如,如果路由器收到发往128.1.2.255的数据报,当B类网络128.1的子网掩码为255.255.255.0时,该地址就是指向子网的广播地址;但如果该子网的掩码为255.255.254.0,该地址就不是指向子网的广播地址。 指向所有子网的广播 指向所有子网的广播也需要了解目的网络的子网掩码,以便与指向网络的广播地址区分开。指向所有子网的广播地址的子网号及主机号为全1。例如,如果目的子网掩码为255.255.255.0,那么IP地址128.1.255.255是一个指向所有子网的广播地址。然而,如果网络没有划分子网,这就是一个指向网络的广播。 广播和广播地址 TCP/IP协议栈中, 传输层只有UDP可以广播. 只能对同一子网内部广播, 广播数据包不经过路由器. UDP的广播地址为255.255.255.255 ...

2012-04-07 · 1 min · 180 words · -

Linux命令pidof

Linux命令pidof Linux命令pidof - 找出正在运行程序的进程PID 本文链接: http://codingstandards.iteye.com/blog/841123 (转载请注明出处) 用途说明 pidof用于找出正在运行的程序的进程PID (find the process ID of a running program.) ,程序可以是一个二进制执行程序,也可以是一个shell脚本。如果是找出java程序的进程PID,pidof就无能为力了,可以使用ps -ef|grep java或jps -l来查看java进程的信息。通常找出进程PID的目的是确认程序是否在运行、或者为了把它杀掉、或者发送一个信号给它。 常用参数 格式: pidof program 找出program程序的进程PID,如果有多个就会全部列出,program不能是shell脚本名称。 格式: pidof -s program 找出program程序的进程PID,只列出一个。 (Single shot - this instructs the program to only return one pid.) 格式: pidof -x script 找出shell脚本script的进程PID。 参数: -o omitpid 参数: -o omitpid1 -o omitpid2 在列出的进程PID中忽略omitpid。可以有多个。 参数: -s 只列出一个。 使用示例 示例一 [root@smsgw root]# pidof pidof 24386 [root@smsgw root]# pidof console ...

2012-04-06 · 1 min · 165 words · -

Pageant

Pageant Pageant (an SSH authentication agent for PuTTY, PSCP, PSFTP, and Plink)

2012-04-05 · 1 min · 12 words · -

no such file to load — mkmf

no such file to load — mkmf Building native extensions. This could take a while... ERROR: Error installing rails: ERROR: Failed to build gem native extension. /usr/bin/ruby1.8 extconf.rb extconf.rb:1:in \`require': no such file to load - mkmf (LoadError) from extconf.rb:1 For some reason, mkmf.rb is part of the ruby1.8-dev package, and initially I hadn’t installed that. #install ruby1.8-dev sudo apt-get install ruby1.8-dev and everything trotted along happily after that.

2012-04-04 · 1 min · 69 words · -

foo 是什么意思

Foo 是什么意思 http://www.cnblogs.com/felicity/archive/2010/11/30/1892100.html 不管是java,C++,还是PHP,每次都能看到 foo = bar 的例子,这两个单词很恶心,foo查不到字典,bar的解释又让人跟编程联系不上,更弄不清楚这个神秘的foo是个什么关系。 语意不清,学起来心里老是有疙疙瘩瘩的感觉,于是查吧,终于揭开了这两个东西的不正常关系,讲个各个处在闹心中的初学者们听吧。 参考了众多的网络资料,最后,明确的告诉大家,foo和bar就是外国人的张三、李四、王二麻子,只是一种随便的命名方式。跟c语言里面的i,j,k同出一辙。 就是说foo = bar 跟 变量张三 = 李四的侄子 一个意图,所以童鞋们就不要再找foo到底是个啥了。 问foo是啥就跟问张三是谁一样,我想外国人一定也很想知道,张三到底是谁,这个人怎么这么有名,总能看到这个名字,但是历史上记载却又找不到他。 为了这个可恶的foo,居然还动用RFC给foo下了一个明确的词源追踪,无聊的童鞋可以看RFC3092解解闷。 https://www.ietf.org/rfc/rfc3092.txt 下面是网上搜刮来的各种解释: Foo: 本意指程序员用来代表数据、功能或命令的变量。O’Reilly媒体认为FOO是Friends of O’Reilly的缩写,并把他们在2003年举办的年会命名为"2003 FOO"。现在则更多地指声势浩大的某行业大会。 foo = fuck oriented object foo是"你要让它是什么就是什么"。FOO可以具有用户赋于的任何意义。 foo—–潦草的意思!表示很随便的定义! foo没有意义 foo的意思是:Factory Of Objects foo: 一塌糊涂或者bar: 一团糟 foo 不同的字典对其解释相去甚远,一说来自中国"福"字的发音,又有解释为二战时期的一种武器。然而若把众多的解释放在编程领域,关于 foobar的说法是我认为最为贴切的解释。foobar又为foo-bar,其中bar是beyond all recognition的缩写,通俗点就是无法识别,一塌糊涂的意思。而foo是fu的变体,fu是英语习语fuck-up的缩写,同样是一团糟的意思。于是,若你有些编程经验,我想你应该已经明白了为何如今许多编程实例所涉及的事物均被冠名为foo. 介绍 至今约有212 个RFC, 或者约7%的RFC, 从[RFC269]开始,包括了术语’foo’,‘bar’ 或’foobar’作为伪变量而没有任何适当的解释或定义。这可能被认为是微不足道的,但一些新来者,特别是那些非英语国家的人,在理解这些术语时会遇到困难。本文纠正这一问题。 定义和语源 bar /bar/ n. [JARGON] 第二个伪变量,在foo 之后而在baz 之前。 “Suppose we have two functions: FOO and BAR. FOO calls BAR….” ...

2012-04-04 · 5 min · 911 words · -