关于作者

用户名:tony21hbb
笔名:流星*流浪
地区: 北京
行业:其他

日历  

快速登录

+ 用户名:
+ 密 码:

在线留言



访问统计:
文章个数:184
评论个数:19
留言条数:9




Powered by BlogDriver 2.1

不屈不挠的仙人掌

 

拥有多少.失去多少.多少是多.多少是少.多多少少终究虚无缥缈.略易逝,夺易失.风尘红缘过往净烛殃.来也罢、去也罢.无非是一粒尘土的牵挂!

文章

sql 分组统计

我想做一个分组统计,按人员分组 字段名为pname,
然后统计每个提出过多少问题,已经解决多少个问题,未解决多少个问题,
表中4个字段 ID,pname,question,decide
第一个字段是ID,第二个字段是人名,第三个字段是这个人提的问题,第4个字段是问题是否解决 是个标志字段,"y"就是解决了 "n"就是没解决 ,
现在我想统计每个人都提了多少问题,其中解决多少,没解决多少?  

-------------------------------
使用case

select pname,count(*) as 提问数量,sum(case decide when 'y' then 1 else 0 end) as 已解决数量,sum(case decide when 'n' then 1 else 0 end) as 没解决数量
from 表
group by pname

- 作者: 流星*流浪 2012年01月5日, 星期四 00:33  回复(0) |  引用(0) 加入博采

值得一看


    198 马化腾等一伙凑了50万创办了腾讯 没买房;98 史玉柱 借了50万搞脑白金 没买房;99 丁磊用50万创办163.com 没买房;99 陈天桥炒股赚了50 创办盛大 没买房;99 马云等18人凑了50 注册阿里巴巴 没买房。如果当年他们用这50万买了房,现在估计还在还着银行的贷款吧。   

    2年轻的我们必须懂得:1、你不勇敢,没人替你坚强。2、没有伞的孩子必须努力奔跑!3、自己选择的路、跪着也要把它走完。4、不要生气要争气,不要看破要突破,不要嫉妒要欣赏,不要拖延要积极,不要心动要行动。5、宁愿跑起来被拌倒无数次,也不愿规规矩矩走一辈子。就算跌倒也要豪迈的笑

      3、人生三大遗憾:不会选择,不坚持选择,不断地选择;人生三不斗:不与君子斗名,不与小人斗利,不与天地斗巧;人生三修练:看得透想得开,拿得起放得下,立得正行得稳;人生三大陷阱:大意,轻信,贪婪;人生三大悲哀:遇良师不学,遇良友不交,遇良机不握。人生三大不争:不与领导争锋,不与同事争宠,不与下级争功

    4一个人,如果你不逼自己一把,你根本不知道自己有多优秀。一个人,想要优秀,你必须要接受挑战;一个人,你想要尽快优秀,就要去寻找挑战。一个人,敢听真话,需要勇气;一个人敢说真话,需要魄力。一个人的知识,通过学习可以得到;一个人的成长,必须通过磨练。

    5、【最温暖的八种食物】①早上醒后来的一个煎蛋;②上班出门前塞在包里的一个苹果;③加班深夜回家后的一碗热汤;④睡觉前的一杯牛奶;⑤伏案工作时的一杯热茶;⑥生病卧床时的一碗白粥;⑦喝闷酒的时候一碟小菜;⑧酒醒后的一碗清汤面。《你吃到过几样?》

    6网易CEO丁磊说:千万不要以为我是抱着一个伟大的理想去创办一个伟大的公司,我从来没有远大的理想,也没有想要成为一个很有钱的人。创办网易时我只是想做一个小老板,就想有个房子有辆汽车,不用准时上班,可以睡懒觉。 我的梦想也是那么简单。丁磊的话很实在。但是,现在创业已经不是那么简单了。

    7、人脉中需有的十种职业人:1 票贩子、 2旅行社、3律师、4 人才市场/猎头公司、 4 银行、5 当地公务人员/警察 6 名人、7 保险/金融/理财专家、8 维修人员、9 媒体联络人、10 医生/护士/养生专家。《你认识这十种人吗?用心经营您的人脉关系吧!》

    8、【做人的底线】(1 不做第三者,即使再喜欢(2 骗我可以,如果被我知道超过两次,请你有多远滚多远(3 如果你拿我不当回事,我会以同样方式对你(4 我可以装傻,但别以为我真傻(5 我可以容忍,但别超过我的底线(6 我不是没脾气,只是不轻易发脾气(7 任何真话,我都能接受。

       9、15岁觉得游泳难,放弃游泳,到18岁遇到一个你喜欢的人约你去游泳,你只好说我不会耶18岁觉得英文难,放弃英文,28岁出现一个很棒但要会英文的工作,你只好说我不会耶。人生前期越嫌麻烦,越懒得学,后来就越可能错过让你动心的人和事,错过新风景。蔡康永

      1025岁的英国士兵Barry Delaney穿着鲜亮的绿色吊带短裙和粉红腿套,在同袍好友Kevin Elliott的葬礼上哭的一塌糊涂,他俩是同在阿富汗执行任务的好友.他们之前有一个约定:无论谁先不幸西归,另一个都要穿女装亮相对方的葬礼,为那里灰暗的悲伤带去一丝亮色,很感人,一诺千金。《伟大的友谊,你有这样的朋友么?》

    11、慢慢成熟的标志:1早上无论多困,也会马上起床上班;2喜欢吃家常便饭多于外面的餐馆;3喜欢隐身,网络签名长时间不更改;4喜欢看新闻多于看八卦;5打电话给朋友的次数少了;6可以让你开心的人或事,越来越少了;7没结果的事情,渐渐就少做了;8低落的时候选择一个人呆着。

    12美国旧金山有一老头查克费尼,穿旧衣服,戴烂手表,住出租屋,挤公交车。他为美国教育捐出了近20亿美金,还希望死前把仅有的40亿美金全部捐献给社会。在北京有个大富豪陈五喜,开豪车,住华宅,吃大餐,手上戴大钻戒,投资房地产,同时还在民政部门领取低保,8年间共得到10万元的社会救助。《中美差异》

      13、1931年的130是世界现代史上灾难的一天,阿道夫·希特勒被任命为德国总理。他的名言:消灭一个民族,首先瓦解它的文化;要瓦解它的文化,首先消灭承载它的语言;要消灭这种语言,首先先从他们的学校里下手。,当今的中国大学里无论什么专业,英语是必修课,汉语却不是。

    14尼古拉斯.科波拉,他的亲叔叔叫弗朗西斯.科波拉,名满天下的《教父》的导演。这个小伙子后来去好莱坞混,为了以自己的实力打天下,故意改名为尼古拉斯.凯奇。不想沾任何叔叔的光。中美文化的差异就在于此。《我爸是李刚》

    15、让你成熟至少5岁的8句话】1、如果你不喜欢现在的工作,要么辞职不干,要么闭嘴不言。2、学会忍受孤独。3、不要像玻璃那样脆弱,做个内心强大的人。4、管住自己的嘴巴。5、会创造机会。6、若电话老是不响,你该打出去。7、不要草率结婚。8、写出你一生要做的事情,把单子放在皮夹里,经常拿出来看。

    16今年,年仅26岁的Facebook的创始人马克·扎克伯格,以40 亿美元身价登上2010 福布斯全球最年轻富豪榜榜首。目前已把自己过半财产捐赠给慈善事业。扎克伯格拥有亿万身家,但他至今仍和华裔女友普莉希拉·陈生活在一套租来的住房里,每天走路或骑自行车上班。

    17、澳大利亚老板帕尔默,他说:人每次只能睡一张床,吃一顿饭,驾一辆车,跟一个女人一起,所以我决定分一些给大家。为了感谢员工帮助他将企业扭亏为盈,他送给员工55辆奔驰,让750名员工出国度假,宴请2000名员工及家属。员工们兴奋的说,这样的老板,令我倾120%力量去工作。《神奇的领导力,无处不在》

      181992年一艘从中国出发的货船在太平洋上遭遇强烈风暴,船上一个装满2.9万只塑料玩具鸭的集装箱坠入大海。令人难以置信的是,其中1万多只玩具鸭组成的鸭子舰队在海洋上漂流了14年之后,竟抵达英国海岸。后来,这些鸭子售价激涨百倍。一个人的价值并不在其出身,而在于他谱写什么样的人生履历。。

      19、80后/90后的通病:1、近视;2、月光族;3、喜欢Money4、从不锻炼身体;5 一日三餐没有规律;6、路盲,没有方向感;7、搞不清楚自己的血型;8、有一颗狠宅狠宅的心;9、做事情都是三分钟热度;10、经常午夜12点以后才睡觉。《三条没有你就是神了》

    20母亲一生的六个谎言:1.(童年时)快吃吧,我不饿;2.(少年时,深夜做针线活)快睡吧,我不困;3.(高考路上)快喝吧,我不渴;4.(参加工作,母亲生病时)你赶快去工作吧,我很好;5.(给母亲寄钱)你用,我有钱;6.(买房接她住)城里,我不习惯。愿天下的母亲健康长寿!《到了毕业的这个时候,更能体会妈妈的良苦用心,好好去爱她!》

    21、【永远都不要做的事】1,跟知己上床 2、和情人结婚 3、把同事当成朋友4、到朋友公司打工 5、在上司面前知无不言 6、轻信上司的许诺 7、喜怒哀乐都挂在脸上 8、在人堆里大声讲手机 9、习惯于给自己找借口 10、超车过去,看开着车有着窈窕背影的MM的脸 11、对MM"字信以为真 12、指望前女友回心转意。

    22、【成功者的习惯】1.微笑。2.气质纯朴。3.不向朋友借钱。4.背后说别人好话。5.听到某人说别人坏话时只微笑。6.过去的事不让人全知道。7. 尊敬不喜欢你的人。9.对事无情,对人有情。10.多做自我批评。11.为别人喝彩。12.感恩。13.学会聆听。14.说话时常用我们开头。15.少说话。16.喜欢自己。

    22、可敬可畏:1.日本电视台用中文进行广播,通知人们地震情况、躲避方式;2.每个家庭都有急救小包,包括药物、手摇式发电收音机;39级大震后东京建筑几乎安然无恙,尤其是人们避难时都井然有序的站在道路两侧尽量不阻碍交通,撤离后无一垃圾。日本是个危机意识、集体主义、纪律性极强的国家!

    23、【建立人脉的15个提示】1、学会换位思考;2、学会适应环境;3、学会大方;4、学会低调;5、嘴要甜;6、有礼貌;7、言多必失;8、学会感恩;9、遵守时间;10、信守诺言;11、学会忍耐;12、有一颗平常心;13、学会赞扬别人;14、待上以敬,待下以宽;15、经常检讨自己。

       24、55年前,就读于浙江大学的法国女子丹尼和中国学生袁迪宝相恋,但袁已婚了。1956年,丹尼伤痛中离开了中国。最初还通信,但慢慢就断了来往。去年初,袁试探着给丹尼写信,竟然回复了。9月,两人重逢第三天在厦门结婚,83岁的丹妮第一次穿上了婚纱。爱,它确实存在。《我相信爱情,你呢?》

    25让你少奋斗10年的工作经验:1不要停留在心灵的舒适区域;2不要把好像、大概、晚些时候、或者、说不定之类的话放在嘴边;3不要拖延工作;4不要认为理论上可以实施就大功告成了;5不要让别人等你;6不要认为细节不重要;7不要表现得消极;8不要把改善工作能力仅寄托在公司培训上;9不要推卸责任。

    26、人平均一辈子只有7次决定人生走向的机会,两次机会间相隔约7年,大概25岁后开始出现机会,75岁以后就不会有什么机会了。这50年里的7次机会,第一次不易抓到,因为太年轻,最后一次也不用抓,因为太老,这样只剩5次了,这5次机会里又有两次不小心错过,所以实际上只有3次机会了。——哈佛的一项调查报告

    27职场情商训练7:1、把看不顺的人看顺;2、把看不起的人看起;3、把不想做的事做好;4、把想不通的事想通;5、把快骂出的话收回;6、把咽不下气的咽下;7、把想放纵的心收住;——你不需每时每刻这样做,但这样多做几回,你就会:1、情商高了2、职位升了3、工资涨了4、人爽了。

    28、泰勒语录:(1)我拥有一个女人的身体和一个孩子的情感。(2)我只和与我结婚的男人上过床。有多少女人敢这么说?(3)如果有人笨到花100万美元为我拍张照片,我当然不会笨到拒绝他。(4 成功是一种了不起的除臭剂。它能带走所有你过去的味道。(5)我不会假装是个平凡的家庭主妇。

    29她原系徐州女排队员,22岁嫁给50岁的cherry获绿卡后离婚、经新男友引荐入读耶鲁大学。96年旅行结识同座的starTV副总,经推荐在香港实习。97年晚宴她将一杯红酒洒在传媒大亨默多克身上,3年后他不顾家人反对而离婚并迎娶她。4年后她以高科技为他生下两个继承数十亿美金的女儿。她就是邓文迪。《运气总是留给有预谋的人。。》

       30、我年轻时曾与我们州最漂亮的女孩约会,但最后没有成功。我听说她后来离过三次婚,如果我们当时真在一起,我都无法想象未来会怎么样。所以,其实你人生中最重要的决定是跟什么人结婚!在选择伴侣上,如果你错了,将让你损失很多。而且,损失不仅仅是金钱上的。(BY巴菲特:结婚才是人生最大投资)

    31盖茨39岁成世界首富,陈天桥31岁成中国首富,孙中山28岁创办兴中会,王然23岁当局长,孙权19岁据江东,丁俊晖15岁拿世界冠军,邓波儿7岁拿奥斯卡,贝多芬4岁开始作曲,葫芦娃刚出生就打妖怪。你说我们急不急。《我确实着急了!》

    32、理查森,男,纽约。从1984年起连续五次投资失败。2007彻底破产,妻离子散,朋友消遁,唯有一条名叫JOOY的狗与其不离不弃,忠伴左右,陪理查森一同在纽约的风雨街头乞讨。从“JOOY”安详恬静的睡姿中看得出它对主人的无限信任和依靠。有的人,在沧海变成桑田时,表现得还不如一条狗。《认识的人多了,我就喜欢了狗》

       33、≪教父经典台词:1、不要让别人知道你的想法。 2、当你说不时,你要使不听上去象是一样好听。 3、让朋友低估你的优点,让敌人高估你的缺点。4、痛苦不象死亡那样无可挽回!5、如果你没有时间和家人在一起,你就永远无法成为真正的男人。 6、永远不要恨你的敌人 ,因为这会影响你的判断力

    34、觉得自己做得到和做不到,其实只在一念之间。自己要先看得起自己,别人才会看得起你。一切伟大的行动和思想,都有一个微不足道的开始。有理想在的地方,地狱就是天堂;有希望在的地方,痛苦也成欢乐。乐观者在困难中看到机会;悲观者在机会中看到苦难。理想的路总是为有信心的人预备着。--﹣李嘉诚。

    35女名叫安-德纳姆,生在美国堪萨斯。18岁的安在异族通婚非法的年代嫁给了一个非洲黑人留学生。后来,安和丈夫离婚成了单身母亲,她靠食品优惠券生活,是美国医保系统受害者,在重病时恳求保险公司赔付。然而她的孩子,图片里装扮成海盗的小孩,日后成了美利坚合众国第44任总统,巴拉克-奥巴马。《不要因为出身而看不起任何人!》

    36、阿米尔汗,8岁时出演一部轰动印度的电影,是公认的童星,长大后却一心打网球并获得过网球冠军。21岁爱上邻居家女孩,由于宗教原因两人决定私奔,现在过着幸福美满的生活。他是演员/制片人/导演。81届奥斯卡最佳影片《贫民窟的百万富翁》就是他担当的制片,2009年一部《三个白痴》震惊全球,他45岁。《你相信坚持的力量么?》

    37陈佩斯,因为央视出版他的小品而不给钱,较真打官司,遂被彻底封杀。此后陈消失,陈夫妇上山种树,脸朝黄土背朝天,两年获利30万。陈佩斯哭了,还想再演戏,可依旧被封杀,就砸30万改演话剧,第一部舞台喜剧《托儿》,在全国各地连续演出达120场,票房近4000万元,创造了当今话剧界无法超越的神话。《我就想说一句话:是金子在哪都发光。。。》

    38、她,37岁,癌症晚期。他,42岁,为筹钱给她治病,盗窃一辆电动自行车而入狱,刑期4年。20101112,他两人在监狱里举行了简单的婚礼,但这场童话般的婚礼,却让在场的数百位嘉宾感动得潸然泪下。偷辆电动车刑期4年,李刚儿子撞死人才3年。无语!一条人命还不如架电动单车。《生活在这个让人苦恼的社会。。。》

    39天下只有两种人。比如一串葡萄到手,一种人挑最好的先吃,另一种人把最好的留到最后吃。照例第一种人应该乐观,因为他每吃一颗都是吃剩的葡萄里最好的;第二种人应该悲观,因为他每吃一颗都是吃剩的葡萄里最坏的。不过事实却适得其反,缘故是第二种人还有希望,第一种人只有回忆。——钱钟书。《你是哪种人?》

    40他出身于书香门第,父亲是大学教授。他为爱妻,20年来从不上CCAV;他是个好爸爸;他顾家,厌恶应酬,滴酒不沾;他才华横溢,琴棋书画样样精通,学生时是体育全能,探戈高手;他饱读诗书,季羡林赞他可胜任北大的研究生导师,曾与钱钟书是忘年之交,他说他只是个戏子。他就是陈道明。一个很给力的男人。

    41旧上海黑社会老大杜月笙的经典语录:1、做人有三碗面最难吃:人面、场面、情面。2、头等人,有本事没脾气;二等人,有本事有脾气;末等人,没本事大脾气。3、人可以不识字,但不能不识人。4、钱财用的完,交情吃不光。所以别人存钱,我存交情。存钱再多不过金山银海,交情用起来好比天地难量。

    42、成功根本没有秘诀,如果有的话,就只 有两个:第一个是坚持到底,永不放弃;第二个就是当你想放弃的时候,请回过头来再照着第一个秘诀去做。——丘吉尔

    43他,21岁,生意失败。22岁,州议员落选。24岁,生意再败。26岁,爱侣去世。27岁,一度精神崩溃。36岁,众议员落选。45岁,参议员落选。47岁,提名副总统落选。49岁时,参议员落选。52岁,当选美国第十六任总统。他叫林肯,坚信上帝的延迟,并不是上帝的拒绝,最终成就不凡。

    44、善良的苏格兰农夫从粪池救出一个小男孩,男孩的绅士父亲酬谢,农夫拒。绅士说:让我们签个协议,我带走你的孩子,给他最好的教育,农夫允。农夫的孩子后来发明了青霉素,获得诺贝尔奖。数年后,绅士的儿子得了肺炎,青霉素治好了他。这两个孩子分别是弗莱明和丘吉尔。 《冥冥之中,自有天意》

- 作者: 流星*流浪 2011年08月22日, 星期一 12:01  回复(0) |  引用(0) 加入博采

中美关系的形象说明故事
这里有个总结中美关系的,有点儿意思:
    钱就是欠条。不管是黄金白银,还是纸钞,还是电子币,本质都是欠条。黄金白银、纸币、电子币的地位都是平等的,“金本位货币”理论是错误的。
    假设世界上只有两家人,老美两口子和老华两口子,开始他们两家各干各的,自给自足。一天,老美捉了4条鱼,老华逮了8只鸟,老美想尝尝鸟味,老华想品品鱼鲜,他们就交换了,老美用2条鱼换了老华的4只鸟。以后他们常常这样交换。
    有一天,老美懒了,没去捉鱼,在家睡了一天。晚上,老华逮鸟回家,老美没东西吃,就找老华借鸟吃。老美找一张树皮,在上面写上:2条鱼。到老华家后,对老华说:“我来换你4只鸟。不过,我今天生病了,没能去捉鱼,我给你打2条鱼的欠条。”老华说:“这好说。”把欠条收下,把4只鸟给了老美。老美回去吃得美滋滋的。
    老美尝到了这个甜头,第二天又在家睡一天,晚上又拿2条鱼的欠条去换了4只鸟。交换完毕,老美对老华说:“以后欠条上就不写2条鱼了,这欠条是我老美打的,以后就写2美圆吧。”老华欣然同意。以后欠条就用美圆表示,如此日复一日。
    按照商品交换的原则来说,商品交换应该是物物交换,商品换商品,而不是钱和物的交换。老美拿钱换了老华的鸟,老华得到钱,这不是商品交换的全过程,只是半个过程。老华手里有老美的钱,就说明老美还欠老华的鱼。所以,钱的本质就是欠条。等老华拿钱买了老美的鱼后,商品交换的整个过程才结束。这个过程就是老美用鱼换了老华的鸟。如果老华始终不用钱去换老美的鸟,那么老美就占了大便宜了,白吃白喝老华的。可是,这里,老美就设法始终不让老华拿钱到他那里兑换实物。
    日子长了,老华手里积攒的钱有一大堆。老美害怕老华来兑换实物,就对老华说:“现在我们之间的交易,你是顺差,顺差对你是非常有利的,你要保持下去。”老华听了很高兴,就舍不得兑换实物了。老华就没想起来问一问:“你是逆差,既然逆差不利,你为什么要始终保持逆差呢?”
    又过一天,老美觉得4只鸟不够吃的,就写了3美圆,到老华家买了6只鸟。老美一天有6只鸟吃,老华反而只有2只鸟吃,饿得饥肠辘辘。但是一想到手里有那么多的钱,到老美家可以买很多很多的东西,够自己养老的了,也就觉得值了。
    以前,秦国利用其权威,经常为各国培养奸贼。外国的王公贵族到秦国去,秦国就教育他们:“以后只要秦国和你们的国家打仗,你们就割地,这对你们国家是最有利的。”这些王公贵族,回到自己的国家后,因为是从秦国留学回去的,满腹经纶,都被委任要职。后来,只要秦国的大兵一压,或者一封讨伐信一到,这些国家就立即割地。如今,美国的这种“顺差有利”的理论被各国的留学生带到世界,也就成了主流经济学理论,美国靠印钱到各国买东西,各国都象守宝贝一样守着美圆,舍不得花,美国暗里得意死了。
    又过了很长一段时间,老华发现老美给他的一些钱被虫蛀了,想到老美家把这些欠条兑换成实物。老美对他说:“这些钱都是财富,你怎么能轻易花掉呢?你太奢侈了。你不要担心我兑换不起你,我富裕的很,你看我吃的喝的,哪样不比你好?”边说边指着屋里的一口袋一口袋的鸟肉干说:“你看我有这么多的财富,你还担心什么?我完全能兑换得起你,你不要担心,我拿我的人格发誓,我绝对不违约。可是你有什么,你就是个穷光蛋,天天饿得直打晃,我看着都可怜。俗话说,越穷越赖,我倒担心你的信誉呢。”老美说完,忽然感到说得不好,又立即改口说道:“当然啦,你只是表面上穷,实际上你非常富裕,你有那么多的外汇储备。你看我有什么,欠一债。我倒感觉你对我的天下第一富的地位有严重威胁呢。”老华被他说得,如同一口喝了二两老白干,顿时觉得晕晕忽忽的。老美又说道:“这充分说明你这条路走对了。今后你还要继续走下去,我们之间的贸易是互惠互利的。我们要共同富裕。”老华感激万分,忙向老美表态:“您放心,我是个负责任的人,绝对不失信!”老美又指着老华手里的钱说道:“既然这些钱被虫蛀了,我就给你重新写个债券吧。算是我借你的债,付给你优厚的利息,一年后还钱。”老华一听,这个合算,就换了一张债券回去。他们的交易又正常继续下去。
    终于有一天,老华有点醒悟了。他想:“老美这个家伙天天什么活都不干,吃的喝的,全都是我的,比我过得还滋润,我得到的只不过是些树皮。而他总是想尽一切办法,编出各种理论不让我兑换实物,如果不能兑换,就只能当柴火烧。算了,以后就不和他交易了。”
    晚上,老美又拿3美圆去买鸟。老华不给他。老美就说:“如果你不卖给我,我就得饿死,那么你手里的美圆和债券就全废了。你要知道,现在救我就是救你自己。”老华听了,不得已,还得和他交易。
    究竟和老美还继续交易不交易?老华愁死了,但是在他妻子面前还得装作很英明的样子。
    转眼一年过去了,老华的妻子翻出老美的那张债券,催老华去讨债。还塞给老华一大抱美圆,让他顺便到老美家多买点东西。老华怕减少外汇储备,不想买东西,两口子为此事争吵起来。老华的妻子嚷道:“不买东西,留这些美圆有什么屁用?今后不准你再要他的美圆,也不准你再要他的债券!”
    声音传到隔壁,老美吓死了。对他妻子说:“我倒不怕他们来讨债,我造钱还他就是了,要多少有多少。说实话,我根本就不需要向他们借债,不管买什么,我直接造钱付帐就行。其实,不管是我发出去的债券,还是美圆,本质都是债券,都表明我欠人家的实物。而我之所以要向他们借债,就是演戏,让他们知道我对造钱很慎重,不轻易造钱,我也不造钱买东西,以保持他们对美圆的信任。我最怕的就是他们怀疑我乱造钱,造钱买东西,不信任美圆,不接受美圆。其次我怕的是他们拿美圆来换实物。这样要把我们掏空还不说,我们还不能白占他们的便宜了。我们得想个办法,让他们继续相信和接受美圆,还不能让他们来兑换实物。”
    于是两口子就嘀咕了一阵子,然后大声吵起架来。老美的妻子大声骂老美:“你这个饭桶,就知道吃吃喝喝,我让你节省开支你也不节省,欠的都是债,拿什么还哪,我的老天爷呀,这个日子我不过了,我得上吊去!”老美也大声骂他的妻子:“你这个扫帚星,就知道怨我,你天天涂脂抹粉,穿红戴绿,我让你节省开支你听了吗?你就知道让我天天去借债,我上哪借去?你看人老华家的,那才叫会管家,人家多富裕,钱都多得发霉了。摊上你这个女人,我算倒八辈子的霉了。我也不活了,我也得上吊去!”
    隔壁老华两口子听得一清二楚,都想:“你们千万不能死,你们死了,我们问谁要债去!你们要是缺钱花,就赶紧来借吧,借多少都有,绝对不限制,救你们就是救我们自己。”老华想完,就对妻子说:“他们太可怜了,不能让他们就这样倒下。他们不好意思来借债,我们就主动送上去吧。 家里还有一只鸟,也送给他们吧。”老华的妻子连连点头。
    于是两口子抱起一大抱美圆和家里仅剩的一只鸟,到老美家去,对他们说:“送给你们应应急吧。”说完两口子转身就走了。
    老美两口子在后面,望着他们的背影,乐翻了天。老美说:“这样的傻瓜穷死活该!

- 作者: 流星*流浪 2011年08月22日, 星期一 11:00  回复(0) |  引用(0) 加入博采

我们生活在一个规则国家
今天看到凤凰网上一则关于“地方干部上班打牌称帮妇女渡更年期”评论,觉得非常有高度:

  ==》中国并不是一个法制国家,但它却是一个规则国家,这个国家只有两种规则:一是丛林规则,二是潜规则。中国人要想成功,男人必须通过丛林规则的考验,女人必须通过潜规则的洗礼。
  
  ==》活在这样的社会,太杯具了。

- 作者: 流星*流浪 2011年08月22日, 星期一 10:18  回复(0) |  引用(0) 加入博采

DB2 DPF多分区服务器简易部署说明
DB2 DPF多分区服务器简易部署说明

1、在DPF的3台服务器(1个管理节点+2个数据节点)上安装DB2企业版软件,使用db2_install命令, 缺省安装路径为:/opt/IBM/db2/V9.1
2、在管理节点上创建NFS文件系统,如:/db2home, 在另外2台数据节点上NFS MOUNT,MOUNT点为:/db2home
3、3台服务器上分别创建用户组db2igrp1和用户db2inst1,需要保证3台服务器上的组ID和用户ID完全相同,db2inst1的主目录均为:/db2home/db2inst1
4、创建DB2实例:cd /opt/IBM/db2/V9.1/instance; ./db2icrt -u db2inst1 db2inst1
5、su - db2inst1后创建文件:/db2home/db2inst1/.rhosts,其内容为1个加号字符:+
6、编辑/db2home/db2inst1/sqllib/db2nodes.cfg文件,包含内容如下:
   0   host_name_admin 0  host_name_admin_fcm
   1   host_name_data1 0  host_name_data1_fcm
   2   host_name_data1 1  host_name_data1_fcm
   3   host_name_data1 2  host_name_data1_fcm
   4   host_name_data1 3  host_name_data1_fcm
   5   host_name_data1 4  host_name_data1_fcm
   6   host_name_data1 5  host_name_data1_fcm
   7   host_name_data1 6  host_name_data1_fcm
   8   host_name_data1 7  host_name_data2_fcm
   9   host_name_data1 0  host_name_data2_fcm
   10  host_name_data1 1  host_name_data2_fcm
   11  host_name_data1 2  host_name_data2_fcm
   12  host_name_data1 3  host_name_data2_fcm
   13  host_name_data1 4  host_name_data2_fcm
   14  host_name_data1 5  host_name_data2_fcm
   15  host_name_data1 6  host_name_data2_fcm
   16  host_name_data1 7  host_name_data2_fcm
   
   其中:假设host_name_admin为管理节点的主机名,host_name_data1和host_name_data2为2台数据节点的主机名,host_name_admin_fcm, host_name_data1_fcm, host_name_data2_fcm分别是3台服务器的EthernetChannel虚拟网卡对应的主机别名。
 
7、编辑3台服务器的/etc/services文件,追加条目:

   DB2C_db2inst1     50000/tcp
   DB2_db2inst1     60000/tcp
   DB2_db2inst1_1    60001/tcp
   DB2_db2inst1_2    60002/tcp
   DB2_db2inst1_END  60017/tcp

8、检查rsh是否工作正常,在3台服务器分别执行命令:
   su - db2inst1
   rsh host_name_admin ls
   rsh host_name_data1 ls
   rsh host_name_data2 ls

   如果执行不正常,请检查这3个主机名在3台服务器上的/etc/hosts里面是否配置,另外host_name_admin_fcm,host_name_data1_fcm,host_name_data2_fcm也需要配置到/etc/hosts中

8、启动实例:
   db2start
 
9、创建数据库
   1)检查数据库目录文件系统是否创建
      在管理节点上的文件系统为: /db2path/db2inst1/NODE0000
      在数据节点1上的文件系统为: /db2path/db2inst1/NODE0001 ~ /db2path/db2inst1/NODE0008
      在数据节点2上的文件系统为: /db2path/db2inst1/NODE0009 ~ /db2path/db2inst1/NODE0015
    2)创建数据库
      su - db2inst1
      db2 "create db timisdb on /db2path using codeset gbk territory cn"


-----双节点多分区部署实例关键文件参考---------------
【db2nodes.cfg文件】
0 pocdpfmanager 0
1 pocdpfdata1   0
2 pocdpfdata1   1
3 pocdpfdata1   2
4 pocdpfdata1   3
5 pocdpfdata1   4
6 pocdpfdata1   5
7 pocdpfdata1   6
8 pocdpfdata1   7

【services】
#add by tony for DB2dpf
DB2_db2rdb      63000/tcp
DB2_db2rdb_1    63001/tcp
DB2_db2rdb_2    63002/tcp
DB2_db2rdb_END  63008/tcp

【.rhosts】
+




- 作者: 流星*流浪 2011年07月7日, 星期四 10:40  回复(0) |  引用(0) 加入博采

双机GPFS配置流程byTony@2011.7
双机GPFS配置流程byTony@2011.7

一、        系统配置
主机:IBM P570两台,DMX powerpath磁盘阵列柜一台
Node-1
Host Name : gz5701-1

Node-2
Host Name : gz5702-1


#配置好rsh
gz5702-1:/#cat .rhosts
+

gz5702-1:/#echo "export PATH=\$PATH:/usr/lpp/mmfs/bin:."  >> /.profile

批量执行命令脚本
gz5701-1:/tmp/gpfs#cat rsh570-1.sh
for i in gz5701-1 gz5702-1
do
 echo $i  $1 $2 $3 $4 $5
 rsh $i  $1 $2 $3 $4 $5
done 

gz5702-1:/#chmod 700 *.sh
gz5702-1:/#cp /tmp/gpfs/rsh570-1.sh  /usr/bin

二、        安装GPFS
通过"#smitty installp"进行安装
升级到最新版本 : 3.2.0
校验安装:
#lslpp -L gpfs.\*

三、        配置GPFS
1. 准备环境
建立主机描述文件
#vi hosts
gz5701-1:manager-quorum
gz5702-1:manager-quorum
清除原来的配置信息
A.停gpfs
mmshutdown -a 
B.清除配置
mmdelnode -f

1.创建GPFS群集
#mmcrcluster -n hosts -p gz5701-1 -s gz5702-1 -C gpfscluster -A
注:-p : 指定主节点;-s : 指定副节点;-C : GPFS群集名称;-A : 自动启动;
查看GPFS群集信息
#mmlscluster

2.创建共享磁盘

看powerpath盘
gz5701-1:/tmp/gpfs#powermt display dev=hdiskpower0
Pseudo name=hdiskpower0
Symmetrix ID=000290301120
Logical device ID=0455
state=alive; policy=SymmOpt; priority=0; queued-IOs=0
==============================================================================
---------------- Host ---------------   - Stor -   -- I/O Path -  -- Stats ---
###  HW Path                I/O Paths    Interf.   Mode    State  Q-IOs Errors
==============================================================================
   1 fscsi2                    hdisk11   FA 16dB   active  alive      0      0
   0 fscsi0                    hdisk5    FA  1dA   active  alive      0      0
   0 fscsi0                    hdisk7    FA  1dB   active  alive      0      0
   1 fscsi2                    hdisk9    FA 16dA   active  alive      0      0

创建磁盘描述文件
gz5701-1:/tmp/gpfs#cat disks
hdiskpower0:gz5701-1:gz5702-1::1:flashdisk:flashpool
hdiskpower1:gz5701-1:gz5702-1::2:oradatadisk1:oradatapool
hdiskpower2:gz5701-1:gz5702-1::2:oradatadisk2:oradatapool
hdiskpower3:gz5701-1:gz5702-1::2:oradatadisk3:oradatapool
hdiskpower4:gz5701-1:gz5702-1::2:oradatadisk4:oradatapool
hdiskpower5:gz5701-1:gz5702-1::2:oradatadisk5:oradatapool
hdiskpower6:gz5701-1:gz5702-1::2:oradatadisk6:oradatapool
hdiskpower7:gz5701-1:gz5702-1::2:oradatadisk7:oradatapool
hdiskpower8:gz5701-1:gz5702-1::2:oradatadisk8:oradatapool
hdiskpower9:gz5701-1:gz5702-1::2:oradatadisk9:oradatapool
hdiskpower10:gz5701-1:gz5702-1::2:oradatadisk10:oradatapool
hdiskpower11:gz5701-1:gz5702-1::2:oradatadisk11:oradatapool
hdiskpower12:gz5701-1:gz5702-1::2:oradatadisk12:oradatapool
hdiskpower13:gz5701-1:gz5702-1::2:oradatadisk13:oradatapool
hdiskpower14:gz5701-1:gz5702-1::2:oradatadisk14:oradatapool
hdiskpower15:gz5701-1:gz5702-1::2:oradatadisk15:oradatapool
hdiskpower16:gz5701-1:gz5702-1::2:oradatadisk16:oradatapool
hdiskpower17:gz5701-1:gz5702-1::2:oradatadisk17:oradatapool
hdiskpower18:gz5701-1:gz5702-1::2:oradatadisk18:oradatapool
hdiskpower19:gz5701-1:gz5702-1::2:oradatadisk19:oradatapool
hdiskpower20:gz5701-1:gz5702-1::2:oradatadisk20:oradatapool
hdiskpower21:gz5701-1:gz5702-1::2:oradatadisk21:oradatapool
hdiskpower22:gz5701-1:gz5702-1::2:oradatadisk22:oradatapool
hdiskpower23:gz5701-1:gz5702-1::2:oradatadisk23:oradatapool
hdiskpower24:gz5701-1:gz5702-1::2:oradatadisk24:oradatapool
hdiskpower25:gz5701-1:gz5702-1::2:oradatadisk25:oradatapool
hdiskpower26:gz5701-1:gz5702-1::2:oradatadisk26:oradatapool
hdiskpower27:gz5701-1:gz5702-1::2:oradatadisk27:oradatapool
hdiskpower28:gz5701-1:gz5702-1::2:oradatadisk28:oradatapool
hdiskpower29:gz5701-1:gz5702-1::2:oradatadisk29:oradatapool
hdiskpower30:gz5701-1:gz5702-1::2:oradatadisk30:oradatapool
hdiskpower31:gz5701-1:gz5702-1::2:oradatadisk31:oradatapool
hdiskpower32:gz5701-1:gz5702-1::2:oradatadisk32:oradatapool
hdiskpower33:gz5701-1:gz5702-1::2:oradatadisk33:oradatapool
hdiskpower34:gz5701-1:gz5702-1::2:oradatadisk34:oradatapool
hdiskpower35:gz5701-1:gz5702-1::2:oradatadisk35:oradatapool
hdiskpower36:gz5701-1:gz5702-1::2:oradatadisk36:oradatapool
hdiskpower37:gz5701-1:gz5702-1::2:oradatadisk37:oradatapool
hdiskpower38:gz5701-1:gz5702-1::2:oradatadisk38:oradatapool
hdiskpower39:gz5701-1:gz5702-1::2:oradatadisk39:oradatapool
hdiskpower40:gz5701-1:gz5702-1::2:oradatadisk40:oradatapool
hdiskpower41:gz5701-1:gz5702-1::2:oradatadisk41:oradatapool
hdiskpower42:gz5701-1:gz5702-1::2:oradatadisk42:oradatapool
hdiskpower43:gz5701-1:gz5702-1::2:oradatadisk43:oradatapool
hdiskpower44:gz5701-1:gz5702-1::2:oradatadisk44:oradatapool
hdiskpower45:gz5701-1:gz5702-1::2:oradatadisk45:oradatapool
hdiskpower46:gz5701-1:gz5702-1::2:oradatadisk46:oradatapool
hdiskpower47:gz5701-1:gz5702-1::2:oradatadisk47:oradatapool
hdiskpower48:gz5701-1:gz5702-1::2:oradatadisk48:oradatapool
hdiskpower49:gz5701-1:gz5702-1::2:oradatadisk49:oradatapool
hdiskpower50:gz5701-1:gz5702-1::2:oradatadisk50:oradatapool
hdiskpower51:gz5701-1:gz5702-1::2:oradatadisk51:oradatapool
hdiskpower52:gz5701-1:gz5702-1::2:oradatadisk52:oradatapool
hdiskpower53:gz5701-1:gz5702-1::2:oradatadisk53:oradatapool
hdiskpower54:gz5701-1:gz5702-1::2:oradatadisk54:oradatapool
hdiskpower55:gz5701-1:gz5702-1::2:oradatadisk55:oradatapool
hdiskpower56:gz5701-1:gz5702-1::2:oradatadisk56:oradatapool
hdiskpower57:gz5701-1:gz5702-1::2:oradatadisk57:oradatapool
hdiskpower58:gz5701-1:gz5702-1::2:oradatadisk58:oradatapool
hdiskpower59:gz5701-1:gz5702-1::2:oradatadisk59:oradatapool
hdiskpower60:gz5701-1:gz5702-1::2:oradatadisk60:oradatapool
hdiskpower61:gz5701-1:gz5702-1::2:oradatadisk61:oradatapool
hdiskpower62:gz5701-1:gz5702-1::2:oradatadisk62:oradatapool
hdiskpower63:gz5701-1:gz5702-1::2:oradatadisk63:oradatapool
hdiskpower64:gz5701-1:gz5702-1::2:oradatadisk64:oradatapool
hdiskpower65:gz5701-1:gz5702-1::2:oradatadisk65:oradatapool
hdiskpower66:gz5701-1:gz5702-1::2:oradatadisk66:oradatapool
hdiskpower67:gz5701-1:gz5702-1::3:gddisk1:gdpool
hdiskpower68:gz5701-1:gz5702-1::3:gddisk2:gdpool
hdiskpower69:gz5701-1:gz5702-1::3:gddisk3:gdpool
hdiskpower70:gz5701-1:gz5702-1::3:gddisk4:gdpool
hdiskpower71:gz5701-1:gz5702-1::3:gddisk5:gdpool
hdiskpower72:gz5701-1:gz5702-1::3:gddisk6:gdpool
hdiskpower73:gz5701-1:gz5702-1::4:oradumpdisk1:oradumppool
hdiskpower74:gz5701-1:gz5702-1::4:oradumpdisk2:oradumppool
hdiskpower75:gz5701-1:gz5702-1::4:oradumpdisk3:oradumppool

创建共享磁盘(NSD)
#mmcrnsd -v no -F disks
注:-F : 指定磁盘描述文件
   -v {yes |no}    Verify the disk is not already formatted as an NSD.

   ==>完成后 node2上lspv也能看到disk描述按照disks完成

查看共享磁盘信息
#mmlsnsd

--参考------------------------------------
如果要删除nsd硬盘的话
mmdelnsd  -F  disks
------------------------------------------

3.        创建仲裁盘
创建仲裁盘(3块盘,4块+可能报错)
/*************************************************************************************************
** gz5702-1:/tmp/gpfs#mmchconfig tiebreakerDisks="flashdisk;oradatadisk1;gddisk1;oradumpdisk1"  **
** Verifying GPFS is stopped on all nodes ... **
** mmchconfig: More than three disks specified. **
** mmchconfig: 6027-1639 Command failed.  Examine previous error messages to determine cause. **
**************************************************************************************************/
gz5702-1:/tmp/gpfs#mmchconfig tiebreakerDisks="oradatadisk1;gddisk1;oradumpdisk1"
Verifying GPFS is stopped on all nodes ...
mmchconfig: Command successfully completed
mmchconfig: 6027-1371 Propagating the cluster configuration data to all
  affected nodes.  This is an asynchronous process.
  
注:指定多块磁盘为仲裁盘时用""将NSD磁盘名括上

调整Pagepool大小
#mmchconfig pagepool=512M
设置dataStructureDump
#rsh570-1.sh mkdir /tmp/mmfs
#mmchconfig dataStructureDump=/tmp/mmfs
查看GPFS配置信息
#mmlsconfig

4.   启动GPFS(只需要在一边启动即可)
#mmstartup -a

5.        创建GPFS文件系统
[[[格式[#mmcrfs / -F -A yes -B 512K -v no]]]]
#单独编辑各个文件系统需要的disk盘,gpfs不通过vg管理,直接使用盘,虚拟的lv可以随便起名字
gz5701-1:/tmp/gpfs#ls |grep  fs_  
fs_gd
fs_oradata
fs_oradata1
fs_oradump
gz5701-1:/tmp/gpfs#cat fs_oradata1
flashdisk
gz5701-1:/tmp/gpfs#cat fs_oradump
oradumpdisk1
oradumpdisk2
oradumpdisk3

gz5701-1:/tmp/gpfs#mmcrfs /oradata1 lv_oradata1   -F fs_oradata1 -A yes -B 1M -v no

GPFS: 6027-531 The following disks of lv_oradata1 will be formatted on node gz5701-1:
    flashdisk: size 195072000 KB
GPFS: 6027-540 Formatting file system ...
GPFS: 6027-535 Disks up to size 415 GB can be added to storage pool 'system'.
Creating Inode File
Creating Allocation Maps
Clearing Inode Allocation Map
Clearing Block Allocation Map
Formatting Allocation Map for storage pool 'system'
GPFS: 6027-572 Completed creation of file system /dev/lv_oradata1.
mmcrfs: 6027-1371 Propagating the cluster configuration data to all
  affected nodes.  This is an asynchronous process.
  
gz5701-1:/tmp/gpfs#mmcrfs /oradata lv_oradata    -F fs_oradata -A yes -B 1M -v no

GPFS: 6027-531 The following disks of lv_oradata will be formatted on node gz5702-1:
    oradatadisk1: size 97536000 KB
    oradatadisk2: size 97536000 KB
    oradatadisk3: size 97536000 KB
    oradatadisk4: size 97536000 KB
    oradatadisk5: size 97536000 KB
    oradatadisk6: size 97536000 KB
    oradatadisk7: size 97536000 KB
    oradatadisk8: size 97536000 KB
    oradatadisk9: size 97536000 KB
    oradatadisk10: size 97536000 KB
    oradatadisk11: size 97536000 KB
    oradatadisk12: size 97536000 KB
    oradatadisk13: size 97536000 KB
    oradatadisk14: size 97536000 KB
    oradatadisk15: size 97536000 KB
    oradatadisk16: size 97536000 KB
    oradatadisk17: size 97536000 KB
    oradatadisk18: size 97536000 KB
    oradatadisk19: size 97536000 KB
    oradatadisk20: size 97536000 KB
    oradatadisk21: size 97536000 KB
    oradatadisk22: size 97536000 KB
    oradatadisk23: size 97536000 KB
    oradatadisk24: size 97536000 KB
    oradatadisk25: size 97536000 KB
    oradatadisk26: size 97536000 KB
    oradatadisk27: size 97536000 KB
    oradatadisk28: size 97536000 KB
    oradatadisk29: size 97536000 KB
    oradatadisk30: size 97536000 KB
    oradatadisk31: size 97536000 KB
    oradatadisk32: size 97536000 KB
    oradatadisk33: size 97536000 KB
    oradatadisk34: size 97536000 KB
    oradatadisk35: size 97536000 KB
    oradatadisk36: size 97536000 KB
    oradatadisk37: size 97536000 KB
    oradatadisk38: size 97536000 KB
    oradatadisk39: size 97536000 KB
    oradatadisk40: size 97536000 KB
    oradatadisk41: size 97536000 KB
    oradatadisk42: size 97536000 KB
    oradatadisk43: size 97536000 KB
    oradatadisk44: size 97536000 KB
    oradatadisk45: size 97536000 KB
    oradatadisk46: size 97536000 KB
    oradatadisk47: size 97536000 KB
    oradatadisk48: size 97536000 KB
    oradatadisk49: size 97536000 KB
    oradatadisk50: size 97536000 KB
    oradatadisk51: size 97536000 KB
    oradatadisk52: size 97536000 KB
    oradatadisk53: size 97536000 KB
    oradatadisk54: size 97536000 KB
    oradatadisk55: size 97536000 KB
    oradatadisk56: size 97536000 KB
    oradatadisk57: size 97536000 KB
    oradatadisk58: size 97536000 KB
    oradatadisk59: size 97536000 KB
    oradatadisk60: size 97536000 KB
    oradatadisk61: size 97536000 KB
    oradatadisk62: size 97536000 KB
    oradatadisk63: size 97536000 KB
    oradatadisk64: size 97536000 KB
    oradatadisk65: size 97536000 KB
    oradatadisk66: size 97536000 KB
GPFS: 6027-540 Formatting file system ...
GPFS: 6027-535 Disks up to size 9.3 TB can be added to storage pool 'system'.
Creating Inode File
Creating Allocation Maps
Clearing Inode Allocation Map
Clearing Block Allocation Map
Formatting Allocation Map for storage pool 'system'
GPFS: 6027-572 Completed creation of file system /dev/lv_oradata.
mmcrfs: 6027-1371 Propagating the cluster configuration data to all
  affected nodes.  This is an asynchronous process.
  
#mmcrfs /gd lv_gd   -F fs_gd -A yes -B 1M -v no
#mmcrfs /oradump lv_oradump   -F fs_oradump -A yes -B 1M -v no
注:
mountpoint:/oradata1 ;
虚拟设备:lv_oradata1;
-F:指定创建文件系统磁盘描述文件(该文件为建立NSD时的磁盘描述文件,但在NSD建立完成后对其进行了修改,一定要保证该修改不被改动);
-A:设置GPFS进程启动时文件系统是否与GPFS进程一并启动;
-B:设置文件系统block size;
-v no:该参数仅用于当其中的磁盘曾经被其他的GPFS文件系统使用过时;

--参考文档(盘比较少的时候可以直接通过命令行指定盘)-----------------------------------
 #为数据和日志各创建一个 GPFS 文件系统,使用 512KB 的块大小:
 mmcrfs - T /db2data db2data Data1,Data2,Data3,Data4 - B 512K 
 mmcrfs - T /db2log db2log DBLog1,DBLog2 - B 512K 
----------------------------------------------------------------------------------------

至此 GPFS 的安装配置完成,(gz5702-1节点不用配置),可以运行下面命令来察看节点状态
       
gz5701-1:/tmp/gpfs#mmgetstate -aL -s

 Node number  Node name       Quorum  Nodes up  Total nodes  GPFS state  Remarks    
------------------------------------------------------------------------------------
       1      gz5701-1          1*        2          2       active      quorum node
       2      gz5702-1          1*        2          2       active      quorum node

 Summary information 
---------------------
Number of nodes defined in the cluster:            2
Number of local nodes active in the cluster:       2
Number of remote nodes joined in this cluster:     0
Number of quorum nodes defined in the cluster:     2
Number of quorum nodes active in the cluster:      2
Quorum = 1*, Quorum achieved

四、        测试GPFS
1. mount文件系统
在各节点中运行:(mount /gpfs_mount_point)
gz5701-1:/tmp/gpfs#rsh570-1.sh mount /oradata
gz5701-1 mount /oradata
gz5702-1 mount /oradata

2.        读写测试
gz5701-1#ls /tmp >/oradata1/check
gz5701-1#cat /oradata1/check
gz5702-1#cat /oradata1/check
在两台节点中显示的信息一致

- 作者: 流星*流浪 2011年07月7日, 星期四 10:05  回复(0) |  引用(0) 加入博采

思维定势陷阱
思维定势陷阱

      公司老总有一天在办公室问其他同事问题,第一问:老鼠为什么会飞?同事答:因为是蝙蝠。老总说,错,因为老鼠吃了仙丹。第二问,蛇为什么会飞?同事答,因为蛇吃了仙丹。老总说,又错,笨,因为蛇吃了老鼠。第三问,鹰为什么会飞?同事答,因为鹰吃了蛇,老总大笑,说,真笨,鹰本来就会飞!
       
       甲问乙:饼干为什么会飞。 乙:不知道。甲:真笨!因为它是长翅膀的饼干。乙:为什么会长翅膀,甲:因为它是魔法饼干呗。乙:额!!!。甲:老鼠为什么会飞。乙:我知道因为它是长翅膀的老鼠对不对。甲:错,因为它吃了会飞的饼干。乙:你耍我玩啊!!- -! 。甲:在问你个,猫头鹰为什么会飞。乙:因为它本来就会飞,哈哈我这会猜对了吧!。甲:错,因为你打扰它睡觉了。

      看你听不听话,服不服管,一般此类形式的问题,常用来修理一下不老实的下属。因为你怎么回答都是错的,只有领导是对的,领导说那个答案是正确的,就是正确的。如有领导在问你类似的问题,通常是想传递这个信息:识相的,就放老实点。

- 作者: 流星*流浪 2011年05月6日, 星期五 14:41  回复(0) |  引用(0) 加入博采

从小不学好,长大卖电脑(转)

人生最痛苦的 , 莫过于卖电脑 !
其实,做电脑可辛苦了,有时想一想:货一进一出,一天过去了,嚎!
货一进,不出,又一天就过去了,嚎!!
你知道最痛苦的事情是什么吗?那就是没有货,客户定货了!
你知道最最痛苦的是什么吗?货有了,客户不定了!
那你知道比这两种都痛苦的是什么吗?那就是订货了,又退货了!……
有时一想,发货也是一样一样的:电话一打一挂,一件货发出去了,嚎!;电话一打不挂,肯定是售后没解决好!
人生最痛苦的事你知道是什么吗?
是货发了,钱没收到

上联:为HP生,为华硕死,为联想操劳一辈子;
下联:吃英迈亏,上联强当,最后死在神码上;
横批:亏钱压货至高无上
上联:巧舌如簧配电脑 又一台
下联:辛辛苦苦做售后 整三年
横批:越装越累

上联:做IT 风风雨雨 又一年
下联:卖电脑 辛辛苦苦 每一天
横批:从小不学好,长大卖电脑
图片

- 作者: 流星*流浪 2011年05月1日, 星期日 17:08  回复(0) |  引用(0) 加入博采

win7 usb图标点击弹出U盘啥的没有反应的处理方法
打开你的电脑 服务管理 面板,把关于蓝牙的所有服务改成自动,尤其是这个破蓝牙服务 Bluetooth Support Service 一定要改成自动,然后启动没有启动的蓝牙服务。
再点击usb图标就好了,初步猜测是蓝牙的服务响应机制和usb的通知响应机制冲突的缘故吧。

- 作者: 流星*流浪 2011年04月14日, 星期四 15:16  回复(0) |  引用(0) 加入博采

转:孙立平,原题:《中国社会正在加速走向溃败》

本文来源:人民网四川视窗,作者:孙立平,原题:《中国社会正在加速走向溃败》

孙立平,男,1955年5月出生。现为清华大学社会学系教授、博士生导师。1978年入北京大学中文系学习,1983年获学士学位。1983——1999年在北京大学社会学系工作,曾任北京大学社会学系副教授,北京大学社会生活口述资料研究中心主任、北京大学社区发展研究中心主任。2000年转到清华大学工作。研究方向为社会发展、社会结构变迁和口述社会史。

1.我们是不是焦虑错了问题?现在人们都在关心社会矛盾、社会冲突、群体性事件等问题。之所以有这样的关心,是担心发生大的社会动荡。但事实上,对中国社会最大的威胁可能不是社会动荡,而是社会溃败。

2.社会动荡是指严重的社会冲突会威胁政权和制度的基本框架,而社会溃败则是社会肌体的细胞坏死,机能失效。说的形象一点,动荡好比是健康的身体被别人打伤了,而溃败则是自身的组织或细胞出了严重的毛病。费孝通先生的“社会侵蚀”和亨廷顿的“政治衰败”两个概念可以深化我们对这个现象的认识,尽管这两个概念与我们这里讨论的“社会溃败”的含义并不完全一样。其中后者的含义可能会更接近一些。

3.社会动荡的反面是社会稳定,社会溃败的反面是社会健康。尽管这两者经常是有关联的,但需要加以区别。现在的问题是,对前者的误判往往成为治愈后者的障碍。这就好比一个癌症病人,需要做手术。但医生误诊其有严重心脏病,无法做手术。实际上这个人可能并没有心脏病,或即使有也比较轻。但这种对前者的误判无疑会导致对后者的治疗。在现实社会生活中,对克服社会溃败所必须进行的一些变革,往往由于担心其威胁社会稳定而被束之高阁,结果是使社会溃败的趋势日益明显。

4.在最近的文章中我一再强调,尽管目前社会矛盾较多,甚至有激化的迹象,但中国发生大规模社会动荡的可能性并不大。对于这个问题,大约10年前我就曾经写过文章,去年年初在南方周末上也有两个版的访谈,一再强调的就是这个观点。在过去的十几年中,由于对不稳定因素、对危机发生的可能性估计过高,使得我们形成了一种稳定压倒一切的思维定势。在这种思维定势中,稳定似乎成了一种终极性的否定因素,一切都要为稳定让路。结果是许多该做的事情无法去做。其实,一年365天,不是有这样的事情就是有那样的事情;一个国家13亿人口,大灾小难也总是免不了的。如果总是刻意寻找不稳定因素,当然会找得到的。更何况失控的权力还会不断制造出“群体性事件”(如最近贵州铜仁地区德江县的所谓群体性事件就是由政府异想天开的制止群众性娱乐活动引起的)。关键是用什么样的心态看待这些问题。世界上哪个国家像我们这样刻意地去寻找不稳定因素,都是找得出来的。但只有我们有稳定压倒一切,有“维稳办”这样的机构。

5.近些年来,社会溃败的迹象已经明显开始出现。其中最核心的是权力的失控。在过去30年改革的过程中,尽管建立起市场经济的基本框架,但权力仍然是我们社会的中枢。因此社会的溃败首先表现在权力的失控,腐败不过是其外在的表现。我这里所说的权力失控是指,权力成为不但外部无法约束而且内部也无法约束的力量,而在此之前,尽管外部约束是缺乏的,但内部约束是相对有效的;权威基础削弱,前几年就有所谓政令不出中南海一说,地方性权力、部门性权力已经成为既无上面约束,又无下面监督,同时还缺少左右制衡的力量,这意味着国家权力的碎片化;官员不能负责任地进行工作,为保官升官不惜牺牲体制利益(不要说社会利益了)。在此背景之下,腐败已经处于失控和“不可治理状态”。

6.这种社会的溃败蔓延到社会生活的各个领域:潜规则盛行于社会,甚至成为基本的为官为人之道,对此吴思先生有很好的分析;社会底线失守,道德沦丧;强势利益集团已经肆无忌惮,社会生活西西里化趋势出现;利益集团的肆无忌惮,对社会公平正义造成严重侵蚀;职业操守和职业道德的丧失是相当普遍的现象;整个社会的信息系统已经高度失真,统计数据的弄虚作假代表了体制性的对信息的扭曲。“村骗乡,乡骗县,一直骗到国务院”,几乎可以说是比官方统计数据还可靠的现实。

7.社会认同和社会向心力在急剧流失。正月元宵节央视一场大火,损失达几十个亿。然而,网络上一片幸灾乐祸之声。没有悲伤,没有痛心。幸灾乐祸中透露的是某种难以言表的快意。有人说,这表明了人们的冷漠;有人说,我们这个民族没救了;还有人问,那些幸灾乐祸的人就没想想烧掉的几十亿当中也有你的一份啊(央视毕竟是国有资产啊)?这让我想起大约是80年代沈阳的一场大火,当时许多人站在大街上痛哭失声。用国民性来解释说不过去吧?!问题在哪里?在对我们这个社会还认同不认同上。在沈阳大火中的痛哭失声,是他们感觉被烧掉的是“我们的”;而在这场央视大火中,有人这样说,几十个亿烧掉就烧掉吧,不被烧掉也会被吃掉。这里的吃喝当然是指公款吃喝。还有人说,心疼的是救火要用掉多少水啊,现在天旱啊。在这些议论的背后,实际上是一种心理上的疏离感,即那些“东西”是“他们的”,而不是“我们的”。心理的疏离是结构性疏离的反射。

8.社会失去进行长远思维的能力。在权贵资本主义上形成的既得利益集团又过于注重眼前,既无古代帝王对子孙后代的责任,又有无贵族的超脱和超越精神。在我们的社会中,一种倾向,即短期问题夸大症与长期行为麻木症并存。对于所有眼前遇到的问题,无一不草木皆兵;而对于关乎子孙后代、社会长远发展的问题,则一概视而不见。今朝有酒今朝醉,成为一种体制性行为。在资源和环境问题上的竭泽而渔,在体制的弊病上能拖就拖。邯郸十年换了七任市长,全国市长任期平均1.7年。新班子上马前半段是被“扶上马,送一程”,后半段则是寻找培养接班人。眼前的权力与利益分配就是一切,真正做事情的时间没有多少。

9.反腐败为什么不能有效进行?体现了从既得利益出发的一种权衡,即是腐败更可怕还是将反腐败的措施诉诸社会更可怕。这样的逻辑对于某一个具体的腐败分子而言,当然是成立的,但如果将其转化为一种体制性逻辑,问题就严重了。很不幸的是,上述逻辑远非是非体制性的。多年来的反腐败,基本停留在表演性和杀鸡儆猴的层面,而对于实质性的反腐败措施,尽管从上到下心知肚明,但一直没有根本性的推进,特别是将反腐败的措施诉诸社会,更是噤若寒蝉。

10.维护既得利益是一件很累的事情,而我们社会把精力和资源过多地用到了这个地方。为了维护既得利益,不得不压制言论自由。可以想想,为了压制那些言论,我们用了多少的精力和资源?为了维护既得利益,就不得不千方百计想绕过民主这个坎儿。可以想想,为了不民主我们费了多大的劲儿,编造了多少理由和理论。为了维护既得利益,我们就不得不压制民众正当的利益表达,于是酿出了多少群体性事件,为了解决群体性事件就花费了多大的精力?为了维护既得利益,很多在其他国家行之有效的反腐败措施我们都不敢采用,为此我们不得不使用那些笨拙而无效的运动型办法,为此又浪费了多少的资源和精力?须知,要同时实现既得利益最大化和维护社会的正常运行这两个目标,是一件相当困难和费力的事情。因此,我们这个体制是很累的,管理者也是很累的,从体制到管理者的心理负担都很重。更重要的是,为了维护既得利益,我们这个社会要付出更深远的代价。比如,为什么要如此大张旗鼓批普适价值?是普适价值中的什么让我们大动肝火?说穿了无非是民主自由,因为民主自由威胁既得利益。但直接批民主自由又不好听,只能拿普适价值说事了。但在信仰尽失、道德沦落的今天,连普适的价值也成了批判的对象,结果是可想而知的。但为了既得利益,又不得不如此。

11.造成社会衰败的根本原因是权贵资本主义的形成。过去很多人把权力和市场看成是截然对立的东西,现在看到这两个东西在中国结合起来了。好比原来人们眼中两个最不能结婚的人结婚了,不但结婚了,而且日子过得很好。过去认为权力在市场情况下会受到限制,现在恰恰是市场的出现使得权力有了更大的行使机会和场所。市场是权力在当中起作用的市场,权力是在市场当中行使的权力。而且,现在的权力因为市场化而有了更大的行使机会和场所,卖出了好价格。这是我们现在面对的问题。在2002年的时候,我曾经提出“断裂社会”的概念;权贵资本主义下的既得利益集团会形成一种“我们”与“他们”的区分或区隔。正如上面的分析所表明的,这种区隔已经在造成一种心理上的疏离感。

12.面对权钱结合时的中国思想界。对于权钱的结合,既要规范权力,也要规范市场。但更重要的是要切断两者结合的链条。最近茅于轼先生提出,不让有钱的人有势,不让有权的人捞钱。说的也是这个道理。要看到,关键的问题是权钱的结合。但目前中国思想界的情况好有一比:权力和金钱两个看起来不能结婚的两个人组成了一个小家庭,而且日子过的还相当不错。这时,左派和右派的分歧形成了,一派说,你家的丈夫是个好丈夫,妻子是个坏妻子;另一派说,他家的妻子才是好妻子,丈夫是个坏丈夫。并为此吵得不可开交。殊不知,人家小两口日子过得甜甜蜜蜜。

13.由于思路错误,“维护稳定”的种种措施导致使社会健康化的变革无法进行,结果是进一步加剧社会的溃败。社会动荡是可以用“维护稳定”去对付的,而社会溃败却更难办。记得在菲律宾前总统埃斯特拉达因腐败而倒台的时候,美国的一家媒体评论道,这个国家的腐败所造成的内伤,可能需要这个社会的人用100年的时间为之付出代价。当腐败成为一种生活方式,当腐败成为一种无可厚非的价值,当腐败成为一种人人欲诛之又人人欲得之的东西的时候,整个社会生活开始进入变态的状态。历史将会证明,“稳定”不仅不会压倒一切,很可能会毁灭一切。因为这种僵硬的稳定压倒一切的思路,会将那些使我们这个国家健康起来的努力被消灭在萌芽状态。

14.权钱结合以及由此形成的腐败,从根本上扭曲了中国社会发展的进程。去年是中国改革30周年。本来,在这样一个重要时刻,人们期待着对改革的认真总结和深刻反思,期待将30年这样一个时刻作为发展新的起点。但遗憾的是,廉价的颂扬、言不及义的套话,使得这个大好的时机被放过。这说明,我们已经失去了面对现实,包括面对改革的勇气和能力。实际上,正如我在2005年的一系列文章中所强调的,改革从某种意义上说已经开始成为财富掠夺的战争,改革的共识已经基本破灭,改革的动力已经基本丧失。原因何在?就在于改革已经受制于既有的既得利益框架,即使是真正开明的改革者也无法摆脱这种制约。在这种情况下,扭曲改革的机制已经形成。即使是出发点良好的改革,最后的结果往往也是南辕北辙。

15.其实,中国的改革既没有有些人说的那么好,也没有有些人说的那么坏。我一直不同意将经济发展速度和人们物质生活的改善完全归功于改革,只要没有特殊的天灾人祸,经济本来就会发展。有人经常用今天的物质生活和30年前对比,以说明改革的成功,其实这当中除了在技术进步推动下社会正常发展的因素之外,生育率的下降和家庭平均人口的减少是一个重要的因素,试想如果今天城市中的许多家庭是3个孩子的话,其生活是一种什么样的生活?因此,可以说改革开放是沾了计划生育的光,改革是沾了开放的光(加快了技术进步)。我这样说不是否定改革,而是说对改革也要有一种理性的态度。改革的真正意义是使中国从一个扭曲和变态的社会转变为一个正常的社会,是汇入人类发展的主流文明。市场经济只是其中一个有限的部分。而这个过程其实远没有完成,近些年且有倒退之势。

16.中国的改革先天不足。回思改革的起点可以让我们重新认识一些问题。中国的改革其实并不是始于“国民经济到了崩溃的边缘”。改革的启动是几股力量合在一起的结果。这当中有民众改善经济状况的现实要求,有知识分子改变现状的理想,但其实更有力量的,是文革中失势者重归权力中心的要求。后者又有两部分人,一是想回到文革前的17年,一种是想借此走向一种新的文明。80年代初期改革即在这部分人的掌控之下了。不过,能够和当时形成对比的,是文革的荒唐岁月,所以掌握权力者充满自信。这种自信造成了80年代的开明。然而开明的表象掩盖了改革的根本缺陷,即没有一种真正的走向新文明的价值目标。

17.稳定已经开始演变为维护既有利益格局的一种手段.

- 作者: 流星*流浪 2011年04月11日, 星期一 15:27  回复(0) |  引用(0) 加入博采

SHELL脚本if语句中的参数

[ -a FILE ] 如果 FILE 存在则为真。

[ -b FILE ] 如果 FILE 存在且是一个块特殊文件则为真。

[ -c FILE ] 如果 FILE 存在且是一个字特殊文件则为真。

[ -d FILE ] 如果 FILE 存在且是一个目录则为真。

[ -e FILE ] 如果 FILE 存在则为真。

[ -f FILE ] 如果 FILE 存在且是一个普通文件则为真。

[ -g FILE ] 如果 FILE 存在且已经设置了SGID则为真。

[ -h FILE ] 如果 FILE 存在且是一个符号连接则为真。

[ -k FILE ] 如果 FILE 存在且已经设置了粘制位则为真。

[ -p FILE ] 如果 FILE 存在且是一个名字管道(F如果O)则为真。

[ -r FILE ] 如果 FILE 存在且是可读的则为真。

[ -s FILE ] 如果 FILE 存在且大小不为0则为真。

[ -t FD ] 如果文件描述符 FD 打开且指向一个终端则为真。

[ -u FILE ] 如果 FILE 存在且设置了SUID (set user ID)则为真。

[ -w FILE ] 如果 FILE 如果 FILE 存在且是可写的则为真。

[ -x FILE ] 如果 FILE 存在且是可执行的则为真。

[ -O FILE ] 如果 FILE 存在且属有效用户ID则为真。

[ -G FILE ] 如果 FILE 存在且属有效用户组则为真。

[ -L FILE ] 如果 FILE 存在且是一个符号连接则为真。

[ -N FILE ] 如果 FILE 存在 and has been mod如果ied since it was last read则为真。

[ -S FILE ] 如果 FILE 存在且是一个套接字则为真。

[ FILE1 -nt FILE2 ] 如果 FILE1 has been changed more recently than FILE2, or 如果 FILE1 exists and FILE2 does not则为真。

[ FILE1 -ot FILE2 ] 如果 FILE1 FILE2 要老, 或者 FILE2 存在且 FILE1 不存在则为真。

[ FILE1 -ef FILE2 ] 如果 FILE1 FILE2 指向相同的设备和节点号则为真。

[ -o OPTIONNAME ] 如果 shell选项 OPTIONNAME 开启则为真。

[ -z STRING ] STRING 的长度为零则为真。

[ -n STRING ] or [ STRING ] STRING 的长度为非零 non-zero则为真。

[ STRING1 == STRING2 ] 如果2个字符串相同。 = may be used instead of == for strict POSIX compliance则为真。

[ STRING1 != STRING2 ] 如果字符串不相等则为真。

[ STRING1 < STRING2 ] 如果 STRING1 sorts before STRING2 lexicographically in the current locale则为真。

[ STRING1 > STRING2 ] 如果 STRING1 sorts after STRING2 lexicographically in the current locale则为真。 [ ARG1 OP ARG2 ] OP is one of -eq, -ne, -lt, -le, -gt or -ge. These arithmetic binary operators return true if “ARG1” is equal to, not equal to, less than, less than or equal to, greater than, or greater than or equal to “ARG2”, respectively. “ARG1” and “ARG2” are integers.

 

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

运算符 描述 示例

文件比较运算符

-e filename 如果 filename 存在,则为真 [ -e /var/log/syslog ]

-d filename 如果 filename 为目录,则为真 [ -d /tmp/mydir ]

-f filename 如果 filename 为常规文件,则为真 [ -f /usr/bin/grep ]

-L filename 如果 filename 为符号链接,则为真 [ -L /usr/bin/grep ]

-r filename 如果 filename 可读,则为真 [ -r /var/log/syslog ]

-w filename 如果 filename 可写,则为真 [ -w /var/mytmp.txt ]

-x filename 如果 filename 可执行,则为真 [ -L /usr/bin/grep ]

filename1 -nt filename2 如果 filename1 filename2 新,则为真 [ /tmp/install/etc/services -nt /etc/services ]

filename1 -ot filename2 如果 filename1 filename2 旧,则为真 [ /boot/bzImage -ot arch/i386/boot/bzImage ]

字符串比较运算符 (请注意引号的使用,这是防止空格扰乱代码的好方法)

-z string 如果 string 长度为零,则为真 [ -z $myvar ]

-n string 如果 string 长度非零,则为真 [ -n $myvar ]

string1 = string2 如果 string1 string2 相同,则为真 [ $myvar = one two three ]

string1 != string2 如果 string1 string2 不同,则为真 [ $myvar != one two three ]

算术比较运算符

num1 -eq num2 等于 [ 3 -eq $mynum ]

num1 -ne num2 不等于 [ 3 -ne $mynum ]

num1 -lt num2 小于 [ 3 -lt $mynum ]

num1 -le num2 小于或等于 [ 3 -le $mynum ]

num1 -gt num2 大于 [ 3 -gt $mynum ]

num1 -ge num2 大于或等于 [ 3 -ge $mynum ]

 

1 字符串判断

str1 = str2      当两个串有相同内容、长度时为真
str1 != str2
      当串str1str2不等时为真
-n str1
        当串的长度大于0时为真(串非空)
-z str1
        当串的长度为0时为真(空串)
str1
           当串str1为非空时为真

2 数字的判断

int1 -eq int2    两数相等为真
int1 -ne int2
    两数不等为真
int1 -gt int2
    int1大于int2为真
int1 -ge int2
    int1大于等于int2为真
int1 -lt int2
    int1小于int2为真
int1 -le int2
    int1小于等于int2为真

3 文件的判断

-r file     用户可读为真
-w file
     用户可写为真
-x file
     用户可执行为真
-f file
     文件为正规文件为真
-d file
     文件为目录为真
-c file
     文件为字符特殊文件为真
-b file
     文件为块特殊文件为真
-s file
     文件大小非0时为真
-t file
     当文件描述符(默认为1)指定的设备为终端时为真

3 复杂逻辑判断

-a        
-o
       
!
        非

 

- 作者: 流星*流浪 2011年04月10日, 星期日 00:24  回复(0) |  引用(0) 加入博采

AIX6.1下配置Nmon性能工具

Nmon是一个免费的AIX和Linux系统性能工具,改软件未受IBM官方正式的技术支持,所以无法在IBM获取帮助。

AIX6.1默认安装了Nmon监控服务,只需直接调用即可,具体操作方法如下:


一 直接键入如下命令启动Nmon:

#/usr/bin/nmon -f -N -m /nmon/log -s 30 -c 2880

各参数意义:
    -f 按标准格式输出文件:<hostname>_YYYYMMDD_HHMM.nmon
    -N 包括NFS系统分区
    -m 切换到路径去保存日志文件
    -s 每隔n秒抽样一次,这里为30
    -c 取出多少个抽样数量,这里为2880,即监控=2880*(30/60/60)=24小时
    根据小时计算这个数字的公式为:c=h*3600/s,比如要监控10小时,每隔30秒采样一次,则c=10*3600/30=1200
 
二 用crontab命令设定执行时间:

执行命令:
#crontab -e

在最后一行添加如下命令:
 0 0 * * 1,2,3,4,5 nmon -f -N -m /nmon/log -s 30 -c 2880
表示:
周一到周五,从早上00点开始,监控24个小时(到24:00整为止),输出到/nmon/log

三 分析报告
nmon启动以后会在/nmon/log生成*.nmon的文件,把它下载到你的电脑上;
打开nmon报告分析器nmon analyser.xls,把宏的安全性设成最低,打开下载好的*.nmon文件。
并且保存为一个文件,就生成了视图模式系统报告,根据报告内容即可查询系统的具体情况。

四 工具下载地址:

IBM Wiki 上 nmon 下载地址 http://www-941.haw.ibm.com/collaboration/wiki/display/WikiPtype/nmon
nmon 相关问题和观点的IBM论坛地址 http://www.ibm.com/servers/eserver/pseries/community/
 IBM Wiki 上 nmon 分析程序下载地址  http://www-941.haw.ibm.com/collaboration/wiki/display/Wikiptype  /nmonanalyser 。

附录:crontab参数:
  f1     f2       f3         f4       f5    program
minute  hour  day_of_month  month  weekday  command这些字段接收以下值:
minute 0 到 59
hour 0 到 23
day_of_month 1 到 31
month 1 到 12
weekday 0 到 6(星期天到星期六)

- 作者: 流星*流浪 2011年04月9日, 星期六 20:17  回复(0) |  引用(0) 加入博采

AIX设备地址,位置代码
设备地址,位置代码  不会超过8位(2-8之间)
   AB-CD-EF-GH


   AB  总线 00,04 pci总线   01  ISA 总线  09
   CD  插槽 01-99  插在槽上的设备
        A-Z,0  集成设备
   EF  提供给设备的方式
       00-单总线scsi卡
       01-双总线scsi卡 
       0s-集成的scsi卡
   GH  设备的最终位置(如果没有就是板卡)scsi设备G,H之间有逗号
       G SCSI ID号  
       H逻辑单元号,通常为0
    SCSI适配器的ID号总是7,配置其它SCSI设备时不要冲突

- 作者: 流星*流浪 2011年03月14日, 星期一 15:12  回复(0) |  引用(0) 加入博采

linux中shell变量$#,$?,$@,$0,$1,$2的含义
变量说明:
$$
Shell本身的PID(ProcessID)
$!
Shell最后运行的后台Process的PID
$?
最后运行的命令的结束代码(返回值)
$-
使用Set命令设定的Flag一览
$*
所有参数列表。如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。
$@
所有参数列表。如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。
$#
添加到Shell的参数个数
$0
Shell本身的文件名
$1~$n
添加到Shell的各参数值。$1是第1参数、$2是第2参数…。

- 作者: 流星*流浪 2011年03月14日, 星期一 14:55  回复(0) |  引用(0) 加入博采

SUN被收购
本来准备java考试的,结果上网一搜发现:java的大佬,SUN被收购了。
看了网上的一些帖子,多是谈论双方的获利情况,和猜测oracle对sun的动作。
最搞笑的是甚至还有扯到两个公司的老总私交好。真搞笑,这就是中国式的幽默水平?
在全球的几家IT公司中我最崇拜的几家公司,SUN就是其中之一。

不管怎么说,SUN是永远的跨时代的成功。
一个全球的企业做到最后,是要有益于社会,甚至是有益于人类的,这是这个公司的社会责任!
岂能以赚钱多寡论英雄,钱赚到多少才叫成功,谁能给个标准。
但是做什么有利于社会,有利于人类,这个标准即使不说,大家也都能知道。
就在这一点上,SUN的光芒无人能及,不愧取名为SUN!而Microsoft,到了今天,它成为障碍技术进步的绊脚石。所以永远只能是micro,即使赚再多钱,上不得大台面,最挣钱的公司未必是最受人敬重的公司。
比尔最终会选择个人财富回馈社会,不能不说是在学习SUN的伟大。而一个人伟大的贡献,和一个影响全球的公司的伟大是不可同日而语的。平心而论,就Java一样,短短的了了几年,养活了多少做IT的开发人员,做了多少大大小小的软件,中国人讲喝水不忘打井人,试问到现在有那种语言能像java一样?

网上还有评论说IBM的失败,IBM和SUN融合,以IBM的庞大和臃肿和低效率,难以张扬SUN的优点。所以他们风格上相差甚远,很难融合。
另外一种评论说microsoft没有收购是个大损失,我想说的是幸亏Microsoft没有收购,不然简直对SUN是种侮辱。Microsoft那种仅会赚钱的公司将来发展到一定阶段,必然是IT界的噩梦。

其实收购过程中做为看客的中国企业的大佬和这个国家的大佬们,其实是最大的失败者。一个泱泱大国,号称要民族崛起,在信息化时代的今天,错失cpu如果还可原谅,错失OS, 错失基础的软件开发平台核心研发能力才是种真正的悲哀。大家都太忙,仅仅是忙于挣钱。杯具!或许说美国司法部不会同意,中国人向来会明修栈道,暗渡陈仓。当年这样封锁,那样封锁,以那种国力水平核弹都造出来了。何况是今天!

- 作者: 流星*流浪 2010年08月13日, 星期五 10:35  回复(0) |  引用(0) 加入博采

Suid、Sgid和Sticky权限

<>1.Suid、Sgid权限

当您最初登录时,将启动一个新的 shell 进程。您已经知道,但是您可能还不知道这个新的 shell

 进程(通常是 bash)使用您的用户标识运行。照这样,bash 程序可以访问所有属于您的文件和

目录。事实上,作为用户,我们完全依靠其它程序来代表我们执行操作。因为您启动的程序继承了

您的用户标识,因此它们不能访问任何不允许您访问的文件系统对象。

例如,一般用户不能直接修改 passwd 文件,因为“write”标志已经对除“root 用户”以外的每个用户关闭:

$ ls -l /etc/passwd

-rw-r--r-- 1 root wheel 1355 Nov 1 21:16 /etc/passwd

但是,一般用户确实需要在他们需要改变其密码的任何时候,能够修改 /etc/passwd(至少间

接地)。但是,如果用户不能修改该文件,究竟怎样完成这个工作呢?

Suid

幸好,Linux 权限模型有两个专门的位,叫做“suid”和“sgid”。当设置了一个可执行程序

的“suid”这一位时,它将代表可执行文件的所有者运行,而不是代表启动程序的人运行。

现在,回到 /etc/passwd 问题。如果看一看 passwd 可执行文件,我们可以

看到它属于 root 用户:

$ ls -l /usr/bin/passwd

-rwsr-xr-x 1 root wheel 17588 Sep 24 00:53 /usr/bin/passwd

您还将注意到,这里有一个 s 取替了用户权限三元组中的一个 x。这表明,对于这个特殊程序,

设置了 suid 和可执行位。由于这个原因,当 passwd 运行时,它将代表 root 用户执行(

具有完全超级用户访问权),而不是代表运行它的用户运行。又因为 passwd 以 root 用户访

问权运行,所以能够修改 /etc/passwd 文件,而没有什么问题。

suid/sgid 告诫说明

我们看到了 suid 怎样工作,sgid 以同样的方式工作。它允许程序继承程序的组所有权,而不

是当前用户的程序所有权。

这里有一些关于 suid 和 sgid 的其它的但是很重要的信息。首先,suid 和 sgid 占据与

ls -l 清单中 x 位相同的空间。如果还设置了 x 位,则相应的位表示为 s(小写)。但是,

如果没有设置 x 位,它将表示为 S(大写)。

另一个很重要的提示:在许多环境中,suid 和 suid 很管用,但是不恰当地使用这些位可能使

系统的安全遭到破坏。最好尽可能地少用“suid”程序。passwd 命令是为数不多的必须使用

“suid”的命令之一。

改变 suid 和 sgid

设置和除去 suid 与 sgid 位相当简单。这里,我们设置 suid 位:

# chmod u+s /usr/bin/myapp

此处,我们从一个目录除去 sgid 位。我们将看到 sgid 位怎样影响下面几屏中

的目录:

# chmod g-s /home/drobbins

权限和目

到此为止,我们从常规文件的角度来看权限。当从目录的角度看权限时,情况有一点不同。目录使

用同样的权限标志,但是它们被解释为表示略微不同的含义。

对于一个目录,如果设置了“read”标志,您可以列出目录的内容;“write”表示您可以在目

录中创建文件,“execute”表示您可以进入该目录并访问内部的任何子目录。没有“execute”

标志,目录内的文件系统对象是不可访问的。没有“read”标志,目录内的文件系统对象是不可

查看的,但是只要有人知道磁盘上对象的完整路径,就仍然可以访问目录内的对象。

目录和 sgid

如果启用了目录的“sgid”标志,在目录内创建的任何文件系统对象将继承目录

的组。当您需要创建一个属于同一组的一组人使用的目录树时,这种特殊的功能

很管用。只需要这样做:

# mkdir /home/groupspace

# chgrp mygroup /home/groupspace

# chmod g+s /home/groupspace

现在,mygroup 组中的所有用户都可以在 /home/groupspace 内创建文件或目录,同样,他

们也将自动地分配到 mygroup 的组所有权。根据用户的 umask 设置,新文件系统对象对于

mygroup 组的其他成员来说,可以或不可以是可读、可写或可执行的。

2.Sticky权限

目录和删除

缺省情况下,Linux 目录以一种不是在所有情况下都很理想的方式表现。一般来说,只要对一个

目录有写访问权,任何人都可以重命名或删除该目录中的文件。对于个别用户使用的目录,这种行

为是很合理的。

但是,对于很多用户使用的目录来说,尤其是 /tmp 和 /var/tmp,这种行为可能会产生麻烦。

因为任何人都可以写这些目录,任何人都可以删除或重命名任何其他人的文件 — 即使是不属于

他们的!显然,当任何其他用户在任何时候都可以输入“rm -rf /tmp/*”并损坏每个人的文

件时,很难把 /tmp 用于任何有意义的文件。

所幸,Linux 有叫做“粘滞位”(sticky bit)的东西。当给 /tmp 设置了粘滞位(用

chmod +t),唯一能够删除或重命名 /tmp 中文件的是该目录的所有者(通常是 root 用户)

、文件的所有者或 root 用户。事实上,所有 Linux 分发包都缺省地启用了 /tmp 的粘滞位,

而您还可以发现粘滞位在其它情况下也很管用。

难以理解的第一位

总结本章,我们最后来看一看数字模式的难以理解的第一位数。您可以看到,这个第一位数

用来设置 sticky、suid 和 sgid 位: (这3位也相当于rwx这样的组合,不同的是位置各占x位)

suid       sgid        sticky         模式数字

 on         on           on                   7

 on         on           off                   6

 on         off           on                   5

 on         off           off                   4

 off         on           on                   3

 off         on           off                   2

 off         off           on                   1

 off         off           off                   0

这里有一个怎样用 4 位数字模式来设置一个目录的权限的示例,该目录将由一个工作组使用:

# chmod 1775 /home/groupfiles

- 作者: 流星*流浪 2010年07月26日, 星期一 09:00  回复(0) |  引用(0) 加入博采

一个计算机专业学生几年的Java编程经验汇总(转)
来自: javaeye 


想来学习Java也有两个年头了,永远不敢说多么精通,但也想谈谈自己的感受,写给软件学院的同仁们,帮助大家在技术的道路上少一点弯路。说得伟大一点是希望大家为软件学院争气,其实最主要的还是大家自身的进步提升??

1. 关于动态加载机制??
学习Java比C++更容易理解 OOP的思想,毕竟C++还混合了不少面向过程的成分。很多人都能背出来Java语言的特点,所谓的动态加载机制等等。当 然概念往往是先记住而后消化的,可有多少人真正去体会过动态加载的机制,试图去寻找过其中的细节呢? 提供大家一个方法:
在命令行窗口运行 Java程序的时候,加上这个很有用的参数:

java -verbose *.class

这样会清晰的打印出被加载的类文件,大部分是jdk自身运行需要的,最后几行会明显的看到自己用到的那几个类文件被加载进来的顺序。即使你声明了一个类对 象,不实例化也不会加载,说明只有真正用到那个类的实例即对象的时候,才会执行加载。这样是不是大家稍微能明白一点动态加载了呢?^_^

2. 关于寻找class文件原理??
建议大家在入门的时候在命令行窗口编译和运行,不要借助JCreator或者Eclipse等IDE去帮助做那些事情。尝试自己这样做:
javac -classpath yourpath *.java
java -classpath yourpath *.class
也许很多人都能看懂,设置classpath的目的就是告诉编译器去哪里寻找你的class文件. 不过至少笔者今日才弄懂JVM去查询类的原理,编译器加载类要依靠classloader, 而classloader有3个级别,从高到低分别是BootClassLoader(名字可能不准确) , ExtClassLoader, AppClassLoader.

这3个加载器分别对应着编译器去寻找类文件的优先级别和不同的路径:BootClassLoader对应jre/classes路径,是编译器最优先寻找class的地方
ExtClassLoader对应jre/lib/ext路径,是编译器次优先寻找class的地方
AppClassLoader对应当前路径,所以也是编译器默认找class的地方

其实大家可以自己写个程序简单的测试,对任何class,例如A,
调用new A().getClass().getClassLoader().toString() 打印出来就可以看到,把class文件放在不同的路径下再次执行,就会看到区别。特别注意的是如果打印出来是null就表示到了最高级 BootClassLoader, 因为它是C++编写的,不存在Java对应的类加载器的名字。

寻找的顺序是一种向上迂回的思想,即如果本级别找不到,就只能去本级别之上的找,不会向下寻找。不过似乎从Jdk1.4到Jdk1.6这一特点又有改变, 没有找到详细资料。所以就不举例子了。告诉大家设计这种体系的是Sun公司曾经的技术核心宫力先生,一个纯种华人哦!^_^

这样希望大家不至于迷惑为什么总报错找不到类文件,不管是自己写的还是导入的第三方的jar文件(J2ee中经常需要导入的)。

3. 关于jdk和jre??
大家肯定在安装JDK的时候会有选择是否安装单独的jre,一般都会一起安装,我也建议大家这样做。因为这样更能帮助大家弄清楚它们的区别:

Jre 是java runtime environment, 是java程序的运行环境。既然是运行,当然要包含jvm,也就是大家熟悉的虚拟机啦, 还有所有java类库的class文件,都在lib目录下打包成了jar。大家可以自己验证。至于在windows上的虚拟机是哪个文件呢? 学过MFC的都知道什么是dll文件吧,那么大家看看jre/bin/client里面是不是有一个jvm.dll呢?那就是虚拟机。

Jdk 是java development kit,是java的开发工具包,里面包含了各种类库和工具。当然也包括了另外一个Jre. 那么为什么要包括另外一个Jre呢?而且jdk/jre/bin同时有client和server两个文件夹下都包含一个jvm.dll。 说明是有两个虚拟机的。这一点不知道大家是否注意到了呢?

相信大家都知道jdk的bin下有各种java程序需要用到的命令,与jre 的bin目录最明显的区别就是jdk下才有javac,这一点很好理解,因为 jre只是一个运行环境而已。与开发无关,正因为如此,具备开发功能的jdk自己的jre下才会同时有client性质的jvm和server性质的 jvm, 而仅仅作为运行环境的jre下只需要client性质的jvm.dll就够了。

记得在环境变量path中设置jdk/bin 路径麽?这应该是大家学习Java的第一步吧, 老师会告诉大家不设置的话javac和java是用不了的。确实jdk/bin目录下包含了所有的命令。可是有没有人想过我们用的java命令并不是 jdk/bin目录下的而是jre/bin目录下的呢?不信可以做一个实验,大家可以把jdk/bin目录下的java.exe剪切到别的地方再运行 java程序,发现了什么?一切OK!

那么有人会问了?我明明没有设置jre/bin目录到环境变量中啊?

试想一下如果java为了提供给大多数人使用,他们是不需要jdk做开发的,只需要jre能让java程序跑起来就可以了,那么每个客户还需要手动去设置 环境变量多麻烦啊?所以安装jre的时候安装程序自动帮你把jre的java.exe添加到了系统变量中,验证的方法很简单,大家看到了系统环境变量的 path最前面有“%SystemRoot%\system32;%SystemRoot%;”这样的配置,那么再去Windows/system32下 面去看看吧,发现了什么?有一个java.exe。

如果强行能够把jdk/bin挪到system32变量前面,当然也可以迫使使用 jdk/jre里面的java,不过除非有必要,我不建议大家这么做。使用单独的jre跑java程序也算是客户环境下的一种测试。

这下大家应该更清楚jdk和jre内部的一些联系和区别了吧?

PS: 其实还有满多感想可以总结的,一次写多了怕大家扔砖头砸死我,怪我太罗唆。大家应该更加踏实更加务实的去做一些研究并互相分享心得,大方向和太前沿的技术讨论是必要的但最好不要太多,毕竟自己基础都还没打好,什么都讲最新版本其实是进步的一大障碍!





Java 学习杂谈(二)
鉴于上回写的一点感想大家不嫌弃,都鼓励小弟继续写下去,好不容易等到国庆黄金周,实习总算有一个休息的阶段,于是这就开始写第二篇了。希望这次写的仍然 对志同道合的朋友们有所帮助。上回讲了Java动态加载机制、classLoader原理和关于jdk和jre三个问题。这次延续着讲一些具体的类库??

1. 关于集合框架类
相信学过Java的各位对这个名词并不陌生,对 java.util.*这个package肯定也不陌生。不知道大家查询API的时候怎么去审视或者分析其中的一个package,每个包最重要的两个部 分就是interfaces和classes,接口代表了它能做什么,实现类则代表了它如何去做。关注实现类之前,我们应该先理解清楚它的来源接口,不管 在j2se还是j2ee中,都应该是这样。那么我们先看这三个接口:List、Set、Map。
也许有些人不太熟悉这三个名字,但相信大部分人都熟悉ArrayList,LinkedList,TreeSet,HashSet,HashMap, Hashtable等实现类的名字。它们的区别也是满容易理解的,List放可以重复的对象集合,Set放不可重复的对象组合,而Map则放 <Key,Value > 这样的名值对, Key不可重复,Value可以。这里有几个容易混淆的问题:

到底 Vector和ArrayList,Hashtable和HashMap有什么区别?
很多面试官喜欢问这个问题,其实更专业一点应该这样问:新集合框架和旧集合框架有哪些区别?新集合框架大家可以在这些包中找since jdk1.2的,之前的如vector和Hashtable都是旧的集合框架包括的类。那么区别是?
a. 新集合框架的命名更加科学合理。例如List下的ArrayList和LinkedList
b. 新集合框架下全部都是非线程安全的。建议去jdk里面包含的源代码里面自己去亲自看看vector和ArrayList的区别吧。当然如果是jdk5.0 之后的会比较难看一点,因为又加入了泛型的语法,类似c++的template语法。

那么大家是否想过为什么要从旧集合框架默认全部加锁防止多线程访问更新到新集合框架全部取消锁,默认方式支持多线程?(当然需要的时候可以使用collections的静态方法加锁达到线程安全)
笔者的观点是任何技术的发展都未必是遵循它们的初衷的,很多重大改变是受到客观环境的影响的。大家知道Java的初衷是为什么而开发的麽?是为嵌入式程序 开发的。记得上一篇讲到classLoader机制麽?那正是为了节约嵌入式开发环境下内存而设计的。而走到今天,Java成了人们心中为互联网诞生的语 言。互联网意味着什么?多线程是必然的趋势。客观环境在变,Java技术也随着飞速发展,导致越来越脱离它的初衷。据说Sun公司其实主打的是J2se, 结果又是由于客观环境影响,J2se几乎遗忘,留在大家谈论焦点的一直是j2ee。

技术的细节这里就不多说了,只有用了才能真正理解。解释这些正是为了帮助大家理解正在学的和将要学的任何技术。之后讲j2ee的时候还会再讨论。
多扯句题外话:几十年前的IT巨人是 IBM,Mainframe市场无人可比。微软如何打败IBM?正是由于硬件飞速发展,对个人PC的需求这个客观环 境,让微软通过OS称为了第二个巨人。下一个打败微软的呢?Google。如何做到的?如果微软并不和IBM争大型机,Google借着互联网飞速发展这 个客观环境作为决定性因素,避开跟微软争OS,而是走搜索引擎这条路,称为第3个巨人。那么第4个巨人是谁呢?很多专家预言将在亚洲或者中国出现, Whatever,客观环境变化趋势才是决定大方向的关键。当然笔者也希望会出现在中国,^_^~~

2. 关于Java设计模式
身边的很多在看GOF的23种设计模式,似乎学习它无论在学校还是在职场,都成了一种流行风气。我不想列举解释这23种Design Pattern, 我写这些的初衷一直都是谈自己的经历和看法,希望能帮助大家理解。
首先我觉得设计模式只是对一类问题的一种通用解决办法,只要是面向对象的编程预言都可以用得上这23种。理解它们最好的方法就是亲自去写每一种,哪怕是一 个简单的应用就足够了。如果代码实现也记不住的话,记忆它们对应的UML图会是一个比较好的办法,当然前提是必须了解UML。
同时最好能利用 Java自身的类库帮助记忆,例如比较常用的观察者模式,在java.util.*有现成的Observer接口和Observable这 个实现类,看看源代码相信就足够理解观察者模式了。再比如装饰器模式,大家只要写几个关于java.io.*的程序就可以完全理解什么是装饰器模式了。有 很多人觉得刚入门的时候不该接触设计模式,比如图灵设计丛书系列很出名的那本《Java设计模式》,作者: Steven John Metsker,大部分例子老实说令现在的我也很迷惑。但我仍然不同意入门跟学习设计模式有任何冲突,只是我们需要知道每种模式的概念的和典型的应用,这 样我们在第一次编写 FileOutputStream、BufferedReader、PrintWriter的时候就能感觉到原来设计模式离我们如此之近,而且并不是多么 神秘的东西。

另外,在学习某些模式的同时,反而更能帮助我们理解java类库的某些特点。例如当你编写原型(Prototype)模式的时候,你必须了解的是 java.lang.Cloneable这个接口和所有类的基类Object的clone()这个方法。即深copy和浅copy的区别:
Object.clone() 默认实现的是浅copy,也就是复制一份对象拷贝,但如果对象包含其他对象的引用,不会复制引用,所以原对象和拷贝共用那个引用的对象。
深 copy当然就是包括对象的引用都一起复制啦。这样原对象和拷贝对象,都分别拥有一份引用对象。如果要实现深copy就必须首先实现 java.lang.Cloneable接口,然后重写clone()方法。因为在Object中的clone()方法是protected签名的,而 Cloneable接口的作用就是把protected放大到public,这样clone()才能被重写。

那么又有个问题了?如果引用的对象又引用了其他对象呢?这样一直判断并复制下去,是不是显得很麻烦?曾经有位前辈告诉我的方法是重写clone方法的时候 直接把原对象序列化到磁盘上再反序列化回来,这样不用判断就可以得到一个深copy的结果。如果大家不了解序列化的作法建议看一看 ObjectOutputStream和ObjectInputStream

归根结底,模式只是思想上的东西,把它当成前人总结的经验其实一点都不为过。鼓励大家动手自己去写,例如代理模式,可以简单的写一个Child类, Adult类。Child要买任何东西由Adult来代理实现。简单来说就是Adult里的buy()内部实际调用的是Child的buy(),可是暴露 在main函数的却是Adult.buy()。这样一个简单的程序就足够理解代理模式的基本含义了。





Java 杂谈(三)
这已经笔者写的第三篇Java杂记了,庆幸前两篇一直得到论坛朋友们的支持鼓励,还望大家继续指正不足之处。笔者也一直渴望通过这样方式清醒的自审,来寻找自己技术上的不足之处,希望和共同爱好Java的同仁们一起提高。
前两次分别讲述了关于jvm、jdk、jre、 collection、classLoader和一些Design Pattern的自我理解。这次仍然不准备开始过渡到j2ee中,因为觉得还有一些琐碎的j2se的问题没有总结完毕。

1. 关于Object类理解
大家都知道Object是所有Java类的基类, 意味着所有的Java类都会继承了Object的11个方法。建议大家去看看Object的 11个成员函数的源代码,就会知道默认的实现方式。比如equals方法,默认实现就是用"=="来比较,即直接比较内存地址,返回true 或者 false。而toString()方法,返回的串组成方式是??
"getClass().getName() + "@" + Integer.toHexString(hashCode())"
其实不用我过多的解释,大家都能看懂这个串的组成。接下来再看看 hashCode():
public native int hashCode();

由于是native方法,跟OS的处理方式相关,源代码里仅仅有一个声明罢了。我们有兴趣的话完全可以去深究它的hashCode到底是由OS怎么样产生 的呢?但笔者建议最重要的还是先记住使用它的几条原则吧!首先如果equals()方法相同的对象具有相通的hashCode,但equals ()对象不相通的时候并不保证hashCode()方法返回不同的整数。而且下一次运行同一个程序,同一个对象未必还是当初的那个hashCode() 哦。
其余的方法呢?nofigy()、notifyAll()、clone()、wait()都是native方法的,说明依赖于操作系统的实现。最后一个有 趣的方法是finalize(),类似C++的析构函数,签名是protected,证明只有继承扩展了才能使用,方法体是空的,默示什么也不做。它的作 用据笔者的了解仅仅是通知JVM此对象不再使用,随时可以被销毁,而实际的销毁权还是在于虚拟机手上。那么它真的什么也不做麽?未必,实际上如果是线程对 象它会导致在一定范围内该线程的优先级别提高,导致更快的被销毁来节约内存提高性能。其实从常理来说,我们也可以大概这样猜测出jvm做法的目的。

2. 关于重载hashCode()与Collection框架的关系
笔者曾经听一位搞Java培训多年的前辈说在他看来hashCode方法没有任何意义,仅仅是为了配合证明具有同样的hashCode会导致equals 方法相等而存在的。连有的前辈都犯这样的错误,其实说明它还是满容易被忽略的。那么hashCode()方法到底做什么用?

学过数据结构的课程大家都会知道有一种结构叫hash table,目的是通过给每个对象分配一个唯一的索引来提高查询的效率。那么Java也不会肆意扭曲改变这个概念,所以hashCode唯一的作用就是为 支持数据结构中的哈希表结构而存在的,换句话说,也就是只有用到集合框架的 Hashtable、HashMap、HashSet的时候,才需要重载hashCode()方法,
这样才能使得我们能人为的去控制在哈希结构中索引是否相等。笔者举一个例子:
曾经为了写一个求解类程序,需要随机列出1,2,3,4组成的不同排列组合,所以笔者写了一个数组类用 int[]来存组合结果,然后把随机产生的组合加入 一个HashSet中,就是想利用HashSet不包括重复元素的特点。可是HashSet怎么判断是不是重复的元素呢?当然是通过 hashCode()返回的结果是否相等来判断啦,可做一下这个实验:
int[] A = {1,2,3,4};
int[] B = {1,2,3,4};
System.out.println(A.hashCode());
System.out.println(B.hashCode());

这明明是同一种组合,却是不同的hashCode,加入Set的时候会被当成不同的对象。这个时候我们就需要自己来重写hashCode()方法了,如何 写呢?其实也是基于原始的hashCode(),毕竟那是操作系统的实现, 找到相通对象唯一的标识,实现方式很多,笔者的实现方式是:
首先重写了toString()方法:
return A[0]“+” A[1]“+” A[2]“+” A[3]; //显示上比较直观
然后利用toString()来计算hashCode():
return this.toString().hashCode();
这样上述A和B返回的就都是”1234”,在测试toString().hashCode(),由于String在内存中的副本是一样的,”1234”.hashCode()返回的一定是相同的结果。

说到这,相信大家能理解得比我更好,今后千万不要再误解 hashCode()方法的作用。

3. 关于Class类的成员函数与Java反射机制
很早刚接触Java就听很多老师说过 Java的动态运行时机制、反射机制等。确实它们都是Java的显著特点,运行时加载笔者在第一篇介绍过了,现在想讲 讲反射机制。在Java中,主要是通过java.lang包中的Class类和Method类来实现内存反射机制的。
熟悉C++的人一定知道下面这样在C++中是做不到的: 运行时以字符串参数传递一个类名,就可以得到这个类的所有信息,包括它所有的方法,和方法的详细信息。还可以实例化一个对象,并通过查到的方法名来调用该 对象的任何方法。这是因为Java的类在内存中除了C++中也有的静态动态数据区之外,还包括一份对类自身的描述,也正是通过这描述中的信息,才能帮助我 们才运行时读取里面的内容,得到需要加载目标类的所有信息,从而实现反射机制。大家有没有想过当我们需要得到一个JavaBean的实例的时候,怎么知道 它有哪些属性呢?再明显简单不过的例子就是自己写一个JavaBean的解析器:

a. 通过Class.forName(“Bean的类名”)得到Class对象,例如叫ABeanClass
b. 通过ABeanClass的getMethods()方法,得到Method[]对象
c. 按照规范所有get方法名后的单词就代表着该Bean的一个属性
d. 当已经知道一个方法名,可以调用newInstance()得到一个实例,然后通过invoke()方法将方法的名字和方法需要用的参数传递进去,就可以动态调用此方法。

当然还有更复杂的应用,这里就不赘述,大家可以参考Class类和Method类的方法。

4. 坦言Synchronize的本质
Synchronize大家都知道是同步、加锁的意思,其实它的本质远没有大家想得那么复杂。声明 Synchronize的方法被调用的时候,锁其实是加 载对象上,当然如果是静态类则是加在类上的锁,调用结束锁被解除。它的实现原理很简单,仅仅是不让第二把锁再次被加在同一个对象或类上,仅此而已。一个简 单的例子足以说明问题:
class A{
synchronized void f(){}
void g(){}
}

当 A的一个对象a被第一个线程调用其f()方法的时候,第二个线程不能调用a的synchronized方法例如f(),因为那是在试图在对象上加第二把锁。但调用g()却是可以的,因为并没有在同一对象上加两把锁的行为产生。
这样大家能理解了麽?明白它的原理能更好的帮助大家设计同步机制,不要滥用加锁。

PS:下篇笔者计划开始对J2ee接触到的各个方面来进行总结,谈谈自己的经验和想法。希望大家还能一如既往的支持笔者写下去,指正不足之处。



Java杂谈(四)

不知不觉已经写到第四篇了,论坛里面不断的有朋友鼓励我写下去。坚持自己的作风,把一切迷惑不容易理清楚的知识讲出来,讲到大家都能听懂,那么自己就真的 懂了。最近在公司实习的时候Trainer跟我讲了很多经典事迹,对还未毕业的我来说是笔不小的财富,我自己的信念是:人在逆境中成长的速度要远远快过顺 境中,这样来看一切都能欣然接受了。
好了,闲话不说了,第三篇讲的是反射机制集合框架之类的,这次打算讲讲自己对反序列化和多线程的理解。希望能对大家学习Java起到帮助??

1.关于序列化和反序列化
应该大家都大概知道Java中序列化和反序列化的意思,序列化就是把一个Java对象转换成二进制进行磁盘上传输或者网络流的传输,反序列化的意思就是把 这个接受到的二进制流重新组装成原来的对象逆过程。它们在Java中分别是通过ObjectInputStream和 ObjectInputStream这两个类来实现的(以下分别用ois和oos来简称)。

oos的writeObject()方法用来执行序列化的过程,ois的readObject()用来执行反序列化的过程,在传输二进制流之前,需要讲这 两个高层流对象连接到同一个Channel上,这个Channel可以是磁盘文件,也可以是socket底层流。所以无论用哪种方式,底层流对象都是以构 造函数参数的形式传递进oos和ois这两个高层流,连接完毕了才可以进行二进制数据传输的。例子:
可以是文件流通道
file = new File(“C:/data.dat”);
oos = new ObjectOutputStream(new FileOutputStream(file));
ois = new ObjectInputStream(new FileInputStream(file));

或者网络流通道
oos = new ObjectOutputStream(socket.getOutputStream());
ois = new ObjectInputStream(socket.getInputStream());

不知道大家是否注意到oos总是在ois之前定义,这里不希望大家误解这个顺序是固定的么?回答是否定的,那么有顺序要求么?回答是肯定的。原则是什么呢?
原则是互相对接的输入/输出流之间必须是output流先初始化然后再input流初始化,否则就会抛异常。大家肯定会问为什么?只要稍微看一看这两个类 的源代码文件就大概知道了,output流的任务很简单,只要把对象转换成二进制往通道中写就可以了,但input流需要做很多准备工作来接受并最终重组 这个Object,所以ObjectInputStream的构造函数中就需要用到output初始化发送过来的header信息,这个方法叫做 readStreamHeader(),它将会去读两个Short值用于决定用多大的缓存来存放通道发送过来的二进制流,这个缓存的size因jre的版 本不同是不一样的。所以output如果不先初始化,input的构造函数首先就无法正确运行。

对于上面两个例子,第一个顺序是严格的,第二个因为oos和ois连接的已经不是对方了,而是socket另外一端的流,需要严格按照另外一方对接的output流先于对接的input流打开才能顺利运行。

这个writeObject和readObject本身就是线程安全的,传输过程中是不允许被并发访问的。所以对象能一个一个接连不断的传过来,有很多人 在运行的时候会碰到EOFException, 然后百思不得其解,去各种论坛问解决方案。其实笔者这里想说,这个异常不是必须声明的,也就是说它虽然是异常,但其实是正常运行结束的标志。EOF表示读 到了文件尾,发送结束自然连接也就断开了。如果这影响到了你程序的正确性的话,请各位静下心来看看自己程序的业务逻辑,而不要把注意力狭隘的聚集在发送和 接受的方法上。因为笔者也被这样的bug困扰了1整天,被很多论坛的帖子误解了很多次最后得出的教训。如果在while循环中去readObject,本 质上是没有问题的,有对象数据来就会读,没有就自动阻塞。那么抛出EOFException一定是因为连接断了还在继续read,什么原因导致连接断了 呢?一定是业务逻辑哪里存在错误,比如NullPoint、 ClassCaseException、ArrayOutofBound,即使程序较大也没关系,最多只要单步调适一次就能很快发现bug并且解决它。

难怪一位程序大师说过:解决问题90%靠经验,5%靠技术,剩下5%靠运气!真是金玉良言,笔者大概查阅过不下30篇讨论在while循环中使用 readObject抛出EOFExceptionde 的帖子,大家都盲目的去关注解释这个名词、反序列化的行为或反对这样写而没有一个人认为EOF是正确的行为,它其实很老实的在做它的事情。为什么大家都忽 略了真正出错误的地方呢?两个字,经验!

2.关于Java的多线程编程
关于Java的线程,初学或者接触不深的大概也能知道一些基本概念,同时又会很迷惑线程到底是怎么回事?如果有人认为自己已经懂了不妨来回答下面的问题:
a. A对象实现Runnable接口,A.start()运行后所谓的线程对象是谁?是A么?
b. 线程的wait()、notify()方法到底是做什么时候用的,什么时候用?
c. 为什么线程的suspend方法会被标注过时,不推荐再使用,线程还能挂起么?
d. 为了同步我们会对线程方法声明Synchronized来加锁在对象上,那么如果父类的f()方法加了Synchronized,子类重写f()方法必须 也加Synchronized么?如果子类的f()方法重写时声明Synchronized并调用super.f(),那么子类对象上到底有几把锁呢?会 因为竞争产生死锁么?

呵呵,各位能回答上来几道呢?如果这些都能答上来,说明对线程的概念还是满清晰的,虽说还远远不能算精通。笔者这里一一做回答,碍于篇幅的原因,笔者尽量说得简介一点,如果大家有疑惑的欢迎一起讨论。

首先第一点,线程跟对象完全是两回事,虽然我们也常说线程对象。但当你用run()和start()来启动一个线程之后,线程其实跟这个继承了 Thread或实现了Runnable的对象已经没有关系了,对象只能算内存中可用资源而对象的方法只能算内存正文区可以执行的代码段而已。既然是资源和 代码段,另外一个线程当然也可以去访问,main函数执行就至少会启动两个线程,一个我们称之为主线程,还一个是垃圾收集器的线程,主线程结束就意味着程 序结束,可垃圾收集器线程很可能正在工作。

第二点,wait()和sleep()类似,都是让线程处于阻塞状态暂停一段时间,不同之处在于wait会释放当前线程占有的所有的锁,而 sleep不会。我们知道获得锁的唯一方法是进入了Synchronized保护代码段,所以大家会发现只有Synchronized方法中才会出现 wait,直接写会给警告没有获得当前对象的锁。所以notify跟wait配合使用,notify会重新把锁还给阻塞的线程重而使其继续执行,当有多个 对象wait了,notify不能确定唤醒哪一个,必经锁只有一把,所以一般用notifyAll()来让它们自己根据优先级等竞争那唯一的一把锁,竞争 到的线程执行,其他线程只要继续wait。

从前Java允许在一个线程之外把线程挂起,即调用suspend方法,这样的操作是极不安全的。根据面向对象的思想每个对象必须对自己的行为负责,而对 自己的权力进行封装。如果任何外步对象都能使线程被挂起而阻塞的话,程序往往会出现混乱导致崩溃,所以这样的方法自然是被毙掉了啦。

最后一个问题比较有意思,首先回答的是子类重写f()方法可以加Synchronized也可以不加,如果加了而且还内部调用了super.f ()的话理论上是应该对同一对象加两把锁的,因为每次调用Synchronized方法都要加一把,调用子类的f首先就加了一把,进入方法内部调用父类的 f又要加一把,加两把不是互斥的么?那么调父类f加锁不就必须永远等待已经加的锁释放而造成死锁么?实际上是不会的,这个机制叫重进入,当父类的f方法试 图在本对象上再加一把锁的时候,因为当前线程拥有这个对象的锁,也可以理解为开启它的钥匙,所以同一个线程在同一对象上还没释放之前加第二次锁是不会出问 题的,这个锁其实根本就没有加,它有了钥匙,不管加几把还是可以进入锁保护的代码段,畅通无阻,所以叫重进入,我们可以简单认为第二把锁没有加上去。

总而言之,Synchronized的本质是不让其他线程在同一对象上再加一把锁。





Java杂谈(五)


本来预计J2se只讲了第四篇就收尾了,可是版主厚爱把帖子置顶长期让大家浏览让小弟倍感责任重大,务必追求最到更好,所以关于J2se一些没有提到的部 分,决定再写几篇把常用的部分经验全部写出来供大家讨论切磋。这一篇准备讲一讲Xml解析包和Java Swing,然后下一篇再讲java.security包关于Java沙箱安全机制和RMI机制,再进入J2ee的部分,暂时就做这样的计划了。如果由于 实习繁忙更新稍微慢了一些,希望各位见谅!

1. Java关于XML的解析
相信大家对XML都不陌生,含义是可扩展标记语言。本身它也就是一个数据的载体以树状表现形式出现。后来慢慢的数据变成了信息,区别是信息可以包括可变的 状态从而针对程序硬编码的做法变革为针对统一接口硬编码而可变状态作为信息进入了XML中存储。这样改变状态实现扩展的唯一工作是在XML中添加一段文本 信息就可以了,代码不需要改动也不需要重新编译。这个灵活性是XML诞生时候谁也没想到的。

当然,如果接口要能提取XML中配置的信息就需要程序能解析规范的XML文件,Java中当然要提高包对这个行为进行有利支持。笔者打算讲到的两个包是 org.w3c.dom和javax.xml.parsers和。(大家可以浏览一下这些包中间的接口和类定义)

Javax.xml.parsers 包很简单,没有接口,两个工厂配两个解析器。显然解析XML是有两种方式的:DOM解析和SAX解析。本质上并没有谁好谁不好,只是实现的思想不一样罢了。给一个XML文件的例子:
<?xml version=”1.0” encoding=”UTF-8” >
<root >
<child name=”Kitty” >
A Cat
</child >
</root >

所谓DOM解析的思路是把整个树状图存入内存中,需要那个节点只需要在树上搜索就可以读到节点的属性,内容等,这样的好处是所有节点皆在内存可以反复搜索重复使用,缺点是需要消耗相应的内存空间。

自然SAX解析的思路就是为了克服DOM的缺点,以事件触发为基本思路,顺序的搜索下来,碰到了Element之前触发什么事件,碰到之后做什么动作。由 于需要自己来写触发事件的处理方案,所以需要借助另外一个自定义的Handler,处于org.xml.sax.helpers包中。它的优点当然是不用 整个包都读入内存,缺点也是只能顺序搜索,走完一遍就得重来。

大家很容易就能猜到,接触到的J2ee框架用的是哪一种,显然是 DOM。因为类似Struts,Hibernate框架配置文件毕竟是很小的一部分配置信 息,而且需要频繁搜索来读取,当然会采用DOM方式(其实SAX内部也是用DOM采用的结构来存储节点信息的)。现在无论用什么框架,还真难发现使用 SAX来解析XML的技术了,如果哪位仁兄知道,请让笔者也学习学习。

既然解析方式有了,那么就需要有解析的存储位置。不知道大家是否发现org.w3c.dom这个包是没有实现类全部都是接口的。这里笔者想说一下Java 如何对XML解析是Jdk应该考虑的事,是它的责任。而w3c组织是维护定义XML标准的组织,所以一个XML结构是怎么样的由w3c说了算,它不关心 Java如何去实现,于是乎规定了所有XML存储的结构应该遵循的规则,这就是org.w3c.dom里全部的接口目的所在。在笔者看来,简单理解接口的 概念就是实现者必须遵守的原则。

整个XML对应的结构叫Document、子元素对应的叫做Element、还有节点相关的 Node、NodeList、Text、Entity、 CharacterData、CDATASection等接口,它们都可以在XML的语法中间找到相对应的含义。由于这里不是讲解XML基本语法,就不多 介绍了。如果大家感兴趣,笔者也可以专门写一篇关于XML的语法规则帖与大家分享一下。

2. Java Swing
Swing 是一个让人又爱又恨的东西,可爱之处在于上手很容易,较AWT比起来Swing提供的界面功能更加强大,可恨之处在于编复杂的界面工作量实在是 巨大。笔者写过超过3000行的Swing界面,感觉用户体验还不是那么优秀。最近又写过超过6000行的,由于功能模块多了,整体效果还只是一般般。体 会最深的就一个字:累! 所以大家现在都陆续不怎么用Swing在真正开发的项目上了,太多界面技术可以取代它了。笔者去写也是迫于无奈组里面大家都没写过,我不入地域谁入?

尽管Swing慢慢的在被人忽略,特别是随着B/S慢慢的在淹没C/S,笔者倒是很愿意站出来为Swing正身。每一项技术的掌握绝不是为了流行时尚跟 风。真正喜欢Java的朋友们还是应该好好体会一下Swing,相信在校的很多学生也很多在学习它。很可能从Jdk 1.1、1.2走过来的很多大学老师可能是最不熟悉它的。
Swing提供了一组轻组件统称为JComponent,它们与AWT组件的最大区别是JComponent全部都是Container,而 Container的特点是里面可以装载别的组件。在Swing组件中无论是JButton、JLabel、JPanel、JList等都可以再装入任何 其他组件。好处是程序员可以对Swing组件实现“再开发”,针对特定需求构建自己的按钮、标签、画板、列表之类的特定组件。

有轻自然就有重,那么轻组件和重组件区别是?重组件表现出来的形态因操作系统不同而异,轻组件是Swing自己提供GUI,在跨平台的时候最大程度的保持一致。
那么在编程的时候要注意一些什么呢?笔者谈谈自己的几点经验:

a. 明确一个概念,只有Frame组件才可以单独显示的,也许有人会说JOptionPane里面的静态方法就实现了单独窗口出现,但追寻源代码会发现其实现 实出来的Dialog也需要依托一个Frame窗体,如果没有指定就会默认产生一个然后装载这个Dialog显示出来。

b. JFrame是由这么几部分组成:
最底下一层JRootPane,上面是glassPane (一个JPanel)和layeredPane (一个JLayeredPane),而layeredPane又由contentPane(一个JPanel)和menuBar构成。我们的组件都是加在 contentPane上,而背景图片只能加在layeredPane上面。 至于glassPane是一个透明的覆盖了contentPane的一层,在特定效果中将被利用到来记录鼠标坐标或掩饰组件。

c. 为了增强用户体验,我们会在一些按钮上添加快捷键,但Swing里面通常只能识别键盘的Alt键,要加入其他的快捷键,必须自己实现一个 ActionListener。

d. 通过setLayout(null)可以使得所有组件以setBounds()的四个参数来精确定位各自的大小、位置,但不推荐使用,因为好的编程风格不 应该在Swing代码中硬编码具体数字,所有的数字应该以常数的形式统一存在一个静态无实例资源类文件中。这个静态无实例类统一负责Swing界面的风 格,包括字体和颜色都应该包括进去。

e. 好的界面设计有一条Golden Rule: 用户不用任何手册通过少数尝试就能学会使用软件。所以尽量把按钮以菜单的形式(不管是右键菜单还是窗体自带顶部菜单)呈现给顾客,除非是频繁点击的按钮才有必要直接呈现在界面中。

其实Swing的功能是相当强大的,只是现在应用不广泛,专门去研究大概是要花不少时间的。笔者在各网站论坛浏览关于Swing的技巧文章还是比较可信 的,自己所学非常有限,各人体会对Swing各个组件的掌握就是一个实践积累的过程。笔者只用到过以上这些,所以只能谈谈部分想法,还望大家见谅!





Java 杂谈(六)


这篇是笔者打算写的J2se部分的最后一篇了,这篇结束之后,再写J2ee部分,不知道是否还合适写在这个版块?大家可以给点意见,谢谢大家对小弟这么鼓 励一路写完前六篇Java杂谈的J2se部分。最后这篇打算谈一谈Java中的RMI机制和JVM沙箱安全框架。

1. Java中的RMI机制
RMI的全称是远程方法调用,相信不少朋友都听说过,基本的思路可以用一个经典比方来解释:A计算机想要计算一个两个数的加法,但A自己做不了,于是叫另 外一台计算机B帮忙,B有计算加法的功能,A调用它就像调用这个功能是自己的一样方便。这个就叫做远程方法调用了。

远程方法调用是EJB实现的支柱,建立分布式应用的核心思想。这个很好理解,再拿上面的计算加法例子,A只知道去call计算机B的方法,自己并没有B的 那些功能,所以A计算机端就无法看到B执行这段功能的过程和代码,因为看都看不到,所以既没有机会窃取也没有机会去改动方法代码。EJB正式基于这样的思 想来完成它的任务的。当简单的加法变成复杂的数据库操作和电子商务交易应用的时候,这样的安全性和分布式应用的便利性就表现出来优势了。

好了,回到细节上,要如何实现远程方法调用呢?我希望大家学习任何技术的时候可以试着依赖自己的下意识判断,只要你的想法是合理健壮的,那么很可能实际上 它就是这么做的,毕竟真理都蕴藏在平凡的生活细节中。这样只要带着一些薄弱的Java基础来思考RMI,其实也可以想出个大概来。

a) 需要有一个服务器角色,它拥有真正的功能代码方法。例如B,它提供加法服务
b) 如果想远程使用B的功能,需要知道B的IP地址
c) 如果想远程使用B的功能,还需要知道B中那个特定服务的名字

我们很自然可以想到这些,虽然不完善,但已经很接近正确的做法了。实际上 RMI要得以实现还得意于Java一个很重要的特性,就是Java反射机制。我们需要知道服务的名字,但又必须隐藏实现的代码,如何去做呢?答案就是:接口!
举个例子:
public interface Person(){
public void sayHello();
}

Public class PersonImplA implements Person{
public PersonImplA(){}

public void sayHello(){ System.out.println(“Hello!”);}
}

Public class PersonImplB implements Person{
public PersonImplB(){}

public void sayHello(){ System.out.println(“Nice to meet you!”);}
}

客户端:Person p = Naming.lookup(“PersonService”);
p.sayHello();

就这几段代码就包含了几乎所有的实现技术,大家相信么?客户端请求一个say hello服务,服务器运行时接到这个请求,利用Java反射机制的Class.newInstance()返回一个对象,但客户端不知道服务器返回的是 ImplA还是ImplB,它接受用的参数签名是Person,它知道实现了Person接口的对象一定有sayHello()方法,这就意味着客户端并 不知道服务器真正如何去实现的,但它通过了解Person接口明确了它要用的服务方法名字叫做sayHello()。

如此类推,服务器只需要暴露自己的接口出来供客户端,所有客户端就可以自己选择需要的服务。这就像餐馆只要拿出自己的菜单出来让客户选择,就可以在后台厨房一道道的按需做出来,它怎么做的通常是不让客户知道的!(祖传菜谱吧,^_^)

最后一点是我调用lookup,查找一个叫 PersonService名字的对象,服务器只要看到这个名字,在自己的目录(相当于电话簿)中找到对应的对 象名字提供服务就可以了,这个目录就叫做JNDI (Java命名与目录接口),相信大家也听过的。

有兴趣的朋友不妨自己做个RMI的应用,很多前辈的博客中有简单的例子。提示一下利用Jdk的bin目录中rmi.exe和 rmiregistry.exe两个命令就可以自己建起一个服务器,提供远程服务。因为例子很容易找,我就不自己举例子了!

2. JVM沙箱&框架
RMI罗唆得太多了,实在是尽力想把它说清楚,希望对大家有帮助。最后的最后,给大家简单讲一下JVM框架,我们叫做 Java沙箱。Java沙箱的基本组件如下:
a) 类装载器结构
b) class文件检验器
c) 内置于Java虚拟机的安全特性
d) 安全管理器及Java API

其中类装载器在3个方面对Java沙箱起作用:
a. 它防止恶意代码去干涉善意的代码
b. 它守护了被信任的类库边界
c. 它将代码归入保护域,确定了代码可以进行哪些操作

虚拟机为不同的类加载器载入的类提供不同的命名空间,命名空间由一系列唯一的名称组成,每一个被装载的类将有一个名字,这个命名空间是由Java虚拟机为每一个类装载器维护的,它们互相之间甚至不可见。

我们常说的包(package)是在Java虚拟机第2版的规范第一次出现,正确定义是由同一个类装载器装载的、属于同一个包、多个类型的集合。类装载器 采用的机制是双亲委派模式。具体的加载器框架我在Java杂谈(一)中已经解释过了,当时说最外层的加载器是AppClassLoader,其实算上网络 层的话AppClassLoader也可以作为parent,还有更外层的加载器URLClassLoader。为了防止恶意攻击由URL加载进来的类文 件我们当然需要分不同的访问命名空间,并且制定最安全的加载次序,简单来说就是两点:

a. 从最内层JVM自带类加载器开始加载,外层恶意同名类得不到先加载而无法使用
b. 由于严格通过包来区分了访问域,外层恶意的类通过内置代码也无法获得权限访问到内层类,破坏代码就自然无法生效。

附:关于Java的平台无关性,有一个例子可以很明显的说明这个特性:
一般来说,C或C++中的int占位宽度是根据目标平台的字长来决定的,这就意味着针对不同的平台编译同一个C++程序在运行时会有不同的行为。然而对于 Java中的int都是32位的二进制补码标识的有符号整数,而float都是遵守IEEE 754浮点标准的32位浮点数。

PS: 这个小弟最近也没时间继续研究下去了,只是想抛砖引玉的提供给大家一个初步认识JVM的印象。有机会了解一下JVM的内部结构对今后做Java开发是很有好处的。





Java杂谈(七)--接口& 组件、容器

终于又静下来继续写这个主题的续篇,前六篇主要讲了一些J2se方面的经验和感受, 眼下Java应用范围已经被J2ee占据了相当大的一块领域,有些人甚至声称Java被J2ee所取代了。不知道大家如何来理解所谓的J2ee (Java2 Enterprise Edition),也就是Java企业级应用?

笔者的观点是,技术的发展是顺应世界变化的趋势的,从C/S过渡到B/S模式,从客户端的角度考虑企业级应用或者说电子商务领域不在关心客户端维护问题, 这个任务已经交给了任何一台PC都会有的浏览器去维护;从服务器端的角度考虑,以往C/S中的TCP/IP协议实现载体ServerSocket被Web Server Container所取代,例如大家都很熟悉的Tomcat、JBoss、WebLogic等等。总之一切的转变都是为了使得Java技术能更好的为人类 生产生活所服务。

有人会问,直接去学J2ee跳过J2se行否?笔者是肯定不赞成的,实际上确实有人走这条路,但笔者自身体会是正是由于J2se的基础很牢固,才会导致在J2ee学习的道路上顺风顺水,知识点上不会有什么迷惑的地方。举个简单的例子吧:

笔者曾经跟大学同学讨论下面这两种写法的区别:
ArrayList list = new ArrayList(); //笔者不说反对,但至少不赞成
List list = new ArrayList(); //笔者支持
曾经笔者跟同学争论了几个小时,他非说第一种写法更科学,第二种完全没有必要。我无法完全说服他,但笔者认为良好的习惯和意识是任何时候都应该针对接口编程,以达到解耦合和可扩展性的目的。下面就以接口开始进入J2ee的世界吧:

1. J2ee与接口

每一个版本的J2ee都对应着一个确定版本的JDK,J2ee1.4对应Jdk1.4,现在比较新的是JDK5.0,自然也会有J2EE 5.0。其实笔者一直在用的是J2EE1.4,不过没什么关系,大家可以下任何一个版本的J2ee api来稍微浏览一下。笔者想先声明一个概念,J2ee也是源自Java,所以底层的操作依然调用到很多J2se的库,所以才建议大家先牢牢掌握J2se 的主流技术。

J2ee api有一个特点,大家比较熟悉的几个包java.jms、javax.servlet.http、javax.ejb等都以interface居多,实 现类较少。其实大家真正在用的时候百分之六十以上都在反复的查着javax.servlet.http这个包下面几个实现类的api函数,其他的包很少问 津。笔者建议在学习一种技术之前,对整体的框架有一个了解是很有必要的,J2ee旨在通过interface的声明来规范实现的行为,任何第三方的厂商想 要提供自己品牌的实现前提也是遵循这些接口定义的规则。如果在从前J2se学习的道路上对接口的理解很好的话,这里的体会将是非常深刻的,举个简单的例 子:

public interface Mp3{
public void play();
public void record();
public void stop();
}

如果我定义这个简单的接口,发布出去,规定任何第三方的公司想推出自己的名字为Mp3的产品都必须实现这个接口,也就是至少提供接口中方法的具体实现。这 个意义已经远远不止是面向对象的多态了,只有厂商遵循J2ee的接口定义,世界上的J2ee程序员才能针对统一的接口进行程序设计,最终不用改变代码只是 因为使用了不同厂商的实现类而有不同的特性罢了,本质上说,无论哪一种厂商实现都完成了职责范围内的工作。这个就是笔者想一直强调的,针对接口编程的思 想。

接口到底有什么好处呢?我们这样设想,现在有AppleMp3、SonyMp3、SamsungMp3都实现了这个Mp3的接口,于是都有了play、 record、stop这三个功能。我们将Mp3产品座位一个组件的时候就不需要知道它的具体实现,只要看到接口定义知道这个对象有3个功能就可以使用 了。那么类似下面这样的业务就完全可以在任何时间从3个品牌扩展到任意个品牌,开个玩笑的说,项目经理高高在上的写完10个接口里的方法声明,然后就丢给 手下的程序员去写里面的细节,由于接口已经统一(即每个方法传入和传出的格式已经统一),经理只需关注全局的业务就可以天天端杯咖啡走来走去了,^_^:
public Mp3 create();
public void copy(Mp3 mp3);
public Mp3 getMp3();

最后用一个简单的例子说明接口:一个5号电池的手电筒,可以装入任何牌子的5号电池,只要它符合5号电池的规范,装入之后任何看不到是什么牌子,只能感受 到手电筒在完成它的功能。那么生产手电筒的厂商和生产5号电池的厂商就可以完全解除依赖关系,可以各自自由开发自己的产品,因为它们都遵守5号电池应有的 形状、正负极位置等约定。这下大家能对接口多一点体会了么?

2. 组件和容器
针对接口是笔者特意强调的J2ee学习之路必备的思想,另外一个就是比较常规的组件和容器的概念了。很多教材和专业网站都说J2EE的核心是一组规范与指 南,强调J2ee的核心概念就是组件+容器,这确实是无可厚非的。随着越来越多的J2ee框架出现,相应的每种框架都一般有与之对应的容器。

容器,是用来管理组件行为的一个集合工具,组件的行为包括与外部环境的交互、组件的生命周期、组件之间的合作依赖关系等等。J2ee包含的容器种类大约有 Web容器、Application Client容器、EJB容器、Applet客户端容器等。但在笔者看来,现在容器的概念变得有点模糊了,大家耳熟能详是那些功能强大的开源框架,比如 Hibernate、Struts2、Spring、JSF等,其中Hibernate就基于JDBC的基础封装了对事务和会话的管理,大大方便了对数据 库操作的繁琐代码,从这个意义上来说它已经接近容器的概念了,EJB的实体Bean也逐渐被以Hibernate为代表的持久化框架所取代。

组件,本意是指可以重用的代码单元,一般代表着一个或者一组可以独立出来的功能模块,在J2ee中组件的种类有很多种,比较常见的是EJB组件、DAO组 件、客户端组件或者应用程序组件等,它们有个共同特点是分别会打包成.war,.jar,.jar,.ear,每个组件由特定格式的xml描述符文件进行 描述,而且服务器端的组件都需要被部署到应用服务器上面才能够被使用。

稍微理解完组件和容器,还有一个重要的概念就是分层模型,最著名的当然是MVC三层模型。在一个大的工程或项目中,为了让前台和后台各个模块的编程人员能 够同时进行工作提高开发效率,最重要的就是实现层与层之间的耦合关系,许多分层模型的宗旨和开源框架所追求的也就是这样的效果。在笔者看来,一个完整的 Web项目大概有以下几个层次:

a) 表示层(Jsp、Html、Javascript、Ajax、Flash等等技术对其支持)
b) 控制层(Struts、JSF、WebWork等等框架在基于Servlet的基础上支持,负责把具体的请求数据(有时卸载重新装载)导向适合处理它的模型层对象)
c) 模型层(笔者认为目前最好的框架是Spring,实质就是处理表示层经由控制层转发过来的数据,包含着大量的业务逻辑)
d) 数据层(Hibernate、JDBC、EJB等,由模型层处理完了持久化到数据库中)

当然,这仅仅是笔者个人的观点,仅仅是供大家学习做一个参考,如果要实现这些层之间的完全分离,那么一个大的工程,可以仅仅通过增加人手就来完成任务。虽 然《人月神话》中已经很明确的阐述了增加人手并不能是效率增加,很大程度上是因为彼此做的工作有顺序上的依赖关系或者说难度和工作量上的巨大差距。当然理 想状态在真实世界中是不可能达到的,但我们永远应该朝着这个方向去不断努力。最开始所提倡的针对接口来编程,哪怕是小小的细节,写一条List list= = new ArrayList()语句也能体现着处处皆使用接口的思想在里面。Anyway,这只是个开篇,笔者会就自己用过的J2ee技术和框架再细化谈一些经验.



Java杂谈(八)--Servlet/Jsp


终于正式进入J2ee的细节部分了,首当其冲的当然是Servlet和Jsp了,上篇曾经提到过J2ee只是一个规范和指南,定义了一组必须要遵循的接 口,核心概念是组件和容器。曾经有的人问笔者Servlet的Class文件是哪里来的?他认为是J2ee官方提供的,我举了一个简单的反例:稍微检查了 一下Tomcat5.0里面的Servlet.jar文件和JBoss里面的Servlet.jar文件大小,很明显是不一样的,至少已经说明了它们不是 源自同根的吧。其实Servlet是由容器根据J2ee的接口定义自己来实现的,实现的方式当然可以不同,只要都遵守J2ee规范和指南。

上述只是一个常见的误区罢了,告诉我们要编译运行Servlet,是要依赖于实现它的容器的,不然连jar文件都没有,编译都无法进行。那么Jsp呢? Java Server Page的简称,是为了开发动态网页而诞生的技术,其本质也是Jsp,在编写完毕之后会在容器启动时经过编译成对应的Servlet。只是我们利用Jsp 的很多新特性,可以更加专注于前后台的分离,早期Jsp做前台是满流行的,毕竟里面支持Html代码,这让前台美工人员可以更有效率的去完成自己的工作。 然后Jsp将请求转发到后台的Servlet,由Servlet处理业务逻辑,再转发回另外一个Jsp在前台显示出来。这似乎已经成为一种常用的模式,最 初笔者学习J2ee的时候,大量时间也在编写这样的代码。

尽管现在做前台的技术越来越多,例如Flash、Ajax等,已经有很多人不再认为Jsp重要了。笔者觉得Jsp带来的不仅仅是前后端分离的设计理念,它 的另外一项技术成就了我们今天用的很多框架,那就是Tag标签技术。所以与其说是在学习Jsp,不如更清醒的告诉自己在不断的理解Tag标签的意义和本 质。

1. Servlet以及Jsp的生命周期
Servlet是Jsp的实质,尽管容器对它们的处理有所区别。 Servlet有init()方法初始化,service()方法进行Web服务, destroy()方法进行销毁,从生到灭都由容器来掌握,所以这些方法除非你想自己来实现Servlet,否则是很少会接触到的。正是由于很少接触,才 容易被广大初学者所忽略,希望大家至少记住Servlet生命周期方法都是回调方法。回调这个概念简单来说就是把自己注入另外一个类中,由它来调用你的方 法,所谓的另外一个类就是Web容器,它只认识接口和接口的方法,注入进来的是怎样的对象不管,它只会根据所需调用这个对象在接口定义存在的那些方法。由 容器来调用的Servlet对象的初始化、服务和销毁方法,所以叫做回调。这个概念对学习其他J2ee技术相当关键!

那么Jsp呢?本事上是Servlet,还是有些区别的,它的生命周期是这样的:
a) 一个客户端的Request到达服务器 ->
b) 判断是否第一次调用 -> 是的话编译Jsp成Servlet
c) 否的话再判断此Jsp是否有改变 -> 是的话也重新编译Jsp成Servlet
d) 已经编译最近版本的Servlet装载所需的其他Class
e) 发布Servlet,即调用它的Service()方法

所以Jsp号称的是第一次Load缓慢,以后都会很快的运行。从它的生命的周期确实不难看出来这个特点,客户端的操作很少会改变Jsp的源码,所以它不需 要编译第二次就一直可以为客户端提供服务。这里稍微解释一下Http的无状态性,因为发现很多人误解,Http的无状态性是指每次一张页面显示出来了,与 服务器的连接其实就已经断开了,当再次有提交动作的时候,才会再次与服务器进行连接请求提供服务。当然还有现在比较流行的是Ajax与服务器异步通过 xml交互的技术,在做前台的领域潜力巨大,笔者不是Ajax的高手,这里无法为大家解释。

2. Tag标签的本质
笔者之前说了,Jsp本身初衷是使得Web应用前后台的开发可以脱离耦合分开有效的进行,可惜这个理念的贡献反倒不如它带来的Tag技术对J2ee的贡献 要大。也许已经有很多人开始使用Tag技术了却并不了解它。所以才建议大家在学习J2ee开始的时候一定要认真学习Jsp,其实最重要的就是明白标签的本 质。

Html标签我们都很熟悉了,有 <html> 、 <head> 、 <body> 、 <title> ,Jsp带来的Tag标签遵循同样的格式,或者说更严格的Xml格式规范,例如 <jsp:include> 、 <jsp:useBean> 、 <c:if> 、 <c:forEach> 等等。它们没有什么神秘的地方,就其源头也还是Java Class而已,Tag标签的实质也就是一段Java代码,或者说一个Class文件。当配置文件设置好去哪里寻找这些Class的路径后,容器负责将页 面中存在的标签对应到相应的Class上,执行那段特定的Java代码,如此而已。
说得明白一点的话还是举几个简单的例子说明一下吧:

<jsp:include> 去哪里找执行什么class呢?首先这是个jsp类库的标签,当然要去jsp类库寻找相应的class了,同样它也是由Web容器来提供,例如 Tomcat就应该去安装目录的lib文件夹下面的jsp-api.jar里面找,有兴趣的可以去找一找啊!

<c:forEach> 又去哪里找呢?这个是由Jsp2.0版本推荐的和核心标记库的内容,例如 <c:if> 就对应在页面中做if判断的功能的一断Java代码。它的class文件在jstl.jar这个类库里面,往往还需要和一个standard.jar类库 一起导入,放在具体Web项目的WEB-INF的lib目录下面就可以使用了。

顺便罗唆一句,Web Project的目录结构是相对固定的,因为容器会按照固定的路径去寻找它需要的配置文件和资源,这个任何一本J2ee入门书上都有,这里就不介绍了。了 解Tag的本质还要了解它的工作原理,所以大家去J2ee的API里找到并研究这个包:javax.servlet.jsp.tagext。它有一些接 口,和一些实现类,专门用语开发Tag,只有自己亲自写出几个不同功能的标签,才算是真正理解了标签的原理。别忘记了自己开发的标签要自己去完成配置文 件,容器只是集成了去哪里寻找jsp标签对应class的路径,自己写的标签库当然要告诉容器去哪里找啦。

说了这么多,我们为什么要用标签呢?完全在Jsp里面来个 <% %> 就可以在里面任意写Java代码了,但是长期实践发现页面代码统一都是与html同风格的标记语言更加有助于美工人员进行开发前台,它不需要懂Java, 只要Java程序员给个列表告诉美工什么标签可以完成什么逻辑功能,他就可以专注于美工,也算是进一步隔离了前后台的工作吧!

3. 成就Web框架
框架是什么?曾经看过这样的定义:与模式类似,框架也是解决特定问题的可重用方法,框架是一个描述性的构建块和服务集合,开发人员可以用来达成某个目标。 一般来说,框架提供了解决某类问题的基础设施,是用来创建解决方案的工具,而不是问题的解决方案。

正是由于 Tag的出现,成就了以后出现的那么多Web框架,它们都开发了自己成熟实用的一套标签,然后由特定的Xml文件来配置加载信息,力图使得Web 应用的开发变得更加高效。下面这些标签相应对很多人来说相当熟悉了:
<html:password>
<logic:equal>
<bean:write>
<f:view>
<h:form>
<h:message>

它们分别来自Struts和JSF框架,最强大的功能在于控制转发,就是MVC三层模型中间完成控制器的工作。Struts-1实际上并未做到真正的三层 隔离,这一点在Struts-2上得到了很大的改进。而Jsf向来以比较完善合理的标签库受到人们推崇。

今天就大概讲这么多吧,再次需要强调的是Servlet/Jsp是学习J2ee必经之路,也是最基础的知识,希望大家给与足够的重视!

- 作者: 流星*流浪 2010年06月30日, 星期三 11:24  回复(0) |  引用(0) 加入博采

选择jsp而不是servlet作为BS前台主流方案是JAVA的战略性方向错误(转)

作者: 2007-11-21 出处:pcdog.com


 原文
许多人认为JSP是JAVA向微软ASP挑战的成功产品,到今天,围绕着JSP方案发展出了TAG/EL等技术,JSP作为JAVA的BS前台界面方案看来已经是无法逆转。但在我看来,JAVA选择JSP这种表达形式,恰恰是它最失败的地方,是对ASP的一种拙劣的模仿,它本来可以做得更好的,甚至可能据此让微软彻底退出服务器领域,但最终,却可能成为足以令JAVA最终失败的重大战略方向性错误。
JAVA到今天仍具有微软所有语言所不具备的优点,就以C#而言,只不过是形似而神不似。java最根本的地方不在于它的OOP,不在于它是C++的语法优化,这些都不重要,而在于它的虚拟机机制,使它成为最佳的跨平台的服务器语言;而C#无论多么语法相似,都无法改变这样一个现实:它只是微软CLI中的语言中的一种,它再成功,也充其量是取代了在windows运行的JAVA;某种程度上,C#是一种注定没有必要存在的语言,在CLI中,只需要一种就够了,象VB.net。
JAVA到软件世界带来的最大的影响是令软件真正出现了分层开发,出现真正的三层结构。尽管有些家伙吹嘘他们的软件是N层结构(真不要脸!),其实究其实则,都只不过是传统的CS式的两层结构的变种,不能把函数每加一个就称为一层噢!JAVA出现体现了软件的创造性思维,但JAVA犯的错误最大的地方就在于他毫无创造性地模仿了ASP,并且,竟然把JSP作为中间件的主要访问手段加以发展。这是一个重大的失误,也许,如果有一天JAVA死掉的话,就死在这个失误上面。

ASP的是模仿最早的livewire式的JSP和cofusion,livewire也是本人最早在项目中接触的JSP,与后来的java JSP毫无相同之处。这种netscape公司的"JSP"与ASP有共同的特点,就是完全没有面向对象的特性,是纯粹的解析性脚本语言,后来的PHP也是这样的产品,PHP本质上可以看作是Cscript。这些语言的出现原意是要满足那些不懂计算机语言,从HTML美工转行的半吊子程序员的能力需要,美其名为让美工可以写动态网页程度。不过,这个开发假想成了互联网出现以来最大的笑话之一,美工式的程序员始终不能写真正的动态网页,反而让真正的程序员去做了美工的活了,最典型的产品就是struts。

java与此完全不一样,它是一种需要编译的语言,具有完全的面向对象的能力;所以,它如果能够发挥这种特点,打败其他的几种脚本是毫无困难的。结果,SUN的天才的笨蛋们(我觉得这种称呼最客观,既是天才,也是笨蛋),选择了用坦克车去和捷达争夺出租车市场,做起了JSP。而我认为, servlet才应该是它最佳的发展方向。今天,我已经忘记了当初是什么原因令我放弃了JSP而使用servlet作为项目解决方案的;只记得后来完全放弃JSP是由于兼顾两种形式在传递变量和地址时非常复杂,还不如光用一种。今天当我以为我当初错了,而标签/EL等技术的出现会令JSP不同往昔而再次在重大项目中选用JSP时,(其中一个原因也是那个笑话的延续,希望不懂JAVA的维护人员可以在交货后自已维护系统前台),随着项目的进入,我记起了当初放弃JSP的原因:一个是当时的代码管理非常困难,JSP系统基本上与其他PPP类程序一样是不可维护的;另一个原因就是JSP无法基于模板进行维护。前者由于tag等的出现而缓解了,(从前也可以使用include sevlet的办法达到接近的效果),后者仍然一样,关键就在于不能复盖已有的代码。而在servlet中,重载一个方法是很容易的。

许多人以为servlet难写,在doget/dopost/init/等中需要塞进那么多的方法;其实,这是一种误解,这种误解是没有认识到 servlet本质上是一种java class,可以轻易公有私有的方法,也可以继承,可以重载等等。因此,在servlet中很容易就可以形成一个全系统追随的模板,一改一起改。相反,以为写servlet就是在doget中用out.println输出的,是把写JSP的理解带进了servlet;JSP编译成servlet后,也正是这个样子的。所以它不存在继承的价值。

那么对于复杂的HTML界面如何达到与JSP同样的简洁嵌入呢?其实很简单。我当时的解决方案是使用${xxx}标记预置默认的方式,然后把这些带有大量HTML代码的标记的文件存在某个目录;在sverlt初始化时通过文件字节流读入,使用一个字符串分析的组件(今天还在用呢)把标记转化为相应的实际动态变量。这恰恰就是今天的号称最先进的EL 表达式语言的解决方法。真的,我一点都不觉得有写servlet比一般的网页程序难在什么地方。某种程度上,我觉得自已做了一个JSP解释引擎出来了。

那么这种土产的JSP和真正的JSP有什么区别呢?最大的区别就在于它是把JSPp仅仅看成是为servlet服务的HTML代码库,而不是 serlvet为JSP服务。换言之,这里的JSP是类似于今天的tile/JSPfragment的东西。一个小小的差别,带来的效果完全不一样,因为它可以完整的发挥出java面向对象和继承的特点;甚至可以象PB那样将整个项目前台作为一个类"继承"出来,再扩展和重整需要修改的地方。而这种能力,是那些"P"语言永远不可能做到的。但是,SUN偏偏跟在微软后面去拙劣地模仿JSP。

不妨回顾一下在BS前台最常见到的架构是什么? 是一个大的网站上大部分版面具有类似的框架布局,每个分栏中只有其中某处不一样。JSP可以很容易地共用其中一样的部分;但对于其中不一样的部分就无能为力。由于JSP不能形成顶级模板,而每一个大分栏中部内容不一样,所以唯一的办法就是每一个大分栏拷贝出一个JSP文件来获得一个顶级框架模板;显然,这意味着对每一个文件的相同框架部分进行维护;项目越大,这样日后更改的工作量越大。这时侯真的有点怀念servlet的功能了,对这种需求,只需要写好一个 servlet,其他的servlet继承它,然后重载它的中央内容方法,就搞惦了。当前要达到类似要求的唯一办法,似乎只能是在顶级页面中使用if-else/equal-notequal判断里include不同的内容文件。舍此,还有什么好办法吗?

JAVA的BS前台的正确的思路应该是以一个可以订制继承方法的servlet为核心,然后可以分解一些象JSP这样的文件,类似今天的JSP中技术都可以用到这些JSP文件中。也就是说,核心应该是一个可以定制的servlet,而不是提供一个工具,把JSP编译成不可变的servlet。顶级文件应该是servlet,而不应该是JSP,这就是我所说的。
我一个人是不可能与整个JSP社区作对的,不可能一个人完成SUN几千个开发工程师的工作,既然SUN的某个天才大笨蛋选择了JSP作为JAVA在 BS的表达主流,到今天,如果我仍使用JAVA作为前台界面程序的话,最好就是随大流标准,而在几年前,JSP完全不是标准,情况是不一样了。不过,从今天实际的体验来说,我仍然强烈地觉得,SUN犯了一个严重的方法性错误。更为遗憾的是,SUN没有做到的事情,让微软在ASP.net中有所体现了,所幸微软的东西从来不打算跨平台移植的,所以SUN还有一点机会。

==》强大的后台和虚荣臃肿的前台,天才和傻蛋的杰作啊!尝试了extjs,flex,目前仍然没有找不到和java搭配默契的前台,郁闷啊。

- 作者: 流星*流浪 2010年06月30日, 星期三 10:37  回复(0) |  引用(0) 加入博采

【转】Flex及AIR开发资源下载(含FLEX 3正式版)
客户端

Flex Builder 2 with Charting
官方下载:http://www.adobe.com/go/tryflex  (需要有Adobe帐号,登录后选择你需要的版本进行下载)
本地下载:http://211.155.21.54:83/software/FLXB_2.0_Win_WWE.exe
说明:这是FLEX的主要开发工具,一般性FLEX的应用开发,下载这个文件并安装就OK了。一般来说,在Adobe网站上下载的版本是最新的版 本,不需要再安装下面的Flex Builder相关补丁的了(本地下载种的版本为Flex Builder 2.01需要再打上hotfix 1,flash cs3的兼容补丁和hotfix 2)。如果是普通的新开发者,建议下载这个就足够了。


Adobe Flex Builder 3_win.exe

http://download.macromedia.com/pub/flex/flex_builder/FB3_win.exe
注册序列号:1377-4167-5844-4698-0048-5821

Flex Builder 3 BETA
官方下载:http://www.adobe.com/cfusion/entitlement/index.cfm?e=labs_adobeflexbuilder3  (需要有Adobe帐号,登录后选择你需要的版本进行下载)
官方介绍:http://labs.adobe.com/technologies/flex/flexbuilder3/
本地下载:http://211.155.21.54:83/software/flexbuilder3_b1_win_sa_061107.exe
说明:FLE BUILDER 3 BETA版,含AIR的开发环境,可以和FLEX 2共存(提示:你可以用FLEX BUILDER 2的注册码来注册)

Flex SDK
官方下载:http://www.adobe.com/go/tryflex  (需要有Adobe帐号,登录后选择你需要的版本进行下载)
本地下载:http://211.155.21.54:83/software/flex_sdk_2.zip
说明:Flex SDK,带了Flex FrameworkFlex compiler,假如你喜欢用Ecllipse以外的IDEMXMLAS3的话,可以只下载这个SDK

Flex Charting 2
官方下载:http://www.adobe.com/go/tryflex  (需要有Adobe帐号,登录后选择你需要的版本进行下载)
本地下载:http://211.155.21.54:83/software/FCC2_MLP_WWE.zip
说明:Flex 官方的图表组件,Flex Builder已捆绑了这个组件。假如是单独下载Flex SDK的话,又想做图表相关的开发,则可单独下载这个


AIR SDK (BETA)
(原名APOLLO
官方下载:http://download.macromedia.com/pub/labs/air/air_b1_win_sdk_061107.zip 
说明:假如没装Flex Builder 3 BETA,而又需要开发AIR应用的话,则可下载这个。

AIR Runtime (alpha 1)
官方下足载:http://download.macromedia.com/pub/labs/air/air_b1_win_061107.exe
本地下载:http://211.155.21.54:83/software/air_b1_win_061107.exe
说明:AIR运行环境。安装了这个后,则可运行AIR应用。

FLASH CS3 Professional
官方下载:https://www.adobe.com/cfusion/tdrc/index.cfm?product=flash (需要有Adobe帐号,登录后选择你需要的版本进行下载)
本地下载:http://211.155.21.54:83/software/f9.zip
说明:这个不用说了吧


服务器端

LiveCycle Data Services ES (
FDS)
官方下载:https://www.adobe.com/cfusion/tdrc/index.cfm?product=livecycle%5Fdataservices  (需要有Adobe帐号,登录后选择你需要的版本进行下载)
说明:Flex的配套服务器端程序。使用他,可以给FLEX提供强的数据传输功能,包括AMF3格式的数据传输,数据PUSH,数据翻页等等。但一般性的Flex开发可以不选择下载并安装这个。

Flex Module for Apache and IIS
BETA版)
官方下载:http://download.macromedia.com/pub/labs/flex_mod_apache/flex_mod_full_win_050107.exe
官方介绍:http://labs.adobe.com/wiki/index.php/Flex_Module_for_Apache_and_IIS
说明:安装这个可以使你的服务器具有动态解析MXML的能力


升级包

Flex 2.0.1
升级包
官方下载:http://download.macromedia.com/pub/flex/flex_builder/flexbuilder2_201updater.exe
本地下载:http://211.155.21.54:83/software/flexbuilder2_201updater.exe

Flex 2.0.1 SDK HOTFIX 1
详情及安装说明请看:http://www.adobe.com/cfusion/knowledgebase/index.cfm?id=kb401224
官方下载:http://www.adobe.com/support/flex/ts/documents/kb401224/flex2sdk_hf1_159086.zip

Flex 2.0.1 patch for Flash CS3 Professional compatibility 
详情及安装说明请看:http://www.adobe.com/cfusion/knowledgebase/index.cfm?id=kb401493
官方下载:http://www.adobe.com/support/flex/ts/documents/kb401493/flex_201_patch_FINAL.zip

Flex Component Kit for Flash CS3 
详情及安装说明请看:http://labs.adobe.com/wiki/index.php/Flex_Component_Kit_for_Flash_CS3
官方下载:http://download.macromedia.com/pub/labs/flex_flash_integrationkit/flex_component_kit_042307.mxp
说明:安装在FLASH CS3上的一个插件,安装便可以输出在FLASH制作的,可供FLEX使用的组件。

Flex 2.0.1 Hotfix 2 
详情及安装说明请看:http://www.adobe.com/cfusion/knowledgebase/index.cfm?id=kb401825
官方下载:http://www.adobe.com/support/flex/ts/documents/flex2_hf2/FB2_Hotfix2_Installer_Win.exe
说明:2007-5-23发布的Flex Builder Hotfix

-----------------------------------------------------------------------

文档和书籍

FLEX
文档全集
http://211.155.21.54:83/e-book/flex201_documentation.rar

APOLLO
文档包
http://211.155.21.54:83/software/apollo_docs_alpha1_031907.zip

AS3 cookbook
http://211.155.21.54:83/e-book/Actionscript 3.0 Cookbook Solutions For Adobe Flash Platform And Adobe Flex Application Developers.pdf

Advanced.ActionScript.3.with.Design.Patterns
http://211.155.21.54:83/e-book/Advanced ActionScript 3 with Design Patterns - 2006 (Adobe).chm

Adobe.Press.Adobe.Flex.2.Training.from.the.Source
(从flex2.org收集)
http://211.155.21.54:83/e-book/Adobe.Press.Adobe.Flex.2.Training.from.the.Source.Oct.2006_%5BFlex2.org%5D.chm

apollo for flex pocketguide
http://211.155.21.54:83/e-book/apollo_for_flex_pocketguide_031907.pdf

Programming Actionscript 3.0
http://211.155.21.54:83/e-book/Programming Actionscript 3.0.pdf

The.Essential.Guide.to.Flex.2.with.ActionScript.3.0
http://211.155.21.54:83/e-book/The.Essential.Guide.to.Flex.2.with.ActionScript.3.0.pdf

- 作者: 流星*流浪 2010年04月9日, 星期五 15:28  回复(0) |  引用(0) 加入博采

Google退出中国(转)


Google正式宣布,Google不想继续对Google.cn的搜索结果进行审查,并将在接下来的几周内与中国政府进行探讨,如何让Google.cn在不进行审查过滤的前提下合法地运营,如果做不到这些,Google将考虑关闭Google.cn,甚至是它的所有中国办公室。

对Google来说,这是个艰难的决定。对我来说,这是个痛苦的选择。我的大部分在线生活,依托于Google。我使用Google搜索,用 Gmail收发邮件,用Google Reader阅读我订阅的大量内容,用Google Docs处理所有办公文档,用Picasa处理照片并进行地理标注……所有这一切,都没有任何可替代的第三方工具。且不说还有大量的中国企业,比如阿里巴 巴,需要依赖Google的搜索和广告进行全球营销。

我也知道,在过去四年中,Google一直都存在退出中国的可能,开复像个救火队员一样穿梭斡旋过很多次。今天的结果,大概是Google在对中国 业务做了全面评估之后,做出的一个无可奈何的决定。对中国政府来说,既然你需要中国这个市场,你就得听我的招呼。但对Google来说,它更愿意玩一个规 则透明的游戏。况且,过去四年动辄得咎的现状,也让Google明白,预期的商业利益,将始终受到严格的限制。而黑箱式的搜索结果屏蔽和妥协,却让它不得 不承担越来越大的道义压力。

对我来说,Google是全球最好的知识管理工具和生产力工具,但中国的监管当局并不这么看,意识形态是他们更加关心的东西。我相信,Google 的这份摊牌声明,也会被看做一种意识形态的花招,招致中国政府更大的愤怒。在未来的岁月中,我可能不得不费更大的力气去访问那些我已经无法离开的 Google工具,这是我必须承受的后果。

YouTube、Facebook、Twitter、Blogger、WordPress、Google……全世界最好的网站和服务,一个个远离中国,可能是我们这个时代作为中国人最大的悲哀。

李彦宏曾说,5 年后,大家可能很难看到Google了。我相信,他并不希望看到Google以今天的方式退出中国。与优秀选手同场竞技是一件幸事,尤其是在技术驱动的互 联网市场上。缺少高手的中国互联网,大概只能算是一个国域网,竞争可能会更加黑箱,更加上不得台面。有志向、有追求的中国网民,现在必须更加勤奋地苦练翻 墙术,以良好的状态迎接中国互联网的铁屋时代。


==》YouTube、Facebook、Twitter、Blogger、WordPress、Google……全世界最好的网站和服务,一个个远离中国,可能是我们这个时代作为中国人最大的悲哀。

==》能给互联网一个言论自由的空间吗?黑箱操作只能代表权力部门的无能。

==》与优秀选手同场竞技是一件幸事,尤其是在技术驱动的互 联网市场上。缺少高手的中国互联网,大概只能算是一个国域网,竞争可能会更加黑箱,更加上不得台面。

==》与人同台竞技,难道不敢光明正大吗?竞争对手就是自己最挑剔的朋友,没有这个朋友,多少是种遗憾.没有google的竞争,baidu这类的国产搜索引擎,必多得兽,后必无兽。永远也难以上的了台面了。


- 作者: 流星*流浪 2010年03月30日, 星期二 12:38  回复(0) |  引用(0) 加入博采