|
2008年4月16日
sudo vim /etc/vmware/config
在最下面添加一句话:
xkeymap.nokeycodeMap = true
在使用Iterator处理Collection时,注意java.util.ConcurrentModificationException。
1.如果你仅仅是对collection进行遍历查询,那么不必担心什么。
2.但如果你在遍历过程中要对collection进行删除,那么你就要注意了。
For example:
private void testDel() {
- List<String> list = new ArrayList<String>();
- for (int i = 0; i < 10; i++) {
- String str = "td" + i;
- list.add(str);
- }
-
- for (Iterator it = list.iterator(); it.hasNext();) {
- String str = (String) it.next();
- if (str.equals("td5")) {
- // list.remove(str); // 删除方法一
- it.remove(); // 删除方法二
- }
- }
- }
上面的代码运行没有问题,但如果你用“方法一”替代“方法二”,则会出现java.util.ConcurrentModificationException。
(用for-each遍历也会出个类似问题)
具体原因是可以看一下 先看看List中的remove方法源码:
- public boolean remove(Object o) {
- if (o == null) {
- for (int index = 0; index < size; index++)
- if (elementData[index] == null) {
- fastRemove(index);
- return true;
- }
- } else {
- for (int index = 0; index < size; index++)
- if (o.equals(elementData[index])) {
- fastRemove(index);
- return true;
- }
- }
- return false;
- }
-
- private void fastRemove(int index) {
- modCount++; // 特别注意这里,这里只增加了modCount的值
- int numMoved = size - index - 1;
- if (numMoved > 0)
- System.arraycopy(elementData, index + 1, elementData, index,
- numMoved);
- elementData[--size] = null; // Let gc do its work
- }
接着看。删除后得到下一个元素的代码,it.next(): it为AbstractList的内部类Iterator的一个实例。
- public E next() {
- checkForComodification();
- try {
- E next = get(cursor);
- lastRet = cursor++;
- return next;
- } catch (IndexOutOfBoundsException e) {
- checkForComodification();
- throw new NoSuchElementException();
- }
- }
-
- final void checkForComodification() { //注意这个方法
- if (modCount != expectedModCount) //检查这两个值是否相同
- throw new ConcurrentModificationException();
- }
最后看Iterator的remove()方法的源代码:
- public void remove() {
- if (lastRet == -1)
- throw new IllegalStateException();
- checkForComodification();
- try {
- AbstractList.this.remove(lastRet);
- if (lastRet < cursor)
- cursor--;
- lastRet = -1;
- expectedModCount = modCount; // 设置expectedModCount
- } catch (IndexOutOfBoundsException e) {
- throw new ConcurrentModificationException();
- }
- }
-
- final void checkForComodification() {
- if (modCount != expectedModCount)
- throw new ConcurrentModificationException();
- }
这下就明白了,list的remove方法只修改了modCount值,而iterator的remove能同步modCount和expectedModCount.
Ubuntu 时区时间设置:
执行
tzselect (有的版本用tzconfig)
按照提示进行选择时区
sudo cp /usr/share/zoneinfo/Asia/ShangHai /etc/localtime
执行
sudo ntpdate cn.pool.ntp.org
cn.pool.ntp.org是位于中国的公共NTP服务器,用来同步你的时间
时间
sudo date
各国语言代码列表:
English 1033 1033
German 1031 1031
French 1036 1036
Japanese 1041 1041
Danish 1030 1030
Spanish 3082 3082
Italian 1040 1040
Dutch 1043 1043
Norwegian 2068 2068
Portuguese 2070 2070
Finnish 1035 1035
Swedish 1053 1053
Czech 1029 1029
Hungarian 1038 1038
Polish 1045 1045
Romanian 1048 1048
Croatian 1050 1050
Slovak 1051 1051
Slovene 1060 1060
Greek 1032 1032
Bulgarian 1026 1026
Russian 1049 1049
Turkish 1055 1055
British English 2057 1033
Estonian 1061 1061
Latvian 1062 1062
Lithuanian 1063 1063
Brazilian 1046 1046
Traditional Chinese 1028 1028
Korean 1042 1042
Simplified Chinese 2052 2052
Arabic 1025 1025
Thai 1054 1054
记得06年时,看过类似的文章,今又看到了,收藏一下,以备后验!
********************************
让我来告诉大家为什么房价这么高,肉价会涨得这么厉害 本文以最浅显得道理阐
述经济的原理,进而阐述经济的真相。不会有任何所谓的学 术妓 女们常用来欺
骗人民的深奥的学术理论,还事实以清白,真相只有一个,让我 们擦亮眼睛,洞
观今天发生的一切。 我不是经济学家,但我比经济学诚实,本文在以下几方面阐
述中国经济的真相。
1、什么是经济发展?
2、什么是对外贸易?
3、什么是通货膨胀?
4、房价能绑架中国经济吗?
5、房价和通货膨胀有关系吗?
6、房价高涨的原动力是什么?
7、房价一直涨下去,开发商会笑还是会哭?什么情况下会笑?什么情况
下 会哭?
8、坐在华尔街办公室的财团们是如何吸干中国山区一个农民的血汗的
9、在有关这场围绕房价和通货膨胀之间的各方博弈中可能选择的中庸路
线
1、 什么是经济发展?
简单的讲经济发展就是有钱,但钱从何来?钱只能印出来。那么到底是
什 么使印钞机不停的运转?
假设一个岛上有1000口人,与世隔绝,人与人之间交换物品过活,但有
时 候你手里用来交换的东西不一定就是对方想要的,怎么办?于是人们就用都喜
欢的 金银作为交换的东西,于是交换方便了。但金银要磨损,携带也不方便,当
交换活 动频繁时,发现这个东西太繁琐,限制了交换活动,于是为了解决这个问
题,想了 一个办法,就是由岛上的管理者发行一种符号,用它来代替金银,于是
钞票出现了 。
刚开始这种钞票可以随时得兑换金银。大家都很放心,因为钞票就是金
银 。可是岛上金银的产量太小,当人们的交换活动更加频繁时,钞票不够用了,
只能 暂停交换。暂停交换的后果就是大家不生产别人想要的东西了,因为虽然别
人用, 但交换不出去,套用现在的话说就是经济发展减速了。
于是大家想了一个办法,成立一家钱庄,这个钱庄是大家的,由钱庄来
发 行钞票,印出的钞票借给想用钱的人,然后这个人有钱了再还给钱庄。于是银
行就 出现了。
银行的出现,能保证交换活动更持续的进行,大家都拼命的生产,岛上
的 东西越来越多,银行根据产品的生产数量,不停的印制钞票,以保证交换能更
深入 的进行。
后来人们的交换活动更频繁了,一家钱庄太少了,于是出现了很多钱庄
, 总要有个管钱庄的吧,于是指定一家钱庄管理其他钱庄,并且钞票只能由这家
钱庄 印刷,然后通过其他钱庄借给用钱的人,中央银行就这么也出现了。
2、什么是对外贸易?
有一天岛上的人发明了船,于是就到处划船跑,发现了另一个岛屿,那
上 面也有人,也有钞票,也像自己岛上这么活动。但自己岛上生产的东西多,那
个岛 上生产的东西少,1元钱在自己的岛上能买1斤大米,那个岛上的一元钱只能
买半斤 大米,于是另外岛上的钱来这个岛上买东西时只能2元换1元才行。于是汇
率出现了 。算好汇率后,他们开始互相买卖东西到对方岛上,这就是对外贸易。
对外贸易丰 富了人们的生活生产需要,使交换活动到了一个空前的高潮。
3、什么是通货膨胀?
由于岛上生产的产品太多了,以至于没法准确估计到底该发行多少钞票
, 发行多了的时候,因为没有那么多产品可买,产品就开始涨价,发行少了呢就
开始 降价,为了保证价格稳定,央行要求各钱庄要把一部分钱放在央行里面用来
调节产 品的价格,根据价格情况多放和少放。这就是存款准备金率。
可是有一部分聪明人开始怎么才能把钱弄到自己手上,他在海边捡了一
颗 石子,说这个石子值100万快钱,把它卖给了一个人,这个人觉得整个岛上的
钱加一 起也没有100万啊,怎么办,于是向钱庄借,钱庄也没有这么多钱,于是
把印钞机打 开,印了这100万,借给了他买了这个石子。
然后这个人开始卖这个石子,100万卖给了第二个人,由于第一个卖石子
的 人把钱花了,所以岛上的钱多了,所以这一百万可以筹集到,多买些产品就有
了。 但当把这个石子以200万转让的时候,钱庄只能又印了100万钞票,就这样钞
票越印 越多,可是当这个石子不停的流动转让时,大家并不觉得岛上的钱多,产
品价格还 是原来的那样。可是当这个石子不流通或流通的慢时,大家觉得钱多了
,可是如果 当持有石子的人把它扔到大海里,那就等于岛上凭空多出N多个100
万来,怎么办, 央行最害怕的就是这颗石子没了。它没了岛上产品的价格就会飞
涨,就会通货膨胀 。那么持有石子的人就绑架了岛上的经济。
4、房价能绑架中国经济吗?
中国的房地产已经使中国央行发行了太多的人民币,如果房价下降,等
于 把那颗石子投进了海里,那么多印出来的钱会使中国产品价格飞涨,会发生严
重的 通货膨胀。
看似房价与石子毫无相干,可是他们的属性是一样的,就是价格和价值
严 重的背离。实际上房地产的崩盘受害最大的并不是中国的商业银行,而是整个
中国 经济体系。为什么go-vern-ment迟迟没有把房价降下来,不是降不下来,如
果真想降房价, 只需要一道政令,房地产价格会在一夜之间土崩瓦解。可是后果
谁能承担,严重通 货膨胀谁来负责?
房地产业已经绑架了中国的经济,是无可置疑的,是客观实在的,没有
人 能改变。
不管谁是总理,廉洁也好,贪污也好,都希望社会和谐,可这是一个棘
手 的问题。
5、房价和通货膨胀有关系吗?
可更棘手的问题还不仅仅在这里。如果降房价,面对的是马上的通货膨
胀 ,可不降房价,那么面对的就是更严重的通货膨胀,何去何从?
所以最可靠的办法就是稳定房价,然后在社会产品增加时,减少货币的
投 放量,加上其他政策如加息、增加商业银行准备金率、缩小信贷规模等辅助手
段, 来使中国经济软着陆,这是最好的办法,我们看到的一切政令也是这个逻辑
。不信 的话,可以查阅一下近年来go-vern-ment发布的一系列调控房地产业的措
施。
可是为什么房价不稳定而且更加的疯长呢?难道是KFS与go-vern-ment在
博弈吗?告 诉你在中国没有人能和party叫板,几个肚子大点的KFS 是没有这个
实力的。实际上是 幕后的另一只黑手在和中国go-vern-ment博弈,这支黑手就是
外资,以美国为代表的帝国主 义攫取中国人民血汗的黑手。
6、房价高涨的原动力是什么?
使房价上涨的动力很多,房价上涨对其有利的人就是动力之一,比如:
为 了GDP和个人利益的地方go-vern-ment、为了赚钱的KFS、炒房族、以至于买了
房的所谓“房 奴”都是是房价上涨的动力,可是最大的原动力不是这些,是外资
,是美国的以攫 取超额利润的各大财团。
KFS作为商人,为了赚取高额利润不是什么伤天害理的事情,可是各行
各 业都有商人,难道想赚就有吗?那除非是神话。房地产业的开发商也一样,不
是他 们想赚多少就有多少的。根据价值规律,当商品的价格和价值严重背离时,
会有一 种趋向正常价格回归的力量钳制价格的上涨,可是在中国的房地产业,这
种规律似 乎不起作用,一个重要的原因是忽视了一个参考范围的原因,如果以中
国经济本身 而言确实打破了这个规律,可是目前的情况是有一股力量在维持着房
地产业的价格 ,即托市,那么谁在托市呢?
谁能在房地产业失控能得到巨额利润的人就是托市的人。
讨论这个问题前,现看一下中国的外汇储备情况。中国的外汇储备在近
几 年迅速由1、2千亿突破万亿,并且还在迅速的增长,难道是中国人民奋发图强
,挣 来的吗?这个不需要证明,看中国的GDP增幅就知道,外汇储备的增长速度
明显大于 GDP的增幅。显然不是挣来的,那么除了挣来的一部分,那么就是所谓
的 “国际热 钱”的涌入,而国际热钱的涌入的目的只有一个,就是要取得高额
的回报。
国际热钱进入中国市场后,首先要兑换成人民币,那么一下子哪有这么
多 人民币呢?只有一个办法就是让印钞机没日没夜的工作,然后这笔钱用来托住
已是 烫手山芋的房地产市场,就是拼命的投资房地产业,当房地产价格因背离价
值而向 下波动时,通过托市再把它抬高,反复如此,给人的表象就是房产价格决
没有偏离 价值。导致房价越涨越高。
而KFS呢,他们一到房子将要卖不出去的时候,就有人出高价买下来,他
们 怎么会降价,如果没有这部分资金在运作,别说是KFS联盟,就是全国只有一
个KFS ,价格也会降下来,没有人买了,难道等房子发霉吗?
那么外资持有这么多高价房产做什么?不怕砸到手里吗?
不怕!为什么呢?在这个资本运作的过程中,有一个冤大头在最底下接
着 呢,是谁呢?就是中国的商业银行,由于火爆的房地产市场,一流的流通性,
近年 来没有看到任何萎缩的迹象,放了贷款就盈利,为什么不贷款呢?没有理由
不放贷 款。
加之中国老百姓买房的心情,外资可以轻易的把高价房转嫁到中国的银
行 和消费者身上,连炒房的农民都能赚到一杯羹,职业的外资会赔钱吗?
那么房价一直涨下去,会怎样呢?请看下一节:“7、房价一直涨下去,
开 发商会笑还是会哭?什么情况下会笑?什么情况下会哭?”
7、房价一直涨下去,开发商会笑还是会哭?什么情况下会笑?什么情况下 会哭
?
在中国go-vern-ment近几年来密集的几十道金牌的调控下,房价还是如
脱了缰的野 马一样狂奔不止。暂且不论何时能停止上涨的势头,毕竟房价在目前
还是上涨的, 所以我们就看看房价上涨不止会带来什么。
首先:由于GDP上涨,中国go-vern-ment为了维持上文说的“保持产品交
换的继续” 要不断地投放人民币,即开动印钞机。只要房地产这个石子还没有投
入到大海里去 ,还有一定的流通性,那么就不会有通货膨胀的发生。
其次:开发商会在这个过程中也赚取巨大的利润。
再次:能看到的是,炒房族会赚钱、所谓的买房的“房奴”会增值。
都赚钱!可是在这个过程中到底谁亏了呢?钱从哪里来呢?如果你是有
炒 股的经验就会知道,如果投资价格和价值背离的商品,你赚的钱就是别人赔的
钱, 那么套用到房地产上,就是买房自住的人,现在看似增值,那是镜中月、水
中花, 你不变现就不是你的。再有就是当价格完全回归真实价值的时候,有时甚
至会到真 实价值一下,被高价房套住的投资者。还有一个就是开发商!
为什么说开发商也有赔钱呢?大家知道商人的本性是赚钱,赚取利润。
如 果一个商人投机一次就永远都不做这个生意了,他是赚钱了,可他不是商人,
这种 商业行为没有意义。由于商人的本性,所以赚来的钱会继续扩大再生产,在
能赚钱 的领域不断的加大投资。这个道理从生活中就可看出来,越是做大生意的
人总喊没 钱,因为要更大的流动资金来维持其扩大再生产的需要。
所以一旦房价回归真实的价值之时,就是有一大批开发商崩溃之日。这
个 是不以任何人的意志和任何行为为转移的。如果现在有开发商逃离房地产业的
角斗 场,那么跑得慢的就是最后的输家。如果都不跑,就像击鼓传花一样,最后
拿到接 力棒的就是接盘者。有句话叫:“出来混迟早是要还的”。也许只不过是
方式不一 样,看谁的运气好而已。
可是现在却没有任何的KFS赔钱的迹象,有的是KFS不断的赚钱,老百姓
送 钱都来不及。只是因为目前房价还在上涨,房产还在不断的流动。
一个巨大的问题来了,这样不断上涨的房价何时是个头啊,请看下一节
: “8、坐在华尔街办公室的财团们是如何吸干中国山区一个农民的血汗的”
8、坐在华尔街办公室的财团们是如何吸干中国山区一个农民的血汗的
Mao.ZD说过:“帝国主义没有睡大觉,而是天天在蠢蠢欲动,在图谋不轨
, 想达到他们的罪恶目的。诚然他们的气焰的确没有以前那么嚣张,但他们确实在
活动 着。”是不是冷战结束就代表着人类的和平得以实现呢?“一句上帝面前人
人平等 ”就能掩盖帝国主义噬血的本质吗?人人平等的理念是对的,但它只不过
是帝国主 义用来欺骗人们的伎俩罢了,说到和做到永远是两码事。
国际财团通过国际热钱涌入中国,使人民币加大发行量,然后通过房地
产 炒作,把中国的国内价格水平无限制的提高,GDP的增长又一次使人民币的发
行量被 迫提高。国际财团心黑手狠,双管齐下,目的就是使中国经济热到烫手,
热到让每 个中国人为之疯狂。
我们暂不去关心这个过程,我们放眼未来,看看这一过程的结果是什么
样 呢?换句话说财团的目的是什么呢?
很明显,中国人最不愿意看到的事情,就是财团们最乐见的结果。先做
个 假设,比如国际热钱在投资的中国房地产领域里上演最后的疯狂后,然后把房
产成 功解套全部变现,如果此时人民币兑美元的汇率达到美国预期最高时,汇率
是热钱 逃离时需要相乘的那个倍数,会发生什么谁都能想到,所有热钱会一夜之
间全部兑 换美元逃离。财团们会赚得沟满壕平,中国市场上除了钱就是钱,能遮
住天的大把 人民币将成为中国人民的噩梦。
这是中国人最不愿意看到的事情,也是财团最乐见的结果。近期美国不
断 的通过政治、贸易等手段逼迫人民币升值,而中国go-vern-ment迟迟不升值或
小范围的升值 ,远远没有达到美国go-vern-ment的预期,这是在出口处的中美之
间的博弈。美国逼迫人民 币升值的狼子野心昭然若揭!
顺便提一句,如果真的这个升值预期达到了,中国楼市将重演日本上世
纪 90年代崩盘的历史。只是那时中国经济也会像日本一样进入一个连续低迷不振
的不 归路。
在这种攸关民族生存的问题上,go-vern-ment会坐视不管吗?就算是退
一步来讲, 一个完全不负责任的go-vern-ment遇到这种情况,因为这个资本运作
同时也极大侵犯了go-vern-ment 的利益,也会拼命反搏的。
那么中国go-vern-ment会以什么样的方式来化解这一“经济危机”呢?
请看下一节 :“在有关这场围绕房价和通货膨胀之间的各方博弈中可能选择的中
庸路线”。
9、在有关这场围绕房价和通货膨胀之间的各方博弈中可能选择的中庸路线
我一直相信:物极必反,中庸,是老祖宗留给后人解决棘手问题的杀手
锏 !
既然是中国房地产“绑架”了中国的经济,那么我们就从“绑架”说起
。 何为“绑架”,应该是相对弱的一方,拿着相对强的一方的“要害”,使相对
强的 一方即便有能力对付弱的一方,但碍于投鼠忌器,无力可施。
我们先来看看绑架双方的阵容和各自手上的筹码。房地产业的主体是KFS
, 所以KFS算一方,它绑架的要害是中国经济,那中国经济是谁的要害呢?是中
国人民 的要害,代表中国人民的,目前只能是中国go-vern-ment。中国go-vern
-ment算一方。外资呢?它是 煽风点火者,划到KFS一方。中国go-vern-ment一方
有公权力,可以通过税收、财政、经济政 策、行政手段对KFS阵营施力,KFS阵营
通过源源不断的后备资金来绑架中国经济, 且不断的提高赎金。
问题已经摆在这里,怎么办呢?冲上去一枪击毙,那歹徒非撕票不可,
太 极端不可行。所以有为go-vern-ment开出药方,只要实现了某某一条既可降低
房价的主意, 就犹如这一枪击毙一样是不可行的。我们想象如何解救绑架事件的
,首先要稳定住 对方的情绪,再一步步地靠近,但这种靠近虽会引起歹徒的敌意
,但不会导致他撕 票,然后再进一步稳定情绪,再靠近,然后条件成熟时,再稳
准狠,即保证人质的 安全,又要保证歹徒一举拿下。这才是真正的营救。
所以中庸才是解决棘手问题的杀手锏。极端、盲目、冒进是要不得的。
针对如何解决中国房地产市场的绑架问题,就要围绕问题的关键部分一
步 步地施加反作用力,然后一举成功,才是正道。
第一个关键的部分就是汇率,中国go-vern-ment会严把汇率关,我们可
以预期的是 ,人民币兑灭元的汇率决不会过快升值,但会小幅升值,就是要稳定
对方的情绪, 如果一点不升,对方会狗急跳墙,如果升的过快,是给自己掘墓,
所以为什么中国 汇率升幅总是犹抱琵琶半遮面,看看美国go-vern- ment的态度
跟一个绑匪是多么的 贴切,我要一瓶果汁,为什么拿来半瓶水。可又说不出什么
来,毕竟还能暂时解渴 。
第二个关键是限制资产流动性,既然房地产能绑架中国经济,说明它举
足 轻重,限制房产的流通性,就可以限制资产的流动性,注意这里是两个概念,
“资 产流动性”和“房产流通性”。两者完全不同,但又息息相关。房产流通性
减弱, 资产流动性减弱,那么需要印刷的人民币就减少。就像那个石子,不流通
马上通胀 ,不涨价流通没问题,可是行不通,外资也不同意。既然是不断的上涨
价格,只能 一步步地限制房产流通,只要房产流通性少一点,通胀就会显现一点
,然后再通过 上调准备金率和加息等柔性政策来调整一点,用柳叶棉丝掌来化解
泰森的一记重拳 ,以绵柔克强刚、化千钧于无形,这就是中国go-vern-ment的策
略(这好像是中国人最擅长 的事情)。我们从官方媒体就能看到相关的消息,楼
市签约率在下降,即流通性在 下降,然后物价开始有所涨幅,如猪肉等副食产品
,但央行马上上调准备金率和加 息,来稳定物价。不知各位看官是否也看出些端
倪。可预期的是,到完全化解危机 之前,会不断地加息和调高准备金率,同时房
产流通性会越来越弱,这个预言是否 准确可在以后的央行政策上验证。等完全消
除了由于经济过热导致的通货膨胀预期 ,那么就是房地产价格回归真实价值之时
。
不管你看到没看到,这已是最后的疯狂,我们从两方面来分析:
第一,如果这场博弈以外资胜利而告终,那么中国经济将步日本90年代
持 续下滑的深渊,由于外资撤走,房市赖以生存的支柱坍塌,房价会一落千丈,
可到 时候不管是KFS还是老百姓都将承受经济下滑之苦,持有的货币迅速贬值,
即便房价 落下,也不一定买的起。这是中国go-vern-ment和中国人民不可接受的
,也是无法接受的。
第二,如果外资以失败而告终,即在汇率上把住出口,让房价回归真实
价 值,把外资同样套在中国,这才是胜利的前提。那么以美国财团为首的帝国主
义噬 血者必将疯狂报复,会在投资、出口等各方面对中国施加压力。我们今天人
民币升 值没有达到美国预期,已经导致中国出口到美国的产品受打压,进而引起
了众多的 贸易摩擦,由此可见一斑。我们知道,经济发展的三套马车是,投资、
出口和消费 ,在投资、出口领域遭到报复会影响中国经济的发展,但我相信不会
影响我们的发 展速度,别忘了还有一套马车是“消费”,房价下降后,如果你是
爱国者,请现在 保护好你的钱包,到时千万别羞羞答答,要果断地出手买房,中
国经济会在消费领 域异军突起,继续独占世界经济引擎的鳌头。
看了这篇文章,真的让我无语了。。。
*****************************************以下转载*********************************************
昨晚,和一个开典当行的同学喝酒。
我问同学,“你买了多少套房子,多少间铺面?”
“房子22套,铺面12间。”同学炫耀似的答道。
“那你花了多少钱呢?”同学虽然是千万级的富翁,但他也不至于能把千万多的钱压在固定资产上吧!我心中默算了一下,非常怀疑!
现在买房子,傻瓜才掏钱!亏你还是个生意人!”同学鄙视的看着我。
同学的话,简直令我震耳欲聋,使我目瞪口呆。我连忙虚心请教。于是,同学就对我说出一番匪夷所思、惊世骇俗的话来......以下,都是我同学的话,虽然词句有些出入,但基本语意我还是转述清楚了的。
一、买房不掏钱,你是怎么操作的?
同学的话——
你知道,我的典当生意完全是靠钱生钱。第一次买房时,虽然我有能力一次性付清全款,但我还是不愿意那么多的现金被房子压死。那时,正流行“零首付”,于是,我一分钱没花,贷款18万买了房(贷款期限为一年)。
一年期满,要还房款和利息了。也不知道是我幸运呢?还是我倒霉!那时,我的资金被一笔业务占用了。为了业务,我不仅还不起房款不说,还得另外新增贷款。迫
不得已,我找老关系——银行的信贷部经理沟兑。当我吞吞吐吐的把“延期还房款并另外新增贷款”的要求说出来后,没想到,信贷经理却诡秘的一笑,非常爽快的
答应了。
信贷经理给我出的主意很简单:让我老婆,以两倍的价格,贷款买我的房子,贷款期限也是一年。
“两倍的贷款,那就是两倍的利息啊!你这不是变着方的剥削我吗?”我还没有反应过来。
“如果到时,你不还款呢?”信贷经理很镇定。
“啊......”
“被银行收房,没有什么大不了的!关键是除去税费后,我还凭空白得了17万。不,这17万我可不能一个人得,我至少要分给他5万。”很快,我反应过来。于是,我对信贷经理会心的一笑......
这,就是我第一次买房的经历。
我后来的买房经历都与此类似,也就是:坚决的不掏一分钱,全部用银行的贷款买房子;然后,如果遇见不明真象的投资者(说是投资者,其实是傻帽)买房,那就
高价卖给他。如果一直没有投资者买房,那就不断的把自己的房子加价转贷给自己,不断的用银行的钱来还银行的债。
并且,我是开典当行的,与银行的关系是一般人无法比的。一般老百姓买房,大都选择20年按揭,而我买房从来都是只贷款一年,到期了才还本金和利息。这样操作,不用交月供。而贷款到期后,我只须做做“纸面文章”转贷款一下。实际上,我一分钱也不用掏。
二、我不信,在实际生活中能有如此荒谬的事情。你讲的是“童话”吧!
同学的话:兄弟!我是看你人对,才给你讲这些掏心窝的话。你怎么可以不相信我呢?你要怎样才能相信我呢?
作者发言:你就给我讲点实际的例子吧!
同学的话:你知道王二麻子是怎么发家的吗?
作者发言:“那你说说。”王二麻子是我的另外一个同学,现在是开发房地产的亿万级富翁。
同学的话——
那我就说说。
想当年,王二麻子那个落魄啊!就连他注册公司的注册资金,也是我临时拆借给他的。如今,别看王二麻子表面风光,他拿地的钱,是从银行贷款的;修房子的钱,是建筑商垫资的。总之,他就是一个完全的“空手道”。
房子修好后,王二麻子在正式开盘前,通常要举行一个“内部认购会”。这个内部认购,其实就是王二麻子召集公司内部员工和一些象我这样的、相熟的炒房客(或
者干脆是一些从招聘会上收集的、众多的、应聘者的“身份证复印件”),以这些人的名义来买房子,全部用银行贷款来买。这,就是所谓的“开发商囤房”。
并且,此次交易上报给银行的交易价,必须比实际的内部交易价提高30%。为什么?因为贷款买房要首付两成啊!举个例子,如果你想收回100万,那你就必须
以130万的房价向银行贷款。这样,银行给你的钱就是:130万×0.8=104万;你实际装进口袋的钱就是:104万—4万(给相关银行人员的“好处费
”)=100万。
就这样,通过开盘前的内部认购,王二麻子其实已经成功的全部收回了投资,把所有的风险转给了银行。到这时,王二麻子才会开始打广告卖房子,并归还“买地的银行贷款”和“修房子的建筑商垫资”。
作者发言:后面又怎么操作呢?
同学的话——
你怎么那样笨啊!稍微聪明一点的人都能想到,后面的操作方法,其实与我炒房的方法是一样的,也就是:“如果遇见不明真象的投资者(说是投资者,其实是傻
帽)买房,那就高价卖给他;如果一直没有投资者买房,那就不断的把自己的房子加价转贷给自己,不断的用银行的钱来还银行的债。”
不过,由于已经收回了按揭贷款的首付款,所以后面的操作并不需要每一次都加价30%,只需按着楼市房价本来的上涨幅度加价就可以了(即每年上涨14%左右)。
什么?万一房价上涨幅度不足于支付贷款利息怎么办?笑话,你什么时候看见过中国楼市的房价上涨幅度低于当年的贷款利息了?
明白了吧!这,就是中国楼市的房价只能上涨不能下跌;并且,房价的上涨幅度还不能低于当年贷款利息的真正原因!!
想想就觉得可笑,居然有学者说,“建筑成本和地价的不断上涨,是房价飞涨的原因。”这简直是扯蛋! 其实,“金融成本”才是房价构成的大头,至少要占目前房价的50%。
以上海倒塌的莲花河畔景苑为例。网上公布,其楼面价格不到604元/平方米,建筑成本也不到1300元/平方米(其实,网上公布的建筑成本并不准确。市法
院电梯公寓的建筑质量总该比它好吧,建筑成本也没有超过1000元/平方米)这么便宜的房子,开发商为什么非得要把它卖到14000元/平方米呢?卖低一
点、少赚一点不行吗?答案是不行的。原因很简单,“金融游戏”是有成本的,每这样操作一次,房子就必须加价一次。只有不断的加价,上述操作才有生存的空
间。所以,莲花河畔景苑前年卖7000元/平方米,去年卖10000元/平方米,今年就得非要卖14000元/平方米。俗话说“豆腐盘成了肉价钱”。这,
就是“金融游戏”的代价!
有句话道出了目前中国楼市的实情,“房子是用来炒的,不是用来住的;商品房是卖给银行的,不是卖给老百姓的。”
老同学,请你想一想,现在的楼市,房价明明已经远远的超过了老百姓的实际购买能力(也就意味着房子永远卖不出去),为什么房价还会不断的上涨呢?并且,还要“量、价齐涨”呢?原因何在?正在于此!
三、你讲的,只是极个别的现象,不能代表中国楼市的整体形势。
同学的话——
老同学,你太孤陋寡闻了吧。请看:
李树彪案:1999年9月8日到2004年1月15日,湖南郴州市住房公积金管理中心原主任李树彪骗取公积金贷款、银行贷款共计44笔,涉案金额1.2亿元。
康明案:2000年前后,河南郑州康明置业有限公司通过东明花园414套房源,在工商银行、交通银行、建设银行、招商银行进行重复抵押贷款共690多套,至少套取银行资金2亿元。
姚康达案:从2002年至2003年上半年,中国工商银行上海外高桥保税区支行向“姚康达”一人发放房贷7141万元,用于炒作128套住房。
森豪虚假按揭案:从1997年年至2002年上半年,北京市华运达房地产开发公司以森豪公寓、太利花园为幌子,采取假按揭的方式,向中行北京市分行、北京
银行中关村支行、北京银行展览路支行三家银行骗贷共计16.2亿元。(请看《京城最大假按揭骗贷案震醒房市》
http://finance.people.com.cn/GB/1045/9255894.html)
建行广州分行案:2002年,审计署抽查建设银行广州地区八家支行的住房按揭贷款,发现10亿元虚假按揭。仅广东省汕尾市公安局某副局长一人,即骗取建行广州市芳村支行按揭贷款3793万元。
曲沪平案:2006年,上海浦东发展银行陆家嘴支行在已发放贷款中,发现1.26亿元个人房产按揭贷款存在抵押不实,贷款代理人为“曲沪平
”。其后更查出与曲相关的房贷高达91笔,涉及金额4亿元左右。银行不得不委托房屋中介公司出售抵押房产,以回收问题贷款。
同泰案:2006年,北京同泰房地产公司涉嫌利用87份假业主所签购房合同,从银行骗贷6700万元。
成都虚构房产骗贷案:2005年至2008年期间,犯罪嫌疑人唐某勾结成都市房管局工作人员以虚构房产的方式办理房产证进行骗贷。现已发现的涉案房产证已超过一百多套,涉及金额近二千万元!而且事态还在进一步发展中。
另外,今年银监会三令五申的明确要求,“贷款发放必须用于满足实体经济的有效信贷需求,防止信贷资金流入楼市”。然而,40000亿资金依然流入楼市......
老同学,请你想一想,为什么会发生那么多的这类事情呢?为什么全国的银行都明知道是假按揭也要把钱贷给地产商呢?难道银行的官员们都是傻子吗?
其实,银行的官员们一点都不傻。
原因在于,银行内部人员与开发商其实是狼狈为奸的同伙。参与这项操作的某些银行内部人员决不是希望通过购房者支付贷款利息为银行赚钱,坦白地说,他们是在
参与分赃——他们与开发商一起盗取不义之财,将风险转嫁给国家银行,而买单的是真实的购房者。一旦真实的购房者无法买下这个巨单,银行就出现危机。
这时候,买单的就是全国人民了,国家必须银行注资,消除烂帐。国家的钱哪里来?印钞票!结果是什么?通货膨胀,物价飞涨,老百性的钱不值钱
了,或者说老百姓的钱被抢了,被谁抢了?被国家抢去堵漏了,堵开发商和银行某些蛀出来的大洞。这个洞如此之大,堵住了也是一个丑陋的疤,而疼的永远是百
姓。
所以我会说——房地产业已经成为相关单位、相关部门团结起来瓜分国家金钱(其实是老百姓的存款)的道具。
违规又有什么大不了的?银行官员们不怕啊!只要表面的纸上手续完备了,我就没有了责任。即使按揭贷款是假的,又有什么关系?况且银行有国家这
个后台,就是亏了也不怕,反正银行的官员们现在挣了钱就行。至于银行以后不行了,自然有国家来管,况且那是下届银行官员的事情。难怪中国银行的坏账率居然
在40%以上!原来,在中国,最大的腐败在银行!!
四、我依然认为,这只是极个别的现象。如果你讲的是普遍的现象,为什么还没有开发商被收楼呢?
同学的话——
原因有许多,简单的有:
1、你不关心房地产界的新闻。比如“曲沪平案”,上海浦东发展银行陆家嘴支行就收了楼,不得不成为了“房东”;
2、由于开发商在银行内部的同伙,掩护工作做的好的缘故,案子没暴。
掩护工作怎么做?很简单——只要一近债务偿还期,开发商就会和“银行内部的同伙”们一起,把房子又一次加价卖给(转按揭)其它的“身份证复印件”(其实,房子依然在开发商手里)。这样操作,开发商永远不会被收楼。
虽然这样操作,房价会不断的上涨,并很快的远远超过老百姓的实际承受能力(也就意味着房子永远卖不出去)。但是,这样的操作,如果只从官样程
序上来看、只从表面的纸上手续来看的话,它是永远合法的。这就是银行官员们敢于给开发商打掩护的原因——因为以目前的银行制度来说,只要表面的纸上手续完
备了,银行的官员就没有了责任。
五、你的意思是,目前的银行贷款制度有着严重的漏洞?
同学的话——
当然!
我能不花钱的买那么多的房子和铺面,甚至还靠房子从银行套出那么多的周转资金做生意,这一切,全都得感谢银行的制度漏洞啊!银行的贷款制度,真的是“为人民服务的好制度”啊!
作为一个典当行的老板,以同行的眼光来看,我认为银行贷款的制度漏洞有:
1、抵押物价值的评定方法有缺陷。
比如,明明开发商拿地只用了5000万,他却可以用这块地抵押贷款1个亿;比如,开发商修楼修到盖顶,明明只用了7000万(含地钱),他却可以用这个楼抵押贷款2个亿。
如果,按照我们典当行的规矩来办,事情又会怎样呢?
当开发商用这块地抵押贷款时,我会亲自去核实:开发商拿这块地,是否真的给了政府5000万。并且,如果这个情况属实,他也最多只能贷款4000万。因为我要预提风险基金啊!
当开发商用这个楼抵押贷款时,我也会亲自去核实:开发商修这个楼,是否真的花了2000万(只算建筑成本,不含地)。我会按照各种人工、各种建筑材料的最
低价来核算这个楼的建筑成本。并且,如果开发商修这个楼的确花了2000万,他也最多只能贷款7000万×0.8=5600万(连地一起抵押)。
最后,当购房者按揭贷款时,我绝对不可能按照“购房合同交易价”来发放贷款,购房者最多能获得的贷款金额是:7000万×0.8×购房面积/此楼总面积。
举个例子:有个卖衣服的商人因为生意周转,需要以衣服为抵押物向银行贷款。你说说,银行是该“按照衣服出厂价的8折”给他贷款呢?还是该“按照衣服零售价的8折”给他贷款。
作者发言:当然该按出厂价算。如果按照零售价算的话,卖衣服的商人干脆不用开店了,他直接把衣服卖给银行赚钱更快!恩,我明白了,怪不得在中国会出现“房子是用来炒的,不是用来住的;商品房是卖给银行的,不是卖给老百姓的”这样的奇闻!!!
同学的话:是啊!抵押房的价值,不能由客户之间的交易来决定啊!!
2、责任追究方法有缺陷
“只要表面的纸上手续完备了,银行官员就没有了责任。”这怎么可以呢?在我的典当行,我可不管你的纸上手续是否已经完备,只要是你负责的业务出了问题,嘿嘿!我就找你算帐!!!
另外,让国家损失16.2亿的森豪虚假按揭案暴露后,相关的银行官员居然没有被追究责任,这怎么可以呢?嘿嘿!如果这样的事是发生在我的典当行,不要说让他家破人亡,我至少会让他和他的亲戚倾家荡产!!!
作者发言:是啊!发生金融案件后,居然不追究相关银行官员的责任。换成是我,我也觉得“打马虎”比尽忠职守更合算!!!怪不得中国的金融案件层出不穷。听
君一席话,胜读十年书!听你说到这儿,就连我这么笨的人也知道了应该如何理顺楼市——只要严格金融制度,让炒房的人不能获得投机的资金,楼市的泡沫自然的
就会散去!!
同学的话——
你终于聪明了一回。可惜!!!
Error info:
E:Dynamic MMap ran out of room. Please increase the size of
APT::Cache-Limit. Current value: 25165824. (man 5 apt.conf), E:Dynamic ...
Reason: sources.list is wrong. (/etc/apt/sources.list)
For example: the ubuntu 9.04 with the sources.list of the ubuntu 8.10, the error will be there.
Others cases:
Error :Synaptic Package Manager
Error info:
E: dpkg was interrupted, you must manually run 'dpkg --configure -a' to correct the problem.
E:_cache->open() failed, please report.
please run 'dpkg --configure -a'.
摘要: 转载:请每一个孝顺的子女耐心的看下去! 阅读全文
摘要: 要理解IOC,推荐: 看《墨攻》理解IoC概念。
IOC从字面来看不容易懂,但如果你看了这篇文章,相信你一定会懂。
佩服原作者! 阅读全文
对于parseInt("01")到parseInt("07");都能得到正确的结果,但如果是parseInt("08") 或parseInt("09")则返回0;
首先看parseInt语法:parseInt(string, radix);
其中string为要转换的字符串,radix为二进制,八进制,十六进制或十进制。
在默认不指定radix时,当以0x开关时,为十六进制;如果以0开关且第二位不为x,则让为是八进制,(因为八进制不能有8,9所以报错返回0)。
所以,在我们用时还是明确指定进位制,以防出错。
如我们平时都用十进制位,我们就 parseInt("08", 10);
摘要: vsftpd 有关错误 500 OOPS: vsftpd: refusing to run with writable anonymous root 阅读全文
摘要: Linux下application中文显示为方块问题的解决 阅读全文
摘要: jquery css hover 阅读全文
DWR 2.0.5,
方法使用对象参数时报错如下:
Erroring: batchId[0] message[org.directwebremoting.extend.MarshallException: Error marshalling test.User:
一个最可能的原因是 User没有一个无参的construction。
晕。。。
朋友们注意呀!
对于以太网环境下UDP传输中的数据包长度问题
首先要看TCP/IP协议,涉及到四层:链路层,网络层,传输层,应用层。
其中以太网(Ethernet)的数据帧在链路层
IP包在网络层
TCP或UDP包在传输层
TCP或UDP中的数据(Data)在应用层
它们的关系是 数据帧{IP包{TCP或UDP包{Data}}}
在应用程序中我们用到的Data的长度最大是多少,直接取决于底层的限制。
我们从下到上分析一下:
在链路层,由以太网的物理特性决定了数据帧的长度为(46+18)-(1500+18),其中的18是数据帧的头和尾,也就是说数据帧的内容最大为1500,即MTU(Maximum Transmission Unit)为1500;
在网络层,因为IP包的首部要占用20字节,所以这的MTU为1500-20=1480;
在传输层,对于UDP包的首部要占用8字节,所以这的MTU为1480-8=1472;
所以,在应用层,你的Data最大长度为1472。
(当我们的UDP包中的数据多于MTU(1472)时,发送方的IP层需要分片fragmentation进行传输,而在接收方IP层则需要进行数据报重组,由于UDP是不可靠的传输协议,如果分片丢失导致重组失败,将导致UDP数据包被丢弃)。
从上面的分析来看,在普通的局域网环境下,UDP的数据最大为1472字节最好(避免分片重组)。
但在网络编程中,Internet中的路由器可能有设置成不同的值(小于默认值),Internet上的标准MTU值为576,所以Internet的UDP编程时数据长度最好在576-20-8=548字节以内。
MTU对我们的UDP编程很重要,那如何查看路由的MTU值呢?
对于windows OS: ping -f -l <data_length> <gateway_IP>
如:ping -f -l 1472 192.168.0.1
如果提示:Packets needs to be fragmented but DF set.
则表明MTU小于1500,不断改小data_length值,可以最终测算出gateway的MTU值;
对于linux OS: ping -c <number> -M do -s <data_length> <gateway_IP>
如: ping -c 1 -M do -s 1472 192.168.0.1
如果提示 Frag needed and DF set……
则表明MTU小于1500,可以再测以推算gateway的MTU。
当然要修改MTU的值,那就是网管的事了(一般人没这权限呀),我们只能申请加等待了 ^-^ .
从JDK5开始就已经增加了对VM的监控功能jconsole,JDK1.6也有了进一步的改进。
然而对linux特别是Ubuntu用户来说,会碰到一些小问题。
在终端进入java_home/bin目录下,
# jconsole
结果报错如下:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
原因就是在ubuntu下用java写Swing应用程序时不能使用SystemLookAndFeel。
实际上出现这个问题是因为swing的默认laf采用systemlaf,而Ubuntu里却没有定义这个laf。
一种很方便的解决方法就是把语言环境改成英文:
# export LANG=en
但对中文用户很不方便(尽管swing程序可以运行)。
另一种方法就是程序启动时加上jvm运行时参数,比如 运行jconsole :
# jconsole -J-Dswing.systemlaf=javax.swing.plaf.metal.MetalLookAndFeel
另外,jconsole对于hostname也有要求,如果执行:
# hostname -i
显时 127.0.0.1,则需要在 /etc/hosts中把127.0.0.1改成机器的外网IP。
这下,我们就又多了一个jvm分析的利器。
Kraken plugin as IM gateway is developed separately from openfire.
It is built alongside openfire.
Kraken build Detail:http://kraken.blathersource.org/node/9
But I still encountered this problem when I did that.
When I run the step:ant release,I found the following error,although BUILD SUCCESS,
Error:
[jasper2] 409 DEBUG No Java compiler available
[jasper2] java.lang.NoClassDefFoundError: org/eclipse/jdt/internal/compiler/env/INameEnvironment
NoClassDefFound,obviously,there is no class named 'INameEnvironment',
I run 'find ./ -name jdt*' ,there is nothing really.
I know that it need a jar named 'jdt-compiler' via google,so I download it.
If you can find it to download you can come the following site:
http://fisheye1.atlassian.com/viewrep/springframework/spring/lib/jdt or
http://softwarelivre.sapo.pt/projects/ptpos/browser/openbravopos/trunk/build/zip/lib/jdt-compiler-3.1.1.jar?rev=35
I get jdt-compiler-3.1.1.jar from the site mentioned above,and put it into the java lib directory;
then,add a line :<pathelement location="${java.home}/../lib/jdt-compiler-3.1.1.jar"/> in classpath of taskdef named 'jasper2' in the build.xml of Openfire
So far so good ,I have fixed it.
PEM : Privacy Enhanced Mail 隐私增强邮件
是使用多种加密方式提供机密性、认证、信息完整性的因特网电子邮件,在因特网中没有被广泛配置;
而现在更多的是用作密钥格式,并且可包含私钥(RSA和DSA)、公钥(RSA和DSA)、X509证书,它存储ASCII包装的BASE64编码的DER数据,适用于系统之间的文本模式传输。
DER : Distinguished Encoding Rules 分布式编码规则
也可包含私钥、公钥和证书,它是大多数浏览器的默认证书格式,并且按ASN 1 DER 格式存储进行存储。(它没有头部-PEM是有文本头部包装的DER)。
VoIP : Voice over Internet Protocol 网络语音传输
SIP : Session Initiation Protocol 会话发起协议
经过漫长的配置,终于搞定了windows AD、domain和Exchange2007,
新建了帐户后,用户 fingki 密码 ************** 邮件 fingki@mydomain.com 在另一台win xp上测试。
这里要注意DNS的配置,且要打开服务 services,确定pop3等邮件服务都已经启动。
首先加入该域 mydomain.com
然后 重启,用fingki登录该域,一切还算顺利。
再 测试邮件收发,启动Outlook,用fingki@mydomain.com新建一outlook帐户,邮件服务器用户名 fingki密码************;其他的是默认配置。
测试给administrator@mydomain.com发一封邮件,正常,然后再给自己发一封;
接收邮件时,提示:由于服务器拒绝接受发件人的电子邮件地址,这封邮件无法发送。...服务器响应: '530 5.7.1 Client was not authenticated', 端口: 25, 安全(SSL): 否, 服务器错误: 530, 错误号: 0x800CCC78.
奇怪。
后来发现,原来exchange2007默认是采用ssl安全传输的,需要对 pop3设置安全连接,端口会默认变为995。(即选中:“此服务器要求安全连接SSL”)。
按上面要求 设置pop3为SSL连接。接收邮件就正常了。
(网上也有朋友说是DNS的MX记录丢失,但显然我的不属于这种情况)。
另外,很有意思的是如果你为Exchange用户设定多个电子邮件地址(当然只会有一个为默认邮件地址,或叫主地址),当有人给你向这多个地址中发送邮件时,这些邮件都会发到你的主地址邮箱中。
View cpu information command:
1 # dmesg | grep CPU
2 # cat /proc/cpuinfo
you can find the following from the show :AMD Athlon(tm) 64 X2 Dual Core Processor 4000+
It tell you :64bit cpu
View OS version:
# cat /proc/version
you can see information similar to the following:
Linux version 2.6.24-21-generic (buildd@palmer) (gcc version 4.2.3 (Ubuntu 4.2.3-2ubuntu7)) #1 SMP Tue Oct 21 23:43:45 UTC 2008
View OS bit num:
# getconf LONG_BIT
you can see :32 or 64.
摘要: If you install im gateway plugin firstly, perhaps you did not encounter this problem.
If you upgrade your im gateway plugin, perhaps you have been in trouble.
Unfortunately,I encountered this problem some days ago.
I used the openfire 3.4.5, and it contains the gateway plugins; 阅读全文
摘要: sudoer application Launcher
On Ubuntu,run applications as sudo via Application Launcher 阅读全文
JSCalendar 日历控件 使用样例如下:
<html>
<head>
<style type="text/css">@import url( /js/jscalendar/calendar-win2k-cold-1.css );</style>
<script type="text/javascript" src="/js/jscalendar/calendar.js"></script>
<script type="text/javascript" src="/js/jscalendar/i18n.jsp"></script>//不用i18n可以指定语言 如:<script type="text/javascript" src="/js/jscalendar/lang/calendar-en.js"></script>
<script type="text/javascript" src="/js/jscalendar/calendar-setup.js"></script>
</head>
<body>
<input type="text" size="10" name="fromDate" id="fromDate" maxlength="10" onchange="checkSpecific();" value=""/>
<img src="images/icon_calendarpicker.gif" id="fromDateCal" />
<br>
<script type="text/javascript" >
Calendar.setup(
{
inputField : "fromDate", // ID of the input field
ifFormat : "%m/%d/%Y", // the date format
button : "fromDateCal", // ID of the button
});
</script>
</body>
</html>
上述示例代码在jsp容器中运行完全正常。
当一个类实现了序列化接口,有时会遇到 java.io.InvalidClassException 异常出现:
java.io.InvalidClassException: com.test.Test; local class incompatible: stream classdesc serialVersionUID = 7981560250804078637, local class serialVersionUID = -8334405535174160822
这是序列化兼容性所致;
java通过一个名为UID(stream unique
identifier)来控制,这个UID是隐式的,它通过类名,方法名等诸多因素经过计算而得,理论上是一一映射的关系,也就是唯一的。如果UID不一
样的话,就无法实现反序列化了,并且将会得到InvalidClassException。
当要人为的产生一个新的版本(实现并没有改动),而抛弃以前的版本的话,可以通过显式的声名UID来实现:
private static final long serialVersionUID=????;//(你可以编造一个UID,但不能有重复)
对于上例我们可以在com.test.Test类中加入 :
private static final long serialVersionUID=7981560250804078637l;
这样就解决了新老版本的兼容性问题。
当然,对于序列化还有很多问题,慢慢研究吧。
对volatile,看到了个很清楚的解释,摘录下来如下:
volatile关键字有什么用?
恐怕比较一下volatile和synchronized的不同是最容易解释清楚的。volatile是变量修饰符,而synchronized则作用于一段代码或方法;看如下三句get代码:
- inti1; intgeti1(){returni1;}
- volatile inti2; intgeti2(){returni2;}
- int i3; synchronizedintgeti3(){returni3;}
geti1()得到存储在当前线程中i1的数值。多个线程有多个i1变量拷贝,而且这些i1之间可以互不相同。换句话说,另一个线程可能已经改
变了它线程内的i1值,而这个值可以和当前线程中的i1值不相同。事实上,Java有个思想叫“主”内存区域,这里存放了变量目前的“准确值”。每个线程
可以有它自己的变量拷贝,而这个变量拷贝值可以和“主”内存区域里存放的不同。因此实际上存在一种可能:“主”内存区域里的i1值是1,线程1里的i1值
是2,线程2里的i1值是3——这在线程1和线程2都改变了它们各自的i1值,而且这个改变还没来得及传递给“主”内存区域或其他线程时就会发生。
而geti2()得到的是“主”内存区域的i2数值。用volatile修饰后的变量不允许有不同于“主”内存区域的变量拷贝。换句话说,一个变量经
volatile修饰后在所有线程中必须是同步的;任何线程中改变了它的值,所有其他线程立即获取到了相同的值。理所当然的,volatile修饰的变量
存取时比一般变量消耗的资源要多一点,因为线程有它自己的变量拷贝更为高效。
既然volatile关键字已经实现了线程间数据同步,又要synchronized干什么呢?呵呵,它们之间有两点不同。首
先,synchronized获得并释放监视器——如果两个线程使用了同一个对象锁,监视器能强制保证代码块同时只被一个线程所执行——这是众所周知的事
实。但是,synchronized也同步内存:事实上,synchronized在“主”内存区域同步整个线程的内存。因此,执行geti3()方法做
了如下几步:
1. 线程请求获得监视this对象的对象锁(假设未被锁,否则线程等待直到锁释放)
2. 线程内存的数据被消除,从“主”内存区域中读入(Java虚拟机能优化此步。。。[后面的不知道怎么表达,汗])
3. 代码块被执行
4. 对于变量的任何改变现在可以安全地写到“主”内存区域中(不过geti3()方法不会改变变量值)
5. 线程释放监视this对象的对象锁
因此volatile只是在线程内存和“主”内存间同步某个变量的值,而synchronized通过锁定和解锁某个监视器同步所有变量的值。显然synchronized要比volatile消耗更多资源。
附英文原文:
What does volatile do?
This is probably best explained by comparing the effects that
volatile and synchronized have on a method. volatile is a field
modifier, while synchronized modifies code blocks and methods. So we
can specify three variations of a simple accessor using those two
keywords:
- inti1; intgeti1(){returni1;}
- volatile inti2; intgeti2(){returni2;}
- int i3; synchronizedintgeti3(){returni3;}
geti1() accesses the value currently stored in i1 in the current
thread. Threads can have local copies of variables, and the data does
not have to be the same as the data held in other threads. In
particular, another thread may have updated i1 in it’s thread, but the
value in the current thread could be different from that updated value.
In fact Java has the idea of a “main” memory, and this is the memory
that holds the current “correct” value for variables. Threads can have
their own copy of data for variables, and the thread copy can be
different from the “main” memory. So in fact, it is possible for the
“main” memory to have a value of 1 for i1, for thread1 to have a value
of 2 for i1 and for thread2 to have a value of 3 for i1 if thread1 and
thread2 have both updated i1 but those updated value has not yet been
propagated to “main” memory or other threads.
On the other hand, geti2() effectively accesses the value of i2 from
“main” memory. A volatile variable is not allowed to have a local copy
of a variable that is different from the value currently held in “main”
memory. Effectively, a variable declared volatile must have it’s data
synchronized across all threads, so that whenever you access or update
the variable in any thread, all other threads immediately see the same
value. Of course, it is likely that volatile variables have a higher
access and update overhead than “plain” variables, since the reason
threads can have their own copy of data is for better efficiency.
Well if volatile already synchronizes data across threads, what is
synchronized for? Well there are two differences. Firstly synchronized
obtains and releases locks on monitors which can force only one thread
at a time to execute a code block, if both threads use the same monitor
(effectively the same object lock). That’s the fairly well known aspect
to synchronized. But synchronized also synchronizes memory. In fact
synchronized synchronizes the whole of thread memory with “main”
memory. So executing geti3() does the following:
1. The thread acquires the lock on the monitor for object this
(assuming the monitor is unlocked, otherwise the thread waits until the
monitor is unlocked).
2. The thread memory flushes all its variables, i.e. it has all of its
variables effectively read from “main” memory (JVMs can use dirty sets
to optimize this so that only “dirty” variables are flushed, but
conceptually this is the same. See section 17.9 of the Java language
specification).
3. The code block is executed (in this case setting the return value to
the current value of i3, which may have just been reset from “main”
memory).
4. (Any changes to variables would normally now be written out to “main” memory, but for geti3() we have no changes.)
5. The thread releases the lock on the monitor for object this.
So where volatile only synchronizes the value of one variable
between thread memory and “main” memory, synchronized synchronizes the
value of all variables between thread memory and “main” memory, and
locks and releases a monitor to boot. Clearly synchronized is likely to
have more overhead than volatile.
摘自:http://bianbian.org/technology/java/88.html
有synthetic标记的field和method是class内部使用的,正常的源代码里不会出现synthetic field。小颖编译工具用的就是jad.所有反编译工具都不能保证完全正确地反编译class。所以你不能要求太多。
下面我给大家介绍一下synthetic
下面的例子是最常见的synthetic field
class parent
{
public void foo()
{
}
class inner
{
inner()
{
foo();
}
}
}
非static的inner class里面都会有一个this$0的字段保存它的父对象。编译后的inner class 就像下面这样:
class parent$inner
{
synthetic parent this$0;
parent$inner(parent this$0)
{
this.this$0 = this$0;
this$0.foo();
}
}
所有父对象的非私有成员都通过 this$0来访问。
还有许多用到synthetic的地方。比如使用了assert 关键字的class会有一个
synthetic static boolean $assertionsDisabled 字段
使用了assert的地方
assert condition;
在class里被编译成
if(!$assertionsDisabled && !condition)
{
throw new AssertionError();
}
还有,在jvm里,所有class的私有成员都不允许在其他类里访问,包括它的inner class。在java语言里inner class是可以访问父类的私有成员的。在class里是用如下的方法实现的:
class parent
{
private int value = 0;
synthetic static int access$000(parent obj)
{
return value;
}
}
在inner class里通过access$000来访问value字段。
摘自:http://www.cjsdn.net/post/print?bid=1&id=130784
相关资料:
IETF : http://www.potaroo.net/ietf/idref/draft-nourse-scep/
Java SCEP : http://www.urut.ch/scep/
OpenSCEP : http://openscep.othello.ch/
一朋友推荐给我的文章,感觉很不错;摘抄过来,也给同行们提个醒!
论坛里经常可以看到关于 35 岁程序员的生涯询问, 他们之中有些人写了十年代码, 有些人则是因为对编程发生了兴趣, 中途转行, 以下四点是给那些 30 - 35 岁程序员的建议:
* 照顾自己健康
以前, 我认为 "钱" 是很重要的, 俗话说的好: "钱不是万能, 但没有钱万万不能", 所以过去我的焦点都是放在收入,
但后来我发现有比钱更重要的东西, 那是 "家", 在你没有结婚前, 这个家的概念是指你和父母的和谐关系, 而在结婚后,
家的概念是指如何维系一个家庭, 包括和太太还有孩子的关系。
在 IT 这个行业里, 很多人跟自己父母的想法是有差距的, 认为上一代保守, 食古不化, 讲到很多东西没法沟通, 另外,
我的很多朋友事业做很大, 但最后却离婚了, 没有孩子还好, 有孩子的要想更多, 只有家, 你才有奋斗的目标, 才有精神的支持,
否则就像电视里讲的那一句, 失去了你, 得到江山又如何?
但这个家的信念自从张国荣事件后, 又改变了我的看法, 那就是有比家更重要的东西, 那是你的 "健康",
这个健康包括生理和心理上的健康, 想想看你拥有了一个家, 但是因为没有健康, 全家人都被拖下去了, 每天看着你痛苦的吊瓶子,
更严重的直接轻生, 这样遗留给珍爱你的人只是更大的痛苦, 你会 C, C++, C#, Java... 又怎样?
那时候你会认为这些通通都是屁, 做人做到能够 "吃得下饭、睡得着觉、笑得出来" 就已经是莫大的幸福。
35 岁会困惑的人多半是因为二十几岁的时候就没有做好准备, 过去的已经不可追, 现在要想的应该是 45 岁怎么办?
有人说年轻比的是学问, 中年比的是财富, 老年比的是健康, 如果你现在不注意自己健康, 那么很快更大的困扰就会上门了,
人生每个阶段都有扮演的角色, 要学会未雨绸缪, 否则不用到 50 岁, 可能 40 岁就会开始后悔了, 健康要从饮食和运动着手,
多涉猎这方面的常识, 比搞那些过几年就要淘汰的技术有意义多了。
* 学会投资理财
很多人认为投资理财需要很多的钱, 这是不正确的, 会理财的人, 小钱可以积累到大, 不会理财的人, 大钱也会消耗到光,
投资理财首重的是风险管理, 没有风险管理就像在刀口舔血一样, 投资理财应该要趁早磨练, 不要等到 40 岁的时候才去冒险,
因为那时候你已经没有本钱跌倒, 投资理财的方法有很多, 并不是只有房地产, 股票这些东西, 从节约, 储蓄, 定存... 每一步都是学习,
关键是你要从投资的过程里去发现自己, 并且了解如何正确对待甚至对付自己, 这样你才有机会早一日达到经济自由, 不会提心吊胆这个那个。
投资理财要量力而为, 不要做超过你能力所能负荷的事情, 我给程序员最好的建议是关注经济, 不要浮躁, 错把投机当投资, 这样还不如定存来得可靠安全。
* 经营你的人脉
我觉得程序员除了普遍不善理财外, 另外人际沟通也多有问题, 很多人在离开公司的剎那, 整个人感觉也都被掏空了, 而且会有一种担忧, 以前别人跟我说话那是因为我是某某公司的员工, 现在不是了, 可能就没有什么人会再鸟我了, 这就是典型的人脉经营危机。
人脉的经营不是看你有没有朋友, 而是有没有能帮助你同时又有实力的朋友。有些人朋友很多, 但真正遇到困难, 只能精神上支持一下,
除此外, 帮不上任何忙, 这代表人脉还是太单薄, 不要总问别人能给你什么? 也要问问你能给别人什么? 懂得去欣赏别人,
而不要像患了红眼病一样, 漠视别人背后的辛劳的付出, 只知道妒忌表面的风头, 这样, 只会将自己的路越走越窄。
经营自己的人脉是有秘诀的, 首先你要了解自己存在的价值, 如果没有存在的价值, 那么经营的人脉是空的,
这跟有存在价值却不知道怎样经营人脉, 基本上差不多, 经营人脉并不等于趋炎附势, 而是指在得势的时候, 就要想到落难的时刻, 待人宽厚真诚,
花无百日好, 人无千日红, 多欣赏别人, 择友深交, 别把时间浪费在小屁孩身上。
* 培养广泛兴趣
一个程序员如果除了 IT 以外, 一点其它的兴趣也没有, 那真的是很危险的事情, 像我现在年龄已经超过 35 岁了, 很快就要 40,
但我现在还是每天写代码, 做项目已经不是为了维生, 而是纯粹兴趣了, 我想我会一直写下去,
同时开始加强自己经营管理或财务方面的知识。你说郭安定以后玩不了电脑怎么办? 他就去写书, 万一双手废了怎么办? 那就去配音,
万一声音也哑了怎么办? 那就重回金融市场, 让徒子徒孙帮忙着下单, 眼球看左就买, 看右就卖, 就这么一直玩下去...
所以人生不是只有一条路, 你得为自己想好方方面面, 而广泛的兴趣可以帮助你跳脱现况, 看到更多。
以上四点不仅是 35 岁的人要注意的, 很多甚至二十几岁的人也要开始关注, 说真的, 很多程序员看上去每个体型都不错, 但体格都马马虎虎, 很多人熬个两天夜就不行了, 不知该说什么... 一起加油吧。
Tsung,压力测试的好工具。
安装过程:
1.获取tsung 的源码。http://tsung.erlang-projects.org/
2.安装依赖 erlang(从源码编译 erlang 写的程序) gnuplot perl5(如果想看 report 中的图形,就要装这个)
apt-get install erlang erlang-src gnuplot perl5 我用的是Ubuntu 8 OS.
3.编译安装
./configure
make
sudo make install
安装完成之后的 tsung 运行脚本在 /usr/bin/tsung ,在系统 path 之中,可以直接运行。
设置
从 /usr/share/doc/tsung/examples 中挑一两个例子拷贝到 ~/.tsung/tsung.xml 作为配置文件。我只需要 http 测试,所以:
cp /usr/share/doc/tsung/examples/http_simple.xml ~/.tsung/tsung.xml
tsung 采用了巧妙的 proxy 方式来“录制”测试脚本。具体来说,就是建立一个本机的 http proxy 默认使用 8090
端口,在配好 firefox 使用 localhost 8090 作为代理之后(推荐 foxyproxy 插件),所有“流经”这个 proxy
的 http 动作都会被记录下来,测试时可以“回放”这些步骤来产生请求。
tsung rocorder
tsung stop_recorder
“录制”完了,会得到一个 ~/.tsung/tsung_recorderXXXXXXXXXX.xml 文件,这就是测试时回回放的脚本。
将这个脚本加到 tsung.xml 之中
就像这样
<!DOCTYPEtsungSYSTEM"/usr/share/tsung/tsung-1.0.dtd" [
<!ENTITYmysession1SYSTEM"/home/yourname/.tsung/tsung_recorderXXXXXXXXXX.xml">
]>
...
<sessions>
&mysession1;
</sessions>
对配置稍作调整
<monitoring>
<monitorhost="localhost"type="erlang"></monitor>
</monitoring>
<!-- 需要配置到 localhost 无须密码的 ssh 登录(ssh via rsa_key),开启了这个配置可以,获得目标机器的 cpu 和 ram 消耗情况 -->
<load>
<arrivalphasephase="1"duration="1"unit="minute">
<usersinterarrival="2"unit="second"></users>
</arrivalphase>
</load>
<!-- 第1阶段1分钟(你可以自己多搞几个阶段),其中每2秒新建一个用户,每个用户都会完整执行 session 的测试脚本,最高并发约为 30 个,个人认为这个“逐渐加压”的方法比 ab xxxx 的“突然加压”要慢一些,但更科学一点 -->
运行
准备好了,加压运行。
运行完,在 ~/.tsung/log 目录会生成一个以时间命名的目录,进入这个目录
cd ~/.tsung/log/xxxxx
/usr/lib/tsung/bin/tsung_stats.pl (有时可能是 /usr/local/lib/tsung/bin/tsung_stats.pl)
生成 html 的压力测试报告
除了 http 以外 tsung 还可以压很多东西,比如:jabber, postgreSQL 还可以写插件来给任何你想要测试的东西加压.
通过/etc/init.d/iptables status命令查询是否有打开80端口,如果没有可通过两种方式处理:
1.修改vi /etc/sysconfig/iptables命令添加使防火墙开放80端口
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
2.关闭防火墙
/etc/init.d/iptables stop
#start 开启
#restart 重启
Backup to Script:
首先切换到postgres用户:
liqingfeng@liqingfeng:~$ su postgres
口令: 输入密码
postgres@liqingfeng:/home/liqingfeng$
然后输入backup命令:
pg_dump -U[username] -d -f[way of script file] [database name]
例如:pg_dump -Upostgres -d -f/home/liqingfeng/test.sql testdb
这样数据库testdb将以sql脚本形式backup到/home/liqingfeng/test.sql中。
Restore from Script:
还是首先要切换到postgres用户下,输入命令:
psql -U[username] -d[database name] -f[way to an existing script file]
例如:
psql -Upostgres -dtestdb -f/home/liqingfeng/test.sql
当进行大并发的压力测试时,经常会出现如下Exception:Too many open files.
查阅资料,google baidu.
首先感谢demo的评论,使我对这个问题有了新的认识。
经过再次查找,发现这个问题的出现原因是system对打开files数量的限制问题。
用 ulimit -a 命令可以查看当前所有资源限制
fingki@ubuntu:~$ ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 15863
max locked memory (kbytes, -l) 32
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 15863
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
fingki@ubuntu:~$
可以看出,对open files的限制数是1024,我们可以通过修改这个值来增加可以打开的文件数。
最简单的修改方式就是用ulimit -n 命令,
比如我打算将其改为2048,用 ulimit -n 2048.
当你把open files的值增大到一定程度,你的Too many open files就不会再出现了。
而对于tcp_fin_timeout,是合tcp连接相关的,当你有大量tcp连接时,或许有些性能改善;
tcp_fin_timeout,默认情况下,win为4 min,linux为60 sec.
可以把其相应设置短一些,以增加系统性能。
in Windows
- Run regedit to start the Registry Editor
- Locate the following key: HKEY_LOCAL_MACHINE"System"CurrentControlSet"Services"tcpip"Parameters
- Add a new value named TcpTimedWaitDelay asa decimal and set the desired timeout in seconds (30-300)
- Reboot
in Linux
- Update the configuration value by running (30 seconds used in the example)
echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout
- Restart the networking component, for example by running
/etc/init.d/networking restart or service network restart
在linux下,经常会有权限问题使设置不能成功,尽管你用了sudo。
解决办法就是先 su root,在root用户下来执行操作,这样就ok了。
再有就是可能忘记root密码了,那就 sudo passwd root,来设置一个新密码。
根据进一步的研究发现:服务器默认情况下对进程的处理也是有限制的,要想server处理更多用户进程就需要调整相应参数。
这里面有两个文件要特别注意,
一个是 /etc/security/limits.conf
另一个 /etc/sysctl.conf
当我们用ulimit -a命令可以查看 open files(默认为1024)和max user processes(默认也为1024),
所以默认情况下这个server只允许同时打开1024个文件,处理1024个用户进程,
若要 临时 改变这两个参数值,可以使用 ulimit -n 10240 ,ulimit -u 10240,
若要 长久 改变这两个参数值,就要修改/ect/security/limits.conf,在文件中加上两行:
* - nofile 102400
* - nproc 102400
而对于大量使用tcp连接的应用来说,也需要对/etc/sysctl.conf中的参数进行相应优化:
net/ipv4/ip_always_defrag = 1
net.ipv4.ip_local_port_range = 1024 65000
net.ipv4.tcp_max_syn_backlog = 102400
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
上面是我根据我的需求的一些参数调整,你可以根据你的需求来调整相应参数值。
然后执行 sysctl -p命令可立即生效。sysctl -a可查看参数值。
参考 :http://www.javaeye.com/topic/65175
1、Scp 很好用的远程文件安全传输命令
命令格式:scp [-r] 源文件路径 目标文件路径
源文件路径:username@hostname:文件路径 For example:fingki2@192.168.0.2:test/a.txt (如果是本地可直接写相应路径)
目标文件路径:username@hostname:文件路径 For example:fingki3@192.168.0.3:test/a.txt (如果是本地可直接写相应路径)
-r:如果是传目录 就要加上这个参数
要求:远程机器必须打开22端口
2、ssh 很好的linux服务器登录命令 secure shell
简易命令格式:ssh username@hostname 然后输入密码即可进入系统。
有时你会遇到如下问题:
The authenticity of host '172.0.x.xxx (172.0.x.xxx)' can't be established.
RSA key fingerprint is 1f:c9:78:0a:ce:e2:e5:10:2c:b5:f4:33:19:fa:be:ec.
Are you sure you want to continue connecting (yes/no)?
如果你是第一次在这台机器上使用ssh命令,输入yes回车后,就可以输入密码登录了。
如果输入yes后仍有问题,你可以到 ~/.ssh/下找到文件known_hosts,清除文件里面的内容,重试即可。
3、vi列模式编辑:
用命令打开文本:vim test.txt
按 Esc 取消当前模式,
按Ctrl + v 进入这种模式,
将光标移到指定列位置,
然后按方向键选定指定列,进行编辑(删除等)
4. 批量删除
如:删除所有名字包含test的文件
find ./ -name *test* | xargs rm -f
前两天一个朋友问我,为什么要写blog?
是呀,为什么要写blog呢?为什么大家都在写blog呢?
我来说说我的想法吧。
最开始的时候,我纯粹是跟风,大家都在写blog,自己也就想玩玩,随便申请了一个,然后写几篇不相干的东西,然后忘记了;
后来,工作中经常遇到一些技术问题,想把它记录下来,想到了blog这种方式,很不错,很方便,所以又开始找个相关的blog,开始写;
再后来,发现有好多的问题都是在别人的blog中找到的答案,很羡慕,很感激,于是也开始把自己的一些经验拿出来和大家分享;
慢慢的,当发现自己的文章也曾帮助过别人时,感觉很高兴;于是,工作不是很忙时,就会写一些东西和大家分享;
我是blog的受益者,我也是blog的贡献者!正是blog,使我们可以互补技术上的缺点,分享工作中的经验,让我们更快的进步!
于是有感于blog: 是分享,是共同进步!
About Exception:
An invalid XML character (Unicode: 0x0) was found in the element content of the document.
问题描述:
当我们用
byte[] info ;
DocumentHelper.parseText(new String(info));
将一个字节数组转成字符串再转成Document(XML格式)时,常常会遇到上述异常。
特别是当字符串有加、解密,或编码等情况时。
原因:
从异常来看,很明显是因为字节数组中存在 Unicode: 0x0,而这个字节在Xml中被认为是非法字符。
对于一些经过编码或加、解密的字符串中,很容易会出现这个 0x0,
特别是在加、解密中,经常会涉及到字符填充,而填充物通常是 0x0,
需对于0x00-0x20 都会引起一定的问题,又因为这些字符不可见,因此用通常的编辑器进行编辑的时候找不到问题所在。
而在转成String后也觉察不到任何异常。
所以在转成XML格式时要对字符串进行检测:
* Verify that no character has a hex value greater than 0xFFFD, or less than 0x20.
* Check that the character is not equal to the tab ("t), the newline ("n), the carriage return ("r), or is an invalid XML character below the range of 0x20. If any of these characters occur, an exception is thrown.
pubic void CheckUnicodeString(String value)
{
for (int i=0; i < value.Length; ++i) {
if (value[i] > 0xFFFD)
{
throw new Exception("Invalid Unicode");//或者直接替换掉0x0 value[i]='"n';
}
else if (value[i] < 0x20 && value[i] != '"t' & value[i] != '"n' & value[i] != '"r')
{
throw new Exception("Invalid Xml Characters");//或者直接替换掉0x0 value[i]='"n';
}
}
相关资源:
http://msdn.microsoft.com/en-us/library/k1y7hyy9.aspx
http://gceclub.sun.com.cn/developer/technicalArticles/Intl/Supplementary/index_zh_CN.html
keystore是个密钥存储库,我们经常用他来存储非对称密钥,但有时我们也需要它来存储一些对称密钥。
public void createKeyStore() {
try {
KeyGenerator keyGen = KeyGenerator.getInstance("DES");
SecureRandom random = SecureRandom.getInstance("SHA1PRNG", "SUN");
keyGen.init(56, random);
SecretKey secretKey = keyGen.generateKey();
KeyStore ks = KeyStore.getInstance("jceks");
char password[] = {'c', 'h', 'a', 'n', 'g', 'e','i','t' };
// Create an empty keystore
ks.load(null, password);
KeyStore.SecretKeyEntry skEntry = new KeyStore.SecretKeyEntry(secretKey);
ks.setEntry("myKey", skEntry, new KeyStore.PasswordProtection(password));
// store away the keystore
java.io.FileOutputStream fos =
new java.io.FileOutputStream("mystore");
ks.store(fos, password);
fos.close();
} catch (NoSuchAlgorithmException nsaex) {
nsaex.printStackTrace(System.err);
} catch (NoSuchProviderException nspex) {
nspex.printStackTrace(System.err);
} catch (KeyStoreException ksex) {
ksex.printStackTrace(System.err);
} catch (CertificateException cex) {
cex.printStackTrace(System.err);
} catch (IOException ioex) {
ioex.printStackTrace(System.err);
}
}
上面的例子是存一个DES密钥。
需要注意的就是这个keystore的类型,必须是jceks,
之前我就是使用默认的jks,导致报错。
以往有听说过“Microsoft Windows、FreeBSD不安全随机数生成器信息泄露漏洞”之类的文章,大都是因为随机函数存在漏洞生成不安全的随机,导致可预测的加密密钥。
About Random
随机数是密码学的一个重要部分,它通常作为初始化向量用于密钥生成中。有许多测试根据数字计算给定数字序列的随机性,它们考虑给定数定在序列中出现的周期,做更细致的测量,包括相同数字或其他重复形式出现的周期。
但统计随机性的要求与加密随机性不同。
一个数字序列在统计上是随机的,但如果攻击者可以推算出数字的序列(通过了解使用的算法和随机种子值),那么加密是变得不安全了。
About Pseudo Random 伪随机数
对于一串随机的数字,最常见的描述就是没有从前一个数字推算出后一个数字的数学方法。最好的随机数是从物理过程中获得的,因为实际物理程才是真正随机的。事实上,一些随机数生成器就是使用硬件设置来实现,如音频输入或二极管。
从设计上来说,计算机是很确定的,因此不是生成随机数的就好选择。它们通常求助于一个生成统计上随机的数字串的算法。为了确定在该算法中使用的输入值,它们要求用户提供一个种子值,这通常来自于系统时钟、网卡MAC地址以及其他不同的系统参数。
这些随机数字很适合于计算机游戏中的示例数据或建模物理过程。不过,它们不适合于加密。它的弱点包括以下几点:
● 伪随机数是周期性的。最终将重复数字序列。
● 如果使用相同的种子值,将接收到序列完全一样的“随机”数。因此,随机序列与种子值一样多。
● 随机数可使用逆向工程。运用算法知识,强力攻击会立即猜测到种子值。如果种子值和时间之间有相关性,攻击者将会推算出所有后面的“随机”数。
伪随机数是出现许多臭名昭著的攻击的主要原因。破解56 位DES从1997年1月的96 天到1999 年1月的22 小时15 分钟,由于DES使用的伪随机数生成算法导致了这个结果,有一种攻击就是针对赌博应用程序,这种应用程序使用一个随机数种子值来对纸牌进行排序,而洗牌的可能性是有限的。在看完开始的几张牌后,用户可以将当前发的牌与某种可能的洗牌序列匹配,来确定剩下牌的顺序。
另一个著名的例子就是Netscape Navigator 早期版本中的取决于时间的随机数字生成器,它泄露了动态生成的用于加密运用SSL的会话中数据的密钥。
About Random encrypted 加密的随机数
随机数生成是许多加密操作不可分割的组成部分。例如,加密密钥需要尽可能地随机,以便使它们很难被复制。加密随机数生成器必须生成在计算上无法进行推算(低于 p < .05 的概率)的输出;即,任何推算下一个输出位的方法不得具有比随机猜测更高的成功几率。
为了说明一连串的随机数字是加密安全的,必须使得用户不可能通过计算重新生成同样序列的随机数。遗憾的是,运用伪随机数字,可以很容易地重新生成同样的序列。用户需要知道的知识就是伪随机数生成器算法和种子值。
通过加密保护数据基于加密算法和更为随机的种子值就是本文要提出的方法,一个带加密功能的随机数产生器,可以应用于需要加密随机数的场合.为了构成种子值,需要用不同的值组合成一个系统范围内的种子值。这些值包括调用的应用程序可以提供的位,例如鼠标或键盘动作之间的用户反应时间、象进程ID和线程ID这样的系统和用户数据、系统时钟、系统计数器、自由磁盘集群属和散列的用户环境块。接着使用SHA-1散列这个值,输出用于创建一个随机数据流(用于更新系统种子值)。这可以起作用,是因为散列值生成了看似随机的数据,只改变源文档(种子值)中的一个位,任何两个输出的散列共享它们50%的位,尽管两个输出只有一位之差。当然,从理论上讲,有些过程还是周期性的。例如磁盘搜索时间看似随机的,实际取决于易于确定的因素,可以被推测出来。为了获取更好的随机数生成,可以采用硬件生成器,例如Intel的随机数生成器。
说明:
创建加密安全的随机数需要更多的时间,这意味着如果需要快速地在一个短时间内生成大量随机数(例如百万级的数据)是不适合的。在一个简单测试中,用本文提到的RNG生成一百万个随机数的时间花费差不多是伪随机数生成器所用时间的八倍之多。
相关资源:http://www.xfocus.net/articles/200209/451.html
在ubuntu-server下安装phppgadmin遇到如下问题,记录如下:
首先安装postgresql很简单,sudo apt-get instatll postgresql
安装完成后,可能需要更改默认用户postgre的密码,这个可以查看我之前的文章。
然后,安装client,我打算使用phppgadmin,
命令行下:sudo apt-get install phppgadmin
完成后,默认同时安装了它所依赖的apache2。
在浏览器中输入:http://localhost,显示 It works.这说明apache2在正常工作。
但输入http://localhost/phppgadmin,显示无法找到该页,
进入 /var/www中查看,只有index.html,所以肯定找不到phpgpadmin,
所以需要做link,
执行:sudo find / -name phppgadmin,查找出phppgadmin的位置,
然后做连接: sudo ln -s /usr/share/phppgadmin phppgadmin
之后再试浏览器中访问http://localhost/phppgadmin,这次可以找到文件了,但提示是否下载php文件。
一同事说遇到过这样问题,说是少个libapache2-mod-php5,查看一下已经安装了。
于是google一番,得知:如果当您浏览PHP网页的时候,浏览器提示您是否下载PHP文件而不是去显示它的时候,就可能是您没有安装libapache2-mod-php5。当您
安装PHP5的时候,它会被默认的安装进去的,如果您不小心的将它遗忘了。您就需要去将它打开,sudo a2enmod php5,然后使用sudo
/etc/init.d/apache2 restart来重新启动APACHE。
果然重启apache2后,可以正常访问了。
要用java检测网络资源是否可用,我们可以采用以下两种方法:
一种方法是调用ping命令,
如:
Process process= Runtime.getRuntime().exec("ping 192.168.0.5");
InputStreamReader return = new InputStreamReader(process.getInputStream());
LineNumberReader returnData = new LineNumberReader (return);
String line="";
while((line=returnData.readLine())!=null){
System.out.println(line);
}
通用对返回数据进行分析,来探测网络资源的可用性;
这种方法有一个缺点:就是许多网络资源是不允许被ping的,从而针对这类资源无法探测。
另一种方法是使用URL,
如:
URL url = new URL("http://localhost");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
int state = connection.getResponseCode();
String responseContent = connection.getResponseMessage();
通过分析ResponseCode来探测网络资源的可用性。
另外,当指定的网络资源走SSL时,即用https协议时,需要加入可信证书到trust.keystore.
通常情况下,我的用的是jre的keystore:cacerts,如jdk6下的路径为:jdk1.6.0_05/jre/lib/security/cacerts
我们需要把指定资源的数字证书导入到信任库 cacerts.
可以使用keytool工具:keytool -import -alias localhost -file localhost.cer -keystore cacerts
如果我们不想使用jre的keystore,我们可以建立自己的keystore,
System.setProperty("javax.net.ssl.trustStore", "/home/liqingfeng/workspace/Test/mystore/localhost.keystore");
System.setProperty("javax.net.ssl.trustStorePassword","changeit");
用keytool命令把localhost的证书导入到指定的localhost.keystore中。这样我们就可以用URL来探测SSL网络资源的可用性了。
这里必须注意的是指定网络资源的证书的CN,必须与资源访问地址一致,否则会报错。
以下是常见异常:
当keystore中没有指定资源的证书时:
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
当指定资源证书的CN与资源访问地址不匹配时:
javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: No name matching localhost found
在我们用程序进行HTTP连接时,都要监测返回的httpstatus,来确定响应状态。
一般的情况下返回都是401,500等。
但有时候会返回 -2146697211,这种情况一般是无法访问指定资源。
请检查网络是否异常,是否可以ping通指定资源。
我曾见到的问题是在DNS中没有绑定指定的域名和IP,
例如:我要访问的资源为:http://liqingfeng:8080 IP为192.168.0.5
当我没有在DNS或host中绑定它们时,我进行http连接会返回 status -2146697211
当我绑定域名和IP后,status 200.
另外,当返回-2146697191时,一般是证书安全问题。
最近发现一个不错的jdk6 source网站,收藏一下:
http://www.java2s.com/Open-Source/Java-Document/6.0-JDK-Modules-sun/security/sun/security/krb5/internal/ktab/KeyTab.java.htm
最近和capicom亲密接触了一下,感觉到它的强大,记录以备后查.
capicom是一个对windows来讲非常重要的CryptoAPI.
通过capicom你可以在你的应用中集成Public Key Infrastructure (PKI)功能:获取证书库,利用服务器证书签名,加密数据.
通过vbscript你可以轻松的调用它,当然,前提是你已经安装了capicom.dll.
注册capicom.dll,打开cmd,转到capicom.dll目录下,执行: regsvr32 capicom.dll.(当然你也可以自己做个.msi来安装)
之后你就可以用各种脚本调用它的强大功能了
以vbscript为例:
拿到当前用户的数字证书
Const CAPICOM_MY_STORE = "My"
Const CAPICOM_CURRENT_USER_STORE = 2
Const CAPICOM_STORE_OPEN_READ_ONLY = 0
Dim oCert, oStore
Set oStore = CreateObject ("CAPICOM.Store")
if Err.Number <> 0 Then
wscript.echo "CAPICOM NOT detected"
Wscript.Quit(1)
End if
oStore.Open CAPICOM_CURRENT_USER_STORE, CAPICOM_MY_STORE, CAPICOM_STORE_OPEN_READ_ONLY
For Each oCert in oStore.Certificates
WScript.Echo " Subject Name: " & oCert.SubjectName
WScript.Echo " Issuer Name: " & oCert.IssuerName
WScript.Echo " SHA-1 Thumbprint: " & oCert.Thumbprint
WScript.Echo " Serial Number: " & oCert.SerialNumber
WScript.Echo " Version: " & oCert.Version
WScript.Echo " Valid From: " & oCert.ValidFromDate
WScript.Echo " Valid To: " & oCert.ValidToDate
Next
上面这段代码就是得到了当前用户的所有数字证书.
当然你也可以得当前机器上的,AD上的等.
store = CreateObject ("CAPICOM.Store")将返回一个证书库.
可利用这个store的open()方法得到相应证书库及其中的证书.
.open ()语法为:
.open( StoreLocation , StoreName , OpenMode)
StoreLocation :
CAPICOM_ACTIVE_DIRECTORY_USER_STORE 3 得到AD上已经发布的证书
CAPICOM_CURRENT_USER_STORE 2 得到当前用户的证书
CAPICOM_LOCAL_MACHINE_STORE 1 得到本地机器上的证书
CAPICOM_MEMORY_STORE 0 得到内存中的证书
StoreName :
CAPICOM_MY_STORE "MY" 得到当前用户证书与CAPICOM_CURRENT_USER_STORE配合使用
"CN=your user name on domain" 得到指定用户的证书,一般与CAPICOM_ACTIVE_DIRECTORY_USER_STORE配合使用.
OpenMode:
CAPICOM_STORE_OPEN_READ_ONLY 0 只读方法
经常易出错的地方是:以上这些常量在vbscript中并没被预定义,使用前要自己定义一下.其值就是后面相应的数字.
之前我就是以为这此常量是VBS预定义了,所以直接用,导致操作不成功,浪费了大量时间去找原因.
当然,你也可以直接用相应数字代替这此常量.
了解更多请参考:
http://msdn.microsoft.com/en-us/library/aa388130.aspx
http://207.46.196.114/windowsserver/en/library/8f918fdc-9841-48f9-a46d-28232742239a1033.mspx?mfr=true
最近项目中要写vb脚本作些系统操作,收集vb中常用关键字对照以备后查:
vbCr Chr(13) 回车符。
vbCrLf Chr(13) & Chr(10) 回车符与换行符。
vbFormFeed Chr(12) 换页符;在 Microsoft Windows 中不适用。
vbLf Chr(10) 换行符。
vbNewLine Chr(13) & Chr(10) 或 Chr(10) 平台指定的新行字符;适用于任何平台。
vbNullChar Chr(0) 值为 0 的字符。
vbNullString 值为 0 的字符串 与零长度字符串 ("") 不同;用于调用外部过程。
vbTab Chr(9) 水平附签。
vbVerticalTab Chr(11) 垂直附签;在 Microsoft Windows
vbEmpty 0 未初始化(默认)
vbNull 1 不包含任何有效数据
vbInteger 2 整型子类型
vbLong 3 长整型子类型
vbSingle 4 单精度子类型
vbDouble 5 双精度子类型
vbCurrency 6 货币子类型
vbDate 7 日期子类型
vbString 8 字符串子类型
vbObject 9 对象
vbError 10 错误子类型
vbBoolean 11 Boolean 子类型
vbVariant 12 Variant (仅用于变量数组)
vbDataObject 13 数据访问对象
vbDecimal 14 十进制子类型
vbByte 17 字节子类型
vbArray 8192 数组
常数 值 描述
vbBlack &h00 黑色
vbRed &hFF 红色
vbGreen &hFF00 绿色
vbYellow &hFFFF 黄色
vbBlue &hFF0000 蓝色
vbMagenta &hFF00FF 紫色
vbCyan &hFFFF00 青色
vbWhite &hFFFFFF 白色
vbOKOnly 0 只显示确定按钮。
vbOKCancel 1 显示确定和取消按钮。
vbAbortRetryIgnore 2 显示终止、重试和忽略按钮。
vbYesNoCancel 3 显示是、否和取消按钮。
vbYesNo 4 显示是和否按钮。
vbRetryCancel 5 显示重试和取消按钮。
vbCritical 16 显示临界消息图标。
vbQuestion 32 显示警告询问图标。
vbExclamation 48 显示警告消息图标。
vbInformation 64 显示提示消息图标。
vbDefaultButton1 0 第一个按钮是默认按钮。
vbDefaultButton2 256 第二个按钮是默认按钮。
vbDefaultButton3 512 第三个按钮是默认按钮。
vbDefaultButton4 768 第四个按钮是默认按钮。
vbApplicationModal 0 应用程序模式。用户必须响应消息框,才能继续在当前应用程序中工作。
vbSystemModal 4096 系统模式。 在 Win16 系统中, 所有应用程序都将中止直到用户响应消息框。 在 Win32 系统中, 此常数提供一个应用
程序模式信息框并总是保留在您可能正在运行的所有其它程序的顶部。
常数 值 描述
vbOK 1 确定按钮被单击。
vbCancel 2 取消按钮被单击。
vbAbort 3 终止按钮被单击。
vbRetry 4 重试按钮被单击。
vbIgnore 5 忽略按钮被单击。
vbYes 6 是按钮被单击。
vbNo 7 否按钮被单击。
vbCr Chr(13) 回车符。
vbCrLf Chr(13) & Chr(10) 回车符与换行符。
vbFormFeed Chr(12) 换页符;在 Microsoft Windows 中不适用。
vbLf Chr(10) 换行符。
vbNewLine Chr(13) & Chr(10) 或 Chr(10) 平台指定的新行字符;适用于任何平台。
vbNullChar Chr(0) 值为 0 的字符。
vbNullString 值为 0 的字符串 与零长度字符串 ("") 不同;用于调用外部过程。
vbTab Chr(9) 水平附签。
vbVerticalTab Chr(11) 垂直附签;在 Microsoft Windows
vbEmpty 0 未初始化(默认)
vbNull 1 不包含任何有效数据
vbInteger 2 整型子类型
vbLong 3 长整型子类型
vbSingle 4 单精度子类型
vbDouble 5 双精度子类型
vbCurrency 6 货币子类型
vbDate 7 日期子类型
vbString 8 字符串子类型
vbObject 9 对象
vbError 10 错误子类型
vbBoolean 11 Boolean 子类型
vbVariant 12 Variant (仅用于变量数组)
vbDataObject 13 数据访问对象
vbDecimal 14 十进制子类型
vbByte 17 字节子类型
vbArray 8192 数组
工作中的需要,将一个软件应用的数据库由hsql转为postgresql.
从Hsql中转数据到postgresql时,我采用的是从 dbname.script中获取数据的脚本,写成新的dbname.sql,然后在postgresql中执行的方法。
经过一番努力,终于如愿以常成功导入了数据。
大概浏览一下数据,没有什么问题,就放心的让同事去测试了。
不到一会儿的工夫,同事就找过来,说软件应用中的原用户无法登录,报错为用户的privatekey无法解开(此应用采用数字证书认证,并且加密了privatekey存于数据库)。
我很是奇怪。
让同事新创建用户,正常 ,也可以正常登录。
于是断定为数据有问题。
打开数据库查看用户信息表,发现privatekeyinfo字段中的数据中有好多 u000a,感觉不对,再查看一下新创建的用户,这个字段中没有。
找来dbname.sql查看,果真里面有好多\u000a,实际上这一位置应为回车.替换所有的\u000a为回车,重新导入数据。
一切OK了。
个人感觉原因是:hsql的sql脚本不支持回车符,所以用\u000a代替;而在postgresql中,数据库不认\u000a,导致数据被修改。
从而privatekey无法正常解开。
希望朋友们不要再走进这个误区。
1 安装:
软件其实很简单,用新立得软件包管理器搜索psql便能查到postgresql-client-8.2(同时可以搜到8.1版本,哪一个都可以),选中-应用即可。或者在终端下输入
xiaop@localhost$ sudo apt-get install postgresql-8.2在Ubuntu系统中,服务器启动脚本放在 /etc/init.d目录中,您可以用下面的方法来启动,对于Fedora和Gentoo 也是类似的;
2 启动PostgreSQL 数据库服务器
xiaop@localhost~# /etc/init.d/postgresql-8.2 start 注:启动;
xiaop@localhost~# /etc/init.d/postgresql-8.2 restart 注:重启;
xiaop@localhost~# /etc/init.d/postgresql-8.2 stop 注:停止;
xiaop@localhost~# /etc/init.d/postgresql-8.2 status 注:查看状态;
3.创建用户
添加用户命令格式。
createuser 是 SQL 命令 CREATE USER的封装。
命令:createuser [-a] [-A] [-d] [-D] [-e] [-P] [-h 主机名] [-p port] 用户名
参数说明:
[-a]:允许创建其他用户,相当于创建一个超级用户;
[-A]:不允许此用户创建其他用户;
[-d]:允许此用户创建数据库;
[-D]:不允许此用户创建数据库;
[-e]:将执行过程显示到Shell上;
[-P]:创建用户时,同时设置密码;
[-h 主机名]:为某个主机上的Postgres创建用户;
[-p port]:与-h参数一同使用,指定主机的端口。
3.1添加用户;
3.1.1不带参数的创建用户;
xiaop@localhost~$ createuser testuser
Shall the new user be allowed to create databases? (y/n) n --------是否可以创建数据库:否
Shall the new user be allowed to create more new users? (y/n) n ---------是否可以创建新用户:否
CREATE USER
注:不带参数创建用户时,Postgres会询问此用户的权限,上面的例子创建了一个普通用户;
3.1.2 为指定的主机和端口上创建用户 ;
xiaop@localhost~$ createuser -h 172.28.18.51 -p 5000 -D -A -e testuser
CREATE USER joe NOCREATEDB NOCREATEUSER;
CREATE USER
注:这个命令为主机172.28.18.51的5000端口创建用户testuser, 此用户不可以创建数据库和其他用户。
3.1.3创建超级用户;
test@localhost~$ createuser -P -d -a -e testuser
Enter password for new user: testuser
Enter it again: testuser
CREATE USER joe PASSWORD 'testuser' CREATEDB CREATEUSER;
CREATE USER
注:这个命令在本地创建一个超级用户(-a),可以创建数据库(-d), 同时要求设置密码。
3.2 删除用户:
命令:dropuser [-i] [-h] [-p] [-e] 用户名
参数说明:
[ -i]:删除用户前,要求确认;
[-h 主机名]:删除某个主机上的Postgres用户;
[-p port]:与-h参数一同使用,指定主机的端口;
[-e]:将执行过程显示到Shell上。
3.2.1 删除本地的Postgres用户;
test@localhost~$ dropuser testuser
DROP USER
3.2.2 删除远程Postgres服务器上的用户;
test@localhost~$ dropuser -p 5000 -h 172.28.18.51 -i -e testuser
User "testuser" and any owned databases will be permanently deleted.
Are you sure? (y/n) y
DROP USER "testuser"
DROP USER
注:此命令删除主机172.28.18.51(-h)的5000端口(-p)的用户testuser,并且需要确认(-i);
4. 创建和删除数据库;
4.1创建数据库
看看您能否访问数据库服务器的第一个例子就是试着创建一个数据库;
要创建一个新的数据库,在我们这个例子里叫 mydb,您可以使用下面的命令:
test@localhost~$ createdb mydb
它应该生成下面这样的响应:
CREATE DATABASE
如果这样,那么这一步就成功了,如果您看到类似下面这样的信息
createdb: command not found
那么就是PostgreSQL没有安装好,要么是就根本没装上;
您还可以用其它名字创建数据库。 PostgreSQL 允许您在一个节点上创建任意数量的数据库。 数据库名必须是以字母开头并且小于 63
个字符长。 一个方便的做法是创建和您当前用户名同名的数据库。
许多工具假设该数据库名为缺省数据库名,所以这样可以节省您的敲键。要创建这样的数据库,只需要键入 :
test@localhost~$ createdb
4.2 删除数据库
如果您再也不想使用您的数据库了,那么您可以删除它。 比如,如果您是数据库 mydb 的所有人(创建人), 那么您就可以用下面的命令删除它:
test@localhost~$ dropdb mydb
注:(对于这条命令而言,数据库名不是缺省的用户名。这样您就必须声明它。) 这个动作物理上将所有与该数据库相关的文件都删除并且不可取消, 因此做这件事之前一定要想清楚;
5.访问数据库
一旦您创建了数据库,您就可以访问它,您可以运行PostgreSQL交互的终端程序,叫psql,它允许您交互地输入,编辑,和执行 SQL 命令。(图形化登录请参见6. Postgresql图形化管理工具pgAdmin3)
5.1 激活数据库
您需要启动psql,试验刚才的例子。您可以用下面的命令为 mydb 数据库激活它:
test@localhost~$ psql mydb
如果您省略了数据库名字,那么它缺省就是您的用户账号名字。
Welcome to psql 8.2.4, the PostgreSQL interactive terminal.
Type: \copyright for distribution terms
\h for help with SQL commands
\? for help with psql commands
\g or terminate with semicolon to execute query
\q to quit
mydb=#
注:最后一行 mydb=#,这个提示符意味着您是数据库超级用户。
5.2 帮助和退出数据库
psql 程序有一些不属于 SQL 命令的内部命令。 它们以反斜杠开头,""。 有些这种命令在欢迎信息中列出。比如,您可以用下面的命令获取各种PostgreSQL SQL 命令的帮助语法:
mydb=> \h
要退出 psql,键入
mydb=> \q
然后 psql 就会退出并且给您返回到命令行 shell; (要获取更多有关内部命令的信息,您可以在 psql 提示符上键入 \?。)
6. Postgresql图形化管理工具pgAdmin3 ;
版本:Version1.4.3
6.1 安装;
6.1.1 Ubuntu安装 ;
有两种方法:
1.在新立得软件包管理器中搜索pgadmin3,找到pgadmin3--应用
2.终端下输入命令:
test@localhost:~$ sudo apt-get install pgadmin3
6.1.2 其它系统的安装;
您可以参考其它系统正常的软件的安装方法,起本类似,这里就不多做介绍了;
6.2 pgAdmin3的简单使用;
图形化管理系统相对比较直观,您可以在命令行下操作,然后在pgAdmin3下查看效果;
6.2.1 pgAdmin3的启动
您可以在应用程序---系统工具中找到pgAdmin3的启动项;
也可以在命令行下输入:
test@localhost:~$ /usr/bin/pgadmin3 start
6.2.2 连接已创建的数据库mydb ;
点击档案-----新增服务器,然后在跳出的窗口下输入:
地址:localhost
描述:服务器名称(随意填写)
维护数据库:postgres
用户名:自己创建一个(详情参见创建用户)
密码:和用户名对应(创建用户时自己创建)
点击确定后大家便可以查看postsql已有的数据库了;
注:pgAdmin3的数据库和终端下创建的数据库是完全同步的(可以用刷新查看效果),
pgAdmin3是比较方便的图形化管理工具,它可以创建图表,管理数据库等,有关pgAdmin3的详细介绍我们在以后讨论,本文主要介绍命令行下的操
作。图形化管理工具能做到的命令行都可以做到,您可以在命令行下创建表,在pgAdmin3上查看是否同步:
7. 创建和删除表;
7.1 创建新表;
创建完数据库之后,您就可以创建新表了,可以通过声明表的名字和所有字段的名字及其类型来创建表,例如:
mydb#CREATE TABLE weather (
city varchar(80),
temp_lo int, -- 最低气温
temp_hi int, -- 最高气温
prcp real, -- 降水量
date date
);
注:您可以在 psql 里连换行符一起键入这些东西。 psql 可以识别该命令直到分号才结束,不要忘记“;”
您可以在 SQL 命令中自由使用空白(也就是空格,tab,和换行符)。 这就意味着您可以用和上面不同的对齐方式键入命令。 两个划线("--")
引入注释。 任何跟在它后面的东西直到该行的结尾都被忽略。 SQL
是对关键字和标识符大小写不敏感的语言,只有在标识符用双引号包围时才能保留它们的大小写属性。
7.2 数据类型;
上面例子中的varchar(80) 声明一个可以存储最长 80 个字符的任意字符串的数据类型。 int 是普通的整数类型。 real 是一种用于存储单精度浮点数的类型。 date 类型应该可以自解释。
PostgresSQL 支持标准的 SQL 类型 int,smallint, real,double precision, char(N),
varchar(N),date, time,timestamp 和 interval,还支持其他的通用类型和丰富的几何类型。
PostgreSQL 可以客户化为定制任意的用户定义的数据类型,您可以参考PostgreSQL的中文文档来查询;
7.3 删除表;
如果您不再需要某个表,或者您想创建一个不同的表,那么您可以用下面的命令删除它:
mydb#DROP TABLE tablename
8. 向表中添加行;
8.1 INSERT;
INSERT 用于向表中添加行,您可以输入(在数据库中操作):
mydb#INSERT INTO weather VALUES ('San Francisco', 46, 50, 0.25, '1994-11-27');
注:所有数据类型都使用了相当明了的输入格式。 那些不是简单数字值的常量必需用单引号(')包围, 就象在例子里一样。
8.2 point类型输入;
point 类型要求一个座标对作为输入,如下:
mydb#INSERT INTO cities VALUES ('San Francisco', '(-194.0, 53.0)');
8.3 COPY;
您还可以使用 COPY 从文本文件中装载大量数据。 这么干通常更快,因为 COPY 命令就是为这类应用优化的, 只是比 INSERT 少一些灵活性.比如:
mydb#COPY weather FROM '/home/user/weather.txt';
注:weather.txt是您提前写好的符合格式标准的表格内容文档;
9. 查询一个表;
9.1 SELECT;
要从一个表中检索数据就是查询这个表。 SQL 的 SELECT 就是做这个用途的。 该语句分为选择列表(列出要返回的字段部分),表列表(列出从中检索数据的表的部分), 以及可选的条件(声明任意限制的部分)。比如,要检索表 weather 的所有行,键入:
SELECT * FROM weather;
<code>
输出结果:
<code>
city | temp_lo | temp_hi | prcp | date
---------------+---------+---------+------+------------
San Francisco | 46 | 50 | 0.25 | 1994-11-27
San Francisco | 43 | 57 | 0 | 1994-11-29
Hayward | 37 | 54 | | 1994-11-29
(3 rows)
您可以在选择列表中写任意表达式,而不仅仅是字段列表。比如,您可以:
SELECT city, (temp_hi+temp_lo)/2 AS temp_avg, date FROM weather;
这样应该得出:
city | temp_avg | date
---------------+----------+------------
San Francisco | 48 | 1994-11-27
San Francisco | 50 | 1994-11-29
Hayward | 45 | 1994-11-29
(3 rows)
请注意这里的 AS 子句是如何给输出字段重新命名的。(AS 子句是可选的。)
9.2 WHERE;
一个查询可以使用 WHERE 子句"修饰",声明需要哪些行。 WHERE 子句包含一个布尔(真值)表达式,只有那些布尔表达式为真的行才会被返回。 允许您在条件中使用常用的布尔操作符(AND,OR, 和 NOT)。 比如,下面的查询检索旧金山的下雨天的天气:
mydb#SELECT * FROM weather
WHERE city = 'San Francisco' AND prcp > 0.0;
结果:
city | temp_lo | temp_hi | prcp | date
---------------+---------+---------+------+------------
San Francisco | 46 | 50 | 0.25 | 1994-11-27
(1 row)
9.3 排序;
您可以要求返回的查询是排好序的:
mydb#SELECT * FROM weather
ORDER BY city;
得出结果:
city | temp_lo | temp_hi | prcp | date
---------------+---------+---------+------+------------
Hayward | 37 | 54 | | 1994-11-29
San Francisco | 43 | 57 | 0 | 1994-11-29
San Francisco | 46 | 50 | 0.25 | 1994-11-27
在这个例子里,排序的顺序并非绝对清晰的,因此您可能看到 San Francisco 行随机的排序。 但是如果您使用下面的语句,那么就总是会得到上面的结果
SELECT * FROM weather
ORDER BY city, temp_lo;
您可以要求查询的结果按照某种顺序排序, 并且消除重复的行输出:
mydb#SELECT DISTINCT city
FROM weather;
得出结果:
city
---------------
Hayward
San Francisco
(2 rows)
再次声明,结果行的顺序可能是随机的。
10. 视图;
假设您的应用对天气记录和城市位置的组合列表特别感兴趣, 而您又不想每次键入这些查询。那么您可以在这个查询上创建一个视图, 它给这个查询一个名字,您可以像普通表那样引用它。
进入数据库后输入:
mydb#CREATE VIEW myview AS
SELECT city, temp_lo, temp_hi, prcp, date, location
FROM weather, cities
WHERE city = name;
建立视图;
然后选择建好的视图:
SELECT * FROM myview;
结果如下:
city | temp_lo | temp_hi | prcp | date | location
---------------+---------+---------+------+------------+-----------
San Francisco | 46 | 50 | 0.25 | 1994-11-27 | (-194,53)
San Francisco | 43 | 57 | 0 | 1994-11-29 | (-194,53)
(2 rows)
11. 更新行;
您可以用 UPDATE 命令更新现有的行。 假设您发现所有 11 月 28 日的温度计数都低了两度,那么您就可以用下面的方式更新数据:
mydb#UPDATE weather
SET temp_hi = temp_hi - 2, temp_lo = temp_lo - 2
WHERE date > '1994-11-28';
看看数据的新状态:
SELECT * FROM weather;
结果为:
city | temp_lo | temp_hi | prcp | date
---------------+---------+---------+------+------------
San Francisco | 46 | 50 | 0.25 | 1994-11-27
San Francisco | 41 | 55 | 0 | 1994-11-29
Hayward | 35 | 52 | | 1994-11-29
(3 rows)
12. 删除行;
数据行可以用 DELETE 命令从表中删除。假设您对Hayward的天气不再感兴趣,那么您可以用下面的方法把那些行从表中删除:
mydb#DELETE FROM weather WHERE city = 'Hayward';
我们用下面形式的语句的时候一定要小心
DELETE FROM tablename;
如果没有条件,DELETE 将从指定表中删除所有行,把它清空。做这些之前系统不会请求您确认!
部分参考自:http://www.chinalinuxpub.com/read.php?wid=1552
linux下查看系统版本命令:
head -n 1 /etc/issue
SUMMARY
This
article contains information about registry entries that relate to the
Kerberos version 5 authentication protocol in Microsoft Windows Server
2003.
INTRODUCTION
Kerberos is an authentication mechanism that is used to
verify user or host identity. Kerberos is the preferred authentication method
for services in Windows Server 2003.
If you are running Windows Server
2003, you can modify Kerberos parameters to help troubleshoot Kerberos
authentication issues or to test the Kerberos protocol. To do this, add or
modify the registry entries that are listed in the "More Information"
section.
MORE INFORMATION
Important
This section, method, or task contains steps that tell you how to
modify the registry. However, serious problems might occur if you
modify the registry incorrectly. Therefore, make sure that you follow
these steps carefully. For added protection, back up the registry
before you modify it. Then, you can restore the registry if a problem
occurs. For more information about how to back up and restore the
registry, click the following article number to view the article in the
Microsoft Knowledge Base:
322756 (http://support.microsoft.com/kb/322756/) How to back up and restore the registry in Windows
Note After you finish troubleshooting or testing the Kerberos
protocol, remove any registry entries that you add. Otherwise, performance of
your computer may be affected.
Registry entries and values under the Parameters key
The registry entries that are listed in this section must be added
to the following registry subkey:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\Kerberos\Parameters
Note If the Parameters key is not listed under Kerberos, you must
create the key.
• |
Entry: SkewTime
Type: REG_DWORD
Default Value: 5
(minutes)
This value is the maximum time difference that is permitted
between the client computer and the server that accepts Kerberos
authentication. In Windows 2000 checked build version, the default SkewTime
value is 2 hours.
Note A checked build version of the Windows operating system is used
in production and testing environments. (A checked build is also known as a
debug version.) A checked build has many compiler optimizations turned off.
This kind of build helps trace the cause of problems in system software. A
checked build turns on many debugging checks in the operating system code and
in the system drivers. These debugging checks help the checked build identify
internal inconsistencies as soon as they occur. A checked build is larger and
is slower to run than an end-user version of Windows.
An end-user
version of Windows is also known as a free build version or a retail-build
version. In a free build version, debugging information is removed, and Windows
is built with full compiler optimizations. A free build version is faster and
uses less memory than a checked build version. |
• |
Entry: LogLevel
Type: REG_DWORD
Default Value: 0
This value indicates whether events are logged in the system event
log. If this value is set to any non-zero value, all Kerberos-related events
are logged in the system event log. |
• |
Entry: MaxPacketSize
Type: REG_DWORD
Default
Value: 1465 (bytes)
This value is the maximum User Datagram Protocol
(UDP) packet size. If the packet size exceeds this value, TCP is used.
|
• |
Entry: StartupTime
Type: REG_DWORD
Default Value:
120 (seconds)
This value is the time that Windows waits for the Key
Distribution Center (KDC) to start before Windows gives up. |
• |
Entry: KdcWaitTime
Type: REG_DWORD
Default Value:
10 (seconds)
This value is the time Windows waits for a response from
a KDC. |
• |
Entry: KdcBackoffTime
Type: REG_DWORD
Default
Value: 10 (seconds)
This value is the time between successive
calls to the KDC if the previous call failed. |
• |
Entry: KdcSendRetries
Type: REG_DWORD
Default
Value: 3
This value is the number of times that a client will try to
contact a KDC. |
• |
Entry: DefaultEncryptionType
Type: REG_DWORD
Default Value: 23 (decimal) or 0x17 (hexadecimal)
This value
indicates the default encryption type for pre-authentication. |
• |
Entry: FarKdcTimeout
Type: REG_DWORD
Default
Value: 10 (minutes)
This is the time-out value that is used to
invalidate a domain controller from a different site in the domain controller
cache. |
• |
Entry: NearKdcTimeout
Type: REG_DWORD
Default
Value: 30 (minutes)
This is the time-out value that is used to
invalidate a domain controller in the same site in the domain controller
cache. |
• |
Entry: StronglyEncryptDatagram
Type: REG_BOOL
Default Value: FALSE
This value contains a flag that indicates
whether to use 128-bit encryption for datagram packets. |
• |
Entry: MaxReferralCount
Type: REG_DWORD
Default
Value: 6
This value is the number of KDC referrals that a client
pursues before the client gives up. |
• |
Entry: KerbDebugLevel
Type: REG_DWORD
Default
Value: 0xFFFFFFFF
This
value is a list of flags that indicate the type and the level of
logging that is requested. This kind of logging can be collected on the
component level of Kerberos by bitwise or by one or more of the macros
that are described in the following table.
Macro Name | Value | Note |
DEB_ERROR |
0x00000001 |
This is the default InfoLevel for checked builds. This produces error messages across components. |
DEB_WARN |
0x00000002 |
This macro generates warning messages across components. In some cases, these messages can be ignored. |
DEB_TRACE |
0x00000004 |
This macro enables general tracing events. |
DEB_TRACE_API |
0x00000008 |
This
macro enables user API tracing events that are usually logged on entry
and on exit to an externally exported function that is implemented
through SSPI. |
DEB_TRACE_CRED |
0x00000010 |
This macro enables credentials tracing. |
DEB_TRACE_CTXT |
0x00000020 |
This macro enables context tracing. |
DEB_TRACE_LSESS |
0x00000040 |
This macro enables logon session tracing. |
DEB_TRACE_TCACHE |
0x00000080 |
Not implemented |
DEB_TRACE_LOGON |
0x00000100 |
This macro enables logon tracing such as in LsaApLogonUserEx2(). |
DEB_TRACE_KDC |
0x00000200 |
This macro enables tracing before and after calls to KerbMakeKdcCall(). |
DEB_TRACE_CTXT2 |
0x00000400 |
This macro enables additional context tracing. |
DEB_TRACE_TIME |
0x00000800 |
This macro enables the time skew tracing that is found in Timesync.cxx. |
DEB_TRACE_USER |
0x00001000 |
This macro enables user API tracing that is used together with DEB_TRACE_API and that is found mostly in Userapi.cxx. |
DEB_TRACE_LEAKS |
0x00002000 |
|
DEB_TRACE_SOCK |
0x00004000 |
This macro enables Winsock-related events. |
DEB_TRACE_SPN_CACHE |
0x00008000 |
This macro enables events that are related to SPN cache hits and misses. |
DEB_S4U_ERROR |
0x00010000 |
Not implemented |
DEB_TRACE_S4U |
0x00020000 |
|
DEB_TRACE_BND_CACHE |
0x00040000 |
|
DEB_TRACE_LOOPBACK |
0x00080000 |
|
DEB_TRACE_TKT_RENEWAL |
0x00100000 |
|
DEB_TRACE_U2U |
0x00200000 |
|
DEB_TRACE_LOCKS |
0x01000000 |
|
DEB_USE_LOG_FILE |
0x02000000 |
Not implemented |
|
• |
Entry: MaxTokenSize
Type: REG_DWORD
Default Value:
12000 (Decimal)
This value is the maximum value of the Kerberos
token. Microsoft recommends that you set this value to less than 65535.
|
• |
Entry: SpnCacheTimeout
Type: REG_DWORD
Default
Value: 15 minutes
This value is the lifetime of the Service Principal
Names (SPN) cache entries. On domain controllers, the SPN cache is
disabled. |
• |
Entry: S4UCacheTimeout
Type: REG_DWORD
Default
Value: 15 minutes
This value is the lifetime of the S4U negative
cache entries that are used to restrict the number of S4U proxy requests from a
particular computer. |
• |
Entry: S4UTicketLifetime
Type: REG_DWORD
Default
Value: 15 minutes
This value is the lifetime of tickets that are
obtained by S4U proxy requests. |
• |
Entry: RetryPdc
Type: REG_DWORD
Default Value: 0
(false)
Possible values: 0 (false) or any non-zero value (true)
This value indicates whether the client will contact the primary
domain controller for Authentication Service Requests (AS_REQ) if the client
receives a password expiration error. |
• |
Entry: RequestOptions
Type: REG_DWORD
Default
Value: Any RFC 1510 value
This value indicates whether there are
additional options that must be sent as KDC options in Ticket Granting Service
requests (TGS_REQ). |
• |
Entry: ClientIpAddress
Type: REG_DWORD
Default
Value: 0 (This setting is 0 because of Dynamic Host Configuration Protocol and
network address translation issues.)
Possible values: 0 (false) or any
non-zero value (true)
This value indicates whether a client IP address
will be added in AS_REQ to force the Caddr field to contain IP addresses in all
tickets. |
• |
Entry: TgtRenewalTime
Type: REG_DWORD
Default
Value: 600 seconds
This value is the time that Kerberos waits before
it tries to renew a Ticket Granting Ticket (TGT) before the ticket
expires. |
• |
Entry: AllowTgtSessionKey
Type: REG_DWORD
Default
Value: 0
Possible values: 0 (false) or any non-zero value (true)
This value indicates whether session keys are exported with initial
or with cross realm TGT authentication. The default value is false for security
reasons. |
Registry entries and values under the Kdc key
The registry entries that are listed in this section must be added
to the following registry subkey:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Kdc
Note If the Kdc key is not listed under Services, you must create the
key.
• |
Entry: KdcUseClientAddresses
Type: REG_DWORD
Default Value: 0
Possible values: 0 (false) or any non-zero value
(true)
This value indicates whether IP addresses will be added in the
Ticket-Granting Service Reply (TGS_REP). |
• |
Entry: KdcDontCheckAddresses
Type: REG_DWORD
Default Value: 1
Possible values: 0 (false) or any non-zero value
(true)
This value indicates whether IP addresses for the TGS_REQ and
the TGT Caddr field will be checked. |
• |
Entry: NewConnectionTimeout
Type: REG_DWORD
Default Value: 50 (seconds)
This value is the time that an
initial TCP endpoint connection will be kept open to receive data before it
disconnects. |
• |
Entry: MaxDatagramReplySize
Type: REG_DWORD
Default Value: 1465 (decimal, bytes)
This value is the maximum
UDP packet size in TGS_REP and Authentication Service Replies (AS_REP)
messages. If the packet size exceeds this value, the KDC returns a
KRB_ERR_RESPONSE_TOO_BIG message that requests that the client switch to
TCP. |
• |
Entry: KdcExtraLogLevel
Type: REG_DWORD
Default
Value: 2
Possible values:
• |
1 (decimal) or 0x1 (hexadecimal): Audit SPN unknown
errors. |
• |
2 (decimal) or 0x2 (hexadecimal): Log PKINIT errors.
(PKINIT is an Internet Engineering Task Force (IETF) Internet draft for "Public
Key Cryptography for Initial Authentication in Kerberos.") |
• |
4 (decimal) or 0x4 (hexadecimal): Log all KDC
errors. |
This value indicates what information the KDC will write to
event logs and to audits. |
• |
Entry: KdcDebugLevel
Type: REG_DWORD
Default
Value: 1 for checked build, 0 for free build
This value indicates
whether debug logging is on (1) or off (0).
If the value is set to
0x10000000 (hexadecimal) or 268435456 (decimal), specific file or line
information will be returned in the edata field of KERB_ERRORS as
PKERB_EXT_ERROR errors during a KDC processing failure.
摘自:http://support.microsoft.com/?scid=kb%3Ben-us%3B837361&x=11&y=18
|
CAPICOM
Windows系统中的安全组件.
CAPICOM是一个COM模型的组件,可以在Windows环境下各种语言中使用。而且,CAPICOM中的大多数接口都是“脚本安全”的,这意味着你可以在浏览器网页脚本中安全地使用这些接口所提供的功能。
目前,CAPICOM共有两个版本:1.0版和 2.0版。其中,后者在前者的基础上,提供了一些额外的功能。
CAPICOM v1.0提供如下功能:
1、产生和验证PKCS#7格式的数字签名;
2、使用证书加密/解密数据;
3、使用口令加密/解密数据;
CAPICOM v2.0额外提供如下功能:
1、产生和验证代码签名;
2、支持文件形式的证书;
3、快速证书搜索;
4、产生任意数据的哈希值;
5、支持AES算法(需要Windows .NET Server 2003 或 Windows XP支持);
6、支持高级证书属性,例如:政策、模板。
CAPICOM是重分发组件,也就是说它没有被包含在操作系统的中,需要单独安装注册该组件(可以从MS那里免费下载);CAPICOM v1.0 要求Win95、WinNT 4.0或更高版本,CAPICOM v2.0 要求Win98 、WinNT 4.0 + SP4 或更高版本
在MSDN中有对CAPICOM的详细描述,以下提供两个连接地址:
CAPICOM使用参考:msdn""Security"" Security(General)""SDK Documentation""Cryptography"" Cryptography Reference""CAPICOM Reference
CAPICOM例子程序:msdn""Security"" Security(General)""SDK Documentation""Cryptography""
Using Cryptography""Using CAPICOM
下载最新的CAPICOM:
http://download.microsoft.com/download/7/7/0/7708ec16-a770-4777-8b85-0fcd05f5ba60/CC2RINST.EXE
摘自:http://blog.csdn.net/brave1/archive/2005/06/07/389778.aspx
最近越发感到日志对于软件调试的重要,尤其是远程调试。
Log4j有三个主要的组件:Loggers,Appenders和Layouts.
Loggers:日志类别
Appenders日志要输出的地方
Layouts日志以何种形式输出。
1.Loggers 日志类别
Loggers组件在此系统中被分为五个级别:DEBUG、INFO、WARN、ERROR和FATAL。
这五个级别是有顺序的,DEBUG < INFO < WARN < ERROR < FATAL
说明:假设你的Logger级别为A,则所有级别大于等于A的方法的参数信息都将输出到指定位置。
(举个例子更易懂)如果你的Logger级别为INFO,则所有用.info(somemessage),.warn(somemessage),.error(somemessage),.fatal(somemessage)方法的参数信息都将输出到指定位置;但调用.debug(somemessage)方法参数信息不会输出。
2.Appenders 日志要输出的地方
Log4j日志系统允许把日志输出到不同的地方,如控制台(Console)、文件(Files)、根据天数或者文件大小产生新的文件、以流的形式发送到其它地方等等。
org.apache.log4j.ConsoleAppender(控制台)
org.apache.log4j.FileAppender(文件)
org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件)
org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件)
org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
3.Layouts 日志以何种形式输出
Layouts提供了四种日志输出样式,如根据HTML样式、自由指定样式、包含日志级别与信息的样式和包含日志时间、线程、类别等信息的样式等等。
org.apache.log4j.HTMLLayout(以HTML表格形式布局)
org.apache.log4j.PatternLayout(可以灵活地指定布局模式)
org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串)
org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)
log4j的具体使用请参照http://logging.apache.org/log4j/1.2/apidocs/index.html(log4j API)
要使用 Kerberos 身份验证,某种服务必须注册其名称(称为服务主体名称
(SPN)),以及运行该服务所使用的帐户。默认情况下,Active Directory® 目录服务注册 NetBIOS
或者计算机名,并允许计算机帐户使用 Kerberos。如果要以不同帐户或使用不同名称(例如,如果计算机使用其他的 WINS 或 DNS
名)运行服务,那么您可以使用 Setspn.exe 命令行工具设置 SPN。要设置 SPN,您必须是域管理员。
Setspn.exe
命令行实用程序可以在 Windows Server 2003 CD-ROM 内的支持工具包中获得。在window2003中可以运行support tools中的suptools.msi来安装。
使用 Setspn.exe
下面是使用 Setspn.exe 命令行实用程序的基本语法,其中“accountname”可以是单独的名称,也可以是域\名称。
setspn [parameter] accountname
Setspn.exe 可以使用下列参数:
参数 |
功能 |
示例 |
-R |
重置 HOST ServicePrincipalName。 |
setspn -R computername |
-A |
添加任意的 SPN。 |
setspn -A SPN computername |
-D |
删除任意的 SPN。 |
setspn -D SPN computername |
-L |
列出已注册的 SPN。 |
setspn -L SPN computername |
下面的示例使用 Setspn.exe 命令行实用程序注册以 Domain\UserAccount 运行的应用程序池:
SETSPN.EXE -A HOST/<your computer name> Domain\UserAccount
下面的示例注册 SPN“HOST/daserver1”和“HOST/{DNS of daserver1}”:
setspn -R daserver1
下面的示例为计算机“daserver1”注册 SPN“http/daserver”:
setspn -A http/daserver daserver1
下面的示例从计算机“daserver1”删除 SPN“http/daserver”:
setspn -D http/daserver daserver1
今天一个朋友问题我一个CVS ERROR。
The server reported an error while performing the "cvs commit" command.
ccookteammeal: cvs [server aborted]: cannot rename file /web/***/WebRoot/WEB-INF/,web.xml, to /web/***/WebRoot/WEB-INF/web.xml,v: Permission denied
回想之前用CVS时也遇到过这个经典问题,用户权限问题:
问题就出现在目录的权限上.我们安装CVS服务器时一般都用的是混合模式登录,需要windows和CVS共同验证。
要登录CVS,必须同时是CVS用户和WINDOW用户,并且这个用户要对CVS目录有读写权限。
一般我们新建的CVS用户,默认在WINDOW里只是普通用户,对CVS目录只有读权限,但没有写权限,所以可以获取文件,但当CVS 提交commit时,会报错 Permission denied.
所以,遇到这种情况,就把你的CVS用户在window(CVS服务器所在的机器)上修改为Administrator权限。
在网上又摘录一些问题及解决如下:
症状1:
cvs chacl default:n
cvs [chacl aborted]: server does not support chacl
***** CVS exited normally with code 1 *****
解决:是python跟wincvs不兼容,最后用python221+cvsnt-2.0.41+wincvs1.3中文版
症状2:无法checkout模块
cvs checkout 大狼的工作目录 (in directory E:\CVS\sssss)
cvs server: User user4 cannot access lxwDIR
***** CVS exited normally with code 1 *****
解决:没有给user4的用户此工作目录的读写权限
症状3:无法提交修改,加文件等
cvs commit -m "no message" "新建 文本文档.txt" (in directory E:\CVS\sssss\zylDIR\)
cvs [server aborted]: "commit" requires write access to the repository
***** CVS exited normally with code 1 *****
解决:没有把user4加到writers中去
症状4:无法提交修改,加文件等
cvs add: Empty password used - try 'cvs login' with a real password
cvs [add aborted]: authorization failed: server 192.168.0.105 rejected access to E:/cvs/KHRoot for user user2
***** CVS exited normally with code 1 *****
解决:应为我用user1用户checkout了模块,但用user2修改文件并提交,或加文件,重新用user2再在其他目录checkout一下模块,修改提交就可以了
症状5:无法给模块附用户
cvs chacl user4:rcw
***** CVS exited normally with code 1 *****
cvs [server aborted]: "chacl" requires write access to the repository
解决,我用user4登录了,只有administrator有此权限
一、关于工作与生活
我有个有趣的观察,外企公司多的是25-35岁的白领,40岁以上的员工很少,二三十岁的外企员工是意气风发的,
但外企公司40岁附近的经理人是很尴尬的。我见过的40岁附近的外企经理人大多在一直跳槽,最后大多跳到民企,比方说,唐骏。外企员工的成功很大程度上是
公司的成功,并非个人的成功,西门子的确比国美大,但并不代表西门子中国经理比国美的老板强,甚至可以说差得很远。而进外企的人往往并不能很早理解这一
点,把自己的成功90%归功于自己的能力,实际上,外企公司随便换个中国区总经理并不会给业绩带来什么了不起的影响。好了问题来了,当这些经理人40多岁
了,他们的薪资要求变得很高,而他们的才能其实又不是那么出众,作为外企公司的老板,你会怎么选择?有的是只要不高薪水的,要出位的精明强干精力冲沛的年
轻人,有的是,为什么还要用你?
从上面这个例子,其实可以看到我们的工作轨迹,二三十岁的时候,生活的压力还比较小,身体还比较好,
上面的父母身体还好,下面又没有孩子,不用还房贷,也没有孩子要上大学,当个外企小白领还是很光鲜的,挣得不多也够花了。但是人终归要结婚生子,终归会
老,到了40岁,父母老了,要看病要吃药,要有人看护,自己要还房贷,要过基本体面的生活,要养小孩……那个时候需要挣多少钱才够花才重要。所以,看待工
作,眼光要放远一点,一时的谁高谁低并不能说明什么。
从这个角度上来说,我不太赞成过于关注第一份工作的薪水,更没有必要攀比第一份
工作的薪水,这在刚刚出校园的学生中间是很常见的。正常人大概要工作35年,这好比是一场马拉松比赛,和真正的马拉松比赛不同的是,这次比赛没有职业选
手,每个人都只有一次机会。要知到,有很多人甚至坚持不到终点,大多数人最后是走到终点的,只有少数人是跑过终点的,因此在刚开始的时候,去抢领先的位置
并没有太大的意义。刚进社会的时候如果进500强公司,大概能拿到3k-6k/月的工资,有些特别技术的人才可能可以到8k/月,可问题是,5年以后拿多
少?估计5k-10k了不起了。起点虽然高,但增幅有限,而且,后面的年轻人追赶的压力越来越大。
我前两天问我的一个销售,你会的这些东西一个新人2年就都学会了,但新人所要求的薪水却只是你的一半,到时候,你怎么办?
职业生涯就像一场体育比赛,有初赛、复赛、决赛。初赛的时候大家都刚刚进社会,大多数都是实力一般的人,这时候努力一点认真一点很快就能让人脱颖而出,
于是有的人二十多岁做了经理,有的人迟些也终于赢得了初赛,三十多岁成了经理。然后是复赛,能参加复赛的都是赢得初赛的,每个人都有些能耐,在聪明才智上
都不成问题,这个时候再想要胜出就不那么容易了,单靠一点点努力和认真还不够,要有很强的坚忍精神,要懂得靠团队的力量,要懂得收服人心,要有长远的眼
光……
看上去赢得复赛并不容易,但,还不是那么难。因为这个世界的规律就是给人一点成功的同时让人骄傲自满,刚刚赢得初赛的人往往不
知道自己赢得的仅仅是初赛,有了一点小小的成绩大多数人都会骄傲自满起来,认为自己已经懂得了全部,不需要再努力再学习了,他们会认为之所以不能再进一步
已经不是自己的原因了。虽然他们仍然不好对付,但是他们没有耐性,没有容人的度量,更没有清晰长远的目光。就像一只愤怒的斗牛,虽然猛烈,最终是会败的,
而赢得复赛的人则象斗牛士一样,不急不躁,跟随着自己的节拍,慢慢耗尽对手的耐心和体力。赢得了复赛以后,大约已经是一位很了不起的职业经理人了,当上了
中小公司的总经理,大公司的副总经理,主管着每年几千万乃至几亿的生意。
最终的决赛来了,说实话我自己都还没有赢得决赛,因此对于决
赛的决胜因素也只能凭自己的猜测而已,这个时候的输赢或许就像武侠小说里写得那样,大家都是高手,只能等待对方犯错了,要想轻易击败对手是不可能的,除了
使上浑身解数,还需要一点运气和时间。世界的规律依然发挥着作用,赢得复赛的人已经不只是骄傲自满了,他们往往刚愎自用,听不进去别人的话,有些人的脾气
变得暴躁,心情变得浮躁,身体变得糟糕,他们最大的敌人就是他们自己,在决赛中要做的只是不被自己击败,等着别人被自己击败。这和体育比赛是一样的,最后
高手之间的比赛,就看谁失误少谁就赢得了决赛。
二、根源
你工作快乐么?你的工作好么?
有没
有觉得干了一段时间以后工作很不开心?有没有觉得自己入错了行?有没有觉得自己没有得到应有的待遇?有没有觉得工作像一团乱麻每天上班都是一种痛苦?有没
有很想换个工作?有没有觉得其实现在的公司并没有当初想象得那么好?有没有觉得这份工作是当初因为生存压力而找的,实在不适合自己?你从工作中得到你想要
得到的了么?你每天开心么?
天涯上愤怒的人很多,你有没有想过,你为什么不快乐?你为什么愤怒?
其实,你不快乐的根源,是因为你不知道要什么!你不知道要什么,所以你不知道去追求什么,你不知道追求什么,所以你什么也得不到。
我总觉得,职业生涯首先要关注的是自己,自己想要什么?大多数人大概没想过这个问题,唯一的想法只是——我想要一份工作,我想要一份不错的薪水,我知道
所有人对于薪水的渴望,可是,你想每隔几年重来一次找工作的过程么?你想每年都在这种对于工作和薪水的焦急不安中度过么?不想的话,就好好想清楚。饮鸩止
渴,不能因为口渴就拼命喝毒药。越是焦急,越是觉得自己需要一份工作,越饥不择食,越想不清楚,越容易失败,你的经历越来越差,下一份工作的人看着你的简
历就皱眉头。于是你越喝越渴,越渴越喝,陷入恶性循环。最终只能哀叹世事不公或者生不逢时,只能到天涯上来发泄一把,在失败者的共鸣当中寻求一点心理平衡
罢了。大多数人都有生存压力,我也是,有生存压力就会有很多焦虑,积极的人会从焦虑中得到动力,而消极的人则会因为焦虑而迷失方向。所有人都必须在压力下
做出选择,这就是世道,你喜欢也罢不喜欢也罢。
一般我们处理的事情分为重要的事情和紧急的事情,如果不做重要的事情就会常常去做紧急
的事情。比如锻炼身体保持健康是重要的事情,而看病则是紧急的事情。如果不锻炼身体保持健康,就会常常为了病痛烦恼。又比如防火是重要的事情,而救火是紧
急的事情,如果不注意防火,就要常常救火。找工作也是如此,想好自己究竟要什么是重要的事情,找工作是紧急的事情,如果不想好,就会常常要找工作。往往紧
急的事情给人的压力比较大,迫使人们去赶紧做,相对来说重要的事情反而没有那么大的压力,大多数人做事情都是以压力为导向的,压力之下,总觉得非要先做紧
急的事情,结果就是永远到处救火,永远没有停歇的时候。(很多人的工作也像是救火队一样忙碌痛苦,也是因为工作中没有做好重要的事情。)那些说自己活在水
深火热为了生存顾不上那么多的朋友,今天找工作困难是当初你们没有做重要的事情,是结果不是原因。如果今天你们还是因为急于要找一份工作而不去思考,那么
或许将来要继续承受痛苦找工作的结果。
我始终觉得我要说的话题,沉重了点,需要很多思考,远比唐笑打武警的话题来的枯燥乏味,但是,天下没有轻松的成功,成功,要付代价。请先忘记一切的生存压力,想想这辈子你最想要的是什么?所以,最要紧的事情,先想好自己想要什么。
三、什么是好工作
当初微软有个唐骏,很多大学里的年轻人觉得这才是他们向往的职业生涯,我在清华bbs里发的帖子被这些学子们所不屑,那个时候学生们只想出国或者去外
企,不过如今看来,我还是对的,唐骏去了盛大,陈天桥创立的盛大,一家民营公司。一个高学历的海归在500强的公司里拿高薪水,这大约是很多年轻人的梦
想,问题是,每年毕业的大学生都在做这个梦,好的职位却只有500个。
人都是要面子的,也是喜欢攀比的,即使在工作上也喜欢攀比,不
管那是不是自己想要的。大家认为外企公司很好,可是好在哪里呢?好吧,他们在比较好的写字楼,这是你想要的么?他们出差住比较好的酒店,这是你想要的么?
别人会羡慕一份外企公司的工作,这是你想要的么?那一切都是给别人看的,你干吗要活得那么辛苦给别人看?另一方面,他们薪水福利一般,并没有特别了不起,
他们的晋升机会比较少,很难做到很高阶的主管,他们虽然厌恶常常加班,却不敢不加班,因为“你不干有得是人干”,大部分情况下会找个台湾人香港人新加坡人
来管你,而这些人又往往有些莫名其妙的优越感。你想清楚了么?500强一定好么?找工作究竟是考虑你想要什么,还是考虑别人想看什么?
我的大学同学们大多数都到美国了,甚至毕业这么多年了,还有人最近到国外去了。出国真的有那么好么?我的大学同学们,大多数还是在博士、博士后、访问学
者地挣扎着,至今只有一个正经在一个美国大学里拿到个正式的教职。国内的教授很难当么?我有几个表亲也去了国外了,他们的父母独自在国内,没有人照顾,有
好几次人在家里昏倒都没人知道,出国,真的这么光彩么?就像有人说的“很多事情就像看A片,看的人觉得很爽,做的人未必。”
人总想找到那个最好的,可是,什么是最好的?你觉得是最好的那个,是因为你的确了解,还是因为别人说他是最好的?即使他对于别人是最好的,对于你也一定是最好的么?
对于自己想要什么,自己要最清楚,别人的意见并不是那么重要。很多人总是常常被别人的意见所影响,亲戚的意见,朋友的意见,同事的意见……问题是,你究
竟是要过谁的一生?人的一生不是父母一生的续集,也不是儿女一生的前传,更不是朋友一生的外篇,只有你自己对自己的一生负责,别人无法也负不起这个责任。
自己做的决定,至少到最后,自己没什么可后悔。对于大多数正常智力的人来说,所做的决定没有大的对错,无论怎么样的选择,都是可以尝试的。比如你没有考自
己上的那个学校,没有入现在这个行业,这辈子就过不下去了?就会很失败?不见得。
我想,好工作,应该是适合你的工作,具体点说,应该
是能给你带来你想要的东西的工作,你或许应该以此来衡量你的工作究竟好不好,而不是拿公司的大小,规模,外企还是国企,是不是有名,是不是上市公司来衡
量。小公司,未必不是好公司,赚钱多的工作,也未必是好工作。你还是要先弄清楚你想要什么,如果你不清楚你想要什么,你就永远也不会找到好工作,因为你永
远只看到你得不到的东西,你得到的,都是你不想要的。
可能,最好的,已经在你的身边,只是,你还没有学会珍惜。人们总是盯着得不到的东西,而忽视了那些已经得到的东西。
四、普通人
我发现中国人的励志和国外的励志存在非常大的不同,中国的励志比较鼓励人立下大志愿,卧薪尝胆,有朝一日成富成贵。而国外的励志比较鼓励人勇敢面对现实
生活,面对普通人的困境,虽然结果也是成富成贵,但起点不一样,相对来说,我觉得后者在操作上更现实,而前者则需要用999个失败者来堆砌一个成功者的故
事。
我们都是普通人,普通人的意思就是,概率这件事是很准的。因此,我们不会买彩票中500万,我们不会成为比尔盖茨或者李嘉诚,我们不会坐飞机掉下来,我们当中很少的人会创业成功,我们之中有30%的人会离婚,我们之中大部分人会活过65岁……
所以请你在想自己要什么的时候,要得“现实”一点,你说我想要做李嘉诚,抱歉,我帮不上你。成为比尔盖茨或者李嘉诚这种人,是靠命的,看我写的这篇文章
绝对不会让你成为他们,即使你成为了他们,也绝对不是我这篇文章的功劳。“王侯将相宁有种乎”但真正当皇帝的只有一个人,王侯将相,人也不多。目标定得高
些对于喜欢挑战的人来说有好处,但对于大多数普通人来说,反而比较容易灰心沮丧,很容易就放弃了。
回过头来说,李嘉诚比你有钱大致
50万倍,他比你更快乐么?或许。有没有比你快乐50万倍,一定没有。他比你最多也就快乐一两倍,甚至有可能还不如你快乐。寻找自己想要的东西不是和别人
比赛,比谁要得更多更高,比谁的目标更远大。虽然成为李嘉诚这个目标很宏大,但你并不见得会从这个目标以及追求目标的过程当中获得快乐,而且基本上你也做
不到。你必须听听你内心的声音,寻找真正能够使你获得快乐的东西,那才是你想要的东西。
你想要的东西,或者我们把它称之为目标,目标
其实并没有高低之分,你不需要因为自己的目标没有别人远大而不好意思,达到自己的目标其实就是成功,成功有大有小,快乐却是一样的。我们追逐成功,其实追
逐的是成功带来的快乐,而非成功本身。职业生涯的道路上,我们常常会被攀比的心态蒙住眼睛,忘记了追求的究竟是什么,忘记了是什么能使我们更快乐。
社会上一夜暴富的新闻很多,这些消息,总会在我们的心里面掀起很多涟漪,涟漪多了就变成惊涛骇浪,心里的惊涛骇浪除了打翻承载你目标的小船,并不会使得
你也一夜暴富。“只见贼吃肉,不见贼挨揍。”我们这些普通人既没有当贼的勇气,又缺乏当贼的狠辣绝决,虽然羡慕吃肉,却更害怕挨揍,偶尔看到几个没挨揍的
贼就按奈不住,或者心思活动,或者大感不公,真要叫去做贼,却也不敢。
我还是过普通人的日子,要普通人的快乐,至少,晚上睡得着觉。
五、跳槽与积累
首先要说明,工作是一件需要理智的事情,所以不要在工作上耍个性,天涯上或许会有人觉得你很有个性而叫好,煤气公司电话公司不会因为觉得你很有个性而免
了你的帐单。当你很帅地炒掉了你的老板,当你很酷地挖苦了一番招聘的HR,账单还是要照付,只是你赚钱的时间更少了,除了你自己,没人受损失。
我并不反对跳槽,但跳槽决不是解决问题的办法,而且频繁跳槽的后果是让人觉得没有忠诚度可言,而且不能安心工作。现在很多人从网上找工作,很多找工作的
网站常常给人出些馊主意,要知道他们是盈利性企业,当然要从自身盈利的角度来考虑,大家越是频繁跳槽频繁找工作他们越是生意兴隆,所以鼓动人们跳槽是他们
的工作。所以他们会常常告诉你,你拿的薪水少了,你享受的福利待遇差了,又是“薪情快报”又是“赞叹自由奔放的灵魂”。至于是否会因此让你不能安心,你跳
了槽是否解决问题,是否更加开心,那个,他们管不着。
要跳槽肯定是有问题,一般来说问题发生了,躲是躲不开的,很多人跳槽是因为这样
或者那样的不开心,如果这种不开心,在现在这个公司不能解决,那么在下一个公司多半也解决不掉。你必须相信,90%的情况下,你所在的公司并没有那么烂,
你认为不错的公司也没有那么好。就像围城里说的,“城里的人拼命想冲出来,而城外的人拼命想冲进去。”每个公司都有每个公司的问题,没有问题的公司是不存
在的。换个环境你都不知道会碰到什么问题,与其如此,不如就在当下把问题解决掉。很多问题当你真的想要去解决的时候,或许并没有那么难。有的时候你觉得问
题无法解决,事实上,那只是“你觉得”。
人生的曲线应该是曲折向上的,偶尔会遇到低谷但大趋势总归是曲折向上的,而不是象脉冲波一样
每每回到起点,我见过不少面试者,30多岁了,四五份工作经历,每次多则3年,少则1年,30多岁的时候回到起点从一个初级职位开始干起,拿基本初级的薪
水,和20多岁的年轻人一起竞争,不觉得有点辛苦么?这种日子好过么?
我非常不赞成在一个行业超过3年以后换行业,基本上,35岁以
前我们的生存资本靠打拼,35岁以生存的资本靠的就是积累,这种积累包括人际关系,经验,人脉,口碑……如果常常更换行业,代表几年的积累付之东流,一切
从头开始,如果换了两次行业,35岁的时候大概只有5年以下的积累,而一个没有换过行业的人至少有了10年的积累,谁会占优势?工作到2-3年的时候,很
多人觉得工作不顺利,好像到了一个瓶颈,心情烦闷,就想辞职,乃至换一个行业,觉得这样所有一切烦恼都可以抛开,会好很多。其实这样做只是让你从头开始,
到了时候还是会发生和原来行业一样的困难,熬过去就向上跨了一大步,要知道每个人都会经历这个过程,每个人的职业生涯中都会碰到几个瓶颈,你熬过去了而别
人没有熬过去你就领先了。跑长跑的人会知道,开始的时候很轻松,但是很快会有第一次的难受,但过了这一段又能跑很长一段,接下来会碰到第二次的难受,坚持
过了以后又能跑一段,如此往复,难受一次比一次厉害,直到坚持不下去了。大多数人第一次就坚持不了了,一些人能坚持到第二次,第三次虽然大家都坚持不住
了,可是跑到这里的人也没几个了,这点资本足够你安稳活这一辈子了。
一份工作到两三年的时候,大部分人都会变成熟手,这个时候往往会
陷入不断的重复,有很多人会觉得厌倦,有些人会觉得自己已经搞懂了一切,从而懒得去寻求进步了。很多时候的跳槽是因为觉得失去兴趣了,觉得自己已经完成比
赛了。其实这个时候比赛才刚刚开始,工作两三年的人,无论是客户关系,人脉,手下,和领导的关系,在业内的名气……还都是远远不够的,但稍有成绩的人总是
会自我感觉良好的,每个人都觉得自己跟客户关系铁得要命,觉得自己在业界的口碑好得很。其实可以肯定地说,一定不是,这个时候,还是要拿出前两年的干劲
来,稳扎稳打,积累才刚刚开始。
你足够了解你的客户吗?你知道他最大的烦恼是什么吗?你足够了解你的老板么?你知道他最大的烦恼是什
么吗?你足够了解你的手下么?你知道他最大的烦恼是什么吗?如果你不知道,你凭什么觉得自己已经积累够了?如果你都不了解,你怎么能让他们帮你的忙,做你
想让他们做的事情?如果他们不做你想让他们做的事情,你又何来的成功?
六、等待
这是个浮躁的人们最不喜欢的话题,本来不想说这个话题,因为会引起太多的争论,而我又无意和人争论这些,但是考虑到对于职业生涯的长久规划,这是一个躲避不了的话题,还是决定写一写,不爱看的请离开吧。
并不是每次穿红灯都会被汽车撞,并不是每个罪犯都会被抓到,并不是每个错误都会被惩罚,并不是每个贪官都会被枪毙,并不是你的每一份努力都会得到回报,
并不是你的每一次坚持都会有人看到,并不是你每一点付出都能得到公正的回报,并不是你的每一个善意都能被理解……这个,就是世道。好吧,世道不够好,可
是,你有推翻世道的勇气么?如果没有,你有更好的解决办法么?有很多时候,人需要一点耐心,一点信心。每个人总会轮到几次不公平的事情,而通常,安心等待
是最好的办法。
有很多时候我们需要等待,需要耐得住寂寞,等待属于你的那一刻。周润发等待过,刘德华等待过,周星驰等待过,王菲等待
过,张艺谋也等待过……看到了他们如今的功成名就的人,你可曾看到当初他们的等待和耐心?你可曾看到金马奖影帝在街边摆地摊?你可曾看到德云社一群人在剧
场里给一位观众说相声?你可曾看到周星驰的角色甚至连一句台词都没有?每一个成功者都有一段低沉苦闷的日子,我几乎能想象得出来他们借酒浇愁的样子,我也
能想象得出他们为了生存而挣扎的窘迫。在他们一生最中灿烂美好的日子里,他们渴望成功,但却两手空空,一如现在的你。没有人保证他们将来一定会成功,而他
们的选择是耐住寂寞。如果当时的他们总念叨着“成功只是属于特权阶级的”,你觉得他们今天会怎样?
曾经我也不明白有些人为什么并不比
我有能力却要坐在我的头上,年纪比我大就一定要当我的领导么?为什么有些烂人不需要努力就能赚钱?为什么刚刚改革开放的时候的人能那么容易赚钱,而轮到我
们的时候,什么事情都要正规化了?有一天我突然想,我还在上学的时候他们就在社会里挣扎奋斗了,他们在社会上奋斗积累了十几二十年,我们新人来了,他们有
的我都想要,我这不是在要公平,我这是在要抢劫。因为我要得太急,因为我忍不住寂寞。二十多岁的男人,没有钱,没有事业,却有蓬勃的欲望。
人总是会遇到挫折的,人总是会有低潮的,人总是会有不被人理解的时候的,人总是有要低声下气的时候,这些时候恰恰是人生最关键的时候,因为大家都会碰到
挫折,而大多数人过不了这个门槛,你能过,你就成功了。在这样的时刻,我们需要耐心等待,满怀信心地去等待,相信,生活不会放弃你,机会总会来的。至少,
你还年轻,你没有坐牢,没有生治不了的病,没有欠还不起的债。比你不幸的人远远多过比你幸运的人,你还怕什么?路要一步步走,虽然到达终点的那一步很激动
人心,但大部分的脚步是平凡甚至枯燥的,但没有这些脚步,或者耐不住这些平凡枯燥,你终归是无法迎来最后的那些激动人心。
逆境,是上帝帮你淘汰竞争者的地方。要知道,你不好受,别人也不好受,你坚持不下去了,别人也一样,千万不要告诉别人你坚持不住了,那只能让别人获得坚持的信心,让竞争者看着你微笑的面孔,失去信心,退出比赛。胜利属于那些有耐心的人。
在最绝望的时候,我会去看电影《ThePursuitofHappyness》《JerryMaguire》,让自己重新鼓起勇气,因为,无论什么时
候,我们总还是有希望。当所有的人离开的时候,我不失去希望,我不放弃。每天下班坐在车里,我喜欢哼着《隐形的翅膀》看着窗外,我知道,我在静静等待,等
待属于我的那一刻。
原贴里伊吉网友的话我很喜欢,抄录在这里:
每个人都希望,自己是独一无二的特殊者
含着金匙出生、投胎到好家庭、工作安排到电力局拿1w月薪这样的小概率事件,当然最好轮到自己
红军长征两万五、打成右派反革命、胼手胝足牺牲尊严去奋斗,最好留给祖辈父辈和别人
自然,不是每个吃过苦的人都会得到回报
但是,任何时代,每一个既得利益者身后,都有他的祖辈父辈奋斗挣扎乃至流血付出生命的身影
羡慕别人有个好爸爸,没什么不可以
问题是,你的下一代,会有一个好爸爸吗?
至于问到为什么不能有同样的赢面概率?我只能问:为什么物种竞争中,人和猴子不能有同样的赢面概率?
物竞天择。猴子的灵魂不一定比你卑微,但你身后有几十万年的类人猿进化积淀。
七、入对行跟对人
在中国,大概很少有人是一份职业做到底的,虽然如此,第一份工作还是有些需要注意的地方,有两件事情格外重要,第一件是入行,第二件事情是跟人。第一份
工作对人最大的影响就是入行,现代的职业分工已经很细,我们基本上只能在一个行业里成为专家,不可能在多个行业里成为专家。很多案例也证明即使一个人在一
个行业非常成功,到另外一个行业,往往完全不是那么回事情,“你想改变世界,还是想卖一辈子汽水?”是乔布斯邀请百事可乐总裁约翰·斯考利加盟苹果时所说
的话,结果这位在百事非常成功的约翰,到了苹果表现平平。其实没有哪个行业特别好,也没有哪个行业特别差,或许有报道说哪个行业的平均薪资比较高,但是他
们没说的是,那个行业的平均压力也比较大。看上去很美的行业一旦进入才发现很多地方其实并不那么完美,只是外人看不见。
说实话,我自
己都没有发大财,所以我的建议只是让人快乐工作的建议,不是如何发大财的建议,我们只讨论一般普通打工者的情况。我认为选择什么行业并没有太大关系,看问
题不能只看眼前。比如,从前年开始,国家开始整顿医疗行业,很多医药公司开不下去,很多医药行业的销售开始转行。其实医药行业的不景气是针对所有公司的,
并非针对一家公司,大家的日子都不好过,这个时候跑掉是非常不划算的,大多数正规的医药公司即使不做新生意撑个两三年总是能撑的,大多数医药销售靠工资撑
个两三年也是可以撑的,国家不可能永远捏着医药行业不放的,两三年以后光景总归还会好起来的,那个时候别人都跑了而你没跑,那时的日子应该会好过很多。有
的时候觉得自己这个行业不行了,问题是,再不行的行业,做得人少了也变成了好行业,当大家都觉得不好的时候,往往却是最好的时候。大家都觉得金融行业好,
金融行业门槛高不说,有多少人削尖脑袋要钻进去,竞争激励,进去以后还要时时提防,一个疏忽,就被后来的人给挤掉了,压力巨大,又如何谈得上快乐?也就未
必是“好”工作了。
太阳能这个东西至今还不能进入实际应用的阶段,但是中国已经有7家和太阳能有关的公司在纽交所上市了,国美苏宁永
乐其实是贸易型企业,也能上市,鲁泰纺织连续10年利润增长超过50%,卖茶的一茶一座,卖衣服的海澜之家都能上市……其实选什么行业真的不重要,关键是
怎么做。事情都是人做出来的,关键是人。
有一点是需要记住的,这个世界上,有史以来直到我们能够预见得到的未来,成功的人总是少数,
有钱的人总是少数,大多数人是一般的,普通的,不太成功的。因此,大多数人的做法和看法,往往都不是距离成功最近的做法和看法。因此大多数人说好的东西不
见得好,大多数人说不好的东西不见得不好。大多数人都去炒股的时候说明跌只是时间问题,大家越是热情高涨的时候,跌的日子越近。大多数人买房子的时候,房
价不会涨,而房价涨的差不多的时候,大多数人才开始买房子。不会有这样一件事情让大家都变成功,发了财,历史上不曾有过,将来也不会发生。有些东西即使一
时运气好得到了,还是会在别的时候别的地方失去的。
年轻人在职业生涯的刚开始,尤其要注意的是,要做对的事情,不要让自己今后几十年
的人生总是提心吊胆,更不值得为了一份工作赔上自己的青春年华。我的公司是个不行贿的公司,以前很多人不理解,甚至自己的员工也不理解,不过如今,我们是
同行中最大的企业,客户乐意和我们打交道,尤其是在国家打击腐败的时候,每个人都知道我们做生意不给钱的名声,都敢于和我们做生意。而勇于给钱的公司,不
是倒了,就是跑了,要不就是每天睡不好觉,人还是要看长远一点。很多时候,看起来最近的路,其实是最远的路,看起来最远的路,其实是最近的路。
跟对人是说,入行后要跟个好领导好老师,刚进社会的人做事情往往没有经验,需要有人言传身教。对于一个人的发展来说,一个好领导是非常重要的。所谓“好”的标准,不是他让你少干活多拿钱,而是以下三个。
首先,好领导要有宽广的心胸,如果一个领导每天都会发脾气,那几乎可以肯定他不是个心胸宽广的人,能发脾气的时候却不发脾气的领导,多半是非常厉害的领
导。中国人当领导最大的毛病是容忍不了能力比自己强的人,所以常常可以看到的一个现象是,领导很有能力,手下一群庸才或者手下一群闲人。如果看到这样的环
境,还是不要去的好。
其次,领导要愿意从下属的角度来思考问题,这一点其实是从面试的时候就能发现的,如果这位领导总是从自己的角度
来考虑问题,几乎不听你说什么,这就危险了。从下属的角度来考虑问题并不代表同意下属的说法,但他必须了解下属的立场,下属为什么要这么想,然后他才有办
法说服你,只关心自己怎么想的领导往往难以获得下属的信服。
第三,领导敢于承担责任,如果出了问题就把责任往下推,有了功劳就往自己身上揽,这样的领导不跟也罢。选择领导,要选择关键时刻能抗得住的领导,能够为下属的错误买单的领导,因为这是他作为领导的责任。
有可能,你碰不到好领导,因为,中国的领导往往是屁股决定脑袋的领导,因为他坐领导的位置,所以他的话就比较有道理,这是传统观念官本位的误区,可能有
大量的这种无知无能的领导,只是,这对于你其实是好事,如果将来有一天你要超过他,你希望他比较聪明还是比较笨?相对来说这样的领导其实不难搞定,只是你
要把自己的身段放下来而已。多认识一些人,多和比自己强的人打交道,同样能找到好的老师,不要和一群同样郁闷的人一起控诉社会,控诉老板,这帮不上你,只
会让你更消极。和那些比你强的人打交道,看他们是怎么想的,怎么做的,学习他们,然后跟更强的人打交道。
八、选择
我们每天做的最多的事情,其实是选择,因此在谈职业生涯的时候不得不提到这个话题。
我始终认为,在很大的范围内,我们究竟会成为一个什么样的人,决定权在我们自己,每天我们都在做各种各样的选择,我可以不去写这篇文章,去别人的帖子拍
拍砖头,也可以写下这些文字,帮助别人的同时也整理自己的思路,我可以多注意下格式让别人易于阅读,也可以写成一堆,我可以就这样发上来,也可以在发以前
再看几遍,你可以选择不刮胡子就去面试,也可以选择出门前照照镜子……每天,每一刻我们都在做这样那样的决定,我们可以漫不经心,也可以多花些心思,成千
上万的小选择累计起来,就决定了最终我们是个什么样的人。
从某种意义上来说我们的未来不是别人给的,是我们自己选择的,很多人会说我
命苦啊,没得选择阿,如果你认为“去微软还是去IBM”“上清华还是上北大”“当销售副总还是当厂长”这种才叫选择的话,的确你没有什么选择,大多数人都
没有什么选择。但每天你都可以选择是否为客户服务更周到一些,是否对同事更耐心一些,是否把工作做得更细致一些,是否把情况了解得更清楚一些,是否把不清
楚的问题再弄清楚一些……你也可以选择在是否在痛苦中继续坚持,是否抛弃掉自己的那些负面的想法,是否原谅一个人的错误,是否相信我在这里写下的这些话,
是否不要再犯同样的错误……生活每天都在给你选择的机会,每天都在给你改变自己人生的机会,你可以选择赖在地上撒泼打滚,也可以选择咬牙站起来。你永远都
有选择。有些选择不是立杆见影的,需要累积,比如农民可以选择自己常常去浇地,也可以选择让老天去浇地,诚然你今天浇水下去苗不见得今天马上就长出来,但
常常浇水,大部分苗终究会长出来的,如果你不浇,收成一定很糟糕。
每天生活都在给你机会,他不会给你一叠现金也不会拱手送你个好工
作,但实际上,他还是在给你机会。我的家庭是一个普通的家庭,没有任何了不起的社会关系,我的父亲在大学毕业以后就被分配到了边疆,那个小县城只有一条马
路,他们那一代人其实比我们更有理由抱怨,他们什么也没得到,年轻的时候文化大革命,书都没得读,支援边疆插队落户,等到老了,却要给年轻人机会了。他有
足够的理由象成千上万那样的青年一样坐在那里抱怨生不逢时,怨气冲天。然而在分配到边疆的十年之后,国家恢复招研究生,他考回了原来的学校。研究生毕业,
他被分配到了安徽一家小单位里,又是3年以后,国家第一届招收博士生,他又考回了原来的学校,成为中国第一代博士,那时的他比现在的我年纪还大。生活并没
有放弃他,他也没有放弃生活。10年的等待,他做了他自己的选择,他没有放弃,他没有破罐子破摔,所以时机到来的时候,他改变了自己的人生。你最终会成为
什么样的人,就决定在你的每个小小的选择之间。
你选择相信什么?你选择和谁交朋友?你选择做什么?你选择怎么做?……我们面临太多的
选择,而这些选择当中,意识形态层面的选择又远比客观条件的选择来得重要得多,比如选择做什么产品其实并不那么重要,而选择怎么做才重要。选择用什么人并
不重要,而选择怎么带这些人才重要。大多数时候选择客观条件并不要紧,大多数关于客观条件的选择并没有对错之分,要紧的是选择怎么做。一个大学生毕业了,
他要去微软也好,他要卖猪肉也好,他要创业也好,他要做游戏代练也好,只要不犯法,不害人,都没有什么关系,要紧的是,选择了以后,怎么把事情做好。
除了这些,你还可以选择时间和环境,比如,你可以选择把这辈子最大的困难放在最有体力最有精力的时候,也可以走一步看一步,等到了40岁再说,只是到了
40多岁,那正是一辈子最脆弱的时候,上有老下有小,如果在那个时候碰上了职业危机,实在是一件很苦恼的事情。与其如此不如在20多岁30多岁的时候吃点
苦,好让自己脆弱的时候活得从容一些。你可以选择在温室里成长,也可以选择到野外磨砺,你可以选择在办公室吹冷气的工作,也可以选择40度的酷热下,去见
你的客户,只是,这一切最终会累积起来,引导你到你应得的未来。
我不敢说所有的事情你都有得选择,但是绝大部分事情你有选择,只是往往你不把这当作一种选择。认真对待每一次选择,才会有比较好的未来。
九、选择职业
职业的选择,总的来说,无非就是销售、市场、客服、物流、行政、人事、财务、技术、管理几个大类,有个有趣的现象就是,500强的CEO当中最多的是销
售出身,第二多的人是财务出身,这两者加起来大概超过95%。现代IT行业也有技术出身成为老板的,但实际上,后来他们还是从事了很多销售和市场的工作,
并且表现出色,公司才获得了成功,完全靠技术能力成为公司老板的,几乎没有。这是有原因的,因为销售就是一门跟人打交道的学问,而管理其实也是跟人打交道
的学问,这两者之中有很多相通的东西,他们的共同目标就是“让别人去做某件特定的事情。”而财务则是从数字的层面了解生意的本质,从宏观上看待生意的本
质,对于一个生意是否挣钱,是否可以正常运作有着最深刻的认识。
公司小的时候是销售主导公司,而公司大的时候是财务主导公司,销售的
局限性在于只看人情不看数字,财务的局限性在于只看数字不看人情。公司初期,运营成本低,有订单就活得下去,跟客户也没有什么谈判的条件,别人肯给生意做
已经谢天谢地了,这个时候订单压倒一切,客户的要求压倒一切,所以当然要顾人情。公司大了以后,一切都要规范化,免得因为不规范引起一些不必要的风险,同
时运营成本也变高,必须提高利润率,把有限的资金放到最有产出的地方。对于上市公司来说,股东才不管你客户是不是最近出国,最近是不是那个省又在搞严打,
到了时候就要把业绩拿出来,拿不出来就抛股票,这个时候就是数字压倒一切。
前两天听到有人说一句话觉得很有道理,开始的时候我们想“
能做什么?”,等到公司做大了有规模了,我们想“不能做什么。”很多人在工作中觉得为什么领导这么保守,这也不行那也不行,错过很多机会。很多时候是因
为,你还年轻,你想的是“能做什么”,而作为公司领导要考虑的方面很多,他比较关心“不能做什么”。
我并非鼓吹大家都去做销售或者财
务,究竟选择什么样的职业,和你究竟要选择什么样的人生有关系,有些人就喜欢下班按时回家,看看书听听音乐,那也挺好,但就不适合找个销售的工作了,否则
会是折磨自己。有些人就喜欢出风头,喜欢成为一群人的中心,如果选择做财务工作,大概也干不久,因为一般老板不喜欢财务太积极,也不喜欢财务话太多。先想
好自己要过怎样的人生,再决定要找什么样的职业。有很多的不快乐,其实是源自不满足,而不满足,很多时候是源自于心不定,而心不定则是因为不清楚究竟自己
要什么,不清楚要什么的结果就是什么都想要,结果什么都没得到。
我想,我们还是因为生活而工作,不是因为工作而生活,生活是最要紧
的,工作只是生活中的一部分。我总是觉得生活的各方方面都是相互影响的,如果生活本身一团乱麻,工作也不会顺利。所以要有娱乐、要有社交、要锻炼身体,要
有和睦的家庭……最要紧的,要开心,我的两个销售找我聊天,一肚子苦水,我问他们,2年以前,你什么都没有,工资不高,没有客户关系,没有业绩,处于被开
的边缘,现在的你比那时条件好了很多,为什么现在却更加不开心了?如果你做得越好越不开心,那你为什么还要工作?首先的首先,人还是要让自己高兴起来,让
自己心态好起来,这种发自内心的改变会让你更有耐心,更有信心,更有气质,更能包容……否则,看看镜子里的你,你满意么?
有人会说,
你说得容易,我每天加班,不加班老板就会把我炒掉,每天累得要死,哪有时间娱乐、社交、锻炼?那是人们把目标设定太高的缘故,如果你还在动不动就会被老板
炒掉的边缘,那么你当然不能设立太高的目标,难道你还想每天去打高尔夫?你没时间去健身房锻炼身体,但是上下班的时候多走几步可以吧,有楼梯的时候走走楼
梯不走电梯可以吧?办公的间隙扭扭脖子拉拉肩膀做做俯卧撑可以吧?谁规定锻炼就一定要拿出每天2个小时去健身房?你没时间社交,每月参加郊游一次可以吧,
周末去参加个什么音乐班,绘画班之类的可以吧,去尝试认识一些同行,和他们找机会交流交流可以吧?开始的时候总是有些难的,但迈出这一步就会向良性循环的
方向发展。而每天工作得很苦闷,剩下的时间用来咀嚼苦闷,只会陷入恶性循环,让生活更加糟糕。
虽然离开惠普仅有十五天,但感觉上惠普已经离我很远。我的心思更多放在规划自己第二阶段的人生,这并非代表我对惠普没有任何眷恋,主要还是想以此驱动自己往前走。
万科王石登珠穆朗玛峰的体验给我很多启发,虽然在出发时携带大量的物资,但是登顶的过程中,必须不断减轻负荷,最终只有一个氧气瓶和他登上峰顶。登山如此,漫长的人生又何尝不是。
我宣布退休后,接到同事朋友同学的祝贺。大部分人都认为我能够在这样的职位上及年龄选择退休,是一种勇气,也是一种福气。
还有一部分人怀疑我只是借此机会换个工作,当然还有一些人说我在HP做不下去了,趁此机会离开。
我多年来已经习惯别人对我的说三道四,但对于好友,我还是挺关心大家是否真正理解我的想法,这也是写这篇文章的目的。
由于受我父亲早逝的影响,我很早就下定决心,要在有生之年实现自己的愿望,我不要像我父亲一样,为家庭生活忙碌一辈子,临终前感伤,懊恼自己有很多没有实现的理想。
一本杂志的文章提到我们在生前就应该思考自己的墓志铭,因为那代表你自己对完美人生的定义,我们应该尽可能在有生之年去实现它。
我希望我的墓志铭上除了与家人及好友有关的内容外,是这样写着:
1.这个人曾经服务于一家全球最大的IT公司(HP)25年,和她一起经历过数次重大的变革,看着她从以电子仪表为主要的业务变革成全球最大的IT公司。
2.这个人曾经在全球发展最快的国家(中国)工作16年,并担任HP中国区总裁7年,见证及经历过中国改革开放的关键最新突破阶段,与中国一起成长。
3.这个人热爱飞行,曾经是一个有执照的飞行员,累积飞行时数超过X小时,曾经在X个机场起降过。
4.这个人曾经获得管理硕士学位,在领导管理上特别关注中国企业的组织行为及绩效,并且在这个领域上获得中国企业界的认可。
我费时25年才总结1和2两项成果,我不知还要费时多久才能达成3和4的愿望,特别是第4个愿望需要经历学术的训练,才能将我的经验总结成知识。
否则我的经验将无法有效影响及传授他人。因此重新进入学校学习,拿一个管理学位是有必要的,更何况这是我一个非常重要的愿望。
另一方面,我25年的时间都花在运营(operation)的领域,兢兢业业的做好职业人士的工作,它是一份好工作,特别是在HP,这份工作也帮助我建立财务的基础,支持家庭的发展。
但是我不想终其一生,都陷入在运营的领域,我想象企业家一样,有机会靠一些点子(ideas)赚钱,虽然风险很高,但是值得一试,即使失败,也不枉走一回,这也是第4个愿望其中的一部份。
CarlyFiorina曾经对我说过“这个世界上有好想法的人很多,但有能力去实现的人很少”,2007年5月21日在北大演讲时,有人问起那些书对
我影响较大,我想对我人生观有影响的其中一本书叫“TriggerPoint”,它的主要观点是:人生最需要的不是规划,而是在适当的时机掌握机会,采取
行动。
我这些愿望在我心中已经酝酿一段很长的时间,开始的时候,也许一年想个一两次,过了也就忘掉,但逐渐的,这个心中的声音,愈来愈大,出现的频率也愈来愈高,当它几乎每一个星期都会来与我对话时,我知道时机已经成熟。
但和任何人一样,要丢掉自己现在所拥有的,所熟悉的环境及稳定的收入,转到一条自己未曾经历过,存在未知风险的道路,需要绝大的勇气,家人的支持和好友的鼓励。有舍才有得,真是知易行难,我很高兴自己终于跨出了第一步。
我要感谢HP的EER提前退休优惠政策,它是其中一个关键的TriggerPoints,另一个关键因素是在去年五六月发生的事。
当时我家老大从大学毕业,老二从高中毕业,在他们继续工作及求学前,这是一个黄金时段,让我们全家可以相聚一段较长的时间,我为此很早就计划休一个长假,带着他们到各地游玩。
但这个计划因为工作上一件重要的事情(MarkHurd访华)不得不取消。这个事件刺激了我必须严肃的去对待那心中的声音,我会不会继续不断的错失很多关键的机会?
我已经年过50,我会不会走向和我父亲一样的道路?人事部老总Charles跟我说,很多人在所有对他有利的星星都排成一列时,还是错失时机。
我知道原因,因为割舍及改变对人是多么的困难,我相信大部分的人都有自己人生的理想,但我也相信很多人最终只是把这些理想当成是
幻想,然后不断的为自己寻找不能实现的藉口,南非前总统曼德拉曾经说过,“与改变世界相比,改变自己更困难”,真是一针见血。
什么是快乐及有意义的人生?我相信每一个人的定义都不一样,对我来说,能实现我墓志铭上的内容就是我的定义。
在中国惠普总裁的位置上固然可以吸引很多的关注及眼球,但是我太太及较亲近的好友,都知道那不是我追求的,那只是为扮演好这个角色必须尽力做好的地方。
做一个没有名片的人士,虽然只有十多天的时间,但我发现我的脑袋里已经空出很多空间及能量,让我可以静心的为我ChapterII的新生活做细致的调研及规划。
我预订以两年的时间来完成转轨的准备工作,并且花多点时间与家人共处。这两年的时间我希望拿到飞行执照,拿到管理有关的硕士学位,提升英文的水平,建立新的网络,多认识不同行业的人,保持与大陆的联系。希望两年后,我可以顺利回到大陆去实现我第四个愿望。
毫不意外,在生活上,我发现很多需要调整的地方。
二十多年来,我生活的步调及节奏,几乎完全被公司及工作所左右,不断涌出的deadline及任务驱动我每天的安排,一旦离开这样的环境,第一个需要调
整的就是要依靠自己的自律及意志力来驱动每天的活动,睡觉睡到自然醒的态度绝对不正确,放松自己,不给事情设定目标及时间表,或者对错失时间目标无所谓,
也不正确,没有年度,季度,月及周计划也不正确。
担任高层经理多年,已经养成交待事情的习惯,自己的时间主要花在思考,决策及追踪项目的进展情况,更多是依靠一个庞大的团队来执行具体的事项及秘书来处理很多协调及繁琐的事情。
到美国后,很多事情需要打800号电话联系,但这些电话很忙,常让你在waitingline上等待很长的时间,当我在等待时,我可以体会以前秘书工作辛苦的地方,但同时也提醒我自己,在这个阶段要改变态度,培养更大的耐性及自己动手做的能力。
生活的内容也要做出很大的调整,多出时间锻炼身体,多出时间关注家人,多出时间关注朋友,多出时间体验不同的休闲活动及飞行,一步步的,希望生活逐步调整到我所期望的轨道上,期待这两年的生活既充实又充满乐趣及意义。
第一个快乐的体验就是准备及参加大儿子的订婚礼,那种全心投入,不需担忧工作数字的感觉真好。同时我也租好了公寓,买好了家具及车子,陪家人在周末的时
候到Reno及LakeTahoe玩了一趟,LakeTahoe我去了多次,但这次的体验有所不同,我从心里欣赏到它的美丽。
但同时我也在加紧调研的工作,为申请大学及飞行学校做准备,这段时间也和在硅谷的朋友及一些风险投资公司见面,了解不同的产业。
我的人生观是“完美的演出来自充分的准备”,“勇于改变自己,适应不断变化的环境,机会将不断出现”,“快乐及有意义的人生来自于实现自己心中的愿望,而非外在的掌声”。
我离开时,有两位好朋友送给我两个不同的祝语,Baron的是“多年功过化烟尘”,杨华的是“莫春者,风乎舞雩,咏而归”,它们分别代表了我离开惠普及走向未来的心情。
我总结人生有三个阶段,一个阶段是为现实找一份工作,一个阶段是为现实,但可以选择一份自己愿意投入的工作,一个阶段是为理想去做一些事情。
我珍惜我的福气,感激HP及同事、好朋友给我的支持,鼓励及协助,这篇文字化我心声的文章与好友分享。
最近收到一个ticket,用ant写个build.xml,用到condition,作笔记如下:
basic elements: istrue isfalse not and or xor available isset equals filesmatch
1、istrue isfalse:断言 真 假
<project name="testCondition">
<target name="test">
<condition property="scondition">
<istrue value="true"/>
</condition>
<antcall target="isTrue"></antcall>
<antcall target="isFalse"></antcall>
</target>
<target name="isTrue" if="scondition">
<echo>is ture</echo>
</target>
<target name="isFalse" unless="scondition">
<echo>is false</echo>
</target>
</project>
2、逻辑运算
2.1、not 逻辑非
<project name="testCondition">
<target name="test">
<condition property="scondition">
<not>
<istrue value="true"/>
</not>
</condition>
<antcall target="isTrue"></antcall>
<antcall target="isFalse"></antcall>
</target>
<target name="isTrue" if="scondition">
<echo>is ture</echo>
</target>
<target name="isFalse" unless="scondition">
<echo>is false</echo>
</target>
</project>
2.2、and 逻辑与
<project name="testCondition">
<target name="test">
<condition property="scondition">
<and>
<istrue value="true"/>
<istrue value="false"/>
</and>
</condition>
<antcall target="isTrue"></antcall>
<antcall target="isFalse"></antcall>
</target>
<target name="isTrue" if="scondition">
<echo>is ture</echo>
</target>
<target name="isFalse" unless="scondition">
<echo>is false</echo>
</target>
</project>
2.3、or 逻辑或 xor异或 (语法上与and类似)
3、available 是否可用
<project name="testCondition">
<path id="all.test.classes">
<pathelement location="bin"/>
</path>
<target name="test">
<condition property="scondition">
<!--在指定的classpath路径下是否存在资源 TestTest.class-->
<available resource="TestTest.class">
<classpath refid="all.test.classes" />
</available>
</condition>
<antcall target="isTrue"></antcall>
<antcall target="isFalse"></antcall>
</target>
<target name="isTrue" if="scondition">
<echo>is ture</echo>
</target>
<target name="isFalse" unless="scondition">
<echo>is false</echo>
</target>
</project>
4、isset 指定属性是否存在
<project name="testCondition">
<!--属性也可以通过ant参数-D来设置-->
<property name="name" value="this is name"/>
<target name="test">
<condition property="scondition">
<!--如果属性name不存在则返回false-->
<isset property="name"/>
</condition>
<antcall target="isTrue"></antcall>
<antcall target="isFalse"></antcall>
</target>
<target name="isTrue" if="scondition">
<echo>is ture</echo>
</target>
<target name="isFalse" unless="scondition">
<echo>is false</echo>
</target>
</project>
5、equals 是否相等
<project name="testCondition">
<!--属性也可以通过ant参数-D来设置-->
<property name="name" value="this is name"/>
<target name="test">
<condition property="scondition">
<!--如果arg1的值与arg2的值相等返回true,否则为false-->
<equals arg1="${name}" arg2="this is name"/>
</condition>
<antcall target="isTrue"></antcall>
<antcall target="isFalse"></antcall>
</target>
<target name="isTrue" if="scondition">
<echo>is ture</echo>
</target>
<target name="isFalse" unless="scondition">
<echo>is false</echo>
</target>
</project>
6、filesmatch 比较文件
<project name="testCondition">
<target name="test">
<condition property="scondition">
<!--如果file1所代表的文件与file2所代表的文件相等返回true,否则为false-->
<filesmatch file1="testfile1.txt" file2="testfile2.txt"/>
</condition>
<antcall target="isTrue"></antcall>
<antcall target="isFalse"></antcall>
</target>
<target name="isTrue" if="scondition">
<echo>is ture</echo>
</target>
<target name="isFalse" unless="scondition">
<echo>is false</echo>
</target>
</project>
更多内容可以参考:http://ant.apache.org/manual/CoreTasks/conditions.html
请参照
openfire:http://www.igniterealtime.org/community/docs/DOC-1020
spark:http://www.igniterealtime.org/community/docs/DOC-1040
Openfire plugin 开发:http://www.igniterealtime.org/builds/openfire/docs/latest/documentation/plugin-dev-guide.html
今天升级系统到ubuntu8,重装vmware时,发现一些问题,浪费我不少时间,记录下来,希望大家可以省些时间。
1、下载vmware:http://www.vmware.com/download/eula.doVMware 6.0.3 build-80004
2、解压
3、执行安装
在其解压目录中执行:sudo ./vmware-install.pl
一路回车,最后报错:
在包含自 include/asm/bitops.h:2 的文件中,
从 /tmp/vmware-config1/vmmon-only/./include/vcpuset.h:74,
从 /tmp/vmware-config1/vmmon-only/./include/modulecall.h:23,
从 /tmp/vmware-config1/vmmon-only/common/vmx86.h:18,
从 /tmp/vmware-config1/vmmon-only/common/hostif.h:18,
从 /tmp/vmware-config1/vmmon-only/common/cpuid.c:14:
include/asm/bitops_32.h:9:2: 错误: #error only
can be included directly
make[2]: *** [/tmp/vmware-config1/vmmon-only/common/cpuid.o] 错误 1
make[1]: *** [_module_/tmp/vmware-config1/vmmon-only] 错误 2
make[1]: Leaving directory `/usr/src/linux-headers-2.6.24-16-generic’
make: *** [vmmon.ko] 错误 2
make: Leaving directory `/tmp/vmware-config1/vmmon-only’
Unable to build the vmmon module.
For more information on how to troubleshoot module-related problems, please
visit our Web site at “http://www.vmware.com/download/modules/modules.html” and
“http://www.vmware.com/support/reference/linux/prebuilt_modules_linux.html”.
Execution aborted.
4、网上搜了一下,找到解决办法如下:
4.1
cd /usr/lib/vmware/modules/source
sudo cp vmmon.tar vmmon.tar.backup
sudo tar xvf vmmon.tar
sudo gedit vmmon-only/include/vcpuset.h
4.2
将# #include “asm/bitops.h” 改为 #include “linux/bitops.h”
4.3
sudo tar cvf vmmon.tar vmmon-only
sudo rm -rf vmmon-only
5、接下来可以正常安装了。
你可能还会遇到这样的出错信息:
Version mismatch with vmmon module: expecting 167.0, got 161.0.Version mismatch with vmmon module
这可能是因为你运行了vmware-any-any-update-115,你需要运行vmware-any-any-update-116(可以在这下载:http://vmkernelnewbies.googlegroups.com/web/vmware-any-any-update-116.tgz)
(网上有说可以用vmware-any-any-update来解决第一个报错,但不能用115,而应用vmware-any-any-update116)
****************************************
后续问题:
当ubuntu更新一些软件包后,有时vmware就无法启动。这时按照 step 4 查看相关文件,无异常,(#include "linux/bitops.h").
此时只需再执行一下vmware-any-any-update116就可以了。(至少我是这样解决的,呵呵)
Eclispe自动提示功能设置如下:
第一步:
windows->preferences->java->Editor->Code Assist 中
将auto-activetion中的Enable auto-activetion选项要勾选上
这里面有个时间的设定是为提示代码设定的显示时间。你可以根据自己的情况设定。
第二步:
window->Preferences->Java->Editor->Content
Assist->Advanced 上面的选项卡Select the proposal kinds contained in the
'default' content assist list: 中把 Other Java Proposals 选项打上勾就可以了。
另注:也可以直接恢复成默认设置。
1、单步调试快捷键
以debug方式运行java程序后
(F8)直接执行程序。遇到断点时暂停;
(F5)单步执行程序,遇到方法时进入;
(F6)单步执行程序,遇到方法时跳过;
(F7)单步执行程序,从当前方法跳出。
2、改变变量的值
右击变量,在弹出的菜单中选择[change variable value],弹出修改画面。
改变其值后,按下ok;这时,变量的值就改为修改后的值了。
3、检查代码段是否正确
选择一句或一段代码,右键单击在弹出的菜单中选择Inspect项,
此时,代码的执行结果将显示在Expressions窗口中。
要安装exchange2003,首先要安装域控,整理安装过程如下:
1,安装DNS服务
如果在安装Windows Server 2003过程中,没有选择DNS组件,默认情况下是不被安装的,我们就需要手动去添加它。这里我们需要用到Windows Server 2003的安装光盘。
添加方法如下:
“开始—设置—控制面板—添加删除程序”,
然后再点击“添加/删除Windows组件”
选中“网络服务”
默认情况下所有的网络服务都会被添加,可以点击下面的“详细信息”进行自定义安装,由于在这里只需要DNS,所以把其它的全都去掉了,以后需要的时候再安装
然后就是点“确定”,一直点“下一步”就可以完成整个DNS的安装。在整个安装过程中请保证Windows Server 2003安装光盘位于光驱中,否则会出现找不到文件的提示,那就需要手动定位了。
2,Active Directory安装
安装完DNS以后,就可以进行提升操作了,先点击“开始—运行”,输入“Dcpromo”,然后回车就可以看到“Active Directory安装向导”
安装过程按照提示输入相应内容就可以了,
但是,当到 “DNS 注册诊断”这一步时,可能出现诊断失败,第一次部署时总会出现上面那个DNS注册诊断出错的画面,主要是因为虽然安装了DNS,但由于并没有配置它,网络上还没有可用的DNS服务器,所以才会出现响应超时的现像,所以在这里要选择:“在这台计算机上安装并配置DNS,并将这台DNS服务器设为这台计算机的首选DNS服务器”。
安装完成后提示重启,
然后来看一下安装了AD后和没有安装的时候有些什么区别,首先第一感觉就是关机和开机的速度明显变慢了,
再看一下登陆界面:在“登录到”选项中选择刚配置的域名,登录。
3,检查是否成功
进入系统后,右键点击“我的电脑”选“属性”,点“计算机”
如果已经登录上了指定域,
这台服务器就被成功提升为域控制器了。
由于最近的项目中要用到kerberos and spnego protocol,查了一些资料,结合网上的资料和对它一定的理解,整理如下,以备后查.(如有不对之处,肯请高手指教)
kerberos是一个很重要的网络认证协议,它实现了在一个非安全的网络环境中,一个实体向另一个实体证实自己的身份,从而以安全的方式进行交流.kerberos protocol已经被广泛应用于各种应用中,最为典型的莫过于windows中的kerberos认证,它在spnego protocol之下,为windows域用户登录提供安全保障.
首先相关名词:
Long term key:就是长期保持不变的key.
Master key:就是Long term key经过Hash运算得到的Hash code.
Short term key:就是只在一定时间内有效的key.有时也叫Session key.
原则上Long term key 是不能在网络上传输的,因为很可能Long term key在传输过程中被人截获,一旦它被截获,原则上只要有足够的时间,就可以被破解.另外,对于一个帐户而言,密码仅限于该用户知道,对于domain的Administrator也应该保密,但由于密码是用户向Administrator证明身份的凭据,所以要基于用户的密码生成来的信息来证明用户的身份,通常做法是对密码进行Hash运算,生成Hash code,这个Hash code就是我们说的Master key.因为Hash Algorithm具有不可逆,同时保证了密码与Master key一一对应的特性,保证了密码的保密性,也保证了Master key可以代表密码作为用户身份的凭证.而作为 Short term key,用来加密在网络上传输的数据,由于它只在一定时间内有效,即使被人截获,等到被破解时,这个key早就过期了.
Client 服务请求者
Server 服务提供者
KDC kerberos distribution certer.在整个认证过程中作为client和server共同信认的第三方.
以windows2003中的Domain为例,Domain Controller扮演着kdc的角色.
下面我来介绍一下这kerberos协议如何实现认证的.
前提:client和server都在kdc上已注册.
第一步 Authentication Service Exchange
第二步 Ticket Granting Service Exchange
第三步 Client/Server Exchange
首先Client向kdc申请server服务,kdc查看server服务是受保护的服务,所以要验证client的身份,这就是第一步,kdc验证client的身份(Authentication Service Exchange).当kdc核实client的身份正确后,会给client一个证明,用这个证明我们可以得到访问server服务的许可证(Ticket),所以我们把这个证明叫做TGT(Ticket Granting Ticket).
当client得到TGT后,用TGT来向kdc索要访问server服务的通行证(Ticket),这就是第二步Ticket Granting Service Exchange.
当client得到通行证(Ticket)后,就与server交互,向server出示通行证(Ticket),即第三步Client/Server Exchange,从可得到server的服务.
以上三步的具体实现要复杂得多,简单介绍如下:
1. Authentication Service Exchange
通过这个Sub-protocol,KDC(确切地说是KDC中的Authentication Service)实现对Client身份的确认,并颁发给该Client一个TGT。具体过程如
下:
Client向KDC的Authentication Service发送Authentication Service Request(KRB_AS_REQ), 为了确保KRB_AS_REQ仅限于自己和KDC知道,
Client使用自己的Master Key对KRB_AS_REQ的主体部分进行加密(KDC可以通过Domain 的Account Database获得该Client的Master Key)。
KRB_AS_REQ的大体包含以下的内容:
Pre-authentication data:包含用以证明自己身份的信息。说白了,就是证明自己知道自己声称的那个account的Password。一般地,它的内容是
一个被Client的Master key加密过的Timestamp。
Client name & realm: 简单地说就是Domain name\Client Server Name:注意这里的Server Name并不是Client真正要访问的Server的名称,而我们也说
了TGT是和Server无关的(Client只能使用Ticket,而不是TGT去访问Server)。这里的Server Name实际上是KDC的Ticket Granting Service的Server Name。
AS(Authentication Service)通过它接收到的KRB_AS_REQ验证发送方的是否是在Client name & realm中声称的那个人,也就是说要验证发送放是
否知道Client的Password。所以AS只需从Account Database中提取Client对应的Master Key对Pre-authentication data进行解密,如果是一个合法
的Timestamp,则可以证明发送放提供的是正确无误的密码。验证通过之后,AS将一份Authentication Service Response(KRB_AS_REP
)发送给Client。KRB_AS_REQ主要包含两个部分:本Client的Master Key加密过的Session Key(
SKDC-Client:Logon Session Key)和被自己(KDC)加密的TGT。而TGT大体又包含以下的内容
:
Session Key: SKDC-Client:Logon Session Key
Client name & realm: 简单地说就是Domain
name\Client
End time: TGT到期的时间。
Client通过自己的Master Key对第一部分解密获得Session Key(SKDC-Client:Logon Session Key)之后,携带着TGT便可以进入下一步:TGS(
Ticket Granting Service)Exchange。
2. TGS(Ticket Granting Service)Exchange
TGS(Ticket Granting Service)Exchange通过Client向KDC中的TGS(Ticket Granting Service)发送Ticket Granting Service Request
(KRB_TGS_REQ)开始。KRB_TGS_REQ大体包含以下的内容:
TGT:Client通过AS Exchange获得的Ticket
Granting Ticket,TGT被KDC的Master Key进行加
密。
Authenticator:用以证明当初TGT的拥有者是否就是自己,所以它必须以TGT的办法方和自己的Session Key(SKDC-Client:Logon Session Key
)来进行加密。
Client name & realm: 简单地说就是Domain name\Client。
Server name & realm: 简单地说就是Domain name\Server,这回是Client试图访问的那个Server。
TGS收到KRB_TGS_REQ在发给Client真正的Ticket之前,先得整个Client提供的那个TGT是否是AS颁发给它的。于是它不得不通过Client提供的
Authenticator来证明。但是Authentication是通过Logon Session Key(SKDC-Client)进行加密的,而自己并没有保存这个Session Key。所以
TGS先得通过自己的Master Key对Client提供的TGT进行解密,从而获得这个Logon Session Key(SKDC-Client),再通过这个Logon Session
Key(SKDC-Client)解密Authenticator进行验证。验证通过向对方发送Ticket Granting Service Response(KRB_TGS_REP)。这个KRB_TGS_REP有
两部分组成:使用Logon Session Key(SKDC-Client)加密过用于Client和Server的Session Key(SServer-Client)和使用Server的Master
Key进行加密的Ticket。该Ticket大体包含以下一些内容:
Session Key:SServer-Client。
Client name & realm: 简单地说就是Domain name\Client。
End time: Ticket的到期时间。
Client收到KRB_TGS_REP,使用Logon Session Key(SKDC-Client)解密第一部分后获得Session Key(SServer-Client)。有了Session Key和
Ticket,Client就可以之间和Server进行交互,而无须在通过KDC作中间人了。所以我们说Kerberos是一种高效的认证方式,它可以直接通
过Client和Server双方来完成,不像Windows NT 4下的NTLM认证方式,每次认证都要通过一个双方信任的第3方来完成。
我们现在来看看 Client如果使用Ticket和Server怎样进行交互的,这个阶段通过我们的第3个Sub-protocol来完成:CS(Client/Server )
Exchange。
3. CS(Client/Server )Exchange
Client通过TGSExchange获得Client和Server的Session Key(SServer-Client),随后创建用于证明自己就是Ticket的真正所有者的Authenticator,并使用Session Key(SServer-Client)进行加密。最后将这个被加密过的Authenticator和Ticket作为Application Service Request(KRB_AP_REQ)发
送给Server。除了上述两项内容之外,KRB_AP_REQ还包含一个Flag用于表示Client是否需要进行双向验证(Mutual Authentication)。
Server接收到KRB_AP_REQ之后,通过自己的Master Key解密Ticket,从而获得Session Key(SServer-Client)。通过Session Key(SServer
-Client)解密Authenticator,进而验证对方的身份。验证成功,让Client访问需要访问的资源,否则直接拒绝对方的请求。
对于需要进行双向验证,Server从Authenticator提取Timestamp,使用Session Key(SServer-Client)进行加密,并将其发送给Client用于
Client验证Server的身份。
想要更深入的理解kerberos,请参考官方网站
http://web.mit.edu/Kerberos/
做SSL以来,一直在使用keytool,下面把它用法整理如下,以备以后查看。
1,产生一个密钥对
keytool -genkey -alias mykeypair -keypass mykeypairpwd
过程如下:
liqingfeng@liqingfeng:~/WORK_APP/keytooltest$ keytool -genkey -alias mykeypair -keypass mykeypairpwd
输入keystore密码: 123456
您的名字与姓氏是什么?
[Unknown]: fingki
您的组织单位名称是什么?
[Unknown]: server
您的组织名称是什么?
[Unknown]: server
您所在的城市或区域名称是什么?
[Unknown]: bj
您所在的州或省份名称是什么?
[Unknown]: bj
该单位的两字母国家代码是什么
[Unknown]: CN
CN=fingki, OU=server, O=server, L=bj, ST=bj, C=CN 正确吗?
[否]: y
liqingfeng@liqingfeng:~/WORK_APP/keytooltest$
这样将产生一个keypair,同时产生一个keystore.默认名是.keystore,存放到user-home目录
假如你想修改密码,可以用:keytool -keypasswd -alias mykeypair -keypass mykeypairpwd -new newpass
2,产生一个密钥对,存放在指定的keystore中(加上-keystore 参数)
keytool -genkey -alias mykeypair -keypass mykeypairpwd -keystore mykeystore
过程与上面的相同。
执行完后,在当前目录下产生一个名为mykeystore的keystore,里面有一个别名为mykeypair的keypair。
3,检查一个keystore中的内容
keytool -list -v -alias mykeypair -keystore mykeystore
参数 -v指明要列出详细信息
-alias指明列出指定的别名为mykeypair的keypair信息(不指定则列出所有)
-keystore指明要列出名字为mykeystore的keystore中的信息
过程如下:
liqingfeng@liqingfeng:~/WORK_APP/keytooltest$ keytool -list -v -keystore mykeystore
输入keystore密码: 123456
Keystore 类型: jks
Keystore 提供者: SUN
您的 keystore 包含 1 输入
别名名称: mykeypair
创建日期: 2008-4-16
输入类型:KeyEntry
认证链长度: 1
认证 [1]:
Owner: CN=fingki, OU=server, O=server, L=bj, ST=bj, C=CN
发照者: CN=fingki, OU=server, O=server, L=bj, ST=bj, C=CN
序号: 48058c3c
有效期间: Wed Apr 16 13:18:52 GMT+08:00 2008 至: Tue Jul 15 13:18:52 GMT+08:00 2008
认证指纹:
MD5: FD:C3:97:DC:84:A0:D8:B2:08:6F:26:7F:31:33:C3:05
SHA1: A3:21:6F:C6:FB:5F:F5:2D:03:DA:71:8C:D3:67:9D:1C:E1:27:A5:11
*******************************************
*******************************************
liqingfeng@liqingfeng:~/WORK_APP/keytooltest$
4,Keystore的产生:
当使用-genkey 或-import或-identitydb命令添加数据到一个keystore,而当这个keystore不存在时,产生一个keystore.默认名是.keystore,存放到user-home目录.
当用-keystore指定时,将产生指定的keystore.
5,Keystore的实现:
Keytool 类位于java.security包下,提供一个非常好的接口去取得和修改一个keystore中的信息. 目前有两个命令行:keytool和jarsinger,一个GUI工具Policy 可以实现keystore.由于keystore是公开的,用户可以用它写一些额外的安全应用程序.
Keystore还有一个sun公司提供的內在实现.它把keystore作为一个文件来实现.利用了一个keystore类型(格式)"JKS".它用单独的密码保护每一个私有钥匙.也用可能不同的密码保护整个keystore的完整性.
支持的算法和钥匙大小:
keytool允许用户指定钥匙对和注册密码服务供应者所提供的签名算法.缺省的钥匙对产生算法是"DSA".假如私有钥匙是"DSA"类型,缺省签名算法是"SHA1withDSA",假如私有钥匙是"RSA"类型,缺省算法是"MD5withRSA".
当产生一个DSA钥匙对,钥匙必须在512-1024位之间.对任何算法的缺省钥匙大小是1024位.
6,关于证书
一个证书是一个实体的数字签名,还包含这个实体的公共钥匙值.
公共钥匙 :是一个详细的实体的数字关联,并有意让所有想同这个实体发生信任关系的其他实体知道.公共钥匙用来检验签名;
数字签名:是实体信息用实体的私有钥匙签名(加密)后的数据.这条数据可以用这个实体的公共钥匙来检验签名(解密)出实体信息以鉴别实体的身份;
签名:用实体私有钥匙加密某些消息,从而得到加密数据;
私有钥匙:是一些数字,私有和公共钥匙存在所有用公共钥匙加密的系统的钥匙对中.公共钥匙用来加密数据,私有钥匙用来计算签名.公钥加密的消息只能用私钥解密,私钥签名的消息只能用公钥检验签名。
实体:一个实体可以是一个人,一个组织,一个程序,一台计算机,一个商业,一个银行,或其他你想信任的东西.
实际上,我们用[1]中的命令已经生成了一个自签名的证书,没有指定的参数都使用的是默认值。
我们也可以用如下命令生成一个自签名的证书:
keytool -genkey -dname "CN=fingki,OU=server,O=server,L=bj,ST=bj,C=CN" -alias myCA -keyalg RSA -keysize 1024 -keystore myCALib -keypass 654321 -storepass 123456 -validity 3650
这条命令将生成一个别名为myCA的自签名证书,证书的keypair的密码为654321,证书中实体信息为 "CN=fingki,OU=server,O=server,L=bj,ST=bj,C=CN",存储在名为myCALib的keystore中(如果没有将自动生成一个),这个keystore的密码为123456,密钥对产生的算法指定为RSA,有效期为10年。
7,将证书导出到证书文件
keytool -export -alias myCA -file myCA.cer -keystore myCALib -storepass 123456 -rfc
使用该命令从名为myCALib的keystore中,把别名为myCA的证书导出到证书文件myCA.cer中。(其中-storepass指定keystore的密码,-rfc指定以可查看编码的方式输出,可省略)。
8,通过证书文件查看证书信息
keytool -printcert -file myCA.cer
9,密钥库中证书条目口令的修改
Keytool -keypasswd -alias myCA -keypass 654321 -new newpass -storepass 123456 -keystore myCALib
10,删除密钥库中的证书条目
keytool -delete -alias myCA -keystore myCALib
11,把一个证书文件导入到指定的密钥库
keytool -import -alias myCA -file myCA.cer -keystore truststore
(如果没有名为truststore的keystore,将自动创建,将会提示输入keystore的密码)
12,更改密钥库的密码
keytool -storepasswd -new 123456 -storepass 789012 -keystore truststore
其中-storepass指定原密码,-new指定新密码。
|