Java按位异或运算符

Java按位异或运算符 按位异或运算符 两个操作数中,如果两个相应位相同,则结果为0,否则为1 即: 0^0=0, 1^0=1, 0^1=1, 1^1=0 例如: 00101010^00010111=00111101 1)如果需使用一个整数的某些特定的位翻转,可使用另一个 相应位为1的操作数与原来的整数进行按位异或操作实现。 下面的例子对整数变量 ii的第四位翻转 int revertFouth=ii^8; 其余位则没有变化 通过按位异或运算可以实现两个值的交换。而不使用临 时变量。例如交换两个整数a,b的值可通过下列语句实现: int a=15,b=24; //a的最右边8位为00001111,b的最右边8位为00011000 //a和b其余位为0,下同 a=a^b; //a的最右边8位为00010111,a=23 b=b^a; //b的最右边8位为00001111,b=15 a=a^b; //a的最右边8位为00011000,a=24 *位逻辑运算表达式返回两个操作数中数据长度较长的数据 类型 其中较小的左侧将被填满,若为整数,则填满0, 若为负数,则左侧填满1 首先复习一下异或运算 (^) 的性质: 它满足交换律、结合律。 此处有一个经典的运用: 现在有一万 (1-10000) 的个数,从中拿掉一个数,问怎么才能找出拿掉的数? 设 最初的数组是 A, 拿掉 x 之后的数组是 B, xor() 是对数组内所有元素做异或,则有: xor(A) == xor(B) ^ x Fake代码 xor(A) == xor(B) ^ x 所以: xor(B) ^ xor(A) == xor(B) ^ xor(B) ^ x == 0 ^ x == x ...

2011-12-28 · 1 min · 123 words · -

openJPA enhancement error

openJPA enhancement error <openjpa-2.1.1-r422266:1148538 nonfatal user error> org.apache.openjpa.persistence.ArgumentException: This configuration disallows runtime optimization, but the following listed types were not enhanced at build time or at class load time with a javaagent: " com.wiloon.openjpa.entity.Animal". add line : in persistence.xml

2011-12-28 · 1 min · 39 words · -

JDO

JDO JDO(Java Data Object )是Java对象持久化的新的规范,也是一个用于存取某种数据仓库中的对象的标准化API。JDO提供了透明的对象存储,因此对开发人员来说,存储数据对象完全不需要额外的代码 (如JDBC API的使用) 。这些繁琐的例行工作已经转移到JDO产品提供商身上,使开发人员解脱出来,从而集中时间和精力在业务逻辑上。另外,JDO很灵活,因为它可以在任何数据底层上运行。JDBC只是面向关系数据库 (RDBMS) JDO更通用,提供到任何数据底层的存储功能,比如关系数据库、文件、XML以及对象数据库 (ODBMS) 等等,使得应用可移植性更强。 应用程序的开发人员通过访问JDO Instance , 达到访问JDO Instance 所代表的数据对象,包括:ERP,数据库系统等.使数据的存储介质对于应用的开发人员完全透明. JDO最早是由Sun召集众多的O/R Mapping开发团队集中起来共同提出的,首先是通过会议确定了JDO需要包括的内容,然后正式提出一个Java规范请求 (JSR-12) ,正式开始了JDO规范的制定。下面是主要的进展里程碑。 JSR #000012 approved in July 1999 1999-8组建的专家小组: 包括Sun、Apple、BEA、IBM、Oracle、SAP、WebGain等 2000-5 完成公开评论草案 2000-6 在JavaOne上引入 2001-3 最终草案0.93 2001-5 最终草案0.96公布 2001-6 在JavaOne上启动 2001-11 最终草案0.98 2002-4 1.0版正式公布 2002-8 1.0.1修正版 2003-8 2.0规范启动

2011-12-27 · 1 min · 48 words · -

设置 Emacs 的编码格式

设置 Emacs 的编码格式 查看一下 Emacs 读取文件用的编码格式。 M-x describe-coding-system 把 Emacs 的默认编码设置为 UTF-8。 在 .emacs 文件里放入下面这段代码: [lisp] ;;set the default text coding system (setq default-buffer-file-coding-system ‘utf-8) [/lisp] 可是即使我加了上面这条语句,为什么 Emacs 依然显示 org 文件为乱码呢? 原来上面这一行,只是适用于写文件的情况。当你读取一个文件的时候,可能依然会显示出乱码,因为 Emacs 读文件也是按照一定的编码规律来解读文件的。我们再用命令 M-x describe-coding-system 仔细观察一下结果里面的内容,是不是有类似下面这样一段: Priority order for recognizing coding systems when reading files: 1. iso-latin-1 (alias: iso-8859-1 latin-1) 2. utf-8 (alias: mule-utf-8) 3. iso-2022-7bit 4. iso-2022-7bit-lock (alias: iso-2022-int-1) 5. iso-2022-8bit-ss2 6. emacs-mule 7. raw-text 8. iso-2022-jp (alias: junet) 9. in-is13194-devanagari (alias: devanagari) 10. chinese-iso-8bit (alias: cn-gb-2312 euc-china euc-cn cn-gb gb2312) 11. utf-8-auto 12. utf-8-with-signature 13. utf-16 14. utf-16be-with-signature (alias: utf-16-be) 15. utf-16le-with-signature (alias: utf-16-le) 16. utf-16be 17. utf-16le 18. japanese-shift-jis (alias: shift_jis sjis cp932) 19. undecided 这就是 Emacs 在读文件时候的解码顺序!如果你的文件是以英文开头,自然会套用第一种方法。这个时候,我们还需要调整一下这个编码的先后次序。用命令 M-x prefer-coding-system 就可以调整这些顺序。调整完顺序,再打开 org 文件看一看,终于恢复原貌了。 如果你只是用命令 M-x prefer-coding-system 来设置,下次重启 Emacs 的时候,这个设置就会自动清除。如果需要每次都采用这个设置,可以把下面这行扔到 .emacs 里指定优先用 utf-8 来解码: (prefer-coding-system ‘utf-8) ...

2011-12-27 · 1 min · 145 words · -

java generic, 泛型

java generic, 泛型 泛型, generic 泛型是jdk5引入的类型机制,本质是将类型参数化(是早在1999年就制定的jsr14的实现) 也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。 Java语言引入泛型的好处是安全简单。 泛型解决了几个问题: 1 可读性,从字面上就可以判断集合中的内容类型; 2 类型检查,避免插入非法类型。 3 获取数据时不在需要强制类型转换。 在Java SE 1.5之前,没有泛型的情况的下,通过对类型(Object)的引用来实现参数的"任意化",“任意化"带来的缺点是要做显式的强制类型转换,而这种转换是要求开发者对实际参数类型可以预知的情况下进行的。对于强制类型转换错误的情况,编译器可能不提示错误,在运行的时候才出现异常,这是一个安全隐患。 泛型的好处是在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,提高代码的重用率。 规则和限制 泛型的类型参数只能是类类型 (包括自定义类) ,不能是简单类型。 同一种泛型可以对应多个版本 (因为参数类型是不确定的) ,不同版本的泛型类实例是不兼容的。 泛型的类型参数可以有多个。 泛型的参数类型可以使用extends语句,例如。习惯上称为"有界类型”。 泛型的参数类型还可以是通配符类型。例如Class classType = Class.forName(“java.lang.String”); 泛型还有接口、方法等等,内容很多,需要花费一番功夫才能理解掌握并熟练应用。在此给出我曾经了解泛型时候写出的两个例子 (根据看的印象写的) ,实现同样的功能,一个使用了泛型,一个没有使用,通过对比,可以很快学会泛型的应用,学会这个基本上学会了泛型70%的内容。 例子一: 使用了泛型 package com.wiloon.test.generics; class Gen<T> { private T ob; // 定义泛型成员变量 public Gen(T ob) { this.ob = ob; } public T getOb() { return ob; } public void setOb(T ob) { this.ob = ob; } public void showType() { System.out.println("T的实际类型是: " + ob.getClass().getName()); } } public class GenDemo { public static void main(String[] args) { // 定义泛型类Gen的一个Integer版本 Gen<Integer> intOb = new Gen<Integer>(88); intOb.showType(); int i = intOb.getOb(); System.out.println("value= " + i); System.out.println("------------"); // 定义泛型类Gen的一个String版本 Gen<String> strOb = new Gen<String>("Hello Gen!"); strOb.showType(); String s = strOb.getOb(); System.out.println("value= " + s); } } 例子二: 没有使用泛型 ...

2011-12-26 · 11 min · 2182 words · -

执行 Shell 脚本, fork, exec, source, shell 执行

执行 Shell 脚本, fork, exec, source, shell 执行 cx ./xxx.sh sh xxx.sh 用户可以用任何编辑程序来编写Shell程序。因为Shell程序是解释执行的,所以不需要编译成目的程序。按照Shell编程的惯例,以bash 为例,程序的第一行一般为"#!/bin/bash",其中 # 表示该行是注释,叹号 ! 告诉Shell运行叹号之后的命令并用文档的其余部分作为输入,也就是运行/bin/bash并让/bin/bash去执行Shell程序的内容。 执行Shell程序的方法有3种。 sh Shell 程序文件名 这种方法的命令格式为: sh <foo.sh> 这实际上是调用一个新的bash命令解释程序,而把Shell程序文件名作为参数传递给它。新启动的Shell将去读指定的文件,可执行文件中列出的命令,当所有的命令都执行完后结束。该方法的优点是可以利用Shell调试功能。 bash < foo.sh 格式为: bash< Shell程序名 这种方式就是利用输入重定向,使Shell命令解释程序的输入取自指定的程序文件。 用 chmod 命令使 Shell 程序成为可执行的,"./Shell文件名" 一个文件能否运行取决于该文档的内容本身可执行且该文件具有执行权。对于Shell程序,当用编辑器生成一个文件时,系统赋予的许可权都是644(rw-r-r-),用"chomd 755 Shell文件名"命令将其改为可执行的,因此,当用户需要运行这个文件时,"./Shell文件名"来执行就是行了。 在这3种运行Shell程序的方法中,最好按下面的方式选择: 当刚创建一个Shell程序,对它的正确性还没有把握时,应当使用第一种方式进行调试。当一个Shell程序已经调试好时,应使用第三种方式把它固定下来,以后只要键入相应的文件名即可,并可被另一个程序所调用。 source (.) 使用 source 命令和点号(.)是等价的, 类似于 C/C++ 中的 #include 预处理指令,都是将指定的脚本内容拷贝至当前的脚本中,由同一个 Shell 进程来执行。 source (source /directory/script.sh) 与fork的区别是不新开一个 sub-shell 来执行被调用的脚本,而是在同一个 shell 中执行。所以被调用的脚本中声明的变量和环境变量。 都可以在主脚本中得到和使用。 使用 source 执行命令时, 脚本文件可以没有执行权限, source 命令是 bash 的内置命令,不需要 (也没有) 绝对路径. source 命令也称为"点命令",也就是一个点符号 “. “。 source 命令通常用于重新执行刚修改的初始化文件,使之立即生效,而不必注销并重新登录。 ...

2011-12-26 · 2 min · 241 words · -

Linux命令之exit – 退出当前shell

Linux命令之exit – 退出当前shell 本文链接: http://codingstandards.iteye.com/blog/836625 (转载请注明出处) 用途说明 exit命令用于退出当前shell,在shell脚本中可以终止当前脚本执行。 常用参数 格式: exit n 退出。设置退出码为n。 (Cause the shell to exit with a status of n.) 格式: exit 退出。退出码不变,即为最后一个命令的退出码。 (If n is omitted, the exit status is that of the last command executed. ) 格式: $? 上一个命令的退出码。 格式: trap “commands” EXIT 退出时执行commands指定的命令。 ( A trap on EXIT is executed before the shell terminates.) 退出码 (exit status,或exit code) 的约定: 0表示成功 (Zero - Success) 非0表示失败 (Non-Zero - Failure) ...

2011-12-26 · 2 min · 359 words · -

MySQL修改密码

MySQL修改密码 /usr/bin/MySQLadmin -u root password 'haCahpro' MySQL改root密码 MySQL -u root -p MySQL> SET PASSWORD FOR 'root'@'localhost'=PASSWORD('pa55word'); MySQL> QUIT SQL Error (1130): Host '192.168.1.126' is not allowed to connect to this MySQL server 通过HeidiSQL连接MySQL数据库报错: SQL Error (1130): Host ‘192.168.1.126’ is not allowed to connect to this MySQL server 说明所连接的用户帐号没有远程连接的权限,只能在本机(localhost)登录。 需更改 MySQL 数据库里的 user表里的 host项把localhost改称% 首先按下面的步骤登录MySQL服务器 登录MySQL需要切换到dos下的MySQL的bin目录,进行如下操作: MySQL>use MySQL; MySQL>update user set host = '%' where user ='root'; MariaDB [MySQL]> update user set host = ‘%’ where host = ’localhost’; Query OK, 0 rows affected (0.00 sec) Rows matched: 0 Changed: 0 Warnings: 0 ...

2011-12-26 · 1 min · 102 words · -

remember me

remember me jwt http://blog.daocloud.io/5700.html spring security http://www.semlinker.com/spring-security-remember-me/ https://www.cnblogs.com/zongmin/p/13783285.html restful api remember me https://blog.csdn.net/liukangjie520/article/details/111617244 https://xie.infoq.cn/article/f83774aa8603152a82105ab69

2011-12-26 · 1 min · 14 words · -

Annotation/注解

Annotation/注解 annotation http://www.cnblogs.com/mandroid/archive/2011/07/18/2109829.html annotation 是Java5开始引入的新特征。中文名称一般叫注解。它提供了一种安全的类似注释的机制,用来将任何的信息或元数据(metadata)与程序元素(类、方法、成员变量等)进行关联。 更通俗的意思是为程序的元素(类、方法、成员变量)加上更直观更明了的说明,这些说明信息是与程序的业务逻辑无关,并且是供指定的工具或框架使用的。 annotation 像一种修饰符一样,应用于包、类型、构造方法、方法、成员变量、参数及本地变量的声明语句中。 Annotation其实是一种接口。通过Java的反射机制相关的API来访问annotation信息。相关类(框架或工具中的类)根据这些信息来决定如何使用该程序元素或改变它们的行为。 annotation是不会影响程序代码的执行,无论annotation怎么变化,代码都始终如一地执行。 Java语言解释器在工作时会忽略这些annotation,因此在JVM 中这些annotation是"不起作用"的,只能通过配套的工具才能对这些 annotation 类型的信息进行访问和处理。 Annotation 与interface的异同 Annotation类型使用关键字@interface而不是interface。 这个关键字声明隐含了一个信息: 它是继承了java.lang.annotation.Annotation接口,并非声明了一个interface。 Annotation类型、方法定义是独特的、受限制的。 Annotation 类型的方法必须声明为无参数、无异常抛出的。这些方法定义了annotation的成员: 方法名成为了成员名,而方法返回值成为了成员的类型。方法返回值类型必须为primitive类型、Class类型、枚举类型、annotation类型或者由前面类型之一作为元素的一维数组。方法的后面可以使用 default 和一个默认数值来声明成员的默认值,null 不能作为成员默认值,这与我们在非 annotation 类型中定义方法有很大不同。 Annotation 类型和它的方法不能使用 annotation 类型的参数、成员不能是 generic。只有返回值类型是Class的方法可以在annotation类型中使用generic,因为此方法能够用类转换将各种类型转换为Class。 Annotation类型又与接口有着近似之处。 它们可以定义常量、静态成员类型(比如枚举类型定义)。Annotation类型也可以如接口一般被实现或者继承。 应用场合 annotation一般作为一种辅助途径,应用在软件框架或工具中,在这些工具类中根据不同的 annotation 注解信息采取不同的处理过程或改变相应程序元素(类、方法及成员变量等)的行为。 例如: Junit、Struts、Spring等流行工具框架中均广泛使用了 annotation 。使代码的灵活性大提高。 常见标准的Annotation 从java5版本开始,自带了三种标准 annotation 类型: Override java.lang.Override 是一个marker annotation类型,它被用作标注方法。它说明了被标注的方法重载了父类的方法,起到了断言的作用。如果我们使用了这种annotation在一个没有覆盖父类方法的方法时,java编译器将以一个编译错误来警示。 这个annotaton常常在我们试图覆盖父类方法而确又写错了方法名时加一个保障性的校验过程。 Deprecated Deprecated也是一种marker annotation。当一个类型或者类型成员使用@Deprecated修饰的话,编译器将不鼓励使用这个被标注的程序元素。所以使用这种修饰具有一定的 “延续性”: 如果我们在代码中通过继承或者覆盖的方式使用了这个过时的类型或者成员,虽然继承或者覆盖后的类型或者成员并不是被声明为 @Deprecated,但编译器仍然要报警。 注意: @Deprecated这个annotation类型和javadoc中的 @deprecated这个tag是有区别的: 前者是java编译器识别的,而后者是被javadoc工具所识别用来生成文档(包含程序成员为什么已经过时、它应当如何被禁止或者替代的描述)。 SuppressWarnings 此注解能告诉Java编译器关闭对类、方法及成员变量的警告。 有时编译时会提出一些警告,对于这些警告有的隐藏着Bug,有的是无法避免的,对于某些不想看到的警告信息,可以通过这个注解来屏蔽。 SuppressWarning不是一个marker annotation。它有一个类型为String[]的成员,这个成员的值为被禁止的警告名。对于javac编译器来讲,被-Xlint选项有效的警告名也同样对@SuppressWarings有效,同时编译器忽略掉无法识别的警告名。 annotation语法允许在annotation名后跟括号,括号中是使用逗号分割的name=value对用于为annotation的成员赋值: 代码: @SuppressWarnings(value={“unchecked”,“fallthrough”}) ...

2011-12-26 · 8 min · 1532 words · -

MySQL 数据类型

MySQL 数据类型 datetime, timestamp 两者都是时间类型字段,格式都一致。两者主要有以下几点区别: 最主要的区别-受时区影响不同。timestamp会跟随设置的时区变化而变化,而datetime保存的是绝对值不会变化。 详细可以阅读这篇博客的演示: MySQL: Datetime Versus Timestamp Data Types 一个timestamp字段,一个datetime字段,修改时区SET TIME_ZONE = “america/new_york”;后,timestamp字段的值变了! 因此,如果应用场景有跨时区要求的要特别注意这点。 占用存储空间不同。timestamp储存占用4个字节,datetime储存占用8个字节: 12.8 Data Type Storage Requirements 可表示的时间范围不同。timestamp可表示范围:1970-01-01 00:00:00~2038-01-09 03:14:07,datetime支持的范围更宽1000-01-01 00:00:00 ~ 9999-12-31 23:59:59 索引速度不同。timestamp更轻量,索引相对datetime更快。 数值类型 MySQL 的数值数据类型可以大致划分为两个类别,一个是整数,另一个是浮点数或小数。许多不同的子类型对这些类别中的每一个都是可用的,每个子类型支持不同大小的数据,并且 MySQL 允许我们指定数值字段中的值是否有正负之分或者用零填补。 各种数值类型以及它们的允许范围和占用的内存空间。 TINYINT 大小: 1 字节 范围 (有符号) : -128 ~ 127 范围 (无符号) : 0 ~ 255 用途: 小整数值 SMALLINT 大小: 2 字节 范围 (有符号) : -32,768 ~ 32,767 范围 (无符号) : 0 ~ 65,535 用途: 大整数值 MEDIUMINT 大小: 3 字节 范围 (有符号) : -8,388,608,8,388,607 范围 (无符号) : 0,16,777,215 用途: 大整数值 INT 或 INTEGER 大小: 4 字节 范围 (有符号) : -2 147 483 648,2 147 483 647 范围 (无符号) : 0,4 294 967 295 用途: 大整数值 类型 - 大小 范围 (有符号) 范围 (无符号) 用途 BIGINT 8 字节 (-9 233 372 036 854 775 808,9 223 372 036 854 775 807) (0,18 446 744 073 709 551 615) FLOAT 4 字节 (-3.402 823 466 E+38,1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) 0,(1.175 494 351 E-38,3.402 823 466 E+38) 单精度浮点数值 DOUBLE 8 字节 (1.797 693 134 862 315 7 E+308,2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 双精度浮点数值 DECIMAL 对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2 依赖于M和D的值 依赖于M和D的值小数值 ...

2011-12-26 · 4 min · 726 words · -

MySQL用户与权限管理

MySQL用户与权限管理 //创建新用户 user0 cREATE USER user0 IDENTIFIED BY 'password0';``` \***密码要带引号 授权: ```bash grant all privileges on database0.* to user0@localhost identified by 'password0'; 授权之后该用户才能用他自己的用户名密码访问MySQL. 从MySQL删除用户账户 要想移除账户,应使用Drop USER语句. Drop USER user [, user] … Drop USER语句用于删除一个或多个MySQL账户。要使用Drop USER,您必须拥有MySQL数据库的全局Create USER权限或Delete权限。使用与GRANT或REVOKE相同的格式为每个 账户命名;例如,‘jeffrey’@’localhost’。 账户名称的用户和主机部分与用户表记录的User和Host列值相对应。 www.87717.com 使用Drop USER,您可以取消一个账户和其权限,操作如下: Drop USER user; 该语句可以删除来自所有授权表的帐户权限记录。 drop user [username@’%’][1] drop user username@localhost 改密码: grant all privileges on DBNAME.* to user0@localhost identified by ‘password4’; ###’@localhost’ 这个一定要有….. 为root加上密码xxx123: ./bin/MySQLadmin -u root password xxx123 或写成 ...

2011-12-26 · 3 min · 500 words · -

非容器环境运行OpenJPA应用

非容器环境运行OpenJPA应用 参考来源: http://lxy19791111.iteye.com/blog/184113 2.Animal.java package com.openjpa.entity; import javax.persistence.Basic; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.SequenceGenerator; /** * Animal 用于表征系统中的Animal对象,他有两个属性 * id - 编号,编号将由Oracle数据库自动生成 * name - Animal的名称 */ /* Entity注释表示该类是持久化类,的name属性是该实体在查询中对应的唯一名称,默认是类名 */ @Entity public class Animal { // 名称 @Basic private String name; // 编号 /* Id注释表示该字段是标识字段 */ @Id //for oracle //@GeneratedValue(strategy = GenerationType.SEQUENCE, generator="SEQ_ANIMAL") //@SequenceGenerator(name="SEQ_ANIMAL", sequenceName="SEQ_ANIMAL") //for MySQL @GeneratedValue(strategy = GenerationType.IDENTITY) private int id; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } } AnimalDAO.java ...

2011-12-25 · 4 min · 717 words · -

Go mem, Go 内存

Go mem, Go 内存 用户程序(Mutator)会通过内存分配器(Allocator)在堆上申请内存,而垃圾收集器(Collector)负责回收堆上的内存空间,内存分配器和垃圾收集器共同管理着程序中的堆内存空间。 https://draveness.me/golang/docs/part3-runtime/ch07-memory/golang-garbage-collector/

2011-12-25 · 1 min · 6 words · -

gopacket, pcap, libpcap

gopacket, pcap, libpcap gopacket 是 google 出品的 抓取网络数据包的库 Windows 平台下有 Wireshark 抓包工具,其底层抓包库是 npcap (以前是 winpcap); Linux 平台下有 Tcpdump,其抓包库是 libpcap; 而 gopacket 库可以说是 libpcap 和 npcap 的 go 封装,提供了更方便的 go 语言操作接口。 # gopacket 依赖 pcap.h, 安装 libpcap-dev sudo apt install libpcap-dev sudo pacman -S libpcap https://zhuanlan.zhihu.com/p/361737169 https://github.com/google/gopacket https://pkg.go.dev/github.com/google/gopacket?utm_source=godoc bpf filter dst host 192.168.50.10

2011-12-25 · 1 min · 52 words · -

JNDI

JNDI JNDI (Java Naming and Directory Interface,Java命名和目录接口) 是一组在Java应用中访问命名和目录服务的API。命名服务将名称和对象联系起来,使得我们可以用名称访问对象。目录服务是一种命名服务,在这种服务里,对象不但有名称,还有属性。 英文全称是:Java Naming and Directory InterfaceS 术语解释: 一组帮助做多个命名和目录服务接口的API。 JNDI(Java Naming and Directory Interface)是SUN公司提供的一种标准的Java命名系统接口,JNDI提供统一的客户端API,通过不同的访问提供者接口JNDI SPI的实现,由管理者将JNDI API映射为特定的命名服务和目录系统,使得Java应用程序可以和这些命名服务和目录服务之间进行交互。集群JNDI实现了高可靠性JNDI[8],通过服务器的集群,保证了JNDI的负载平衡和错误恢复。在全局共享的方式下,集群中的一个应用服务器保证本地JNDI树的独立性,并拥有全局的JNDI树。每个应用服务器在把部署的服务对象绑定到自己本地的JNDI树的同时,还绑定到一个共享的全局JNDI树,实现全局JNDI和自身JNDI的联系。 JNDI(Java Naming and Directory Interface)是一个应用程序设计的API,为开发人员提供了查找和访问各种命名和目录服务的通用、统一的接口,类似JDBC都是构建在抽象层上。 JNDI可访问的现有的目录及服务有: DNS、XNam 、Novell目录服务、LDAP(Lightweight Directory Access Protocol 轻型目录访问协议)、 CORBA对象服务、文件系统、Windows XP/2000/NT/Me/9x的注册表、RMI、DSML v1&v2、NIS。 JNDI优点 包含了大量的命名和目录服务,使用通用接口来访问不同种类的服务; 可以同时连接到多个命名或目录服务上; 建立起逻辑关联,允许把名称同Java对象或资源关联起来,而不必知道对象或资源的物理ID。 JNDI程序包: javax.naming: 命名操作; javax.naming.directory: 目录操作; javax.naming.event: 在命名目录服务器中请求事件通知; javax.naming.ldap: 提供LDAP支持; javax.naming.spi: 允许动态插入不同实现。 利用JNDI的命名与服务功能来满足企业级API对命名与服务的访问,诸如EJB、JMS、JDBC 2.0以及IIOP上的RMI通过JNDI来使用CORBA的命名服务。 JNDI架构 JNDI架构提供了一组标准的独立于命名系统的API,这些API构建在与命名系统有关的驱动之上。这一层有助于将应用与实际数据源分离,因此不管应用访问的是LDAP、RMI、DNS、还是其他的目录服务。换句话说,JNDI独立于目录服务的具体实现,只要有目录的服务提供接口 (或驱动) ,就可以使用目录。 关于JNDI要注意的重要一点是,它提供了应用编程接口(application programming interface,API)和服务提供者接口(service provider interface,SPI)。这一点的真正含义是,要让应用与命名服务或目录服务交互,必须有这个服务的JNDI服务提供者,这正是JNDI SPI发挥作用的地方。服务提供者基本上是一组类,这些类为各种具体的命名和目录服务实现了JNDI接口—很象JDBC驱动为各种具体的数据库系统实现了JDBC接口一样。作为一个应用开发者,不必操心JNDI SPI。只需要确认要使用的每一个命名或目录服务都有服务提供者。 JNDI组件 1、Javax.naming: 包含了访问命名服务的类和接口。例如,它定义了Context接口,这是命名服务执行查询的入口。 2、Javax.naming.directory: 对命名包的扩充,提供了访问目录服务的类和接口。例如,它为属性增加了新的类,提供了表示目录上下文的DirContext接口,定义了检查和更新目录对象的属性的方法。 3、Javax.naming.event: 提供了对访问命名和目录服务时的时间通知的支持。例如,定义了NamingEvent类,这个类用来表示命名/目录服务产生的事件,定义了侦听NamingEvents的NamingListener接口。 4、Javax.naming.ldap: 这个包提供了对LDAP 版本3扩充的操作和控制的支持,通用包javax.naming.directory没有包含这些操作和控制。 5、Javax.naming.spi: 这个包提供了一个方法,通过javax.naming和有关包动态增加对访问命名和目录服务的支持。这个包是为有兴趣创建服务提供者的开发者提供的。 JNDI用途 命名或目录服务使用户可以集中存储共有信息,这一点在网络应用中是重要的,因为这使得这样的应用更协调、更容易管理。例如,可以将打印机设置存储在目录服务中,以便被与打印机有关的应用使用。 我们大家每天都不知不觉地使用了命名服务。命名系统中的对象可以是DNS记录中的名称、应用服务器中的EJB组件(Enterprise JavaBeans Component)、LDAP(Lightweight Directory Access Protocol)中的用户Profile。 目录服务是命名服务的自然扩展。两者之间的关键差别是目录服务中对象可以有属性 (例如,用户有email地址) ,而命名服务中对象没有属性。因此,在目录服务中,你可以根据属性搜索对象。JNDI允许你访问文件系统中的文件,定位远程RMI注册的对象,访问象LDAP这样的目录服务,定位网络上的EJB组件。 对于象LDAP 客户端、应用launcher、类浏览器、网络管理实用程序,甚至地址薄这样的应用来说,JNDI是一个很好的选择。 JNDI可访问的现有的目录及服务有: DNS、XNam 、Novell目录服务、LDAP(Lightweight Directory Access Protocol 轻型目录访问协议)、 CORBA对象服务、文件系统、Windows XP/2000/NT/Me/9x的注册表、RMI、DSML v1&v2、NIS JNDI与JDBC JNDI提供了一种统一的方式,可以用在网络上查找和访问服务。通过指定一个资源名称,该名称对应于数据库或命名服务中的一个记录,同时返回数据库连接建立所必须的信息。 JNDI主要有两部分组成: 应用程序编程接口和服务供应商接口。应用程序编程接口提供了Java应用程序访问各种命名和目录服务的功能,服务供应商接口提供了任意一种服务的供应商使用的功能。 代码示例: try{ Context cntxt = new InitialContext(); DataSource ds = (DataSource) cntxt.lookup("jdbc/dpt"); } catch(NamingException ne){ ... } JNDI与JMS 消息通信是软件组件或应用程序用来通信的一种方法。JMS就是一种允许应用程序创建、发送、接收、和读取消息的JAVA技术。 代码示例: try{ Properties env = new Properties(); InitialContext inictxt = new InitialContext(env); TopicConnectionFactory connFactory = (TopicConnectionFactory) inictxt.lookup("TTopicConnectionFactory"); ... } catch(NamingException ne){ ... } 访问特定目录: 举个例子,人是个对象,他有好几个属性,诸如这个人的姓名、电话号码、电子邮件地址、邮政编码等属性。通过getAttributes()方法 Attribute attr = directory.getAttributes(personName).get("email"); String email = (String)attr.get(); 通过使用JNDI让客户使用对象的名称或属性来查找对象: foxes = directory.search("o=Wiz,c=US", "sn=Fox", controls); 通过使用JNDI来查找诸如打印机、数据库这样的对象,查找打印机的例子: Printer printer = (Printer)namespace.lookup(printerName); printer.print(document); 浏览命名空间: NamingEnumeration list = namespace.list("o=Widget, c=US"); while (list.hasMore()) { NameClassPair entry = (NameClassPair)list.next(); display(entry.getName(), entry.getClassName()); } 常用的JNDI操作 void bind(String sName,Object object);――绑定: 把名称同对象关联的过程 void rebind(String sName,Object object);――重新绑定: 用来把对象同一个已经存在的名称重新绑定 void unbind(String sName);――释放: 用来把对象从目录中释放出来 Object lookup(String sName);――查找: 返回目录中的一个对象 void rename(String sOldName,String sNewName);――重命名: 用来修改对象名称绑定的名称 NamingEnumeration listBinding(String sName);――清单: 返回绑定在特定上下文中对象的清单列表 NamingEnumeration list(String sName); 代码示例: 重新得到了名称、类名和绑定对象。 NamingEnumeration namEnumList = ctxt.listBinding("cntxtName"); ... while ( namEnumList.hasMore() ) { Binding bnd = (Binding) namEnumList.next(); String sObjName = bnd.getName(); String sClassName = bnd.getClassName(); SomeObject objLocal = (SomeObject) bnd.getObject(); } JNDI 是什么 http://blog.csdn.net/zhaosg198312/article/details/3979435 ...

2011-12-25 · 3 min · 451 words · -

JTA

JTA JTA,即Java Transaction API,译为Java事务API。 JTA允许应用程序执行分布式事务处理——在两个或多个网络计算机资源上访问并且更新数据。JDBC驱动程序的JTA支持极大地增强了数据访问能力。 JTA和JTS Java事务API (JTA: Java Transaction API) 和它的同胞Java事务服务 (JTS: Java Transaction Service) ,为J2EE平台提供了分布式事务服务 (distributed transaction) 。 一个分布式事务 (distributed transaction) 包括一个事务管理器 (transaction manager) 和一个或多个资源管理器(resource manager)。 一个资源管理器 (resource manager) 是任意类型的持久化数据存储。 事务管理器 (transaction manager) 承担着所有事务参与单元者的相互通讯的责任。 JTA与JDBC JTA事务比JDBC事务更强大。一个JTA事务可以有多个参与者,而一个JDBC事务则被限定在一个单一的数据库连接。下列任一个Java平台的组件都可以参与到一个JTA事务中: JDBC连接、JDO PersistenceManager 对象、JMS 队列、JMS 主题、企业JavaBeans (EJB) 、一个用J2EE Connector Architecture 规范编译的资源分配器。

2011-12-25 · 1 min · 48 words · -

B树(B-tree), B+树(B+-tree),B*树(B*-tree)

B树(B-tree), B+树(B+-tree),B树(B-tree) B树(B-tree), B+树(B+-tree), B*树(B*-tree) B树(B-tree) 一颗m阶的B树定义如下: 1)每个结点最多有m-1个关键字。 2)根结点最少可以只有1个关键字。 3)非根结点至少有Math.ceil(m/2)-1个关键字。 4)每个结点中的关键字都按照从小到大的顺序排列,每个关键字的左子树中的所有关键字都小于它,而右子树中的所有关键字都大于它。 5)所有叶子结点都位于同一层,或者说根结点到每个叶子结点的长度都相同。 注意: 之前有看到有很多文章把B树和B-tree理解成了两种不同类别的树,其实这两个是同一种树; 概念: B树和平衡二叉树稍有不同的是B树属于多叉树又名平衡多路查找树 (查找路径不只两个),数据库索引技术里大量使用者B树和B+树的数据结构,让我们来看看他有什么特点; 规则: (1)排序方式:所有节点关键字是按递增次序排列,并遵循左小右大原则; (2)子节点数:非叶节点的子节点数>1,且<=M ,且M>=2,空树除外 (注:M阶代表一个树节点最多有多少个查找路径,M=M路,当M=2则是2叉树,M=3则是3叉); (3)关键字数:枝节点的关键字数量大于等于ceil(m/2)-1个且小于等于M-1个 (注:ceil()是个朝正无穷方向取整的函数 如ceil(1.1)结果为2); (4)所有叶子节点均在同一层、叶子节点除了包含了关键字和关键字记录的指针外也有指向其子节点的指针只不过其指针地址都为null对应下图最后一层节点的空格子; 最后我们用一个图和一个实际的例子来理解B树 (这里为了理解方便我就直接用实际字母的大小来排列C>B>A) B树的查询流程: 如上图我要从上图中找到E字母,查找流程如下 (1)获取根节点的关键字进行比较,当前根节点关键字为M,E<M (26个字母顺序),所以往找到指向左边的子节点 (二分法规则,左小右大,左边放小于当前节点值的子节点、右边放大于当前节点值的子节点); (2)拿到关键字D和G,D<E<G 所以直接找到D和G中间的节点; (3)拿到E和F,因为E=E 所以直接返回关键字和指针信息 (如果树结构里面没有包含所要查找的节点则返回null); B树的插入节点流程 定义一个5阶树 (平衡5路查找树;),现在我们要把3、8、31、11、23、29、50、28 这些数字构建出一个5阶树出来; 遵循规则: (1)节点拆分规则:当前是要组成一个5路查找树,那么此时m=5,关键字数必须<=5-1 (这里关键字数>4就要进行节点拆分); (2)排序规则:满足节点本身比左边节点大,比右边节点小的排序规则; 先插入 3、8、31、11 再插入23、29 再插入50、28 B树节点的删除 规则: (1)节点合并规则:当前是要组成一个5路查找树,那么此时m=5,关键字数必须大于等于ceil (5/2) (这里关键字数<2就要进行节点合并); (2)满足节点本身比左边节点大,比右边节点小的排序规则; (3)关键字数小于二时先从子节点取,子节点没有符合条件时就向向父节点取,取中间值往父节点放; 特点: B树相对于平衡二叉树的不同是,每个节点包含的关键字增多了,特别是在B树应用到数据库中的时候,数据库充分利用了磁盘块的原理 (磁盘数据存储是采用块的形式存储的,每个块的大小为4K,每次IO进行数据读取时,同一个磁盘块的数据可以一次性读取出来)把节点大小限制和充分使用在磁盘快大小范围;把树的节点关键字增多后树的层级比原来的二叉树少了,减少数据查找的次数和复杂度; 3、B+树 概念 B+树是B树的一个升级版,相对于B树来说B+树更充分的利用了节点的空间,让查询速度更加稳定,其速度完全接近于二分法查找。为什么说B+树查找的效率要比B树更高、更稳定;我们先看看两者的区别 规则 (1)B+跟B树不同B+树的非叶子节点不保存关键字记录的指针,只进行数据索引,这样使得B+树每个非叶子节点所能保存的关键字大大增加; (2)B+树叶子节点保存了父节点的所有关键字记录的指针,所有数据地址必须要到叶子节点才能获取到。所以每次数据查询的次数都一样; (3)B+树叶子节点的关键字从小到大有序排列,左边结尾数据都会保存右边节点开始数据的指针。 (4)非叶子节点的子节点数=关键字数 (来源百度百科) (根据各种资料 这里有两种算法的实现方式,另一种为非叶节点的关键字数=子节点数-1 (来源维基百科),虽然他们数据排列结构不一样,但其原理还是一样的Mysql 的B+树是用第一种方式实现); ...

2011-12-24 · 1 min · 122 words · -

mobile apps, iOS apps, android apps, app list, apk

mobile apps, iOS apps, android apps, app list, apk iOS/Android bitwarden plex, 流媒体服务器 macrodroid, 设备自动化, 监控电池电量发 http 请求. otter, 语音转文字 Ingress Prime, 一个 LBS 游戏 APTV, apple tv, ios 看电视频道 name comments 古诗文网 Wander iOS app store redirect: 切换 app store 版本 (中国区/美区) name comments 英语轻松读 surge 网络调试工具 wireguard vpn Chanify 消息推送工具 默沙东诊疗手册 Sun Surveyor Lite 查看太阳轨迹 Star Walk 2 Strongbox keepassxc的ios实现, deprecated, > bitwarden iOS app 美区 wireguard telegram android app, apk list name comments macrodroid 设备自动化 英语轻松读 英语学习 ebuoy english buoy 英语学习 酷安 应用商店 internet speed meter lite 网速监控 随手记 Cellular-Z 移动信号监测 PingTools Network Utilities 炼妖壶 流氓软件管理 半导小蕊 Live Transcribe & Sound Notifications/实时转写和声音通知 语音转文字 RssX DevCheck 手机硬件检测工具 Quizlet 英语学习工具 shareit 茄子快传 Internet Speed Meter Lite 网速监控 F-droid 应用商店 android/chromeos apps android apps Live Transcribe & Notification Name Comments airdroid 文件传输 JuiceSSH Kde connect nplayer 视频播放 automate vysor MicroDroid total command Squid pixelbook 笔记或草稿软件 Infinite Painter 绘画软件 Imaging Edge Mobile Sony 相机远程控制 Sony Headphones Connect, Sony 耳机管理软件 rd client 微软的远程桌面安卓版 EBuoy Learn English through video subtitles AnkiDroid Flashcards sfdroid ...

2011-12-24 · 2 min · 267 words · -

蓝牙配对

蓝牙配对 四中配对模式: Numeric Comparison, Just Works, Out of Band and Passkey Entry。 Numeric Comparison:配对双方都显示一个6位的数字,由用户来核对数字是否一致,一致即可配对。例如手机之间的配对。 Just Works:用于配对没有显示没有输入的设备,主动发起连接即可配对,用户看不到配对过程。例如连接蓝牙耳机。 Passkey Entry:要求配对目标输入一个在本地设备上显示的6位数字,输入正确即可配对。例如连接蓝牙键盘。 Out of Band:两设备的通过别的途径交换配对信息,例如NFC等。例如一些NFC蓝牙音箱。 蓝牙连接需要安全加密,就涉及密钥的生成以及身份认证,通过配对完成这个过程中的交互。 Classic 这四种配对方式,除开JUSTWORK外,都可以防止这两种攻击。JUSTWORK由于不涉及人机交互,所以没法防止中间人攻击(MITM)。 (插一句,传统蓝牙的PIN CODE配对方式就是由于无法防止被动监听攻击 (穷举PIN码)才衍生了这四种SSP简单配对方式。) BLE中LE配对分为4.0版本中的LE LEGACY配对方式以及在BLE4.2版本开始导入的 BLE Secure Connection 配对方式。 前者LEGACY中,配对方式三种,JUSTWORK,PASSKEY ENTRY,以及OOB,JUSTWORK依然无法防止MITM,另外由于秘钥生成方式的缺陷,导致LE LEGACY配对方式无法防止被动监听攻击 (OOB可以防止,因为用了非空中的传输交互)正因为此,BLE4.2版本把Secure connection也引入到了BLE中 (为什么说也,是因为CLASSIC模式中也有SECURE CONNECTION方式…),BLE Secure connection和CLASSIC 的SSP采用同样的ECDH加密方式,所以安全性恢复到同样等级,可以防止被动监听攻击了。 BLE SECURE CONNECTION配对又有了四种配对模式,JUSTWORK,PASSKEY ENTRY,NUMERIC COMP.,以及OOB,同样类同于SSP,JUSTWORK防止不了MITM。以上内容,去蓝牙SPEC4.2及其以后版本里头查阅,大概可以弄清楚。总之,用简单的话来说,配对目的就防止两种攻击,被动监听和MITM,防止MITM需要人机交互操作,所以所有的JUSTWORK都没法防止这种攻击。被动监听目前采用非对称加解密方式,即可破解,所以采用EDCH的SSP以及LE SECURE CONNECTION都能防止这种攻击。 作者:城市牧场 链接:https://www.zhihu.com/question/29076831/answer/201659080 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 作者:何新宇 链接:https://www.zhihu.com/question/29076831/answer/43387340 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 https://www.zhihu.com/question/29076831

2011-12-24 · 1 min · 59 words · -