评价测光

评价测光 http://baike.baidu.com/view/657037.htm 是对于整个画面进行测光, 就是把画面内所有的反射光都混合起来 , 进行评价。 当然, 画面中央区域的光线会被重点考虑。 这个方法的好处是可以轻易获得均衡的画面, 不会出现局部的高光过曝, 整个画面的直方图均衡。 评价测光的缺点是无法满足多种情况,比如,阴影、逆光等等。 佳能的评价测光: 对整个画面进行测光,而对焦点的光线被重点考虑。理论上这个评价测光优于单纯的点测联动 什么是测光: 早期的相机是没有 自动 (AE) 测光功能的,相机的自动测光, 是利用了物体对光线的反射原理。 所有的物体对光线都有反射 (绝对 不反射的 可能叫 “黑体”) , 绝对不反射的物体在地球表面是没有的 (地心有没有, 偶就不知道了) 点测光的原理, 就是 用一个光传感器, 对某一点 进行分析, 测出 该物体的 (一般是被摄主体) 的反射率。 将光线强弱信号 转化成 电信号。。。 这就是 自动测光。。。 经过科学家的研究, 他们发现, 通常 将高反射率 (高调) , 中等反射率 (灰调) 和低反射率的 (低调) 反射光 混合后, 一般是 18% 的反射率 (中灰色调) 这样, 相机的知道测光系统 就以 18% 灰 为 标准, 反射率超过 18%, 相机就认为是 过曝了, 需要调低曝光量 (调小 光圈, 或调快 快门) 反之就是欠曝, 需要增加曝光量。。。 ...

2012-06-01 · 1 min · 82 words · -

构造函数重载

构造函数重载 http://topic.csdn.net/t/20020411/13/638295.html 构造函数重载: 一个类的构造函数之间可以相互调用。当一个构造函数调用另一个构造函数时,可以使用关键字this,同时这个调用语句应该是整个构造函数的第一个可执行语句。 D200_Card(){ } D200_Card(long cn){ this(); cardNumber=cn; } D200_Card(long cn,int pw) { this(cn); password=pw; } D200_Card(long cn,int pw,double b) { this(cn,pw); balance=b; }

2012-06-01 · 1 min · 26 words · -

gocd

gocd podman run -d --name gocd-server -p8153:8153 -v /etc/localtime:/etc/localtime:ro gocd/gocd-server:v21.4.0 podman run -d --name gocd-agent -e GO_SERVER_URL=https://gocd.wiloon.com/go gocd/gocd-agent-alpine-3.15:v21.4.0

2012-05-29 · 1 min · 18 words · -

java math

java math // 取整 (/) 求余 (%) public class MathX { public static void main(String[] args) { System.out.println(5 / 3); System.out.println(5 / 3.0); System.out.println(5 % 3); } } //1 //1.6666666666666667 //2 幂指数值的运算 Math.pow(double a,double b),返回的结果是a的b次方。 求整数的位数 private static int getNumLenght(long num){ num = num>0?num:-num; if (num==0) { return 1; } return (int) Math.log10(num)+1; } 3075436Math.ceil(x):比x大的最小值。 Math.round(x): 四舍五入。 Math.floor(x):比x小的最大值。 ...

2012-05-29 · 6 min · 1112 words · -

java 各种数据类型转换

java 各种数据类型转换 String > Double String str="122.202"; double dnum = Double.parseDouble(str); hex > int // 默认hex 大端字节序 int decimal = Integer.parseInt(hexNumber, 16); list > array>set Set<T> mySet = new HashSet<>(Arrays.asList(someArray)); array > set, java 9+ Set<T> mySet = Set.of(someArray); array > set, java 10+ var mySet = Set.of(someArray); int > double Double d = new Double(i) double > int int i = d.intValue(); byte to binary string byte b1 = (byte) 129; String s1 = String.format("%8s", Integer.toBinaryString(b1 & 0xFF)).replace(' ', '0'); System.out.println(s1); // 10000001 date localdatetime Instant instant = date.toInstant(); ZoneId zoneId = ZoneId.systemDefault(); instant.atZone(zoneId).toLocalDateTime(); int > bytes byte[] bytes = ByteBuffer.allocate(4).putInt(i).array(); public static byte[] int2Bytes(int value) { byte[] out = new byte[4]; for (int i = 0; i < 4; i++) { out[i] = (byte) (value >> (8 * (4 - i - 1))); } return out; } public static int bytes2Int(byte[] value) { int out = 0; if (value != null && value.length == 4) { for (int i = 0; i < 4; i++) { out |= (value[i] & 0xFF) << (8 * (4 - i - 1)); } } return out; } value & 0xFF It sets result to the (unsigned) value resulting from putting the 8 bits of value in the lowest 8 bits of result. ...

2012-05-29 · 4 min · 668 words · -

java中取小数点后两位

java中取小数点后两位 http://www.cnblogs.com/sharewind/archive/2007/08/29/873802.html 一 Long是长整型,怎么有小数,是double吧 java.text.DecimalFormat df=new java.text.DecimalFormat("#.##"); double d=3.14159; System.out.println(df.format(d)); 二 java.math.BigDecimal BigDecimal bd = new BigDecimal(“3.14159265”); bd = bd.setScale(2,BigDecimal.ROUND_HALF_UP); 三 class Test1{ public static void main(String[] args){ double ret = convert(3.14159); System.out.println(ret); } static double convert(double value){ long l1 = Math.round(value*100); //四舍五入 double ret = l1/100.0; //注意: 使用 100.0 而不是 100 return ret; } } 四 double d = 13.4324; d=((int)(d*100))/100; ...

2012-05-28 · 1 min · 64 words · -

一致性哈希算法与Java实现

一致性哈希算法与Java实现 一致性哈希算法, consistent hashing 概述 引出 登场 改进-虚节点 另一种改进 参考链接: 概述 在维基百科中,是这么定义的 一致哈希是一种特殊的哈希算法。在使用一致哈希算法后,哈希表槽位数 (大小) 的改变平均只需要对 K/n个关键字重新映射,其中K是关键字的数量, n是槽位数量。然而在传统的哈希表中,添加或删除一个槽位的几乎需要对所有关键字进行重新映射。 引出 我们在上文中已经介绍了一致性Hash算法的基本优势,我们看到了该算法主要解决的问题是: 当slot数发生变化时,能够尽量少的移动数据。那么,我们思考一下,普通的Hash算法是如何实现?又存在什么问题呢? 那么我们引出一个问题: 假设有1000w个数据项,100个存储节点,请设计一种算法合理地将他们存储在这些节点上。 看一看普通Hash算法的原理: normal_hash 算法的核心计算如下 1 2 3 4 5 6 for item in range(ITEMS): k = md5(str(item)).digest() h = unpack_from(">I", k)[0] # 通过取余的方式进行映射 n = h % NODES node_stat[n] += 1 具体的完整实现请参考normal_hash.py,输出是这样的: Ave: 100000 Max: 100695 (0.69%) Min: 99073 (0.93%) 从上述结果可以发现,普通的Hash算法均匀地将这些数据项打散到了这些节点上,并且分布最少和最多的存储节点数据项数目小于1%。之所以分布均匀,主要是依赖Hash算法 (实现使用的MD5算法) 能够比较随机的分布。 然而,我们看看存在一个问题,由于该算法使用节点数取余的方法,强依赖node的数目,因此,当是node数发生变化的时候,item所对应的node发生剧烈变化,而发生变化的成本就是我们需要在node数发生变化的时候,数据需要迁移,这对存储产品来说显然是不能忍的,我们观察一下增加node后,数据项移动的情况: 1 2 3 4 5 6 7 8 9 for item in range(ITEMS): k = md5(str(item)).digest() h = unpack_from(">I", k)[0] # 原映射结果 n = h % NODES # 现映射结果 n_new = h % NEW_NODES if n_new != n: change += 1 详细实现代码在normal_hash_add.py输出是这样的: Change: 9900989 (99.01%) 翻译一下就是,如果有100个item,当增加一个node,之前99%的数据都需要重新移动。 这显然是不能忍的,普通哈希算法的问题我们已经发现了,如何对其进行改进呢?没错,我们的一致性哈希算法闪亮登场。 登场 我们上节介绍了普通Hash算法的劣势,即当node数发生变化 (增加、移除) 后,数据项会被重新"打散",导致大部分数据项不能落到原来的节点上,从而导致大量数据需要迁移。 那么,一个亟待解决的问题就变成了: 当node数发生变化时,如何保证尽量少引起迁移呢?即当增加或者删除节点时,对于大多数item,保证原来分配到的某个node,现在仍然应该分配到那个node,将数据迁移量的降到最低。 一致性Hash算法的原理是这样的: consist_hash 1 2 3 4 5 6 7 8 9 10 for n in range(NODES): h = _hash(n) ring.append(h) ring.sort() hash2node[h] = n for item in range(ITEMS): ...

2012-05-28 · 3 min · 617 words · -

BoltDB

BoltDB BoltDB是一个嵌入式key/value的数据库,即只需要将其链接到你的应用程序代码中即可使用BoltDB提供的API来高效的存取数据。而且BoltDB支持完全可序列化的ACID事务,让应用程序可以更简单的处理复杂操作。 BoltDB设计源于LMDB,具有以下特点: 直接使用API存取数据,没有查询语句; 支持完全可序列化的ACID事务,这个特性比LevelDB强; 数据保存在内存映射的文件里。没有wal、线程压缩和垃圾回收; 通过COW技术,可实现无锁的读写并发,但是无法实现无锁的写写并发,这就注定了读性能超高,但写性能一般,适合与读多写少的场景。 最后,BoltDB使用Golang开发,而且被应用于influxDB项目作为底层存储。 LevelDB 和 BoltDB 都是k/v非关系型数据库。 LevelDB没有事务,LevelDB实现了一个日志结构化的merge tree。它将有序的key/value存储在不同文件的之中,通过db, _ := leveldb.OpenFile(“db”, nil),在db目录下有很多数据文件,并通过“层级”把它们分开,并且周期性地将小的文件merge为更大的文件。这让其在随机写的时候会很快,但是读的时候却很慢。 这也让LevelDB的性能不可预知:但数据量很小的时候,它可能性能很好,但是当随着数据量的增加,性能只会越来越糟糕。而且做merge的线程也会在服务器上出现问题。 LSM树而且通过批量存储技术规避磁盘随机写入问题。 LSM树的设计思想非常朴素,它的原理是把一颗大树拆分成N棵小树, 它首先写入到内存中 (内存没有寻道速度的问题,随机写的性能得到大幅提升),在内存中构建一颗有序小树,随着小树越来越大,内存的小树会flush到磁盘上。磁盘中的树定期可以做merge操作,合并成一棵大树,以优化读性能。 BoltDB会在数据文件上获得一个文件锁,所以多个进程不能同时打开同一个数据库。BoltDB使用一个单独的内存映射的文件(.db),实现一个写入时拷贝的B+树,这能让读取更快。而且,BoltDB的载入时间很快,特别是在从crash恢复的时候,因为它不需要去通过读log去找到上次成功的事务,它仅仅从两个B+树的根节点读取ID。 BoltDB支持完全可序列化的ACID事务,让应用程序可以更简单的处理复杂操作。 BoltDB设计源于LMDB,具有以下特点: 直接使用API存取数据,没有查询语句; 支持完全可序列化的ACID事务,这个特性比LevelDB强; 数据保存在内存映射的文件里。没有wal、线程压缩和垃圾回收; 通过COW技术,可实现无锁的读写并发,但是无法实现无锁的写写并发,这就注定了读性能超高,但写性能一般,适合与读多写少的场景。 最后,BoltDB使用Golang开发,而且被应用于influxDB项目作为底层存储。 LMDB的全称是Lightning Memory-Mapped Database(快如闪电的内存映射数据库),它的文件结构简单,包含一个数据文件和一个锁文件. LMDB文件可以同时由多个进程打开,具有极高的数据存取速度,访问简单,不需要运行单独的数据库管理进程,只要在访问数据的代码里引用LMDB库,访问时给文件路径即可。 让系统访问大量小文件的开销很大,而LMDB使用内存映射的方式访问文件,使得文件内寻址的开销非常小,使用指针运算就能实现。数据库单文件还能减少数据集复制/传输过程的开销。 https://wizardforcel.gitbooks.io/go42/content/content/42_40_kvdb.html

2012-05-28 · 1 min · 37 words · -

joda-time, ThreeTen Backport

DateTimeUtils.toDate(LocalDateTime.now().minusDays(1).atZone(ZoneId.systemDefault()).toInstant()) DateTimeFormatter formatterYMDHMSS = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"); LocalDateTime localDateTime =LocalDateTime.now(); String str = localDateTime.format(formatterYMDHMSS); LocalDateTime localDateTime = LocalDateTime.of(2016, 12, 13, 14, 13, 01, 1000000); #local date time to milli. LocalDateTime ldt = LocalDateTime.of(2014, 5, 29, 18, 41, 16); ZonedDateTime zdt = ldt.atZone(ZoneId.of("America/Los_Angeles")); long millis = zdt.toInstant().toEpochMilli(); http://www.jianshu.com/p/efdeda608780 threeten backport LocalDatetime to java.util.date http://blog.joda.org/2014/07/threeten-backport-vs-joda-time.html http://www.threeten.org/threetenbp/ package com.baidu.test; import java.util.Date; import org.joda.time.DateTime; import org.joda.time.format.DateTimeFormat; public class TestJodaTime { public static void main(String[] args) { DateTime dt = new DateTime();// 取得当前时间 // 根据指定格式,将时间字符串转换成DateTime对象 DateTime dt2 = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss").parseDateTime("1985-12-26 23:23:31"); // 年,月,日,时,分,秒,毫秒 DateTime dt3 = new DateTime(2011, 2, 13, 10, 30, 50, 333);// 2010年2月13日10点30分50秒333毫秒 // 判断是否闰月 DateTime dt4 = new DateTime(); org.joda.time.DateTime.Property month = dt4.monthOfYear(); System.out.println("是否闰月:" + month.isLeap()); // 取得 3秒前的时间 DateTime dt5 = dt.secondOfMinute().addToCopy(-3); dt.getSecondOfMinute();// 得到整分钟后,过的秒钟数 dt.getSecondOfDay();// 得到整天后,过的秒钟数 dt.secondOfMinute();// 得到分钟对象,例如做闰年判断等使用 // DateTime与java.util.Date对象,当前系统TimeMillis转换 DateTime dt6 = new DateTime(new Date()); Date date = dt.toDate(); DateTime dt7 = new DateTime(System.currentTimeMillis()); dt.getMillis(); // 将dt对象,按照指定格式输出字符串 System.out.println(dt.toString("yyyy-MM-dd HH:mm:ss")); } } 日期比较 ...

2012-05-28 · 1 min · 190 words · wiloon

java.lang.OutOfMemoryError, PermGen space

‘java.lang.OutOfMemoryError, PermGen space’ http://peak.iteye.com/blog/52606 JavaTomcatJVMLinuxWeb 这个问题是我的工程中加入了Birt报表在Linux环境下运行出现的问题,从网上搜索了一下看到这文章发现并不是由于Birt的原因造成的 引用 PermGen space的全称是Permanent Generation space,是指内存的永久保存区域OutOfMemoryError: PermGen space从表面上看就是内存益出,解决方法也一定是加大内存。说说为什么会内存益出: 这一部分用于存放Class和Meta的信息,Class在被 Load的时候被放入PermGen space区域,它和和存放Instance的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的APP会LOAD很多CLASS的话,就很可能出现PermGen space错误。这种错误常见在web服务器对JSP进行pre compile的时候。 改正方法: -Xms256m -Xmx256m -XX:MaxNewSize=256m -XX:MaxPermSize=256m 在tomcat中redeploy时出现outofmemory的错误. 可以有以下几个方面的原因: 1,使用了proxool,因为proxool内部包含了一个老版本的cglib. 2, log4j,最好不用,只用common-logging 3, 老版本的cglib,快点更新到最新版。 4,更新到最新的hibernate3.2 这里以tomcat环境为例,其它WEB服务器如jboss,weblogic等是同一个道理。 一、java.lang.OutOfMemoryError: PermGen space PermGen space的全称是Permanent Generation space,是指内存的永久保存区域, 这块内存主要是被JVM存放Class和Meta信息的,Class在被Loader时就会被放到PermGen space中, 它和存放类实例(Instance)的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对 PermGen space进行清理,所以如果你的应用中有很多CLASS的话,就很可能出现PermGen space错误, 这种错误常见在web服务器对JSP进行pre compile的时候。如果你的WEB APP下都用了大量的第三方jar, 其大小 超过了jvm默认的大小(4M)那么就会产生此错误信息了。 解决方法: 手动设置MaxPermSize大小 修改TOMCAT_HOME/bin/catalina.sh 在"echo “Using CATALINA_BASE: $CATALINA_BASE"“上面加入以下行: JAVA_OPTS="-server -XX:PermSize=64M -XX:MaxPermSize=128m 建议: 将相同的第三方jar文件移置到tomcat/shared/lib目录下,这样可以达到减少jar 文档重复占用内存的目的。 二、java.lang.OutOfMemoryError: Java heap space ...

2012-05-28 · 1 min · 138 words · -

进程优先级

进程优先级 linux 进程优先级 为什么要有进程优先级?这似乎不用过多的解释,毕竟自从多任务操作系统诞生以来,进程执行占用cpu的能力就是一个必须要可以人为控制的事情。因为有的进程相对重要,而有的进程则没那么重要。 本文作者: 邹立巍 Linux系统技术专家。目前在腾讯SNG社交网络运营部 计算资源平台组,负责内部私有云平台的建设和架构规划设计。 曾任新浪动态应用平台系统架构师,负责微博、新浪博客等重点业务的内部私有云平台架构设计和运维管理工作。 进程优先级起作用的方式从发明以来基本没有什么变化,无论是只有一个cpu的时代,还是多核cpu时代,都是通过控制进程占用cpu时间的长短来实现的。就是说在同一个调度周期中,优先级高的进程占用的时间长些,而优先级低的进程占用的短些。 从这个角度看,进程优先级其实也跟cgroup的cpu限制一样,都是一种针对cpu占用的QOS机制。我曾经一直很困惑一点,为什么已经有了优先级,还要再设计一个针对cpu的cgroup?得到的答案大概是因为,优先级这个值不能很直观的反馈出资源分配的比例吧? 不过这不重要,实际上从内核目前的进程调度器cfs的角度说,同时实现cpushare方式的cgroup和优先级这两个机制完全是相同的概念,并不会因为增加一个机制而提高什么实现成本。既然如此,而cgroup又显得那么酷,那么何乐而不为呢? 在系统上我们最熟悉的优先级设置方式是nice和renice命令。那么我们首先解释一个概念,什么是: NICE值 nice值应该是熟悉Linux/UNIX的人很了解的概念了,我们都知它是反应一个进程“优先级”状态的值,其取值范围是-20至19,一共40个级别。这个值越小,表示进程”优先级”越高,而值越大“优先级”越低。我们可以通过nice命令来对一个将要执行的命令进行nice值设置,方法是: [root@zorrozou-pc0 zorro]# nice -n 10 bash 这样我就又打开了一个bash,并且其nice值设置为10,而默认情况下,进程的优先级应该是从父进程继承来的,这个值一般是0。我们可以通过nice命令直接查看到当前shell的nice值 [root@zorrozou-pc0 zorro]# nice 10 对比一下正常情况: [root@zorrozou-pc0 zorro]# exit 推出当前nice值为10的bash,打开一个正常的bash: [root@zorrozou-pc0 zorro]# bash [root@zorrozou-pc0 zorro]# nice 0 另外,使用renice命令可以对一个正在运行的进程进行nice值的调整,我们也可以使用比如top、ps等命令查看进程的nice值,具体方法我就不多说了,大家可以参阅相关manpage。 需要大家注意的是,我在这里都在使用nice值这一称谓,而非优先级priority这个说法。当然,nice和renice的man手册中,也说的是priority这个概念,但是要强调一下,请大家真的不要混淆了系统中的这两个概念,一个是nice值,一个是priority值,他们有着千丝万缕的关系,但对于当前的Linux系统来说,它们并不是同一个概念。 我们看这个命令: [root@zorrozou-pc0 zorro]# ps -l F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 4 S 0 6924 5776 0 80 0 - 17952 poll_s pts/5 00:00:00 sudo 4 S 0 6925 6924 0 80 0 - 4435 wait pts/5 00:00:00 bash 0 R 0 12971 6925 0 80 0 - 8514 - pts/5 00:00:00 ps 大家是否真的明白其中PRI列和NI列的具体含义有什么区别?同样的,如果是top命令: ...

2012-05-26 · 5 min · 1065 words · -

getconf

getconf, 查看系统变量 我们时常需要查询系统相关的信息,比如页面大小,整数大小之类,如果编写程序去计算会比较繁琐,这里有一个很有用的命令,可以用来获取系统相关信息。它就是 getconf。 getconf 用途将系统配置变量值写入标准输出,比如: getconf PAGE_SIZE 查看系统内存分页大小 getconf LONG_BIT 看linux是32位还是64位最简单的方法 getconf -a 查看全部系统变量 getconf INT_MAX 2147483647 getconf LONG_BIT 64 可以取得的相关信息如下(参考相关资料,在又在版本上会有些不同): _CS_PATH Value for the PATH environment variable used to find commands. ARG_MAX Maximum length, in bytes, of the arguments for one of the exec subroutines, including environment data. ARG_MAX 值 不能改, 要修改只能重新编译内核 BC_BASE_MAX Maximum value allowed for the obase variable with the bc command. BC_DIM_MAX Maximum number of elements permitted in an array by the bc command. BC_SCALE_MAX Maximum value allowed for the scale variable with the bc command. BC_STRING_MAX Maximum length of a string constant accepted by the bc command. CHARCLASS_NAME_MAX Maximum number of bytes in a character class name. CHAR_BIT Number of bits in a type character. CHAR_MAX Maximum value of a type character. CHAR_MIN Minimum value of a type character. CHILD_MAX Maximum number of simultaneous processes for each real user ID. CLK_TCK Number of clock ticks per second returned by the time subroutine. COLL_WEIGHTS_MAX Maximum number of weights that can be assigned to an entry in the LC_COLLATE locale stanza in a locale-definition file. CS_PATH Value of the PATH environment variable used to find commands. EXPR_NEST_MAX Maximum number of expressions that can be nested within parentheses by the expr command. INT_MAX Maximum value of a type int. INT_MIN Minimum value of a type int. LINE_MAX Maximum length, in bytes, of a command's input line (either standard input or another file) when the utility is described as processing text files. The length includes room for the trailing new-line character. LONG_BIT Number of bits in a type long int. LONG_MAX Maximum value of a type long int. LONG_MIN Minimum value of a type long int. MB_LEN_MAX Maximum number of bytes in a character for any supported locale. NGROUPS_MAX Maximum number of simultaneous supplementary group IDs for each process. NL_ARGMAX Maximum value of digit in calls to the printf and scanf subroutines. NL_LANGMAX Maximum number of bytes in a LANG name. NL_MSGMAX Maximum message number. NL_NMAX Maximum number of bytes in an N-to-1 collation mapping. NL_SETMAX Maximum set number. NL_TEXTMAX Maximum number of bytes in a message string. NZERO Default process priority. OPEN_MAX Maximum number of files that one process can have open at one time. PATH Sequence of colon-separated path prefixes used to find commands. RE_DUP_MAX Maximum number of repeated occurrences of a regular expression permitted when using the interval-notation parameters, such as the m and n parameters with the ed command. SCHAR_MAX Maximum value of a type signed char. SCHAR_MIN Minimum value of a type signed char. SHRT_MAX Maximum value of a type short. SHRT_MIN Minimum value of a type short. SSIZE_MAX Maximum value of an object of type ssize_t. STREAM_MAX Number of streams that one process can have open at one time. TMP_MAX Minimum number of unique path names generated by the tmpnam subroutine. Maximum number of times an application can reliably call the tmpnam subroutine. TZNAME_MAX Maximum number of bytes supported for the name of a time zone (not the length of the TZ environment variable). UCHAR_MAX Maximum value of a type unsigned char. UINT_MAX Maximum value of a type unsigned int. ULONG_MAX Maximum value of a type unsigned long int. USHRT_MAX Maximum value of a type unsigned short int. WORD_BIT Number of bits in a word or type int https://www.cnblogs.com/wjoyxt/p/4815782.html

2012-05-26 · 3 min · 547 words · -

FTP的主动模式和被动模式

FTP的主动模式和被动模式 http://space.itpub.net/14075938/viewspace-495630 FTP两种工作模式: 主动****模式(ActiveFTP) 和被动模式(PassiveFTP) 在主动模式下,FTP客户端随机开启一个大于1024的端口N向服务器的21号端口发起连接,然后开放N+1号端口进行监听,并向服务器发出PORT N+1命令。服务器接收到命令后,会用其本地的FTP数据端口 (通常是20) 来连接客户端指定的端口N+1,进行数据传输。 在被动模式下,FTP库户端随机开启一个大于1024的端口N向服务器的21号端口发起连接,同时会开启N+1号端口。然后向服务器发送PASV命令,通知服务器自己处于被动模式。服务器收到命令后,会开放一个大于1024的端口P进行监听,然后用PORT P命令通知客户端,自己的数据端口是P。客户端收到命令后,会通过N+1号端口连接服务器的端口P,然后在两个端口之间进行数据传输。 总的来说,主动模式的FTP是指服务器主动连接客户端的数据端口,被动模式的FTP是指服务器被动地等待客户端连接自己的数据端口。 被动模式的FTP通常用在处于防火墙之后的FTP客户访问外界FTp服务器的情况,因为在这种情况下,防火墙通常配置为不允许外界访问防火墙之后主机,而只允许由防火墙之后的主机发起的连接请求通过。因此,在这种情况下不能使用主动模式的FTP传输,而被动模式的FTP可以良好的工作。 win 下面设置ftp模式 一、什么是PASV和PORT方式 (1) PORT其实是Standard模式的另一个名字,又称为Active模式。中文意思是"主动模式。 (2) PASV也就是Passive的简写。中文就是"被动模式。 二、两者不同 不同之处是由于PORT (主动) 这个方式需要在接上TCP 21端口后,服务器通过自己的TCP 20来发出数据。并且需要建立一个新的连接来传送档案。而PORT的命令包含一些客户端没用的资料,所以有了PASv的出现。而PASV模式拥有PORT模式的优点,并去掉一些PORT的缺点。PASV运行方式就是当服务器接收到客户端连接请求时,就会自动从端口1024到5000中随机选择一个和客户端建立连接传递数据。由于被动且自动建立连接,容易受到攻击,所以安全性差。 三、常见的FTP客户端软件PORT方式与PASV方式的切换方法 大部分FTP客户端默认使用PASV方式。IE默认使用PORT方式。 在大部分FTP客户端的设置里,常见到的字眼都是"PASV"或"被动模式",极少见到"PORT"或"主动模式"等字眼。因为FTP的登录方式只有两种: PORT和PASV,取消PASV方式,就意味着使用PORT方式。 (1) IE: 工具 -> Internet选项 -> 高级 -> “使用被动FTP” (需要IE6.0以上才支持) 。 (2) CuteFTP: Edit -> Setting -> Connection -> Firewall -> “PASV Mode” 或File -> Site Manager,在左边选中站点 -> Edit -> “Use PASV mode” 。 (3) FlashGet: 工具 -> 选项 -> 代理服务器 -> 直接连接 -> 编辑 -> “PASV模式”。 ...

2012-05-26 · 2 min · 255 words · -

iptables防火墙与vsftpd的被动传输模式

iptables防火墙与vsftpd的被动传输模式 Linux服务器上开启了防火墙,并配置vsftpd,就出现了一些问题 可以连接,列出目录,但是无法下载/上传,经过检查,是受FTP传输模式影响导致。 iptables的配置策略往往就限制入站的目的端口,ftp服务器使用标准的21端口作为控制端口,但是数据的传输端口取决于传输模式 主动模式: 服务器以源端口20或随机端口向客户端的协商的随机端口发起链接,也就是说,这时两边防火墙的策略应该是: 服务器端应该允许目标端口为20的入站连接,允许所有随机端口的出站连接 当然,服务器是否以20为源端口连接,取决于/etc/vsftpd.conf是否设置 connect_from_port_20=YES 客户端应该允许所有源端口为20的入站连接,允许所有随机端口的出站连接 被动模式: 客户端以随机连接服务器的某个随机端口 (通过21端口协商得到) 如此, 如果客户端使用了NAT或是有防火墙,问题就变得复杂多了。 在主动模式下,服务器连接客户端 (即客户端NAT主机的公网IP) 随机端口,肯定会失败的,所以客户端使用NAT时,不能使用主动模式,同理,如果客户端使用防火墙,只允许指定的入站端口连接,那么也会失败。 如果使用被动模式呢?也有问题,因为客户端是连接服务器的随机端口(服务器只允许指定入站端口连接),也会出问题,那么对于vsftpd, 解决办法就是: 1.vsftpd 使用被动模式,并设定被动模式监听的端口范围 2.服务器防火墙允许到此范围端口的入站连接 对vsftpd的配置: pasv_enable=YES //使用被动模式,等待客户端连接 pasv_min_port=50000 //被动模式时监听的端口范围下限 pasv_max_port=50100//被动模式时监听的端口范围上限 对iptables的配置 -A RH-Firewall-1-INPUT -p tcp -m tcp -dport 50000:50100 -j ACCEPT 当然,客户端需要设置为被动方式连接 http://zhangxugg-163-com.iteye.com/blog/867422

2012-05-26 · 1 min · 42 words · -

debian VSFTPD

debian VSFTPD install vsftpd sudo apt-get install vsftpd 1. 匿名服务器的连接 (独立的服务器) 在/etc/vsftpd/vsftpd.conf配置文件中添加如下几项: Anonymous_enable=yes (允许匿名登陆) Dirmessage_enable=yes (切换目录时,显示目录下.message的内容) Local_umask=022 (FTP上本地的文件权限,默认是077) connect_from_port_20=YES 启用FTP数据端口的数据连接,http://www.wiloon.com/?p=3234 Xferlog_enable=yes (激活上传和下传的日志) Xferlog_std_format=yes (使用标准的日志格式) Ftpd_banner=XXXXX (欢迎信息) Pam_service_name=vsftpd (验证方式) * Listen=yes 这将告诉vsftpd工作于standalone模式。不要从inetd中运行该设定下的vsftpd,否则将不会工作,你将得到错误信息: could not bind listening socket. 功能: 只能连接FTP服务器,不能上传和下传 注: 其中所有和日志欢迎信息相关连的都是可选项,打了星号的无论什么帐户都要添加,是属于FTP的基本选项 2. 开启匿名FTP服务器上传权限 在配置文件中添加以下的信息即可: Anon_upload_enable=yes (开放上传权限) Anon_mkdir_write_enable=yes (可创建目录的同时可以在此目录中上传文件) Write_enable=yes (开放本地用户写的权限) Anon_other_write_enable=yes (匿名帐号可以有删除的权限) 3. 开启匿名服务器下传的权限 在配置文件中添加如下信息即可: Anon_world_readable_only=no 注: 要注意文件夹的属性,匿名帐户是其它 (other) 用户要开启它的读写执行的权限 (R) 读–下传 (W) 写–上传 (X) 执行–如果不开FTP的目录都进不去 4.普通用户FTP服务器的连接 (独立服务器) 在配置文件中添加如下信息即可: Local_enble=yes (本地帐户能够登陆) Write_enable=no (本地帐户登陆后无权删除和修改文件) ...

2012-05-26 · 3 min · 460 words · -

sysv-rc-conf

sysv-rc-conf sysv-rc-conf是一个强大的服务管理程序,群众的意见是sysv-rc-conf比chkconfig好用。 Ubuntu运行级别 Linux 系统任何时候都运行在一个指定的运行级上,并且不同的运行级的程序和服务都不同,所要完成的工作和要达到的目的都不同,系统可以在这些运行级之间进行切换,以完成不同的工作。 Ubuntu 的系统运行级别: 0 系统停机状态 1 单用户或系统维护状态 2~5 多用户状态 6 重新启动 查看当前运行级别,执行命令: runlevel ( runlevel 显示上次的运行级别和当前的运行级别,"N"表示没有上次的运行级别。) 切换运行级别,执行命令: init [0123456Ss] ( 即在 init 命令后跟一个参数,此参数是要切换到的运行级的运行级代号,如: 用 init 0 命令关机;用 init 6 命令重新启动。) 三、Linux 系统主要启动步骤: 1. 读取 MBR 的信息,启动 Boot Manager Windows 使用 NTLDR 作为 Boot Manager,如果您的系统中安装多个 版本的 Windows,您就需要在 NTLDR 中选择您要进入的系统。 Linux 通常使用功能强大,配置灵活的 GRUB 作为 Boot Manager。 2. 加载系统内核,启动 init 进程 init 进程是 Linux 的根进程,所有的系统进程都是它的子进程。 3. 进程读取 init 进程读取 /etc/inittab 文件中的信息,并进入预设的运行级别, 按顺序运行该运行级别对应文件夹下的脚本。脚本通常以 start 参数启 动,并指向一个系统中的程序。 通常情况下, /etc/rcS.d/ 目录下的启动脚本首先被执行,然后是 /etc/rcN.d/ 目录。例如您设定的运行级别为 3,那么它对应的启动 目录为 /etc/rc3.d/ 。 4. 根据对应脚本启动服务器 根据 /etc/rcS.d/ 文件夹中对应的脚本启动 Xwindow 服务器 xorg Xwindow 为 Linux 下的图形用户界面系统。 5. 启动登录管理器,等待用户登录 Ubuntu 系统默认使用 GDM 作为登录管理器,您在登录管理器界面中 输入用户名和密码后,便可以登录系统。(您可以在 /etc/rc3.d/ 文件夹中找到一个名为 S13gdm 的链接) 四、安装sysv-rc-conf sudo apt-get install sysv-rc-conf 五、使用sysv-rc-conf sudo sysv-rc-conf 操作界面十分简洁,你可以用鼠标点击,也可以用键盘方向键定位,用空格键选择,用Ctrl+N翻下一页,用Ctrl+P翻上一页,用Q退出。其中,"X"表示开启该服务。 六 、部分服务优化推荐及介绍 acpi-support 这个是关于电源支持的默认是1,2,3,4,5下启动,我认为你可以把它调整到s级别。 acpid acpi的守护程序,默认是2-5开启,我认为可以不用管。 alsa alsa声音子系统,应该不用开启它。 alsa-utils 这个服务似乎取代了alsa,所以开启这个就可以了,我在S级别开启它。 anacron 这是一个用于执行到时间没有执行的程序的服务,我认为它无所谓,所以关了它,这个可以随便。 apmd 也是一种电源管理,我认为电脑如果不是很老,它就没有开启的必要了。 atd 和anacron类似,我把它关了。 bluez-utiles 传说中的蓝牙服务,然后遗憾我没有,所以关了。 bootlogd 似乎使用来写log的,安全期间开着他也许比较好。 cron 指定时间运行程序的服务,所以开着比较好的。 cupsys 打印机服务,所以如果你有,就开启吧。 dbus 消息总线系统,非常重要,一定要开。 dns-clean 拨号连接用的,如果不用,就关了它。 evms 企业卷管理系统,由于我并不明白什么叫做企业卷,所以我关了它。 fetchmail 用于邮件守护,我关了它。 gdm gnome桌面管理器,我关了它,然后用startx启动gnome。 halt 关机用的,不要更改 hdparm 这个我刚才有讲,如果没有ide硬盘也就不用开启它了。 hotkey-setup 这个是给某些品牌笔记本设计的热键映射,台式机用户请关了它 hotplug 这个是用于热插拔的,我已经测试过了,在某些电脑上关闭它会使声卡无效,请在S级别开启它。 hplip hp打印机专用的,应该可以关了它。 ifrename 网络接口重命名,好像没用,关了。 ifupdown 这个使用来打开网络的,开着它。 ifupdown-clean 同上。 klogd linux守护程序,接受来自内核和发送信息到syslogd的记录,并记录为一个文件,所以请开着它。 linux-restricted-modules-common 这个使用来使用受限制的模块的,你可以从/lib/linux-restricted-modules下查看,如果没有什么,你可以关掉它。 lvm 逻辑卷管理器,如果你没有请关了它。 makedev 用来创建设备到/dev/请不要动他。 mdamd 管理raid用,如果你没有请关闭它。 module-init-tools 从/etc/modules 加在扩展模块的,这个一般开着。 networking 增加网络接口和配置dns用,将它开启。 ntp-server 与ubuntu时间服务器进行同步的,关了。 pcmcia 激活pcmica设备,遗憾我有生以来都没有见过这样的设备,关了它。 powernowd 用于管理cpu的客户端程序,如果有变频功能,比如amd的quite' cool 那么就开启它吧。 ppp 拨号用的,我关了它。 ppp-dns 一样,也关了。 readahead 预加载服务,让我想起了win的预读,当然他们不同,它会使启动变慢3-4妙,所以我关了它。 reboot 重启用的,不要动。 rmnologin 如果发现nologin,就去除它,在笔记本上不用开启。 rsync rsync协议守护,请视情况而定。 screen-cleanup 一个清除开机屏幕的脚本,随便。 sendsigs 重启和关机时向所有进程发送消息。所以不要管它。 single 激活但用户模式,不用管它。 stop-bootlogd 从2,3,4,5级别停止bootlogd,不用管它。 sudo 这个不用说吧,不用管它。 sysklogd 用于记录系统日志信息,不用管它。 udev 用户空间dev文件系统,不用管它。 udev-mab 同上。 umountfs 用来卸载文件卷的,不用管它。 urandom 生成随即数的,不知道怎么用,不用管它。 usplash 那个漂亮的启动画面,但是我关了它,它也存在,所以想关他需要把内核起动参数中的splash一句删掉。 vbesave 显卡bios配置工具,不用管它。 xorg-common 设置x服务ice socket。不用管它。 ...

2012-05-26 · 2 min · 230 words · -

ubuntu vsftpd

ubuntu vsftpd sudo apt-get install vsftpd 查看是否打开21端口 $ sudo netstat -npltu | grep 21 VSFTPD的菜鸟篇 作者: 龙磊 这是我这个菜鸟学习LINUX所写的第一篇文章,是比较基础的FTP架设的应用,如果我写有什么问题请大家多指教,我后续会陆续出进阶篇把FTP中各种详细的配置跟大家一起进行探讨。 我所用的是LINUX AS+VSFTPD-1.2.0-4的系统架构,在这里说明的是如果对配置文件不是很熟悉,最好做个备份,以免误操作: 1. 匿名服务器的连接 (独立的服务器) 在/etc/vsftpd.conf配置文件中添加如下几项: Anonymous_enable=yes (允许匿名登陆) Dirmessage_enable=yes (切换目录时,显示目录下.message的内容) Local_umask=022 (FTP上本地的文件权限,默认是077) Connect_form_port_20=yes (启用FTP数据端口的数据连接) * Xferlog_enable=yes (激活上传和下传的日志) Xferlog_std_format=yes (使用标准的日志格式) Ftpd_banner=XXXXX (欢迎信息) Pam_service_name=vsftpd (验证方式) * Listen=yes (独立的VSFTPD服务器) * 功能: 只能连接FTP服务器,不能上传和下传 注: 其中所有和日志欢迎信息相关连的都是可选项,打了星号的无论什么帐户都要添加,是属于FTP的基本选项 2. 开启匿名FTP服务器上传权限 在配置文件中添加以下的信息即可: Anon_upload_enable=yes (开放上传权限) Anon_mkdir_write_enable=yes (可创建目录的同时可以在此目录中上传文件) Write_enable=yes (开放本地用户写的权限) Anon_other_write_enable=yes (匿名帐号可以有删除的权限) 3. 开启匿名服务器下传的权限 在配置文件中添加如下信息即可: Anon_world_readable_only=no 注: 要注意文件夹的属性,匿名帐户是其它 (other) 用户要开启它的读写执行的权限 (R) 读–下传 (W) 写–上传 (X) 执行–如果不开FTP的目录都进不去 ...

2012-05-25 · 3 min · 513 words · -

Java读取properties, getResourceAsStream

Java读取properties, getResourceAsStream http://lavasoft.blog.51cto.com/62575/62174 Java读取properties文件的方法比较多,网上我最多的文章是"Java读取properties文件的六种方法",但在Java应用中,最常用还是通过java.lang.Class类的getResourceAsStream(String name) 方法来实现,但我见到众多读取properties文件的代码中,都会这么干: // java object InputStream in = getClass().getResourceAsStream("资源Name"); // static method Class.class.getClassLoader().getResourceAsStream("foo.toml"); 这里面有个问题,就是getClass()调用的时候默认省略了this!我们都知道,this是不能在static (静态) 方法或者static块中使用的,原因是static类型的方法或者代码块是属于类本身的,不属于某个对象,而this本身就代表当前对象,而静态方法或者块调用的时候是不用初始化对象的。 问题是: 假如我不想让某个类有对象,那么我会将此类的默认构造方法设为私有,当然也不会写别的共有的构造方法。并且我这个类是工具类,都是静态的方法和变量,我要在静态块或者静态方法中获取properties文件,这个方法就行不通了。 那怎么办呢?其实这个类就不是这么用的,他仅仅是需要获取一个Class对象就可以了,那还不容易啊--取所有类的父类Object,用Object.class难道不比你的用你正在写类自身方便安全吗 ?呵呵,下面给出一个例子,以方便交流。 import java.util.Properties; import java.io.InputStream; import java.io.IOException; /** * 读取Properties文件的例子 * File: TestProperties.java * User: leizhimin * Date: 2008-2-15 18:38:40 */ public final class TestProperties { private static String param1; private static String param2; static { Properties prop = new Properties(); InputStream in = Object.class.getResourceAsStream("/test.properties"); try { prop.load(in); param1 = prop.getProperty("initYears1").trim(); param2 = prop.getProperty("initYears2").trim(); } catch (IOException e) { e.printStackTrace(); } } /** * 私有构造方法,不需要创建对象 */ private TestProperties() { } public static String getParam1() { return param1; } public static String getParam2() { return param2; } public static void main(String args[]){ System.out.println(getParam1()); System.out.println(getParam2()); } } 运行结果: ...

2012-05-25 · 1 min · 163 words · -

JAVA 随机数

JAVA 随机数 在Java中,随机数的概念从广义上将,有三种。 通过System.currentTimeMillis()来获取一个当前时间毫秒数的long型数字。 通过Math.random()返回一个0到1之间的double值。 通过Random类来产生一个随机数,这个是专业的Random工具类,功能强大。 int nextInt() 返回下一个伪随机数,它是此随机数生成器的序列中均匀分布的 int 值。 int nextInt(int n) 返回一个伪随机数,它是从此随机数生成器的序列中取出的、在 0 (包括) 和指定值 (不包括) 之间均匀分布的 int值。 在Java中我们可以使用java.util.Random类来产生一个随机数发生器。它有两种形式的构造函数,分别是Random()和Random(long seed)。Random()使用当前时间即System.currentTimeMillis()作为发生器的种子,Random(long seed)使用指定的seed作为发生器的种子。 随机数发生器(Random)对象产生以后,通过调用不同的method: nextInt()、nextLong()、nextFloat()、nextDouble()等获得不同类型随机数。 1>生成随机数 Random random = new Random(); Random random = new Random(100);//指定种子数100 random调用不同的方法,获得随机数。 如果2个Random对象使用相同的种子 (比如都是100) ,并且以相同的顺序调用相同的函数,那它们返回值完全相同。如下面代码中两个Random对象的输出完全相同 import java.util.*; class TestRandom { public static void main(String[] args) { Random random1 = new Random(100); System.out.println(random1.nextInt()); System.out.println(random1.nextFloat()); System.out.println(random1.nextBoolean()); Random random2 = new Random(100); System.out.println(random2.nextInt()); System.out.println(random2.nextFloat()); System.out.println(random2.nextBoolean()); } } 2>指定范围内的随机数 ...

2012-05-25 · 2 min · 285 words · -

readelf

readelf 功能:用于查看ELF格式的文件信息,常见的文件如在 Linux 上的可执行文件,动态库(.so) 或者静态库 (.a) 等包含 ELF 格式的文件。 示例: 查看静态库定义的函数 readelf -c xxx.a 查看静态库定义的函数 readelf -A xxx.so 版权声明:本文为CSDN博主「mayue_csdn」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/mayue_web/article/details/103879976 ELF (Executable and Linkable Format) 即可执行连接文件格式,是一种比较复杂的文件格式,但其应用广泛。当你使用 file 命令发现某个文件是 ELF 文件时,你就可以使用 readelf 命令来读取这个文件的信息。 readelf -h /bin/pwd readelf 命令 用来显示一个或者多个elf格式的目标文件的信息,可以通过它的选项来控制显示哪些信息。这里的elf-file(s)就表示那些被检查的文件。可以支持32位,64位的elf格式文件,也支持包含elf文件的文档 (这里一般指的是使用ar命令将一些elf文件打包之后生成的例如lib*.a之类的“静态库”文件)。 这个程序和 objdump 提供的功能类似,但是它显示的信息更为具体,并且它不依赖BFD库(BFD库是一个GNU项目,它的目标就是希望通过一种统一的接口来处理不同的目标文件),所以即使BFD库有什么bug存在的话也不会影响到readelf程序。 运行 readelf 的时候,除了 -v和 -H之外,其它的选项必须有一个被指定。 ELF文件类型 3种类型的ELF文件: 可重定位文件:用户和其他目标文件一起创建可执行文件或者共享目标文件,例如lib*.a文件。 可执行文件:用于生成进程映像,载入内存执行,例如编译好的可执行文件a.out。 共享目标文件:用于和其他共享目标文件或者可重定位文件一起生成elf目标文件或者和执行文件一起创建进程映像,例如lib*.so文件。 ELF文件作用: ELF文件参与程序的连接(建立一个程序)和程序的执行(运行一个程序),所以可以从不同的角度来看待elf格式的文件: 如果用于编译和链接 (可重定位文件),则编译器和链接器将把elf文件看作是节头表描述的节的集合,程序头表可选。 如果用于加载执行 (可执行文件),则加载器则将把elf文件看作是程序头表描述的段的集合,一个段可能包含多个节,节头表可选。 如果是共享文件,则两者都含有。 ELF文件总体组成: elf文件头描述elf文件的总体信息。包括:系统相关,类型相关,加载相关,链接相关。 系统相关表示:elf文件标识的魔术数,以及硬件和平台等相关信息,增加了elf文件的移植性,使交叉编译成为可能。 类型相关就是前面说的那个类型。 加载相关:包括程序头表相关信息。 链接相关:节头表相关信息。 选项 -a –all 显示全部信息,等价于 -h -l -S -s -r -d -V -A -I. ...

2012-05-24 · 13 min · 2732 words · -