posts - 72, comments - 66, trackbacks - 0, articles - 0

2008年7月3日


sudo vim /etc/vmware/config

在最下面添加一句话:
xkeymap.nokeycodeMap = true

posted @ 2010-06-09 15:39 Fingki.li 阅读(582) | 评论 (0)编辑 收藏

在使用Iterator处理Collection时,注意java.util.ConcurrentModificationException。
1.如果你仅仅是对collection进行遍历查询,那么不必担心什么。
2.但如果你在遍历过程中要对collection进行删除,那么你就要注意了。
For example:
private void testDel() {  
  1.     List<String> list = new ArrayList<String>();  
  2.     for (int i = 0; i < 10; i++) {  
  3.         String str = "td" + i;  
  4.         list.add(str);  
  5.     }  
  6.   
  7.     for (Iterator it = list.iterator(); it.hasNext();) {  
  8.         String str = (String) it.next();  
  9.         if (str.equals("td5")) {  
  10.             // list.remove(str);  // 删除方法一 
  11.             it.remove();  // 删除方法二 
  12.         }  
  13.     }  

上面的代码运行没有问题,但如果你用“方法一”替代“方法二”,则会出现java.util.ConcurrentModificationException。
(用for-each遍历也会出个类似问题)
具体原因是可以看一下先看看List中的remove方法源码:
  1. public boolean remove(Object o) {  
  2.     if (o == null) {  
  3.         for (int index = 0; index < size; index++)  
  4.             if (elementData[index] == null) {  
  5.                 fastRemove(index);  
  6.                 return true;  
  7.             }  
  8.     } else {  
  9.         for (int index = 0; index < size; index++)  
  10.             if (o.equals(elementData[index])) {  
  11.                 fastRemove(index);  
  12.                 return true;  
  13.             }  
  14.     }  
  15.     return false;  
  16. }  
  17.   
  18. private void fastRemove(int index) {  
  19.     modCount++; // 特别注意这里,这里只增加了modCount的值  
  20.     int numMoved = size - index - 1;  
  21.     if (numMoved > 0)  
  22.         System.arraycopy(elementData, index + 1, elementData, index,  
  23.                 numMoved);  
  24.     elementData[--size] = null; // Let gc do its work  

接着看。删除后得到下一个元素的代码,it.next():  it为AbstractList的内部类Iterator的一个实例。
  1. public E next() {  
  2.     checkForComodification();  
  3.     try {  
  4.         E next = get(cursor);  
  5.         lastRet = cursor++;  
  6.         return next;  
  7.     } catch (IndexOutOfBoundsException e) {  
  8.         checkForComodification();  
  9.         throw new NoSuchElementException();  
  10.     }  
  11. }  
  12.   
  13. final void checkForComodification() {  //注意这个方法
  14.     if (modCount != expectedModCount)  //检查这两个值是否相同
  15.         throw new ConcurrentModificationException();  

最后看Iterator的remove()方法的源代码:
  1. public void remove() {  
  2.     if (lastRet == -1)  
  3.         throw new IllegalStateException();  
  4.     checkForComodification();  
  5.     try {  
  6.         AbstractList.this.remove(lastRet);  
  7.         if (lastRet < cursor)  
  8.             cursor--;  
  9.         lastRet = -1;  
  10.         expectedModCount = modCount; // 设置expectedModCount  
  11.     } catch (IndexOutOfBoundsException e) {  
  12.         throw new ConcurrentModificationException();  
  13.     }  
  14. }  
  15.   
  16. final void checkForComodification() {  
  17.     if (modCount != expectedModCount)  
  18.         throw new ConcurrentModificationException();  

这下就明白了,list的remove方法只修改了modCount值,而iterator的remove能同步modCount和expectedModCount.



posted @ 2010-03-02 12:22 Fingki.li 阅读(5064) | 评论 (1)编辑 收藏

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

posted @ 2010-03-02 11:51 Fingki.li 阅读(458) | 评论 (0)编辑 收藏

各国语言代码列表:
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

posted @ 2009-12-23 17:33 Fingki.li 阅读(964) | 评论 (0)编辑 收藏

记得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和中国人民不可接受的
,也是无法接受的。
    第二,如果外资以失败而告终,即在汇率上把住出口,让房价回归真实
价 值,把外资同样套在中国,这才是胜利的前提。那么以美国财团为首的帝国主
义噬 血者必将疯狂报复,会在投资、出口等各方面对中国施加压力。我们今天人
民币升 值没有达到美国预期,已经导致中国出口到美国的产品受打压,进而引起
了众多的 贸易摩擦,由此可见一斑。我们知道,经济发展的三套马车是,投资、
出口和消费 ,在投资、出口领域遭到报复会影响中国经济的发展,但我相信不会
影响我们的发 展速度,别忘了还有一套马车是“消费”,房价下降后,如果你是
爱国者,请现在 保护好你的钱包,到时千万别羞羞答答,要果断地出手买房,中
国经济会在消费领 域异军突起,继续独占世界经济引擎的鳌头。

posted @ 2009-12-18 15:55 Fingki.li 阅读(518) | 评论 (0)编辑 收藏

看了这篇文章,真的让我无语了。。。

*****************************************以下转载*********************************************

昨晚,和一个开典当行的同学喝酒。
我问同学,“你买了多少套房子,多少间铺面?”

“房子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亿的森豪虚假按揭案暴露后,相关的银行官员居然没有被追究责任,这怎么可以呢?嘿嘿!如果这样的事是发生在我的典当行,不要说让他家破人亡,我至少会让他和他的亲戚倾家荡产!!!

作者发言:是啊!发生金融案件后,居然不追究相关银行官员的责任。换成是我,我也觉得“打马虎”比尽忠职守更合算!!!怪不得中国的金融案件层出不穷。听 君一席话,胜读十年书!听你说到这儿,就连我这么笨的人也知道了应该如何理顺楼市——只要严格金融制度,让炒房的人不能获得投机的资金,楼市的泡沫自然的 就会散去!!

同学的话——

你终于聪明了一回。可惜!!!

posted @ 2009-12-14 14:21 Fingki.li 阅读(413) | 评论 (1)编辑 收藏

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'.

posted @ 2009-11-23 15:57 Fingki.li 阅读(1226) | 评论 (0)编辑 收藏

     摘要: 转载:请每一个孝顺的子女耐心的看下去!  阅读全文

posted @ 2009-11-03 15:04 Fingki.li 阅读(297) | 评论 (0)编辑 收藏

     摘要: 要理解IOC,推荐: 看《墨攻》理解IoC概念。
IOC从字面来看不容易懂,但如果你看了这篇文章,相信你一定会懂。
佩服原作者!  阅读全文

posted @ 2009-08-13 10:34 Fingki.li 阅读(1352) | 评论 (1)编辑 收藏

     摘要:   阅读全文

posted @ 2009-08-11 17:38 Fingki.li 阅读(12035) | 评论 (6)编辑 收藏

对于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);

posted @ 2009-07-31 15:53 Fingki.li 阅读(3574) | 评论 (4)编辑 收藏

     摘要: vsftpd 有关错误 500 OOPS: vsftpd: refusing to run with writable anonymous root   阅读全文

posted @ 2009-07-13 10:58 Fingki.li 阅读(11566) | 评论 (5)编辑 收藏

     摘要: Linux下application中文显示为方块问题的解决  阅读全文

posted @ 2009-07-06 10:27 Fingki.li 阅读(1692) | 评论 (0)编辑 收藏

     摘要: jquery css hover  阅读全文

posted @ 2009-05-21 10:51 Fingki.li 阅读(3761) | 评论 (0)编辑 收藏

DWR 2.0.5,
方法使用对象参数时报错如下:
Erroring: batchId[0] message[org.directwebremoting.extend.MarshallException: Error marshalling test.User:

一个最可能的原因是 User没有一个无参的construction。

晕。。。
朋友们注意呀!

posted @ 2009-04-23 15:23 Fingki.li 阅读(1449) | 评论 (0)编辑 收藏

对于以太网环境下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的值,那就是网管的事了(一般人没这权限呀),我们只能申请加等待了 ^-^ .

posted @ 2009-04-10 16:35 Fingki.li 阅读(2403) | 评论 (0)编辑 收藏

从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分析的利器。

posted @ 2009-03-24 11:45 Fingki.li 阅读(6265) | 评论 (2)编辑 收藏

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.

posted @ 2009-03-05 17:47 Fingki.li 阅读(1570) | 评论 (0)编辑 收藏

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 会话发起协议

posted @ 2009-03-04 15:42 Fingki.li 阅读(254) | 评论 (0)编辑 收藏

经过漫长的配置,终于搞定了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用户设定多个电子邮件地址(当然只会有一个为默认邮件地址,或叫主地址),当有人给你向这多个地址中发送邮件时,这些邮件都会发到你的主地址邮箱中。

posted @ 2009-02-27 11:05 Fingki.li 阅读(10522) | 评论 (3)编辑 收藏

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.


posted @ 2009-02-26 10:42 Fingki.li 阅读(341) | 评论 (0)编辑 收藏

     摘要: 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;  阅读全文

posted @ 2009-02-25 16:58 Fingki.li 阅读(1779) | 评论 (0)编辑 收藏

     摘要: sudoer application Launcher
On Ubuntu,run applications as sudo via Application Launcher  阅读全文

posted @ 2009-02-23 12:33 Fingki.li 阅读(1311) | 评论 (0)编辑 收藏

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容器中运行完全正常。

posted @ 2009-02-17 15:35 Fingki.li 阅读(2706) | 评论 (10)编辑 收藏

当一个类实现了序列化接口,有时会遇到 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;
这样就解决了新老版本的兼容性问题。
当然,对于序列化还有很多问题,慢慢研究吧。

posted @ 2009-01-13 11:46 Fingki.li 阅读(17576) | 评论 (3)编辑 收藏

对volatile,看到了个很清楚的解释,摘录下来如下:

volatile关键字有什么用?
恐怕比较一下volatile和synchronized的不同是最容易解释清楚的。volatile是变量修饰符,而synchronized则作用于一段代码或方法;看如下三句get代码:

  1. inti1;              intgeti1(){returni1;}
  2. volatile inti2;              intgeti2(){returni2;}
  3.          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:

  1. inti1;              intgeti1(){returni1;}
  2. volatile inti2;              intgeti2(){returni2;}
  3.          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

posted @ 2009-01-06 15:24 Fingki.li 阅读(392) | 评论 (0)编辑 收藏

有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

posted @ 2009-01-06 12:24 Fingki.li 阅读(3456) | 评论 (0)编辑 收藏

相关资料:
IETF : http://www.potaroo.net/ietf/idref/draft-nourse-scep/
Java SCEP : http://www.urut.ch/scep/
OpenSCEP : http://openscep.othello.ch/

posted @ 2009-01-04 14:25 Fingki.li 阅读(325) | 评论 (0)编辑 收藏

一朋友推荐给我的文章,感觉很不错;摘抄过来,也给同行们提个醒!

论坛里经常可以看到关于 35 岁程序员的生涯询问, 他们之中有些人写了十年代码, 有些人则是因为对编程发生了兴趣, 中途转行, 以下四点是给那些 30 - 35 岁程序员的建议:

* 照顾自己健康

以前, 我认为 "钱" 是很重要的, 俗话说的好: "钱不是万能, 但没有钱万万不能", 所以过去我的焦点都是放在收入, 但后来我发现有比钱更重要的东西, 那是 "家", 在你没有结婚前, 这个家的概念是指你和父母的和谐关系, 而在结婚后, 家的概念是指如何维系一个家庭, 包括和太太还有孩子的关系。

在 IT 这个行业里, 很多人跟自己父母的想法是有差距的, 认为上一代保守, 食古不化, 讲到很多东西没法沟通, 另外, 我的很多朋友事业做很大, 但最后却离婚了, 没有孩子还好, 有孩子的要想更多, 只有家, 你才有奋斗的目标, 才有精神的支持, 否则就像电视里讲的那一句, 失去了你, 得到江山又如何?

但这个家的信念自从张国荣事件后, 又改变了我的看法, 那就是有比家更重要的东西, 那是你的 "健康", 这个健康包括生理和心理上的健康, 想想看你拥有了一个家, 但是因为没有健康, 全家人都被拖下去了, 每天看着你痛苦的吊瓶子, 更严重的直接轻生, 这样遗留给珍爱你的人只是更大的痛苦, 你会 C, C++, C#, Java... 又怎样? 那时候你会认为这些通通都是屁, 做人做到能够 "吃得下饭、睡得着觉、笑得出来" 就已经是莫大的幸福。

35 岁会困惑的人多半是因为二十几岁的时候就没有做好准备, 过去的已经不可追, 现在要想的应该是 45 岁怎么办? 有人说年轻比的是学问, 中年比的是财富, 老年比的是健康, 如果你现在不注意自己健康, 那么很快更大的困扰就会上门了, 人生每个阶段都有扮演的角色, 要学会未雨绸缪, 否则不用到 50 岁, 可能 40 岁就会开始后悔了, 健康要从饮食和运动着手, 多涉猎这方面的常识, 比搞那些过几年就要淘汰的技术有意义多了。

* 学会投资理财

很多人认为投资理财需要很多的钱, 这是不正确的, 会理财的人, 小钱可以积累到大, 不会理财的人, 大钱也会消耗到光, 投资理财首重的是风险管理, 没有风险管理就像在刀口舔血一样, 投资理财应该要趁早磨练, 不要等到 40 岁的时候才去冒险, 因为那时候你已经没有本钱跌倒, 投资理财的方法有很多, 并不是只有房地产, 股票这些东西, 从节约, 储蓄, 定存... 每一步都是学习, 关键是你要从投资的过程里去发现自己, 并且了解如何正确对待甚至对付自己, 这样你才有机会早一日达到经济自由, 不会提心吊胆这个那个。

投资理财要量力而为, 不要做超过你能力所能负荷的事情, 我给程序员最好的建议是关注经济, 不要浮躁, 错把投机当投资, 这样还不如定存来得可靠安全。

* 经营你的人脉

我觉得程序员除了普遍不善理财外, 另外人际沟通也多有问题, 很多人在离开公司的剎那, 整个人感觉也都被掏空了, 而且会有一种担忧, 以前别人跟我说话那是因为我是某某公司的员工, 现在不是了, 可能就没有什么人会再鸟我了, 这就是典型的人脉经营危机。

人脉的经营不是看你有没有朋友, 而是有没有能帮助你同时又有实力的朋友。有些人朋友很多, 但真正遇到困难, 只能精神上支持一下, 除此外, 帮不上任何忙, 这代表人脉还是太单薄, 不要总问别人能给你什么? 也要问问你能给别人什么? 懂得去欣赏别人, 而不要像患了红眼病一样, 漠视别人背后的辛劳的付出, 只知道妒忌表面的风头, 这样, 只会将自己的路越走越窄。

经营自己的人脉是有秘诀的, 首先你要了解自己存在的价值, 如果没有存在的价值, 那么经营的人脉是空的, 这跟有存在价值却不知道怎样经营人脉, 基本上差不多, 经营人脉并不等于趋炎附势, 而是指在得势的时候, 就要想到落难的时刻, 待人宽厚真诚, 花无百日好, 人无千日红, 多欣赏别人, 择友深交, 别把时间浪费在小屁孩身上。

* 培养广泛兴趣

一个程序员如果除了 IT 以外, 一点其它的兴趣也没有, 那真的是很危险的事情, 像我现在年龄已经超过 35 岁了, 很快就要 40, 但我现在还是每天写代码, 做项目已经不是为了维生, 而是纯粹兴趣了, 我想我会一直写下去, 同时开始加强自己经营管理或财务方面的知识。你说郭安定以后玩不了电脑怎么办? 他就去写书, 万一双手废了怎么办? 那就去配音, 万一声音也哑了怎么办? 那就重回金融市场, 让徒子徒孙帮忙着下单, 眼球看左就买, 看右就卖, 就这么一直玩下去...

所以人生不是只有一条路, 你得为自己想好方方面面, 而广泛的兴趣可以帮助你跳脱现况, 看到更多。

以上四点不仅是 35 岁的人要注意的, 很多甚至二十几岁的人也要开始关注, 说真的, 很多程序员看上去每个体型都不错, 但体格都马马虎虎, 很多人熬个两天夜就不行了, 不知该说什么... 一起加油吧。

posted @ 2008-12-26 14:59 Fingki.li 阅读(292) | 评论 (1)编辑 收藏

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 之中

gedit ~/.tsung/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 start

运行完,在 ~/.tsung/log 目录会生成一个以时间命名的目录,进入这个目录

cd ~/.tsung/log/xxxxx
/usr/lib/tsung/bin/tsung_stats.pl (有时可能是 /usr/local/lib/tsung/bin/tsung_stats.pl)

生成 html 的压力测试报告

firefox report.html
除了 http 以外 tsung 还可以压很多东西,比如:jabber, postgreSQL 还可以写插件来给任何你想要测试的东西加压.

posted @ 2008-12-01 10:43 Fingki.li 阅读(1970) | 评论 (2)编辑 收藏

通过/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 重启

posted @ 2008-11-25 17:44 Fingki.li 阅读(662) | 评论 (0)编辑 收藏

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






posted @ 2008-11-25 10:13 Fingki.li 阅读(3713) | 评论 (0)编辑 收藏

当进行大并发的压力测试时,经常会出现如下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

  1. Run regedit to start the Registry Editor
  2. Locate the following key: HKEY_LOCAL_MACHINE"System"CurrentControlSet"Services"tcpip"Parameters
  3. Add a new value named TcpTimedWaitDelay asa decimal and set the desired timeout in seconds (30-300)
  4. Reboot

in Linux

  1. Update the configuration value by running (30 seconds used in the example)
    echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout
  2. 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

posted @ 2008-10-22 19:13 Fingki.li 阅读(5825) | 评论 (7)编辑 收藏


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

posted @ 2008-09-18 17:31 Fingki.li 阅读(1821) | 评论 (0)编辑 收藏

前两天一个朋友问我,为什么要写blog?
是呀,为什么要写blog呢?为什么大家都在写blog呢?
我来说说我的想法吧。
最开始的时候,我纯粹是跟风,大家都在写blog,自己也就想玩玩,随便申请了一个,然后写几篇不相干的东西,然后忘记了;
后来,工作中经常遇到一些技术问题,想把它记录下来,想到了blog这种方式,很不错,很方便,所以又开始找个相关的blog,开始写;
再后来,发现有好多的问题都是在别人的blog中找到的答案,很羡慕,很感激,于是也开始把自己的一些经验拿出来和大家分享;
慢慢的,当发现自己的文章也曾帮助过别人时,感觉很高兴;于是,工作不是很忙时,就会写一些东西和大家分享;
我是blog的受益者,我也是blog的贡献者!正是blog,使我们可以互补技术上的缺点,分享工作中的经验,让我们更快的进步!
于是有感于blog: 是分享,是共同进步!

posted @ 2008-09-07 23:05 Fingki.li 阅读(1416) | 评论 (2)编辑 收藏

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

posted @ 2008-09-04 15:18 Fingki.li 阅读(12177) | 评论 (0)编辑 收藏

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,导致报错。





posted @ 2008-09-02 10:42 Fingki.li 阅读(787) | 评论 (0)编辑 收藏

以往有听说过“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

posted @ 2008-08-28 23:46 Fingki.li 阅读(860) | 评论 (0)编辑 收藏

到目前为止,中国已夺26金啦,中国加油!

posted @ 2008-08-15 23:11 Fingki.li 阅读(233) | 评论 (1)编辑 收藏

在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后,可以正常访问了。






posted @ 2008-07-31 17:43 Fingki.li 阅读(1371) | 评论 (1)编辑 收藏

要用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





posted @ 2008-07-28 15:16 Fingki.li 阅读(3187) | 评论 (4)编辑 收藏

Good Address:

Command Line Tools for win32  
http://www.vkill.net/tools.html

脚本中心脚本库网址:
http://www.microsoft.com/china/technet/community/scriptcenter/scripts/default.mspx

有关用户和组的脚本(找得我好辛苦呀)
http://www.microsoft.com/china/technet/community/scriptcenter/user/default.mspx

最近发现一个不错的jdk6 source网站,收藏一下:
http://www.java2s.com/Open-Source/Java-Document/6.0-JDK-Modules-sun/security/sun/security/krb5/internal/ktab/KeyTab.java.htm

http://developer.classpath.org/doc/

http://fuseyism.com/classpath/doc/

http://kickjava.com/src/

http://www.docjar.com/

VbScript语言参考
http://book.chinaz.com/VBScript/vbsdocs/vbstoc.htm

SUN网站
http://www.java.sun.com
http://java.sun.com/javase/technologies/security/


posted @ 2008-07-21 11:50 Fingki.li 阅读(211) | 评论 (0)编辑 收藏

在我们用程序进行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时,一般是证书安全问题。



posted @ 2008-07-18 09:42 Fingki.li 阅读(1546) | 评论 (2)编辑 收藏

最近发现一个不错的jdk6 source网站,收藏一下:
http://www.java2s.com/Open-Source/Java-Document/6.0-JDK-Modules-sun/security/sun/security/krb5/internal/ktab/KeyTab.java.htm

posted @ 2008-07-14 21:32 Fingki.li 阅读(294) | 评论 (0)编辑 收藏

由于项目的要求,亲密接触了windows操作.
windows就是牛,由于其用户数的庞大,好多应用必须围着它转,顺应它的规则.
相应的对其操作的一些脚本,也成了很有用的东西.
记录以备后查:
脚本中心脚本库网址:
http://www.microsoft.com/china/technet/community/scriptcenter/scripts/default.mspx
有关用户和组的脚本(找得我好辛苦呀)
http://www.microsoft.com/china/technet/community/scriptcenter/user/default.mspx

posted @ 2008-07-09 23:34 Fingki.li 阅读(244) | 评论 (0)编辑 收藏

最近和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(StoreLocationStoreName , 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

posted @ 2008-07-09 23:20 Fingki.li 阅读(3495) | 评论 (7)编辑 收藏

最近项目中要写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 数组

posted @ 2008-07-08 21:38 Fingki.li 阅读(1295) | 评论 (0)编辑 收藏

工作中的需要,将一个软件应用的数据库由hsql转为postgresql.
从Hsql中转数据到postgresql时,我采用的是从 dbname.script中获取数据的脚本,写成新的dbname.sql,然后在postgresql中执行的方法。
经过一番努力,终于如愿以常成功导入了数据。
大概浏览一下数据,没有什么问题,就放心的让同事去测试了。
不到一会儿的工夫,同事就找过来,说软件应用中的原用户无法登录,报错为用户的privatekey无法解开(此应用采用数字证书认证,并且加密了privatekey存于数据库)。
我很是奇怪。
让同事新创建用户,正常 ,也可以正常登录。
于是断定为数据有问题。
打开数据库查看用户信息表,发现privatekeyinfo字段中的数据中有好多 u000a,感觉不对,再查看一下新创建的用户,这个字段中没有。
找来dbname.sql查看,果真里面有好多\u000a,实际上这一位置应为回车.替换所有的\u000a为回车,重新导入数据。
一切OK了。
个人感觉原因是:hsql的sql脚本不支持回车符,所以用\u000a代替;而在postgresql中,数据库不认\u000a,导致数据被修改。
从而privatekey无法正常解开。
希望朋友们不要再走进这个误区。

posted @ 2008-07-04 15:09 Fingki.li 阅读(318) | 评论 (0)编辑 收藏

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

posted @ 2008-07-04 09:12 Fingki.li 阅读(1033) | 评论 (0)编辑 收藏

linux下查看系统版本命令:

head -n 1 /etc/issue

posted @ 2008-07-03 15:59 Fingki.li 阅读(801) | 评论 (0)编辑 收藏