ZT文萃

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

2013年9月27日

移动互联网,就是将移动通信和互联网二者结合起来,成为一体。
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)编辑 收藏

1、复利会让你富有,但变富得花时间
      
       巴菲特是了不起,可他像这样当上数一数二的巨富是因为他60多年都是了不起的投资者。
      
       他现在600亿美元的资产净值里,有597亿美元是在过了50岁生日以后得到的。更确切地说,在60岁以后,巴菲特才拥有其中570亿美元。
      
       他的秘诀就是时间。
      
       大多数人在退休前一二十年才开始未雨绸缪,实际上,尽早开始储蓄是很重要的。
      
2、影响回报的一个最大变量是估值,你根本不晓得估值会怎样
      
       未来的市场回报等于股息率+收益增长+/-市盈率(估值)变化。
      
       股息率目前2%,估计每年收益增长的合理水平是5%,可市盈率就完全是未知数。
      
       市盈率体现人们的预感,谁都没办法知道今后大家怎么看待未来。
      
       如果有人说“我认为大多数人2023年会比现在心情好10%”,大家可能说这人有妄想症。
      
       但如果有人这么预计10年内的市场回报,我们管这人叫分析师。
      
3、简单通常比聪明更要紧
      
       如果有人2003年买了低成本的标普500指数基金,到2012年年底,可以收获97%的回报。
      
       而道琼斯瑞信对冲基金指标的数据显示,那些高端大气的中性股市对冲基金同期平均市值还缩水了4.7%。
      
       投资不像电脑,简单基本的方法可能比那些复杂高端的更有威力。
      
       投资也不是打高尔夫,投机者很有可能用出色的成绩羞辱某些专家、老手。
      
4、股市大起大落的几率是100%
      
       大多数投资者理解股票可以产生更高的长期回报,但代价是波动性更大。
      
       1900年以来,标普500年均回报率约6%,最高和最低的年底收盘价之间平均差距达到23%。
      
       所以,下次要有谁费劲解释为什么市场涨跌几个百分点,那基本上就是在解释为什么春天过了是夏天。
      
       有人还问过老摩根市场今后会怎样,据说他当时回答:
      
       它会波动。
      
       乍听起来,这样的回答是在转移重点,事实上绝非虚言。
      
5、金融圈大多都是怪人、骗子和推销员。
      
       大多数推销金融产品的人只对你的钱财感兴趣,因为他们可以借此收费。
      
       要做理想论坛的权威,根本不需要经验、证书甚至常识。
      
       可惜,往往某位权威叫唤得越响亮、越语出惊人,得到的关注就越多,即便这样一来他更有可能出错,也是如此。股

posted @ 2013-12-13 11:25 ZT文萃 阅读(518) | 评论 (0)编辑 收藏

下文来自:http://www.55188.com/thread-5518816-1-1.html,原文出自和讯。

1、格雷厄姆1929年股市泡沫破灭后在1931年抄底,结果破产。
(失败原因:抄底)

2、美国著名经济学家费雪已经预见1929年股市泡沫破灭,但是还是买入自认为是便宜的股票,结果几天之中损失了几百万美元,一贫如洗。
(失败原因:认为优秀企业可以穿越周期不计价格买入)

3、索罗斯1987年前认为日本股市泡沫巨大,放空日本股票,结果惨败,日本股市牛到了1989年。索罗斯在华尔街评论上鼓吹美国股市会坚挺,日本股市将会崩盘,而结果正好相反:美国股市崩盘了,日本股市却坚挺。索罗斯旗下的量子基金当年损失了32%,与他唱反调的孔逸夫却让科尔基金赢利了70%,这是一个令人惊奇的数字,因为当年几乎所有的对冲基金都亏损了。1999年曾不看好科技股,但2000年后却用量子基金高位买入科技股,最后大亏。
(失败原因:投机,对赌)
   
4、上海一基金管理公司总经理当初是从中国台湾地区股市1000多点开始进入的,一直做到10000点,入市50万的资金滚到了8000万,其实她在10000点的时候,就把股票全部抛了,手上握有的全是现金。因为担心股市过于疯狂,所以她还是相对比较理智的,最后台湾股市上冲到12000点之上,三年多时间增值了160倍,但是最后的结局还是很惨,在台湾股市由12000点跌到7000点时,已经跌去5000多点了,按道理该反弹了吧,她又进去了,股指又跌掉了5000点,她不得不全部认赔清仓,三年的财富又都化为灰烬。
(失败原因:博反弹,做波段)

   归其原因,我们客观地说,她还是非常聪明的,但是为什么后来又进场了,她当时自己就以为自己是股神了,可以掌控股市,股市不过是她的超级提款机而已。在此,我劝告大家,现在股市好,可能未来股市更好,但是如何清醒的看待股市,如何看待自己是一个永恒的话题。
(失败原因:高估自己)

  5、香港有个知名股评曹仁超,1972年香港股灾前1200点看空,结果差点被公司解雇。1973年港股达到1773点后大幅下跌。到1974年跌至400点,老曹躲过大熊,信心百倍。1974年7月港股跌至290点后认为可以捞底,拿全部积蓄50万港币抄底和记洋行,该蓝筹股从1973年股市泡沫的43块一直跌到5.8。老曹全仓买入。结果后来5个月,港股再度跌至150点。和记洋行跌至1.1元。老曹最后斩仓,亏损80%以上。
(失败原因:全仓买卖)
  
  6、徐兴博年近半百,是南京市一家药材公司的普通职工。1992年,我国证券交易市场还刚刚起步,许多单位和个人在这片领域里淘一桶金。徐兴博的确在这里面淘得了第一桶金,凭着丰富的投资经验,不管股市如何涨跌,他总是能及时嗅出大盘行情,事先作出调整,让自己的投资稳定增长。2001年10月,形势急转,而他仍认为能象以前那样安然度过低谷,接受委托资金超过100万元。2005年6月,沪指跌破1000点大关,一夜间回到了13年前,徐兴博和朋友委托给他炒股的财产,在这次大跌中损失殆尽。
(失败原因:加杠杆,借钱投资)股

posted @ 2013-12-08 21:27 ZT文萃 阅读(156) | 评论 (0)编辑 收藏

http://blog.sina.com.cn/s/blog_5ce347de0102eb8b.html

 

我们小散户做的是政策面大指标里 的个股,不是整个政策面里的所有股。看业绩,看基本面,看政策都不如看个股快要拉升的时机。好指标里显示个股拉升前的习惯和成交量的数据,好指标的确像温 度计一样记录了39度是发烧,0度以下要结冰的事实。熊市里有涨的可以赚钱的个股,牛市里有跌的能套人的个股。能有一个更好的指标让大家在牛市里多赚一点 钱,在熊市里少赔一点钱,就值得了。


一.选股指标.

次日涨停
W1:=C=HHV(C,20);
W2:=BARSLAST(W1);
W3:=IF(W2>0,REF(C,W2),REF(C,W2));
W4:=CROSS(C,REF(W3,1));
W4 AND COUNT(W4,5)=1;
黄转紫选股
DIFF:=EMA(DCLOSE,12)-EMA(DCLOSE,26);
DEA:=EMA(DIFF,9);
MACD:=(DIFF-DEA)*2;
紫柱:MACD<0 AND MACD>REF(MACD,1) AND REF(MACD,1)<REF(MACD,2);

低位金叉选股
DIFF:=EMA(DCLOSE,12)-EMA(DCLOSE,26);
DEA:=EMA(DIFF,9);
MACD:=(DIFF-DEA)*2;
低位金叉:CROSS(DIFF,DEA) AND DIFF<-0.1;

二次金叉选股
DIFF:=EMA(DCLOSE,12)-EMA(DCLOSE,26);
DEA:=EMA(DIFF,9);
MACD:=(DIFF-DEA)*2;
JCCOUNT:=COUNT(CROSS(DIFF,DEA),BARSLAST(DEA>=0));
二次金叉:CROSS(DIFF,DEA) AND DEA<0 AND COUNT(JCCOUNT=2,21)=1;
绝地反弹
(1)
VAR1:=REF(LOW,1);
VAR2:=SMA(ABS(LOW-VAR1),13,1)/SMA(MAX(LOW-VAR1,0),13,1)*100;
VAR3:=EMA(IF(CLOSE*1.2,VAR2*13,VAR2/13),13);
VAR4:=LLV(LOW,34);
VAR5:=HHV(VAR3,34);
VAR6:=IF(LLV(LOW,55),1,0);
VAR7:=EMA(IF(LOW<=VAR4,(VAR3+VAR5*2)/2,0),3)/618*VAR6;
XL1:=MA(LOW,2)*0.96;
XL2:=MA(LOW,26)*0.85;
XL3:=REF(XL1,1)<XL2 AND REF(XL1,1)<XL1 AND REF(XL1,1)<REF(XL1,2);
启动:=IF(XL3,0,VAR7*3),COLORRED;
XG:启动>25;

(2)

BACKSET( (REF(CLOSE,1)<REF(OPEN,1) AND
CLOSE>OPEN AND ABS(CLOSE-REF(CLOSE,1))/CLOSE<0.002),2);
A2:=FILTER(A1<=V3,10);
ND CAPITAL<300000000
REF(V,1) = LLV(V,4) AND V >=REF(V,1)
HHV(V,3)=REF(V,1) AND HHV(V,5)=REF(V,1) AND HHV(V,21)=REF(V,1)
AND V >=REF(V,1)
01>0 AND T02>0;

1.三线粘合
M:=1;
M5:=MA(CLOSE,5);
M10:=MA(CLOSE,10);
M20:=MA(CLOSE,20);
K1:=MAX(MAX(M5,M10),MAX(M10,M20));
K2:=MIN(MIN(M5,M10),MIN(M10,M20));
A:=MAX(M5,MAX(M10,M20))/MIN(M5,MIN(M10,M20))<1+0.03*M;
A1:=(K1/K2-1)<0.005;
A2:=(K1/K2-1)<0.005;
A3:=V>REF(V,1)*1.5 AND V>MA(V,5);
XG:A AND A1 AND A2 AND A3 AND C>O AND V> REF(V,1) AND CAPITAL<=300000000;

2.三条线粘合
N1:=5;N2:=10;N3:=20;M:=1;
MA1:=MA(C,N1);MA2:=MA(C,N2);MA3:=MA(C,N3);
A3:=V>REF(V,1)*1.5 AND V>MA(V,5);
MAX(MA1,MAX(MA2,MA3))/MIN(MA1,MIN(MA2,MA3))<1+0.01*M
AND C>O AND V> REF(V,1) AND FINANCE(7)<=300000000
AND A3 AND CAPITAL<=300000000;

3.均线粘合
M:=1;
M5:=MA(CLOSE,5);
M10:=MA(CLOSE,10);
M20:=MA(CLOSE,20);
K1:=MAX(MAX(M5,M10),MAX(M10,M20));
K2:=MIN(MIN(M5,M10),MIN(M10,M20));
A:=MAX(M5,MAX(M10,M20))/MIN(M5,MIN(M10,M20))<1+0.01*M;
A1:=(K1/K2-1)<0.005;
A2:=(K1/K2-1)<0.005;
A3:=V>REF(V,1)*1.5 AND V>MA(V,5);
XG:A AND A1 AND A2 AND A3 ;
3. 金叉选股指标
快线:=EMA(EMA(EMA(EMA(CLOSE,2),2),2),2);
慢线:=EMA(REF(快线,1),2);
A3:=V>REF(V,1)*1.5 AND V>MA(V,5);
XG:CROSS(快线,慢线) AND C>O AND
V>=MA(V,21) AND V> REF(V,1) AND CAPITAL<=300000000 ;
4.角度
MA5:=MA(C,5);
MA10:=MA(C,10);
MA20:=MA(C,20);
V0:CROSS(MA5,MA10) AND CROSS(MA10,MA20) AND
CROSS(MA5,MA20) ;
IF(角度MA3>45 AND 角度MA5>40 AND 角度MA10>10
AND 角度MA20>20 AND MA(C,135)>REF(MA(C,135),1),
1,0),COLOR00FF00
1.聚宝盆

DIFF:=EMA(CLOSE,SHORT)-EMA(CLOSE,LONG);
DEA:=EMA(DIFF,M);
MACD2:=2*(DIFF-DEA);
HHV(MACD2,4)<0 AND MACD2>REF(MACD2,1) AND REF(MACD2,1)<REF(MACD2,2) AND REF(MACD2,2)<REF
(MACD2,3);
2.强势股
{SJXXG四均线选股}
MA3:=MA(C,3);
MA5:=MA(C,5);
MA10:=MA(C,10);
MA20:=MA(C,20);
V0:=MA(C,3)>REF(MA(C,3),1) AND MA(C,5)>REF(MA(C,5),1) AND C>MA(C,3)
AND MA(C,3)>MA(C,5) ; {均线C,MA3,MA5多头排列并向上;}
角度MA3:=ATAN((MA3/REF(MA3,1)-1)*100)*180/3.1416;
角度MA5:=ATAN((MA5/REF(MA5,1)-1)*100)*180/3.1416;
角度MA10:=ATAN((MA10/REF(MA10,1)-1)*100)*180/3.1416;
角度MA20:=ATAN((MA20/REF(MA20,1)-1)*100)*180/3.1416;
选股MA20:IF(角度MA3>45 AND 角度MA5>45 AND 角度MA10>60 AND 角度MA20>45 AND MA(C,250)>REF(MA(C,250),1),
1,0),COLOR00FF00;
{设计思路:
1.3日均线角度大于45度;
2:5日均线角度大于45度;
3:10日均线角度大于60度;
4.20日均线角度大于45度;
5.MA250向上;};
3。紫色冲关
(1).
CROSS( CLOSE,MA(C,30))
AND CLOSE>MA(C,22) AND CLOSE>MA(C,30)AND
COUNT(MA(CLOSE,13)>REF(MA(CLOSE,13),1),1)
AND COUNT(MA(CLOSE,8)>REF(MA(CLOSE,8),1),1)
AND COUNT(MA(CLOSE,20)>REF(MA(CLOSE,20),1),1)
AND CLOSE/OPEN>1.015
AND DYNAINFO(37)>0.2% COLORLIBLUE;

(2).
QSXS:=MA(CLOSE,8)>REF(MA(CLOSE,8),1) AND MA(CLOSE,3)>REF(MA(CLOSE,3),1) AND MA(CLOSE,5)>REF(MA(CLOSE,5),1);
DXJC:=CROSS(CLOSE,MA(C,21)) AND CLOSE>MA(C,13) AND CLOSE/OPEN>1.015;
HSL:=VOL/CAPITAL*100;
选股:QSXS AND DXJC AND HSL>2;

(3).
{SJXXG四均线选股}
MA3:=MA(C,1);
MA5:=MA(C,3);
MA10:=MA(C,5);
MA20:=MA(C,10);
V0:=MA(C,1)>REF(MA(C,1),0.5) AND MA(C,3)>REF(MA(C,3),0.5) AND C>MA(C,1)
AND MA(C,1)>MA(C,1) ; {均线C,MA3,MA5,MA10,MA20多头排列并向上;}
角度MA3:=ATAN((MA3/REF(MA3,1)-1)*100)*180/3.1416;
角度MA5:=ATAN((MA5/REF(MA5,1)-1)*100)*180/3.1416;
角度MA10:=ATAN((MA10/REF(MA10,1)-1)*100)*180/3.1416;
角度MA20:=ATAN((MA20/REF(MA20,1)-1)*100)*180/3.1416;
选股MA20:IF(角度MA3>50 AND 角度MA5>40 AND 角度MA10>30
AND 角度MA20>20 AND MA(C,250)>REF(MA(C,250),1),
1,0),COLOR00FF00;
{设计思路:
1.1日均线角度大于40度;
2:3日均线角度大于40度;
3:5日均线角度大于50度;
4.10日均线角度大于40度;
5.MA135向上;};

(4).
{SJXXG四均线选股}
MA3:=MA(C,5);
MA5:=MA(C,10);
MA10:=MA(C,15);
MA20:=MA(C,20);
V0:=MA(C,5)>REF(MA(C,10),1) AND MA(C,10)>REF(MA(C,15),1)
AND MA(C,15)>MA(C,20) ; {均线C,MA3,MA5多头排列并向上;}
角度MA3:=ATAN((MA3/REF(MA3,1)-1)*100)*180/3.1416;
角度MA5:=ATAN((MA5/REF(MA5,1)-1)*100)*180/3.1416;
角度MA10:=ATAN((MA10/REF(MA3,1)-1)*100)*180/3.1416;
角度MA20:=ATAN((MA20/REF(MA5,1)-1)*100)*180/3.1416;
选股MA20:IF(角度MA3>42 AND 角度MA5>25 AND 角度MA10>15 AND 角度MA20>10
AND MA(C,135)>REF(MA(C,135),1),
1,0),COLOR00FF00;
{设计思路:
1.3日均线角度大于30度;
2:5日均线角度大于40度;
3:10日均线角度大于45度;
4.20日均线角度大于40度;
5.MA135向上;};

(5).5日最底

V5:=LLV(V,5);
QSXS:=MA(CLOSE,5)>REF(MA(CLOSE,5),1) AND MA(CLOSE,8)>REF(MA(CLOSE,8),1)
AND MA(CLOSE,21)>REF(MA(CLOSE,21),1);
DXJC:=CROSS(CLOSE,MA(C,21)) AND CLOSE>MA(C,21) AND CLOSE/OPEN>1.015;
HSL:=VOL/CAPITAL*100;
选股:V5 AND QSXS AND DXJC AND HSL>2;
1....{蓄势待发}
V0:=EMA(C,5);
EMA10:=EMA(C,10);
EMA20:=EMA(C,20);
EMA30:=EMA(C,30);
EMA60:=EMA(C,60);
M1:=1000*EMA10/EMA60<=1015 AND 1000*EMA10/EMA60>=975;
M2:=1000*EMA20/EMA60<=1020 AND 1000*EMA20/EMA60>=980;
M3:=1000*EMA30/EMA60<=1015 AND 1000*EMA30/EMA60>=985;
M4:=M1 AND M2 AND M3 AND CROSS(V0,EMA10);
M5:=M1 AND M2 AND M3 AND CROSS(V0,EMA30);
T1:=1000*EMA10/EMA30<=1010 AND 1000*EMA10/EMA30>=990;
T2:=1000*EMA20/EMA30<=1010 AND 1000*EMA20/EMA30>=990;
T3:=T1 AND T2 AND CROSS(V0,EMA10);
T4:=T1 AND T2 AND CROSS(V0,EMA30);
M4 OR M5 OR T3 OR T4;

2.短线之王
VAR1:=(-100)*(HHV(HIGH,3)-CLOSE)/(HHV(HIGH,3)-LLV(LOW,3));
CROSS(VAR1,-87) AND OPEN<MA(CLOSE,5) AND CLOSE>=1.099*REF(CLOSE,1) AND INDEXC>0.98*REF(INDEXC,1) AND CLOSE<=1.47*LLV
(CLOSE,58);

3.枪挑小梁王
W1:=C=HHV(C,20);
W2:=BARSLAST(W1);
W3:=IF(W2>0,REF(C,W2),REF(C,W2));
W4:=CROSS(C,REF(W3,1));
枪挑小梁王:W4 AND COUNT(W4,5)=1;

4.短线之王
VAR1:=(-100)*(HHV(HIGH,3)-CLOSE)/(HHV(HIGH,3)-LLV(LOW,3));
CROSS(VAR1,-87) AND OPEN<MA(CLOSE,5) AND CLOSE>=1.099*REF(CLOSE,1) AND INDEXC>0.98*REF(INDEXC,1) AND CLOSE<=1.47*LLV
(CLOSE,58);
5.财务突破选股
{财务突破选股公式-创幻闲云孤鹤-通信达专用}
年认同价:=MA(C,240);
价格中枢:=(SUM(年认同价,0)/(BARSSINCE(年认同价>0)+239));
箱顶:=价格中枢*1.2;
箱底:=价格中枢*0.8;
毛利润率:=FINANCE(21)/FINANCE(20);
成长价值:=年认同价*(1+毛利润率);
收益价值:=年认同价+FINANCE(33);
回调认同:=EMA(EXPMA(C,20),13);
多头:=(回调认同>REF(回调认同,1))AND(成长价值>REF(成长价值,1))AND(收益价值>REF(收益价值,1))AND(DYNAINFO(7)>0);
回调条件:=COUNT(C<回调认同,5)>=3;
回调突破:=(REF(C,1)<=REF(回调认同,1))AND(C>回调认同)AND(回调条件)AND 多头;
成长条件:=COUNT(C<成长价值,5)>=3;
成长突破:=(REF(C,1)<=REF(成长价值,1))AND(C>成长价值)AND(成长条件)AND 多头;
收益条件:=COUNT(C<收益价值,5)>=3;
收益突破:=(REF(C,1)<=REF(收益价值,1))AND(C>收益价值)AND(收益条件)AND 多头;
箱底条件:=COUNT(C<箱底,5)>=3;
箱底突破:=(REF(C,1)<=REF(箱底,1))AND(C>箱底)AND(箱底条件)AND 多头;
价格条件:=COUNT(C<价格中枢,5)>=3;
价格突破:=(REF(C,1)<=REF(价格中枢,1))AND(C>价格中枢)AND(价格条件)AND 多头;
箱顶条件:=COUNT(C<箱顶,5)>=3;
箱顶突破:=(REF(C,1)<=REF(箱顶,1))AND(C>箱顶)AND(箱顶条件)AND 多头;
突破买点:(回调突破+成长突破+收益突破+箱底突破+价格突破+箱顶突破);

6.横盘是银

VAR1:=(CLOSE-LLV(LOW,9))/(HHV(HIGH,9)-LLV(LOW,9))*100;
VAR2:=SMA(VAR1,3,1);
VAR3:=SMA(VAR2,3,1);
VAR4:=EMA(CLOSE,12)-EMA(CLOSE,26);
VAR5:=EMA(VAR4,9);
VAR6:=2*(VAR4-VAR5);
COUNT(CROSS(VAR2,VAR3),2)>=1 AND COUNT(CROSS(VAR6,0),5)>=1 AND MA(CLOSE,5)>MA(CLOSE,10) AND MA(CLOSE,10)>MA(CLOSE,20) AND
CLOSE>MA(CLOSE,5);
{“短线是银”的使用说明:
此组合选择比较简单,初学者易于掌握,短线有一定可操作性与准确性。但只适合于3天内的短线炒作,不能确定长期趋势。
选股设置:
2日内KD金叉,5日内MACD金叉,均线5日,10日,20日多头排列,收盘价涨过5日均线。};
7.黑马起步选股1
VAR5:=EMA(SMA((CLOSE-LLV(LOW,100))/(HHV(HIGH,100)-LLV(LOW,100))*100,8,1),3);
选股:CROSS(VAR5,15) OR CROSS(VAR5,20) OR CROSS(VAR5,25);

8.起攀选股
{起攀选股}
VAR6:=(2*C+H+L)/4;
VAR7:=LLV(L,27);
VAR8:=HHV(H,27);
攀登:=EMA((VAR6-VAR7)/(VAR8-VAR7)*100,13)-50;
金山:=EMA(0.618*REF(攀登,1)+0.382*攀登,3);
起攀:CROSS(攀登,金山) AND C/REF(C,1)>1.02;
{根据起攀图指标改编,这是精简后的指标};
9.中短波选股
{中短波选股}
HZ:=EMA(CLOSE,13);
短波:=EMA(HZ,1);
中波:=EMA(HZ,26);
均线148天:=EMA(C,148);
成本:=SUM(AMOUNT,0)/SUM(VOL,0)/100;
HZ2:=EMA(HZ,8);
CROSS(短波,HZ2);
{结合中短波主图使用};
10.黑马摇篮之大
{黑马摇篮之大黑马}
SS1:=(LOW+HIGH+CLOSE*2)/4;
SS2:= MA(SS1,4);
SS3:=HHV(SS2,10);
SS4:=MA(SS3,3);
SS5:=1.25*SS4-0.25*SS3;
XKKJ:=IF(SS5>SS3,SS3,SS5);
FF1:=LLV(SS2,10);
FF2:=MA(FF1,3);
FF3:=1.25*FF2-0.25*FF1;
DKKJ:=IF(FF3<FF1,FF1,FF3);
MA13:=MA(C,13);
ZDHM:=CROSS(C,DKKJ) AND CROSS(C,MA13) AND CROSS(C,XKKJ);
ZHM:=CROSS(C,MA13) AND CROSS(C,XKKJ);
大黑马:ZDHM OR ZHM;
11.黑马摇篮之小
{黑马摇篮之小黑马}
A:=(3*CLOSE+LOW+OPEN+HIGH)/6;
D1:=(20*A+19*REF(A,1)+18*REF(A,2)+17*REF(A,3)+16*REF(A,4)+15*REF(A,5)+14*REF(A,6)
+13*REF(A,7)+12*REF(A,8)+11*REF(A,9)+10*REF(A,10)+9*REF(A,11)+8*REF(A,12)
+7*REF(A,13)+6*REF(A,14)+5*REF(A,15)+4*REF(A,16)+3*REF(A,17)+2*REF(A,18)+
REF(A,20))/211;
D2:=EMA(D1,2);
D3:=EMA(D2,2);
K1:=EMA(D3,2);
小黑马:CROSS(D1,K1);
12.蓄势待发
{蓄势待发}
V0:=EMA(C,5);
EMA10:=EMA(C,10);
EMA20:=EMA(C,20);
EMA30:=EMA(C,30);
EMA60:=EMA(C,60);
M1:=1000*EMA10/EMA60<=1015 AND 1000*EMA10/EMA60>=975;
M2:=1000*EMA20/EMA60<=1020 AND 1000*EMA20/EMA60>=980;
M3:=1000*EMA30/EMA60<=1015 AND 1000*EMA30/EMA60>=985;
M4:=M1 AND M2 AND M3 AND CROSS(V0,EMA10);
M5:=M1 AND M2 AND M3 AND CROSS(V0,EMA30);
T1:=1000*EMA10/EMA30<=1010 AND 1000*EMA10/EMA30>=990;
T2:=1000*EMA20/EMA30<=1010 AND 1000*EMA20/EMA30>=990;
T3:=T1 AND T2 AND CROSS(V0,EMA10);
T4:=T1 AND T2 AND CROSS(V0,EMA30);
M4 OR M5 OR T3 OR T4;
13.四线粘合
{四线粘合}
V0:=EMA(C,5);
V1:=EMA(C,10);
V2:=EMA(C,15);
V3:=EMA(C,30);
V4:=EMA(C,60);
M1:=1000*V1/V4<=1015 AND 1000*V1/V4>=975;
M2:=1000*V2/V4<=1020 AND 1000*V2/V4>=980;
M3:=1000*V3/V4<=1015 AND 1000*V3/V4>=985;
M4:=M1 AND M2 AND M3 AND CROSS(V0,V1);
M5:=M1 AND M2 AND M3 AND CROSS(V0,V3);
M4 OR M5;

14.拉升在即
{拉升在即}
ABV:=MA(SUM(IF(CLOSE>REF(CLOSE,1),VOL,IF(CLOSE<REF(CLOSE,1),-VOL,0)),0)/25000,2);
M1:=EMA(ABV,12);
M2:=EMA(ABV,26);
MTM:=CLOSE-REF(CLOSE,1);
MMS:=((100)*(EMA(EMA(MTM,6),6)))/(EMA(EMA(ABS(MTM),6),6));
MMM:=((100)*(EMA(EMA(MTM,12),12)))/(EMA(EMA(ABS(MTM),12),12));
MML:=((100)*(EMA(EMA(MTM,26),26)))/(EMA(EMA(ABS(MTM),26),26));
A:=((VOL)/(CAPITAL))*(100);
S:=((MA(A,30))/(MA(INDEXA,10)))*(MA(INDEXA,60));
Y:=((MA(A,120))/(MA(INDEXA,10)))*(MA(INDEXA,60));
X:=1;
拉升在即:S<X AND Y<X AND MMS>MML AND ABV>M1 AND CROSS(S,Y);

15.HMYZ黑马易找

VAR1:=MA(CLOSE,5);
VAR2:=MA(CLOSE,10);
VAR3:=MA(CLOSE,30);
VAR4:=MA(CLOSE,60);
VAR5:=EMA(COST(85),7);
VAR6:=EMA(COST(15),7);
VAR7:=SUM(CLOSE*VOL*100,4)/SUM(VOL*100,4);
VAR8:=INTPART(VAR7*100)/100;
VAR9:=SUM(CLOSE*VOL*100,7)/SUM(VOL*100,7);
VARA:=INTPART(VAR9*100)/100;
VARB:=SUM(CLOSE*VOL*100,28)/SUM(VOL*100,28);
VARC:=INTPART(VARB*100)/100;
VARD:=EMA(CLOSE,5)-EMA(CLOSE,10);
VARE:=EMA(VARD,9);
VARF:=(-100)*(HHV(CLOSE,5)-CLOSE)/(HHV(CLOSE,5)-LLV(LOW,5))+100;
VAR10:=(-100)*(HHV(CLOSE,10)-CLOSE)/(HHV(CLOSE,10)-LLV(LOW,10))+100;
VAR11:=(-100)*(HHV(CLOSE,20)-CLOSE)/(HHV(CLOSE,20)-LLV(LOW,20))+100;
VAR12:=(-100)*(HHV(CLOSE,30)-CLOSE)/(HHV(CLOSE,30)-LLV(LOW,30))+100;
VAR13:=REF(VARE,1);
VAR14:=VARE;
VAR15:=VAR14-VAR13;
VAR16:=REF(VARD,1);
VAR17:=VARD;
VAR18:=VAR17-VAR16;
VAR19:=OPEN;
VAR1A:=CLOSE;
黑马易找选股: VAR19<=VAR1 AND VAR19<=VAR2 AND VAR19<=VAR3 AND VAR1A>=VAR1 AND VAR1A>=VARC AND VAR15>0 AND VAR18>0;
16.黑马起步选股2
VAR5:=EMA(SMA((CLOSE-LLV(LOW,100))/(HHV(HIGH,100)-LLV(LOW,100))*100,8,1),3);
选股:CROSS(VAR5,30) OR CROSS(VAR5,35) OR CROSS(VAR5,40);
17.黑马起步选股1
VAR5:=EMA(SMA((CLOSE-LLV(LOW,100))/(HHV(HIGH,100)-LLV(LOW,100))*100,8,1),3);
选股:CROSS(VAR5,15) OR CROSS(VAR5,20) OR CROSS(VAR5,25);
二。主图指标
三。三线买卖
快线:EMA(EMA(EMA(EMA(CLOSE,2),2),2),2),LINETHICK2,COLOR0000FF;
慢线:EMA(REF(快线,1),2),LINETHICK2,COLOR00FFFF;
总趋势:EMA(EMA(EMA(EMA(EMA(CLOSE,55),2),2),2),2),LINETHICK2,COLORFF00FF;
HIGHN:=10;LOWN:=10;HIGHDISPLAY:=0;LOWDISPLAY:=0;ZGDISPLAY:=0;MADISPLAY:=0;
AA:=REF(H,HIGHN)=HHV(H,2*HIGHN+1);
QY:=BACKSET(AA,HIGHN+1);
CC:=FILTER(QY,HIGHN) AND H=HHV(H,HIGHN+1);
DRAWICON(CC,H*1.02,2);
DDD:=BARSLAST(CC);
GDTS:=IF(CC,CURRBARSCOUNT,0);
DINGBU:=IF(DDD,REF(H,DDD),H);{顶部}
DINGBUTS:=IF(DDD,REF(GDTS,DDD),GDTS);
DINGBU1:=REF(DINGBU,DDD+1);
GDCS1:=CONST(DINGBUTS);
DINGBUTS1:=REF(DINGBUTS,DDD+1);
GDCS2:=CONST(DINGBUTS1);
DINGBU2:=REF(DINGBU1,DDD+1);
MM:=IF(CURRBARSCOUNT>GDCS2,0,1);
高点压力:DRAWLINE(CURRBARSCOUNT=GDCS2,H,CURRBARSCOUNT=GDCS1,H,1) COLORGREEN,LINETHICK2;
DRAWLINE(CURRBARSCOUNT=GDCS2,H,ISLASTBAR,REF(H,GDCS2-1),1),COLOR0055FF,POINTDOT;
DRAWLINE(CURRBARSCOUNT=GDCS1,H,ISLASTBAR,REF(H,GDCS1-1),1),COLORYELLOW,POINTDOT;
AA1:=REF(L,LOWN)=LLV(L,2*LOWN+1);
QY1:=BACKSET(AA1,LOWN+1);
CC1:=FILTER(QY1,LOWN) AND L=LLV(L,LOWN+1);
DRAWICON(CC1,L*0.98,1);
DD1:=BARSLAST(CC1);
DDTS:=IF(CC1,CURRBARSCOUNT,0);
YDB:=IF(DD1,REF(L,DD1),L);
DDTS1:=IF(DD1,REF(DDTS,DD1),DDTS);
DDCS1:=CONST(DDTS1);
ZDB:=REF(YDB,DD1+1);
DDTS2:=REF(DDTS1,DD1+1);
DDCS2:=CONST(DDTS2);
低点支撑:DRAWLINE(CURRBARSCOUNT=DDCS2,L,CURRBARSCOUNT=DDCS1,L,1) COLORRED,LINETHICK2;
ZGSTAR:=(高点压力+低点支撑)/2;
ZGEND:=CONST((高点压力+低点支撑)/2);
STARDAY:=IF(DDCS2<GDCS2,DDCS2,GDCS2);
中轨:DRAWLINE(CURRBARSCOUNT=STARDAY,ZGSTAR,ISLASTBAR,ZGEND,1),COLORFF55BB,LINETHICK2;
DRAWLINE(CURRBARSCOUNT=DDCS1,L,ISLASTBAR,REF(L,DDCS1-1),1),COLORMAGENTA,POINTDOT,;
DRAWLINE(CURRBARSCOUNT=DDCS2,L,ISLASTBAR,REF(L,DDCS2-1),1),COLORCYAN,POINTDOT;
四。3线粘合
MA3:EMA(C,3),linethick2; MA5:EMA(C,5),linethick2; MA7:EMA(C,7),linethick2; MA14:EMA(C,14),linethick1,STICK; MA114:EMA
(C,14),linethick2; DRAWICON (cross(MA3,MA7),L*0.985,1);
五.三线乾坤

快线:EMA(EMA(EMA(EMA(CLOSE,2),2),2),2),LINETHICK2,COLOR0000FF;
慢线:EMA(REF(快线,1),2),LINETHICK2,COLOR00FFFF;
总趋势:EMA(EMA(EMA(EMA(EMA(CLOSE,55),2),2),2),2),LINETHICK2,COLORFF00FF;
A1:=REF(H,8)=HHV(H,2*8+1);
B1:=FILTER(A1,8);
C1:=BACKSET(B1,8+1);
D1:=FILTER(C1,8);{高点}
R11:=BACKSET(ISLASTBAR,BARSLAST(D1)+1); S11:=R11>REF(R11,1);
DRAWLINE(D1,H,S11,H,1),COLORBLUE;
A2:=REF(L,8)=LLV(L,2*8+1);
B2:=FILTER(A2,8);
C2:=BACKSET(B2,8+1);
D2:=FILTER(C2,8);{低点}
T11:=BACKSET(ISLASTBAR,BARSLAST(D2)+1); U11:=T11>REF(T11,1);
DRAWLINE(D2,L,U11,L,1),COLORBLUE;
M:=INTPART(3*8/5);
A12:=REF(H,M)=HHV(H,2*M+1);
B12:=FILTER(A12,M);
C12:=BACKSET(B12,M+1);
D12:=FILTER(C12,M);{高点}
R112:=BACKSET(ISLASTBAR,BARSLAST(D12)+1); S112:=R112>REF(R112,1);
DRAWLINE(D12,H,S112,H,1),COLORRED;
A22:=REF(L,M)=LLV(L,2*M+1);
B22:=FILTER(A22,M);
C22:=BACKSET(B22,M+1);
D22:=FILTER(C22,M);{低点}
T112:=BACKSET(ISLASTBAR,BARSLAST(D22)+1); U112:=T112>REF(T112,1);
DRAWLINE(D22,L,U112,L,1),COLORRED;
VAR1111:=BACKSET(REF(HIGH,2)=HHV(HIGH,5),3);
VAR2222:=CROSS(VAR1111,0.9);
VAR3333:=BACKSET(REF(LOW,2)=LLV(LOW,5),3);
VAR4444:=CROSS(VAR3333,0.9);
压力:= REF(HIGH,BARSLAST(VAR2222));
STICKLINE(CLOSE,REF(HIGH,BARSLAST(VAR2222)),REF(HIGH,BARSLAST(VAR2222)),0.5,1),COLOREA91B5,LINETHICK3;
支撑:= REF(LOW,BARSLAST(VAR4444));
STICKLINE(CLOSE,REF(LOW,BARSLAST(VAR4444)),REF(LOW,BARSLAST(VAR4444)),0.5,1),COLOR00B4FF,LINETHICK3;
下档线:=(((CLOSE - LLV(LOW,13)) / (HHV(HIGH,13) - LLV(LOW,13))) * 100);
RRRSV:=SMA(下档线,3,1);
KKK:=SMA(RRRSV,3,1);
DDD:=((3 * RRRSV) - (2 * KKK));
JJ12:=(((CLOSE - LLV(LOW,55)) / (HHV(HIGH,55) - LLV(LOW,55))) * 100);
RSV24:=SMA(JJ12,3,1);
K24:=SMA(RSV24,3,1);
D24:=((3 * RSV24) - (2 * K24));
压力2:=IF(CROSS(D24,DDD),HIGH,REF(HIGH,BARSLAST(CROSS(D24,DDD)))),COLORFFFFFF;
底部:=LLV(HIGH,30),COLOR00FF00;
DRAWICON(L<=支撑 AND H>支撑,L,0);
DRAWICON(H>=压力 AND L<压力,H,0);
DRAWICON(CROSS(快线,慢线),L*0.95,5);
DRAWICON(CROSS(慢线,快线),H*1.05,6);
三。副图指标

1。黄金坑
DIFF:=EMA(CLOSE,SHORT)-EMA(CLOSE,LONG);
DEA:=EMA(DIFF,M);
MACD2:=2*(DIFF-DEA);
(CLOSE<0 AND CROSS(DIFF,0),H*1.3),COLOR000080,NODRAW;
(CLOSE<0 AND CROSS(MACD2,0),H*1.3),COLOR000080,NODRAW;
(CLOSE<0 AND CROSS(0,DIFF),H*1.3),COLOR808080,NODRAW;
(CLOSE<0 AND CROSS(0,MACD2),H*1.3),COLOR808080,NODRAW;
DU0:=CROSS(DIFF,0);
UD0:=CROSS(0,DIFF);
TDU0:=BARSLAST(DU0);
TUD0:=BARSLAST(UD0);
DU3:=REF(DU0,1);
UD3:=REF(UD0,1);
TDU3:=BARSLAST(DU3);
TUD3:=BARSLAST(UD3);
UDGLINE:=IF(TDU3<TUD3,REF(HHV(HIGH,2),TDU3),REF(LLV(LOW,2),TUD3));
JDU0:=REF(CLOSE,1)<=REF(UDGLINE,1) AND CLOSE>UDGLINE AND TDU0<TUD0;
JUD0:=REF(CLOSE,1)>=REF(UDGLINE,1) AND CLOSE<UDGLINE AND TUD0<TDU0;
JDU1:=JDU0 AND COUNT(JDU0,TDU0)=1;
JUD1:=JUD0 AND COUNT(JUD0,TUD0)=1;
JDU2:=JDU1 AND REF(BARSLAST(JUD1),1)<REF(BARSLAST(JDU1),1);
JUD2:=JUD1 AND REF(BARSLAST(JUD1),1)>REF(BARSLAST(JDU1),1);
JDU3:=JDU1 AND REF(BARSLAST(JUD1),1)>REF(BARSLAST(JDU1),1);
JUD3:=JUD1 AND REF(BARSLAST(JUD1),1)<REF(BARSLAST(JDU1),1);
BSLINE:=IF(BARSLAST(JDU2)<BARSLAST(JUD2),IF(REF(CROSS(0,MACD2),1),LLV(LOW,2),REF(LLV(LOW,2),BARSLAST(REF(CROSS
(0,MACD2),1)))),IF(REF(CROSS(MACD2,0),1),HHV(HIGH,2),REF(HHV(HIGH,2),BARSLAST(REF(CROSS(MACD2,0),1)))));
STICKLINE(MACD2>=0,0,MACD2,2,1),COLOR0000FF;
STICKLINE(MACD2>=0 AND MACD2<REF(MACD2,1),0,MACD2,2,0),COLOR0000FF;
STICKLINE(MACD2<0,0,MACD2,2,0),COLORFFFF00;
STICKLINE(MACD2<0 AND MACD2>REF(MACD2,1),0,MACD2,2,1),COLORFFFF00;
DIF:DIFF,LINETHICK2,COLOR0000FF;
MACD:DEA,COLORFF0000;
DEF:MACD2,LINETHICK0,COLORFFFF00;
STICKLINE(CLOSE>0,0,0,2,0),COLOR808080;
DEFUT:=BARSLAST(CROSS(MACD2,0));
DEFDT:=BARSLAST(CROSS(0,MACD2));
DEFUL:=IF(MACD2>=0,HHV(MACD2,DEFUT+1),REF(HHV(MACD2,DEFUT+1),DEFDT+1));
DEFDL:=IF(MACD2<0,LLV(MACD2,DEFDT+1),REF(LLV(MACD2,DEFDT+1),DEFUT+1));
DEFU2L:=REF(DEFUL,DEFUT+1);
DEFD2L:=REF(DEFDL,DEFDT+1);
DRAWICON(LLV(MACD2,4)>0 AND MACD2<REF(MACD2,1) AND REF(MACD2,1)>REF(MACD2,2) AND REF(MACD2,2)>REF(MACD2,3),MACD2,2);
DRAWICON(HHV(MACD2,4)<0 AND MACD2>REF(MACD2,1) AND REF(MACD2,1)<REF(MACD2,2) AND REF(MACD2,2)<REF(MACD2,3),MACD2,1);
DRAWICON((JUD1 OR BARSLAST(JDU1)>BARSLAST(JUD1)) AND MACD2>=0 AND REF(MACD2,1)<REF(DEFU2L,1) AND MACD2>DEFU2L,MACD2,5);
DRAWICON((JDU1 OR BARSLAST(JDU1)<BARSLAST(JUD1)) AND MACD2<0 AND REF(MACD2,1)>REF(DEFD2L,1) AND MACD2<DEFD2L,MACD2,3);
VAR111:=JDU1 OR BARSLAST(JDU1)<BARSLAST(JUD1);
VAR112:=HHV(MACD2,4)<0 AND MACD2>REF(MACD2,1) AND REF(MACD2,1)<REF(MACD2,2) AND REF(MACD2,2)<REF(MACD2,3);
2.资金流向
DIFF:=EMA(CLOSE,SHORT)-EMA(CLOSE,LONG);
DEA:=EMA(DIFF,M);
MACD2:=2*(DIFF-DEA);
(CLOSE<0 AND CROSS(DIFF,0),H*1.3),COLOR000080,NODRAW;
(CLOSE<0 AND CROSS(MACD2,0),H*1.3),COLOR000080,NODRAW;
(CLOSE<0 AND CROSS(0,DIFF),H*1.3),COLOR808080,NODRAW;
(CLOSE<0 AND CROSS(0,MACD2),H*1.3),COLOR808080,NODRAW;
DU0:=CROSS(DIFF,0);
UD0:=CROSS(0,DIFF);
TDU0:=BARSLAST(DU0);
TUD0:=BARSLAST(UD0);
DU3:=REF(DU0,1);
UD3:=REF(UD0,1);
TDU3:=BARSLAST(DU3);
TUD3:=BARSLAST(UD3);
UDGLINE:=IF(TDU3<TUD3,REF(HHV(HIGH,2),TDU3),REF(LLV(LOW,2),TUD3));
JDU0:=REF(CLOSE,1)<=REF(UDGLINE,1) AND CLOSE>UDGLINE AND TDU0<TUD0;
JUD0:=REF(CLOSE,1)>=REF(UDGLINE,1) AND CLOSE<UDGLINE AND TUD0<TDU0;
JDU1:=JDU0 AND COUNT(JDU0,TDU0)=1;
JUD1:=JUD0 AND COUNT(JUD0,TUD0)=1;
JDU2:=JDU1 AND REF(BARSLAST(JUD1),1)<REF(BARSLAST(JDU1),1);
JUD2:=JUD1 AND REF(BARSLAST(JUD1),1)>REF(BARSLAST(JDU1),1);
JDU3:=JDU1 AND REF(BARSLAST(JUD1),1)>REF(BARSLAST(JDU1),1);
JUD3:=JUD1 AND REF(BARSLAST(JUD1),1)<REF(BARSLAST(JDU1),1);
BSLINE:=IF(BARSLAST(JDU2)<BARSLAST(JUD2),IF(REF(CROSS(0,MACD2),1),LLV(LOW,2),REF(LLV(LOW,2),BARSLAST(REF(CROSS
(0,MACD2),1)))),IF(REF(CROSS(MACD2,0),1),HHV(HIGH,2),REF(HHV(HIGH,2),BARSLAST(REF(CROSS(MACD2,0),1)))));
STICKLINE(MACD2>=0,0,MACD2,2,1),COLOR0000FF;
STICKLINE(MACD2>=0 AND MACD2<REF(MACD2,1),0,MACD2,2,0),COLOR0000FF;
STICKLINE(MACD2<0,0,MACD2,2,0),COLORFFFF00;
STICKLINE(MACD2<0 AND MACD2>REF(MACD2,1),0,MACD2,2,1),COLORFFFF00;
DIF:DIFF,LINETHICK2,COLOR0000FF;
MACD:DEA,COLORFF0000;
DEF:MACD2,LINETHICK0,COLORFFFF00;
STICKLINE(CLOSE>0,0,0,2,0),COLOR808080;
DEFUT:=BARSLAST(CROSS(MACD2,0));
DEFDT:=BARSLAST(CROSS(0,MACD2));
DEFUL:=IF(MACD2>=0,HHV(MACD2,DEFUT+1),REF(HHV(MACD2,DEFUT+1),DEFDT+1));
DEFDL:=IF(MACD2<0,LLV(MACD2,DEFDT+1),REF(LLV(MACD2,DEFDT+1),DEFUT+1));
DEFU2L:=REF(DEFUL,DEFUT+1);
DEFD2L:=REF(DEFDL,DEFDT+1);
DRAWICON(LLV(MACD2,4)>0 AND MACD2<REF(MACD2,1) AND REF(MACD2,1)>REF(MACD2,2) AND REF(MACD2,2)>REF(MACD2,3),MACD2,2);
DRAWICON(HHV(MACD2,4)<0 AND MACD2>REF(MACD2,1) AND REF(MACD2,1)<REF(MACD2,2) AND REF(MACD2,2)<REF(MACD2,3),MACD2,1);
DRAWICON((JUD1 OR BARSLAST(JDU1)>BARSLAST(JUD1)) AND MACD2>=0 AND REF(MACD2,1)<REF(DEFU2L,1) AND MACD2>DEFU2L,MACD2,5);
DRAWICON((JDU1 OR BARSLAST(JDU1)<BARSLAST(JUD1)) AND MACD2<0 AND REF(MACD2,1)>REF(DEFD2L,1) AND MACD2<DEFD2L,MACD2,3);
VAR111:=JDU1 OR BARSLAST(JDU1)<BARSLAST(JUD1);
VAR112:=HHV(MACD2,4)<0 AND MACD2>REF(MACD2,1) AND REF(MACD2,1)<REF(MACD2,2) AND REF(MACD2,2)<REF(MACD2,3);

3. 变色MACD
(1)
DIFIF1:=EMA(CLOSE,12) - EMA(CLOSE,26);
DEAEA1:=EMA(DIFIF1,9);
MACD1:=2*(DIFIF1-DEAEA1),STICK;
MACD2:=EMA(MACD1,3);
STICKLINE(MACD1>MACD2 AND MACD1>0,0,MACD1,1,0),COLORRED;
STICKLINE(MACD1>MACD2 AND MACD1<0,0,MACD1,1,0),COLORGREEN;
STICKLINE(MACD1<MACD2,0,MACD1,1,0),COLORCBCBC0;
STICKLINE(MACD1>=0 OR MACD1<=0,0,0,50,1),COLORWHITE;
DIFIF1,COLOR33FF33,LINETHICK2;
DEAEA1,COLORYELLOW,LINETHICK2;
MACD:MACD1,NODRAW,COLORMAGENTA;
强:IF(DIFIF1>=DEAEA1,DIFIF1,DRAWNULL),COLORRED,LINETHICK2;
弱:IF(DEAEA1>=DIFIF1,DEAEA1,DRAWNULL),COLORFF9900,LINETHICK2;
DRAWICON(CROSS(DIFIF1,DEAEA1),DIFIF1+0.1,1);
DRAWICON(CROSS(DEAEA1,DIFIF1),-0.5,2);
DRAWTEXT(CROSS(DIFIF1,DEAEA1),DIFIF1,'○'),LINETHICK2, COLORYELLOW;
(2)
DIFIF1:=EMA(CLOSE,12) - EMA(CLOSE,26);
DEAEA1:=EMA(DIFIF1,9);
MACD1:=2*(DIFIF1-DEAEA1),STICK;
MACD2:=EMA(MACD1,3);
STICKLINE(MACD1>MACD2 AND MACD1>0,0,MACD1,1,0),COLORRED;
STICKLINE(MACD1>MACD2 AND MACD1<0,0,MACD1,1,0),COLORGREEN;
STICKLINE(MACD1<MACD2,0,MACD1,1,0),COLORCBCBC0;
STICKLINE(MACD1>=0 OR MACD1<=0,0,0,50,1),COLORWHITE;
DIFIF1,COLOR33FF33,LINETHICK2;
DEAEA1,COLORYELLOW,LINETHICK2;
MACD:MACD1,NODRAW,COLORMAGENTA;
强:IF(DIFIF1>=DEAEA1,DIFIF1,DRAWNULL),COLORRED,LINETHICK2;
弱:IF(DEAEA1>=DIFIF1,DEAEA1,DRAWNULL),COLORFF9900,LINETHICK2;
DRAWICON(CROSS(DIFIF1,DEAEA1),DIFIF1+0.1,1);
DRAWICON(CROSS(DEAEA1,DIFIF1),-0.5,2);
DRAWTEXT(CROSS(DIFIF1,DEAEA1),DIFIF1,'○'),LINETHICK2, COLORYELLOW;

4. 至尊MACD
DIFF:EMA(DCLOSE,12)-EMA(DCLOSE,26);
DEA:EMA(DIFF,9),COLORFFFF00;
MACD:(DIFF-DEA)*2;
STICKLINE(MACD>=0 AND MACD>=REF(MACD,1),0,MACD,1,0),COLORRED;
STICKLINE(MACD>=0 AND MACD<=REF(MACD,1),0,MACD,1,0),COLORGREEN;
STICKLINE(MACD<=0 AND MACD>=REF(MACD,1),0,MACD,1,0),COLORFF00FF;
STICKLINE(MACD<=0 AND MACD<=REF(MACD,1),0,MACD,1,0),COLOR00FFFF;
多转空:=((((LLV(MACD,4)>0) AND (MACD<REF(MACD,1))) AND (REF(MACD,1)>REF(MACD,2))) AND (REF(MACD,2)>REF(MACD,3)));
空转多:=((((HHV(MACD,4)<0) AND (MACD>REF(MACD,1))) AND (REF(MACD,1)<REF(MACD,2))) AND (REF(MACD,2)<REF(MACD,3)));
DRAWICON(多转空,MACD,2);
DRAWICON(空转多,MACD,1);
低位金叉:=CROSS(DIFF,DEA) AND DIFF<-0.1;
DRAWTEXT(低位金叉,DEA,' 低位金叉'),COLORFF00FF;
JCCOUNT:=COUNT(CROSS(DIFF,DEA),BARSLAST(DEA>=0));
二次金叉:=CROSS(DIFF,DEA) AND DEA<0 AND COUNT(JCCOUNT=2,21)=1;
STICKLINE(二次金叉,0,0.2,2,0),COLORFF00FF;
DRAWTEXT(二次金叉,DEA*1.06,'二次金叉'),COLORRED;
A1:=BARSLAST(REF(CROSS(DIFF,DEA),1));
底背离:=REF(CLOSE,A1+1)>CLOSE AND DIFF>REF(DIFF,A1+1) AND CROSS(DIFF,DEA);
DRAWTEXT(底背离,-0.2-MACD,'底背离'),COLORWHITE;
A2:=BARSLAST(REF(CROSS(DEA,DIFF),1));
顶背离:=REF(CLOSE,A2+1)<CLOSE AND REF(DIFF,A2+1)>DIFF AND CROSS(DEA,DIFF);
DRAWTEXT(顶背离,0.2+MACD,'顶背离'),COLORWHITE;

posted @ 2013-12-08 21:25 ZT文萃 阅读(407) | 评论 (0)编辑 收藏

----start

    有点SQL基础的人都会写INSERT语句,可是有很大一部分人不知道DB2的INSERT语句有三种格式,即:一次插入一行,一次插入多行和从SELECT语句中插入。考虑下面的情况:

 
  1. CREATE TABLE USER  
  2. (  
  3. NAME VARCHAR(20) NOT NULL,---姓名  
  4. BIRTHDAY DATE---生日  
  5. );  

 

 

现在要求你插入一行数据,我们这么写:

 
  1. INSERT INTO USER (NAME,BIRTHDAY) VALUES ('张三','2000-1-1');  

 

 

现在要求你插入三行数据,我们这么写:

 
  1. INSERT INTO USER (NAME,BIRTHDAY) VALUES ('张三','2000-1-1');  
  2. INSERT INTO USER (NAME,BIRTHDAY) VALUES ('李四','2000-1-1');  
  3. INSERT INTO USER (NAME,BIRTHDAY) VALUES ('王五','2000-1-1');  

 

 

除此之外,我们还可以这么写:

 
  1. INSERT INTO USER (NAME,BIRTHDAY) VALUES  
  2. ('张三','2000-1-1'),  
  3. ('李四','2000-1-1'),  
  4. ('王五','2000-1-1');  

 

 

那么后一种写法有什么好处呢?有两点好处:

1、性能更好。

2、由于一条语句,所以它们是一个处理单元,要么都插入,要么都不插入。

 

除此之外,我们还可以从SELECT中插入,格式如下:

 
  1. INSERT INTO USER (NAME,BIRTHDAY)   
  2. SELECT <COLUMN1>,<COLUMN2> FROM <TABLE_NAME> WHERE ...  

 

 

以上比较简单,我就不举例子了。

 

---更多参见:DB2 SQL 精萃

----声明:转载请注明出处。

----last updated on 2009.11.5

----written by ShangBo on 2009.9.24

----end

posted @ 2013-11-29 21:22 ZT文萃 阅读(139) | 评论 (0)编辑 收藏

ALTER TABLE TBNAME ADD COLUMN COLUMNNAME COLUMNTYPE COLUMNDEFAULTVALUE VALUE;
EG:

ALTER TABLE CIBCMS. T_TOL_CUST_VALIDADDR ADD COLUMN NVIPCORE_CFM_CNT BIGINT DEFAULT 0;

给表添加说明:

COMMENT ON COLUMN CIBCMS.T_TOL_CUST_VALIDADDR.NVIPCORE_CFM_CNT IS '已确认非VIP核心客户数量'


ALTER TABLE TBNAME DROPE COLUMN COLUMNNAME;

posted @ 2013-11-29 21:21 ZT文萃 阅读(251) | 评论 (0)编辑 收藏

1、如何向表中添加字段
alter table 表名 add 字段名 数据类型 default 默认值
说明:数据类型如,varchar(50)
alter table BANK_SOKECT_INFO ADD COLUMN DEPTNO  varchar(8);

2、如何删除表中字段
ALTER table 表名 DROP column 字段名

3、ALTER TABLE — 更改表属性
语法
ALTER TABLE table [ * ]
   ADD [ COLUMN ] column type
ALTER TABLE table [ * ]
   ALTER [ COLUMN ] column { SET DEFAULT value | DROP DEFAULT }
ALTER TABLE table [ * ]
   RENAME [ COLUMN ] column TO newcolumn
ALTER TABLE table
   RENAME TO newtable
ALTER TABLE table
   ADD table constraint definition
Inputs
table
试图更改的现存表的名称.
column
现存或新的列名称.
type
新列的类型.
newcolumn
现存列的新名称.
newtable
表的新名称.
table constraint definition
表的新的约束定义. New table constraint for the table输出
ALTER
从被更名的列或表返回的信息.
ERROR
如果一个列或表不存在返回的信息.
描述
ALTER TABLE 变更一个现存表的定义.ADD COLUMN 形式用与 CREATE TABLE一样的语法向表中增加一

个新列/字段。ALTER COLUMN 形式允许你从列/字段中设置或者删除缺省(值)。注意缺省(值)只

对新插入的行有效。RENAME 子句可以在不影响相关表中任何数据的情况下更改一个表或者列/字段的

名称。因此,表或列/字段在此命令执行后仍将是相同尺寸和类型。ADD table constraint

definition 子句用与 CREATE TABLE一样的语法向表中增加一个新的约束。


4、对现存列改名:
ALTER TABLE distributors RENAME COLUMN address TO city;
5、对现存表改名:
ALTER TABLE distributors RENAME TO suppliers;
向表中增加一个外键约束:
ALTER TABLE distributors ADD CONSTRAINT distfk FOREIGN KEY (address) REFERENCES

addresses(address) MATCH FULL

 

DB2取前十条记录:
DB2 => select istop from news where id =370 fetch first 10 rows only  DB2

修改字段长度:
alter table news alter AUTHOR set data type varchar(250)

DB2 => describe table news  DB2

posted @ 2013-11-29 21:20 ZT文萃 阅读(178) | 评论 (0)编辑 收藏

http://hi.baidu.com/hooplee/item/aabdcddde02515e2795daaae

当你想让文档的读者看到的是文档的最终状态,而不是充满了删除线、下划线和边上的批注框,又或是格式错乱,总显示已删除的内容的文档,那么就需要去掉word文档的标记(含修订和批注)。

注:为什么在“视图”——“标记”取消选中,保存后,下次打开还是出现同样问题?

因为你使用修订功能,那么其所作的修改会一直打开,所有插入的批注一直是文档的一部分,直到它们被接受或拒绝(对于批注来说是删除)为止。因此,这方法不能有效去掉word文档的标记。

要去掉文档中的标记(含修订和批注),就需要接受或拒绝更改,以及删除批注。我总结的方法如下:

情况一:文档已出现上述症状(文档充满了删除线、下划线和边上的批注框,又或是格式乱了,总显示已删除的内容,)

1, 在“视图”菜单上,指向“工具栏”,然后单击“审阅”(即打开审阅工具栏)。

2, 在“审阅”工具栏上,单击“显示”,然后选中下列项目:

批注

墨迹注释

插入和删除

正在格式化

审阅者(指向“审阅者”,然后确保选中了“所有审阅者”。)

3,

(1)如果接受所有的修订,单击“接受修订”旁边的小箭头,选中“接受对文档所做的所有修订”

(2)如果您知道要拒绝所有更改,则单击“拒绝修订/删 除批注”旁边的箭头,然后单击“拒绝对文档所做的所有修订”。要除去所有批注,您必须删除它们。单击“拒绝修订/删除批注”旁边的箭头,然后单击“删除文 档中的所有批注”。

(3) 如果你需要确认每一处修订:

A. 在“审阅”工具栏上,单击“后一处修订或批注”从一处修订或批注前进到下处

B. 在“审阅”工具栏上,对每处修订或批注单击“接受修订”或“拒绝修订/删除批注”。

4, 保存文档。

情况二:希望以后不要出现类似问题,即不需要记录我对文档的修改过程。

1, 在“工具”菜单中,取消选择“修订”,此步骤也可以通过快捷健实现:shift+ctrl+E。

2, 在“工具”菜单中,点开“选项”,在“安全性”页面,“隐私选项”中,取消选择“打开或保存时标记可见”,选择“确定”,保存修改。

说明:本文的方法基于本人使用word的积累,不承担因按此操作出现问题的责任,欢迎指正。

posted @ 2013-11-28 14:11 ZT文萃 阅读(260) | 评论 (0)编辑 收藏

http://news.cnfol.com/131125/101,1587,16468268,00.shtml

我为什么从网易离职?

  知乎是个好网站,但我不喜欢它的评论,关闭评论又很没意思,因此把答案写在自己博客里。

  首先,网易是一家好公司,直至现在,我对它仍有感激之情。我在网易待了5年多,最后3年在杭州研究院带相册产品部。“博客、相册、印象派”,那时是杭研在游戏之外的三条产品线,三个部门都挺不容易的。

  网易相册在2006-2008曾经盛极一时,我接手的2009年已经走上了下坡路。全世界的独立相册都在走下坡路。时势变迁,相片的社交价值和媒体价 值压倒性地超过了存储价值,既然有博客相册与空间相册,多少人还需要一个独立相册呢?我发起的几次改版只能延缓下滑,却无法扭转这趋势。

  重新提升相册的数据,也并非不可能。可以加强原图备份,提供更大的免费空间容量——在丁老板那关想都不要想,网易云存储的早夭就是前车之鉴。也可以加强产品设计感,吸引对展示效果敏感的视觉系用户,然而掂量了一下UED配给的视觉资源,就死了这条心。

  其实,我很能理解公司的政策与资源不向相册倾斜。相片存储与流量开销大,用户活跃度低,付费意愿近乎于零,怎么看都是笔赔钱买卖。但作为相册部门负责人,我不甘心坐冷板凳啊,在相册之外又折腾了三个项目。首先是网易摄影。

  摄影社区是我从零创建的项目,当初在偏媒体与偏社区之间摇摆过一阵子,心想社区的发展空间大,就向社区转过去——这是个巨大的坑。门户推广位虽然能带 来流量,用户成分却极杂乱,极难建立统一的价值观与积极的互动氛围,也就做不大社区。当我意识到这一点的时候已经晚了,不上不下,产品并不差但也别想红。

  然后做了为婚纱写真交易定制的类淘宝平台“爱拍”,被野心冲昏头脑,进入一个我完全不熟悉的O2O市场,以惨败告终。门户精准导入目标消费者的成本高昂,推广上压根没法跟地方论坛竞争,产品体验方面的优势略等于空气。这也是我在网易最大的一次挫折。

  还有网易云相册,2011年第一次战App,包括“云存储”与“相片群”两个功能。云存储的口碑还不错,数据却做不大,用户需求不强烈。相片群则再次挫败,低频次的群分享情景很难建立使用习惯(这个领域前仆后继,不断有新应用发布以及仆街)。

  在这么多项目无功而返后,我完全不知道留在网易还能做什么。

  1、继续做相册?做什么,怎么做,脑子里一片空白。相册部门能争取到的设计资源匮乏,大多数时候就一个UI设计师,对应20多人的研发策划运营;运营资源也匮乏,除了四五个运营编制之外啥都没有。我就算有些想法也难以推动。

  2、搭上2011年的移动快车,尝试一些创新的移动项目?开玩笑,移动项目得在移动中心申请人员来开发,哪里申请得到,能维持云相册App都已经谢天谢地。相册自己虽然有十来个程序员,奈何公司不给配Mac,也不配Android测试机……怎么开发?开发个毛。

  3、那时美图秀秀已经很火了,这类相片处理应用的空间固然很大,我这个70后老男人却做不了90后女生用的产品,年龄代沟是个硬伤。

  4、丁老板跟我提过,愿不愿意加入到2011年新启动的云阅读项目里去,可惜我对云阅读没什么感觉,不是它的目标用户,无法感同身受。

  除此之外,别无出路。隔壁的博客部门一开始也觉得自己没出路,后来找到了lofter项目,终于缓了过来。我跟做lofter的哥们聊天,问他如果不 做lofter,整个网易的产品随你挑喜欢的,会选什么?想了半天,回答“没得选”。又问如果lofter没做好,你怎么办?想了半天,回答“不敢想”。

  由此可以看到大公司做产品的苦闷之处。是否能撞到一个有潜力又适合自己的项目,决定了你的命运——这件事情的随机性特别强,主要靠祖上积德。尤其在部 门定位的束缚下,我挣扎了三年,除了给自己涨点exp之外无可斩获。再说人多嘴杂效率低,磨平了产品的棱角,做出来的东西总是平平淡淡没个性,中庸罢了。

  再留下去,就真的是一个混子了。

  2012年初,辞职创业。我创业的动机很单纯,就是想出一款代表作,证明自己除了写好博客也能做好产品。一年后这个目标实现了,6个人做出来的蝉游记 是我在网易带30人团队也搞不掂的,我1个人全包策划交互QA的产出,反倒胜于以前带着5个策划整天开会讨论。总之,团队越小则效率越高,效果也越好。但 我另外设计的五款App就没得进展,全套PSD搁大半年了,实在挤不出时间来研发,而我对其中两款个性之作的得意并不输给蝉游记……这算是创业的另一面 吧。

  唉,有时候会怀疑自己做产品经理是个错误。攥着厚厚一摞没能研发上线的原型,PSD,像妄想家堂吉诃德。

  回顾在网易做产品的三年半,从入门到熟练,成长中确实做了很多蠢事,但即便时光穿梭,以现在的经验与技能再回去打一遍,也不会有什么大动静——我能选 择的项目没一个“有得打”。在互联网行业,选项目是决定性的,其次是配资源,再次才是个人的才能施展。网易内部已有的几个好项目,团队不大,我过去只能 “从总监到策划”,接受不了。重新发起新项目的话,上级最关心的是能画多大饼,否则立项就很困难。团队士气也很低落,都盯着你,嗷嗷待哺地等着你找到一个 好项目回来,可臣妾实在做不到啊。我想做的旅行项目几乎不可能立项,就算立项也不可能为它攒够量身定制的UI/运营/移动研发等配套资源,旧瓶装新酒是没 法玩转的。

  所以在当时的相册部门环境下,我什么都做不了,每天茫然地上班,茫然地下班,人生短暂,我性子又急,没耐心继续等待与寻找适合自己的好项目,这就是为 什么从网易离职的原因。离开差不多两年了,也没看见网易新发起哪个让我有得打的项目(别跟我说易信),所以一点都不后悔辞职。再坐两年冷板凳,痔疮都要扩 散到全身了,而创业固然艰难,至少是为自己认同的产品而战,是老去以后也会怀念的一段经历。

posted @ 2013-11-25 18:30 ZT文萃 阅读(209) | 评论 (0)编辑 收藏

http://blog.csdn.net/chenyanbo/article/details/6866941


xml读取异常Invalid byte 1 of 1-byte UTF-8 sequence


说简单点当你解析别人的xml格式出现这个错误可能就是别人在生成xml时没有保存为utf-8的字符编码格式。

在中文版的window下java的默认的编码为GBK,也就是所虽然我们标识了要将xml保存为utf-8格式但实际上文件是以GBK格式来保存的,所以这也就是为什么能够我们使用GBK、GB2312编码来生成xml文件能正确的被解析,而以UTF-8格式生成的文件不能被xml解析器所解析的原因。


xml解析时遇到的编码异常:

  1. org.dom4j.DocumentException: Invalid byte 1 of 1-byte UTF-8 sequence. Nested exception: Invalid byte 1 of 1-byte UTF-8 sequence.  
  2.     at org.dom4j.io.SAXReader.read(SAXReader.java:484)  
  3.     at org.dom4j.io.SAXReader.read(SAXReader.java:321)  
  4.     at com.dataoperate.PaseXml.pXml(PaseXml.java:28)  
  5.     at com.dataoperate.JdbcOp.insertDb(JdbcOp.java:30)  
  6.     at com.dataoperate.JdbcOp.main(JdbcOp.java:89)  
  7. Nested exception:   
  8. com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException: Invalid byte 1 of 1-byte UTF-8 sequence.  
  9.     at com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.invalidByte(UTF8Reader.java:684)  
  10.     at com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.read(UTF8Reader.java:554)  
  11.     at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.load(XMLEntityScanner.java:1742)  
  12.     at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.peekChar(XMLEntityScanner.java:487)  
  13.     at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2687)  
  14.     at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:648)  
  15.     at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:140)  
  16.     at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:511)  
  17.     at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:808)  
  18.     at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737)  
  19.     at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:119)  
  20.     at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1205)  
  21.     at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:522)  
  22.     at org.dom4j.io.SAXReader.read(SAXReader.java:465)  
  23.     at org.dom4j.io.SAXReader.read(SAXReader.java:321)  
  24.     at com.dataoperate.PaseXml.pXml(PaseXml.java:28)  
  25.     at com.dataoperate.JdbcOp.insertDb(JdbcOp.java:30)  
  26.     at com.dataoperate.JdbcOp.main(JdbcOp.java:89)  
  27. Nested exception: com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException: Invalid byte 1 of 1-byte UTF-8 sequence.  
  28.     at com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.invalidByte(UTF8Reader.java:684)  
  29.     at com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.read(UTF8Reader.java:554)  
  30.     at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.load(XMLEntityScanner.java:1742)  
  31.     at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.peekChar(XMLEntityScanner.java:487)  
  32.     at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2687)  
  33.     at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:648)  
  34.     at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:140)  
  35.     at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:511)  
  36.     at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:808)  
  37.     at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737)  
  38.     at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:119)  
  39.     at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1205)  
  40.     at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:522)  
  41.     at org.dom4j.io.SAXReader.read(SAXReader.java:465)  
  42.     at org.dom4j.io.SAXReader.read(SAXReader.java:321)  
  43.     at com.dataoperate.PaseXml.pXml(PaseXml.java:28)  
  44.     at com.dataoperate.JdbcOp.insertDb(JdbcOp.java:30)  
  45.     at com.dataoperate.JdbcOp.main(JdbcOp.java:89)  
解决:

1、最简单就是把<?xml version="1.0" encoding="UTF-8"?>改成<?xml version="1.0" encoding="gbk"?>

2、或者把xml打开另存的时候把字符集改为UTF-8后保存

3、在代码解析的时候先把xml重新写一遍

[javascript] view plaincopy
  1. SAXReader reader = new SAXReader();    
  2.  org.dom4j.Document document = reader.read("D:\\ha.xml");    
  3.  OutputFormat of = new OutputFormat();    
  4.  of.setEncoding("UTF-8"); //改变编码方式    
  5.  XMLWriter writer = new XMLWriter(new FileWriter "d:\\dom4j.xml"), of);    

4、直接dom4j读取的时候用io来读,修改字符编码

  1. FileInputStream in = new FileInputStream(new File(fileName));  
  2. Reader read = new InputStreamReader(in,"gbk");  
  3. Document document = reader.read(read);

posted @ 2013-11-25 16:52 ZT文萃 阅读(1146) | 评论 (0)编辑 收藏

来自:
http://www.cnblogs.com/macula/archive/2011/07/27/2118003.html

DOM4J

 

    与利用DOM、SAX、JAXP机制来解析xml相比,DOM4J 表现更优秀,具有性能优异、功能强大和极端易用使用的特点,只要懂得DOM基本概念,就可以通过dom4j的api文档来解析xml。dom4j是一套开 源的api。实际项目中,往往选择dom4j来作为解析xml的利器。

 

先来看看dom4j中对应XML的DOM树建立的继承关系

  

针对于XML标准定义,对应于图2-1列出的内容,dom4j提供了以下实现:

  

同时,dom4j的NodeType枚举实现了XML规范中定义的node类型。如此可以在遍历xml文档的时候通过常量来判断节点类型了。

 

常用API

 

class org.dom4j.io.SAXReader

 

  • read  提供多种读取xml文件的方式,返回一个Domcument对象

 

interface org.dom4j.Document

 

  • iterator  使用此法获取node
  • getRootElement  获取根节点

 

interface org.dom4j.Node

 

  • getName  获取node名字,例如获取根节点名称为bookstore
  • getNodeType  获取node类型常量值,例如获取到bookstore类型为1——Element
  • getNodeTypeName  获取node类型名称,例如获取到的bookstore类型名称为Element

 

interface org.dom4j.Element

 

  • attributes  返回该元素的属性列表
  • attributeValue  根据传入的属性名获取属性值
  • elementIterator  返回包含子元素的迭代器
  • elements  返回包含子元素的列表

 

interface org.dom4j.Attribute

 

  • getName  获取属性名
  • getValue  获取属性值

 

interface org.dom4j.Text

 

  • getText  获取Text节点值

 

interface org.dom4j.CDATA

 

  • getText  获取CDATA Section值

 

interface org.dom4j.Comment

 

  • getText  获取注释 

 

 

实例一:

复制代码
  1 //先加入dom4j.jar包    2 import java.util.HashMap;   3 import java.util.Iterator;   4 import java.util.Map;   5    6 import org.dom4j.Document;   7 import org.dom4j.DocumentException;   8 import org.dom4j.DocumentHelper;   9 import org.dom4j.Element;  10   11 /**     12 * @Title: TestDom4j.java  13 * @Package   14 * @Description: 解析xml字符串  15 * @author 无处不在  16 * @date 2012-11-20 下午05:14:05  17 * @version V1.0     18 */  19 public class TestDom4j {  20   21     public void readStringXml(String xml) {  22         Document doc = null;  23         try {  24   25             // 读取并解析XML文档  26             // SAXReader就是一个管道,用一个流的方式,把xml文件读出来  27             //   28             // SAXReader reader = new SAXReader(); //User.hbm.xml表示你要解析的xml文档  29             // Document document = reader.read(new File("User.hbm.xml"));  30             // 下面的是通过解析xml字符串的  31             doc = DocumentHelper.parseText(xml); // 将字符串转为XML  32   33             Element rootElt = doc.getRootElement(); // 获取根节点  34             System.out.println("根节点:" + rootElt.getName()); // 拿到根节点的名称  35   36             Iterator iter = rootElt.elementIterator("head"); // 获取根节点下的子节点head  37   38             // 遍历head节点  39             while (iter.hasNext()) {  40   41                 Element recordEle = (Element) iter.next();  42                 String title = recordEle.elementTextTrim("title"); // 拿到head节点下的子节点title值  43                 System.out.println("title:" + title);  44   45                 Iterator iters = recordEle.elementIterator("script"); // 获取子节点head下的子节点script  46   47                 // 遍历Header节点下的Response节点  48                 while (iters.hasNext()) {  49   50                     Element itemEle = (Element) iters.next();  51   52                     String username = itemEle.elementTextTrim("username"); // 拿到head下的子节点script下的字节点username的值  53                     String password = itemEle.elementTextTrim("password");  54   55                     System.out.println("username:" + username);  56                     System.out.println("password:" + password);  57                 }  58             }  59             Iterator iterss = rootElt.elementIterator("body"); ///获取根节点下的子节点body  60             // 遍历body节点  61             while (iterss.hasNext()) {  62   63                 Element recordEless = (Element) iterss.next();  64                 String result = recordEless.elementTextTrim("result"); // 拿到body节点下的子节点result值  65                 System.out.println("result:" + result);  66   67                 Iterator itersElIterator = recordEless.elementIterator("form"); // 获取子节点body下的子节点form  68                 // 遍历Header节点下的Response节点  69                 while (itersElIterator.hasNext()) {  70   71                     Element itemEle = (Element) itersElIterator.next();  72   73                     String banlce = itemEle.elementTextTrim("banlce"); // 拿到body下的子节点form下的字节点banlce的值  74                     String subID = itemEle.elementTextTrim("subID");  75   76                     System.out.println("banlce:" + banlce);  77                     System.out.println("subID:" + subID);  78                 }  79             }  80         } catch (DocumentException e) {  81             e.printStackTrace();  82   83         } catch (Exception e) {  84             e.printStackTrace();  85   86         }  87     }  88   89     /**  90      * @description 将xml字符串转换成map  91      * @param xml  92      * @return Map  93      */  94     public static Map readStringXmlOut(String xml) {  95         Map map = new HashMap();  96         Document doc = null;  97         try {  98             // 将字符串转为XML  99             doc = DocumentHelper.parseText(xml);  100             // 获取根节点 101             Element rootElt = doc.getRootElement();  102             // 拿到根节点的名称 103             System.out.println("根节点:" + rootElt.getName());  104  105             // 获取根节点下的子节点head 106             Iterator iter = rootElt.elementIterator("head");  107             // 遍历head节点 108             while (iter.hasNext()) { 109  110                 Element recordEle = (Element) iter.next(); 111                 // 拿到head节点下的子节点title值 112                 String title = recordEle.elementTextTrim("title");  113                 System.out.println("title:" + title); 114                 map.put("title", title); 115                 // 获取子节点head下的子节点script 116                 Iterator iters = recordEle.elementIterator("script");  117                 // 遍历Header节点下的Response节点 118                 while (iters.hasNext()) { 119                     Element itemEle = (Element) iters.next(); 120                     // 拿到head下的子节点script下的字节点username的值 121                     String username = itemEle.elementTextTrim("username");  122                     String password = itemEle.elementTextTrim("password"); 123  124                     System.out.println("username:" + username); 125                     System.out.println("password:" + password); 126                     map.put("username", username); 127                     map.put("password", password); 128                 } 129             } 130  131             //获取根节点下的子节点body 132             Iterator iterss = rootElt.elementIterator("body");  133             // 遍历body节点 134             while (iterss.hasNext()) { 135                 Element recordEless = (Element) iterss.next(); 136                 // 拿到body节点下的子节点result值 137                 String result = recordEless.elementTextTrim("result");  138                 System.out.println("result:" + result); 139                 // 获取子节点body下的子节点form 140                 Iterator itersElIterator = recordEless.elementIterator("form");  141                 // 遍历Header节点下的Response节点 142                 while (itersElIterator.hasNext()) { 143                     Element itemEle = (Element) itersElIterator.next(); 144                     // 拿到body下的子节点form下的字节点banlce的值 145                     String banlce = itemEle.elementTextTrim("banlce");  146                     String subID = itemEle.elementTextTrim("subID"); 147  148                     System.out.println("banlce:" + banlce); 149                     System.out.println("subID:" + subID); 150                     map.put("result", result); 151                     map.put("banlce", banlce); 152                     map.put("subID", subID); 153                 } 154             } 155         } catch (DocumentException e) { 156             e.printStackTrace(); 157         } catch (Exception e) { 158             e.printStackTrace(); 159         } 160         return map; 161     } 162  163     public static void main(String[] args) { 164  165         // 下面是需要解析的xml字符串例子 166         String xmlString = "<html>" + "<head>" + "<title>dom4j解析一个例子</title>" 167                 + "<script>" + "<username>yangrong</username>" 168                 + "<password>123456</password>" + "</script>" + "</head>" 169                 + "<body>" + "<result>0</result>" + "<form>" 170                 + "<banlce>1000</banlce>" + "<subID>36242519880716</subID>" 171                 + "</form>" + "</body>" + "</html>"; 172  173         /* 174          * Test2 test = new Test2(); test.readStringXml(xmlString); 175          */ 176         Map map = readStringXmlOut(xmlString); 177         Iterator iters = map.keySet().iterator(); 178         while (iters.hasNext()) { 179             String key = iters.next().toString(); // 拿到键 180             String val = map.get(key).toString(); // 拿到值 181             System.out.println(key + "=" + val); 182         } 183     } 184  185 }
复制代码

  

实例二:

复制代码
 1 /**  2  * 解析包含有DB连接信息的XML文件  3  * 格式必须符合如下规范:  4  * 1. 最多三级,每级的node名称自定义;  5  * 2. 二级节点支持节点属性,属性将被视作子节点;  6  * 3. CDATA必须包含在节点中,不能单独出现。  7  *  8  * 示例1——三级显示:  9  * <db-connections> 10  *         <connection> 11  *            <name>DBTest</name> 12  *            <jndi></jndi> 13  *            <url> 14  *                <![CDATA[jdbc:mysql://localhost:3306/db_test?useUnicode=true&characterEncoding=UTF8]]> 15  *             </url> 16  *            <driver>org.gjt.mm.mysql.Driver</driver> 17  *             <user>test</user> 18  *            <password>test2012</password> 19  *            <max-active>10</max-active> 20  *            <max-idle>10</max-idle> 21  *            <min-idle>2</min-idle> 22  *            <max-wait>10</max-wait> 23  *            <validation-query>SELECT 1+1</validation-query> 24  *         </connection> 25  * </db-connections> 26  * 27  * 示例2——节点属性: 28  * <bookstore> 29  *         <book category="cooking"> 30  *            <title lang="en">Everyday Italian</title> 31  *            <author>Giada De Laurentiis</author> 32  *            <year>2005</year> 33  *            <price>30.00</price> 34  *         </book> 35  * 36  *         <book category="children" title="Harry Potter" author="J K. Rowling" year="2005" price="$29.9"/> 37  * </bookstore> 38  * 39  * @param configFile 40  * @return 41  * @throws Exception 42  */ 43 public static List<Map<String, String>> parseDBXML(String configFile) throws Exception { 44     List<Map<String, String>> dbConnections = new ArrayList<Map<String, String>>(); 45     InputStream is = Parser.class.getResourceAsStream(configFile); 46     SAXReader saxReader = new SAXReader(); 47     Document document = saxReader.read(is); 48     Element connections = document.getRootElement(); 49  50     Iterator<Element> rootIter = connections.elementIterator(); 51     while (rootIter.hasNext()) { 52         Element connection = rootIter.next(); 53         Iterator<Element> childIter = connection.elementIterator(); 54         Map<String, String> connectionInfo = new HashMap<String, String>(); 55         List<Attribute> attributes = connection.attributes(); 56         for (int i = 0; i < attributes.size(); ++i) { // 添加节点属性 57             connectionInfo.put(attributes.get(i).getName(), attributes.get(i).getValue()); 58         } 59         while (childIter.hasNext()) { // 添加子节点 60             Element attr = childIter.next(); 61             connectionInfo.put(attr.getName().trim(), attr.getText().trim()); 62         } 63         dbConnections.add(connectionInfo); 64     } 65  66     return dbConnections; 67 }

posted @ 2013-11-22 21:00 ZT文萃 阅读(240) | 评论 (0)编辑 收藏

转自:http://txy920.blog.163.com/blog/static/1494427820095922212262/

关键字:dom4j xpath

  1. 获取Document
    • SAXReader saxReader = new SAXReader();
    • Document document = saxReader.read(FileUtil.getFileInputStream(fileName));
  2. 查询Element
    • String xpath ="/composites/composite[@type='onDelete']";//查询属性type='ondDelete'的composite
    • List<Element> composites = document.selectNodes(xpath);
  3. xpath语法

选取节点

XPath 使用路径表达式在 XML 文档中选取节点。节点是通过沿着路径或者 step 来选取的。

下面列出了最有用的路径表达式:

表达式 描述
nodename 选取此节点的所有子节点
/ 从根节点选取
// 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置
. 选取当前节点
.. 选取当前节点的父节点
@ 选取属性

实例

在下面的表格中,我们已列出了一些路径表达式以及表达式的结果:

路径表达式 结果
bookstore 选取 bookstore 元素的所有子节点
/bookstore

选取根元素 bookstore

注释:假如路径起始于正斜杠( / ),则此路径始终代表到某元素的绝对路径!

bookstore/book 选取所有属于 bookstore 的子元素的 book 元素。
//book 选取所有 book 子元素,而不管它们在文档中的位置。
bookstore//book 选择所有属于 bookstore 元素的后代的 book 元素,而不管它们位于 bookstore 之下的什么位置。
//@lang 选取所有名为 lang 的属性。

谓语(Predicates)

谓语用来查找某个特定的节点或者包含某个指定的值的节点。

谓语被嵌在方括号中。

实例

在下面的表格中,我们列出了带有谓语的一些路径表达式,以及表达式的结果:

路径表达式 结果
/bookstore/book[1] 选取属于 bookstore 子元素的第一个 book 元素。
/bookstore/book[last()] 选取属于 bookstore 子元素的最后一个 book 元素。
/bookstore/book[last()-1] 选取属于 bookstore 子元素的倒数第二个 book 元素。
/bookstore/book[position()<3] 选取最前面的两个属于 bookstore 元素的子元素的 book 元素。
//title[@lang] 选取所有拥有名为 lang 的属性的 title 元素。
//title[@lang='eng'] 选取所有 title 元素,且这些元素拥有值为 eng 的 lang 属性。
/bookstore/book[price>35.00] 选取所有 bookstore 元素的 book 元素,且其中的 price 元素的值须大于 35.00。
/bookstore/book[price>35.00]/title 选取所有 bookstore 元素中的 book 元素的 title 元素,且其中的 price 元素的值须大于 35.00。

选取未知节点

XPath 通配符可用来选取未知的 XML 元素。

通配符 描述
* 匹配任何元素节点
@* 匹配任何属性节点
node() 匹配任何类型的节点

实例

在下面的表格中,我们列出了一些路径表达式,以及这些表达式的结果:

路径表达式 结果
/bookstore/* 选取 bookstore 元素的所有子节点
//* 选取文档中的所有元素
//title[@*] 选取所有带有属性的 title 元素。

选取若干路径

通过在路径表达式中使用“|”运算符,您可以选取若干个路径。

实例

在下面的表格中,我们列出了一些路径表达式,以及这些表达式的结果:

路径表达式 结果
//book/title | //book/price 选取所有 book 元素的 title 和 price 元素。
//title | //price 选取所有文档中的 title 和 price 元素。
/bookstore/book/title | //price 选取所有属于 bookstore 元素的 book 元素的 title 元素,以及文档中所有的 price 元素。


XPath 轴

轴可定义某个相对于当前节点的节点集。

轴名称 结果
ancestor 选取当前节点的所有先辈(父、祖父等)
ancestor-or-self 选取当前节点的所有先辈(父、祖父等)以及当前节点本身
attribute 选取当前节点的所有属性
child 选取当前节点的所有子元素。
descendant 选取当前节点的所有后代元素(子、孙等)。
descendant-or-self 选取当前节点的所有后代元素(子、孙等)以及当前节点本身。
following 选取文档中当前节点的结束标签之后的所有节点。
namespace 选取当前节点的所有命名空间节点
parent 选取当前节点的父节点。
preceding 选取文档中当前节点的开始标签之前的所有节点。
preceding-sibling 选取当前节点之前的所有同级节点。
self 选取当前节点。

位置路径表达式

位置路径可以是绝对的,也可以是相对的。

绝对路径起始于正斜杠( / ),而相对路径不会这样。在两种情况中,位置路径均包括一个或多个步,每个步均被斜杠分割:

绝对位置路径:

/step/step/...

相对位置路径:

step/step/...

每个步均根据当前节点集之中的节点来进行计算。

步(step)包括:

轴(axis)
定义所选节点与当前节点之间的树关系
节点测试(node-test)
识别某个轴内部的节点
零个或者更多谓语(predicate)
更深入地提炼所选的节点集

步的语法:

轴名称::节点测试[谓语]

实例

例子 结果
child::book 选取所有属于当前节点的子元素的 book 节点
attribute::lang 选取当前节点的 lang 属性
child::* 选取当前节点的所有子元素
attribute::* 选取当前节点的所有属性
child::text() 选取当前节点的所有文本子节点
child::node() 选取当前节点的所有子节点
descendant::book 选取当前节点的所有 book 后代
ancestor::book 选择当前节点的所有 book 先辈
ancestor-or-self::book 选取当前节点的所有book先辈以及当前节点(假如此节点是book节点的话)
child::*/child::price 选取当前节点的所有 price 孙。

XPath 运算符

下面列出了可用在 XPath 表达式中的运算符:

运算符 描述 实例 返回值
| 计算两个节点集 //book | //cd 返回所有带有 book 和 ck 元素的节点集
+ 加法 6 + 4 10
- 减法 6 - 4 2
* 乘法 6 * 4 24
div 除法 8 div 4 2
= 等于 price=9.80

如果 price 是 9.80,则返回 true。

如果 price 是 9.90,则返回 fasle。

!= 不等于 price!=9.80

如果 price 是 9.90,则返回 true。

如果 price 是 9.80,则返回 fasle。

< 小于 price<9.80

如果 price 是 9.00,则返回 true。

如果 price 是 9.90,则返回 fasle。

<= 小于或等于 price<=9.80

如果 price 是 9.00,则返回 true。

如果 price 是 9.90,则返回 fasle。

> 大于 price>9.80

如果 price 是 9.90,则返回 true。

如果 price 是 9.80,则返回 fasle。

>= 大于或等于 price>=9.80

如果 price 是 9.90,则返回 true。

如果 price 是 9.70,则返回 fasle。

or price=9.80 or price=9.70

如果 price 是 9.80,则返回 true。

如果 price 是 9.50,则返回 fasle。

and price>9.00 and price<9.90

如果 price 是 9.80,则返回 true。

如果 price 是 8.50,则返回 fasle。

mod 计算除法的余数 5 mod 2 1
参考:

posted @ 2013-11-22 20:56 ZT文萃 阅读(304) | 评论 (0)编辑 收藏


转自http://blog.sina.com.cn/s/blog_4a9f789a0100ik3p.html

 

一.获得控制台用户输入的信息

     public String getInputMessage() throws IOException...{
         System.out.println("请输入您的命令∶");
         byte buffer[]=new byte[1024];
         int count=System.in.read(buffer);
         char[] ch=new char[count-2];//最后两位为结束符,删去不要
         for(int i=0;i<count-2;i++)
             ch[i]=(char)buffer[i];
         String str=new String(ch);
         return str;
     }
     可以返回用户输入的信息,不足之处在于不支持中文输入,有待进一步改进。

     二.复制文件
     1.以文件流的方式复制文件

     public void copyFile(String src,String dest) throws IOException...{
         FileInputStream in=new FileInputStream(src);
         File file=new File(dest);
         if(!file.exists())
             file.createNewFile();
         FileOutputStream out=new FileOutputStream(file);
         int c;
         byte buffer[]=new byte[1024];
         while((c=in.read(buffer))!=-1)...{
             for(int i=0;i<c;i++)
                 out.write(buffer[i]);        
         }
         in.close();
         out.close();
     }
     该方法经过测试,支持中文处理,并且可以复制多种类型,比如txt,xml,jpg,doc等多种格式

     三.写文件

     1.利用PrintStream写文件


     public void PrintStreamDemo()...{
         try ...{
             FileOutputStream out=new FileOutputStream("D:/test.txt");
             PrintStream p=new PrintStream(out);
             for(int i=0;i<10;i++)
                 p.println("This is "+i+" line");
         } catch (FileNotFoundException e) ...{
             e.printStackTrace();
         }
     }
     2.利用StringBuffer写文件
public void StringBufferDemo() throws IOException......{
         File file=new File("/root/sms.log");
         if(!file.exists())
             file.createNewFile();
         FileOutputStream out=new FileOutputStream(file,true);        
         for(int i=0;i<10000;i++)......{
             StringBuffer sb=new StringBuffer();
             sb.append("这是第"+i+"行:前面介绍的各种方法都不关用,为什么总是奇怪的问题 ");
             out.write(sb.toString().getBytes("utf-8"));
         }        
         out.close();
     }
     该方法可以设定使用何种编码,有效解决中文问题。
四.文件重命名
    
     public void renameFile(String path,String oldname,String newname)...{
         if(!oldname.equals(newname))...{//新的文件名和以前文件名不同时,才有必要进行重命名
             File oldfile=new File(path+"/"+oldname);
             File newfile=new File(path+"/"+newname);
             if(newfile.exists())//若在该目录下已经有一个文件和新文件名相同,则不允许重命名
                 System.out.println(newname+"已经存在!");
             else...{
                 oldfile.renameTo(newfile);
             }
         }         
     }

  五.转移文件目录
     转移文件目录不等同于复制文件,复制文件是复制后两个目录都存在该文件,而转移文件目录则是转移后,只有新目录中存在该文件。
    
     public void changeDirectory(String filename,String oldpath,String newpath,boolean cover)...{
         if(!oldpath.equals(newpath))...{
             File oldfile=new File(oldpath+"/"+filename);
             File newfile=new File(newpath+"/"+filename);
             if(newfile.exists())...{//若在待转移目录下,已经存在待转移文件
                 if(cover)//覆盖
                     oldfile.renameTo(newfile);
                 else
                     System.out.println("在新目录下已经存在:"+filename);
             }
             else...{
                 oldfile.renameTo(newfile);
             }
         }       
     }
     六.读文件
     1.利用FileInputStream读取文件
    
     public String FileInputStreamDemo(String path) throws IOException...{
         File file=new File(path);
         if(!file.exists()||file.isDirectory())
             throw new FileNotFoundException();
         FileInputStream fis=new FileInputStream(file);
         byte[] buf = new byte[1024];
         StringBuffer sb=new StringBuffer();
         while((fis.read(buf))!=-1)...{
             sb.append(new String(buf));    
             buf=new byte[1024];//重新生成,避免和上次读取的数据重复
         }
         return sb.toString();
     }
2.利用BufferedReader读取

     在IO操作,利用BufferedReader和BufferedWriter效率会更高一点


    
     public String BufferedReaderDemo(String path) throws IOException...{
         File file=new File(path);
         if(!file.exists()||file.isDirectory())
             throw new FileNotFoundException();
         BufferedReader br=new BufferedReader(new FileReader(file));
         String temp=null;
         StringBuffer sb=new StringBuffer();
         temp=br.readLine();
         while(temp!=null)...{
             sb.append(temp+" ");
             temp=br.readLine();
         }
         return sb.toString();
     }


     3.利用dom4j读取xml文件

    
     public Document readXml(String path) throws DocumentException, IOException...{
         File file=new File(path);
         BufferedReader bufferedreader = new BufferedReader(new FileReader(file));
         SAXReader saxreader = new SAXReader();
         Document document = (Document)saxreader.read(bufferedreader);
         bufferedreader.close();
         return document;
     }
     七.创建文件(文件夹)


1.创建文件夹  
     public void createDir(String path)...{
         File dir=new File(path);
         if(!dir.exists())
             dir.mkdir();
     }
2.创建新文件
     public void createFile(String path,String filename) throws IOException...{
         File file=new File(path+"/"+filename);
         if(!file.exists())
             file.createNewFile();
     }
     八.删除文件(目录)
1.删除文件     
     public void delFile(String path,String filename)...{
         File file=new File(path+"/"+filename);
         if(file.exists()&&file.isFile())
             file.delete();
     }
2.删除目录
要利用File类的delete()方法删除目录时,必须保证该目录下没有文件或者子目录,否则删除失败,因此在实际应用中,我们要删除目录,必须利用递归删除该目录下的所有子目录和文件,然后再删除该目录。  
     public void delDir(String path)...{
         File dir=new File(path);
         if(dir.exists())...{
             File[] tmp=dir.listFiles();
             for(int i=0;i<tmp.length;i++)...{
                 if(tmp[i].isDirectory())...{
                     delDir(path+"/"+tmp[i].getName());
                 }
                 else...{
                     tmp[i].delete();
                 }
             }
             dir.delete();
         }
     }
From zhuocheng (cnblogs.com/zhuocheng)

posted @ 2013-11-20 16:46 ZT文萃 阅读(150) | 评论 (0)编辑 收藏

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


目录:

  一、引入

  二、经历了就能理解

  三、读书要分级

  四、只读经典

  五、别吝惜你动笔的那点时间

  六、再提笔记

  七、大学课程之授课方法

  八、我是怎么泡图书馆的

  一、引入

  看到这个题目的时候你可能会感到有点好笑:“这还用问,看书就是把书看了一遍呗..” 没错,我们从小到大就是这样想的,也是这样看书的,信手拈来一本叫作"书"的东西,从头到尾就开看了!随时年龄的增长,我们的“阅历”也多了起来了,但你 是不是也有和我一样的感觉——书是读了不少,真正入脑的,能融入自己思想的内容却少之又少,而且随着年头的增加,你越来越不记得自己读过这些书,更不用提 书里到底大概是些什么内容了!这就是我们长久以来的读书方式。。。 你会不会也这样想,如果我能把我从小到大读过的书都能记下来形成自己的思想,那我现在得多牛啊!是呢,我也常常这样想!于是为了让自己更有思想,就去读更 多的书,然后在短短的几年,或者只是几个月,甚至仅仅是几天以后,生活的琐事会渐渐把你关于那些书的缓存挤掉,你的大脑又变成了一块被重新格式化的硬盘, 那些书又与你无关了。

  说实话,我曾经就是这种情况,并且被其深深的困扰过,花了大量的时间去阅读,但是在脑子里留下的却是星星点点的零碎的内容,于是很快这些零星的 内容也会悄悄的跑掉,剩下的只有一个好笑的自欺欺人的解释——这本书我读过。。。就这样,我骗了自己二十几年,这二十几年里,不管是教科书,还是小人书, 不管是专业书,还是小说,真是读了不少书啊!我花了多少时间在这件事上面呢,少说也有二十年吧,可是,要问我对哪本书的内容真的印象最深的,真的很难回答 的出来,更别说去吸取书的精华了。估计和我一样有这样困扰的人肯定很多。你是吗?

  二、经历了就能理解

  我经常会想难道我就真的没有从读书中受益过吗?当然有!“咳,咳。。”我要写条sql去数据库里查一下,数据库里垃圾有点多,估计得花点时 间,“select * from lifecycle where benefit from reading ——>execute!"  (一分钟。。。二分钟。。。五分钟。。十五分钟过去了,数据终于出来了,垃圾数据把系统性能拖的太慢了,是需要作作调优的时候了),好了,你很幸运,系统 没有宕掉,下面这些数据留给你们参考:

  1、我自认为英语水平还凑合,几次重要的升学考试和就业面试中,都没有在英语这块栽过跟头,由于后来集中学习日语的原因,英语过了CET-6后 就很少碰,这个原因我下面会解释。现在很多学生中为英语发愁的不在少数,往往其他各科成绩都很好偏偏英语不能达标,错失了好的升学机会。我回顾自己从小学 英语的经历,总有一个点在那闪光,那是我学习英语的转折点。那时是小学四年级,学校刚刚开设英语课,那时和其他的孩子一样,我的英语成绩不怎么样,很吃 力。我老爸对我的学习比较严格,当他发现我的英语不行的时候,他开始跟我急了,那时我也真怕他,当老子就是威武啊~我爸是高中毕业,他那时的外语水平差不 多也就是我四五年级的那个水平的,但是他还是选择了硬顶上来!他拿出课本让我逐句的翻译对话,我还大概记得那对话的内容:

  A:what's this?

  B: it's a pen.

  A: what's that?

  B: it's a pencile.

  A: and what's this?

  B: it's a pencilebox.

  A: can you spell it ?

  B: yes.p-e-n-c-i-l-e-b-o-x,pencilebox.

  A: thank you.

  B: your welcome.

  熟悉吧?后来还有很多学者指责我国小学英语教材的落俗套,以致学生跟人对话只会说“what's this” “How are you? fine, thank you. and you?” 之类的,这些我们都暂且不谈。就说我那段时间是怎么被老爸蹂躏的吧。。。

  当时有好多的对话内容我翻译不出来,于是就被无情的鄙视了,并且死规定,以后每天晚上都要默写课文、单词!我那时是真怕他呀,为了应付这一关我 是想出了一堆的作蔽手段,小抄、写手上、写桌面上。。。都用过了,每天像过堂一样的接受蹂躏,给我幼小的心灵带来沉重的压力,就这么坚持了有多半年。于 是,后面的事情你们都猜到了,我的英语成绩上来了,随便找出来一篇课文来我都能熟悉的背出来,得到了来自各方面的肯定和鼓励,回头想想,这都是对心理体验 非常好的正能量,直到今天,我都能对英语有信心。从这件事里我总结出一个关键词:“折腾”。

  2、高考的经历。对于都经历过高考的人们,这个艰辛的过程我就不再多多描绘了,地球人都知道的。我在这想说的是,在这个备考的过程中对我进步影 响最大的一个方面,这也是我高考制胜的法宝。那时我有幸和一名来自山东的转校生(也叫高考移民)同桌,他是我高中时期最好的朋友之一,就是他的学习习惯深 深的影响了我,他后来考上了中国公安大学,现在是国家保密机构的人员了,国家机密不多说。他有一个什么习惯呢?做笔记!

  你看到这可能在笑,“原来就是作笔记啊,这谁不知道,谁不作笔记啊”,没错,我们从小都会要求作笔记,有时候我们也会假意的去作一些笔记,但很多的时候是东记一笔,西记一笔,记完就忘了,也找不见了。我说的记笔记不是这种情况。

  在高考那个大环境下,每天我们都会被大量的习题淹没,多的时候每天要做十几张卷子,那时真是麻木了。我的这个朋友就习惯把每次做完的试卷都从头 到尾做个总结,把自己不知道的盲点记在一个本子上,随时翻看。我尝试了这个学习方法后,收效非常大,通过自己的实践也对做笔记有了更深的理解,下面说说我 的理解:

  (1)做笔记一定要找个厚点的本子,品质要好,但不要过于花哨的,简约的最好。因为你要能预见,当你养成这个好习惯以后,你遇到什么新的东西都 想往上面记几笔,如果页数太少了,你又要换个新本,这样就会对你的知识系统产生分隔,你会更偏向于经常翻看新的本子,旧的本子就被你束之高阁起来了,渐渐 那些你曾经领悟的东西又会变的模糊。

  (2)请勿分门别类的记笔记。拿高考这几门课举例,那时我有很多同学的作法是数学一个本,语文一个本,英语一个本,化学一个本。。。基本上是一 门课一个笔记本,分门别类,互不干扰。这样并不是最佳的解决方案。我们俩当时的做法就是所有的内容都记到一个本子上,不分科,新的内容就直接追加到旧的内 容的后面,形式上也不要记的太整齐,形式可以多样,圈圈点点,勾勾叉叉,这样更容易在你的大脑里形成再深的印象,我称之为“草稿式笔记”,比条理清晰的 “流水式”笔记效果好的多。

  (3)经常翻看。记笔记其实是对大脑缓存的一个整理,就好比你存在计算机内存里的内容永远是不稳定的,而你一旦写入硬盘,这个安全性就提高了几 个数量级(对于程序员的你,道理不解释)。同样的道理,你今天对一个问题理解了,但不表明你两天后返回来还能理解到那个程度,最好的办法就是把这个你理解 的问题用自己说话的方式记录下来,并且随时翻看。可以说,只要你的这个本子不丢,你就永远能保持对这个问题的新鲜的理解。以至后来,每每月考、期中、期 末、摸底的所有考试中,我都只需要拿出笔记本来从头到尾翻看几遍,不再需要看书和资料了,很大程度上增强了我的信心,因为没有记在本子上的对我来说都是 “常识”了,所有平时的要点都囊括在笔记本里面了。如果你身边有面临高考的考生的话,请推荐给他们,这个方法会在高考中给他们很大的帮助。

  3、学日语的经历。说来比较幸运,有机会能在大学里系统的学习一门二外。能在大学里学习一门外语确实是很有意义的一件事情,因为我们学习英语的 战线已经有十几年了,但成果不是太显著,而二外作为一门你有选择的有主动性的去学习的一门语言,如果你肯花心思,进步是很快的。我是从大三开始系统学习日 语的,那时刚考完六级,算是完成了阶段性的目标,于是转向日语的学习,恰好赶上学校与某一日企有合作的项目,很幸运的和同专业的几十名同学一起开始学日 语。当时是一个中教讲语法,一个日本外教讲口语,因为学时较紧,所以基本上日语课占用了所有专业课之外的所有课时,一周要上20几个课时的日语。这个过程 持续了一年多。在这一过程中对我来说受益最大的仍然是大量的笔记。“草稿式笔记”又一次发挥了它的神奇效果,我记了两个厚本子,记录了我整个学习语言的过 程,从浅到深,翻翻笔记就能清晰地回忆起自己是怎么一路走过来的。当我有一段时间没有接触日语的时候,如果我想找回一些日语的感觉,我第一选择就是从头到 尾的把笔记本看一遍,一遍看完后我仿佛就回到了以前学习日语时的状态,就像计算机一键还原一样,只有笔记能起到这个作用。

  P.S. 顺便说明一下我为什么学日语的时候就很少去碰英语的东西。语言这东西学的多了真的是容易混,能精通好几国语言的人真的是值得敬佩,这种敬佩不仅仅是语言学 习本身。学了两年的日语以后,口语之类的都练的比较熟悉,因为有外教环境,所以大家平时聊天沟通都得到了很好的锻炼。但是有一次做英语面试的时候,我发现 了一个很严重的问题,我竟然不能说出一整句表达清楚的英文介绍,每句话都不自觉的往外蹦日语,呵呵,英语的思维完全被日语给抑制住了。于是我发现,这两种 语言冲突了,不过为了更好的学日语我就把英语放下了,直接最近的工作需要才再次捡起来,不过还好,把日语先放一放,英语自然就不受影响了。

  4、目前的工作。几个月前换工作到了现在这家外企,外企宽松的环境和人性化的制度让我很快喜欢上了这里,于是我抱定决心要在这里稳定下来,干出 一番事业。从第一天入职我就领到了一个印有公司LOGO的笔记本,现在三个月时间吧,这个本子已经基本用完了。在这个本子上不仅有工作上的事 情,meeting,需求讨论,还有大量的读书笔记,内容十分丰富,但都充实的记录了我的每天的轨迹。这本笔记同样比较“草稿”,但我能真正理解它,它就 像我的一部分大脑一样,我现在走到哪里都会带着这个本子,班车上、轻轨上有大量的时间,拿出本子就好像和自己在对话一样,无比的踏实与充实。

  三、读书要分级

  古人早就说过“开卷有益”,在信息大爆炸的现代社会里,获取知识和信息的方式变的越来越多元化,网络的兴起让知识变的廉价,理想的说一根网线可 以得到这个地球上你想知道的一切。请大家和我一起思考一个问题,不论是以什么样的形式,游戏也好,电影也好,看新闻,刷微博也好,我们的最终目的到底是想 干什么。我的观点是,所有的这些行为总结起来,终极目的只有一个——获取信息。

  回想在还没有Internet的时代里,人们主要获取信息的途径就是读书,这是那时的人们能想到的最直接的选择。而今天的我们选择就多了起来, 读书看起来好像是最慢的一种获取知识的方式了。但是,选择多了就一定是好事吗?科学家证实(我也不知道哪个科学家),选择越多效率越差,因为这增加了你决 策的时间和后悔的理由。先说上网吧,很简单的道理,大家都会经常体验到的,如果你想在网上集中做一件事情,往往是很难的,你会受到来自各个方面的干扰,各 种“信息噪声”向你扑面而来,你常常会被另外的“新鲜”信息中断思路,比如QQ右下角讨厌的重大新闻浮动窗。再比如,如果想在电脑上踏下心来看一本PDF 版的技术书也是很难的,开始可能还好,看上十页二十页以后,眼酸,想睡,看过什么没太深的印象,想干别的,效率很差,我就是这种情况,对需要用电脑阅读的 大段的内容都有抵触的情绪。所以我避免用电脑看一些需要系统理解的东西,因为人有一种心理,就是对于我感到过抵触或厌倦的东西都不想再碰,所以我尽量不用 这种方式去触及那些本身应该对我有很大意义的内容,我怕因为一时的不耐烦导致与这些经典失之交臂。 我的习惯做法还是去阅读实体的书,这给人的感觉是完全不一样的,书的厚度是你可以真切感觉到的,而且,看实体书更容易深入内容,这可能因为人类一直以来的 习惯都是以书为载体来学习,这促成了人脑的进化,人脑也更习惯这种传统的方式。

  这部分的标题叫“读书要分级”,什么叫分级呢,就是读书的深度。

  走进任何一家图书馆,你可能都有冲动要把这里的书全部读掉,可是这显然不现实。

  电视剧《士兵突击》里许三多在团部的知识问答竞赛时,团长问他是怎么知道这么多知识的,许三多说“我这人笨,不知道应该看什么,我就跑到图书 馆,从A开始看,现在才看到D”(大概是这意思,是不是D记不清了)。你说这种人真有吗?有,肯定有,但是这只能是个童话,对于一个现代化的大型图书馆来 说,你就是光把A看完这辈子恐怕也不够用的。所以,面对浩瀚的书海,有选择的读一些经典之作才是明智之举。并不是每一本书对于我们的成长都是至关重要的, 这里有经典,也充斥着垃圾。如果你花了两年读了一堆垃圾书,这样非但无益,反而会害了你。就像老罗曾经说的,他年轻的时候金庸的武侠小说非常火,很多的个 体书商不知名的武侠作者出版的武侠书都署金庸的名,因为那时没有目录嘛,什么“飞雪连天射白鹿, 笑书神侠倚碧鸳”,当时不知道,所以怎么把金庸的书挑出来,很难。

  那怎么把经典的挑出来呢?这就要借助网络了,豆瓣读书是个不错的地方,这里都是一群爱读书的人,你要看的书在这里基本都能找得到,看过的读者会 留下一些感想,如果评价太烂的话,你就应该果断放弃读这本书的想法,因为这可能会浪费你的时间,并且害了你。扯远了,下面开始分级。

  第一级:经典中的经典——能奉为经典的著作不多,对于我们计算机这个领域,耳熟能详的经典也就是那一百多本吧,对于读这些书的态度就应该给予足 够的重视,记笔记是必须的,因为这些思想需要与你的思想融合起来,形成你的理解,从而发挥经典的作用,因为大部分经典之所以长盛不衰就是因为它们都是授人 以渔的。

  第二级:技术类专著——这部分就是指那些资深技术专家,或在某个技术领域比较有建树的行业专家写的书,你选择这些书的目的性更强一些,往往是为 了更深入的了解一种技术或行业而选择的,这部分你当然也要细读,因为技术的难度你更应该用笔记来梳理思路,形成整个技术的框架,这里面应该包括更多的细 节,以助于以后翻阅的时候能理解的更深入。当然,你可以分章节来笔记,这样可以将一个大目标分割成小目标来激励自己去逐项完成。

  第三级:技术基础类——有一些书目涉及的是你已经熟悉的技术领域但比较基础的内容,这些书的内容对你的技术水平来说比较基础,但你也不要忽视这 样的基础书,这里面可能还有你没有吸收过的精髓也说不定。“温故而知新”,永远不要轻视基础,同样拿出你的本子,翻开新页,标上今天的日期,把这书中讲到 的你意识模糊的内容记到你的本子里吧,可能你会发现,你要记的东西还真是不少呢。

  第四级:技术周边类——比如《程序员》杂志、技术博客,这一类的资料也不要看过就扔,不要相信你是过目不忘的大师,你大脑的缓存是有限的,你必须要保存到硬盘!所以拿出你的本!

  第五级:娱乐类——这部分与你的工作没有直接关系,属于你生活的部分,这部分的智慧更多,但是可能会和技术有冲突,所以如果你需要记笔记,请不要记到你记技术和工作的本子上。

  四、只读经典

  代码真的能改变世界,当然代码也正在改变着世界。程序员的时间是很宝贵的,我们不是这个星球上最聪明的一类人,但我们绝对是最有智慧的一类人。呱唧呱唧~

  我们花了大量的时间去做需求,去Design,去Coding,去Testing,留给我们自己的时间却总是那么少,除去日常生活起居的时间, 陪女朋友的时间,上下班的时间,留下读书的时间就没什么了,哦,对,忘了把你打Dota的时间算里了,这还哪有时间看书啊!!??

  当程序员的没有不勤奋的,不勤奋的干不了程序员。所以书还是要看的,怎么看,只读经典。

  关于什么是经典你自己决定咯,在这个圈里吃饭的,对技术都有很强的敏感性,坏书进不了你的眼,好书也一定逃不掉。

  五、别吝惜你动笔的那点时间

  说了这么多,你可能已经意识到做笔记的重要性了,其实事实真的是这样。

  你是否听说过某某大师一生做了几百本的读书笔记这些事,我以前一直有疑惑,他做笔记都是在干嘛呀?都记什么呀,有什么好记的?后来我真正开始做 笔记以后,我才真正理解了这件事,原来大师之所以能成为大师,真的都不是一朝一夕的工夫,这需要持之以恒的坚持和坚定,这内心得多强大呀。你要知道,那几 百本的笔记不只是笔记本那么简单,那些都是思想的沉淀,思想本来是抽象飘渺的,笔记这种形式让思想有了重量和形态,这种思想被组织,重构,索引,最终印到 大脑里形成一座庞大的知识仓库。

  很惭愧,我们国人没有记笔记的这个好习惯,而与我们相对的日本的整体国民,基本上都有记笔记的这个习惯,这是很可怕的。我的日语老师宫竹老师, 她随身都会带有一个笔记本,随时记录所有她认为应该去记的东西,在很多方面我真的非常敬佩她,比如,我们当时有三个专业的大约二百名学生都上她的课,她能 记住所有这些人的姓名,包括中文的和翻译成日文假名的,还不仅如此,其他不学日语的同学,只要与她做过自我介绍的甚至只有一面之缘的,她下次见面一定能叫 出那人的名字,从没出过错。你以为这是她的记性好吗?绝对不是,这源于她记录的习惯,她不当面去记这些人的名字,但她私下肯定去写进本子里。光写进去就万 事大吉了吗,不回头翻看怎么能记得住?这就是笔记的力量。关于日本人的很多好习惯,希望我以后有机会能发篇博客整体谈一下。

  正所谓磨刀不误砍柴功,记笔记可能会影响你读一本书的速度,但它不会让你白读,如果你读书的目的不是想在你脑子里留下点什么的话还不如去看电视 剧,读书就是为了长知识长学问长见识,就是为了将别人好的思想吸取过来,转化成自己的思想体系的一部分,当然,你应该有批判接受这些信息的能力,人云亦云 的完全接受也是不合时宜的。

  我有一个心愿,我渴望能有一天在公交、地铁里看到大家翻看的全是自己的笔记本,而不是一人拿着一个手机在那看微博傻笑!

  六、再提笔记

     对于《到底怎么样才叫看书——上篇》中所提到的内容,得到了各位博友们的普遍认同我感到很高兴,说实话,从小到大我也就认真做过那几次笔记,但是却都印象深刻,并且对以后的影响也很深远,在走了很多的弯路以后,渐渐才发现这其中的道理来。

     正所谓“学而不思则惘”,学的目的当然不是形式上好看,当然,我们从小受应试教育的影响太深,花了太多的时间和精力去学一些根本用不到的东西,这种“形 式”上的学确实也是没有办法。但庆幸的是我们都挺过来了,大学的教育毕竟也是自己完成的,自主性提高了很多,但仍然有很多的在校大学生不清楚自己以后的方 向是什么,大学四年里都是迷茫的,等到工作了一年两年以后,才突然顿悟——原来我在大学里浪费这么多宝贵的时光!如果你还是在校研究生,你会发现那些工作 几年再回去读研的学生中,学习的自主性和目的性有多强,因为他们已经深深的追悔过那段时光,并且看到了未来努力的方向在哪里。这些道理是一直在学校里的人 很难体会的,一切都是“失去了才会珍惜”。

     读书是一个很费时的过程,一本普通的书300多页很正常,软件类的书里1000多页的大部头著作也很常见。不同于小说是纯叙事性的不需要太多的理解,计 算机的书都是需要用大脑去分析和理解的,所以注定了读这些书的速度都不会很快。比如一本300页的书,你用工作之外的时间一共读了7天,实际上到第七天的 时候,你对第一天和第二天所读过的东西已经印象模糊了,这时你会意识到这点并立即返回来再看一遍第一天和第二天的东西吗?很多人不会的,人只会更乐意往前 看,直到看到最后一页才长嘘一口气,“终于看完了”! 于是将书放下,即使以后的几天里,书就摆在那你也想不起来再拿起来翻几下。又过了7天,上周读的内容已经完全印象模糊了。又过了一个月,只有书名还能记 得。。。

     所以,我们花了大量的时间读书,却效果不大,读了后面的扔了前面的,一遍一遍在重复同样的过程,整个过程里,唯独让我们理解最深的时候,就是在阅读的那个 过程当中,那一瞬间的我们对大脑的记忆力保持高度的自信,偏执地认为,将来不论哪个时间,我都将理解到这个程度!事实上,恰恰相反,这只是一个短期的记忆 而已,只能维持几天甚至几小时,就像是硬盘一样,你今天删除了一个文件,第二天作数据恢复仍可以找回来,但两个月以后数据恢复就再也找不回来了,因为新的 文件已经覆盖了那个位置,记忆的信息被冲掉了。笔记的作用更像是一块移动硬盘,你可以在你认为这文件有用的时候,把它转移到移动硬盘里,即使本机硬盘上的 文件被冲掉,你也可以随时读取移动硬盘里的内容。

  你虽然花了时间去读了一本书,但对于这本书可能是你的,也可能不是你的,但如果你对它作了笔记,这本书就百分之百会是你的了。有效读书的过程应该是这样的:

  读书的目的其实最终目的就是形成自己的理解并长期驻存在大脑中,而笔记这个环节是达到这个最终目的最关键的一步。

  七、大学课程之授课方法

     大家都经历过大学,我对大学的感悟最大的就是,每一门课学的最明白的时候就是考试之前的那一周。因为有一个考试的期限在那,就逼着自己在那天之前必须得把课本啃完,把内容梳理出来,这大约只需要一周或更少的几天时间,取决于老师哪天通知考试。

    后来我就常常这样想,大学的课程如果是先考试后上课是不是效率会高很多呢?大学生都有很强的自学能力,突击考试的能力都非常强,几天时间把一门从未学过的 课考个及格应该问题都不大,这就造成了大家平时上课不用功,只等考试突击的号角吹响才进入学习状态。 如果先考试呢,给大家定个及格线,不及格的算挂科,那大家就会玩命的自学一遍,把考试过掉,这时已经对课程的内容理解的比较深刻了,接下来再从头到尾上一 遍课,这就很少会出现有学生因为听不懂而不去听的情况了,大家都会变得愿意听课,并且理解会更进一步,皆大欢喜!可惜啊,大学四年那些课程的价值都为应付 考试而大大缩水了。。   

  八、我是怎么泡图书馆的

  上大学时看到有人说过一句话,“在学校要好好利用图书馆的资源,等你工作以后哪有这么大的图书馆给你用啊!”当时对这句话的印象很深刻,但遗憾 的是,那时并不会泡图书馆,也没有那么深得意识到图书馆的资源是多么得难能可贵。很多真相都是工作以后才后知后觉的,这其实说明了一个道理,人的认知永远 都是只局限于眼前,几年以后回头想想以前的想法只会感到当时是如此幼稚和缺乏思考。

     大家都知道,计算机的书籍一般都比较贵,靠完全买书去提高技术,成本上实在太高。还有一个事实要承认,买来的很多书都想不起来看。在买书时,往往我们都会 有一种冲动,并且有一种心理在作祟——我得到了这本书,就学到了这门技术! 于是,在这样的冲动之下,花了很多冤枉钱买了很多书成了摆设,而技术却没有半点长进。

     所以关于买书,我有两点心得和大家分享:

     1、能不买就不买。 这不是说鼓励大家不读书,反而是为了更有效的读书。古人早就给我们总结了“书非借不能读”,已经是自己的书往往不想读,自认为书就一直在那,我什么时候想 读都能读啊,于是一直没有读。而借来的书,因为有期限要还给人家,你就不得不抽出点时间来把它读完,这样才是真的去读了。并且,如果你是按照上面的流程图 中画的那样作了笔记的话,这本书你虽然形式上是还了,但你却真正的拥有了这本书,永远的拥有了。

     2、三思而后买。 如果这本书你周围借不到,你又想读的话,请在买书之前给自己几天时间的准备。准备什么呢?你应该从各个方面了解一下这书的内容,质量,评价等等,并且能列 出这书非买不可的几个理由,计划一下你拿到这书后的阅读计划等等。为什么要作这些准备呢,这其实是在强化你读书的动机,动机越强你读书的动力越大,效果也 越好,那这本书才不会白读,更不会白买。我给自己的硬性规定是,从我有买书想法的那天起,往后推一周的时间,如果我还是很想买,那就毫不犹豫的出手了!

     3、买了书赶紧看。当你拿到一本新书的时候,这时是你对这本书兴趣最大的时候,也是最冲动的时候,这时候应该尽量的拿出一大块的时间来把这本书一口气看 完,这样能最大程度的激活这本书的价值,而如果一旦搁置下来,下次再翻开它就不一定是什么时候了。“一鼓作气,再而衰,三而竭”,读书也是同样的道 理。    

  对我们程序员来说,图书馆仍然是最好的资源,不但全面而且免费,还能制定一个期限督促自己完成学习,一举N得。我是爱泡图书馆的,而且经常是从 早泡到晚上关门,有时是看图书馆的书,有时候也只是看自己的书,因为图书馆里环境最能让人心静下来,学习看书的效率都很高。不过,我也常常碰到很多过来看 书但是明显是瞎看的读者,这很大程度上还是在浪费时间。举几例:

  1、没有看书的重点,从书架上一取就是五六本,甚至十几本,这时的心理好像是“我拿的多,看的多,学的多,知道的就多”,其实这是完全自欺欺人 的。《上篇》中提到了,一个现代化的图书馆里,你是不可能把每本书都看过来的,你的生命太有限了。像这些取书的人,最后只能是翻翻这个,再翻翻那个,每一 本书都不会看超过五分钟,最后原原本本又抱回来了,白白浪费了生命中的几十分钟,却还感到莫名的充实。。。。 我的方式是只取一本,并且这一本一定是我之前在豆瓣上查看过相关评论的,我认为这本书值得去读才去拿来读的,并且,如果这本书真的是好书,是一定要一口气 看完的,绝不中途去抓另一本书来看,这会严重的影响理解的连续性。

  2、小情侣一起来看书的,完全是浪费时间,并且也影响他人。因为两个人一起来的就会有一种“说话有底气”的心理,所以坐在那就会不自觉的聊天说 话,而不顾周围人的感受,这样的读者我也很不喜欢。所以如果你想带女朋友一起去泡图书馆,请一定要注意别人的感受,那里不是打情骂俏的地方,你去了目的就 是学习,如果有必要可以和女朋友商量分开学习,这样两个人都能充分的利用好在图书馆的那点时间看点东西。

  3、到图书馆来玩手机的。这部分人很多,抱一堆书过去,然后拿出手机来上网发短信听歌的,也许是把书当成了一种心理安慰。这种人也是不应该出现在图书馆的。 

  这其实就是一个动机的问题,动机不纯永远也不可能做到专注。当然,也不能要求人人都有这种专注的性格,也许人家就是来休闲消遣的,没有太多的想 法,这也没错。 对于我来说,因为图书馆离住处不是很近,需要花一定的时间成本到达那个地方,所以,我会对在那的每一分钟都比较珍惜,都是自己选择的嘛, 总得为自己负点责嘛,所以我一般会将手机关机,并且一直坐到图书馆关门才收拾东西往回走。

  最后,《到底怎么样才叫看书》的两篇总算写完了,谢谢各位的支持!对文中偏颇的地方,纯属个人见解,请大家批判接受。

posted @ 2013-11-19 17:06 ZT文萃 阅读(128) | 评论 (0)编辑 收藏


有朋友发了一个关于托福的应考经验,让我这样的英语白痴感到很是佩服,进去发表了一段我硕士研究生入学时候复习英语的感悟,竟然有朋友向我求教,我感到有可能很多朋友在背单词上面有困难,所以把我个人的成功经验向大家分享.
    首先,我不是一个学习的人,对于英语更加厌恶,没有什么好感,大学四级都没过,考研还失败一次,第二次时候无意得一位前辈的经验之谈,感觉可为,故试之,感此乃金玉良言尔.今与众朋友共享.下面是全文,未加任何修改,大家看过之后,我会谈谈我的使用经验.
                                                                                                     以下文字均为他人所有,特此申明
                                                             严格遵照艾兵浩斯遗忘曲线,按照下面文章的做法,除此外别想有什么捷径.

                                                                                                  如何经历“把针磨成铁棒”的杀G岁月



    自从考完GRE和Toefl以后,心有所感,本想写点心得,但是因为太懒没写成。今日风雨如晦,心中又有所感,于是一舒笔墨,写下我学英语的方法。俺知道有很多兄弟姐妹们和曾经的我一样因为英语而郁闷,小小心得,也算造福后人,为自己积累一点功德~~



    2006年除夕夜,俺一个人孤伶伶的在北京表姐家看傻头傻脑的春节联欢晚会,一个人就算了,饭还要自己煮,这不是要了老子小命么。大年夜很是吃了不少快餐面,其中的凄清恶心,不足为外人道也。

    新东方学完,俺回到青岛继续复习GRE。(俺自认为这一段是背单词的好方法之一,大家不妨学一学)在网上找了点GRE单词录音,一面跟着读一面背,一个单 词它读三秒俺就背三秒,背7000个单词每一遍也就5到6个小时的时间,如此重复15遍,记下了50%。剩下50%都是最变态的单词,光是听录音进展太 慢。于是俺还是用最传统的办法,看着英文背中文,光记这最变态的50%。但是每背一个单词不超过5秒钟,所以3500个单词背一遍也就5个小时左右,这样 一遍一遍又一遍,50%变成49%,48%…一直到0%。然后再把以前听录音记下的50%和后面的50%合起来背,大概又背了一两个星期,一本7000多 个恶心的GRE词汇终于背完了(虽然有些词还不太熟,但是总算是背完了)。

    2007年六月,俺到济南考GRE的笔试,无惊无险,平平淡淡,走出考场的那一瞬间,俺对自己说,他娘的以后再也不考这么变态的考试了(反正GRE考完, 人生已经完整)!!两个月后,电话查分,俺的GRE语文考了460(满分800),数学考了790(满分800),作文4分(满分6分)。和牛人比起来 (550以上+800+6),俺的成绩当然不算什么,但是对于俺这个六级考了三次的人来说,已经很满足了。
2005年末,俺开始申请美国学校;2008年4月,俺拿到了美国南密西西比大学的offer!

    2008年6月,适逢研究生毕业兼拿到签证,风雨大作,心有所感,于是在小破屋中写下俺的英语之路,记下自己与英语的恩怨情仇,以俺的吐血吐奶之路,为后人积累一点经验,也作为一份礼物送给自己,以做留念~

总结1:背出来的单词

    不背熟单词就去学所谓的听力阅读作文语法,就像没学走路就想学跑步,没吃饭就想拉屎,没脱牛仔裤就想脱内裤一样的痴心妄想。所以想学英语的人要做的第一件事,不是哭,而是背单词。
本人认为,所谓的“感觉”(特别是做阅读的感觉),说白了就是看背了多少单词,谁认识的单词多谁的“感觉”就好。
    从小就喜欢郭靖,不是因为俺是gay(俺当然不是gay,100%的straight,虽然俺没有女朋友,但这并不能说明俺是gay),而是因为喜欢他的 纯朴憨厚和正直勇敢(得不到的东东总是别人的好,纯朴憨厚正直勇敢是轮不到俺的了,俺向来是真小人,属于富贵——淫,贫贱——移,威武——屈那种)。射雕 英雄传中俺最喜欢的一段就是郭靖在桃花岛上比武追黄蓉那一段,其中他背九阴真经的方法其实相当值得俺们深思。郭靖背九阴真经背了几百遍,他虽然智商不高, 但是情商显然不是一般高。
    很多人听到“背”这个字就傻了眼,因为他们一辈子就没背出过什么东东,听见背字就萎了。俺正好相反,从初考到中考到高考到考研到考博 (GRE&Toefl)全是背出来的,就连数学都是背出来的说。。。(数学怎么背?背公式,背理论,做题时一看到和理论相近的东东就往上套,八九 不离十),听到背字俺就两眼发绿光。很多人抱住俺的大腿痛哭流涕不论俺怎么骂他打他侮辱他他还是不住的狼嚎“我就是背不出来啊啊啊”,俺一听见就知道他在 吹牛。其实背书这个东东,只要有狗的智商,是个人就能背出来。100个单词,背一遍背不下来,背第二遍;背两遍背不下来,背第三遍;背三遍背不下来,背第 四遍。如果你背了一百遍还是背不下来,俺把针磨成铁棒的名字倒过来写(其实读一百遍就能记下来了,记不下来的智商比狗高不了多少)。
    天下间只有创造性的东西是需要智商的,背书这种重复性的东西是不需要智商的(像爱因斯坦爷爷那种人搞的东西叫创造,像学校里的人搞的东西叫重复。)所以每 当听到家长们相互比较哪个哪个孩子聪明俺就来气,不就是哪个哪个家的孩子比较能背嘛,搞到“聪明”那么大,好像真的很聪明似的。
聪明人和傻瓜最 大的区别之一,就是聪明人知道要背什么,怎么背(这是创造性的东西嘛);傻瓜连“背”都不知道,只知道身边有很多聪明人(不少人连自己是傻瓜都不知道)。 郭靖人挺傻的,但是他很听话,别人叫他侠义他就侠义,叫他背书他就背书,所以最后成为一代大侠。有很多人傻就罢了,还不听话,属于死了也是活该。所以如果 你英语不好,不妨把自己当傻瓜,听听高手是怎么背书的(当然俺也不是很高,俺也是当初装傻到新东方听来的)。
    我多年来学英语的经验总结成一句的话:重复是记忆的根本。回想一下我们的怎么学习中文的?当你还在摇篮当中,妈妈让你叫“妈妈”,你就会叫了吗?不是,你 能说出“妈妈”二字,是你爸爸妈妈重复了千百遍的结果。这两个字经过不断的重复,始在你心中成为你自己的“语言”。我叫你背英语,就是要把这个记忆的过程 强行在短时间内再现,把尽量多的东西融入你脑子里成为你自己的东西。中国的英语教育之所以这么失败,就是能明白这个“重复是记忆的根本”的人太少,能将之 用于实践的人就更少。毕竟有“郭靖”的智商的人很多,有“郭靖”的傻劲的人却太少。
    既然重复是记忆的根本,那么怎么重复法?以下有几个例子,你可以看看哪种比较有前途:
    A学生背单词,背了一个月,兴高采烈的对我说:“俺终于把C部分(注,26个字母中的C开头的单词)背完了!!!”我问他怎么背的,他说是一个一个单词的读英文背中文,一直到记住为止;
    B学生背单词,背了一个月,狂笑着对我说:“俺终于把核心词汇背完了!!!”我问他怎么背的,他说是一个一个单词的写,每个单词写二十遍;
    C学生背单词,背了一个月,热泪盈框着对我说:“俺终于把核心词汇背完了!!!”我问他怎么背的,他说是背句子背的,核心词汇一共1500个,每个词汇找了一个相关的句子,把词汇放在语境中,更好记忆;
    D学生背单词,背了一个月,很苦的对我说:“俺还是有很多单词没记住。”我问他怎么背的,他说读英文背中文,每个单词背五秒,背完所有单词(假设7000个)要10个小时。每两天背一遍,但是还有50%的单词记不住。
    各位看官猜一猜,以上哪个学生最有前途?哪个学生最没前途?答案:任何一个上过新东方的人都会告诉你,D学生最有前途,因为他的办法是最有效的。
By the way,以上所有方法本人都干过。
    分析:本人估计,中国至少有一半学生是按照A学生的办法背单词的,嘿嘿,真理往往不在多数人手中,所以A学生是最没前途的。大家想像一下,考起试来他认识 多少单词?他显然只认识以ABC头的单词,考起试来死路一条。也许有人会骂俺,说如果A同学坚持背下去,当他背完整本单词,他不就是高手了吗?我可以告诉 你,他绝对坚持不下去。事实上很多学生都是这样,背了很长时间也就ABCD几个字母的页面是黄色的,其他字母的页面都是崭新(也有人有点小聪明从Z开始 背,因为后面的字母单词少。但是结果是一样一样的,因为当他们背到T的时候就不行了,以T开头的单词多嘛)。他们都坚持不下去,理由其实相当简单,因为要 背一遍单词书要花很多个月的时间,谁能坚持下去啊?
    B和C学生显然比A要聪明一点,因为考试的时候最常用的就是核心词汇,考起试来至少不会碰到ABC以外的词汇就傻眼。但是他们的方法都有问题,问题就是背 一遍花的时间太长了,B用写的,C用句子,都是变相的增加了背的时间。而且考试时碰到非核心词汇,一样会死得很惨。
    之所以说D最有前途,是因为他掌握了记忆的根本——重复,而且重复得相当的合理。什么是合理?7000个单词一起重复就是合理。像A学生一样是部分的重 复,效果太差,效率也太差。就算A学生背到了k部分,他前面背的ABC也会忘掉。所以最合理的背书准则就是:在最短的时间内过最多的遍数(所有单词背完一 次称为一遍)。任何背单词的方法,只要符合这个准则,就是好方法。所以A用的方法不是好方法,因为他背一遍所有的单词要用很长时间,而且是部分重复。B和 C用的方法也不是好方法,因为变相增加了背的时间,也属于部分重复。只有D的方法符合这个准则,时间最短——“两天过一遍”,遍数最多——“一个月背了 15遍”。D之所以说还有50%的单词记不住,原因就是他过的遍数还不够多。只要他再继续个10遍8遍的,必有小成。
    D的方法是好方法,但是会有一种错觉,那就是:一个单词背5秒,100个单词就是500秒,约等于8分钟,8分钟内记100个单词,对很多人来说似乎是不 可能是事。实际上,8分钟内记100个单词,对所有人来说都是不可能的事情。再说得明白一点,当你背完一遍,7000个单词你能记住的只有4个。。。(也 许有的人想踢我,但是俺堂堂党员,怎么会吃饱了没事干来玩你呢,你又不是美女。。。不要急嘛。)背第一遍也许你只能记住4个,但是还有第二遍呢,第二遍也 许只能记住8个,第三遍就不一样了,记住的词会以指数增长,所以这个方法最大的困难就是前面几遍能记住的单词实在太少,给人一种痛苦的感觉,但是背到8遍 以上,就会渐入佳境(认识的词多了就爽了)。所以每背一遍,记得把认识的词圈起来,以增加成就感和自豪感。到20遍以后,7000多个单词至少能认识 50%,此时背一遍用的时间大大缩短,有50%的单词只要一见到就认识,自然就不是一个单词5秒,而是一个单词小于1秒了(当然另外的50%还是要背5秒 的说)。
    有人做过统计,同样一份英语试卷,美国人来做要30分钟,中国人来做要2个小时。为什么?中国人比较蠢吗?当然不是,美国人比中国人蠢多了,但是他们看到 母语,不用在心里进行翻译,速度当然比兔子还快。那要怎么办才变成兔子?当然就是尽量缩短要在心中翻译英文的时间了。那么如何缩短翻译的时间?7000个 单词背上一百遍,绝对能变成兔子。其实背到一定遍数,很多单词在心中就不用再翻译了,就像见到How are you一样,有没有人在心中对其进行翻译啊?(How are you还用翻译,就像见到老婆还要看看结婚证才能确定是不是自己老婆一样。)达到不用翻译的境界,自然就变成兔子了。
7000多个单词,其实就 是7000个人的名字。智者见智,淫者见淫,对俺来说就是7000个小妞的名字(对于不少女性淫者来说,自然就是7000个帅哥的名字)。想要说出 7000个美女的名字,光简单的介绍一遍,即使是世界第一号大色狼也做不到,但是只要大家多见面,多培养感情,自然就会眉来眼去,暗送秋波。熟极而流 (氓),古人诚不欺我也。(不知道这一段有没有人看得懂,看不懂就算了,不要胡思乱想,说俺教坏小朋友)。
    话说回来,不是每个人都有时间背100遍单词的,大家都很忙嘛(学习政治数学物理化学是忙,打打电脑游戏泡泡妞也是忙,反正大家都很忙)。但是背100遍 没时间,总也要挤点时间背他20遍吧?用俺的话来说,背单词,20遍始为小成,40遍是为中成,60遍即为大成,至于100遍者,就成为美国人了。如果你 单词背了60遍,仍然没成为高中英语的顶尖高手,你可以手持菜刀来找我,俺让你在雪白的大腿在砍九九八十一刀。
    告诉大家一个小诀窍,GRE单词覆盖所有Toefl单词,Toefl单词覆盖所有六级单词,六级单词覆盖所有四级单词,四级单词覆盖所有高中单词(甚至包 括很多出现在阅读的怪词)。所以如果你是高中英语中的低手,可以扔开你的课本,开始背四级单词,20遍以后,你就能成为高中英语能手,40遍以后,你就是 高中英语高手,60遍以后,你就是高中英语的顶尖高手。
    最后,俺总结一下以上背单词的方法,给各位看得傻了眼的人一点容易看懂的东西:
    背单词的理论:重复是记忆的根本。
    背单词的方法准则:在最短的时间内过最多的遍数(所有单词背完一次称为一遍)。任何背单词的方法,        只要符合这个准则,就是好方法。
    背单词的方法:收集高中所有单词(大概也有四五千个吧,其实可以直接背四级单词),读着英文背中文,一个单词背5秒,背完所有单词一遍大概6、7个小时 (其实根本用不着那么多时间,很多单词都是认识的,认识的单词只要不到1秒钟),最好每天背一遍,不行就每两天一遍(三天以上就是失败!),大概一个月到 一个半月的时间就能完成20遍,20遍以后背一遍的时间大大缩短,两个小时背一遍一点问题也没有。这样两个月就能背至少40遍。此后不要停止背单词,每天 至少抽出半个小时狂背,切记切记,否则后果严重(停止背书单词会忘得很快)。此法最适合假期进行,如果有课,那么就很难说了,要讲讲策略,鱼和熊掌不可兼 得,说不得只好放弃某些课来背单词。英语作为一门不用智商只用苦工就能提高成绩的考试,值不值得你暂时放弃某些课程,就看你到底是不是真的聪明了。而且只 用一个半月,一个半月以后就不用每天几个小时几个小时的硬干了,因为20遍后背一遍根本不用几个小时,1个半到2个小时完全够了;40遍后每天只用半个小 时,上厕所的时候带一本单词书进去蹲久一点不就搞定了。这个方法虽然开始挺苦,但是一旦挺过一个半月,自然就会明白重复是记忆的根本这一最简单不过的道 理,对于任何一个科目的学习都是受益终身。

总结2:背出来的听力
    正如上面说的一样,有一些单词是不需要头脑进行翻译的,比如说Hello、How are you 等,听到就知道是问候语,不用在心里翻译成“你好”才知道是什么意思。有一些单词则需要翻译才行,比如说cruise,cruise control,甚至有些人看到都不知道是什么意思,更别提翻译了。所以俺把英语单词分为两种,一种是听力词汇,一种是书面词汇。听到就知道是什么意思不 需要在脑子里进行翻译的是听力词汇;听到以后要在脑子里进行翻译的甚至翻译都翻译不出的是书面词汇。一个人的听力强弱取决于他的听力词汇的多少。练习听力 的过程实际上就是把尽量多的书面词汇转化为听力词汇的过程。
中国人的听力向来很差,缺少语言的环境,又没有适当的学习方法,以致很多高中生大学 生听力很烂。俺的听力曾经也很烂,虽然在骨子里感觉似乎很有语言天赋,但是听力还是很烂,从小学一直烂完大学,想练,不知道怎么练法。俺的听力大跃进时期 开始于准备Toefl的时候。当时从师兄那骗来一本Toefl听力的书,照着练了一下,茅厕顿开,自此一发不可收拾。说白了其实很简单:别人说了一句英 语,你为什么听不懂?不就是因为你听不懂句子里的单词嘛。所以要练听力,先背单词,单词背的遍数一够,自然就不需要在脑子里进行翻译了。练习Toefl听 力之前俺一做听力题就傻眼,听一遍啥也听不懂,感觉和傻瓜一样。后来一翻那本Toefl听力书,上面列了Toefl听力常用语汇(包括词组)大概600多 个,背了几遍,立刻听力水平大涨,于是如遇至宝,狂背30遍(600个单词,用俺上面的方法,背一遍只用一个小时,一天背三遍,10天背30遍小 case),于是听力提升得咣咣的。
    回想初中高中大学练习听力,毫无章法可循,老师总说多听自然听力就好了,一上听力课抓着大家狂听稀奇古怪的东西,方法没错,可惜太慢,这就是泛听的弊端, 听得虽然多,但是效果太差,正如一句老话:混身是刀,没有一把利。听得再多,不认识的单词还是不认识,怎么练都是白搭。建议所有高中英 语老师上听力课用3/4的时间让学生背听力常用词汇(听力常用词汇去哪里找?当然是做老师的来找来总结了,不然要老师来干什么,整天打开录音机和学生一起 听听力那不叫老师,叫陪读),只用1/4的时间来听录音。
    有些同学盲目的把多听听力就会好放在第一位,每天走路吃饭上厕所都在用mp3听英语,实际上对于英语低手来说有害无益。本来就听不懂,还要狂听,时间一长 必然走神,走神走得习惯了,以后考起试来就光走神,不做题了。这是泛听的另一个弊端,损坏注意力。如果你听力不好,不要泛听,要先背单词,然后精听!什么 叫精听?找一篇听力文章,认真的听,重复的听,听不懂的句子找出原文看懂,所有听不懂的单词列成一个表,然后再听,一直到文章中每一个句子都听懂为止。然 后再找第二篇文章(最好是不同种类的文章),重复以上步骤,一直到每一个句子都听懂为止。以10篇文章为一个复习点,复习的时候先背原来列出来的听不懂的 词汇,背熟了以后再回去从第一篇文章开始循环听,仍然是以听懂每一个句子为目标,只要有一个句子不懂就不要开始听其他的东东!当你能做到10篇文章每个句 子都能听懂的时候,你就得到了你听力的第一笔财富,这个时候你就可以走路吃饭上厕所用mp3听了,但是只限这10篇文章!得到了第一笔财富,再谋第二笔、 第三笔财富(但是不要忘了经常复习第一笔财富,忘了复习就是丢了钱),财富积累到一定程度,量变就会转化为质变,你就会成为听力高手。
    俺的听力第二次飞跃是看Friends(中文译名:六人行)看的。Friends是美国近几十年来最出名的肥皂剧,一共播了10年,全球有上亿的观众。 Friends改变了美国一代人的英语,说的是最标准的美国英语,最精纯的美国幽默。原来听说央视要引进,后来据说审片的时候没审过,太多的sex话题。 俺和所有正义的大学同学一起大骂央视三个月,“泰坦尼克号”上半裸和小车上sex镜头倒是播个不亦乐乎,来一点sex话题好像能把中国颠覆一样(后来想了 想可能是央视的人不喜欢sex的话题,因为不够过瘾,一定要真刀真枪的干的东东他们才能播)。其实中国这一代的孩子,只怕早就已经被灯红酒绿光怪陆离的社 会玷污了,再播个friends也不见得能让孩子纯多少,白白放过了一个刺激中国孩子学英语的机会,打着精神文明的牌子把无数英语人才扼杀在摇篮之中,也 算是“造福后人”了。幸好还有网络这种东西,无数盗版电影电视满足了广大喜爱英语的有为青年(没有正版的大家只好看盗版的,可不是俺鼓动祖国花朵支持盗 版)。有了Toefl听力的底子,Friends很容易听懂。Friends一共10季,大概240集,俺至今看了不下7遍,熟悉的程度已经达到剧中人物 说第一句话俺就知道下一句话是什么的地步。听得多了(当然是有了一定单词量和听力的底子后),听力自然就牛了。我刚到美国与人说话不行,但是听力却基本没 什么问题,Friends至少有一半的功劳。By the way,俺有Friends的电子剧本,任何想练friends听力的同学均可与俺联系,俺的email附在文章结尾。

最后总结一下练听力的方法:
    找一篇听力文章,认真的听,重复的听,听不懂的句子找出原文看懂,所有听不懂的单词列成一个表,然后再听,一直到文章中每一个句子都听懂为止。然后再找第 二篇文章(最好是不同种类的文章),重复以上步骤,一直到每一个句子都听懂为止。以10篇文章为一个复习点,复习的时候先背原来列出来的听不懂的单词,背 熟了以后再回去从第一篇文章开始循环听,仍然是以听懂每一个句子为目标,只要有一个句子不懂就不要开始听其他的东东!当你能做到10篇文章每个句子都能听 懂的时候,你就得到了你听力的第一笔财富,这个时候你就可以走路吃饭上厕所用mp3听了,但是只限这10篇文章!得到了第一笔财富,再谋第二笔、第三笔财 富(但是不要忘了经常复习第一笔财富,忘了复习就是丢了钱),财富积累到一定程度,量变就会转化为质变,你就会成为听力高手。考试之前不妨多背一背积累下 来的听力词汇(就是听每一篇文章列出来的听不懂的单词),不失为临时抱佛脚的法门。

总结3:背出来的阅读
    阅读说白了就是比谁认识的单词多,虽然有些不认识的单词可以从上下文进行理解,但是文中关键的词汇不认识,往往成为阅读的致命伤。因此想要提高阅读水平, 最有效的方法不是多读,而是背尽量多的单词(单词掌握到一定程度,多读才有效果)。正如我上面所说,四级单词覆盖所有高中英语单词(有些怪词可能覆盖不 到,这些就必须靠上下文理解了),用俺上面的方法把四级单词背20遍,即可成为高中英语阅读能手,40遍可成为高手,60遍即可成为顶尖高手。
可以告诉各位一个检查阅读能力的方法:随机找一篇英语文章,读完以后圈出不认识的句子,然后检查不认识这些句子的原因,如果是单词不懂,说明你要多背单词,如果是单词懂但句子不懂说明你要多读。
总结就免了,这么简单的方法还总结什么呢~

总结4:背出来的作文
    读书破万卷,下笔如有神。从小所有人都把这句话当耳边风,没办法,原来世上本没有耳边风,说的人多了,自然就成为耳边风了。不过这句话放在英语作文上还真 不灵,要改成“背书破万卷,下笔如有神”才灵。因为看的英文文章再多,到写的时候照样一句都模仿不出来,毕竟不是自己的语言么。
我知道很多人会 说“又是背,而且还是背文章,你不如kill me now”。但是这绝对是写英语作文最有效的方法。大家可以做一个实验,不用你们背书万卷,只要背上两三篇文笔出众的英文文章,你立刻可以一跃成为高中英语 作文的高手。当然是要背得熟极而流,没有半分窒滞。否则上到考场上还要想一句写一句,还不如自己编,以免牛头不对驴嘴笑掉考官大牙。
    那么背英文文章的方法呢?谁问这个问题谁就该被踹屁股。“重复是记忆的根本”,你以为俺是说着玩的么?其实背英文文章比背单词要容易得多,有意义的东西 (句子)比没意义的东西(单词)要易记得多。背的时候一段一段的背,每一段重复上10遍其实就很熟了,背熟一段(达到脱口而出的境界)再背下一段,一篇文 章很快就背完了,此后走路上厕所的时候没事背一背,也比没事yy有追求得多。

总结5:背出来的口语
    口语本应该是说出来的,奈何中国没有这样的语言环境。有些同学喜欢搞英语角,但是一般都是以How are you、Fine, and you、Where are you from、How old are you开始,以I hate my mother (father)、I hate my English teacher、My teacher failed me again结束,说来说去都是这些无聊的东东,一点创意也没有,每换一个人就要把这些无聊的东东再重复一次,重复到没话说了又要再重复一遍,感觉累得要 死。特别是两个口语特蹩脚的家伙凑一起,两个人操着两口恶心的中国英语比谁更恶心。
所以在没有语言环境的环境下练口语,还不如自己在家里背上1500词的自我介绍,背熟了再去英语角恶心没背过自我介绍的家伙来得方便快捷。背完1500词转身就走,回家再背另外1500词,多么的行云流水挥洒自如玉树临风风流涕淌。
    其实口语这种东西,背得熟了自然就成了自己的,成了自己的对着别人的时候就可以编了。回想当初学普通话的时候还不是听老妈说“乖乖叫妈妈”才会叫“老 妈”,听老妈叫老爸“老公”多了才会对女朋友说“老婆”的么。口语,先偷别人的,再混合着自己的个性说出来,自然就是原创。
背什么比较好?不要 背同学的,也不要自己编,去背Friends的剧本吧,正宗的美国幽默,地道的美国英语,纯正的美国口音,还有什么比这个更臭美的?但是不要贪多误得,先 背一集的剧本先,背到能出口就是突突突突打机关枪一样的流畅再背下一集。背到三集以上(俺现在也就背了两集,一直没时间背),你就是中国人中的英语口语高 手了。

语法

    俺的语法并不好,现在也还是一样不好,因为到了大学以对语法的强调就少了。至今还没想出语法可不可以通过背来解决,但是背的句子多了,估计语法也不会差到哪里去。。。而且英语的语法并不多,复杂的不会就算了,简单的顶天也就十几二十种,多练习几次,自然就会了~

结束语
    以上是俺学英语的历史和经验总结。其实对英语的喜爱才是支持一个人学习英语的原动力,所以培养和英语的感情是至关重要的。如何培养?所有的喜爱以及所有的 实力全部全部源于背单词。就算你原来对英语憎之入骨恨不得喝其血啃其骨,一本几千个单词的单词书背了20遍后,你也一定会爱上这门只用牛劲不用智商的课 程。毕竟日久则情生,只要是心智正常的人类,又怎能免俗?
正如俺在msn日记中所说:英语是背出来的,但是“不用担心背的过程无聊,一个剧本背上二十遍以后,自然就会背出快感来,因为每说一句话都是那么的迅捷,那么的精彩,那么的天下无敌。”

                                                                                                                                                完毕
                      ,谈谈我的经历,考研单词差不多是6000多吧,充满电的MP3一个,随便什么单词书一本,必须有录音,准备好一大瓶茶水,找个上厕所方便的地方,最好在 教学楼附近,然后开始吧,早早的站个好位置,听吧,从第一单元听到最后一个单元,录音说一遍,你就说一遍,所以你马上就会口感舌燥的,喝水吧,喝多了你要 上厕所,哈哈,知道我为啥要让你准备水和离厕所近的地方了吧,这样差不多也得4个多小时才能把这些单词搞完,如果您想记得狠一点,100遍完整的跟读是必 须的,我当时是记了60遍完整的,然后每天就听一半,听一半时候不读,就坐着听,轻松多了,后来都听的恶心了,但是效果出奇的好,到最后考研前,基本上 90%的单词是记住了,50%的会写,因为考研只要求认识,不要求你写,所以我没做更近一步的强化,对了,我现在在听一部叫走遍美国的口语短剧,不错,口 语和听力都还可以练习,如果有需要,可以去下载,,就这么多,我第一次发帖,不知道这种帖子是否违反草榴版规,如果违反,版主大人删除了就可以了,不要禁 言扣分了,小弟马上摆脱新手上路,嘿嘿,望多关照

posted @ 2013-11-17 00:20 ZT文萃 阅读(224) | 评论 (0)编辑 收藏

      1、我自己当年,无论我在方正给国家打工,还是我在雅虎给外国人打工,我都跟别人最大的不一样,我从来不觉得我在给他们打工,我真的可能是很有自信 的人,我觉得我在为自己干。因为我干任何一件事我首先考虑的是,我通过干这件事我能学到什么东西,学到的东西是别人剥夺不走的,客观上可能给公司创造了价 值。

  2、一件事交给我我应付一下,很容易应付,应付完了之后不觉得是在浪费生命吗?一件事你可以把它做到 60 分,你可以做的很轻松,做完了你每天重复每天干三个小时活就完了,然后你天天上班没事,然后你回家三十亩地一头牛老婆孩子热炕头,但你怎么进步呢?人的进 步离开了学校之后,学习不再是上课也不是读书,通过你在工作中通过你做事情做项目积累自己的经验,跟很多人打交道。因为我有不服输的性格,再普通的事我要 做的比别人好,大家做的很普通我要做的跟大家不一样,要做到超出大家想象要花很多时间很多努力,但我最后发现我的收获最大的,因为我下了功夫,你的收获和 你的投入是成正比的。

  3、如果你混日子,对不起,实际上你是混自己,在很多大的公司混的很多,你能黑老板多少钱吗?你一年年薪 10 万,中低层收入你在单位混 10 年也就混老板 100 万,对很多公司来说有人混我 100 万对公司伤害不了哪去,可是你十年不好好工作,荒废了十年,十年可能突然有一天公司倒闭了,或者发现你这个混混把你开掉了,你怎么办呢?你觉得你有竞争力 吗?这个社会除非你有一个好爸爸,或者你有一个家族,这个不在咱们考虑之列,这不是我的哲学。

  4、你只要是白手打天下,你最后发现在社会上,这个社会越来越公正,我认为机会还是很多,你不要天天去愤青,去骂别人,至少有了互联网有了 IT,你看丁磊、马化腾、李彦宏都是平头百姓,他们在这个行业能成功,说明什么?说明只要你努力你也有机会成功,百度、谷歌还有 QQ 的很多员工,我们不提李彦宏,不提大佬们。他们公司很多员工参与这件事也很成功,有很多在北京买车、买房有成就感,这些东西靠什么?还是靠你能力的积累。

  5、我觉得在公司,真不喜欢这个公司,不喜欢老板,赶快辞职,一分钟也别见到他,我就这个风格。何必为了老板的错误耗费自己的生命,如果你今天 决定你又不离开在公司做工作,我觉得你应该把工作做好。有人说有几种问题,我有个性我不爱干这个,我说大哥,个性是成功人士的专利,你成功你当然觉得有个 性,别人看着你,你没有成功之前个性能换房子吗?如果个性能换房子,我比你有个性,我们全家有个性,但它换不了一个房子。

posted @ 2013-11-15 08:35 ZT文萃 阅读(157) | 评论 (0)编辑 收藏

    本文由xyz8808贡献
    2009-11-26 12:49//定义变量
    public delegate int HookProc(int nCode, Int32 wParam, IntPtr lParam);
    static int hKeyboardHook = 0;
    HookProc KeyboardHookProcedure;
    /*************************
    * 声明API函数
    * ***********************/
    // 安装钩子 (using System.Runtime.InteropServices;)
    [DllImport("user32.dll",CharSet=CharSet.Auto, CallingC.StdCall)]
    public static extern int SetWindowsHookEx(int idHook,HookProc lpfn, IntPtr hInstance, int threadId);
    // 卸载钩子
    [DllImport("user32.dll",CharSet=CharSet.Auto, CallingC.StdCall)]
    public static extern bool UnhookWindowsHookEx(int idHook);
    // 继续下一个钩子
    [DllImport("user32.dll",CharSet=CharSet.Auto, CallingC.StdCall)]
    public static extern int CallNextHookEx(int idHook, int nCode, Int32 wParam, IntPtr lParam);
    // 取得当前线程编号(线程钩子需要用到)
    [DllImport("kernel32.dll")]
    static extern int GetCurrentThreadId();
    //钩子子程:就是钩子所要做的事情
    private int KeyboardHookProc(int nCode, Int32 wParam, IntPtr lParam)
    {
    if (nCode >= 0)
    {
    /****************
    //线程键盘钩子判断是否按下键
    Keys keyData = (Keys)wParam;
    if(lParam.ToInt32() > 0)
    {
    // 键盘按下
    }
    if(lParam.ToInt32() < 0)
    {
    // 键盘抬起
    }
    ****************/
    /****************
    //全局键盘钩子判断是否按下键
    wParam = = 0x100 // 键盘按下
    wParam = = 0x101 // 键盘抬起
    ****************/
    KeyMSG m = (KeyMSG) Marshal.PtrToStructure(lParam, typeof(KeyMSG));//键盘
    // 在这里添加你想要做是事情(比如把键盘nCode记录下来,搞个邮件发送程序发到自己的邮箱去)
    return 0;//如果返回1,则结束消息,这个消息到此为止,不再传递。如果返回0或调用CallNextHookEx函数则消息出了这个钩子继续往下传递,也就是传给消息真正的接受者
    }
    return CallNextHookEx(hKeyboardHook, nCode, wParam, lParam);
    }
    //键盘结构
    public struct KeyMSG
    {
    public int vkCode; //键值
    public int scanCode;
    public int flags;
    public int time;
    public int dwExtraInfo;
    }
    // 安装钩子
    public void HookStart()
    {
    if(hKeyboardHook == 0)
    {
    // 创建HookProc实例
    KeyboardHookProcedure = new HookProc(KeyboardHookProc);
    // 设置线程钩子
    hKeyboardHook = SetWindowsHookEx( 13,KeyboardHookProcedure,Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]),0);
    //************************************
    //键盘线程钩子
    //SetWindowsHookEx( 2,KeyboardHookProcedure, IntPtr.Zero, GetCurrentThreadId()); //GetCurrentThreadId()为要监视的线程ID,你完全可以自己写个方法获取QQ的线程哦
    //键盘全局钩子,需要引用空间(using System.Reflection;)
    //SetWindowsHookEx( 13,KeyboardHookProcedure,Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]),0);
    //
    //关于SetWindowsHookEx (int idHook, HookProc lpfn, IntPtr hInstance, int threadId)函数将钩子加入到钩子链表中,说明一下四个参数:
    //idHook 钩子类型,即确定钩子监听何种消息,上面的代码中设为2,即监听键盘消息并且是线程钩子,如果是全局钩子监听键盘消息应设为13,
    //线程钩子监听鼠标消息设为7,全局钩子监听鼠标消息设为14。
    //
    //lpfn 钩子子程的地址指针。如果dwThreadId参数为0 或是一个由别的进程创建的线程的标识,lpfn必须指向DLL中的钩子子程。 除此以外,lpfn可
    //以指向当前进程的一段钩子子程代码。钩子函数的入口地址,当钩子钩到任何消息后便调用这个函数。
    //
    //hInstance应用程序实例的句柄。标识包含lpfn所指的子程的DLL。如果threadId 标识当前进程创建的一个线程,而且子程代码位于当前
    //进程,hInstance必须为NULL。可以很简单的设定其为本应用程序的实例句柄。
    //
    //threadedId 与安装的钩子子程相关联的线程的标识符。如果为0,钩子子程与所有的线程关联,即为全局钩子。
    //************************************
    // 如果设置钩子失败
    if(hKeyboardHook == 0 )
    {
    HookStop();
    throw new Exception("SetWindowsHookEx failed.");
    }
    }
    }
    // 卸载钩子
    public void HookStop()
    {
    bool retKeyboard = true;
    if(hKeyboardHook != 0)
    {
    retKeyboard = UnhookWindowsHookEx(hKeyboardHook);
    hKeyboardHook = 0;
    }
    if (!( retKeyboard))
    throw new Exception("UnhookWindowsHookEx failed.");
    }
    //*****************************
    试用了一下,不是很稳定,改回自带的 KeyUp函数了,记录以备查
    //自定义类型
    public enum HookType
    {
    WH_KEYBOARD = 2
    }
    public delegate int HOOKPROC(int nCode, int wParam, int lParam);
    //接口调用
    [DllImport( "User32.DLL ")]
    public static extern int SendMessage(IntPtr hWnd, uint Msg,int wParam,int lParam);
    [DllImport("kernel32")]
    public static extern int GetCurrentThreadId();
    [DllImport("User32.Dll")]
    public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
    [DllImport( "user32",CharSet=CharSet.Auto,CallingConvention=CallingConvention.StdCall)]
    public static extern int SetWindowsHookEx(HookType idHook,HOOKPROC lpfn,int hmod,int dwThreadId);
    [DllImport("user32.dll", CharSet = CharSet.Auto,CallingConvention = CallingConvention.StdCall)]
    public static extern int CallNextHookEx(int idHook, int nCode,int wParam,int lParam);
    //函数实现
    public void SetHook()
    {
    SetWindowsHookEx(HookType.WH_KEYBOARD,
    new HOOKPROC(this.MyKeyboardProc),
    0,
    GetCurrentThreadId());
    }
    public int MyKeyboardProc(int nCode, int wParam, int lParam)
    {
    IntPtr ParenthWnd = new IntPtr(0);
    bool isPressed = (((lParam & 0x80000000) == 0) && (nCode==0));
    CallNextHookEx(m_HookHandle, nCode, wParam, lParam); //先把消息发给系统默认处理队列
    global.lastKeyValue = wParam;
    ParenthWnd = FindWindow( null,"零售业务");
    switch(wParam)
    {
    case 112: //修改数量 F1
    if(isPressed)
    {
    inputType = global.ST_NUM_STP1;
    doKeyWork();
    }
    break;
    case 113: //备注 F2
    if(isPressed)
    {
    inputType = global.ST_REMARK;
    textBoxBZ.Focus();
    textBoxBZ.SelectAll();
    }
    break;
    case 114: //摘要 F3
    if(isPressed)
    {
    inputType = global.ST_ABST;
    textBoxZY.Focus();
    textBoxZY.SelectAll();
    }
    break;
    case 115: //支付 F4
    if(isPressed)
    if((global.saleList == null) || (global.saleList.Length == 0))
    break;
    else
    {
    showProductInfo();
    labelCPZS.Text = global.sAllNum.ToString() + " 件";
    labelYSJE.Text = global.sAllValue.ToString() + " 元";
    labelYHJE.Text = global.sPriValue.ToString() + " 元";
    labelSSJE.Text = global.sDueValue.ToString() + " 元";
    inputType = global.ST_GATHER_STP1;
    textBoxSK.Focus();
    textBoxSK.SelectAll();
    }
    break;
    case 116: //输入产品 F5
    if(isPressed)
    {
    inputType = global.ST_PRODUCT;
    textBoxSPMC.Focus();
    textBoxSPMC.SelectAll();
    }
    break;
    case 117: //开始新订单 F6
    if(isPressed)
    {
    resetSale(); //销售界面复位
    }
    break;
    default:
    //CallNextHookEx(m_HookHandle, nCode, wParam, lParam);
    break;
    }
    return(0);
    }
    ///
    /// 清理所有正在使用的资源。
    ///
    protected override void Dispose( bool disposing )
    {
    if( disposing )
    {
    if(components != null)
    {
    components.Dispose();
    }
    }
    base.Dispose( disposing );
    }
    C#中键盘钩子的使用
    默认分类 2008-07-05 17:33 阅读53 评论0 字号: 大大 中中 小小 public class Win32Hook
    {
    [DllImport("kernel32")]
    public static extern int GetCurrentThreadId();
    [DllImport( "user32",
    CharSet=CharSet.Auto,CallingConvention=CallingConvention.StdCall)]
    public static extern int SetWindowsHookEx(
    HookType idHook,
    HOOKPROC lpfn,
    int hmod,
    int dwThreadId);
    public enum HookType
    {
    WH_KEYBOARD = 2
    }
    public delegate int HOOKPROC(int nCode, int wParam, int lParam);
    public void SetHook()
    {
    // set the keyboard hook
    SetWindowsHookEx(HookType.WH_KEYBOARD,
    new HOOKPROC(this.MyKeyboardProc),
    0,
    GetCurrentThreadId());
    }
    public int MyKeyboardProc(int nCode, int wParam, int lParam)
    {
    //在这里放置你的处理代码 return 0;
    }
    }
    使用方法
    可以在Form的构造函数里放入
    Win32Hook hook = new Win32Hook();
    hook.SetHook();
    C#+低级Windows API钩子拦截键盘输入
    www.diybl.com 时间:2010-01-14 作者:匿名 编辑:Smi1e 点击: 9 [评论]
    -
    -
    摘要 在家里,婴儿和其它动物可能会重击你的计算机键盘,致使出现各种无法预言的结果。本文中的这个C#示例应用程序将向你展示如何基于Windows钩子API来实现在击键造成任何危害之前捕获它们。
    一. 简介
    猫和婴儿有很多共同之处。他们都喜欢吃家中养植的植物,都非常讨厌关门。他们也都爱玩弄你的键盘,结果是,你正发送给你的老板的电子邮件可能是以半截句子发送出去的,你的Excel帐户也被加入了一些乱七八糟的内容,并且你还没有注意到,当打开Windows资源管理器时,若干文件已经被移到了回收站!
    其解决方案是,开发一个应用程序实现如下功能:只要键盘处于"威胁状态"你就可以进行切换,并确保任何键盘输入活动都不会造成危害。本文想展示如何使用一种低级Windows API钩子在一个C#应用程序中实现键盘"控制"。下图是本文示例程序的一个运行快照。
    二. 背景
    其实,已经存在许多有关于Windows钩子的文章和示例代码,并且已经有人编写过与本文几乎一样的C++示例程序。然而,当我搜索相应的C#应用程序的源码时,却找到极少的.NET示例,而且没有一个程序能够提供一个方便的自包含的C#类。
    .NET框架能够使你以托管方式来存取你最常使用的键盘事件(通过KeyPress,KeyUp和KeyDown)。遗憾的是,这些事件都不能被用来停止Windows组合键(如Alt+Tab或Windows"开始"键),从而允许用户"远离"某一个应用程序。
    本文的想法在操作系统级上捕获键盘事件而不是通过框架级来实现。为此,应用程序需要使用Windows API函数来把它自身添加到应用程序"钩子链"中以监听来自操作系统的键盘消息。当它收到这种类型的消息时,该应用程序能够选择性地传递消息,或者进行正常处理,或者"镇压"它以便不再有其它应用程序(包括Windows)来影响它。本文正是想解释其实现机理。
    然而,请注意,本文中的代码仅适用于基于NT版本的Windows(NT,2000和XP),并且无法使用这个方法来停用Ctrl+Alt+Delete。有关于如何实现这一点,你可以参考MSDN有关资料。
    三. 使用代码
    为了易于使用,我在本文中提供了两个独立的zip文件。一个仅包含KeyboardHook类,这是本文介绍的重点。另一个是一个完整的微软Visual C# 2005 Express Edition应用程序工程,名叫"Baby Keyboard Bash",它实现显示击键的名字或彩色的形状以响应于击键。
    四. 实例化类
    键盘钩子是通过keyboard.cs中的KeyboardHook类来建立和管理的。这个类实现了IDisposable接口,因此,实例化它的最简单的方法是在应用程序的Main()方法中使用using关键字来封装Application.Run()调用。这将确保只要该应用程序开始即建立钩子并且,更重要的是,当该应用程序结束时立即使这个钩子失效。
    这个类引发一个事件来警告应用程序已经有键被按下,因此主表单能够存取在Main()方法中创建的KeyboardHook实例就显得非常重要;最简单的方法是把这个实例存储在一个公共成员变量中。
    KeyboardHook提供了三种构造器来启用或禁用某些设置:
    · KeyboardHook():捕获所有击键,没有任何内容传递到Windows或另外的应用程序。
    · KeyboardHook(string param):把参数串转换为Parameters枚举中的值之一,然后调用下面的构造器:
    · KeyboardHook(KeyboardHook.Parameters enum):根据从Parameters枚举中选择的值的不同,分别启动下列设置:
    o Parameters.AllowAltTab:允许用户使用Alt+Tab切换到另外的应用程序。
    o Parameters.AllowWindowsKey:允许用户使用Ctrl+Esc或一种Windows键存取任务栏和开始菜单。
    o Parameters.AllowAltTabAndWindows:启用Alt+Tab,Ctrl+Esc和Windows键。
    o Parameters.PassAllKeysToNextApp:如果该参数为true,那么所有的击键将被传递给任何其它监听应用程序(包括Windows)。
    当击键继续被键盘钩子捕获时,启用Alt+Tab和/或Windows键允许实际使用该计算机者切换到另一个应用程序并且使用鼠标与之交互。PassAllKeysToNextApp设置有效地禁用了击键捕获;这个类也是建立一个低级键盘钩子并且引发它的KeyIntercepted事件,但是它还负责把键盘事件传递到另一个监听程序。
    因此,实例化该类以捕获所有击键的方法如下:
    public static KeyboardHook kh;
    [STAThread]
    static void Main()
    {
    //其它代码
    using (kh = new KeyboardHook())
    {
    Application.Run(new Form1());
    }
    五. 处理KeyIntercepted事件
    当一外键被按下时,这个KeyboardHook类激活一个包含一些KeyboardHookEventArgs的KeyIntercepted事件。这是通过一个KeyboardHookEventHandler类型的方法使用以下方式来实现的:
    kh.KeyIntercepted += new KeyboardHook.KeyboardHookEventHandler(kh_KeyIntercepted);
    这个KeyboardHookEventArgs返回关于被按下键的下列信息:
    · KeyName:键名,通过把捕获的键代码强制转换为System.Windows.Forms.Keys而获得。
    · KeyCode:由键盘钩子返回的原来的键代码
    · PassThrough:指出是否这个KeyboardHook实例被配置以允许该击键传递到其它应用程序。如果你想允许一用户使用Alt+Tab或 Ctrl+Esc/Windows键切换到其它的应用程序的话,那么对之进行检查是很有用的。
    然后,使用一个具有适当签名的方法来执行击键所调用的任何任务。下面是一个示例片断:
    void kh_KeyIntercepted(KeyboardHookEventArgs e)
    {
    //检查是否这个键击事件被传递到其它应用程序并且停用TopMost,以防他们需要调到前端
    if (e.PassThrough)
    {
    this.TopMost = false;
    }
    ds.Draw(e.KeyName);
    }
    本文的剩下部分将解释低级键盘钩子是如何在KeyboardHook中实现的。
    六. 实现一个低级Windows API键盘钩子
    在user32.dll中,Windows API包含三个方法来实现此目的:
    · SetWindowsHookEx,它负责建立键盘钩子
    · UnhookWindowsHookEx,它负责移去键盘钩子
    · CallNextHookEx,它负责把击键信息传递到下一个监听键盘事件的应用程序
    创建一个能够拦截键盘的应用程序的关键是,实现前面两个方法,而"放弃"第三个。结果是,任何击键都只能传递到这个应用程序中。
    为了实现这一目标,第一步是包括System.Runtime.InteropServices命名空间并且导入API方法,首先是SetWindowsHookEx:
    using System.Runtime.InteropServices
    ……
    //在类内部:
    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    private static extern IntPtr SetWindowsHookEx(int idHook,
    LowLevelKeyboardProc lpfn, IntPtr hMod, uint dwThreadId);
    导入UnhookWindowsHookEx和CallNextHookEx的代码请见后面的讨论。
    下一步是调用SetWindowsHookEx来建立钩子,这时需要传递下列四个参数:
    · idHook:
    这个数字决定了要建立的钩子的类型。例如,SetWindowsHookEx可以被用于钩住鼠标事件(当然还有其它事件)。在本文情况下,我们仅对13有兴趣,这是键盘钩子的id。为了使代码更易读些,我们把它赋值给一个常数WH_KEYBOARD_LL。
    · Lpfn:
    这是一个指向函数的长指针,该函数将负责处理键盘事件。在C#中,"指针"是通过传递一个代理类型的实例而获得的,从而使之引用一个适当的方法。这是我们在每次使用钩子时所调用的方法。
    这里值得注意的是,这个代理实例需要被存储于这个类的一个成员变量中。这是为了防止一旦第一个方法调用结束它会被作为垃圾回收。
    · hMod:
    建立钩子的应用程序的一个实例句柄。我找到的绝大多数实例仅把它设置为IntPtr.Zero,理由是不大可能存在该应用程序的多个实例。然而,这部分代码使用了来自于kernel32.dll的GetModuleHandle来标识准确的实例从而使这个类更具灵活性。
    · dwThreadId:
    当前进程的id。把它设置为0可以使这个钩子成为全局构子,这是相应于一个低级键盘钩子的正确设置。
    SetWindowsHookEx返回一个钩子id,这个id将被用于当应用程序结束时从钩子链中脱钩,因此它需要存储在一个成员变量中以备将来使用。KeyboardHook类中的相关代码如下:
    private HookHandlerDelegate proc;
    private IntPtr hookID = IntPtr.Zero;
    private const int WH_KEYBOARD_LL = 13;
    public KeyboardHook()
    {
    proc = new HookHandlerDelegate(HookCallback);
    using (Process curProcess = Process.GetCurrentProcess())
    using (ProcessModule curModule = curProcess.MainModule)
    {
    hookID = SetWindowsHookEx(WH_KEYBOARD_LL, proc,GetModuleHandle(curModule.ModuleName), 0);
    }
    }
    七. 处理键盘事件
    如前面所提及,SetWindowsHookEx需要一个到被用来处理键盘事件的回调函数的指针。它期望有一个使用如下签名的函数:
    LRESULT CALLBACK LowLevelKeyboardProc( int nCode,WPARAM wParam,LPARAM lParam);
    其实,建立一个函数指针的C#方法使用了一个代理,因此,向SetWindowsHookEx指出它需要的内容的第一步是使用正确的签名来声明一个代理:
    private delegate IntPtr HookHandlerDelegate(int nCode, IntPtr wParam, ref KBDLLHOOKSTRUCT lParam);
    然后,使用相同的签名编写一个回调方法;这个方法将包含实际上处理键盘事件的所有代码。在KeyboardHook的情况下,它检查是否击键应该被传递给其它应用程序并且接下来激发KeyIntercepted事件。下面是一个简化版本的不带有击键处理代码的情况:
    private const int WM_KEYDOWN = 0x0100;
    private const int WM_SYSKEYDOWN = 0x0104;
    private IntPtr HookCallback(int nCode, IntPtr wParam, ref KBDLLHOOKSTRUCT lParam)
    {
    //仅为KeyDown事件过滤wParam,否则该代码将再次执行-对于每一次击键(也就是,相应于KeyDown和KeyUp)
    //WM_SYSKEYDOWN是捕获Alt相关组合键所必需的
    if (nCode >= 0 && (wParam == (IntPtr)WM_KEYDOWN || wParam == (IntPtr)WM_SYSKEYDOWN))
    {
    //激发事件
    OnKeyIntercepted(new KeyboardHookEventArgs(lParam.vkCode, AllowKey));
    //返回一个"哑"值以捕获击键
    return (System.IntPtr)1;
    }
    //事件没有被处理,把它传递给下一个应用程序
    return CallNextHookEx(hookID, nCode, wParam, ref lParam);
    }
    接下来,一个到HookCallback的参考被指派给HookHandlerDelegate的一个实例并且被传递到SetWindowsHookEx的调用,正如前一节所展示的。
    无论何时一个键盘事件发生,下列参数将被传递给HookCallBack:
    · nCode:
    根据MSDN文档,回调函数应该返回CallNextHookEx的结果,如果这个值小于零的话。正常的键盘事件将返回一个大于或等于零的nCode值。
    · wParam:
    这个值指示发生了什么类型的事件:键被按下还是松开,以及是否按下的键是一个系统键(左边或右边的Alt键)。
    · lParam:
    这是一个存储精确击键信息的结构,例如被按键的代码。在KeyboardHook中声明的这个结构如下:
    private struct KBDLLHOOKSTRUCT
    {
    public int vkCode;
    int scanCode;
    public int flags;
    int time;
    int dwExtraInfo;
    }
    其中的这两个公共参数是在KeyboardHook中的回调方法所使用的仅有的两个参数。vkCoke返回虚拟键代码,它能够被强制转换为System.Windows.Forms.Keys以获得键名,而flags显示是否这是一个扩展键(例如,Windows Start键)或是否同时按下了Alt键。有关于Hook回调方法的完整代码展示在每一种情况下要检查哪些flags值。
    如果flags提供的信息和KBDLLHOOKSTRUCT的其它组成元素不需要,那么这个回调方法和代码的签名可以按如下进行修改:
    private delegate IntPtr HookHandlerDelegate(
    int nCode, IntPtr wParam, IntPtr lParam);
    在这种情况中,lParam将仅返回vkCode。
    八. 把击键传递到下一个应用程序
    一个良好的键盘钩子回调方法应该以调用CallNextHookEx函数并且返回它的结果结束。这可以确保其它应用程序能够有机会处理针对于它们的击键。
    然而,KeyboardHook类的主要功能在于,阻止击键被传播到任何其它更多的应用程序。因此它无论在何时处理一次击键,HookCallback都将返回一个哑值:
    return (System.IntPtr)1;
    另一方面,它确实调用CallNextHookEx-如果它不处理该事件,或如果重载的构造器中的使用KeyboardHook传递的参数允许某些组合键通过。
    CallNextHookEx被启用-通过从user32.dll导入该函数,如下列代码所示:
    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    private
    static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode,
    IntPtr wParam, ref KeyInfoStruct lParam);
    然后,被导入的方法被HookCallMethod所调用,这可以确保所有的通过钩子接收到的参数被继续传递到下一个应用程序中:
    CallNextHookEx(hookID, nCode, wParam, ref lParam);
    如前面所提及,如果在lParam中的flags是不相关的,那么可以修改导入的CallNextHookEx的签名以把lParam定义为System.IntPtr。
    九. 移去钩子
    处理钩子的最后一步是使用从user32.dll中导入的UnhookWindowsHookEx函数移去它(当破坏KeyboardHook类的实例时),如下所示:
    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    [return: MarshalAs(UnmanagedType.Bool)]
    private static extern bool UnhookWindowsHookEx(IntPtr hhk);
    既然KeyboardHook实现IDisposable,那么这可以在Dispose方法中完成。
    public void Dispose()
    {
    UnhookWindowsHookEx(hookID);
    }
    hookID是构造器在调用SetWindowsHookEx所返回的id。这将从钩子链中删除应用程序。
    c#键盘钩子
    作者: lzh 类别: C#/VB 日期: 2003-5-27 22:22:19
    You can use system hook to hook any messages send to the application.
    Hooking the keyboard (WH_KEYBOARD) and mouse (WH_MOUSE) messages can be
    used to determine if the user interactive with the computer. You also can
    hook all the messages (WH_GETMESSAGE). The hook can be set with this code:
    public class Win32Hook
    {
    [DllImport("kernel32")]
    public static extern int GetCurrentThreadId();
    [DllImport( "user32",
    CharSet=CharSet.Auto,CallingConvention=CallingConvention.StdCall)]
    public static extern int SetWindowsHookEx(
    HookType idHook,
    HOOKPROC lpfn,
    int hmod,
    int dwThreadId);
    public enum HookType
    {
    WH_GETMESSAGE = 3
    }
    public delegate int HOOKPROC(int nCode, int wParam, int lParam);
    public void SetHook()
    {
    // set the keyboard hook
    SetWindowsHookEx(HookType.WH_GETMESSAGE,
    new HOOKPROC(this.MyKeyboardProc),
    0,
    GetCurrentThreadId());
    }
    public int MyKeyboardProc(int nCode, int wParam, int lParam)
    {
    //Perform your process
    return 0;
    }
    }
    Then you can install the hook procedure by the following code:
    Win32Hook hook = new Win32Hook();
    hook.SetHook();
    用钩子(hook)实现C#的屏幕键盘效果
    -
    SVN技术网 www.svn8.com 2010-01-20 08:38:02 来源:bbs.svn8.com 作者:佚名 点击:158次
    文章摘要:用钩子(hook)实现C#的屏幕键盘效果 要实现一个屏幕键盘,需要监听所有键盘事件,无论窗体是否被激活。因此需要一个全局的钩子,也就 是系统范围的钩子。 什么是钩子(Hook) 钩子(Hook)是Windows提供的一种消息处理机制平台,是指在程序正常运行中接受信息之前预先启动的函数,用来检查和修改传给该程序的信息,(钩子)
    -
    使用完钩子后,要进行卸载,这个可以写在析构函数中。
    12 public void Stop() {3 this.Stop(true, true, true);4 }5 6 public void Stop(bool uninstallMouseHook, bool uninstallKeyboardHook, 7 bool throwExceptions) {8 // if mouse hook set and must be uninstalled9 if (hMouseHook != IntPtr.Zero && uninstallMouseHook) {10 // uninstall hook11 bool retMouse = UnhookWindowsHookEx(hMouseHook);12 // reset invalid handle13 hMouseHook = IntPtr.Zero;14 // if failed and exception must be thrown15 if (retMouse == false && throwExceptions) {16 // Returns the error code returned by the last unmanaged function 17 // called using platform invoke that has the DllImportAttribute.18 // SetLastError flag set. 19 int errorCode = Marshal.GetLastWin32Error();20 // Initializes and throws a new instance of the Win32Exception class 21 // with the specified error. 22 throw new Win32Exception(errorCode);23 }24 }2526 // if keyboard hook set and must be uninstalled27 if (hKeyboardHook != IntPtr.Zero && uninstallKeyboardHook) {28 // uninstall hook29 bool retKeyboard = UnhookWindowsHookEx(hKeyboardHook);30 // reset invalid handle31 hKeyboardHook = IntPtr.Zero;32 // if failed and exception must be thrown33 if (retKeyboard == false && throwExceptions) {34 // Returns the error code returned by the last unmanaged function 35 // called using platform invoke that has the DllImportAttribute.36 // SetLastError flag set. 37 int errorCode = Marshal.GetLastWin32Error();38 // Initializes and throws a new instance of the Win32Exception class 39 // with the specified error. 40 throw new Win32Exception(errorCode);41 }42 }43 }44
    将这个文件编译成一个dll,即可在应用程序中调用。通过它提供的事件,便可监听所有的键盘事件。
    但是,这只能监听键盘事件,没有键盘的情况下,怎么会有键盘事件?其实很简单,通过SendInput
    API函数提供虚拟键盘代码的调用即可模拟键盘输入。下面的代码模拟一个 KeyDown 和 KeyUp 过程,
    把他们连接起来就是一次按键过程。
    1 private void SendKeyDown(short key) {2 Input[] input = new Input[1];3 input[0].type = INPUT.KEYBOARD;4 input[0].ki.wVk = key;5 input[0].ki.time = NativeMethods.GetTickCount();67 if (NativeMethods.SendInput((uint)input.Length, input, Marshal.SizeOf(input[0])) 8 < input.Length) {9 throw new Win32Exception(Marshal.GetLastWin32Error());10 }11 }1213 private void SendKeyUp(short key) {14 Input[] input = new Input[1];15 input[0].type = INPUT.KEYBOARD;16 input[0].ki.wVk = key;17 input[0].ki.dwFlags = KeyboardConstaint.KEYEVENTF_KEYUP;18 input[0].ki.time = NativeMethods.GetTickCount();1920 if (NativeMethods.SendInput((uint)input.Length, input, Marshal.SizeOf(input[0]))21 < input.Length) {22 throw new Win32Exception(Marshal.GetLastWin32Error());23 }24 }
    自己实现一个 KeyBoardButton 控件用作按钮,用 Visual Studio 或者 SharpDevelop 为屏幕键盘设计 UI,然后
    在这些 Button 的 Click 事件里面模拟一个按键过程。
    12 private void ButtonOnClick(object sender, EventArgs e) {3 KeyboardButton btnKey = sender as KeyboardButton;4 if (btnKey == null) {5 return;6 }78 SendKeyCommand(btnKey);9 }10 11 private void SendKeyCommand(KeyboardButton keyButton) {12 short key = keyButton.VKCode;13 if (combinationVKButtonsMap.ContainsKey(key)) {14 if (keyButton.Checked) {15 SendKeyUp(key);16 } else {17 SendKeyDown(key);18 }19 } else {20 SendKeyDown(key);21 SendKeyUp(key);22 }23 }
    其中 combinationVKButtonsMap 是一个 IDictionary>, key 存储的是VK_SHIFT, VK_CONTROL 等组合键的键盘码。左右两个按钮对应同一个键盘码,因此需要放在一个 List 里。
    标准键盘上的每一个键都有虚拟键码( VK_CODE)与之对应。还有一些其他的常量,
    把它写在一个静态 class 里吧。
    1 // KeyboardConstaint.cs2 internal static class KeyboardConstaint {3 internal static readonly short VK_F1 = 0x70;4 internal static readonly short VK_F2 = 0x71;5 internal static readonly short VK_F3 = 0x72;6 internal static readonly short VK_F4 = 0x73;7 internal static readonly short VK_F5 = 0x74;8 internal static readonly short VK_F6 = 0x75;9 internal static readonly short VK_F7 = 0x76;10 internal static readonly short VK_F8 = 0x77;11 internal static readonly short VK_F9 = 0x78;12 internal static readonly short VK_F10 = 0x79;13 internal static readonly short VK_F11 = 0x7A;14 internal static readonly short VK_F12 = 0x7B;1516 internal static readonly short VK_LEFT = 0x25;17 internal static readonly short VK_UP = 0x26;18 internal static readonly short VK_RIGHT = 0x27;19 internal static readonly short VK_DOWN = 0x28;2021 internal static readonly short VK_NONE = 0x00;22 internal static readonly short VK_ESCAPE = 0x1B;23 internal static readonly short VK_EXECUTE = 0x2B;24 internal static readonly short VK_CANCEL = 0x03;25 internal static readonly short VK_RETURN = 0x0D;26 internal static readonly short VK_ACCEPT = 0x1E;27 internal static readonly short VK_BACK = 0x08;28 internal static readonly short VK_TAB = 0x09;29 internal static readonly short VK_DELETE = 0x2E;30 internal static readonly short VK_CAPITAL = 0x14;31 internal static readonly short VK_NUMLOCK = 0x90;32 internal static readonly short VK_SPACE = 0x20;33 internal static readonly short VK_DECIMAL = 0x6E;34 internal static readonly short VK_SUBTRACT = 0x6D;3536 internal static readonly short VK_ADD = 0x6B;37 internal static readonly short VK_DIVIDE = 0x6F;38 internal static readonly short VK_MULTIPLY = 0x6A;39 internal static readonly short VK_INSERT = 0x2D;4041 internal static readonly short VK_OEM_1 = 0xBA; // ';:' for US42 internal static readonly short VK_OEM_PLUS = 0xBB; // '+' any country4344 internal static readonly short VK_OEM_MINUS = 0xBD; // '-' any country4546 internal static readonly short VK_OEM_2 = 0xBF; // '/?' for US47 internal static readonly short VK_OEM_3 = 0xC0; // '`~' for US48 internal static readonly short VK_OEM_4 = 0xDB; // '[{' for US49 internal static readonly short VK_OEM_5 = 0xDC; // '\|' for US50 internal static readonly short VK_OEM_6 = 0xDD; // ']}' for US51 internal static readonly short VK_OEM_7 = 0xDE; // ''"' for US52 internal static readonly short VK_OEM_PERIOD = 0xBE; // '.>' any country53 internal static readonly short VK_OEM_COMMA = 0xBC; // ',<' any country54 internal static readonly short VK_SHIFT = 0x10;55 internal static readonly short VK_CONTROL = 0x11;56 internal static readonly short VK_MENU = 0x12;57 internal static readonly short VK_LWIN = 0x5B;58 internal static readonly short VK_RWIN = 0x5C;59 internal static readonly short VK_APPS = 0x5D;6061 internal static readonly short VK_LSHIFT = 0xA0;62 internal static readonly short VK_RSHIFT = 0xA1;63 internal static readonly short VK_LCONTROL = 0xA2;64 internal static readonly short VK_RCONTROL = 0xA3;65 internal static readonly short VK_LMENU = 0xA4;66 internal static readonly short VK_RMENU = 0xA5;6768 internal static readonly short VK_SNAPSHOT = 0x2C;69 internal static readonly short VK_SCROLL = 0x91;70 internal static readonly short VK_PAUSE = 0x13;71 internal static readonly short VK_HOME = 0x24;7273 internal static readonly short VK_NEXT = 0x22;74 internal static readonly short VK_PRIOR = 0x21;75 internal static readonly short VK_END = 0x23;7677 internal static readonly short VK_NUMPAD0 = 0x60;78 internal static readonly short VK_NUMPAD1 = 0x61;79 internal static readonly short VK_NUMPAD2 = 0x62;80 internal static readonly short VK_NUMPAD3 = 0x63;81 internal static readonly short VK_NUMPAD4 = 0x64;82 internal static readonly short VK_NUMPAD5 = 0x65;83 internal static readonly short VK_NUMPAD5NOTHING = 0x0C;84 internal static readonly short VK_NUMPAD6 = 0x66;85 internal static readonly short VK_NUMPAD7 = 0x67;86 internal static readonly short VK_NUMPAD8 = 0x68;87 internal static readonly short VK_NUMPAD9 = 0x69;8889 internal static readonly short KEYEVENTF_EXTENDEDKEY = 0x0001;90 internal static readonly short KEYEVENTF_KEYUP = 0x0002;9192 internal static readonly int GWL_EXSTYLE = -20;93 internal static readonly int WS_DISABLED = 0X8000000;94 internal static readonly int WM_SETFOCUS = 0X0007;95 }
    文章来自[SVN中文技术网]转发请保留本站地址:http://www.svn8.com/dotnet/Csharp/2010012018328_2.html
    C#中键盘钩子的使用(转)
    public class Win32Hook
    {
    [DllImport("kernel32")]
    public static extern int GetCurrentThreadId();
    [DllImport( "user32",
    CharSet=CharSet.Auto,CallingConvention=CallingConvention.StdCall)]
    public static extern int SetWindowsHookEx(
    HookType idHook,
    HOOKPROC lpfn,
    int hmod,
    int dwThreadId);
    public enum HookType
    {
    WH_KEYBOARD = 2
    }
    public delegate int HOOKPROC(int nCode, int wParam, int lParam);
    public void SetHook()
    {
    // set the keyboard hook
    SetWindowsHookEx(HookType.WH_KEYBOARD,
    new HOOKPROC(this.MyKeyboardProc),
    0,
    GetCurrentThreadId());
    }
    public int MyKeyboardProc(int nCode, int wParam, int lParam)
    {
    //在这里放置你的处理代码 return 0;
    }
    }
    使用方法
    可以在Form的构造函数里放入
    Win32Hook hook = new Win32Hook();
    hook.SetHook();

posted @ 2013-11-14 07:56 ZT文萃 阅读(953) | 评论 (0)编辑 收藏

http://wuqinzhong.blog.163.com/blog/static/45222312009101711583439/

c#键盘钩子  

2009-11-17 11:58:34|  分类: C# |字号 订阅

c#键盘钩子:

    public class Win32Hook
    {

        [DllImport("kernel32")]
        public static extern int GetCurrentThreadId();

        [DllImport("user32",CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
        public static extern int SetWindowsHookEx(HookType idHook, HOOKPROC lpfn, int hmod, int dwThreadId);
        [DllImport("user32", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
        public static extern int CallNextHookEx(int hhk,int nCode,int wParam,int lParam);
        [DllImport("user32", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
        public static extern bool UnHookWindowsHookEx(int hhk);

        public enum HookType
        {
            WH_KEYBOARD = 2
        }

        public delegate int HOOKPROC(int nCode, int wParam, int lParam);
        public int hhk;

        public void SetHook()
        {
            // set the keyboard hook
            hhk = SetWindowsHookEx(HookType.WH_KEYBOARD, new HOOKPROC(this.MyKeyboardProc), 0, GetCurrentThreadId());
        }

        public int MyKeyboardProc(int nCode, int wParam, int lParam)
        {
            //在这里放置你的处理代码
            int iresult = 0;
            if (nCode<=0)
            {
                iresult = CallNextHookEx(hhk, nCode, wParam, lParam);
                return iresult;
            }
            if ((wParam >= 48 && wParam<=57)||(wParam >= 65 && wParam<=90)||(wParam >= 97 && wParam<=122))
            {
                Form1.rrrr += Convert.ToChar(wParam);
                return 0;
            }

            return 0;
        }
        public bool UnHook()
        {
           return UnHookWindowsHookEx(hhk);
        }

    }

使用:

Win32Hook hook = new Win32Hook();
            hook.SetHook();

            this.richTextBox2.Text = rrrr;
            hook.UnHook();

参考:http://baike.baidu.com/view/1208620.htm

使用参照:http://www.codeproject.com/KB/system/globalsystemhook.aspx

             (adamhtmei)

posted @ 2013-11-13 14:21 ZT文萃 阅读(207) | 评论 (0)编辑 收藏

11月6日,东吴证券从15个角度分析认为A股后市堪忧。

  第一点,东吴证券认为,年线 MACD死叉预示长期趋势看空。“首先从年线上看,A股大盘从1990年开市,首次出现年线MACD死叉,这预示A股中长期走势很弱。什么叫MACD死 叉?MACD的白线在黄线之上,它向下走与黄线交叉那个叉,就是死叉,表示应该考虑卖出股票。因此从MACD上看,大盘中长期走势不容乐观。”

  东吴证券称,第二点,高低点位置预示多方无力做多。今年最高点是年初的2444点,然后是2334点,接着是2270点,最后是2242点。“从高点上看,高点的位置是不断下移的,每一波的高点都比前一波低,这预示着多方无力做多。”

   东吴证券指出,第三点为市场资金面紧张将制约股指上攻。“当前,中国经济回升势头仍不明确,外围需求缺乏强劲的增长动力。为刺激经济发展,货币政策需要 一定程度的相对宽松。因此,我们判断未来央行逆回购的规模和力度仍将相对较小。四季度市场资金面可能一直处于比较紧张的状态。”

  第四点,重要均线揭示A股后市堪忧。从A股开市至今的23年中,如果A股跌破60日均线,平均跌幅达到7%左右,因此从历史统计上看,A股后市不容乐观。

  第五点,市场观点接近一致预示A股将下跌。当市场的评论人士对于A股的观点趋于一致时,市场往往会产生反转。

   第六点,见底形态不支持1849见底。东吴证券认为,从底部形态上看,最牢固的是圆弧底,其次是头肩底,再接着是双重底(又称W底),最后是V形反转。 “而我们可以看到1849是一根单针见底的K线,在技术面上叫做长尾线,又称螺旋桨K线形态,符合了V形反转的形态,这种形态往往是很不牢固的。历史的特 大底部,如325、512、998、1664等特大底部,从来都没有以V形反转的形态形成特大底部,因此从历史见底的规律上看,本轮的上涨应该只是反弹, 而绝非反转。”

  第七点,1849当日放量说明未见底。“从历史的特大底部上可以看到,任何一个底部所形成的当日成交量是缩量的,这是 因为空方主力杀跌的动能已经衰竭。而我们可以看到1849点形成当日,成交量是放量的,而股市里也有一句古话,叫‘放量不是底’,因此从成交量角度 看,1849点当日空方力量并未耗尽,在后期跌破概率较大。”

  第八点,神奇均线揭示A股未入牛市。东吴证券认为,在A股历史行情 中,156均线与321均线发生死叉后,往往会出现反弹,但是在反弹后都会把前期底部都砸掉,最慢的一次花了13个月时间!而目前大盘是在6月25号出现 1849底部的,据今已经过去了五个月不到,并且156均线也和321均线形成死叉,并在死叉后果真出现反弹。因此,从长期均线角度看,大盘跌破1849 点只是时间问题,跌破概率极大。

  第九点,断头闸刀形态预示A股中长线走坏。东吴证券称,在同一天内,一根阴线跌破5、10、30日三 根均线的形态,这就叫做断头闸刀形态。在10月23日,大盘出现了断头闸刀形态,这种形态的出现,这种断头闸刀形态的出现本身就是少之又少,但是一旦出 现,往往接下来就是一波夕阳西下的杀跌行情。

  第十点,箱体理论预示A股后期堪忧。东吴证券指出,箱体理论计算是一种可以准确预测大盘 中长期的运行趋势点位的一种简易方法。具体的方法有很多种,其中一种就是前低点乘以后高点再除以前高点,往往是后期大盘的第一目标位。目前,把1849乘 2270再除2334,得出1798点,因此从箱体理论上看,大盘跌破1849点概率还是较大的,A股后期堪忧。

  第十一点,量价理论 不支持A股走牛。“量无阴阳,只有大小。成交量的量柱在指数或个股中是从相对的低位开始逐渐满足135日均量线并超越135日均量线的时候,我们可以判断 是一轮上涨趋势的信号。反之,成交量的量柱是从相对高位开始逐渐萎缩并开始不满足135日均量线的时候,我们可以判断是一轮下跌趋势的信号。(相对的高位 是指上涨幅度达到50%以上,相对的低位是指下跌幅度达到50%以上)。目前大盘的成交量尚未超过前期1849点上升时的量能,而且量能没有一直满足 135均线量,没有形成堆量形态,因此从量价理论上看,大盘并未走牛。”

  第十二点,股票价格不支持A股见底。东吴证券指出,每次大盘跌到特大底部后,市场上的股票价格往往会跌到5元以下,而1849点形成时,股票的价格主要是在5-10元区间,并没有落到5元以下区间。因此从价格区间上看,大盘并未见底。

  第十三点,板块未同时见底说明大盘未见底。“每次大盘跌到特大底部后,往往板块会同时见底,而1849点见底后,还有些中小板**和创业板**股票在高位运行,因此从板块看,大盘未见底。”

   第十四点,高中物理斜率知识预示A股未走牛。“我们在高一上物理课时,物理老师曾经给我们讲过斜率的知识。同理,我们将其应用于股市之中,如果股票上升 的角度太过于平缓,往往这种股票很容易横盘整理,没多大前途。如果股票上升的角度是很陡峭的,那么往往会涨的快跌的也快。可以看到,大盘在往2270点上 攻时,上攻角度达到接近80度左右,预示大盘的上涨很难有持续性。最佳的上攻角度应该是45度左右,这种持续性往往会比较高。”

  第十 五点,撬动牛市的支点远未到来。东吴证券认为,估值与业绩走牛是推动牛市到来的支点。“估值与业绩是推动股价运行的两个最主要因素。从影响市场的主要因素 来看,产能过剩阴影压抑了目前库存周期回补力度,而PPI与企业资产负债表数据也显示目前企业层面盈利改善能力提升仍然需要等待,更多的企业特别是周期类 企业处于艰难的去杠杆、去产能阶段。”

posted @ 2013-11-06 18:07 ZT文萃 阅读(146) | 评论 (0)编辑 收藏

http://article.pchome.net/content-1409199.html

在Linux中,没有文件创建时间的概念。只有文件的访问时间、修改时间、状态改变时间。也就是说不能知道文件的创建时间。但如果文件创建后就没有 修改过,修改时间=创建时间;如果文件创建后,状态就没有改变过,那么状态改变时间=创建时间;如果文件创建后,没有被读取过,那么访问时间=创建时间, 这个基本不太可能。

与文件相关的几个时间:

1、访问时间,读一次这个文件的内容,这个时间就会更新。比如对这个文件使用more命令。ls、stat命令都不会修改文件的访问时间。

2、修改时间,对文件内容修改一次,这个时间就会更新。比如:vi后保存文件。ls -l列出的时间就是这个时间。

3、状态改变时间。通过chmod命令更改一次文件属性,这个时间就会更新。查看文件的详细的状态、准确的修改时间等,可以通过stat命令 文件名。

比如: [jing@zhjh c]$ stat temp.c

引用:

File: 'temp.c'

Size: 66 Blocks: 8 IO Block: 4096 u4e00u822cu6587u4ef6

Device: 807h/2055d Inode: 1191481 Links: 1

Access: (0664/-rw-rw-r--) Uid: ( 500/ jing) Gid: ( 500/ jing)

Access: 2008-03-12 20:19:45.000000000 0800

Modify: 2008-03-12 20:19:45.000000000 0800

Change: 2008-03-12 20:19:45.000000000 0800

说明:Access访问时间。Modify修改时间。Change状态改变时间。可以stat *查看这个目录所有文件的状态。

posted @ 2013-10-24 14:17 ZT文萃 阅读(432) | 评论 (0)编辑 收藏

http://www.ordosgo.cn/ordos-27-45011-1.html

http://www.sbanzu.com/topicdisplay.asp?BoardID=11&Page=1&TopicID=4075907
女子遭奸杀肢解千里抛尸,死者隆胸硅胶成破案关键。在经典的推理小说中,大侦探们说:“每一个细微的结果,都必定有一个特定的原因,那就是真相。”凶手残忍分尸并千里抛尸,正当案情扑朔迷离之际,死者隆胸的一块硅胶最终成为破案的关键。

这绝对是一起可以用“丧心病狂”来形容的案件。凶手残忍分尸并千里抛尸,正当案情扑朔迷离之际,死者隆胸的一块硅胶最终成为破案的关键。在经典的推理小说中,大侦探们说:“每一个细微的结果,都必定有一个特定的原因,那就是真相。”

 死者头部被水泥浇筑,藏匿在凶手家中。   这绝对是一起可以用“丧心病狂”来形容的案件。凶手残忍分尸并千里抛尸,正当案情扑朔迷离之际,死者隆胸的一块硅胶最终成为破案的关键。在经典的推理小说中,大侦探们说:“每一个细微的结果,都必定有一个特定的原因,那就是真相。”
  发现尸块
  两名渔民打渔至鹿屿岛附近,发现距离岸边不远处漂浮着一个大箱子,一浮一沉。严密的封锁似乎向人们暗示,箱子内藏着重大的秘密。
  在汕头市汕头港湾内,有一座小岛叫鹿屿岛。这座面积只有13万平方米的小岛没有居民,只有海事部门的航标人员长期驻守在这里。鹿屿岛上的老灯塔至今已有130多年历史,是我国目前保存较好的百年灯塔之一。
   今年6月30日,天气晴好。为避免夏天的烈日,渔民们往往清晨出海打渔。上午6点多,朝阳已经斜斜地铺在海面上,波光鳞鳞。两名渔民打渔至鹿屿岛附近, 发现距离岸边不远处有漂浮着一个大箱子,一浮一沉。两名渔民揉揉眼睛,确定那是一个大号的行李箱。他们兴奋地驾船过去,打捞旅行箱。箱子外面还被一个铁架 子包裹着,铁笼还系上了铁链,防止箱子脱落,铁链上还有两把大锁。这个海滩经常漂浮物漂到这里来,多是遗弃无用的东西。但这个箱子外观比较漂亮,不像是随 便丢弃的。严密的封锁似乎向人们暗示,箱子内藏着重大的秘密。渔民兴奋地用锤子敲开铁链上的锁,将箱子从铁架中拖了出来。而此时,离开水面的旅行箱已经发 出了明显的恶臭。打开行李箱的那一刻,渔民彻底惊呆了,因为箱子里竟然装着一具没有头颅的尸体。
  接到报警,汕头警方迅速前往鹿屿岛。“尸块确 定为女性,高度腐烂,缺失头部和右腿,现场判断死者已经遇害有一段时间了,连包装尸块的袋子和毛巾都已褪色得非常厉害”,汕头市龙湖区公安分局刑侦大队一 中队副中队长李鹏飞回忆说。这起骇人听闻的碎尸案引起汕头警方的高度重视,“6·30”碎尸案专案组迅速成立。
  案件调查一开始就遇到许多棘手 的问题,最先要弄清楚尸块的来源。专案组分析,尸块的来源有三种可能:一是有人驾船来到鹿屿岛附近抛尸;二是装有尸块的行李箱从上游的水域漂流至此;三是 潮汐将行李箱从外海带了过来。要前往鹿屿岛必须在最近的妈屿岛包船前往,两岛之间距离约700米。专案组人员首先走访了距离鹿屿岛最近的渔民们,但是他们 都表示最近并没有发现有可疑的陌生人前往鹿屿岛。第一种可能被排除了。鹿屿岛上游不远就是海湾大桥。汕头海湾大桥位于汕头港东部出入口妈屿岛海域处,为跨 海公路桥。这座大桥是深汕两地一级汽车专 用公路的配套设施,是连结深圳、珠海、汕头、厦门等4个经济特区的陆地交通纽带。是否是有人携带装有尸块的行李箱从外地来此,从海湾大桥上抛尸呢?但是专 案组调取海湾大桥的监控录像显示,没有任何发现。一位居住妈屿岛上的67岁的老伯为专案组提供了一条重要的线索。他常年在附近海域打渔,对鹿屿岛附近的水 文相当了解。他说,鹿屿岛初一、十五有两次涨潮、两次退潮,因此常有外水域的重物被潮汐卷流来此。由于水流迂回复杂,尽管已经基本确定行李箱来自外海水 域,但是专案组仍旧很难将抛尸的第一现场缩小到一定的范围。
  死者头部被水泥浇筑,藏匿在凶手家中。分尸地点在凶手居住的坑梓出租屋。
  尸检真相
  碎尸案的关键是找到尸源,也就是确定死者的身份。尸源找到了,案件就破获了一半。
   装尸块的行李箱呈灰色、硬塑料质地,有卡通图案。仅一天不到的时间,专案组就确定了箱子来自温州一个箱包厂家。但是由于这个箱子的流向太多,非常普通, 希望通过行李箱来寻找尸源的思路显然行不通。于是,尸块本身成为破案的关键。如何在最短的时间内查找到尸源,就要看法医能不能尽自己所能为侦查提供一些线 索、缩小查找范围了。
  旅行箱内的尸块蜷曲状,头部和右腿缺失,全身赤裸,高度腐败,一只光脚抵在箱盖上。彭晓,汕头市公安局龙湖分局刑侦大队 一中队中队长,当他真正接触到尸体的皮肤时,才知道不仅仅是视觉,就连触觉也在不断挑战神经。由于一直被海水浸泡,尸体表面已经像肥皂一样滑,戴着乳胶手 套的手根本抓不住尸体的胳膊。死者的双手被一根电线捆绑,捆绑的双手又被电线缠绕与左大腿固定。一般来说,尸体在死后一两个小时就出现尸僵硬,尸僵形成后 尸体就很难卷曲了。而尸体完全被屈曲塞进一个旅行箱,而且尸体外面还套了两层黑色的塑料袋。也就是说,凶手在尸僵形成之前,就完成了捆绑、包裹、卷曲、装 袋的程序。因此,专案组初步推测,凶手在野外,在尸僵形成前的一两个小时内找到这么多物件,完成分尸、捆绑、包裹、装袋等程序的可能性很小。因此,死者的 遇害第一现场应该是室内。
  尸体被直接送往解剖室。高度腐败的尸体会散发有毒气体,法医佩戴的防毒面具虽然可以过滤掉大量的有毒气体,但是不能完全阻挡臭味。那种尸体的腐臭还夹杂着酸臭,让靠近的人肠胃迅速翻腾起来。
  解剖台上的这具女性的残缺尸体,皮肤显得格外苍白,没有头和一条腿的躯干孤零零地躺在解剖台上,让人感觉毛骨悚然。尽管尸体腐败很厉害,但是还是能够看出来死者比较年轻,身材很好。死者的左大腿还有一处精致的纹身,脚趾甲涂有鲜红的指甲油。
   在法医尸检过程中,死者的年龄可以直接通过牙齿来判断,经验丰富的法医还会结合耻骨联合面的形态来判断。这样判断的结果会更加准确,误差在一两岁之间。 在碎尸案中,死者的身高可以通过多根长骨的尺寸来推断。由于这具女尸无头,所以法医通过耻骨推断该女子年龄约22岁,身高160-165厘米,无生育经 历,遇害约一个月时间。
  法医注意到,凶手显然对人体组织不熟悉,分尸的手法很拙劣,下刀处不是关节,而是致密的肌腱部位。尸体的右大腿根部, 股骨都被硬生生地砍断了,能把肱骨、股骨这两块人体中最硬的骨骼砍断,凶手肯定费了不少力气。根据尸体缺失部分的皮肤和组织,法医推测割皮肤的肌肉的是一 把轻便而锋利的刀具,而剁骨头的刀具应该是很重的那种砍刀。这两种特点无法在一把刀具上具备。死者刚死,凶手就用这两把刀具来分尸。
  法医在尸体上没有找到尸斑。一般尸斑浅淡多见于严重失血或者溺死的尸体上。既然死者不是死于失血性休克,那么因为死后被肢解而大量失血,尸斑也可以是几乎不可见的。专案组推断,凶手杀完人能够迅速完成尸体肢解的动作,说明凶手肢解尸体的工具应该是早已准备好的。
   尸体的身体上没有明显的伤痕,但是法医却在死者的胸部发现一处不明显的苍白区域。死者本来皮肤就白,加之失血,所以苍白区更不容易发现。法医用酒精反复 擦拭后,苍白区越发明显。这是因为,人活着的时候,全身血管中血液流动。但是如果在此时身体的一部分软组织被重物压迫,血液就不能流动到此处的毛细血管 中,受压的部分就会缺血。如果人在重压的同时死亡,血液停止流动,即时重压解除,血液也不会流回到这个部分了。死者胸部的白斑很可能是临死前被压迫胸部导 致,凶手的目的是什么?强奸、扼颈或捂鼻。一般杀人导致死者机械性窒息的案件,尸体头部会提示许多窒息征象,作为明确死因的参考。但是这具尸体头部缺失, 法医初步判定,死者是被凶手狠狠压住胸部不能动弹,窒息而死。
  揭秘死者
  尸块最特别的是胸部,死者生前做过隆胸手术,法医发现隆胸的硅胶上竟然有一串细小的编码IMGHC-TX-H-270!这个重大发现让专案组很是兴奋,立刻要求法医人员对胸部内的硅胶进行检验。
   因为如果能通过硅胶找到为死者做隆胸手术的医疗机构,死者的身份就能够确定了。按照这个思路,专案组根据硅胶上的相关信息,很快找到了这家硅胶生产厂 家。7月1日,彭晓等专案组成员飞往武汉,寻找这种硅胶的总经销商。硅胶上的数字正是产品的批号。这批产品是3月24日武汉总经销商进货的,有29个发往 全国的整形医院,有15个女性使用了该批号的硅胶。由于患者大多不愿意在整形医院留 下自己的真实信息,专案组成员只能通过主刀医生逐一回访这15个手术者来排查。一个在珠海一家整形医院做过隆胸手术的年轻女子小清引起了彭晓的注意。她于 4月3日在珠海这家整形医院完成了隆胸手术,使用的正是这个批次的硅胶。医生拨打小清的电话已经无法接通,而她的年龄、身高等特征与死者基本相符。
   6月12日,深圳市桂园派出所接到小清父亲的报案,称女儿在深圳离奇失踪。原来,小清今年22岁,是广西北流市人,长期居住珠海,是一个平面模特。6月 7日,她因为在深圳有拍摄任务,所以从珠海来到深圳罗湖的红桂路朋友小雪家暂住。6月8日,小清出门后就和大家都失去了联系。小雪证实,由于模特行业对身 材要求很高,所以4月3日正是她陪同小清在珠海这家整形医院完成了隆胸手术。小清左腿有纹身,其到深圳的当日,两个好朋友还去做了美甲,小清为自己的脚趾 甲选择了鲜艳的大红色。这个失踪的美女模特,无论年龄、外形、身高等特征都与死者高度吻合。专案组委托广西警方提取了小清父母的DNA,结果与尸块的 DNA比对,确定“6·30”碎尸案的死者就是广西籍青年女子小清。由于案情重大,罗湖刑警大队立即介入调查,并与汕头警方成立联合专案组开始深入侦察。
  锁定嫌犯
  死者的身份一旦确定,案件的侦破就迈出了关键的一步。
  情杀?仇杀?还是激情杀人?专案组逐步排查、分析,发现小清在珠海有一个香港籍的男朋友,没有情感纠纷,该男子并没有作案的动机。小清在近期也没有跟人结怨。因此,基本排除了情杀和仇杀的可能。长期居住珠海的小清失踪于深圳,专案组分析很可能是陌生人作案。
  通过银行开卡记录,警方发现就在小清失踪后几天中,分别有人分三次从小清的银行卡上取走了5万多元的存款:
  6月22日,12:53分左右,在深圳坂田的一柜员机,一名身穿雨衣把自己包裹得严严实实的戴眼镜男子第一次取款。
  6月26日,0:56分左右,在深圳田贝一柜员机,一名身着睡衣、头部和手部缠绕有绷带的男子再次取款。
  7月2日,17:57分,在深圳南山一柜员机,一名头戴鸭舌帽、身穿白色T恤的戴黑框眼镜的男子第三次取款。
   三次提款人均为男性,但是可以看出凶手十分狡猾,每次都乔装打扮,而且选择距离很远的不同银行的提款机取款。专案组很难确定凶手是一个人还是多个人。很 多时候,尸体虽然已经没有生命,但是会透露很多信息。小清的双手被一根电线捆绑,捆绑的双手又被电线缠绕与左大腿固定。凶手将其捆绑的主要目的是能够将蜷 曲的尸体塞进不够大的黑色塑料袋。专案组分析,如果凶手是两个或两个以上的人,完全可以一个人拿塑料袋,一个人蜷曲尸体塞进塑料袋。正因为凶手是一个人, 他才不得不先捆绑双手,再将双手与左腿固定,将尸体蜷曲后才塞进黑色塑料袋。由此看来,凶手只有一人,这个三次出现在不同提款机机前取走小清存款的年轻男 子很可能就是凶手本人。
  专案组由此推断,凶手谋财害命的可能性很大。凶手带走的死者赃物可能成为案件的新的突破口。“我们当时就看死者的物品流向哪里来进行摸查,二手市场成为摸查重点”,彭晓说。深圳罗湖刑警大队很快监控到死者一部苹果手机出现在深圳华强北手机市场,一个黄姓男子曾经使用过。7月6日18时许,罗湖警方在华强北经济大厦一楼找到了做手机生意的黄姓男子以及死者的两部手机。该男子称,手机是其表哥阿山送给他的。至此,嫌疑人已基本锁定为阿山。
  凶手落网
  黄某的表哥阿山今年29岁,是汕头市朝阳区人,近期以开蓝牌车营生。深圳警方决定密捕阿山,由深圳市公安局罗湖分局刑侦大队副中队长曾雁鹏带队,便衣前往。
   阿山和妻子暂住在深圳市罗湖区桂圆木坊的一处出租屋。桂木坊是“城中村”,房屋分布零散,门牌号也十分不规范,有的门牌是用油漆喷的,有的则是用笔写 的,搜查进展十分困难。搜寻中,罗湖警方竟然找到两个门牌上都写着“罗湖区桂园路桂木坊14号某房”的住房,到底哪个才是嫌疑人黄某的住址呢?
   经询问,罗湖警方排除了其中一个住房,但另一个住房因无人在家难以确认情况。在房屋门口守候时,罗湖刑警大队主办警员曾雁鹏敲了隔壁房间的大门,欲从邻 居处了解情况,却意外发现屋内居然就是阿山的妻子。嫌疑人真正的住址找到了!三个大人和一个不足1岁的婴儿正在一套40多平米的出租屋中,他们分别是阿山 的妻子、小姨子、小舅子和儿子。出租屋堆满了物品,拥挤而杂乱,整套房间只有厨房所在的阳台上有一扇窗,光线昏暗,空气中夹杂着汗臭味。
  阿山 不在家,为了不打草惊蛇,负责抓捕行动的罗湖刑警大队一中队几名队员在阿山家门口守株待兔。 已经凌晨了,阿山还是没有露面。难道阿山嗅到了危险的气息?对于参战的抓捕队员来说,这样的通宵达旦蹲守是常有的事情。凌晨6点,晨晖开始洒向大地,阿山 突然出现在出租屋前的街道上。阿山落网,在他身上,罗湖警方搜出被害人小清的手表和6张信用卡。

  案情还原
  小清的遇害经过被还原:案发前,阿山因为赌博债台高筑,他决定利用蓝牌车实施抢劫杀人。
   阿山租下深圳市龙岗坑梓镇金沙路的一间出租屋,这间出租屋十分特别,拉开卷帘门,轿车可以直接开进屋内,即便挟持受害人下车也难以被发现。随后,他又在 深圳东门步行街分别购买了大型的旅行箱、锋利的弯刀和砍刀、胶布、黑色塑料袋等作案工具。6月8日下午3时许,在深圳市罗湖区东门新园路,打扮时髦的小清 坐上了阿山的吉利牌小轿车,谈好价额准备前往深圳龙华某商城拍摄平面照片。天气炎热,小清不仅穿着时髦暴露,肩背的LV手袋更引起了阿山的注意。谈话间, 坐在前排副驾驶的小清一边补妆一边得意地跟阿山说,自己新交的香港籍男友很有钱,出手阔绰。行驶途中,一脸傲气的小清还与阿山发生了语言冲突,直呼阿山 “屌丝一个”。本对杀人劫财还有些犹豫的阿山在那一刻下定了决心。他将车开到僻静处,亮出闪亮的尖刀,用胶带将小清封口,用电线捆绑双手,直接将车开进坑 梓镇金沙路的那间出租屋。
  在出租屋中,阿山展开疯狂的报复,他先强奸了小清,随后逼迫被害人说出银行卡的密码。劫色劫财后,为了不让事情败 露,阿山想到了一个“杀人灭口”的方式:千里抛尸可以逃避侦查,将躯干和头部分尸藏匿后警方就难以判断死者身份。阿山想,将尸体沉入江中顺流入海,这样小 清的尸体就从此消失了。肢解过程中他才发现尽管已经是最大号的旅行箱,但是仍旧不能容纳一个无头的尸体,于是他不得不将死者的右大腿从肱骨处切下。
  第二天,考虑到自己比较了解家乡的情况,阿山决定驾车将装有小清尸体躯干的旅行箱运回自己的老家——汕头市潮阳区关埠镇。他把这个箱子放在一个铁架内,用铁链锁住后带到榕江东湖码头,沉入江中。
   6月11日,阿山回到深圳,在坑梓的出租屋内又将装有被害人头部和残肢的纸板箱用水泥浇筑后,放置在深圳市罗湖区桂园路桂木坊的自己和老婆居住的出租屋 中。在近一个月的时间里,知道丈夫被抓获,阿山的妻子都不知道丈夫在家中藏匿了尸块。阿山本来还准备寻找机会来抛弃这个装有尸块的纸箱。警方也证实,阿山 就是三次取走受害人存款的人。就在阿山丢弃尸块的那天,天空下起大雨,阿山以为被绑上铁链放置在铁架中的箱子会因为重量沉入水里,但是事与愿违,箱子在水 里一浮一沉。阿山转身寻找物品想要加重时,一回头,箱子已经被水流冲走。从那一刻起,阿山就感到自己终将落网。

posted @ 2013-10-22 15:31 ZT文萃 阅读(225) | 评论 (0)编辑 收藏

http://soft.chinabyte.com/os/291/11696291.shtml

     1、Linux命令行下将文件checkout到本地目录

  svn checkout path(path是服务器上的目录)

  例如:svn checkout svn://192.168.1.1/pro/domain

  简写:svn co

  2、Linux命令行下往版本库中添加新的文件

  svn add file

  例如:svn add test.php(添加test.php)

  svn add *.php(添加当前目录下所有的php文件)

  3、Linux命令行下将改动的文件提交到版本库

  svn commit -m “LogMessage“ [-N] [--no-unlock] PATH(如果选择了保持锁,就使用–no-unlock开关)

  例如:svn commit -m “add test file for my test“ test.php

  简写:svn ci

  4、Linux命令行下的加锁/解锁

  svn lock -m “LockMessage“ [--force] PATH

  例如:svn lock -m “lock test file“ test.php

  svn unlock PATH

  5、Linux命令行下更新到某个版本

  svn update -r m path

  例如:

  svn update如果后面没有目录,默认将当前目录以及子目录下的所有文件都更新到最新版本。

  svn update -r 200 test.php(将版本库中的文件test.php还原到版本200)

  svn update test.php(更新,于版本库同步。如果在提交的时候提示过期的话,是因为冲突,需要先update,修改文件,然后清除svn resolved,最后再提交commit)

  简写:svn up

  6、Linux命令行下查看文件或者目录状态

  1)svn status path(目录下的文件和子目录的状态,正常状态不显示)

  【?:不在svn的控制中;M:内容被修改;C:发生冲突;A:预定加入到版本库;K:被锁定】

  2)svn status -v path(显示文件和子目录状态)

  第一列保持相同,第二列显示工作版本号,第三和第四列显示最后一次修改的版本号和修改人。

  注:svn status、svn diff和 svn revert这三条命令在没有网络的情况下也可以执行的,原因是svn在本地的.svn中保留了本地版本的原始拷贝。

  简写:svn st

  7、Linux命令行下删除文件

  svn delete path -m “delete test fle“

  例如:svn delete svn://192.168.1.1/pro/domain/test.php -m “delete test file”

  或者直接svn delete test.php 然后再svn ci -m ‘delete test file‘,推荐使用这种

  简写:svn (del, remove, rm)

  8、Linux命令行下查看日志

  svn log path

  例如:svn log test.php 显示这个文件的所有修改记录,及其版本号的变化

  9、Linux命令行下查看文件详细信息

  svn info path

  例如:svn info test.php

  10、Linux命令行下比较差异

  svn diff path(将修改的文件与基础版本比较)

  例如:svn diff test.php

  svn diff -r m:n path(对版本m和版本n比较差异)

  例如:svn diff -r 200:201 test.php

  简写:svn di

  11、Linux命令行下将两个版本之间的差异合并到当前文件

  svn merge -r m:n path

  例如:svn merge -r 200:205 test.php(将版本200与205之间的差异合并到当前文件,但是一般都会产生冲突,需要处理一下)

  12、Linux命令行下SVN 帮助

  svn help

  svn help ci

  以上是常用命令,下面写几个不经常用的

  13、Linux命令行下版本库下的文件和目录列表

  svn list path

  显示path目录下的所有属于版本库的文件和目录

  简写:svn ls

  14、Linux命令行下创建纳入版本控制下的新目录

  svn mkdir: 创建纳入版本控制下的新目录。

  用法: 1、mkdir PATH…

  2、mkdir URL…

  创建版本控制的目录。

  1、每一个以工作副本 PATH 指定的目录,都会创建在本地端,并且加入新增调度,以待下一次的提交。

  2、每个以URL指定的目录,都会透过立即提交于仓库中创建.在这两个情况下,所有的中间目录都必须事先存在。

  15、Linux命令行下恢复本地修改

  svn revert: 恢复原始未改变的工作副本文件 (恢复大部份的本地修改)。revert:

  用法: revert PATH…

  注意: 本子命令不会存取网络,并且会解除冲突的状况。但是它不会恢复被删除的目录

  16、Linux命令行下代码库URL变更

  svn switch (sw): 更新工作副本至不同的URL。

  用法: 1、switch URL [PATH]

  2、switch –relocate FROM TO [PATH...]

  1、更新你的工作副本,映射到一个新的URL,其行为跟“svn update”很像,也会将服务器上文件与本地文件合并。这是将工作副本对应到同一仓库中某个分支或者标记的方法。

  2、改写工作副本的URL元数据,以反映单纯的URL上的改变。当仓库的根URL变动(比如方案名或是主机名称变动),但是工作副本仍旧对映到同一仓库的同一目录时使用这个命令更新工作副本与仓库的对应关系。

  17、Linux命令行下解决冲突

  svn resolved: 移除工作副本的目录或文件的“冲突”状态。

  用法: resolved PATH…

  注意: 本子命令不会依语法来解决冲突或是移除冲突标记;它只是移除冲突的相关文件,然后让 PATH 可以再次提交。

  18、Linux命令行下输出指定文件或URL的内容。

  svn cat 目标[@版本]…如果指定了版本,将从指定的版本开始查找。

  svn cat -r PREV filename > filename (PREV 是上一版本,也可以写具体版本号,这样输出结果是可以提交的)

posted @ 2013-10-18 14:01 ZT文萃 阅读(171) | 评论 (0)编辑 收藏

http://blog.163.com/wb_zhaoyuwei/blog/static/183075439201301535012961/


首先需要知道一点,  svn co  只能check  目录, 不能co文件; 如果需要co文件, 需要用 svn export;
svn  co  的用法经常有两种:   
第一种:  直接  svn  co    http://svnserver/mypro/trunk
                此时, 会在你的当前目录下, 增加一个 trunk文件夹;  svn的trunk文件的内容, 在trunk文件夹中。
第二种:  svn  co   http://svnserver/mypro/trunk   code
               此时, 会在你的当前目录下, 增加一个 code的文件夹,  svn的trunk的文件的内容, 在code中。

posted @ 2013-10-18 11:29 ZT文萃 阅读(347) | 评论 (0)编辑 收藏

From:
http://www.cnblogs.com/137913828S2/archive/2012/07/11/2585905.html

----start

    有点SQL基础的人都会写INSERT语句,可是有很大一部分人不知道DB2的INSERT语句有三种格式,即:一次插入一行,一次插入多行和从SELECT语句中插入。考虑下面的情况:

 
  1. CREATE TABLE USER  
  2. (  
  3. NAME VARCHAR(20) NOT NULL,---姓名  
  4. BIRTHDAY DATE---生日  
  5. );  

 

 

现在要求你插入一行数据,我们这么写:

 
  1. INSERT INTO USER (NAME,BIRTHDAY) VALUES ('张三','2000-1-1');  

 

 

现在要求你插入三行数据,我们这么写:

 
  1. INSERT INTO USER (NAME,BIRTHDAY) VALUES ('张三','2000-1-1');  
  2. INSERT INTO USER (NAME,BIRTHDAY) VALUES ('李四','2000-1-1');  
  3. INSERT INTO USER (NAME,BIRTHDAY) VALUES ('王五','2000-1-1');  

 

 

除此之外,我们还可以这么写:

 
  1. INSERT INTO USER (NAME,BIRTHDAY) VALUES  
  2. ('张三','2000-1-1'),  
  3. ('李四','2000-1-1'),  
  4. ('王五','2000-1-1');  

 

 

那么后一种写法有什么好处呢?有两点好处:

1、性能更好。

2、由于一条语句,所以它们是一个处理单元,要么都插入,要么都不插入。

 

除此之外,我们还可以从SELECT中插入,格式如下:

 
  1. INSERT INTO USER (NAME,BIRTHDAY)   
  2. SELECT <COLUMN1>,<COLUMN2> FROM <TABLE_NAME> WHERE ...  

 

 

以上比较简单,我就不举例子了。

 

---更多参见:DB2 SQL 精萃

----声明:转载请注明出处。

----last updated on 2009.11.5

----written by ShangBo on 2009.9.24

----end

posted @ 2013-10-10 13:41 ZT文萃 阅读(511) | 评论 (1)编辑 收藏

jQuery获取Select选择的Text和Value:
语法解释:
1.  $("#select_id").change(function(){//code...});   //为Select添加事件,当选择其中一项时触发
2.  var checkText=$("#select_id").find("option:selected").text();   //获取Select选择的Text
3. var checkValue=$("#select_id").val();   //获取Select选择的Value
4. var checkIndex=$("#select_id ").get(0).selectedIndex;   //获取Select选择的索引值
5. var maxIndex=$("#select_id option:last").attr("index");   //获取Select最大的索引值
jQuery设置Select选择的 Text和Value:
语法解释:
1. $("#select_id  ").get(0).selectedIndex=1;  //设置Select索引值为1的项选中
2. $("#select_id ").val(4);    // 设置Select的Value值为4的项选中
3. $("#select_id  option[text='jQuery']").attr("selected", true);   //设置Select的Text值为jQuery的项选中 

jQuery添加/删除Select的Option项:
语法解释:
1.  $("#select_id").append("<option value='Value'>Text</option>");   //为Select追加一个Option(下拉项)
2. $("#select_id").prepend("<option  value='0'>请选择</option>");  //为Select插入一个Option(第一个位置)
3.  $("#select_id option:last").remove();  //删除Select中索引值最大Option(最后一个)
4.  $("#select_id option[index='0']").remove();  //删除Select中索引值为0的Option(第一个)
5.  $("#select_id option[value='3']").remove();   //删除Select中Value='3'的Option
5. $("#select_id option[text='4']").remove();   //删除Select中Text='4'的Option 

http://www.cnblogs.com/SAL2928/archive/2008/10/28/1321285.html 

jquery  radio取值,checkbox取值,select取值,radio选中,checkbox选中,select选中,及其相关 
获  取一组radio被选中项的值 
var item = $('input[name=items][checked]').val(); 
获  取select被选中项的文本 
var item = $("select[name=items] option[selected]").text(); 
select下拉框的第二个元素为当前选中值 
$('#select_id')[0].selectedIndex = 1; 
radio单选组的第二个元素为当前选中值 
$('input[name=items]').get(1).checked = true; 
获取值: 
文本框,文本区域:$("#txt").attr("value"); 
多选框  checkbox:$("#checkbox_id").attr("value"); 
单选组radio:    $("input[type=radio][checked]").val(); 
下拉框select: $('#sel').val(); 
控制表单元素: 
文本框,文本区域:$("#txt").attr("value",'');//清空内容 
$("#txt").attr("value",'11');//填充内容 
多选框checkbox:  $("#chk1").attr("checked",'');//不打勾 
$("#chk2").attr("checked",true);//打勾 
if($("#chk1").attr('checked')==undefined) //判断是否已经打勾 
单选组 radio:     $("input[type=radio]").attr("checked",'2');//设置value=2的项目为当前选中项 
下拉框  select:   $("#sel").attr("value",'-sel3');//设置value=-sel3的项目为当前选中项 
$("<option value='1'>1111</option><option  value='2'>2222</option>").appendTo("#sel")//添加下拉框的option 
$("#sel").empty();//清空下拉框 

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

//遍历option和添加、移除option
function  changeShipMethod(shipping){
var len = $("select[name=ISHIPTYPE]  option").length
if(shipping.value != "CA"){
$("select[name=ISHIPTYPE]  option").each(function(){
if($(this).val() ==  111){
$(this).remove();
}
});
}else{
$("<option  value='111'>UPS  Ground</option>").appendTo($("select[name=ISHIPTYPE]"));
}

//取得下拉選單的選取值 

$(#testSelect  option:selected').text();
或$("#testSelect").find('option:selected').text();
或$("#testSelect").val();
//////////////////////////////////////////////////////////////////
记  性不好的可以收藏下:
1,下拉框: 

var cc1 = $(".formc select[name='country']  option[selected]").text(); //得到下拉菜单的选中项的文本(注意中间有空格)
var cc2 = $('.formc  select[name="country"]').val(); //得到下拉菜单的选中项的值
var cc3 = $('.formc  select[name="country"]').attr("id");  //得到下拉菜单的选中项的ID属性值
$("#select").empty();//清空下拉框  //$("#select").html('');
$("<option  value='1'>1111</option>").appendTo("#select")//添加下拉框的option 

稍微解释一下:
1.select[name='country'] option[selected]  表示具有name 属性,
并 且该属性值为'country' 的select元素 里面的具有selected 属性的option 元素; 

2,单选框:
$("input[@type=radio][@checked]").val();  //得到单选框的  选中项的值(注意中间没有空格)
$("input[@type=radio][@value=2]").attr("checked",'checked');  //设置单选框value=2的为选中状态.(注意中间没有空格) 

3,复选框:
$("input[@type=checkbox][@checked]").val();  //得到复选框的选中的第一项的值
$("input[@type=checkbox][@checked]").each(function() {  //由于复选框一般选中的是多个,所以可以循环输出
alert($(this).val());
}); 

$("#chk1").attr("checked",'');//不打勾
$("#chk2").attr("checked",true);//  打勾
if($("#chk1").attr('checked')==undefined){} //判断是否已经打勾 

当然jquery的选择器是强大的. 还有很多方法. 

<script src="jquery-1.2.1.js"  type="text/javascript"></script>
<script language="javascript"  type="text/javascript">
$(document).ready(function(){
$("#selectTest").change(function()
{
//alert("Hello");
//alert($("#selectTest").attr("name"));
//$("a").attr("href","xx.html");
//window.location.href="xx.html";
//alert($("#selectTest").val());
alert($("#selectTest  option[@selected]").text());
$("#selectTest").attr("value", "2"); 

});
});
</script> 

<a href="#">aaass</a> 

<!--下拉框-->
<select id="selectTest"  name="selectTest">
<option value="1">11</option>
<option  value="2">22</option>
<option  value="3">33</option>
<option  value="4">44</option>
<option  value="5">55</option>
<option  value="6">66</option>
</select>
jquery  radio取值,checkbox取值,select取值,radio选中,checkbox选中,select选中,及其相关获取一组radio被选中  项的值
var item = $('input[@name=items][@checked]').val();
获取select被选  中项的文本
var item = $("select[@name=items] option[@selected]").text();
select  下拉框的第二个元素为当前选中值
$('#select_id')[0].selectedIndex = 1;
radio单选组的第二个  元素为当前选中值
$('input[@name=items]').get(1).checked = true;
获取值:
文本  框,文本区域:$("#txt").attr("value");
多选框  checkbox:$("#checkbox_id").attr("value");
单选组radio:  $("input[@type=radio][@checked]").val();
下拉框select: $('#sel').val();
控  制表单元素:
文本框,文本区域:$("#txt").attr("value",'');//清空内容
$("#txt").attr("value",'11');//  填充内容
多选框checkbox:  $("#chk1").attr("checked",'');//不打勾
$("#chk2").attr("checked",true);//  打勾
if($("#chk1").attr('checked')==undefined) //判断是否已经打勾
单选组radio:  $("input[@type=radio]").attr("checked",'2');//设置value=2的项目为当前选中项
下拉框 select:  $("#sel").attr("value",'-sel3');//设置value=-sel3的项目为当前选中项
$("<optionvalue='1'&  gt;1111</option><optionvalue='2'>2222</option&  gt;").appendTo("#sel")//添加下拉框的option
$("#sel").empty();// 清空下拉框 

获取一组radio被选中项的值
var item =  $('input[@name=items][@checked]').val();
获取select被选中项的文本
var item =  $("select[@name=items] option[@selected]").text();
select下拉框的第二个元素为当  前选中值
$('#select_id')[0].selectedIndex =  1;
radio单选组的第二个元素为当前选中值
$('input[@name=items]').get(1).checked =  true;
获取值:
文本框,文本区域:$("#txt").attr("value");
多选框  checkbox:$("#checkbox_id").attr("value");
单选组radio:  $("input[@type=radio][@checked]").val();
下拉框select: $('#sel').val();
控  制表单元素:
文本框,文本区域:$("#txt").attr("value",'');//清空内容
$("#txt").attr("value",'11');//  填充内容
多选框checkbox:  $("#chk1").attr("checked",'');//不打勾
$("#chk2").attr("checked",true);//  打勾
if($("#chk1").attr('checked')==undefined) //判断是否已经打勾
单选组radio:  $("input[@type=radio]").attr("checked",'2');//设置value=2的项目为当前选中项
下拉框 select:  $("#sel").attr("value",'-sel3');//设置value=-sel3的项目为当前选中项
$("<option  value='1'>1111</option><option  value='2'>2222</option>").appendTo("#sel")//添加下拉框的option
$("#sel").empty();//  清空下拉框

posted @ 2013-10-09 15:23 ZT文萃 阅读(296) | 评论 (0)编辑 收藏

  英文原文:The 10 commandments for happiness and success

  生命短暂,无可浪费,这我们都知道。然而,大多数人都处中一种缺省状态的生活中,逼迫自己去认为很幸福——虽然事实上不是。为什么?因为我们让社会来指定该如何的去生活、什么才是成功和什么才是幸福。像金钱和名誉这样的东西被赋予太大的分量,成为祸根,阻碍了我们寻求生活的真正本质:活出自我,做有价值的事情。

  如果让我给一个新生命(比如我未来的孩子)一点建议,我将衷心建议他遵循下面这 10 条诫律:

  1/ 不要跟别人比。

  自从上小学起,我们就被人们用分数来激励去竞争,忘记了教育的本质是学习。父母希望他们的孩子成为第一,或者要比 xx 更强,这样当在学校门口遇到 xx 的父母时,他们能显得很骄傲。于是,我们的成长过程一直受这种要比他人更强的思想熏染,却很少能想到真正应该的是超越自己,而不是别人。

  2/ 只跟优秀的人、积极向上的人在一起。

  消极、平庸的人到处都是,他们对你的影响将是毁灭性的。你也许是个很积极向上的人,但如果整天听到的都是悲观绝望的话,你最终也将变成这样的 人。因此,避免他们给你带来负面影响的最佳办法就是将这些没希望的人从你的身边剔除。当然,如果你在意他们,你有责任将你的积极心态传染给他们。

  3/ 不要害怕失败,失败是你能遇到的最好的事情。

  在我们这个社会眼里,失败是一个人遇到的最糟糕的事情。我个人的经历:我失败过,而且很惨。它本应该会对我带来灾难性的影响,但相反,它使我变 得更强壮,虽然不能用强壮好几倍来形容,但你真的无法想像我的变化。事实上,失败锻炼一个人的性格,它让你知道错在哪里,让你知道如何调整你的生活来防止 这种事情再次发生。人很容易满足现状,特别当事情看起来很顺利的时候。失败是对你的挑战。如今的飞机之所以这么安全,是因为过去摔过无数。相似的,如果看 看历史上所有伟大的人,不论男女,你会发现他们所有人都在生命的某个阶段上遇到过严重的挫折。所以,不要害怕尝试,不要担心失败。

  4/ 找到你的志向,愉快的工作。

  每天我都听到的有人说他们的研究和工作根本不是他们感兴趣的。大多时候,这都是由于父母的压力,让他们的孩子选择一条他们看来在社会上能获得名望的道路。他们很希望能说:我女儿是医生我儿子是律师。用 更通俗的说法,我们生活中这个“面子”很重要的社会里,我们不停的做着我们不喜欢的事,来让我们在亲戚朋友眼里显的很成功。这能让我们快乐吗?我很怀疑。 当有人问你的职业时,他们的意图总是含蓄的,甚至直白的表明他们在看你是否在做很体面的事情。为什么不问问自己一个简单的问题:“你喜欢你的工作吗?”这是唯一重要的事情,因为唯一能让我们实现生命价值的东西是我们的热情。

  5/ 对别人说的话保持警惕。

  跟上面一点很相似。人们喜欢基于自己的经验给人建议,但他们的经验往往不适用于你。所以,不要总是听取被人的意见,也要相信自己的直觉。

  6/ 要慷慨,尽己所能。

  很多研究都有力的显示出“给予”和“幸福”之间有着直接的联系。基本的解释是,通过帮助他人,看到自己的行动对他人带来的积极影响,让我们将目光从自身转移出去,使得我们对自己内心自我批判不那么敏感。对这一主题,这有一篇好文章。

  7/ 保持健康,健康饮食,锻炼身体,平衡生活。

  这是明摆的事。健康是你的本钱,是让你完成更多目标的前提条件。虽然生命中有些事情是我们无法掌控的,但有些事情很明显,我们可以通过保持健康饮食和锻炼身体来避免很多重大的疾病。

  8/ 不要担心会让别人失望。

  如果他们爱你,他们不会失望。有些人很脆弱,面对不幸和压力时很容易心理崩溃。有时候这是因为害怕让他们在意的人失望。前面已经说了,失败不是坏事,如果他们关系你,他们绝不会指责你勇敢的尝试。还有,不要担心因为自己选择的道路会让父母失望。

  9/ 别看电视,不要过度关注媒体。

  它们的任务是来恐吓你,这是它们挣钱的手段。除此之外,他们的第二个任务是操控你,让你从真正的问题上分心。如果你还不知道这些, Noam Chomsky 写的10 media manipulation 策略是你应该去读的好文章。

  10/ 树立明确的价值观,坚守它们,矢志不移

  有很多很好的价值观能让你终身快乐并走向成功。目前这个社会崇尚金钱和地位,让我们改变它,教育我们的孩子养成以幸福快乐为目标的新价值观。

  如果你赞同,请分享给你的朋友。如果不同意,请留言。

22
2
 
来自: 外刊IT评论
找优秀程

posted @ 2013-09-30 19:51 ZT文萃 阅读(184) | 评论 (0)编辑 收藏

From:
http://www.cnitblog.com/201/archive/2011/05/25/74069.html

在Bugzilla中通过SMTP发通知邮件
Posted on 2011/04/05 by admin

Bugzilla 4.0注册验证通知等邮件可以通过SendMail之类的来发送,配置也很简单,但是它发出去的邮件后缀地址是localhost.localdomain之类的地址,会被一些邮箱拦截,从而收不到邮件。所以通过SMTP来发邮件还是很必要的。
文档上说的配置SMTP也很简单,但是我在配置的时候遇到几个问题,在此记录下来
1、The new value for smtp_username is invalid: SMTP Authentication is not available. Run checksetup.pl for more details.
这是我在Bugzilla中Create New Account的时候发验证邮件时产生的,这个的原因是Perl有个模块没有安装,安装下就可以了
sudo perl install-module.pl Authen::SASL
自己先可以通过$ ./checksetup.pl –check-modules查看下已经安装了哪些模块
只要安装好,上述的这个问题就解决了

所以再次试着注册一个用户,提示邮件发送成功了,于是下面的问题产生了

2、提示邮件成功发送,但是实际邮件没有发送出去,因为我填的邮箱没有收到邮件
在这里我原先是开启了use_mailer_queue这个功能
于是我选择使用Test模式(Parameters -> Email -> mail_delivery_method -> SMTP)再发了一次,mailer.testfile木有邮件

网 络上有人和我是一样的问题,发不出去邮件,我参看这里http://hi.baidu.com/ever__love/blog/item /62473a9772800846d0135e2c.html的方法,把use_mailer_queue关闭(Parameters -> Email -> use_mailer_queue -> Off),再试着发送一次,果真mailer.testfile当中有邮件了

这样就基本定位到问题use_mailer_queue没有正常工作

于是又把use_mailer_queue开启
执行下面的命令
$ $BUGZILLA_HOME/jobqueue.pl check
Configuration looks okay
jobqueue.pl running – pid 5317
9 jobs in the queue.

看起来似乎正常,但是提示9 jobs in the queue,并且这个数目一直没有减少,这说明邮件几乎都被堵塞在这里了,而并没有发出去

于是又Debug发现
$ $BUGZILLA_HOME/jobqueue.pl -f -d restart
Killing 9657
Starting up…
TheSchwartz::work_once found no jobs
TheSchwartz::work_once found no jobs

几乎神了,这里又说没有错误,那到底是哪里出问题了呢?
目前无解,求解ING。。。

UPDATE 后来经过分析解决了此问题
虽然debug jobqueue出来的信息开头几个没有发现什么异常,但是经过很多个“TheSchwartz::work_once found no jobs”之后出来一些错误信息,如下:
……
TheSchwartz::work_once found no jobs
TheSchwartz::work_once found no jobs
TheSchwartz::work_once found no jobs
…….
TheSchwartz::work_once found no jobs
TheSchwartz::work_once found no jobs
TheSchwartz::work_once found no jobs
TheSchwartz::work_once got job of class ‘Bugzilla::Job::Mailer’
Working on Bugzilla::Job::Mailer …
Use of uninitialized value $hostname in concatenation (.) or string at Bugzilla/Mailer.pm line 153.
job failed. considering retry. is max_retries of 725 >= failures of 5?
job failed: There was an error sending mail from ‘bugzilla_admin@’ to
‘xxxxx@aol.com’:Can’t call method “address” on an undefined value at
lib/Email/Send/SMTP.pm line 25.
TheSchwartz::work_once found no jobs
……
TheSchwartz::work_once found no jobs
TheSchwartz::work_once got job of class ‘Bugzilla::Job::Mailer’
Working on Bugzilla::Job::Mailer …
Use of uninitialized value $hostname in concatenation (.) or string at Bugzilla/Mailer.pm line 153.
job failed. considering retry. is max_retries of 725 >= failures of 5?
job failed: There was an error sending mail from ‘bugzilla_admin@’ to
‘xxxxxx@gmail.com’:Can’t call method “address” on an undefined value
at lib/Email/Send/SMTP.pm line 25.
TheSchwartz::work_once found no jobs
……
TheSchwartz::work_once found no jobs

……是我省略掉了很多这样相同的状态

看起来这个jobqueue当中的任务不是立即就执行了的,它可能是经过某种算法才执行的
否则不应该出现第一个就是“TheSchwartz::work_once found no jobs”,到后面才有任务执行的

并且进一步发现这些任务队列都是放在数据库当中的一张表(ts_job)中的,任务成功一个就把它从这张表中删除

不过此时问题还没有解决,认真看下错误,并且看了指出的错误地方的源代码,觉得应该是mailfrom填错了,可能我这里填的不完整

又打开SMTP的调试开关(Parameters -> Email -> smtp_debug -> On),这样能看到更多的详细信息,基本觉得问题就在这了

于是我填写了标准的邮件格式“username@example.com”之后再试,邮件还不没有发出去,jobqueue的的数量又增加了一个,
看来可能前面的这些包含错误信息的队列已经将后面的阻塞了,于是我试着将ts_job表当中的数据删除
truncate table ts_job; // 反正我这里是直接truncate掉了的,我不知道这里delete和truncate有没有区别

再次注册了一遍,看到后台输出通知邮件发送成功的信息,如下:
TheSchwartz::work_once found no jobs
TheSchwartz::work_once got job of class ‘Bugzilla::Job::Mailer’
Working on Bugzilla::Job::Mailer …
Net::SMTP>>> Net::SMTP(2.31)
Net::SMTP>>> Net::Cmd(2.29)
Net::SMTP>>> Exporter(5.63)
Net::SMTP>>> IO::Socket::INET(1.31)
Net::SMTP>>> IO::Socket(1.31)
Net::SMTP>>> IO::Handle(1.28)
Net::SMTP=GLOB(0xb79ce68)<<< 220 esmtp4.qq.com Esmtp QQ Mail Server
Net::SMTP=GLOB(0xb79ce68)>>> EHLO localhost.localdomain
Net::SMTP=GLOB(0xb79ce68)<<< 250-esmtp4.qq.com
Net::SMTP=GLOB(0xb79ce68)<<< 250-PIPELINING
Net::SMTP=GLOB(0xb79ce68)<<< 250-SIZE 52428800
Net::SMTP=GLOB(0xb79ce68)<<< 250-AUTH LOGIN PLAIN
Net::SMTP=GLOB(0xb79ce68)<<< 250-AUTH=LOGIN
Net::SMTP=GLOB(0xb79ce68)<<< 250 8BITMIME
Net::SMTP=GLOB(0xb79ce68)>>> AUTH LOGIN
……
Net::SMTP=GLOB(0xb79ce68)<<< 235 Authentication successful
Net::SMTP=GLOB(0xb79ce68)>>> MAIL FROM:
Net::SMTP=GLOB(0xb79ce68)<<< 250 Ok
Net::SMTP=GLOB(0xb79ce68)>>> RCPT TO:
Net::SMTP=GLOB(0xb79ce68)<<< 250 Ok
Net::SMTP=GLOB(0xb79ce68)>>> DATA
Net::SMTP=GLOB(0xb79ce68)<<< 354 End data with .
Net::SMTP=GLOB(0xb79ce68)>>> From: xxxxxx@qq.com
Net::SMTP=GLOB(0xb79ce68)>>> To: xxxxxx@gmail.com
Net::SMTP=GLOB(0xb79ce68)>>> Subject: Bugzilla: confirm account creation
Net::SMTP=GLOB(0xb79ce68)>>> X-Bugzilla-Type: admin
Net::SMTP=GLOB(0xb79ce68)>>> X-Bugzilla-URL:
Net::SMTP=GLOB(0xb79ce68)>>> Auto-Submitted: auto-generated
Net::SMTP=GLOB(0xb79ce68)>>> Content-Type: text/plain; charset=”UTF-8″
Net::SMTP=GLOB(0xb79ce68)>>> MIME-Version: 1.0
Net::SMTP=GLOB(0xb79ce68)>>> Date: Tue, 05 Apr 2011 16:05:23 +0800
Net::SMTP=GLOB(0xb79ce68)>>>
Net::SMTP=GLOB(0xb79ce68)>>> Bugzilla has received a request to create a user account
Net::SMTP=GLOB(0xb79ce68)>>> using your email address (xxxxxx@gmail.com).
Net::SMTP=GLOB(0xb79ce68)>>>
Net::SMTP=GLOB(0xb79ce68)>>> To continue creating an account using this email address, visit the
Net::SMTP=GLOB(0xb79ce68)>>> following link by April 8, 2011 at 16:05 CST:
Net::SMTP=GLOB(0xb79ce68)>>>
Net::SMTP=GLOB(0xb79ce68)>>> token.cgi?t=FegLL6OpYM&a=request_new_account
Net::SMTP=GLOB(0xb79ce68)>>> PRIVACY NOTICE: Bugzilla is an open bug tracking system. Activity on most
Net::SMTP=GLOB(0xb79ce68)>>> bugs, including email addresses, will be visible to the public. We recommend
……
Net::SMTP=GLOB(0xb79ce68)>>> .
Net::SMTP=GLOB(0xb79ce68)<<< 250 Ok: queued as
Net::SMTP=GLOB(0xb79ce68)>>> QUIT
Net::SMTP=GLOB(0xb79ce68)<<< 221 Bye
job completed
TheSchwartz::work_once found no jobs

到QQ Mail也看到发送成功的邮件,在Gmail也收到了邮件,到此才算基本成功。

Parameters -> Email里面我的基本几项数据如下
mailfrom : xxxxxx@qq.com // 出现问题就是这里填的不标准
use_mailer_queue : on
smtpserver : smtp.qq.com
smtp_username : xxxxxx@qq.com
smtp_password : ******

如果mail_delivery_method你选择SendMail或者Test,那么SMTP相关的参数就可以不用填了,如果你是通过SSL加密的SMTP链接,应该是要新装插件了

P.S. 关于use_mailer_queue的信息请挪步http://www.bugzilla.org/releases/4.0/release-notes.html#v34_feat_async

posted @ 2013-09-27 18:40 ZT文萃 阅读(3884) | 评论 (1)编辑 收藏

From
http://blog.chinaunix.net/uid-209416-id-2410724.html


本文源于http://cranesss.gjjblog.com/archives/884277/

但原文有错误,并且密码为明文不安全,对其做了修改,适用版本:2.25,主要方法是修改BugMail.pm并做SMTP的测试,请确保你的server能够连通smtp邮件服务器

具体做法:
一、安装好bugzilla(具体如何安装,见其他相关文档)

二,测试第三方邮件服务器SMTP发送邮件:

具体方法是,使用telnet,以smtp.163.com为例,其他请参考以下链接:

http://search.csdn.net/c/blog.csdn.net/cjjky/archive/2007/02/23/1513083.aspx

假设帐号是test@163.com,密码为test,

1)root下使用perl -MMIME::Base64 -e 'print encode_base64("test")',把test换成实际的用户名或密码,记下返回的字串(这里是dGVzdA==),不同的smtp server,有的要求用户名是@前的(比如test),有的要求是全部(如test@163.com),可以参考邮件提供商关于outlook等smtp客户端的设置.

2) telnet smtp.163.com 25 #25为163邮箱的smtp服务端口

     Trying 202.108.5.83...

Connected to smtp.163.com.

Escape character is '^]'.

220 163.com Anti-spam GT for Coremail System (163com[071018])

     EHLO smtp.163.com

     250-mail

250-PIPELINING

250-AUTH LOGIN PLAIN

250-AUTH=LOGIN PLAIN

250 8BITMIME

AUTH LOGIN

334 dXNlcm5hbWU6

dGVzdA==   #使用步聚1,得到的用户名字符串

     334 UGFzc3dvcmQ6

     dGVzdA==   #使用步聚1,得到的密码字符串

     235 Authentication successful

          MAIL FROM:<test@163.com>         # FROM选项,<>里的必须是现在用的邮件名

250 Mail OK

RCPT TO:<test@163.com>               #TO 选项,发给谁

250 Mail OK

DATA                                                     #准备填充邮件体

354 End data with <CR><LF>.<CR><LF>    #<回车>.<回车>结束

TO: test@163.com                                       

FROM: test@163.com

SUBJECT: test by telnet/smtp

 

test, just a test.                                            

.                                                                      

250 Mail OK queued as smtp10,wKjADQ2ApxRnnqBE0CWaEw==.38326S3                

NOOP                                                           

250 OK

QUIT                                                           

221 Closing connection. Good bye.

Connection closed by foreign host.

看有没有收到邮件,若测试成功,说明smtp server可以使用,记下perl生成的用户名和密码的字串,下方我称之为用户名密文,密码密文

三、修改$Bugzilla_DIR/Bugzilla/BugMail.pm,做如下修改:

增加新的邮件发送方法:

sub MessageToMTA {


     my ($msg) = (@_);
     return if (Param('mail_delivery_method') eq "none");

     my ($header, $body) = $msg =~ /(.*?\n)\n(.*)/s ? ($1, $2) : ('', $msg);
     my $headers;

     if (Param('utf8') and (!is_7bit_clean($header) or !is_7bit_clean($body))) {
         ($headers, $body) = encode_message($msg);
     } else {
         my @header_lines = split(/\n/, $header);
         $headers = new Mail::Header \@header_lines, Modify => 0;
     }

     # Use trim to remove any whitespace (incl. newlines)
     my $rcpt_to = trim($headers->get('to'));

     use Net::SMTP;
     my $smtp_server = 'smtp.163.com';
     my $smtp_user = 'test@163.com'; #这里用户名是全的



     my $encode_smtpuser ='dGVzdA=='; #
用户名密文
     my $encode_smtppass = 'dGVzdA==';
#密码密文,用密文比明文enconde安全

     my $smtp = Net::SMTP->new($smtp_server,Timeout => 60) ||
     die 'Cannot connect to smtp server';

     my $result = $smtp->command('AUTH','LOGIN');
     my $answer = $smtp->getline();
     # 334 VXNlcm5hbWU6

     $result = $smtp->command($encode_smtpuser);
     $answer = $smtp->getline();
     # 334 UGFzc3dvcmQ6
  
     $result = $smtp->command($encode_smtppass);
     $answer = $smtp->getline();
     # 235 Authentication successful
     # or 535 Authentication failed
     if ($answer =~ /535/i)
     {print "Sorry,Authentication failed!n";exit;}

     $smtp->mail($smtp_user);
     $smtp->to($rcpt_to);
     $smtp->data();
     $smtp->datasend($msg);
     $smtp->dataend();
     $smtp->quit;
}

这个方法与原来的方法重名,所以需要将原来的方法注释掉或者修改成另外一个名字,这样就能使用这个新的方法发送邮件了。

注意黑体部分,将他们替换成你自己的相应的数值。这是将所需参数写死在这里,就不能在配置界面进行配置了,如果需要再次修改这些参数,需要直接修改这个文件。而设置界面中的关于邮件发送方式的设置(sendmail/smtp/qmail..等)将不起作用了。

posted @ 2013-09-27 14:19 ZT文萃 阅读(673) | 评论 (0)编辑 收藏

From:
http://hi.baidu.com/najftulhmndgswr/item/6d8ba9f0d02e9004d89e7294


本文安装过程主要参考:

http://www.bugzilla.org/docs/3.6/en/html/installation.html

http://www.thegeekstuff.com/2010/05/install-bugzilla-on-linux/


安装流程:

1. 先检测下 Perl是否安装了


$ perl -v
如果没有安装,下载安装

2.  安装一个数据库,推荐使用 MySQL

$ mysql -V
如果没有安装的话,用 apt-get即可,server和client都装下。
在装 mysql-server的时候会提示输入 password,记住,再后面创建数据库的时候会用到。

3.  安装apache2

apt-get install 即可。

测试apache2是否正常:

在浏览器的URL栏输入:  http://localhost  或者  http://127.0.0.1;
只要出现: It works!
表示服务器已经正常启动。

4.  下载并安装 Bugzilla 

下载 Bugzilla 3.6.1,地址: http://www.bugzilla.org/download/

下载后在 /var/www/目录下解压,然后进入目录

1)Perl 模块的安装

a)首先查看下缺少的模块

bash# ./checksetup.pl --check-modules 

b)然后利用这个命令将所缺模块安装上

bash# perl install-module.pl <modulename>

必须安装的模块有这些:

1. CGI (3.21)
2. Date::Format (2.21)
3. DateTime (0.28)
4. DateTime::TimeZone (0.71)
5. DBI (1.41)
6. DBD::mysql (4.00) if using MySQL
7. Digest::SHA (any)
8. Email::Send (2.00)
9. Email::MIME (1.861)
10. Email::MIME::Encodings (1.313)
11. Email::MIME::Modifier (1.442)
12. Template (2.22)
13. URI (any)

如果未安装模块太多,可以执行下列命令,全体安装:
(注意:由于安装模块的时候会有权限问题,所以在执行下列命令前,
sudo chmod 777 -R bugzilla-3.6.1)

bash# /usr/bin/perl install-module.pl --all

(关于DateTime::TimeZone 模块安装失败的问题,请参考此网站的最后回复,Build)
http://www.experts-exchange.com/OS/Linux/Q_25111007.html
需要自己下载DateTIme模块,然后重新编译,在解压目录 perl Build.PL,然后按照上面网站所说!!!

2)
成功装完后,生成本地config

bash# ./checksetup.pl

bash# vi ./localconfig
修改: $db_pass = 'akaedu';
修改:   $webservergroup = 'www-data';
保存退出

3)之后在mysql数据库中加入信息

bash# mysql -u root -p 
(如果这里要输入密码一直过不去,请参考
http://hi.baidu.com/ever__love/blog/item/1c9b3c19cd0866f7af5133c7.html

mysql> GRANT SELECT, INSERT,
UPDATE, DELETE, INDEX, ALTER, CREATE, LOCK TABLES,
CREATE TEMPORARY TABLES, DROP, REFERENCES ON bugs.*
TO bugs@localhost IDENTIFIED BY 'akaedu';

mysql> FLUSH PRIVILEGES;
mysql> quit;

mysql的命令必须都以分号结束。

4) 再次安装

bash# ./checksetup.pl

如果上述一切正常,这次安装过程中将提示你输入 邮箱,真名,密码。
邮箱是你登录bugzilla的root用户名,密码就是密码。


5. 配置apache的config,与bugzilla的index链接

bash# vi /etc/apache2/apache2.conf

在内部添加这样一段:
<Directory /var/www/bugzilla-3.6.1>
AddHandler cgi-script .cgi
Options +Indexes +ExecCGI
DirectoryIndex index.cgi
AllowOverride Limit
</Directory>

然后重启apache2

bash# /etc/init.d/apache2 restart

6.  到这里应该就能正常访问bugzilla的主页了

URL:    http://localhost/bugzilla  (如果不行,就把bugzilla的版本号加上)
就会看到如下图像,表示正常登录bugzilla了。




大功告成

进入后,选一个 “File a bug”, 然后输入root用户名(邮箱)以及密码就正常登录,可以使用了。
目前遗留问题,无法注册普通用户,因为注册时候会发送确认信件,发送显示成功(没有报错),但目标信件收不到,不知是哪里出了问题。TODO!


上述邮件发送问题已经解决了!!!

解决方法:
感觉应该是 bugzilla的设置问题,在bugzilla网页上登录后,点击上端菜单中的
Administration, 然后选择 Parameters, 在左侧栏中选择E-mail,然后在 mail_delivery_method中选择 Test,虽然你点击了发送邮件,但会被bugzilla自己截获,存入 data/mailer.testfile文件中。如果发不出邮件,可以选择Test,在data/mailer.testfile文件中如果有信息,那 说明邮件服务器有问题,但如果此文件中没有信息,那就说明有别的问题。
我发送邮件显示正常,但目标收不到邮件,检查 data/mailer.testfile文件,发现是空的。之前用telnet smtp测试,能正常连通smtp.163.com,思来想去,应该就是bugzilla的设置问题。这个不成功的版本是在同时电脑上测试的,我自己的已 经成功,只不过过程中修改的东西太多,不知如何调试了。于是乎我就想到了diff,网页上的配置信息对应到源码中,就是 data/params文件,于是我将我的文件与我同事电脑上的这个文件进行了diff,其中有一项 use_mailer_queue。  不成功: 'use_mailer_queue' => '1', 成功的'use_mailer_queue' => 0, 于是将不成功的修改为 0,结果再尝试Test, data/mailer.testfile中已经有信息了,将 mail_delivery_method修改为SMTP,也能正常发送邮件了!

posted @ 2013-09-27 14:18 ZT文萃 阅读(1380) | 评论 (0)编辑 收藏