开放地址法, Open Addressing

开放地址法, Open Addressing 本文我们来探讨一个数据结构的基础话题:hash 结构中的开放地址法(Open Addressing) HashMap 无 Java 人不知无 Java 人不晓,它使用开链法处理 hash 碰撞,将碰撞的元素用链表串起来挂在第一维数组上。但是并不是所有语言的字典都使用开链法搞定的,比如 Python,它使用的是另一种形式 —— 开放地址法。相比 HashMap 是二维的结构,它只是一维的,只有一个数组。 开放地址法与开链法的不同之处在于如何处理 hash 冲突。当新来一个元素哈希到数组中的位置已经被其它元素占据了该怎么办? 开放地址法会根据当前的位置计算出下一个位置,将这个冲突的元素挪进来。如果这下一个位置也被占用了,那么就再计算下一个位置,直到找到一个空的位置。可以想像,将会有一条虚拟的链条将这些相关的位置串起来。这个虚拟的链条就好比开链法里面的第二维链表。只不过链表有显示的指针字段,而虚拟链条没有,它的这个链条完全是通过数学函数计算出来的。 root = hash(key) % m // 第一个位置,m 为数组的长度 index_i = (root + p(key, i)) % m // 链条中的第 i 个位置 index_1 = (root + p(key, 1)) % m index_2 = (root + p(key, 2)) % m … 复制代码这个数学函数就是上面代码中的 p —— probe sequence (探测序列)。寻找空位置的过程就是一步一步的探测的过程。不同的 key 会生成不一样的探测序列。 在查找的时候,如果第一个位置上保存的 key 不是目标 key,那就沿着探测路径继续寻找,直到找到或者遇到一个空位置为止。 到这里你可能会担心又没有可能探测过程会出现死循环,探来探去又回到原点了,或者是回到路径的中间。这是很有可能的,所以这里的探测函数不能随意选择,它必须保证探测序列不会出现循环,经过 m-1 次探测生成的探测序列必须正好是 1..m-1的全排列。 这样的探测函数有很多,其中最常见的一种是线性探测函数。该探测序列和输入 key 无关。最终的探测路径只和初始位置相关。 // m = 2^n,c 必须是一个奇数 p(key, i) = c i index_i = root + c i 复制代码这里我不去仔细证明这个函数为什么满足要求,我们可以写个简单的代码来验证一下。 ...

2014-05-06 · 1 min · 188 words · -

maven pom

maven pom 基本内容: POM包括了所有的项目信息。 maven 相关: pom定义了最小的maven2元素,允许groupId,artifactId,version。所有需要的元素 groupId:项目或者组织的唯一标志,并且配置时生成的路径也是由此生成,如org.codehaus.mojo生成的相对路径为: /org/codehaus/mojo artifactId: 项目的通用名称 version:项目的版本 packaging: 打包的机制,如pom, jar, maven-plugin, ejb, war, ear, rar, par classifier: 分类 <project xmlns=“http://maven.apache.org/POM/4.0.0" xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=“http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 4.0.0 com.wiloon wechat jar 1.0-SNAPSHOT wechat ...

2014-04-30 · 1 min · 52 words · -

JPA EntityManager

JPA EntityManager 持久化上下文 (Persistence Context ) 一个持久化单元 (Persistence Unit ) 就是关于一组Entity 类的命名配置。持久化单元是一个静态的概念。 一个持久化上下文 (Persistence Context ) 就是一个受管的Entity 实例的集合。每一个持久化上下文都关联一个持久化单元,持久化上下文不可能脱离持久化单元独立存在。持久化上下文中的Entity 实例就是相关联的持久化单元中的若干Entity 的实例。持久化上下文是一个动态的概念。 一个Entity 实例处于受管状态,其实质是: 该实例存在于某个持久化上下文中,并且可能被某个EntityManager 处理,也因为这个原因,所以我们说一个EntityManager 管理一个持久化上下文。 尽管持久化上下文非常重要,但是开发者不直接与之打交道,持久化上下文在应用程序中是透明的,我们需要通过EntityManager 间接管理它。 容器管理的EntityManager(Container-Managed EntityManager) 通过将@PersistenceContext 注解标注在EntityManager 类型的字段上,这样得到的EntityManager 就是容器管理的EntityManager 。由于是容器管理的,所以我们不需要也不应该显式关闭注入的EntityManager 实例。 容器管理的EntityManager 又细分为两种类型: 事务范围 (Transaction ) 的和扩展的 (Extended ) 。 若@PersistenceContext 未指定type 属性,或者指定为PersistenContextType.TRANSACTION ,则表示该EntityManager 是事务范围的;若指定为PersistenContextType.EXTENDED 的,则表示该EntityManager 是扩展的。 事务范围: 事务范围的EntityManager 是无状态的,可用在无状态会话Bean 和有状态会话Bean 中。 事务范围的EntityManager 依赖于JTA 事务,每次调用EntityManager 实例的相关方法时,EntityManager 会查看是否有某个持久化上下文与当前事务关联,如果有,则使用该持久化上下文;如果没有,则EntityManager 将创建一个持久化上下文,并将该持久化上下文与当前事务关联。当事务结束,则持久化上下文消失。 扩展的: 扩展的EntityManager 只能用于有状态会话Bean 。 扩展的EntityManager 在有状态会话Bean 实例创建的时候创建一个持久化上下文,并且直到该有状态会话Bean 销毁,则相应的持久化上下文才被移除。 由于在扩展的EntityManager 中,每次方法调用都是使用的相同的持久化上下文,所以前一次方法调用时产生的受管实体在下一个方法访问时仍然为受管实体。 ...

2014-04-30 · 1 min · 160 words · -

spring annotation

spring annotation @Component;@Controller;@Service;@Repository @Component 在annotaion配置注解中用 @Component 来表示一个通用注释用于说明一个类是一个spring容器管理的类。即就是该类已经纳入到spring的管理中了。而@Controller, @Service, @Repository是 @Component 的细化,这三个注解比 @Component 带有更多的语义,它们分别对应了控制层、服务层、持久层的类。 @Service @Service 用于标注业务层组件,对象名默认是类名 (头字母小写), 如果想自定义,可以@Service(“foo”)这样来指定,这种bean默认是单例的,如果想改变,可以使用@Service(“foo”) @Scope(“prototype”)来改变。 @Controller用于标注控制层组件 (如struts中的action) @Repository用于标注数据访问组件,即DAO组件 @Component 泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。 @Autowired Spring自己定义的注解, JSR-250规范定义的注解 @Resource @Resource的作用相当于@Autowired,只不过@Autowired按byType自动注入,而@Resource默认按 byName自动注入 @Value 将外部的值动态注入到Bean中 @Value("normal") private String normal; // 注入普通字符串 @Value("#{systemProperties['os.name']}") private String systemPropertiesName; // 注入操作系统属性 @Value("#{ T(java.lang.Math).random() * 100.0 }") private double randomNumber; //注入表达式结果 @Value("#{beanInject.another}") private String fromAnotherBean; // 注入其他Bean属性: 注入beanInject对象的属性another,类具体定义见下面 @Value("classpath:com/hry/spring/configinject/config.txt") private Resource resourceFile; // 注入文件资源 @Value("http://www.baidu.com") private Resource testUrl; // 注入URL资源 @PostConstruct 注解在方法上,表示此方法是在Spring实例化该Bean之后马上执行此方法,之后才会去实例化其他Bean,并且一个Bean中@PostConstruct注解的方法可以有多个。 ...

2014-04-30 · 1 min · 79 words · -

spring security

spring security spring-security-jwt-guide https://github.com/Snailclimb/spring-security-jwt-guide spring-boot-starter-data-redis 基础依赖,其他依赖根据使用不同的缓存技术选择加入,默认情况下使用 ConcurrentMapCache不需要引用任何依赖 spring-boot-starter-data-redis spring-boot-starter-data-redis依赖于spring-data-redis 和 lettuce 。Spring Boot 1.0 默认使用的是 Jedis 客户端,2.0 替换成 Lettuce,但如果你从 Spring Boot 1.5.X 切换过来,几乎感受不大差异,这是因为 spring-boot-starter-data-redis 为我们隔离了其中的差异性。 spring-boot-starter-thymeleaf Thymeleaf 是新一代的模板引擎,在 Spring4.0 中推荐使用 Thymeleaf 来做前端模版引擎。 add maven dependancy HttpSessionSecurityContextRepository.loadContext spring security session serialize json redis https://github.com/spring-projects/spring-session/issues/933 https://github.com/spring-projects/spring-session/blob/2.3.1.RELEASE/spring-session-samples/spring-session-sample-boot-redis-json/src/main/java/sample/config/SessionConfig.java https://my.oschina.net/u/3669799/blog/4282404 https://blog.csdn.net/wamr_o/article/details/99634226 https://github.com/Ceruleans/ssdemo https://my.oschina.net/u/4257408/blog/3662569 <dependency> <groupId>org.springframework</groupId> spring-core</artifactId> <version>3.2.8.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> spring-context</artifactId> <version>3.2.8.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> spring-web</artifactId> <version>3.2.8.RELEASE</version> </dependency> add dispatcher servlet in web.xml ...

2014-04-29 · 1 min · 83 words · -

Maven中的DependencyManagement和Dependencies

Maven中的DependencyManagement和Dependencies 这里介绍一个在父项目中的根结点中声明dependencyManagement和dependencies的区别 dependencyManagement Maven 使用dependencyManagement 元素来提供了一种管理依赖版本号的方式。通常会在一个组织或者项目的最顶层的父POM 中看到dependencyManagement 元素。使用pom.xml 中的dependencyManagement 元素能让 所有在子项目中引用一个依赖而不用显式的列出版本号。Maven 会沿着父子层次向上走,直到找到一个拥有dependencyManagement 元素的项目,然后它就会使用在这个dependencyManagement 元素中指定的版本号。 例如在父项目里: Xml代码 收藏代码 MySQL MySQL-connector-java 5.1.2 … 然后在子项目里就可以添加MySQL-connector时可以不指定版本号,例如: ...

2014-04-28 · 1 min · 42 words · -

maven jvm opts

maven jvm opts Maven工程的JVM配置方式 为Maven运行配置JVM参数 这种需求比较少见,一般使用默认的JVM配置即可。如果需要,可以通过设置环境变量来满足需求,如: Windows下添加环境变量MAVEN_OPTS的value为-Xms1024m -Xmx1024m -Xss1m Linux下可修改.profile或者.bash_profile文件,并做如下设置: export MAVEN_OPTS="-Xms1024m -Xmx1024m -Xss1m" (注意: 这里需要使用双引号或者单引号)

2014-04-24 · 1 min · 16 words · -

XPath

XPath Xpath表达式 XPath(全称:XML Path Language)即 XML 路径语言,它是一门在 XML 文档中查找信息的语言,最初被用来搜寻 XML 文档,同时它也适用于搜索 HTML 文档。因此,在爬虫过程中可以使用 XPath 来提取相应的数据。 提示:XML 是一种遵守 W3C 标椎的标记语言,类似于 HTML,但两者的设计目的是不同,XML 通常被用来传输和存储数据,而 HTML 常用来显示数据。 您可以将 Xpath 理解为在XML/HTML文档中检索、匹配元素节点的工具。 Xpath 使用路径表达式来选取XML/HTML文档中的节点或者节点集。Xpath 的功能十分强大,它除了提供了简洁的路径表达式外,还提供了100 多个内建函数,包括了处理字符串、数值、日期以及时间的函数。因此 Xpath 路径表达式几乎可以匹配所有的元素节点。 Xpath基本语法 基本语法使用 Xpath 使用路径表达式在文档中选取节点,下表列出了常用的表达式规则: Xpath路径表达式 表达式 描述 node_name 选取此节点的所有子节点。 / 绝对路径匹配,从根节点选取。 // 相对路径匹配,从所有节点中查找当前选择的节点,包括子节点和后代节点,其第一个 / 表示根节点。 . 选取当前节点。 .. 选取当前节点的父节点。 @ 选取属性值,通过属性值选取数据。常用元素属性有 @id 、@name、@type、@class、@tittle、@href。 http://c.biancheng.net/python_spider/xpath.html

2014-04-24 · 1 min · 56 words · -

apk 编译,反编译,AXMLPrinter2,smali,baksmali

apk 编译,反编译,AXMLPrinter2,smali,baksmali http://blog.csdn.net/android_tutor/article/details/5724435 1.AXMLPrinter2.jar 2.baksmali.jar 3.smali.jar 三、准备工作 为了方便起见,作者把AXMLPrinter2.jar, 还有baksmali.jar,还有smali.jar(下下来为了方便重命名),放在Android SDK tools文件夹中如下图所示: 为了便于大家更容易程序比对,作者写了一个简单的应用(叫APKInstaller)目录结构如下图所示: 四、开始拿来主义 1.用 AXMLPrinter2.jar查看apk中的布局xml文件: 将ApkInstaller应用生成的ApkInstaller.apk(为了方便起见放到tools目录里)用WinRAR等 工具打开,将res/layout/main.xml解压出来(也还是放在tools目录里哦) 打开main.xml文件,内容如下(一堆天文): 这时候AXMLPrinter2.jar派上用场了,打开cmd终端,一直进入到tools目录下,输入如下命令: java -jar AXMLPrinter2.jar main.xml > main.txt. (如下图所示) 打开main.txt代码如下(是不是有个123了呵呵~): 为了比对打开源程序中的main.xml代码如下(大家比对一下吧): <LinearLayout xmlns:android=“http://schemas.android.com/apk/res/android" android:orientation=“vertical” android:layout_width=“fill_parent” android:layout_height=“fill_parent” <WebView android:id=”@+id/apk_web" android:layout_height=“wrap_content” android:layout_width=“fill_parent” /> 2.用baksmali.jar反编译classes.dex: 将ApkInstaller.apk里的classes.dex解压到tools目录里,然后baksmali.jar就派上用场了,在cmd命令行里输入如下命令: ...

2014-04-14 · 2 min · 223 words · -

虚拟文件系统

虚拟文件系统 为什么需要虚拟文件系统 虚拟文件系统 超级块,superblock inode 为什么需要虚拟文件系统 在 Linux 系统中一切皆文件,除了普通文件之外,目录、字符设备、块设备、套接字、进程、线程、管道等都是“文件”。 用户程序需要一个统一的操作接口屏蔽不同文件系统(ext2/3/4,xfs,vfat,socket)的差异和操作细节 在Linux中对文件的 操作可以跨文件系统而执行。如下图所示,我们可以使用 cp 命令从 fat 文件系统格式的硬盘拷贝数据到 ext2 文件系统格式的硬盘;而这样的操作涉及到两个不同的文件系统. 上层应用几乎不用关注底层的实现细节。我们只需要使用VFS暴露出来的标准的read、write等接口就可以了 通过VFS系统,Linux提供了通用的系统调用,可以跨越不同文件系统和介质之间执行,极大简化了用户访问不同文件系统的过程。 “一切皆是文件”是 Unix/Linux 的基本哲学之一。不仅普通的文件,目录、字符设备、块设备、 套接字等在 Unix/Linux 中都是以文件被对待;它们虽然类型不同,但是对其提供的却是同一套操作界面。 虚拟文件系统, Virtual File System,VFS VFS 是 Linux 内核中的一个软件层,是内核的子系统之一,为用户空间的程序提供文件和文件系统操作的统一接口,屏蔽不同文件系统的差异和操作细节 借助 VFS 可以直接使用open()、read()、write() 这样的系统调用操作文件,而无须考虑具体的文件系统和实际的存储介质。 通过 VFS,Linux 提供了通用的系统调用,可以跨越不同文件系统和介质之间执行,极大简化了用户访问不同文件系统的过程。另一方面,新的文件系统、新类型的存储介质,可以无须编译的情况下,动态加载到Linux中。 “一切皆文件"是Linux的基本哲学之一,不仅是普通的文件,包括目录、字符设备、块设备、套接字等,都可以以文件的方式被对待。实现这一行为的基础,正是Linux的虚拟文件系统机制。 VFS原理 VFS之所以能够衔接各种各样的文件系统,是因为它抽象了一个通用的文件系统模型,定义了通用文件系统都支持的、概念上的接口。新的文件系统只要支持并实现这些接口,并注册到Linux内核中,即可安装和使用。 虚拟文件系统组成部分 Linux为了实现这种VFS系统,采用面向对象的设计思路,主要抽象了四种对象类型: 超级块对象:代表一个已安装的文件系统。 索引节点对象:代表具体的文件。 目录项对象:代表一个目录项,是文件路径的一个组成部分。 文件对象:代表进程打开的文件。 每个对象都包含一组操作方法,用于操作相应的文件系统。 备注:Linux将目录当做文件对象来处理,是另一种形式的文件,它里面包含了一个或多个目录项。而目录项是单独抽象的对象,主要包括文件名和索引节点号。因为目录是可以层层嵌套,以形成文件路径,而路径中的每一部分,其实就是目录项。 接下来介绍一下各个对象的作用以及相关操作。 超级块, superblock 存储一个已安装的文件系统的控制信息(文件系统的状态、类型、大小、区块数、索引节点数等),代表一个已安装的文件系统;每次一个实际的文件系统被安装时, 内核会从磁盘的特定位置读取一些控制信息来填充内存中的超级块对象。一个安装实例和一个超级块对象一一对应。 超级块通过其结构中的一个域s_type记录它所属的文件系统类型。 superblock:记录此 filesystem 的整体信息,包括inode/block的总量、使用量、剩余量, 以及文件系统的格式与相关信息等; Superblock 是记录整个 filesystem 相关信息的地方, 没有 Superblock ,就没有这个 filesystem 了. ...

2014-04-14 · 5 min · 916 words · -

对称加密

对称加密 http://baike.baidu.com/view/119320.htm 采用单钥密码系统的加密方法,同一个密钥可以同时用作信息的加密和解密,这种加密方法称为对称加密,也称为单密钥加密。 需要对加密和解密使用相同密钥的加密算法。由于其速度快,对称性加密通常在消息发送方需要加密大量数据时使用。对称性加密也称为密钥加密。 所谓对称,就是采用这种加密方法的双方使用方式用同样的密钥进行加密和解密。密钥是控制加密及解密过程的指令。算法是一组规则,规定如何进行加密和解密。 因此[1]加密的安全性不仅取决于加密算法本身,密钥管理的安全性更是重要。因为加密和解密都使用同一个密钥,如何把密钥安全地传递到解密者手上就成了必须要解决的问题。 常用的对称加密有: DES、IDEA、RC2、RC4、SKIPJACK、RC5、AES算法等 安全性: AES> 3DES> DES http://aub.iteye.com/blog/1133494 http://www.blogjava.net/amigoxie/archive/2014/07/06/415503.html

2014-04-14 · 1 min · 14 words · -

classes.dex

classes.dex classes.dex: The classes compiled in the dex file format understandable by the Dalvik virtual machine

2014-04-14 · 1 min · 16 words · -

System.load 和 System.loadLibrary

System.load 和 System.loadLibrary http://blog.csdn.net/ring0hx/article/details/3242245 System.load 和 System.loadLibrary详解 1.它们都可以用来装载库文件,不论是JNI库文件还是非JNI库文件。在任何本地方法被调用之前必须先用这个两个方法之一把相应的JNI库文件装载。 2.System.load 参数为库文件的绝对路径,可以是任意路径。 例如你可以这样载入一个windows平台下JNI库文件: System.load(“C://Documents and Settings//TestJNI.dll”);。 System.loadLibrary 参数为库文件名,不包含库文件的扩展名。 例如你可以这样载入一个windows平台下JNI库文件 System. loadLibrary (“TestJNI”); 这里,TestJNI.dll 必须是在java.library.path这一jvm变量所指向的路径中。 可以通过如下方法来获得该变量的值: System.getProperty(“java.library.path”); 默认情况下,在Windows平台下,该值包含如下位置: 和jre相关的一些目录 程序当前目录 Windows目录 系统目录 (system32) 系统环境变量path指定目录 4.如果你要载入的库文件静态链接到其它动态链接库,例如TestJNI.dll 静态链接到dependency.dll, 那么你必须注意: 如果你选择 System.load(“C://Documents and Settings// TestJNI.dll”); 那么即使你把dependency.dll同样放在C://Documents and Settings//下,load还是会因为找不到依赖的dll而失败。因为jvm在载入TestJNI.dll会先去载入TestJNI.dll所依赖的库文件dependency.dll,而dependency.dll并不位于java.library.path所指定的目录下,所以jvm找不到dependency.dll。 你有两个方法解决这个问题: 一是把C://Documents and Settings//加入到java.library.path的路径中,例如加入到系统的path中。二是先调用 System.load(“C://Documents and Settings// dependency.dll”); 让jvm先载入dependency.dll,然后再调用System.load(“C://Documents and Settings// TestJNI.dll”); 如果你选择 System. loadLibrary (“TestJNI”); 那么你只要把dependency.dll放在任何java.library.path包含的路径中即可,当然也包括和TestJNI.dll相同的目录。

2014-04-14 · 1 min · 59 words · -

Linux动态链接库.so文件

Linux动态链接库.so文件 http://blog.csdn.net/ithomer/article/details/7346146 **1. 介绍 ** 使用GNU的工具我们如何在Linux下创建自己的程序函数库?一个"程序函数库"简单的说就是一个文件包含了一些编译好的代码和数据,这些编译好的代码和数据可以在事后供其他的程序使用。程序函数库可以使整个程序更加模块化,更容易重新编译,而且更方便升级。 程序函数库可分为3种类型: 静态函数库 (static libraries) 、共享函数库 (shared libraries) 、动态加载函数库 (dynamically loaded libraries) : 静态函数库,是在程序执行前就加入到目标程序中去了; 共享函数库,则是在程序启动的时候加载到程序中,它可以被不同的程序共享;动态加载函数库则可以在程序运行的任何时候动态的加载。 动态函数库,并非另外一种库函数格式,区别是动态加载函数库是如何被程序员使用的。 **2. 静态函数库 ** 静态函数库实际上就是简单的一个普通的目标文件的集合,一般来说习惯用".a"作为文件的后缀。可以用ar这个程序来产生静态函数库文件。Ar是archiver的缩写。静态函数库现在已经不在像以前用得那么多了,主要是共享函数库与之相比较有很多的优势的原因。慢慢地,大家都喜欢使用共享函数库了。不过,在一些场所静态函数库仍然在使用,一来是保持一些与以前某些程序的兼容,二来它描述起来也比较简单。 静态库函数允许程序员把程序link起来而不用重新编译代码,节省了重新编译代码的时间。不过,在今天这么快速的计算机面前,一般的程序的重新编译也花费不了多少时间,所以这个优势已经不是像它以前那么明显了。静态函数库对开发者来说还是很有用的,例如你想把自己提供的函数给别人使用,但是又想对函数的源代码进行保密,你就可以给别人提供一个静态函数库文件。理论上说,使用ELF格式的静态库函数生成的代码可以比使用共享函数库 (或者动态函数库) 的程序运行速度上快一些,大概1-5%。 创建一个静态函数库文件,或者往一个已经存在地静态函数库文件添加新的目标代码,可以用下面的命令: ar rcs my_library.a file1.o file2.o 这个例子中是把目标代码file1.o和file2.o加入到my_library.a这个函数库文件中,如果my_library.a不存在则创建一个新的文件。在用ar命令创建静态库函数的时候,还有其他一些可以选择的参数,可以参加ar的使用帮助。这里不再赘述。 一旦你创建了一个静态函数库,你可以使用它了。你可以把它作为你编译和连接过程中的一部分用来生成你的可执行代码。如果你用gcc来编译产生可执行代码的话,你可以用"-l"参数来指定这个库函数。你也可以用ld来做,使用它的"-l"和"-L"参数选项。具体用法可以参考info:gcc。 **3. 共享函数库 ** 共享函数库中的函数是在当一个可执行程序在启动的时候被加载。如果一个共享函数库正常安装,所有的程序在重新运行的时候都可以自动加载最新的函数库中的函数。对于Linux系统还有更多可以实现的功能: 升级了函数库但是仍然允许程序使用老版本的函数库。 当执行某个特定程序的时候可以覆盖某个特定的库或者库中指定的函数。 可以在库函数被使用的过程中修改这些函数库。 3.1. 一些约定 如果你要编写的共享函数库支持所有有用的特性,你在编写的过程中必须遵循一系列约定。你必须理解库的不同的名字间的区别,例如它的"soname"和"real name"之间的区别和它们是如何相互作用的。你同样还要知道你应该把这些库函数放在你文件系统的什么位置等等。下面我们具体看看这些问题。 3.1.1. 共享库的命名 每个共享函数库都有个特殊的名字,称作"soname"。soname名字命名必须以"lib"作为前缀,然后是函数库的名字,然后是".so",最后是版本号信息。不过有个特例,就是非常底层的C库函数都不是以lib开头这样命名的。 每个共享函数库都有一个真正的名字 (“real name”) ,它是包含真正库函数代码的文件。真名有一个主版本号,和一个发行版本号。最后一个发行版本号是可选的,可以没有。主版本号和发行版本号使你可以知道你到底是安装了什么版本的库函数。另外,还有一个名字是编译器编译的时候需要的函数库的名字,这个名字就是简单的soname名字,而不包含任何版本号信息。 管理共享函数库的关键是区分好这些名字。当可执行程序需要在自己的程序中列出这些他们需要的共享库函数的时候,它只要用soname就可以了;反过来,当你要创建一个新的共享函数库的时候,你要指定一个特定的文件名,其中包含很细节的版本信息。当你安装一个新版本的函数库的时候,你只要先将这些函数库文件拷贝到一些特定的目录中,运行ldconfig这个实用就可以。ldconfig检查已经存在的库文件,然后创建soname的符号链接到真正的函数库,同时设置/etc/ld.so.cache这个缓冲文件。这个我们稍后再讨论。 ldconfig 并不设置链接的名字,通常的做法是在安装过程中完成这个链接名字的建立,一般来说这个符号链接就简单的指向最新的soname或者最新版本的函数库文件。最好把这个符号链接指向soname,因为通常当你升级你的库函数后,你就可以自动使用新版本的函数库类。 我们来举例看看: /usr/lib/libreadline.so.3 是一个完全的完整的soname,ldconfig可以设置一个符号链接到其他某个真正的函数库文件,例如是/usr/lib/libreadline.so.3.0。同时还必须有一个链接名字,例如 /usr/lib/libreadline.so就是一个符号链接指向/usr/lib/libreadline.so.3。 3.1.2. 文件系统中函数库文件的位置 共享函数库文件必须放在一些特定的目录里,这样通过系统的环境变量设置,应用程序才能正确的使用这些函数库。大部分的源码开发的程序都遵循GNU的一些标准,我们可以看info帮助文件获得相信的说明,info信息的位置是: info:standards#Directory_Variables。GNU标准建议所有的函数库文件都放在/usr/local/lib目录下,而且建议命令可执行程序都放在/usr/local/bin目录下。这都是一些习惯问题,可以改变的。 文件系统层次化标准FHS (Filesystem Hierarchy Standard) (http://www.pathname.com/fhs) 规定了在一个发行包中大部分的函数库文件应该安装到/usr/lib目录下,但是如果某些库是在系统启动的时候要加载的,则放到/lib目录下,而那些不是系统本身一部分的库则放到/usr/local/lib下面。 ...

2014-04-14 · 2 min · 405 words · -

Java JNI

Java JNI http://blog.csdn.net/u_xtian/article/details/6033963 我们知道Java是一个运行在虚拟机里面的高级的编程语言,如果要调用系统的动态链接库的话,就要先声明native修饰的方法(类似接口里面的方法),再由C/C++程序来实现(类似实现接口里的方法)。这样Java调用这些native方法就相当于调用了C/C++里面实现了的方法。通常我们把这种机制叫做JNI(Java NativeInterfac),即Java 本地编程接口 Android也同理,要学会在Android上进行NDK开发,首先我们到打好java JNI的基础。现在我们暂时把Android开发丢到一边先,试试在Java之下编译一个C动态链接库,再用Java程序调用。 1)先来个最简单的打印HelloWorld例子: Java代码(HelloJni.java): import java.util.*; public class HelloJni{ static{ System.loadLibrary(“hello”); } public native static void sayHello(); public static void main(String [] args) { HelloJni.sayHello(); } } 生成头文件(HelloJni.h): 先javac HelloJni.java编译你的Java源码,再javah–jni HelloJni生成所需的头文件 头文件内容是这样的: /* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class HelloJni */ #ifndef _Included_HelloJni #define _Included_HelloJni #ifdef __cplusplus extern “C” { #endif JNIEXPORT void JNICALL Java_HelloJni_sayHello (JNIEnv *, jclass); ...

2014-04-14 · 5 min · 1039 words · -

HTML DOM Hidden

HTML DOM Hidden Hidden 对象代表一个 HTML 表单中的某个隐藏输入域。 这种类型的输入元素实际上是隐藏的。这个不可见的表单元素的 value 属性保存了一个要提交给 Web 服务器的任意字符串。如果想要提交并非用户直接输入的数据的话,就是用这种类型的元素。 在 HTML 表单中 <input type="hidden"> 标签每出现一次,一个 Hidden 对象就会被创建。 您可通过遍历表单的 elements[] 数组来访问某个隐藏输入域,或者通过使用document.getElementById()。 http://www.w3school.com.cn/jsref/dom_obj_hidden.asp

2014-04-12 · 1 min · 24 words · -

System.load System.loadLibrary

‘System.load System.loadLibrary’ System.load 和 System.loadLibrary详解 分类: Java 2008-11-06 23:21 16051人阅读 评论(4) 收藏 举报 jniwindowsjvm平台pathsystem System.load 和 System.loadLibrary详解 1.它们都可以用来装载库文件,不论是JNI库文件还是非JNI库文件。在任何本地方法被调用之前必须先用这个两个方法之一把相应的JNI库文件装载。 2.System.load 参数为库文件的绝对路径,可以是任意路径。 例如你可以这样载入一个windows平台下JNI库文件: System.load(“C://Documents and Settings//TestJNI.dll”);。 System.loadLibrary 参数为库文件名,不包含库文件的扩展名。 例如你可以这样载入一个windows平台下JNI库文件 System. loadLibrary (“TestJNI”); 这里,TestJNI.dll 必须是在java.library.path这一jvm变量所指向的路径中。 可以通过如下方法来获得该变量的值: System.getProperty(“java.library.path”); 默认情况下,在Windows平台下,该值包含如下位置: 和jre相关的一些目录 程序当前目录 Windows目录 系统目录 (system32) 系统环境变量path指定目录 4.如果你要载入的库文件静态链接到其它动态链接库,例如TestJNI.dll 静态链接到dependency.dll, 那么你必须注意: 如果你选择 System.load(“C://Documents and Settings// TestJNI.dll”); 那么即使你把dependency.dll同样放在C://Documents and Settings//下,load还是会因为找不到依赖的dll而失败。因为jvm在载入TestJNI.dll会先去载入TestJNI.dll所依赖的库文件dependency.dll,而dependency.dll并不位于java.library.path所指定的目录下,所以jvm找不到dependency.dll。 你有两个方法解决这个问题: 一是把C://Documents and Settings//加入到java.library.path的路径中,例如加入到系统的path中。二是先调用 System.load(“C://Documents and Settings// dependency.dll”); 让jvm先载入dependency.dll,然后再调用System.load(“C://Documents and Settings// TestJNI.dll”); 如果你选择 System. loadLibrary (“TestJNI”); 那么你只要把dependency.dll放在任何java.library.path包含的路径中即可,当然也包括和TestJNI.dll相同的目录。

2014-04-11 · 1 min · 69 words · -

Jode

Jode http://moonights.iteye.com/blog/568886 Jode介绍 源码开放的JODE是全球最大的开源项目网站Sourceforge.net的成员,在所有的JAVA反编译器中,JODE的反编译效果是最好的,尤其是对付一些常见的加密手段,例如混淆技术等,更是出类拔粹。JODE本身也是纯JAVA开发的,最近越来越多的JAVA反编译软件也选择JODE来做它们的核心引擎,例如JCavaj Java Decompiler、BTJ (Back To Java)、jEdit’s JavaInsight plugin等。JODE是一个可运行的JAR文件,在windows环境下双击即可运行。 Jode Eclipse插件安装 顺序点击Eclipse上的==>help ==> Software Updates ==> Find and Install ==> Search for new features to install, 单击"New Remote Site…", 在Name中输入Jode Decompliter在URL栏输入 [http://www.technoetic.com/eclipse/update> 然后下一步,就可以看到"Jode Decompiler"了,选上并单击Finish就开始自动到相应的官网上去下载安装了。安装好后,可以在Window ==> Preferences… ==> Java ==](http://www.technoetic.com/eclipse/update> 然后下一步,就可以看到"Jode Decompiler"了,选上并单击Finish就开始自动到相应的官网上去下载安装了。安装好后,可以在Window ==> Preferences… ==> Java ==) Jode Decompiler选项卡。 安装好了再设置一下文件关联就可以了,Window => Preferences… => General => Editors => File Associations找到"*.class"在"Associated editors"里面可以看到"Jode class file viewer"选中它再单击Default按钮就OK了 3.Jode的使用 其实之所以要使用Jode就是因为我们往往只有Java的class字节码文件却没有源文件,这时就只有进行反编译了,在Eclipse中我们通常为了查看一个class文件的源代码,必须将它与源文件相关联。而如果我们安装了Jode插件,那么就不用去苦苦寻找源文件了,直接反编译就OK (虽然有时会报出一堆的错误@_@) 。要注意的是Jode只认识.jar文件 (不支持war文件,因此如果是war文件,你因该先将之解压然后打包成.jar包) 。 首先将你要反编译的class文件利用Java自带的jar命令将class文件打包成.jar包,然后导入到你的Eclipse的Project中去,接着就可以展开刚才导入的jar包,查看class文件相应的源文件了。

2014-04-11 · 1 min · 71 words · -

Java反编译, jad, jd-gui

Java反编译, jad, jd-gui Jadclipse JadClipse是Jad的Eclipse插件 jad jad是一款使用非常广泛地Java反编译工具,上面这款Jadclipse就是基于jad的反编译插件,JAD 文件包含 MIDlet 套件的标题信息,例如开发应用程序的公司、应用程序名称和大小。 官方网站: http://varaneckas.com/jad/ JD-GUI JD-GUI 是一个用 C++ 开发的 Java 反编译工具,由 Pavel Kouznetsov开发,支持Windows、Linux和苹果Mac Os三个平台。而且提供了Eclipse平台下的插件JD-Eclipse。JD-GUI不需要安装,直接点击运行,可以反编译jar,class文件。 官方网站: http://jd.benow.ca/ jdec http://jdec.sourceforge.net/ uuDeJava http://www.uuware.com/uudejava_cn.htm Minjava Java Decompiler http://jd.benow.ca/ 工具使用jad(还有joda,jd等工具) 使用jad反编译class文件,jad可以配置到eclipse中当做插件,直接下载jad的eclipse插件jar包,放在eclipse的plugin目录下即可。把下载的jad.exe放在JAVA_HOME的bin下。然后eclipse中点击class文件即可查看到源码。 使用其他工具,FrontEnd Plus集成了jad的java反编译工具,支持多个文件的反编译,也支持各种选项。 矫正反编译代码错误和奇怪代码 异常错误 反编译之后出入类似如下代码: DocumentException e; e; e.printStackTrace(); break MISSING_BLOCK_LABEL_67; e; e.printStackTrace(); break MISSING_BLOCK_LABEL_67; e; e.printStackTrace(); break MISSING_BLOCK_LABEL_67; e; 这种处理方式就是异常处理,反编译之后出现的这种情况,修改的时候使用try catch即可,其实完全可以将这块删除之后,然后eclipse会自动提示需要添加异常处理的模块,自动try catch即可。 语句标号 (goto) 这种情况常见于条件语句,即转化为if,else语句即可,这种比较容易判断。 i = 0; goto _L1 _L3: i++; _L1: if(i < 4) goto _L3; else goto_L2 ...

2014-04-11 · 1 min · 180 words · -

CSS中加号、星号及其他符号的作用

CSS中加号、星号及其他符号的作用 http://blog.sina.com.cn/s/blog_6790717801011dx8.html CSS中加号、星号及其他符号的作用 (2012-06-27 14:34:32)转载▼ 标签: 科技 css 浏览器 版本 it 首先,什么是CSS hack? 针对不同的浏览器写不同的CSS code的过程,就叫CSS hack! CSS hack由于不同的浏览器,比如Internet Explorer 6,Internet Explorer 7,Mozilla Firefox等,对CSS的解析认识不一样,因此会导致生成的页面效果不一样,得不到我们所需要的页面效果。 这个时候我们就需要针对不同的浏览器去写不同的CSS,让它能够同时兼容不同的浏览器,能在不同的浏览器中也能得到我们想要的页面效果。 CSS Hack的原理是什么 由于不同的浏览器对CSS的支持及解析结果不一样,还由于CSS中的优先级的关系。我们就可以根据这个来针对不同的浏览器来写不同的CSS。 CSS Hack大致有3种表现形式,CSS类内部Hack、选择器Hack以及HTML头部引用(if IE)Hack,CSS Hack主要针对IE浏览器。 类内部Hack: 比如 IE6能识别下划线"“和星号” * “,IE7能识别星号” * “,但不能识别下划线”",而firefox两个都不能认识。 选择器Hack: 比如 IE6能识别*html .class{},IE7能识别*+html .class{}或者*:first-child+html .class{}。 HTML头部引用(if IE)Hack: 针对所有IE: <!-[if IE]><!-您的代码-><![endif]->,针对IE6及以下版本: <!-[if lt IE 7]><!-您的代码-><![endif]->,这类Hack不仅对CSS生效,对写在判断语句里面的所有代码都会生效。 书写顺序,一般是将识别能力强的浏览器的CSS写在后面。下面如何写里面说得更详细些。 如何写CSS Hack 比如要分辨IE6和firefox两种浏览器,可以这样写: 在IE6中看到是红色的,在firefox中看到是绿色的。 上面的css在firefox中,它是认识不了后面的那个带星号的东西是什么的,于是将它过滤掉,不予理睬,解析得到的结果是:div{background:green},于是理所当然这个div的背景是绿色的。 在IE6中呢,它两个background都能识别出来,它解析得到的结果是:div{background:green;background:red;},于是根据优先级别,处在后面的red的优先级高,于是当然这个div的背景颜色就是红色的了。 ...

2014-04-11 · 3 min · 469 words · -