ZT文萃

本博不原创,转帖自己感兴趣那些事人物,什么入眼贴什么,随心所欲。
posts - 93, comments - 5, trackbacks - 0, articles - 0
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

2014年1月10日

移动互联网,就是将移动通信和互联网二者结合起来,成为一体。
4G时代的开启以及移动终端设备的凸显必将为移动互联网的发展注入巨大的能量,2014年移动互联网产业必将带来前所未有的飞跃。

度娘百科详解:http://baike.baidu.com/view/1168245.htm

 


云计算(英语:Cloud Computing),是一种基于互联网的计算方式,通过这种方式,共享的软硬件资源和信息可以按需求提供给计算机和其他设备。

云 计算是继1980年代大型计算机到客户端-服务器的大转变之后的又一种巨变。用户不再需要了解“云”中基础设施的细节,不必具有相应的专业知识,也无需直 接进行控制。[1]云计算描述了一种基于互联网的新的IT服务增加、使用和交付模式,通常涉及通过互联网来提供动态易扩展而且经常是虚拟化的资源。

度娘百科详解:http://baike.baidu.com/view/1316082.htm?fr=aladdin
 


大 数据(英语:Big data),或称巨量数据、海量数据、大数据,指的是所涉及的数据量规模巨大到无法通过人工,在合理时间内达到截取、管理、处理、并整理成为人类所能解读 的信息。在总数据量相同的情况下,与个别分析独立的小型数据集(data set)相比,将各个小型数据集合并后进行分析可得出许多额外的信息和数据关系性,可用来察觉商业趋势、判定研究质量、避免疾病扩散、打击犯罪或测定实时 交通路况等;这样的用途正是大型数据集盛行的原因。

度娘百科详解:http://baike.baidu.com/subview/6954399/13647476.htm?fr=aladdin

 


O2O(Online To Offline)模式,又称离线商务模式,是指线上营销线上购买带动线下经营和线下消费。O2O通过促销、打折、提供信息、服务预订等方式,把线下商店的 消息推送给互联网用户,从而将他们转换为自己的线下客户,这就特别适合必须到店消费的商品和服务,比如餐饮、健身、电影和演出、美容美发、摄影及百货商店 等。

度娘百科详解:http://baike.baidu.com/subview/4717113/13607799.htm?fr=aladdin

一些O2O案列:Groupon、OpenTable、易到用车

posted @ 2014-11-05 23:07 ZT文萃 阅读(1348) | 评论 (0)编辑 收藏

乱讲,谁说我们2002年倒数第一的啊

不还有沙特了么

再说了,中国队多牛B洋人不知道吗

在长达84年十九届世界杯的历史上
仅有三支国家队战胜过中国国家队
分别是巴西、土耳其、哥斯达黎加

即使是巴西这样的世界强队也仅战胜过中国队一次。

而中国队从未在世界杯点球大战中失利过,
从来没有一支球队能够在世界杯上击败过中国队两次。

从数据分析中可以看的出,世界杯史上共产生八支冠军球队,
也只有巴西队曾经战胜过中国队。
欧洲诸强德西荷法英意葡等从来没有世界杯上战胜过中国。

而且,中国队在世界杯上丢球数远少于足球之国巴西和以防守见长的意大利,
在过去84年里,中国队只丢了9个球。

除此之外,世界上除了巴西,中国是另外一支敢在胸前绣五颗星的队。

posted @ 2014-06-16 21:36 ZT文萃 阅读(232) | 评论 (0)编辑 收藏

释迦牟尼在《佛譬喻经》中,讲了一段有名的譬喻,这譬喻是这样的:
      在一个寂寞的秋天黄昏,无尽广阔的荒野中,有一位旅人赶着路。突然,旅人发现薄暗的野道中,散落着一块块白白的东西,仔细一看,原来是人的白骨。
      旅人正疑惑思考时,忽然从前方传来惊人的咆哮声,随着一只大老虎紧逼而来。看到这只老虎,旅人顿时了解白骨的原因,立刻向来时的道路拔腿逃跑。
      但显然是迷失了道路,旅人竟跑到一座断崖绝壁的顶上。在毫无办法之中,幸好发现断崖上有一颗松树,并且从树枝上垂下一条藤蔓。旅人便毫不犹豫,马上抓着藤蔓垂下去,可谓九死一生。
      老虎眼看好不容易即将入口的食物,居然被逃离,可以想象它是如何懊恼地在崖上狂吼着。
      好感谢啊!幸亏有这藤蔓,终于救了宝贵一命。旅人暂时安心了。但是当他朝脚下一看时,不禁啊了一声,原来脚下竟是波涛汹涌、底不可测的深海,怒浪澎湃着,而且在那波涛间还有三条毒龙,正张开大口等待着他的坠落。旅人不知不觉全身战栗起来。
      但更恐怖的是,依靠救生的藤蔓,在其根接处出现了两只白色和黑色的老鼠,正在交互地啃着藤蔓。旅人拼命摇动藤蔓,想赶走老鼠,可是老鼠一点也没有逃开的样 子。而且每次摇动藤蔓,便有水滴从上面落下来,这是树枝上蜂巢所滴下的蜂蜜。由于蜂蜜太甜了,旅人竟完全忘记自己正处于危险万分的境地,此心陶陶然地被蜂 蜜所夺。
      这愚痴的旅人之相,便是所有人类的人生之真相。那么释迦穆尼这段譬喻意味着什么呢?

1、孤独的心灵
旅人:这旅人是指我们自己。
荒野:无尽而寂寞的荒野是譬喻我们无尽寂寞的人生。
秋天的黄昏:秋天的黄昏是譬喻人生的孤寂感。
白骨:路边的白骨是指我们人生旅途中,家族、亲属、朋友等的死亡。我们活到现在,应该看到很多白骨,那时我们有何想法?有何感触?我们可曾注意到紧逼而来的“无常之虎”?
老虎:饥饿的老虎所譬喻的,既是我们自己的死亡。

2、无力的松树
松树:接着我们攀上崖顶的松树,松树是指金钱、财产、名誉、地位等等。这些东西即使拥有再多,在死亡的面前也仍是无力的。

3、人生是梦
藤蔓:藤蔓所譬喻的是“还不会!还不会!我还不会死”的那种以为还有二十年、三十年的寿命可依恃,但即使认为还有十年、还有二十年可活着,但你认为到底人 寿几何?想想便知:已过去的十年二十年,也不过是《啊》的一声之间,便如梦如幻般地消逝了。而今后的十年二十年,也同样是《啊》的一声之间便会过去。
老鼠:咬着藤蔓的白老鼠和黑老鼠是指白天和晚上。白天的白老鼠和晚上的黑老鼠,在相互地缩短着我们的寿命。

4,后生大事
深海:深海所譬喻的便是地狱。坠入此地狱,必须承受八万劫中大苦恼,这一件事情便称为——后生一大事。
毒龙:显现地狱之苦的是这三条毒龙,这三条毒龙指我们自己内心的贪欲、嗔怒、愚痴。
      “善因善果、恶因恶果、自因自果”的因果法则是不会有丝毫差错的。由自己所不断造作的罪恶所生出的地狱,最后还是由自己坠入。

posted @ 2014-06-13 15:44 ZT文萃 阅读(197) | 评论 (0)编辑 收藏

其实都是些很简单的东西
如果有CLER认为这些东西发出来没必要那  朕只能说抱歉

如果看了帖子 对进有那么一点帮助 请cler 回帖支持下 让更多的 朋友可以了解下,很多问题,可以从开机看出问题
谢谢

为 使用电脑时间比较长的老用户,难免会到朋友或同事家帮忙维护、维修电脑,有时还要帮人购买PC,这时我们肯定会带上硬件检测软件,不过,谁也不能随身总是 带着这些软件,如果手头上没有合适的检测软件该怎么办呢?总不能因此就什么都不知道吧?那样你的高手形象大大会受损的,其实,离开这些软件我们也能明明白 白查看电脑硬件的配置情况。下面我们就来一起学习一下吧。  

  一、开机自检中查看硬件配置  

  机器组装结束后即使不装操作系统也可以进行加电测试,在开机自检的画面中就隐藏着硬件配置的简单介绍哟(由于开机画面一闪而过,要想看清楚的话,记得及时伸手按住“PAUSE”键)。

  1.显卡信息  

   开机自检时首先检查的硬件就是显卡,因此启动机器以后在屏幕左上角出现的几行文字就是有显卡的“个人资料”介绍。四行文字中,第一行“GeForce4 MX440……”标明了显卡的显示核心为GeForce4 MX440、支持AGP 8X技术;第二行“Version……”标明了显卡BIOS的版本,我们可以通过更新显卡BIOS版本“榨取”显卡性能,当然更新后这一行文字也会随之发 生变化;第三行“Copyright (C)……”则为厂商的版权信息,标示了显示芯片制造厂商及厂商版权年限;第四行“64.0MB RAM”则标明了显卡显存容量。  

  2.CPU及硬盘、内存、光驱信息  

  显示完显卡的基本信息之后,紧接着出 现的第二个自检画面则显示了更多的硬件信息,像CPU型号、频率、内存容量、硬盘及光驱信息等都会出现在此画面中。该画面最上面两行文字标示了主板 BIOS版本及BIOS制造商的版权信息;紧接着的文字一看就明白啦,当然是主板芯片组喽;其下几行文字则标明了CPU的频率及内存容量、速度。下面四行 “IDE……”则标明了连接在IDE主从接口上的设备,包括硬盘型号及光驱型号等等。
  
  3.主板信息 

  在第二 个自检画面的最下方还会出现一行关于主板的信息,前面的日期显示的是当前主板的BIOS更新日期,后面的符号则是该主板所采用的代码,根据代码我们可以了 解主板的芯片组型号和生产厂商。以往老主板的自检画面中最下方文字的中间标明的是主板芯片组,这一块板子则将其提到了自检画面的上方。  

  机器启动之后按“DEL”键进入BIOS设置页面,在基本信息中同样也可以看到机器的硬件信息,与开机画面显示的没有区别。

  二、利用设备管理器查看硬件配置  

   进入操作系统之后,在安装硬件驱动程序的情况下还可以利用设备管理器与DirectX诊断工具来查看硬件配置。下面看看如何利用设备管理器查看硬件信 息。进入桌面,鼠标右击“我的电脑”图标,在出现的菜单中选择“属性”,打开“系统属性”窗口,点击“硬件--设备管理器”,在“设备管理器”中显示了机 器配置的所有硬件设备。从上往下依次排列着光驱、磁盘控制器芯片、CPU、磁盘驱动器、显示器、键盘、声音及视频等信息,最下方则为显示卡。想要了解哪一 种硬件的信息,只要点击其前方的“+”将其下方的内容展开即可。  
  利用设备管理器除了可以看到常规硬件信息之外,还可以进一步了解主板芯片、声卡及硬盘工作模式等情况。例如想要查看硬盘的工作模式,只要双击相应的IDE通道即可弹出属性窗口,在属性窗口中可轻检看到硬盘的设备类型及传送模式。这些都是开机画面所不能提供的。  

  需要注意的是在Windows Xp之前的操作系统中所提供的设备管理器是无法用来查看CPU工作频率的,好在我们还有DirectX诊断工具。  

   三、利用DirectX诊断工具查看硬件配置  

   DirectX诊断工具可以帮助我们对硬件工作情况作出测试、诊断并进行修改,当然我们也可以利用它来查看机器的硬件配置。运行“系统信息”窗口,找到 “工具--DirectX诊断工具”(或者进入安装盘符中Windows目录下的System32目录中运行Dxdiag.exe),在窗口中可以方便地 查看硬件信息。

  1.查看基本信息  

  在“DirectX诊断工具”窗口中点击“系统”选项卡,当前日期、计算机 名称、操作系统、系统制造商及BIOS版本、CPU处理器频率及及内存容量一目了然。注意喽,虽然我将Celeron 2.0MHz超频至2.40MHz使用,但是DirectX却不认这个帐,依然显示的是未超频的原始频率。看来没有AIDA32,我们同样也可以识别奸商 是否将超频的CPU卖给我们!!  

  2.查看显卡信息  

  在“DirectX诊断工具”窗口中点击“显示”选项卡,在这里我们可以看到显卡的制造商、显示芯片类型、显存容量、显卡驱动版本、监视器等常规信息。  

  3.查看音频信息  

  音频设备往往为人所忽视,但缺了它又不行,单击“声音”选项卡,对其做一番了解吧!同样在出现的窗口中能看到设备的名称、制造商及其驱动程序等等极为详细的资料。不同的是我们还可以点击右下角的“测试DirectSound(T)”对声卡进行一下简单的测试。  
怎么样,经过这一番了解,是不是感觉很受益?

题外话,由于主板更新频繁,现在很多主板BIOS有快速启动功能,以上很多信息都被瞬间屏蔽掉了。需要看自检的信息,需要到BIOS设置。但是以上讲的信息,能让你明白,计算机如何自检。

posted @ 2014-06-10 22:57 ZT文萃 阅读(217) | 评论 (0)编辑 收藏

http://kb.cnblogs.com/page/192251/

这些日子我一直在写一个实时操作系统内核,已有小成了,等写完我会全部公开,希望能够为国内IT的发展尽自己一份微薄的力量。最近看到很多学生朋友和我当年一样没有方向 ,所以把我的经历写出来与大家共勉,希望能给刚如行的朋友们一点点帮助。

  一转眼我在IT行业学习工作已经七年多了,这期间我做过网页,写过MIS、数据库,应用程序,做过通信软件、硬件驱动、协议栈,到现在做操作系统内核和IC相关开发,这中间走了很多弯路,也吃了不少苦。

  我上的是一个三流的高校,就连同一个城市的人多数都不知道。因为学校不好也就没有指望能靠学校名气找一个好工作。所有的希望都寄托在自己的努力 上了,大一开学前的假期我就开始了学习。记得我买的第一本书是《计算机基础DOS3.0》,大家别吓着了,其实当时已经普及了DOS6.22了,只是我在 书店里看到了DOS4.0/5.0/6.0的书,以为像英语那样是第四、五、六册,记得当时到处找DOS1.0,现在想想也幸好我没有找到:)。开学前我 学完了PASCAL,那时既没有计算机也没有人可以请教,我连程序是什么的概念都没有,只好死记硬背代码,然后拿纸写。我一直到大三才有了一台486,在 这之前用纸写了多少程序我也记不清楚了,只知道最长的一个我拿A4大小的草稿纸写了30多页,我的C语言、C++ 、VC都是在这样的条件下入门的。

  所以说条件是可以克服的,希望我的经历多少给条件艰苦的同学们一点信心。第一次上机是在我姐夫的机房,我的心情激动的无与伦比,但是一上机我立 刻傻了眼,他们用的是英文版的Win3.1,我的那点DOS知识都见了鬼,上机提心吊胆的一阵瞎摸,一不小心把Word弄成了全屏,怎么都还不了原,当时 真是心急如焚,我以机器被我弄坏了。第一个C语言程序,就是那个经典的HelloWorld,我调了几个星期,上机机会非常少,也没有书告诉我开发环境 (TC2.0)需要设置,而且开始我都不知道有编译器,我甚至自作聪明把写好的程序扩展名从.c改成.exe,结果可想而知。

  大一学完了C、X86的汇编、数据结构、C++ 。由于精力都花在自学上了,大一下四门课挂了彩,三类学校就是这点好,挂上一二十门也照样毕业。不过扯远点说,我那么刻苦都及不了格,可见我们国家的计算机教育有多死板。

  大二准备学VC和BC,当时难以取舍,后来选了VC,不为别的,只为书店里两本书,VC那本便宜6块钱。我的努力在班上无人能及,学的日夜不 分,大三有了计算机后更是如此,很多次父亲半夜教训我说我不要命了,我一直觉得自己基础差,记忆又不行,条件也不好 ,所以觉得只有多花点时间才能赶上别人。居然后来有许多朋友说我有学计算机的天赋,让我哭笑不得。我用的是486,16M内存,1G硬盘,当时同学们的配 置都是P166MMX,我安装一个Windows NT4.0需要一个通宵,编译一个BC5.0向导生成的程序需要近两个小时,我的显示器是个二手的,辐射非常大,开机屏幕冒火花,看起来很酷的:)。有一 次程序写的太久,觉得怎么白色的编辑器背景变成了紫色,以为显示器坏了,后来才发现眼睛不行了,不过说来也奇怪,到今天我的视力还能保持1.5,真是个奇 迹。但是就是那台破机器陪伴我两年,让我学会了VC、Delphi、SQL Server等。后来那台机器给我阿姨打字用,据她说一天她正打的开心,一股青烟夹着火苗从显示器钻出来,之后它才寿终正寝。

  大三假期找了个机会在一个计算机研究所实习,与其说实习不如说是做义工,工作了两个月一分钱没有拿。但是这两个月对我的发展帮助很大,让我早一 步了解了社会,刚去的时候我当然是一窍不通,在那里我熟悉了网络,学会了Delphi和Oracle。由于工作很认真,得到了比较好的评价,在一位长者的 引荐下,我开始和他们一起做项目,这使我在大三大四就有了自己的收入,大四又找了两家MIS公司兼职,虽然钱不多,但是在学生期间有1000多的收入我已 经非常满足了,我终于用自己赚的钱把计算机换了。

  大四下开始找工作,这时我的工作经验已经比较多(当然现在想想非常幼稚),开始听父母的想去那个研究所,实习过那个部门也希望我能去,但是不知 道为什么最后不了了之,这种单位就是比较官僚,我一气之下就到了我兼职的一个公司做MIS的Team Leader。在大三到毕业一年的时间,做过了各种MIS,从煤气、烟厂、公安、铁路、饮食到高校,什么有钱做什么,工作也很辛苦,经常加班和熬通宵,从 跟客户谈需求到设计、编码、测试、交付都要上。那时觉得很有成就感,觉得自己还不错,现在想想真是很肤浅。

  刚走上工作岗位的学生很容易被误导,各种开发工具让人眼花缭乱,同时也觉得很受公司器重,但这样工作永远是一个低层次的开发者。不要跟我说什么 系统分析有多么多么重要,多么多么难。你以为自己跟用户谈需求做设计就是系统分析和设计了吗,国内又有几个公司能够做的很到位很规范?我是ISO9000 内审员,也在Rational公司受过多次培训,拿了4个证书,还有一个公司让我去做CMM。这些我听过很多,但是很多事情到内就变了性质,一个公司不是 通过了ISO9000或者CMM就能规范了,我现在在一家有几十年历史的外企工作,里面的管理不是一般国内企业能及的。作为一个毕业不久以前没有步入过社 会的学生,几乎不可能在很短的时间掌握系统分析和设计,面向对象、UML只是一个工具,关键是人本身的思想,不是说你熟悉了C++ 、Rose就能够做出好的设计,相反如果你具备了很高的素质,你可以用C写出比别人用C++更加模块化的程序。

  话说远一些,国内软件开发行业有一个怪圈,很多人觉得VC > Delphi > VB,真是很搞笑。这几个软件我都做过开发,说白了他们都是工具,应该根据应用的需要选择采用哪个,而不是觉得哪个上层次。如果你因为用某个开发工具很有 面子而选择的话,只能说明你很浅薄。如果说层次,那么这些工具都不上层次,因为它们用来用去都是一些系统的API,微软的朋友不会因为你记住他们多少个 API或者多少个类就会觉得你很了不起,你永远只是他们的客户,他们看重的是你口袋里的银子。我也做过系统内核,我也封装过很多API,同样我也不会看重 那些使用这些API做二次开发的客户,除非他能够作出自己独到的设计。

  至于有人认为C++ > C那更是让人笑掉大牙,不妨你去打听一下,现在有几个操作系统内核是用C++写的,又有几个实时系统用的是C++,当然我也不是说C++不好,但是目前的 内核和实时系统中C++还无法与C匹敌,至于说C++适合做应用系统的开发那是另外一回事。所以我的观点是不在于你用什么工具和语言,而在于你干什么工 作。你的设计体现了你的技术层次。

  这样干了一年我觉得非常苦闷,做的大多数都是熟练工种的活,个人技术上没有太多的提高也看不到方向。所以决定离开这个城市去上海,寻求更好的发展,并且打算放弃我以前的MIS转到通信行业。

  写到这里不能不提到我女朋友,我们是在来上海前半年认识的,她大四在我公司实习,公司派她给我写文档,我们的感情发展的很快。她告诉我很多事 情,她家原本是改革开放的第一批暴发户,她母亲爱打牌,输掉了几百万,还欠了很多债,她有男朋友,但是她对他没有感情,只因为他给了她母亲两万多块钱,后 来还强迫她写了四万块的借条,她男朋友背叛过她并且不止一次打她,现在逼她结婚,不然就要她还钱。这人居然还是一个高校的老师!她母亲把父亲给她的学费花 了,因为拖欠学费她没有办法拿到毕业证。

  她母亲现在有病需要钱,我拿出了自己的一点积蓄并且跟朋友们借了一些,替她交了学费并给她母亲看病(后来才知道看病的钱又不知所终,就连她母亲 是不是有病我都不知道,但她也是没有办法)。这个时候我家知道了一些事情,坚决反对我和她在一起,她原来的男朋友也极力破坏。无奈之下我们决定早一定离开 这个伤心的城市,并且瞒着我们家。由于时间仓促,我只准备了4000块钱,她仅有的几百块钱也被她母亲要去了,我买了三张票,一张是中午的,两张是晚上 的,中午我的家人把我送上船,他们一离开我就下了船,我和她乘坐晚上的船离开了这个我和她生活了很多年的城市,带走的只是一身债务。

  没有来过上海的我们两个性倔强,都不愿意去麻烦同学和朋友。来到上海是傍晚6点半,我们都不知道该去哪里,我们找了一个20块钱的旅馆,这个房 间连窗户都没有,7月份的天气酷热难耐,房间里非常闷热。第二天我们开始租房子,因为身上的钱不多,我们基本都是步行,花了一个星期时间,不知道在浦东转 了多少圈后找到了一个400块的房子,但是我们都 不了解上海是付三压一,还要付半个月的中介费,买了一些锅碗瓢盆后,我们身上只有800块钱了。工作都还没有着落,这800块钱要支持到我们拿到第一个月 工资,为了省钱我们自己做饭,每天买菜只花两块钱,她非常喜欢吃(也可能她在大学经常挨饿的原因),看到她现在这样省吃俭用我真的很不忍心。

  她以前的男朋友也没有放过她,经常打电话来骚扰,并且来上海看她,还说了不少恐吓她的话,她过于善良,说他以前毕竟帮助过她,叫我不要与他一般 见识。以后的每天在家就是苦等面试通知,原本我想迅速找一家MIS公司解决眼前的困难,但是她坚持让我不要放弃自己的理想,终于功夫不负有心人,我找到了 一家通信公司,4000块的工资虽然赶不上MIS公司给我开出的价位,但也够在上海生存。她也找到了工作,第一天上班她哭了,这是她来上海第一次流泪,我 心里很难受也很感动。

  由于是全新的行业,我把自己降到了零点,我学的VC、Delphi、数据库派不上用场,摆在我面前的是嵌入式、协议、信令一些我从未接触过的知 识。我知道我没有退路,于是拼命的学习,我把自己当做一个应届毕业生一样,一分努力一分收获,半年过去我终于熟悉了工作,并且得到了公司的表彰,薪水也加 了一级。后面的日子里我们省吃俭用,把欠朋友的1万多块钱还了,日子终于上了正轨。这时女朋友告诉我她想考研究生,我也很支持,于是她辞职在家备考。

  另外,在这里我要感谢我的Project Manager,他原来是一个大通信公司的产品经理,对人非常和善,我从他那里学到了很多知识,而且他也给了我许许多多无私的帮助。在工作上他给我充分的 空间和信任。记得公司安排我维护一个接入服务器软件,由于代码量不算太小(5万行),资料和文档都不齐全,我维护起来非常吃力,所以想重新把它做一遍,公 司领导不太支持,可能觉得工作量太大,但是他极力支持我,私下里他让我放手去做,我的维护工作他挤时间做。在他的支持下,我花了半年时间完成了接入服务器 的软件,并且实现了一个相对完整的TCP/IP协议栈。在这里我学会了嵌入式系统设计、驱动开发、TCP/IP和很多通信的知识,我花了一年时间终于使自 己从MIS开发转到了通信行业,并且站稳了脚跟。我的开发大量是对硬件的直接操作,不再受微软的操作系统,VC、Delhpi这些开发工具的约束,我终于 看到了另外一片天空。

  我做事情喜欢追根问底,随着开发的深入,软件开发与硬件联系越来越紧密,硬件知识的匮乏又对我的发展产生了障碍,而且芯片技术基本上掌握在国外 公司的手里,这对做系统级设计是一个非常大的制约,一个新产品出来,第一道利润(也往往是最丰厚的利润)常常都被IC公司如Intel、Motorola 赚去了,国内的厂商只能喝点汤。所以我决心解决自己的硬件技术障碍,并打算离开通信行业,进入IC设计相关领域。

  当然我明白如果我对硬件了解的非常少,没有哪家IC公司会仁慈到招我这样一个一窍不通的人来培训。所以我必须努力打好基础,学一些相关知识为以 后做准备。就像我开始从MIS转到通信一样,我看过大量通信方面的书,并且给一个ISP做过RADIUS计费分拣台,在这样的背景下这家通信公司才给了我 这个机会。我在的通信公司是做系统设计的,有不少PCB  Layout硬件人员,平常我就注意向他们学习,由于我做的是软件,在公司看硬件资料不好意思,所以开始只好在家看,刚来上海工作我连续一年都在加班, 后来不加了,因为我要挤出时间学习,通常我12点左右睡,第二天5点半起,我上班比较早,地铁上如果人不多,我也用来看书。

  学习当然不会是一帆风顺的,有些实在不懂的问题就积累起来问硬件人员,他们的帮助使我学习进度快了很多。因为在没有人点拨的情况下自学,我的一 半时间是花在解决疑难问题上,但这种问题经常是别人的一句话就可以让我豁然开朗,我非常庆幸我有这样的学习环境。在后面的一年里,我学会了看硬件原理图, 学会了简单的硬件设计 (模拟电路方面还有不小的差距),事情就是这样的,当你安安份份做软件,别人永远认为你是软件开发人员,在你开始学习硬件时别人未必会认同,有位中兴通讯 的朋友还对我说过,一个人不可能把所有东西都学完。

  我也明白这一点,但我希望自己做的更好。但当你熟悉硬件后大家又会觉得你好像原本就是软硬件都懂的,同事们也都习以为常了。这个时候我可以把硬 件资料堂堂正正的拿到公司看,没有人再大惊小怪了。让我比较自豪的是我通过自己的努力做了一个IAD(软交换的终端设备)系统方案,包含软硬件的选型、设 计等内容,这个方案得到了公司和同事们的认同,让我感到非常欣慰。

  技术是相辅相成的,当我的硬件有了一定的进步后,我的软件设计也有了很大的提高 ,我可以从更深层次理解问题。我做的接入服务器CPU是Motorola PowerPC 860,熟悉的朋 友都知道860 QMC与软件的批量数据传输通常采用BD表的方式,硬件人员做驱动的时候习惯采用固定BD表,每接收或发送数据都将数据从BD表拷贝到用户Buffer, 或从用户Buffer拷 贝到BD表。由于理解的比较深入,我自己重新实现了这个过程,采用动态BD表的方式,驱动从一个网口接收数据,提交给我的软件进行三层交换,直至从另外的 接口发送出去,没有进行一次拷贝。这样的设计大大提高了性能,使系统的指标接近理论值。

  软硬件的结合使我的设计水平上了一个台阶。我现在写的这个操作系统,编译后我把程序反编译成汇编,找出其中不优化的代码,然后在C程序中进行调 整。举个例子,很多CPU没有专门的乘法指令,这个大家应该都知道,在这种CPU上进行一个乘法操作常常会花费大量的指令周期,有的朋友会说这个我知道。 我会尽量避免采用×号,但是事情往往不是那么简单,你知道C语言中数组的下标操作是怎么实现的吗?仔细看看反汇编的代码你就会明白,同样是通过下标的定位 操作,C编译器会有时候会产生位移指令,但有时候会用乘法实现,两者效率往往是天壤之别,所以明白这些问题你才能将系统性能提升到极致。这些问题就不多说 了,有兴趣的话以后可以共同探讨。

  话说远一点,我由衷的希望在软件上做的比较深入的朋友们有机会学学硬件以及其它相关知识,尤其是做底层开发和嵌入式设计的。这对软件技术的提高 有非常大的帮助,否则很多事情你只知道该这样但不会明白为什么该这样。我这个观点在我现在的IC公司Project Manager那里也得到了验证。他告诉我们公司现在802.11芯片产品的软件经理原本是做该芯片硬件设计的,某某某原本是做软件的,现在在做IC,类 似的例子还有很多,只是在国内这样的风气不是非常流行。

  我有一些心得体会与大家分享,只有当我干好本职工作后,我才会学习与工作关系不大的技术,这样公司的上司才不至于反感。在入门 阶段的问题我通常不去问那些资深人士 ,而是问一些资历比较浅的朋友,比如刚毕业不久的学生,因为他们往往会跟你详细的讲解,而资深人士通常觉得你的问题太简单,所以回答的也很简单,我又不好 意思多问。

  等技术上了一定的层次后我才会问他们,他们也能给你比较深入的回答。另外,有些朋友说我机会比较好,他们也希望能从事新的工作可惜没有机会,我 听了只有苦笑,我的机会了 解的人都应该知道,我没有出生在什么IT世家:)也没有谁一路提拔我,所有的路都是自己走出来的,我母亲去世比较早,我的后母(我叫她阿姨)看着我努力过 来的,一次她看我大年30还在写程序,她说像我这样努力木头都能学出来。

  我的最终目的是IC而不是PCB,所以我下一步的准备开始学习IC设计的知识。公司的同事没有懂IC设计的,后面的路又要靠自己了。我买了不少 相关的书,在网上也查了很多的资料,我花了大量的时间去学习VHDL,并且用软件进行了一些简单的设计和仿真(没有设 计ASIC,只是针对FPGA)。随着学习的深入,我渐渐明白了IC设计的基本流程,同时也明白了这条路的艰辛。这个时候我已经做好了跳槽的准备,我向一 家业界又一定知名度的IC设计公司投了简历,并通过了漫长的面试(4个多小时)。其他的一切我都比较满意,唯独薪资差强人意,我也明白原因,因为我是这个 行业的新人,我没有经验,我再一次将自清零了。公司老板问我6000多一个月能不能接受,我知道他也是照章办事。想想我通信行业的朋友们,基本上都是年薪 10万以上,月薪过万的也比比皆是,朋友们也帮我介绍了不 少待遇不错的公司。我该怎么选择,当时我很犹豫,我热爱我的事业,我向往我的追求,但我也是一个普通的人,我也需要养家糊口,我也想早一点买房买车。生活 给我出了一道难题。

  爱因斯坦在63岁时说过一个人没有在30岁以前达成科学上的最大成就,那他永远也不会有。这句话给了我很大 的压力和震动,我马上就26岁了,离30只有四年时间,我必须抓紧这几年宝贵的时间,努力达到我技术上的最高峰。为了这个理想,为了能离自己的梦更近一 些,我选择了这家IC公司,我明白自己的薪资和公司刚进来的硕士研究生相差无几,但为了今后的发展只能忍受,一切又得重新开始。换行业是一个非常痛苦的过 程,尤其从一个春风得意的位置换到一个陌生的岗位,感觉象从温暖的被子里钻出来跳进冰水中,让人难以接受。在原来那家通信公司,我是唯一两年时间涨了五次 工资的员工,公司和同事都给了我极大的认可,工作上也常常被委以重任。但现在这一切都成了过去,在新的公司 我只是一个新人,没有人知道也没有人在意我过去的成绩。我决定重新开始,我把自己看作 新毕业的学生,我要用自己的努力得到公司的认可。进入新的行业是非常痛苦的,我告诉自己必须忍受这一切,虽然外面有很多诱惑,但是既然作出了选择我就不允 许自己轻易放弃。

  我现在已经在这家新公司上了一个多月的班,开始非常艰难,现在慢慢适应了。第一个月结束时,Team Leader找我谈话,说我是新进员工中最优秀的一个,我心里很欣慰,这也算对我努力的一个肯定吧。在这里还要感谢我的女朋友,她给了我很大的支持和鼓 舞, 每次在我动摇的时候她都在鼓励我,让我坚持自己的理想,刚来上海是她让我不要勉强去做MIS,这次也是她让我顶住了月薪过万的诱惑,没有她我可能不会有今 天的成绩。现在的公司有自己的操作系统,自己的CPU、DSP和其它芯片,在这里我能学到世界上最先进的技术,我们的设计开发不再完全依赖别人的硬件和系 统,这让我很开心。我打算等工作步入正轨后,全力学习新的知识,实现我的理想。
  在后面的两年里我给自己定下了几个目标:

  1、努力做好本职工作,在工作上得到公司和同事们的认同;
  2、努力学习IC硬件设计知识,多向同事请教,并利用一切机会多实践;
  3、实现我的实时操作系统的主要部分,完成TCP/IP协议栈模块,并免费发布源代码;
  4、和我女朋友结婚并买一套小房子,这是最重要的,因为我明白事业是可以重来的,但是珍贵的感情很难失而复得。

  在这里提一下我现在开发的操作系统,它是一个实时嵌入式系统,目前支持以下特性:

  a. 支持时间片轮转调度和基于优先级调度,最多64个优先级;
  b. 抢占式实时内核;
  c. 为了便于移植,主体用标准C实现;
  d. 汇编代码非常少,不到100行;
  e. 支持任务管理,各任务有独立的堆栈;
  f. 进程同步和通信目前完成了Semaphore,Message Queue正在调试;
  g. 实现了定时系统调用;
  h. 可以在Windows上仿真调试。

  我还打算下一步实现优先级反转保护,Event Flag,Data Pipe,内存管理(以前实现过) ,驱动接口等。在这之后我还会努力完善它,比如加入文件系统,协议栈、调试接口等。希望朋友们提出自己的意见和建议,在此不胜感激!
  后记:

  就像有的朋友说的,我的经历或许会给一些朋友产生误导,在这里我必须说明一下。我来上海以前学习过于拼命,常常晚上只睡3个多小时,我身高1米 71,那时只有108斤(我现在130多),家人也说我这样拼命活不过60岁,但是当时的我太固执,我对他们说只要能实现理想活50岁我就够了。那时的拼 命使我的身体受到了影响,有一次早上突然腰肌剧痛难忍,痛的我倒在床上站不起来。虽然我现在已经比较注意,但有时候还会隐隐作痛。后来在女朋友说服了我, 来上海以后我不再如此。我经常引用父亲的一句话身体是革命的本钱。

  而且我也发现拼命不是办法,我可以熬一两个通宵,最多的一次我连续工作了三天三夜, 但是我半个月都没有恢复过来,这样是不是得不偿失?学习工作应该是一个长期的过程, 像马拉松而不是百米冲刺。我现在非常注意调整学习和工作的强度,我要保证每天尽量有相对充沛的精力,一些年轻的朋友觉得自己也应该拼命努力,这让我多少有 些担心,如果我的故事能让你在学习工作上多一点兴趣,我会感到很开心,但如果误导了某些朋友,让你做一些不值得的付出,我会感到很内疚。

  技术没有贵贱之分,我以前换行业是因为自己的兴趣所致,而不是对哪个行业有什么偏见。我希望我的经历不要给朋友一个错误的导向,觉得我始终向更 高的技术发展。其实各行各业做到顶尖都是很困难的。话又说回来虽然技术没有贵贱,但是门槛是有高低的,无论如何,做IC的门槛要比做网页的高,这一点无可 否认。国家各种人才都是需要的,但是作为个人奋发向上的想法还是应该有的,努力在自己喜欢的行业上做的更好,而不应该停留在比较肤浅的层次上。

  我是一个自己觉得比较有自知之明的人,或许我最大的优点就是知道自己有很多缺点 :)。我的故事中很多的曲折和错误都是由我的缺点造成的,希望大家用审慎的眼光看待我的经历,不要被我的花言巧语所迷惑。我学习有些随心所欲,这给我带来 了无尽的麻烦,也大大阻碍了我的发展。记得我小时候成绩比较出色,但是后来学习严重偏科,导致我中学成绩一再滑坡,也没有考上什么好的学校,小时候的一个 朋友,当时的成绩和我相仿,但是没有我这个缺点,她上了清华,后来在去了美国深造,在一个著名导师手下研究理论科学,这未尝不是一条更好的出路。

  另外我的学习方法也是在不断改善中的,过去的学习过于讲究数量和时间,那样学习既苦而已效率不高。现在我非常注意学习的效率和技巧,这样才是学 习的捷径(当然不是指投机取巧),比如说学一相对陌生的技术,如果有条件,不妨问一问有经验的人,不需要问很多,往往他不经意的几句话会给你非常大的帮 助,甚至超过你看一个星期的书。带着这样的思想再去学习你会节省很多时间,这样何乐不为呢?

  这些年中我学了不少的东西,由于开始非常盲目,所以学的东西杂乱无章,现在回想起来让我啼笑皆非,我把大量的时间浪费在一些没有必要深入了解的 知识上,毕竟一个人的精力是有限度的。很多朋友和我一样都背过五笔字形,的确它是个不错的输入法,但是对一个研发人员它绝对不值得你去背,你的时间应该花 在有价值的地方。我这样的事情还做过很多,我背过CCED、WPS的命令和快捷键,在dBase基本退出历史舞台后我还花了很多时间去学习它的使用。所以 我的学习在前期缺乏规划,没有明确的短期目的、中期目标,只有一个虚无飘渺的长期的理想。这就像做设计一样,好的设计是从需求抽象到代码有很多过程,而不 能得到了需求就立刻开始开始编码。

  当然这么些年的学习和工作多多少少有些收获,下面我说说我的一些学习的心得,这些方法未必正确,我也在不断探索和改进中。我的学习和工作有相对 明确的目标,我不会一时心动而去学习某一技术,在下决定之前我会考虑很多,包括长期的发展,个人路线的规划,需要付出的代价、可能遇到的困难及解决的办法 等等;在决定后还会制定更加明确的计划,包括短期、中期和长期的,身边可以利用到的资源(包括好的书籍、资料、软硬件环境,也包括有经验的朋友或者师 长),以及每一个阶段是怎么过渡到高一阶段的计划 ;往往在一个学习阶段一旦上路后会走的相对顺利,但是跨阶段通常比较麻烦,比如从学习基础知识转到实践。另外我买书也有自己的方法,现在世面上高质量的书 远不如低质量书多,对于一个陌生的技术,往往在第一次买书会选择错误,即使买到一本好书但是它的方向也未必适合你,所以我通常会先在网上查找一些该技术的 介绍,有了一点点概念后再去买一本比较薄、相对便宜并且内容相对泛泛而谈的书,这是国内作者最善于写的书:) ,再把它浏览一遍后我就会基本明白这门技术的要点,后面买书和制定计划就会明确的多 。否则一开始就想找本好书往往比较困难,而且买回来后努力学习,有时候学了一半才发现是本低质量的书或者是相对过时技术,让人非常懊恼。另外让有经验的人 帮你介绍,通常也是一个不错的选择。

posted @ 2014-05-07 14:22 ZT文萃 阅读(231) | 评论 (0)编辑 收藏

下文转载自:
http://www.sbanzu.com/topicdisplay.asp?BoardID=8&Page=1&TopicID=4136822
转载不代表赞同作者,仅仅是记录。

有一个名字,全世界所有的独裁者听到都会惊慌。
有一个名字,一切热爱自由的人民听到都要赞扬。
有一个名字,躲在阴暗中谋杀百姓的歹徒对她咬牙切齿。
有一个名字,阳光下渴望和平的人们对她寄予厚望。
是她一次又一次的把世界从恶魔手中拯救,
是她一次又一次的给予恐惧中的人类希望。
是谁挡住了纳粹的铁蹄?
是谁支援了远东的战场?
是谁把集中营解放?
是谁迫使日寇投降?
是谁将那隔开同胞的高墙推倒?
是谁击毙了伊阿独裁流氓?
她高举着火炬,在黑暗中指引我们方向!
她宣言的真理,时时回响在我们耳旁!
虚伪者越是污蔑她虚伪,
正直者越是坚定对她的信仰!
她的伟大我们一刻不忘!
你问我她长的什么模样?
她是炙热通红的火焰,
她是宽广蔚蓝的大海,
她是纯洁耀眼的白光!
你问我她的名?
正告你!
美利坚!
人类的希望!
壮哉,我大美利坚!

posted @ 2014-05-06 12:02 ZT文萃 阅读(324) | 评论 (0)编辑 收藏

下文转帖自:
http://www.cnblogs.com/chenssy/p/3651218.html
版权归作者所有。

hashCode的作用

      要想了解一个方法的内在原理,我们首先需要明白它是干什么的,也就是这个方法的作用。在讲解数组时(java提高篇(十八)------数组),我们提到数组是java中效率最高的数据结构,但是“最高”是有前提的。第一我们需要知道所查询数据的所在位置。第二:如果我们进行迭代查找时,数据量一定要小,对于大数据量而言一般推荐集合。

      在Java集合中有两类,一类是List,一类是Set他们之间的区别就在于List集合中的元素师有序的,且可以重复,而Set集合中元素是无序不可重 复的。对于List好处理,但是对于Set而言我们要如何来保证元素不重复呢?通过迭代来equals()是否相等。数据量小还可以接受,当我们的数据量 大的时候效率可想而知(当然我们可以利用算法进行优化)。比如我们向HashSet插入1000数据,难道我们真的要迭代1000次,调用1000次 equals()方法吗?hashCode提供了解决方案。怎么实现?我们先看hashCode的源码(Object)。

public native int hashCode();

      它是一个本地方法,它的实现与本地机器有关,这里我们暂且认为他返回的是对象存储的物理位置(实际上不是,这里写是便于理解)。当我们向一个集合中添加某 个元素,集合会首先调用hashCode方法,这样就可以直接定位它所存储的位置,若该处没有其他元素,则直接保存。若该处已经有元素存在,就调用 equals方法来匹配这两个元素是否相同,相同则不存,不同则散列到其他位置(具体情况请参考(Java提高篇()-----HashMap))。这样 处理,当我们存入大量元素时就可以大大减少调用equals()方法的次数,极大地提高了效率。

      所以hashCode在上面扮演的角色为寻域(寻 找某个对象在集合中区域位置)。hashCode可以将集合分成若干个区域,每个对象都可以计算出他们的hash码,可以将hash码分组,每个分组对应 着某个存储区域,根据一个对象的hash码就可以确定该对象所存储区域,这样就大大减少查询匹配元素的数量,提高了查询效率。

hashCode对于一个对象的重要性

      hashCode重要么?不重要,对于List集合、数组而言,他就是一个累赘,但是对于HashMap、HashSet、HashTable而言,它变 得异常重要。所以在使用HashMap、HashSet、HashTable时一定要注意hashCode。对于一个对象而言,其hashCode过程就 是一个简单的Hash算法的实现,其实现过程对你实现对象的存取过程起到非常重要的作用。

      在前面LZ提到了HashMap和HashTable两种数据结构,虽然他们存在若干个区别,但是他们的实现原理是相同的,这里我以HashTable为例阐述hashCode对于一个对象的重要性。

      一个对象势必会存在若干个属性,如何选择属性来进行散列考验着一个人的设计能力。如果我们将所有属性进行散列,这必定会是一个糟糕的设计,因为对象的 hashCode方法无时无刻不是在被调用,如果太多的属性参与散列,那么需要的操作数时间将会大大增加,这将严重影响程序的性能。但是如果较少属相参与 散列,散列的多样性会削弱,会产生大量的散列“冲突”,除了不能够很好的利用空间外,在某种程度也会影响对象的查询效率。其实这两者是一个矛盾体,散列的 多样性会带来性能的降低。

      那么如何对对象的hashCode进行设计,LZ也没有经验。从网上查到了这样一种解决方案:设置一个缓存标识来缓存当前的散列码,只有当参与散列的对象改变时才会重新计算,否则调用缓存的hashCode,这样就可以从很大程度上提高性能。

      在HashTable计算某个对象在table[]数组中的索引位置,其代码如下:

int index = (hash & 0x7FFFFFFF) % tab.length;

      为什么要&0x7FFFFFFF?因为某些对象的hashCode可能会为负值,与0x7FFFFFFF进行与运算可以确保index为一个正 数。通过这步我可以直接定位某个对象的位置,所以从理论上来说我们是完全可以利用hashCode直接定位对象的散列表中的位置,但是为什么会存在一个 key-value的键值对,利用key的hashCode来存入数据而不是直接存放value呢?这就关系HashTable性能问题的最重要的问 题:Hash冲突!

      我们知道冲突的产生是由于不同的对象产生了相同的散列码,假如我们设计对象的散列码可以确保99.999999999%的不重复,但是有一种绝对且几乎不 可能遇到的冲突你是绝对避免不了的。我们知道hashcode返回的是int,它的值只可能在int范围内。如果我们存放的数据超过了int的范围呢?这 样就必定会产生两个相同的index,这时在index位置处会存储两个对象,我们就可以利用key本身来进行判断。所以具有相索引的对象,在该 index位置处存在多个对象,我们必须依靠key的hashCode和key本身来进行区分。

hashCode与equals

      在Java中hashCode的实现总是伴随着equals,他们是紧密配合的,你要是自己设计了其中一个,就要设计另外一个。当然在多数情况下,这两个 方法是不用我们考虑的,直接使用默认方法就可以帮助我们解决很多问题。但是在有些情况,我们必须要自己动手来实现它,才能确保程序更好的运作。

      对于equals,我们必须遵循如下规则:

      对称性:如果x.equals(y)返回是“true”,那么y.equals(x)也应该返回是“true”。

      反射性:x.equals(x)必须返回是“true”。

      类推性:如果x.equals(y)返回是“true”,而且y.equals(z)返回是“true”,那么z.equals(x)也应该返回是“true”。

      一致性:如果x.equals(y)返回是“true”,只要x和y内容一直不变,不管你重复x.equals(y)多少次,返回都是“true”。

      任何情况下,x.equals(null),永远返回是“false”;x.equals(和x不同类型的对象)永远返回是“false”。

      对于hashCode,我们应该遵循如下规则:

      1. 在一个应用程序执行期间,如果一个对象的equals方法做比较所用到的信息没有被修改的话,则对该对象调用hashCode方法多次,它必须始终如一地返回同一个整数。

      2. 如果两个对象根据equals(Object o)方法是相等的,则调用这两个对象中任一对象的hashCode方法必须产生相同的整数结果。

      3. 如果两个对象根据equals(Object o)方法是不相等的,则调用这两个对象中任一个对象的hashCode方法,不要求产生不同的整数结果。但如果能不同,则可能提高散列表的性能。

      至于两者之间的关联关系,我们只需要记住如下即可:

      如果x.equals(y)返回“true”,那么x和y的hashCode()必须相等。

      如果x.equals(y)返回“false”,那么x和y的hashCode()有可能相等,也有可能不等。

      理清了上面的关系我们就知道他们两者是如何配合起来工作的。先看下图:

2014040701_thumb2

      整个处理流程是:

      1、判断两个对象的hashcode是否相等,若不等,则认为两个对象不等,完毕,若相等,则比较equals。

      2、若两个对象的equals不等,则可以认为两个对象不等,否则认为他们相等。

      实例:

复制代码
public class Person {     private int age;     private int sex;    //0:男,1:女     private String name;      private final int PRIME = 37;      Person(int age ,int sex ,String name){         this.age = age;         this.sex = sex;         this.name = name;     }      /** 省略getter、setter方法 **/      @Override     public int hashCode() {         System.out.println("调用hashCode方法...........");          int hashResult = 1;         hashResult = (hashResult + Integer.valueOf(age).hashCode() + Integer.valueOf(sex).hashCode()) * PRIME;         hashResult = PRIME * hashResult + ((name == null) ? 0 : name.hashCode());          System.out.println("name:"+name +" hashCode:" + hashResult);          return hashResult;     }      /**      * 重写hashCode()      */     public boolean equals(Object obj) {         System.out.println("调用equals方法...........");          if(obj == null){             return false;         }         if(obj.getClass() != this.getClass()){             return false;         }         if(this == obj){             return true;         }          Person person = (Person) obj;          if(getAge() != person.getAge() || getSex()!= person.getSex()){             return false;         }          if(getName() != null){             if(!getName().equals(person.getName())){                 return false;             }         }         else if(person != null){             return false;         }         return true;     } }
复制代码

      该Bean为一个标准的Java Bean,重新实现了hashCode方法和equals方法。

复制代码
public class Main extends JPanel {      public static void main(String[] args) {         Set<Person> set = new HashSet<Person>();          Person p1 = new Person(11, 1, "张三");         Person p2 = new Person(12, 1, "李四");         Person p3 = new Person(11, 1, "张三");         Person p4 = new Person(11, 1, "李四");          //只验证p1、p3         System.out.println("p1 == p3? :" + (p1 == p3));         System.out.println("p1.equals(p3)?:"+p1.equals(p3));         System.out.println("-----------------------分割线--------------------------");         set.add(p1);         set.add(p2);         set.add(p3);         set.add(p4);         System.out.println("set.size()="+set.size());     } }
复制代码

       运行结果如下:

2014040702_thumb

      从上图可以看出,程序调用四次hashCode方法,一次equals方法,其set的长度只有3。add方法运行流程完全符合他们两者之间的处理流程。

posted @ 2014-05-04 06:23 ZT文萃 阅读(267) | 评论 (0)编辑 收藏

下文来自:
http://www.cnblogs.com/chenssy/archive/2012/12/09/2809874.html
版权归作者所有。

      电子邮件用于网上的信心传递和交流,它是最重要的Internet服务之一。据统计Internet30%的业务是电子邮件有关的。同时我们也不可否认它在我们的日常生活、工作办公方面扮演着很重要的角色。譬如:许多办公自动化项目(OA)中都要附带发送邮件的功能,如果还要使用OutLook等手工方式就不适合,在这个高速的时代,我们需要提供工作效率,让工作能够自动化。同时在许多网站中也都需要附带发送邮件的功能:给新注册的用户发送一封包含其注册信息的欢迎E-Mail、将网站的最新活动信息通过E-Mail发送给所有的注册会员等等。

 

       在开始电子邮件开发前:我们需要明白一下几个概念:电子邮件系统、邮件服务器、电子邮件、邮件客户端软件、邮件传输协议、电子邮件的传输过程。

 

       电子邮件系统

       与 传统的邮政服务相类似,电子邮件系统由电子邮局、电子邮件发送、接收系统组成。发送者和接收者通过电子邮件发送、接收系统来发送和接收电子邮件,他们实际 上是运行在计算机上的邮件客户端程序。电子邮局起着一个桥梁的作用,它实际上是运行在服务器上的邮件服务器程序。电子邮件的处理流程也和邮政服务相类似。

 

          

       邮件服务器

       邮件服务器是一种用来负责电子邮件收发管理的设备。在Internet上提供了大量的电子邮件服务器,如:126163hotmail…

       电子邮件服务器主要提供的功能:

           1、  接收用户投递的邮件。

           2、  将用户投递进来的邮件转发给目标邮件服务器。

           3、  接收其他电子邮件服务器转发来的邮件并该邮件存储到其管理的用户邮中。

           4、  为前来读取邮件的用户提供读取邮件的服务。

       邮 件服务器构成了电子邮件系统的核心。每个收信人都有一个位于某个邮件服务器上的邮箱(mailbox)。Bob的邮箱用于管理和维护已经发送给他的邮件消 息。一个邮件消息的典型旅程是从发信人的用户代理开始,邮件发信人的邮件服务器,中转到收信人的邮件服务器,然后投递到收信人的邮箱中。当Bob想查看自 己的邮箱中的邮件消息时,存放该邮箱的邮件服务器将以他提供的用户名和口令认证他。Alice的邮件服务器还得处理Bob的邮件服务器出故障的情况。如果 Alice的邮件服务器无法把邮件消息立即递送到Bob的邮件服务器,Alice的服务器就把它们存放在消息队列(message queue)中,以后再尝试递送。这种尝试通常每30分钟左右执行一次:要是过了若干天仍未尝试成功,该服务器就把这个消息从消息队列中去除掉,同时以另 一个邮件消息通知发信人(即Alice)。

 

       电子邮件

       电子邮件是一种通过网络实现相互传送和接收信息的现代化通信方式。它是种用电子手段提供信息交换的通信方式,是Internet应用最广的服务,通过网络的电子邮件系统,用户可以用非常低廉的价格,以非常快速的方式,与世界上任何一个角落的网络用户联系,这些电子邮件可以是文字、图像、声音等各种方式。同时,用户可以得到大量免费的新闻、专题邮件,并实现轻松的信息搜索。

       电子邮件由信封和内容两个部分组成。信封又称邮件头,电子邮件服务器根据信封上的信心来传递邮件的。内容称为邮件体,它用于提供邮件的具体内容。

       Internet上的电子邮件地址全球唯一,其格式为“邮箱名@邮件服务器域名”。域(邮件域)是电子邮件服务器的基本管理单位,邮件服务以域为基础,每个邮箱对应一个用户。其中邮件服务器域名必须是已注册的DNS域名,并且必须要与MX(邮件交换机)记录匹配。DNS用于将域名、主机名解析为IP地址。MX记录指向该域名的邮件服务器主机记录,为邮件服务专用。

 

       邮件客户端软件

       邮件客户端软件负责与邮件服务器通讯,主要用于帮助用户将邮件发送给SMTP服务器和POP3/IMAP邮件服务器读取用户的电子邮件。邮件客户端软件通常集撰写、发送、接收邮件于一体。

 

 

       电子邮箱

       每一个电子邮件服务器之上都可以开始多个电子邮箱,电子邮箱也称之为E-Mail地址。它类似于现实生活中的通讯地址,用户通过它接受别人发来的电子邮件和向别人发送电子邮件。

       电子邮箱的获得需要在电子邮件服务器上进行申请,确切的说,电子邮箱其实就是用户在邮件服务器上申请的一个账户。邮件服务器把接收到的邮件保持到为某个账户所分配的邮箱空间中,用户通过其申请的用户名和密码登陆到邮件服务器上查看该地址已经收到的电子邮件。

 

       电子邮件的传输过程

       电子邮件系统采用客户/服务器模式。电子邮件传送需要用到以下3个重要模块:

       MUAMail User Agent,邮件用户代理):用户通过它与电子邮件服务器打交道。MUA实际上就是邮件客户端软件。

       MTAMail Transfer Agent,邮件传输代理):它主要负责处理所有接收和发送的邮件,为MUA或者MTA提供邮件发送服务,接收其他MTA发送过来的邮件。

       MDAMail Delivery Agent,邮件投递代理):它负责邮件本地投递。当MTA决定某邮件发送本地用户时,MTA将邮件交给MDA程序进行分发,也就是说投递到用户的。

       具体的传递过程如下:

            1、  发件人利用MUA将邮件发送给MTA

            2、 MTA收到邮件后判断收件人是不是本地账户,如果是本地账户,交由MDA投送到该账户的邮箱中,完成发送过程,跳到第5步。如果不是则执行下一步骤。

            3、 MTA根据其邮件中继转发设置来决定如何转发邮件。

            4、  最终目的的MTA将受到的交给他的MDA处理,有MDA将邮件投递到收件人的邮箱中。

            5、  收件人利用MUA通过POP/IMAP协议连接到邮箱所在的服务器,请求查看自己的收件箱是否有邮件,如果有邮件,将会通过它传送个收件人的MUA

       注意:提示邮件访问服务的是POP或者IMAP服务器软件,而并非当初收下邮件的MTA,两者的角色是分离的。

 

       邮件传输协议

       电子邮件服务传输主要是用到以下3中网络协议

        SMTP(简单邮件传输协议)

       SMTPSimple Mail Transfer Protocol。标准TCP端口是25MUA将邮件发送到MTAMTA将邮件发送给下一个MTA,都是要使用SMTPSMTP的目标是可靠高效地传送邮件,它独立于传送子系统而且仅要求一条可以保证传送数据单元顺序的通道。

       SMTP是一个“单向”的协议,它不能用户从其他邮件服务器收取邮件。它本身是采用客户/服务器模式,负责发送邮件的SMTP进程就是SMTP客户端,负责接收邮件的SMTP进程就是SMTP服务器。一个完整的SMTP通信过程主要包括建立连接、传送邮件、释放连接三个过程。

       建立连接:首先由发件人将要发送的邮件发送到邮件缓存,SMTP客户端定期扫描邮件缓存,一旦发现有邮件,就与SMTP服务器建立TCP连接,然后发送HRLLO命令以附上发送方的主机名。

       传送邮件:SMTP客户端使用MAIL命令开始传送邮件,该命令提供发件人的地址;然后执行RCPT命令,并提供收件人地址;最后执行DATA命令传送邮件内容。

       释放连接:邮件传送完毕后,SMTP客户端发送OUT命令请求关闭TCP连接。

         POP(邮局协议)

         POPPost Office Protocol。标准TCP端口为110。主要用于电子邮件的接收。MUA经由POP协议连接到MTA的用户收件箱,以读取或下载用户在收件箱中邮件。

    目前用的较多的POP协议是POP3POP3使用 TCP 作为传输协议。

       IMAPInternet信息访问协议)

       IMAPInternet Message Access Protocol。标准TCP端口为143,它也是让MUAMTA收取邮件。目标球IMAP协议的版本为IMAP4

       POPIMAP两者都可以用于收取邮件,都是采用客户/服务器模式,两者最主要的区别就在于他们检索邮件的方式不同。使用POP时,邮件驻留在服务器中个,一旦接收邮件,邮件都从服务器上下载到用户计算机上。而IMAP则能够然该用户了解到服务器上存储邮件的情况,已下载的邮件仍然滞留在服务器中,以便于实现邮件归档和共享。

posted @ 2014-05-04 06:19 ZT文萃 阅读(412) | 评论 (0)编辑 收藏

转载自:
http://www.cnblogs.com/chenssy/p/3308489.html
版权归作者所有。

      首先来看看浅拷贝和深拷贝的定义:

      浅拷贝:使用一个已知实例对新创建实例的成员变量逐个赋值,这个方式被称为浅拷贝。

      深拷贝:当一个类的拷贝构造方法,不仅要复制对象的所有非引用成员变量值,还要为引用类型的成员变量创建新的实例,并且初始化为形式参数实例值。这个方式称为深拷贝

      也就是说浅拷贝只复制一个对象,传递引用,不能复制实例。而深拷贝对对象内部的引用均复制,它是创建一个新的实例,并且复制实例。

      对于浅拷贝当对象的成员变量是基本数据类型时,两个对象的成员变量已有存储空间,赋值运算传递值,所以浅拷贝能够复制实例。但是当对象的成员变量是引用数据类型时,就不能实现对象的复制了。

      存在一个对象Person,代码如下:

复制代码
public class Person {     private String name;     private String sex;     private int age;          public Person(String name,String sex,int age){         this.name = name;         this.sex = sex;         this.age = age;     }          public Person(Person p){                   //拷贝构造方法,复制对象         this.name = p.name;         this.sex = p.sex;         this.age = p.age;     } }
复制代码

      上面的对象Person有三个成员变量。name、sex、age。两个构造方法。第二个的参数为该对象,它称为拷贝构造方法,它将创建的新对象初始化为形式参数的实例值,通过它可以实现对象复制功能。

      又有一个对象Asian,如下:

复制代码
public class Asian {     private String skin;     Person person;          public Asian(String skin,Person person){         this.skin = skin;         this.person = person;                    //引用赋值     }      public Asian(Asian asian){                 //拷贝构造方法,复制对象         this(asian.skin,asian.person);                } }
复制代码

      上面对象也存在着两个成员变量,skin 和Person对象

      对于person对象有如下:

Person p1 = new Person("李四","mam",23);   Person p2 = new Person(P1);

      当调用上面的语句时。P2对象将会对P1进行复制。执行情况如下如下图:

      对于Asian对象有:

Asian a1 = new Asian("yellow",new Person("李四","mam",23)); Asian a2 = new Asian(a1);

      New Asian(a1)执行Asian类的拷贝构造方法,由于对象赋值是引用赋值。使得a1和a2引用同一个对象

      如下图:

      当a1执行某条可以改变该值的语句时,那么a1将会通过这个语句也可以改变a2对象的成员变量

      如果执行以下语句:a2.name = new Person(a1.name)

      这时将会创建一个新的Person对象

      如下图:


posted @ 2014-05-04 06:15 ZT文萃 阅读(370) | 评论 (0)编辑 收藏

转帖:

http://www.cnblogs.com/chenssy/p/3695271.html
版权归作者所有。


     今天朋友问我String的内容是真的不可变吗?我肯定告诉他是的?因为在我的主观意识里String就是一个不可变的对象。于是他给我发了这段程序:

复制代码
public class StringTest {     public static void main(String[] args) throws Exception {         String a = "chenssy";         System.out.println("a = " + a);         Field a_ = String.class.getDeclaredField("value");         a.setAccessible(true);         char[] value=(char[])a.get(a);         value[4]='_';   //修改a所指向的值         System.out.println("a = " + a);     } }
复制代码

      看到这个简单的程序,我笑了,你这不是从底层来修改String的值么?从这里来理解String的值肯定是可以改变的啦(我们应该始终相信String的不可变性)!接着他再给我一段程序:

复制代码
public class StringTest {     public static void main(String[] args) throws Exception {         String a = "chenssy";         String b = "chenssy";         String c = new String("chenssy");         System.out.println("--------------修改前值-------------------");         System.out.println("a = " + a);         System.out.println("b = " + b);         System.out.println("c = " + c);         //修改String的值         Field a_ = String.class.getDeclaredField("value");         a_.setAccessible(true);         char[] value=(char[])a_.get(a);         value[4]='_';   //修改a所指向的值                  System.out.println("--------------修改后值-------------------");         System.out.println("a = " + a);         System.out.println("b = " + b);         System.out.println("chenssy");         System.out.println("c = " + c);     } }
复制代码

      乍看这程序是异常的简单,无非就是赋值、改值、输出嘛!可能你现在就会毫不犹豫的说太简单了结果就是……。但是!!你的毫不犹豫会害死你,而且你的结果很可能错误。那么运行结果是什么呢?

复制代码
--------------修改前值------------------- a = chenssy b = chenssy c = chenssy --------------修改后值------------------- a = chen_sy b = chen_sy chen_sy c = chen_ssy
复制代码

      修改前值很容易理解,但是修改后值呢?是不是有点儿不理解呢?你可能会问:为什么System.out.println("chenssy");的结果会是chen_ssy,System.out.println("c = " + c);也是chen_ssy呢?

      要明白这个其实也比较简单,掌握一个知识点:字符串常量池。

      我们知道字符串的分配和其他对象分配一样,是需要消耗高昂的时间和空间的,而且字符串我们使用的非常多。JVM为了提高性能和减少内存的开销,在实例化字 符串的时候进行了一些优化:使用字符串常量池。每当我们创建字符串常量时,JVM会首先检查字符串常量池,如果该字符串已经存在常量池中,那么就直接返回 常量池中的实例引用。如果字符串不存在常量池中,就会实例化该字符串并且将其放到常量池中。由于String字符串的不可变性我们可以十分肯定常量池中一定不存在两个相同的字符串(这点对理解上面至关重要)。

      我们再来理解上面的程序。

      String a = "chenssy";

      String b = "chenssy";

      a、b和字面上的chenssy都是指向JVM字符串常量池中的”chenssy”对象,他们指向同一个对象。

      String c = new String("chenssy");

      new关键字一定会产生一个对象chenssy(注意这个chenssy和上面的chenssy不同),同时这个对象是存储在堆中。所以上面应该产生了两 个对象:保存在栈中的c和保存堆中chenssy。但是在Java中根本就不存在两个完全一模一样的字符串对象。故堆中的chenssy应该是引用字符串 常量池中chenssy。所以c、chenssy、池chenssy的关系应该是:c--->chenssy--->池chenssy。整个 关系如下:

      201404271001

      通过上面的图我们可以非常清晰的认识他们之间的关系。所以我们修改内存中的值,他变化的是所有。

      总结:虽然a、 b、c、chenssy是不同的对象,但是从String的内部结构我们是可以理解上面的。String c = new String("chenssy");虽然c的内容是创建在堆中,但是他的内部value还是指向JVM常量池的chenssy的value,它构造 chenssy时所用的参数依然是chenssy字符串常量。

      为了让各位充分理解常量池,特意准备了如下一个简单的题目:

String a = "chen"; String b = a + new String("ssy");
         创建了几个String对象??

posted @ 2014-05-04 06:10 ZT文萃 阅读(209) | 评论 (0)编辑 收藏

Class的getResource方法,实际上是靠调入这个类的ClassLoader的getResource方法来实现的,如果调入这个类的ClassLoader是原生的BootStrap ClassLoader,这个ClassLoader是用C++写成的,在Java中没有相对应的物件。这时候的实现靠的是ClassLoader的静态方法getSystemResource。

只有当使用Class类的getResource方法的时候,才会有下面介绍的那种算法。

这种算法就是说,如果你指定的路径以/开头,那么就是从ClassPath的起点开始寻找这个路径。如果直接以某个名字开头,那么就是从当前包名的目录为起点开始寻找。
所以大家如果用过hibernate就知道,有些表示类到数据库表的映射关系的xml文件就和这个类的class文件放在一起,这样它就直接使用这个类.class.getResource方法来得到这个xml文件。

而在使用ClassLoader的getResource方法的时候,永远是以Classpath为直接起点开始寻找资源的。不用担心从什么包开始寻找的问题。

用Class.getResource不加/就是从当前包开始找,用ClassLoader.getResource不加/就是直接从Classpath的起点开始寻找。

当然,如果觉得麻烦,你定位资源的时候全部都使用/开头的方式就好了

posted @ 2014-05-02 15:48 ZT文萃 阅读(546) | 评论 (0)编辑 收藏







查找带有给定名称的资源,查找给定类相关的资源的规则是通过定义类的 class loader 实现的。此方法委托给此对象的类加载器。如果此对象通过引导类加载器加载,则此方法将委托给 ClassLoader.getSystemResource(java.lang.String)

在委托前,使用下面的算法从给定的资源名构造一个绝对资源名:

  • 如果 name'/'  开始,则绝对资源名是 '/' 后面的 name 的一部分。
  • 否则,绝对名具有以下形式:
       modified_package_name/name 

    其中 modified_package_name 是此对象的包名,该名用 '/' 取代了 '.' ('\u002e')。

Class.getResource(""); 获取classpath

 

Class.getResource("JMF.class"); 代表获取相于类路径当前包下的SendService.class的类路径.

/D:/bak/upload/upload/WebRoot/WEB-INF/classes/jmf/JMF.class-------->打印出的结果

Class.getResource("/jmf/WebCamSwing.class"); /jmf/WebCamSwing.class->代表相于类路径的绝对路径

file:/D:/bak/upload/upload/WebRoot/WEB-INF/classes/jmf/JMF.class  -------->打印出的结果

 

我们怎么获得Object的类路径:

Class.getResource("/java/lang/Object.class") 因为Object是通过引导类加载器 (BootStrapClassLoader)加载的,所以此方法通过系统类加载器来查找资料, 所以我们要指定类的绝对路径/java/lang /Object.class

public java.net.URL getResource(String name) {
        name = resolveName(name);
        ClassLoader cl = getClassLoader0();
        if (cl==null) {
            // A system class.
            return ClassLoader.getSystemResource(name);
        }
        return cl.getResource(name);
    }

 

我们来看看如何通过系统类加载器来查找Object:

Class.getClassLoader().getSystemResource("java/lang/Object.class")

 

打印出来的结果多是:

jar:file:/E:/Program/Java/jdk1.5.0_15/jre/lib/rt.jar!/java/lang/Object.class

 

为什么getResource("")前面要加"/",而getSystemResource("")前面不用加呢?

private String resolveName(String name) {
        if (name == null) {
            return name;
        }
        if (!name.startsWith("/")) {
            Class c = this;
            while (c.isArray()) {
                c = c.getComponentType();
            }
            String baseName = c.getName();
            int index = baseName.lastIndexOf('.');
            if (index != -1) {
                name = baseName.substring(0, index).replace('.', '/')
                    +"/"+name;
            }
        } else {
            name = name.substring(1);
        }
        return name;
    }

 

其实最后还是要把"/"去掉的...

posted @ 2014-05-02 15:34 ZT文萃 阅读(286) | 评论 (0)编辑 收藏

转载自:

1 JButton 图片和文字按钮的实现



JButton btn1 = new JButton("打开", new ImageIcon(ImageView.class.getResource("10.png"))) ;

btn1.setHorizontalTextPosition(SwingConstants.CENTER);

btn1.setVerticalTextPosition(SwingConstants.BOTTOM);

 

效果图 :

clip_image003

2 JButton 图片透明按钮的实现



setLayout(new FlowLayout(FlowLayout.RIGHT, 30, 0));

btn1.setIcon(UIConfig.getImgUrl("常用交易字.png"));

btn1.setRolloverIcon(UIConfig.getImgUrl("常用交易.png"));

btn1.setBorderPainted(false);

btn1.setFocusPainted(false);

btn1.setContentAreaFilled(false);

btn1.setFocusable(true);

btn1.setMargin(new Insets(0, 0, 0, 0));

btn1.setText("常用交易");

 

clip_image006

3JRadioButton 图片透明按钮的实现

JRadioButton radio = new JRadioButton(UIConfig.getImgUrl("常用交易字.png") );

radio.setContentAreaFilled(false);

radio.setRolloverIcon(UIConfig.getImgUrl("常用交易.png"));

radio.setSelectedIcon(UIConfig.getImgUrl("常用交易.png"));

clip_image006[1]

posted @ 2014-04-27 11:12 ZT文萃 阅读(500) | 评论 (0)编辑 收藏

posted @ 2014-03-28 08:56 ZT文萃 阅读(140) | 评论 (0)编辑 收藏

被洗脑的中国人常用的10句话

NO.1【你不能改变别人,只能改变自己】

适用人群:这句话对有一种人是管用的,那就是一天到晚只会嫌别人做的不好,似乎全天下都欠了他从来不反思自己是不是有问题的人。特别是那种试图让全世界都按照他们的方式运转的人。只可惜,越是这种人,喊“改变自己”喊得越响,他们是在要求别人改变来适应他们的固执。

奴性潜台词:改变有很多种,但是一大部分喜欢用这句话给别人洗脑的人,强调的总是让人变得柔顺的那一面。遇到了矛盾,要求你先理解体谅,先改变自己的态度,而且是“只能”这样做,他们会反复地强调你“只能”这样做,甚至把某些不该你承担的责任,推到你的头上。

破解:凭什么不能改变别人,就要改变自己?需要改变的是对付别人的方式,而不是自己的原则。改变有很多种,比如有人天天抽你,你改变不了这个人,但是你可以选择1.抽他2.离他远点,他要是继续缠着不放,抽他3.调整心态继续忍耐。如果抽的够狠,未必不能改变别人。

NO.2【社会就是这样,你又不能改变社会,只能适应】

适用人群:只埋怨社会不公平,世界不公平,没有好机遇而自己完全不努力的人。把自己的loser全部归于社会的不公平,全部归于“没赶上好时候”,成天怀念所谓的“从前人们多么多么有道德”。

奴性潜台词:这句话听得最多的是在上学的时候——“现在中国就是应试教育,你又当不了教育部长,不能改变,你就只能适应”,毕业了,他们会用这句话来扼杀梦想,“你想的多好多好,但现实是这样,你只能适应”。用这句话洗脑的用意在于——我们可以承认有些事情是不合理的,但是你们能怎么样,你们没有力量挑战社会大趋势的权威,就不要指责社会大趋势的不合理了,社会让你干啥,你就干啥。所以这句话经常被用来堵嘴,凡是对某些事物有不同的看法,对社会弊端有自己的批评,往往会遭到这句话的堵嘴攻击。

破解:先不讨论人能不能改变社会,这没啥可论的,就先承认如我等草民是没有能力移山填海,这句话仍然浑身破绽。社会就是“这样”,就是哪样呢?你只能适应?适应哪种趋势呢?洗脑者口中的社会现实是否就是真正的社会现状?例如最常见的“公务员至上”的择业观,即使是目前这确实是一种趋势,但也不是唯一的出路。再比如现在的婚恋观,在某些人那里变成了完全的物质交换。这些所谓的趋势,并非不可改变的洪流,它们看似气势汹汹,其实其中包含很多被放大的焦虑。如这类现象,你或无法改变,也不必非要“适应”。再退一步,适应,是否就等于随波逐流?无奈的事,不合理的事有很多,就像郭嘉的教育,我们不是教育部长,是不是就应该对不合理之处避之不谈?甚至认为那就是合理的?或者是不是把自己弄成一个只会学习的书呆子,这才叫适应?即使不能改变社会,我们总有保持清醒的权利,在这个神奇的年代,茫茫然随大流,怎么死的可能都不知道。

NO.3【不要抱怨,抱怨又解决不了问题】

适用人群:极端消极,除了抱怨什么都不做的一少部分人。为了抱怨而抱怨的人。

奴性潜台词:与这句话类似的还有“有抱怨的时间不如去做blabla……”“有抱怨的时间你早就巴拉巴拉……”“有本事不要在这里抱怨,去巴拉巴拉……”。事实上,说这些话的人有意无意忽略了一点,抱怨和抱怨是不一样的,“抱怨”对每个人的意义也是不同的。被他们称作“抱怨”的情绪,细分起来能够分成很多种,他们会把对某些事物的攻击,求责、不满、批评全部划分进“抱怨”的行列,然后一棍子打死,这样能够化解很多指责和批评,当你批评的时候,说你是抱怨,一下子就可以把责任推到你的心态上。同时,“解决问题”的说法,完全忽视世上有“心理问题”,只集中于“现实问题”,忽视人是有情感有悲喜的,完全把人看做一种木偶般的存在。

破解: 抱怨其实是一种不太受周围人欢迎的行为,特别是不能感同身受的人,他们会本能地逃避负面情绪,并且阻止他人愤怒情绪的表达。对于统治者来说,被统治者的抱怨,是一种危险的信号,代表内心有怨气,有怨气就可能会有反抗。 甚至很多本意是善良的人,他们会简单认为,满脸笑容满口乐观语言的人,就一定是比正在抱怨的人快乐,从而站出来阻止抱怨,鼓励乐观。事实上,抱怨的积极意义比想象中大得多,通过适当的抱怨发泄情绪,直面真实,明确责任,其意义有时甚至大于所谓“解决问题”。至于对付某些圣母,我会直接告诉他——我这可不是在抱怨,我是在骂你。

NO.4【少抱怨,多感恩】

适应人群:天天在喊这些话的人,最需要这句话。

奴性潜台词:又是一句生生被毁了的曾经有道理的话,毁掉这句话的,就是最推崇它的那一批人。它越来越变成了强势对弱势的一种要求,这使它成为这十句话的奴性之首。对领导,少抱怨多感恩。对社会,少抱怨多感恩。对国家,少抱怨多感恩。对老师,少抱怨多感恩。对父母,少抱怨多感恩。上对下的要求,强对弱的要求。对别人提这样的要求,自己就可以少一点承担责任,少一点付出。然后,弱势和弱势之间竟然也在互相说着——“咱们要少抱怨多感恩呀,这样才能活得快乐呀”。甚至,把该怨的事说成恩,让你去感恩戴德,天朝这样的事还少吗?

破解:就事论事。怨恨该怨恨的,感激该感激的。 锻炼自己区别这二者的能力 。子曰过的——以直报怨,以德报德。

NO.5【比起谁谁谁,你已经很幸福了】

适用人群:无,我从不认为幸福不幸福是比出来的

奴性潜台词:他们总会找到比你更惨的人。来证明你“其实已经很幸福了”。目的是让你知足,知足,就不会提更多的要求,知足,就不会有太多的对他们的指责。甚至,通过找一个比你过的惨的人,让你感觉产生误差,以为他们给你吃的苦还都是甜的。这是那些洗脑者的逻辑。有比你惨的人,你就觉得自己幸福了,某种程度上不是一种好的心态。你嚼着窝头,回头一看还有吃不上饭的,你就觉得窝头啃着挺香,你不去想想怎么能让自己吃上白面?你买不起鞋,回头一看还有人没有脚,你就满足了?你不去努力挣钱给自己买鞋?这几年,劝人要知足的越来越多,鼓励人有追求的却越来越少。

破解:人和人是不一样的,幸福还是痛苦只有自己知道,不能因为世上断腿的人多,就不允许崴了脚的人哼哼。谢绝比较谁更惨,谢绝“你这样已经算是很幸福”。人幸福不幸福的标准是自己的,不是比较出来的。
尤其是不要在我郁闷的时候,再跑过来和我说你当年多惨多惨你现在这个算什么。 对他人的伤痛表示轻视,是一件残忍的事情。再有人这样对你抽他丫的

NO.6.【凡事多从自己身上找原因】

适用人群:建议那些总是以此要求别人的人试试。

奴性潜规则:用 “凡事”取代就事论事,以偏概全,用一个“多”“少”的界定,直接混淆了黑白。要求你凡事对内归因,就像是这十句话的共同特点那样,是对对方错误的有意迁就和回避。矛盾的起因,该谁的就是谁的,如果要“多”找自己的,“少”找别人的,方式就只能是把别人的错误压在自己头上。这一点在父母和孩子的关系中体现的尤其明显,很多父母尤其喜欢把矛盾的责任全部推给孩子,把自己情绪的起因全部推给孩子。一个人畏惧强权,不敢把原因归于真正的责任人,而是归结到自己身上,善良且可悲。

破解:凡事向内归因,对心理产生的压力是巨大的,承担太多本不该属于自己的过错。如果形成了对内归因的习惯,外界的伤害会有翻倍加在你身上的后果。不回避自己的责任,但“原因”该谁的就是谁的,我们没有“多”找自己原因的义务。

NO.7【快乐也是一天,不快乐也是一天,为什么不过的快乐一点?】

适用人群:……………………我也不知道对哪些人才适用这一句……(这句话我听得太多了,不走大脑地就说,自己不爽的时候却从来用不上,最极品的一次,我的一个朋友发帖抱怨极品上司对她的欺压,下面回帖竟然说反正快乐不快乐都是一天,还是开心地过吧。我靠,你哪怕什么都不说呢,也比来这么一句好)

奴性潜台词:这是极端麻木的一句话,很多人只是机械地重复它,自己却做不到,足以说明这是句脑残废话。对大多数人来说,在多数时候,快乐还是不快乐,是有原因的。闲着没事一直傻乐的,闲着没事一直不快乐的,少。说这话的人,把人活着的每一天,描述成驴拉磨一样的僵化,“快乐也是拉一天磨,不快乐也是拉一天磨,为什么不快乐地拉磨呢”他们宣扬乐观,可他们本身对待生活的态度,却不是积极的,既然不能去死,那就混一天算一天。回避不快乐的根源,这不是乐观,是麻木。把这话变一下,就可以看出它的荒谬性。

“生病也是一天,不生病也是一天,你干嘛非生病呢?” 用这话洗脑的人,正是强化你对人生的无能为力感,同时宣扬快乐至上,不管你的目标是什么,一句快乐最重要,统统抹杀。

破解:有病别傻乐了,吃药去吧!

NO.8【父母都是为了你好,只是方式不对】

适用人群:如果有人不分情况地对你说这个,揍他,然后把这句话送给他。 奴性潜台词:只要目的是“为了你好”,任何方式你都要接受,甚至还要感恩。但是,“为了你好”这件事是不能证明的,因为打着为了你好的旗号做出的伤害,全部会用“方式不对”来掩饰。这是流氓逻辑。 用这句话可以隔绝一切讲道理的可能性 所有的父母都是为了你好——所以你的父母肯定是为了你好父母在所有事上都是为了你好——所以在这件事上父母是为了你好,因为是为了你好——所以你要接受推论完成,结果是你要无条件接受父母的一切。

破解:一个人,强调自己的父母是对自己好的,强调自己爱自己的父母,完全没有问题,值得支持。但他没有资格判断别人的父母是不是这样的。更没有资格在一件他不了解的事情上,断言谁对谁错。因为有部分父母,在很多事上是在“为孩子好”,就以此断言所有的父母都是如此,是很脑残的。 即使是属于“真的好”的一部分,此言也不可取。父母所追求的,是他们所认为的好,不一定是孩子认为的好。 方式不对,也应该为这份不对负责。 方式不对,子女也有权反抗。以上都是废话,最想说的是——圣母退散。

NO.9【没有不爱自己孩子的父母】

这一句在逻辑上脆弱不堪的话,却是十句话中的大BOSS。 没有不爱孩子的父母=所有的父母都爱自己的孩子要推翻这条假设,仅需要一个反证即可。事实上,反证绝对不仅一个,只是多数圣母,对这些反证会选择无视。或者干脆在“爱”的定义上做文章,把伤害说成是爱,是表达方式错了的爱。所谓“表达”,需要有“内在”,没有“里”何来“表”,内心无爱,如何能表达出爱?甚至当有的父母自己说出不爱自己的孩子时,圣母们也会选择性无视。之所以有这么多人支持这个观点,不仅仅是因为长期的洗脑,也因为这是一个能够给人以好处的前提。

推理1:所有的父母都爱自己的孩子

我是你的父母

我必然爱你 然后可以在“爱”的旗号下为所欲为。

推理2:所有父母都爱自己的孩子

我是他们的孩子

他们必然爱我

然后可以暂时忽视伤害,取得内心平衡。

破解:还是那句话,你父母爱不爱你,你爱不爱父母,你自己感觉是就可以是。

但是你没有资格判断另外两个人之间有没有那种爱。 人心是复杂的,父母也分很多种。

NO.10【 再过几年你就不这样想了】

奴性潜台词:这句话的潜台词其实是——再过几年你就会像我们这样想。随着年龄阅历的变化,想法改变会很正常。但是,没有人能够断言自己将来会怎么想。持此观点的人,认为对事物的看法是唯一的,世上所有的人都会“这样想”,没有“这样想”的人,仅仅是因为时间还不到。用这句话给你洗脑,是在告诉你,你早晚会像我们一样思考的,还不如现在就听我们的,以此打击你对自己判断的信心。如果你真的对自己的判断完全失去信心,认为自己的未来必然会按他们的思维方式进行,他们的目的就达到了。

世界上又成功地多了一个复制品,然后这个复制品会继续去劝说别人。

破解:(是不是有点恶毒?) 再过几年人还会死呢。

posted @ 2014-03-27 08:01 ZT文萃 阅读(231) | 评论 (0)编辑 收藏

人真的需要知道自己要什么,下文值得一看。 

        98年本科毕业,又顺利地被保研,当时的我只是一个憨憨的书呆子,纯洁的如同高中生,在清华这种 和尚庙一般的理工学校里呆了四年,女孩似乎是山下的老虎,神秘得让我一见就脸红心跳。未来是什么对于我就是“读完研再说”,反正成绩还行,不读白不读。天 上掉了馅饼,用我的兄弟的话来说。香港正好回归一周年,教育部要选派一批本科毕业生去香港科技大学读研,以加强两地的教育和科研交流。清华当然要占不少名 额,系里的几个牛人去了美国,所以这个饼就掉到了我头上,确实是个不错的饼,不用考G、考托、全额奖学金,连什么手续都是学校和教育部包办了,我分文不 花,后来香港科大的联络人抱怨中国的办事效率和程序烦琐,至于怎样的麻烦过程,我至今都一无所知。
  香港科大
   就这么糊里糊涂地来到了香港。依山傍海的科技大学美得如同世外桃源,现代感的建筑更让我们爽眼。当时的一个哥们说:“妈的,就是用银子在荒山野岭堆出来 的,这样的物质条件算是让我满足了。”后来得知就是亚洲最美丽校园,倒也丝毫不怀疑。据说是香港政府感到了贸易和服务的优势正受中国沿海城市的挑战,而科 技就是竞争力,就下了狠心投钱建了这学校,请来了学者。耗资400亿港币,相当于微软公司一年的纯利。组织的参观,教授的讲话,英语的培训很快就过去了, 当时的新奇兴奋也褪得干净,每天面对这青山海景,最后也麻木得没有感觉了。由此可以推测娶一个漂亮老婆是没有多大意义的,如果不是为了炫耀。教授大多是华 人,台湾和大陆出身的不少,反倒香港人是少数派,很多都是在北美的名校里拿了PhD,奔这里的高薪来了,他们的PhD头衔总要和名字相片挂一起,挂一辈 子,Harvard和Standford之类的当然就香了。正教授可以一年拿到一百多万港币,也就是一个月可以买小汽车,比一般的美国大学高。知识真的值 钱了,让我们充满了对未来的向往。有回和教授们吃饭,谈及大陆大学教授的待遇,他们就感慨:“知识分子真被廉价到了可耻的地步。”我们也无话可说,反正不 是我的错。然而钱不是好拿的,很多教师正是三十出头,教授职称还未到手,和学校只是几年合同,其他的学者也不断在申请进来,所以压力颇大,辛勤程度比公司 打工仔有过之而无不及。既然自己做学问要紧,培养学生的事就要往后排了。刚进来时很多教师和我们亲切讲话,之后就不见了,好久不见就不认得。研究生当然有 导师的,只要自己不去找他,他是肯定不会找我的。上课之后就是绝对的自由,当时自由得很是惬意。

        萧伯纳说人生的苦闷有二,一是欲望没有被满足,二是它得到了满足。这话的确是部分的真理。当我住在这绝世美丽的地方,可以随心所欲的去商店买东西不用担心 付不起帐,可以任意的支配自己时间时,最初的半年里,却发现情绪每况愈下。西方化的建筑设计将个人的所谓privacy保护发挥到极致,进了宿舍就基本感 觉不到他人的存在,同单元的人也有独立的卧室,大家都是进了房,将门一关,隔离了,谁也不好意思去敲门。刚来时认识的一伙人,后来发现根本遇不着,如同消 失了一般。同住一起的是三十好几的叔叔级人物,偶尔可以说上一两句话,却永无可能说很多。大家都像是住在不同的空间里做研究,忙碌的无瑕顾及他人。

   平心而论,对于一个成熟的研究者,如果他有确定的目标和兴趣,对生活人生都不再有不切实际的幻想,准备投身科学研究中,那么这里真是一个好环境。但是我 种茫茫睁着无知的眼睛的毛头小子,却是完全另外的感觉。那种茫然的苦闷感觉真是难以描述,找不到人玩,只是将窗户开了又关,关了又开,不停的喝水,仍然感 觉不舒服。怀念在清华的破楼里相互串门打闹的日子,怀念抱着篮球在走廊里叫一声就应者云集的日子,可是怀念解决不了问题。以孩子的心理去进入成熟严谨的环 境,不可不说是一次考验。

  多年的功利教育的辛勤培养,我一路顺当地走过来,发现完全的上当。我在成功的通过了一次次考后,最终都不知 道我为什么要通过这些占距人生的考试,这个所谓的优秀学生只是在不停地让自己去符合那个“优秀”的外在标准来麻痹自己的虚荣心,而自己,那个真正的自己却 一直没有存在过,没有发育过。我学的任何课程都无法帮我解决当时的苦恼,那么每天学那些微分方程又是为了什么?还去为了父母的微笑,人们的赞许吗?年年得 奖学金的清华毕业生是了这么一个怪物:不知道自己要什么,也不知道生活是什么,对社会毫无接触,二十出头,可是见女孩子就一身不自在,会解各式各样的方 程,却不能解决自己的困惑,硕士博士的路就在眼前,可是不知道还应不应该这样走下去,这状态难道就是我的追求?一个智商还不错的人努力多年就变成这样?

   这是一个问题,很早就有了,只不过太晚地暴露出来,我相信这样的问题依然将被很多师弟师妹们面临,我相信在清华依旧有很多像我当年一样的学生。当看到他 们天真的讨论: G 2***, 托 6**,GPA 3.*, 学校名次Top **, 仿佛几年的辛劳就只为那么点数字,人生的终极标就是goabroad. 我无法不为他们忧虑。这也是促使我写这篇文章的主要原因。

  很多人没有对做研究的真正兴趣,但是用尽了精力去获得一个去国外做科学研究的机会,就洋溢在掩饰不住的喜悦里,甚至对人生毫无真正规划,对自己的兴趣一无所知,为出国而出国,那将在告别父老乡亲后去迎接苦闷的开端。

   香港的学生很实际,决大多数本科毕业就去赚钱,三十之间为结婚买房奋斗,如果告诉一个香港人说你二十八了还在读博士,他会觉得你很失败,可能是根本不会 赚钱。而留下来读博士的香港学生,就是真的很喜欢作研究的人,扎实地做事,他们的认真让我们一批朝三暮四,心猿意马的大陆学生汗颜。

  生活在香港
   都说香港是弹丸之地,其实一千多平方公里的面积也不算小,不过大多是山,可利用的地方不多,很多商业区都是添海造出来的。亚热带的气候,又在到处是山和 海湾的地方,风景当然好。香港的气候比北京舒适一万倍,冬天冷不了,夏天也不太热,甚至没有明显的四季感。只是上半年天气有些潮。成天都有湿湿的感觉,北 方人有点受不了。

  香港的交通极其发达,公共车从不拥挤,也很少堵车,可是香港的道路比北京的窄得多,车也不会少,布局和管理更好而 已,看来北京走向国际化还须努力。这里是名符其实的购物天堂,东西也不算贵,电器和服装可能比北京便宜,特别是国际名牌,由于没有关税,肯定要比大陆便 宜。所以不必带很多衣服来,足够便宜了。但是服务业,比如吃饭,理发,涉及到员工劳动和地租的就要比大陆贵好几倍。可以随便往来深圳也是在香港的一大好 处,一天可以轻松来回好几次,在香港读书的学生可一得到香港的临时身份证,加上护照上盖个章,就可以自由出入境了。

  常有人问及香港的影视明星,可是到了香港就觉得那些人也只是打工仔,背后是更有影响力的老板,一旦老板不想捧了,明星就会很快消失,新人会取而代之。看到他们卖力地载歌载舞,其实也是生存需要,在商业社会里那是绝对的驱动力。

  香港的金融和资讯服务相当发达,在所谓第一世界里也算相当突出,可以很便宜的享受到信用卡,电讯,互联网服务,因此有些人在香港呆久了再回来反而不适应了,主要就是这些方面,当然还有其他制度等软件原因。

   说到学校的生活,物质条件比国内任何大学好,甚至条件好过美国不少学校,香港的学生很少住宿学校,所以一到周末放假学校就很冷清。通常大陆学生独享学校 设备,偌大电脑房和运动场,舒服的游泳池,都有不少美好回忆。学生宿舍条件不错,可以做饭,自己做比在餐厅里吃来的便宜,所以大陆学生会乐此不疲,周末常 三五成群,做吃的为乐。餐厅里中西餐都有,中餐以广东口味为主,忙起来时以营养为重,口味不对也只能将就吃了。

  现在在香港的大陆学生 不算多,总共有四五百人,各个学校都有学生联谊会,是比较松散的组织,也有一些机会认识朋友。周末会组织放放电影,搞舞会。临近考试或论文时,谁也没心思 搞活动。香港的学生很好打交道,在成熟的社会里长大的人,心理相对简单且好玩,不像一些大陆学生常常过分盘算自己的明天,将自己逼的很累。他们对大陆也渐 渐感兴趣,虽然他们常常不知道湖南和四川,只说得上秦始皇和毛泽东。只要主动点和他们交流,是可以结识不少朋友的,粤语不是障碍,很多人可以听普通话,而 且,广东话不难学,不留神就长进不少。

  关于工作机会
  很多人就终于跳到北美去了,大多还是接着读书,从这个意义上讲,香港只是跳板。

  在香港留下工作的机会不多,如果在进香港的第一天了解这一点,是有好处的。也有回祖国的,我就是,所以我在这里写文章了,看到很多朋友询问去香港读书的问题,作为过来人,就写了这些,如果能给这些朋友提供一点有益的信息,就很满足了。

   上次写了文章发表在海外学子版,很多朋友给我回信,给了我很大的鼓励,真的没想到过自己的东西会给别人带来影响。留学的经历给了我很多,几乎是一个脱胎 换骨的过程,在一篇文章里是不可能都讲完的,所以我再写一个续集,好莱坞搞续集纯是为赚钱,我呢是什么都不图,万一有ppmm看了之后找我,最爽不过。将 心底里的一点点“龌龊” 都暴露出来,可以痛快讲了。

  凡事都是虚空
  来自发展中国家的人,难免在神情上都多一丝生存紧张,中国在海外的留学生尤其让人感觉到这一点。看不到出自内心的笑,连谈话时也似乎只有一个主题:今后有什么打算?每做一件事,都在问自己:对我有没有好处?

   坦白的说我自己刚到香港时就是这样,只觉得自己多么没着落,无根无底的飘在他乡,我要努力啊,绝不可浪费自己的任何精力,房子,车子,名誉,地位,还有 漂亮老婆,我什么都要啊。要学最能给我带来利益的东西,去做最有利自己的事情,直到我成功。当时我就是这么典型功利,到现在我都想这样痛骂自己。

   数学指出函数的极大值往往在最不稳定的点取到,人追求极端就会失去内心的平衡,到时候就不难体会到数学原理的深刻。我很快让我的功利心理逼到无路可走 了,对所学的东西怀疑,担心自己变成书呆子,对自己有信心,找不到真正的朋友,找不到让身心平静的乐趣,每天都在心潮起伏。最后我去找学生辅导员。愚蠢的 诉说倒不多提了,不过我记得他大胡子的脸有了微笑,眼睛里放出宽容而温和的光。他告诉我觉的我很有意思,他第一次遇到这么坦白的学生。“那些东西有什么意 义呢,你怀疑得很好。“之后就翻出圣经来,给我读某些章。

  Everything is meaningless.竟是圣经里的话语。那是我看到的最为震惊的一句话,也是我后来觉得最深刻的一句话。中国人很难理解,对在功利教育里熏陶过来,缺 少人格教育的中国学生,更无异于晴天霹雳。成绩,offer, 学位,这样那样的好处,每天拼命算计的东西有什么意义?假设你突然死掉,世界将会怎样?世界将一样绚丽,地球转的一样快,太阳系每天在宇宙中换一个位置。 大海还是大海,波涛还是波涛,一样的花开花落,潮起潮落。你的亲人可能会掉眼泪,但是周围的人在三个月内将你忘个干净,那是你曾经那么在乎他们怎么看你的 一群人啊。如果上帝存在,在他的眼里,你是多么可怜的小虫子,在活着的短暂岁月里,在最美好的青春里,都不曾快乐过,用尽心力去聚集一大堆外在和心灵没有 关系的小东西,只是出于对未来的没有信心,小小的心灵在接近熄灭的一天还在发出那个愚蠢的声音,让你忙碌,让你忧虑的声音:我要,我还要。天底下充满了这 样的小虫子,当一个离开了,又有一个来了,做着同样的事情,汹涌着同样的小小念头,受着同样的煎熬。于是上帝要感慨了:虚空的虚空,凡事都是虚空。已有的 事,后必再有;已行的事,后必再行。日光之下,并无新事。
  已过的世代,无人纪念;将来的世代,后来的人也不纪念。
                                            ------圣经 旧约 传道书
  我不是在传教,当时的辅导员也不是在传教,但是让我立刻看到自身的渺小,物质追求的虚妄,内心的愚昧。看看资本主义的学生辅导,是不是比我们这边高明多了?马哲曾帮助过我们什么?

  不要忧虑
  “不要为明天忧虑,天上的飞鸟,不耕种也不收获,上天尚且要养活它,田野里的百合花,从不忧虑它能不能开花,是不是可以开得和其它一样美,但是它就自然的开花了,开得比所罗门皇冠上的珍珠还美。你呢,忧虑什么呢?人比飞鸟和百合花贵重多了,上帝会弃你不顾吗?”
  一个朋友告诉我,他在等美国 offer 的时候,常常梦到接到牛校offer, 过度兴奋到醒,更为郁郁,感慨“但愿长醉不复醒”。这样的故事大家听了不会太惊诧,由此不难理解《儒林外史》中的进中举了。而得到offer的人到了海外,往往要经历更多的梦醒时分。

  为什么活得这么累?生命本是如此美丽,连飞鸟和野花都可以尽情地享受上天的恩赐,而这些有高等思维的聪明人,却活活让思维搞得神情郁郁,哀声叹气。
   常有人感叹西方人笑起来那么真实,那么出自内心,探讨起来,又归结到他们更有钱,他们的社会更发达。可我觉得那不是原因。原因就是他们比中国学生更接近 飞鸟和野花罢了,更接近《阿甘正传》里的弱智罢了。他们更天真,相信那个万能的上帝会永不遗弃他,所以他们可以少想很多的问题,反而过得更顺利,在团队里 表现得更凝聚,因为过分的私心是无法向大家共同的上帝交代的,他们可以很快做出一个Microsoft,一个Dell,但是大家可以看看中国的北大方正, 联想,新浪,管理层一年的地震比台湾还多, 这么多年来,连冲出亚洲的野心都没有真正实现过。 这难道不是上帝给西方人带来的好处,耶稣说信我就可以得救,不管这个上帝是不是虚拟的,但他在事实上填补了人性的巨大空白,人家的Microsoft就证 明了他的存在,正如计算机的虚拟内存,尽管虚拟,但事实上的作用是巨大的。中国学生总是怀疑这个看不见的上帝是否存在,更在私下里说,他对我能带来好处 吗?其实中国人什么都不信,只信好处,从古时的考八股起,读书就是为了好处。因此,大家每天活在害怕没有好处的忧郁里,想靠自己小小的思维,在着巨大的世 界系统里去谋取好处,上帝忍了泪水,背过脸去。

  思维的无奈
   我并不主张虚无,尽管我在上一篇文章里尽力去指出物质追求的虚妄。正如萨特认为,人生本是本无意义,但是怎样摆脱虚无却是有意义的。王朔的意义在于砸碎 那些没有意义的假崇高,伍迪.艾伦的意义就在于不断指出人生的荒谬。如果一切都是那么可笑,我们怎样面对每天的24小时?但是活着就是这么简单,它只是一 个过程,简单而自然地发生,以至于任何干扰和关注都是多余。就像飞鸟掠过天空,野花静静地开放。能把什么东西叫做现在吗?你能占有什么东西吗?一切的意义 只在时间的流动的河中。就像一团火,哪个燃烧的过程才叫火,一旦过程停止了,火不存在了。人的思维在作怪,它是一个双面的东西,它不总是带给我们好处,虽 然我们对它有那么多自信。思维在很多时候严重地干扰了那个自然的生命过程,它在想单个的状态好不好,值不值得,合不合规范,能给自己带来什么,所以我们很 快变得不快乐,不安稳,再也无法享受那种自然的喜悦了,正像被摄像的人,他的表情立刻不自然起来。恐怖片里的鬼魂可能一直不曾出现,人们却开始牙齿打颤, 是被自己思维折磨而已。学计算机的朋友肯定知道操作系统将一个进程悬挂起来的意思。人的那个蠢笨不堪的思维,凭什么要常驻内存?它那么长期的运转,又真正 解决了多少问题?为什么不在必要的时候悬挂它,去享受生命的自然?明白这一点将改变你的生活,思维会使你陷入矛盾,很多时候它是多余的,用心去体会,甚至 用毛孔去感受就足够了。当你不再判断,不再分辨,不再比较,不再权衡,你就立刻、和谐起来。“采菊东篱下,悠然见南山”。那时,还用考虑什么呢?“此间有 真意,欲辩已忘言”,连言语都是多余,因为言语来自思维。佛陀的捻花一笑,详和的神情,虽静坐,似乎已飞跃世间一切,他坐在了那个生命的根本之上, 再也没有一丝的不和谐。

  读书的时候,我常常到海边听涛声,坐下来看着太阳落下,那会是我一天最美好的时间,当太阳没下去,晚霞渐渐褪 去颜色,波浪依然轻轻拍打岸边,幕色从四周将我围过来,静默中我会在心灵里升起喜悦,感觉到冥冥中那个永恒的力量,它在紧紧将我抱住,天地万物和我一样同 在,也被温和地抱着,我将永不孤独,永不伤心,永不绝望,因为那力量就一直在那里,将永远在那里,我是它的恩赐,我的灵魂从未像那时一样枝繁叶茂,内心从 未像那时一样宁静和谐。

  我不用去分辨那种力量,是上帝也好,上天也好,老子说的道也好,有什么关系呢?分辨只是是思维常干的蠢事罢 了。所有的心灵都是一样的,所以我相信所有人都有那个和谐的状态,就像收音机有那个频道一样,只不过太多人没有调到过。太阳,大海,清风明月,鸟语花香, 生生不息的物种,是多么大的恩赐啊,只在我们断暂的生命里才可以感受到,可是太多的人从不念及。他们将自己全部地交给了少得可怜的脑细胞,心灵交给了那个 拙劣的 CPU,时时刻刻在做狭窄不堪的运算和判断,所以才会长时间挣扎焦虑,只看到85分和90分的区别,5000元月薪和10万年薪的不同,牛校和烂校的分 辨。所以“郁闷”,“无耻”,“倒霉”,“不爽”,“急”,这样的词汇就开始在嘴边泛滥了,就像破电脑的出错提示一样多。

本没有打算再写很多了,关于人生的刨根问底本来就是沉重的课题,无异让学业繁多的学子们再怀疑自己,平添忧虑。倒不如多说点逗乐的事,每天多嘻嘻哈哈一阵。
前 不久见到北大的一个女生,说我前面介绍香港的文字很实用,后面的文章就越来越看不懂了,可以理解,并不是所有的人都要像我一样想这些问题的,特别是女孩, 一天多说几声“挺好的”“好温馨哟”就算过得不错了,古今中外都不曾出过一个女哲学家。但是,这位未曾谋面的北大师弟在等我的续集,谢谢你,xmdl(阿 扁鱼), 我不愿让你失望这一篇是为你而写的。

  我们看的人文书前面提到的女生就问我,在留学过程中最大的收获是什么,我回答是长了见 识。就像在小地方呆久的人出来见了大海,这个收获大得很。所以我渐渐地学会了真正的谦虚态度,越来越承认自己所可以理解到的,可以认识到的只是这世界的太 小一部分。在我的脑力范围外有太大的空间,从这一点来看,我们每个人都对自己有过多的自负,每天都在或多或少的干着作井观天的蠢事,争论着盲人摸象的争 论。

  清华北大的学生的人文素养,我想,很多来源于图书馆的人文书籍,因为喜欢读书的学生多半在那里搬书回来看。可是那些书多产于七 十,八十年代,基本上是被一把姓马的刀阉割了的太监式的书,我不怕得罪人。怎么阉割法?举个例子,“总体而言,宗教是唯心的,错误的世界观,被统治阶级利 用来麻痹被统治阶级的广大人民...”从此,你知道了这一点,你么读释迦,读耶稣,读老庄,都觉得如同太监一般阴阳怪气。在红色的年代里,马刀所向无敌, 包括孔夫子到孙中山,从曾国藩到蒋介石,都少有可以逃脱的,因为他们有“阶级局限性”。

  但是我到了香港,就看到了很多台湾的书,很多 香港的书,原来这些书本不象太监的,甚至不比姓马的书少阳刚之气,可以读得让人忘食,哎,可怜它们的被阉。这些都是我以前脑子以外的东西,所以我立刻知道 要谦虚了,人总是受着他的经历和环境的巨大局限,他甚至不意思到,没有选择地被限制隔离着。

  耶稣呢,用我们的眼光看,他太失败了,没有妻子,没有儿子,没有房子,没有财产,没有地位,最后还要被钉死,他只是游走于四方去救助受苦受难的人们,他有余的眼光总是看到了世界的外面,因为他也到过更高的维度里。

   庄子至今看来还是活得最浪漫最洒脱的中国人,他是超脱的同义词,他也是高维空间的蚂蚁。去读他们,去体会那种来自另外一个维度的智慧的震撼,尽管你可能 无法改变无奈的现实,但是可以深刻地改变自己,尽管无法摆脱沉重的肉身,依旧无选择地活在平面上,但是,心灵获得了自由。愿意升起你的心灵吗?

   每个人都是独一无二的,而且我们永远只能是自己,卢梭说的,对于整个世界我微不足道,但是我对于自己确是全部。事实上我们只对于自己重要,如果我死掉 了,没有几个人会在三年后保持对我的记忆,如果我痛苦,没有几个人会有真正的同情,因为太难了,每个人都无法了解我的意识。所以我们要独立,活着就是成为 自己,那个独一无二的自己,去寻找自内在的完美与和谐,去实现句那没有选择的话: I am who I am。

  Simply because I am not and can not beanyoneelse.可是我们受教育,教育的目的就是教我们忘掉自己,去变成一个称为标准的人,不是这样吗?从小学起我们就要评三好,树标兵,学雷 锋,学赖宁。老师总是看到我们的恶习,“你那样子不合行为规范,不可耻吗?”到了大学,我们又自由了多少呢?我们依旧看别人,看典型,看所谓成功者,我们 依旧活在要忘掉自己的标准包围中,去bbs看看,似乎所有人都统一了口吻,GRE 2400,拿了牛校offer, 签了著名外企,找到了ppmm,牛啊,羡慕啊,爽啊,历史走到了21世纪,北大和清华人只剩下一副面孔了,每年招了很多新生,最后就剩下了一个。

   比较是有意义的吗?作为一个独一无二的存在,作为自己的全部主宰,为什么要什么都和人家比才可以找到意义?为什么当别人考G的时候,我也一定要考,为什 么考不过2200就要郁闷?为什么billgates成功的时候,我也一定要学计算机?可是自己和别人是多么的不同,些不同难道可以在一些欲念的驱动下轻 易的忽略?

  崇拜是有意义的吗?明星是需要那样追捧的吗?中国的那支烂球队是需要那么多关注的吗?

  当我们倾注希望的时候,他们借此赚到了更多的银子,活得更加嚣张,更加让我们失望,我们是在给富翁们献爱心,爱心那么多,为什么不献给需要爱心的更多的人们,为什么不献给自己,独一无二的自己?

   当我们崇拜自己,热爱自己,追捧自己,关注自己,我们就都也是明星了。这样盲从将无法发生,起哄将无法发生,个人崇拜将无法发生。这个意义大的很,至少 大跃进将不发生,文革将不发生,我们的经济有可能早三十年走上正轨,现在我们不需要拼命飞跃重洋,中央到地方的官员就不要象现在一样,在亿万人没有工作时 还竭力吹嘘7%的GDP增长,就像阳痿的人,为了脸面,郑重地去声名:请看我浓密的胡须,年增长率7%。
        不知道多少人可以耐心有共鸣的看完这个帖子,但是看完后却激动的想向每个好朋友推荐。关于人生的追求、香港的开明及其他、大陆人被蒙蔽太久、海外学习生活 的好处和收获、是否出国以及为了什么出国,好多好多曾经是我想过滴为之郁闷过滴,幸好有留美归来的老师点拨,有Joe的严厉“质问”,才让我度过了当初的 挣扎和煎熬,如今的心境已经远离那种浮躁和焦灼了。因为学会欣赏不同的美,懂得珍惜和付出,因此每一天都很开心。这一篇帖子真的是让我看到绚烂浮躁下面自 己真正缺少什么,好好珍藏!有机会还是要出去看看好好体会。(转帖原文附带,未删除)

posted @ 2014-03-27 07:58 ZT文萃 阅读(167) | 评论 (0)编辑 收藏

以下网文属于无责任转载,读者自辩真假。

趣1024:分享有趣、一级棒的图和事。

    故事主角
    刘立荣,湖南益阳人,金立通讯集团董事长兼总裁,身家15亿,手机月均销量45万部,年销售量超500万部,集团年利润超3亿。
    李盛,湖南新化人,刘立荣的大学同窗,现为上海一电子公司的技术员,月收入5000元。同窗好友。李盛与刘立荣原本是最要好的大学同窗,也是一对当初同闯 广东,同住一间宿舍,没钱时一同挨饿的患难兄弟。然而,10多年过去,这两个兴趣相投、爱好相近的患难兄弟,其命运为什么会产生如此大的落差呢?近日,笔 者专访了李盛,从他的反思中找到了一个令人感悟犹深的原因……

    4年同窗,最烦就是他喜欢“小题大做”李盛曾经十分看不惯大学同学刘立荣在小事上总是太较真,但他万万没有想到,正是这种差别,使得刘立荣如今成了身家15亿的大老板,而自己却仍然是月薪不过5000元的普通职员!
    李盛是湖南省新化县人。1990年9月,他考取了校址在长沙市的中南工业大学。那天办完报到手续回到宿舍时,看到一个同学正埋头独自下围棋,他便说:“兄 弟,我们来两盘行吗?”同学答应了,与他一边下棋一边聊天。通过交谈,李盛得知这位新同学叫刘立荣,来自益阳市农村。那天下午,他俩共下了3盘,李盛轻松 地全赢了。
    此后,同宿舍的他俩经常在课余下棋、聊天。刚开始,李盛棋艺占优,刘立荣从没赢过。但是,刘立荣每次下棋时都认真思考,李盛却认为下棋就是打发时间,总漫 不经心。这样一个学期下来,刘立荣的棋艺居然反过来比李盛高出一大截,能让他3子了。李盛很纳闷地问:“你怎么提高得这么快?”刘立荣说:“你下棋根本不 思考,怎么能有进步……”
    大二第二学期,为了赚取生活费用,刘立荣提出利用晚自习后的时间,到各个男生宿舍去卖牛奶和面包。两人进行了分工,李盛负责去三、四栋男生宿舍推销,刘立 荣则负责五、六栋宿舍。刚开始,两人每晚都能赚六七元钱,可不久刘立荣的钱越赚越多,李盛却越赚越少。李盛不服气,可两人调换推销宿舍后,刘立荣每晚还是 能多赚七八元钱,而李盛依然越赚越少。一天,刘立荣看到李盛穿着一身汗透了的球衣,抱着食物箱就准备出门,他才恍然大悟地说:“你太不注意细节了。像你这 样脏兮兮的,谁敢买你的食品呀?”李盛此后听从了刘立荣的建议,每晚出门前将自己收拾得干干净净,一段时间后,他的“生意”果然渐渐好了起来。
    这件事后,李盛有些佩服刘立荣注意细节的优点了。此后,李盛学习很用功,大三时还拿到了800元的一等奖学金,而刘立荣却因为平时爱钻研围棋,又喜欢看经 济管理类的课外书籍,学习成绩不过中等。但令李盛想不到的是,大学毕业分配时,尽管刘立荣专业成绩并不出色,但却有3家单位争着要连学生推荐表都填得一丝 不苟的刘立荣。最后,刘立荣选择了去天津有色金属研究所,而学习成绩好的李盛好不容易才将工作落实在长沙前动力机车厂。
    虽然分隔两地,但他俩经常联系。李盛觉得刘立荣分配到了研究单位,一定非常满意。哪想到1995年3的一天,刘立荣来到长沙找到李盛,说:“兄弟,我已经 停薪留职,准备去广东了。你和我一起去吧!不然,年龄一大,岁月就冲淡了创业激情,到时就没有闯劲了……”李盛听了,也热血沸腾,当即答应一起闯广东。

    南下淘金
    第二天,李盛便办理了停薪留职手续。1995年3月30日,两个同窗好友坐上了南下的火车……
    郁闷:做事“差不多”的我只能当下属。两人到了广州后,半个月过去,却没找到合适的工作,刘立荣建议去中山市。谁知到了中山市一个星期,两人身上仅剩下两元钱了,还是没找到工作。
    他俩去中山小霸王电子智能科技公司应聘技术员。出门前,李盛不慎碰翻水杯,将两人的简历浸湿了。他们将简历放在电风扇前吹吹后,李盛把简历和其他一些东西 放进了包里,就连连催刘立荣快走。可刘立荣却将简历夹进一本书里,又认真地压平整,才双手将书捧在胸前出门。李盛不由埋怨说:“你真磨蹭!”

    到了小霸王公司的招聘现场,负责招聘的副总经过交谈,对他俩良好的专业知识很满意。然而,当他们递上简历时,李盛的简历不仅有一片水渍,且放在包里一揉, 加上钥匙的划痕,已经不成样子了。那位副总不由皱了皱眉头。到了下午,刘立荣被通知去面试,并且应聘成功。没得到面试机会的李盛急得快哭了!刘立荣便说: “我们去问问吧!”当他们询问时,那位副总马上反问李盛:“你连自己的简历都没能力保管好,我怎能相信你工作上的能力?”一旁的刘立荣斗胆说:“他是我同 学,专业如识比我过硬,既然你相信我,也应该相信他……”李盛这才得到了面试的机会。好在面试时表现不错,李盛最终也和刘立荣一样被小霸王公司聘为技术 员。
上班后,两人又同住一间宿舍,一同上下班,一起吃饭,一起抽7元钱一包的红双喜香烟,甚至凑钱买了一套罗蒙西服轮流穿,工作上也互相帮忙。 1995年6月底,技术主管让他俩各自设计一套程序。李盛凭着过硬的专业知识,一个晚上就完成了。次日上午,他在宿舍里美美地睡了一觉,下午一进办公室, 发现双眼充满血丝的刘立荣仍在埋头查资料,他便说:“你还爱磨蹭!我来帮帮你吧!”在他的帮助下,刘立荣下午也完成了设计。李盛说:“差不多了,休息 吧。”说完,他便又回到宿舍睡觉去了。
    李盛离开后,已经两天一夜没睡觉的刘立荣又将程序检查了好几遍,即便觉得没有瑕疵了,他还是将图重新誊写了一遍,直到自己满意才罢休。第二天,技术主管看 了图纸后,说:“从你们交上来的图纸看,小李的专业基础很扎实,可图纸潦草、脏乱,对工作太毛躁了;小刘的图纸一丝不苟,做事踏实,令人放心……”李盛不 服气地想:图纸你看得懂不就行了,干吗非要清洁干净不可?真是吹毛求疵!
    不久,为了制图方便,技术部准备更换一台新电脑,需要由他们在报告上签名。报告写好后,李盛大笔一挥,将自己的名字签得老大。刘立荣提醒说:“你的签名这么大,领导的名字往哪里写?再重新写一份报告吧。”李盛却说:“你太小题大做了吧?他们随便签在哪不行吗?”
    1995年10月底,技术部一台车床起动时,起落架无法收回,导致无法运转。主管技术的副总检查后,发现原来是起落架上的插销没有拔出。故障排除后,刘立 荣写了一份标准操作规范贴在机器上,不但写清不要忘记拔插销,而且对插销要怎么拔,拔出后后退几步,放在何处,都写得清清楚楚。李盛不屑地说:“你这不是 多此一举吗?大家有了教训,应该已经记在心里了。”然而,副总来检查工作时,看到这张注意事项,高兴地说:“写得好,如果都像你一样,留下注意事项,新员 工就会避免犯同样的错误了。”

    差距初现

    看到刘立荣对工作如此细心,李盛还是不屑地认为:你将自己累得要死,还不是和我领着同样的工资,何苦呢?然而,1996年11月,技术部主管辞职后,公司 领导认为刘立荣办事认真细致,经手的事很少出错,于是将专业知识不如李盛的刘立荣提拔为技术主管,而给李盛只是象征性地涨了200元工资。
  1997年10月,公司为了鼓励刘立荣,分给他一套两室一厅的房子。为他搬家的那天,李盛心里很失落:才进公司两年,他怎么就成了我的上司了呢?
    如今他身家15亿,我月薪5000元
    1998年4月,小霸王公司副总裁杨明贵准备去东莞,自己组建金立数码科技有限公司。他将自己一直赏识的刘立荣带到了东莞,担任副总。在刘立荣的推荐下,杨明贵也将李盛带到了东莞,担任技术部主管。
    在新公司做了技术主管后,李盛工作轻松了很多。因此,他晚上常去当地的酒吧、洗脚城娱乐。有一个周六下班后,刘立荣叫住了他,说:“老弟,好久没下棋了, 我们来几盘吧?”晚上9点多钟,他们下棋正在兴头时,刘立荣接到了一个客户的电话,他马上就说:“今晚到此为止了,我得去广州接一个重要的客户……”李盛 不解地说:“这么晚了还去广州接人?没必要吧!”刘立荣却说:“如果接他,在这个小细节上让客户满意,能给公司带来效益,我有什么理由不去做呢?”
    2000年3月,刘立荣在审查由李盛写的生产流程报告时,发现报告上居然将200元写成了200万元。他生气地说:“你怎么能这样不小心呢?如果我没检查 出来,谁负得起这个责任?工作不能马虎啊,你换位思考一下,如果你是老总,你能将工作放心地交给出现这样错误的员工吗?”
    尽管李盛对刘立荣的话点头称是,但心里仍不以为然。2000年5月的一天晚上,刘立荣一边与李盛下棋时,一边打电话对公司文员再三叮嘱:“从东莞去广州, 你一定要给他买靠右边窗口的车票,这样他坐在车上就可以看到凤凰山;如果他去深圳,你就要给他买左边靠窗的票……”李盛不解地问:“到底接待谁呀,你这样 婆婆妈妈?”刘立荣说:“台湾顺翔公司的杨总,他出门时不喜欢坐汽车而喜欢坐火车。这样,他一路可以欣赏凤凰山的风景。”李盛笑道:“这些小事你也装在心 里,累不?”可令他没有想到的是,这件小事竞给公司带来了2000万元的业务。
    原来,4个月后,台湾的杨总在和刘立荣聊天时,无意中问起这个问题。刘立荣说:“车去广州时,凤凰山在您的右边。车去深圳时,凤凰山在您的左边。我想,您 在路上一定喜欢看凤凰山的景色,所以替您买了不同的票。”杨总听了大受感动,说:“真想不到,你们居然这么注重细节,和你们合作,可以让我放心了!”杨总 当即将本已决定交给别的公司的2000万元订货单,改交给了刘立荣。李盛听说此事后,心里也很震撼!
    2001年10月,金正数码公司发展为集团公司,刘立荣也升任集团公司副总裁。可不久,李盛却给公司带来了莫大的损失:生产部按技术部新开发的模具生产出 样品后,才发现模具设计居然出了问题,本该在右边的零件被设计到了左边,一条价值400多万元的生产线全报废了。董事长得知后大发雷霆,做出了取消技术部 所有员工年终奖、直接开除事故责任人李盛的处分决定。刘立荣忙向董事长求情,董事长最后虽然收回成命,但还是撤了李盛的职务,让他当普通的技术员。
    几天后,李盛找到刘立荣,说:“我知道你对我好,但我不能拖累你,我还是离开公司……”刘立荣不好强加挽留。离开金正数码公司后,李盛在东莞市虎门镇兴利电子公司找到了一份做技术开发的工作。
不同的命运
    2002年7月的一天,李盛与刘立荣在虎门镇相遇。刘立荣告诉李盛,自己准备辞职,筹资成立一家属于自己的通讯设备公司,并邀李盛和他一起干,可李盛摇了摇头,说:“我已经买了房子,不想再奔波了……”
    此后,刘立荣招兵买马,创建了金立通讯有限公司。一晃7年过去,李盛仍只是一个技术员,依然抽着7元钱一包的红双喜香烟,挤公交车上下班;而刘立荣贵为金立集团的总裁,开着奔驰600轿车,成了亿万富翁。
    2009年3月,兴利电子公司由于受金融风暴的影响破产了,李盛只得到深圳另找工作。此时,刘立荣的金立集团已成为国内手机企业的重要品牌,他自己身家 15亿。李盛想过请昔日的哥们刘立荣帮助自己谋一份职位,却又觉得没脸相求。2009年9月,他在上海的一家电子公司重新找到了工作,月薪5000元。
    接受采访时,李盛反省说:“以前,我总觉得刘立荣职务扶摇直上,事业飞黄腾达,是一种偶然和幸运;我现在才明白,他是因凡事注意细节,不断进步。细节决定命运啊!”
    细节决定命运,李盛的反思确实有道理!无论在生活中,还是在工作上,是否能够注重细节,绝对影响着我们每个人的命运。年少时同样高矮的伙伴,每个月可能只 会比自己高一毫米,差距毫不起眼,可十年八年后,他可能就会长成巨人,而自己却形同侏儒。刘立荣的成功,肯定是因为他有很多优点,但他在职场从起步到成为 老总这个人生最重要的跨越阶段,注意细节,绝对是他赢取人生每一步的重要原因。因为,注重细节不仅仅是一种习惯,更是一种高级职业精神,它能引领你不断完 善自己的人格和能力,一步步走向成功!刘立荣的成功经验,值得我们每个职场新人学习和深思!

posted @ 2014-03-25 08:35 ZT文萃 阅读(178) | 评论 (0)编辑 收藏

http://www.cnblogs.com/benio/archive/2010/10/13/1849946.html


当磁盘大小超过标准时会有报警提示,这时如果掌握df和du命令是非常明智的选择。

    df可以查看一级文件夹大小、使用比例、档案系统及其挂入点,但对文件却无能为力。
    du可以查看文件及文件夹的大小。

    两者配合使用,非常有效。比如用df查看哪个一级目录过大,然后用df查看文件夹或文件的大小,如此便可迅速确定症结。

    下面分别简要介绍

    df命令可以显示目前所有文件系统的可用空间及使用情形,请看下列这个例子:

 

以下是代码片段:

[yayug@yayu ~]$ df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda1             3.9G  300M  3.4G   8% /
/dev/sda7             100G  188M   95G   1% /data0
/dev/sdb1             133G   80G   47G  64% /data1
/dev/sda6             7.8G  218M  7.2G   3% /var
/dev/sda5             7.8G  166M  7.2G   3% /tmp
/dev/sda3             9.7G  2.5G  6.8G  27% /usr
tmpfs                 2.0G     0  2.0G   0% /dev/shm

 

    参数 -h 表示使用「Human-readable」的输出,也就是在档案系统大小使用 GB、MB 等易读的格式。

    上面的命令输出的第一个字段(Filesystem)及最后一个字段(Mounted on)分别是档案系统及其挂入点。我们可以看到 /dev/sda1 这个分割区被挂在根目录下。

    接下来的四个字段 Size、Used、Avail、及 Use% 分别是该分割区的容量、已使用的大小、剩下的大小、及使用的百分比。 FreeBSD下,当硬盘容量已满时,您可能会看到已使用的百分比超过 100%,因为 FreeBSD 会留一些空间给 root,让 root 在档案系统满时,还是可以写东西到该档案系统中,以进行管理。

    du:查询文件或文件夹的磁盘使用空间

    如果当前目录下文件和文件夹很多,使用不带参数du的命令,可以循环列出所有文件和文件夹所使用的空间。这对查看究竟是那个地方过大是不利的,所以得指定 深入目录的层数,参数:--max-depth=,这是个极为有用的参数!如下,注意使用“*”,可以得到文件的使用空间大小.

    提醒:一向命令比linux复杂的FreeBSD,它的du命令指定深入目录的层数却是比linux简化,为 -d。

 

以下是代码片段:

[root@bsso yayu]# du -h --max-depth=1 work/testing
27M     work/testing/logs
35M     work/testing

[root@bsso yayu]# du -h --max-depth=1 work/testing/*
8.0K    work/testing/func.php
27M     work/testing/logs
8.1M    work/testing/nohup.out
8.0K    work/testing/testing_c.php
12K     work/testing/testing_func_reg.php
8.0K    work/testing/testing_get.php
8.0K    work/testing/testing_g.php
8.0K    work/testing/var.php

[root@bsso yayu]# du -h --max-depth=1 work/testing/logs/
27M     work/testing/logs/

[root@bsso yayu]# du -h --max-depth=1 work/testing/logs/*
24K     work/testing/logs/errdate.log_show.log
8.0K    work/testing/logs/pertime_show.log
27M     work/testing/logs/show.log

 

    值得注意的是,看见一个针对du和df命令异同的文章:《du df 差异导致文件系统误报解决》。

    du 统计文件大小相加
    df  统计数据块使用情况

    如果有一个进程在打开一个大文件的时候,这个大文件直接被rm 或者mv掉,则du会更新统计数值,df不会更新统计数值,还是认为空间没有释放。直到这个打开大文件的进程被Kill掉。

    如此一来在定期删除 /var/spool/clientmqueue下面的文件时,如果没有杀掉其进程,那么空间一直没有释放。

    使用下面的命令杀掉进程之后,系统恢复。
    fuser -u /var/spool/clientmqueue

http://www.yayu.org/look.php?id=162


 

查看linux文件目录的大小和文件夹包含的文件数

    统计总数大小

    du -sh xmldb/

    du -sm * | sort -n //统计当前目录大小 并安大小 排序

    du -sk * | sort -n

    du -sk * | grep guojf //看一个人的大小

    du -m | cut -d "/" -f 2 //看第二个/ 字符前的文字

    查看此文件夹有多少文件 /*/*/* 有多少文件

    du xmldb/

    du xmldb/*/*/* |wc -l

    40752

    解释:

    wc [-lmw]

    参数说明:

    -l :多少行

    -m:多少字符

    -w:多少字

 

http://linux.chinaitlab.com/command/734706.html


Linux:ls以K、M、G为单位查看文件大小

#man ls

……

-h, --human-readable

                print sizes in human readable format (e.g., 1K 234M 2G)

……

# ls

cuss.war    nohup.out

# ls -l

total 30372

-rw-r--r--    1 root root 31051909 May 24 10:07 cuss.war

-rw-------    1 root root          0 Mar 20 13:52 nohup.out

# ls -lh

total 30M

-rw-r--r--    1 root root 30M May 24 10:07 cuss.war

-rw-------    1 root root     0 Mar 20 13:52 nohup.out

# ll -h

total 30M

-rw-r--r--    1 root root 30M May 24 10:07 cuss.war

-rw-------    1 root root     0 Mar 20 13:52 nohup.out

posted @ 2014-03-18 17:48 ZT文萃 阅读(195) | 评论 (0)编辑 收藏

文/端宏斌
02月25日 18:26

上周,有个女生在微信里给我发消息“炸鸡和啤酒”, 我不明白这是什么意思,于是我就回复她“炸鸡和啤酒”,结果屏幕开始下起雪花来了。原来这是一个彩蛋。为什么炸鸡和啤酒就变成彩蛋了呢?上网一查,原来是 有个热播的韩剧,其中有一句台词是:“下雪了,怎么能没有炸鸡和啤酒?”

最近十年来,有两件值得关注的流行文化事件,第一是韩剧风靡全 国,不少女孩满脑子都是韩剧里的男星,闺房墙上贴满了韩国男人的海报;第二是日本AV牢牢占据了男人的硬盘,一些日本AV女星来内地捞金一次,就顶她过去 拍几十部AV片。如果用一句话来概括总结,那就是:日本女人坑了中国男人,韩国男人坑了中国女人。

为什么日本AV和韩剧会这么流行?用进化心理学的视角很容易进行解读。进化心理学认为,我们活着的最终目的就是延续自己的基因,但对于男人和女人来说,虽然目的一致,但手段各不相同。男人要的很简单,让自己的精子跑到女人的身体里;而女人的要求就复杂多了。

我们先来考察一下日本AV。

爱情是一种互动博弈,你必须先提供对方想要的,你才能获得自己想要的。但是AV电影把这个复杂的过程做了终极简化,你不需要给女人送花、不需要请她们吃饭、不需要跟她们说一堆骗人的鬼话、不需要你有房有车,一切需要你付出的复杂部分全部省去,就只剩下“性”。

在 AV电影里的女人,不花你的钱、不在乎你的长相、不会跟你唠叨废话、不会让你去洗碗、不会让你出门的时候顺便把垃圾扔掉,她们只会跟你上床,而且个个都长 得年轻漂亮,你想怎么搞,她就给你怎么搞。在AV中,女人被抽象成了乳房、臀部、下体的混合物,甚至她们都不需要说话,连台词都没有,只要哼哼就行了。

对于男人来说,这是多么美妙的一个世界?只是,这样的女人,在世界上就不存在!

弄清了日本AV之后,我们再看看看韩剧。

女 人的需求远比男人复杂,那么韩剧里的男人是怎样的一个人呢?首先,他必须是一个高富帅,这是最低标准,如果他不高、不富、不帅,那就是纯屌丝,这就变成了 现实世界,这怎么行?韩剧的目的就是让你脱离现实,进入一个想象中的世界。在这个世界里,屌丝根本没有存在的价值,因此即使他只是一个备胎,也必须是一个 高富帅。

其次,光是高富帅还不行,还要素质、品位、知识俱佳,脾气要好、随叫随到。对自己从来就不乱想,可以抱在一起聊一晚上,什么都不发生。自己心里那些小秘密小心思,他可以一下就猜透。如果你要走,他会紧紧抱住你强吻你,就是不让你走。

简而言之,韩剧创造了这样一个世界:女人不需要提供什么,就会有一个白马王子对你无条件的付出。这个白马王子满足你一切对于男人的幻想,他还对你非常的专一。简直比童话还要童话。

对于女人来说,这是多么美妙的一个世界?只是,这样的男人,在世界上也不存在!

如果说AV电影是消费女色,那么韩剧就是消费男色。AV忽悠了中国男人,韩剧麻醉了中国女人。它们的副作用是,提高了人们对于感情的“阈值”。阈值指的是触发某种行为或者反应产生所需要的的最低值。

如 果一个女人天天看韩剧,那么她就会觉得身边的男人个个面目可憎。如果她是一个村里的村姑,根本没见过世面,那么她早早就会嫁给村里的二蛋子,然后生一堆 娃。如果这个村姑考上大学跑到上海工作,没事就看一堆韩剧,那么她就会变成剩女,因为她觉得追求者都是屌丝,没有一个靠谱的。根本原因就在于,韩剧提高了 她对于感情的阈值,她已经很难被感动了。韩剧流行的这几年,恰好伴随着“剩女”的产生,这难道只是巧合吗?中国计生委应该给韩国人颁发“控制人口过快增 长”大奖。

为什么现代人越来越感觉不幸福?这和阈值的提高有很大关系。在物质贫乏的年代,过年吃一顿猪肉饺子就感觉幸福无比,现在给你吃山珍海味也不过如此。很多人都说,现在过年没有年味了,其实并非没有年味,只是你的阈值提高了,你对各方面的要求都今非昔比了。

老端的微信:laoduandeguandian

posted @ 2014-03-17 08:41 ZT文萃 阅读(259) | 评论 (0)编辑 收藏

本文转载自:http://www.cnblogs.com/liufeng24/p/3587556.html

近半年来,本人几乎天天逛各大论坛网站,浏览大牛们的博客,摘抄了不少经典的好词好段,虽是只言片语,但是这都是当代大牛们的语录心得,所以今天拿出来与大家分享,希望多留言,共同探讨。

 

1、很多问题不见得会出在你身上,但你亦需要想法解决问题,否则就会变成你的问题。

2、懂得但策略的说不。(不会这个准备累死吧,程序员)

3、我考进事业单位。呵呵,没有传说中的那么好环境。这里待遇低下,事情繁杂,领导众多,群众骚扰得我不胜其烦

4、真的,程序员走了管理路线,反而会感到人生非常多浪费时间,太多的精力用来应付各类琐事……

5、不只会埋头写程序。

6、不断规划与寻找自己的人生, 想法把自己变重要。

7、想法把自己变得不重要,以实现其他重要的目标。

8、 做程序员,专门做技术,脑累;再往上爬,做到项目经理,各种繁杂的事,天天解决不完的,心累。

9、提升码农亩产,掰直码农方向,授人以渔,功德无量,利在千秋

 

10、他有两个辛辣但不乏洞察力的断言:真正的牛人也许一辈子只投4次简历,这些家伙一毕业就被好公司抢走了,并且他们的雇主会给他们不赖的待遇,所以他们也不想挪窝。(刚刚去世的Dennis Ritchie就是这样一个人)而“人才”市场上能找到的大多都不是什么人才。招到这帮人轻则费钱重则把你公司搞挂。

11、“现在开发者们都喜欢说自己有一些伟大的想法,甚至有人发给我邮件说,让我们一起改变世界吧。但我认为,脑子里的想法在付诸实际 得以成现实之前,都是一文不值的,太多人都有自己的想法,关键在于如何去实现它。就算你有很好的商业模式,也需要依靠产品支撑。而现在很多有想法的人都把 自己定位为一个类似产品经理的角色,往往缺少美工,开发,测试,推广,运营的经验,但我认为,只要你想办法,这些问题其实都很好解决。”

12、最近一帮做技术的在微博上吵谁比谁NB。其实做技术不像练武,非得打遍天下。能很好解决自己遇到的问题搞定公司的需求就很好;进一步,精益求精下,提升下性能重构下接口,做到优雅可读;再进一步,整理成可重用的方式发布出来,让更多人受益。真正NB是多少人因为你而活得更好,而非其他。

13、越是好的公司,越是好的项目组在招开发人员时他们面的东西越是底层。

14、编写Java开发包都是一群神人,拿Java源码来分析问题,我们无疑站在了巨人的肩膀上。所谓站得高,尿的远也。当然,所谓偷拍都是避免不了的

15、大牛仅仅是 利用他们所掌握的"原理级"技术,将"应用级"技术进行不同的排列组合而已。

16、前期追深度,否则会华而不实,后期追广度,否则会坐井观天

17、对于英语。是你前期提升的关键,不是你未来发展的关键,要不咋有一大堆海归搁浅了呢

18、有很多的不快乐,其实是源自不满足,而不满足,很多时候是源自于心不定,而心不定则是因为不清楚究竟自己要什么,不清楚要什么的结果就是什么都想要,结果什么都没得到。

19、多认识一些人,多和比自己强的人打交道,同样能找到好的老师,不要和一群同样郁闷的人一起控诉社会,控诉老板,这帮不上你,只会让你更消极。和那些比你强的人打交道,看他们是怎么想的,怎么做的,学习他们,然后跟更强的人打交道。

20、

      每个人都希望,自己是独一无二的特殊者    

  含着金匙出生、投胎到好家庭、工作安排到电力局拿1w月薪这样的小概率事件,当然最好轮到自己    

  红军长征两万五、打成右派反革命、胼手胝足牺牲尊严去奋斗,最好留给祖辈父辈和别人    

  自然,不是每个吃过苦的人都会得到回报    

  但是,任何时代,每一个既得利益者身后,都有他的祖辈父辈奋斗挣扎乃至流血付出生命的身影    

  羡慕别人有个好爸爸,没什么不可以    

  问题是,你的下一代,会有一个好爸爸吗?    

  至于问到为什么不能有同样的赢面概率?我只能问:为什么物种竞争中,人和猴子不能有同样的赢面概率?

物竞天择。猴子的灵魂不一定比你卑微,但你身后有几十万年的类人猿进化积淀。

 

21、作为职业规划师,我想告诉你关于工资的一个秘密,年薪月薪是相当有欺骗性的东西。真正起作用的,是时薪——你一定要看看自己的单位时间是否更加值钱。

22、我们争分夺秒计算自己的工资,却很少计算自己的空白时间。其实空白才是未来能够获得巨大收益的东西。我们常说年轻是最大的资本,很多人年轻的时候全部投入工作,那么资本也就直接取现了,再无增值的可能。所以第二条关于工资的做事,工资收入=工资+可能性。

23、记得,对于那些以夺取你最重要的东西——比如健康、生活、好心情、从容、家庭为代价的工资,千万别碰

24、要有足够的“亮剑”资本

25、能力固然重要,但并不能代表全部

26、2013年3.1日,创业到现在,整整一年,中间发生了很多很多事,没取得什么成绩,但内心却有一种豁然开朗的感觉,也许这就是成长。如果目标是既定的,那剩下的就是方法

27、栈和队列的区别是啥? 吃多了拉就是队列;吃多了吐就是栈。

28、“能在书本上简单查到的东西永远不要放进你的记忆里。”

29、技术之路最公平也最残酷的原因是:没有捷径,需要日积月累的积累,以及对技术持久的热情。

30、“回头想想,人的感觉有时真的很不靠谱,我们宁肯裹紧被子,躲在 小屋里抵御风雪,也不愿打点行囊,奔赴遥远南方的温暖春天。我们总是被眼前的利益诱惑,很难做出目光远大的规划。而当我们明白了这些后,已经没有时间重新 来过了。说到创业公司和大公司的比较和选择,就更明显了。不过这些年,中国的创业环境越来越好了,IT领域创业成功的小公司也越来越多了,在做选择的时候 多考虑一些靠谱的创业团队,对做技术的人来讲,真的是利大于弊的。待在大公司里顶多能图个温饱,创业团队才是真正能让人发财呀。”

31、写作很重要

通过写作清晰地表达观点,这很有帮助。从某种程度上来说,写代码和写作非常相似,两种都需要你把你的想法,通过某个结构化的方式清晰并 且无歧义的表达出来。Email当然是写不完的了,不过还有你所开发的产品特性所配套的文档、需要清晰描述Bug的漏洞报告、还有对你修复的Bug做出的 解释。在大学里写作并不是重点,但是如果你写作好的话,这绝对是工作中的一个筹码。

32、某个人的三条感悟

一、不管是给别人打工还是自已干,都要全心全意的工作,因为你所做的 任何一点工作都会让自已的人生多一点筹码,这一点最最重要!这样的例子我至少可以举出两起,优秀的开发人员被其它新公司挖走,并给一定的股份,成为新公司 的股东的例子。当时与这样的开发人员一个部门同时工作或更早工作的有许多人,他们平时经常偷点懒,能少干点工作就少干点,有时候还笑话那个平时努力工作的 人傻,几年过去了,究竟谁比谁傻?
二、多与市场人员交朋友,你接触他们时可能总会觉得他们知识比你少,甚至素质比你低,可能比你还有点黄。但实际上他们比你更懂这个社会!参加到他们这个圈子中去,和他们一起赌赌钱、一起聊聊天、一起洗洗桑拿、一起…..你会通过他们接触到另外一个世界。
三、机会远比钱重要,挣不挣钱在年轻时并不是特别重要!不论是在实际生活中还是在网上或其它地方,如果有机会参与到除本职工作外的一些项目或产品的开发中(包括你的朋友拉你去做点小生意之类的非开发性质的工作),那怕是帮忙的性质,也要积极介入,至少你会交到很多的朋友,这样你的人生会多出很多的机会。

33、是否使用框架,使用什么样的框架,这都不是重要的,重要的是我们要有框架的意识。

34、语言本向并不重要,解决问题的创新方法才是王道。所以在实际软件开发过程中,为了能够更好的贴近业务,我们不得不选择相对容易能够解决问题的编程语言。

35、专业知识蕴藏在狂热的消费者之中。当消费者高兴的时候,用户团体比广告的作用还大。

posted @ 2014-03-08 20:44 ZT文萃 阅读(199) | 评论 (0)编辑 收藏

CPU
CPU好比一个人的大脑,CPU的运算能力就像平时心算,心算速度越快CPU的性能就越好。AMD目前不给力,3A平台也只能在低端系列拼一拼,高端还是Intel的天下。
Intel CPU推荐
赛扬系列:G1610、G1620、G1820
奔腾系列:G2020、G2030、G3220
酷睿  I  5:3470、3570、3570K、4670K
酷睿  I  7:3770、4770、3770K、4770K
至强系列:E3-1230V2、E3-1230V3
个人觉得Intel的奔腾和赛扬系列CPU足够满足平常办公、上网、看电影、玩玩小游戏等日常需求了。酷睿系列CPU足以应付目前大多数3D网游和单机游戏,I3目前性价比低,有种低不成高不就的感觉。游戏机还是咬咬牙上I5,不会超频就选I5-3470、I5-4570。想折腾的就选择带K的CPU,比如I5-3570K、I5-4670K。工作设计、高帅富土豪类直接上至强和I7系列不纠结,在土豪面前毫无性价比可言,玩得爽才是王道。
说明一下:CPU盒装和散片的差别在于是否是正规的质保,原盒是3年质保,而散片(无散热器,就一个CPU)大多是店铺质保一年。

散热
个人认为原装的散热基本上能够满足需求,当然如果你买的是散片CPU不妨多花点钱,无论从散热还是噪音方面都有不错的提升。
CPU散热推荐
九州风神玄冰400、九州风神霜塔、采融B81、利民HR-02M

主板
主板好比人体的骨架,能做多少活,能干多大事还需看主板。世界一线主板大厂已被华硕、技嘉、华擎三分天下,微星已被华硕的子公司华擎成功地小三上位。低端不会超频的用H81/B85主板最佳,高端不差钱又想折腾的直接Z87不纠结,至于具体到那个型号,看自己需求什么样的功能即可。个人建议直接上华擎各系列,这种BIOS做得NB到爆,价格便宜量又足的屌丝之友去哪找!

内存
内存好比人体的神经,把脑和脊髓的兴奋传给各个器官,或把各个器官的兴奋传给脑和脊髓,相当于说内存越大对事件处理的速度越快。个人觉得4G勉强够用,8G还算可以,12G以上看各人的需求。威刚、海盗船、金士顿、芝奇、宇瞻……品牌比较多就不一一推荐了,不超频直接网上商城买金士顿。实体店千万别买金士顿,现在的金士顿假条比以前NB多了,直接连原厂都难分辨,可以选宇瞻或者威刚的。

显卡
显卡好比人脸化妆,你可以选择不化妆,也可以去做韩国美女。目前比较出名的显卡厂商有技嘉、蓝宝石、华硕、微星、迪兰恒进、HIS、映众,游戏类显卡竞争最激烈,而且价位又互相错开,所以说A/N两大显卡芯片厂商简直狡猾到爆。
N卡低端买650,中低端买650TI,中端买660,中高端买760,高端买770。切记显卡型号第二位数少于5(不包括5),比如210、430、640等等绝对是垃圾!
A卡低端买7750,中端买7770或260X,中高端买R270X,高端买R280X。切记显卡型号第三位数少于5(包括5),比如5450、6450等等绝对是垃圾,另外新系列显卡R250性价比低也不建议购买。

硬盘
大水过后500G和1TB的差价很小了,最好直接上单碟1TB的。希捷西部数据都看脸,个人觉得希捷是慢慢死的,有时间给你转移数据;西部数据说挂就挂,根本没给你挽救的时间。SSD本人没用过,就不在这里吹牛逼了。

机箱
机箱好比人的衣服,除了外观好看外还能保护重要部位。这里就不多说了,说多了都是泪,秀才说不过倔的兵,我直接推荐算了。
酷冷至尊毁灭者经典U3版、酷冷至尊开拓者U3普及版、恩杰H230、恩杰小幻影、恩杰H2、银欣乌鸦、银欣FT02

电源
电源好比人体的血液,血液不正常对人体整体的功能都有危害,一台电脑最重要的是电源,电源功率小了,那么恭喜你,你可以提前给你的设备挖好坑买棺材了。目前市面上的电源都是贴牌货,没有好的电源牌子,只有好的电源型号。有条件尽量不要用电脑城4大坑爹之王:航嘉、长城、金河田、大水牛之流的电源,低端电源已被黑出翔,请自行刘东一下“红星炸弹”,个人建议首选台系或台系代工的电源。
安钛克VP350P、安钛克ECO400、安钛克ECO520、安钛克TPN550、安钛克HCP1200,注意安钛克VP450P是坑爹货
海韵S12II-330、海韵S12II-430、海韵S12II-520、海韵S12II-620
在确定各硬件后,可以去各个官网查看硬件的参数,然后把功耗加起来基本上就是要买电源功率的大小了,至于电源功率余量留多少看各人需求。

显示器
有人喜欢屏幕大,有人喜欢16:10,众口难调很难作推荐,反正认定三年质保的大品牌显示器就没错。为了大家的视力,请不要选择18.5、20、21.5这几个尺寸的显示器,可以刘东一下“显示器分辨率”。需要注意的是显示器尺寸越大标准的分辨率越高,对机器的配置的需求也越高。

posted @ 2014-03-06 05:32 ZT文萃 阅读(170) | 评论 (0)编辑 收藏

http://laohuang.iteye.com/blog/55613

1.拳头之Get/Post
拳头是最基本的一重武器,也是最重要的,好比练武之人必须先扎稳马步。

java 代码
 
  1. HttpClient httpclient=new HttpClient();//创建一个客户端,类似打开一个浏览器  
  2. GetMethod getMethod=new GetMethod("http://www.blablabla.com");//创建一个get方法,类似在浏览器地址栏中输入一个地址  
  3. int statusCode=httpclient.executeMethod(getMethod);//回车——出拳!  
  4. System.out.println("response=" + getMethod.getResponseBodyAsString());//察看拳头命中情况,可以获得的东西还有很多,比如head, cookies等等  
  5. getMethod.releaseConnection();//释放,记得收拳哦  


2.孔雀翎之支持https

如何支持https?
java 代码
 
  1. static{  
  2.     Protocol easyhttps = new Protocol("https", new EasySSLProtocolSocketFactory(), 443);  
  3.     Protocol.registerProtocol("https", easyhttps);  
  4. }  

在执行具体的http method之前,暗中将https协议注册一把,如孔雀翎暗藏玄机,毙敌于无形。记住,官方的binary发行版本没有ssl的contribute包,方法一是下载源代码版本来打造你的孔雀翎。

3.多情环之cookies
常道人老多情,其实是记忆太多,所以情之所至,正如cookies甜心,无论你走到那,总把你牵挂:
java 代码
 
  1. HttpClient httpclient=new HttpClient();  
  2. httpclient.getParams().setCookiePolicy(CookiePolicy.RFC_2109);//RFC_2109是支持较普遍的一个,还有其他cookie协议  
  3. HttpState initialState = new HttpState();  
  4. Cookie cookie=new Cookie();  
  5. cookie.setDomain("www.balblabla.com");  
  6. cookie.setPath("/");  
  7. cookie.setName("多情环");  
  8. cookie.setValue("多情即无情");  
  9. initialState.addCookie(cookie);  
  10. httpclient.setState(initialState);  
  11. ...  


4.离别钩之解构cookies

多情环的反面即离别钩,钩出,敌之身体某个部件即要与身体别离,端的是无情:
java 代码
 
  1. ...//执行了某些get/post方法后  
  2. Cookie[] cookies = httpclient.getState().getCookies();  
  3. System.out.println("Present cookies: ");  
  4. for (int i = 0; i < cookies.length; i++) {//循环结构零部件  
  5.     System.out.println(" - " + cookies[i].toExternalForm());  
  6.     System.out.println(" - domain=" + cookies[i].getDomain());  
  7.     System.out.println(" - path=" + cookies[i].getPath());  
  8.     ...            
  9. }  


5.霸王抢之post参数
枪,长兵器之王,诸多名将均使一杆或金或银命名的名枪,比如岳飞。post方法在提交参数对时,犹如灵蛇出洞:
java 代码
 
  1. PostMethod postMethod = new PostMethod("http://www.saybot.com/postme");  
  2. NameValuePair[] postData = new NameValuePair[2];  
  3. postData[0] = new NameValuePair("武器", "枪");  
  4. postData[1] = new NameValuePair("什么枪", "神枪");  
  5. postMethod.addParameters(postData);  
  6. ...//出枪吧  


6.七星碧玉刀之支持代理(proxy)

代理,非常重要,尤其在局域网横行的年头,没有代理,你在公司上不了QQ,没有代理,google不了网页快照,代理之威,可比七星碧玉刀,无刀,在局域网和开发当中,一切白搭:
java 代码
 
  1. HttpClient httpclient=new HttpClient();  
  2. httpClient.getHostConfiguration().setProxy("192.168.0.1", 9527);  
  3. httpClient.getParams().setAuthenticationPreemptive(true);//重要!!!告诉httpclient,使用抢先认证,否则你会收到“你没有资格”的恶果  
  4. /* 
  5.   这一步也至关重要,MyProxyCredentialsProvider实现了org.apache.commons.httpclient.auth.CredentialsProvider接口, 
  6.   返回代理的credential(username/password)*/  
  7. httpClient.getParams().setParameter(CredentialsProvider.PROVIDER, new MyProxyCredentialsProvider());  
  8. httpClient.getState().setProxyCredentials(  
  9.     new AuthScope("192.168.0.1",  
  10.         AuthScope.ANY_PORT, //任意端口哦,可要小心  
  11.         AuthScope.ANY_REALM),//任意域哦,可要小心  
  12. new UsernamePasswordCredentials("username",//proxy的用户名  
  13.                         "password"));//proxy的密码  

...

7.长生剑之天下第一
看httpclient的官方文档:jakarta.apache.org/commons/httpclient/userguide.html
看Hilton网友写的小葵花宝典笔记:www.cnjm.net/tech/article1155.html
通读后,你会有种拔剑四顾心茫然的高手感觉。

七种武器,打完收工!

posted @ 2014-02-26 18:10 ZT文萃 阅读(281) | 评论 (0)编辑 收藏

转载自:
http://wallimn.iteye.com/blog/540566

最近忙于一个项目,了解下httpclient,在这里总结出来,和大家一起学习分享,希望各位朋友提出宝贵的意见。

首先介绍一下项目的背景:
  目标:把国内一家保险公司的“WEB一账通”改成“WAP一账通”。
  资源:客户不提供任何的webservice接口。
 
本项目中用到的第三方组件是apache的httpclient,一个非常强大的网页抓取工具(抓这个字用得可能不太好), 这里和大家
一起讨论下httpclient的一些常用用法和要注意的地方。

本文引用的资源列表:

  httpclient入门:  http://www.ibm.com/developerworks/cn/opensource/os-httpclient/
  httpclient证书导入:http://www.blogjava.net/happytian/archive/2006/12/22/89447.html
  httpclient高级认识:http://laohuang.iteye.com/blog/55613
  httpclient官方文档:http://hc.apache.org/httpcomponents-client/index.html
  httpclient资源关闭:http://www.iteye.com/topic/234759
 
 
上面的文章写得很好,看完之后也就知道怎么用httpclient这个很好的工具了,但是在这里还是补充一些比较重要的东西,也是项目中经
常碰到的问题。

首先要注意的有以下几点:
1、httpclient连接后资源释放问题很重要,就跟我们用database connection要释放资源一样。
2、https网站采用ssl加密传输,证书导入要注意。
3、做这样的项目最好先了解下http协义,比如302,301,200,404返回代码的含义(这是最基本的),cookie,session的机制。
4、httpclient的redirect状态默认是自动的,这在很大程度上给开发者很大的方便(如一些授权获得cookie),但是有时要手动管理下,比如
  有时会遇到CircularRedirectException异常,出现这样的情况是因为返回的头文件中location值指向之前重复(端口号可以不同)地址,导致可能会出现死
  循环递归重定向,这时可以手动关闭:method.setFollowRedirects(false)
5、有的网站会先判别用户的请求是否是来自浏览器,如不是,则返回不正确的文本,所以用httpclient抓取信息时在头部加入如下信息:
  header.put("User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 1.7; .NET CLR 1.1.4322; CIBA; .NET CLR 2.0.50727)");
6、当post请求提交数据时要改变默认编码,不然的话提交上去的数据会出现乱码。重写postMethod的setContentCharSet()方法就可以了:





 
下面写一个通用类来处理request请求返回的文本:
Java代码  收藏代码
  1. /* 
  2.  * HttpRequestProxy.java 
  3.  * 
  4.  * Created on November 3, 2008, 9:53 AM 
  5.  */  
  6.   
  7. package cn.com.mozat.net;  
  8.   
  9. import java.io.BufferedReader;  
  10. import java.io.IOException;  
  11. import java.io.InputStream;  
  12. import java.io.InputStreamReader;  
  13. import java.util.HashMap;  
  14. import java.util.Iterator;  
  15. import java.util.Map;  
  16. import java.util.Set;  
  17.   
  18. import org.apache.commons.httpclient.Header;  
  19. import org.apache.commons.httpclient.HttpClient;  
  20. import org.apache.commons.httpclient.HttpException;  
  21. import org.apache.commons.httpclient.HttpMethod;  
  22. import org.apache.commons.httpclient.NameValuePair;  
  23. import org.apache.commons.httpclient.SimpleHttpConnectionManager;  
  24. import org.apache.commons.httpclient.methods.GetMethod;  
  25. import org.apache.commons.httpclient.methods.PostMethod;  
  26.   
  27. import cn.com.mozat.exception.CustomException;  
  28.   
  29. /** 
  30.  *  
  31.  * @author bird  email:lihongfu-84@163.com 
  32.  * 
  33.  * 2008-11-4  09:49:48 
  34.  */  
  35. public class HttpRequestProxy{  
  36.     //超时间隔  
  37.     private static int connectTimeOut = 60000;  
  38.  //让connectionmanager管理httpclientconnection时是否关闭连接  
  39.     private static boolean alwaysClose = false;  
  40.  //返回数据编码格式  
  41.     private String encoding = "UTF-8";  
  42.       
  43.     private final HttpClient client = new HttpClient(new SimpleHttpConnectionManager(alwaysClose));  
  44.    
  45.     public HttpClient getHttpClient(){  
  46.         return client;  
  47.     }  
  48.         
  49.     /** 
  50.      * 用法: 
  51.      * HttpRequestProxy hrp = new HttpRequestProxy(); 
  52.      * hrp.doRequest("http://www.163.com",null,null,"gbk"); 
  53.      *  
  54.      * @param url  请求的资源URL 
  55.      * @param postData  POST请求时form表单封装的数据 没有时传null 
  56.      * @param header   request请求时附带的头信息(header) 没有时传null 
  57.      * @param encoding response返回的信息编码格式 没有时传null 
  58.      * @return  response返回的文本数据 
  59.      * @throws CustomException  
  60.      */  
  61.     public String doRequest(String url,Map postData,Map header,String encoding) throws CustomException{  
  62.      String responseString = null;  
  63.      //头部请求信息  
  64.      Header[] headers = null;  
  65.      if(header != null){  
  66.       Set entrySet = header.entrySet();  
  67.          int dataLength = entrySet.size();  
  68.           headers= new Header[dataLength];  
  69.          int i = 0;  
  70.          for(Iterator itor = entrySet.iterator();itor.hasNext();){  
  71.           Map.Entry entry = (Map.Entry)itor.next();  
  72.           headers[i++] = new Header(entry.getKey().toString(),entry.getValue().toString());  
  73.          }  
  74.      }  
  75.      //post方式  
  76.         if(postData!=null){  
  77.          PostMethod postRequest = new PostMethod(url.trim());  
  78.          if(headers != null){  
  79.           for(int i = 0;i < headers.length;i++){  
  80.            postRequest.setRequestHeader(headers[i]);  
  81.           }  
  82.          }  
  83.          Set entrySet = postData.entrySet();  
  84.          int dataLength = entrySet.size();  
  85.          NameValuePair[] params = new NameValuePair[dataLength];  
  86.          int i = 0;  
  87.          for(Iterator itor = entrySet.iterator();itor.hasNext();){  
  88.           Map.Entry entry = (Map.Entry)itor.next();  
  89.           params[i++] = new NameValuePair(entry.getKey().toString(),entry.getValue().toString());  
  90.          }  
  91.          postRequest.setRequestBody(params);  
  92.          try {  
  93.     responseString = this.executeMethod(postRequest,encoding);  
  94.    } catch (CustomException e) {  
  95.     throw e;  
  96.    } finally{  
  97.     postRequest.releaseConnection();  
  98.    }  
  99.         }  
  100.       //get方式  
  101.         if(postData == null){  
  102.          GetMethod getRequest = new GetMethod(url.trim());  
  103.          if(headers != null){  
  104.           for(int i = 0;i < headers.length;i++){  
  105.            getRequest.setRequestHeader(headers[i]);  
  106.           }  
  107.          }  
  108.          try {  
  109.     responseString = this.executeMethod(getRequest,encoding);  
  110.    } catch (CustomException e) {  
  111.                 e.printStackTrace();  
  112.     throw e;  
  113.    }finally{  
  114.     getRequest.releaseConnection();  
  115.    }  
  116.         }  
  117.    
  118.         return responseString;  
  119.     }  
  120.   
  121.  private String executeMethod(HttpMethod request, String encoding) throws CustomException{  
  122.   String responseContent = null;  
  123.   InputStream responseStream = null;  
  124.   BufferedReader rd = null;  
  125.   try {  
  126.    this.getHttpClient().executeMethod(request);  
  127.    if(encoding != null){  
  128.     responseStream = request.getResponseBodyAsStream();  
  129.      rd = new BufferedReader(new InputStreamReader(responseStream,  
  130.                       encoding));  
  131.               String tempLine = rd.readLine();  
  132.               StringBuffer tempStr = new StringBuffer();  
  133.               String crlf=System.getProperty("line.separator");  
  134.               while (tempLine != null)  
  135.               {  
  136.                   tempStr.append(tempLine);  
  137.                   tempStr.append(crlf);  
  138.                   tempLine = rd.readLine();  
  139.               }  
  140.               responseContent = tempStr.toString();  
  141.    }else  
  142.     responseContent = request.getResponseBodyAsString();  
  143.              
  144.    Header locationHeader = request.getResponseHeader("location");  
  145.    //返回代码为302,301时,表示页面己经重定向,则重新请求location的url,这在  
  146.    //一些登录授权取cookie时很重要  
  147.    if (locationHeader != null) {  
  148.              String redirectUrl = locationHeader.getValue();  
  149.              this.doRequest(redirectUrl, null, null,null);  
  150.          }  
  151.   } catch (HttpException e) {  
  152.    throw new CustomException(e.getMessage());  
  153.   } catch (IOException e) {  
  154.    throw new CustomException(e.getMessage());  
  155.   
  156.   } finally{  
  157.    if(rd != null)  
  158.     try {  
  159.      rd.close();  
  160.     } catch (IOException e) {  
  161.      throw new CustomException(e.getMessage());  
  162.     }  
  163.     if(responseStream != null)  
  164.      try {  
  165.       responseStream.close();  
  166.      } catch (IOException e) {  
  167.       throw new CustomException(e.getMessage());  
  168.   
  169.      }  
  170.   }  
  171.   return responseContent;  
  172.  }  
  173.    
  174.      
  175.  /** 
  176.   * 特殊请求数据,这样的请求往往会出现redirect本身而出现递归死循环重定向 
  177.   * 所以单独写成一个请求方法 
  178.   * 比如现在请求的url为:http://localhost:8080/demo/index.jsp 
  179.   * 返回代码为302 头部信息中location值为:http://localhost:8083/demo/index.jsp 
  180.   * 这时httpclient认为进入递归死循环重定向,抛出CircularRedirectException异常 
  181.   * @param url 
  182.   * @return 
  183.   * @throws CustomException  
  184.   */  
  185.  public String doSpecialRequest(String url,int count,String encoding) throws CustomException{  
  186.   String str = null;  
  187.   InputStream responseStream = null;  
  188.   BufferedReader rd = null;  
  189.   GetMethod getRequest = new GetMethod(url);  
  190.   //关闭httpclient自动重定向动能  
  191.   getRequest.setFollowRedirects(false);  
  192.   try {  
  193.      
  194.    this.client.executeMethod(getRequest);  
  195.    Header header = getRequest.getResponseHeader("location");  
  196.    if(header!= null){  
  197.     //请求重定向后的URL,count同时加1  
  198.     this.doSpecialRequest(header.getValue(),count+1, encoding);  
  199.    }  
  200.    //这里用count作为标志位,当count为0时才返回请求的URL文本,  
  201.    //这样就可以忽略所有的递归重定向时返回文本流操作,提高性能  
  202.    if(count == 0){  
  203.     getRequest = new GetMethod(url);  
  204.     getRequest.setFollowRedirects(false);  
  205.     this.client.executeMethod(getRequest);  
  206.     responseStream = getRequest.getResponseBodyAsStream();  
  207.     rd = new BufferedReader(new InputStreamReader(responseStream,  
  208.                       encoding));  
  209.              String tempLine = rd.readLine();  
  210.              StringBuffer tempStr = new StringBuffer();  
  211.              String crlf=System.getProperty("line.separator");  
  212.              while (tempLine != null)  
  213.              {  
  214.                  tempStr.append(tempLine);  
  215.                  tempStr.append(crlf);  
  216.                  tempLine = rd.readLine();  
  217.              }  
  218.              str = tempStr.toString();  
  219.    }  
  220.      
  221.   } catch (HttpException e) {  
  222.    throw new CustomException(e.getMessage());  
  223.   } catch (IOException e) {  
  224.    throw new CustomException(e.getMessage());  
  225.   } finally{  
  226.    getRequest.releaseConnection();  
  227.    if(rd !=null)  
  228.     try {  
  229.      rd.close();  
  230.     } catch (IOException e) {  
  231.      throw new CustomException(e.getMessage());  
  232.     }  
  233.     if(responseStream !=null)  
  234.      try {  
  235.       responseStream.close();  
  236.      } catch (IOException e) {  
  237.       throw new CustomException(e.getMessage());  
  238.      }  
  239.   }  
  240.   return str;  
  241.  }  
  242.    
  243.    
  244.    
  245.    
  246.  public static void main(String[] args) throws Exception{  
  247.   HttpRequestProxy hrp = new HttpRequestProxy();  
  248.    Map header = new HashMap();  
  249.          header.put("User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 1.7; .NET CLR 1.1.4322; CIBA; .NET CLR 2.0.50727)");  
  250.   String str = hrp.doRequest(  
  251.     "http://www.cma-cgm.com/en/eBusiness/Tracking/Default.aspx?BolNumber=GZ2108827",  
  252.      null, header,null);  
  253.   System.out.println(str.contains("row_CRXU1587647"));  
  254. //  System.out.println(str);  
  255.  }  
  256.      

posted @ 2014-02-26 18:08 ZT文萃 阅读(344) | 评论 (0)编辑 收藏

转载自:
http://www.cnblogs.com/happyPawpaw/archive/2013/03/27/2984023.html

现提供两种方法: 
方法一: 
如果你用过Toolkit(java.awt.Toolkit)类,这将是一件很简单的事情: 
Toolkit tk=Toolkit.getDefaultToolkit() 
Image image=tk.createImage("image.gif"); /*image.gif是你的图标*/ 
this.setIconImage(image); 

注意:这个图标一定要是好用的图标。

就这么简单,看看,已经变成你自己的图标了。Toolkit是个很有用类的,提供很多对窗口默认行为的修改,下面随便提一下,怎么把默认的鼠标图标改成你自己的图标: 
Toolkit tk=Toolkit.getDefaultToolkit(); 
Image img=tk.getImage("mouse.gif"); /*mouse.gif是你的图标*/ 
Cursor cu=tk.createCustomCursor(img,new Point(10,10),"stick"); 
this.setCursor(cu); 

方法二: 
用到ImageIcon类和setIconImage方法。 
import javax.swing.*; 
public class A extends JFrame { 
    String image = new String("face.gif"); //建立一个字符串保存要用的图标的路径,关于java的路径请参考其它文档 
    ImageIcon test = new ImageIcon(image); //建立一个ImageIcon类,产生setIconImage()方法需要的Image数据 

    public A() { 
        super("演示自定义标题栏的图标的方法"); 
        this.setIconImage(test.getImage()); //设置标题栏的图标为face.gif 
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);        
        this.show(); 
        //this.setTitle("sdfsdf"); 
        this.setSize(400,200); 
    } 
    public static void main(String[] args) { 
        A jIcon = new A();       
    } 


此法本人再次简化为两条语句: 
import javax.swing.*; 
public class A extends JFrame { 
    ImageIcon test = new ImageIcon(new String(face.gif));//第一句 
    public A() { 
        super("演示自定义标题栏的图标的方法"); 
        this.setIconImage(test.getImage()); //第二句 
         this.setSize(400,200); 
        this.show(); 

    public static void main(String[] args) { 
        A jIcon = new A();       
    } 
}

posted @ 2014-02-21 10:13 ZT文萃 阅读(242) | 评论 (0)编辑 收藏

转载自:
http://www.sbanzu.com/topicdisplay.asp?BoardID=8&Page=9&TopicID=4112790

照片中的柴静虽然身材明显发福,但仍可见昔日“女神”风采。据知情人透露,柴静私下从不主动谈及私生活,特别是在结婚消息曝光后,让她对隐私更加保护。至于其老公赵嘉,如今在央视下属一家公司担任首席财政官,同时继续从事摄影事业。


被坊间传闻为“央视最穷主持人”的柴静被爆在去年10月赴美国产下一女,升级当妈。此外,她为女儿取名叫柴知然,柴静曾私下表示希望女儿不仅“知然”,且能“知其所以然”。



不管公知还是五毛,都把后代往洋大人那里放。批评这个体制的,吹捧这个体制的,都选择把娃儿生在美国。这才是真正的普世价值啊,无关身份,无关制度,无关肤色,无关民族,只有对孩子绝对的爱,以及与孩子有关的自由向往。

@十年砍柴 :公知和五毛理应都为柴静在美国产女感到高兴。所谓公知当然贺其为孩子选择了含金量高的国籍。而爱国的五毛,应庆祝她的女儿将来没有强大的中国庇护,而且为自己的儿女腾出在中国的空间,替自己儿女省下社会抚养费。

@刘桂娟: 我认识的很多精英和条件优越的人都选择在美生孩子,将来孩子不用付出几百万的留学费用,18岁后有选票。我一移民澳洲的朋友,两个孩子免费上学,她经常回国看父母,每到选举时必回澳洲,骄傲的说:我去投票!我都没见过咱们的选票长什么样

@沁水一波:柴静在美国生孩子真是她个人的事,勿须责怪。让人不舒服的是以前高调深爱中国的她用脚表明她的爱并不深。记得知青下放时叫的最响要扎根农村的人往往是溜的最快的。不高调就不行吗?此事让人不适应的是语言和行动的反差,而不是在美国生孩子这事。

@木子老龙 :柴静把孩子生在美国,司马南把孩子送到美国,无论政见如何,在爱自己的孩子这一点上,方向是高度一致的。什么叫普世价值?这就是普世价值。

@奋壹:在推特上看到一个神评:看到柴静美国产女的新闻,不胜唏嘘,不管是民主派还是自由派,最后都是美国派。好不容易有个深深的爱着这片土地的国师张艺谋把孩子生在国内,还被计生委罚得稀里哗啦。

@王鹏律师 :以前觉得她很高尚,媒体届最具良心的代表之一,现发现她很务实,没有拿女儿的未来做赌博。作为父母,从子女幸福的角度出发本身没有什么错,也不能指责她的选择。该反思的问题是为什么这么多精英去国外生子,享有外国户籍? 中国到底哪里有问题?

奇葩国家啊,爱他和恨他的人都要做他敌人的爹妈。
基本上,就算未来中国富裕民主发达了,那些特权移民同样可以依靠特权设法回来。比如现在那些拿着美国绿卡乃至国籍却可以赖在中国搂钱的特权分子就是如此(无论他们嘴巴里喊的是普世价值还是共产主义,被人称作公知还是走狗,本质上都是一样的)。

后悔的最多不过是那些普通移民罢了。也不用等将来,现在就有。

中国尽出汉奸,这倒是没跑的

posted @ 2014-02-21 06:46 ZT文萃 阅读(216) | 评论 (0)编辑 收藏

 

http://wangguanxiong.baijia.baidu.com/article/4681

 

创办5年、50个人的小公司值160亿美元!

是FaceBook疯了还是你不够“疯”?

【巨头狂野搏命移动端】

今晨重磅消息,美国社交网络老大Facebook收购WhatsApp,一个员工50人、其中32名是工程师的 小公司。为此,Facebook付出了总金额160亿美元“现金+股票”的昂贵代价。此外,还承诺给创始人团队30亿美元的四年行权限制股,加上期权交易 规模将达190亿美元。

WhatsApp是一个跨平台通讯应用,创办于2009年。界面朴素简洁,没有任何花哨的功能,核心功能就是帮助用户收发消息。简单说,有点像简化版的微信。

目前其月活跃用户达4.5亿(其中70%每天登录),每天新增用户100万,每天发送消息达到全球电信的短信数量,每天有10亿张照片、2亿条音频消息、1亿条视频消息通过该软件传输。

因此,这对致力于“连结人与信息”的Facebook来说,是一个极大威胁。很简单,要么战胜你,要么买下你。这和脸谱2012年收购图片分享应用Instagram的逻辑一致,在社交网络这个核心领域,脸谱绝不会允许他人染指。

更重要的是,从WhatsApp、Instagram到最近风靡美国年轻人的snapshot,都是为移动而生的应用。实际上,移动互联网的发展速度远远超过桌面互联网,巨头们正疯狂地买公司、买人,否则一不小心就会被干掉。

【每个员工值20亿】

然而,在这笔轰动全球的交易中,真正让我激动的是人的价值。

即使不包含30亿美元的期权价值,仅按立即支付的160亿美金收购价计算,按最新汇率,WhatsApp一个员工值20亿人民币,20亿!

两年前,当FaceBook斥资10亿美金收购只有13个人的Instgram时,他们该处的价格是一个人大约一亿美金。现在,价格翻了3倍。

这对一直重视“看得见的资产”的中国人来说,几乎是不可想象的。许多传统老板会想,就这么几个小屁孩敢要几十亿美金,疯了?这种思维定势有时很难扭转,看走眼的还包括现在如日中天的腾讯CEO马化腾。

当年,Instagram估值还不到1亿美金时腾讯曾有机会投资。当时Instagram只有几个人,在一个靠 近海边的房子办公。就是一层玻璃,外面都看得见,扔个砖头就可以把里面的电脑全拿走了。腾讯某副总裁看着说,这个公司不太靠谱吧,才几个人。后来,腾讯不 得不估值8亿美金时跟投。

这就是人的价值,只要拥有创新能力的人做出一个创新产品,他们足以撬动整个地球。

【人是科技第一生产力】

NOP男装创始人刘爽认为管理分为两种:管人管事,选择哪种不取决于领导者意志,而取决于企业行业类型。管事型 企业的代表是制造业和零售业,比如富士康和沃尔玛,人人都是螺丝钉,不需要你创新,需要的是你的执行效率。而管人型企业的代表是高科技和互联网,比如微软 和谷歌,其产品和服务的研发改良依赖于员工个人的创造力创新力。

如果想做一个产品服务高度依托互联网经济和体验经济的软硬件一体式品牌公司,那就应该选择管人和众智。落到具体就是有边界的制度,无边界的沟通。

当年,邓小平同志以无畏的政治勇气和理论高度,说出了一句名言:“科技是第一生产力”。这句话,激励了整整几代中国人。它让人们看到了科技的价值、知识的价值,也是现在长盛不衰的知识经济的动力。

现在,我想说:人是科技的第一生产力。不重视人的价值,不尊重人的需求,不解放人的生产力,必将被互联网时代快速淘汰。

请扪心自问。

(更多深度,扫描下方二维码后看历史文章)

作者简介:一个IPO专业户、超级自媒体。我信仰互联网,因为它实现了人和一切的自由连接,这是3代人必经的命运。微博@互联网信徒王冠雄,微信wang-guanxiong。见人所之未见,每一条都对得起关注!

posted @ 2014-02-21 06:12 ZT文萃 阅读(191) | 评论 (0)编辑 收藏

转载自:
http://blog.csdn.net/haoren_e/article/details/6043645


     在linux上部署项目的时候,我们往往通过一段shell来启动程序,甚至是通过crontab定时任务来定时的调用java程序,但是很奇怪的一个问题就是,比如我写了一个如下的shell脚本:

 

  1. #!/bin/sh  
  2. # -----------------------------------------------------------------------------  
  3. # Start script for the CMGP BOSSCONTROL   
  4. #  
  5. # $Id: run_bosscontrol.sh,v 1.0 2007/11/06 Exp $  
  6. # -----------------------------------------------------------------------------  
  7. #指定字符集  
  8. LANG=zh_CN.GBK export LANG  
  9. RUN_HOME=.  
  10. CLASSPATH=$CLASSPATH:$RUN_HOME/lib/checking.jar  
  11. CLASSPATH=$CLASSPATH:$RUN_HOME/lib/ojdbc14.jar  
  12. CLASSPATH=$CLASSPATH:$RUN_HOME/lib/commons-dbutils-1.1.jar  
  13. CLASSPATH=$CLASSPATH:$RUN_HOME/lib/log4j-1.2.14.jar  
  14. CLASSPATH=$CLASSPATH:$RUN_HOME/lib/dom4j-1.6.jar  
  15.   
  16. export CLASSPATH  
  17.   
  18. java  com.**.checking.Checking_Start >> log.out &   
 

 

手动命令行运行该脚本的时候,可以正常运行java程序,但是使用crontab定时任务,貌似就不起效果了,很是郁闷哪,查原因哪,分析可能原因:

 1)是否当前用户对此shell脚本没有可执行权限,通过ls -lrt /apps/service/mtk/checking/run.sh查看脚本是有可执行,但是有执行权限呀-rwxr-xr-x

 2)既然单独运行脚本没问题,那会不会是定时的问题呢?于是写了一个简单的输出的shell脚本通过定时也是没问题的。说明还是脚本的问题。

后来上网查了下,想到可能是脚本中环境变量的原因,因为通过crontab运行脚本,是以root用户,而不是当前用户,于是cat /etc/profile查看环境变量,然后修改脚本如下:

  1. #!/bin/sh  
  2. # -----------------------------------------------------------------------------  
  3. # Start script for the CMGP BOSSCONTROL   
  4. #  
  5. # $Id: run_bosscontrol.sh,v 1.0 2007/11/06 Exp $  
  6. # -----------------------------------------------------------------------------  
  7. export PATH=/apps/usr/java/jdk1.5/bin:$PATH  
  8. export JAVA_HOME=/apps/usr/java/jdk1.5  
  9. export JRE_HOME=/apps/usr/java/jdk1.5/jre  
  10. export CLASSPATH=/apps/usr/java/jdk1.5/lib:/apps/usr/java/jdk1.5/jre/lib:$CLASSPATH  
  11. RUN_HOME=/apps/service/checking  
  12. CLASSPATH=$CLASSPATH$RUN_HOME/lib/checking.jar  
  13. CLASSPATH=$CLASSPATH:$RUN_HOME/lib/ojdbc14.jar  
  14. CLASSPATH=$CLASSPATH:$RUN_HOME/lib/commons-dbutils-1.1.jar  
  15. CLASSPATH=$CLASSPATH:$RUN_HOME/lib/log4j-1.2.14.jar  
  16.  CLASSPATH=$CLASSPATH:$RUN_HOME/lib/dom4j-1.6.jar  
  17.   
  18. export CLASSPATH=$CLASSPATH  
  19.   
  20. java  com.**.checking.Checking_Start >> log.out &   

 

export显示导出为用户环境变量的环境变量
以上这种jar包是通过eclipse工具export导出,不包含MANIFEST.MF文件,如果使用打包工具Ant,我们可以在打包默认的build.xml文件中设置Class-Path
将第三方jar包加入manifest.mf文件中,且指定程序主类
在build.xml中添加如下内容:

 

  1. <!-- create a property containing all .jar files, prefix lib/, and seperated with a space -->  
  2. <pathconvert property="libs.project" pathsep=" ">  
  3.    <mapper>  
  4.       <chainedmapper>  
  5.         <!-- remove absolute path -->  
  6.         <flattenmapper />  
  7.        <!-- add lib/ prefix -->  
  8.        <globmapper from="*" to="lib/*" />  
  9.       </chainedmapper>  
  10.     </mapper>  
  11.      <path>  
  12.       <!-- lib.home contains all jar files, in several subdirectories -->  
  13.       <fileset dir="${lib.dir}">  
  14.        <include name="**/*.jar" />  
  15.       </fileset>  
  16.      </path>  
  17.   </pathconvert>  

 

另外,在create manifest文件时,加上:

  1. <!-- 这样就可以将第三方jar包加入 -->   
  2. <attribute name="Class-Path" value="${libs.project}" />  
  3. <!-- 程序运行的主类 -->  
  4. <attribute name="Main-Class" value="com.**.checking.Checking_Start " />  

 

这样运行ant,打成的jar包中MANIFEST.MF中内容如下:

  1. Manifest-Version: 1.0  
  2. Ant-Version: Apache Ant 1.7.0  
  3. Created-By: 1.5.0_09-b01 (Sun Microsystems Inc.)  
  4. Implementation-Title: fee task  
  5. Implementation-Version: 1.0  
  6. Implementation-Vendor: Aspire  
  7. Main-Class: com.aspire.cmgp.flowcontrol.server.FlowControlServer  
  8. Class-Path: lib/cmgp-util-1.0.1.jar lib/commons-codec-1.3.jar lib/comm  
  9.  ons-collections.jar lib/commons-dbcp-1.2.1.jar lib/commons-httpclient  
  10.  .jar lib/commons-logging.jar lib/commons-pool-1.2.jar lib/dom4j.jar l  
  11.  ib/log4j.jar lib/ojdbc14.jar  

 

这样在shell脚本中就不需要指定程序所需要的jar包了,也就不存在环境变量设置的恼人问题。比较正规的也是这么操作的。
这样在shell中就直接运行jar包就行了:java -jar 主程序.jar -Xmx1024m -Xms1024m -Xmn512m,多好多方便~

posted @ 2014-02-20 11:25 ZT文萃 阅读(638) | 评论 (0)编辑 收藏

http://blog.163.com/kevinlee_2010/blog/static/16982082020112710557998/

第一种是以毫秒为单位计算的。

  Java代码

  //伪代码

  long startTime=System.currentTimeMillis();   //获取开始时间

  doSomeThing();  //测试的代码段

  long endTime=System.currentTimeMillis(); //获取结束时间

  System.out.println("程序运行时间: "+(end-start)+"ms");

  //伪代码

  long startTime=System.currentTimeMillis();   //获取开始时间

  doSomeThing();  //测试的代码段

  long endTime=System.currentTimeMillis(); //获取结束时间

  System.out.println("程序运行时间: "+(end-start)+"ms");

  第二种是以纳秒为单位计算的。

  Java代码

  //伪代码

  long startTime=System.nanoTime();   //获取开始时间

  doSomeThing();  //测试的代码段

  long endTime=System.nanoTime(); //获取结束时间

  System.out.println("程序运行时间: "+(end-start)+"ns");

  //伪代码

  long startTime=System.nanoTime();   //获取开始时间

  doSomeThing();  //测试的代码段

  long endTime=System.nanoTime(); //获取结束时间

  System.out.println("程序运行时间: "+(end-start)+"ns");

posted @ 2014-02-14 09:51 ZT文萃 阅读(206) | 评论 (0)编辑 收藏

http://china.gmail.cn/html/38/63638-41467.html


javaz中对日期时间的处理比较多,代码中列出了3中日期时间计算差值的方法。

比如:现在是2004-03-26 13:31:40
过去是:2004-01-02 11:30:24
我现在要获得两个日期差,差的形式为:XX天XX小时XX分XX秒

 

java计算时间差及比较时间大小
比如:现在是2004-03-26 13:31:40
过去是:2004-01-02 11:30:24
我现在要获得两个日期差,差的形式为:XX天XX小时XX分XX秒

方法一:
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

try
{
Date d1 = df.parse("2004-03-26 13:31:40");
Date d2 = df.parse("2004-01-02 11:30:24");
long diff = d1.getTime() - d2.getTime();
long days = diff / (1000 * 60 * 60 * 24);
}
catch (Exception e)
{
}

方法二: SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
java.util.Date now = df.parse("2004-03-26 13:31:40");
java.util.Date date=df.parse("2004-01-02 11:30:24");
long l=now.getTime()-date.getTime();
long day=l/(24*60*60*1000);
long hour=(l/(60*60*1000)-day*24);
long min=((l/(60*1000))-day*24*60-hour*60);
long s=(l/1000-day*24*60*60-hour*60*60-min*60);
System.out.println(""+day+"天"+hour+"小时"+min+"分"+s+"秒");

方法三:
SimpleDateFormat dfs = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
java.util.Date begin=dfs.parse("2004-01-02 11:30:24");
java.util.Date end = dfs.parse("2004-03-26 13:31:40");
long between=(end.getTime()-begin.getTime())/1000;//除以1000是为了转换成秒

long day1=between/(24*3600);
long hour1=between%(24*3600)/3600;
long minute1=between%3600/60;
long second1=between%60/60;
System.out.println(""+day1+"天"+hour1+"小时"+minute1+"分"+second1+"秒");


====================================================

java 比较时间大小

String s1="2008-01-25 09:12:09";
String s2="2008-01-29 09:12:11";
java.text.DateFormat df=new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
java.util.Calendar c1=java.util.Calendar.getInstance();
java.util.Calendar c2=java.util.Calendar.getInstance();
try
{
c1.setTime(df.parse(s1));
c2.setTime(df.parse(s2));
}catch(java.text.ParseException e){
System.err.println("格式不正确");
}
int result=c1.compareTo(c2);
if(result==0)
System.out.println("c1相等c2");
else if(result<0)
System.out.println("c1小于c2");
else
System.out.println("c1大于c2");

posted @ 2014-02-14 09:49 ZT文萃 阅读(222) | 评论 (0)编辑 收藏

下文转载自:

http://www.cnblogs.com/qixin622/archive/2010/07/23/1784002.html

 


Java'中的几种Look and Feel
1、Metal风格 (默认)
String lookAndFeel = "javax.swing.plaf.metal.MetalLookAndFeel";
UIManager.setLookAndFeel(lookAndFeel);
2、Windows风格
String lookAndFeel = "com.sun.java.swing.plaf.windows.WindowsLookAndFeel";
UIManager.setLookAndFeel(lookAndFeel);
3、Windows Classic风格
String lookAndFeel = "com.sun.java.swing.plaf.windows.WindowsClassicLookAndFeel";
UIManager.setLookAndFeel(lookAndFeel);
4、Motif风格
String lookAndFeel = "com.sun.java.swing.plaf.motif.MotifLookAndFeel";
UIManager.setLookAndFeel(lookAndFeel);
5、Mac风格 (需要在相关的操作系统上方可实现)
String lookAndFeel = "com.sun.java.swing.plaf.mac.MacLookAndFeel";
UIManager.setLookAndFeel(lookAndFeel);
6、GTK风格 (需要在相关的操作系统上方可实现)
String lookAndFeel = "com.sun.java.swing.plaf.gtk.GTKLookAndFeel";
UIManager.setLookAndFeel(lookAndFeel);
7、可跨平台的默认风格
String lookAndFeel = UIManager.getCrossPlatformLookAndFeelClassName();
UIManager.setLookAndFeel(lookAndFeel);
8、当前系统的风格
String lookAndFeel = UIManager.getSystemLookAndFeelClassName();
UIManager.setLookAndFeel(lookAndFeel);

在Java中让用户能够动态地更改应用的外观,可以给用户更好地体验,具体的实现方式是:
1,先使用UIManager.setLookAndFeel(String s)方法设定对应的外观
2,再使用SwingUtilities.updateComponentTreeUI(Component c)方法立刻更新应用的外观
这两个类均在javax.swing包中

posted @ 2014-02-12 10:20 ZT文萃 阅读(208) | 评论 (0)编辑 收藏

电脑入门配置
如果平时只看看股票、上上网、看电影、玩玩普通的网络游戏,这套配置完全可以胜任。
CPU: INTEL-G1610  ¥260
主板:技嘉B75M-D3V  ¥460
内存:金士顿DDR3-1333 4G  ¥280
硬盘:西部数据Caviar Blue 500GB  ¥320
电源:安钛克VP350P  ¥200(备选海韵S12II330W  ¥270)
机箱:酷冷毁灭者经典U3版  ¥200
显示器:三年质保的大品牌19寸显示器,16:9或16:10自行选择

网游入门配置
大型3D网络游戏入门配置,需要游戏关闭SSAO、低阴影、中等特效
CPU: INTEL-G2120  ¥410
主板:技嘉B75M-D3V  ¥460
内存:金士顿DDR3-1600 4G  ¥270
显卡:微星7750-1G  ¥620(备选迪兰恒进7750恒金2代  ¥600)
硬盘:西部数据Caviar Blue 500GB  ¥320
机箱:酷冷毁灭者经典U3版  ¥200
电源:安钛克VP350  ¥200(备选海韵S12II330W  ¥270)
显示器:三年质保的大品牌19寸显示器,16:9或16:10自行选择

网游爽玩配置
基本可以爽玩目前的大型3D网络游戏了,前提是不能双开或多开
CPU: I5-3470  ¥1200(也可选择I5-3470散片+九州风神玄冰400散热)
主板:技嘉B75M-D3V  ¥460(拉4倍频备选华擎Z77-PRO4    ¥600)
内存:金士顿DDR3-1600 4GX2  ¥560
显卡:华硕或微星7750-1G  ¥620(N卡可考虑650)
硬盘:西部数据Caviar Blue 1TB  ¥410
机箱:酷冷毁灭者经典U3版  ¥200
电源:海韵S12II430  ¥310(备选安钛克ECO-400  ¥360)
显示器:三年质保的大品牌22寸显示器,16:9或16:10自行选择

单机入门配置
CPU: I5-3470  ¥1200(也可选择I5-3470散片+九州风神玄冰400散热)
主板:技嘉Z77-DS3H  ¥700(不超频选择技嘉B75M-D3H  ¥500)
内存:金士顿DDR3-1600 4GX2  ¥560
显卡:华硕或微星7770-1G  ¥800(N卡可考虑技嘉650TI  ¥1070)
硬盘:西部数据Caviar Blue 1TB  ¥410
机箱:恩杰H230  ¥360
电源:海韵S12II430  ¥310(备选安钛克ECO-400  ¥360)
显示器:三年质保的大品牌22、23、24寸显示器,16:9或16:10自行选择

单机爽玩配置
CPU: I5-3570K
散热:九州风神霜塔(备选采融B81)
主板:技嘉Z77X-D3H
内存:金士顿DDR3-1600 4GX2
显卡:华硕或HIS 270X(N卡可考虑华硕760)
硬盘:西部数据Caviar Blue 1TB
机箱:恩杰H2
电源:海韵S12II430(备选安钛克ECO-400需自购显卡6PIN转接线)
显示器:三年质保的大品牌22、23、24寸显示器,16:9或16:10自行选择

高帅富配置
CPU: I5-3570K  ¥1610
散热:九州风神霜塔  ¥200(备选采融B81)
主板:技嘉Z77X-UD3H  ¥1490
内存:芝奇RipjawsX DDR3-2133 4GX2  ¥570
显卡:华硕或HIS 270X  ¥1500(N卡可考虑华硕760  ¥2200)
硬盘:希捷2TB  ¥580(SSD自行添加)
机箱:杰恩小幻影或H2  ¥480
电源:海韵S12II520  ¥440(备选安钛克ECO520需自购显卡6PIN转接线  ¥460)
鼠标:Razer炼狱蝰蛇  ¥300(备选罗技G400  ¥230)
键盘:机械键盘自行研究
显示器:Dell-2412M  ¥1500

土豪级配置
CPU: I5-3570K  ¥1610
散热:九州风神霜塔  ¥200(备选采融B81)
主板:技嘉Z77X-UD3H  ¥1490
内存:芝奇RipjawsX DDR3-2133 4GX2  ¥570
显卡:技嘉GTX770  ¥3000(受挖坑影响,A卡中高端普遍无货)
硬盘:希捷2TB  ¥580(SSD自行添加)
机箱:银欣FT02  ¥1700
电源:海韵X650  ¥800(备选安钛克TPN550  ¥660)
鼠标:罗技G9X  ¥600
键盘:机械键盘自行研究
显示器:Dell-2412M  ¥1500



CPU
AMD 目前不给力,新装机器建议直接上Intel的CPU。但Intel的4系列CPU(G3220、I3/I5/I7-4XXX)haswell发热量还是比 较大,大家还是买3系列的CPU吧。CPU盒装与散片的差别在于是否是正规质保,原盒是3年质保,而散片大多是店铺质保1年。为什么选I5不选I7:
1. 在所有的大型网游里,建筑和NPC的建模、游戏AI运算、游戏内各种数据计算、游戏插件计算等等这些工作都需要CPU来做,显卡只负责特效部分,但显卡特 效是可以根据实际情况调整的。越是满地NPC、各种建筑、密密麻麻的花花草草、各种飘数字的地方,CPU的压力就越大,CPU的整体性能决定了大型网游里 高负荷场景下的最低帧数水平。
2.对CPU的要求无非就是:同频率的CPU更依赖架构效率也就是核心效能;同架构效率下更依赖CPU主频;大量AI运算需要大容量低延迟高命中率的共享缓存。
  奔腾:双核、高频、无睿频、3MB三级共享缓存;
  i5:    四核、高频、有睿频、6MB三级共享缓存。
对于大型网游,i5相比奔腾多出来的俩物理核心不是最重要的,更重要的是更高CPU主频、睿频以及容量翻倍的三级缓存,在高负荷场景下最低帧数表现会更好。
3.绝大多数的日常程序和游戏并不支持HT,也不能有效支持多核心。日常如果不使用能支持HT超线程软件的话,也不需要选择E3和I7。

主板
低端用B75M-D3V最佳,中端小超频用二线做工一般的Z77即可,中高端用3570K搭配二线做工好的Z77,一线Z77高端直接上一线的Z77。
特别注意:Intel的4系列的CPU和4系列的主板(H81、B85、Z87)目前不支持XP系统,请纯办公或者还想用XP的注意下。

内存
不超频就直接网上商城买金士顿,实体店千万别买金士顿,现在假货连金士顿自己都不能分辨,可选择宇瞻或者金邦。

显卡
N卡低端买650,700-1000买650TI,1000-1500买660,1500-2000买760,高端直接770。切记210、220……630、640等绝对是核显都不如的垃圾,买显卡直接650起。
A卡低端买600元左右买7750,中端买7770或260X,高端买R270X,土豪直接R280X。切记54XX、55XX、64XX、65XX等绝对是核显都不如的垃圾,买显卡直接R260X起。

硬盘
500G和1TB价差很小,最好直接上单碟1TB的,希捷、西数都看脸,随便选吧。SSD只提升文件的读取速度,对帧数基本没影响,请大家自行研究

机箱
机箱是更新换代用得最久的,好的机箱对减少共振、散热风道处理还是比较好的。

电源
如果有条件尽量不要用航嘉、长城之流的电源,首选台系或台系代工的电源。低端电源已被黑翔!(自行百度“红星炸弹之歌”)
推荐安钛克的VP350、ECO400、ECO520、TPN550和海韵的S12系列,注意VP450是坑爹货,BP系列也不再做推荐了,因为和ECO400差价太少。

显示器
为了大家的眼睛,请不要选择20、21.5这几个尺寸的显示器,点距太小了!尺寸看个人喜好:想买16:9的就买23或者27的;想买16:10就买22或24的,再大尺寸就看个人喜欢了。但是一般显示器尺寸越大,标准分辨率就越高,对机器的配置的需求也越高。

光驱
现在光驱对于大部分人来说基本没什么用,如果要的话推荐先锋DVR-221CHV,觉得没必要用到刻录的可以选择先锋232D,当然LG和建兴的都可以。

鼠标
如果对实体店装机送的不喜欢,个人推荐力胜L7(带侧键支持,小手用15、中手用55、大手用95)。往上建议直接蝰蛇和罗技,各有千秋。再往上就是G9X。

键盘
自行选择,当然,土豪的话都会选择机械键盘。

音箱
你是需要一个带Mic的耳机还是一个外置音箱,好明显这看个人需求,音箱的话个人推荐漫步者R101T06。至于其它的本人也不懂,就不要在这里献丑了。

外设
各有所爱,希望大家去实体店体验再决定购买,实体店价格坑爹的话试好手感走网上商城。

posted @ 2014-01-28 23:28 ZT文萃 阅读(184) | 评论 (0)编辑 收藏

http://www.ibm.com/developerworks/cn/websphere/library/techarticles/1303_qiuxl_liberty/1303_qiuxl_liberty.html

介绍

WebSphere Liberty Profile Server 介绍

Liberty 是一款全新的轻量级应用服务器, 具有以下几个方面的特点:

  1. 高 模块化——该功能允许用户根据自己应用程序的需求启用或者禁用相关的 feature(所谓 feature,在这里指的是运行应用程序所需要的各种资源的支持。比如,应用程序用到了 JSP,我们就需要启动 JSP 这个 feature,如果不在需要此 feature,就可以将其禁用。通过这种模块化的控制,我们可以按需启动不同的 feature,包括 JSP, Servlet, JPA 等等,这种控制是实现轻量级应用服务器的基础)。
  2. 轻量级—— Liberty 采用了多种技术进行瘦身和优化(主要是 OSGi 的应用),与传统的 WAS 相比,极大的减少了运行时的内存消耗。
  3. 高动态性——由于采用了 OSGi 的架构,程序员在开发的时候,可以动态修改配置文件,应用程序以及服务器的运行时信息,这些修改都是实时生效的,不需要重启服务器。
  4. 快速——由于采用了高模块化的设计,Liberty 应用服务器会“按需启动”,自身消耗的系统资源很少,对执行任务的反应时间也非常短,例如,一般来说 Liberty 的启动时间小于 5 秒。
  5. 配置简单——在整个开发过程中,用户只需要和一个配置文件(server.xml)打交道,而且配置的使用也非常灵活。

WebSphere eXtreme Scale 介绍

WebSphere eXtreme Scale 以内存网格的方式运行,动态处理、分区、复制和管理数以万计服务器上的应用程序数据和业务逻辑。提供事务完整性和透明的故障恢复功能,从而确保高可用性、 高可靠性和一致的响应时间。它可以监控和管理自己,支持扩大和缩小,可以自动从故障恢复。极大的扩大了应用程序可以支持的用户数量。用更少的时间服务更多 的用户,或者在规定的、可接受的响应时间内为更多的用户提供服务。

回页首

前提

  • 安装 Oracle 或者 IBM JDK,并配置好环境变量。
  • 如果使用 Eclipse,请安装 WebSphere Application Server V8.5 Liberty Profile Developer Tools

回页首

安装配置

安装 IBM HTTP 服务器及插件

本文将使用 IBM 安装管理器来在测试机 A 中安装 IBM HTTP 服务器以及插件。

  • 下载并安装 IBM Installation Manager 1.5.2 或以上版本
  • 下载添加安装路径到 IBM 安装管理器
  • 选中 IBM HTTP 服务器以及插件
图 1. 安装成功界面
图 1. 安装成功界面

安装 Liberty

Liberty 支持两种安装方式:运行 JAR 文件、使用安装管理器安装。本文将介绍如何使用运行 JAR 文件安装 Liberty 服务器。在此例中,将会在测试机 A、B 和 C 上安装 Liberty 服务器。

  1. 下载 wlp-developers-8.5.0.0.jar 文件到本地机器。
  2. 打开命令行,找到下载的 jar 文件,例如 C:\Liberty。
  3. 执行 java -jar wlp-developers-8.5.0.0.jar。
  4. 设定安装路径完成安装。
图 2. Liberty 安装界面
图 2. Liberty 安装界面

安装 WebSphere eXtreme Scale

WebSphere eXtreme Scale 支持两种安装方式:运行 JAR 文件、使用安装管理器安装。本文将介绍如何使用运行 JAR 文件安装 WebSphere eXtreme Scale 插件。在此例中,将会在测试机 A 上安装 WebSphere eXtreme Scale 插件。

  1. 下载 wxs-wlp_850.jar 文件到本地机器。
  2. 打开命令行,找到下载的 jar 文件,例如 C:\Liberty。
  3. 执行 java -jar wlp-developers-8.5.0.0.jar。
  4. 设定安装路径完成安装。
图 3. WebSphere eXtreme Scale 安装界面
图 3. WebSphere eXtreme Scale 安装界面

创建 Liberty 服务器

  1. 进入 Liberty 安装目录下的 bin 文件夹
  2. 执行服务器创建命令 server create 服务器名称(例如:Test001)

在本文中将会在测试机 A、B 和 C 上创建三个 Liberty 服务器实例,分别命名为 Test001,Test002 和 Test003.

图 4. Liberty 服务器创建界面
图 4. Liberty 服务器创建界面

在 wlp_home/usr/servers 目录下看到以服务器命名的文件夹则表示创建成功。

图 5. 服务器创建成功界面
图 5. 服务器创建成功界面

配置 Liberty 服务器

为每个 Liberty 服务器添加两个新功能(在 Liberty 中运行嵌入式 XS 服务器,使用 XS 存储 HTTP 会话)到 server.xml。添加代码如下:

清单 1. Feature 添加示例
    <!-- Enable features -->      <featureManager>          <feature>jsp-2.2</feature>          <feature>localConnector-1.0</feature>          <feature>eXtremeScale.web-1.0</feature>          <feature>eXtremeScale.server-1.0</feature>      </featureManager>

更改 server.xml 中 HTTP 默认端口,可以在 Test002 中使用 9080 端口,在 Test003 中使用 9081 端口。因为不同的服务器在不同的测试机上,此处我们使用默认端口 9080 不会产生冲突。添加代码如下:

清单 2. HTTP 端口修改示例
 <httpEndpoint host="*"                httpPort="9080"                httpsPort="9443"                id="defaultHttpEndpoint">

添加 WXS 配置文件到 Liberty 服务器,并将 Test001 作为 Catalog 服务器。Test002 和 Test003 不需要作为 Catalog 服务器,所以 <xsServer> 标签的 isCatalog 属性设定为“false”。添加代码如下:

清单 3. XS Server 配置示例
    <!-- Configuration for XS Server -->      <xsServer isCatalog="true"                listenerPort="2809"                serverName="Server1"/>      <!-- Configuration for XS HTTP Session data storage -->   <xsWebApp catalogHostPort="localhost:2809"            objectGridType="REMOTE"            replicationInterval="0"            reuseSessionId="true"            securityEnabled="true"            sessionTableSize="0"/>

在 Test001 服务器目录下创建“grids”文件夹,导入 XML 配置文件 deployment.xml 和 objectgrid.xml

deployment.xml 文件代码如下:

清单 4. deployment.xml 示例
 <?xml version="1.0" encoding="UTF-8"?>   <deploymentPolicy xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xsi:schemaLocation="http://ibm.com/ws/objectgrid/   deploymentPolicy ../deploymentPolicy.xsd" 	 xmlns="http://ibm.com/ws/objectgrid/deploymentPolicy">   <objectgridDeployment objectgridName="session">   <mapSet name="sessionMapSet"              numberOfPartitions="47"              minSyncReplicas="0"              maxSyncReplicas="0"              maxAsyncReplicas="1"              developmentMode="false"              placementStrategy="FIXED_PARTITIONS">          <map ref="objectgridSessionMetadata"/>          <map ref="objectgridSessionAttribute.*"/>          <map ref="objectgridSessionTTL.*"/>      </mapSet>   </objectgridDeployment>   </deploymentPolicy>
清单 5. objectgrid.xml 示例
 <?xml version="1.0" encoding="UTF-8"?>   <objectGridConfig xmlns:xsi="http://www.w3.org/2001/   XMLSchema-instance" xsi:schemaLocation="http://ibm.com/ws/   objectgrid/config ../objectGrid.xsd" xmlns="http://ibm.com/ws/objectgrid/config">   <objectGrids>      <objectGrid name="session" txTimeout="30">          <bean id="ObjectGridEventListener"                className="com.ibm.ws.xs.   sessionmanager.SessionHandleManager"/>          <backingMap name="objectgridSessionMetadata"                      pluginCollectionRef="objectgridSessionMetadata"                      readOnly="false"                      lockStrategy="PESSIMISTIC"                      ttlEvictorType="LAST_ACCESS_TIME"                      timeToLive="3600"                      copyMode="COPY_TO_BYTES"/>          <backingMap name="objectgridSessionAttribute.*"                      template="true"                      readOnly="false"                      lockStrategy="PESSIMISTIC"                      ttlEvictorType="NONE"                      copyMode="COPY_TO_BYTES"/>          <backingMap name="objectgridSessionTTL.*"                      template="true"                      readOnly="false"                      lockStrategy="PESSIMISTIC"                      ttlEvictorType="LAST_ACCESS_TIME"                      timeToLive="3600"                      copyMode="COPY_TO_BYTES"/>      </objectGrid>   </objectGrids>   <backingMapPluginCollections>      <backingMapPluginCollection id="objectgridSessionMetadata">   <bean id="MapEventListener"        className="com.ibm.ws.xs.sessionmanager.MetadataMapListener"/>      </backingMapPluginCollection>   </backingMapPluginCollections>   </objectGridConfig>

在三个 Liberty 服务器中添加 <httpSession> 标签,使 Liberty 的会话管理器使用相同的会话 ID,添加代码如下:

清单 6. httpSession 重用设定示例
 <! — Configuration for httpSession resuse -->   <httpSession idReuse="true"/>

Test002 和 Test003 不需要配置 XS 服务器,将设定 isCatalog 为"false", 同时 Test002 和 Test003 不需要创建“grids”文件夹。

为方便起见,在此我们将 Test001、Test002 和 Test003 导入到 Eclipse(Indigo Service Release 2)。

图 6. Liberty 服务器导入界面
图 6. Liberty 服务器导入界面

创建部署测试程序

新建 Web Project,命名为 testApp

在 WebContent 文件夹下创建 index.jsp 文件,文件代码如下:

清单 7. Index.jsp 页面代码示例
 <%@page contentType="text/html" pageEncoding="UTF-8"%>   <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">     <html>   <head>   <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">   <title> 在 Liberty 集群中共享内存网格数据 </title>   </head>   <body>   <h1> 在 Liberty 集群中共享内存网格数据测试页面 !</h1>   <%   Integer count;   Object obj_Count = session.getAttribute("COUNT");   if (obj_Count != null) {   count = (Integer) obj_Count;   count = count + 1;   } else {   count = 1;   }   session.setAttribute("COUNT", count);   %>   <h3> 计数器会在每次页面加载时加 1</h3>   <h3><font color="#FF0000"> 计数器  = <%=count%></font></h3>   <h4><font color="#FF0000"><b> 页面服务器 :   <%= System.getProperty("wlp.server.name") %></b></font></h4>   <br/>  页面生成时间 = <%=new java.util.Date().toString()%><br/>   <br/>   </body>   </html>

将 testApp 分别部署到 Test002 和 Test003,

图 7. 测试程序部署界面
图 7. 测试程序部署界面

启动 Test001 ,Test002 和 Test003 服务器

可 以使用命令行启停 Liberty 服务器。例如在 Liberty 的安装目录的 bin 文件夹下执行 server start Test001 来启动 Test001 服务器。将测试程序直接拷贝应用程序(例如 war 文件)到 dropins 目录,当 Liberty 启动的时候,就会自动扫描,然后启动文件夹内的应用程序。前提是在启动前要配置好 server.xml 中关于应用程序的相关信息,代码如下:

清单 8. 应用程序部署示例
 <application id="testApp"               location="testApp.war"               name="testApp"               type="war"/>

配置 HTTP 服务器

为 Test002 和 Test003 生成 plugin-cfg.xml 配置文件。在此使用 JAVA 的 jconsole 生成配置文件

在 JAVA 的安装目录的 bin 文件夹下运行 jconsole。

图 8. Jconsole 启动命令界面
图 8. Jconsole 启动命令界面
图 9. Jconsole 启动界面
图 9. Jconsole 启动界面

选择之前创建的 Liberty 服务器,连接

在 MBeans 标签下点击 generateDefaultPluginConfig 方法生成配置文件 .

图 10. 配置文件生成界面
图 10. 配置文件生成界面

合并 Test002 和 Test003 的 plugin-cfg.xml 配置文件。文件代码如下,其中的 IP 分别为测试机 B 和 C 的 IP。

清单 9. plugin-cfg.xml 代码示例
 <?xml version="1.0" encoding="UTF-8"?>   <!-- This config file was generated by plugin's merge tool v1.0.0.2 on 2012.10.16 at   16:03:42 CST -->   <Config ASDisableNagle="false"          AcceptAllContent="false"         AppServerPortPreference="HostHeader"          ChunkedResponse="false"         FIPSEnable="false"          IISDisableNagle="false"          IISPluginPriority="High"         IgnoreDNSFailures="false"          RefreshInterval="60"         ResponseChunkSize="64"          SSLConsolidate="false"         SSLPKCSDriver="REPLACE"          SSLPKCSPassword="REPLACE"         TrustedProxyEnable="false"          VHostMatchingCompat="false">      <Log LogLevel="Error" Name=".\logs\defaultServer\http_plugin.log"/>      <Property Name="ESIEnable" Value="true"/>      <Property Name="ESIMaxCacheSize" Value="1024"/>      <Property Name="ESIInvalidationMonitor" Value="false"/>      <Property Name="ESIEnableToPassCookies" Value="false"/>      <Property Name="PluginInstallRoot" Value="."/>      <!-- Server Clusters -->      <ServerCluster CloneSeparatorChange="false"                     GetDWLMTable="false"                    IgnoreAffinityRequests="true"                     LoadBalance="Round Robin"                    Name="Shared_2_Cluster_0"                     PostBufferSize="64"                     PostSizeLimit="-1"                    RemoveSpecialHeaders="true"                     RetryInterval="60">          <Server CloneID="Server3CloneID"             ConnectTimeout="0" ExtendedHandshake="false"             MaxConnections="-1" Name="Server3"             ServerIOTimeout="900" WaitForContinue="false">            <Transport Hostname="9.115.75.85"                       Port="9081"                       Protocol="http"/>          </Server>          <Server CloneID="Server2CloneID"                 ConnectTimeout="0"                  ExtendedHandshake="false"                 MaxConnections="-1"                  Name="Server2"                 ServerIOTimeout="900"                  WaitForContinue="false">                <Transport Hostname="9.111.97.74"                           Port="9081"                           Protocol="http"/>           </Server>           <PrimaryServers>               <Server Name="Server3"/>               <Server Name="Server2"/>           </PrimaryServers>      </ServerCluster>      <!-- Virtual Host Groups -->      <VirtualHostGroup Name="/cell/sharedCell_2/vHostGroup/shared_host_0">          <VirtualHost Name="*:443"/>          <VirtualHost Name="*:80"/>          <VirtualHost Name="*:9080"/>          <VirtualHost Name="*:9081"/>      </VirtualHostGroup>      <!-- URI Groups -->      <UriGroup Name="/cell/sharedCell_2/application/   default_host_defaultServer_default_node_Cluster_URIs">          <Uri AffinityCookie="JSESSIONID"              AffinityURLIdentifier="jsessionid"               Name="/test/*"/>      </UriGroup>      <!-- Routes -->      <Route ServerCluster="Shared_2_Cluster_0"            UriGroup="/cell/sharedCell_2/application/   default_host_defaultServer_default_node_Cluster_URIs"              VirtualHostGroup="/cell/sharedCell_2/vHostGroup/shared_host_0"/>   </Config>

将合并后的 plugin-cfg.xml 配置文件拷贝到 IBM HTTP 服务器上。

下边所示代码到 http.conf 文件使 plugin-cfg.xml 配置文件生效

清单 10. plugin-cfg.xml 生效示例
 LoadModule was_ap22_module "path\to\mod_was_ap22_http.dll"  WebSpherePluginConfig "path\to\plugin-cfg.xml"

回页首

测试

访问测试程序

启动 HTTP 服务器以及 Test001、Test002 和 Test003。在测试机 A 上打开浏览器,访问 http://localhost/testApp/ 可以看到 Test002 访问界面或者 Test003 访问界面。这依赖于 HTTP 服务器将请求发送到 Test002 还是 Test003。

图 11. Test002 访问界面
图 11. Test002 访问界面
图 12. Test003 访问界面
图 12. Test003 访问界面

以第一次访问 Test002 为例,此时如果 Test002 发生故障停机了(在此手动停掉 Test002),当再次访问 http://localhost/testApp/ 时,HTTP 服务器会将请求发送到 Test003,如图 13 所示。但此时计数器并没有还原,由于两个服务器共享内存网格数据,所以计数器在首次访问 Test003 的时候已经在 Test002 的基础上加了一。

图 13. Test003 计数器增加界面
图 13. Test003 计数器增加界面

参考资料

posted @ 2014-01-20 12:59 ZT文萃 阅读(300) | 评论 (0)编辑 收藏

这篇文章主要是参考了http://blog.csdn.net/jiangkai_nju/article/details/7338177这个博客,要看详细的内容可以参考这个博客进行学习研究,但是我觉得在以下的一些基本可以满足我们的文件传输要求了。

scp是linux中功能最强大的文件传输命令,可以实现从本地到远程以及远程到本地的轻松文件传输操作。下面简单的讲解一些关于scp命令的操作,给有用的人一些参考:

首先是本地到远程的操作:操作的格式如下

scp local_file remote_username@remote_ip:remote_folder

或者

scp local_file remote_username@remote_ip:remote_file

或者

scp local_file remote_ip:remote_folder

或者

scp local_file remote_ip:remote_file

第1,2个指定了用户名,命令执行后需要再输入密码,第1个仅指定了远程的目录,文件名字不变,第2个指定了文件名;

第3,4个没有指定用户名,命令执行后需要输入用户名和密码,第3个仅指定了远程的目录,文件名字不变,第4个指定了文件名;

* 例子:

scp /home/space/music/1.mp3 root@www.cumt.edu.cn:/home/root/others/music

scp /home/space/music/1.mp3 root@www.cumt.edu.cn:/home/root/others/music/001.mp3

scp /home/space/music/1.mp3 www.cumt.edu.cn:/home/root/others/music

scp /home/space/music/1.mp3 www.cumt.edu.cn:/home/root/others/music/001.mp3

* 复制目录:

* 命令格式:

scp -r local_folder remote_username@remote_ip:remote_folder

或者

scp -r local_folder remote_ip:remote_folder

第1个指定了用户名,命令执行后需要再输入密码;

第2个没有指定用户名,命令执行后需要输入用户名和密码;

* 例子:

scp -r /home/space/music/ root@www.cumt.edu.cn:/home/root/others/

scp -r /home/space/music/ www.cumt.edu.cn:/home/root/others/

上面 命令 将 本地 music 目录 复制 到 远程 others 目录下,即复制后有 远程 有 ../others/music

2、是实现从远程到本地的文件传输操作:

从 远程 复制到 本地,只要将 从 本地 复制到 远程 的命令 的 后2个参数 调换顺序 即可;

例如:

scp root@www.cumt.edu.cn:/home/root/others/music /home/space/music/1.mp3

scp -r www.cumt.edu.cn:/home/root/others/ /home/space/music/

最简单的应用如下 :

scp 本地用户名 @IP 地址 : 文件名 1 远程用户名 @IP 地址 : 文件名 2

[ 本地用户名 @IP 地址 :] 可以不输入 , 可能需要输入远程用户名所对应的密码 .

可能有用的几个参数 :

-v 和大多数 linux 命令中的 -v 意思一样 , 用来显示进度 . 可以用来查看连接 , 认证 , 或是配置错误 .

-C 使能压缩选项 .

-P 选择端口 . 注意 -p 已经被 rcp 使用 .

-4 强行使用 IPV4 地址 .

-6 强行使用 IPV6 地址 .

Linux scp命令的使用方法应该可以满足大家对Linux文件和目录的复制使用了。

posted @ 2014-01-20 12:57 ZT文萃 阅读(191) | 评论 (0)编辑 收藏

websphere liberty 安装 部署

websphere application server liberty  部署

 

下载地址

http://www.ibm.com/developerworks/cn/downloads/ws/wasdevelopers/

 

1.IBM WebSphere Application Server Liberty for Developers

   was.repo.8550.liberty.developers.ilan.zip  (112M)

 

2.Installation Manager 1.6.2 for Windows 64-bit ---看实际情况下载

agent.installer.win32.win32.x86_64_1.6.2000.20130301_2248.zip  (135M)

 

完成下载后,先安装 IBM Installation Manager,安装后让重启 IBM Installation Manager,点击“存储库”选择

was.repo.8550.liberty.developers.ilan.zip解压后的文件repository.config

然后就开始安装了...

 

安装好后。

启动websphere   liberty :

C:\Users\xxx>"C:\Program Files\IBM\WebSphere\Liberty\bin\server.bat" start    正在启动服务器 defaultServer。    服务器 defaultServer 已启动。

 App部署和卸载 

 myserver目录即C:\Program Files\IBM\WebSphere\Liberty\usr\servers\defaultServer\

部署和卸载行为可以在两个地方发生,一个是server.xml配置文件中,另一个是dropins目录.
(1) 在myserver目录下找到server.xml文件并打开,加入”<application id="hello-app" location="hello-app.war" name="hello-app" type="war"/>”即可完成部署,删除这句话即可完成卸载,即便myserver处于运行状态也可以这样操作,因为server.xml是 可以即时更新的,所做的修改能够马上生效。相对于tomcat这是Liberty profile的一个优势,当tomcat的server.xml内容被修改修改时必须重启才能生效。这种部署方式适用于开发阶段。
(2) 直接将war包扔进myserver目录下的dropins文件夹中即可完成部署,删除此war包机完成卸载,这种部署适用于实施阶段。
(3)访问App
在浏览器中键入http://localhost:9080/hello-app/index.jsp,页面显示hello world,说明App部署成功,运行正常。

 

参考:

http://blog.csdn.net/qiaoyupeng/article/details/7226303

posted @ 2014-01-17 14:19 ZT文萃 阅读(1412) | 评论 (0)编辑 收藏

http://www.ibm.com/developerworks/cn/websphere/library/techarticles/1207_zhuxl_liberty/1207_zhuxl_liberty.html

2012 年 6 月 15 日,IBM 正式发布了 WebSphere Application Server V8.5 版本(简称 WAS V8.5)。WebSphere Liberty Profile Server(简称 Liberty)是 WAS V8.5 中最主要的新特性,它是一个基于 OSGi 内核,高模块化,高动态性的轻量级 WebSphere 应用服务器,其安装极为简单(解压即可)、启动非常快、占用很少的磁盘和内存空间,支持 Web、mobile 和 OSGi 应用的开发,旨在提高开发人员的生产效率。

在本文中,我们将详细介绍什么是 Liberty 以及如何使用 Liberty 快速的开发和部署应用,使读者迅速的掌握这一全新的轻量级应用服务器。

0 评论:

朱 修磊, 软件工程师, IBM

2012 年 7 月 19 日

  • +内容

什么是 WebSphere Liberty Profile Server ?

Liberty 是一款全新的轻量级应用服务器,它将用户的良好开发体验作为最主要的出发点。其主要特点和内容包括:

  • 高 模块化——该功能允许用户根据自己应用程序的需求启用或者禁用相关的 feature(所谓 feature,在这里指的是运行应用程序所需要的各种资源的支持。比如,应用程序用到了 JSP,我们就需要启动 JSP 这个 feature,如果不在需要此 feature,就可以将其禁用。通过这种模块化的控制,我们可以按需启动不同的 feature,包括 JSP, Servlet, JPA 等等,这种控制是实现轻量级应用服务器的基础)。
  • 轻量级—— Liberty 采用了多种技术进行瘦身和优化(主要是 OSGi 的应用),与传统的 WAS 相比,极大的减少了运行时的内存消耗。
  • 高动态性——由于采用了 OSGi 的架构,程序员在开发的时候,可以动态修改配置文件,应用程序以及服务器的运行时信息,这些修改都是实时生效的,不需要重启服务器。
  • 快速——由于采用了高模块化的设计,Liberty 应用服务器会“按需启动”,自身消耗的系统资源很少,对执行任务的反应时间也非常短,例如,一般来说 Liberty 的启动时间小于 5 秒。
  • 配置简单——在整个开发过程中,用户只需要和一个配置文件(server.xml)打交道,而且配置的使用也非常灵活。

尽 管 Liberty 与传统 WAS 相比只是一个“小块头”,但是在 Web 和 OSGi 应用程序的开发上,Liberty 与传统 WAS 完全保持一致,在 Liberty 上开发的程序,可以直接移植到传统 WAS 上,不需要做任何的改变。相比传统 WAS 的庞大,Liberty 在为用户提供良好的开发体验上遥遥领先。

作为应用服务器,Liberty 支持与多种开发工具的结合:

  • 支持在 Rational Application Developer 中使用 Liberty,推荐在企业级应用开发中使用这种方式,因为这种方式支持最大范围的编程模型以及 Cloud。
  • 支 持在 Eclipse 3.6(Helios) 或者 3.7(Indigo) 中使用 Liberty, 需要从 Eclipse Marketplace 安装 WebSphere Application Server V8.5 Developer Tools for Eclipse 或者 WebSphere Application Server V8.5 Liberty Profile Developer Tools for Eclipse。在 Eclipse 中使用 Liberty 是完全免费的,当然,如果你需要得到 IBM 工程师的支持,则需要支付额外的费用。

同时,Liberty 服务器也支持多种主流的操作系统平台,包括 Windows、Linux、Unix、z/OS 以及 Mac OS 等。Liberty 既可以用在开发环境中,也可以用于产品环境(Mac OS 除外)。Liberty 同时支持 Oracle 和 IBM JDK,支持的最低版本分别是:Oracle Java™ 6 update 26 和 IBM Java 6.0 (J9 2.6) SR 1。

回页首

初探 WebSphere Liberty Profile Server

快速安装

在 本文中我们主要介绍 Eclipse 与 Liberty 的结合使用,在开始搭建 Liberty 的开发环境前,读者需要自行下载和安装 Oracle 或者 IBM JDK,并配置好环境变量,这是 Liberty 能正常运行的必要条件。如果是以开发为目的,那么使用 Liberty 以及 Liberty 工具是完全免费的,并且没有时间限制。

在线安装 Liberty 开发工具

打开 Eclipse,依次点击 Help > Eclipse MarketPlace,在出现的页面搜索栏里输入 websphere,并点击搜索。

图 1. 安装 Liberty 开发工具
图 1. 安装 Liberty 开发工具

在 搜索结果中会看到如上红色方框标注的工具,其中 WebSphere Application Server V8.5 Liberty Profile Developer Tools 是 WebSphere Application Server V8.5 Developer Tools 的子集,对于搭建 Liberty 开发环境,直接安装前者就可以,如果读者还需要将 Eclipse 与传统的 WAS 结合使用,那么就需要安装后一个工具。在本文中,我们直接安装 WebSphere Application Server V8.5 Liberty Profile Developer Tools。在安装过程结束后,需要重启 Eclipse。待 Eclipse 重启后,选择 Servers 视图,右击新建一个服务器,出现如下图所示,则表明 Liberty 开发工具已经成功安装

图 2. 验证 Liberty 开发工具安装成功
图 2. 验证 Liberty 开发工具安装成功

创建 Liberty 服务器

在安装好 Liberty 开发工具后,我们需要在 Eclipse 中创建 Liberty 服务器,接着图 2 所示,选择 WebSphere Application Server V8.5 Liberty Profile,点击 Next

图 3. 选择 Liberty 的安装位置
图 3. 选择 Liberty 的安装位置

在 上图中,我们需要指定 Liberty 服务器的安装位置,对于如何下载 Liberty 服务器,有两种选择:1. 访问 wasdev.net 站点,下载 Liberty 的安装文件,Liberty 安装文件只有不到 50M,下载成功后只需要解压该文件到磁盘的任何一个位置即可完成 Liberty 的安装,“解压即安装”,安装 Liberty 就是如此简单。然后,点击 Browser 选择 Liberty 的安装位置,即可继续创建 Liberty 服务器;2. 直击点击上图的 Download or install,安装提示进行操作,只需要几分钟就可以在线下载并安装一个全新的 Liberty 服务器。在这里我们需要指出的是,您也可以选择直接使用 Liberty 服务器,而不是将其与 Eclipse 搭配起来使用,直接解压下载的 Liberty 到任意目录,就可以使用了。点击 Next,因为 Liberty 默认是没有创建服务器的,所以可以得到下图

图 4. 空白的 Liberty 服务器
图 4. 空白的 Liberty 服务器

点击 New,创建你的第一个 Liberty 服务器

图 5. 创建 Liberty 服务器
图 5. 创建 Liberty 服务器

为你的 Liberty 任意指定一个名字,点击 Finish 完成创建。在 Servers 视图中,我们将看到创建好的 DemoServer。

图 6. Liberty 服务器概览
图 6. Liberty 服务器概览

从上图中我们可以看到 DemoServer 是停止状态,右键 DemoServer,选择 Start 启动 Liberty 服务器,在 Console 视图中检查 log,可以看到 Liberty 已经正常启动。

清单 1. Liberty 启动日志
 Launching DemoServer (wlp-1.0.0.20120428-1251/websphere-kernel_1.0.0)   on Java HotSpot(TM) Client VM, version 1.7.0_01-b08 (en_US)   [AUDIT   ] CWWKE0001I: The server DemoServer has been launched.   [AUDIT   ] CWWKZ0058I: Monitoring dropins for applications.   [AUDIT   ] CWWKF0011I: The server DemoServer is ready to run a smarter planet.

在上图中,双击 Server Configuration,可以看到如下配置文件(server.xml)。

清单 2. 初始的 server.xml 文件
 <server description="new server">       <!-- Enable features -->      <featureManager>          <feature>jsp-2.2</feature>      </featureManager>       <httpEndpoint id="defaultHttpEndpoint"                   host="localhost"                   httpPort="9080"                   httpsPort="9443" />    </server>

这个 server.xml 就是 Liberty 服务器中唯一的配置文件,我们在开发过程中对应用程序或者 Liberty 运行时的配置都是在这个文件中完成。在默认情况下,Liberty 已经启用了 JSP 功能,我们可以动态的根据应用的需求为 Liberty 增加各种功能支持,方法如下:

在 server.xml 编辑窗口下方,选择 Design 模式,

图 7. 图形化编辑配置文件
图 7. 图形化编辑配置文件

选择左侧 Feature Manager,然后选择右侧 Add,出现下图列表,根据需要添加相应的功能支持。

图 8. Features 列表
图 8. Features 列表

当 然,读者也可以直接手工编辑 server.xml,手动添加需要的 Feature,但是要注意遵循 Liberty 配置文件的编写规范。到此,我们已经成功的安装了 Liberty 服务器,并搭建好了 Liberty 服务器的开发环境。开始我们的例子程序之前,下文首先向读者更深层次的介绍 Liberty 的功能特性。

简化服务器配置

在 Liberty 中,和用户打交道的只有一个配置文件 server.xml。关于应用程序或者服务器运行时的所有配置都是在这一个文件中完成的,简化了服务器的配置,也减轻了程序员的负担。我们可以在 Eclipse 中直接编辑该文件,修改内容会实时生效。这个配置文件是可以被导出,也可以被不同的服务器共享。

灵活的服务器配置

图 9. 灵活配置
图 9. 灵活配置

对 于配置文件的使用是非常灵活的,例如:如果有很多个 Liberty 都需要用到同一个配置文件,那么可以将该文件单独导出,存放在一个共享的位置,单个的 Liberty 服务器可以利用 <incluse /> 属性导入共享的配置文件;又比如配置文件的内容非常多而且繁杂,我们就可以将其中的内容分别写在不同的配置文件中(称为不同的配置文件片段),同样利用 <include /> 将这些片段文件导入到主配置文件中,运行时会负责去实时的解析这些片段文件。

应用部署

在 Liberty 中部署应用也是非常简单的事情,打开你的 Liberty 安装目录 <Liberty_Install_dir>\usr\servers\server_name ,可以看到如下目录结构 :

图 10. 应用部署目录
图 10. 应用部署目录

在 上图中 apps 和 dropins 是两个存放安装的应用的文件夹,我们可以通过 Eclipse 部署应用到 Liberty,应用文件将被放在 apps 下面(这个是应用部署的默认目录,也可以通过配置,将应用文件部署到其他任何位置)。我们也可以直接拷贝应用程序(例如 war 文件)到 dropins 目录,当 Liberty 启动的时候,就会自动扫描上面的两个文件夹,然后启动文件夹内的应用程序。当然,启动应用前,要确保已经配置好 server.xml 里的相关信息。

动态加载模块

图 11. 动态化加载
图 11. 动态化加载

与 传统 WAS 不同的是,Liberty 并不是一个静态的服务器,它是动态的,可以根据应用程序的需要动态加载相应的模块。这些模块是以“feature”来定义的,比如 JSP, Servlet 等,都是不同的 feature。可以将 feature 看作是一个独立的模块,它由一到多个 OSGi bundle 组成,共同来完成某一个特定的任务。这些 feature 可是随时被添加和移除,而不需要重启服务器,正是得益于这样的动态化设计,Liberty 无论在启动时间还是反应时间上都更胜一筹,为程序员带来了快速的开发体验。

运行时动态更新

图 12. 动态更新
图 12. 动态更新

Liberty 为我们提供了一个可以动态实时更新的运行时,无论你是修改了应用程序,还是修改配置文件都会实时的被 Liberty 检测到,并立即更新运行时到最新状态,无需重启 Liberty 服务器。新的 feature 可以被随时的添加到 server.xml 中,运行时为负责实时启动相应的功能模块,这一切都与程序员来说都是透明的。例如:我们首先启动 Liberty 服务器,然后将一个 JSP 应用放到 dropins 目录里,如果你没有在 server.xml 中启动 JSP 功能,那么该应用就不会被启动。你将会得到一个警告信息,提示你应该首先启用 JSP 功能,然后该应用才会被实时的启动。同样,如果你将 JSP 功能从 server.xml 中移除,该应用也会被立刻停止。

新型的软件部署方式

图 13. 集中管理 Liberty 服务器
图 13. 集中管理 Liberty 服务器

当 我们使用 Liberty 开发完应用程序后,Liberty 为我们提供了一个全新的软件部署方式,我们可以将 Liberty 服务器和应用程序一起打包为 ZIP 文件,然后将这个 ZIP 传输到需要部署软件的服务器上直接解压即可。为了支持适合云端和大规模应用的部署,WebSpere(传统 WAS)还提供了集中管理部署的功能(需要安装 WAS ND 版本),使用该功能可以将我们事先打好的 ZIP 包远程的传输到多个服务器上,在传送完成后,WAS 还会负责解压和安装。另外,WAS 的集中管理功能还提供了远程启动、停止和卸载 Liberty 服务器的功能。

Liberty 之于开发人员

对于开发人员来说,Liberty 的出现是一个十分振奋人心的消息。首先,Liberty 作为一个轻量级的应用服务器,和 Eclipse 可以完美的结合,其最重要的特性就是关注程序员的开发体验,包括快速的下载、安装和环境搭建,在开发过程中,实时的应用更新而无需重启服务器,这些都会极 大的提高程序员的开发效率;其次,在开发,测试和部署应用的过程中,Liberty 都极其友好和方便,其与传统 WAS 的完全兼容,也为应用程序的迁移提供了有力的保障。

回页首

与主流 WEB 容器的对比

从某种程度上来讲,目前,Liberty 与 Tomcat 处在同一个产品层次上,我们从功能特性、使用体验以及标准支持上对这两个服务器进行了对比,从中,我们可以看出 Liberty 在轻量级服务器中所具有的独特优势:

表 1. Liberty VS Tomcat
对比项TomcatLiberty
大小<30M<50M
启动速度<5s<5s
Java EE 标准支持JSP 2.2, Servlet 3.0, JSTL 1.2 用户需要添加相关的 jar 包来实现对其它标准的支持JSP 2.2, Servlet 3.0, JSF 2.0, JSTL 1.2, JPA 2.0, JDBC 4.0, JAX-RS 1.0, JNDI 1.0, Bean Validation 1.0, SSL 1.0, Security 1.0, Web Security 1.0, JMX 1.0 可动态加载或卸载对应的 feature
OSGi 编程模型是,支持 Blue Print 1.0, WAB 1.0
开发工具支持 Eclipse支持 eclipse, IBM Rational Application Developer
支持的操作系统Linux, WindowsLinux, Windows, AIX, Mac, HP-UX, Solaris, iSeries, zSeries
性能一般与传统 WAS 具有相同的核心代码,性能好
应用程序热部署支持支持
配置文件多个配置文件,更新后需重启服务器一个配置文件,更新后及时生效,无需重启
可移植性您可以利用 IBM Application Migration Toolkit 将 Tomcat 上开发的应用快速移植到 WebSphere 应用服务器。反之,则不然。Liberty 和传统 WAS 对编程模型和标准的支持一致。在 Liberty 上开发的应用可以直接运行在传统 WAS 之上
文档官方文档涵盖内容有限,但网络上相关内容(包括:blog,技术文章等)广泛。http://wasdev.net 上提供下载地址、文档、视频、音频、样本引用等。还有 WAS 的信息中心也有大量文档可供参考阅读。
社区http://tomcat.apache.org 有 dev 和 user mailing list,没有官方支持,有时回复不够及时。http://wasdev.net,可以与开发人员直接交流
长期战略优势一般用于开发环境,生产环产能用的比较少。支持的并发度不高,可扩展性不强。 Liberty 与传统 WAS 共享同一代码,天生具有其高效稳定的特点。开发 - 测试 - 生产切换零代价。可扩展性高,支持多个 server 间的负载均衡和故障恢复。

回页首

Demo:使用 Eclipse 和 Liberty 开发 Web 应用

通 过上面的介绍,相信大家对 Liberty 已经有了一个大概的认识,接下来我们通过一个 Demo 来向大家展示如何使用 Liberty 和 Eclipse 开发 Web 应用。开始 Demo 之前,请大家根据上文的介绍,搭建自己的 Liberty 开发环境,并安装好 JDK 并且配置好环境变量。

Demo 程序很简单,包含一个 Servlet,实现打印当前时间的功能。步骤如下:

  1. 打开 Eclipse,选择 File > New > Web>Dynamic Web Project
  2. 设置如下属性值:
    1. Project name: Demo
    2. Target runtime: WebSphere Application Server V8.5 Liberty Profile
    图 14. 创建动态 Web 工程
    图 14. 创建动态 Web 工程
  3. 点击 Next 两次,然后点击 Finish,完成工程的创建。

    此时,你可以在左侧的资源导航页面看到刚刚创建完成的 Demo 工程,展开工程就可以看到一些默认创建的资源。

  4. 右击 Src 目录,选择 New > Class
  5. 设置如下属性值:
    1. Package: com.date.demo
    2. Name: DateProvider
    图 15. 创建 java 文件
    图 15. 创建 java 文件
  6. 点击 Finish
  7. 编辑如下代码到 DateProvider.java
    清单 3. DateProvider.java
     package com.date.demo;    import java.util.Date;    public class DateProvider {    public String getDate() {   // TODO Auto-generated method stub   return new Date().toString();   }   }

    该文件只包含一个方法,getDate() 用来获得当前时间。

  8. 右击 Src,选择 New > Servlet
  9. 设置如下属性值
    1. Java package: com.date.demo
    2. Class name: DatePrintServlet
    图 16. 创建 Servlet 文件
    图 16. 创建 Servlet 文件
  10. 点击 Finish,完成创建。
  11. 编辑如下内容到 DatePrintServlet.java
    清单 4. DatePrintServlet.java
     package com.date.demo;    import java.io.IOException;   import javax.servlet.ServletException;   import javax.servlet.annotation.WebServlet;   import javax.servlet.http.HttpServlet;   import javax.servlet.http.HttpServletRequest;   import javax.servlet.http.HttpServletResponse;    /**   * Servlet implementation class DatePrintServlet   */   @WebServlet("/DatePrintServlet")   public class DatePrintServlet extends HttpServlet {   private static final long serialVersionUID = 1L;            /**       * @see HttpServlet#HttpServlet()       */      public DatePrintServlet() {          super();          // TODO Auto-generated constructor stub      }   /**   * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)   */   protected void doGet(HttpServletRequest request, HttpServletResponse response)    throws ServletException, IOException {   // TODO Auto-generated method stub   DateProvider dateProvider=new DateProvider();   response.getWriter().println(dateProvider.getDate());   }    /**   * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)   */   protected void doPost(HttpServletRequest request, HttpServletResponse response)   throws ServletException, IOException {   // TODO Auto-generated method stub   }    }
  12. 在左侧导航栏选择 DatePrintServlet,点击右键 Run As > Run on Server , 如下图:
    图 17. 选择 Liberty 服务器
    图 17. 选择 Liberty 服务器
  13. 点击 Finish,Liberty 开发工具将会为我们部署上面的 Demo 程序,并启动 Liberty 服务器。从 console 的日志里我们可以看到如下描述:

[AUDIT ] CWWKZ0001I: Application Demo started in 1.235 seconds.

表明 Demo 应用已经成功部署了,同时,在 Eclipse 自带的浏览器里可以看到如下页面信息:

图 18. Demo 运行页面
图 18. Demo 运行页面

让我们回过头来看看 server.xml 里面的内容:

清单 5. server.xml
 <server description="new server">       <!-- Enable features -->      <featureManager>          <feature>jsp-2.2</feature>          <feature>localConnector-1.0</feature>       </featureManager>       <httpEndpoint host="localhost" httpPort="9080" httpsPort="9443"      id="defaultHttpEndpoint"/>       <applicationMonitor updateTrigger="mbean"/>       <application id="Demo" location="Demo.war" name="Demo" type="war"/>   </server>

其中:

<feature /> 包含了应用程序中所用到的功能包,如果你启用了 jsp-2.2,那么 Liberty 默认支持对 Servlet 3.0。

<httpEndpoint /> 指定了 HTTP 访问的端口,我们可以在这里改变默认的端口。

<applicationMonitor /> 用来配置对应用程序的监控模式,updateTrigger 属性是用来控制动态更新的,通过 Liberty 工具部署应用时 updateTrigger 的值设置为 mbean,当我们直接把应用程序拖进 dropins 时,需要将 updateTrigger 设为 polled,当然,如果我们不需要应用的动态更新功能,可以将这个值设为 disabled.

<application /> 用来指定和应用本身相关的属性,id 和 name 是应用的唯一标识,type 指定了应用的类型,location 指定应用所在的位置,默认是在 apps 目录里面,我们可以通过配置修改这个默认设置。

回页首

总结

通 过上面的介绍,相信读者已经对 WAS V8.5 最重要的特性 Liberty 有了一个全面的认识,作为新一代轻量级应用服务器,Liberty 采用了和传统 WAS 相同的代码,继承了传统 WAS 的优点,无论在性能上还是在稳定性上都优越于其他同类产品。Liberty 无论是在开发环境中还是在产品环境中,都具有其他产品不可比拟的优势。我们有理由相信,在追求开发效率和软件质量的今天,每一个程序员都会很快的接受这个 WAS 家族的“小块头”。

参考资料

学习

获得产品和技术

讨论

posted @ 2014-01-13 11:11 ZT文萃 阅读(944) | 评论 (0)编辑 收藏

IBM邀请我们公司试用websphere application server v8.5 liberty profile,因此经理让我下载下来安装,测试一下,正好我正对这个新东西也挺感兴趣的,所以在此把过程记录下来.

一、简介
Liberty profile是WAS V8.5的一个新特性,它代表WAS服务器上的App正常运行必须的一组运行时环境集合,这个环境是可以动态配置的。简单说Liberty profile就是WAS8.5的精简版,具有占用空间少、启动速度快、调试方便、完全支持JavaEE、App无缝移植到WAS8.5等特性,特别适合 开发测试阶段使用。


二、安装,部署


1.前提:
确保计算机上正确安装了JDK1.6或以上版本,Eclipse3.7或以上版本(可选)。
2.安装Liberty profile
将下载得到的Zip包was4d-20111202-0614.zip,解 压到磁盘任意目录下,无误后安装完毕。可以参照根目录下的readme.txt文件,掌握Liberty profile的基本配置管理。在这里假设Liberty profile的安装目录为<install.dir>。
3.创建server实例
Liberty profile继承了WAS的profile特性,即运行时环境可以以实例的形式单独动态配置,实例之间互不影响。因此,进入cmd模式下 cd bin ,然后was4d.bat create myserver,这样就创建了一个名称为myserver的运行时环境实例,其磁盘路径为<install.dir>\usr \servers\myserver,我们开发的App可以部署到myserver目录下的dropins文件夹中运行,供外界访问。
4.安装Liberty profile Eclipse开发插件
在Eclipse Marketplace中键入websphere,在随后的结果列表中找到websphere application server v8.5 liberty profile beta一项,点击install安装,完毕后重启Eclipse。
5.在Eclipse中引用myserver实例
在Eclipse 中的Server视图中右击 New-Server,在弹出框中选择IBM- websphere application server v8.5 liberty profile beta,然后根据提示选择myserver实例即可,无误完毕后会在Server视图中出现websphere application server v8.5 liberty profile beta at localhost 一项,右击websphere application server v8.5 liberty profile beta at localhost选择start,此时Console视图会出现myserver启动日志,“The feature update is complete after …”表示启动成功。
6.开发App
在Eclipse中新建一个简单的Java Web App 命名为hello-app,在其index.jsp页面中输入hello world即可。
7.App部署和卸载 
部署和卸载行为可以在两个地方发生,一个是server.xml配置文件中,另一个是dropins目录.
(1) 在 myserver目录下找到server.xml文件并打开,加入”<application id="hello-app" location="hello-app.war" name="hello-app" type="war"/>”即可完成部署,删除这句话即可完成卸载,即便myserver处于运行状态也可以这样操作,因为server.xml是 可以即时更新的,所做的修改能够马上生效。相对于tomcat这是Liberty profile的一个优势,当tomcat的server.xml内容被修改修改时必须重启才能生效。这种部署方式适用于开发阶段。
(2) 直接将war包扔进myserver目录下的dropins文件夹中即可完成部署,删除此war包机完成卸载,这种部署适用于实施阶段。
8.访问App 
在浏览器中键入http://localhost:9080/hello-app/index.jsp,页面显示hello world,说明App部署成功,运行正常。


三、Liberty,Tomcat6,was比较
Tomcat 和was的比较很简单,一个开源一个商用,开源的Tomcat小巧,灵活适合做开发测试,商用的was它提供了一个平台,你可以基于各种增值功能、使用 Process Server、MQ等等更先进而稳定的架构来构建应用.对于并发,高性能访问的处理能力会更强.
由于Liberty profile 是 was 的简易版本,所以Liberty profile只适合开发相对比较简单的App,而这个App可以无缝移植到WAS上.

Tomcat6 与 Liberty profile的比较,红色为各自的优势

Tomcat6 Liberty profile 

占用空间 27MB 56MB

启动时间 996ms 1600ms

配置复杂度 较复杂,配置文件较多 很简单,可以无配置文件

Server.xml
即时更新 不支持,需重启生效支持,即时生效

运行环境
多实例 不支持,灵活性较差支持,灵活性较高

Java EE
规范支持 不支持serverlet3.0支持serverlet3.0
支持jpa2.0 支持jpa2.0
不支持EJB 不支持EJB

四、总结
之前开发WAS应用时,如果这个App不依赖于容器,我们通常的做法是在Tomcat中开发测试,在WAS中部署运行,而部署时App的配置文件必定要做相应的修改,比如JNDI。
现在不用了,我们有了Liberty profile----WAS的一组运行时环境,它与Tomcat一样免费,轻巧,快速,灵活,而且开发的应用不做任何修改就能移植到WAS上。
相对于与Tomcat6,Liberty profile支持最新的JavaEE规范,增加了很多功能更加强大,使用非常方便的特性,所以Liberty profile比Tomcat更优秀,即便App不是基于WAS也可以使用Liberty profile进行开发测试。

posted @ 2014-01-10 18:36 ZT文萃 阅读(1667) | 评论 (1)编辑 收藏

http://www.ibm.com/developerworks/cn/websphere/library/techarticles/1207_zhuxl_liberty/1207_zhuxl_liberty.html

2012 年 6 月 15 日,IBM 正式发布了 WebSphere Application Server V8.5 版本(简称 WAS V8.5)。WebSphere Liberty Profile Server(简称 Liberty)是 WAS V8.5 中最主要的新特性,它是一个基于 OSGi 内核,高模块化,高动态性的轻量级 WebSphere 应用服务器,其安装极为简单(解压即可)、启动非常快、占用很少的磁盘和内存空间,支持 Web、mobile 和 OSGi 应用的开发,旨在提高开发人员的生产效率。

在本文中,我们将详细介绍什么是 Liberty 以及如何使用 Liberty 快速的开发和部署应用,使读者迅速的掌握这一全新的轻量级应用服务器。

0 评论:

朱 修磊, 软件工程师, IBM

2012 年 7 月 19 日

  • +内容

什么是 WebSphere Liberty Profile Server ?

Liberty 是一款全新的轻量级应用服务器,它将用户的良好开发体验作为最主要的出发点。其主要特点和内容包括:

  • 高 模块化——该功能允许用户根据自己应用程序的需求启用或者禁用相关的 feature(所谓 feature,在这里指的是运行应用程序所需要的各种资源的支持。比如,应用程序用到了 JSP,我们就需要启动 JSP 这个 feature,如果不在需要此 feature,就可以将其禁用。通过这种模块化的控制,我们可以按需启动不同的 feature,包括 JSP, Servlet, JPA 等等,这种控制是实现轻量级应用服务器的基础)。
  • 轻量级—— Liberty 采用了多种技术进行瘦身和优化(主要是 OSGi 的应用),与传统的 WAS 相比,极大的减少了运行时的内存消耗。
  • 高动态性——由于采用了 OSGi 的架构,程序员在开发的时候,可以动态修改配置文件,应用程序以及服务器的运行时信息,这些修改都是实时生效的,不需要重启服务器。
  • 快速——由于采用了高模块化的设计,Liberty 应用服务器会“按需启动”,自身消耗的系统资源很少,对执行任务的反应时间也非常短,例如,一般来说 Liberty 的启动时间小于 5 秒。
  • 配置简单——在整个开发过程中,用户只需要和一个配置文件(server.xml)打交道,而且配置的使用也非常灵活。

尽 管 Liberty 与传统 WAS 相比只是一个“小块头”,但是在 Web 和 OSGi 应用程序的开发上,Liberty 与传统 WAS 完全保持一致,在 Liberty 上开发的程序,可以直接移植到传统 WAS 上,不需要做任何的改变。相比传统 WAS 的庞大,Liberty 在为用户提供良好的开发体验上遥遥领先。

作为应用服务器,Liberty 支持与多种开发工具的结合:

  • 支持在 Rational Application Developer 中使用 Liberty,推荐在企业级应用开发中使用这种方式,因为这种方式支持最大范围的编程模型以及 Cloud。
  • 支 持在 Eclipse 3.6(Helios) 或者 3.7(Indigo) 中使用 Liberty, 需要从 Eclipse Marketplace 安装 WebSphere Application Server V8.5 Developer Tools for Eclipse 或者 WebSphere Application Server V8.5 Liberty Profile Developer Tools for Eclipse。在 Eclipse 中使用 Liberty 是完全免费的,当然,如果你需要得到 IBM 工程师的支持,则需要支付额外的费用。

同时,Liberty 服务器也支持多种主流的操作系统平台,包括 Windows、Linux、Unix、z/OS 以及 Mac OS 等。Liberty 既可以用在开发环境中,也可以用于产品环境(Mac OS 除外)。Liberty 同时支持 Oracle 和 IBM JDK,支持的最低版本分别是:Oracle Java™ 6 update 26 和 IBM Java 6.0 (J9 2.6) SR 1。

回页首

初探 WebSphere Liberty Profile Server

快速安装

在 本文中我们主要介绍 Eclipse 与 Liberty 的结合使用,在开始搭建 Liberty 的开发环境前,读者需要自行下载和安装 Oracle 或者 IBM JDK,并配置好环境变量,这是 Liberty 能正常运行的必要条件。如果是以开发为目的,那么使用 Liberty 以及 Liberty 工具是完全免费的,并且没有时间限制。

在线安装 Liberty 开发工具

打开 Eclipse,依次点击 Help > Eclipse MarketPlace,在出现的页面搜索栏里输入 websphere,并点击搜索。

图 1. 安装 Liberty 开发工具
图 1. 安装 Liberty 开发工具

在 搜索结果中会看到如上红色方框标注的工具,其中 WebSphere Application Server V8.5 Liberty Profile Developer Tools 是 WebSphere Application Server V8.5 Developer Tools 的子集,对于搭建 Liberty 开发环境,直接安装前者就可以,如果读者还需要将 Eclipse 与传统的 WAS 结合使用,那么就需要安装后一个工具。在本文中,我们直接安装 WebSphere Application Server V8.5 Liberty Profile Developer Tools。在安装过程结束后,需要重启 Eclipse。待 Eclipse 重启后,选择 Servers 视图,右击新建一个服务器,出现如下图所示,则表明 Liberty 开发工具已经成功安装

图 2. 验证 Liberty 开发工具安装成功
图 2. 验证 Liberty 开发工具安装成功

创建 Liberty 服务器

在安装好 Liberty 开发工具后,我们需要在 Eclipse 中创建 Liberty 服务器,接着图 2 所示,选择 WebSphere Application Server V8.5 Liberty Profile,点击 Next

图 3. 选择 Liberty 的安装位置
图 3. 选择 Liberty 的安装位置

在 上图中,我们需要指定 Liberty 服务器的安装位置,对于如何下载 Liberty 服务器,有两种选择:1. 访问 wasdev.net 站点,下载 Liberty 的安装文件,Liberty 安装文件只有不到 50M,下载成功后只需要解压该文件到磁盘的任何一个位置即可完成 Liberty 的安装,“解压即安装”,安装 Liberty 就是如此简单。然后,点击 Browser 选择 Liberty 的安装位置,即可继续创建 Liberty 服务器;2. 直击点击上图的 Download or install,安装提示进行操作,只需要几分钟就可以在线下载并安装一个全新的 Liberty 服务器。在这里我们需要指出的是,您也可以选择直接使用 Liberty 服务器,而不是将其与 Eclipse 搭配起来使用,直接解压下载的 Liberty 到任意目录,就可以使用了。点击 Next,因为 Liberty 默认是没有创建服务器的,所以可以得到下图

图 4. 空白的 Liberty 服务器
图 4. 空白的 Liberty 服务器

点击 New,创建你的第一个 Liberty 服务器

图 5. 创建 Liberty 服务器
图 5. 创建 Liberty 服务器

为你的 Liberty 任意指定一个名字,点击 Finish 完成创建。在 Servers 视图中,我们将看到创建好的 DemoServer。

图 6. Liberty 服务器概览
图 6. Liberty 服务器概览

从上图中我们可以看到 DemoServer 是停止状态,右键 DemoServer,选择 Start 启动 Liberty 服务器,在 Console 视图中检查 log,可以看到 Liberty 已经正常启动。

清单 1. Liberty 启动日志
 Launching DemoServer (wlp-1.0.0.20120428-1251/websphere-kernel_1.0.0)   on Java HotSpot(TM) Client VM, version 1.7.0_01-b08 (en_US)   [AUDIT   ] CWWKE0001I: The server DemoServer has been launched.   [AUDIT   ] CWWKZ0058I: Monitoring dropins for applications.   [AUDIT   ] CWWKF0011I: The server DemoServer is ready to run a smarter planet.

在上图中,双击 Server Configuration,可以看到如下配置文件(server.xml)。

清单 2. 初始的 server.xml 文件
 <server description="new server">       <!-- Enable features -->      <featureManager>          <feature>jsp-2.2</feature>      </featureManager>       <httpEndpoint id="defaultHttpEndpoint"                   host="localhost"                   httpPort="9080"                   httpsPort="9443" />    </server>

这个 server.xml 就是 Liberty 服务器中唯一的配置文件,我们在开发过程中对应用程序或者 Liberty 运行时的配置都是在这个文件中完成。在默认情况下,Liberty 已经启用了 JSP 功能,我们可以动态的根据应用的需求为 Liberty 增加各种功能支持,方法如下:

在 server.xml 编辑窗口下方,选择 Design 模式,

图 7. 图形化编辑配置文件
图 7. 图形化编辑配置文件

选择左侧 Feature Manager,然后选择右侧 Add,出现下图列表,根据需要添加相应的功能支持。

图 8. Features 列表
图 8. Features 列表

当 然,读者也可以直接手工编辑 server.xml,手动添加需要的 Feature,但是要注意遵循 Liberty 配置文件的编写规范。到此,我们已经成功的安装了 Liberty 服务器,并搭建好了 Liberty 服务器的开发环境。开始我们的例子程序之前,下文首先向读者更深层次的介绍 Liberty 的功能特性。

简化服务器配置

在 Liberty 中,和用户打交道的只有一个配置文件 server.xml。关于应用程序或者服务器运行时的所有配置都是在这一个文件中完成的,简化了服务器的配置,也减轻了程序员的负担。我们可以在 Eclipse 中直接编辑该文件,修改内容会实时生效。这个配置文件是可以被导出,也可以被不同的服务器共享。

灵活的服务器配置

图 9. 灵活配置
图 9. 灵活配置

对 于配置文件的使用是非常灵活的,例如:如果有很多个 Liberty 都需要用到同一个配置文件,那么可以将该文件单独导出,存放在一个共享的位置,单个的 Liberty 服务器可以利用 <incluse /> 属性导入共享的配置文件;又比如配置文件的内容非常多而且繁杂,我们就可以将其中的内容分别写在不同的配置文件中(称为不同的配置文件片段),同样利用 <include /> 将这些片段文件导入到主配置文件中,运行时会负责去实时的解析这些片段文件。

应用部署

在 Liberty 中部署应用也是非常简单的事情,打开你的 Liberty 安装目录 <Liberty_Install_dir>\usr\servers\server_name ,可以看到如下目录结构 :

图 10. 应用部署目录
图 10. 应用部署目录

在 上图中 apps 和 dropins 是两个存放安装的应用的文件夹,我们可以通过 Eclipse 部署应用到 Liberty,应用文件将被放在 apps 下面(这个是应用部署的默认目录,也可以通过配置,将应用文件部署到其他任何位置)。我们也可以直接拷贝应用程序(例如 war 文件)到 dropins 目录,当 Liberty 启动的时候,就会自动扫描上面的两个文件夹,然后启动文件夹内的应用程序。当然,启动应用前,要确保已经配置好 server.xml 里的相关信息。

动态加载模块

图 11. 动态化加载
图 11. 动态化加载

与 传统 WAS 不同的是,Liberty 并不是一个静态的服务器,它是动态的,可以根据应用程序的需要动态加载相应的模块。这些模块是以“feature”来定义的,比如 JSP, Servlet 等,都是不同的 feature。可以将 feature 看作是一个独立的模块,它由一到多个 OSGi bundle 组成,共同来完成某一个特定的任务。这些 feature 可是随时被添加和移除,而不需要重启服务器,正是得益于这样的动态化设计,Liberty 无论在启动时间还是反应时间上都更胜一筹,为程序员带来了快速的开发体验。

运行时动态更新

图 12. 动态更新
图 12. 动态更新

Liberty 为我们提供了一个可以动态实时更新的运行时,无论你是修改了应用程序,还是修改配置文件都会实时的被 Liberty 检测到,并立即更新运行时到最新状态,无需重启 Liberty 服务器。新的 feature 可以被随时的添加到 server.xml 中,运行时为负责实时启动相应的功能模块,这一切都与程序员来说都是透明的。例如:我们首先启动 Liberty 服务器,然后将一个 JSP 应用放到 dropins 目录里,如果你没有在 server.xml 中启动 JSP 功能,那么该应用就不会被启动。你将会得到一个警告信息,提示你应该首先启用 JSP 功能,然后该应用才会被实时的启动。同样,如果你将 JSP 功能从 server.xml 中移除,该应用也会被立刻停止。

新型的软件部署方式

图 13. 集中管理 Liberty 服务器
图 13. 集中管理 Liberty 服务器

当 我们使用 Liberty 开发完应用程序后,Liberty 为我们提供了一个全新的软件部署方式,我们可以将 Liberty 服务器和应用程序一起打包为 ZIP 文件,然后将这个 ZIP 传输到需要部署软件的服务器上直接解压即可。为了支持适合云端和大规模应用的部署,WebSpere(传统 WAS)还提供了集中管理部署的功能(需要安装 WAS ND 版本),使用该功能可以将我们事先打好的 ZIP 包远程的传输到多个服务器上,在传送完成后,WAS 还会负责解压和安装。另外,WAS 的集中管理功能还提供了远程启动、停止和卸载 Liberty 服务器的功能。

Liberty 之于开发人员

对于开发人员来说,Liberty 的出现是一个十分振奋人心的消息。首先,Liberty 作为一个轻量级的应用服务器,和 Eclipse 可以完美的结合,其最重要的特性就是关注程序员的开发体验,包括快速的下载、安装和环境搭建,在开发过程中,实时的应用更新而无需重启服务器,这些都会极 大的提高程序员的开发效率;其次,在开发,测试和部署应用的过程中,Liberty 都极其友好和方便,其与传统 WAS 的完全兼容,也为应用程序的迁移提供了有力的保障。

回页首

与主流 WEB 容器的对比

从某种程度上来讲,目前,Liberty 与 Tomcat 处在同一个产品层次上,我们从功能特性、使用体验以及标准支持上对这两个服务器进行了对比,从中,我们可以看出 Liberty 在轻量级服务器中所具有的独特优势:

表 1. Liberty VS Tomcat
对比项TomcatLiberty
大小<30M<50M
启动速度<5s<5s
Java EE 标准支持JSP 2.2, Servlet 3.0, JSTL 1.2 用户需要添加相关的 jar 包来实现对其它标准的支持JSP 2.2, Servlet 3.0, JSF 2.0, JSTL 1.2, JPA 2.0, JDBC 4.0, JAX-RS 1.0, JNDI 1.0, Bean Validation 1.0, SSL 1.0, Security 1.0, Web Security 1.0, JMX 1.0 可动态加载或卸载对应的 feature
OSGi 编程模型是,支持 Blue Print 1.0, WAB 1.0
开发工具支持 Eclipse支持 eclipse, IBM Rational Application Developer
支持的操作系统Linux, WindowsLinux, Windows, AIX, Mac, HP-UX, Solaris, iSeries, zSeries
性能一般与传统 WAS 具有相同的核心代码,性能好
应用程序热部署支持支持
配置文件多个配置文件,更新后需重启服务器一个配置文件,更新后及时生效,无需重启
可移植性您可以利用 IBM Application Migration Toolkit 将 Tomcat 上开发的应用快速移植到 WebSphere 应用服务器。反之,则不然。Liberty 和传统 WAS 对编程模型和标准的支持一致。在 Liberty 上开发的应用可以直接运行在传统 WAS 之上
文档官方文档涵盖内容有限,但网络上相关内容(包括:blog,技术文章等)广泛。http://wasdev.net 上提供下载地址、文档、视频、音频、样本引用等。还有 WAS 的信息中心也有大量文档可供参考阅读。
社区http://tomcat.apache.org 有 dev 和 user mailing list,没有官方支持,有时回复不够及时。http://wasdev.net,可以与开发人员直接交流
长期战略优势一般用于开发环境,生产环产能用的比较少。支持的并发度不高,可扩展性不强。 Liberty 与传统 WAS 共享同一代码,天生具有其高效稳定的特点。开发 - 测试 - 生产切换零代价。可扩展性高,支持多个 server 间的负载均衡和故障恢复。

回页首

Demo:使用 Eclipse 和 Liberty 开发 Web 应用

通 过上面的介绍,相信大家对 Liberty 已经有了一个大概的认识,接下来我们通过一个 Demo 来向大家展示如何使用 Liberty 和 Eclipse 开发 Web 应用。开始 Demo 之前,请大家根据上文的介绍,搭建自己的 Liberty 开发环境,并安装好 JDK 并且配置好环境变量。

Demo 程序很简单,包含一个 Servlet,实现打印当前时间的功能。步骤如下:

  1. 打开 Eclipse,选择 File > New > Web>Dynamic Web Project
  2. 设置如下属性值:
    1. Project name: Demo
    2. Target runtime: WebSphere Application Server V8.5 Liberty Profile
    图 14. 创建动态 Web 工程
    图 14. 创建动态 Web 工程
  3. 点击 Next 两次,然后点击 Finish,完成工程的创建。

    此时,你可以在左侧的资源导航页面看到刚刚创建完成的 Demo 工程,展开工程就可以看到一些默认创建的资源。

  4. 右击 Src 目录,选择 New > Class
  5. 设置如下属性值:
    1. Package: com.date.demo
    2. Name: DateProvider
    图 15. 创建 java 文件
    图 15. 创建 java 文件
  6. 点击 Finish
  7. 编辑如下代码到 DateProvider.java
    清单 3. DateProvider.java
     package com.date.demo;    import java.util.Date;    public class DateProvider {    public String getDate() {   // TODO Auto-generated method stub   return new Date().toString();   }   }

    该文件只包含一个方法,getDate() 用来获得当前时间。

  8. 右击 Src,选择 New > Servlet
  9. 设置如下属性值
    1. Java package: com.date.demo
    2. Class name: DatePrintServlet
    图 16. 创建 Servlet 文件
    图 16. 创建 Servlet 文件
  10. 点击 Finish,完成创建。
  11. 编辑如下内容到 DatePrintServlet.java
    清单 4. DatePrintServlet.java
     package com.date.demo;    import java.io.IOException;   import javax.servlet.ServletException;   import javax.servlet.annotation.WebServlet;   import javax.servlet.http.HttpServlet;   import javax.servlet.http.HttpServletRequest;   import javax.servlet.http.HttpServletResponse;    /**   * Servlet implementation class DatePrintServlet   */   @WebServlet("/DatePrintServlet")   public class DatePrintServlet extends HttpServlet {   private static final long serialVersionUID = 1L;            /**       * @see HttpServlet#HttpServlet()       */      public DatePrintServlet() {          super();          // TODO Auto-generated constructor stub      }   /**   * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)   */   protected void doGet(HttpServletRequest request, HttpServletResponse response)    throws ServletException, IOException {   // TODO Auto-generated method stub   DateProvider dateProvider=new DateProvider();   response.getWriter().println(dateProvider.getDate());   }    /**   * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)   */   protected void doPost(HttpServletRequest request, HttpServletResponse response)   throws ServletException, IOException {   // TODO Auto-generated method stub   }    }
  12. 在左侧导航栏选择 DatePrintServlet,点击右键 Run As > Run on Server , 如下图:
    图 17. 选择 Liberty 服务器
    图 17. 选择 Liberty 服务器
  13. 点击 Finish,Liberty 开发工具将会为我们部署上面的 Demo 程序,并启动 Liberty 服务器。从 console 的日志里我们可以看到如下描述:

[AUDIT ] CWWKZ0001I: Application Demo started in 1.235 seconds.

表明 Demo 应用已经成功部署了,同时,在 Eclipse 自带的浏览器里可以看到如下页面信息:

图 18. Demo 运行页面
图 18. Demo 运行页面

让我们回过头来看看 server.xml 里面的内容:

清单 5. server.xml
 <server description="new server">       <!-- Enable features -->      <featureManager>          <feature>jsp-2.2</feature>          <feature>localConnector-1.0</feature>       </featureManager>       <httpEndpoint host="localhost" httpPort="9080" httpsPort="9443"      id="defaultHttpEndpoint"/>       <applicationMonitor updateTrigger="mbean"/>       <application id="Demo" location="Demo.war" name="Demo" type="war"/>   </server>

其中:

<feature /> 包含了应用程序中所用到的功能包,如果你启用了 jsp-2.2,那么 Liberty 默认支持对 Servlet 3.0。

<httpEndpoint /> 指定了 HTTP 访问的端口,我们可以在这里改变默认的端口。

<applicationMonitor /> 用来配置对应用程序的监控模式,updateTrigger 属性是用来控制动态更新的,通过 Liberty 工具部署应用时 updateTrigger 的值设置为 mbean,当我们直接把应用程序拖进 dropins 时,需要将 updateTrigger 设为 polled,当然,如果我们不需要应用的动态更新功能,可以将这个值设为 disabled.

<application /> 用来指定和应用本身相关的属性,id 和 name 是应用的唯一标识,type 指定了应用的类型,location 指定应用所在的位置,默认是在 apps 目录里面,我们可以通过配置修改这个默认设置。

回页首

总结

通 过上面的介绍,相信读者已经对 WAS V8.5 最重要的特性 Liberty 有了一个全面的认识,作为新一代轻量级应用服务器,Liberty 采用了和传统 WAS 相同的代码,继承了传统 WAS 的优点,无论在性能上还是在稳定性上都优越于其他同类产品。Liberty 无论是在开发环境中还是在产品环境中,都具有其他产品不可比拟的优势。我们有理由相信,在追求开发效率和软件质量的今天,每一个程序员都会很快的接受这个 WAS 家族的“小块头”。

参考资料

学习

获得产品和技术

posted @ 2014-01-10 18:31 ZT文萃 阅读(280) | 评论 (0)编辑 收藏

每逢春运,铁路系统唯一的官方购票网站12306就会成为众矢之的,今年也不例外。今年12306并未出现大面积 崩溃问题,但这并不妨碍它再次被淹没在一片埋怨声中。1月5日,有网友在问答网站“知乎”上提问,如果把12306外包给IBM或者阿里巴巴来做的话,能 不能比现在做得好?我们来看看获得5千余名网友“点赞”的知乎用户王强的解答吧。


官方订票网站12306崩溃时的页面(资料图)
以下是王强的回复(有删节):

12306首秀被骂的狗血喷头后铁道部找来IBM、阿里巴巴等大企业要解决方案,给出的条件是资金管够但是问题得解决。几大企业最后都拒绝了。
12306 开始自己尝试解决问题。他们发现市面上可以买到的成套解决方案都不足以应付春运购票负载,所以只能自己改进已有的数据库以前12306用的是小型机,发现 性能严重不足,遂改用x86系统+linux平台(原平台为HP Superdome小型机,UNIX系统,Sybase ASE数据库)。最后他们的核心系统用了十几个节点(现在应该是17节点)的多路Xeon E7(具体几路待考),每个节点配1TB内存,数据库全部在内存中运行。2013年春运,12306系统峰值负载11万tps,与2012年淘宝双11活 动峰值负载相当,新的系统基本经受住了考验。

补充:以上内容是我在2013年7月得知的信息,彼时没有任何公开来源提到过12306新系 统的技术细节。甚至,当时局外人没人知道12306已经在2012年开始做了技术改造。直到数日之前,铁总首次向媒体公开了技术改造的详情:分布式集群内 存数据技术引领12306技术革命。这篇文章给出的细节,与我之前看到的内容完全一致。由此我可以确信信息来源是此次技术升级的核心人士。

另 外,关于第三方合作对方给出的信息是IBM、Oracle、Sybase全部不能满足要求,主要是这些厂商的方案部署以后,要升级时不能做到不停机灵活扩 展。也就是说,IBM没有做到是他们技术不足“搞不定”。阿里巴巴参与了改造,负责了排队系统。此外,虽然后端经受住了压力,前端却如大家所看到的那样还 是频频卡死。到底卡死的原因是前端水平太低还是访问压力太大,暂时没有可靠的信息供判断。

淘宝的问题是其系统架构是分散度较高的,各个订 单之间关联度不大;而12306每出一张票都要对全线路做数据更新(因为一条线路存在多个站点),因此系统负载相较淘宝来说集中很多,直接搬淘宝的方案也 无法解决问题。淘宝的应用类型决定了阿里巴巴可以通过部署大量的服务器来分散压力,但12306就不行。其实他们的核心系统的硬件成本不过数百万,不是他 们不想采购更多服务器,而是买更多的服务器也没什么用途。最后,在经过软件层面的优化之后,12306的瓶颈其实是核心节点的CPU、内存性能。但是这个 性能的提升不是朝夕的事情,而是受限于摩尔定律,基本上每两年才能翻一倍多些。(这段话是我自己的分析,不过现在12306的后端数据库系统应付现有需求 已经够用了)
补充:关于座位实时复用,我看到的信息明确表明12306出票时,每出一张区间票都要实时调整该线路其他受影响区间段的余票数量,且这是很大的压力来源;另外,对方表示所使用的GemFire数据库与简单的memcache/redis数据缓冲不同,有着本质区别。

然后我说点对铁路系统购票困难现象的看法:
一种商品只要出现供不应求现象,那么结果只有两种:大家排队购买;出现黑市,变相提高商品的流通价格并抑制需求。
12306 这个事情,就是标准的限价商品供不应求之后出现排队与黑市现象的例子。因为供不应求,所以有了黄牛、抢票软件与秒杀。如果供应充足,一个车次直到发车前都 有一两张余票,那么黄牛、抢票就毫无存在价值,旅客也用不着守在电脑前和其他人比拼手速和网速以及电脑性能网络性能了。
现在供应不足的前提 下,12306就算把系统做的性能再高,也只是会加快热门车次票务秒杀的速度而已——而这更会刺激抢票软件,大家为了在更短的时间里成功抢到队列名额就会 不断提升自己的抢票性能。打个比方说就是一个店门前排队,消费者为了增加买到商品的概率去雇人代排,每个消费者都雇了好多人,造成店门口的通道拥挤不堪。 为了减缓拥堵,商家不断拓宽通道,但每次一拓宽消费者们就会增加雇佣的排队劳力把新增的通道空间占满,形成恶性循环。这样下去,只要还存在供不应求的现 象,这种循环就不会有终止的时候。也就是说,12306的问题主要不是出在网站本身。

12306这个事情,网上有多少网友从一开始就献计 献策了,也有不少网友提供了很不错的建议。但不得不说,很多网友在提建议时完全就是一种居高临下、自以为是的态度,上来就先认定需求简单可以轻松应付,随 便有点经验的工程师就能搞定,12306出问题全怪体制太烂,国企效率低下,一帮人光拿钱不做事,技术水平太低……

淘宝2013年双11 活动,峰值流量是一秒钟完成1.3万笔订单。12306在2014年1月6日全天网络出票400万张。看起来双11流量完爆12306是吧?等等!别忘了 12306这400万张票可不是全天悠悠闲闲平均地卖出去的,而是分成10个时段集中被抢走的。每个时段开始放票后数分钟之内大部分票就已经被抢光了。以 每个时段40万票,峰值持续三分钟估算,高峰期一分钟出票在10万张以上毫不夸张。诚然,一分钟10万订单还比不上淘宝2013双11,但别忘了一年以前 阿里巴巴也只是达到了一分钟15万订单的水平而已(并且在高峰期一样卡爆)。而且一分钟10万出票还满足不了需求的,以旅客购票的热情来看,达到一分钟 50万票都不一定能让所有旅客满意。

淘宝在2012年双11时已经是业界顶尖水平了,其软硬件技术皆为自主研发,既便如此面对一分钟十几 万的订单量都会卡死。请问,觉得12306“需求简单,问题可以轻松解决”的,是不是水平已经高到了阿里巴巴都要请你们去领导整个技术团队的级别呢?是不 是你们的方案可以轻松应付每分钟数十万笔订单,达到全球一流水平了?

淘宝面临的需求是业界从未有过的,所以淘宝的路很艰难。12306面 临的需求是其他人遇到过的么?全世界哪个国家、哪种客运票务系统敢说自己的负载达到12306三分之一的水平?面对空前庞大的压力,诸位“技术高手”只是 凭着自己一点程序员的经验,在电脑前一个人思考上一会儿就给出个“简单、实用、省钱、轻松应付”的解决方案——你们知不知道“自大”这两个字怎么写啊?

还 有一些人,看说IBM没做就一口认定是12306故意排挤IBM,认定IBM解决这问题肯定没压力。好嘛,IBM什么时候做过如此规模的票务系统了?你细 节什么都不知就预设结论了?为啥淘宝当年没选择IBM作为方案提供商而是自主研发?IBM的大数据业务主要集中在金融领域,这不代表它在其他领域就样样精 通好不好?它能拿出的方案无非是Power7小型机平台,Power7在数据库性能上又比Xeon E7强多点?然后Power7系统卖多少钱了解么?后续维护难度多大了解么?把适合银行金融行业的平台放到12306来真的合适么?说起来,不就是因为 “12306”和“IBM”这俩名字放一起,诸位内心里首先就给前者打了负分对后者仰视么?要是把“12306”换成“nasdaq”,那结论就又是一回 事儿了——哦正好nasdaq没用IBM方案,可见nasdaq是排挤IBM内部人赚黑心钱是吧?不过2013年工商银行系统升级故障,应该是和方案提供 商IBM无关的,肯定是国企的体制问题无误!

最后呢?12306还是做到了全球最强的客运票务系统。一贯被认为是因循守旧的国企,在选择 技术方案时放弃沿用多年的小型机/UNIX平台去拥抱业界还是新鲜事物的基于x86/linux的大规模分布内存数据库系统,承受住了堪比2012年淘宝 双11的压力。在这个领域,12306可以自豪地说自己是做的最好的案例。它还在卡,还是偶尔崩溃,页面还是难看,可是这些迟早会改进。这个过程中也还是 会有冷嘲热讽,还是会有所谓的大牛指点江山,但最终解决春运高峰期一天数百万张秒杀售票的,还是12306自己。所以,走自己的路,让别人去说吧。

原文链接:12306 外包给阿里巴巴、IBM 等大企业做是否可行

posted @ 2014-01-10 12:07 ZT文萃 阅读(168) | 评论 (0)编辑 收藏

WebSphere Application Server V8.5 的最重要的新特性是新的 Liberty Profile 以及智能管理。本 FAQ 为您汇集了关于 WAS V8.5 的问题集锦,从智能管理、 Liberty Profile、性能等方面帮助您解答您使用过程中可能遇到的问题。

Liberty 和 tWAS是两个产品吗?目前 tWAS和 Liberty 所支持的功能有什么不同?

Liberty 作为 WAS V8.5 发布的一部分,和 tWAS 作为两个单独的介质供用户使用。在功能上 Liberty 是 tWAS 的一个子集。tWAS 是一个完整的 J2EE 服务器,支持 J2EE 规范,而 liberty 目前只支持 Web, OSGi 和 Mobile 应用的开发。

Liberty 是如何提供给用户的?是以插件的形式吗?

Liberty 是以一个单独的运行时环境提供给用户的。用户下载 Liberty 的安装介质后解压缩即可作为运行时环境部署应用。同时 Liberty 可以很好的跟开发工具如 Eclipse、RAD 等结合使用,有很好的开发者体验。

Liberty 有哪些优点?

  1. 简单安装(可以通过 IM 进行安装,或者直接下载免安装版本)
  2. 快速启动
  3. 灵活的配置(只需要在 server.xml 文件里面进行配置即可)
  4. 实时更新(采用 OSGi 架构,server 不需重启,更改即可生效)
  5. 动态加载,Liberty 对所支持的功能特性实施动态加载的机制,即当使用某些特性的时候才将该特性相关的类加载的运行时当中。

Liberty 是否支持文件夹形式的 bundle 应用?

Liberty 目前不支持文件夹形式的 bundle 应用,但是支持将 EBA 格式的 OSGi 应用解压安装,应用名称的格式应为 xxx.eba。

Liberty 采用动态加载的方式,那么当新添加特性时,Liberty 服务器是否会重启?

当添加新的功能特性时,功能特性动态生效,Liberty 服务器不会被自动重启。

在 Liberty 上开发的应用能直接迁移到 tWAS 上进行使用吗?需要做什么修改吗?

用 Liberty 开发的应用可以无缝地迁移到 tWAS 上面,不需要对应用进行修改,只需要在 tWAS 对数据源等应用所需要的资源做相应的设置即可。

Liberty 上部署应用有两种方式,即 Monitored Directory 和 Configuration,两种方式有什么不同?

通过 Monitored Directory 的方式,用户只需把应用放在特定目录下面,Liberty 会自动去检查到该应用,然后自动帮助用户进行安装。

而通过 Configuration 的方式,Liberty 不会自动去进行安装,用户需要手动去进行安装,比如通过命令行或者 Eclipse 开发平台。

相比较与 Tomcat,开发者选择 Liberty 的原因将会是什么? Liberty 会带来哪些新体验 ?

内容
对比项TomcatLiberty
Java EE 标准支持JSP 2.2, Servlet 3.0, JSTL 1.2
用户需要添加相关的 jar 包来实现对其它标准的支持
JSP 2.2, Servlet 3.0, JSF 2.0, JSTL 1.2, JPA 2.0, JDBC 4.0, JAX-RS 1.0, JNDI 1.0, Bean Validation 1.0, SSL 1.0, Security 1.0, Web Security 1.0, JMX 1.0
可动态加载或卸载对应的特性包
OSGi 编程模型支持是,支持 Blue Print 1.0, WAB 1.0
开发工具支持 Eclipse支持 Eclipse, IBM Rational Application Developer
性能一般与传统 WAS 具有相同的核心代码,性能好
支持的操作系统Linux, WindowsLinux, Windows, AIX, Mac, HP-UX, Solaris, iSeries, zSeries
配置文件多个配置文件,更新后需重启服务器一个配置文件,更新后及时生效,无需重启
可移植性您可以利用 IBM Application Migration Toolkit 将 Tomcat 上开发的应用快速移植到 WebSphere 应用服务器。反之,则不然。Liberty 和传统 WAS 对编程模型和标准的支持一致。在 Liberty 上开发的应用可以直接运行在传统 WAS 之上。
社区http://tomcat.apache.org
有开发人员和用户的邮件列表,没有官方支持,有时回复不够及时。
http://wasdev.net,可以与开发人员直接交流
文档官方文档涵盖内容有限,但网络上相关内容(包括:blog,技术文章等)广泛。http://wasdev.net 上提供下载地址、文档、视频、音频、样本引用等。
长期战略优势一般用于开发环境,生产环产应用的比较少。
支持的并发度不高,可扩展性不强。
Liberty 与传统 WAS 共享同一代码,天生具有其高效稳定的特点。开发 - 测试 - 生产切换零代价。
可扩展性高,支持多个 server 间的负载均衡和故障恢复。

Liberty 高速缓冲可以由 eXtreme Scale 提供吗?

可以,Liberty 可以和 eXtreme Scale 进行集成带来高速缓存的特性。

Liberty 支持 IBM iSeries 吗?

支持,在 IBM iSeries 上的使用和在其他平台上相同。

用户可以在 Eclipse 中管理 Liberty 吗?比如启动和停止?

可以,在 Eclipse 控制台的 Servers 标签中,展开您的 Liberty 下拉列表,会显示出当前部署在该应用服务器上的全部应用,右击某一应用,可以进行相关的启 / 停 / 移除操作,参见截图

图 1 . Servers 控制

但是在运行时环境里面,暂时不支持启动和停止某一个特定的应用。

Liberty 能在 mobile 的设备上做开发(比如 ipad)吗?

目前不支持这样做,但是 Liberty 支持在 MAC 系统上进行开发。

Liberty 是如何自动添加所需的功能特性的?

在开发环境,即 Eclipse+WDT+Liberty runtime 时,Liberty 可以自动为应用添加所需的特性。此功能是 WDT 来实现的,其会自动扫描应用,判断应用所采用的编程模型,然后为应用添加相应的功能支持。

如果直接使用 Liberty runtime 部署应用,Liberty 是不会自动为应用添加所需的特性的。

Liberty 如何处理不同的应用 /server 的端口冲突?

通过在 Liberty 的运行时环境下面的 bootstrap.properties 和 server.xml 两个文件进行相应的配置,该项配置需要重启 Liberty。参考 信息中心进行配置。

除了 Liberty 之外,还有其他产品是基于 OSGi 架构的?

Liberty 是完全基于 OSGi 的产品,其在构建中完全遵循了 OSGi 的编程模型规范。在应用服务器领域暂时还没有发现其他的产品也完全采用 OSGi 的编程模型进行构建。

当启用某个 Liberty 的特性时,Liberty 是及时动态的加载属于该特性的 JAR 包,还是在 Liberty 启动的时候就已经加载,只是此时才开始使用?

一般来说,根据 bundle 的 Bundle-ActivationPolicy 值来确定是立刻启动 bundle 还是按需启动 bundle(lazy)。但是在 Liberty 中,大多数 bundle 都没有设定这个值,默认的行为就是当 Liberty 启动的时候 bundle 会被立即启动,但是,我们需要说明的是:

  1. liberty 中对于 bundle 的使用采用的 DS 的方式(声明服务),bundle 与 bundle 之间是通过服务的调用来实现的,只有当去主动请求一个服务时,该服务的 bundle 提供者才会被加载,所以,当采用服务的管理模式后,我们并不需要特别在意 bundle 的加载方式。
  2. 在 liberty 中,只有很少的 bundle 设定了 Bundle-ActivationPolicy 值,此刻,这些 bundle 会根据值的设定选择立刻或者按需启动。

posted @ 2014-01-10 11:31 ZT文萃 阅读(1625) | 评论 (0)编辑 收藏